diff --git a/.circleci/config.yml b/.circleci/config.yml index 27c6164366..327b497195 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -166,7 +166,6 @@ workflows: context: - slack-secrets - aws-secrets - #- windows_x64_build commands: @@ -322,8 +321,7 @@ commands: export PACKAGE_NAMES=$(echo $PACKAGES | tr -d '\n') export PARTITION_TOTAL=${CIRCLE_NODE_TOTAL} export PARTITION_ID=${CIRCLE_NODE_INDEX} - export PARALLEL_FLAG="-p 1" - gotestsum --format testname --junitfile << parameters.result_path >>/<< parameters.result_subdir >>/${CIRCLE_NODE_INDEX}/results.xml --jsonfile << parameters.result_path >>/<< parameters.result_subdir >>/${CIRCLE_NODE_INDEX}/testresults.json -- --tags "sqlite_unlock_notify sqlite_omit_load_extension" << parameters.short_test_flag >> -race -timeout 1h -coverprofile=coverage.txt -covermode=atomic -p 1 $PACKAGE_NAMES + gotestsum --format standard-verbose --junitfile << parameters.result_path >>/<< parameters.result_subdir >>/${CIRCLE_NODE_INDEX}/results.xml --jsonfile << parameters.result_path >>/<< parameters.result_subdir >>/${CIRCLE_NODE_INDEX}/testresults.json -- --tags "sqlite_unlock_notify sqlite_omit_load_extension" << parameters.short_test_flag >> -race -timeout 1h -coverprofile=coverage.txt -covermode=atomic -p 1 $PACKAGE_NAMES - store_artifacts: path: << parameters.result_path >> destination: test-results @@ -432,6 +430,7 @@ commands: export TEST_RESULTS=<< parameters.result_path >>/<< parameters.result_subdir >>/${CIRCLE_NODE_INDEX} export PARTITION_TOTAL=${CIRCLE_NODE_TOTAL} export PARTITION_ID=${CIRCLE_NODE_INDEX} + export PARALLEL_FLAG="-p 1" test/scripts/run_integration_tests.sh - store_artifacts: path: << parameters.result_path >> @@ -478,11 +477,14 @@ commands: - attach_workspace: at: << parameters.build_dir >> - run: - name: Upload binaries << parameters.platform >> + name: Upload Binaries << parameters.platform >> command: | + if [ "${CIRCLE_BRANCH}" = "rel/nightly" ] + then + export NO_BUILD="true" + fi export PATH=$(echo "$PATH" | sed -e "s|:${HOME}/\.go_workspace/bin||g" | sed -e 's|:/usr/local/go/bin||g') export GOPATH="<< parameters.build_dir >>/go" - export NO_BUILD=true export TRAVIS_BRANCH=${CIRCLE_BRANCH} scripts/travis/deploy_packages.sh - when: diff --git a/.dockerignore b/.dockerignore index 68a94afe49..0dc917f260 100644 --- a/.dockerignore +++ b/.dockerignore @@ -29,6 +29,7 @@ cmd/updater/updater tmp/dev_pkg tmp/out tmp/node_pkgs +tmp/go-cache # Ignore vim backup and swap files *~ diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000000..4bcee861e1 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,39 @@ +name: "Build workflow" +on: + pull_request: +jobs: + build-test-windows: + runs-on: windows-2022 + defaults: + run: + shell: msys2 {0} + steps: + - name: Install msys2 + uses: msys2/setup-msys2@v2 + with: + update: true + path-type: inherit + - name: Check out code + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: Install golang + uses: actions/setup-go@v2 + with: + go-version: '1.14.7' + - name: Build Test + run: | + export ALGORAND_DEADLOCK=enable + export SKIP_GO_INSTALLATION=True + scripts/travis/build_test.sh + # - name: Upload artifact to Github + # uses: actions/upload-artifact@v2 + # with: + # if-no-files-found: error + # path: $(git ls-files -o | grep -v crypto/libs | grep -v crypto/copies | grep -v crypto/libsodium-fork | grep -v crypto/lib/ | grep -v ^gen/ | grep -v swagger.json.validated | tr "\n" ":") + - name: Slack Notification + env: + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} + run: | + curl -X POST --data-urlencode "payload={\"text\": \"Nightly windows build test on Github failed. ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} \"}" $SLACK_WEBHOOK + if: ${{ failure() && (contains(github.base_ref, 'rel/nightly') || contains(github.base_ref, 'rel/beta') || contains(github.base_ref, 'rel/stable')) }} diff --git a/.github/workflows/pr-type-category.yml b/.github/workflows/pr-type-category.yml new file mode 100644 index 0000000000..678499ed3b --- /dev/null +++ b/.github/workflows/pr-type-category.yml @@ -0,0 +1,37 @@ +name: Check PR category and type +on: + pull_request: + branches: + - master + types: [opened, synchronize, reopened, labeled, unlabeled, edited] +jobs: + check_label: + runs-on: ubuntu-latest + name: Check PR Category and Type + steps: + - name: "Failed to find proper PR Type label. Please add one of the following: 'New Feature', 'Enhancement', or 'Bug-Fix'" + run: exit 1 + if: | + !contains(github.event.pull_request.labels.*.name, 'New Feature') && + !contains(github.event.pull_request.labels.*.name, 'Enhancement') && + !contains(github.event.pull_request.labels.*.name, 'Bug-Fix') + - name: "Found more than one PR Type label. Please add only one of the following: 'New Feature', 'Enhancement', or 'Bug-Fix'" + run: exit 1 + if: | + ( + contains(github.event.pull_request.labels.*.name, 'New Feature') && + contains(github.event.pull_request.labels.*.name, 'Enhancement') + ) || ( + contains(github.event.pull_request.labels.*.name, 'New Feature') && + contains(github.event.pull_request.labels.*.name, 'Bug-Fix') + ) || ( + contains(github.event.pull_request.labels.*.name, 'Enhancement') && + contains(github.event.pull_request.labels.*.name, 'Bug-Fix') + ) + - name: "PR Category is missing from PR title. Please add it like ': '" + run: | + if [[ ! "${{ github.event.pull_request.title }}" =~ ^.{2,}\:.{2,} ]]; then + exit 1 + fi + - name: "Found at least one PR Type label and Category in the title. Good job!" + run: exit 0 diff --git a/.gitignore b/.gitignore index 218b3879b8..ebd0ef239b 100644 --- a/.gitignore +++ b/.gitignore @@ -65,3 +65,5 @@ assets index.html +# test summary +testresults.json diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index fa04570513..0000000000 --- a/.travis.yml +++ /dev/null @@ -1,84 +0,0 @@ -name: "Travis Windows build" -os: linux -dist: bionic -language: minimal - -# Don't build tags -if: tag IS blank - -stages: - - name: build_windows_pr - if: type = pull_request - - name: build_windows_release - if: (branch =~ /^hotfix\// OR branch =~ /^rel\//) AND type != pull_request - -jobs: - include: - - stage: build_windows_pr - os: windows - name: Windows x64 PR Build - cache: - directories: - - $HOME/AppData/Local/Temp/chocolatey - - /C/tools/msys64 - script: - - $mingw64 scripts/travis/build_test.sh - - - stage: build_windows_release - os: windows - name: Windows x64 Release Build - cache: - directories: - - $HOME/AppData/Local/Temp/chocolatey - - /C/tools/msys64 - script: - - $mingw64 scripts/travis/build_test.sh - -# Don't rebuild libsodium every time -cache: - directories: - - crypto/lib - - $HOME/docker_cache - -before_install: -- |- - [[ ! -f C:/tools/msys64/msys2_shell.cmd ]] && rm -rf C:/tools/msys64 - choco uninstall -y mingw - choco upgrade --no-progress -y msys2 - export msys2='cmd //C RefreshEnv.cmd ' - export msys2+='& set MSYS=winsymlinks:nativestrict ' - export msys2+='& C:\\tools\\msys64\\msys2_shell.cmd -defterm -no-start' - export mingw64="$msys2 -mingw64 -full-path -here -c "\"\$@"\" --" - export msys2+=" -msys2 -c "\"\$@"\" --" - $msys2 pacman --sync --noconfirm --needed mingw-w64-x86_64-toolchain unzip - ## Install more MSYS2 packages from https://packages.msys2.org/base here - taskkill //IM gpg-agent.exe //F # https://travis-ci.community/t/4967 - export PATH=/C/tools/msys64/mingw64/bin:$PATH - export MAKE=mingw32-make # so that Autotools can find it - docker load -i $HOME/docker_cache/images.tar || true - -before_cache: -- |- - # https://unix.stackexchange.com/a/137322/107554 - $msys2 pacman --sync --clean --noconfirm - docker save -o $HOME/docker_cache/images.tar $(docker images -a -q) - -addons: - apt: - packages: - - libboost-all-dev - - fakeroot - - rpm - - python3-venv - - libssl-dev - - libffi-dev - artifacts: - s3_region: "us-east-1" - paths: - - $(git ls-files -o | grep -v crypto/libs | grep -v crypto/copies | grep -v crypto/libsodium-fork | grep -v crypto/lib/ | grep -v ^gen/ | grep -v swagger.json.validated | tr "\n" ":") - -notifications: - slack: - if: branch = "rel/nightly" - rooms: - - secure: FvM+GHkfVQyJqounsRO8kcQT2fYljdBp/fODIlgNE1pcd08WKqHa14cpjQN2T/zC7/eeJAwDuk4ADUqgLdb85vSd6KgcYwBaPMLj8b1La/JY17ULpVuD1uke3uDb+OhC084Uo7cYUAcmpPOtX7ujRVXbeRFoj5R6xqyCYEBGeRNaQIJh36Jd1jkKjQGZgcQIMy0JZXTnVwxP1o3ed6mYtVMt0qlBCzHKXTr7CUTFp+TwFoZ99jxvjNEA6cpn1UE82uq08CiQ4ANY51SCMqq6L9y76SRREznjtR3CGGhZYlmewVnlsco6IB0Xe5k4j8GlIlZfV+bJiBaE4GqNKOpt0DcB/hxZtDbe7LcSfdtwU/NG8L1rw4Ktj+ALcEJDuprRhYaafEaL6iOVsOy6YwW2Tbj6xcJzeorTs/p0URkSJ/M1Us7zdOTzLkVeUKAcHIIl4SClHq3svzSwoSyjlwuq18Wp2VWNfQFY3qFd7eZo/meM8UuhRrTai18eX5ZJ9leAdwvwfma1uxS2ZlG8aDupx2Ww19AOZZ8txQtDTn+rzP8U1UnlaOMJStOmdEKfExGy348f1yQcJtOv4armZuEuC6eoIkeznNS8wO/ZkRSWuxDcc5Q1DsQADXfGSMEL36Aa6aDU5Hy7els00qYDImPVL+7rd2pAfSUzFCfA+7klefg= diff --git a/Makefile b/Makefile index b17010bfea..4acfb982a5 100644 --- a/Makefile +++ b/Makefile @@ -61,6 +61,10 @@ EXTLDFLAGS := -static -static-libstdc++ -static-libgcc export GOBUILDMODE := -buildmode=exe endif +ifeq ($(SHORT_PART_PERIOD), 1) +export SHORT_PART_PERIOD_FLAG := -s +endif + GOTAGS := --tags "$(GOTAGSLIST)" GOTRIMPATH := $(shell GOPATH=$(GOPATH) && go help build | grep -q .-trimpath && echo -trimpath) @@ -76,7 +80,7 @@ GOLDFLAGS := $(GOLDFLAGS_BASE) \ UNIT_TEST_SOURCES := $(sort $(shell GOPATH=$(GOPATH) && GO111MODULE=off && go list ./... | grep -v /go-algorand/test/ )) ALGOD_API_PACKAGES := $(sort $(shell GOPATH=$(GOPATH) && GO111MODULE=off && cd daemon/algod/api; go list ./... )) -MSGP_GENERATE := ./protocol ./protocol/test ./crypto ./crypto/compactcert ./data/basics ./data/transactions ./data/committee ./data/bookkeeping ./data/hashable ./agreement ./rpcs ./node ./ledger ./ledger/ledgercore ./compactcert ./data/account +MSGP_GENERATE := ./protocol ./protocol/test ./crypto ./crypto/merklearray ./crypto/merklesignature ./crypto/compactcert ./data/basics ./data/transactions ./data/committee ./data/bookkeeping ./data/hashable ./agreement ./rpcs ./node ./ledger ./ledger/ledgercore ./compactcert ./data/account default: build @@ -290,7 +294,7 @@ gen/%/genesis.dump: gen/%/genesis.json ./scripts/dump_genesis.sh $< > $@ gen/%/genesis.json: gen/%.json gen/generate.go buildsrc - $(GOPATH1)/bin/genesis -q -n $(shell basename $(shell dirname $@)) -c $< -d $(subst .json,,$<) + $(GOPATH1)/bin/genesis -q $(SHORT_PART_PERIOD_FLAG) -n $(shell basename $(shell dirname $@)) -c $< -d $(subst .json,,$<) gen: $(addsuffix gen, $(NETWORKS)) mainnetgen @@ -303,6 +307,9 @@ gen/mainnet/genesis.dump: gen/mainnet/genesis.json mainnetgen: gen/mainnet/genesis.dump +# The mainnet genesis.json file generated by this target does not have timestamp value so the hash is different from the deployed mainnet, +# use a real genesis.json file from installer/genesis/mainnet/genesis.json if needed. +# This target is preserved as part of the history on how mainnet genesis.json was generated from the CSV file. gen/mainnet/genesis.json: gen/pregen/mainnet/genesis.csv buildsrc mkdir -p gen/mainnet cat gen/pregen/mainnet/genesis.csv | $(GOPATH1)/bin/incorporate -m gen/pregen/mainnet/metadata.json > gen/mainnet/genesis.json diff --git a/README.md b/README.md index 1f9045adf1..a935722f71 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -[![Build Status](https://travis-ci.com/algorand/go-algorand.svg?branch=master)](https://travis-ci.com/algorand/go-algorand) +| rel/stable
[![CircleCI](https://circleci.com/gh/algorand/go-algorand/tree/rel%2Fstable.svg?style=svg)](https://circleci.com/gh/algorand/go-algorand/tree/rel%2Fstable) | rel/beta
[![CircleCI](https://circleci.com/gh/algorand/go-algorand/tree/rel%2Fbeta.svg?style=svg)](https://circleci.com/gh/algorand/go-algorand/tree/rel%2Fbeta) | rel/nightly
[![CircleCI](https://circleci.com/gh/algorand/go-algorand/tree/rel%2Fnightly.svg?style=svg)](https://circleci.com/gh/algorand/go-algorand/tree/rel%2Fnightly) | +| --- | --- | --- | go-algorand ==================== @@ -163,13 +164,14 @@ The following packages allow developers to interface with the Algorand system: - `cmd/catchupsrv` ([README](cmd/catchupsrv/README.md)) is a tool to assist with processing historic blocks on a new node. - `libgoal` exports a Go interface useful for developers of Algorand clients. - - `debug` holds secondary commands which assist developers during debugging. + - `tools` ([README](tools/README.md)) various tools and utilities without a better place to go. + - `tools/debug` holds secondary commands which assist developers during debugging. + - `tools/misc` ([README](tools/misc/README.md)) small tools that are sometimes handy in a pinch. The following packages contain tools to help Algorand developers deploy networks of their own: - `nodecontrol` - - `tools` - `docker` - `commandandcontrol` ([README](test/commandandcontrol/README.md)) is a tool to automate a network of algod instances. @@ -190,6 +192,6 @@ A number of packages provide utilities for the various components: Please see the [COPYING_FAQ](COPYING_FAQ) for details about how to apply our license. -Copyright (C) 2019-2021, Algorand Inc. +Copyright (C) 2019-2022, Algorand Inc. [developer site url]: https://developer.algorand.org/ diff --git a/THANKS.md b/THANKS.md index 72190d586c..31201532fe 100644 --- a/THANKS.md +++ b/THANKS.md @@ -4,15 +4,17 @@ A big thank you to everyone who has contributed to the `go-algorand` codebase. ### External Contributors -In no particular order: -- zacharyestep +- aybehrouz +- fionnachan +- jeapostrophe - jecassis -- mxmauro -- scnale - jsign +- mxmauro +- Olshansk +- qkniep - RomitKumar -- jeapostrophe -- aybehrouz +- scnale +- zacharyestep ### Bug Reports - Nanyan diff --git a/agreement/README.md b/agreement/README.md index d3b2e1611a..6c627a6f9b 100644 --- a/agreement/README.md +++ b/agreement/README.md @@ -43,7 +43,7 @@ will also recover safely after crashes. # Specification The specification for the protocol implemented by this package is -located [here](https://github.com/algorand/spec). +located [here](https://github.com/algorandfoundation/specs). Optimizations from and other deviations from the spec will be noted throughout this file. diff --git a/agreement/abstractions.go b/agreement/abstractions.go index 390b32dfdb..cf58aa3725 100644 --- a/agreement/abstractions.go +++ b/agreement/abstractions.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -224,7 +224,7 @@ type KeyManager interface { // VotingKeys returns an immutable array of voting keys that are // valid for the provided votingRound, and were available at // keysRound. - VotingKeys(votingRound, keysRound basics.Round) []account.Participation + VotingKeys(votingRound, keysRound basics.Round) []account.ParticipationRecordForRound // Record indicates that the given participation action has been taken. // The operation needs to be asynchronous to avoid impacting agreement. diff --git a/agreement/actions.go b/agreement/actions.go index 48785efaf2..a272545c9b 100644 --- a/agreement/actions.go +++ b/agreement/actions.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/actor.go b/agreement/actor.go index db0b07ed95..96106eb138 100644 --- a/agreement/actor.go +++ b/agreement/actor.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/agreeInstall.go b/agreement/agreeInstall.go index 7bb5d80c5d..1028eedb99 100644 --- a/agreement/agreeInstall.go +++ b/agreement/agreeInstall.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/agreementtest/keyManager.go b/agreement/agreementtest/keyManager.go index 340c8f40e4..fe86fad82a 100644 --- a/agreement/agreementtest/keyManager.go +++ b/agreement/agreementtest/keyManager.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -25,11 +25,25 @@ import ( type SimpleKeyManager []account.Participation // VotingKeys implements KeyManager.VotingKeys. -func (m SimpleKeyManager) VotingKeys(votingRound, _ basics.Round) []account.Participation { - var km []account.Participation +func (m SimpleKeyManager) VotingKeys(votingRound, _ basics.Round) []account.ParticipationRecordForRound { + var km []account.ParticipationRecordForRound for _, acc := range m { if acc.OverlapsInterval(votingRound, votingRound) { - km = append(km, acc) + record := account.ParticipationRecord{ + ParticipationID: acc.ID(), + Account: acc.Parent, + FirstValid: acc.FirstValid, + LastValid: acc.LastValid, + KeyDilution: acc.KeyDilution, + LastVote: 0, + LastBlockProposal: 0, + LastStateProof: 0, + EffectiveFirst: acc.FirstValid, + EffectiveLast: acc.LastValid, + VRF: acc.VRF, + Voting: acc.Voting, + } + km = append(km, account.ParticipationRecordForRound{ParticipationRecord: record}) } } return km diff --git a/agreement/agreementtest/simulate.go b/agreement/agreementtest/simulate.go index 68bf773376..086d1f5dc4 100644 --- a/agreement/agreementtest/simulate.go +++ b/agreement/agreementtest/simulate.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/agreementtest/simulate_test.go b/agreement/agreementtest/simulate_test.go index c2dcbe233b..173f91fad8 100644 --- a/agreement/agreementtest/simulate_test.go +++ b/agreement/agreementtest/simulate_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/asyncVoteVerifier.go b/agreement/asyncVoteVerifier.go index 072fb2f15a..cb26b440eb 100644 --- a/agreement/asyncVoteVerifier.go +++ b/agreement/asyncVoteVerifier.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/asyncVoteVerifier_test.go b/agreement/asyncVoteVerifier_test.go index 6cfadedd8b..8a4e819595 100644 --- a/agreement/asyncVoteVerifier_test.go +++ b/agreement/asyncVoteVerifier_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -44,7 +44,7 @@ func TestVerificationAgainstFullExecutionPool(t *testing.T) { voteVerifier := MakeAsyncVoteVerifier(&expiredExecPool{mainPool}) defer voteVerifier.Quit() verifyErr := voteVerifier.verifyVote(context.Background(), nil, unauthenticatedVote{}, 0, message{}, make(chan<- asyncVerifyVoteResponse, 1)) - require.Error(t, context.Canceled, verifyErr) + require.Equal(t, context.Canceled, verifyErr) verifyEqVoteErr := voteVerifier.verifyEqVote(context.Background(), nil, unauthenticatedEquivocationVote{}, 0, message{}, make(chan<- asyncVerifyVoteResponse, 1)) - require.Error(t, context.Canceled, verifyEqVoteErr) + require.Equal(t, context.Canceled, verifyEqVoteErr) } diff --git a/agreement/autopsy.go b/agreement/autopsy.go index be935aa792..2b344f0a66 100644 --- a/agreement/autopsy.go +++ b/agreement/autopsy.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/bundle.go b/agreement/bundle.go index 04780f12b4..211f67b5b8 100644 --- a/agreement/bundle.go +++ b/agreement/bundle.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/bundle_test.go b/agreement/bundle_test.go index 0ab62dede6..615b2c5081 100644 --- a/agreement/bundle_test.go +++ b/agreement/bundle_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/cadaver.go b/agreement/cadaver.go index 5692b62dd8..7b0cb8e761 100644 --- a/agreement/cadaver.go +++ b/agreement/cadaver.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/certificate.go b/agreement/certificate.go index 3f6ea0d51a..34c4192d8b 100644 --- a/agreement/certificate.go +++ b/agreement/certificate.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/certificate_test.go b/agreement/certificate_test.go index e8b10e810d..4881ac2443 100644 --- a/agreement/certificate_test.go +++ b/agreement/certificate_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/common_test.go b/agreement/common_test.go index 9ecf5b4b9f..fa43d10912 100644 --- a/agreement/common_test.go +++ b/agreement/common_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/coservice.go b/agreement/coservice.go index 38939e56da..0126cb85d3 100644 --- a/agreement/coservice.go +++ b/agreement/coservice.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/cryptoRequestContext.go b/agreement/cryptoRequestContext.go index b6441efcc3..88530e3570 100644 --- a/agreement/cryptoRequestContext.go +++ b/agreement/cryptoRequestContext.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/cryptoRequestContext_test.go b/agreement/cryptoRequestContext_test.go index bdd98b8fdd..d41533f2a2 100644 --- a/agreement/cryptoRequestContext_test.go +++ b/agreement/cryptoRequestContext_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/cryptoVerifier.go b/agreement/cryptoVerifier.go index 4f84ca3ba8..ff8a6d6aa4 100644 --- a/agreement/cryptoVerifier.go +++ b/agreement/cryptoVerifier.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/cryptoVerifier_test.go b/agreement/cryptoVerifier_test.go index 78e6f6488b..a42ffd9b0c 100644 --- a/agreement/cryptoVerifier_test.go +++ b/agreement/cryptoVerifier_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -72,7 +72,7 @@ func makeUnauthenticatedVote(l Ledger, sender basics.Address, selection *crypto. m, _ := membership(l, rv.Sender, rv.Round, rv.Period, rv.Step) cred := committee.MakeCredential(&selection.SK, m.Selector) - ephID := basics.OneTimeIDForRound(rv.Round, voting.KeyDilution(config.Consensus[protocol.ConsensusCurrentVersion])) + ephID := basics.OneTimeIDForRound(rv.Round, voting.KeyDilution(config.Consensus[protocol.ConsensusCurrentVersion].DefaultKeyDilution)) sig := voting.Sign(ephID, rv) return unauthenticatedVote{ diff --git a/agreement/demux.go b/agreement/demux.go index a65e5552c7..65a5d06a0d 100644 --- a/agreement/demux.go +++ b/agreement/demux.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -21,7 +21,6 @@ import ( "fmt" "time" - "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/logging/logspec" "github.com/algorand/go-algorand/protocol" @@ -123,7 +122,7 @@ func (d *demux) tokenizeMessages(ctx context.Context, net Network, tag protocol. o, err := tokenize(raw.Data) if err != nil { - logging.Base().Warnf("disconnecting from peer: error decoding message tagged %v: %v", tag, err) + d.log.Warnf("disconnecting from peer: error decoding message tagged %v: %v", tag, err) net.Disconnect(raw.MessageHandle) d.UpdateEventsQueue(eventQueueTokenizing[tag], 0) continue @@ -236,22 +235,7 @@ func (d *demux) next(s *Service, deadline time.Duration, fastDeadline time.Durat ledgerNextRoundCh := s.Ledger.Wait(nextRound) deadlineCh := s.Clock.TimeoutAt(deadline) - var fastDeadlineCh <-chan time.Time - - fastPartitionRecoveryEnabled := false - if proto, err := d.ledger.ConsensusVersion(ParamsRound(currentRound)); err != nil { - logging.Base().Warnf("demux: could not get consensus parameters for round %d: %v", ParamsRound(currentRound), err) - // this might happen during catchup, since the Ledger.Wait fires as soon as a new block is received by the ledger, which could be - // far before it's being committed. In these cases, it should be safe to default to the current consensus version. On subsequent - // iterations, it will get "corrected" since the ledger would finish flushing the blocks to disk. - fastPartitionRecoveryEnabled = config.Consensus[protocol.ConsensusCurrentVersion].FastPartitionRecovery - } else { - fastPartitionRecoveryEnabled = config.Consensus[proto].FastPartitionRecovery - } - - if fastPartitionRecoveryEnabled { - fastDeadlineCh = s.Clock.TimeoutAt(fastDeadline) - } + fastDeadlineCh := s.Clock.TimeoutAt(fastDeadline) d.UpdateEventsQueue(eventQueueDemux, 0) d.monitor.dec(demuxCoserviceType) diff --git a/agreement/demux_test.go b/agreement/demux_test.go index e351b9a79a..0c15d58de0 100644 --- a/agreement/demux_test.go +++ b/agreement/demux_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/doc.go b/agreement/doc.go index 7dcf6d077b..ffbc79fa0e 100644 --- a/agreement/doc.go +++ b/agreement/doc.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/encoding_test.go b/agreement/encoding_test.go index b59c633c85..9e899ca5c1 100644 --- a/agreement/encoding_test.go +++ b/agreement/encoding_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/errors.go b/agreement/errors.go index ba5214b148..606e433b64 100644 --- a/agreement/errors.go +++ b/agreement/errors.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/events.go b/agreement/events.go index e879f8584f..7b631624a1 100644 --- a/agreement/events.go +++ b/agreement/events.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/bandwidthFilter_test.go b/agreement/fuzzer/bandwidthFilter_test.go index 4b2af83978..e06ff72602 100644 --- a/agreement/fuzzer/bandwidthFilter_test.go +++ b/agreement/fuzzer/bandwidthFilter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/catchupFilter_test.go b/agreement/fuzzer/catchupFilter_test.go index b12c2e5972..64493d8402 100644 --- a/agreement/fuzzer/catchupFilter_test.go +++ b/agreement/fuzzer/catchupFilter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/clockedFilter_test.go b/agreement/fuzzer/clockedFilter_test.go index b26013de9a..ceab6560a6 100644 --- a/agreement/fuzzer/clockedFilter_test.go +++ b/agreement/fuzzer/clockedFilter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/dropMessageFilter_test.go b/agreement/fuzzer/dropMessageFilter_test.go index 1e728a5068..519782c77c 100644 --- a/agreement/fuzzer/dropMessageFilter_test.go +++ b/agreement/fuzzer/dropMessageFilter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/duplicateMessageFilter_test.go b/agreement/fuzzer/duplicateMessageFilter_test.go index 571806e2cf..6d0e25f909 100644 --- a/agreement/fuzzer/duplicateMessageFilter_test.go +++ b/agreement/fuzzer/duplicateMessageFilter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/filter_test.go b/agreement/fuzzer/filter_test.go index 42d8e2e94c..ede2d907e1 100644 --- a/agreement/fuzzer/filter_test.go +++ b/agreement/fuzzer/filter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/fuzzer.go b/agreement/fuzzer/fuzzer.go index 1d96ab9776..3c404015b9 100644 --- a/agreement/fuzzer/fuzzer.go +++ b/agreement/fuzzer/fuzzer.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/fuzzer_test.go b/agreement/fuzzer/fuzzer_test.go index c6cc91be79..42567ef956 100644 --- a/agreement/fuzzer/fuzzer_test.go +++ b/agreement/fuzzer/fuzzer_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/ledger_test.go b/agreement/fuzzer/ledger_test.go index 9866f53c4d..2ae73dd694 100644 --- a/agreement/fuzzer/ledger_test.go +++ b/agreement/fuzzer/ledger_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/messageDecoderFilter_test.go b/agreement/fuzzer/messageDecoderFilter_test.go index fa9c34ce8c..cb80ed990b 100644 --- a/agreement/fuzzer/messageDecoderFilter_test.go +++ b/agreement/fuzzer/messageDecoderFilter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/messageDelayFilter_test.go b/agreement/fuzzer/messageDelayFilter_test.go index 2fc67b2f8b..04cf55081f 100644 --- a/agreement/fuzzer/messageDelayFilter_test.go +++ b/agreement/fuzzer/messageDelayFilter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/messageDuplicationFilter_test.go b/agreement/fuzzer/messageDuplicationFilter_test.go index 0d554e3b1a..747301a11f 100644 --- a/agreement/fuzzer/messageDuplicationFilter_test.go +++ b/agreement/fuzzer/messageDuplicationFilter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/messagePriorityQueue_test.go b/agreement/fuzzer/messagePriorityQueue_test.go index b903138ef7..bbb9f13647 100644 --- a/agreement/fuzzer/messagePriorityQueue_test.go +++ b/agreement/fuzzer/messagePriorityQueue_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/messageReflectionFilter_test.go b/agreement/fuzzer/messageReflectionFilter_test.go index 7a61d02981..c1b58ef27f 100644 --- a/agreement/fuzzer/messageReflectionFilter_test.go +++ b/agreement/fuzzer/messageReflectionFilter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/messageRegossipFilter_test.go b/agreement/fuzzer/messageRegossipFilter_test.go index eed7c0db1f..628db283a4 100644 --- a/agreement/fuzzer/messageRegossipFilter_test.go +++ b/agreement/fuzzer/messageRegossipFilter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/messageReorderingFilter_test.go b/agreement/fuzzer/messageReorderingFilter_test.go index 2e48bca4cc..79680ab885 100644 --- a/agreement/fuzzer/messageReorderingFilter_test.go +++ b/agreement/fuzzer/messageReorderingFilter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/networkFacade_test.go b/agreement/fuzzer/networkFacade_test.go index 01d9f0437c..6422a8c575 100644 --- a/agreement/fuzzer/networkFacade_test.go +++ b/agreement/fuzzer/networkFacade_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/nodeCrashFilter_test.go b/agreement/fuzzer/nodeCrashFilter_test.go index edef73e70d..a15930b94d 100644 --- a/agreement/fuzzer/nodeCrashFilter_test.go +++ b/agreement/fuzzer/nodeCrashFilter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/nullFilter_test.go b/agreement/fuzzer/nullFilter_test.go index e2112ebd14..0cc7300c34 100644 --- a/agreement/fuzzer/nullFilter_test.go +++ b/agreement/fuzzer/nullFilter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/router_test.go b/agreement/fuzzer/router_test.go index 62ac2c00c9..f63bb389ef 100644 --- a/agreement/fuzzer/router_test.go +++ b/agreement/fuzzer/router_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/schedulerFilter_test.go b/agreement/fuzzer/schedulerFilter_test.go index 514cd57caf..dd48aa5339 100644 --- a/agreement/fuzzer/schedulerFilter_test.go +++ b/agreement/fuzzer/schedulerFilter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/tests_test.go b/agreement/fuzzer/tests_test.go index 22e1cc049b..75a0cc67cf 100644 --- a/agreement/fuzzer/tests_test.go +++ b/agreement/fuzzer/tests_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/topologyFilter_test.go b/agreement/fuzzer/topologyFilter_test.go index 2d2992fb9f..841e9eb041 100644 --- a/agreement/fuzzer/topologyFilter_test.go +++ b/agreement/fuzzer/topologyFilter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/trafficStatisticsFilter_test.go b/agreement/fuzzer/trafficStatisticsFilter_test.go index e167604c1c..802583c4d8 100644 --- a/agreement/fuzzer/trafficStatisticsFilter_test.go +++ b/agreement/fuzzer/trafficStatisticsFilter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/validator_test.go b/agreement/fuzzer/validator_test.go index 726e09dbae..95a198e5ce 100644 --- a/agreement/fuzzer/validator_test.go +++ b/agreement/fuzzer/validator_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/fuzzer/voteFilter_test.go b/agreement/fuzzer/voteFilter_test.go index 9901b889f1..e99a19b319 100644 --- a/agreement/fuzzer/voteFilter_test.go +++ b/agreement/fuzzer/voteFilter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/gossip/network.go b/agreement/gossip/network.go index d5e5dca037..21d564c292 100644 --- a/agreement/gossip/network.go +++ b/agreement/gossip/network.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/gossip/networkFull_test.go b/agreement/gossip/networkFull_test.go index ce49b579ef..80b6475b80 100644 --- a/agreement/gossip/networkFull_test.go +++ b/agreement/gossip/networkFull_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -38,7 +38,7 @@ func TestMain(m *testing.M) { logging.Base().SetLevel(logging.Debug) // increase limit on max allowed number of sockets - err := util.RaiseRlimit(500) + err := util.SetFdSoftLimit(500) if err != nil { os.Exit(1) } @@ -50,7 +50,6 @@ func spinNetwork(t *testing.T, nodesCount int) ([]*networkImpl, []*messageCounte cfg := config.GetDefaultLocal() cfg.GossipFanout = nodesCount - 1 cfg.NetAddress = "127.0.0.1:0" - cfg.IncomingConnectionsLimit = -1 cfg.IncomingMessageFilterBucketCount = 5 cfg.IncomingMessageFilterBucketSize = 32 cfg.OutgoingMessageFilterBucketCount = 3 diff --git a/agreement/gossip/network_test.go b/agreement/gossip/network_test.go index 3bbf744ca6..22176157e6 100644 --- a/agreement/gossip/network_test.go +++ b/agreement/gossip/network_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/keyManager_test.go b/agreement/keyManager_test.go index f992e01f09..43ab187698 100644 --- a/agreement/keyManager_test.go +++ b/agreement/keyManager_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -19,9 +19,10 @@ package agreement import ( "testing" - "github.com/algorand/go-deadlock" "github.com/stretchr/testify/require" + "github.com/algorand/go-deadlock" + "github.com/algorand/go-algorand/data/account" "github.com/algorand/go-algorand/data/basics" ) @@ -41,11 +42,27 @@ type recordingKeyManager struct { } // VotingKeys implements KeyManager.VotingKeys. -func (m *recordingKeyManager) VotingKeys(votingRound, _ basics.Round) []account.Participation { - var km []account.Participation +func (m *recordingKeyManager) VotingKeys(votingRound, _ basics.Round) []account.ParticipationRecordForRound { + var km []account.ParticipationRecordForRound for _, acc := range m.keys { if acc.OverlapsInterval(votingRound, votingRound) { - km = append(km, acc) + partRecordForRound := account.ParticipationRecordForRound{ + ParticipationRecord: account.ParticipationRecord{ + ParticipationID: acc.ID(), + Account: acc.Parent, + FirstValid: acc.FirstValid, + LastValid: acc.LastValid, + KeyDilution: acc.KeyDilution, + LastVote: 0, + LastBlockProposal: 0, + LastStateProof: 0, + EffectiveFirst: 0, + EffectiveLast: acc.LastValid, + VRF: acc.VRF, + Voting: acc.Voting, + }, + } + km = append(km, partRecordForRound) } } return km diff --git a/agreement/listener.go b/agreement/listener.go index d3fd4870c2..b0dafaff71 100644 --- a/agreement/listener.go +++ b/agreement/listener.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -16,10 +16,6 @@ package agreement -import ( - "github.com/algorand/go-algorand/logging" -) - // A listener is a state machine which can handle events, returning new events. type listener interface { // T returns the stateMachineTag describing the listener. @@ -60,17 +56,17 @@ func (l checkedListener) handle(r routerHandle, p player, in event) event { errs := l.pre(p, in) if len(errs) != 0 { for _, err := range errs { - logging.Base().Errorf("%v: precondition violated: %v", l.T(), err) + r.t.log.Errorf("%v: precondition violated: %v", l.T(), err) } - logging.Base().Panicf("%v: precondition violated: %v", l.T(), errs[0]) + r.t.log.Panicf("%v: precondition violated: %v", l.T(), errs[0]) } out := l.listener.handle(r, p, in) errs = l.post(p, in, out) if len(errs) != 0 { for _, err := range errs { - logging.Base().Errorf("%v: postcondition violated: %v", l.T(), err) + r.t.log.Errorf("%v: postcondition violated: %v", l.T(), err) } - logging.Base().Panicf("%v: postcondition violated: %v", l.T(), errs[0]) + r.t.log.Panicf("%v: postcondition violated: %v", l.T(), errs[0]) } return out } diff --git a/agreement/message.go b/agreement/message.go index 5deeeb9a28..33a6d23ce0 100644 --- a/agreement/message.go +++ b/agreement/message.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/message_test.go b/agreement/message_test.go index ac97f3573a..88c4b504b3 100644 --- a/agreement/message_test.go +++ b/agreement/message_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/params.go b/agreement/params.go index 43bcc673a0..168c252608 100644 --- a/agreement/params.go +++ b/agreement/params.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/persistence.go b/agreement/persistence.go index 6175e32bbe..aef2a0f609 100644 --- a/agreement/persistence.go +++ b/agreement/persistence.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -82,7 +82,7 @@ func persist(log serviceLogger, crash db.Accessor, Round basics.Round, Period pe return } - logging.Base().Errorf("persisting failure: %v", err) + log.Errorf("persisting failure: %v", err) return } @@ -90,7 +90,7 @@ func persist(log serviceLogger, crash db.Accessor, Round basics.Round, Period pe // // In case it's unable to clear the Service table, an error would get logged. func reset(log logging.Logger, crash db.Accessor) { - logging.Base().Infof("reset (agreement): resetting crash state") + log.Infof("reset (agreement): resetting crash state") err := crash.Atomic(func(ctx context.Context, tx *sql.Tx) (err error) { // we could not retrieve our state, so wipe it @@ -99,7 +99,7 @@ func reset(log logging.Logger, crash db.Accessor) { }) if err != nil { - logging.Base().Warnf("reset (agreement): failed to clear Service table - %v", err) + log.Warnf("reset (agreement): failed to clear Service table - %v", err) } } @@ -124,7 +124,8 @@ func restore(log logging.Logger, crash db.Accessor) (raw []byte, err error) { if err == nil { // the above call was completed sucecssfully, which means that we've just created the table ( which wasn't there ! ). // in that case, the table is guaranteed to be empty, and therefore we can return right here. - logging.Base().Infof("restore (agreement): crash state table initialized") + log.Infof("restore (agreement): crash state table initialized") + noCrashState = true // this is a normal case (we don't have crash state) err = errNoCrashStateAvailable return } @@ -135,7 +136,7 @@ func restore(log logging.Logger, crash db.Accessor) (raw []byte, err error) { if !reset { return } - logging.Base().Infof("restore (agreement): resetting crash state") + log.Infof("restore (agreement): resetting crash state") // we could not retrieve our state, so wipe it _, err = tx.Exec("delete from Service") @@ -149,12 +150,12 @@ func restore(log logging.Logger, crash db.Accessor) (raw []byte, err error) { row := tx.QueryRow("select count(*) from Service") err := row.Scan(&nrows) if err != nil { - logging.Base().Errorf("restore (agreement): could not query raw state: %v", err) + log.Errorf("restore (agreement): could not query raw state: %v", err) reset = true return err } if nrows != 1 { - logging.Base().Infof("restore (agreement): crash state not found (n = %d)", nrows) + log.Infof("restore (agreement): crash state not found (n = %d)", nrows) reset = true noCrashState = true // this is a normal case (we have leftover crash state from an old round) return errNoCrashStateAvailable @@ -163,7 +164,7 @@ func restore(log logging.Logger, crash db.Accessor) (raw []byte, err error) { row = tx.QueryRow("select data from Service") err = row.Scan(&raw) if err != nil { - logging.Base().Errorf("restore (agreement): could not read crash state raw data: %v", err) + log.Errorf("restore (agreement): could not read crash state raw data: %v", err) reset = true return err } @@ -176,7 +177,7 @@ func restore(log logging.Logger, crash db.Accessor) (raw []byte, err error) { // decode process the incoming raw bytes array and attempt to reconstruct the agreement state objects. // // In all decoding errors, it returns the error code in err -func decode(raw []byte, t0 timers.Clock) (t timers.Clock, rr rootRouter, p player, a []action, err error) { +func decode(raw []byte, t0 timers.Clock, log serviceLogger) (t timers.Clock, rr rootRouter, p player, a []action, err error) { var t2 timers.Clock var rr2 rootRouter var p2 player @@ -185,7 +186,7 @@ func decode(raw []byte, t0 timers.Clock) (t timers.Clock, rr rootRouter, p playe err = protocol.DecodeReflect(raw, &s) if err != nil { - logging.Base().Errorf("decode (agreement): error decoding retrieved state (len = %v): %v", len(raw), err) + log.Errorf("decode (agreement): error decoding retrieved state (len = %v): %v", len(raw), err) return } @@ -307,9 +308,9 @@ func (p *asyncPersistenceLoop) loop(ctx context.Context) { // sanity check; we check it after the fact, since it's not expected to ever happen. // performance-wise, it takes approximitly 300000ns to execute, and we don't want it to // block the persist operation. - _, _, _, _, derr := decode(s.raw, s.clock) + _, _, _, _, derr := decode(s.raw, s.clock, p.log) if derr != nil { - logging.Base().Errorf("could not decode own encoded disk state: %v", derr) + p.log.Errorf("could not decode own encoded disk state: %v", derr) } } } diff --git a/agreement/persistence_test.go b/agreement/persistence_test.go index 5c1bfda60d..94221f7be4 100644 --- a/agreement/persistence_test.go +++ b/agreement/persistence_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -43,7 +43,8 @@ func TestAgreementSerialization(t *testing.T) { encodedBytes := encode(clock, router, status, a) t0 := timers.MakeMonotonicClock(time.Date(2000, 0, 0, 0, 0, 0, 0, time.UTC)) - clock2, router2, status2, a2, err := decode(encodedBytes, t0) + log := makeServiceLogger(logging.Base()) + clock2, router2, status2, a2, err := decode(encodedBytes, t0, log) require.NoError(t, err) require.Equalf(t, clock, clock2, "Clock wasn't serialized/deserialized correctly") require.Equalf(t, router, router2, "Router wasn't serialized/deserialized correctly") @@ -77,10 +78,10 @@ func BenchmarkAgreementDeserialization(b *testing.B) { encodedBytes := encode(clock, router, status, a) t0 := timers.MakeMonotonicClock(time.Date(2000, 0, 0, 0, 0, 0, 0, time.UTC)) - + log := makeServiceLogger(logging.Base()) b.ResetTimer() for n := 0; n < b.N; n++ { - decode(encodedBytes, t0) + decode(encodedBytes, t0, log) } } diff --git a/agreement/player.go b/agreement/player.go index cb108ddd2a..2add5711e4 100644 --- a/agreement/player.go +++ b/agreement/player.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/playerContract.go b/agreement/playerContract.go index 0a43da7209..fa95c2278c 100644 --- a/agreement/playerContract.go +++ b/agreement/playerContract.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/player_permutation_test.go b/agreement/player_permutation_test.go index 960669483c..251a276229 100644 --- a/agreement/player_permutation_test.go +++ b/agreement/player_permutation_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/player_test.go b/agreement/player_test.go index 0719864c7c..ecd871bc14 100644 --- a/agreement/player_test.go +++ b/agreement/player_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/proposal.go b/agreement/proposal.go index f5256decb9..30eb2ef735 100644 --- a/agreement/proposal.go +++ b/agreement/proposal.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -60,6 +60,9 @@ type unauthenticatedProposal struct { OriginalProposer basics.Address `codec:"oprop"` } +// TransmittedPayload exported for dumping textual versions of messages +type TransmittedPayload = transmittedPayload + // ToBeHashed implements the Hashable interface. func (p unauthenticatedProposal) ToBeHashed() (protocol.HashID, []byte) { return protocol.Payload, protocol.Encode(&p) diff --git a/agreement/proposalManager.go b/agreement/proposalManager.go index b701d29718..8cf03b32fe 100644 --- a/agreement/proposalManager.go +++ b/agreement/proposalManager.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -18,8 +18,6 @@ package agreement import ( "fmt" - - "github.com/algorand/go-algorand/logging" ) // A proposalManager is a proposalMachine which applies relay rules to incoming @@ -71,7 +69,7 @@ func (m *proposalManager) handle(r routerHandle, p player, e event) event { r = m.handleNewPeriod(r, p, e.(thresholdEvent)) return emptyEvent{} } - logging.Base().Panicf("proposalManager: bad event type: observed an event of type %v", e.t()) + r.t.log.Panicf("proposalManager: bad event type: observed an event of type %v", e.t()) panic("not reached") } diff --git a/agreement/proposalManagerContract.go b/agreement/proposalManagerContract.go index 863df30596..8f20bd457b 100644 --- a/agreement/proposalManagerContract.go +++ b/agreement/proposalManagerContract.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/proposalManager_test.go b/agreement/proposalManager_test.go index 24bdb9d0dd..a759739d0f 100644 --- a/agreement/proposalManager_test.go +++ b/agreement/proposalManager_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/proposalStore.go b/agreement/proposalStore.go index 954d52dd83..973f909d03 100644 --- a/agreement/proposalStore.go +++ b/agreement/proposalStore.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -18,8 +18,6 @@ package agreement import ( "fmt" - - "github.com/algorand/go-algorand/logging" ) // An blockAssembler contains the proposal data associated with some @@ -289,7 +287,7 @@ func (store *proposalStore) handle(r routerHandle, p player, e event) event { case newRound: if len(store.Assemblers) > 1 { // TODO this check is really an implementation invariant; move it into a whitebox test - logging.Base().Panic("too many assemblers") + r.t.log.Panic("too many assemblers") } for pv, ea := range store.Assemblers { if ea.Filled { @@ -347,7 +345,7 @@ func (store *proposalStore) handle(r routerHandle, p player, e event) event { se.Payload = ea.Payload return se } - logging.Base().Panicf("proposalStore: bad event type: observed an event of type %v", e.t()) + r.t.log.Panicf("proposalStore: bad event type: observed an event of type %v", e.t()) panic("not reached") } diff --git a/agreement/proposalStoreContract.go b/agreement/proposalStoreContract.go index 0294469fd9..6d888bc6dc 100644 --- a/agreement/proposalStoreContract.go +++ b/agreement/proposalStoreContract.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/proposalStore_test.go b/agreement/proposalStore_test.go index 2333b0344e..237579c842 100644 --- a/agreement/proposalStore_test.go +++ b/agreement/proposalStore_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/proposalTable.go b/agreement/proposalTable.go index 5f8672265c..79448f4032 100644 --- a/agreement/proposalTable.go +++ b/agreement/proposalTable.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/proposalTracker.go b/agreement/proposalTracker.go index 59607afbbd..c76c5c9fda 100644 --- a/agreement/proposalTracker.go +++ b/agreement/proposalTracker.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -20,7 +20,6 @@ import ( "fmt" "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/logging" ) // A proposalSeeker finds the vote with the lowest credential until freeze() is @@ -180,7 +179,7 @@ func (t *proposalTracker) handle(r routerHandle, p player, e event) event { return se } - logging.Base().Panicf("proposalTracker: bad event type: observed an event of type %v", e.t()) + r.t.log.Panicf("proposalTracker: bad event type: observed an event of type %v", e.t()) panic("not reached") } diff --git a/agreement/proposalTrackerContract.go b/agreement/proposalTrackerContract.go index 856220e504..c33feb8413 100644 --- a/agreement/proposalTrackerContract.go +++ b/agreement/proposalTrackerContract.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/proposalTracker_test.go b/agreement/proposalTracker_test.go index 7777ed14bf..71096b4ad6 100644 --- a/agreement/proposalTracker_test.go +++ b/agreement/proposalTracker_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/proposal_test.go b/agreement/proposal_test.go index 24ddfbfd18..2adfb6c6c8 100644 --- a/agreement/proposal_test.go +++ b/agreement/proposal_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/pseudonode.go b/agreement/pseudonode.go index 2589028cbb..f52854d6a5 100644 --- a/agreement/pseudonode.go +++ b/agreement/pseudonode.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -33,8 +33,9 @@ import ( // TODO put these in config const ( - pseudonodeVerificationBacklog = 32 - maxPseudonodeOutputWaitDuration = 2 * time.Second + pseudonodeVerificationBacklog = 32 + maxPseudonodeOutputWaitDuration = 2 * time.Second + votingKeysLoggingDurationThreashold = 200 * time.Millisecond ) var errPseudonodeBacklogFull = fmt.Errorf("pseudonode input channel is full") @@ -76,8 +77,8 @@ type asyncPseudonode struct { quit chan struct{} // a quit signal for the verifier goroutines closeWg *sync.WaitGroup // frontend waitgroup to get notified when all the verifier goroutines are done. monitor *coserviceMonitor - participationKeysRound basics.Round // the round to which the participationKeys matches - participationKeys []account.Participation // the list of the participation keys for round participationKeysRound + participationKeysRound basics.Round // the round to which the participationKeys matches + participationKeys []account.ParticipationRecordForRound // the list of the participation keys for round participationKeysRound proposalsVerifier *pseudonodeVerifier // dynamically generated verifier goroutine that manages incoming proposals making request. votesVerifier *pseudonodeVerifier // dynamically generated verifier goroutine that manages incoming votes making request. @@ -93,7 +94,7 @@ type pseudonodeBaseTask struct { node *asyncPseudonode context context.Context // the context associated with that task; context might expire for a single task but remain valid for others. out chan externalEvent - participation []account.Participation + participation []account.ParticipationRecordForRound } type pseudonodeVotesTask struct { @@ -198,7 +199,7 @@ func (n asyncPseudonode) MakeVotes(ctx context.Context, r round, p period, s ste // load the participation keys from the account manager ( as needed ) for the // current round. -func (n *asyncPseudonode) loadRoundParticipationKeys(voteRound basics.Round) []account.Participation { +func (n *asyncPseudonode) loadRoundParticipationKeys(voteRound basics.Round) []account.ParticipationRecordForRound { // if we've already loaded up the keys, then just skip loading them. if n.participationKeysRound == voteRound { return n.participationKeys @@ -215,9 +216,18 @@ func (n *asyncPseudonode) loadRoundParticipationKeys(voteRound basics.Round) []a } balanceRound := balanceRound(voteRound, cparams) + // measure the time it takes to acquire the voting keys. + beforeVotingKeysTime := time.Now() + // otherwise, we want to load the participation keys. n.participationKeys = n.keys.VotingKeys(voteRound, balanceRound) n.participationKeysRound = voteRound + + votingKeysDuration := time.Since(beforeVotingKeysTime) + if votingKeysDuration > votingKeysLoggingDurationThreashold { + n.log.Warnf("asyncPseudonode: acquiring the %d voting keys for round %d took %v", len(n.participationKeys), voteRound, votingKeysDuration) + } + return n.participationKeys } @@ -267,7 +277,7 @@ func (n asyncPseudonode) makePseudonodeVerifier(voteVerifier *AsyncVoteVerifier) } // makeProposals creates a slice of block proposals for the given round and period. -func (n asyncPseudonode) makeProposals(round basics.Round, period period, accounts []account.Participation) ([]proposal, []unauthenticatedVote) { +func (n asyncPseudonode) makeProposals(round basics.Round, period period, accounts []account.ParticipationRecordForRound) ([]proposal, []unauthenticatedVote) { ve, err := n.factory.AssembleBlock(round) if err != nil { if err != ErrAssembleBlockRoundStale { @@ -278,16 +288,16 @@ func (n asyncPseudonode) makeProposals(round basics.Round, period period, accoun votes := make([]unauthenticatedVote, 0, len(accounts)) proposals := make([]proposal, 0, len(accounts)) - for _, account := range accounts { - payload, proposal, err := proposalForBlock(account.Address(), account.VRFSecrets(), ve, period, n.ledger) + for _, acc := range accounts { + payload, proposal, err := proposalForBlock(acc.Account, acc.VRF, ve, period, n.ledger) if err != nil { - n.log.Errorf("pseudonode.makeProposals: could not create proposal for block (address %v): %v", account.Address(), err) + n.log.Errorf("pseudonode.makeProposals: could not create proposal for block (address %v): %v", acc.Account, err) continue } // attempt to make the vote - rv := rawVote{Sender: account.Address(), Round: round, Period: period, Step: propose, Proposal: proposal} - uv, err := makeVote(rv, account.VotingSigner(), account.VRFSecrets(), n.ledger) + rv := rawVote{Sender: acc.Account, Round: round, Period: period, Step: propose, Proposal: proposal} + uv, err := makeVote(rv, acc.VotingSigner(), acc.VRF, n.ledger) if err != nil { n.log.Warnf("pseudonode.makeProposals: could not create vote: %v", err) continue @@ -303,11 +313,11 @@ func (n asyncPseudonode) makeProposals(round basics.Round, period period, accoun // makeVotes creates a slice of votes for a given proposal value in a given // round, period, and step. -func (n asyncPseudonode) makeVotes(round basics.Round, period period, step step, proposal proposalValue, participation []account.Participation) []unauthenticatedVote { +func (n asyncPseudonode) makeVotes(round basics.Round, period period, step step, proposal proposalValue, participation []account.ParticipationRecordForRound) []unauthenticatedVote { votes := make([]unauthenticatedVote, 0) - for _, account := range participation { - rv := rawVote{Sender: account.Address(), Round: round, Period: period, Step: step, Proposal: proposal} - uv, err := makeVote(rv, account.VotingSigner(), account.VRFSecrets(), n.ledger) + for _, part := range participation { + rv := rawVote{Sender: part.Account, Round: round, Period: period, Step: step, Proposal: proposal} + uv, err := makeVote(rv, part.VotingSigner(), part.VRF, n.ledger) if err != nil { n.log.Warnf("pseudonode.makeVotes: could not create vote: %v", err) continue @@ -481,7 +491,6 @@ func (t pseudonodeProposalsTask) execute(verifier *AsyncVoteVerifier, quit chan payloads, votes := t.node.makeProposals(t.round, t.period, t.participation) fields := logging.Fields{ - "Context": "Agreement", "Type": logspec.ProposalAssembled.String(), "ObjectRound": t.round, "ObjectPeriod": t.period, diff --git a/agreement/pseudonode_test.go b/agreement/pseudonode_test.go index e658555561..dfb9f2ce1f 100644 --- a/agreement/pseudonode_test.go +++ b/agreement/pseudonode_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -388,10 +388,10 @@ func (n serializedPseudonode) Quit() { } type KeyManagerProxy struct { - target func(basics.Round, basics.Round) []account.Participation + target func(basics.Round, basics.Round) []account.ParticipationRecordForRound } -func (k *KeyManagerProxy) VotingKeys(votingRound, balanceRound basics.Round) []account.Participation { +func (k *KeyManagerProxy) VotingKeys(votingRound, balanceRound basics.Round) []account.ParticipationRecordForRound { return k.target(votingRound, balanceRound) } @@ -447,7 +447,7 @@ func TestPseudonodeLoadingOfParticipationKeys(t *testing.T) { pb.keys = keyManagerProxy cparams, _ := ledger.ConsensusParams(0) for rnd := basics.Round(3); rnd < 1000; rnd += 43 { - keyManagerProxy.target = func(votingRound, balanceRnd basics.Round) []account.Participation { + keyManagerProxy.target = func(votingRound, balanceRnd basics.Round) []account.ParticipationRecordForRound { require.Equal(t, rnd, votingRound) require.Equal(t, balanceRound(rnd, cparams), balanceRnd) return keyManager.VotingKeys(votingRound, balanceRnd) @@ -520,11 +520,12 @@ func TestPseudonodeFailedEnqueuedTasks(t *testing.T) { for i := 0; i < pseudonodeVerificationBacklog*2; i++ { ch, err = pb.MakeProposals(context.Background(), startRound, period(i)) if err != nil { - require.Subset(t, []int{pseudonodeVerificationBacklog, pseudonodeVerificationBacklog + 1}, []int{i}) + require.ErrorAs(t, errPseudonodeBacklogFull, &err) break } channels = append(channels, ch) } + enqueuedProposals := len(channels) require.Error(t, err, "MakeProposals did not returned an error when being overflowed with requests") require.True(t, errors.Is(err, errPseudonodeBacklogFull)) @@ -533,17 +534,17 @@ func TestPseudonodeFailedEnqueuedTasks(t *testing.T) { for i := 0; i < pseudonodeVerificationBacklog*2; i++ { ch, err = pb.MakeVotes(context.Background(), startRound, period(i), step(i%5), makeProposalValue(period(i), accounts[0].Address()), persist) if err != nil { - require.Subset(t, []int{pseudonodeVerificationBacklog, pseudonodeVerificationBacklog + 1}, []int{i}) + require.ErrorAs(t, errPseudonodeBacklogFull, &err) break } channels = append(channels, ch) } require.Error(t, err, "MakeVotes did not returned an error when being overflowed with requests") - + enqueuedVotes := len(channels) - enqueuedProposals // drain output channels. for _, ch := range channels { drainChannel(ch) } - require.Equal(t, 330, subStrLogger.instancesFound[0]) - require.Equal(t, 330, subStrLogger.instancesFound[1]) + require.Equal(t, enqueuedVotes*len(accounts), subStrLogger.instancesFound[0]) + require.Equal(t, enqueuedProposals*len(accounts), subStrLogger.instancesFound[1]) } diff --git a/agreement/router.go b/agreement/router.go index c0258554ac..fd0638a012 100644 --- a/agreement/router.go +++ b/agreement/router.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/selector.go b/agreement/selector.go index 74bfdebdde..d19cfef23e 100644 --- a/agreement/selector.go +++ b/agreement/selector.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/service.go b/agreement/service.go index c25d71657f..3462349509 100644 --- a/agreement/service.go +++ b/agreement/service.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -93,7 +93,7 @@ func MakeService(p Parameters) *Service { s.parameters = parameters(p) - s.log = serviceLogger{Logger: p.Logger} + s.log = makeServiceLogger(p.Logger) // GOAL2-541: tracer is not concurrency safe. It should only ever be // accessed by main state machine loop. @@ -191,7 +191,7 @@ func (s *Service) mainLoop(input <-chan externalEvent, output chan<- []action, r var err error raw, err := restore(s.log, s.Accessor) if err == nil { - clock, router, status, a, err = decode(raw, s.Clock) + clock, router, status, a, err = decode(raw, s.Clock, s.log) if err != nil { reset(s.log, s.Accessor) } else { diff --git a/agreement/service_test.go b/agreement/service_test.go index 68db73a60d..5825e17054 100644 --- a/agreement/service_test.go +++ b/agreement/service_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/state_machine_test.go b/agreement/state_machine_test.go index e91cf82b0a..8518ff70d5 100644 --- a/agreement/state_machine_test.go +++ b/agreement/state_machine_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/trace.go b/agreement/trace.go index f8fbe9eb55..a3f8cea665 100644 --- a/agreement/trace.go +++ b/agreement/trace.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -497,9 +497,12 @@ type serviceLogger struct { logging.Logger } +func makeServiceLogger(log logging.Logger) serviceLogger { + return serviceLogger{log.With("Context", "Agreement")} +} + func (log serviceLogger) with(e logspec.AgreementEvent) serviceLogger { fields := logging.Fields{ - "Context": "Agreement", "Type": e.Type.String(), "Round": e.Round, "Period": e.Period, diff --git a/agreement/traceTime.go b/agreement/traceTime.go index 70ca247eef..08d5bdb254 100644 --- a/agreement/traceTime.go +++ b/agreement/traceTime.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/types.go b/agreement/types.go index 2cbf2c7e43..51793aa077 100644 --- a/agreement/types.go +++ b/agreement/types.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/vote.go b/agreement/vote.go index c5efa40fd0..ea2920c44a 100644 --- a/agreement/vote.go +++ b/agreement/vote.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -83,6 +83,9 @@ type ( Proposals [2]proposalValue `codec:"props"` Sigs [2]crypto.OneTimeSignature `codec:"sigs"` } + + // UnauthenticatedVote exported for dumping textual versions of messages + UnauthenticatedVote = unauthenticatedVote ) // verify verifies that a vote that was received from the network is valid. @@ -126,7 +129,7 @@ func (uv unauthenticatedVote) verify(l LedgerReader) (vote, error) { ephID := basics.OneTimeIDForRound(rv.Round, m.Record.KeyDilution(proto)) voteID := m.Record.VoteID - if !voteID.Verify(ephID, rv, uv.Sig) { + if !voteID.Verify(ephID, rv, uv.Sig, proto.EnableBatchVerification) { return vote{}, fmt.Errorf("unauthenticatedVote.verify: could not verify FS signature on vote by %v given %v: %+v", rv.Sender, voteID, uv) } @@ -152,27 +155,18 @@ func makeVote(rv rawVote, voting crypto.OneTimeSigner, selection *crypto.VRFSecr return unauthenticatedVote{}, fmt.Errorf("makeVote: could not get consensus params for round %d: %v", ParamsRound(rv.Round), err) } - if proto.FastPartitionRecovery { - switch rv.Step { - case propose, soft, cert, late, redo: - if rv.Proposal == bottom { - logging.Base().Panicf("makeVote: votes from step %d cannot validate bottom", rv.Step) - } - case down: - if rv.Proposal != bottom { - logging.Base().Panicf("makeVote: votes from step %d must validate bottom", rv.Step) - } + switch rv.Step { + case propose, soft, cert, late, redo: + if rv.Proposal == bottom { + logging.Base().Panicf("makeVote: votes from step %d cannot validate bottom", rv.Step) } - } else { - switch rv.Step { - case propose, soft, cert: - if rv.Proposal == bottom { - logging.Base().Panicf("makeVote: votes from step %d cannot validate bottom", rv.Step) - } + case down: + if rv.Proposal != bottom { + logging.Base().Panicf("makeVote: votes from step %d must validate bottom", rv.Step) } } - ephID := basics.OneTimeIDForRound(rv.Round, voting.KeyDilution(proto)) + ephID := basics.OneTimeIDForRound(rv.Round, voting.KeyDilution(proto.DefaultKeyDilution)) sig := voting.Sign(ephID, rv) if (sig == crypto.OneTimeSignature{}) { return unauthenticatedVote{}, fmt.Errorf("makeVote: got back empty signature for vote") diff --git a/agreement/voteAggregator.go b/agreement/voteAggregator.go index 51a640476c..057f9d14f3 100644 --- a/agreement/voteAggregator.go +++ b/agreement/voteAggregator.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -19,8 +19,6 @@ package agreement import ( "fmt" - "github.com/algorand/go-algorand/config" - "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/protocol" ) @@ -119,7 +117,7 @@ func (agg *voteAggregator) handle(r routerHandle, pr player, em event) (res even } else if tE.(thresholdEvent).Round == e.FreshnessData.PlayerRound+1 { return emptyEvent{} } - logging.Base().Panicf("bad round (%v, %v)", tE.(thresholdEvent).Round, e.FreshnessData.PlayerRound) // TODO this should be a postcondition check; move it + r.t.log.Panicf("bad round (%v, %v)", tE.(thresholdEvent).Round, e.FreshnessData.PlayerRound) // TODO this should be a postcondition check; move it case bundlePresent: ub := e.Input.UnauthenticatedBundle @@ -181,7 +179,7 @@ func (agg *voteAggregator) handle(r routerHandle, pr player, em event) (res even smErr := makeSerErrf("bundle for (%v, %v, %v: %v) failed to cause a significant state change", b.U.Round, b.U.Period, b.U.Step, b.U.Proposal) return filteredEvent{T: bundleFiltered, Err: smErr} } - logging.Base().Panicf("voteAggregator: bad event type: observed an event of type %v", e.t()) + r.t.log.Panicf("voteAggregator: bad event type: observed an event of type %v", e.t()) panic("not reached") } @@ -201,7 +199,7 @@ func (agg *voteAggregator) filterVote(proto protocol.ConsensusVersion, p player, case none: return nil } - logging.Base().Panicf("voteAggregator: bad event type: while filtering, observed an event of type %v", filterRes.t()) + r.t.log.Panicf("voteAggregator: bad event type: while filtering, observed an event of type %v", filterRes.t()) panic("not reached") } @@ -227,7 +225,7 @@ func voteStepFresh(descr string, proto protocol.ConsensusVersion, mine, vote ste // always propagate first recovery vote to ensure synchronous block of periods after partition return nil } - if config.Consensus[proto].FastPartitionRecovery && vote >= late { + if vote >= late { // always propagate fast partition recovery votes return nil } diff --git a/agreement/voteAggregatorContract.go b/agreement/voteAggregatorContract.go index 2c276a2faf..843746fabd 100644 --- a/agreement/voteAggregatorContract.go +++ b/agreement/voteAggregatorContract.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/voteAggregator_test.go b/agreement/voteAggregator_test.go index 99ee6a3404..f23bd4d564 100644 --- a/agreement/voteAggregator_test.go +++ b/agreement/voteAggregator_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/voteAuxiliary.go b/agreement/voteAuxiliary.go index e61d1a5599..0c6e85c47e 100644 --- a/agreement/voteAuxiliary.go +++ b/agreement/voteAuxiliary.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -16,10 +16,6 @@ package agreement -import ( - "github.com/algorand/go-algorand/logging" -) - // A voteTrackerPeriod is a voteMachinePeriod which indicates whether a // next-threshold of votes was observed for a some value in a period. type voteTrackerPeriod struct { @@ -82,7 +78,7 @@ func (t *voteTrackerPeriod) handle(r routerHandle, p player, e event) event { case nextThresholdStatusRequest: return t.Cached default: - logging.Base().Panicf("voteTrackerPeriod: bad event type: observed an event of type %v", e.t()) + r.t.log.Panicf("voteTrackerPeriod: bad event type: observed an event of type %v", e.t()) panic("not reached") } } @@ -152,7 +148,7 @@ func (t *voteTrackerRound) handle(r routerHandle, p player, e event) event { case freshestBundleRequest: return freshestBundleEvent{Ok: t.Ok, Event: t.Freshest} default: - logging.Base().Panicf("voteTrackerRound: bad event type: observed an event of type %v", e.t()) + r.t.log.Panicf("voteTrackerRound: bad event type: observed an event of type %v", e.t()) panic("not reached") } } diff --git a/agreement/voteAuxiliaryContract.go b/agreement/voteAuxiliaryContract.go index b57baee823..e8b501808b 100644 --- a/agreement/voteAuxiliaryContract.go +++ b/agreement/voteAuxiliaryContract.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/voteAuxiliary_test.go b/agreement/voteAuxiliary_test.go index 4528c86438..667c3a147f 100644 --- a/agreement/voteAuxiliary_test.go +++ b/agreement/voteAuxiliary_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/voteTracker.go b/agreement/voteTracker.go index 1363a2896d..d0f717abd7 100644 --- a/agreement/voteTracker.go +++ b/agreement/voteTracker.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -23,7 +23,6 @@ import ( "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/logging/telemetryspec" ) @@ -129,12 +128,12 @@ func (tracker *voteTracker) handle(r routerHandle, p player, e0 event) event { PreviousProposalHash1: eqVote.Proposals[0].BlockDigest.String(), PreviousProposalHash2: eqVote.Proposals[1].BlockDigest.String(), } - logging.Base().EventWithDetails(telemetryspec.ApplicationState, telemetryspec.EquivocatedVoteEvent, equivocationDetails) + r.t.log.EventWithDetails(telemetryspec.ApplicationState, telemetryspec.EquivocatedVoteEvent, equivocationDetails) return thresholdEvent{} } - _, overBefore := tracker.overThreshold(proto, e.Vote.R.Step) + _, overBefore := tracker.overThreshold(proto, e.Vote.R.Step, r.t.log) oldVote, voted := tracker.Voters[sender] @@ -170,9 +169,10 @@ func (tracker *voteTracker) handle(r routerHandle, p player, e0 event) event { Weight: e.Vote.Cred.Weight, PreviousProposalHash1: oldVote.R.Proposal.BlockDigest.String(), } - logging.Base().EventWithDetails(telemetryspec.ApplicationState, telemetryspec.EquivocatedVoteEvent, equivocationDetails) - logging.Base().Warnf("voteTracker: observed an equivocator: %v (vote was %v)", sender, e.Vote) + r.t.log.EventWithDetails(telemetryspec.ApplicationState, telemetryspec.EquivocatedVoteEvent, equivocationDetails) + + r.t.log.Warnf("voteTracker: observed an equivocator: %v (vote was %v)", sender, e.Vote) // sender was not already marked as an equivocator so track // their weight @@ -183,7 +183,7 @@ func (tracker *voteTracker) handle(r routerHandle, p player, e0 event) event { // In order for this to be triggered, more than 75% of the vote for the given step need to vote for more than // a single proposal. In that state, all the proposals become "above threshold". That's a serious issue, since // it would compromise the honest node core assumption. - logging.Base().Panicf("too many equivocators for step %d: %d", e.Vote.R.Step, tracker.EquivocatorsCount) + r.t.log.Panicf("too many equivocators for step %d: %d", e.Vote.R.Step, tracker.EquivocatorsCount) } // decrease their weight from any block proposal they already @@ -227,7 +227,7 @@ func (tracker *voteTracker) handle(r routerHandle, p player, e0 event) event { } } - prop, overAfter := tracker.overThreshold(proto, e.Vote.R.Step) + prop, overAfter := tracker.overThreshold(proto, e.Vote.R.Step, r.t.log) if overBefore || !overAfter { return res @@ -265,7 +265,7 @@ func (tracker *voteTracker) handle(r routerHandle, p player, e0 event) event { PreviousProposalHash1: eqVote.Proposals[0].BlockDigest.String(), PreviousProposalHash2: eqVote.Proposals[1].BlockDigest.String(), } - logging.Base().EventWithDetails(telemetryspec.ApplicationState, telemetryspec.EquivocatedVoteEvent, equivocationDetails) + r.t.log.EventWithDetails(telemetryspec.ApplicationState, telemetryspec.EquivocatedVoteEvent, equivocationDetails) return filteredStepEvent{T: voteFilteredStep} } @@ -289,18 +289,18 @@ func (tracker *voteTracker) handle(r routerHandle, p player, e0 event) event { return dumpVotesEvent{Votes: votes} default: - logging.Base().Panicf("voteTracker: bad event type: observed an event of type %v", e0.t()) + r.t.log.Panicf("voteTracker: bad event type: observed an event of type %v", e0.t()) panic("not reached") } } // overThreshold returns an arbitrary proposal over the step threshold or // (_, false) if none exists. -func (tracker *voteTracker) overThreshold(proto config.ConsensusParams, step step) (res proposalValue, ok bool) { +func (tracker *voteTracker) overThreshold(proto config.ConsensusParams, step step, log serviceLogger) (res proposalValue, ok bool) { for proposal := range tracker.Counts { if step.reachesQuorum(proto, tracker.count(proposal)) { if ok { - logging.Base().Panicf("voteTracker: more than value reached a threhsold in a given step: %v; %v", res, proposal) + log.Panicf("voteTracker: more than value reached a threhsold in a given step: %v; %v", res, proposal) } res = proposal ok = true diff --git a/agreement/voteTrackerContract.go b/agreement/voteTrackerContract.go index a3199ebb4f..ca90a74a88 100644 --- a/agreement/voteTrackerContract.go +++ b/agreement/voteTrackerContract.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/voteTracker_test.go b/agreement/voteTracker_test.go index 2cec6b83b6..7295659d81 100644 --- a/agreement/voteTracker_test.go +++ b/agreement/voteTracker_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/agreement/vote_test.go b/agreement/vote_test.go index 7c5ed7855f..d3f6f39bf0 100644 --- a/agreement/vote_test.go +++ b/agreement/vote_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/buildnumber.dat b/buildnumber.dat index 00750edc07..0cfbf08886 100644 --- a/buildnumber.dat +++ b/buildnumber.dat @@ -1 +1 @@ -3 +2 diff --git a/catchup/catchpointService.go b/catchup/catchpointService.go index bac14d4e83..1f7657294a 100644 --- a/catchup/catchpointService.go +++ b/catchup/catchpointService.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/catchup/fetcher_test.go b/catchup/fetcher_test.go index 65ace13458..55ed33bbc6 100644 --- a/catchup/fetcher_test.go +++ b/catchup/fetcher_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/catchup/ledgerFetcher.go b/catchup/ledgerFetcher.go index 0735465f92..c64155952a 100644 --- a/catchup/ledgerFetcher.go +++ b/catchup/ledgerFetcher.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/catchup/ledgerFetcher_test.go b/catchup/ledgerFetcher_test.go index 73404f8730..637064c97d 100644 --- a/catchup/ledgerFetcher_test.go +++ b/catchup/ledgerFetcher_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/catchup/peerSelector.go b/catchup/peerSelector.go index 3b374691c0..822d0b709b 100644 --- a/catchup/peerSelector.go +++ b/catchup/peerSelector.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/catchup/peerSelector_test.go b/catchup/peerSelector_test.go index a11e7db1ea..c10298a519 100644 --- a/catchup/peerSelector_test.go +++ b/catchup/peerSelector_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/catchup/pref_test.go b/catchup/pref_test.go index 8cf08c6bdf..4a56156e1a 100644 --- a/catchup/pref_test.go +++ b/catchup/pref_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/catchup/service.go b/catchup/service.go index de4a52a94f..f022a3dcc8 100644 --- a/catchup/service.go +++ b/catchup/service.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -195,7 +195,11 @@ func (s *Service) innerFetch(r basics.Round, peer network.Peer) (blk *bookkeepin } // fetchAndWrite fetches a block, checks the cert, and writes it to the ledger. Cert checking and ledger writing both wait for the ledger to advance if necessary. -// Returns false if we couldn't fetch or write (i.e., if we failed even after a given number of retries or if we were told to abort.) +// Returns false if we should stop trying to catch up. This may occur for several reasons: +// - If the context is canceled (e.g. if the node is shutting down) +// - If we couldn't fetch the block (e.g. if there are no peers available or we've reached the catchupRetryLimit) +// - If the block is already in the ledger (e.g. if agreement service has already written it) +// - If the retrieval of the previous block was unsuccessful func (s *Service) fetchAndWrite(r basics.Round, prevFetchCompleteChan chan bool, lookbackComplete chan bool, peerSelector *peerSelector) bool { i := 0 hasLookback := false @@ -341,6 +345,12 @@ func (s *Service) fetchAndWrite(r basics.Round, prevFetchCompleteChan chan bool, // if the context expired, just exit. return false } + if errNSBE, ok := err.(ledgercore.ErrNonSequentialBlockEval); ok && errNSBE.EvaluatorRound <= errNSBE.LatestRound { + // the block was added to the ledger from elsewhere after fetching it here + // only the agreement could have added this block into the ledger, catchup is complete + s.log.Infof("fetchAndWrite(%d): after fetching the block, it is already in the ledger. The catchup is complete", r) + return false + } s.log.Warnf("fetchAndWrite(%d): failed to validate block : %v", r, err) return false } diff --git a/catchup/service_test.go b/catchup/service_test.go index 4cb89338d5..6ab2f22178 100644 --- a/catchup/service_test.go +++ b/catchup/service_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/catchup/universalFetcher.go b/catchup/universalFetcher.go index acd51c0029..59159751bc 100644 --- a/catchup/universalFetcher.go +++ b/catchup/universalFetcher.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/catchup/universalFetcher_test.go b/catchup/universalFetcher_test.go index 79cd484ac3..49b921dd44 100644 --- a/catchup/universalFetcher_test.go +++ b/catchup/universalFetcher_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algocfg/datadir.go b/cmd/algocfg/datadir.go index 51dce4e7c6..99ca1a21ba 100644 --- a/cmd/algocfg/datadir.go +++ b/cmd/algocfg/datadir.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algocfg/getCommand.go b/cmd/algocfg/getCommand.go index a0051a37ea..86af9cc100 100644 --- a/cmd/algocfg/getCommand.go +++ b/cmd/algocfg/getCommand.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algocfg/main.go b/cmd/algocfg/main.go index d727a599e8..0e38511f83 100644 --- a/cmd/algocfg/main.go +++ b/cmd/algocfg/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algocfg/messages.go b/cmd/algocfg/messages.go index 86247dc908..e0e27aa3a9 100644 --- a/cmd/algocfg/messages.go +++ b/cmd/algocfg/messages.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algocfg/report.go b/cmd/algocfg/report.go index 61b01a695a..219f840703 100644 --- a/cmd/algocfg/report.go +++ b/cmd/algocfg/report.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algocfg/resetCommand.go b/cmd/algocfg/resetCommand.go index 43ade91e30..187afe93c6 100644 --- a/cmd/algocfg/resetCommand.go +++ b/cmd/algocfg/resetCommand.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algocfg/setCommand.go b/cmd/algocfg/setCommand.go index 7bb21283f8..b5a4e6c1b5 100644 --- a/cmd/algocfg/setCommand.go +++ b/cmd/algocfg/setCommand.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algod/main.go b/cmd/algod/main.go index 8d83a7b826..b29d55c2ff 100644 --- a/cmd/algod/main.go +++ b/cmd/algod/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algod/main_test.go b/cmd/algod/main_test.go index 47cc890ab7..3b00979628 100644 --- a/cmd/algod/main_test.go +++ b/cmd/algod/main_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algofix/deadlock.go b/cmd/algofix/deadlock.go index 4df1bdc301..b7342235ef 100644 --- a/cmd/algofix/deadlock.go +++ b/cmd/algofix/deadlock.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algofix/deadlock_test.go b/cmd/algofix/deadlock_test.go index 2c21115850..720bafa105 100644 --- a/cmd/algofix/deadlock_test.go +++ b/cmd/algofix/deadlock_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algoh/blockWatcher.go b/cmd/algoh/blockWatcher.go index 5d062f0531..cc55b2d49f 100644 --- a/cmd/algoh/blockWatcher.go +++ b/cmd/algoh/blockWatcher.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algoh/blockWatcher_test.go b/cmd/algoh/blockWatcher_test.go index 8ed724c20c..f3efd1aaf5 100644 --- a/cmd/algoh/blockWatcher_test.go +++ b/cmd/algoh/blockWatcher_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algoh/blockstats.go b/cmd/algoh/blockstats.go index 6953efce6a..74a629d32d 100644 --- a/cmd/algoh/blockstats.go +++ b/cmd/algoh/blockstats.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algoh/blockstats_test.go b/cmd/algoh/blockstats_test.go index d1b95003b2..d0cafaf3f3 100644 --- a/cmd/algoh/blockstats_test.go +++ b/cmd/algoh/blockstats_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algoh/client.go b/cmd/algoh/client.go index 1d51f5b3cb..89a7c27a3a 100644 --- a/cmd/algoh/client.go +++ b/cmd/algoh/client.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algoh/deadman.go b/cmd/algoh/deadman.go index fad7e97e1f..1c302e8802 100644 --- a/cmd/algoh/deadman.go +++ b/cmd/algoh/deadman.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algoh/eventsender.go b/cmd/algoh/eventsender.go index a328190450..64ed53eae1 100644 --- a/cmd/algoh/eventsender.go +++ b/cmd/algoh/eventsender.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algoh/main.go b/cmd/algoh/main.go index 5f4869e229..a458929aa2 100644 --- a/cmd/algoh/main.go +++ b/cmd/algoh/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algoh/mockClient.go b/cmd/algoh/mockClient.go index ad87b8a1b6..d9d81387ef 100644 --- a/cmd/algoh/mockClient.go +++ b/cmd/algoh/mockClient.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algokey/common.go b/cmd/algokey/common.go index a163f8c6fd..37f4e1ca47 100644 --- a/cmd/algokey/common.go +++ b/cmd/algokey/common.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algokey/export.go b/cmd/algokey/export.go index 8e13879454..2b00275805 100644 --- a/cmd/algokey/export.go +++ b/cmd/algokey/export.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algokey/generate.go b/cmd/algokey/generate.go index e834a773a4..a52011699d 100644 --- a/cmd/algokey/generate.go +++ b/cmd/algokey/generate.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algokey/import.go b/cmd/algokey/import.go index 379e1b414e..6f17cd06af 100644 --- a/cmd/algokey/import.go +++ b/cmd/algokey/import.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algokey/keyreg.go b/cmd/algokey/keyreg.go new file mode 100644 index 0000000000..445a07827e --- /dev/null +++ b/cmd/algokey/keyreg.go @@ -0,0 +1,258 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package main + +import ( + "encoding/base64" + "errors" + "fmt" + "io/ioutil" + "os" + "strings" + + "github.com/spf13/cobra" + + "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/data/account" + "github.com/algorand/go-algorand/data/basics" + "github.com/algorand/go-algorand/data/transactions" + "github.com/algorand/go-algorand/protocol" + "github.com/algorand/go-algorand/util" + "github.com/algorand/go-algorand/util/db" +) + +var keyregCmd *cobra.Command + +type keyregCmdParams struct { + fee uint64 + firstValid uint64 + lastValid uint64 + network string + offline bool + txFile string + partkeyFile string + addr string +} + +// There is no node to query, so we do our best here. +const ( + txnLife uint64 = 1000 + minFee uint64 = 1000 +) + +var validNetworks map[string]crypto.Digest +var validNetworkList []string + +func init() { + var params keyregCmdParams + + keyregCmd = &cobra.Command{ + Use: "keyreg", + Short: "Make key registration transaction", + Args: cobra.NoArgs, + Run: func(cmd *cobra.Command, _ []string) { + err := run(params) + if err != nil { + fmt.Fprintf(os.Stderr, "%s\n\n", err.Error()) + os.Exit(1) + } + }, + } + + keyregCmd.Flags().Uint64Var(¶ms.fee, "fee", minFee, "transaction fee") + keyregCmd.Flags().Uint64Var(¶ms.firstValid, "firstvalid", 0, "first round where the transaction may be committed to the ledger") + keyregCmd.MarkFlagRequired("firstvalid") // nolint:errcheck + keyregCmd.Flags().Uint64Var(¶ms.lastValid, "lastvalid", 0, fmt.Sprintf("last round where the generated transaction may be committed to the ledger, defaults to firstvalid + %d", txnLife)) + keyregCmd.Flags().StringVar(¶ms.network, "network", "mainnet", "the network where the provided keys will be registered, one of mainnet/testnet/betanet") + keyregCmd.MarkFlagRequired("network") // nolint:errcheck + keyregCmd.Flags().BoolVar(¶ms.offline, "offline", false, "set to bring an account offline") + keyregCmd.Flags().StringVarP(¶ms.txFile, "outputFile", "o", "", fmt.Sprintf("write signed transaction to this file, or '%s' to write to stdout", stdoutFilenameValue)) + keyregCmd.Flags().StringVar(¶ms.partkeyFile, "keyfile", "", "participation keys to register, file is opened to fetch metadata for the transaction; only specify when bringing an account online to vote in Algorand consensus") + keyregCmd.Flags().StringVar(¶ms.addr, "account", "", "account address to bring offline; only specify when taking an account offline from voting in Algorand consensus") + + // TODO: move 'bundleGenesisInject' into something that can be imported here instead of using constants. + validNetworks = map[string]crypto.Digest{ + "mainnet": mustConvertB64ToDigest("wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8="), + "testnet": mustConvertB64ToDigest("SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI="), + "betanet": mustConvertB64ToDigest("mFgazF+2uRS1tMiL9dsj01hJGySEmPN28B/TjjvpVW0="), + "devnet": mustConvertB64ToDigest("sC3P7e2SdbqKJK0tbiCdK9tdSpbe6XeCGKdoNzmlj0E="), + } + validNetworkList = make([]string, 0, len(validNetworks)) + for k := range validNetworks { + validNetworkList = append(validNetworkList, k) + } +} + +func mustConvertB64ToDigest(b64 string) (digest crypto.Digest) { + data, err := base64.StdEncoding.DecodeString(b64) + if err != nil { + fmt.Fprintf(os.Stderr, "Unable to decode digest '%s': %s\n\n", b64, err) + os.Exit(1) + } + if len(data) != len(digest[:]) { + fmt.Fprintf(os.Stderr, "Unexpected decoded digest length decoding '%s'.\n\n", b64) + os.Exit(1) + } + copy(digest[:], data) + return +} + +func getGenesisInformation(network string) (crypto.Digest, error) { + // For testing purposes, there is a secret option to override the genesis information. + hashOverride := os.Getenv("ALGOKEY_GENESIS_HASH") + if hashOverride != "" { + return mustConvertB64ToDigest(hashOverride), nil + } + + // Otherwise check that network matches one of the known networks. + gen, ok := validNetworks[strings.ToLower(network)] + if !ok { + return crypto.Digest{}, fmt.Errorf("unknown network '%s' provided. Supported networks: %s", + network, + strings.Join(validNetworkList, ", ")) + } + + return gen, nil +} + +func run(params keyregCmdParams) error { + // Implicit last valid + if params.lastValid == 0 { + params.lastValid = params.firstValid + txnLife + } + + if params.fee < minFee { + return fmt.Errorf("the provided transaction fee (%d) is too low, the minimum fee is %d", params.fee, minFee) + } + + if !params.offline { + if params.partkeyFile == "" { + return errors.New("must provide --keyfile when registering participation keys") + } + if params.addr != "" { + return errors.New("do not provide --address when registering participation keys") + } + } else { + if params.addr == "" { + return errors.New("must provide --address when bringing an account offline") + } + if params.partkeyFile != "" { + return errors.New("do not provide --keyfile when bringing an account offline") + } + } + + var accountAddress basics.Address + if params.addr != "" { + var err error + accountAddress, err = basics.UnmarshalChecksumAddress(params.addr) + if err != nil { + return fmt.Errorf("unable to parse --address: %w", err) + } + } + + if params.partkeyFile != "" && !util.FileExists(params.partkeyFile) { + return fmt.Errorf("cannot access keyfile '%s'", params.partkeyFile) + } + + if params.txFile == "" { + params.txFile = fmt.Sprintf("%s.tx", params.partkeyFile) + } + + if util.FileExists(params.txFile) || params.txFile == stdoutFilenameValue { + return fmt.Errorf("outputFile '%s' already exists", params.partkeyFile) + } + + // Lookup information from partkey file + var part *account.Participation + if params.partkeyFile != "" { + partDB, err := db.MakeErasableAccessor(params.partkeyFile) + if err != nil { + return fmt.Errorf("cannot open keyfile %s: %v", params.partkeyFile, err) + } + + partkey, err := account.RestoreParticipation(partDB) + if err != nil { + return fmt.Errorf("cannot load keyfile %s: %v", params.partkeyFile, err) + } + defer partkey.Close() + + part = &partkey.Participation + + if params.firstValid < uint64(part.FirstValid) { + return fmt.Errorf("the transaction's firstvalid round (%d) field should be set greater than or equal to the participation key's first valid round (%d). The network will reject key registration transactions that are set to take effect before the participation key's first valid round", params.firstValid, part.FirstValid) + } + } + + validRange := params.lastValid - params.firstValid + if validRange > txnLife { + return fmt.Errorf("the transaction's specified validity range must be less than or equal to 1000 rounds due to security constraints. Please enter a first valid round (%d) and last valid round (%d) whose difference is no more than 1000 rounds", params.firstValid, params.lastValid) + } + + var txn transactions.Transaction + if !params.offline { + // Generate go-online transaction + txn = part.GenerateRegistrationTransaction( + basics.MicroAlgos{Raw: params.fee}, + basics.Round(params.firstValid), + basics.Round(params.lastValid), + [32]byte{}, + part.StateProofSecrets != nil) + } else { + // Generate go-offline transaction + txn = transactions.Transaction{ + Type: protocol.KeyRegistrationTx, + Header: transactions.Header{ + Sender: accountAddress, + Fee: basics.MicroAlgos{Raw: params.fee}, + FirstValid: basics.Round(params.firstValid), + LastValid: basics.Round(params.lastValid), + }, + } + } + + var err error + txn.GenesisHash, err = getGenesisInformation(params.network) + if err != nil { + return err + } + + // Wrap in a transactions.SignedTxn with an empty sig. + // This way protocol.Encode will encode the transaction type + stxn, err := transactions.AssembleSignedTxn(txn, crypto.Signature{}, crypto.MultisigSig{}) + if err != nil { + return fmt.Errorf("failed to assemble transaction: %w", err) + } + + data := protocol.Encode(&stxn) + if params.txFile == stdoutFilenameValue { + // Write to Stdout + if _, err = os.Stdout.Write(data); err != nil { + return fmt.Errorf("failed to write transaction to stdout: %w", err) + } + } else { + if err = ioutil.WriteFile(params.txFile, data, 0600); err != nil { + return fmt.Errorf("failed to write transaction to '%s': %w", params.txFile, err) + } + } + + if params.offline { + fmt.Printf("Account key go offline transaction written to '%s'.\n", params.txFile) + } else { + fmt.Printf("Key registration transaction written to '%s'.\n", params.txFile) + } + return nil +} diff --git a/cmd/algokey/main.go b/cmd/algokey/main.go index 6fc8a3ab6e..8182c35f8b 100644 --- a/cmd/algokey/main.go +++ b/cmd/algokey/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algokey/multisig.go b/cmd/algokey/multisig.go index 3f58c38be8..7c8ae81040 100644 --- a/cmd/algokey/multisig.go +++ b/cmd/algokey/multisig.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algokey/part.go b/cmd/algokey/part.go index 48ba060a39..57a4ddedce 100644 --- a/cmd/algokey/part.go +++ b/cmd/algokey/part.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -26,6 +26,7 @@ import ( "github.com/algorand/go-algorand/data/account" "github.com/algorand/go-algorand/data/basics" + "github.com/algorand/go-algorand/util" "github.com/algorand/go-algorand/util/db" ) @@ -75,12 +76,26 @@ var partGenerateCmd = &cobra.Command{ os.Exit(1) } - partkey, err := account.FillDBWithParticipationKeys(partdb, parent, basics.Round(partFirstRound), basics.Round(partLastRound), partKeyDilution) + fmt.Println("Please stand by while generating keys. This might take a few minutes...") + + var partkey account.PersistedParticipation + participationGen := func() { + partkey, err = account.FillDBWithParticipationKeys(partdb, parent, basics.Round(partFirstRound), basics.Round(partLastRound), partKeyDilution) + } + + util.RunFuncWithSpinningCursor(participationGen) + if err != nil { fmt.Fprintf(os.Stderr, "Cannot generate partkey database %s: %v\n", partKeyfile, err) + err = os.Remove(partKeyfile) + if err != nil { + fmt.Fprintf(os.Stderr, "Failed to cleanup the database file %s: %v\n", partKeyfile, err) + } os.Exit(1) } + fmt.Println("Participation key generation successful") + printPartkey(partkey.Participation) }, } @@ -146,6 +161,9 @@ func printPartkey(partkey account.Participation) { fmt.Printf("Parent address: %s\n", partkey.Parent.String()) fmt.Printf("VRF public key: %s\n", base64.StdEncoding.EncodeToString(partkey.VRF.PK[:])) fmt.Printf("Voting public key: %s\n", base64.StdEncoding.EncodeToString(partkey.Voting.OneTimeSignatureVerifier[:])) + if partkey.StateProofSecrets != nil && !partkey.StateProofSecrets.GetVerifier().IsEmpty() { + fmt.Printf("State proof key: %s\n", base64.StdEncoding.EncodeToString(partkey.StateProofSecrets.GetVerifier()[:])) + } fmt.Printf("First round: %d\n", partkey.FirstValid) fmt.Printf("Last round: %d\n", partkey.LastValid) fmt.Printf("Key dilution: %d\n", partkey.KeyDilution) @@ -157,6 +175,7 @@ func init() { partCmd.AddCommand(partGenerateCmd) partCmd.AddCommand(partInfoCmd) partCmd.AddCommand(partReparentCmd) + partCmd.AddCommand(keyregCmd) partGenerateCmd.Flags().StringVar(&partKeyfile, "keyfile", "", "Participation key filename") partGenerateCmd.Flags().Uint64Var(&partFirstRound, "first", 0, "First round for participation key") diff --git a/cmd/algokey/sign.go b/cmd/algokey/sign.go index b0e05349ba..9afa5a3d34 100644 --- a/cmd/algokey/sign.go +++ b/cmd/algokey/sign.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algons/commands.go b/cmd/algons/commands.go index 1139ea48c6..522d0b8084 100644 --- a/cmd/algons/commands.go +++ b/cmd/algons/commands.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algons/dnsCmd.go b/cmd/algons/dnsCmd.go index 7b3438b769..b41b45f137 100644 --- a/cmd/algons/dnsCmd.go +++ b/cmd/algons/dnsCmd.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algorelay/commands.go b/cmd/algorelay/commands.go index 08b2a3b5da..ebc0478544 100644 --- a/cmd/algorelay/commands.go +++ b/cmd/algorelay/commands.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algorelay/eb/eb.go b/cmd/algorelay/eb/eb.go index 61c0719083..7bd635ad75 100644 --- a/cmd/algorelay/eb/eb.go +++ b/cmd/algorelay/eb/eb.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/algorelay/relayCmd.go b/cmd/algorelay/relayCmd.go index a1575aa1f1..647c438a62 100644 --- a/cmd/algorelay/relayCmd.go +++ b/cmd/algorelay/relayCmd.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/buildtools/commands.go b/cmd/buildtools/commands.go index b0c2f8b22f..4f71804d30 100644 --- a/cmd/buildtools/commands.go +++ b/cmd/buildtools/commands.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/buildtools/genesis.go b/cmd/buildtools/genesis.go index e388f85b8c..079c76d615 100644 --- a/cmd/buildtools/genesis.go +++ b/cmd/buildtools/genesis.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/catchpointdump/commands.go b/cmd/catchpointdump/commands.go index 0ee9b433d3..e06b0b79ab 100644 --- a/cmd/catchpointdump/commands.go +++ b/cmd/catchpointdump/commands.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -98,7 +98,6 @@ func main() { } if err := rootCmd.Execute(); err != nil { - fmt.Println(err) os.Exit(1) } } diff --git a/cmd/catchpointdump/database.go b/cmd/catchpointdump/database.go index 334063fe2c..c1ec554e2f 100644 --- a/cmd/catchpointdump/database.go +++ b/cmd/catchpointdump/database.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -58,7 +58,7 @@ var databaseCmd = &cobra.Command{ } defer outFile.Close() } - err = printAccountsDatabase(ledgerTrackerFilename, ledger.CatchpointFileHeader{}, outFile) + err = printAccountsDatabase(ledgerTrackerFilename, ledger.CatchpointFileHeader{}, outFile, nil) if err != nil { reportErrorf("Unable to print account database : %v", err) } diff --git a/cmd/catchpointdump/file.go b/cmd/catchpointdump/file.go index a09485e83e..ac28e775ca 100644 --- a/cmd/catchpointdump/file.go +++ b/cmd/catchpointdump/file.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -19,21 +19,21 @@ package main import ( "archive/tar" "bufio" - "bytes" "context" "database/sql" "encoding/json" "fmt" "io" - "io/ioutil" "os" "strings" "time" "github.com/spf13/cobra" + cmdutil "github.com/algorand/go-algorand/cmd/util" "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/data/basics" + "github.com/algorand/go-algorand/data/bookkeeping" "github.com/algorand/go-algorand/ledger" "github.com/algorand/go-algorand/ledger/ledgercore" "github.com/algorand/go-algorand/logging" @@ -43,10 +43,12 @@ import ( var tarFile string var outFileName string +var excludedFields *cmdutil.CobraStringSliceValue = cmdutil.MakeCobraStringSliceValue(nil, []string{"version", "catchpoint"}) func init() { fileCmd.Flags().StringVarP(&tarFile, "tar", "t", "", "Specify the tar file to process") fileCmd.Flags().StringVarP(&outFileName, "output", "o", "", "Specify an outfile for the dump ( i.e. tracker.dump.txt )") + fileCmd.Flags().VarP(excludedFields, "exclude-fields", "e", "List of fields to exclude from the dump: ["+excludedFields.AllowedString()+"]") } var fileCmd = &cobra.Command{ @@ -59,11 +61,23 @@ var fileCmd = &cobra.Command{ cmd.HelpFunc()(cmd, args) return } - tarFileBytes, err := ioutil.ReadFile(tarFile) - if err != nil || len(tarFileBytes) == 0 { - reportErrorf("Unable to read '%s' : %v", tarFile, err) + stats, err := os.Stat(tarFile) + if err != nil { + reportErrorf("Unable to stat '%s' : %v", tarFile, err) + } + tarSize := stats.Size() + if tarSize == 0 { + reportErrorf("Empty file '%s' : %v", tarFile, err) + } + // TODO: store CurrentProtocol in catchpoint file header. + // As a temporary workaround use a current protocol version. + genesisInitState := ledgercore.InitState{ + Block: bookkeeping.Block{BlockHeader: bookkeeping.BlockHeader{ + UpgradeState: bookkeeping.UpgradeState{ + CurrentProtocol: protocol.ConsensusCurrentVersion, + }, + }}, } - genesisInitState := ledgercore.InitState{} cfg := config.GetDefaultLocal() l, err := ledger.OpenLedger(logging.Base(), "./ledger", false, genesisInitState, cfg) if err != nil { @@ -84,7 +98,14 @@ var fileCmd = &cobra.Command{ reportErrorf("Unable to initialize catchup database : %v", err) } var fileHeader ledger.CatchpointFileHeader - fileHeader, err = loadCatchpointIntoDatabase(context.Background(), catchupAccessor, tarFileBytes) + + reader, err := os.Open(tarFile) + if err != nil { + reportErrorf("Unable to read '%s' : %v", tarFile, err) + } + defer reader.Close() + + fileHeader, err = loadCatchpointIntoDatabase(context.Background(), catchupAccessor, reader, tarSize) if err != nil { reportErrorf("Unable to load catchpoint file into in-memory database : %v", err) } @@ -98,7 +119,7 @@ var fileCmd = &cobra.Command{ defer outFile.Close() } - err = printAccountsDatabase("./ledger.tracker.sqlite", fileHeader, outFile) + err = printAccountsDatabase("./ledger.tracker.sqlite", fileHeader, outFile, excludedFields.GetSlice()) if err != nil { reportErrorf("Unable to print account database : %v", err) } @@ -115,15 +136,14 @@ func printLoadCatchpointProgressLine(progress int, barLength int, dld int64) { fmt.Printf(escapeCursorUp+escapeDeleteLine+outString+" %s\n", formatSize(dld)) } -func loadCatchpointIntoDatabase(ctx context.Context, catchupAccessor ledger.CatchpointCatchupAccessor, fileBytes []byte) (fileHeader ledger.CatchpointFileHeader, err error) { +func loadCatchpointIntoDatabase(ctx context.Context, catchupAccessor ledger.CatchpointCatchupAccessor, tarFile io.Reader, tarSize int64) (fileHeader ledger.CatchpointFileHeader, err error) { fmt.Printf("\n") printLoadCatchpointProgressLine(0, 50, 0) lastProgressUpdate := time.Now() progress := uint64(0) defer printLoadCatchpointProgressLine(0, 0, 0) - reader := bytes.NewReader(fileBytes) - tarReader := tar.NewReader(reader) + tarReader := tar.NewReader(tarFile) var downloadProgress ledger.CatchpointCatchupAccessorProgress for { header, err := tarReader.Next() @@ -158,9 +178,9 @@ func loadCatchpointIntoDatabase(ctx context.Context, catchupAccessor ledger.Catc // we already know it's valid, since we validated that above. protocol.Decode(balancesBlockBytes, &fileHeader) } - if time.Now().Sub(lastProgressUpdate) > 50*time.Millisecond && len(fileBytes) > 0 { + if time.Since(lastProgressUpdate) > 50*time.Millisecond && tarSize > 0 { lastProgressUpdate = time.Now() - printLoadCatchpointProgressLine(int(float64(progress)*50.0/float64(len(fileBytes))), 50, int64(progress)) + printLoadCatchpointProgressLine(int(float64(progress)*50.0/float64(tarSize)), 50, int64(progress)) } } } @@ -178,7 +198,7 @@ func printDumpingCatchpointProgressLine(progress int, barLength int, dld int64) fmt.Printf(escapeCursorUp + escapeDeleteLine + outString + "\n") } -func printAccountsDatabase(databaseName string, fileHeader ledger.CatchpointFileHeader, outFile *os.File) error { +func printAccountsDatabase(databaseName string, fileHeader ledger.CatchpointFileHeader, outFile *os.File, excludeFields []string) error { lastProgressUpdate := time.Now() progress := uint64(0) defer printDumpingCatchpointProgressLine(0, 0, 0) @@ -191,14 +211,54 @@ func printAccountsDatabase(databaseName string, fileHeader ledger.CatchpointFile return err } if fileHeader.Version != 0 { - fmt.Fprintf(fileWriter, "Version: %d\nBalances Round: %d\nBlock Round: %d\nBlock Header Digest: %s\nCatchpoint: %s\nTotal Accounts: %d\nTotal Chunks: %d\n", + var headerFields = []string{ + "Version: %d", + "Balances Round: %d", + "Block Round: %d", + "Block Header Digest: %s", + "Catchpoint: %s", + "Total Accounts: %d", + "Total Chunks: %d", + } + var headerValues = []interface{}{ fileHeader.Version, fileHeader.BalancesRound, fileHeader.BlocksRound, fileHeader.BlockHeaderDigest.String(), fileHeader.Catchpoint, fileHeader.TotalAccounts, - fileHeader.TotalChunks) + fileHeader.TotalChunks, + } + // safety check + if len(headerFields) != len(headerValues) { + return fmt.Errorf("printing failed: header formatting mismatch") + } + + var actualFields []string + var actualValues []interface{} + if len(excludeFields) == 0 { + actualFields = headerFields + actualValues = headerValues + } else { + actualFields = make([]string, 0, len(headerFields)-len(excludeFields)) + actualValues = make([]interface{}, 0, len(headerFields)-len(excludeFields)) + for i, field := range headerFields { + lower := strings.ToLower(field) + excluded := false + for _, filter := range excludeFields { + if strings.HasPrefix(lower, filter) { + excluded = true + break + } + } + if !excluded { + actualFields = append(actualFields, field) + actualValues = append(actualValues, headerValues[i]) + } + } + } + + fmt.Fprintf(fileWriter, strings.Join(actualFields, "\n")+"\n", actualValues...) totals := fileHeader.Totals fmt.Fprintf(fileWriter, "AccountTotals - Online Money: %d\nAccountTotals - Online RewardUnits : %d\nAccountTotals - Offline Money: %d\nAccountTotals - Offline RewardUnits : %d\nAccountTotals - Not Participating Money: %d\nAccountTotals - Not Participating Money RewardUnits: %d\nAccountTotals - Rewards Level: %d\n", diff --git a/cmd/catchpointdump/net.go b/cmd/catchpointdump/net.go index 79fd986fa0..b31b1466bd 100644 --- a/cmd/catchpointdump/net.go +++ b/cmd/catchpointdump/net.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -29,10 +29,12 @@ import ( "github.com/spf13/cobra" "github.com/algorand/go-algorand/config" + "github.com/algorand/go-algorand/data/bookkeeping" "github.com/algorand/go-algorand/ledger" "github.com/algorand/go-algorand/ledger/ledgercore" "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/network" + "github.com/algorand/go-algorand/protocol" tools "github.com/algorand/go-algorand/tools/network" "github.com/algorand/go-algorand/util" ) @@ -40,6 +42,8 @@ import ( var networkName string var round int var relayAddress string +var singleCatchpoint bool +var downloadOnly bool const ( escapeCursorUp = string("\033[A") // Cursor Up @@ -52,21 +56,24 @@ func init() { netCmd.Flags().StringVarP(&networkName, "net", "n", "", "Specify the network name ( i.e. mainnet.algorand.network )") netCmd.Flags().IntVarP(&round, "round", "r", 0, "Specify the round number ( i.e. 7700000 )") netCmd.Flags().StringVarP(&relayAddress, "relay", "p", "", "Relay address to use ( i.e. r-ru.algorand-mainnet.network:4160 )") + netCmd.Flags().BoolVarP(&singleCatchpoint, "single", "s", true, "Download/process only from a single relay") + netCmd.Flags().BoolVarP(&downloadOnly, "download", "l", false, "Download only, do not process") + netCmd.Flags().VarP(excludedFields, "exclude-fields", "e", "List of fields to exclude from the dump: ["+excludedFields.AllowedString()+"]") } var netCmd = &cobra.Command{ - Use: "net", - Short: "Download and decode (possibly all) catchpoint files from all or specified the relay(s) on the network for a particular round", - Long: "Download and decode (possibly all) catchpoint files from all or specified the relay(s) on the network for a particular round", - Args: validateNoPosArgsFn, - Run: func(cmd *cobra.Command, args []string) { + Use: "net", + Short: "Download and decode (possibly all) catchpoint files from possibly all or specified the relay(s) on the network for a particular round", + Long: "Download and decode (possibly all) catchpoint files from possibly all or specified the relay(s) on the network for a particular round", + Args: validateNoPosArgsFn, + SilenceUsage: true, // prevent printing usage info on error + RunE: func(cmd *cobra.Command, args []string) (err error) { if networkName == "" || round == 0 { cmd.HelpFunc()(cmd, args) - return + return fmt.Errorf("network or round not set") } var addrs []string - var err error if relayAddress != "" { addrs = []string{relayAddress} } else { @@ -77,22 +84,32 @@ var netCmd = &cobra.Command{ } for _, addr := range addrs { - catchpointFileBytes, err := downloadCatchpoint(addr) - if err != nil || catchpointFileBytes == nil { + var tarName string + tarName, err = downloadCatchpoint(addr, round) + if err != nil { reportInfof("failed to download catchpoint from '%s' : %v", addr, err) continue } - err = saveCatchpointTarFile(addr, catchpointFileBytes) - if err != nil { - reportInfof("failed to save catchpoint file for '%s' : %v", addr, err) - continue + genesisInitState := ledgercore.InitState{ + Block: bookkeeping.Block{BlockHeader: bookkeeping.BlockHeader{ + UpgradeState: bookkeeping.UpgradeState{ + CurrentProtocol: protocol.ConsensusCurrentVersion, + }, + }}, } - err = makeFileDump(addr, catchpointFileBytes) + err = makeFileDump(addr, tarName, genesisInitState) if err != nil { reportInfof("failed to make a dump from tar file for '%s' : %v", addr, err) continue } + // clear possible errors from previous run: at this point we've been succeed + err = nil + if singleCatchpoint { + // a catchpoint processes successfully, exit if needed + break + } } + return err }, } @@ -144,132 +161,99 @@ func printDownloadProgressLine(progress int, barLength int, url string, dld int6 fmt.Printf(escapeCursorUp+escapeDeleteLine+outString+" %s\n", formatSize(dld)) } -func downloadCatchpoint(addr string) ([]byte, error) { - genesisID := strings.Split(networkName, ".")[0] + "-v1.0" - url := "http://" + addr + "/v1/" + genesisID + "/ledger/" + strconv.FormatUint(uint64(round), 36) - fmt.Printf("downloading from %s\n", url) +func getRemoteDataStream(url string, hint string) (result io.ReadCloser, ctxCancel context.CancelFunc, err error) { + fmt.Printf("downloading %s from %s\n", hint, url) request, err := http.NewRequest(http.MethodGet, url, nil) if err != nil { - return nil, err + return } - timeoutContext, timeoutContextCancel := context.WithTimeout(context.Background(), config.GetDefaultLocal().MaxCatchpointDownloadDuration) - defer timeoutContextCancel() + timeoutContext, ctxCancel := context.WithTimeout(context.Background(), config.GetDefaultLocal().MaxCatchpointDownloadDuration) request = request.WithContext(timeoutContext) network.SetUserAgentHeader(request.Header) response, err := http.DefaultClient.Do(request) if err != nil { - return nil, err + return } - defer response.Body.Close() // check to see that we had no errors. switch response.StatusCode { case http.StatusOK: case http.StatusNotFound: // server could not find a block with that round numbers. - return nil, fmt.Errorf("no catchpoint file for round %d", round) + err = fmt.Errorf("no %s for round %d", hint, round) + return default: - return nil, fmt.Errorf("error response status code %d", response.StatusCode) - } - wdReader := util.MakeWatchdogStreamReader(response.Body, 4096, 4096, 2*time.Second) - outBytes := make([]byte, 0, 4096) - tempBytes := make([]byte, 4096) - lastProgressUpdate := time.Now() - progress := -25 - printDownloadProgressLine(progress, 50, url, 0) - defer printDownloadProgressLine(0, 0, url, 0) - for { - n, err := wdReader.Read(tempBytes) - if err != nil { - if err == io.EOF { - outBytes = append(outBytes, tempBytes[:n]...) - return outBytes, nil - } - return nil, err - } - if cap(outBytes) < len(outBytes)+n { - // need to increase buffer. - newBuffer := make([]byte, cap(outBytes)+n, cap(outBytes)+1024*1024) - copy(newBuffer, outBytes) - copy(newBuffer[len(outBytes):], tempBytes[:n]) - outBytes = newBuffer - } else { - outBytes = append(outBytes, tempBytes[:n]...) - } - err = wdReader.Reset() - if err != nil { - if err == io.EOF { - return outBytes, nil - } - return nil, err - } - if time.Now().Sub(lastProgressUpdate) > 50*time.Millisecond { - lastProgressUpdate = time.Now() - printDownloadProgressLine(progress, 50, url, int64(len(outBytes))) - progress++ - } + err = fmt.Errorf("error response status code %d", response.StatusCode) + return } + + result = response.Body + return } -func printSaveProgressLine(progress int, barLength int, filename string, dld int64) { - if barLength == 0 { - fmt.Printf(escapeCursorUp+escapeDeleteLine+"[ Done ] Saved %s\n", filename) +func downloadCatchpoint(addr string, round int) (tarName string, err error) { + genesisID := strings.Split(networkName, ".")[0] + "-v1.0" + urlTemplate := "http://" + addr + "/v1/" + genesisID + "/%s/" + strconv.FormatUint(uint64(round), 36) + catchpointURL := fmt.Sprintf(urlTemplate, "ledger") + + catchpointStream, catchpointCtxCancel, err := getRemoteDataStream(catchpointURL, "catchpoint") + defer catchpointCtxCancel() + if err != nil { return } + defer catchpointStream.Close() - outString := "[" + strings.Repeat(escapeSquare, progress) + strings.Repeat(escapeDot, barLength-progress) + "] Saving " + filename + " ..." - - fmt.Printf(escapeCursorUp+escapeDeleteLine+outString+" %s\n", formatSize(dld)) -} - -func saveCatchpointTarFile(addr string, catchpointFileBytes []byte) (err error) { - // make a directory: dirName := "./" + strings.Split(networkName, ".")[0] + "/" + strings.Split(addr, ".")[0] os.RemoveAll(dirName) err = os.MkdirAll(dirName, 0777) if err != nil && !os.IsExist(err) { return } - destFileName := dirName + "/" + strconv.FormatUint(uint64(round), 10) + ".tar" - file, err2 := os.Create(destFileName) // will create a file with 0666 permission. + tarName = dirName + "/" + strconv.FormatUint(uint64(round), 10) + ".tar" + file, err2 := os.Create(tarName) // will create a file with 0666 permission. if err2 != nil { - return err2 + return tarName, err2 } defer func() { err = file.Close() }() writeChunkSize := 64 * 1024 + + wdReader := util.MakeWatchdogStreamReader(catchpointStream, 4096, 4096, 2*time.Second) + var totalBytes int + tempBytes := make([]byte, writeChunkSize) lastProgressUpdate := time.Now() - fmt.Printf("\n") - printSaveProgressLine(0, 50, destFileName, 0) - progress := uint64(0) - defer printSaveProgressLine(0, 0, destFileName, 0) - total := len(catchpointFileBytes) + progress := -25 + printDownloadProgressLine(progress, 50, catchpointURL, 0) + defer printDownloadProgressLine(0, 0, catchpointURL, 0) + var n int for { - writeSize := writeChunkSize - if len(catchpointFileBytes) < writeSize { - writeSize = len(catchpointFileBytes) + n, err = wdReader.Read(tempBytes) + if err != nil && err != io.EOF { + return } - if writeSize <= 0 { - break + totalBytes += n + writtenBytes, err2 := file.Write(tempBytes[:n]) + if err2 != nil || n != writtenBytes { + return tarName, err2 } - n, err2 := file.Write(catchpointFileBytes[:writeSize]) - if err2 != nil || n != writeSize { - return err + + err = wdReader.Reset() + if err != nil { + if err == io.EOF { + return tarName, nil + } + return } - catchpointFileBytes = catchpointFileBytes[n:] - if time.Now().Sub(lastProgressUpdate) > 50*time.Millisecond && total > 0 { + if time.Since(lastProgressUpdate) > 50*time.Millisecond { lastProgressUpdate = time.Now() - printSaveProgressLine(int(float64(progress)*50.0/float64(total)), 50, destFileName, int64(progress)) - + printDownloadProgressLine(progress, 50, catchpointURL, int64(totalBytes)) + progress++ } - progress += uint64(n) } - return } -func makeFileDump(addr string, catchpointFileBytes []byte) error { - genesisInitState := ledgercore.InitState{} +func makeFileDump(addr string, tarFile string, genesisInitState ledgercore.InitState) error { deleteLedgerFiles := func() { os.Remove("./ledger.block.sqlite") os.Remove("./ledger.block.sqlite-shm") @@ -294,8 +278,21 @@ func makeFileDump(addr string, catchpointFileBytes []byte) error { if err != nil { reportErrorf("Unable to initialize catchup database : %v", err) } + + stats, err := os.Stat(tarFile) + if err != nil { + return err + } + tarSize := stats.Size() + + reader, err := os.Open(tarFile) + if err != nil { + return err + } + defer reader.Close() + var fileHeader ledger.CatchpointFileHeader - fileHeader, err = loadCatchpointIntoDatabase(context.Background(), catchupAccessor, catchpointFileBytes) + fileHeader, err = loadCatchpointIntoDatabase(context.Background(), catchupAccessor, reader, tarSize) if err != nil { reportErrorf("Unable to load catchpoint file into in-memory database : %v", err) } @@ -305,7 +302,7 @@ func makeFileDump(addr string, catchpointFileBytes []byte) error { if err != nil { return err } - err = printAccountsDatabase("./ledger.tracker.sqlite", fileHeader, outFile) + err = printAccountsDatabase("./ledger.tracker.sqlite", fileHeader, outFile, excludedFields.GetSlice()) if err != nil { return err } diff --git a/cmd/catchupsrv/download.go b/cmd/catchupsrv/download.go index 0d2ae7497d..813da9d03b 100644 --- a/cmd/catchupsrv/download.go +++ b/cmd/catchupsrv/download.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/catchupsrv/download_test.go b/cmd/catchupsrv/download_test.go index fa65f05fbf..b616f81f5a 100644 --- a/cmd/catchupsrv/download_test.go +++ b/cmd/catchupsrv/download_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/catchupsrv/main.go b/cmd/catchupsrv/main.go index e41f27f55b..86fd9645af 100644 --- a/cmd/catchupsrv/main.go +++ b/cmd/catchupsrv/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/catchupsrv/tarblocks.go b/cmd/catchupsrv/tarblocks.go index f933ec2e1c..25f686f0ca 100644 --- a/cmd/catchupsrv/tarblocks.go +++ b/cmd/catchupsrv/tarblocks.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/dbgen/main.go b/cmd/dbgen/main.go index 53ff3fa09a..078f30a3b6 100644 --- a/cmd/dbgen/main.go +++ b/cmd/dbgen/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/diagcfg/main.go b/cmd/diagcfg/main.go index 71d794a01f..e2f1003d45 100644 --- a/cmd/diagcfg/main.go +++ b/cmd/diagcfg/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/diagcfg/messages.go b/cmd/diagcfg/messages.go index ef091d87e0..70898a043e 100644 --- a/cmd/diagcfg/messages.go +++ b/cmd/diagcfg/messages.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/diagcfg/metric.go b/cmd/diagcfg/metric.go index 2e9dee82bb..4fefd69b72 100644 --- a/cmd/diagcfg/metric.go +++ b/cmd/diagcfg/metric.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/diagcfg/telemetry.go b/cmd/diagcfg/telemetry.go index c7df1bc83c..e49e0c2151 100644 --- a/cmd/diagcfg/telemetry.go +++ b/cmd/diagcfg/telemetry.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/dispenser/server.go b/cmd/dispenser/server.go index 35b3b29540..39ecb41841 100644 --- a/cmd/dispenser/server.go +++ b/cmd/dispenser/server.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/genesis/newgenesis.go b/cmd/genesis/newgenesis.go index 5a7ad83269..d86d67df3c 100644 --- a/cmd/genesis/newgenesis.go +++ b/cmd/genesis/newgenesis.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -32,6 +32,7 @@ var outDir = flag.String("d", "", "The directory containing the generated ledger var netName = flag.String("n", "", "The name of the network for this ledger (will override config file).") var configFile = flag.String("c", "", "The config file containing the genesis ledger and wallets") var quiet = flag.Bool("q", false, "Skip verbose informational messages") +var short = flag.Bool("s", false, "Cap the last participation key round to 1500") func init() { flag.Parse() @@ -60,6 +61,13 @@ func main() { if !*quiet { verboseOut = os.Stdout } + + if *short { + if genesisData.LastPartKeyRound > 1500 { + genesisData.LastPartKeyRound = 1500 + } + } + err = gen.GenerateGenesisFiles(genesisData, config.Consensus, *outDir, verboseOut) if err != nil { reportErrorf("Cannot write genesis files: %s", err) diff --git a/cmd/goal/account.go b/cmd/goal/account.go index ccc37f227f..e1243aa143 100644 --- a/cmd/goal/account.go +++ b/cmd/goal/account.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -696,6 +696,8 @@ func printAccountInfo(client libgoal.Client, address string, account generatedV2 fmt.Fprintf(report, "\tID %d, local state used %d/%d uints, %d/%d byte slices\n", localState.Id, usedInts, allocatedInts, usedBytes, allocatedBytes) } + fmt.Fprintf(report, "Minimum Balance:\t%v microAlgos\n", account.MinBalance) + if hasError { fmt.Fprint(os.Stderr, errorReport.String()) } @@ -875,11 +877,19 @@ var addParticipationKeyCmd = &cobra.Command{ // Generate a participation keys database and install it client := ensureFullClient(dataDir) - _, _, err := client.GenParticipationKeysTo(accountAddress, roundFirstValid, roundLastValid, keyDilution, partKeyOutDir) + reportInfof("Please stand by while generating keys. This might take a few minutes...") + + var err error + participationGen := func() { + _, _, err = client.GenParticipationKeysTo(accountAddress, roundFirstValid, roundLastValid, keyDilution, partKeyOutDir) + } + + util.RunFuncWithSpinningCursor(participationGen) if err != nil { reportErrorf(errorRequestFail, err) } - fmt.Println("Participation key generation successful") + + reportInfof("Participation key generation successful") }, } @@ -938,6 +948,7 @@ var renewParticipationKeyCmd = &cobra.Command{ if roundLastValid <= (currentRound + proto.MaxTxnLife) { reportErrorf(errLastRoundInvalid, currentRound) } + txRoundLastValid := currentRound + proto.MaxTxnLife // Make sure we don't already have a partkey valid for (or after) specified roundLastValid parts, err := client.ListParticipationKeyFiles() @@ -952,25 +963,35 @@ var renewParticipationKeyCmd = &cobra.Command{ } } - err = generateAndRegisterPartKey(accountAddress, currentRound, roundLastValid, transactionFee, scLeaseBytes(cmd), keyDilution, walletName, dataDir, client) + err = generateAndRegisterPartKey(accountAddress, currentRound, roundLastValid, txRoundLastValid, transactionFee, scLeaseBytes(cmd), keyDilution, walletName, dataDir, client) if err != nil { reportErrorf(err.Error()) } }, } -func generateAndRegisterPartKey(address string, currentRound, lastValidRound uint64, fee uint64, leaseBytes [32]byte, dilution uint64, wallet string, dataDir string, client libgoal.Client) error { +func generateAndRegisterPartKey(address string, currentRound, keyLastValidRound, txLastValidRound uint64, fee uint64, leaseBytes [32]byte, dilution uint64, wallet string, dataDir string, client libgoal.Client) error { // Generate a participation keys database and install it - part, keyPath, err := client.GenParticipationKeysTo(address, currentRound, lastValidRound, dilution, "") + var part algodAcct.Participation + var keyPath string + var err error + genFunc := func() { + part, keyPath, err = client.GenParticipationKeysTo(address, currentRound, keyLastValidRound, dilution, "") + if err != nil { + err = fmt.Errorf(errorRequestFail, err) + } + fmt.Println("Participation key generation successful") + } + fmt.Println("Please stand by while generating keys. This might take a few minutes...") + util.RunFuncWithSpinningCursor(genFunc) if err != nil { - return fmt.Errorf(errorRequestFail, err) + return err } - fmt.Printf(" Generated participation key for %s (Valid %d - %d)\n", address, currentRound, lastValidRound) // Now register it as our new online participation key goOnline := true txFile := "" - err = changeAccountOnlineStatus(address, &part, goOnline, txFile, wallet, currentRound, lastValidRound, fee, leaseBytes, dataDir, client) + err = changeAccountOnlineStatus(address, &part, goOnline, txFile, wallet, currentRound, txLastValidRound, fee, leaseBytes, dataDir, client) if err != nil { os.Remove(keyPath) fmt.Fprintf(os.Stderr, " Error registering keys - deleting newly-generated key file: %s\n", keyPath) @@ -1027,6 +1048,7 @@ func renewPartKeysInDir(dataDir string, lastValidRound uint64, fee uint64, lease if lastValidRound <= (currentRound + proto.MaxTxnLife) { return fmt.Errorf(errLastRoundInvalid, currentRound) } + txLastValidRound := currentRound + proto.MaxTxnLife var anyErrors bool @@ -1046,7 +1068,7 @@ func renewPartKeysInDir(dataDir string, lastValidRound uint64, fee uint64, lease } address := renewPart.Address().String() - err = generateAndRegisterPartKey(address, currentRound, lastValidRound, fee, leaseBytes, dilution, wallet, dataDir, client) + err = generateAndRegisterPartKey(address, currentRound, lastValidRound, txLastValidRound, fee, leaseBytes, dilution, wallet, dataDir, client) if err != nil { fmt.Fprintf(os.Stderr, " Error renewing part key for account %s: %v\n", address, err) anyErrors = true @@ -1445,8 +1467,9 @@ var partkeyInfoCmd = &cobra.Command{ fmt.Printf("Key dilution: %d\n", part.Key.VoteKeyDilution) fmt.Printf("Selection key: %s\n", base64.StdEncoding.EncodeToString(part.Key.SelectionParticipationKey)) fmt.Printf("Voting key: %s\n", base64.StdEncoding.EncodeToString(part.Key.VoteParticipationKey)) - // PKI TODO: enable with state proof support. - //fmt.Printf("State proof key: %s\n", base64.StdEncoding.EncodeToString(part.StateProofKey)) + if part.Key.StateProofKey != nil { + fmt.Printf("State proof key: %s\n", base64.StdEncoding.EncodeToString(*part.Key.StateProofKey)) + } } }) }, diff --git a/cmd/goal/accountsList.go b/cmd/goal/accountsList.go index 0fa2f4bffe..56de35deb8 100644 --- a/cmd/goal/accountsList.go +++ b/cmd/goal/accountsList.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/goal/application.go b/cmd/goal/application.go index 49a2ce9c58..4919474906 100644 --- a/cmd/goal/application.go +++ b/cmd/goal/application.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -22,6 +22,7 @@ import ( "encoding/base32" "encoding/base64" "encoding/binary" + "encoding/hex" "fmt" "os" "strconv" @@ -45,8 +46,9 @@ var ( approvalProgFile string clearProgFile string - method string - methodArgs []string + method string + methodArgs []string + methodCreatesApp bool approvalProgRawFile string clearProgRawFile string @@ -121,6 +123,12 @@ func init() { methodAppCmd.Flags().StringVar(&method, "method", "", "Method to be called") methodAppCmd.Flags().StringArrayVar(&methodArgs, "arg", nil, "Args to pass in for calling a method") methodAppCmd.Flags().StringVar(&onCompletion, "on-completion", "NoOp", "OnCompletion action for application transaction") + methodAppCmd.Flags().BoolVar(&methodCreatesApp, "create", false, "Create an application in this method call") + methodAppCmd.Flags().Uint64Var(&globalSchemaUints, "global-ints", 0, "Maximum number of integer values that may be stored in the global key/value store. Immutable, only valid when passed with --create.") + methodAppCmd.Flags().Uint64Var(&globalSchemaByteSlices, "global-byteslices", 0, "Maximum number of byte slices that may be stored in the global key/value store. Immutable, only valid when passed with --create.") + methodAppCmd.Flags().Uint64Var(&localSchemaUints, "local-ints", 0, "Maximum number of integer values that may be stored in local (per-account) key/value stores for this app. Immutable, only valid when passed with --create.") + methodAppCmd.Flags().Uint64Var(&localSchemaByteSlices, "local-byteslices", 0, "Maximum number of byte slices that may be stored in local (per-account) key/value stores for this app. Immutable, only valid when passed with --create.") + methodAppCmd.Flags().Uint32Var(&extraPages, "extra-pages", 0, "Additional program space for supporting larger TEAL assembly program. A maximum of 3 extra pages is allowed. A page is 1024 bytes. Only valid when passed with --create.") // Can't use PersistentFlags on the root because for some reason marking // a root command as required with MarkPersistentFlagRequired isn't @@ -178,7 +186,6 @@ func init() { infoAppCmd.MarkFlagRequired("app-id") methodAppCmd.MarkFlagRequired("method") // nolint:errcheck // follow previous required flag format - methodAppCmd.MarkFlagRequired("app-id") // nolint:errcheck methodAppCmd.MarkFlagRequired("from") // nolint:errcheck methodAppCmd.Flags().MarkHidden("app-arg") // nolint:errcheck } @@ -1074,7 +1081,7 @@ func populateMethodCallTxnArgs(types []string, values []string) ([]transactions. } expectedType := types[i] - if expectedType != "txn" && txn.Txn.Type != protocol.TxType(expectedType) { + if expectedType != abi.AnyTransactionType && txn.Txn.Type != protocol.TxType(expectedType) { return nil, fmt.Errorf("Transaction from %s does not match method argument type. Expected %s, got %s", txFilename, expectedType, txn.Txn.Type) } @@ -1084,10 +1091,86 @@ func populateMethodCallTxnArgs(types []string, values []string) ([]transactions. return loadedTxns, nil } +// populateMethodCallReferenceArgs parses reference argument types and resolves them to an index +// into the appropriate foreign array. Their placement will be as compact as possible, which means +// values will be deduplicated and any value that is the sender or the current app will not be added +// to the foreign array. +func populateMethodCallReferenceArgs(sender string, currentApp uint64, types []string, values []string, accounts *[]string, apps *[]uint64, assets *[]uint64) ([]int, error) { + resolvedIndexes := make([]int, len(types)) + + for i, value := range values { + var resolved int + + switch types[i] { + case abi.AccountReferenceType: + if value == sender { + resolved = 0 + } else { + duplicate := false + for j, account := range *accounts { + if value == account { + resolved = j + 1 // + 1 because 0 is the sender + duplicate = true + break + } + } + if !duplicate { + resolved = len(*accounts) + 1 + *accounts = append(*accounts, value) + } + } + case abi.ApplicationReferenceType: + appID, err := strconv.ParseUint(value, 10, 64) + if err != nil { + return nil, fmt.Errorf("Unable to parse application ID '%s': %s", value, err) + } + if appID == currentApp { + resolved = 0 + } else { + duplicate := false + for j, app := range *apps { + if appID == app { + resolved = j + 1 // + 1 because 0 is the current app + duplicate = true + break + } + } + if !duplicate { + resolved = len(*apps) + 1 + *apps = append(*apps, appID) + } + } + case abi.AssetReferenceType: + assetID, err := strconv.ParseUint(value, 10, 64) + if err != nil { + return nil, fmt.Errorf("Unable to parse asset ID '%s': %s", value, err) + } + duplicate := false + for j, asset := range *assets { + if assetID == asset { + resolved = j + duplicate = true + break + } + } + if !duplicate { + resolved = len(*assets) + *assets = append(*assets, assetID) + } + default: + return nil, fmt.Errorf("Unknown reference type: %s", types[i]) + } + + resolvedIndexes[i] = resolved + } + + return resolvedIndexes, nil +} + var methodAppCmd = &cobra.Command{ Use: "method", - Short: "Invoke a method", - Long: `Invoke a method in an App (stateful contract) with an application call transaction`, + Short: "Invoke an ABI method", + Long: `Invoke an ARC-4 ABI method on an App (stateful contract) with an application call transaction`, Args: validateNoPosArgsFn, Run: func(cmd *cobra.Command, args []string) { dataDir, client := getDataDirAndClient() @@ -1095,17 +1178,47 @@ var methodAppCmd = &cobra.Command{ // Parse transaction parameters appArgsParsed, appAccounts, foreignApps, foreignAssets := getAppInputs() if len(appArgsParsed) > 0 { - reportErrorf("in goal app method: --arg and --app-arg are mutually exclusive, do not use --app-arg") + reportErrorf("--arg and --app-arg are mutually exclusive, do not use --app-arg") + } + + // Construct schemas from args + localSchema := basics.StateSchema{ + NumUint: localSchemaUints, + NumByteSlice: localSchemaByteSlices, + } + + globalSchema := basics.StateSchema{ + NumUint: globalSchemaUints, + NumByteSlice: globalSchemaByteSlices, } onCompletionEnum := mustParseOnCompletion(onCompletion) - if appIdx == 0 { - reportErrorf("app id == 0, goal app create not supported in goal app method") + if methodCreatesApp { + if appIdx != 0 { + reportErrorf("--app-id and --create are mutually exclusive, only provide one") + } + + switch onCompletionEnum { + case transactions.CloseOutOC, transactions.ClearStateOC: + reportWarnf("'--on-completion %s' may be ill-formed for use with --create", onCompletion) + } + } else { + if appIdx == 0 { + reportErrorf("one of --app-id or --create must be provided") + } + + if localSchema != (basics.StateSchema{}) || globalSchema != (basics.StateSchema{}) { + reportErrorf("--global-ints, --global-byteslices, --local-ints, and --local-byteslices must only be provided with --create") + } + + if extraPages != 0 { + reportErrorf("--extra-pages must only be provided with --create") + } } var approvalProg, clearProg []byte - if onCompletionEnum == transactions.UpdateApplicationOC { + if methodCreatesApp || onCompletionEnum == transactions.UpdateApplicationOC { approvalProg, clearProg = mustParseProgArgs() } @@ -1138,17 +1251,37 @@ var methodAppCmd = &cobra.Command{ var txnArgValues []string var basicArgTypes []string var basicArgValues []string + var refArgTypes []string + var refArgValues []string + refArgIndexToBasicArgIndex := make(map[int]int) for i, argType := range argTypes { argValue := methodArgs[i] if abi.IsTransactionType(argType) { txnArgTypes = append(txnArgTypes, argType) txnArgValues = append(txnArgValues, argValue) } else { + if abi.IsReferenceType(argType) { + refArgIndexToBasicArgIndex[len(refArgTypes)] = len(basicArgTypes) + refArgTypes = append(refArgTypes, argType) + refArgValues = append(refArgValues, argValue) + // treat the reference as a uint8 for encoding purposes + argType = "uint8" + } basicArgTypes = append(basicArgTypes, argType) basicArgValues = append(basicArgValues, argValue) } } + refArgsResolved, err := populateMethodCallReferenceArgs(account, appIdx, refArgTypes, refArgValues, &appAccounts, &foreignApps, &foreignAssets) + if err != nil { + reportErrorf("error populating reference arguments: %v", err) + } + for i, resolved := range refArgsResolved { + basicArgIndex := refArgIndexToBasicArgIndex[i] + // use the foreign array index as the encoded argument value + basicArgValues[basicArgIndex] = strconv.Itoa(resolved) + } + err = abi.ParseArgJSONtoByteSlice(basicArgTypes, basicArgValues, &applicationArgs) if err != nil { reportErrorf("cannot parse arguments to ABI encoding: %v", err) @@ -1161,7 +1294,7 @@ var methodAppCmd = &cobra.Command{ appCallTxn, err := client.MakeUnsignedApplicationCallTx( appIdx, applicationArgs, appAccounts, foreignApps, foreignAssets, - onCompletionEnum, approvalProg, clearProg, basics.StateSchema{}, basics.StateSchema{}, 0) + onCompletionEnum, approvalProg, clearProg, globalSchema, localSchema, extraPages) if err != nil { reportErrorf("Cannot create application txn: %v", err) @@ -1249,12 +1382,19 @@ var methodAppCmd = &cobra.Command{ } // Report tx details to user + if methodCreatesApp { + reportInfof("Attempting to create app (approval size %d, hash %v; clear size %d, hash %v)", len(approvalProg), crypto.HashObj(logic.Program(approvalProg)), len(clearProg), crypto.HashObj(logic.Program(clearProg))) + } else if onCompletionEnum == transactions.UpdateApplicationOC { + reportInfof("Attempting to update app (approval size %d, hash %v; clear size %d, hash %v)", len(approvalProg), crypto.HashObj(logic.Program(approvalProg)), len(clearProg), crypto.HashObj(logic.Program(clearProg))) + } + reportInfof("Issued %d transaction(s):", len(signedTxnGroup)) + // remember the final txid in this variable var txid string for _, stxn := range signedTxnGroup { txid = stxn.Txn.ID().String() - reportInfof("\tIssued transaction from account %s, txid %s (fee %d)", stxn.Txn.Sender, txid, stxn.Txn.Fee.Raw) + reportInfof("Issued transaction from account %s, txid %s (fee %d)", stxn.Txn.Sender, txid, stxn.Txn.Fee.Raw) } if !noWaitAfterSend { @@ -1268,42 +1408,39 @@ var methodAppCmd = &cobra.Command{ reportErrorf(err.Error()) } + if methodCreatesApp && resp.ApplicationIndex != nil && *resp.ApplicationIndex != 0 { + reportInfof("Created app with app index %d", *resp.ApplicationIndex) + } + if retType == nil { - fmt.Printf("method %s succeeded\n", method) + reportInfof("method %s succeeded", method) return } - // specify the return hash prefix - hashRet := sha512.Sum512_256([]byte("return")) - hashRetPrefix := hashRet[:4] + // the 4-byte prefix for logged return values, from https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0004.md#standard-format + var abiReturnHash = []byte{0x15, 0x1f, 0x7c, 0x75} - var abiEncodedRet []byte - foundRet := false - if resp.Logs != nil { - for i := len(*resp.Logs) - 1; i >= 0; i-- { - retLog := (*resp.Logs)[i] - if bytes.HasPrefix(retLog, hashRetPrefix) { - abiEncodedRet = retLog[4:] - foundRet = true - break - } - } + if resp.Logs == nil || len(*resp.Logs) == 0 { + reportErrorf("method %s succeed but did not log a return value", method) } - if !foundRet { - reportErrorf("cannot find return log for abi type %s", retTypeStr) + lastLog := (*resp.Logs)[len(*resp.Logs)-1] + if !bytes.HasPrefix(lastLog, abiReturnHash) { + reportErrorf("method %s succeed but did not log a return value", method) } - decoded, err := retType.Decode(abiEncodedRet) + rawReturnValue := lastLog[len(abiReturnHash):] + decoded, err := retType.Decode(rawReturnValue) if err != nil { - reportErrorf("cannot decode return value %v: %v", abiEncodedRet, err) + reportErrorf("method %s succeed but its return value could not be decoded.\nThe raw return value in hex is:%s\nThe error is: %s", method, hex.EncodeToString(rawReturnValue), err) } decodedJSON, err := retType.MarshalToJSON(decoded) if err != nil { - reportErrorf("cannot marshal returned bytes %v to JSON: %v", decoded, err) + reportErrorf("method %s succeed but its return value could not be converted to JSON.\nThe raw return value in hex is:%s\nThe error is: %s", method, hex.EncodeToString(rawReturnValue), err) } - fmt.Printf("method %s succeeded with output: %s\n", method, string(decodedJSON)) + + reportInfof("method %s succeeded with output: %s", method, string(decodedJSON)) } }, } diff --git a/cmd/goal/asset.go b/cmd/goal/asset.go index ef0d8db44f..e98ba5e95e 100644 --- a/cmd/goal/asset.go +++ b/cmd/goal/asset.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -37,8 +37,13 @@ var ( assetURL string assetName string assetManager string + assetReserve string assetClawback string assetFreezer string + assetNoManager bool + assetNoReserve bool + assetNoFreezer bool + assetNoClawback bool assetNewManager string assetNewReserve string @@ -64,6 +69,14 @@ func init() { createAssetCmd.Flags().StringVar(&assetName, "name", "", "Name for the entire asset") createAssetCmd.Flags().StringVar(&assetURL, "asseturl", "", "URL where user can access more information about the asset (max 32 bytes)") createAssetCmd.Flags().StringVar(&assetMetadataHashBase64, "assetmetadatab64", "", "base-64 encoded 32-byte commitment to asset metadata") + createAssetCmd.Flags().StringVar(&assetManager, "manager", "", "Manager account that can issue transactions to re-configure or destroy the asset") + createAssetCmd.Flags().StringVar(&assetReserve, "reserve", "", "Reserve account that non-minted assets will reside in") + createAssetCmd.Flags().StringVar(&assetFreezer, "freezer", "", "Freezer account that can freeze or unfreeze the asset holdings for a specific account") + createAssetCmd.Flags().StringVar(&assetClawback, "clawback", "", "Clawback account that is allowed to transfer assets from and to any asset holder") + createAssetCmd.Flags().BoolVar(&assetNoManager, "no-manager", false, "Explicitly declare the lack of manager") + createAssetCmd.Flags().BoolVar(&assetNoReserve, "no-reserve", false, "Explicitly declare the lack of reserve") + createAssetCmd.Flags().BoolVar(&assetNoFreezer, "no-freezer", false, "Explicitly declare the lack of freezer") + createAssetCmd.Flags().BoolVar(&assetNoClawback, "no-clawback", false, "Explicitly declare the lack of clawback") createAssetCmd.MarkFlagRequired("total") createAssetCmd.MarkFlagRequired("creator") @@ -185,10 +198,66 @@ var createAssetCmd = &cobra.Command{ Run: func(cmd *cobra.Command, _ []string) { checkTxValidityPeriodCmdFlags(cmd) + if assetManager != "" && assetNoManager { + reportErrorf("The [--manager] flag and the [--no-manager] flag are mutually exclusive, do not provide both flags.") + } + + if assetReserve != "" && assetNoReserve { + reportErrorf("The [--reserve] flag and the [--no-reserve] flag are mutually exclusive, do not provide both flags.") + } + + if assetFreezer != "" && assetNoFreezer { + reportErrorf("The [--freezer] flag and the [--no-freezer] flag are mutually exclusive, do not provide both flags.") + } + + if assetClawback != "" && assetNoClawback { + reportErrorf("The [--clawback] flag and the [--no-clawback] flag are mutually exclusive, do not provide both flags.") + } + dataDir := ensureSingleDataDir() client := ensureFullClient(dataDir) accountList := makeAccountsList(dataDir) creator := accountList.getAddressByName(assetCreator) + manager := creator + reserve := creator + freezer := creator + clawback := creator + + if cmd.Flags().Changed("manager") { + assetManager = accountList.getAddressByName(assetManager) + manager = assetManager + } + + if assetNoManager { + manager = "" + } + + if cmd.Flags().Changed("reserve") { + assetReserve = accountList.getAddressByName(assetReserve) + reserve = assetReserve + } + + if assetNoReserve { + reserve = "" + } + + if cmd.Flags().Changed("freezer") { + assetFreezer = accountList.getAddressByName(assetFreezer) + freezer = assetFreezer + } + + if assetNoFreezer { + freezer = "" + } + + if cmd.Flags().Changed("clawback") { + assetClawback = accountList.getAddressByName(assetClawback) + clawback = assetClawback + } + + if assetNoClawback { + clawback = "" + } var err error var assetMetadataHash []byte @@ -199,7 +268,7 @@ var createAssetCmd = &cobra.Command{ } } - tx, err := client.MakeUnsignedAssetCreateTx(assetTotal, assetFrozen, creator, creator, creator, creator, assetUnitName, assetName, assetURL, assetMetadataHash, assetDecimals) + tx, err := client.MakeUnsignedAssetCreateTx(assetTotal, assetFrozen, manager, reserve, freezer, clawback, assetUnitName, assetName, assetURL, assetMetadataHash, assetDecimals) if err != nil { reportErrorf("Cannot construct transaction: %s", err) } @@ -460,10 +529,6 @@ var sendAssetCmd = &cobra.Command{ if err != nil { reportErrorf("Cannot construct transaction: %s", err) } - explicitFee := cmd.Flags().Changed("fee") - if explicitFee { - tx.Fee = basics.MicroAlgos{Raw: fee} - } tx.Note = parseNoteField(cmd) tx.Lease = parseLease(cmd) @@ -472,11 +537,17 @@ var sendAssetCmd = &cobra.Command{ if err != nil { reportErrorf("Cannot determine last valid round: %s", err) } + tx, err = client.FillUnsignedTxTemplate(sender, firstValid, lastValid, fee, tx) if err != nil { reportErrorf("Cannot construct transaction: %s", err) } + explicitFee := cmd.Flags().Changed("fee") + if explicitFee { + tx.Fee = basics.MicroAlgos{Raw: fee} + } + if outFilename == "" { wh, pw := ensureWalletHandleMaybePassword(dataDir, walletName, true) signedTxn, err := client.SignTransactionWithWallet(wh, pw, tx) diff --git a/cmd/goal/bundle_genesis_json.sh b/cmd/goal/bundle_genesis_json.sh new file mode 100755 index 0000000000..2c7f2e6107 --- /dev/null +++ b/cmd/goal/bundle_genesis_json.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +THISDIR=$(dirname $0) + +cat < $THISDIR/bundledGenesisInject.go +// Code generated by bundle_genesis_json.sh. DO NOT EDIT. +package main +var genesisMainnet []byte +var genesisTestnet []byte +var genesisBetanet []byte +var genesisDevnet []byte +func init() { + genesisMainnet = []byte(\`$(cat $THISDIR/../../installer/genesis/mainnet/genesis.json)\`) + genesisTestnet = []byte(\`$(cat $THISDIR/../../installer/genesis/testnet/genesis.json)\`) + genesisBetanet = []byte(\`$(cat $THISDIR/../../installer/genesis/betanet/genesis.json)\`) + genesisDevnet = []byte(\`$(cat $THISDIR/../../installer/genesis/devnet/genesis.json)\`) +} +EOM \ No newline at end of file diff --git a/cmd/goal/bundledGenesisInject.go b/cmd/goal/bundledGenesisInject.go new file mode 100644 index 0000000000..86bd491893 --- /dev/null +++ b/cmd/goal/bundledGenesisInject.go @@ -0,0 +1,2793 @@ +// Code generated by bundle_genesis_json.sh, along with langspec.json. DO NOT EDIT. +package main + +var genesisMainnet []byte +var genesisTestnet []byte +var genesisBetanet []byte +var genesisDevnet []byte + +func init() { + genesisMainnet = []byte(`{ + "alloc": [ + { + "addr": "737777777777777777777777777777777777777777777777777UFEJ2CI", + "comment": "RewardsPool", + "state": { + "algo": 10000000000000, + "onl": 2 + } + }, + { + "addr": "Y76M3MSY6DKBRHBL7C3NNDXGS5IIMQVQVUAB6MP4XEMMGVF2QWNPL226CA", + "comment": "FeeSink", + "state": { + "algo": 1000000, + "onl": 2 + } + }, + { + "addr": "ALGORANDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIN5DNAU", + "comment": "A BIT DOES E NOT BUT E STARTS EVERYTHING LIFE A MANY FORTUNE R BUILD SIMPLER BE THE STARTS PERSEVERES FAVORS A ENOUGH RIPROVANDO POSSIBLE JOURNEY VICTORIA HE BOLD U WITHOUT MEN A K OF BORDERS WHO HE E RACES TOMORROW BUT WHO SINGLE PURPOSE GEOGRAPHICAL PROVANDO A KNOW SUFFOCATES NOT SCIENCE STEP MATHEMATICS OF OR A BRIDGES WALLS TECHNOLOGY TODAY AND WITH AS ET MILES OF THOUSAND VITA SIMPLE TOO MUST AS NOT MADE NOT", + "state": { + "algo": 1000000, + "onl": 2 + } + }, + { + "addr": "XQJEJECPWUOXSKMIC5TCSARPVGHQJIIOKHO7WTKEPPLJMKG3D7VWWID66E", + "comment": "AlgorandCommunityAnnouncement", + "state": { + "algo": 10000000, + "onl": 2 + } + }, + { + "addr": "VCINCVUX2DBKQ6WP63NOGPEAQAYGHGSGQX7TSH4M5LI5NBPVAGIHJPMIPM", + "comment": "AuctionsMaster", + "state": { + "algo": 1000000000, + "onl": 2 + } + }, + { + "addr": "OGP6KK5KCMHT4GOEQXJ4LLNJ7D6P6IH7MV5WZ5EX4ZWACHP75ID5PPEE5E", + "comment": "", + "state": { + "algo": 300000000000000, + "onl": 2 + } + }, + { + "addr": "AYBHAG2DAIOG26QEV35HKUBGWPMPOCCQ44MQEY32UOW3EXEMSZEIS37M2U", + "comment": "", + "state": { + "algo": 300000000000000, + "onl": 2 + } + }, + { + "addr": "2XKK2L6HOBCYHGIGBS3N365FJKHS733QOX42HIYLSBARUIJHMGQZYAQDRY", + "comment": "", + "state": { + "algo": 300000000000000, + "onl": 2 + } + }, + { + "addr": "ZBSPQQG7O5TR5MHPG3D5RS2TIFFD5NMOPR77VUKURMN6HV2BSN224ZHKGU", + "comment": "", + "state": { + "algo": 300000000000000, + "onl": 2 + } + }, + { + "addr": "7NQED6NJ4NZU7B5HGGFU2ZEC2UZQYU2SA5S4QOE2EXBVAR4CNAHIXV2XYY", + "comment": "", + "state": { + "algo": 300000000000000, + "onl": 2 + } + }, + { + "addr": "RX2ZKVJ43GNYDJNIOB6TIX26U7UEQFUQY46OMHX6CXLMMBHENJIH4YVLUQ", + "comment": "", + "state": { + "algo": 300000000000000, + "onl": 2 + } + }, + { + "addr": "RHSKYCCZYYQ2BL6Z63626YUETJMLFGVVV47ED5D55EKIK4YFJ5DQT5CV4A", + "comment": "", + "state": { + "algo": 300000000000000, + "onl": 2 + } + }, + { + "addr": "RJS6FDZ46ZZJIONLMMCKDJHYSJNHHAXNABMAVSGH23ULJSEAHZC6AQ6ALE", + "comment": "", + "state": { + "algo": 300000000000000, + "onl": 2 + } + }, + { + "addr": "AZ2KKAHF2PJMEEUVN4E2ILMNJCSZLJJYVLBIA7HOY3BQ7AENOVVTXMGN3I", + "comment": "", + "state": { + "algo": 300000000000000, + "onl": 2 + } + }, + { + "addr": "CGUKRKXNMEEOK7SJKOGXLRWEZESF24ELG3TAW6LUF43XRT2LX4OVQLU4BQ", + "comment": "", + "state": { + "algo": 300000000000000, + "onl": 2 + } + }, + { + "addr": "VVW6BVYHBG7MZQXKAR3OSPUZVAZ66JMQHOBMIBJG6YSPR7SLMNAPA7UWGY", + "comment": "", + "state": { + "algo": 250000000000000, + "onl": 2 + } + }, + { + "addr": "N5BGWISAJSYT7MVW2BDTTEHOXFQF4QQH4VKSMKJEOA4PHPYND43D6WWTIU", + "comment": "", + "state": { + "algo": 1740000000000000, + "onl": 2 + } + }, + { + "addr": "MKT3JAP2CEI5C4IX73U7QKRUF6JR7KPKE2YD6BLURFVPW6N7CYXVBSJPEQ", + "comment": "", + "state": { + "algo": 158000000000000, + "onl": 2 + } + }, + { + "addr": "GVCPSWDNSL54426YL76DZFVIZI5OIDC7WEYSJLBFFEQYPXM7LTGSDGC4SA", + "comment": "", + "state": { + "algo": 49998988000000, + "onl": 1, + "sel": "lZ9z6g0oSlis/8ZlEyOMiGfX0XDUcObfpJEg5KjU0OA=", + "vote": "Kk+5CcpHWIXSMO9GiAvnfe+eNSeRtpDb2telHb6I1EE=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "M7XKTBQXVQARLS7IVS6NVDHNLJFIAXR2CGGZTUDEKRIHRVLWL5TJFJOL5U", + "comment": "", + "state": { + "algo": 50000000000000, + "onl": 1, + "sel": "Z5gE/m2E/WSuaS5E8aYzO2DugTdSWQdc5W5BroCJdms=", + "vote": "QHHw03LnZQhKvjjIxVj3+qwgohOij2j3TBDMy7V9JMk=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "QFYWTHPNZBKKZ4XG2OWVNEX6ETBISD2VJZTCMODIZKT3QHQ4TIRJVEDVV4", + "comment": "", + "state": { + "algo": 50000000000000, + "onl": 1, + "sel": "NthIIUyiiRVnU/W13ajFFV4EhTvT5EZR/9N6ZRD/Z7U=", + "vote": "3KtiTLYvHJqa+qkGFj2RcZC77bz9yUYKxBZt8B24Z+c=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "DPOZQ6HRYLNNWVQL3I4XV4LMK5UZVROKGJBRIYIRNZUBMVHCU4DZWDBHYE", + "comment": "", + "state": { + "algo": 50000000000000, + "onl": 1, + "sel": "PBZ/agWgmwMdmWgt/W0NvdTN/XSTrVhPvRSMjmP5j90=", + "vote": "FDONnMcq1acmIBjJr3vz4kx4Q8ZRZ8oIH8xXRV5c4L8=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "42GALMKS3HMDB24ZPOR237WQ5QDHL5NIRC3KIA4PCKENJZAD5RP5QPBFO4", + "comment": "", + "state": { + "algo": 50000000000000, + "onl": 1, + "sel": "p7axjoy3Wn/clD7IKoTK2Zahc5ZU+Qkt2POVHKugQU4=", + "vote": "PItHHw+b01XplxRBFmZniqmdm+RyJFYd0fDz+OP4D6o=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "OXWIMTRZA5TVPABJF534EBBERJG367OLAB6VFN4RAW5P6CQEMXEX7VVDV4", + "comment": "", + "state": { + "algo": 50000000000000, + "onl": 1, + "sel": "RSOWYRM6/LD7MYxlZGvvF+WFGmBZg7UUutdkaWql0Xo=", + "vote": "sYSYFRL7AMJ61egushOYD5ABh9p06C4ZRV/OUSx7o3g=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "AICDUO6E46YBJRLM4DFJPVRVZGOFTRNPF7UPQXWEPPYRPVGIMQMLY5HLFM", + "comment": "", + "state": { + "algo": 50000000000000, + "onl": 1, + "sel": "0vxjPZqEreAhUt9PHJU2Eerb7gBhMU+PgyEXYLmbifg=", + "vote": "fuc0z/tpiZXBWARCJa4jPdmDvSmun4ShQLFiAxQkOFI=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "DYATVHCICZA7VVOWZN6OLFFSKUAZ64TZ7WZWCJQBFWL3JL4VBBV6R7Z6IE", + "comment": "", + "state": { + "algo": 50000000000000, + "onl": 1, + "sel": "KO2035CRpp1XmVPOTOF6ICWCw/0I6FgelKxdwPq+gMY=", + "vote": "rlcoayAuud0suR3bvvI0+psi/NzxvAJUFlp+I4ntzkM=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "6XJH2PJMAXWS4RGE6NBYIS3OZFOPU3LOHYC6MADBFUAALSWNFHMPJUWVSE", + "comment": "", + "state": { + "algo": 50000000000000, + "onl": 1, + "sel": "PgW1dncjs9chAVM89SB0FD4lIrygxrf+uqsAeZw8Qts=", + "vote": "pA4NJqjTAtHGGvZWET9kliq24Go5kEW8w7f1BGAWmKY=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "EYOZMULFFZZ5QDDMWQ64HKIMUPPNEL3WJMNGAFD43L52ZXTPESBEVJPEZU", + "comment": "", + "state": { + "algo": 50000000000000, + "onl": 1, + "sel": "sfebD2noAbrn1vblMmeCIeGB3BxLGKQDTG4sKSNibFs=", + "vote": "Cuz3REj26J+JhOpf91u6PO6MV5ov5b1K/ii1U1uPD/g=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "I3345FUQQ2GRBHFZQPLYQQX5HJMMRZMABCHRLWV6RCJYC6OO4MOLEUBEGU", + "comment": "", + "state": { + "algo": 24000000000000, + "onl": 1, + "sel": "MkH9KsdwiFgYtFFWFu48CeejEop1vsyGFG4/kqPIOFg=", + "vote": "RcntidhQqXQIvYjLFtc6HuL335rMnNX92roa2LcC+qQ=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "6LQH42A4QJ3Y27FGKJWERY3MD65SXM4QQCJJR2HRJYNB427IQ73YBI3YFY", + "comment": "", + "state": { + "algo": 24000000000000, + "onl": 1, + "sel": "nF3mu9Bu0Ad5MIrT31NgTxxrsZOXc4u1+WCvaPQTYEQ=", + "vote": "NaqWR/7FzOq/MiHb3adO6+J+kvnQKat8NSqEmoEkVfE=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "3V2MC7WJGAFU2EHWBHEETIMJVFJNAT4KKWVPOMJFJIM6ZPWEJRJ4POTXGI", + "comment": "", + "state": { + "algo": 24000000000000, + "onl": 1, + "sel": "3i4K8zdmnf1kxwgcNmI3x50iIwAxDmLMvoQEhjzhado=", + "vote": "wfJWa0kby76rqX2yvCD/aCfJdNt+qItylDPQiuAWFkQ=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "FTXSKED23VEXNW442T2JKNPPNUC2WKFNRWBVQTFMT7HYX365IVLZXYILAI", + "comment": "", + "state": { + "algo": 24000000000000, + "onl": 1, + "sel": "icuL7ehcGonAcJ02Zy4MIHqcT+Sp1R1UURNCYJQHmo4=", + "vote": "tmFcj3v7X5DDxKI1IDbGdhXh3a5f0Ab1ftltM7TgIDE=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "IAOW7PXLCDGLKMIQF26IXFF4THSQMU662MUU6W5KPOXHIVKHYFLYRWOUT4", + "comment": "", + "state": { + "algo": 24000000000000, + "onl": 1, + "sel": "zTn9rl/8Y2gokMdFyFP/pKg4eP02arkxlrBZIS94vPI=", + "vote": "a0pX68GgY7u8bd2Z3311+Mtc6yDnESZmi9k8zJ0oHzY=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "4NRNE5RIGC2UGOMGMDR6L5YMQUV3Q76TPOR7TDU3WEMJLMC6BSBEKPJ2SY", + "comment": "", + "state": { + "algo": 24000000000000, + "onl": 1, + "sel": "orSV2VHPY8m5ckEHGwK0r+SM9jq4BujAICXegAUAecI=", + "vote": "NJ9tisH+7+S29m/uMymFTD8X02/PKU0JUX1ghnLCzkw=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "E2EIMPLDISONNZLXONGMC33VBYOIBC2R7LVOS4SYIEZYJQK6PYSAPQL7LQ", + "comment": "", + "state": { + "algo": 24000000000000, + "onl": 1, + "sel": "XM2iW9wg9G5TyOfVu9kTS80LDIqcEPkJsgxaZll3SWA=", + "vote": "p/opFfDOsIomj5j7pAYU+G/CNUIwvD2XdEer6dhGquQ=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "APDO5T76FB57LNURPHTLAGLQOHUQZXYHH2ZKR4DPQRKK76FB4IAOBVBXHQ", + "comment": "", + "state": { + "algo": 24000000000000, + "onl": 1, + "sel": "5k2vclbUQBE6zBl45F3kGSv1PYhE2k9wZjxyxoPlnwA=", + "vote": "3dcLRSckm3wd9KB0FBRxub3meIgT6lMZnv5F08GJgEo=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "3KJTYHNHK37G2JDZJPV55IHBADU22TX2FPJZJH43MY64IFWKVNMP2F4JZE", + "comment": "", + "state": { + "algo": 24000000000000, + "onl": 1, + "sel": "o5e9VLqMdmJas5wRovfYFHgQ+Z6sQoATf3a6j0HeIXU=", + "vote": "rG7J8pPAW+Xtu5pqMIJOG9Hxdlyewtf9zPHEKR2Q6OE=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "IVKDCE6MS44YVGMQQFVXCDABW2HKULKIXMLDS2AEOIA6P2OGMVHVJ64MZI", + "comment": "", + "state": { + "algo": 24000000000000, + "onl": 1, + "sel": "XgUrwumD7oin/rG3NKwywBSsTETg/aWg9MjCDG61Ybg=", + "vote": "sBPEGGrEqcQMdT+iq2ududNxCa/1HcluvsosO1SkE/k=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "2WDM5XFF7ONWFANPE5PBMPJLVWOEN2BBRLSKJ37PQYW5WWIHEFT3FV6N5Y", + "comment": "", + "state": { + "algo": 24000000000000, + "onl": 1, + "sel": "Lze5dARJdb1+Gg6ui8ySIi+LAOM3P9dKiHKB9HpMM6A=", + "vote": "ys4FsqUNQiv+N0RFtr0Hh9OnzVcxXS6cRVD/XrLgW84=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "EOZWAIPQEI23ATBWQ5J57FUMRMXADS764XLMBTSOLVKPMK5MK5DBIS3PCY", + "comment": "", + "state": { + "algo": 24000000000000, + "onl": 1, + "sel": "jtmLcJhaAknJtA1cS5JPZil4SQ5SKh8P0w1fUw3X0CE=", + "vote": "pyEtTxJAas/j+zi/N13b/3LB4UoCar1gfcTESl0SI2I=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "REMF542E5ZFKS7SGSNHTYB255AUITEKHLAATWVPK3CY7TAFPT6GNNCHH6M", + "comment": "", + "state": { + "algo": 24000000000000, + "onl": 1, + "sel": "8ggWPvRpSkyrjxoh1SVS9PiSjff2azWtH0HFadwI9Ck=", + "vote": "Ej/dSkWbzRf09RAuWZfC4luRPNuqkLFCSGYXDcOtwic=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "T4UBSEAKK7JHT7RNLXVHDRW72KKFJITITR54J464CAGE5FGAZFI3SQH3TI", + "comment": "", + "state": { + "algo": 24000000000000, + "onl": 1, + "sel": "eIB8MKaG2lyJyM9spk+b/Ap/bkbo9bHfvF9f8T51OQk=", + "vote": "7xuBsE5mJaaRAdm5wnINVwm4SgPqKwJTAS1QBQV3sEc=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "YUDNQMOHAXC4B3BAMRMMQNFDFZ7GYO2HUTBIMNIP7YQ4BL57HZ5VM3AFYU", + "comment": "", + "state": { + "algo": 24000000000000, + "onl": 1, + "sel": "CSTCDvvtsJB0VYUcl3oRXyiJfhm3CtqvRIuFYZ69Z68=", + "vote": "uBK1TH4xKdWfv5nnnHkvYssI0tyhWRFZRLHgVt9TE1k=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "4SZTEUQIURTRT37FCI3TRMHSYT5IKLUPXUI7GWC5DZFXN2DGTATFJY5ABY", + "comment": "", + "state": { + "algo": 24000000000000, + "onl": 1, + "sel": "THGOlrqElX13xMqeLUPy6kooTbXjiyrUoZfVccnHrfI=", + "vote": "k4hde2Q3Zl++sQobo01U8heZd/X0GIX1nyqM8aI/hCY=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "UEDD34QFEMWRGYCBLKZIEHPKSTNBFSRMFBHRJPY3O2JPGKHQCXH4IY6XRI", + "comment": "", + "state": { + "algo": 24000000000000, + "onl": 1, + "sel": "jE+AUFvtp2NJsfNeUZeXdWt0X6I58YOgY+z/HB17GDs=", + "vote": "lmnYTjg1FhRNAR9TwVmOahVr5Z+7H1GO6McmvOZZRTQ=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "HHZQOGQKMQDLBEL3HXMDX7AGTNORYVZ4JFDWVSL5QLWMD3EXOIAHDI5L7M", + "comment": "", + "state": { + "algo": 24000000000000, + "onl": 1, + "sel": "Hajdvzem2rR2GjLmCG+98clHZFY5Etlp0n+x/gQTGj0=", + "vote": "2+Ie4MDWC6o/SfFSqev1A7UAkzvKRESI42b4NKS6Iw8=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "XRTBXPKH3DXDJ5OLQSYXOGX3DJ3U5NR6Y3LIVIWMK7TY33YW4I2NJZOTVE", + "comment": "", + "state": { + "algo": 24000000000000, + "onl": 1, + "sel": "5qe7rVoQfGdIUuDbhP2ABWivCoCstKbUsjdmYY76akA=", + "vote": "3J3O9DyJMWKvACubUK9QvmCiArtZR7yFHWG7k7+apdQ=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "JJFGCPCZPYRLOUYBZVC4F7GRPZ5CLB6BMTVRGNDP7GRGXL6GG4JEN7DL54", + "comment": "", + "state": { + "algo": 24000000000000, + "onl": 1, + "sel": "YoRFAcTiOgJcLudNScYstbaKJ8anrrHwQMZAffWMqYE=", + "vote": "VQFKlDdxRqqqPUQ/mVoF8xZS9BGxUtTnPUjYyKnOVRA=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "4VNSA2GZVUD5ZNO62OVVNP4NEL2LIEE5N3MZEK4BKH62KGKRLVINFZYTZM", + "comment": "", + "state": { + "algo": 100000000000000, + "onl": 2 + } + }, + { + "addr": "IVCEEIH2Q32DZNRTS5XFVEFFAQGERNZHHQT6S4UPY7ORJMHIQDSTX7YM4E", + "comment": "", + "state": { + "algo": 408400000000000, + "onl": 2 + } + }, + { + "addr": "PLFHBIRGM3ZWGAMCXTREX2N537TWOMFIQXHFO2ZGQOEPZU473SYBVGVA5M", + "comment": "", + "state": { + "algo": 1011600000000000, + "onl": 2 + } + }, + { + "addr": "KF7X4ZABZUQU7IFMHSKLDKWCS4F3GZLOLJRDAK5KMEMDAGU32CX36CJQ5M", + "comment": "", + "state": { + "algo": 10000000000000, + "onl": 2 + } + }, + { + "addr": "BTEESEYQMFLWZKULSKLNDELYJTOOQK6ZT4FBCW3TOZQ55NZYLOO6BRQ5K4", + "comment": "", + "state": { + "algo": 36199095000000, + "onl": 2 + } + }, + { + "addr": "E36JOZVSZZDXKSERASLAWQE4NU67HC7Q6YDOCG7P7IRRWCPSWXOI245DPA", + "comment": "", + "state": { + "algo": 20000000000000, + "onl": 2 + } + }, + { + "addr": "I5Q6RRN44OZWYMX6YLWHBGEVPL7S3GBUCMHZCOOLJ245TONH7PERHJXE4A", + "comment": "", + "state": { + "algo": 20000000000000, + "onl": 2 + } + }, + { + "addr": "2GYS272T3W2AP4N2VX5BFBASVNLWN44CNVZVKLWMMVPZPHVJ52SJPPFQ2I", + "comment": "", + "state": { + "algo": 40000000000000, + "onl": 2 + } + }, + { + "addr": "D5LSV2UGT4JJNSLJ5XNIF52WP4IHRZN46ZGWH6F4QEF4L2FLDYS6I6R35Y", + "comment": "", + "state": { + "algo": 20000000000000, + "onl": 2 + } + }, + { + "addr": "UWMSBIP2CGCGR3GYVUIOW3YOMWEN5A2WRTTBH6Y23KE3MOVFRHNXBP6IOE", + "comment": "", + "state": { + "algo": 20000000000000, + "onl": 2 + } + }, + { + "addr": "OF3MKZZ3L5ZN7AZ46K7AXJUI4UWJI3WBRRVNTDKYVZUHZAOBXPVR3DHINE", + "comment": "", + "state": { + "algo": 40000000000000, + "onl": 2 + } + }, + { + "addr": "2PPWE36YUMWUVIFTV2A6U4MLZLGROW4GHYIRVHMUCHDH6HCNVPUKPQ53NY", + "comment": "", + "state": { + "algo": 440343426000000, + "onl": 2 + } + }, + { + "addr": "JRGRGRW4HYBNAAHR7KQLLBAGRSPOYY6TRSINKYB3LI5S4AN247TANH5IQY", + "comment": "", + "state": { + "algo": 362684706000000, + "onl": 2 + } + }, + { + "addr": "D7YVVQJXJEFOZYUHJLIJBW3ATCAW46ML62VYRJ3SMGLOHMWYH4OS3KNHTU", + "comment": "", + "state": { + "algo": 10000000000000, + "onl": 2 + } + }, + { + "addr": "PZJKH2ILW2YDZNUIYQVJZ2MANRSMK6LCHAFSAPYT6R3L3ZCWKYRDZXRVY4", + "comment": "", + "state": { + "algo": 10000000000000, + "onl": 2 + } + }, + { + "addr": "3MODEFJVPGUZH3HDIQ6L2MO3WLJV3FK3XSWKFBHUGZDCHXQMUKD4B7XLMI", + "comment": "", + "state": { + "algo": 130000000000000, + "onl": 2 + } + }, + { + "addr": "WNSA5P6C5IIH2UJPQWJX6FRNPHXY7XZZHOWLSW5ZWHOEHBUW4AD2H6TZGM", + "comment": "", + "state": { + "algo": 130000000000000, + "onl": 2 + } + }, + { + "addr": "OO65J5AIFDS6255WL3AESTUGJD5SUV47RTUDOUGYHEIME327GX7K2BGC6U", + "comment": "", + "state": { + "algo": 40000000000000, + "onl": 2 + } + }, + { + "addr": "DM6A24ZWHRZRM2HWXUHAUDSAACO7VKEZAOC2THWDXH4DX5L7LSO3VF2OPU", + "comment": "", + "state": { + "algo": 20000000000000, + "onl": 2 + } + }, + { + "addr": "NTJJSFM75RADUOUGOBHZB7IJGO7NLVBWA66EYOOPU67H7LYIXVSPSI7BTA", + "comment": "", + "state": { + "algo": 18099548000000, + "onl": 2 + } + }, + { + "addr": "DAV2AWBBW4HBGIL2Z6AAAWDWRJPTOQD6BSKU2CFXZQCOBFEVFEJ632I2LY", + "comment": "", + "state": { + "algo": 1000000000000, + "onl": 2 + } + }, + { + "addr": "M5VIY6QPSMALVVPVG5LVH35NBMH6XJMXNWKWTARGGTEEQNQ3BHPQGYP5XU", + "comment": "", + "state": { + "algo": 20000000000000, + "onl": 2 + } + }, + { + "addr": "WZZLVKMCXJG3ICVZSVOVAGCCN755VHJKZWVSVQ6JPSRQ2H2OSPOOZKW6DQ", + "comment": "", + "state": { + "algo": 45248869000000, + "onl": 2 + } + }, + { + "addr": "XEJLJUZRQOLBHHSOJJUE4IWI3EZOM44P646UDKHS4AV2JW7ZWBWNFGY6BU", + "comment": "", + "state": { + "algo": 20000000000000, + "onl": 2 + } + }, + { + "addr": "OGIPDCRJJPNVZ6X6NBQHMTEVKJVF74QHZIXVLABMGUKZWNMEH7MNXZIJ7Q", + "comment": "", + "state": { + "algo": 40000000000000, + "onl": 2 + } + }, + { + "addr": "G47R73USFN6FJJQTI3JMYQXO7F6H4LRPBCTTAD5EZWPWY2WCG64AVPCYG4", + "comment": "", + "state": { + "algo": 10000000000000, + "onl": 2 + } + }, + { + "addr": "PQ5T65QB564NMIY6HXNYZXTFRSTESUEFIF2C26ZZKIZE6Q4R4XFP5UYYWI", + "comment": "", + "state": { + "algo": 5000000000000, + "onl": 2 + } + }, + { + "addr": "R6S7TRMZCHNQPKP2PGEEJ6WYUKMTURNMM527ZQXABTHFT5GBVMF6AZAL54", + "comment": "", + "state": { + "algo": 1000000000000, + "onl": 2 + } + }, + { + "addr": "36LZKCBDUR5EHJ74Q6UWWNADLVJOHGCPBBQ5UTUM3ILRTQLA6RYYU4PUWQ", + "comment": "", + "state": { + "algo": 5000000000000, + "onl": 2 + } + }, + { + "addr": "JRHPFMSJLU42V75NTGFRQIALCK6RHTEK26QKLWCH2AEEAFNAVEXWDTA5AM", + "comment": "", + "state": { + "algo": 40000000000000, + "onl": 2 + } + }, + { + "addr": "64VZVS2LFZXWA5W3S657W36LWGP34B7XLMDIF4ROXBTPADD7SR5WNUUYJE", + "comment": "", + "state": { + "algo": 171945701000000, + "onl": 2 + } + }, + { + "addr": "TXDBSEZPFP2UB6BDNFCHCZBTPONIIQVZGABM4UBRHVAAPR5NE24QBL6H2A", + "comment": "", + "state": { + "algo": 60000000000000, + "onl": 2 + } + }, + { + "addr": "XI5TYT4XPWUHE4AMDDZCCU6M4AP4CAI4VTCMXXUNS46I36O7IYBQ7SL3D4", + "comment": "", + "state": { + "algo": 40000000000000, + "onl": 2 + } + }, + { + "addr": "Y6ZPKPXF2QHF6ULYQXVHM7NPI3L76SP6QHJHK7XTNPHNXDEUTJPRKUZBNE", + "comment": "", + "state": { + "algo": 40000000000000, + "onl": 2 + } + }, + { + "addr": "6LY2PGUJLCK4Q75JU4IX5VWVJVU22VGJBWPZOFP3752UEBIUBQRNGJWIEA", + "comment": "", + "state": { + "algo": 40000000000000, + "onl": 2 + } + }, + { + "addr": "L7AGFNAFJ6Z2FYCX3LXE4ZSERM2VOJF4KPF7OUCMGK6GWFXXDNHZJBEC2E", + "comment": "", + "state": { + "algo": 10000000000000, + "onl": 2 + } + }, + { + "addr": "RYXX5U2HMWGTPBG2UDLDT6OXDDRCK2YGL7LFAKYNBLRGZGYEJLRMGYLSVU", + "comment": "", + "state": { + "algo": 40000000000000, + "onl": 2 + } + }, + { + "addr": "S263NYHFQWZYLINTBELLMIRMAJX6J5CUMHTECTGGVZUKUN2XY6ND2QBZVY", + "comment": "", + "state": { + "algo": 21647524000000, + "onl": 2 + } + }, + { + "addr": "AERTZIYYGK3Q364M6DXPKSRRNSQITWYEDGAHXC6QXFCF4GPSCCSISAGCBY", + "comment": "", + "state": { + "algo": 19306244000000, + "onl": 2 + } + }, + { + "addr": "34UYPXOJA6WRTWRNH5722LFDLWT23OM2ZZTCFQ62EHQI6MM3AJIAKOWDVQ", + "comment": "", + "state": { + "algo": 10000000000000, + "onl": 2 + } + }, + { + "addr": "EDVGNQL6APUFTIGFZHASIEWGJRZNWGIKJE64B72V36IQM2SJPOAG2MJNQE", + "comment": "", + "state": { + "algo": 20000000000000, + "onl": 2 + } + }, + { + "addr": "RKKLUIIGR75DFWGQOMJB5ZESPT7URDPC7QHGYKM4MAJ4OEL2J5WAQF6Z2Q", + "comment": "", + "state": { + "algo": 40000000000000, + "onl": 2 + } + }, + { + "addr": "M4TNVJLDZZFAOH2M24BE7IU72KUX3P6M2D4JN4WZXW7WXH3C5QSHULJOU4", + "comment": "", + "state": { + "algo": 10000000000000, + "onl": 2 + } + }, + { + "addr": "WQL6MQS5SPK3CR3XUPYMGOUSCUC5PNW5YQPLGEXGKVRK3KFKSAZ6JK4HXQ", + "comment": "", + "state": { + "algo": 10000000000000, + "onl": 2 + } + }, + { + "addr": "36JTK4PKUBJGVCWKXZTAG6VLJRXWZXQVPQQSYODSN6WEGVHOWSVK6O54YU", + "comment": "", + "state": { + "algo": 10000000000000, + "onl": 2 + } + }, + { + "addr": "YFOAYI4SNXJR2DBEZ3O6FJOFSEQHWD7TYROCNDWF6VLBGLNJMRRHDXXZUI", + "comment": "", + "state": { + "algo": 30000000000000, + "onl": 2 + } + }, + { + "addr": "XASOPHD3KK3NNI5IF2I7S7U55RGF22SG6OEICVRMCTMMGHT3IBOJG7QWBU", + "comment": "", + "state": { + "algo": 40000000000000, + "onl": 2 + } + }, + { + "addr": "H2AUGBLVQFHHFLFEPJ6GGJ7PBQITEN2GE6T7JZCALBKNU7Q52AVJM5HOYU", + "comment": "", + "state": { + "algo": 10000000000000, + "onl": 2 + } + }, + { + "addr": "GX3XLHSRMFTADVKJBBQBTZ6BKINW6ZO5JHXWGCWB4CPDNPDQ2PIYN4AVHQ", + "comment": "", + "state": { + "algo": 40000000000000, + "onl": 2 + } + }, + { + "addr": "VBJBJ4VC3IHUTLVLWMBON36Y5MPAMPV4DNGW5FQ47GRLPT7JR5PQOUST2E", + "comment": "", + "state": { + "algo": 4524887000000, + "onl": 2 + } + }, + { + "addr": "7AQVTOMB5DJRSUM4LPLVF6PY3Y5EBDF4RZNDIWNW4Z63JYTAQCPQ62IZFE", + "comment": "", + "state": { + "algo": 50000000000000, + "onl": 2 + } + }, + { + "addr": "B4ZIHKD4VYLA4BAFEP7KUHZD7PNWXW4QLCHCNKWRENJ2LYVEOIYA3ZX6IA", + "comment": "", + "state": { + "algo": 40000000000000, + "onl": 2 + } + }, + { + "addr": "G5RGT3EENES7UVIQUHXMJ5APMOGSW6W6RBC534JC6U2TZA4JWC7U27RADE", + "comment": "", + "state": { + "algo": 10000000000000, + "onl": 2 + } + }, + { + "addr": "5AHJFDLAXVINK34IGSI3JA5OVRVMPCWLFEZ6TA4I7XUZ7I6M34Q56DUYIM", + "comment": "", + "state": { + "algo": 20000000000000, + "onl": 2 + } + } + ], + "fees": "Y76M3MSY6DKBRHBL7C3NNDXGS5IIMQVQVUAB6MP4XEMMGVF2QWNPL226CA", + "id": "v1.0", + "network": "mainnet", + "proto": "https://github.com/algorandfoundation/specs/tree/5615adc36bad610c7f165fa2967f4ecfa75125f0", + "rwd": "737777777777777777777777777777777777777777777777777UFEJ2CI", + "timestamp": 1560211200 +}`) + genesisTestnet = []byte(`{ + "alloc": [ + { + "addr": "7777777777777777777777777777777777777777777777777774MSJUVU", + "comment": "RewardsPool", + "state": { + "algo": 125000000000000, + "onl": 2 + } + }, + { + "addr": "A7NMWS3NT3IUDMLVO26ULGXGIIOUQ3ND2TXSER6EBGRZNOBOUIQXHIBGDE", + "comment": "FeeSink", + "state": { + "algo": 100000, + "onl": 2 + } + }, + { + "addr": "LHHQJ6UMXRGEPXBVFKT7SY26BQOIK64VVPCLVRL3RNQLX5ZMBYG6ZHZMBE", + "comment": "Wallet1", + "state": { + "algo": 320000000000000, + "onl": 1, + "sel": "h7Ml/mY/PDCPSj33u72quxaMX99n+/VE+wD94/hMdzY=", + "vote": "R9kxsHbji4DlxPOAyLehy8vaiWyLjWdLGWBLnQ5jjY8=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "CQW2QBBUW5AGFDXMURQBRJN2AM3OHHQWXXI4PEJXRCVTEJ3E5VBTNRTEAE", + "comment": "Wallet10", + "state": { + "algo": 320000000000000, + "onl": 1, + "sel": "p2tiuQ2kqJGG049hHOKNIjid4/u1MqlvgXfbxK4tuEY=", + "vote": "E73cc+KB/LGdDHO1o84440WKCmqvbM4EgROMRyHfjDc=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "HXPCXKQZF4LDL3CE5ERWC5V2BQZTKXUUT3JE6AXXNKLF3OJL4XUAW5WYXM", + "comment": "Wallet11", + "state": { + "algo": 320000000000000, + "onl": 1, + "sel": "ex32mzy8E94GkHGy+cmkRP5JNqFBKGfHtgyUGNxTiW8=", + "vote": "BtYvtmeEBY2JovHUfePTjo3OtOMrhKp3QMeOYl3JFYM=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "Y3FSHQ43JWDSJG7LL5FBRTXHEGTPSWEQBO4CO2RO7KS2Z4ZGBUI7LSEDHQ", + "comment": "Wallet12", + "state": { + "algo": 320000000000000, + "onl": 1, + "sel": "+AtsgunCR8dzO9UGUJ6sFtAaX/E+ssK6JNmvAljQG2E=", + "vote": "Rx21vGt6pnixU2g6NS/TknVtAGbf8hWMJiEtNuV5lb4=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "KXILJUKZJEOS4OCPGENS72JWIZOXGZSK4R235EQPGQ3JLG6R2BBT3ODXEI", + "comment": "Wallet13", + "state": { + "algo": 320000000000000, + "onl": 1, + "sel": "6s09aJVaGfPdbWy5zUSyBJEX/EGVvsn2moUOvakQdBQ=", + "vote": "1oTW6ZpIHhQP6xeNCSqHOZZJYrKiP5D52OHXGzbVz4k=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "R4DCCBODM4L7C6CKVOV5NYDPEYS2G5L7KC7LUYPLUCKBCOIZMYJPFUDTKE", + "comment": "Wallet14", + "state": { + "algo": 320000000000000, + "onl": 1, + "sel": "XsqeQcLz5nPP316ntIp0X9OfJi5ZSfUNrlRSitWXJRg=", + "vote": "r+e0lAD9FnNqOKoWdYdFko13pm9fk/zCJkxVVCqzjaU=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "VKM6KSCTDHEM6KGEAMSYCNEGIPFJMHDSEMIRAQLK76CJDIRMMDHKAIRMFQ", + "comment": "Wallet15", + "state": { + "algo": 320000000000000, + "onl": 1, + "sel": "64Xkj7z3rHZT7syihd0OmgNExHfnOLdLojDJZgtB1d8=", + "vote": "um2RrGFmZ5Coned2WSbo/htYMKjW7XFE5h25M2IFsDs=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "YTOO52XR6UWNM6OUUDOGWVTNJYBWR5NJ3VCJTZUSR42JERFJFAG3NFD47U", + "comment": "Wallet16", + "state": { + "algo": 320000000000000, + "onl": 1, + "sel": "9f9aNsmJxXgMZke5sRYFbfnH5fIFclSosqSl1mK4Vd8=", + "vote": "h8ybeZLDhNG/53oJGAzZ2TFAXDXaslXMzNBOR3Pd+i4=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "EQ5XMOLC2JY5RNFXM725LRVKSTOHWBOQE344ZC6O2K4NW2S3G4XQIJNKAA", + "comment": "Wallet17", + "state": { + "algo": 320000000000000, + "onl": 1, + "sel": "R2LzBwBOEoMEcN6j2Pq9F1RKgrLrqnTyW/iT/tlIRZg=", + "vote": "FnP52cIaWwqpJ6dE3KuM3WSGaz+TNlb/iM7EO0j7EZQ=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "3PUAOGK2PIEH6K5JTQ55SCV3E52KSLDPUAWDURMUNST6IIFCH347X5SNAI", + "comment": "Wallet18", + "state": { + "algo": 320000000000000, + "onl": 1, + "sel": "HfTcCIGCoAgUMCHalBv2dSC2L7XCPqPmCmWmxO26Vqo=", + "vote": "knBY5MY9DkIguN41/ZoKvSGAg92/fhw64BLHUw0o1BU=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "DUQR2JOFHCTNRRI546OZDYLCVBIVRYOSWKNR7A43YKVH437QS3XGJWTQ6I", + "comment": "Wallet19", + "state": { + "algo": 320000000000000, + "onl": 1, + "sel": "DRSm3BAHOXLJLPHwrkKILG/cvHLXuDQYIceHgNPnQds=", + "vote": "9G4AtYrLO26Jc3BsUfNl+0+3IjeHdOOSM+8ASj9x7Tg=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "NWBZBIROXZQEETCDKX6IZVVBV4EY637KCIX56LE5EHIQERCTSDYGXWG6PU", + "comment": "Wallet2", + "state": { + "algo": 320000000000000, + "onl": 1, + "sel": "0eG0edle+ejWcS4Q8DNlITgqaKqNvOtCxNQs+4AncGo=", + "vote": "V4YUoGYXrgDjCluBBbBx2Kq9kkbCZudsuSwmSlCUnK0=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "U2573KTKRCC7I47FJUTW6DBEUN2VZQ63ZVYISQMIUEJTWDNOGSUTL67HBE", + "comment": "Wallet20", + "state": { + "algo": 320000000000000, + "onl": 1, + "sel": "cDT+xkHQJ13RgfkAUoNMfGk890z2C1V4HSmkxbm6gRk=", + "vote": "r66g4ULatIt179X+2embK0RgwoLdPEq3R3uTTMfP9Hk=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "DBGTTXBPXGKL4TBBISC73RMB3NNZIZBSH2EICWZTQRA42QKNA4S2W4SP7U", + "comment": "Wallet3", + "state": { + "algo": 320000000000000, + "onl": 1, + "sel": "DmlAnKrkD8lgUB1ahLsy/FIjbZ0fypaowyDc8GKwWZA=", + "vote": "ROBSmA9EfZitGyubHMTfmw8kSiohADB3n4McvTR8g88=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "XKZWM4PWPLZZWIANNT4S7LU26SPVIKMCDVQAAYRD4G3QJIOJL2X6RZOKK4", + "comment": "Wallet4", + "state": { + "algo": 320000000000000, + "onl": 1, + "sel": "74a0jcs/Y/uCh24vej1rb6CHu64yvW2nYrM0ZUVEhMo=", + "vote": "rwkur9iwJbzNECWvELxzFeJpbZl7dpiThgPJOHnRykg=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "LPBKDDUNKPXE7GAICEDXGTNCAJNC6IFJUSD4IK2H2IIB3OAFXLM3RLLIVQ", + "comment": "Wallet5", + "state": { + "algo": 320000000000000, + "onl": 1, + "sel": "V4ldV+IY068YK/h7Wb6aNRIo8pr2bYQg8KDgFd25xVw=", + "vote": "d2KdyajjKvpukuGmM2MxEC9XDEgjjF/Spsevjd877RI=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "MZZS43WEFY56LV3WXEVLROT3LYFLEBZ536UY3Z3J56S7EI3SYYOJVO6YRM", + "comment": "Wallet6", + "state": { + "algo": 320000000000000, + "onl": 1, + "sel": "BoBmrNpHTxySZ8DIlg5ZlINKwTPd/K75CCdhNzs9alo=", + "vote": "N6v+PVEUn9fLZb+9sQDu5lpCpsXLHY0skx/8bWDqk7Q=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "RP7BOFGBCPNHWPRJEGPNNQRNC3WXJUUAVSBTHMGUXLF36IEHSBGJOHOYZ4", + "comment": "Wallet7", + "state": { + "algo": 320000000000000, + "onl": 1, + "sel": "n0LW+MxrO2S8/AmPClPaGdTDC5PM/MENdEwrm21KmgU=", + "vote": "/e1z3LMbc8C4m9DZ6NCILpv7bZ/yVdmZUp/M32OSUN4=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "RDHKWTWXOE5AOWUWTROSR4WFLAHMUCRDZIA7OFBXXMMRBXGQ4BYQRPOXXU", + "comment": "Wallet8", + "state": { + "algo": 320000000000000, + "onl": 1, + "sel": "AGJ4v2nOA62A8rGm4H56VEo/6QdhVVJUuEASUybDPNI=", + "vote": "eL2GxfrIoG2kuknlGa8I6vPtMbpygYflrye0u/hE4Lg=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "UXPVVSG7EYC7YR7PRVOZKWYYYZPKEXWGYR6XHBMSAV6BHKQEVFYVYJBVQI", + "comment": "Wallet9", + "state": { + "algo": 320000000000000, + "onl": 1, + "sel": "P4tRdjhyJ9dSNItTY+r2+tQmPfHa6oBAzIh4X3df4gM=", + "vote": "VHITXAytk0804xXBLBVKGlRAcAcDSZKcR2fiz4HtWBU=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "GD64YIY3TWGDMCNPP553DZPPR6LDUSFQOIJVFDPPXWEG3FVOJCCDBBHU5A", + "comment": "bank-testnet", + "state": { + "algo": 200000000000000, + "onl": 1, + "sel": "r6aMJIPeqUPB8u4IvOU/wihF+sgqJVsjibvsYHVqj1s=", + "vote": "mPB1VDBFOPSIEFhXo7VJRLxn45ylDSRnO8J1nXQf4f0=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "GFICEF3GYRENRQHINLRPG7TS7TUIOARUIN7KWXWFROSG55BWFFRCRX5DAA", + "comment": "n1-testnet", + "state": { + "algo": 150000000000000, + "onl": 1, + "sel": "38qDzZjLPfernXNx7leElHsl39WLXMSgLHbEACeNgn4=", + "vote": "8ITl30j5PTSDjmR26G3/rZL7IQM3cSfqqxnJSZf3X0w=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "GFY7ND6YSM5OGNSMAJDYCO6O75SWQRCYOJHCWOPYHUYCWQFWML52TWREBQ", + "comment": "n10-testnet", + "state": { + "algo": 150000000000000, + "onl": 1, + "sel": "iwwKBjoUUUePkoG0ldxc0v6i1fIhVySn2l2kWwekn2A=", + "vote": "DaZFFz72XkcUIuPXcEz6VxWj4SVjzMpOwpTfO2k308g=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "VQFEAD2SXHMLJ3BNSGYUHRZZWBOI7HUQZGFFJEKYD3SGNS667FTMPRDC4Y", + "comment": "n11-testnet", + "state": { + "algo": 50000000000000, + "onl": 1, + "sel": "ckpVY6EaDInNeU1WLHQQXNsAaQnh+bpFhzNWzw0ZirI=", + "vote": "4N1HJ9R2TrTEzLOyO1vUWPYi6sUcdAwQWoHQNBR/CME=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "6J7K7FIYKWTT3LSOZKYWAMSZC5RDID4CJ24C2S5DBQ5V7YUIHOBHPAO4KY", + "comment": "n12-testnet", + "state": { + "algo": 50000000000000, + "onl": 1, + "sel": "n16osH+x1UIrzDNa7PCZHn/UtheRoLcTBwGRnx0fTa8=", + "vote": "Tj0inLse0V3sQRPw+5rVQTIWOqTxn7/URDzUaWGHftg=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "G5KCM3LSFV4GHRYQBXGWTNMR5XESE3PIRODD7ZLASPIGOHPV7CO7UKLZFM", + "comment": "n13-testnet", + "state": { + "algo": 50000000000000, + "onl": 1, + "sel": "tveXF/sDXqBXQY52IEMuvTeVguKzPfN8GLdKgtv3gRg=", + "vote": "uwQJnVuqEtdGnWbbfu+TTLe++56z8wQCzv22IDioALE=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "XNQAMZMMLQV3TGYGJYYLYZUHP4YNEKAJM6RAMJ5SBXFLS3XDBIUVGCZPH4", + "comment": "n14-testnet", + "state": { + "algo": 50000000000000, + "onl": 1, + "sel": "8xotecjUoo1YVzWME3ib9uh+kPUNnzsFcuHrjxxhjZM=", + "vote": "oQ/iakoP5B6gTTm0+xfHHGFS4Ink30I6FWUGkxRNfo8=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "WXCLU5C6QH6KPVNAHNBGFUMC5JAOQCZP3HF76OT2TH3IAI3XTSPCLVILSU", + "comment": "n15-testnet", + "state": { + "algo": 200000000000000, + "onl": 1, + "sel": "NRxs0rM5dov2oZrf6XrFSmG9CRlS3Bmzt0be7uF/nHw=", + "vote": "R8xKtpYYNuTuTqMui/qzxYpc1m8KpbaK/eizYxVQDaY=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "7NRVO2ABPGFRX3374TIJZ46BR72CCSHKTR6PG5VVYNLUPWUVXGOU3O5YQA", + "comment": "n16-testnet", + "state": { + "algo": 200000000000000, + "onl": 1, + "sel": "IQG+jgm2daCxMLxm/f9tTVrDk/hD0ZhB5dxDQn47BSE=", + "vote": "CGwAHrq3QFFlsP7NmHed+Xx4BwFsE2f6dB30Os75KxY=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "537URFEXANB7M6UVND6WDM75DPRRORDXWFLSOG7EGILSKDIU4T32N4KAN4", + "comment": "n17-testnet", + "state": { + "algo": 200000000000000, + "onl": 1, + "sel": "SdLlaWBe8B1JanMq0Y7T1Z9C8dKhI36MQiSffXQt7Lo=", + "vote": "k4Xr6Bg6VpcY0GKwfr6kI89KqOihmCOToLLuIgFjv9c=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "ZNQXW7V5MISZFOZGVLAHKXS7GLWLXCLRPZTTIAZSTFRZPYTC54NWDZ6XZY", + "comment": "n18-testnet", + "state": { + "algo": 200000000000000, + "onl": 1, + "sel": "TNMELlR1C+r4OmGVp9vc9XlehgD3a0EwfrepuMiDe+c=", + "vote": "060veVAG/L2r2IAjqs2TcYy2cthocqrhgrCCoP5lzZ4=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "G3WQEPSGZOQVVJ2H3F6ICMHRIE2JL6U3X3JDABWJRN4HNDUJIAT4YTOGXA", + "comment": "n19-testnet", + "state": { + "algo": 300000000000000, + "onl": 1, + "sel": "ktbtHTm1mUU5u/VMrOuMujMgemUf496zilQsGBynsxQ=", + "vote": "XHXYdLvxKIIjtlmwHVqxvtAyRDE+SQR1tpzgXoNo5FA=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "2YNZ5XDUHYXL2COTVLZBRYV2A7VETFKQZQCPYMQRBOKTAANHP37DUH5BOI", + "comment": "n2-testnet", + "state": { + "algo": 150000000000000, + "onl": 1, + "sel": "u7lR9NcWfssuMvFYuqCi5/nX0Fj9qBKbE0B2OpRhmMg=", + "vote": "/UGQ/1dcp7OTmguYALryqQYRj0oMWhs/ahAbQTL/mRA=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "IH5Z5UZCZKNAH5OICUGHFEYM2JDMJRUSIUV4TZEQYHRNS3T2ROOV32CDIA", + "comment": "n20-testnet", + "state": { + "algo": 300000000000000, + "onl": 1, + "sel": "Jbcg+BVB6EOTe42U0dq1psQfoFZItb6Phst22z33j60=", + "vote": "8Y1QY+WJIziffLecmnr0ZRGJFKtA3oVALQoD3nVKlt8=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "FFJZOPQCYSRZISSJF33MBQJGGTIB2JFUEGBJIY6GXRWEU23ONC65GUZXHM", + "comment": "n3-testnet", + "state": { + "algo": 150000000000000, + "onl": 1, + "sel": "+K8AsLfvuTEuHMANNp2LxGuotgEjFtqOjuR/o4KR6LA=", + "vote": "SerMKyY37A1jFkE0BdrP+vuTdVn9oOJc5QjC5f98Dz8=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "ZWYIEI37V6HI62ZQCPJ5I6AIVKZP6JVCBQJKZEQQCWF4A4G2QGFENKS5XU", + "comment": "n4-testnet", + "state": { + "algo": 150000000000000, + "onl": 1, + "sel": "SmhBpQdh23++6xC01unged2JU1Wgm2zZ8v5LQiG/VqA=", + "vote": "U2lZo9ahjkKBvcS3qSWsmSx+PGI/m6OtnQrQOH1iuII=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "V32YQ6LMMT7X6MML35KOX4MKY7LXWEH4JETZYKAXQ5RX4ZQQ6FAJJ6EGJQ", + "comment": "n5-testnet", + "state": { + "algo": 150000000000000, + "onl": 1, + "sel": "0yRtE7WSj32D5e/ov4o22ZgipQvqJZ6nx9NX1LdxFJI=", + "vote": "scoN8x6Eq0bV4tBLT5R59jU+8gmHgh/6FX6mfV2tIKY=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "OEFWPZHFT25CSDHFRFW62JANGQLB5WD25GJBCGYTTPHFUMAYYD7SEAIVDI", + "comment": "n6-testnet", + "state": { + "algo": 150000000000000, + "onl": 1, + "sel": "dWChUcA1ONX3iNEvHu9GST67XRePhAv6jd3XWt5clvI=", + "vote": "rTfQ/l3lEfGQtzwjFii5ir2nCLSU+RT+0xI5af/XDEU=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "KCQLDL4GCVDLDYW5PYK7GJTUGHYRJ6CZ4QSRIZTXVRUIUAMDKYDFNUIFHU", + "comment": "n7-testnet", + "state": { + "algo": 150000000000000, + "onl": 1, + "sel": "gNXMo6XiZvuQs2mtomJZtra7XiZHySIOWLuWivu4iso=", + "vote": "okgQcI/L7YDAMOyqrLKs6CUB91k+mMFfMTaEb+ixvyY=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "UMMQNIYQXSI4VBGBXJUQ64ABURY6TPR7F4M5CMCOHYMB7GPVIZETZRNRBM", + "comment": "n8-testnet", + "state": { + "algo": 150000000000000, + "onl": 1, + "sel": "ukzMIkE2U33xKq6LGX19NBLirZNANQAf3oiZtlkn5ls=", + "vote": "HYHBaeVeN0DXYBNjRBuGtZqrBr3bSBC1YDQrv93dNrc=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "2INEY2MWIWIUNQS24YVXKT4M3RIKMEZGTVAOJG47N7EOJE7MKXOC6GJSMU", + "comment": "n9-testnet", + "state": { + "algo": 150000000000000, + "onl": 1, + "sel": "7aUtPCawOYpPYjVd6oZOnZ+1CZXApr8QR4q1cOkVyWo=", + "vote": "kcq1XWHnMrjbv/fvMmzIfGZzDtJtdL7i70lpWZ0kGi0=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "IE4C3BNWT4EYKPUZXGWDOOKBTJFVOYAZKBCWFYRC37U7BJKBIUH6NEB7SQ", + "comment": "pp1-testnet", + "state": { + "algo": 50000000000000, + "onl": 1, + "sel": "C3PdYqoDjrjyaGvZ6M/W0E56Mv5BXdtRwj7+4unpxDM=", + "vote": "8fdNikU3nMNyZb3AZlNTnsfsytvrd8bK2b/dYQgJj30=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "7WCI7XPEMWY6XNWHG2VXGYGDLHPTJ333CZ2WBGGUHCSYPTXPBWYCHZYTSE", + "comment": "pp2-testnet", + "state": { + "algo": 25000000000000, + "onl": 1, + "sel": "l3K4aA15T42mTM+QE7GpOzbOcth6hMljBxna7gSR8IA=", + "vote": "NsjSVQJj4XxK5Tt0R7pvU6wQB0MRKHDwC9F2bfUX/vM=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "WYX5JGDYM7TBTMBBEE2OI4GC4KVCTLB2P67B3PUQQS4OMUERE7NIIZDWO4", + "comment": "pp3-testnet", + "state": { + "algo": 25000000000000, + "onl": 1, + "sel": "YmLs97jSdlbYU1H0PwZdzo6hlp0eyBwJ+ydM9ggEENI=", + "vote": "GeDnbm9KKEu2dZ1FACwI0NsVWgoU0udpZef06IiTdfQ=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "2GJF4FEEPNCFKNYSOP6EOQGDQQCGDXPQHWE474DCKP5QO3HFBO73IBLBBY", + "comment": "u1-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "NHZ3VOL34MVWENM72QB6ZBRDMFJTU6R57HAJALSBERH4BNAGR4QDYYBT7A", + "comment": "u10-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "PTLGEQAIGTDWHPKA3IC5BL5UQE52XDZHQH7FUXRV4S6ZBRR5HGZENQ7LTQ", + "comment": "u100-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "3IE2GDYYSI56U53AQ6UUWRGAIGG5D4RHWLMCXJOPWQJA2ABF2X2OLFXGJE", + "comment": "u11-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "IAMUOCM2SEISQZYZZYTLHKSAALDJIXS2IQRU2GPZUOZWB2NLMFZPJSQ7VQ", + "comment": "u12-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "54GKXNGS7HNFHZGO7OIWK3H2KPKZYWSARW7PV4ITVTNCA65K6ESRKI6N3U", + "comment": "u13-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "5ZSFGF66FIJMMRORTYD2PLDAN67FA2J7LF3IYF4ZKD4DJHLEBYJ76DXGVU", + "comment": "u14-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "DY7K3FLRZTW2ZTYVOC4TCGK4JBL7NSJ4GR4BU252QNAVOCVTGEBCPCSJME", + "comment": "u15-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "JG4JQZNYP2524UDVRPPIMSFCIVQPVXLB5AKHM76VXIIRFNMIN3ROIYW65E", + "comment": "u16-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "7J4QX5DVIXSWBC2NJB44LPPUJXOAJQFMBCOS4EDI3XOE5WS76IY7WFTBQI", + "comment": "u17-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "6SA2WG5XM5Q6SSMBRK3TOHY552A75RVANBQQMKTT67PLUN44T3CJZAQOPM", + "comment": "u18-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "64DCC5CMTM4SMMO3QRTY3EDCHS73KDSNNH2XZL262DBK2LR4GJRETWUWIE", + "comment": "u19-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "TQ2B4MTCC6TARNEP4QPPMCKNBBNXKFTQKPVLAFC5XXRR2SWV5DICZELJOY", + "comment": "u2-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "ATNCIRLQLVZ7I4QBGW54DI6CY4AJVBQBPECVNS645RBMYDTK6VV55HXFUU", + "comment": "u20-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "4LP77VEVJ7QNESED4GICPRBZUNP7ZLKKLEVBRDSKX5NZSUFXPSEA575K5E", + "comment": "u21-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "7D34RBEHVI3A7YTQWOUTCSKNQYS5BDBN4E647DOC6WDVOLHPDPSSBY4MWI", + "comment": "u22-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "UMMKTTPNHIURGX24K7UYJ7T3WBB5J7OYBOQJ5WLPRG3BDYWJAEJLVBNHME", + "comment": "u23-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "EOPSQC3QTL7QJ4AQ2J4OJIJMKQLTMIEETJI7OFWYADIMHDWMHQ6MWCTUMQ", + "comment": "u24-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "XT3AVLURALOWTIMGZKB37J2M22NUQCRXTL4DJZHSTPCGLNQKVL7MR3MKFM", + "comment": "u25-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "WS63FDTLLYHC2NS7NXTEO7RPLNMAFM2D2BPJLTMAQJWPR2JCNYTTRMSOAE", + "comment": "u26-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "P5S5GGUHOMVOKWOZPJO74MBYVRXQWDBW6AOTHQZVKJKFGM7VBU6CNR4ATI", + "comment": "u27-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "PXVAI3MUYH4WWJXEQP7XNH3YIMO5ZBAFJWYUL7DOGPAHALE4K6GZBF4THU", + "comment": "u28-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "VGTKWLFANSULZAFDGBONHF55VVKE4V4F63JRDB66XM4K6KCQX6CL22WPRE", + "comment": "u29-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "QB2OTQ6DKUEJFP66A37ASIT4O3UZUOX24DAMWU2D3GCBDIYIXSIDHSXO4E", + "comment": "u3-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "4F6LA64ZLFN33ATWJ74UPAX56OLTXPL74SS5ATXUL7RGX7NKEFKMAWUQYE", + "comment": "u30-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "3JBNL7BZECXKYWZRPWETNL65XEYMAHLC6G3MZN2YMPFL3V7XSDXZEMBHVQ", + "comment": "u31-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "4M2QSKTXKPPZMNUAQ4UDS7ASMQCEUE4WTWGV6AM326425IJ64UNZBCIRGA", + "comment": "u32-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "J37V3LXHPRRKBODXNMNYNUJQIICCFFC4O4XB4YJCPVUAVZNOUG5DWDCEIA", + "comment": "u33-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "I75JBQHNYEYM3J742RBVW4W6RR3YY3BLG2PKO4PXYLVNEX5L646ASDJOOY", + "comment": "u34-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "ZHEIOZ7E2BEBCCKK5QM7DCZAOPTTONMQWHNJ6FOLKBHY466VON6DCZERD4", + "comment": "u35-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "4QMGP4C6OMSCNJI25H7UQGBFHRHL7KXAEQI57JNAXEO2EW3VT6D6LODT5Y", + "comment": "u36-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "KRED3JOLOJE3SLL5NGHAWSUGEMHCYJLD6PX43SIJYN2GC6MS6HPUPPO2LY", + "comment": "u37-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "SVFLDISKS4PDMJKOB6DVVVN6NQ776FHZMGWCOUQVQCH6GXTKCXIHTLYRRQ", + "comment": "u38-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "7IWGAPZ4VWRZLP2IHFSAC3JYOKNAZP6ONBNGGWUWHAUT7F23YFT3XKGNVU", + "comment": "u39-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "O2QVZMKATOIEU2OD4X42MLXAYVRXLRDKJTDXKBFCN3PCKN2Z3PUS5HKIVA", + "comment": "u4-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "H2YN73YPRWKY4GT744RRD65CXSQZO7MK72MV4RDHTIBV6YQUB2G56TVF2Y", + "comment": "u40-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "WGUAFWHRRX7VXPO3XXYCJL5ELO6REUGD57HRMBKTALT2TTXOLSHNOUEQCE", + "comment": "u41-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "RYHCD7GPAEBRV657FJJAG2ZZUDVPR66IU7CA5Y7UDMYSEEIWR4QDNSPLYQ", + "comment": "u42-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "BKTO5TKB4L57YWTZKQBOQ37EWH2HVXGJPXP3L6YSYOAWP3CYYBWLZ2PHTQ", + "comment": "u43-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "FL7LZ57VQQNW5NDJK2IKEAHIXRTB7VFBJEA2MIAEK3QVZPIBGLYW7XSZDY", + "comment": "u44-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "MXXQXZS2TAMIULLXXLX6MM6AHJAOQLHEIB2U3LR4KYKK7ZKRVUSHTU62QA", + "comment": "u45-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "UGOPPKTJQ2KPHU5I56733IMT3B7ECT5O44GW2FYX5SNDVIEDG72Z5GC5IA", + "comment": "u46-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "Y7MGWPRBHQN2PF3I2A3RWCQMVA42VR6FJONJ3W26WGKE4KMCGCVJIDLHEY", + "comment": "u47-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "NNFIWU43AUEZIUIQQECDXM3HRPUEJMPPZLXTM4ZFJKHWSZ2FEGCVMMJUBQ", + "comment": "u48-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "RN3HTSJKSUO6OECM3OPDFQQ2FYZWEY2OWAQGSMQSGY4DI7JJ4HBV2OIJJU", + "comment": "u49-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "OLYQUMZKLYDX2FVHECURBX4SRQSLMIIWN7D7VRJG7B6DS3IU6M5WYVNAAY", + "comment": "u5-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "PIG4P6JA2WDG7HBBR4FFDMVUCUD5Y5CTQ3K3KY34Y4AMT3CWEMVIKQLZZI", + "comment": "u50-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "QIDX47JRS37LRIYVY744SV7KTFGYXY5ABEK2VALNZCMN2H4FBLO7WWKYRM", + "comment": "u51-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "VQZCPUMOYIGCXOK2AK4XYYLWJNRBLS457IL4OSBKGVBHFZ5QPLTCUOTW4A", + "comment": "u52-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "WE2AIYHXI2LHABITCPTZRBTLFT54HPL4MKIR4HTASARNGCCZLXXDE67H3M", + "comment": "u53-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "HAIGM3LXXVKDCGCNQELNOBFZKP6C4A2ZY464F4TB7GWSVDN6I4SI7EOZUE", + "comment": "u54-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "MVZLGPXT6DZQIORE4PIO7NZD7QMJOZZZCOEVPZ3EQX2V4WG3PFU3BXUGDI", + "comment": "u55-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "MB5XJGVVKQU7NSEWWP65QW6H4JVEQYPA5626J4NGQP2E4BUMXRTEGW5X5Y", + "comment": "u56-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "EODZLNWFSRYZKLLF2YAOST2CYQCBRQGXPFQJLDW4CCMYFTYKBSWMF6QUAU", + "comment": "u57-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "LPAMNP7GJC5CNOMWRDII47WWYPF3TOVEIBDSSJA6PKOCPZ5AKRUWMIU2OM", + "comment": "u58-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "THRYS4MAIMEKG7BSAZ4EOKCVUJ7HA6AOCTK2UOKDGZ4TF7Q4BRVTBOUSYU", + "comment": "u59-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "7V7YITMPBTJ3IHHS2D35PVWRZGNFYWWQVRMTI4QP2CBPSKNDRGG66W2HFQ", + "comment": "u6-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "FHA2V46TK5CW66HQPOMLTH5PSKX2JX2IWLWZIYJUZ2RI7SK6HSSBTJBNHM", + "comment": "u60-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "7EJAXCVH7XLWDCWSXID4FNZ6T2SZRA4S7XIZOWA74ITAB272ZF2T5LSWSE", + "comment": "u61-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "K5L3YNZPU6SVNJOWAOKULCWBPIBNMR2VBCASVI4NWDM2APZ6GL36DFDR5Y", + "comment": "u62-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "5BY6RFBNUYHBYH4E4AWVMEOMI7YFKX7X3IPB5GRGAHH4BSXHIL34P3H43A", + "comment": "u63-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "BX2UBG5VCT2ASTGXHVG5NS6VVCYVB6GLKBN4NAAN7ABSTP7BMYCX2T2WEY", + "comment": "u64-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "37JPBYKXMWF6DO3FFWW53LBQCG636MTC7WG6DTRAPDFVXUIATFOMFR5ZLQ", + "comment": "u65-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "ODSPT3NISYMGEE3TJ6U6JCVC44L7DUCPHIV2QMPPRKBWJDALALGVCAPMRE", + "comment": "u66-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "CQA775B5TCU72Y2BNL6VCURBVJE45QV77RXHQ5KYRMMP6NCQ5BR7XJRYRA", + "comment": "u67-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "3Q4SYOBDOAVXUUTKBXEFFSK3BQMUQX5ORZPDA4PHB56KJJONPFFJ7YZ6HU", + "comment": "u68-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "K23ME4QVDHSJWMGUHPGCL2OODAGBHIBW2KGYLLIR3UAEFD5ZW2KFB4WJ34", + "comment": "u69-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "UD2OLL24RFDFMAKK7CCHKFIABPAP7ET4CYQUEYCJVGEIEJUAMDOGJZT26Y", + "comment": "u7-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "KYXWZODLYDHTDMRUBOGOEV42G6H6KJ2JSBFZBP6XNWT42A6QEMEW23JWAM", + "comment": "u70-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "V464X6D3XJVVJ372FFC2NBBDZLBNQA6H55J57WJMMSNOLHOJQ5UF3EUGNY", + "comment": "u71-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "K27ODRPQARZM3236D2XC27QIV27GO2MUR65RGAJKO7UACIFYHG5QKPOCFU", + "comment": "u72-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "FT3JD6TXUZOLOMN4O5CFZYSIHR4T5XJIF2YNV6WGEORNO2X65QW3VUP77I", + "comment": "u73-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "WOTGZ4WOQ4S7YWVAOQ52GGOQPYQI2M7EPZENR27AOZLYFIEJDI3RYFB7OU", + "comment": "u74-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "46MGTGNCTAC62NVNAVXAGP7PUJJIW5GXYYTSUDURCBSRZEDLGME7ICGE4E", + "comment": "u75-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "MBTXWM5M5XQNUEKLBTW7GPU4LFPUETQQPVUBRCOA7FQ47H4J727NFRKKQE", + "comment": "u76-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "4MCTFKPQCY25X6QARHGVD75OYUMQAAU5QLWCE2EM37NWOS7IFJSABMGKBI", + "comment": "u77-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "PY6K3OGCXZVYQYZVA7W3MVZCAU5AFAWQ5J5THILXYIBYCKCGH4ELFU6TNU", + "comment": "u78-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "4ABEMED4I7UYU6CJSLWYQXQHOK2XCQ443BSHR3SL7QJGXNYJ5QCYILSSNU", + "comment": "u79-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "AXBINC5KA3I6IF3JAMKYQU3JLYTA5P2U4PUW3M4L53NEBNCRLHDHHOT2HY", + "comment": "u8-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "5SXA2C6CGZ63OYDY5G4NFLIPJLKCZAMQWLMD2CBNSHUEXVS3ZYHAQCI5TI", + "comment": "u80-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "EVP6MJIZWN6EE64TKEI4ANETP25MHYVXFWESU626TFA5VDVC75KSBGAA54", + "comment": "u81-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "QAUV22GPBAOCO2JGAJF7U474S5SKXVWSZ7KG6P22P4MH3GNBGEJXAVDQLM", + "comment": "u82-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "4FOOFGIWV4H7AXTEJXV2C4ONZ5NXAMUDKJSZDLSKACZ4JA4SWIU6UTLZAU", + "comment": "u83-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "ARUMRBUW3HBQXE4QAL25PPVWAJSKGORTNUIOW3VA5GAMDECOVNYC7GJJS4", + "comment": "u84-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "EJGCYTFUZPJDL2JBZJFQXKZIYJUDB7IBF3E2BH6GXWYWXUHSBCKYFJUKSU", + "comment": "u85-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "FJMEFROCSGQ7C7IXMAPUST37QTQ2Y4A7RMLGK6YTUGHOCLOEL5BDE4AM2M", + "comment": "u86-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "4V635E2WOGIKKWZ6QMYXDWQLYTUKRN7YAYADBQPETS75MKCR66ZC5IEG5M", + "comment": "u87-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "AFJB4HWJLTMMA45VZAJJSUOFF7NROAEEMGT4Z3FQI5APWY472SJ6RNBWU4", + "comment": "u88-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "BYO56YQOSRBUTNPXYO4XDMG7FU7SIP3QGVKAYQIJVJ4UIIMBRG3E4JMVD4", + "comment": "u89-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "FQJO4LDTXEVQ2ZBFYDEAOYPQQZCZTMASMSXJ6V7LBYKOTFSCBUKKIU3DXA", + "comment": "u9-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "WUCEVFNJGUNLMNG2AJMVYJRGQUFXRAFVX2ZRT7AC47WS6IRHPXHSUZ4NUA", + "comment": "u90-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "5J5Q72IHCVAK5NE54ZI2RUZUF3HN2EAQEYQ674H3VX4UUHBMRYAZFRQDIY", + "comment": "u91-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "2LK2SZ3L4PWUXXM4XYFFSCFIV7V5VQJUDFVK7QXK6HJL4OUQKQLWG77EUI", + "comment": "u92-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "QUWHMJLFQAIIG5LV7NK5VNESUUW23RINBSHKKKQDIV4AP56RSTYSNZHDRQ", + "comment": "u93-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "YJEGUEJ2UW2ABLO6XI5QIHQID5ZKUDUDQPHQEN7MH5SS2FLZ573CHRHCZM", + "comment": "u94-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "XOUVBGEZMDVYPES4MGTAEBYU5O6LOCOH27ZJ3ML7ATWEU63N6IWW6F4BLM", + "comment": "u95-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "6CFS2YVK2IMVVFBGGHSPUQBIKMNWRRB44EIUUB4EFXAL7IOJXAHRGXKAGA", + "comment": "u96-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "W5ITKFRKK265A4WKF7IRCZ4MCC7HM3INCJGKPPH3AEKDFYMOJJ4FDLQWYI", + "comment": "u97-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "MBMU3IODI6OFX34MBDMNTD6WSVA6B3XLDVB3IHZJQY3TZUYBPKRNFTUQSM", + "comment": "u98-testnet", + "state": { + "algo": 2000000000000 + } + }, + { + "addr": "CKNVTB7DPRZO3MB64RQFPZIHCHCC4GBSTAAJKVQ2SLYNKVYPK4EJFBCQKM", + "comment": "u99-testnet", + "state": { + "algo": 2000000000000 + } + } + ], + "fees": "A7NMWS3NT3IUDMLVO26ULGXGIIOUQ3ND2TXSER6EBGRZNOBOUIQXHIBGDE", + "id": "v1.0", + "network": "testnet", + "proto": "https://github.com/algorand/spec/tree/a26ed78ed8f834e2b9ccb6eb7d3ee9f629a6e622", + "rwd": "7777777777777777777777777777777777777777777777777774MSJUVU", + "timestamp": 1560210455 +}`) + genesisBetanet = []byte(`{ + "alloc": [ + { + "addr": "7777777777777777777777777777777777777777777777777774MSJUVU", + "comment": "RewardsPool", + "state": { + "algo": 125000000000000, + "onl": 2 + } + }, + { + "addr": "A7NMWS3NT3IUDMLVO26ULGXGIIOUQ3ND2TXSER6EBGRZNOBOUIQXHIBGDE", + "comment": "FeeSink", + "state": { + "algo": 100000, + "onl": 2 + } + }, + { + "addr": "E6JSNTY4PVCY3IRZ6XEDHEO6VIHCQ5KGXCIQKFQCMB2N6HXRY4IB43VSHI", + "comment": "Wallet1", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "KsJHGwqm40hKgq91j3e5/RgK8XDiWloeN8FfYB4UKHs=", + "vote": "21YWFk+gtv9AP0vXPXHubfXSWwstKfbKwIIPOYB395I=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "SEMQ3EH6AHVCXZDHCDH3OYBJJGGLHDUFGYVCTJUUJMLO4J5F4E6AIXH3R4", + "comment": "Wallet10", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "kRtZiTWtKjFbx58DxEllyZ0/7mQYjT4gdilgNLEEcIQ=", + "vote": "QN1+DlX+2JE8O0NiFTSH+50sXpTYT79HVIYf0YRp1P4=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "BIKIMTXSESQTR5BMPELZO2TFASGCGSXZ2ZA2MSHEUYLJNNXUGJCX6JV2TU", + "comment": "Wallet11", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "GVGFHDix++jaHjeVqHQd2tvlkaJzPpkFOqM/xOV8HEs=", + "vote": "Qb20Au5yVWckwkgLS1VrCA867xrBwMwpWvvdVeOgbfE=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "7ERQUUQLQ5K6GVYVAFE25Z42OQMI5JCSBOWORHRT4GMSC3GZFWCOBI67YE", + "comment": "Wallet12", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "kBuLytQUQIp9NrAyYbXZk4L9Qf7voFh7B3t4zsdX9tc=", + "vote": "SOB4dO+4R93RvzXZop17kn4wS/YjnmELqQapQ0PDFZM=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "MIZXEAYWBLOMNXCU52OF6ZTYH7LP7W47SKLHIGKLTGEXJHQGD7RHGMUPQQ", + "comment": "Wallet13", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "KqpOt2cIsDwGbnNhzRzET4/UR0NhPhKSCG6g86ewFQA=", + "vote": "FIwKS4PBidGgLmAqYMPlxOP0H2LlCF9GC9lWE8Jl4As=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "77FPBCDQOMSOUWOY47HWPGOKSTLQITEZ7QR7GU4TOV3KVIFV2YS3WQG2OI", + "comment": "Wallet14", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "M71rgLk28vIZgk73ag1K+2cH33J9viIzXnsrbISmc4Q=", + "vote": "B7O1giNLhEIJWCcXUmZ9X4j/dsVw9Zm5dmXDbn+3ack=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "JDTPB2DSAH42CRL6SKZ3BZ37WIGCHAYRO6DT6PBJNV47566EVQLEOINXEY", + "comment": "Wallet15", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "sj1Ap7Wz5GmfQfAJTiv1+eoL0q/2IsER14jxMtxsQok=", + "vote": "P1igemO61V2fz9nb4jaiOaFbpnUZPhKuyNx3j09swSY=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "H6BA5HI7TTKCP76QFTO4EO4MKTOI6XM6R75QRZLGV2H4VAOXIMGCXGIH5Y", + "comment": "Wallet16", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "RjsQgzT6eUx88673bdCQm12TmDLi93v92s+E3TK1XWA=", + "vote": "tQtvPw70hZDbrROzsSz27UdN6EIPj2dQFTtzsY6pCVQ=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "FCHLCNFIQ3L5QELMQDADI6BU2ANK2A2ICKXXG7ACJBNEAB64J7UJUPJHJE", + "comment": "Wallet17", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "22Dvgroawrb1g7LotUhbTOV/7g1Rn410I1X8CmDeT0A=", + "vote": "SGXiNwAfMRI00SYVpVClqTNJcwBrQF3X77DsWSAO5jo=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "LKH4JTUIOE6I4PH4HVJN6PYZ23WGGWDVJGHM2YXI6IYV5TEECQSTNKMQ2E", + "comment": "Wallet18", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "uzGW1wXnBiny4kB4JSpEbCVQvKE8BeO+/o/pdkgfFaY=", + "vote": "ahu0YwixBhpEc+Xvw5oqgwDMnemXHWk8g/Uf/EI5nmA=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "QFH2SS4MGPFNUUDMNLKIUKX5HKAZRXT765WH7WTUBAQNEM7IJAVKAE6NWM", + "comment": "Wallet19", + "state": { + "algo": 400000000000000, + "onl": 1, + "sel": "eE4Wcuz8VeGclgU99Q9rDpehNR+yP2afFYuDAxb/Ebo=", + "vote": "4wsLw785udvYCpn5jzdLqcEHmIQIbRPmbyPt4oTLD2U=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "6SKIRCMLFSSY3EJUC6QGFM3TFIJH72ZYUHX7GCUBDBUBYCAHJBJ5PWB344", + "comment": "Wallet2", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "j7WaD43EwoxM5U18kMWn5HfIdn/ICVuMmsj3O5EbFWM=", + "vote": "jAuOIqeQH81zZs4+6YBircvi63xXMN1MIABcOiuzXXs=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "OYD4RZDUBQBVQL4WEPTBVLU6YC7HWHDAS4MMTLQ643Q3O7JRQW6FTWXIWQ", + "comment": "Wallet20", + "state": { + "algo": 400000000000000, + "onl": 1, + "sel": "9LdCYfMPglvbManNcmVLztu/yPhPPkaRaSKMzj5E24w=", + "vote": "ZbN0ELPvL5QizuLvVc7oInsju+irjDRcdYDNnKJV2bg=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "SSKILTKR47YW2IXCJCNUK66ATVLMU53IV5SEC2IXQ4WEPV5EKCAVPCEKMA", + "comment": "Wallet3", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "4cxWnAD3DoIel3OuRqOpYgtWP7J873g688P4pXPVhBc=", + "vote": "keW3j4bRW0uvd6ofaDNUuMBdz/v/eWZsLhdFIOlXWCg=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "FE4FDICQLO63S33NL75GBDKAKPGX7B3UMRBBSM5V2JYO4LCLRSE4HQ4YJI", + "comment": "Wallet4", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "AILWKIbgQzCSPaaYAMFek1mu6uWYqm2QoIvP97h9wFg=", + "vote": "YXmnzyrRI4c16DauzENAK9bOqatN7qjLAbWUp0L6qXM=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "2N3Y42EA3OPXCOFPKRH4HFOF6FX7QUT45A7CZH4WXGGQDDYSHP6NZGNL24", + "comment": "Wallet5", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "lOU6PeVi+AT4lc2tj90AoNQyw3un0Smzk9sOpKCWI1k=", + "vote": "PztZkAup9rAMUreL+HQXCy7mbM39PZ5xl+YiTT4L9YE=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "UJ3HDASRQG2QRPZUS5TOESFIMIDB4ELNE7DO2WGO5LJQ2KT32VGFGGCQKA", + "comment": "Wallet6", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "rPMShsyg18Ho9JOQQjcG2yhPMBM0JIgZsr5ndy+0buo=", + "vote": "TFVn1TMHAmcM+St5QLhaFG/dlSGqqlTdGjgjcfSax5M=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "QBQ5ODCH6PWCB5TFQVCOFLHSJKN6NYYB3E3HPCJJTTNRVM5XD3B3KPWFJA", + "comment": "Wallet7", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "cxhpl3wBnc9bVW6G5ePiya8nzPvUUaprIoTWvTXJmpY=", + "vote": "W8tVBEdWGDArQFj43qXDw18LRJKaGjgZWUv54tsus+A=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "WILFZPBQMJ7GYSPNA6JPXIZZUZ27XWDJ2NKC7WIODXXGOF73C4TEDEHE3U", + "comment": "Wallet8", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "SMSZnIm3GSD1Dr5AEq5ksxxCIqPIrn19WSDNtJSJuiM=", + "vote": "absDJtKafyc4KbrB1GnLcFGv8xQjuqB46gPXXTpIsTU=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "4LSVIF5EY2BQZ6GENL6GT4SQTKX3UVDTBDJXFESGY7GI7FXHZA522KMG5I", + "comment": "Wallet9", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "h3aKVPyQSpXAI2zcDD2f1CCBqf9fQd4Z+oJjQ6erFLI=", + "vote": "nNfIrFtpPR6zo4hH6F7HCMA44PDcNOEWtDVRf7dnKe4=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "IDUTJEUIEVSMXTU4LGTJWZ2UE2E6TIODUKU6UW3FU3UKIQQ77RLUBBBFLA", + "comment": "bank", + "state": { + "algo": 100000000000000, + "onl": 1, + "sel": "6Rax2zpOehfDXHyyvMFJwc22A//Pm6rxW4MiEBGIwog=", + "vote": "5JbOqqGn1Ypw+uH3t2i61DcjWYo1AslT0jyOGgcVC6Y=", + "voteKD": 10000, + "voteLst": 3000000 + } + }, + { + "addr": "PNWOET7LLOWMBMLE4KOCELCX6X3D3Q4H2Q4QJASYIEOF7YIPPQBG3YQ5YI", + "comment": "pp1", + "state": { + "algo": 50000000000000 + } + }, + { + "addr": "F5FALDSUFYO5LQU4OQY2HPZTXSUPRHUAERZ7IDG5QCBC76AOHEPK2VUJ34", + "comment": "pp2", + "state": { + "algo": 50000000000000 + } + } + ], + "fees": "A7NMWS3NT3IUDMLVO26ULGXGIIOUQ3ND2TXSER6EBGRZNOBOUIQXHIBGDE", + "id": "v1.0", + "network": "betanet", + "proto": "https://github.com/algorand/spec/tree/a26ed78ed8f834e2b9ccb6eb7d3ee9f629a6e622", + "rwd": "7777777777777777777777777777777777777777777777777774MSJUVU", + "timestamp": 1564572341 +}`) + genesisDevnet = []byte(`{ + "alloc": [ + { + "addr": "7777777777777777777777777777777777777777777777777774MSJUVU", + "comment": "RewardsPool", + "state": { + "algo": 125000000000000, + "onl": 2 + } + }, + { + "addr": "A7NMWS3NT3IUDMLVO26ULGXGIIOUQ3ND2TXSER6EBGRZNOBOUIQXHIBGDE", + "comment": "FeeSink", + "state": { + "algo": 100000, + "onl": 2 + } + }, + { + "addr": "ZQ45INL2IMX66LP4ZEI2WNPESMGQKKVQADISKXNXRJKNXKJFKANOVMRYCQ", + "comment": "Wallet1", + "state": { + "algo": 300000000000000, + "onl": 1, + "sel": "jx49tNyOGVz/yKkmjmJIFzta5SyeJxyYD7znjiwwlRs=", + "vote": "CG6x+hWIFGJcSZVFuuRvtDD0CF1SCpeO4Hxe4YTVojQ=", + "voteKD": 10000, + "voteLst": 10000000 + } + }, + { + "addr": "FCEV42VP5ESVQY7NZT2B327NXE53HHND5TCIXYRIANBEH2PBOD3W4EQPTM", + "comment": "Wallet10", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "HexL5RAyE37UC/fd1UH/6Kwbomit6MkLtpe1Pi7USbU=", + "vote": "bTqiNA6+GWmeLQjdiuKvMpiBEFfh/SGRTUewF/BPzUY=", + "voteKD": 10000, + "voteLst": 10000000 + } + }, + { + "addr": "4HT4YQU2WPVV6EYPWYJ3L3IF2MOXQEBMJJOWMGVCBQY2TFFOB5QXMV5EPY", + "comment": "Wallet11", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "hP67tzuIoZrXYO9Ln4I8ce/jYtfhpEaqAFoP0Gk4mSk=", + "vote": "lA0se5QSffyxIjKlMntM/0ge5QtDaLGnwI/0GZC3BfU=", + "voteKD": 10000, + "voteLst": 10000000 + } + }, + { + "addr": "VKAXPXHZQX5Z6ECNEDV6RFKM3QANXTGX23Z7O3PPRLCTQGZ4WHVCYJB5X4", + "comment": "Wallet12", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "N5ivQdIOTRHAuaazCPwqGB6R0vzs4oE5C/HX5QoWJ1w=", + "vote": "c2KiifMNoLuCpEnvLL97c6b9YuRdqhKntXyQizV7rQA=", + "voteKD": 10000, + "voteLst": 10000000 + } + }, + { + "addr": "HWNVDWBYNO42ZEH46UVHV26HY5ABWZ2EGY5RY4SZY5SGPGMBCWPVP4GRHU", + "comment": "Wallet13", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "lBU/qgAYZFI4HOWNA4ENWjNyS2QMNdcuh/tgeJgfuBY=", + "vote": "+3YbNs94emm4vUzQm+rIYcKwdF5PuHcnKL5ork5pUZg=", + "voteKD": 10000, + "voteLst": 10000000 + } + }, + { + "addr": "AK3JQTFREJMQQXKYY7DGDGMXVRDUKK63DKNXJG3BTP6EMLZ62JD455Y5TM", + "comment": "Wallet14", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "zIJa2IwZb5wBeXgEDN7oI9Z8mgBXySRJYulW/3klDqQ=", + "vote": "bOLmPR2wdEohQfA3OzEr5SuJyZfsyCQoOS4kxBIhO8s=", + "voteKD": 10000, + "voteLst": 10000000 + } + }, + { + "addr": "75DBTPH3U4NBJ5IYLVEFSBVN3PIRF3OGBKTSQGJFLQBFN6MYXPZLDTQ4QI", + "comment": "Wallet15", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "gjGwMoylS7mmmn0xcO5s91X6jyqMvyfOQykBTUqdSZo=", + "vote": "SeNznA406oiGF/8CL/SUNZuQ9Er6o8syd3giX34jRmo=", + "voteKD": 10000, + "voteLst": 10000000 + } + }, + { + "addr": "5K7GCWCI4MT2LWAWFP4WZUHU4WNB6AWZ5NEJCX2DSIRBEYECOW6WJSHVME", + "comment": "Wallet16", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "C6eOqo65UBvVkzp8UpO7Wp/v89rfIChsHR/2C5nPcSE=", + "vote": "87ZcLZx04HFyf6XUKkm9inOdYmCrnXyWw84BMBBwtUc=", + "voteKD": 10000, + "voteLst": 10000000 + } + }, + { + "addr": "ZJMREOYU3USMDCQDMWVRECY6JGZD6LC44JTY4TC55ZYTXTQUBFRBEIPY6A", + "comment": "Wallet17", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "l77BpNvhHEEiAjY+RNi8ht62+qgb90DXNqKzB+4uHew=", + "vote": "9iuQKJNBXjiKTRhPHPYqEJlmLo0g04in4ABdo7elkFA=", + "voteKD": 10000, + "voteLst": 10000000 + } + }, + { + "addr": "XLI4GVZKYHXVK4MU2YRQMT6TZVCB772NLWW7TEGQIGCH4JXSZA6PARNBVQ", + "comment": "Wallet18", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "gAweEod0UC6CN1fjFt/ZFVbyw2kON3hcG5HSPUY7X7A=", + "vote": "1/Vyqjf5sHiZrq5StV+lOK8I0NZCSUbQ5p4QiCFW4a0=", + "voteKD": 10000, + "voteLst": 10000000 + } + }, + { + "addr": "XLQBCY6TK5JSDOIMC4U22ZQ7O35VHJS6QWQUQY6KFV2HD4T3QXCNOEZHMY", + "comment": "Wallet19", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "P3zYirarJ4QIMGz2h4SK6rCD5wJMrGPtfIop99ZTCYg=", + "vote": "J3kmHUeU21FvOP46A9OB1QUamatT32oBy2dmZQFVfi0=", + "voteKD": 10000, + "voteLst": 10000000 + } + }, + { + "addr": "LVFCXGJ4H2QXLXS67H7JPQ6HDLSIQ4UBDJ7RNWKI6UUG4QC3GZX53R3BLA", + "comment": "Wallet2", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "VyZiFcfly5SCIZhs79IbxYbfYw8od38ecs6vm8UH760=", + "vote": "hGNbwxyqnTEq8rw3d6Ezt4kYDVsk49X4Ousi6z2MPaU=", + "voteKD": 10000, + "voteLst": 10000000 + } + }, + { + "addr": "2BMHSRKHDYBJTW673MLERUX24MOGSXOPFWYLMAVW3QCFRNRB4M6ZDNAFCI", + "comment": "Wallet20", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "jHCe2j1mpV9GWRqdhHt3NtZpppVbkc1o5jUaykpdDkw=", + "vote": "nw8oxQjT5IS8GKBWucYtKQB3kY3ywzgMjyY0+6Xi5+s=", + "voteKD": 10000, + "voteLst": 10000000 + } + }, + { + "addr": "3LGSIMLC44UB4NQHSFVM6ZDE7BVJFJVDVYESZZ4SJU4EYDZQV32CIH6JM4", + "comment": "Wallet3", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "jGQIdnRvYaokSw7iRG29AdSR81OFqgdnU3sFvd/g0gI=", + "vote": "3bu4xBXbFh/Bpqtdwg9eqlUXGa6nkVE6QDf2gSr7kng=", + "voteKD": 10000, + "voteLst": 10000000 + } + }, + { + "addr": "UXECRB7D5NDQEKVK5ISA5FUKPX6UC3XFI5JEJEYV3CUHJRMEYY2ZBUGVHI", + "comment": "Wallet4", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "F2GF2fUODTFsk6NyGAOYDAsS2pdeqxJ0XgJT4C+xh50=", + "vote": "SLw4LA5EdOiUHhQ2r99fsKMytbJCQZWaUxuDrgigyLo=", + "voteKD": 10000, + "voteLst": 10000000 + } + }, + { + "addr": "IXPBHLMKILBRSG3ZTM34UFORUQ2XHTZMEXK5LODNZTS3M3IPKPE6ZOQADY", + "comment": "Wallet5", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "KqUKfEEC7pkR+4K4Tnp+V+Rwu/yXAbuAyXlU83ZGPNA=", + "vote": "7vyFvIGRixNbisSJW23yfMW2wE4xRRm41IlgzaZDgjQ=", + "voteKD": 10000, + "voteLst": 10000000 + } + }, + { + "addr": "H5AEMBGBAVVEZOLGNX22OMNDJLEU7PG5VSCBNHB46PKRBBKQBZWA7R2DNA", + "comment": "Wallet6", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "kthetjPfSMTOa04Oo3ZQ7GGfXNNE4nCNC8tYVW9qFNE=", + "vote": "WQBnwqMm6f9+GKR0Sz+X6ej65KCkB2I971dYtuoG7tk=", + "voteKD": 10000, + "voteLst": 10000000 + } + }, + { + "addr": "436JPU37D2J5EGLMQCVKU236ZAMJM3XUXGGK35MZ43P3LAB3AWBZS73HME", + "comment": "Wallet7", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "o8RSgaF1leM7Mdux9hk/cxypO4XMEZRZjrw6R3JqKZc=", + "vote": "e44SozE14TV9B3Raam7B2Fm9rxRH9O4ruRJmdErr55w=", + "voteKD": 10000, + "voteLst": 10000000 + } + }, + { + "addr": "TP5S4EO7CBRZMXSNMNEEJ7232DCRXHK5YN7W7SKA2W4A2Y5JBFFWCKJJKU", + "comment": "Wallet8", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "r/wqmzTQaVYnPBZPGL8W+5i/FYqNz0/1FqewGAyRiiw=", + "vote": "XxrwQh/SE72Q/IA18YNEUAnujR3V+ntd94S554HyQBw=", + "voteKD": 10000, + "voteLst": 10000000 + } + }, + { + "addr": "DMOZSZ3TE65RR5UX2KLDD56LGI75W6LEVOD275S56W2AYCGDD4UYGU4URM", + "comment": "Wallet9", + "state": { + "algo": 500000000000000, + "onl": 1, + "sel": "+LIJ3xi3SuoSuAK/RKirPUMFNltJucuFMa9H9KxB5vQ=", + "vote": "+irtKnZKr1d4G7Fqvc7i4QYqN/NEXunPzdneHKboMUU=", + "voteKD": 10000, + "voteLst": 10000000 + } + }, + { + "addr": "RGKUXFHCDDGN7EJHSDF533KVTCS5EFHAR57SCUV3RDOTQKIXAFRB6ME25M", + "comment": "bank", + "state": { + "algo": 100000000000000, + "onl": 1, + "sel": "SKZZJvgPQImzzn9Ft5e7ZWitXR/1TZwk2aaBM35YcIc=", + "vote": "jB8AMuWZn1m5go/dIVzB6DFIV8hD7UpcLLV2XGjK8FM=", + "voteKD": 10000, + "voteLst": 10000000 + } + }, + { + "addr": "VF4LPDP2OCQIN4Q2PJ4VZV725NBHMGUZZC35SO3EHX7XUB7SRMLFNRHVB4", + "comment": "pp1", + "state": { + "algo": 50000000000000 + } + }, + { + "addr": "ZJOL26NAJMBNMAOKKTBRZTFAPSODASPKV4Z2A4EYMNMTZVT65CEAIBFTNQ", + "comment": "pp2", + "state": { + "algo": 50000000000000 + } + } + ], + "fees": "A7NMWS3NT3IUDMLVO26ULGXGIIOUQ3ND2TXSER6EBGRZNOBOUIQXHIBGDE", + "id": "v1.0", + "network": "devnet", + "proto": "https://github.com/algorandfoundation/specs/tree/3a83c4c743f8b17adfd73944b4319c25722a6782", + "rwd": "7777777777777777777777777777777777777777777777777774MSJUVU" +}`) +} diff --git a/cmd/goal/clerk.go b/cmd/goal/clerk.go index c5d69854a5..5359c372ff 100644 --- a/cmd/goal/clerk.go +++ b/cmd/goal/clerk.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -321,7 +321,7 @@ var sendCmd = &cobra.Command{ var err error if progByteFile != "" { if programSource != "" || logicSigFile != "" { - reportErrorln("should at most one of --from-program/-F or --from-program-bytes/-P --logic-sig/-L") + reportErrorln("should use at most one of --from-program/-F or --from-program-bytes/-P --logic-sig/-L") } program, err = readFile(progByteFile) if err != nil { @@ -329,7 +329,7 @@ var sendCmd = &cobra.Command{ } } else if programSource != "" { if logicSigFile != "" { - reportErrorln("should at most one of --from-program/-F or --from-program-bytes/-P --logic-sig/-L") + reportErrorln("should use at most one of --from-program/-F or --from-program-bytes/-P --logic-sig/-L") } program = assembleFile(programSource) } else if logicSigFile != "" { @@ -788,6 +788,9 @@ var signCmd = &cobra.Command{ for _, group := range groupsOrder { txnGroup := []transactions.SignedTxn{} for _, txn := range txnGroups[group] { + if lsig.Logic != nil { + txn.Lsig = lsig + } txnGroup = append(txnGroup, *txn) } var groupCtx *verify.GroupContext @@ -801,7 +804,6 @@ var signCmd = &cobra.Command{ for i, txn := range txnGroup { var signedTxn transactions.SignedTxn if lsig.Logic != nil { - txn.Lsig = lsig err = verify.LogicSigSanityCheck(&txn, i, groupCtx) if err != nil { reportErrorf("%s: txn[%d] error %s", txFilename, txnIndex[txnGroups[group][i]], err) @@ -1065,10 +1067,7 @@ var dryrunCmd = &cobra.Command{ } stxns = append(stxns, txn) } - txgroup := make([]transactions.SignedTxn, len(stxns)) - for i, st := range stxns { - txgroup[i] = st - } + txgroup := transactions.WrapSignedTxnsWithAD(stxns) proto, params := getProto(protoVersion) if dumpForDryrun { // Write dryrun data to file @@ -1078,7 +1077,7 @@ var dryrunCmd = &cobra.Command{ if err != nil { reportErrorf(err.Error()) } - data, err := libgoal.MakeDryrunStateBytes(client, nil, txgroup, accts, string(proto), dumpForDryrunFormat.String()) + data, err := libgoal.MakeDryrunStateBytes(client, nil, stxns, accts, string(proto), dumpForDryrunFormat.String()) if err != nil { reportErrorf(err.Error()) } @@ -1096,22 +1095,15 @@ var dryrunCmd = &cobra.Command{ if uint64(txn.Lsig.Len()) > params.LogicSigMaxSize { reportErrorf("program size too large: %d > %d", len(txn.Lsig.Logic), params.LogicSigMaxSize) } - ep := logic.EvalParams{Txn: &txn, Proto: ¶ms, GroupIndex: uint64(i), TxnGroup: txgroup} - err := logic.Check(txn.Lsig.Logic, ep) + ep := logic.NewEvalParams(txgroup, ¶ms, nil) + err := logic.CheckSignature(i, ep) if err != nil { reportErrorf("program failed Check: %s", err) } - sb := strings.Builder{} - ep = logic.EvalParams{ - Txn: &txn, - GroupIndex: uint64(i), - Proto: ¶ms, - Trace: &sb, - TxnGroup: txgroup, - } - pass, err := logic.Eval(txn.Lsig.Logic, ep) + ep.Trace = &strings.Builder{} + pass, err := logic.EvalSignature(i, ep) // TODO: optionally include `inspect` output here? - fmt.Fprintf(os.Stdout, "tx[%d] trace:\n%s\n", i, sb.String()) + fmt.Fprintf(os.Stdout, "tx[%d] trace:\n%s\n", i, ep.Trace.String()) if pass { fmt.Fprintf(os.Stdout, " - pass -\n") } else { diff --git a/cmd/goal/commands.go b/cmd/goal/commands.go index 9d3a19c15d..f2eee77601 100644 --- a/cmd/goal/commands.go +++ b/cmd/goal/commands.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/goal/commands_test.go b/cmd/goal/commands_test.go index 26a621ea2b..1d78642562 100644 --- a/cmd/goal/commands_test.go +++ b/cmd/goal/commands_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/goal/common.go b/cmd/goal/common.go index 23496a5cc2..56dde3af74 100644 --- a/cmd/goal/common.go +++ b/cmd/goal/common.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -17,10 +17,9 @@ package main import ( - "fmt" - "strings" - "github.com/spf13/cobra" + + cmdutil "github.com/algorand/go-algorand/cmd/util" ) const ( @@ -52,7 +51,7 @@ var ( dumpForDryrunAccts []string ) -var dumpForDryrunFormat cobraStringValue = *makeCobraStringValue("json", []string{"msgp"}) +var dumpForDryrunFormat cmdutil.CobraStringValue = *cmdutil.MakeCobraStringValue("json", []string{"msgp"}) func addTxnFlags(cmd *cobra.Command) { cmd.Flags().Uint64Var(&fee, "fee", 0, "The transaction fee (automatically determined by default), in microAlgos") @@ -69,39 +68,3 @@ func addTxnFlags(cmd *cobra.Command) { cmd.Flags().Var(&dumpForDryrunFormat, "dryrun-dump-format", "Dryrun dump format: "+dumpForDryrunFormat.AllowedString()) cmd.Flags().StringSliceVar(&dumpForDryrunAccts, "dryrun-accounts", nil, "additional accounts to include into dryrun request obj") } - -type cobraStringValue struct { - value string - allowed []string - isSet bool -} - -func makeCobraStringValue(value string, others []string) *cobraStringValue { - c := new(cobraStringValue) - c.value = value - c.allowed = make([]string, 0, len(others)+1) - c.allowed = append(c.allowed, value) - for _, s := range others { - c.allowed = append(c.allowed, s) - } - return c -} - -func (c *cobraStringValue) String() string { return c.value } -func (c *cobraStringValue) Type() string { return "string" } -func (c *cobraStringValue) IsSet() bool { return c.isSet } - -func (c *cobraStringValue) Set(other string) error { - for _, s := range c.allowed { - if other == s { - c.value = other - c.isSet = true - return nil - } - } - return fmt.Errorf("value %s not allowed", other) -} - -func (c *cobraStringValue) AllowedString() string { - return strings.Join(c.allowed, ", ") -} diff --git a/cmd/goal/completion.go b/cmd/goal/completion.go index 02dab49c44..235b1a2387 100644 --- a/cmd/goal/completion.go +++ b/cmd/goal/completion.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/goal/formatting.go b/cmd/goal/formatting.go index 93659fb8d8..06bfcad85d 100644 --- a/cmd/goal/formatting.go +++ b/cmd/goal/formatting.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/goal/formatting_test.go b/cmd/goal/formatting_test.go index d5f216fd06..bc3bce6704 100644 --- a/cmd/goal/formatting_test.go +++ b/cmd/goal/formatting_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/goal/inspect.go b/cmd/goal/inspect.go index 3ac87223f8..bdb11f434c 100644 --- a/cmd/goal/inspect.go +++ b/cmd/goal/inspect.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/goal/inspect_test.go b/cmd/goal/inspect_test.go index 564f7611ba..2e97444b38 100644 --- a/cmd/goal/inspect_test.go +++ b/cmd/goal/inspect_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/goal/interact.go b/cmd/goal/interact.go index b46f6b8b76..16eb8f4540 100644 --- a/cmd/goal/interact.go +++ b/cmd/goal/interact.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/goal/kmd.go b/cmd/goal/kmd.go index c6a292836b..fa4ef9182f 100644 --- a/cmd/goal/kmd.go +++ b/cmd/goal/kmd.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/goal/ledger.go b/cmd/goal/ledger.go index 379260079b..fda139bd75 100644 --- a/cmd/goal/ledger.go +++ b/cmd/goal/ledger.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/goal/logging.go b/cmd/goal/logging.go index 132975ba49..333c3ee8fb 100644 --- a/cmd/goal/logging.go +++ b/cmd/goal/logging.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/goal/messages.go b/cmd/goal/messages.go index 2b75258e4d..e4b5348ab9 100644 --- a/cmd/goal/messages.go +++ b/cmd/goal/messages.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/goal/multisig.go b/cmd/goal/multisig.go index 3878835820..6e55fcc9e1 100644 --- a/cmd/goal/multisig.go +++ b/cmd/goal/multisig.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/goal/network.go b/cmd/goal/network.go index 9dc5291f57..b7620b997d 100644 --- a/cmd/goal/network.go +++ b/cmd/goal/network.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/goal/node.go b/cmd/goal/node.go index 5e22df5a2d..67fccbf41e 100644 --- a/cmd/goal/node.go +++ b/cmd/goal/node.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -16,11 +16,14 @@ package main +//go:generate ./bundle_genesis_json.sh + import ( "encoding/base64" "encoding/json" "errors" "fmt" + "io/ioutil" "net" "os" "path/filepath" @@ -53,6 +56,7 @@ var newNodeDestination string var newNodeArchival bool var newNodeIndexer bool var newNodeRelay string +var newNodeFullConfig bool var watchMillisecond uint64 var abortCatchup bool @@ -92,6 +96,7 @@ func init() { createCmd.Flags().BoolVarP(&newNodeIndexer, "indexer", "i", localDefaults.IsIndexerActive, "Configure the new node to enable the indexer feature (implies --archival)") createCmd.Flags().StringVar(&newNodeRelay, "relay", localDefaults.NetAddress, "Configure as a relay with specified listening address (NetAddress)") createCmd.Flags().StringVar(&listenIP, "api", "", "REST API Endpoint") + createCmd.Flags().BoolVar(&newNodeFullConfig, "full-config", false, "Store full config file") createCmd.MarkFlagRequired("destination") createCmd.MarkFlagRequired("network") @@ -559,8 +564,15 @@ var createCmd = &cobra.Command{ Run: func(cmd *cobra.Command, _ []string) { // validate network input - validNetworks := map[string]bool{"mainnet": true, "testnet": true, "devnet": true, "betanet": true} - if !validNetworks[newNodeNetwork] { + validNetworks := map[string][]byte{ + "mainnet": genesisMainnet, + "testnet": genesisTestnet, + "betanet": genesisBetanet, + "devnet": genesisDevnet, + } + var genesisContent []byte + var ok bool + if genesisContent, ok = validNetworks[newNodeNetwork]; !ok { reportErrorf(errorNodeCreation, "passed network name invalid") } @@ -586,44 +598,28 @@ var createCmd = &cobra.Command{ localConfig.EnableLedgerService = localConfig.Archival localConfig.EnableBlockService = localConfig.Archival - // locate genesis block - exePath, err := util.ExeDir() - if err != nil { - reportErrorln(errorNodeCreation, err) - } - firstChoicePath := filepath.Join(exePath, "genesisfiles", newNodeNetwork, "genesis.json") - secondChoicePath := filepath.Join("var", "lib", "algorand", "genesis", newNodeNetwork, "genesis.json") - thirdChoicePath := filepath.Join(exePath, "genesisfiles", "genesis", newNodeNetwork, "genesis.json") - paths := []string{firstChoicePath, secondChoicePath, thirdChoicePath} - correctPath := "" - for _, pathCandidate := range paths { - if util.FileExists(pathCandidate) { - correctPath = pathCandidate - break - } - } - if correctPath == "" { - reportErrorf("Could not find genesis.json file. Paths checked: %v", strings.Join(paths, ",")) - } - // verify destination does not exist, and attempt to create destination folder if util.FileExists(newNodeDestination) { reportErrorf(errorNodeCreation, "destination folder already exists") } destPath := filepath.Join(newNodeDestination, "genesis.json") - err = os.MkdirAll(newNodeDestination, 0766) + err := os.MkdirAll(newNodeDestination, 0766) if err != nil { reportErrorf(errorNodeCreation, "could not create destination folder") } // copy genesis block to destination - _, err = util.CopyFile(correctPath, destPath) + err = ioutil.WriteFile(destPath, genesisContent, 0644) if err != nil { reportErrorf(errorNodeCreation, err) } // save config to destination - err = localConfig.SaveToDisk(newNodeDestination) + if newNodeFullConfig { + err = localConfig.SaveAllToDisk(newNodeDestination) + } else { + err = localConfig.SaveToDisk(newNodeDestination) + } if err != nil { reportErrorf(errorNodeCreation, err) } diff --git a/cmd/goal/tealsign.go b/cmd/goal/tealsign.go index eb2deaf29a..3d35624a1d 100644 --- a/cmd/goal/tealsign.go +++ b/cmd/goal/tealsign.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/goal/wallet.go b/cmd/goal/wallet.go index 3d62a0d5b4..90faa86c00 100644 --- a/cmd/goal/wallet.go +++ b/cmd/goal/wallet.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/incorporate/incorporate.go b/cmd/incorporate/incorporate.go index 2d7ffb3fb3..48a2ac8300 100644 --- a/cmd/incorporate/incorporate.go +++ b/cmd/incorporate/incorporate.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/kmd/codes/codes.go b/cmd/kmd/codes/codes.go index 788cc2bb03..12b0fb38f6 100644 --- a/cmd/kmd/codes/codes.go +++ b/cmd/kmd/codes/codes.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/kmd/main.go b/cmd/kmd/main.go index 34315094f1..6d15aef482 100644 --- a/cmd/kmd/main.go +++ b/cmd/kmd/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/kmd/mlock_darwin.go b/cmd/kmd/mlock_darwin.go index 1207fec1b8..14791e7fe4 100644 --- a/cmd/kmd/mlock_darwin.go +++ b/cmd/kmd/mlock_darwin.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/kmd/mlock_linux.go b/cmd/kmd/mlock_linux.go index c6b8988417..ff295866a1 100644 --- a/cmd/kmd/mlock_linux.go +++ b/cmd/kmd/mlock_linux.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/kmd/mlock_windows.go b/cmd/kmd/mlock_windows.go index a14e7a8834..64e82811f5 100644 --- a/cmd/kmd/mlock_windows.go +++ b/cmd/kmd/mlock_windows.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/loadgenerator/config.go b/cmd/loadgenerator/config.go index aaf43dd505..ec9576634d 100644 --- a/cmd/loadgenerator/config.go +++ b/cmd/loadgenerator/config.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/loadgenerator/main.go b/cmd/loadgenerator/main.go index f6dee143e2..8c2417a2c8 100644 --- a/cmd/loadgenerator/main.go +++ b/cmd/loadgenerator/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/msgpacktool/main.go b/cmd/msgpacktool/main.go index da0281990f..fac70fcec0 100644 --- a/cmd/msgpacktool/main.go +++ b/cmd/msgpacktool/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/netdummy/main.go b/cmd/netdummy/main.go index 6e2cee1557..92d96adcd5 100644 --- a/cmd/netdummy/main.go +++ b/cmd/netdummy/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/netgoal/commands.go b/cmd/netgoal/commands.go index 5ae90dedf9..30522e87da 100644 --- a/cmd/netgoal/commands.go +++ b/cmd/netgoal/commands.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/netgoal/generate.go b/cmd/netgoal/generate.go index 7cd417621b..8837973db9 100644 --- a/cmd/netgoal/generate.go +++ b/cmd/netgoal/generate.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/netgoal/messages.go b/cmd/netgoal/messages.go index ddebfdedf0..1db5a08283 100644 --- a/cmd/netgoal/messages.go +++ b/cmd/netgoal/messages.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/netgoal/network.go b/cmd/netgoal/network.go index 9e2f12a0fb..e7111cc4e9 100644 --- a/cmd/netgoal/network.go +++ b/cmd/netgoal/network.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/netgoal/recipe.go b/cmd/netgoal/recipe.go index ffd31254fe..ba8af9b767 100644 --- a/cmd/netgoal/recipe.go +++ b/cmd/netgoal/recipe.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/nodecfg/apply.go b/cmd/nodecfg/apply.go index ee60f0bc11..70008ff9bc 100644 --- a/cmd/nodecfg/apply.go +++ b/cmd/nodecfg/apply.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/nodecfg/commands.go b/cmd/nodecfg/commands.go index 395c2736aa..af3dc08a89 100644 --- a/cmd/nodecfg/commands.go +++ b/cmd/nodecfg/commands.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/nodecfg/download.go b/cmd/nodecfg/download.go index cf4286ad55..762c0ae869 100644 --- a/cmd/nodecfg/download.go +++ b/cmd/nodecfg/download.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/nodecfg/get.go b/cmd/nodecfg/get.go index 88f63238c4..707509f66a 100644 --- a/cmd/nodecfg/get.go +++ b/cmd/nodecfg/get.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/opdoc/opdoc.go b/cmd/opdoc/opdoc.go index 8f59960f58..9b6fff9793 100644 --- a/cmd/opdoc/opdoc.go +++ b/cmd/opdoc/opdoc.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -29,13 +29,16 @@ import ( ) func opGroupMarkdownTable(names []string, out io.Writer) { - fmt.Fprint(out, `| Op | Description | -| --- | --- | + fmt.Fprint(out, `| Opcode | Description | +| - | -- | `) opSpecs := logic.OpsByName[logic.LogicVersion] // TODO: sort by logic.OpSpecs[].Opcode for _, opname := range names { - spec := opSpecs[opname] + spec, ok := opSpecs[opname] + if !ok { + continue // Allows "future" opcodes to exist, but be omitted from spec. + } fmt.Fprintf(out, "| `%s%s` | %s |\n", markdownTableEscape(spec.Name), immediateMarkdown(&spec), markdownTableEscape(logic.OpDoc(opname))) @@ -58,69 +61,103 @@ func typeEnumTableMarkdown(out io.Writer) { func integerConstantsTableMarkdown(out io.Writer) { fmt.Fprintf(out, "#### OnComplete\n\n") fmt.Fprintf(out, "%s\n\n", logic.OnCompletionPreamble) - fmt.Fprintf(out, "| Value | Constant name | Description |\n") - fmt.Fprintf(out, "| --- | --- | --- |\n") + fmt.Fprintf(out, "| Value | Name | Description |\n") + fmt.Fprintf(out, "| - | ---- | -------- |\n") for i, name := range logic.OnCompletionNames { value := uint64(i) fmt.Fprintf(out, "| %d | %s | %s |\n", value, markdownTableEscape(name), logic.OnCompletionDescription(value)) } fmt.Fprintf(out, "\n") - fmt.Fprintf(out, "#### TypeEnum constants\n") - fmt.Fprintf(out, "| Value | Constant name | Description |\n") - fmt.Fprintf(out, "| --- | --- | --- |\n") + fmt.Fprintf(out, "#### TypeEnum constants\n\n") + fmt.Fprintf(out, "| Value | Name | Description |\n") + fmt.Fprintf(out, "| - | --- | ------ |\n") for i, name := range logic.TxnTypeNames { fmt.Fprintf(out, "| %d | %s | %s |\n", i, markdownTableEscape(name), logic.TypeNameDescriptions[name]) } out.Write([]byte("\n")) } -func fieldTableMarkdown(out io.Writer, names []string, types []logic.StackType, extra map[string]string) { - if types != nil { - fmt.Fprintf(out, "| Index | Name | Type | Notes |\n") - fmt.Fprintf(out, "| --- | --- | --- | --- |\n") - } else { - fmt.Fprintf(out, "| Index | Name | Notes |\n") - fmt.Fprintf(out, "| --- | --- | --- |\n") +type speccer interface { + SpecByName(name string) logic.FieldSpec +} + +func fieldSpecsMarkdown(out io.Writer, names []string, specs speccer) { + showTypes := false + showVers := false + spec0 := specs.SpecByName(names[0]) + opVer := spec0.OpVersion() + for _, name := range names { + if specs.SpecByName(name).Type() != logic.StackNone { + showTypes = true + } + if specs.SpecByName(name).Version() != opVer { + showVers = true + } + } + headers := "| Index | Name |" + widths := "| - | ------ |" + if showTypes { + headers += " Type |" + widths += " -- |" } + if showVers { + headers += " In |" + widths += " - |" + } + headers += " Notes |\n" + widths += " --------- |\n" + fmt.Fprint(out, headers, widths) for i, name := range names { + spec := specs.SpecByName(name) str := fmt.Sprintf("| %d | %s", i, markdownTableEscape(name)) - if types != nil { - gfType := types[i] - str = fmt.Sprintf("%s | %s", str, markdownTableEscape(gfType.String())) + if showTypes { + str = fmt.Sprintf("%s | %s", str, markdownTableEscape(spec.Type().String())) } - fmt.Fprintf(out, "%s | %s |\n", str, extra[name]) + if showVers { + if spec.Version() == spec.OpVersion() { + str = fmt.Sprintf("%s | ", str) + } else { + str = fmt.Sprintf("%s | v%d ", str, spec.Version()) + } + } + fmt.Fprintf(out, "%s | %s |\n", str, spec.Note()) } - out.Write([]byte("\n")) + fmt.Fprint(out, "\n") } func transactionFieldsMarkdown(out io.Writer) { fmt.Fprintf(out, "\n`txn` Fields (see [transaction reference](https://developer.algorand.org/docs/reference/transactions/)):\n\n") - fieldTableMarkdown(out, logic.TxnFieldNames, logic.TxnFieldTypes, logic.TxnFieldDocs()) + fieldSpecsMarkdown(out, logic.TxnFieldNames, logic.TxnFieldSpecByName) } func globalFieldsMarkdown(out io.Writer) { fmt.Fprintf(out, "\n`global` Fields:\n\n") - fieldTableMarkdown(out, logic.GlobalFieldNames, logic.GlobalFieldTypes, logic.GlobalFieldDocs()) + fieldSpecsMarkdown(out, logic.GlobalFieldNames, logic.GlobalFieldSpecByName) } func assetHoldingFieldsMarkdown(out io.Writer) { fmt.Fprintf(out, "\n`asset_holding_get` Fields:\n\n") - fieldTableMarkdown(out, logic.AssetHoldingFieldNames, logic.AssetHoldingFieldTypes, logic.AssetHoldingFieldDocs) + fieldSpecsMarkdown(out, logic.AssetHoldingFieldNames, logic.AssetHoldingFieldSpecByName) } func assetParamsFieldsMarkdown(out io.Writer) { fmt.Fprintf(out, "\n`asset_params_get` Fields:\n\n") - fieldTableMarkdown(out, logic.AssetParamsFieldNames, logic.AssetParamsFieldTypes, logic.AssetParamsFieldDocs()) + fieldSpecsMarkdown(out, logic.AssetParamsFieldNames, logic.AssetParamsFieldSpecByName) } func appParamsFieldsMarkdown(out io.Writer) { fmt.Fprintf(out, "\n`app_params_get` Fields:\n\n") - fieldTableMarkdown(out, logic.AppParamsFieldNames, logic.AppParamsFieldTypes, logic.AppParamsFieldDocs()) + fieldSpecsMarkdown(out, logic.AppParamsFieldNames, logic.AppParamsFieldSpecByName) +} + +func acctParamsFieldsMarkdown(out io.Writer) { + fmt.Fprintf(out, "\n`acct_params_get` Fields:\n\n") + fieldSpecsMarkdown(out, logic.AcctParamsFieldNames, logic.AcctParamsFieldSpecByName) } func ecDsaCurvesMarkdown(out io.Writer) { fmt.Fprintf(out, "\n`ECDSA` Curves:\n\n") - fieldTableMarkdown(out, logic.EcdsaCurveNames, nil, logic.EcdsaCurveDocs) + fieldSpecsMarkdown(out, logic.EcdsaCurveNames, logic.EcdsaCurveSpecByName) } func immediateMarkdown(op *logic.OpSpec) string { @@ -131,38 +168,45 @@ func immediateMarkdown(op *logic.OpSpec) string { return markdown } -func opToMarkdown(out io.Writer, op *logic.OpSpec) (err error) { - ws := "" - opextra := logic.OpImmediateNote(op.Name) - if opextra != "" { - ws = " " +func stackMarkdown(op *logic.OpSpec) string { + out := "- Stack: " + special := logic.OpStackEffects(op.Name) + if special != "" { + return out + special + "\n" } - fmt.Fprintf(out, "\n## %s%s\n\n- Opcode: 0x%02x%s%s\n", op.Name, immediateMarkdown(op), op.Opcode, ws, opextra) - if op.Args == nil { - fmt.Fprintf(out, "- Pops: _None_\n") - } else if len(op.Args) == 1 { - fmt.Fprintf(out, "- Pops: *... stack*, %s\n", op.Args[0].String()) - } else { - fmt.Fprintf(out, "- Pops: *... stack*, {%s A}", op.Args[0].String()) - for i, v := range op.Args[1:] { - fmt.Fprintf(out, ", {%s %c}", v.String(), rune(int('B')+i)) + + out += "..." + for i, v := range op.Args { + out += fmt.Sprintf(", %c", rune(int('A')+i)) + if v.Typed() { + out += fmt.Sprintf(": %s", v) } - out.Write([]byte("\n")) } + out += " → ..." - if op.Returns == nil { - fmt.Fprintf(out, "- Pushes: _None_\n") - } else { - if len(op.Returns) == 1 { - fmt.Fprintf(out, "- Pushes: %s", op.Returns[0].String()) - } else { - fmt.Fprintf(out, "- Pushes: *... stack*, %s", op.Returns[0].String()) - for _, rt := range op.Returns[1:] { - fmt.Fprintf(out, ", %s", rt.String()) + for i, rt := range op.Returns { + out += ", " + if len(op.Returns) > 1 { + start := int('X') + if len(op.Returns) > 3 { + start = int('Z') + 1 - len(op.Returns) } + out += fmt.Sprintf("%c: ", rune(start+i)) } - fmt.Fprintf(out, "\n") + out += rt.String() + } + return out + "\n" +} + +func opToMarkdown(out io.Writer, op *logic.OpSpec) (err error) { + ws := "" + opextra := logic.OpImmediateNote(op.Name) + if opextra != "" { + ws = " " } + stackEffects := stackMarkdown(op) + fmt.Fprintf(out, "\n## %s%s\n\n- Opcode: 0x%02x%s%s\n%s", + op.Name, immediateMarkdown(op), op.Opcode, ws, opextra, stackEffects) fmt.Fprintf(out, "- %s\n", logic.OpDoc(op.Name)) // if cost changed with versions print all of them costs := logic.OpAllCosts(op.Name) @@ -170,12 +214,12 @@ func opToMarkdown(out io.Writer, op *logic.OpSpec) (err error) { fmt.Fprintf(out, "- **Cost**:\n") for _, cost := range costs { if cost.From == cost.To { - fmt.Fprintf(out, " - %d (LogicSigVersion = %d)\n", cost.Cost, cost.To) + fmt.Fprintf(out, " - %d (v%d)\n", cost.Cost, cost.To) } else { if cost.To < logic.LogicVersion { - fmt.Fprintf(out, " - %d (%d <= LogicSigVersion <= %d)\n", cost.Cost, cost.From, cost.To) + fmt.Fprintf(out, " - %d (v%d - v%d)\n", cost.Cost, cost.From, cost.To) } else { - fmt.Fprintf(out, " - %d (LogicSigVersion >= %d)\n", cost.Cost, cost.From) + fmt.Fprintf(out, " - %d (since v%d)\n", cost.Cost, cost.From) } } } @@ -186,25 +230,30 @@ func opToMarkdown(out io.Writer, op *logic.OpSpec) (err error) { } } if op.Version > 1 { - fmt.Fprintf(out, "- LogicSigVersion >= %d\n", op.Version) + fmt.Fprintf(out, "- Availability: v%d\n", op.Version) } if !op.Modes.Any() { fmt.Fprintf(out, "- Mode: %s\n", op.Modes.String()) } - if op.Name == "global" { + switch op.Name { + case "global": globalFieldsMarkdown(out) - } else if op.Name == "txn" { + case "txn": transactionFieldsMarkdown(out) fmt.Fprintf(out, "\nTypeEnum mapping:\n\n") typeEnumTableMarkdown(out) - } else if op.Name == "asset_holding_get" { + case "asset_holding_get": assetHoldingFieldsMarkdown(out) - } else if op.Name == "asset_params_get" { + case "asset_params_get": assetParamsFieldsMarkdown(out) - } else if op.Name == "app_params_get" { + case "app_params_get": appParamsFieldsMarkdown(out) - } else if strings.HasPrefix(op.Name, "ecdsa") { - ecDsaCurvesMarkdown(out) + case "acct_params_get": + acctParamsFieldsMarkdown(out) + default: + if strings.HasPrefix(op.Name, "ecdsa") { + ecDsaCurvesMarkdown(out) + } } ode := logic.OpDocExtra(op.Name) if ode != "" { @@ -250,28 +299,6 @@ type LanguageSpec struct { Ops []OpRecord } -func argEnum(name string) []string { - if name == "txn" || name == "gtxn" || name == "gtxns" { - return logic.TxnFieldNames - } - if name == "global" { - return logic.GlobalFieldNames - } - if name == "txna" || name == "gtxna" || name == "gtxnsa" || name == "txnas" || name == "gtxnas" || name == "gtxnsas" { - return logic.TxnaFieldNames - } - if name == "asset_holding_get" { - return logic.AssetHoldingFieldNames - } - if name == "asset_params_get" { - return logic.AssetParamsFieldNames - } - if name == "app_params_get" { - return logic.AppParamsFieldNames - } - return nil -} - func typeString(types []logic.StackType) string { out := make([]byte, len(types)) for i, t := range types { @@ -294,27 +321,32 @@ func typeString(types []logic.StackType) string { return string(out) } -func argEnumTypes(name string) string { - if name == "txn" || name == "gtxn" || name == "gtxns" { - return typeString(logic.TxnFieldTypes) - } - if name == "global" { - return typeString(logic.GlobalFieldTypes) - } - if name == "txna" || name == "gtxna" || name == "gtxnsa" || name == "txnas" || name == "gtxnas" || name == "gtxnsas" { - return typeString(logic.TxnaFieldTypes) - } - if name == "asset_holding_get" { - return typeString(logic.AssetHoldingFieldTypes) - } - if name == "asset_params_get" { - return typeString(logic.AssetParamsFieldTypes) - } - if name == "app_params_get" { - return typeString(logic.AppParamsFieldTypes) +func fieldsAndTypes(names []string, specs speccer) ([]string, string) { + types := make([]logic.StackType, len(names)) + for i, name := range names { + types[i] = specs.SpecByName(name).Type() } + return names, typeString(types) +} - return "" +func argEnums(name string) (names []string, types string) { + switch name { + case "txn", "gtxn", "gtxns", "itxn", "gitxn", "itxn_field": + return fieldsAndTypes(logic.TxnFieldNames, logic.TxnFieldSpecByName) + case "global": + return + case "txna", "gtxna", "gtxnsa", "txnas", "gtxnas", "gtxnsas", "itxna", "gitxna": + // Map is the whole txn field spec map. That's fine, we only lookup the given names. + return fieldsAndTypes(logic.TxnaFieldNames(), logic.TxnFieldSpecByName) + case "asset_holding_get": + return fieldsAndTypes(logic.AssetHoldingFieldNames, logic.AssetHoldingFieldSpecByName) + case "asset_params_get": + return fieldsAndTypes(logic.AssetParamsFieldNames, logic.AssetParamsFieldSpecByName) + case "app_params_get": + return fieldsAndTypes(logic.AppParamsFieldNames, logic.AppParamsFieldSpecByName) + default: + return nil, "" + } } func buildLanguageSpec(opGroups map[string][]string) *LanguageSpec { @@ -327,8 +359,7 @@ func buildLanguageSpec(opGroups map[string][]string) *LanguageSpec { records[i].Returns = typeString(spec.Returns) records[i].Cost = spec.Details.Cost records[i].Size = spec.Details.Size - records[i].ArgEnum = argEnum(spec.Name) - records[i].ArgEnumTypes = argEnumTypes(spec.Name) + records[i].ArgEnum, records[i].ArgEnumTypes = argEnums(spec.Name) records[i].Doc = logic.OpDoc(spec.Name) records[i].DocExtra = logic.OpDocExtra(spec.Name) records[i].ImmediateNote = logic.OpImmediateNote(spec.Name) @@ -341,51 +372,64 @@ func buildLanguageSpec(opGroups map[string][]string) *LanguageSpec { } } +func create(file string) *os.File { + f, err := os.Create(file) + if err != nil { + fmt.Fprintf(os.Stderr, "Unable to create '%s': %v", file, err) + os.Exit(1) + } + return f +} + func main() { - opcodesMd, _ := os.Create("TEAL_opcodes.md") + opcodesMd := create("TEAL_opcodes.md") opsToMarkdown(opcodesMd) opcodesMd.Close() opGroups := make(map[string][]string, len(logic.OpSpecs)) for grp, names := range logic.OpGroups { fname := fmt.Sprintf("%s.md", grp) fname = strings.ReplaceAll(fname, " ", "_") - fout, _ := os.Create(fname) + fout := create(fname) opGroupMarkdownTable(names, fout) fout.Close() for _, opname := range names { opGroups[opname] = append(opGroups[opname], grp) } } - constants, _ := os.Create("named_integer_constants.md") + constants := create("named_integer_constants.md") integerConstantsTableMarkdown(constants) constants.Close() - txnfields, _ := os.Create("txn_fields.md") - fieldTableMarkdown(txnfields, logic.TxnFieldNames, logic.TxnFieldTypes, logic.TxnFieldDocs()) + txnfields := create("txn_fields.md") + fieldSpecsMarkdown(txnfields, logic.TxnFieldNames, logic.TxnFieldSpecByName) txnfields.Close() - globalfields, _ := os.Create("global_fields.md") - fieldTableMarkdown(globalfields, logic.GlobalFieldNames, logic.GlobalFieldTypes, logic.GlobalFieldDocs()) + globalfields := create("global_fields.md") + fieldSpecsMarkdown(globalfields, logic.GlobalFieldNames, logic.GlobalFieldSpecByName) globalfields.Close() - assetholding, _ := os.Create("asset_holding_fields.md") - fieldTableMarkdown(assetholding, logic.AssetHoldingFieldNames, logic.AssetHoldingFieldTypes, logic.AssetHoldingFieldDocs) + assetholding := create("asset_holding_fields.md") + fieldSpecsMarkdown(assetholding, logic.AssetHoldingFieldNames, logic.AssetHoldingFieldSpecByName) assetholding.Close() - assetparams, _ := os.Create("asset_params_fields.md") - fieldTableMarkdown(assetparams, logic.AssetParamsFieldNames, logic.AssetParamsFieldTypes, logic.AssetParamsFieldDocs()) + assetparams := create("asset_params_fields.md") + fieldSpecsMarkdown(assetparams, logic.AssetParamsFieldNames, logic.AssetParamsFieldSpecByName) assetparams.Close() - appparams, _ := os.Create("app_params_fields.md") - fieldTableMarkdown(appparams, logic.AppParamsFieldNames, logic.AppParamsFieldTypes, logic.AppParamsFieldDocs()) + appparams := create("app_params_fields.md") + fieldSpecsMarkdown(appparams, logic.AppParamsFieldNames, logic.AppParamsFieldSpecByName) appparams.Close() - langspecjs, _ := os.Create("langspec.json") + acctparams, _ := os.Create("acct_params_fields.md") + fieldSpecsMarkdown(acctparams, logic.AcctParamsFieldNames, logic.AcctParamsFieldSpecByName) + acctparams.Close() + + langspecjs := create("langspec.json") enc := json.NewEncoder(langspecjs) enc.Encode(buildLanguageSpec(opGroups)) langspecjs.Close() - tealtm, _ := os.Create("teal.tmLanguage.json") + tealtm := create("teal.tmLanguage.json") enc = json.NewEncoder(tealtm) enc.SetIndent("", " ") enc.Encode(buildSyntaxHighlight()) diff --git a/cmd/opdoc/tmLanguage.go b/cmd/opdoc/tmLanguage.go index 3f5aa8503a..204068a622 100644 --- a/cmd/opdoc/tmLanguage.go +++ b/cmd/opdoc/tmLanguage.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -175,7 +175,7 @@ func buildSyntaxHighlight() *tmLanguage { // For these, accumulate into allArithmetics, // and only add to keyword.Patterns later, when all // have been collected. - case "Arithmetic", "Byte Array Slicing", "Byte Array Arithmetic", + case "Arithmetic", "Byte Array Manipulation", "Byte Array Arithmetic", "Byte Array Logic", "Inner Transactions": escape := map[rune]bool{ '*': true, diff --git a/cmd/partitiontest_linter/linter.go b/cmd/partitiontest_linter/linter.go index 27ffbf14e2..8d5ab728de 100644 --- a/cmd/partitiontest_linter/linter.go +++ b/cmd/partitiontest_linter/linter.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -28,6 +28,7 @@ const functionName string = "PartitionTest" const fileNameSuffix string = "_test.go" const functionNamePrefix string = "Test" const parameterType string = "T" +const parameterName string = "t" // Analyzer initilization var Analyzer = &analysis.Analyzer{ @@ -58,7 +59,7 @@ func run(pass *analysis.Pass) (interface{}, error) { continue } if !isSearchLineInFunction(fn) { - pass.Reportf(fn.Pos(), "%s function is missing %s.%s(<%s type parameter>)", fn.Name.Name, packageName, functionName, parameterType) + pass.Reportf(fn.Pos(), "%s: Add missing partition call to top of test. To disable partitioning, add it as a comment: %s.%s(%s)", fn.Name.Name, packageName, functionName, parameterName) } } diff --git a/cmd/partitiontest_linter/linter_test.go b/cmd/partitiontest_linter/linter_test.go index 4d53e3ed30..d62fcef73b 100644 --- a/cmd/partitiontest_linter/linter_test.go +++ b/cmd/partitiontest_linter/linter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/partitiontest_linter/plugin/plugin.go b/cmd/partitiontest_linter/plugin/plugin.go index eefcfffca9..587529feac 100644 --- a/cmd/partitiontest_linter/plugin/plugin.go +++ b/cmd/partitiontest_linter/plugin/plugin.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/partitiontest_linter/testdata/linter_testdata_test.go b/cmd/partitiontest_linter/testdata/linter_testdata_test.go index f11d76261a..3658e6211f 100644 --- a/cmd/partitiontest_linter/testdata/linter_testdata_test.go +++ b/cmd/partitiontest_linter/testdata/linter_testdata_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/pingpong/commands.go b/cmd/pingpong/commands.go index 14e3259aca..71733f22f8 100644 --- a/cmd/pingpong/commands.go +++ b/cmd/pingpong/commands.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/pingpong/runCmd.go b/cmd/pingpong/runCmd.go index 7d0136d10b..cb62840360 100644 --- a/cmd/pingpong/runCmd.go +++ b/cmd/pingpong/runCmd.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/pingpong/teal_programs.go b/cmd/pingpong/teal_programs.go index d9964bd452..e565842114 100644 --- a/cmd/pingpong/teal_programs.go +++ b/cmd/pingpong/teal_programs.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/tealdbg/bundle_home_html.sh b/cmd/tealdbg/bundle_home_html.sh index 176c114c66..0950954209 100755 --- a/cmd/tealdbg/bundle_home_html.sh +++ b/cmd/tealdbg/bundle_home_html.sh @@ -3,7 +3,7 @@ THISDIR=$(dirname $0) cat < $THISDIR/homepage.go -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/tealdbg/cdt/proto.go b/cmd/tealdbg/cdt/proto.go index 0e6468371a..ad527fc09d 100644 --- a/cmd/tealdbg/cdt/proto.go +++ b/cmd/tealdbg/cdt/proto.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/tealdbg/cdtSession.go b/cmd/tealdbg/cdtSession.go index 73cf037769..e880296a3d 100644 --- a/cmd/tealdbg/cdtSession.go +++ b/cmd/tealdbg/cdtSession.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -169,7 +169,7 @@ func (s *cdtSession) websocketHandler(w http.ResponseWriter, r *http.Request) { state.Update(cdtStateUpdate{ dbgState.Stack, dbgState.Scratch, 0, 0, "", - s.debugger.GetStates(nil), + dbgState.OpcodeBudget, s.debugger.GetStates(nil), }) hash := sha256.Sum256([]byte(state.disassembly)) // some random hash @@ -247,7 +247,7 @@ func (s *cdtSession) websocketHandler(w http.ResponseWriter, r *http.Request) { state.Update(cdtStateUpdate{ dbgState.Stack, dbgState.Scratch, dbgState.PC, dbgState.Line, dbgState.Error, - appState, + dbgState.OpcodeBudget, appState, }) dbgStateMu.Unlock() diff --git a/cmd/tealdbg/cdtSession_test.go b/cmd/tealdbg/cdtSession_test.go index 8ee0107be1..e670572a88 100644 --- a/cmd/tealdbg/cdtSession_test.go +++ b/cmd/tealdbg/cdtSession_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -479,7 +479,7 @@ func TestCdtSessionGetObjects(t *testing.T) { state := cdtState{ disassembly: "version 2\nint 1", proto: &proto, - txnGroup: []transactions.SignedTxn{ + txnGroup: transactions.WrapSignedTxnsWithAD([]transactions.SignedTxn{ { Txn: transactions.Transaction{ Type: protocol.PaymentTx, @@ -496,7 +496,7 @@ func TestCdtSessionGetObjects(t *testing.T) { }, }, }, - }, + }), groupIndex: 0, globals: globals, stack: []basics.TealValue{{Type: basics.TealBytesType, Bytes: "test"}}, @@ -527,6 +527,42 @@ func TestCdtSessionGetObjects(t *testing.T) { }, }, }, + logs: []string{"test log 1", "test log 2"}, + innerTxns: []transactions.SignedTxnWithAD{ + { + SignedTxn: transactions.SignedTxn{ + Txn: transactions.Transaction{ + Type: protocol.ApplicationCallTx, + ApplicationCallTxnFields: transactions.ApplicationCallTxnFields{ + ApplicationArgs: [][]byte{{0, 1, 2, 3}}, + }, + }, + }, + ApplyData: transactions.ApplyData{ + EvalDelta: transactions.EvalDelta{ + InnerTxns: transactions.WrapSignedTxnsWithAD([]transactions.SignedTxn{ + { + Txn: transactions.Transaction{ + Type: protocol.PaymentTx, + Header: transactions.Header{ + Sender: basics.Address{}, Fee: basics.MicroAlgos{Raw: 1000}, FirstValid: 10, + }, + }, + }, + { + Txn: transactions.Transaction{ + Type: protocol.ApplicationCallTx, + ApplicationCallTxnFields: transactions.ApplicationCallTxnFields{ + ApplicationArgs: [][]byte{{0, 1, 2, 3}}, + }, + }, + }, + }), + Logs: []string{"test nested log"}, + }, + }, + }, + }, }, } @@ -555,6 +591,9 @@ func TestCdtSessionGetObjects(t *testing.T) { encodeAppLocalsAddr(basics.Address{}.String()), encodeAppGlobalAppID("0"), encodeAppGlobalAppID("1"), encodeAppLocalsAppID(basics.Address{}.String(), "1"), + encodeLogsID([]int{0}), encodeLogsID([]int{0, 1}), + encodeInnerTxnID([]int{0}), encodeInnerTxnID([]int{0, 0}), + encodeInnerTxnID([]int{0, 1}), } for _, k := range objIds { req.Params = map[string]interface{}{"objectId": k, "generatePreview": true} diff --git a/cmd/tealdbg/cdtState.go b/cmd/tealdbg/cdtState.go index 77f4eb896e..457def831b 100644 --- a/cmd/tealdbg/cdtState.go +++ b/cmd/tealdbg/cdtState.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -37,7 +37,7 @@ type cdtState struct { // immutable content disassembly string proto *config.ConsensusParams - txnGroup []transactions.SignedTxn + txnGroup []transactions.SignedTxnWithAD groupIndex int globals []basics.TealValue @@ -58,11 +58,12 @@ type cdtState struct { } type cdtStateUpdate struct { - stack []basics.TealValue - scratch []basics.TealValue - pc int - line int - err string + stack []basics.TealValue + scratch []basics.TealValue + pc int + line int + err string + opcodeBudget int AppState } @@ -90,7 +91,7 @@ var txnFileTypeHints = map[logic.TxnField]typeHint{ logic.FreezeAssetAccount: addressHint, } -func (s *cdtState) Init(disassembly string, proto *config.ConsensusParams, txnGroup []transactions.SignedTxn, groupIndex int, globals []basics.TealValue) { +func (s *cdtState) Init(disassembly string, proto *config.ConsensusParams, txnGroup []transactions.SignedTxnWithAD, groupIndex int, globals []basics.TealValue) { s.disassembly = disassembly s.proto = proto s.txnGroup = txnGroup @@ -107,6 +108,8 @@ func (s *cdtState) Update(state cdtStateUpdate) { s.stack = state.stack s.scratch = state.scratch s.AppState = state.AppState + // We need to dynamically override opcodeBudget with the proper value each step. + s.globals[logic.OpcodeBudget].Uint = uint64(state.opcodeBudget) } const localScopeObjID = "localScopeObjId" @@ -120,6 +123,8 @@ const tealErrorID = "tealErrorID" const appGlobalObjID = "appGlobalObjID" const appLocalsObjID = "appLocalsObjID" const txnArrayFieldObjID = "txnArrayField" +const logsObjID = "logsObjID" +const innerTxnsObjID = "innerTxnsObjID" type objectDescFn func(s *cdtState, preview bool) []cdt.RuntimePropertyDescriptor @@ -134,6 +139,8 @@ var objectDescMap = map[string]objectDescFn{ tealErrorID: makeTealError, appGlobalObjID: makeAppGlobalState, appLocalsObjID: makeAppLocalsState, + logsObjID: makeLogsState, + innerTxnsObjID: makeInnerTxnsState, } func (s *cdtState) getObjectDescriptor(objID string, preview bool) (desc []cdt.RuntimePropertyDescriptor, err error) { @@ -145,7 +152,31 @@ func (s *cdtState) getObjectDescriptor(objID string, preview bool) (desc []cdt.R return } if len(s.txnGroup) > 0 { - return makeTxnImpl(&s.txnGroup[idx].Txn, idx, preview), nil + return makeTxnImpl(&s.txnGroup[idx].Txn, idx, false, preview), nil + } + } else if parentObjID, idxs, ok := decodeNestedObjID(objID); ok { + var itxn transactions.SignedTxnWithAD + itxns := s.innerTxns + + // Traverse to the itxn we want using the idxs. + for _, idx := range idxs { + if idx >= len(itxns) || idx < 0 { + err = fmt.Errorf("invalid group idx: %d", idx) + return + } + itxn = itxns[idx] + itxns = itxn.EvalDelta.InnerTxns + } + + switch parentObjID { + case logObjIDPrefix: + logs := itxn.EvalDelta.Logs + return makeLogsSlice(logs, 0, len(logs)-1, preview), nil + case innerTxnObjIDPrefix: + return makeInnerTxnImpl(&itxn, idxs, preview), nil + case innerNestedTxnObjIDPrefix: + return makeInnerTxnsSlice(itxns, idxs, 0, len(itxns)-1, preview), nil + default: } } else if parentObjID, ok := decodeArrayLength(objID); ok { switch parentObjID { @@ -357,23 +388,39 @@ func prepareGlobals(globals []basics.TealValue) []fieldDesc { return result } -func prepareTxn(txn *transactions.Transaction, groupIndex int) []fieldDesc { +// These fields should not be included in any transaction. +func illegalTxnField(field int) bool { + return field == int(logic.FirstValidTime) || + field == int(logic.Accounts) || + field == int(logic.ApplicationArgs) || + field == int(logic.Assets) || + field == int(logic.Applications) || + field == int(logic.Type) || // Use TypeEnum field instead + field == int(logic.Logs) || + field == int(logic.NumLogs) || + field == int(logic.LastLog) || + field == int(logic.CreatedApplicationID) || + field == int(logic.CreatedAssetID) +} + +// These fields should not be included in inner level transactions. +func illegalInnerTxnField(field int) bool { + return illegalTxnField(field) || + field == int(logic.GroupIndex) || + field == int(logic.TxID) +} + +func prepareTxn(txn *transactions.Transaction, groupIndex int, inner bool) []fieldDesc { result := make([]fieldDesc, 0, len(logic.TxnFieldNames)) for field, name := range logic.TxnFieldNames { - if field == int(logic.FirstValidTime) || - field == int(logic.Accounts) || - field == int(logic.ApplicationArgs) || - field == int(logic.Assets) || - field == int(logic.Applications) || - field == int(logic.CreatedApplicationID) || - field == int(logic.CreatedAssetID) || - field == int(logic.Logs) || - field == int(logic.NumLogs) { + if !inner && illegalTxnField(field) { + continue + } else if inner && illegalInnerTxnField(field) { continue } var value string var valType string - tv, err := logic.TxnFieldToTealValue(txn, groupIndex, logic.TxnField(field), 0) + tv, err := logic.TxnFieldToTealValue(txn, groupIndex, logic.TxnField(field), 0, inner) if err != nil { value = err.Error() valType = "undefined" @@ -434,6 +481,16 @@ func prepareArray(array []basics.TealValue) []fieldDesc { return result } +func prepareStringArray(array []string) []fieldDesc { + result := make([]fieldDesc, 0) + for i := 0; i < len(array); i++ { + value := array[i] + name := strconv.Itoa(i) + result = append(result, fieldDesc{name, value, "string"}) + } + return result +} + func makePreview(fields []fieldDesc) (prop []cdt.RuntimePropertyPreview) { prop = make([]cdt.RuntimePropertyPreview, 0, len(fields)) for _, field := range fields { @@ -460,10 +517,10 @@ func makeIntPreview(n int) (prop []cdt.RuntimePropertyPreview) { return } -func makeTxnPreview(txnGroup []transactions.SignedTxn, groupIndex int) cdt.RuntimeObjectPreview { +func makeTxnPreview(txnGroup []transactions.SignedTxnWithAD, groupIndex int) cdt.RuntimeObjectPreview { var prop []cdt.RuntimePropertyPreview if len(txnGroup) > 0 { - fields := prepareTxn(&txnGroup[groupIndex].Txn, groupIndex) + fields := prepareTxn(&txnGroup[groupIndex].Txn, groupIndex, false) prop = makePreview(fields) } @@ -471,7 +528,7 @@ func makeTxnPreview(txnGroup []transactions.SignedTxn, groupIndex int) cdt.Runti return p } -func makeGtxnPreview(txnGroup []transactions.SignedTxn) cdt.RuntimeObjectPreview { +func makeGtxnPreview(txnGroup []transactions.SignedTxnWithAD) cdt.RuntimeObjectPreview { prop := makeIntPreview(len(txnGroup)) p := cdt.RuntimeObjectPreview{ Type: "object", @@ -503,6 +560,25 @@ func makeArrayPreview(array []basics.TealValue) cdt.RuntimeObjectPreview { return p } +func makeStringArrayPreview(array []string) cdt.RuntimeObjectPreview { + fields := prepareStringArray(array) + + length := len(fields) + overflow := length > maxArrayPreviewLength + if overflow { + length = maxArrayPreviewLength + } + prop := makePreview(fields[:length]) + + p := cdt.RuntimeObjectPreview{ + Type: "object", + Subtype: "array", + Description: fmt.Sprintf("Array(%d)", len(array)), + Overflow: overflow, + Properties: prop} + return p +} + func makeGlobalsPreview(globals []basics.TealValue) cdt.RuntimeObjectPreview { fields := prepareGlobals(globals) prop := makePreview(fields) @@ -530,6 +606,57 @@ func decodeGroupTxnID(objID string) (int, bool) { return 0, false } +var logObjIDPrefix = fmt.Sprintf("%s_id", logsObjID) +var innerTxnObjIDPrefix = fmt.Sprintf("%s_id", innerTxnsObjID) +var innerNestedTxnObjIDPrefix = fmt.Sprintf("%s_nested", innerTxnsObjID) + +func encodeNestedObjID(groupIndexes []int, prefix string) string { + encodedElements := []string{prefix} + for _, i := range groupIndexes { + encodedElements = append(encodedElements, strconv.Itoa(i)) + } + encodedItxnID := strings.Join(encodedElements, "_") + return encodedItxnID +} + +func decodeNestedObjID(objID string) (string, []int, bool) { + var prefix string + parsedIDs := make([]int, 0) + + if strings.HasPrefix(objID, logObjIDPrefix) { + prefix = logObjIDPrefix + } else if strings.HasPrefix(objID, innerTxnObjIDPrefix) { + prefix = innerTxnObjIDPrefix + } else if strings.HasPrefix(objID, innerNestedTxnObjIDPrefix) { + prefix = innerNestedTxnObjIDPrefix + } else { + return "", []int{}, false + } + + groupIDs := objID[len(prefix)+1:] + parts := strings.Split(groupIDs, "_") + for _, id := range parts { + if val, err := strconv.ParseInt(id, 10, 32); err == nil { + parsedIDs = append(parsedIDs, int(val)) + } else { + return "", []int{}, false + } + } + return prefix, parsedIDs, true +} + +func encodeLogsID(groupIndexes []int) string { + return encodeNestedObjID(groupIndexes, logObjIDPrefix) +} + +func encodeInnerTxnID(groupIndexes []int) string { + return encodeNestedObjID(groupIndexes, innerTxnObjIDPrefix) +} + +func encodeNestedInnerTxnID(groupIndexes []int) string { + return encodeNestedObjID(groupIndexes, innerNestedTxnObjIDPrefix) +} + func encodeArrayLength(objID string) string { return fmt.Sprintf("%s_length", objID) } @@ -654,6 +781,8 @@ func makeLocalScope(s *cdtState, preview bool) (desc []cdt.RuntimePropertyDescri gtxn := makeArray("gtxn", len(s.txnGroup), gtxnObjID) stack := makeArray("stack", len(s.stack), stackObjID) scratch := makeArray("scratch", len(s.scratch), scratchObjID) + logs := makeArray("logs", len(s.logs), logsObjID) + innerTxns := makeArray("innerTxns", len(s.innerTxns), innerTxnsObjID) if preview { txnPreview := makeTxnPreview(s.txnGroup, s.groupIndex) if len(txnPreview.Properties) > 0 { @@ -669,6 +798,14 @@ func makeLocalScope(s *cdtState, preview bool) (desc []cdt.RuntimePropertyDescri if len(scratchPreview.Properties) > 0 { scratch.Value.Preview = &scratchPreview } + logsPreview := makeStringArrayPreview(s.logs) + if len(logsPreview.Properties) > 0 { + logs.Value.Preview = &logsPreview + } + innerTxnsPreview := makeGtxnPreview(s.innerTxns) + if len(innerTxnsPreview.Properties) > 0 { + innerTxns.Value.Preview = &innerTxnsPreview + } } pc := makePrimitive(fieldDesc{ @@ -682,6 +819,8 @@ func makeLocalScope(s *cdtState, preview bool) (desc []cdt.RuntimePropertyDescri gtxn, stack, scratch, + logs, + innerTxns, } if !s.AppState.empty() { @@ -710,14 +849,14 @@ func makeGlobals(s *cdtState, preview bool) (desc []cdt.RuntimePropertyDescripto func makeTxn(s *cdtState, preview bool) (desc []cdt.RuntimePropertyDescriptor) { if len(s.txnGroup) > 0 && s.groupIndex < len(s.txnGroup) && s.groupIndex >= 0 { - return makeTxnImpl(&s.txnGroup[s.groupIndex].Txn, s.groupIndex, preview) + return makeTxnImpl(&s.txnGroup[s.groupIndex].Txn, s.groupIndex, false, preview) } desc = make([]cdt.RuntimePropertyDescriptor, 0) return } -func makeTxnImpl(txn *transactions.Transaction, groupIndex int, preview bool) (desc []cdt.RuntimePropertyDescriptor) { - fields := prepareTxn(txn, groupIndex) +func makeTxnImpl(txn *transactions.Transaction, groupIndex int, inner bool, preview bool) (desc []cdt.RuntimePropertyDescriptor) { + fields := prepareTxn(txn, groupIndex, inner) for _, field := range fields { desc = append(desc, makePrimitive(field)) } @@ -754,9 +893,35 @@ func makeTxnImpl(txn *transactions.Transaction, groupIndex int, preview bool) (d return } +func makeInnerTxnImpl(txn *transactions.SignedTxnWithAD, groupIndexes []int, preview bool) (desc []cdt.RuntimePropertyDescriptor) { + groupIndex := groupIndexes[len(groupIndexes)-1] + desc = makeTxnImpl(&txn.Txn, groupIndex, true, preview) + + logs := makeArray("logs", len(txn.EvalDelta.Logs), encodeLogsID(groupIndexes)) + innerTxns := makeArray("innerTxns", len(txn.EvalDelta.InnerTxns), encodeNestedInnerTxnID(groupIndexes)) + createdApplicationID := fieldDesc{ + Name: "CreatedApplicationID", + Value: strconv.FormatUint(uint64(txn.ApplicationID), 10), + Type: "number", + } + configAsset := fieldDesc{ + Name: "CreatedAssetID", + Value: strconv.FormatUint(uint64(txn.ConfigAsset), 10), + Type: "number", + } + desc = append( + desc, + logs, + innerTxns, + makePrimitive(createdApplicationID), + makePrimitive(configAsset), + ) + return +} + func txnFieldToArrayFieldDesc(txn *transactions.Transaction, groupIndex int, field logic.TxnField, length int) (desc []fieldDesc) { for i := 0; i < length; i++ { - tv, err := logic.TxnFieldToTealValue(txn, groupIndex, field, uint64(i)) + tv, err := logic.TxnFieldToTealValue(txn, groupIndex, field, uint64(i), false) if err != nil { return []fieldDesc{} } @@ -919,6 +1084,41 @@ func makeScratch(s *cdtState, preview bool) (desc []cdt.RuntimePropertyDescripto return makeScratchSlice(s, 0, len(s.scratch)-1, preview) } +func makeLogsSlice(logs []string, from int, to int, preview bool) (desc []cdt.RuntimePropertyDescriptor) { + logs = logs[from : to+1] + fields := prepareStringArray(logs) + for _, field := range fields { + desc = append(desc, makePrimitive(field)) + } + field := fieldDesc{Name: "length", Value: strconv.Itoa(len(logs)), Type: "number"} + desc = append(desc, makePrimitive(field)) + return +} + +func makeLogsState(s *cdtState, preview bool) (desc []cdt.RuntimePropertyDescriptor) { + return makeLogsSlice(s.logs, 0, len(s.logs)-1, preview) +} + +func makeInnerTxnsSlice(stxns []transactions.SignedTxnWithAD, groupIndexes []int, from int, to int, preview bool) (desc []cdt.RuntimePropertyDescriptor) { + stxns = stxns[from : to+1] + desc = make([]cdt.RuntimePropertyDescriptor, 0, len(stxns)) + for i := 0; i < len(stxns); i++ { + groupIDs := groupIndexes + groupIDs = append(groupIDs, i) + item := makeObject(strconv.Itoa(i), encodeInnerTxnID(groupIDs)) + if preview { + txnPreview := makeTxnPreview(stxns, i) + item.Value.Preview = &txnPreview + } + desc = append(desc, item) + } + return +} + +func makeInnerTxnsState(s *cdtState, preview bool) (desc []cdt.RuntimePropertyDescriptor) { + return makeInnerTxnsSlice(s.innerTxns, []int{}, 0, len(s.innerTxns)-1, preview) +} + func makeTealError(s *cdtState, preview bool) (desc []cdt.RuntimePropertyDescriptor) { desc = make([]cdt.RuntimePropertyDescriptor, 0) if lastError := s.err.Load(); len(lastError) != 0 { diff --git a/cmd/tealdbg/cdtdbg.go b/cmd/tealdbg/cdtdbg.go index 094b593c17..fd88bf92e0 100644 --- a/cmd/tealdbg/cdtdbg.go +++ b/cmd/tealdbg/cdtdbg.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/tealdbg/cdtdbg_test.go b/cmd/tealdbg/cdtdbg_test.go index fb6b4c0a69..3e6acf8b11 100644 --- a/cmd/tealdbg/cdtdbg_test.go +++ b/cmd/tealdbg/cdtdbg_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/tealdbg/debugger.go b/cmd/tealdbg/debugger.go index 0ed24bf858..4d7421f93f 100644 --- a/cmd/tealdbg/debugger.go +++ b/cmd/tealdbg/debugger.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -361,6 +361,14 @@ func (s *session) GetStates(st *logic.DebugState) AppState { newStates.locals[addr] = local } + if len(changes.Logs) > 0 { + newStates.logs = changes.Logs + } + + if len(changes.InnerTxns) > 0 { + newStates.innerTxns = changes.InnerTxns + } + return newStates } diff --git a/cmd/tealdbg/debugger_test.go b/cmd/tealdbg/debugger_test.go index d1d815b1a3..b37f7fb35e 100644 --- a/cmd/tealdbg/debugger_test.go +++ b/cmd/tealdbg/debugger_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -100,11 +100,8 @@ func TestDebuggerSimple(t *testing.T) { da := makeTestDbgAdapter(t) debugger.AddAdapter(da) - ep := logic.EvalParams{ - Proto: &proto, - Debugger: debugger, - Txn: &transactions.SignedTxn{}, - } + ep := logic.NewEvalParams(make([]transactions.SignedTxnWithAD, 1), &proto, nil) + ep.Debugger = debugger source := `int 0 int 1 @@ -112,8 +109,9 @@ int 1 ` ops, err := logic.AssembleStringWithVersion(source, 1) require.NoError(t, err) + ep.TxnGroup[0].Lsig.Logic = ops.Program - _, err = logic.Eval(ops.Program, ep) + _, err = logic.EvalSignature(0, ep) require.NoError(t, err) da.WaitForCompletion() diff --git a/cmd/tealdbg/dryrunRequest.go b/cmd/tealdbg/dryrunRequest.go index 2963372fb4..b1ec50cda8 100644 --- a/cmd/tealdbg/dryrunRequest.go +++ b/cmd/tealdbg/dryrunRequest.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/tealdbg/homepage.go b/cmd/tealdbg/homepage.go index 95d3cf0a50..4af43c4c8f 100644 --- a/cmd/tealdbg/homepage.go +++ b/cmd/tealdbg/homepage.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/tealdbg/local.go b/cmd/tealdbg/local.go index aa5fb3aafa..6bf088e2ff 100644 --- a/cmd/tealdbg/local.go +++ b/cmd/tealdbg/local.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -158,10 +158,23 @@ type evalResult struct { // AppState encapsulates information about execution of stateful teal program type AppState struct { - appIdx basics.AppIndex - schemas basics.StateSchemas - global map[basics.AppIndex]basics.TealKeyValue - locals map[basics.Address]map[basics.AppIndex]basics.TealKeyValue + appIdx basics.AppIndex + schemas basics.StateSchemas + global map[basics.AppIndex]basics.TealKeyValue + locals map[basics.Address]map[basics.AppIndex]basics.TealKeyValue + logs []string + innerTxns []transactions.SignedTxnWithAD +} + +func cloneInners(a []transactions.SignedTxnWithAD) (b []transactions.SignedTxnWithAD) { + if a != nil { + b = make([]transactions.SignedTxnWithAD, len(a)) + copy(b, a) + for i, itxn := range a { + b[i].EvalDelta.InnerTxns = cloneInners(itxn.EvalDelta.InnerTxns) + } + } + return } func (a *AppState) clone() (b AppState) { @@ -177,11 +190,18 @@ func (a *AppState) clone() (b AppState) { b.locals[addr][aid] = tkv.Clone() } } + b.logs = make([]string, len(a.logs)) + copy(b.logs, a.logs) + b.innerTxns = cloneInners(a.innerTxns) return } func (a *AppState) empty() bool { - return a.appIdx == 0 && len(a.global) == 0 && len(a.locals) == 0 + return a.appIdx == 0 && + len(a.global) == 0 && + len(a.locals) == 0 && + len(a.logs) == 0 && + len(a.innerTxns) == 0 } type modeType int @@ -205,25 +225,25 @@ const ( // evaluation is a description of a single debugger run type evaluation struct { - program []byte - source string - offsetToLine map[int]int - name string - groupIndex uint64 - pastSideEffects []logic.EvalSideEffects - mode modeType - aidx basics.AppIndex - ba apply.Balances - result evalResult - states AppState + program []byte + source string + offsetToLine map[int]int + name string + groupIndex uint64 + mode modeType + aidx basics.AppIndex + ba apply.Balances + result evalResult + states AppState } -func (e *evaluation) eval(ep logic.EvalParams) (pass bool, err error) { +func (e *evaluation) eval(gi int, ep *logic.EvalParams) (pass bool, err error) { if e.mode == modeStateful { - pass, _, err = e.ba.StatefulEval(ep, e.aidx, e.program) + pass, _, err = e.ba.StatefulEval(gi, ep, e.aidx, e.program) return } - return logic.Eval(e.program, ep) + ep.TxnGroup[gi].Lsig.Logic = e.program + return logic.EvalSignature(gi, ep) } // LocalRunner runs local eval @@ -238,6 +258,8 @@ type LocalRunner struct { func makeAppState() (states AppState) { states.global = make(map[basics.AppIndex]basics.TealKeyValue) states.locals = make(map[basics.Address]map[basics.AppIndex]basics.TealKeyValue) + states.logs = make([]string, 0) + states.innerTxns = make([]transactions.SignedTxnWithAD, 0) return } @@ -340,17 +362,6 @@ func (r *LocalRunner) Setup(dp *DebugParams) (err error) { dp.LatestTimestamp = int64(ddr.LatestTimestamp) } - if dp.PastSideEffects == nil { - dp.PastSideEffects = logic.MakePastSideEffects(len(r.txnGroup)) - } else if len(dp.PastSideEffects) != len(r.txnGroup) { - err = fmt.Errorf( - "invalid past side effects slice with length %d should match group length of %d txns", - len(dp.PastSideEffects), - len(r.txnGroup), - ) - return - } - // if program(s) specified then run from it if len(dp.ProgramBlobs) > 0 { if len(r.txnGroup) == 1 && dp.GroupIndex != 0 { @@ -388,7 +399,6 @@ func (r *LocalRunner) Setup(dp *DebugParams) (err error) { } } r.runs[i].groupIndex = uint64(dp.GroupIndex) - r.runs[i].pastSideEffects = dp.PastSideEffects r.runs[i].name = dp.ProgramNames[i] var mode modeType @@ -451,13 +461,12 @@ func (r *LocalRunner) Setup(dp *DebugParams) (err error) { return } run := evaluation{ - program: stxn.Txn.ApprovalProgram, - groupIndex: uint64(gi), - pastSideEffects: dp.PastSideEffects, - mode: modeStateful, - aidx: appIdx, - ba: b, - states: states, + program: stxn.Txn.ApprovalProgram, + groupIndex: uint64(gi), + mode: modeStateful, + aidx: appIdx, + ba: b, + states: states, } r.runs = append(r.runs, run) } @@ -487,13 +496,12 @@ func (r *LocalRunner) Setup(dp *DebugParams) (err error) { return } run := evaluation{ - program: program, - groupIndex: uint64(gi), - pastSideEffects: dp.PastSideEffects, - mode: modeStateful, - aidx: appIdx, - ba: b, - states: states, + program: program, + groupIndex: uint64(gi), + mode: modeStateful, + aidx: appIdx, + ba: b, + states: states, } r.runs = append(r.runs, run) found = true @@ -522,47 +530,27 @@ func (r *LocalRunner) RunAll() error { return fmt.Errorf("no program to debug") } + txngroup := transactions.WrapSignedTxnsWithAD(r.txnGroup) failed := 0 start := time.Now() - pooledApplicationBudget := uint64(0) - credit, _ := transactions.FeeCredit(r.txnGroup, r.proto.MinTxnFee) - // ignore error since fees are not important for debugging in most cases - - evalParams := make([]logic.EvalParams, len(r.runs)) - for i, run := range r.runs { - if run.mode == modeStateful { - if r.proto.EnableAppCostPooling { - pooledApplicationBudget += uint64(r.proto.MaxAppProgramCost) - } else { - pooledApplicationBudget = uint64(r.proto.MaxAppProgramCost) - } - } - ep := logic.EvalParams{ - Proto: &r.proto, - Debugger: r.debugger, - Txn: &r.txnGroup[run.groupIndex], - TxnGroup: r.txnGroup, - GroupIndex: run.groupIndex, - PastSideEffects: run.pastSideEffects, - Specials: &transactions.SpecialAddresses{}, - FeeCredit: &credit, - PooledApplicationBudget: &pooledApplicationBudget, - } - evalParams[i] = ep - } + ep := logic.NewEvalParams(txngroup, &r.proto, &transactions.SpecialAddresses{}) + ep.Debugger = r.debugger + + var last error for i := range r.runs { run := &r.runs[i] r.debugger.SaveProgram(run.name, run.program, run.source, run.offsetToLine, run.states) - run.result.pass, run.result.err = run.eval(evalParams[i]) + run.result.pass, run.result.err = run.eval(int(run.groupIndex), ep) if run.result.err != nil { failed++ + last = run.result.err } } elapsed := time.Since(start) if failed == len(r.runs) && elapsed < time.Second { - return fmt.Errorf("all %d program(s) failed in less than a second, invocation error?", failed) + return fmt.Errorf("all %d program(s) failed in less than a second, invocation error? %w", failed, last) } return nil } @@ -573,44 +561,19 @@ func (r *LocalRunner) Run() (bool, error) { return false, fmt.Errorf("no program to debug") } - pooledApplicationBudget := uint64(0) - credit, _ := transactions.FeeCredit(r.txnGroup, r.proto.MinTxnFee) - // ignore error since fees are not important for debugging in most cases - - evalParams := make([]logic.EvalParams, len(r.runs)) - for i, run := range r.runs { - if run.mode == modeStateful { - if r.proto.EnableAppCostPooling { - pooledApplicationBudget += uint64(r.proto.MaxAppProgramCost) - } else { - pooledApplicationBudget = uint64(r.proto.MaxAppProgramCost) - } - } - ep := logic.EvalParams{ - Proto: &r.proto, - Txn: &r.txnGroup[run.groupIndex], - TxnGroup: r.txnGroup, - GroupIndex: run.groupIndex, - PastSideEffects: run.pastSideEffects, - Specials: &transactions.SpecialAddresses{}, - FeeCredit: &credit, - PooledApplicationBudget: &pooledApplicationBudget, - } - - // Workaround for Go's nil/empty interfaces nil check after nil assignment, i.e. - // r.debugger = nil - // ep.Debugger = r.debugger - // if ep.Debugger != nil // FALSE - if r.debugger != nil { - r.debugger.SaveProgram(run.name, run.program, run.source, run.offsetToLine, run.states) - ep.Debugger = r.debugger - } + txngroup := transactions.WrapSignedTxnsWithAD(r.txnGroup) - evalParams[i] = ep - } + ep := logic.NewEvalParams(txngroup, &r.proto, &transactions.SpecialAddresses{}) run := r.runs[0] - ep := evalParams[0] + // Workaround for Go's nil/empty interfaces nil check after nil assignment, i.e. + // r.debugger = nil + // ep.Debugger = r.debugger + // if ep.Debugger != nil // FALSE + if r.debugger != nil { + r.debugger.SaveProgram(run.name, run.program, run.source, run.offsetToLine, run.states) + ep.Debugger = r.debugger + } - return run.eval(ep) + return run.eval(int(run.groupIndex), ep) } diff --git a/cmd/tealdbg/localLedger.go b/cmd/tealdbg/localLedger.go index 364186f556..2d82c464d2 100644 --- a/cmd/tealdbg/localLedger.go +++ b/cmd/tealdbg/localLedger.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/tealdbg/localLedger_test.go b/cmd/tealdbg/localLedger_test.go index be2ef81898..3dad5508cd 100644 --- a/cmd/tealdbg/localLedger_test.go +++ b/cmd/tealdbg/localLedger_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -90,6 +90,7 @@ int 2 // make transaction group: app call + sample payment txn := transactions.SignedTxn{ Txn: transactions.Transaction{ + Type: protocol.ApplicationCallTx, Header: transactions.Header{ Sender: addr, Fee: basics.MicroAlgos{Raw: 100}, @@ -109,22 +110,15 @@ int 2 a.NoError(err) proto := config.Consensus[protocol.ConsensusCurrentVersion] - pse := logic.MakePastSideEffects(1) - ep := logic.EvalParams{ - Txn: &txn, - Proto: &proto, - TxnGroup: []transactions.SignedTxn{txn}, - GroupIndex: 0, - PastSideEffects: pse, - } - pass, delta, err := ba.StatefulEval(ep, appIdx, program) + ep := logic.NewEvalParams([]transactions.SignedTxnWithAD{{SignedTxn: txn}}, &proto, &transactions.SpecialAddresses{}) + pass, delta, err := ba.StatefulEval(0, ep, appIdx, program) a.NoError(err) a.True(pass) - a.Equal(1, len(delta.GlobalDelta)) + a.Len(delta.GlobalDelta, 1) a.Equal(basics.SetUintAction, delta.GlobalDelta["gkeyint"].Action) a.Equal(uint64(3), delta.GlobalDelta["gkeyint"].Uint) - a.Equal(1, len(delta.LocalDeltas)) - a.Equal(1, len(delta.LocalDeltas[0])) + a.Len(delta.LocalDeltas, 1) + a.Len(delta.LocalDeltas[0], 1) a.Equal(basics.SetUintAction, delta.LocalDeltas[0]["lkeyint"].Action) a.Equal(uint64(2), delta.LocalDeltas[0]["lkeyint"].Uint) } diff --git a/cmd/tealdbg/local_test.go b/cmd/tealdbg/local_test.go index d78c402e80..84328dbbbb 100644 --- a/cmd/tealdbg/local_test.go +++ b/cmd/tealdbg/local_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -26,6 +26,7 @@ import ( "strings" "testing" + "github.com/algorand/go-algorand/config" v2 "github.com/algorand/go-algorand/daemon/algod/api/server/v2" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/transactions" @@ -316,6 +317,7 @@ func TestDebugEnvironment(t *testing.T) { // make transaction group: app call + sample payment txn := transactions.SignedTxn{ Txn: transactions.Transaction{ + Type: protocol.ApplicationCallTx, Header: transactions.Header{ Sender: sender, Fee: basics.MicroAlgos{Raw: 1000}, @@ -523,7 +525,7 @@ func TestDebugFromPrograms(t *testing.T) { partitiontest.PartitionTest(t) a := require.New(t) - txnBlob := []byte("[" + strings.Join([]string{string(txnSample), txnSample}, ",") + "]") + txnBlob := []byte("[" + strings.Join([]string{txnSample, txnSample}, ",") + "]") l := LocalRunner{} dp := DebugParams{ @@ -602,7 +604,7 @@ func TestRunMode(t *testing.T) { partitiontest.PartitionTest(t) a := require.New(t) - txnBlob := []byte("[" + strings.Join([]string{string(txnSample), txnSample}, ",") + "]") + txnBlob := []byte("[" + strings.Join([]string{txnSample, txnSample}, ",") + "]") l := LocalRunner{} // check run mode auto on stateful code @@ -624,7 +626,7 @@ func TestRunMode(t *testing.T) { a.Equal(modeStateful, l.runs[0].mode) a.Equal(basics.AppIndex(100), l.runs[0].aidx) a.NotEqual( - reflect.ValueOf(logic.Eval).Pointer(), + reflect.ValueOf(logic.EvalSignature).Pointer(), reflect.ValueOf(l.runs[0].eval).Pointer(), ) @@ -959,7 +961,7 @@ func TestLocalBalanceAdapter(t *testing.T) { a.Equal(modeStateful, l.runs[0].mode) a.NotEmpty(l.runs[0].aidx) a.NotEqual( - reflect.ValueOf(logic.Eval).Pointer(), + reflect.ValueOf(logic.EvalSignature).Pointer(), reflect.ValueOf(l.runs[0].eval).Pointer(), ) ba := l.runs[0].ba @@ -984,7 +986,7 @@ func TestLocalBalanceAdapterIndexer(t *testing.T) { case strings.HasPrefix(r.URL.Path, accountPath): w.WriteHeader(200) if r.URL.Path[len(accountPath):] == brs.Addr.String() { - account, err := v2.AccountDataToAccount(brs.Addr.String(), &brs.AccountData, map[basics.AssetIndex]string{}, 100, basics.MicroAlgos{Raw: 0}) + account, err := v2.AccountDataToAccount(brs.Addr.String(), &brs.AccountData, map[basics.AssetIndex]string{}, 100, &config.ConsensusParams{MinBalance: 100000}, basics.MicroAlgos{Raw: 0}) a.NoError(err) accountResponse := AccountIndexerResponse{Account: account, CurrentRound: 100} response, err := json.Marshal(accountResponse) @@ -1050,7 +1052,7 @@ func TestLocalBalanceAdapterIndexer(t *testing.T) { a.Equal(modeStateful, l.runs[0].mode) a.NotEmpty(l.runs[0].aidx) a.NotEqual( - reflect.ValueOf(logic.Eval).Pointer(), + reflect.ValueOf(logic.EvalSignature).Pointer(), reflect.ValueOf(l.runs[0].eval).Pointer(), ) diff --git a/cmd/tealdbg/main.go b/cmd/tealdbg/main.go index ea09dd1ed3..97701b9791 100644 --- a/cmd/tealdbg/main.go +++ b/cmd/tealdbg/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -17,14 +17,14 @@ package main import ( - "fmt" "io/ioutil" "log" "os" - "strings" "github.com/gorilla/mux" "github.com/spf13/cobra" + + cmdutil "github.com/algorand/go-algorand/cmd/util" ) func main() { @@ -65,49 +65,16 @@ var remoteCmd = &cobra.Command{ }, } -// cobraStringValue is a cobra's string flag with restricted values -type cobraStringValue struct { - value string - allowed []string - isSet bool -} - -func makeCobraStringValue(value string, others []string) *cobraStringValue { - c := new(cobraStringValue) - c.value = value - c.allowed = make([]string, 0, len(others)+1) - c.allowed = append(c.allowed, value) - for _, s := range others { - c.allowed = append(c.allowed, s) - } - return c -} - -func (c *cobraStringValue) String() string { return c.value } -func (c *cobraStringValue) Type() string { return "string" } -func (c *cobraStringValue) IsSet() bool { return c.isSet } - -func (c *cobraStringValue) Set(other string) error { - for _, s := range c.allowed { - if other == s { - c.value = other - c.isSet = true - return nil - } - } - return fmt.Errorf("value %s not allowed", other) -} - -func (c *cobraStringValue) AllowedString() string { - return strings.Join(c.allowed, ", ") +type frontendValue struct { + *cmdutil.CobraStringValue } -type frontendValue struct { - *cobraStringValue +func (f *frontendValue) value() string { + return f.CobraStringValue.String() } func (f *frontendValue) Make(router *mux.Router, appAddress string) (da DebugAdapter) { - switch f.value { + switch f.value() { case "web": wa := MakeWebPageFrontend(&WebPageFrontendParams{router, appAddress}) return wa @@ -120,10 +87,10 @@ func (f *frontendValue) Make(router *mux.Router, appAddress string) (da DebugAda } type runModeValue struct { - *cobraStringValue + *cmdutil.CobraStringValue } -var frontend frontendValue = frontendValue{makeCobraStringValue("cdt", []string{"web"})} +var frontend frontendValue = frontendValue{cmdutil.MakeCobraStringValue("cdt", []string{"web"})} var proto string var txnFile string var groupIndex int @@ -133,7 +100,7 @@ var indexerURL string var indexerToken string var roundNumber uint64 var timestamp int64 -var runMode runModeValue = runModeValue{makeCobraStringValue("auto", []string{"signature", "application"})} +var runMode runModeValue = runModeValue{cmdutil.MakeCobraStringValue("auto", []string{"signature", "application"})} var port int var iface string var noFirstRun bool diff --git a/cmd/tealdbg/remote.go b/cmd/tealdbg/remote.go index 1dc6371997..05b468979c 100644 --- a/cmd/tealdbg/remote.go +++ b/cmd/tealdbg/remote.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/tealdbg/remote_test.go b/cmd/tealdbg/remote_test.go index 553bc4c564..5ac654cd75 100644 --- a/cmd/tealdbg/remote_test.go +++ b/cmd/tealdbg/remote_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/tealdbg/server.go b/cmd/tealdbg/server.go index 43335921fc..cf062af627 100644 --- a/cmd/tealdbg/server.go +++ b/cmd/tealdbg/server.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -25,14 +25,26 @@ import ( "strings" "time" - "github.com/algorand/go-algorand/data/transactions/logic" "github.com/algorand/websocket" "github.com/gorilla/mux" ) +const ( + // WebSocketReadBufferSize is the size of the ReadBuffer for the + // tealdbg/cdt websocket session. + // A buffer that is too small will cause the session to choke + // during the `getScriptSource` call and the session cannot recover. + WebSocketReadBufferSize = 81920 + + // WebSocketWriteBufferSize is the size of the WriteBuffer for the + // tealdbg/cdt websocket session. + // The reasoning for the size is the same as above + WebSocketWriteBufferSize = 81920 +) + var upgrader = websocket.Upgrader{ - ReadBufferSize: 20480, - WriteBufferSize: 20480, + ReadBufferSize: WebSocketReadBufferSize, + WriteBufferSize: WebSocketWriteBufferSize, CheckOrigin: func(r *http.Request) bool { if len(r.Header.Get("Origin")) == 0 { return true @@ -73,7 +85,6 @@ type DebugParams struct { Proto string TxnBlob []byte GroupIndex int - PastSideEffects []logic.EvalSideEffects BalanceBlob []byte DdrBlob []byte IndexerURL string diff --git a/cmd/tealdbg/server_test.go b/cmd/tealdbg/server_test.go index 232c6a6f4c..a91be71819 100644 --- a/cmd/tealdbg/server_test.go +++ b/cmd/tealdbg/server_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -131,7 +131,7 @@ func TestServerRemote(t *testing.T) { func TestServerLocal(t *testing.T) { partitiontest.PartitionTest(t) - txnBlob := []byte("[" + strings.Join([]string{string(txnSample), txnSample}, ",") + "]") + txnBlob := []byte("[" + strings.Join([]string{txnSample, txnSample}, ",") + "]") dp := DebugParams{ ProgramNames: []string{"test"}, ProgramBlobs: [][]byte{{2, 0x20, 1, 1, 0x22}}, // version, intcb, int 1 diff --git a/cmd/tealdbg/util.go b/cmd/tealdbg/util.go index e1edb774ec..6a7f880efb 100644 --- a/cmd/tealdbg/util.go +++ b/cmd/tealdbg/util.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/tealdbg/util_test.go b/cmd/tealdbg/util_test.go index 8613a398bd..85de0747dd 100644 --- a/cmd/tealdbg/util_test.go +++ b/cmd/tealdbg/util_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/tealdbg/webdbg.go b/cmd/tealdbg/webdbg.go index 27f7dae4ae..3f99eea705 100644 --- a/cmd/tealdbg/webdbg.go +++ b/cmd/tealdbg/webdbg.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/tealdbg/webdbg_test.go b/cmd/tealdbg/webdbg_test.go index 5f340ff6aa..be6801d636 100644 --- a/cmd/tealdbg/webdbg_test.go +++ b/cmd/tealdbg/webdbg_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/updater/commands.go b/cmd/updater/commands.go index b0a980f9f8..03d2f2a48d 100644 --- a/cmd/updater/commands.go +++ b/cmd/updater/commands.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/updater/sendCmd.go b/cmd/updater/sendCmd.go index 34adb1fcf2..d3a4a0cd9d 100644 --- a/cmd/updater/sendCmd.go +++ b/cmd/updater/sendCmd.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/updater/toolsCmd.go b/cmd/updater/toolsCmd.go index 69be9057f7..d236442520 100644 --- a/cmd/updater/toolsCmd.go +++ b/cmd/updater/toolsCmd.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/updater/util.go b/cmd/updater/util.go index fb0086b2d2..0bb03baa04 100644 --- a/cmd/updater/util.go +++ b/cmd/updater/util.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/updater/versionCmd.go b/cmd/updater/versionCmd.go index 5b8345bf8d..aeb24a7a97 100644 --- a/cmd/updater/versionCmd.go +++ b/cmd/updater/versionCmd.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/updater/version_test.go b/cmd/updater/version_test.go index 2869461658..34f23499e5 100644 --- a/cmd/updater/version_test.go +++ b/cmd/updater/version_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/cmd/util/cmd.go b/cmd/util/cmd.go new file mode 100644 index 0000000000..e38972e9c2 --- /dev/null +++ b/cmd/util/cmd.go @@ -0,0 +1,131 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package cmdutil + +import ( + "fmt" + "strings" +) + +// CobraStringValue is similar to spf13.pflag.stringValue but enforces allowed values +type CobraStringValue struct { + value string + allowed []string + isSet bool +} + +// MakeCobraStringValue creates a string value (satisfying spf13/pflag.Value interface) +// for a limited number of valid options +func MakeCobraStringValue(value string, others []string) *CobraStringValue { + c := new(CobraStringValue) + c.value = value + c.allowed = make([]string, 0, len(others)+1) + c.allowed = append(c.allowed, value) + c.allowed = append(c.allowed, others...) + return c +} + +func (c *CobraStringValue) String() string { return c.value } + +// Type returns the value type as a string +func (c *CobraStringValue) Type() string { return "string" } + +// IsSet returns a boolean flag indicating of the value was changed from defaults +func (c *CobraStringValue) IsSet() bool { return c.isSet } + +// Set sets a value and fails if it is not allowed +func (c *CobraStringValue) Set(other string) error { + for _, s := range c.allowed { + if other == s { + c.value = other + c.isSet = true + return nil + } + } + return fmt.Errorf("value %s not allowed", other) +} + +// AllowedString returns a comma-separated string of allowed values +func (c *CobraStringValue) AllowedString() string { + return strings.Join(c.allowed, ", ") +} + +// CobraStringSliceValue is similar to spf13.pflag.stringSliceValue but enforces allowed values +type CobraStringSliceValue struct { + value []string + allowed []string + allowedMap map[string]int + isSet bool +} + +// MakeCobraStringSliceValue creates a string slice value (satisfying spf13/pflag.Value interface) +// for a limited number of valid options +func MakeCobraStringSliceValue(value *[]string, others []string) *CobraStringSliceValue { + c := new(CobraStringSliceValue) + if value != nil { + c.value = *value + } + + // make allowed values by filtering out duplicates and preseve the order + c.allowedMap = make(map[string]int, len(others)+len(c.value)) + var dups int + for i, v := range append(c.value, others...) { + if _, ok := c.allowedMap[v]; !ok { + c.allowedMap[v] = i - dups + } else { + dups++ + } + } + c.allowed = make([]string, len(c.allowedMap)) + for v, i := range c.allowedMap { + c.allowed[i] = v + } + return c +} + +func (c *CobraStringSliceValue) String() string { return "[" + strings.Join(c.value, ", ") + "]" } + +// Type returns the value type as a string +func (c *CobraStringSliceValue) Type() string { return "stringSlice" } + +// IsSet returns a boolean flag indicating of the value was changed from defaults +func (c *CobraStringSliceValue) IsSet() bool { return c.isSet } + +// Set sets a value and fails if it is not allowed +func (c *CobraStringSliceValue) Set(values string) error { + others := strings.Split(values, ",") + for _, other := range others { + other = strings.TrimSpace(other) + if _, ok := c.allowedMap[other]; ok { + c.value = append(c.value, other) + c.isSet = true + } else { + return fmt.Errorf("value %s not allowed", other) + } + } + return nil +} + +// AllowedString returns a comma-separated string of allowed values +func (c *CobraStringSliceValue) AllowedString() string { + return strings.Join(c.allowed, ", ") +} + +// GetSlice returns a current value as a string slice +func (c *CobraStringSliceValue) GetSlice() []string { + return c.value +} diff --git a/compactcert/abstractions.go b/compactcert/abstractions.go index ac02ec2c84..4cf4b7a93a 100644 --- a/compactcert/abstractions.go +++ b/compactcert/abstractions.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -54,5 +54,5 @@ type Network interface { // Accounts captures the aspects of the AccountManager that are used by // this package. type Accounts interface { - Keys(basics.Round) []account.Participation + StateProofKeys(basics.Round) []account.StateProofRecordForRound } diff --git a/compactcert/builder.go b/compactcert/builder.go index f6adbfafb0..c590abbfeb 100644 --- a/compactcert/builder.go +++ b/compactcert/builder.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/compactcert/db.go b/compactcert/db.go index ee933c69d4..4d71ea5702 100644 --- a/compactcert/db.go +++ b/compactcert/db.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -20,7 +20,7 @@ import ( "database/sql" "fmt" - "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/crypto/merklesignature" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/protocol" ) @@ -47,7 +47,7 @@ var schema = []string{ type pendingSig struct { signer basics.Address - sig crypto.OneTimeSignature + sig merklesignature.Signature fromThisNode bool } diff --git a/compactcert/db_test.go b/compactcert/db_test.go index e34eb8fbbc..dee7271d75 100644 --- a/compactcert/db_test.go +++ b/compactcert/db_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/compactcert/signer.go b/compactcert/signer.go index 7672111304..915ac60407 100644 --- a/compactcert/signer.go +++ b/compactcert/signer.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -22,7 +22,7 @@ import ( "time" "github.com/algorand/go-algorand/config" - "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/crypto/merklesignature" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/bookkeeping" "github.com/algorand/go-algorand/protocol" @@ -34,9 +34,9 @@ import ( type sigFromAddr struct { _struct struct{} `codec:",omitempty,omitemptyarray"` - Signer basics.Address `codec:"signer"` - Round basics.Round `codec:"rnd"` - Sig crypto.OneTimeSignature `codec:"sig"` + Signer basics.Address `codec:"signer"` + Round basics.Round `codec:"rnd"` + Sig merklesignature.Signature `codec:"sig"` } func (ccw *Worker) signer(latest basics.Round) { @@ -93,12 +93,7 @@ func (ccw *Worker) signBlock(hdr bookkeeping.BlockHeader) { return } - // Compact cert gets signed by the next round after the block, - // because by the time agreement is reached on the block, - // ephemeral keys for that round could be deleted. - sigKeyRound := hdr.Round + 1 - - keys := ccw.accts.Keys(sigKeyRound) + keys := ccw.accts.StateProofKeys(hdr.Round) if len(keys) == 0 { // No keys, nothing to do. return @@ -113,33 +108,35 @@ func (ccw *Worker) signBlock(hdr bookkeeping.BlockHeader) { return } - if votersHdr.CompactCert[protocol.CompactCertBasic].CompactCertVoters.IsZero() { + if votersHdr.CompactCert[protocol.CompactCertBasic].CompactCertVoters.IsEmpty() { // No voter commitment, perhaps because compact certs were // just enabled. return } - votersProto := config.Consensus[votersHdr.CurrentProtocol] + sigs := make([]sigFromAddr, 0, len(keys)) - var sigs []sigFromAddr - var sigkeys []crypto.OneTimeSignatureVerifier for _, key := range keys { - if key.FirstValid <= sigKeyRound && sigKeyRound <= key.LastValid { - keyDilution := key.KeyDilution - if keyDilution == 0 { - keyDilution = votersProto.DefaultKeyDilution - } + if key.FirstValid > hdr.Round || hdr.Round > key.LastValid { + continue + } - ephID := basics.OneTimeIDForRound(sigKeyRound, keyDilution) - sig := key.Voting.Sign(ephID, hdr) + if key.StateProofSecrets == nil { + ccw.log.Warnf("ccw.signBlock(%d): empty state proof secrets for round", hdr.Round) + continue + } - sigs = append(sigs, sigFromAddr{ - Signer: key.Parent, - Round: hdr.Round, - Sig: sig, - }) - sigkeys = append(sigkeys, key.Voting.OneTimeSignatureVerifier) + sig, err := key.StateProofSecrets.Sign(hdr) + if err != nil { + ccw.log.Warnf("ccw.signBlock(%d): StateProofSecrets.Sign: %v", hdr.Round, err) + continue } + + sigs = append(sigs, sigFromAddr{ + Signer: key.Account, + Round: hdr.Round, + Sig: sig, + }) } for _, sfa := range sigs { diff --git a/compactcert/worker.go b/compactcert/worker.go index d84f7848ff..38341d7ade 100644 --- a/compactcert/worker.go +++ b/compactcert/worker.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -21,6 +21,8 @@ import ( "database/sql" "sync" + "github.com/algorand/go-deadlock" + "github.com/algorand/go-algorand/crypto/compactcert" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/bookkeeping" @@ -29,8 +31,6 @@ import ( "github.com/algorand/go-algorand/network" "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/util/db" - - "github.com/algorand/go-deadlock" ) type builder struct { diff --git a/compactcert/worker_test.go b/compactcert/worker_test.go index adc784f0e4..5e72b96bf4 100644 --- a/compactcert/worker_test.go +++ b/compactcert/worker_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -77,7 +77,11 @@ func (s *testWorkerStubs) addBlock(ccNextRound basics.Round) { hdr.Round = s.latest hdr.CurrentProtocol = protocol.ConsensusFuture - var ccBasic bookkeeping.CompactCertState + var ccBasic = bookkeeping.CompactCertState{ + CompactCertVoters: make([]byte, compactcert.HashSize), + CompactCertVotersTotal: basics.MicroAlgos{}, + CompactCertNextRound: 0, + } ccBasic.CompactCertVotersTotal.Raw = uint64(s.totalWeight) if hdr.Round > 0 { @@ -96,10 +100,29 @@ func (s *testWorkerStubs) addBlock(ccNextRound basics.Round) { } } -func (s *testWorkerStubs) Keys(rnd basics.Round) (out []account.Participation) { +func (s *testWorkerStubs) StateProofKeys(rnd basics.Round) (out []account.StateProofRecordForRound) { for _, part := range s.keys { if part.OverlapsInterval(rnd, rnd) { - out = append(out, part) + partRecord := account.ParticipationRecord{ + ParticipationID: part.ID(), + Account: part.Parent, + FirstValid: part.FirstValid, + LastValid: part.LastValid, + KeyDilution: part.KeyDilution, + LastVote: 0, + LastBlockProposal: 0, + LastStateProof: 0, + EffectiveFirst: 0, + EffectiveLast: 0, + VRF: part.VRF, + Voting: part.Voting, + } + signerInRound := part.StateProofSecrets.GetSigner(uint64(rnd)) + partRecordForRound := account.StateProofRecordForRound{ + ParticipationRecord: partRecord, + StateProofSecrets: signerInRound, + } + out = append(out, partRecordForRound) } } return @@ -131,13 +154,12 @@ func (s *testWorkerStubs) CompactCertVoters(r basics.Round) (*ledgercore.VotersF for i, k := range s.keysForVoters { voters.AddrToPos[k.Parent] = uint64(i) voters.Participants = append(voters.Participants, basics.Participant{ - PK: k.Voting.OneTimeSignatureVerifier, - Weight: 1, - KeyDilution: config.Consensus[protocol.ConsensusFuture].DefaultKeyDilution, + PK: *k.StateProofSecrets.GetVerifier(), + Weight: 1, }) } - tree, err := merklearray.Build(voters.Participants) + tree, err := merklearray.BuildVectorCommitmentTree(voters.Participants, crypto.HashFactory{HashType: compactcert.HashType}) if err != nil { return nil, err } @@ -201,15 +223,17 @@ func newTestWorker(t testing.TB, s *testWorkerStubs) *Worker { return newTestWorkerDB(t, s, dbs.Wdb) } -func newPartKey(t testing.TB, parent basics.Address) account.Participation { +// You must call defer part.Close() after calling this function, +// since it creates a DB accessor but the caller must close it (required for mss) +func newPartKey(t testing.TB, parent basics.Address) account.PersistedParticipation { fn := fmt.Sprintf("%s.%d", strings.ReplaceAll(t.Name(), "/", "."), crypto.RandUint64()) partDB, err := db.MakeAccessor(fn, false, true) require.NoError(t, err) - part, err := account.FillDBWithParticipationKeys(partDB, parent, 0, 1024*1024, config.Consensus[protocol.ConsensusFuture].DefaultKeyDilution) + part, err := account.FillDBWithParticipationKeys(partDB, parent, 0, basics.Round(10*config.Consensus[protocol.ConsensusFuture].CompactCertRounds), config.Consensus[protocol.ConsensusFuture].DefaultKeyDilution) require.NoError(t, err) - part.Close() - return part.Participation + + return part } func TestWorkerAllSigs(t *testing.T) { @@ -219,7 +243,9 @@ func TestWorkerAllSigs(t *testing.T) { for i := 0; i < 10; i++ { var parent basics.Address crypto.RandBytes(parent[:]) - keys = append(keys, newPartKey(t, parent)) + p := newPartKey(t, parent) + defer p.Close() + keys = append(keys, p.Participation) } s := newWorkerStubs(t, keys, len(keys)) @@ -259,7 +285,7 @@ func TestWorkerAllSigs(t *testing.T) { ccparams := compactcert.Params{ Msg: signedHdr, ProvenWeight: provenWeight, - SigRound: basics.Round(signedHdr.Round + 1), + SigRound: basics.Round(signedHdr.Round), SecKQ: proto.CompactCertSecKQ, } @@ -281,7 +307,9 @@ func TestWorkerPartialSigs(t *testing.T) { for i := 0; i < 7; i++ { var parent basics.Address crypto.RandBytes(parent[:]) - keys = append(keys, newPartKey(t, parent)) + p := newPartKey(t, parent) + defer p.Close() + keys = append(keys, p.Participation) } s := newWorkerStubs(t, keys, 10) @@ -320,7 +348,7 @@ func TestWorkerPartialSigs(t *testing.T) { ccparams := compactcert.Params{ Msg: signedHdr, ProvenWeight: provenWeight, - SigRound: basics.Round(signedHdr.Round + 1), + SigRound: basics.Round(signedHdr.Round), SecKQ: proto.CompactCertSecKQ, } @@ -339,7 +367,9 @@ func TestWorkerInsufficientSigs(t *testing.T) { for i := 0; i < 2; i++ { var parent basics.Address crypto.RandBytes(parent[:]) - keys = append(keys, newPartKey(t, parent)) + p := newPartKey(t, parent) + defer p.Close() + keys = append(keys, p.Participation) } s := newWorkerStubs(t, keys, 10) @@ -370,7 +400,9 @@ func TestLatestSigsFromThisNode(t *testing.T) { for i := 0; i < 10; i++ { var parent basics.Address crypto.RandBytes(parent[:]) - keys = append(keys, newPartKey(t, parent)) + p := newPartKey(t, parent) + defer p.Close() + keys = append(keys, p.Participation) } s := newWorkerStubs(t, keys, 10) @@ -423,7 +455,9 @@ func TestWorkerRestart(t *testing.T) { for i := 0; i < 10; i++ { var parent basics.Address crypto.RandBytes(parent[:]) - keys = append(keys, newPartKey(t, parent)) + p := newPartKey(t, parent) + defer p.Close() + keys = append(keys, p.Participation) } s := newWorkerStubs(t, keys, 10) @@ -464,7 +498,9 @@ func TestWorkerHandleSig(t *testing.T) { for i := 0; i < 2; i++ { var parent basics.Address crypto.RandBytes(parent[:]) - keys = append(keys, newPartKey(t, parent)) + p := newPartKey(t, parent) + defer p.Close() + keys = append(keys, p.Participation) } s := newWorkerStubs(t, keys, 10) diff --git a/components/mocks/mockCatchpointCatchupAccessor.go b/components/mocks/mockCatchpointCatchupAccessor.go index 7f87473281..bd55d29e9b 100644 --- a/components/mocks/mockCatchpointCatchupAccessor.go +++ b/components/mocks/mockCatchpointCatchupAccessor.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/components/mocks/mockNetwork.go b/components/mocks/mockNetwork.go index ba8fce35fc..77e5f58780 100644 --- a/components/mocks/mockNetwork.go +++ b/components/mocks/mockNetwork.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/config/buildvars.go b/config/buildvars.go index 4c1395c1b9..a9a67d584a 100644 --- a/config/buildvars.go +++ b/config/buildvars.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/config/config.go b/config/config.go index 315d532895..4c16801302 100644 --- a/config/config.go +++ b/config/config.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/config/config_test.go b/config/config_test.go index 0c8033279f..c11edd3797 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/config/consensus.go b/config/consensus.go index f0ffa1a517..f266dc869b 100644 --- a/config/consensus.go +++ b/config/consensus.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -152,8 +152,7 @@ type ConsensusParams struct { // critical path AgreementFilterTimeoutPeriod0 time.Duration - FastRecoveryLambda time.Duration // time between fast recovery attempts - FastPartitionRecovery bool // set when fast partition recovery is enabled + FastRecoveryLambda time.Duration // time between fast recovery attempts // how to commit to the payset: flat or merkle tree PaysetCommit PaysetCommitType @@ -283,9 +282,17 @@ type ConsensusParams struct { // maximum sum of the lengths of the key and value of one app state entry MaxAppSumKeyValueLens int - // maximum number of inner transactions that can be created by an app call + // maximum number of inner transactions that can be created by an app call. + // with EnableInnerTransactionPooling, limit is multiplied by MaxTxGroupSize + // and enforced over the whole group. MaxInnerTransactions int + // should the number of inner transactions be pooled across group? + EnableInnerTransactionPooling bool + + // provide greater isolation for clear state programs + IsolateClearState bool + // maximum number of applications a single account can create and store // AppParams for at once MaxAppsCreated int @@ -395,6 +402,21 @@ type ConsensusParams struct { // MaxProposedExpiredOnlineAccounts is the maximum number of online accounts, which need // to be taken offline, that would be proposed to be taken offline. MaxProposedExpiredOnlineAccounts int + + //EnableBatchVerification enable the use of the batch verification algorithm. + EnableBatchVerification bool + + // When rewards rate changes, use the new value immediately. + RewardsCalculationFix bool + + // EnableStateProofKeyregCheck enables the check for stateProof key on key registration + EnableStateProofKeyregCheck bool + + // MaxKeyregValidPeriod defines the longest period (in rounds) allowed for a keyreg transaction. + // This number sets a limit to prevent the number of StateProof keys generated by the user from being too large, and also checked by the WellFormed method. + // The hard-limit for number of StateProof keys is derived from the maximum depth allowed for the merkle signature scheme's tree - 2^16. + // More keys => deeper merkle tree => longer proof required => infeasible for our SNARK. + MaxKeyregValidPeriod uint64 } // PaysetCommitType enumerates possible ways for the block header to commit to @@ -438,8 +460,8 @@ var MaxStateDeltaKeys int // any version, used only for decoding purposes. Never decrease this value. var MaxLogCalls int -// MaxInnerTransactions is the maximum number of inner transactions that may be created in an app call. -var MaxInnerTransactions int +// MaxInnerTransactionsPerDelta is the maximum number of inner transactions in one EvalDelta +var MaxInnerTransactionsPerDelta int // MaxLogicSigMaxSize is the largest logical signature appear in any of the supported // protocols, used for decoding purposes. @@ -508,7 +530,7 @@ func checkSetAllocBounds(p ConsensusParams) { // There is no consensus parameter for MaxLogCalls and MaxAppProgramLen as an approximation // Its value is much larger than any possible reasonable MaxLogCalls value in future checkSetMax(p.MaxAppProgramLen, &MaxLogCalls) - checkSetMax(p.MaxInnerTransactions, &MaxInnerTransactions) + checkSetMax(p.MaxInnerTransactions*p.MaxTxGroupSize, &MaxInnerTransactionsPerDelta) checkSetMax(p.MaxProposedExpiredOnlineAccounts, &MaxProposedExpiredOnlineAccounts) } @@ -708,7 +730,6 @@ func initConsensusProtocols() { // v10 introduces fast partition recovery (and also raises NumProposers). v10 := v9 - v10.FastPartitionRecovery = true v10.NumProposers = 20 v10.LateCommitteeSize = 500 v10.LateCommitteeThreshold = 320 @@ -1036,26 +1057,43 @@ func initConsensusProtocols() { // v29 can be upgraded to v30, with an update delay of 7 days ( see calculation above ) v29.ApprovedUpgrades[protocol.ConsensusV30] = 140000 + v31 := v30 + v31.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + v31.EnableBatchVerification = true + v31.RewardsCalculationFix = true + v31.MaxProposedExpiredOnlineAccounts = 32 + + // Enable TEAL 6 / AVM 1.1 + v31.LogicSigVersion = 6 + v31.EnableInnerTransactionPooling = true + v31.IsolateClearState = true + + // stat proof key registration + v31.EnableStateProofKeyregCheck = true + + // Maximum validity period for key registration, to prevent generating too many StateProof keys + v31.MaxKeyregValidPeriod = 256*(1<<16) - 1 + + Consensus[protocol.ConsensusV31] = v31 + + // v30 can be upgraded to v31, with an update delay of 7 days ( see calculation above ) + v30.ApprovedUpgrades[protocol.ConsensusV31] = 140000 + // ConsensusFuture is used to test features that are implemented // but not yet released in a production protocol version. - vFuture := v30 + vFuture := v31 vFuture.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} // FilterTimeout for period 0 should take a new optimized, configured value, need to revisit this later vFuture.AgreementFilterTimeoutPeriod0 = 4 * time.Second // Enable compact certificates. - vFuture.CompactCertRounds = 128 + vFuture.CompactCertRounds = 256 vFuture.CompactCertTopVoters = 1024 * 1024 vFuture.CompactCertVotersLookback = 16 vFuture.CompactCertWeightThreshold = (1 << 32) * 30 / 100 vFuture.CompactCertSecKQ = 128 - // Enable TEAL 6 / AVM 1.1 - vFuture.LogicSigVersion = 6 - - vFuture.MaxProposedExpiredOnlineAccounts = 32 - Consensus[protocol.ConsensusFuture] = vFuture } diff --git a/config/consensus_test.go b/config/consensus_test.go index 6cdc2ebd12..92edf17981 100644 --- a/config/consensus_test.go +++ b/config/consensus_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -58,3 +58,14 @@ func TestConsensusUpgradeWindow(t *testing.T) { } } } + +func TestConsensusCompactCertParams(t *testing.T) { + partitiontest.PartitionTest(t) + + for _, params := range Consensus { + if params.CompactCertRounds != 0 { + require.Equal(t, uint64(1<<16), (params.MaxKeyregValidPeriod+1)/params.CompactCertRounds, + "Validity period divided by CompactCertRounds should allow for no more than %d generated keys", 1<<16) + } + } +} diff --git a/config/defaultsGenerator/defaultsGenerator.go b/config/defaultsGenerator/defaultsGenerator.go index 70a8e7b13c..47b5ac51e7 100644 --- a/config/defaultsGenerator/defaultsGenerator.go +++ b/config/defaultsGenerator/defaultsGenerator.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/config/keyfile.go b/config/keyfile.go index 16bd366715..28aea1f221 100644 --- a/config/keyfile.go +++ b/config/keyfile.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/config/localTemplate.go b/config/localTemplate.go index 20a141e8cd..da9453c149 100644 --- a/config/localTemplate.go +++ b/config/localTemplate.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -41,7 +41,7 @@ type Local struct { // Version tracks the current version of the defaults so we can migrate old -> new // This is specifically important whenever we decide to change the default value // for an existing parameter. This field tag must be updated any time we add a new version. - Version uint32 `version[0]:"0" version[1]:"1" version[2]:"2" version[3]:"3" version[4]:"4" version[5]:"5" version[6]:"6" version[7]:"7" version[8]:"8" version[9]:"9" version[10]:"10" version[11]:"11" version[12]:"12" version[13]:"13" version[14]:"14" version[15]:"15" version[16]:"16" version[17]:"17" version[18]:"18" version[19]:"19"` + Version uint32 `version[0]:"0" version[1]:"1" version[2]:"2" version[3]:"3" version[4]:"4" version[5]:"5" version[6]:"6" version[7]:"7" version[8]:"8" version[9]:"9" version[10]:"10" version[11]:"11" version[12]:"12" version[13]:"13" version[14]:"14" version[15]:"15" version[16]:"16" version[17]:"17" version[18]:"18" version[19]:"19" version[20]:"20"` // environmental (may be overridden) // When enabled, stores blocks indefinitally, otherwise, only the most recents blocks @@ -74,7 +74,7 @@ type Local struct { CadaverSizeTarget uint64 `version[0]:"1073741824"` // IncomingConnectionsLimit specifies the max number of long-lived incoming - // connections. 0 means no connections allowed. -1 is unbounded. + // connections. 0 means no connections allowed. Must be non-negative. // Estimating 5MB per incoming connection, 5MB*800 = 4GB IncomingConnectionsLimit int `version[0]:"-1" version[1]:"10000" version[17]:"800"` @@ -99,9 +99,9 @@ type Local struct { PriorityPeers map[string]bool `version[4]:""` // To make sure the algod process does not run out of FDs, algod ensures - // that RLIMIT_NOFILE exceeds the max number of incoming connections (i.e., - // IncomingConnectionsLimit) by at least ReservedFDs. ReservedFDs are meant - // to leave room for short-lived FDs like DNS queries, SQLite files, etc. + // that RLIMIT_NOFILE >= IncomingConnectionsLimit + RestConnectionsHardLimit + + // ReservedFDs. ReservedFDs are meant to leave room for short-lived FDs like + // DNS queries, SQLite files, etc. This parameter shouldn't be changed. ReservedFDs uint64 `version[2]:"256"` // local server @@ -192,6 +192,9 @@ type Local struct { // negative (-1) to disable, positive (1) to enable, 0 for default. DeadlockDetection int `version[1]:"0"` + // The threshold used for deadlock detection, in seconds. + DeadlockDetectionThreshold int `version[20]:"30"` + // Prefer to run algod Hosted (under algoh) // Observed by `goal` for now. RunHosted bool `version[3]:"false"` @@ -420,6 +423,13 @@ type Local struct { // ProposalAssemblyTime is the max amount of time to spend on generating a proposal block. ProposalAssemblyTime time.Duration `version[19]:"250000000"` + + // When the number of http connections to the REST layer exceeds the soft limit, + // we start returning http code 429 Too Many Requests. + RestConnectionsSoftLimit uint64 `version[20]:"1024"` + // The http server does not accept new connections as long we have this many + // (hard limit) connections already. + RestConnectionsHardLimit uint64 `version[20]:"2048"` } // DNSBootstrapArray returns an array of one or more DNS Bootstrap identifiers @@ -450,13 +460,21 @@ func (cfg Local) DNSBootstrap(network protocol.NetworkID) string { return strings.Replace(cfg.DNSBootstrapID, "", string(network), -1) } -// SaveToDisk writes the Local settings into a root/ConfigFilename file +// SaveToDisk writes the non-default Local settings into a root/ConfigFilename file func (cfg Local) SaveToDisk(root string) error { configpath := filepath.Join(root, ConfigFilename) filename := os.ExpandEnv(configpath) return cfg.SaveToFile(filename) } +// SaveAllToDisk writes the all Local settings into a root/ConfigFilename file +func (cfg Local) SaveAllToDisk(root string) error { + configpath := filepath.Join(root, ConfigFilename) + filename := os.ExpandEnv(configpath) + prettyPrint := true + return codecs.SaveObjectToFile(filename, cfg, prettyPrint) +} + // SaveToFile saves the config to a specific filename, allowing overriding the default name func (cfg Local) SaveToFile(filename string) error { var alwaysInclude []string diff --git a/config/local_defaults.go b/config/local_defaults.go index ae1aa7043f..27bab01584 100644 --- a/config/local_defaults.go +++ b/config/local_defaults.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -20,7 +20,7 @@ package config var defaultLocal = Local{ - Version: 19, + Version: 20, AccountUpdatesStatsInterval: 5000000000, AccountsRebuildSynchronousMode: 1, AnnounceParticipationKey: true, @@ -44,6 +44,7 @@ var defaultLocal = Local{ DNSBootstrapID: ".algorand.network", DNSSecurityFlags: 1, DeadlockDetection: 0, + DeadlockDetectionThreshold: 30, DisableLocalhostConnectionRateLimit: true, DisableNetworking: false, DisableOutgoingConnectionThrottling: false, @@ -98,6 +99,8 @@ var defaultLocal = Local{ PublicAddress: "", ReconnectTime: 60000000000, ReservedFDs: 256, + RestConnectionsHardLimit: 2048, + RestConnectionsSoftLimit: 1024, RestReadTimeoutSeconds: 15, RestWriteTimeoutSeconds: 120, RunHosted: false, diff --git a/config/migrate.go b/config/migrate.go index bc03929898..9fd9c86076 100644 --- a/config/migrate.go +++ b/config/migrate.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/config/version.go b/config/version.go index 61d4ff58a3..1f8f6b7968 100644 --- a/config/version.go +++ b/config/version.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -33,7 +33,7 @@ const VersionMajor = 3 // VersionMinor is the Minor semantic version number (x.#.z) - changed when backwards-compatible features are introduced. // Not enforced until after initial public release (x > 0). -const VersionMinor = 2 +const VersionMinor = 4 // Version is the type holding our full version information. type Version struct { diff --git a/crypto/batchverifier.go b/crypto/batchverifier.go index c7f84fa458..baedf4cd1b 100644 --- a/crypto/batchverifier.go +++ b/crypto/batchverifier.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -16,13 +16,37 @@ package crypto -import "errors" +// #cgo CFLAGS: -Wall -std=c99 +// #cgo darwin,amd64 CFLAGS: -I${SRCDIR}/libs/darwin/amd64/include +// #cgo darwin,amd64 LDFLAGS: ${SRCDIR}/libs/darwin/amd64/lib/libsodium.a +// #cgo darwin,arm64 CFLAGS: -I${SRCDIR}/libs/darwin/arm64/include +// #cgo darwin,arm64 LDFLAGS: ${SRCDIR}/libs/darwin/arm64/lib/libsodium.a +// #cgo linux,amd64 CFLAGS: -I${SRCDIR}/libs/linux/amd64/include +// #cgo linux,amd64 LDFLAGS: ${SRCDIR}/libs/linux/amd64/lib/libsodium.a +// #cgo linux,arm64 CFLAGS: -I${SRCDIR}/libs/linux/arm64/include +// #cgo linux,arm64 LDFLAGS: ${SRCDIR}/libs/linux/arm64/lib/libsodium.a +// #cgo linux,arm CFLAGS: -I${SRCDIR}/libs/linux/arm/include +// #cgo linux,arm LDFLAGS: ${SRCDIR}/libs/linux/arm/lib/libsodium.a +// #cgo windows,amd64 CFLAGS: -I${SRCDIR}/libs/windows/amd64/include +// #cgo windows,amd64 LDFLAGS: ${SRCDIR}/libs/windows/amd64/lib/libsodium.a +// #include +// #include "sodium.h" +// enum { +// sizeofPtr = sizeof(void*), +// sizeofULongLong = sizeof(unsigned long long), +// }; +import "C" +import ( + "errors" + "unsafe" +) // BatchVerifier enqueues signatures to be validated in batch. type BatchVerifier struct { - messages []Hashable // contains a slice of messages to be hashed. Each message is varible length - publicKeys []SignatureVerifier // contains a slice of public keys. Each individual public key is 32 bytes. - signatures []Signature // contains a slice of signatures keys. Each individual signature is 64 bytes. + messages []Hashable // contains a slice of messages to be hashed. Each message is varible length + publicKeys []SignatureVerifier // contains a slice of public keys. Each individual public key is 32 bytes. + signatures []Signature // contains a slice of signatures keys. Each individual signature is 64 bytes. + useBatchVerification bool } const minBatchVerifierAlloc = 16 @@ -30,26 +54,40 @@ const minBatchVerifierAlloc = 16 // Batch verifications errors var ( ErrBatchVerificationFailed = errors.New("At least one signature didn't pass verification") - ErrZeroTranscationsInBatch = errors.New("Could not validate empty signature set") + ErrZeroTransactionInBatch = errors.New("Could not validate empty signature set") ) +//export ed25519_randombytes_unsafe +func ed25519_randombytes_unsafe(p unsafe.Pointer, len C.size_t) { + randBuf := (*[1 << 30]byte)(p)[:len:len] + RandBytes(randBuf) +} + +// MakeBatchVerifierWithAlgorithmDefaultSize create a BatchVerifier instance. This function pre-allocates +// amount of free space to enqueue signatures without expanding. this function always use the batch +// verification algorithm +func MakeBatchVerifierWithAlgorithmDefaultSize() *BatchVerifier { + return MakeBatchVerifier(minBatchVerifierAlloc, true) +} + // MakeBatchVerifierDefaultSize create a BatchVerifier instance. This function pre-allocates -// amount of free space to enqueue signatures without exapneding -func MakeBatchVerifierDefaultSize() *BatchVerifier { - return MakeBatchVerifier(minBatchVerifierAlloc) +// amount of free space to enqueue signatures without expanding +func MakeBatchVerifierDefaultSize(enableBatchVerification bool) *BatchVerifier { + return MakeBatchVerifier(minBatchVerifierAlloc, enableBatchVerification) } // MakeBatchVerifier create a BatchVerifier instance. This function pre-allocates // a given space so it will not expaned the storage -func MakeBatchVerifier(hint int) *BatchVerifier { +func MakeBatchVerifier(hint int, enableBatchVerification bool) *BatchVerifier { // preallocate enough storage for the expected usage. We will reallocate as needed. if hint < minBatchVerifierAlloc { hint = minBatchVerifierAlloc } return &BatchVerifier{ - messages: make([]Hashable, 0, hint), - publicKeys: make([]SignatureVerifier, 0, hint), - signatures: make([]Signature, 0, hint), + messages: make([]Hashable, 0, hint), + publicKeys: make([]SignatureVerifier, 0, hint), + signatures: make([]Signature, 0, hint), + useBatchVerification: enableBatchVerification, } } @@ -85,14 +123,69 @@ func (b *BatchVerifier) GetNumberOfEnqueuedSignatures() int { // if the batch is zero an appropriate error is return. func (b *BatchVerifier) Verify() error { if b.GetNumberOfEnqueuedSignatures() == 0 { - return ErrZeroTranscationsInBatch + return ErrZeroTransactionInBatch } + if b.useBatchVerification { + var messages = make([][]byte, b.GetNumberOfEnqueuedSignatures()) + for i, m := range b.messages { + messages[i] = HashRep(m) + } + if batchVerificationImpl(messages, b.publicKeys, b.signatures) { + return nil + } + return ErrBatchVerificationFailed + } + return b.verifyOneByOne() +} + +func (b *BatchVerifier) verifyOneByOne() error { for i := range b.messages { - verifier := SignatureVerifier(b.publicKeys[i]) - if !verifier.Verify(b.messages[i], b.signatures[i]) { + verifier := b.publicKeys[i] + if !verifier.Verify(b.messages[i], b.signatures[i], false) { return ErrBatchVerificationFailed } } return nil } + +// batchVerificationImpl invokes the ed25519 batch verification algorithm. +// it returns true if all the signatures were authentically signed by the owners +func batchVerificationImpl(messages [][]byte, publicKeys []SignatureVerifier, signatures []Signature) bool { + + numberOfSignatures := len(messages) + + messagesAllocation := C.malloc(C.size_t(C.sizeofPtr * numberOfSignatures)) + messagesLenAllocation := C.malloc(C.size_t(C.sizeofULongLong * numberOfSignatures)) + publicKeysAllocation := C.malloc(C.size_t(C.sizeofPtr * numberOfSignatures)) + signaturesAllocation := C.malloc(C.size_t(C.sizeofPtr * numberOfSignatures)) + valid := C.malloc(C.size_t(C.sizeof_int * numberOfSignatures)) + + defer func() { + // release staging memory + C.free(messagesAllocation) + C.free(messagesLenAllocation) + C.free(publicKeysAllocation) + C.free(signaturesAllocation) + C.free(valid) + }() + + // load all the data pointers into the array pointers. + for i := 0; i < numberOfSignatures; i++ { + *(*uintptr)(unsafe.Pointer(uintptr(messagesAllocation) + uintptr(i*C.sizeofPtr))) = uintptr(unsafe.Pointer(&messages[i][0])) + *(*C.ulonglong)(unsafe.Pointer(uintptr(messagesLenAllocation) + uintptr(i*C.sizeofULongLong))) = C.ulonglong(len(messages[i])) + *(*uintptr)(unsafe.Pointer(uintptr(publicKeysAllocation) + uintptr(i*C.sizeofPtr))) = uintptr(unsafe.Pointer(&publicKeys[i][0])) + *(*uintptr)(unsafe.Pointer(uintptr(signaturesAllocation) + uintptr(i*C.sizeofPtr))) = uintptr(unsafe.Pointer(&signatures[i][0])) + } + + // call the batch verifier + allValid := C.crypto_sign_ed25519_open_batch( + (**C.uchar)(unsafe.Pointer(messagesAllocation)), + (*C.ulonglong)(unsafe.Pointer(messagesLenAllocation)), + (**C.uchar)(unsafe.Pointer(publicKeysAllocation)), + (**C.uchar)(unsafe.Pointer(signaturesAllocation)), + C.size_t(len(messages)), + (*C.int)(unsafe.Pointer(valid))) + + return allValid == 0 +} diff --git a/crypto/batchverifier_test.go b/crypto/batchverifier_test.go index 18e2e22e47..9a9c491605 100644 --- a/crypto/batchverifier_test.go +++ b/crypto/batchverifier_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -27,7 +27,7 @@ import ( func TestBatchVerifierSingle(t *testing.T) { partitiontest.PartitionTest(t) // test expected success - bv := MakeBatchVerifier(1) + bv := MakeBatchVerifierWithAlgorithmDefaultSize() msg := randString() var s Seed RandBytes(s[:]) @@ -36,8 +36,8 @@ func TestBatchVerifierSingle(t *testing.T) { bv.EnqueueSignature(sigSecrets.SignatureVerifier, msg, sig) require.NoError(t, bv.Verify()) - // test expected failuire - bv = MakeBatchVerifier(1) + // test expected failure + bv = MakeBatchVerifierWithAlgorithmDefaultSize() msg = randString() RandBytes(s[:]) sigSecrets = GenerateSignatureSecrets(s) @@ -52,7 +52,7 @@ func TestBatchVerifierBulk(t *testing.T) { partitiontest.PartitionTest(t) for i := 1; i < 64*2+3; i++ { n := i - bv := MakeBatchVerifier(n) + bv := MakeBatchVerifier(n, true) var s Seed for i := 0; i < n; i++ { @@ -71,7 +71,7 @@ func TestBatchVerifierBulk(t *testing.T) { func TestBatchVerifierBulkWithExpand(t *testing.T) { partitiontest.PartitionTest(t) n := 64 - bv := MakeBatchVerifier(1) + bv := MakeBatchVerifierWithAlgorithmDefaultSize() var s Seed RandBytes(s[:]) @@ -87,7 +87,7 @@ func TestBatchVerifierBulkWithExpand(t *testing.T) { func TestBatchVerifierWithInvalidSiganture(t *testing.T) { partitiontest.PartitionTest(t) n := 64 - bv := MakeBatchVerifier(1) + bv := MakeBatchVerifierWithAlgorithmDefaultSize() var s Seed RandBytes(s[:]) @@ -109,7 +109,7 @@ func TestBatchVerifierWithInvalidSiganture(t *testing.T) { func BenchmarkBatchVerifier(b *testing.B) { c := makeCurve25519Secret() - bv := MakeBatchVerifier(1) + bv := MakeBatchVerifier(1, true) for i := 0; i < b.N; i++ { str := randString() bv.EnqueueSignature(c.SignatureVerifier, str, c.Sign(str)) @@ -121,6 +121,6 @@ func BenchmarkBatchVerifier(b *testing.B) { func TestEmpty(t *testing.T) { partitiontest.PartitionTest(t) - bv := MakeBatchVerifierDefaultSize() + bv := MakeBatchVerifierWithAlgorithmDefaultSize() require.Error(t, bv.Verify()) } diff --git a/crypto/compactcert/bigfloat.go b/crypto/compactcert/bigfloat.go index 0b9ee49967..eb4004736c 100644 --- a/crypto/compactcert/bigfloat.go +++ b/crypto/compactcert/bigfloat.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/crypto/compactcert/bigfloat_test.go b/crypto/compactcert/bigfloat_test.go index 354821adde..12efcf38b2 100644 --- a/crypto/compactcert/bigfloat_test.go +++ b/crypto/compactcert/bigfloat_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/crypto/compactcert/builder.go b/crypto/compactcert/builder.go index 5966ca9a74..5ebacba03d 100644 --- a/crypto/compactcert/builder.go +++ b/crypto/compactcert/builder.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -21,6 +21,7 @@ import ( "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/crypto/merklearray" + "github.com/algorand/go-algorand/crypto/merklesignature" "github.com/algorand/go-algorand/data/basics" ) @@ -81,7 +82,7 @@ func (b *Builder) Present(pos uint64) bool { // Add a signature to the set of signatures available for building a certificate. // verifySig should be set to true in production; setting it to false is useful // for benchmarking to avoid the cost of signature checks. -func (b *Builder) Add(pos uint64, sig crypto.OneTimeSignature, verifySig bool) error { +func (b *Builder) Add(pos uint64, sig merklesignature.Signature, verifySig bool) error { if b.Present(pos) { return fmt.Errorf("position %d already added", pos) } @@ -98,14 +99,15 @@ func (b *Builder) Add(pos uint64, sig crypto.OneTimeSignature, verifySig bool) e } // Check signature - ephID := basics.OneTimeIDForRound(b.SigRound, p.KeyDilution) - if verifySig && !p.PK.Verify(ephID, b.Msg, sig) { - return fmt.Errorf("signature does not verify under ID %v", ephID) + if verifySig { + if err := p.PK.Verify(uint64(b.SigRound), b.Msg, sig); err != nil { + return err + } } // Remember the signature b.sigs[pos].Weight = p.Weight - b.sigs[pos].Sig.OneTimeSignature = sig + b.sigs[pos].Sig.Signature = sig b.signedWeight += p.Weight b.cert = nil b.sigsHasValidL = false @@ -122,21 +124,6 @@ func (b *Builder) SignedWeight() uint64 { return b.signedWeight } -//msgp:ignore sigsToCommit -type sigsToCommit []sigslot - -func (sc sigsToCommit) Length() uint64 { - return uint64(len(sc)) -} - -func (sc sigsToCommit) GetHash(pos uint64) (crypto.Digest, error) { - if pos >= uint64(len(sc)) { - return crypto.Digest{}, fmt.Errorf("pos %d past end %d", pos, len(sc)) - } - - return crypto.HashObj(&sc[pos].sigslotCommit), nil -} - // coinIndex returns the position pos in the sigs array such that the sum // of all signature weights before pos is less than or equal to coinWeight, // but the sum of all signature weights up to and including pos exceeds @@ -187,7 +174,8 @@ func (b *Builder) Build() (*Cert, error) { } b.sigsHasValidL = true - sigtree, err := merklearray.Build(sigsToCommit(b.sigs)) + hfactory := crypto.HashFactory{HashType: HashType} + sigtree, err := merklearray.BuildVectorCommitmentTree(committableSignatureSlotArray(b.sigs), hfactory) if err != nil { return nil, err } @@ -205,7 +193,7 @@ func (b *Builder) Build() (*Cert, error) { } var proofPositions []uint64 - msgHash := crypto.HashObj(b.Msg) + msgHash := crypto.GenericHashObj(hfactory.NewHash(), b.Msg) for j := uint64(0); j < nr; j++ { choice := coinChoice{ @@ -242,15 +230,18 @@ func (b *Builder) Build() (*Cert, error) { proofPositions = append(proofPositions, pos) } - c.SigProofs, err = sigtree.Prove(proofPositions) + sigProofs, err := sigtree.Prove(proofPositions) if err != nil { return nil, err } - c.PartProofs, err = b.parttree.Prove(proofPositions) + partProofs, err := b.parttree.Prove(proofPositions) if err != nil { return nil, err } + c.SigProofs = *sigProofs + c.PartProofs = *partProofs + return c, nil } diff --git a/crypto/compactcert/builder_test.go b/crypto/compactcert/builder_test.go index 13738b5c3d..8d29e71273 100644 --- a/crypto/compactcert/builder_test.go +++ b/crypto/compactcert/builder_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -17,43 +17,67 @@ package compactcert import ( + "bytes" + "encoding/binary" "fmt" + "hash" + "math/bits" "testing" + "github.com/stretchr/testify/require" + + "github.com/algorand/falcon" + "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/crypto/merklearray" + "github.com/algorand/go-algorand/crypto/merklesignature" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/protocol" - "github.com/algorand/go-algorand/test/partitiontest" - "github.com/stretchr/testify/require" ) -type TestMessage string +type testMessage string -func (m TestMessage) ToBeHashed() (protocol.HashID, []byte) { - return protocol.Message, []byte(m) -} +const compactCertRoundsForTests = 256 +const compactCertSecKQForTests = 128 -type PartCommit struct { - participants []basics.Participant +func hashBytes(hash hash.Hash, m []byte) []byte { + hash.Reset() + hash.Write(m) + outhash := hash.Sum(nil) + return outhash } -func (pc PartCommit) Length() uint64 { - return uint64(len(pc.participants)) +func (m testMessage) ToBeHashed() (protocol.HashID, []byte) { + return protocol.Message, []byte(m) } -func (pc PartCommit) GetHash(pos uint64) (crypto.Digest, error) { - if pos >= uint64(len(pc.participants)) { - return crypto.Digest{}, fmt.Errorf("pos %d >= len %d", pos, len(pc.participants)) +func createParticipantSliceWithWeight(totalWeight, numberOfParticipant int, key *merklesignature.Verifier) []basics.Participant { + parts := make([]basics.Participant, 0, numberOfParticipant) + + for i := 0; i < numberOfParticipant; i++ { + part := basics.Participant{ + PK: *key, + Weight: uint64(totalWeight / 2 / numberOfParticipant), + } + + parts = append(parts, part) } + return parts +} + +func generateTestSigner(firstValid uint64, lastValid uint64, interval uint64, a *require.Assertions) *merklesignature.Secrets { + signer, err := merklesignature.New(firstValid, lastValid, interval) + a.NoError(err) - return crypto.HashObj(pc.participants[pos]), nil + return signer } func TestBuildVerify(t *testing.T) { partitiontest.PartitionTest(t) + a := require.New(t) + currentRound := basics.Round(compactCertRoundsForTests) // Doing a full test of 1M accounts takes too much CPU time in CI. doLargeTest := false @@ -69,45 +93,28 @@ func TestBuildVerify(t *testing.T) { npart := npartHi + npartLo param := Params{ - Msg: TestMessage("hello world"), + Msg: testMessage("hello world"), ProvenWeight: uint64(totalWeight / 2), - SigRound: 0, - SecKQ: 128, + SigRound: currentRound, + SecKQ: compactCertSecKQForTests, } // Share the key; we allow the same vote key to appear in multiple accounts.. - key := crypto.GenerateOneTimeSignatureSecrets(0, 1) - + key := generateTestSigner(0, uint64(compactCertRoundsForTests)*20+1, compactCertRoundsForTests, a) var parts []basics.Participant - var sigs []crypto.OneTimeSignature - for i := 0; i < npartHi; i++ { - part := basics.Participant{ - PK: key.OneTimeSignatureVerifier, - Weight: uint64(totalWeight / 2 / npartHi), - KeyDilution: 10000, - } - - parts = append(parts, part) - } + var sigs []merklesignature.Signature + parts = append(parts, createParticipantSliceWithWeight(totalWeight, npartHi, key.GetVerifier())...) + parts = append(parts, createParticipantSliceWithWeight(totalWeight, npartLo, key.GetVerifier())...) - for i := 0; i < npartLo; i++ { - part := basics.Participant{ - PK: key.OneTimeSignatureVerifier, - Weight: uint64(totalWeight / 2 / npartLo), - KeyDilution: 10000, - } - - parts = append(parts, part) - } - - ephID := basics.OneTimeIDForRound(0, parts[0].KeyDilution) - sig := key.Sign(ephID, param.Msg) + signerInRound := key.GetSigner(uint64(currentRound)) + sig, err := signerInRound.Sign(param.Msg) + require.NoError(t, err, "failed to create keys") for i := 0; i < npart; i++ { sigs = append(sigs, sig) } - partcom, err := merklearray.Build(PartCommit{parts}) + partcom, err := merklearray.BuildVectorCommitmentTree(basics.ParticipantsArray(parts), crypto.HashFactory{HashType: HashType}) if err != nil { t.Error(err) } @@ -137,7 +144,7 @@ func TestBuildVerify(t *testing.T) { certenc := protocol.Encode(cert) fmt.Printf("Cert size:\n") - fmt.Printf(" %6d elems sigproofs\n", len(cert.SigProofs)) + fmt.Printf(" %6d elems sigproofs\n", len(cert.SigProofs.Path)) fmt.Printf(" %6d bytes sigproofs\n", len(protocol.EncodeReflect(cert.SigProofs))) fmt.Printf(" %6d bytes partproofs\n", len(protocol.EncodeReflect(cert.PartProofs))) fmt.Printf(" %6d bytes sigproof per reveal\n", len(protocol.EncodeReflect(cert.SigProofs))/len(cert.Reveals)) @@ -149,43 +156,308 @@ func TestBuildVerify(t *testing.T) { verif := MkVerifier(param, partcom.Root()) err = verif.Verify(cert) - if err != nil { - t.Error(err) + require.NoError(t, err, "failed to verify the compact cert") +} + +func generateRandomParticipant(a *require.Assertions, testname string) basics.Participant { + key := generateTestSigner(0, 8, 1, a) + + p := basics.Participant{ + PK: *key.GetVerifier(), + Weight: crypto.RandUint64(), } + return p +} + +func calculateHashOnPartLeaf(part basics.Participant) []byte { + binaryWeight := make([]byte, 8) + binary.LittleEndian.PutUint64(binaryWeight, part.Weight) + + publicKeyBytes := part.PK + partCommitment := make([]byte, 0, len(protocol.CompactCertPart)+len(binaryWeight)+len(publicKeyBytes)) + partCommitment = append(partCommitment, protocol.CompactCertPart...) + partCommitment = append(partCommitment, binaryWeight...) + partCommitment = append(partCommitment, publicKeyBytes[:]...) + + factory := crypto.HashFactory{HashType: HashType} + hashValue := hashBytes(factory.NewHash(), partCommitment) + return hashValue +} + +func calculateHashOnInternalNode(leftNode, rightNode []byte) []byte { + buf := make([]byte, len(leftNode)+len(rightNode)+len(protocol.MerkleArrayNode)) + copy(buf[:], protocol.MerkleArrayNode) + copy(buf[len(protocol.MerkleArrayNode):], leftNode[:]) + copy(buf[len(protocol.MerkleArrayNode)+len(leftNode):], rightNode[:]) + + factory := crypto.HashFactory{HashType: HashType} + hashValue := hashBytes(factory.NewHash(), buf) + return hashValue +} + +func TestParticipationCommitmentBinaryFormat(t *testing.T) { + partitiontest.PartitionTest(t) + + a := require.New(t) + + var parts []basics.Participant + parts = append(parts, generateRandomParticipant(a, t.Name())) + parts = append(parts, generateRandomParticipant(a, t.Name())) + parts = append(parts, generateRandomParticipant(a, t.Name())) + parts = append(parts, generateRandomParticipant(a, t.Name())) + + partcom, err := merklearray.BuildVectorCommitmentTree(basics.ParticipantsArray(parts), crypto.HashFactory{HashType: HashType}) + a.NoError(err) + + partCommitmentRoot := partcom.Root() + + leaf0 := calculateHashOnPartLeaf(parts[0]) + leaf1 := calculateHashOnPartLeaf(parts[1]) + leaf2 := calculateHashOnPartLeaf(parts[2]) + leaf3 := calculateHashOnPartLeaf(parts[3]) + + inner1 := calculateHashOnInternalNode(leaf0, leaf2) + inner2 := calculateHashOnInternalNode(leaf1, leaf3) + + calcRoot := calculateHashOnInternalNode(inner1, inner2) + + a.Equal(partCommitmentRoot, crypto.GenericDigest(calcRoot)) + +} + +func TestSignatureCommitmentBinaryFormat(t *testing.T) { + partitiontest.PartitionTest(t) + + a := require.New(t) + + currentRound := basics.Round(compactCertRoundsForTests) + totalWeight := 10000000 + numPart := 4 + + param := Params{ + Msg: testMessage("test!"), + ProvenWeight: uint64(totalWeight / (2 * numPart)), + SigRound: currentRound, + SecKQ: compactCertSecKQForTests, + } + + var parts []basics.Participant + var sigs []merklesignature.Signature + + for i := 0; i < numPart; i++ { + key := generateTestSigner(0, uint64(compactCertRoundsForTests)*8, compactCertRoundsForTests, a) + + part := basics.Participant{ + PK: *key.GetVerifier(), + Weight: uint64(totalWeight / 2 / numPart), + } + parts = append(parts, part) + + sig, err := key.GetSigner(uint64(currentRound)).Sign(param.Msg) + require.NoError(t, err, "failed to create keys") + sigs = append(sigs, sig) + + } + + partcom, err := merklearray.BuildVectorCommitmentTree(basics.ParticipantsArray(parts), crypto.HashFactory{HashType: HashType}) + a.NoError(err) + + b, err := MkBuilder(param, parts, partcom) + a.NoError(err) + + for i := 0; i < numPart; i++ { + err = b.Add(uint64(i), sigs[i], false) + a.NoError(err) + } + + cert, err := b.Build() + a.NoError(err) + + leaf0 := calculateHashOnSigLeaf(t, sigs[0], findLInCert(a, sigs[0], cert)) + leaf1 := calculateHashOnSigLeaf(t, sigs[1], findLInCert(a, sigs[1], cert)) + leaf2 := calculateHashOnSigLeaf(t, sigs[2], findLInCert(a, sigs[2], cert)) + leaf3 := calculateHashOnSigLeaf(t, sigs[3], findLInCert(a, sigs[3], cert)) + + // hash internal node according to the vector commitment indices + inner1 := calculateHashOnInternalNode(leaf0, leaf2) + inner2 := calculateHashOnInternalNode(leaf1, leaf3) + + calcRoot := calculateHashOnInternalNode(inner1, inner2) + + a.Equal(cert.SigCommit, crypto.GenericDigest(calcRoot)) + +} + +// The aim of this test is to simulate how a SNARK circuit will verify a signature.(part of the overall compcatcert verification) +// it includes parsing the signature's format (according to Algorand's spec) and binds it to a specific length. +// here we also expect the scheme to use Falcon signatures and nothing else. +func TestSimulateSignatureVerification(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + signer := generateTestSigner(50, 100, 1, a) + sigRound := uint64(55) + hashable := testMessage("testMessage") + sig, err := signer.GetSigner(sigRound).Sign(hashable) + a.NoError(err) + + genericKey := signer.GetVerifier() + sigBytes, err := sig.GetFixedLengthHashableRepresentation() + a.NoError(err) + checkSignature(a, sigBytes, genericKey, sigRound, hashable, 5, 6) +} + +// The aim of this test is to simulate how a SNARK circuit will verify a signature.(part of the overall compcatcert verification) +// it includes parsing the signature's format (according to Algorand's spec) and binds it to a specific length. +// here we also expect the scheme to use Falcon signatures and nothing else. +func TestSimulateSignatureVerificationOneEphemeralKey(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + // we create one ephemeral key so the signature's proof should be with len 0 + signer := generateTestSigner(1, compactCertRoundsForTests, compactCertRoundsForTests, a) + + sigRound := uint64(compactCertRoundsForTests) + hashable := testMessage("testMessage") + sig, err := signer.GetSigner(sigRound).Sign(hashable) + a.NoError(err) + + genericKey := signer.GetVerifier() + sigBytes, err := sig.GetFixedLengthHashableRepresentation() + a.NoError(err) + checkSignature(a, sigBytes, genericKey, sigRound, hashable, 0, 0) +} + +func checkSignature(a *require.Assertions, sigBytes []byte, verifier *merklesignature.Verifier, round uint64, message crypto.Hashable, expectedIndex uint64, expectedPathLen uint8) { + a.Equal(len(sigBytes), 4366) + + parsedBytes := 0 + // check schemeId + schemeID := binary.LittleEndian.Uint16(sigBytes[parsedBytes : parsedBytes+2]) + parsedBytes += 2 + a.Equal(schemeID, uint16(0)) + + parsedBytes, falconPK := verifyFalconSignature(a, sigBytes, parsedBytes, message) + + // check the public key commitment + + leafHash := hashEphemeralPublicKeyLeaf(round, falconPK) + + // parsing the merkle path index and the proof's len + idx := binary.LittleEndian.Uint64(sigBytes[parsedBytes : parsedBytes+8]) + parsedBytes += 8 + pathLe := sigBytes[parsedBytes] + parsedBytes++ + + a.Equal(expectedIndex, idx) + a.Equal(expectedPathLen, pathLe) + + leafHash = verifyMerklePath(idx, pathLe, sigBytes, parsedBytes, leafHash) + + a.Equal(leafHash, verifier[:]) +} + +func verifyMerklePath(idx uint64, pathLe byte, sigBytes []byte, parsedBytes int, leafHash []byte) []byte { + // idxDirection will indicate which sibling we should fetch MSB to LSB leaf-to-root + idxDirection := bits.Reverse64(idx) >> (64 - pathLe) + + // use the verification path to hash siblings up to the root + parsedBytes += (16 - int(pathLe)) * 64 + for i := uint8(0); i < pathLe; i++ { + var innerNodeBytes []byte + + siblingHash := sigBytes[parsedBytes : parsedBytes+64] + parsedBytes += 64 + + innerNodeBytes = append(innerNodeBytes, []byte{'M', 'A'}...) + if (idxDirection & 1) != 0 { + innerNodeBytes = append(innerNodeBytes, siblingHash...) + innerNodeBytes = append(innerNodeBytes, leafHash...) + } else { + innerNodeBytes = append(innerNodeBytes, leafHash...) + innerNodeBytes = append(innerNodeBytes, siblingHash...) + } + idxDirection = idxDirection >> 1 + leafHash = hashBytes(crypto.HashFactory{HashType: HashType}.NewHash(), innerNodeBytes) + } + return leafHash +} + +func hashEphemeralPublicKeyLeaf(round uint64, falconPK [falcon.PublicKeySize]byte) []byte { + var sigRoundAsBytes [8]byte + binary.LittleEndian.PutUint64(sigRoundAsBytes[:], round) + + var ephemeralPublicKeyBytes []byte + ephemeralPublicKeyBytes = append(ephemeralPublicKeyBytes, []byte{'K', 'P'}...) + ephemeralPublicKeyBytes = append(ephemeralPublicKeyBytes, []byte{0, 0}...) + ephemeralPublicKeyBytes = append(ephemeralPublicKeyBytes, sigRoundAsBytes[:]...) + ephemeralPublicKeyBytes = append(ephemeralPublicKeyBytes, falconPK[:]...) + leafHash := hashBytes(crypto.HashFactory{HashType: HashType}.NewHash(), ephemeralPublicKeyBytes) + return leafHash +} + +func verifyFalconSignature(a *require.Assertions, sigBytes []byte, parsedBytes int, message crypto.Hashable) (int, [falcon.PublicKeySize]byte) { + var falconSig [falcon.CTSignatureSize]byte + copy(falconSig[:], sigBytes[parsedBytes:parsedBytes+1538]) + parsedBytes += 1538 + ctSign := falcon.CTSignature(falconSig) + + var falconPK [falcon.PublicKeySize]byte + copy(falconPK[:], sigBytes[parsedBytes:parsedBytes+1793]) + parsedBytes += 1793 + ephemeralPk := falcon.PublicKey(falconPK) + + msgBytes := crypto.Hash(crypto.HashRep(message)) + err := ephemeralPk.VerifyCTSignature(ctSign, msgBytes[:]) + a.NoError(err) + return parsedBytes, falconPK +} + +func findLInCert(a *require.Assertions, signature merklesignature.Signature, cert *Cert) uint64 { + for _, t := range cert.Reveals { + if bytes.Compare(t.SigSlot.Sig.Signature.Signature, signature.Signature) == 0 { + return t.SigSlot.L + } + } + a.Fail("could not find matching reveal") + return 0 } func BenchmarkBuildVerify(b *testing.B) { totalWeight := 1000000 npart := 10000 + currentRound := basics.Round(compactCertRoundsForTests) + a := require.New(b) + param := Params{ - Msg: TestMessage("hello world"), + Msg: testMessage("hello world"), ProvenWeight: uint64(totalWeight / 2), - SigRound: 0, - SecKQ: 128, + SigRound: compactCertRoundsForTests, + SecKQ: compactCertSecKQForTests, } var parts []basics.Participant - var partkeys []*crypto.OneTimeSignatureSecrets - var sigs []crypto.OneTimeSignature + var partkeys []*merklesignature.Secrets + var sigs []merklesignature.Signature for i := 0; i < npart; i++ { - key := crypto.GenerateOneTimeSignatureSecrets(0, 1) + signer := generateTestSigner(0, compactCertRoundsForTests, compactCertRoundsForTests+1, a) part := basics.Participant{ - PK: key.OneTimeSignatureVerifier, - Weight: uint64(totalWeight / npart), - KeyDilution: 10000, + PK: *signer.GetVerifier(), + Weight: uint64(totalWeight / npart), } - ephID := basics.OneTimeIDForRound(0, part.KeyDilution) - sig := key.Sign(ephID, param.Msg) + signerInRound := signer.GetSigner(uint64(currentRound)) + sig, err := signerInRound.Sign(param.Msg) + require.NoError(b, err, "failed to create keys") - partkeys = append(partkeys, key) + partkeys = append(partkeys, signer) sigs = append(sigs, sig) parts = append(parts, part) } var cert *Cert - partcom, err := merklearray.Build(PartCommit{parts}) + partcom, err := merklearray.BuildVectorCommitmentTree(basics.ParticipantsArray(parts), crypto.HashFactory{HashType: HashType}) if err != nil { b.Error(err) } @@ -214,8 +486,7 @@ func BenchmarkBuildVerify(b *testing.B) { b.Run("Verify", func(b *testing.B) { for i := 0; i < b.N; i++ { verif := MkVerifier(param, partcom.Root()) - err = verif.Verify(cert) - if err != nil { + if err = verif.Verify(cert); err != nil { b.Error(err) } } diff --git a/crypto/compactcert/committableSignatureSlot.go b/crypto/compactcert/committableSignatureSlot.go new file mode 100644 index 0000000000..97b949cfe9 --- /dev/null +++ b/crypto/compactcert/committableSignatureSlot.go @@ -0,0 +1,87 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package compactcert + +import ( + "encoding/binary" + "errors" + "fmt" + + "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/protocol" +) + +type committableSignatureSlot struct { + sigCommit sigslotCommit + serializedSignature []byte + isEmptySlot bool +} + +// ErrIndexOutOfBound returned when an index is out of the array's bound +var ErrIndexOutOfBound = errors.New("index is out of bound") + +// committableSignatureSlotArray is used to create a merkle tree on the compact cert's +// signature array. it serializes the MSS signatures using a specific format +// compact cert signature array. +//msgp:ignore committableSignatureSlotArray +type committableSignatureSlotArray []sigslot + +func (sc committableSignatureSlotArray) Length() uint64 { + return uint64(len(sc)) +} + +func (sc committableSignatureSlotArray) Marshal(pos uint64) (crypto.Hashable, error) { + if pos >= uint64(len(sc)) { + return nil, fmt.Errorf("%w: pos %d past end %d", ErrIndexOutOfBound, pos, len(sc)) + } + + signatureSlot, err := buildCommittableSignature(sc[pos].sigslotCommit) + if err != nil { + return nil, err + } + + return signatureSlot, nil +} + +func buildCommittableSignature(sigCommit sigslotCommit) (*committableSignatureSlot, error) { + if sigCommit.Sig.Signature.Signature == nil { + return &committableSignatureSlot{isEmptySlot: true}, nil + } + sigBytes, err := sigCommit.Sig.GetFixedLengthHashableRepresentation() + if err != nil { + return nil, err + } + return &committableSignatureSlot{sigCommit: sigCommit, serializedSignature: sigBytes, isEmptySlot: false}, nil +} + +// ToBeHashed returns the sequence of bytes that would be used as an input for the hash function when creating a merkle tree. +// In order to create a more SNARK-friendly commitment we must avoid using the msgpack infrastructure. +// msgpack creates a compressed representation of the struct which might be varied in length, this will +// be bad for creating SNARK +func (cs *committableSignatureSlot) ToBeHashed() (protocol.HashID, []byte) { + if cs.isEmptySlot { + return protocol.CompactCertSig, []byte{} + } + binaryLValue := make([]byte, 8) + binary.LittleEndian.PutUint64(binaryLValue, cs.sigCommit.L) + + sigSlotCommitment := make([]byte, 0, len(binaryLValue)+len(cs.serializedSignature)) + sigSlotCommitment = append(sigSlotCommitment, binaryLValue...) + sigSlotCommitment = append(sigSlotCommitment, cs.serializedSignature...) + + return protocol.CompactCertSig, sigSlotCommitment +} diff --git a/crypto/compactcert/committableSignatureSlot_test.go b/crypto/compactcert/committableSignatureSlot_test.go new file mode 100644 index 0000000000..e7cb311813 --- /dev/null +++ b/crypto/compactcert/committableSignatureSlot_test.go @@ -0,0 +1,99 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package compactcert + +import ( + "encoding/binary" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/crypto/merklearray" + "github.com/algorand/go-algorand/crypto/merklesignature" + "github.com/algorand/go-algorand/protocol" + "github.com/algorand/go-algorand/test/partitiontest" +) + +func TestSignatureArrayWithEmptySlot(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + sigs := make([]sigslot, 2) + + key := generateTestSigner(0, uint64(compactCertRoundsForTests)*20+1, compactCertRoundsForTests, a) + + message := testMessage("hello world") + sig, err := key.GetSigner(uint64(256)).Sign(message) + a.NoError(err) + + sigs[0] = sigslot{ + Weight: 60, + sigslotCommit: sigslotCommit{Sig: CompactOneTimeSignature{Signature: sig}, L: 60}, + } + + hfactory := crypto.HashFactory{HashType: HashType} + tree, err := merklearray.BuildVectorCommitmentTree(committableSignatureSlotArray(sigs), hfactory) + + leftLeafHash := calculateHashOnSigLeaf(t, sig, 60) + rightLeafHash := hashBytes(hfactory.NewHash(), []byte(protocol.CompactCertSig)) + + a.Equal([]byte(tree.Root()), calculateHashOnInternalNode(leftLeafHash, rightLeafHash)) +} + +func calculateHashOnSigLeaf(t *testing.T, sig merklesignature.Signature, lValue uint64) []byte { + var sigCommitment []byte + sigCommitment = append(sigCommitment, protocol.CompactCertSig...) + + binaryL := make([]byte, 8) + binary.LittleEndian.PutUint64(binaryL, lValue) + + sigCommitment = append(sigCommitment, binaryL...) + + //build the expected binary representation of the merkle signature + serializedSig, err := sig.VerifyingKey.GetSignatureFixedLengthHashableRepresentation(sig.Signature) + require.NoError(t, err) + + schemeType := make([]byte, 2) + binary.LittleEndian.PutUint16(schemeType, merklesignature.CryptoPrimitivesID) + + sigCommitment = append(sigCommitment, schemeType...) + sigCommitment = append(sigCommitment, serializedSig...) + sigCommitment = append(sigCommitment, sig.VerifyingKey.GetFixedLengthHashableRepresentation()...) + + treeIdxBytes := make([]byte, 8) + binary.LittleEndian.PutUint64(treeIdxBytes, sig.MerkleArrayIndex) + sigCommitment = append(sigCommitment, treeIdxBytes...) + + //build the expected binary representation of the merkle signature proof + + proofLenByte := byte(len(sig.Proof.Path)) + + sigCommitment = append(sigCommitment, proofLenByte) + + hash := crypto.HashFactory{HashType: HashType}.NewHash() + zeroDigest := make([]byte, hash.BlockSize()) + for i := byte(0); i < (merklearray.MaxEncodedTreeDepth - proofLenByte); i++ { + sigCommitment = append(sigCommitment, zeroDigest...) + } + + for i := byte(0); i < proofLenByte; i++ { + sigCommitment = append(sigCommitment, sig.Proof.Path[i]...) + } + + hashValue := hashBytes(hash, sigCommitment) + return hashValue +} diff --git a/crypto/compactcert/common.go b/crypto/compactcert/common.go index d2370d779c..f1f3598510 100644 --- a/crypto/compactcert/common.go +++ b/crypto/compactcert/common.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -29,12 +29,12 @@ import ( type coinChoice struct { _struct struct{} `codec:",omitempty,omitemptyarray"` - J uint64 `codec:"j"` - SignedWeight uint64 `codec:"sigweight"` - ProvenWeight uint64 `codec:"provenweight"` - Sigcom crypto.Digest `codec:"sigcom"` - Partcom crypto.Digest `codec:"partcom"` - MsgHash crypto.Digest `codec:"msghash"` + J uint64 `codec:"j"` + SignedWeight uint64 `codec:"sigweight"` + ProvenWeight uint64 `codec:"provenweight"` + Sigcom crypto.GenericDigest `codec:"sigcom"` + Partcom crypto.GenericDigest `codec:"partcom"` + MsgHash crypto.GenericDigest `codec:"msghash"` } // ToBeHashed implements the crypto.Hashable interface. @@ -113,5 +113,5 @@ func numReveals(signedWeight uint64, provenWeight uint64, secKQ uint64, bound ui } func (p Params) numReveals(signedWeight uint64) (uint64, error) { - return numReveals(signedWeight, p.ProvenWeight, p.SecKQ, maxReveals) + return numReveals(signedWeight, p.ProvenWeight, p.SecKQ, MaxReveals) } diff --git a/crypto/compactcert/common_test.go b/crypto/compactcert/common_test.go index ce26e4c15f..73e71b893b 100644 --- a/crypto/compactcert/common_test.go +++ b/crypto/compactcert/common_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -27,9 +27,9 @@ func TestHashCoin(t *testing.T) { partitiontest.PartitionTest(t) var slots [32]uint64 - var sigcom [32]byte - var partcom [32]byte - var msgHash crypto.Digest + var sigcom = make(crypto.GenericDigest, HashSize) + var partcom = make(crypto.GenericDigest, HashSize) + var msgHash = make(crypto.GenericDigest, HashSize) crypto.RandBytes(sigcom[:]) crypto.RandBytes(partcom[:]) @@ -64,9 +64,9 @@ func TestHashCoin(t *testing.T) { } func BenchmarkHashCoin(b *testing.B) { - var sigcom [32]byte - var partcom [32]byte - var msgHash crypto.Digest + var sigcom = make(crypto.GenericDigest, HashSize) + var partcom = make(crypto.GenericDigest, HashSize) + var msgHash = make(crypto.GenericDigest, HashSize) crypto.RandBytes(sigcom[:]) crypto.RandBytes(partcom[:]) @@ -92,7 +92,7 @@ func TestNumReveals(t *testing.T) { billion := uint64(1000 * 1000 * 1000) microalgo := uint64(1000 * 1000) provenWeight := 2 * billion * microalgo - secKQ := uint64(128) + secKQ := uint64(compactCertSecKQForTests) bound := uint64(1000) for i := uint64(3); i < 10; i++ { @@ -114,7 +114,7 @@ func BenchmarkNumReveals(b *testing.B) { microalgo := uint64(1000 * 1000) provenWeight := 100 * billion * microalgo signedWeight := 110 * billion * microalgo - secKQ := uint64(128) + secKQ := uint64(compactCertSecKQForTests) bound := uint64(1000) nr, err := numReveals(signedWeight, provenWeight, secKQ, bound) diff --git a/crypto/merklearray/layer_test.go b/crypto/compactcert/const.go similarity index 69% rename from crypto/merklearray/layer_test.go rename to crypto/compactcert/const.go index 96418757f2..53133205b2 100644 --- a/crypto/merklearray/layer_test.go +++ b/crypto/compactcert/const.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -14,22 +14,19 @@ // You should have received a copy of the GNU Affero General Public License // along with go-algorand. If not, see . -package merklearray +package compactcert import ( - "testing" - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/test/partitiontest" ) -func TestLayerHash(t *testing.T) { - partitiontest.PartitionTest(t) +// HashType/ hashSize relate to the type of hash this package uses. +const ( + HashType = crypto.Sumhash + HashSize = crypto.SumhashDigestSize +) - var p pair - crypto.RandBytes(p.l[:]) - crypto.RandBytes(p.r[:]) - if crypto.HashObj(&p) != p.Hash() { - t.Error("hash mismatch") - } -} +const ( + // MaxReveals is a bound on allocation and on numReveals to limit log computation + MaxReveals = 1024 +) diff --git a/crypto/compactcert/msgp_gen.go b/crypto/compactcert/msgp_gen.go index 2f23016535..86fe2426b8 100644 --- a/crypto/compactcert/msgp_gen.go +++ b/crypto/compactcert/msgp_gen.go @@ -5,7 +5,6 @@ package compactcert import ( "sort" - "github.com/algorand/go-algorand/crypto" "github.com/algorand/msgp/msgp" ) @@ -55,61 +54,47 @@ import ( func (z *Cert) MarshalMsg(b []byte) (o []byte) { o = msgp.Require(b, z.Msgsize()) // omitempty: check for empty values - zb0005Len := uint32(5) - var zb0005Mask uint8 /* 6 bits */ - if len((*z).PartProofs) == 0 { - zb0005Len-- - zb0005Mask |= 0x1 + zb0003Len := uint32(5) + var zb0003Mask uint8 /* 6 bits */ + if (*z).PartProofs.MsgIsZero() { + zb0003Len-- + zb0003Mask |= 0x1 } - if len((*z).SigProofs) == 0 { - zb0005Len-- - zb0005Mask |= 0x2 + if (*z).SigProofs.MsgIsZero() { + zb0003Len-- + zb0003Mask |= 0x2 } if (*z).SigCommit.MsgIsZero() { - zb0005Len-- - zb0005Mask |= 0x8 + zb0003Len-- + zb0003Mask |= 0x8 } if len((*z).Reveals) == 0 { - zb0005Len-- - zb0005Mask |= 0x10 + zb0003Len-- + zb0003Mask |= 0x10 } if (*z).SignedWeight == 0 { - zb0005Len-- - zb0005Mask |= 0x20 + zb0003Len-- + zb0003Mask |= 0x20 } - // variable map header, size zb0005Len - o = append(o, 0x80|uint8(zb0005Len)) - if zb0005Len != 0 { - if (zb0005Mask & 0x1) == 0 { // if not empty + // variable map header, size zb0003Len + o = append(o, 0x80|uint8(zb0003Len)) + if zb0003Len != 0 { + if (zb0003Mask & 0x1) == 0 { // if not empty // string "P" o = append(o, 0xa1, 0x50) - if (*z).PartProofs == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).PartProofs))) - } - for zb0002 := range (*z).PartProofs { - o = (*z).PartProofs[zb0002].MarshalMsg(o) - } + o = (*z).PartProofs.MarshalMsg(o) } - if (zb0005Mask & 0x2) == 0 { // if not empty + if (zb0003Mask & 0x2) == 0 { // if not empty // string "S" o = append(o, 0xa1, 0x53) - if (*z).SigProofs == nil { - o = msgp.AppendNil(o) - } else { - o = msgp.AppendArrayHeader(o, uint32(len((*z).SigProofs))) - } - for zb0001 := range (*z).SigProofs { - o = (*z).SigProofs[zb0001].MarshalMsg(o) - } + o = (*z).SigProofs.MarshalMsg(o) } - if (zb0005Mask & 0x8) == 0 { // if not empty + if (zb0003Mask & 0x8) == 0 { // if not empty // string "c" o = append(o, 0xa1, 0x63) o = (*z).SigCommit.MarshalMsg(o) } - if (zb0005Mask & 0x10) == 0 { // if not empty + if (zb0003Mask & 0x10) == 0 { // if not empty // string "r" o = append(o, 0xa1, 0x72) if (*z).Reveals == nil { @@ -117,19 +102,19 @@ func (z *Cert) MarshalMsg(b []byte) (o []byte) { } else { o = msgp.AppendMapHeader(o, uint32(len((*z).Reveals))) } - zb0003_keys := make([]uint64, 0, len((*z).Reveals)) - for zb0003 := range (*z).Reveals { - zb0003_keys = append(zb0003_keys, zb0003) + zb0001_keys := make([]uint64, 0, len((*z).Reveals)) + for zb0001 := range (*z).Reveals { + zb0001_keys = append(zb0001_keys, zb0001) } - sort.Sort(SortUint64(zb0003_keys)) - for _, zb0003 := range zb0003_keys { - zb0004 := (*z).Reveals[zb0003] - _ = zb0004 - o = msgp.AppendUint64(o, zb0003) - o = zb0004.MarshalMsg(o) + sort.Sort(SortUint64(zb0001_keys)) + for _, zb0001 := range zb0001_keys { + zb0002 := (*z).Reveals[zb0001] + _ = zb0002 + o = msgp.AppendUint64(o, zb0001) + o = zb0002.MarshalMsg(o) } } - if (zb0005Mask & 0x20) == 0 { // if not empty + if (zb0003Mask & 0x20) == 0 { // if not empty // string "w" o = append(o, 0xa1, 0x77) o = msgp.AppendUint64(o, (*z).SignedWeight) @@ -147,127 +132,85 @@ func (_ *Cert) CanMarshalMsg(z interface{}) bool { func (z *Cert) UnmarshalMsg(bts []byte) (o []byte, err error) { var field []byte _ = field - var zb0005 int - var zb0006 bool - zb0005, zb0006, bts, err = msgp.ReadMapHeaderBytes(bts) + var zb0003 int + var zb0004 bool + zb0003, zb0004, bts, err = msgp.ReadMapHeaderBytes(bts) if _, ok := err.(msgp.TypeError); ok { - zb0005, zb0006, bts, err = msgp.ReadArrayHeaderBytes(bts) + zb0003, zb0004, bts, err = msgp.ReadArrayHeaderBytes(bts) if err != nil { err = msgp.WrapError(err) return } - if zb0005 > 0 { - zb0005-- + if zb0003 > 0 { + zb0003-- bts, err = (*z).SigCommit.UnmarshalMsg(bts) if err != nil { err = msgp.WrapError(err, "struct-from-array", "SigCommit") return } } - if zb0005 > 0 { - zb0005-- + if zb0003 > 0 { + zb0003-- (*z).SignedWeight, bts, err = msgp.ReadUint64Bytes(bts) if err != nil { err = msgp.WrapError(err, "struct-from-array", "SignedWeight") return } } - if zb0005 > 0 { - zb0005-- - var zb0007 int - var zb0008 bool - zb0007, zb0008, bts, err = msgp.ReadArrayHeaderBytes(bts) + if zb0003 > 0 { + zb0003-- + bts, err = (*z).SigProofs.UnmarshalMsg(bts) if err != nil { err = msgp.WrapError(err, "struct-from-array", "SigProofs") return } - if zb0007 > maxProofDigests { - err = msgp.ErrOverflow(uint64(zb0007), uint64(maxProofDigests)) - err = msgp.WrapError(err, "struct-from-array", "SigProofs") - return - } - if zb0008 { - (*z).SigProofs = nil - } else if (*z).SigProofs != nil && cap((*z).SigProofs) >= zb0007 { - (*z).SigProofs = ((*z).SigProofs)[:zb0007] - } else { - (*z).SigProofs = make([]crypto.Digest, zb0007) - } - for zb0001 := range (*z).SigProofs { - bts, err = (*z).SigProofs[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "SigProofs", zb0001) - return - } - } } - if zb0005 > 0 { - zb0005-- - var zb0009 int - var zb0010 bool - zb0009, zb0010, bts, err = msgp.ReadArrayHeaderBytes(bts) + if zb0003 > 0 { + zb0003-- + bts, err = (*z).PartProofs.UnmarshalMsg(bts) if err != nil { err = msgp.WrapError(err, "struct-from-array", "PartProofs") return } - if zb0009 > maxProofDigests { - err = msgp.ErrOverflow(uint64(zb0009), uint64(maxProofDigests)) - err = msgp.WrapError(err, "struct-from-array", "PartProofs") - return - } - if zb0010 { - (*z).PartProofs = nil - } else if (*z).PartProofs != nil && cap((*z).PartProofs) >= zb0009 { - (*z).PartProofs = ((*z).PartProofs)[:zb0009] - } else { - (*z).PartProofs = make([]crypto.Digest, zb0009) - } - for zb0002 := range (*z).PartProofs { - bts, err = (*z).PartProofs[zb0002].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "PartProofs", zb0002) - return - } - } } - if zb0005 > 0 { - zb0005-- - var zb0011 int - var zb0012 bool - zb0011, zb0012, bts, err = msgp.ReadMapHeaderBytes(bts) + if zb0003 > 0 { + zb0003-- + var zb0005 int + var zb0006 bool + zb0005, zb0006, bts, err = msgp.ReadMapHeaderBytes(bts) if err != nil { err = msgp.WrapError(err, "struct-from-array", "Reveals") return } - if zb0011 > maxReveals { - err = msgp.ErrOverflow(uint64(zb0011), uint64(maxReveals)) + if zb0005 > MaxReveals { + err = msgp.ErrOverflow(uint64(zb0005), uint64(MaxReveals)) err = msgp.WrapError(err, "struct-from-array", "Reveals") return } - if zb0012 { + if zb0006 { (*z).Reveals = nil } else if (*z).Reveals == nil { - (*z).Reveals = make(map[uint64]Reveal, zb0011) + (*z).Reveals = make(map[uint64]Reveal, zb0005) } - for zb0011 > 0 { - var zb0003 uint64 - var zb0004 Reveal - zb0011-- - zb0003, bts, err = msgp.ReadUint64Bytes(bts) + for zb0005 > 0 { + var zb0001 uint64 + var zb0002 Reveal + zb0005-- + zb0001, bts, err = msgp.ReadUint64Bytes(bts) if err != nil { err = msgp.WrapError(err, "struct-from-array", "Reveals") return } - bts, err = zb0004.UnmarshalMsg(bts) + bts, err = zb0002.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Reveals", zb0003) + err = msgp.WrapError(err, "struct-from-array", "Reveals", zb0001) return } - (*z).Reveals[zb0003] = zb0004 + (*z).Reveals[zb0001] = zb0002 } } - if zb0005 > 0 { - err = msgp.ErrTooManyArrayFields(zb0005) + if zb0003 > 0 { + err = msgp.ErrTooManyArrayFields(zb0003) if err != nil { err = msgp.WrapError(err, "struct-from-array") return @@ -278,11 +221,11 @@ func (z *Cert) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err) return } - if zb0006 { + if zb0004 { (*z) = Cert{} } - for zb0005 > 0 { - zb0005-- + for zb0003 > 0 { + zb0003-- field, bts, err = msgp.ReadMapKeyZC(bts) if err != nil { err = msgp.WrapError(err) @@ -302,92 +245,50 @@ func (z *Cert) UnmarshalMsg(bts []byte) (o []byte, err error) { return } case "S": - var zb0013 int - var zb0014 bool - zb0013, zb0014, bts, err = msgp.ReadArrayHeaderBytes(bts) + bts, err = (*z).SigProofs.UnmarshalMsg(bts) if err != nil { err = msgp.WrapError(err, "SigProofs") return } - if zb0013 > maxProofDigests { - err = msgp.ErrOverflow(uint64(zb0013), uint64(maxProofDigests)) - err = msgp.WrapError(err, "SigProofs") - return - } - if zb0014 { - (*z).SigProofs = nil - } else if (*z).SigProofs != nil && cap((*z).SigProofs) >= zb0013 { - (*z).SigProofs = ((*z).SigProofs)[:zb0013] - } else { - (*z).SigProofs = make([]crypto.Digest, zb0013) - } - for zb0001 := range (*z).SigProofs { - bts, err = (*z).SigProofs[zb0001].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "SigProofs", zb0001) - return - } - } case "P": - var zb0015 int - var zb0016 bool - zb0015, zb0016, bts, err = msgp.ReadArrayHeaderBytes(bts) + bts, err = (*z).PartProofs.UnmarshalMsg(bts) if err != nil { err = msgp.WrapError(err, "PartProofs") return } - if zb0015 > maxProofDigests { - err = msgp.ErrOverflow(uint64(zb0015), uint64(maxProofDigests)) - err = msgp.WrapError(err, "PartProofs") - return - } - if zb0016 { - (*z).PartProofs = nil - } else if (*z).PartProofs != nil && cap((*z).PartProofs) >= zb0015 { - (*z).PartProofs = ((*z).PartProofs)[:zb0015] - } else { - (*z).PartProofs = make([]crypto.Digest, zb0015) - } - for zb0002 := range (*z).PartProofs { - bts, err = (*z).PartProofs[zb0002].UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "PartProofs", zb0002) - return - } - } case "r": - var zb0017 int - var zb0018 bool - zb0017, zb0018, bts, err = msgp.ReadMapHeaderBytes(bts) + var zb0007 int + var zb0008 bool + zb0007, zb0008, bts, err = msgp.ReadMapHeaderBytes(bts) if err != nil { err = msgp.WrapError(err, "Reveals") return } - if zb0017 > maxReveals { - err = msgp.ErrOverflow(uint64(zb0017), uint64(maxReveals)) + if zb0007 > MaxReveals { + err = msgp.ErrOverflow(uint64(zb0007), uint64(MaxReveals)) err = msgp.WrapError(err, "Reveals") return } - if zb0018 { + if zb0008 { (*z).Reveals = nil } else if (*z).Reveals == nil { - (*z).Reveals = make(map[uint64]Reveal, zb0017) + (*z).Reveals = make(map[uint64]Reveal, zb0007) } - for zb0017 > 0 { - var zb0003 uint64 - var zb0004 Reveal - zb0017-- - zb0003, bts, err = msgp.ReadUint64Bytes(bts) + for zb0007 > 0 { + var zb0001 uint64 + var zb0002 Reveal + zb0007-- + zb0001, bts, err = msgp.ReadUint64Bytes(bts) if err != nil { err = msgp.WrapError(err, "Reveals") return } - bts, err = zb0004.UnmarshalMsg(bts) + bts, err = zb0002.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "Reveals", zb0003) + err = msgp.WrapError(err, "Reveals", zb0001) return } - (*z).Reveals[zb0003] = zb0004 + (*z).Reveals[zb0001] = zb0002 } default: err = msgp.ErrNoField(string(field)) @@ -409,20 +310,12 @@ func (_ *Cert) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *Cert) Msgsize() (s int) { - s = 1 + 2 + (*z).SigCommit.Msgsize() + 2 + msgp.Uint64Size + 2 + msgp.ArrayHeaderSize - for zb0001 := range (*z).SigProofs { - s += (*z).SigProofs[zb0001].Msgsize() - } - s += 2 + msgp.ArrayHeaderSize - for zb0002 := range (*z).PartProofs { - s += (*z).PartProofs[zb0002].Msgsize() - } - s += 2 + msgp.MapHeaderSize + s = 1 + 2 + (*z).SigCommit.Msgsize() + 2 + msgp.Uint64Size + 2 + (*z).SigProofs.Msgsize() + 2 + (*z).PartProofs.Msgsize() + 2 + msgp.MapHeaderSize if (*z).Reveals != nil { - for zb0003, zb0004 := range (*z).Reveals { - _ = zb0003 - _ = zb0004 - s += 0 + msgp.Uint64Size + zb0004.Msgsize() + for zb0001, zb0002 := range (*z).Reveals { + _ = zb0001 + _ = zb0002 + s += 0 + msgp.Uint64Size + zb0002.Msgsize() } } return @@ -430,71 +323,53 @@ func (z *Cert) Msgsize() (s int) { // MsgIsZero returns whether this is a zero value func (z *Cert) MsgIsZero() bool { - return ((*z).SigCommit.MsgIsZero()) && ((*z).SignedWeight == 0) && (len((*z).SigProofs) == 0) && (len((*z).PartProofs) == 0) && (len((*z).Reveals) == 0) + return ((*z).SigCommit.MsgIsZero()) && ((*z).SignedWeight == 0) && ((*z).SigProofs.MsgIsZero()) && ((*z).PartProofs.MsgIsZero()) && (len((*z).Reveals) == 0) } // MarshalMsg implements msgp.Marshaler func (z *CompactOneTimeSignature) MarshalMsg(b []byte) (o []byte) { o = msgp.Require(b, z.Msgsize()) // omitempty: check for empty values - zb0001Len := uint32(6) - var zb0001Mask uint8 /* 8 bits */ - if (*z).OneTimeSignature.PK.MsgIsZero() { + zb0001Len := uint32(4) + var zb0001Mask uint8 /* 6 bits */ + if (*z).Signature.MerkleArrayIndex == 0 { zb0001Len-- zb0001Mask |= 0x4 } - if (*z).OneTimeSignature.PK1Sig.MsgIsZero() { + if (*z).Signature.Proof.MsgIsZero() { zb0001Len-- zb0001Mask |= 0x8 } - if (*z).OneTimeSignature.PK2.MsgIsZero() { + if (*z).Signature.Signature.MsgIsZero() { zb0001Len-- zb0001Mask |= 0x10 } - if (*z).OneTimeSignature.PK2Sig.MsgIsZero() { + if (*z).Signature.VerifyingKey.MsgIsZero() { zb0001Len-- zb0001Mask |= 0x20 } - if (*z).OneTimeSignature.PKSigOld.MsgIsZero() { - zb0001Len-- - zb0001Mask |= 0x40 - } - if (*z).OneTimeSignature.Sig.MsgIsZero() { - zb0001Len-- - zb0001Mask |= 0x80 - } // variable map header, size zb0001Len o = append(o, 0x80|uint8(zb0001Len)) if zb0001Len != 0 { if (zb0001Mask & 0x4) == 0 { // if not empty - // string "p" - o = append(o, 0xa1, 0x70) - o = (*z).OneTimeSignature.PK.MarshalMsg(o) + // string "idx" + o = append(o, 0xa3, 0x69, 0x64, 0x78) + o = msgp.AppendUint64(o, (*z).Signature.MerkleArrayIndex) } if (zb0001Mask & 0x8) == 0 { // if not empty - // string "p1s" - o = append(o, 0xa3, 0x70, 0x31, 0x73) - o = (*z).OneTimeSignature.PK1Sig.MarshalMsg(o) + // string "prf" + o = append(o, 0xa3, 0x70, 0x72, 0x66) + o = (*z).Signature.Proof.MarshalMsg(o) } if (zb0001Mask & 0x10) == 0 { // if not empty - // string "p2" - o = append(o, 0xa2, 0x70, 0x32) - o = (*z).OneTimeSignature.PK2.MarshalMsg(o) + // string "sig" + o = append(o, 0xa3, 0x73, 0x69, 0x67) + o = (*z).Signature.Signature.MarshalMsg(o) } if (zb0001Mask & 0x20) == 0 { // if not empty - // string "p2s" - o = append(o, 0xa3, 0x70, 0x32, 0x73) - o = (*z).OneTimeSignature.PK2Sig.MarshalMsg(o) - } - if (zb0001Mask & 0x40) == 0 { // if not empty - // string "ps" - o = append(o, 0xa2, 0x70, 0x73) - o = (*z).OneTimeSignature.PKSigOld.MarshalMsg(o) - } - if (zb0001Mask & 0x80) == 0 { // if not empty - // string "s" - o = append(o, 0xa1, 0x73) - o = (*z).OneTimeSignature.Sig.MarshalMsg(o) + // string "vkey" + o = append(o, 0xa4, 0x76, 0x6b, 0x65, 0x79) + o = (*z).Signature.VerifyingKey.MarshalMsg(o) } } return @@ -520,49 +395,33 @@ func (z *CompactOneTimeSignature) UnmarshalMsg(bts []byte) (o []byte, err error) } if zb0001 > 0 { zb0001-- - bts, err = (*z).OneTimeSignature.Sig.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Sig") - return - } - } - if zb0001 > 0 { - zb0001-- - bts, err = (*z).OneTimeSignature.PK.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "PK") - return - } - } - if zb0001 > 0 { - zb0001-- - bts, err = (*z).OneTimeSignature.PKSigOld.UnmarshalMsg(bts) + bts, err = (*z).Signature.Signature.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "PKSigOld") + err = msgp.WrapError(err, "struct-from-array", "Signature") return } } if zb0001 > 0 { zb0001-- - bts, err = (*z).OneTimeSignature.PK2.UnmarshalMsg(bts) + (*z).Signature.MerkleArrayIndex, bts, err = msgp.ReadUint64Bytes(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "PK2") + err = msgp.WrapError(err, "struct-from-array", "MerkleArrayIndex") return } } if zb0001 > 0 { zb0001-- - bts, err = (*z).OneTimeSignature.PK1Sig.UnmarshalMsg(bts) + bts, err = (*z).Signature.Proof.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "PK1Sig") + err = msgp.WrapError(err, "struct-from-array", "Proof") return } } if zb0001 > 0 { zb0001-- - bts, err = (*z).OneTimeSignature.PK2Sig.UnmarshalMsg(bts) + bts, err = (*z).Signature.VerifyingKey.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "PK2Sig") + err = msgp.WrapError(err, "struct-from-array", "VerifyingKey") return } } @@ -589,40 +448,28 @@ func (z *CompactOneTimeSignature) UnmarshalMsg(bts []byte) (o []byte, err error) return } switch string(field) { - case "s": - bts, err = (*z).OneTimeSignature.Sig.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Sig") - return - } - case "p": - bts, err = (*z).OneTimeSignature.PK.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "PK") - return - } - case "ps": - bts, err = (*z).OneTimeSignature.PKSigOld.UnmarshalMsg(bts) + case "sig": + bts, err = (*z).Signature.Signature.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "PKSigOld") + err = msgp.WrapError(err, "Signature") return } - case "p2": - bts, err = (*z).OneTimeSignature.PK2.UnmarshalMsg(bts) + case "idx": + (*z).Signature.MerkleArrayIndex, bts, err = msgp.ReadUint64Bytes(bts) if err != nil { - err = msgp.WrapError(err, "PK2") + err = msgp.WrapError(err, "MerkleArrayIndex") return } - case "p1s": - bts, err = (*z).OneTimeSignature.PK1Sig.UnmarshalMsg(bts) + case "prf": + bts, err = (*z).Signature.Proof.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "PK1Sig") + err = msgp.WrapError(err, "Proof") return } - case "p2s": - bts, err = (*z).OneTimeSignature.PK2Sig.UnmarshalMsg(bts) + case "vkey": + bts, err = (*z).Signature.VerifyingKey.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "PK2Sig") + err = msgp.WrapError(err, "VerifyingKey") return } default: @@ -645,13 +492,13 @@ func (_ *CompactOneTimeSignature) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *CompactOneTimeSignature) Msgsize() (s int) { - s = 1 + 2 + (*z).OneTimeSignature.Sig.Msgsize() + 2 + (*z).OneTimeSignature.PK.Msgsize() + 3 + (*z).OneTimeSignature.PKSigOld.Msgsize() + 3 + (*z).OneTimeSignature.PK2.Msgsize() + 4 + (*z).OneTimeSignature.PK1Sig.Msgsize() + 4 + (*z).OneTimeSignature.PK2Sig.Msgsize() + s = 1 + 4 + (*z).Signature.Signature.Msgsize() + 4 + msgp.Uint64Size + 4 + (*z).Signature.Proof.Msgsize() + 5 + (*z).Signature.VerifyingKey.Msgsize() return } // MsgIsZero returns whether this is a zero value func (z *CompactOneTimeSignature) MsgIsZero() bool { - return ((*z).OneTimeSignature.Sig.MsgIsZero()) && ((*z).OneTimeSignature.PK.MsgIsZero()) && ((*z).OneTimeSignature.PKSigOld.MsgIsZero()) && ((*z).OneTimeSignature.PK2.MsgIsZero()) && ((*z).OneTimeSignature.PK1Sig.MsgIsZero()) && ((*z).OneTimeSignature.PK2Sig.MsgIsZero()) + return ((*z).Signature.Signature.MsgIsZero()) && ((*z).Signature.MerkleArrayIndex == 0) && ((*z).Signature.Proof.MsgIsZero()) && ((*z).Signature.VerifyingKey.MsgIsZero()) } // MarshalMsg implements msgp.Marshaler diff --git a/crypto/compactcert/structs.go b/crypto/compactcert/structs.go index 1e02e4eafc..dd1a4f3156 100644 --- a/crypto/compactcert/structs.go +++ b/crypto/compactcert/structs.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -18,22 +18,23 @@ package compactcert import ( "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/crypto/merklearray" + "github.com/algorand/go-algorand/crypto/merklesignature" "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/protocol" ) // Params defines common parameters for the verifier and builder. type Params struct { Msg crypto.Hashable // Message to be cerified ProvenWeight uint64 // Weight threshold proven by the certificate - SigRound basics.Round // Ephemeral signature round to expect + SigRound basics.Round // The round for which the ephemeral key is committed to SecKQ uint64 // Security parameter (k+q) from analysis document } // CompactOneTimeSignature is crypto.OneTimeSignature with omitempty type CompactOneTimeSignature struct { _struct struct{} `codec:",omitempty,omitemptyarray"` - crypto.OneTimeSignature + merklesignature.Signature } // A sigslotCommit is a single slot in the sigs array that forms the certificate. @@ -49,10 +50,6 @@ type sigslotCommit struct { L uint64 `codec:"l"` } -func (ssc sigslotCommit) ToBeHashed() (protocol.HashID, []byte) { - return protocol.CompactCertSig, protocol.Encode(&ssc) -} - // Reveal is a single array position revealed as part of a compact // certificate. It reveals an element of the signature array and // the corresponding element of the participants array. @@ -63,23 +60,19 @@ type Reveal struct { Part basics.Participant `codec:"p"` } -// maxReveals is a bound on allocation and on numReveals to limit log computation -const maxReveals = 1024 -const maxProofDigests = 20 * maxReveals - // Cert represents a compact certificate. type Cert struct { _struct struct{} `codec:",omitempty,omitemptyarray"` - SigCommit crypto.Digest `codec:"c"` - SignedWeight uint64 `codec:"w"` - SigProofs []crypto.Digest `codec:"S,allocbound=maxProofDigests"` - PartProofs []crypto.Digest `codec:"P,allocbound=maxProofDigests"` + SigCommit crypto.GenericDigest `codec:"c"` + SignedWeight uint64 `codec:"w"` + SigProofs merklearray.Proof `codec:"S"` + PartProofs merklearray.Proof `codec:"P"` // Reveals is a sparse map from the position being revealed // to the corresponding elements from the sigs and participants // arrays. - Reveals map[uint64]Reveal `codec:"r,allocbound=maxReveals"` + Reveals map[uint64]Reveal `codec:"r,allocbound=MaxReveals"` } // SortUint64 implements sorting by uint64 keys for diff --git a/crypto/compactcert/verifier.go b/crypto/compactcert/verifier.go index 38747d6118..5d9819a37d 100644 --- a/crypto/compactcert/verifier.go +++ b/crypto/compactcert/verifier.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -21,20 +21,19 @@ import ( "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/crypto/merklearray" - "github.com/algorand/go-algorand/data/basics" ) // Verifier is used to verify a compact certificate. type Verifier struct { Params - partcom crypto.Digest + partcom crypto.GenericDigest } // MkVerifier constructs a verifier to check the compact certificate // on the message specified in p, with partcom specifying the Merkle // root of the participants that must sign the message. -func MkVerifier(p Params, partcom crypto.Digest) *Verifier { +func MkVerifier(p Params, partcom crypto.GenericDigest) *Verifier { return &Verifier{ Params: p, partcom: partcom, @@ -48,26 +47,35 @@ func (v *Verifier) Verify(c *Cert) error { return fmt.Errorf("cert signed weight %d <= proven weight %d", c.SignedWeight, v.ProvenWeight) } - // Verify all of the reveals - sigs := make(map[uint64]crypto.Digest) - parts := make(map[uint64]crypto.Digest) + sigs := make(map[uint64]crypto.Hashable) + parts := make(map[uint64]crypto.Hashable) for pos, r := range c.Reveals { - sigs[pos] = crypto.HashObj(r.SigSlot) - parts[pos] = crypto.HashObj(r.Part) + sig, err := buildCommittableSignature(r.SigSlot) + if err != nil { + return err + } + + sigs[pos] = sig + parts[pos] = r.Part + + // verify that the msg and the signature is valid under the given participant's Pk + err = r.Part.PK.Verify( + uint64(v.SigRound), + v.Msg, + r.SigSlot.Sig.Signature) - ephID := basics.OneTimeIDForRound(v.SigRound, r.Part.KeyDilution) - if !r.Part.PK.Verify(ephID, v.Msg, r.SigSlot.Sig.OneTimeSignature) { - return fmt.Errorf("signature in reveal pos %d does not verify", pos) + if err != nil { + return fmt.Errorf("signature in reveal pos %d does not verify. error is %s", pos, err) } } - err := merklearray.Verify(c.SigCommit, sigs, c.SigProofs) - if err != nil { + // verify all the reveals proofs on the signature tree. + if err := merklearray.VerifyVectorCommitment(c.SigCommit[:], sigs, &c.SigProofs); err != nil { return err } - err = merklearray.Verify(v.partcom, parts, c.PartProofs) - if err != nil { + // verify all the reveals proofs on the participant tree. + if err := merklearray.VerifyVectorCommitment(v.partcom[:], parts, &c.PartProofs); err != nil { return err } @@ -77,7 +85,7 @@ func (v *Verifier) Verify(c *Cert) error { return err } - msgHash := crypto.HashObj(v.Msg) + msgHash := crypto.GenericHashObj(c.PartProofs.HashFactory.NewHash(), v.Msg) for j := uint64(0); j < nr; j++ { choice := coinChoice{ diff --git a/crypto/crypto_test.go b/crypto/crypto_test.go index 472fb15dd2..fffa501f67 100644 --- a/crypto/crypto_test.go +++ b/crypto/crypto_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -43,22 +43,22 @@ func randString() (b TestingHashable) { func signVerify(t *testing.T, c *SignatureSecrets, c2 *SignatureSecrets) { s := randString() sig := c.Sign(s) - if !c.Verify(s, sig) { + if !c.Verify(s, sig, true) { t.Errorf("correct signature failed to verify (plain)") } s2 := randString() sig2 := c.Sign(s2) - if c.Verify(s, sig2) { + if c.Verify(s, sig2, true) { t.Errorf("wrong message incorrectly verified (plain)") } sig3 := c2.Sign(s) - if c.Verify(s, sig3) { + if c.Verify(s, sig3, true) { t.Errorf("wrong key incorrectly verified (plain)") } - if c.Verify(s2, sig3) { + if c.Verify(s2, sig3, true) { t.Errorf("wrong message+key incorrectly verified (plain)") } } diff --git a/crypto/cryptoerror.go b/crypto/cryptoerror.go index fb8e456988..26636dd887 100644 --- a/crypto/cryptoerror.go +++ b/crypto/cryptoerror.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/crypto/curve25519.go b/crypto/curve25519.go index e0bf278def..87f3aa1e02 100644 --- a/crypto/curve25519.go +++ b/crypto/curve25519.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -112,14 +112,19 @@ func ed25519Sign(secret ed25519PrivateKey, data []byte) (sig ed25519Signature) { return } -func ed25519Verify(public ed25519PublicKey, data []byte, sig ed25519Signature) bool { +func ed25519Verify(public ed25519PublicKey, data []byte, sig ed25519Signature, useBatchVerificationCompatibleVersion bool) bool { // &data[0] will make Go panic if msg is zero length d := (*C.uchar)(C.NULL) if len(data) != 0 { d = (*C.uchar)(&data[0]) } // https://download.libsodium.org/doc/public-key_cryptography/public-key_signatures#detached-mode - result := C.crypto_sign_ed25519_verify_detached((*C.uchar)(&sig[0]), d, C.ulonglong(len(data)), (*C.uchar)(&public[0])) + var result C.int + if useBatchVerificationCompatibleVersion { + result = C.crypto_sign_ed25519_bv_compatible_verify_detached((*C.uchar)(&sig[0]), d, C.ulonglong(len(data)), (*C.uchar)(&public[0])) + } else { + result = C.crypto_sign_ed25519_verify_detached((*C.uchar)(&sig[0]), d, C.ulonglong(len(data)), (*C.uchar)(&public[0])) + } return result == 0 } @@ -196,7 +201,7 @@ func GenerateSignatureSecrets(seed Seed) *SignatureSecrets { // cryptographic secrets. func (s *SignatureSecrets) Sign(message Hashable) Signature { cryptoSigSecretsSignTotal.Inc(map[string]string{}) - return s.SignBytes(hashRep(message)) + return s.SignBytes(HashRep(message)) } // SignBytes signs a message directly, without first hashing. @@ -211,15 +216,15 @@ func (s *SignatureSecrets) SignBytes(message []byte) Signature { // // It returns true if this is the case; otherwise, it returns false. // -func (v SignatureVerifier) Verify(message Hashable, sig Signature) bool { +func (v SignatureVerifier) Verify(message Hashable, sig Signature, useBatchVerificationCompatibleVersion bool) bool { cryptoSigSecretsVerifyTotal.Inc(map[string]string{}) - return ed25519Verify(ed25519PublicKey(v), hashRep(message), ed25519Signature(sig)) + return ed25519Verify(ed25519PublicKey(v), HashRep(message), ed25519Signature(sig), useBatchVerificationCompatibleVersion) } // VerifyBytes verifies a signature, where the message is not hashed first. // Caller is responsible for domain separation. // If the message is a Hashable, Verify() can be used instead. -func (v SignatureVerifier) VerifyBytes(message []byte, sig Signature) bool { +func (v SignatureVerifier) VerifyBytes(message []byte, sig Signature, useBatchVerificationCompatibleVersion bool) bool { cryptoSigSecretsVerifyBytesTotal.Inc(map[string]string{}) - return ed25519Verify(ed25519PublicKey(v), message, ed25519Signature(sig)) + return ed25519Verify(ed25519PublicKey(v), message, ed25519Signature(sig), useBatchVerificationCompatibleVersion) } diff --git a/crypto/curve25519_test.go b/crypto/curve25519_test.go index 7850048618..e6f939fe21 100644 --- a/crypto/curve25519_test.go +++ b/crypto/curve25519_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -33,7 +33,7 @@ func TestSignVerifyEmptyMessage(t *testing.T) { partitiontest.PartitionTest(t) pk, sk := ed25519GenerateKey() sig := ed25519Sign(sk, []byte{}) - if !ed25519Verify(pk, []byte{}, sig) { + if !ed25519Verify(pk, []byte{}, sig, true) { t.Errorf("sig of an empty message failed to verify") } } @@ -43,7 +43,7 @@ func TestVerifyZeros(t *testing.T) { var pk SignatureVerifier var sig Signature for x := byte(0); x < 255; x++ { - if pk.VerifyBytes([]byte{x}, sig) { + if pk.VerifyBytes([]byte{x}, sig, true) { t.Errorf("Zero sig with zero pk successfully verified message %x", x) } } @@ -84,7 +84,7 @@ func BenchmarkSignVerify(b *testing.B) { for i := 0; i < b.N; i++ { sig := c.Sign(s) - _ = c.Verify(s, sig) + _ = c.Verify(s, sig, true) } } @@ -108,6 +108,6 @@ func BenchmarkVerify(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { - _ = c.Verify(strs[i], sigs[i]) + _ = c.Verify(strs[i], sigs[i], true) } } diff --git a/crypto/digest.go b/crypto/digest.go new file mode 100644 index 0000000000..a65fa4d39b --- /dev/null +++ b/crypto/digest.go @@ -0,0 +1,36 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package crypto + +import "bytes" + +// GenericDigest is a digest that implements CustomSizeDigest, and can be used as hash output. +//msgp:allocbound GenericDigest MaxHashDigestSize +type GenericDigest []byte + +// ToSlice is used inside the Tree itself when interacting with TreeDigest +func (d GenericDigest) ToSlice() []byte { return d } + +// IsEqual compare two digests +func (d GenericDigest) IsEqual(other GenericDigest) bool { + return bytes.Equal(d, other) +} + +// IsEmpty checks wether the generic digest is an empty one or not +func (d GenericDigest) IsEmpty() bool { + return len(d) == 0 +} diff --git a/crypto/encoding_test.go b/crypto/encoding_test.go index e5df42c9ef..515f6a3eff 100644 --- a/crypto/encoding_test.go +++ b/crypto/encoding_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/crypto/falconWrapper.go b/crypto/falconWrapper.go new file mode 100644 index 0000000000..807a8d5fde --- /dev/null +++ b/crypto/falconWrapper.go @@ -0,0 +1,121 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package crypto + +import ( + cfalcon "github.com/algorand/falcon" +) + +const ( + // FalconSeedSize Represents the size in bytes of the random bytes used to generate Falcon keys + FalconSeedSize = 48 + + // FalconMaxSignatureSize Represents the max possible size in bytes of a falcon signature + FalconMaxSignatureSize = cfalcon.CTSignatureSize +) + +type ( + // FalconPublicKey is a wrapper for cfalcon.PublicKeySizey (used for packing) + FalconPublicKey [cfalcon.PublicKeySize]byte + // FalconPrivateKey is a wrapper for cfalcon.PrivateKeySize (used for packing) + FalconPrivateKey [cfalcon.PrivateKeySize]byte + // FalconSeed represents the seed which is being used to generate Falcon keys + FalconSeed [FalconSeedSize]byte + // FalconSignature represents a Falcon signature in a compressed-form + //msgp:allocbound FalconSignature FalconMaxSignatureSize + FalconSignature []byte +) + +// FalconSigner is the implementation of Signer for the Falcon signature scheme. +type FalconSigner struct { + _struct struct{} `codec:",omitempty,omitemptyarray"` + + PublicKey FalconPublicKey `codec:"pk"` + PrivateKey FalconPrivateKey `codec:"sk"` +} + +// GenerateFalconSigner Generates a Falcon Signer. +func GenerateFalconSigner(seed FalconSeed) (FalconSigner, error) { + pk, sk, err := cfalcon.GenerateKey(seed[:]) + return FalconSigner{ + PublicKey: FalconPublicKey(pk), + PrivateKey: FalconPrivateKey(sk), + }, err +} + +// Sign receives a message and generates a signature over that message. +func (d *FalconSigner) Sign(message Hashable) (FalconSignature, error) { + hs := Hash(HashRep(message)) + return d.SignBytes(hs[:]) +} + +// SignBytes receives bytes and signs over them. +func (d *FalconSigner) SignBytes(data []byte) (FalconSignature, error) { + signedData, err := (*cfalcon.PrivateKey)(&d.PrivateKey).SignCompressed(data) + return FalconSignature(signedData), err +} + +// GetVerifyingKey Outputs a verifying key object which is serializable. +func (d *FalconSigner) GetVerifyingKey() *FalconVerifier { + return &FalconVerifier{ + PublicKey: d.PublicKey, + } +} + +// FalconVerifier implements the type Verifier interface for the falcon signature scheme. +type FalconVerifier struct { + _struct struct{} `codec:",omitempty,omitemptyarray"` + + PublicKey FalconPublicKey `codec:"k"` +} + +// Verify follows falcon algorithm to verify a signature. +func (d *FalconVerifier) Verify(message Hashable, sig FalconSignature) error { + hs := Hash(HashRep(message)) + return d.VerifyBytes(hs[:], sig) +} + +// VerifyBytes follows falcon algorithm to verify a signature. +func (d *FalconVerifier) VerifyBytes(data []byte, sig FalconSignature) error { + // The wrapper, currently, support only the compress form signature. so we can + // assume that the signature given is in a compress form + falconSig := cfalcon.CompressedSignature(sig) + return (*cfalcon.PublicKey)(&d.PublicKey).Verify(falconSig, data) +} + +// GetFixedLengthHashableRepresentation is used to fetch a plain serialized version of the public data (without the use of the msgpack). +func (d *FalconVerifier) GetFixedLengthHashableRepresentation() []byte { + return d.PublicKey[:] +} + +// GetSignatureFixedLengthHashableRepresentation returns a serialized version of the signature +func (d *FalconVerifier) GetSignatureFixedLengthHashableRepresentation(signature FalconSignature) ([]byte, error) { + compressedSignature := cfalcon.CompressedSignature(signature) + ctSignature, err := compressedSignature.ConvertToCT() + return ctSignature[:], err +} + +// NewFalconSigner creates a falconSinger that is used to sign and verify falcon signatures +func NewFalconSigner() (*FalconSigner, error) { + var seed FalconSeed + RandBytes(seed[:]) + signer, err := GenerateFalconSigner(seed) + if err != nil { + return &FalconSigner{}, err + } + return &signer, nil +} diff --git a/crypto/falconWrapper_test.go b/crypto/falconWrapper_test.go new file mode 100644 index 0000000000..b659ce56eb --- /dev/null +++ b/crypto/falconWrapper_test.go @@ -0,0 +1,110 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package crypto + +import ( + "github.com/algorand/falcon" + "github.com/algorand/go-algorand/test/partitiontest" + "github.com/stretchr/testify/require" + "testing" +) + +func TestSignAndVerifyFalcon(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + var seed FalconSeed + SystemRNG.RandBytes(seed[:]) + key, err := GenerateFalconSigner(seed) + a.NoError(err) + + msg := []byte("Neque porro quisquam est qui dolorem ipsum quia dolor sit amet") + byteSig, err := key.SignBytes(msg) + a.NoError(err) + + verifier := key.GetVerifyingKey() + err = verifier.VerifyBytes(msg, byteSig) + a.NoError(err) +} + +func TestSignAndVerifyFalconHashable(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + msg := TestingHashable{data: []byte("Neque porro quisquam est qui dolorem ipsum quia dolor sit amet")} + var seed FalconSeed + SystemRNG.RandBytes(seed[:]) + key, err := GenerateFalconSigner(seed) + a.NoError(err) + + byteSig, err := key.Sign(msg) + a.NoError(err) + + verifier := key.GetVerifyingKey() + err = verifier.Verify(msg, byteSig) + a.NoError(err) +} + +func TestFalconCanHandleNilSignature(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + var seed FalconSeed + SystemRNG.RandBytes(seed[:]) + key, err := GenerateFalconSigner(seed) + a.NoError(err) + + err = key.GetVerifyingKey().VerifyBytes([]byte("Test"), nil) + a.Error(err) +} + +func TestVerificationBytes(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + var seed FalconSeed + SystemRNG.RandBytes(seed[:]) + key, err := GenerateFalconSigner(seed) + a.NoError(err) + + verifyingRawKey := key.GetVerifyingKey().GetFixedLengthHashableRepresentation() + + a.Equal(verifyingRawKey, key.PublicKey[:]) +} + +func TestFalconsFormatConversion(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + var seed FalconSeed + SystemRNG.RandBytes(seed[:]) + key, err := GenerateFalconSigner(seed) + a.NoError(err) + + msg := []byte("Neque porro quisquam est qui dolorem ipsum quia dolor sit amet") + sig, err := key.SignBytes(msg) + a.NoError(err) + + falconSig := falcon.CompressedSignature(sig) + ctFormat, err := falconSig.ConvertToCT() + + rawFormat, err := key.GetVerifyingKey().GetSignatureFixedLengthHashableRepresentation(sig) + a.NoError(err) + a.NotEqual([]byte(sig), rawFormat) + + a.Equal(ctFormat[:], rawFormat) +} diff --git a/crypto/hashes.go b/crypto/hashes.go new file mode 100644 index 0000000000..51db955242 --- /dev/null +++ b/crypto/hashes.go @@ -0,0 +1,151 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package crypto + +import ( + "crypto/sha512" + "errors" + "fmt" + "hash" + + "github.com/algorand/go-algorand/protocol" + "github.com/algorand/go-sumhash" +) + +// HashType represents different hash functions +type HashType uint16 + +// Validate verifies that the hash type is in a valid range. +func (h HashType) Validate() error { + if h >= MaxHashType { + return protocol.ErrInvalidObject + } + return nil +} + +// types of hashes +const ( + Sha512_256 HashType = iota + Sumhash + + MaxHashType +) + +// MaxHashDigestSize is used to bound the max digest size. it is important to change it if a hash with +// a longer output is introduced. +const MaxHashDigestSize = SumhashDigestSize + +//size of each hash +const ( + Sha512_256Size = sha512.Size256 + SumhashDigestSize = sumhash.Sumhash512DigestSize +) + +// HashFactory is responsible for generating new hashes accordingly to the type it stores. +//msgp:postunmarshalcheck HashFactory Validate +type HashFactory struct { + _struct struct{} `codec:",omitempty,omitemptyarray"` + + HashType HashType `codec:"t"` +} + +var errUnknownHash = errors.New("unknown hash type") + +func (h HashType) String() string { + switch h { + case Sha512_256: + return "sha512_256" + case Sumhash: + return "sumhash" + default: + return "" + } +} + +// UnmarshalHashType decodes a string into the HashType enum +func UnmarshalHashType(s string) (HashType, error) { + switch s { + case "sha512_256": + return Sha512_256, nil + case "sumhash": + return Sumhash, nil + default: + return 0, fmt.Errorf("HashType not supported: %s", s) + } +} + +// NewHash generates a new hash.Hash to use. +func (z HashFactory) NewHash() hash.Hash { + switch z.HashType { + + case Sha512_256: + return sha512.New512_256() + case Sumhash: + return sumhash.New512(nil) + // This shouldn't be reached, when creating a new hash, one would know the type of hash they wanted, + // in addition to that, unmarshalling of the hashFactory verifies the HashType of the factory. + default: + return invalidHash{} + } +} + +// Validate states whether the HashFactory is valid, and is safe to use. +func (z *HashFactory) Validate() error { + return z.HashType.Validate() +} + +// GenericHashObj Makes it easier to sum using hash interface and Hashable interface +func GenericHashObj(hsh hash.Hash, h Hashable) []byte { + rep := HashRep(h) + return hashBytes(hsh, rep) +} + +func hashBytes(hash hash.Hash, m []byte) []byte { + hash.Reset() + hash.Write(m) + outhash := hash.Sum(nil) + return outhash +} + +// InvalidHash is used to identify errors on the factory. +// this function will return nil slice +type invalidHash struct { +} + +// Write writes bytes into the hash function. this function will return an error +func (h invalidHash) Write(p []byte) (n int, err error) { + return 0, errUnknownHash +} + +// Sum returns an empty slice since this is an empty hash function +func (h invalidHash) Sum(b []byte) []byte { + return nil +} + +// Reset this function has no state so it is empty +func (h invalidHash) Reset() { +} + +// Size the current size of the function is always 0 +func (h invalidHash) Size() int { + return 0 +} + +// BlockSize returns zero since this is an empty hash function +func (h invalidHash) BlockSize() int { + return 0 +} diff --git a/crypto/hashes_test.go b/crypto/hashes_test.go new file mode 100644 index 0000000000..2ebff4239d --- /dev/null +++ b/crypto/hashes_test.go @@ -0,0 +1,74 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package crypto + +import ( + "testing" + + "github.com/algorand/go-algorand/test/partitiontest" + + "github.com/stretchr/testify/require" +) + +func TestHashFactoryCreatingNewHashes(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + h := HashFactory{HashType: Sha512_256}.NewHash() + + a.NotNil(h) + a.Equal(Sha512_256Size, h.Size()) + + h = HashFactory{HashType: Sumhash}.NewHash() + a.NotNil(h) + a.Equal(SumhashDigestSize, h.Size()) + +} + +func TestHashSum(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + h := HashFactory{HashType: Sha512_256}.NewHash() + + a.NotNil(h) + a.Equal(Sha512_256Size, h.Size()) + + dgst := HashObj(TestingHashable{}) + a.Equal(GenericHashObj(h, TestingHashable{}), dgst[:]) + +} + +func TestEmptyHash(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + h := HashFactory{HashType: Sha512_256} + h.HashType = MaxHashType + hash := h.NewHash() + a.Equal(0, hash.Size()) + a.Equal(0, hash.BlockSize()) + + var msg [4]byte + len, err := hash.Write(msg[:]) + a.Equal(0, len) + a.Error(err) + + a.Equal(0, hash.BlockSize()) + var emptySlice []byte + a.Equal(emptySlice, hash.Sum(nil)) +} diff --git a/crypto/libsodium-fork/src/libsodium/Makefile.am b/crypto/libsodium-fork/src/libsodium/Makefile.am index 28bec6e1e7..c0734fccca 100644 --- a/crypto/libsodium-fork/src/libsodium/Makefile.am +++ b/crypto/libsodium-fork/src/libsodium/Makefile.am @@ -71,6 +71,8 @@ libsodium_la_SOURCES = \ crypto_sign/ed25519/sign_ed25519.c \ crypto_sign/ed25519/ref10/keypair.c \ crypto_sign/ed25519/ref10/open.c \ + crypto_sign/ed25519/ref10/open_bv_compat.c \ + crypto_sign/ed25519/ref10/batch.c \ crypto_sign/ed25519/ref10/sign.c \ crypto_sign/ed25519/ref10/sign_ed25519_ref10.h \ crypto_stream/chacha20/stream_chacha20.c \ diff --git a/crypto/libsodium-fork/src/libsodium/crypto_core/ed25519/ref10/ed25519_ref10.c b/crypto/libsodium-fork/src/libsodium/crypto_core/ed25519/ref10/ed25519_ref10.c index fb0d15fd50..68e4be7b0e 100644 --- a/crypto/libsodium-fork/src/libsodium/crypto_core/ed25519/ref10/ed25519_ref10.c +++ b/crypto/libsodium-fork/src/libsodium/crypto_core/ed25519/ref10/ed25519_ref10.c @@ -50,6 +50,20 @@ load_4(const unsigned char *in) # include "fe_25_5/fe.h" #endif + +#ifdef HAVE_TI_MODE +const ge25519_p3 ge25519_basepoint = +{ +#include "fe_51/base_ge25519.h" +}; +#else +const ge25519_p3 ge25519_basepoint = +{ +#include "fe_25_5/base_ge25519.h" +}; +#endif + + void fe25519_invert(fe25519 out, const fe25519 z) { @@ -317,6 +331,54 @@ ge25519_frombytes_negate_vartime(ge25519_p3 *h, const unsigned char *s) return 0; } + +// ge25519_frombytes_vartime tries to decode a given a 32-octet string. +// to a point on the curve. it is identical to ge25519_frombytes_negate_vartime except +// that this function does not negate the returned value. +int +ge25519_frombytes_vartime(ge25519_p3 *h, const unsigned char *s) +{ + fe25519 u; + fe25519 v; + fe25519 v3; + fe25519 vxx; + fe25519 m_root_check, p_root_check; + + fe25519_frombytes(h->Y, s); + fe25519_1(h->Z); + fe25519_sq(u, h->Y); + fe25519_mul(v, u, d); + fe25519_sub(u, u, h->Z); /* u = y^2-1 */ + fe25519_add(v, v, h->Z); /* v = dy^2+1 */ + + fe25519_sq(v3, v); + fe25519_mul(v3, v3, v); /* v3 = v^3 */ + fe25519_sq(h->X, v3); + fe25519_mul(h->X, h->X, v); + fe25519_mul(h->X, h->X, u); /* x = uv^7 */ + + fe25519_pow22523(h->X, h->X); /* x = (uv^7)^((q-5)/8) */ + fe25519_mul(h->X, h->X, v3); + fe25519_mul(h->X, h->X, u); /* x = uv^3(uv^7)^((q-5)/8) */ + + fe25519_sq(vxx, h->X); + fe25519_mul(vxx, vxx, v); + fe25519_sub(m_root_check, vxx, u); /* vx^2-u */ + if (fe25519_iszero(m_root_check) == 0) { + fe25519_add(p_root_check, vxx, u); /* vx^2+u */ + if (fe25519_iszero(p_root_check) == 0) { + return -1; + } + fe25519_mul(h->X, h->X, sqrtm1); + } + + if (fe25519_isnegative(h->X) ^ (s[31] >> 7)) { + fe25519_neg(h->X, h->X); + } + fe25519_mul(h->T, h->X, h->Y); + + return 0; +} /* r = p + q @@ -397,7 +459,7 @@ ge25519_p2_0(ge25519_p2 *h) r = 2 * p */ -static void +void ge25519_p2_dbl(ge25519_p1p1 *r, const ge25519_p2 *p) { fe25519 t0; @@ -491,7 +553,7 @@ ge25519_p3_tobytes(unsigned char *s, const ge25519_p3 *h) r = 2 * p */ -static void +void ge25519_p3_dbl(ge25519_p1p1 *r, const ge25519_p3 *p) { ge25519_p2 q; @@ -643,6 +705,9 @@ ge25519_tobytes(unsigned char *s, const ge25519_p2 *h) s[31] ^= fe25519_isnegative(x) << 7; } + + + /* r = a * A + b * B where a = a[0]+256*a[1]+...+256^31 a[31]. @@ -738,6 +803,101 @@ ge25519_double_scalarmult_vartime(ge25519_p2 *r, const unsigned char *a, } } + +/* + r = a * A + b * B + where a = a[0]+256*a[1]+...+256^31 a[31]. + and b = b[0]+256*b[1]+...+256^31 b[31]. + B is the Ed25519 base point (x,4/5) with x positive. + + Only used for signatures verification. + */ + +void +ge25519_double_scalarmult_vartime_p3(ge25519_p3 *r, const unsigned char *a, + const ge25519_p3 *A, const unsigned char *b) +{ + static const ge25519_precomp Bi[8] = { +#ifdef HAVE_TI_MODE +# include "fe_51/base2.h" +#else +# include "fe_25_5/base2.h" +#endif + }; + signed char aslide[256]; + signed char bslide[256]; + ge25519_cached Ai[8]; /* A,3A,5A,7A,9A,11A,13A,15A */ + ge25519_p1p1 t; + ge25519_p3 u; + ge25519_p3 A2; + int i; + + slide_vartime(aslide, a); + slide_vartime(bslide, b); + + ge25519_p3_to_cached(&Ai[0], A); + + ge25519_p3_dbl(&t, A); + ge25519_p1p1_to_p3(&A2, &t); + + ge25519_add(&t, &A2, &Ai[0]); + ge25519_p1p1_to_p3(&u, &t); + ge25519_p3_to_cached(&Ai[1], &u); + + ge25519_add(&t, &A2, &Ai[1]); + ge25519_p1p1_to_p3(&u, &t); + ge25519_p3_to_cached(&Ai[2], &u); + + ge25519_add(&t, &A2, &Ai[2]); + ge25519_p1p1_to_p3(&u, &t); + ge25519_p3_to_cached(&Ai[3], &u); + + ge25519_add(&t, &A2, &Ai[3]); + ge25519_p1p1_to_p3(&u, &t); + ge25519_p3_to_cached(&Ai[4], &u); + + ge25519_add(&t, &A2, &Ai[4]); + ge25519_p1p1_to_p3(&u, &t); + ge25519_p3_to_cached(&Ai[5], &u); + + ge25519_add(&t, &A2, &Ai[5]); + ge25519_p1p1_to_p3(&u, &t); + ge25519_p3_to_cached(&Ai[6], &u); + + ge25519_add(&t, &A2, &Ai[6]); + ge25519_p1p1_to_p3(&u, &t); + ge25519_p3_to_cached(&Ai[7], &u); + + ge25519_p3_0(r); + + for (i = 255; i >= 0; --i) { + if (aslide[i] || bslide[i]) { + break; + } + } + + for (; i >= 0; --i) { + ge25519_p3_dbl(&t, r); + + if (aslide[i] > 0) { + ge25519_p1p1_to_p3(&u, &t); + ge25519_add(&t, &u, &Ai[aslide[i] / 2]); + } else if (aslide[i] < 0) { + ge25519_p1p1_to_p3(&u, &t); + ge25519_sub(&t, &u, &Ai[(-aslide[i]) / 2]); + } + + if (bslide[i] > 0) { + ge25519_p1p1_to_p3(&u, &t); + ge25519_madd(&t, &u, &Bi[bslide[i] / 2]); + } else if (bslide[i] < 0) { + ge25519_p1p1_to_p3(&u, &t); + ge25519_msub(&t, &u, &Bi[(-bslide[i]) / 2]); + } + + ge25519_p1p1_to_p3(r, &t); + } +} /* h = a * p where a = a[0]+256*a[1]+...+256^31 a[31] @@ -892,6 +1052,25 @@ ge25519_scalarmult_base(ge25519_p3 *h, const unsigned char *a) } } + +/* + * r = 8 * p + */ +void ge25519_mul_by_cofactor(ge25519_p3* p_out, const ge25519_p3* p_in) +{ + ge25519_p1p1 tempP; + ge25519_p2 tempP2; + + ge25519_p3_dbl(&tempP, p_in); + ge25519_p1p1_to_p2(&tempP2, &tempP); + + ge25519_p2_dbl(&tempP, &tempP2); + ge25519_p1p1_to_p2(&tempP2, &tempP); + + ge25519_p2_dbl(&tempP, &tempP2); + ge25519_p1p1_to_p3(p_out, &tempP); +} + /* multiply by the order of the main subgroup l = 2^252+27742317777372353535851937790883648493 */ static void ge25519_mul_l(ge25519_p3 *r, const ge25519_p3 *A) @@ -982,6 +1161,31 @@ ge25519_is_on_main_subgroup(const ge25519_p3 *p) return fe25519_iszero(pl.X); } +int +ge25519_is_canonical_vartime(const unsigned char *s) +{ + if (s[0] < 0xED) { + static const uint64_t non_canoncial_special_points[][4] = { + /* (-0,1) */ {0x1, 0, 0, 0x8000000000000000}, + /* (-0,-1) */ {0xffffffffffffffec, 0xffffffffffffffff, 0xffffffffffffffff, 0xffffffffffffffff}, + }; + + uint64_t c[2] = { 0 }; + c[0] |= ((uint64_t*)s)[0] ^ non_canoncial_special_points[0][0]; + c[0] |= ((uint64_t*)s)[1] ^ non_canoncial_special_points[0][1]; + c[0] |= ((uint64_t*)s)[2] ^ non_canoncial_special_points[0][2]; + c[0] |= ((uint64_t*)s)[3] ^ non_canoncial_special_points[0][3]; + + c[1] |= ((uint64_t*)s)[0] ^ non_canoncial_special_points[1][0]; + c[1] |= ((uint64_t*)s)[1] ^ non_canoncial_special_points[1][1]; + c[1] |= ((uint64_t*)s)[2] ^ non_canoncial_special_points[1][2]; + c[1] |= ((uint64_t*)s)[3] ^ non_canoncial_special_points[1][3]; + return !((c[0]==0) || (c[1]==0)); + } + + return ge25519_is_canonical(s); +} + int ge25519_is_canonical(const unsigned char *s) { @@ -999,6 +1203,18 @@ ge25519_is_canonical(const unsigned char *s) return 1 - (c & d & 1); } + +int ge25519_is_neutral_vartime(const ge25519_p3 *p) { + static const unsigned char zero[32] = {0}; + unsigned char point_buffer[3][32]; + fe25519_tobytes(point_buffer[0], p->X); + fe25519_tobytes(point_buffer[1], p->Y); + fe25519_tobytes(point_buffer[2], p->Z); + return (memcmp(point_buffer[0], zero, 32) == 0) && (memcmp(point_buffer[1], point_buffer[2], 32) == 0); +} + + + int ge25519_has_small_order(const unsigned char s[32]) { @@ -2583,3 +2799,17 @@ ge25519_from_uniform(unsigned char s[32], const unsigned char r[32]) ge25519_p3_tobytes(s, &p3); } + +int +sc25519_is_canonical_vartime(const unsigned char s[32]) +{ + if ((s[31] & 240) == 0) + { + return 1; + } + if ((s[31] & 224) != 0) + { + return 0; + } + return sc25519_is_canonical(s); +} diff --git a/crypto/libsodium-fork/src/libsodium/crypto_core/ed25519/ref10/fe_25_5/base_ge25519.h b/crypto/libsodium-fork/src/libsodium/crypto_core/ed25519/ref10/fe_25_5/base_ge25519.h new file mode 100644 index 0000000000..f02fe25c4d --- /dev/null +++ b/crypto/libsodium-fork/src/libsodium/crypto_core/ed25519/ref10/fe_25_5/base_ge25519.h @@ -0,0 +1,4 @@ + {0x0325d51a,0x018b5823,0x00f6592a,0x0104a92d,0x01a4b31d,0x01d6dc5c,0x027118fe,0x007fd814,0x013cd6e5,0x0085a4db}, + {0x02666658,0x01999999,0x00cccccc,0x01333333,0x01999999,0x00666666,0x03333333,0x00cccccc,0x02666666,0x01999999}, + {0x00000001,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000}, + {0x01b7dda3,0x01a2ace9,0x025eadbb,0x0003ba8a,0x0083c27e,0x00abe37d,0x01274732,0x00ccacdd,0x00fd78b7,0x019e1d7c} \ No newline at end of file diff --git a/crypto/libsodium-fork/src/libsodium/crypto_core/ed25519/ref10/fe_51/base_ge25519.h b/crypto/libsodium-fork/src/libsodium/crypto_core/ed25519/ref10/fe_51/base_ge25519.h new file mode 100644 index 0000000000..5c5a16cb72 --- /dev/null +++ b/crypto/libsodium-fork/src/libsodium/crypto_core/ed25519/ref10/fe_51/base_ge25519.h @@ -0,0 +1,5 @@ + + {0x00062d608f25d51a,0x000412a4b4f6592a,0x00075b7171a4b31d,0x0001ff60527118fe,0x000216936d3cd6e5}, + {0x0006666666666658,0x0004cccccccccccc,0x0001999999999999,0x0003333333333333,0x0006666666666666}, + {0x0000000000000001,0x0000000000000000,0x0000000000000000,0x0000000000000000,0x0000000000000000}, + {0x00068ab3a5b7dda3,0x00000eea2a5eadbb,0x0002af8df483c27e,0x000332b375274732,0x00067875f0fd78b7} diff --git a/crypto/libsodium-fork/src/libsodium/crypto_sign/crypto_sign.c b/crypto/libsodium-fork/src/libsodium/crypto_sign/crypto_sign.c index d723ff8c29..318c7e7bfe 100644 --- a/crypto/libsodium-fork/src/libsodium/crypto_sign/crypto_sign.c +++ b/crypto/libsodium-fork/src/libsodium/crypto_sign/crypto_sign.c @@ -87,6 +87,13 @@ crypto_sign_verify_detached(const unsigned char *sig, const unsigned char *m, return crypto_sign_ed25519_verify_detached(sig, m, mlen, pk); } +int +crypto_sign_bv_compatible_verify_detached(const unsigned char *sig, const unsigned char *m, + unsigned long long mlen, const unsigned char *pk) +{ + return crypto_sign_ed25519_bv_compatible_verify_detached(sig, m, mlen, pk); +} + int crypto_sign_init(crypto_sign_state *state) { @@ -113,3 +120,10 @@ crypto_sign_final_verify(crypto_sign_state *state, const unsigned char *sig, { return crypto_sign_ed25519ph_final_verify(state, sig, pk); } + +int +crypto_sign_final_bv_compatible_verify(crypto_sign_state *state, const unsigned char *sig, + const unsigned char *pk) +{ + return crypto_sign_ed25519ph_final_bv_compatible_verify(state, sig, pk); +} diff --git a/crypto/libsodium-fork/src/libsodium/crypto_sign/ed25519/ref10/batch.c b/crypto/libsodium-fork/src/libsodium/crypto_sign/ed25519/ref10/batch.c new file mode 100644 index 0000000000..83f93a857d --- /dev/null +++ b/crypto/libsodium-fork/src/libsodium/crypto_sign/ed25519/ref10/batch.c @@ -0,0 +1,316 @@ +#include "crypto_hash_sha512.h" +#include "sign_ed25519_ref10.h" +#include "private/ed25519_ref10.h" +#include "crypto_sign.h" + + +#include +#include +#include + + +void ed25519_randombytes_unsafe(void *p, size_t len); + +#define MAX_BATCH_SIZE 64 +#define HEAP_BATCH_SIZE ((MAX_BATCH_SIZE * 2) + 1) + +/* which limb is the 128th bit in? */ +static const size_t limb128bits = (128 + SC25519_BITS_PER_LIMB - 1) / SC25519_BITS_PER_LIMB; + +typedef size_t heap_index_t; + + +typedef struct batch_heap_t { + unsigned char r[HEAP_BATCH_SIZE][16]; /* 128 bit random values */ + ge25519_p3 points[HEAP_BATCH_SIZE]; + sc25519 scalars[HEAP_BATCH_SIZE]; + heap_index_t heap[HEAP_BATCH_SIZE]; + size_t size; +} batch_heap; + + + + +/* swap two values in the heap */ +static void +heap_swap(heap_index_t *heap, size_t a, size_t b) { + heap_index_t temp; + temp = heap[a]; + heap[a] = heap[b]; + heap[b] = temp; +} + +/* add the scalar at the end of the list to the heap */ +static void +heap_insert_next(batch_heap *heap) { + size_t node = heap->size, parent; + heap_index_t *pheap = heap->heap; + sc25519 *scalars = heap->scalars; + + /* insert at the bottom */ + pheap[node] = (heap_index_t)node; + + /* shift node up to its sorted spot */ + parent = (node - 1) / 2; + while (node && lt256_modm_batch(scalars[pheap[parent]], scalars[pheap[node]], SC25519_LIMB_SIZE - 1)) { + heap_swap(pheap, parent, node); + node = parent; + parent = (node - 1) / 2; + } + heap->size++; +} + +/* update the heap when the root element is updated */ +static void +heap_updated_root(batch_heap *heap, size_t limbsize) { + size_t node, parent, childr, childl; + heap_index_t *pheap = heap->heap; + sc25519 *scalars = heap->scalars; + + /* shift root to the bottom */ + parent = 0; + node = 1; + childl = 1; + childr = 2; + while ((childr < heap->size)) { + node = lt256_modm_batch(scalars[pheap[childl]], scalars[pheap[childr]], limbsize) ? childr : childl; + heap_swap(pheap, parent, node); + parent = node; + childl = (parent * 2) + 1; + childr = childl + 1; + } + + /* shift root back up to its sorted spot */ + parent = (node - 1) / 2; + while (node && lte256_modm_batch(scalars[pheap[parent]], scalars[pheap[node]], limbsize)) { + heap_swap(pheap, parent, node); + node = parent; + parent = (node - 1) / 2; + } +} + +/* build the heap with count elements, count must be >= 3 */ +static void +heap_build(batch_heap *heap, size_t count) { + heap->heap[0] = 0; + heap->size = 0; + while (heap->size < count) + heap_insert_next(heap); +} + +/* extend the heap to contain new_count elements */ +static void +heap_extend(batch_heap *heap, size_t new_count) { + while (heap->size < new_count) + heap_insert_next(heap); +} + +/* get the top 2 elements of the heap */ +static void +heap_get_top2(batch_heap *heap, heap_index_t *max1, heap_index_t *max2, size_t limbsize) { + heap_index_t h0 = heap->heap[0], h1 = heap->heap[1], h2 = heap->heap[2]; + if (lt256_modm_batch(heap->scalars[h1], heap->scalars[h2], limbsize)) + h1 = h2; + *max1 = h0; + *max2 = h1; +} + + +/* */ +void ge25519_multi_scalarmult_vartime_final(ge25519_p3 *r, ge25519_p3 *point, sc25519 scalar) { + const sc25519_element_t topbit = ((sc25519_element_t)1 << (SC25519_LIMB_SIZE - 1)); + size_t limb = limb128bits; + sc25519_element_t flag; + ge25519_p1p1 p1p1_r; + ge25519_cached cache_r; + + if (isone256_modm_batch(scalar)) { + /* this will happen most of the time after bos-carter */ + *r = *point; + return; + } else if (iszero256_modm_batch(scalar)) { + /* this will only happen if all scalars == 0 */ + memset(r, 0, sizeof(*r)); + r->Y[0] = 1; + r->Z[0] = 1; + return; + } + + *r = *point; + + /* find the limb where first bit is set */ + while (!scalar[limb]) + limb--; + + /* find the first bit */ + flag = topbit; + while ((scalar[limb] & flag) == 0) + flag >>= 1; + + + ge25519_p3_to_cached(&cache_r, point); + /* exponentiate */ + for (;;) { + ge25519_p3_dbl(&p1p1_r, r); + ge25519_p1p1_to_p3(r, &p1p1_r); + if (scalar[limb] & flag) + { + ge25519_add(&p1p1_r, r, &cache_r); + ge25519_p1p1_to_p3(r,&p1p1_r); + } + + + flag >>= 1; + if (!flag) { + if (!limb--) + break; + flag = topbit; + } + } +} + + +/* count must be >= 5 */ +static void +ge25519_multi_scalarmult_vartime(ge25519_p3 *r, batch_heap *heap, size_t count) { + heap_index_t max1, max2; + ge25519_cached cached_p; + ge25519_p1p1 p_as_p1p1; + + /* start with the full limb size */ + size_t limbsize = SC25519_LIMB_SIZE - 1; + + /* whether the heap has been extended to include the 128 bit scalars */ + int extended = 0; + + /* grab an odd number of scalars to build the heap, unknown limb sizes */ + heap_build(heap, ((count + 1) / 2) | 1); + + for (;;) { + heap_get_top2(heap, &max1, &max2, limbsize); + + /* only one scalar remaining, we're done */ + if (iszero256_modm_batch(heap->scalars[max2])) + break; + + /* exhausted another limb? */ + if (!heap->scalars[max1][limbsize]) + limbsize -= 1; + + /* can we extend to the 128 bit scalars? */ + if (!extended && isatmost128bits256_modm_batch(heap->scalars[max1])) { + heap_extend(heap, count); + heap_get_top2(heap, &max1, &max2, limbsize); + extended = 1; + } + + sub256_modm_batch(heap->scalars[max1], heap->scalars[max1], heap->scalars[max2], limbsize); + ge25519_p3_to_cached(&cached_p,&heap->points[max1]); + + ge25519_add(&p_as_p1p1, &heap->points[max2], &cached_p); + ge25519_p1p1_to_p3(&heap->points[max2], &p_as_p1p1); + heap_updated_root(heap, limbsize); + } + + ge25519_multi_scalarmult_vartime_final(r, &heap->points[max1], heap->scalars[max1]); +} + +/* +* verifies ed25519 signatures in batch. The algorithm is based on https://github.com/floodyberry/ed25519-donna +* implemention. we changed the algorithm according to https://eprint.iacr.org/2020/1244.pdf . +* the batch size is between 2 and 64 signatures per batch. +* When the batch fails the function falls back to check signature one at a time. +* the function returns 0 on success and fills and array of "valid" ints. +* 1 - for signature i passed verification +* 0 - for signature i failed verification +*/ +int crypto_sign_ed25519_open_batch(const unsigned char **m, const unsigned long long *mlen, const unsigned char **pk, const unsigned char **RS, size_t num, int *valid_p) +{ + batch_heap batch; + ge25519_p3 p; + ge25519_p3 p_mul; + sc25519 *r_scalars; + size_t i, batchsize; + unsigned char hram[64]; + unsigned char batchsum[32]; + int ret = 0; + + for (i = 0; i < num; i++) + valid_p[i] = 1; + + while (num >= 2) { + batchsize = (num > MAX_BATCH_SIZE) ? MAX_BATCH_SIZE : num; + + /* validate the public key and signature */ + for (i=0; i < batchsize; i++) { + if (validate_ed25519_pk_and_sig(RS[i], pk[i]) != 0) + goto fallback; + } + + /* generate r (scalars[batchsize+1]..scalars[2*batchsize] */ + ed25519_randombytes_unsafe (batch.r, batchsize * 16); + r_scalars = &batch.scalars[batchsize + 1]; + + /* compute r0s0, r1s1, r2s2, ...) */ + for (i = 0; i < batchsize; i++){ + expand256_modm16(r_scalars[i], batch.r[i]); + /* compute scalars[0] = ((r1s1 + r2s2 + ...)) */ + expand256_modm32(batch.scalars[i], RS[i] + 32); + mul256_modm(batch.scalars[i], batch.scalars[i], r_scalars[i]); + } + /* compute scalars[0] = ((r0s0 + r1s1 + r2s2 + ...)) */ + for (i = 1; i < batchsize; i++) + add256_modm(batch.scalars[0], batch.scalars[0], batch.scalars[i]); + + /* compute scalars[1]..scalars[batchsize] as r[i]*H(R[i],A[i],m[i]) */ + for (i = 0; i < batchsize; i++) { + crypto_hash_sha512_state hs; + crypto_hash_sha512_init(&hs); + crypto_hash_sha512_update(&hs, RS[i], 32); + crypto_hash_sha512_update(&hs, pk[i], 32); + crypto_hash_sha512_update(&hs, m[i], mlen[i]); + crypto_hash_sha512_final(&hs, hram); + + + expand256_modm64(batch.scalars[i+1], hram); + mul256_modm(batch.scalars[i+1], batch.scalars[i+1], r_scalars[i]); + } + /* compute points */ + batch.points[0] = ge25519_basepoint; + for (i = 0; i < batchsize; i++) + if (ge25519_frombytes_negate_vartime(&batch.points[i+1], pk[i]) != 0) + goto fallback; + for (i = 0; i < batchsize; i++) + if (ge25519_frombytes_negate_vartime(&batch.points[batchsize+i+1], RS[i]) != 0) + goto fallback; + + ge25519_multi_scalarmult_vartime(&p, &batch, (batchsize * 2) + 1); + + ge25519_mul_by_cofactor(&p_mul, &p); + if (ge25519_is_neutral_vartime(&p_mul) == 0 ) { + ret |= 2; + + fallback: + for (i = 0; i < batchsize; i++) { + valid_p[i] = crypto_sign_bv_compatible_verify_detached(RS[i], m[i], mlen[i], pk[i]) ? 0 : 1; + ret |= (valid_p[i] ^ 1); + } + } + m += batchsize; + mlen += batchsize; + pk += batchsize; + RS += batchsize; + num -= batchsize; + valid_p += batchsize; + + } + + + for (i = 0; i < num; i++) { + valid_p[i] = crypto_sign_bv_compatible_verify_detached(RS[i], m[i], mlen[i], pk[i]) ? 0 : 1; + ret |= (valid_p[i] ^ 1); + } + + return ret; + +} diff --git a/crypto/libsodium-fork/src/libsodium/crypto_sign/ed25519/ref10/open_bv_compat.c b/crypto/libsodium-fork/src/libsodium/crypto_sign/ed25519/ref10/open_bv_compat.c new file mode 100644 index 0000000000..23088c94fb --- /dev/null +++ b/crypto/libsodium-fork/src/libsodium/crypto_sign/ed25519/ref10/open_bv_compat.c @@ -0,0 +1,131 @@ + +#include +#include +#include + +#include "crypto_hash_sha512.h" +#include "crypto_sign_ed25519.h" +#include "crypto_verify_32.h" +#include "sign_ed25519_ref10.h" +#include "private/ed25519_ref10.h" +#include "utils.h" + + +int +validate_ed25519_pk_and_sig(const unsigned char *sig, const unsigned char *pk) +{ +#ifdef ED25519_COMPAT + if (sig[63] & 224) { + return -1; + } +#else + if (sc25519_is_canonical_vartime(sig + 32) == 0) { + return -1; + } + if (ge25519_is_canonical_vartime(sig) == 0 ) { + return -1; + } + + if (ge25519_is_canonical_vartime(pk) == 0 || + ge25519_has_small_order(pk) != 0) { + return -1; + } +#endif + return 0; +} + +int +_crypto_sign_ed25519_bv_compatible_verify_detached(const unsigned char *sig, + const unsigned char *m, + unsigned long long mlen, + const unsigned char *pk, + int prehashed) +{ + crypto_hash_sha512_state hs; + unsigned char h[64]; + + ge25519_p3 A; + + ge25519_p1p1 tempR; + ge25519_p3 Rsig; + ge25519_p3 Rsub; + ge25519_p3 Rcalc; + ge25519_p3 Rcheck; + ge25519_cached cached; + + int pk_sig_valid = validate_ed25519_pk_and_sig(sig,pk); + if (pk_sig_valid != 0){ + return pk_sig_valid; + } + if (ge25519_frombytes_negate_vartime(&A, pk) != 0) { + return -1; + } + if (ge25519_frombytes_vartime(&Rsig, sig) != 0) { + return -1; + } + _crypto_sign_ed25519_ref10_hinit(&hs, prehashed); + crypto_hash_sha512_update(&hs, sig, 32); + crypto_hash_sha512_update(&hs, pk, 32); + crypto_hash_sha512_update(&hs, m, mlen); + crypto_hash_sha512_final(&hs, h); + sc25519_reduce(h); + + // R calculated <- -h*A + s*B + ge25519_double_scalarmult_vartime_p3(&Rcalc, h, &A, sig + 32); + + // R calculated - R signature + ge25519_p3_to_cached(&cached, &Rsig); + ge25519_sub(&tempR, &Rcalc, &cached); + ge25519_p1p1_to_p3(&Rsub, &tempR); + + + ge25519_mul_by_cofactor(&Rcheck, &Rsub); + + if (ge25519_is_neutral_vartime(&Rcheck) == 0) + { + return -1; + } + + return 0; +} + +int +crypto_sign_ed25519_bv_compatible_verify_detached(const unsigned char *sig, + const unsigned char *m, + unsigned long long mlen, + const unsigned char *pk) +{ + return _crypto_sign_ed25519_bv_compatible_verify_detached(sig, m, mlen, pk, 0); +} + +int +crypto_sign_ed25519_bv_compatible_open(unsigned char *m, unsigned long long *mlen_p, + const unsigned char *sm, unsigned long long smlen, + const unsigned char *pk) +{ + unsigned long long mlen; + + if (smlen < 64 || smlen - 64 > crypto_sign_ed25519_MESSAGEBYTES_MAX) { + goto badsig; + } + mlen = smlen - 64; + if (crypto_sign_ed25519_bv_compatible_verify_detached(sm, sm + 64, mlen, pk) != 0) { + if (m != NULL) { + memset(m, 0, mlen); + } + goto badsig; + } + if (mlen_p != NULL) { + *mlen_p = mlen; + } + if (m != NULL) { + memmove(m, sm + 64, mlen); + } + return 0; + +badsig: + if (mlen_p != NULL) { + *mlen_p = 0; + } + return -1; +} diff --git a/crypto/libsodium-fork/src/libsodium/crypto_sign/ed25519/ref10/sign_ed25519_ref10.h b/crypto/libsodium-fork/src/libsodium/crypto_sign/ed25519/ref10/sign_ed25519_ref10.h index 29f45a8544..dc8fd2a488 100644 --- a/crypto/libsodium-fork/src/libsodium/crypto_sign/ed25519/ref10/sign_ed25519_ref10.h +++ b/crypto/libsodium-fork/src/libsodium/crypto_sign/ed25519/ref10/sign_ed25519_ref10.h @@ -4,6 +4,8 @@ void _crypto_sign_ed25519_ref10_hinit(crypto_hash_sha512_state *hs, int prehashed); +int validate_ed25519_pk_and_sig(const unsigned char *sig, const unsigned char *pk); + int _crypto_sign_ed25519_detached(unsigned char *sig, unsigned long long *siglen_p, const unsigned char *m, @@ -15,4 +17,17 @@ int _crypto_sign_ed25519_verify_detached(const unsigned char *sig, unsigned long long mlen, const unsigned char *pk, int prehashed); + +int _crypto_sign_ed25519_bv_compatible_verify_detached(const unsigned char *sig, + const unsigned char *m, + unsigned long long mlen, + const unsigned char *pk, + int prehashed); + +int _crypto_sign_ed25519_open_batch(const unsigned char **m, + const unsigned long long *mlen, + const unsigned char **pk, + const unsigned char **RS, + size_t num, + int *valid_p); #endif diff --git a/crypto/libsodium-fork/src/libsodium/crypto_sign/ed25519/sign_ed25519.c b/crypto/libsodium-fork/src/libsodium/crypto_sign/ed25519/sign_ed25519.c index 9b9024972a..0c9c2617b2 100644 --- a/crypto/libsodium-fork/src/libsodium/crypto_sign/ed25519/sign_ed25519.c +++ b/crypto/libsodium-fork/src/libsodium/crypto_sign/ed25519/sign_ed25519.c @@ -95,3 +95,16 @@ crypto_sign_ed25519ph_final_verify(crypto_sign_ed25519ph_state *state, return _crypto_sign_ed25519_verify_detached(sig, ph, sizeof ph, pk, 1); } + + +int +crypto_sign_ed25519ph_final_bv_compatible_verify(crypto_sign_ed25519ph_state *state, + const unsigned char *sig, + const unsigned char *pk) +{ + unsigned char ph[crypto_hash_sha512_BYTES]; + + crypto_hash_sha512_final(&state->hs, ph); + + return _crypto_sign_ed25519_bv_compatible_verify_detached(sig, ph, sizeof ph, pk, 1); +} diff --git a/crypto/libsodium-fork/src/libsodium/include/sodium/crypto_sign.h b/crypto/libsodium-fork/src/libsodium/include/sodium/crypto_sign.h index 3d31ab24ce..7d05c0f1d4 100644 --- a/crypto/libsodium-fork/src/libsodium/include/sodium/crypto_sign.h +++ b/crypto/libsodium-fork/src/libsodium/include/sodium/crypto_sign.h @@ -63,12 +63,22 @@ int crypto_sign(unsigned char *sm, unsigned long long *smlen_p, const unsigned char *m, unsigned long long mlen, const unsigned char *sk) __attribute__ ((nonnull(1, 3, 5))); +SODIUM_EXPORT +int validate_ed25519_pk_and_sig(const unsigned char *sig, const unsigned char *pk) + __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1, 2))); + SODIUM_EXPORT int crypto_sign_open(unsigned char *m, unsigned long long *mlen_p, const unsigned char *sm, unsigned long long smlen, const unsigned char *pk) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(3, 5))); +SODIUM_EXPORT +int crypto_sign_ed25519_open_batch(const unsigned char **m, const unsigned long long *mlen, + const unsigned char **pk, const unsigned char **RS, + size_t num, int *valid_p) + __attribute__ ((warn_unused_result)) __attribute__ ((nonnull(1,2,3,4,6))); + SODIUM_EXPORT int crypto_sign_detached(unsigned char *sig, unsigned long long *siglen_p, const unsigned char *m, unsigned long long mlen, @@ -81,6 +91,13 @@ int crypto_sign_verify_detached(const unsigned char *sig, const unsigned char *pk) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); +SODIUM_EXPORT +int crypto_sign_bv_compatible_verify_detached(const unsigned char *sig, + const unsigned char *m, + unsigned long long mlen, + const unsigned char *pk) + __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); + SODIUM_EXPORT int crypto_sign_init(crypto_sign_state *state); @@ -100,6 +117,11 @@ int crypto_sign_final_verify(crypto_sign_state *state, const unsigned char *sig, const unsigned char *pk) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); +SODIUM_EXPORT +int crypto_sign_final_bv_compatible_verify(crypto_sign_state *state, const unsigned char *sig, + const unsigned char *pk) + __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); + #ifdef __cplusplus } #endif diff --git a/crypto/libsodium-fork/src/libsodium/include/sodium/crypto_sign_ed25519.h b/crypto/libsodium-fork/src/libsodium/include/sodium/crypto_sign_ed25519.h index db978ea27c..05afcffc59 100644 --- a/crypto/libsodium-fork/src/libsodium/include/sodium/crypto_sign_ed25519.h +++ b/crypto/libsodium-fork/src/libsodium/include/sodium/crypto_sign_ed25519.h @@ -66,6 +66,13 @@ int crypto_sign_ed25519_verify_detached(const unsigned char *sig, const unsigned char *pk) __attribute__ ((warn_unused_result)); +SODIUM_EXPORT +int crypto_sign_ed25519_bv_compatible_verify_detached(const unsigned char *sig, + const unsigned char *m, + unsigned long long mlen, + const unsigned char *pk) + __attribute__ ((warn_unused_result)); + SODIUM_EXPORT int crypto_sign_ed25519_keypair(unsigned char *pk, unsigned char *sk) __attribute__ ((nonnull)); @@ -117,6 +124,12 @@ int crypto_sign_ed25519ph_final_verify(crypto_sign_ed25519ph_state *state, const unsigned char *pk) __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); +SODIUM_EXPORT +int crypto_sign_ed25519ph_final_bv_compatible_verify(crypto_sign_ed25519ph_state *state, + const unsigned char *sig, + const unsigned char *pk) + __attribute__ ((warn_unused_result)) __attribute__ ((nonnull)); + #ifdef __cplusplus } #endif diff --git a/crypto/libsodium-fork/src/libsodium/include/sodium/private/ed25519_ref10.h b/crypto/libsodium-fork/src/libsodium/include/sodium/private/ed25519_ref10.h index 5af4159152..513e65b5f9 100644 --- a/crypto/libsodium-fork/src/libsodium/include/sodium/private/ed25519_ref10.h +++ b/crypto/libsodium-fork/src/libsodium/include/sodium/private/ed25519_ref10.h @@ -21,8 +21,10 @@ void fe25519_tobytes(unsigned char *s, const fe25519 h); #ifdef HAVE_TI_MODE # include "ed25519_ref10_fe_51.h" +# include "ed25519_ref10_sc_51.h" #else # include "ed25519_ref10_fe_25_5.h" +# include "ed25519_ref10_sc_25_5.h" #endif @@ -73,6 +75,8 @@ typedef struct { fe25519 T2d; } ge25519_cached; +extern const ge25519_p3 ge25519_basepoint; + void ge25519_tobytes(unsigned char *s, const ge25519_p2 *h); void ge25519_p3_tobytes(unsigned char *s, const ge25519_p3 *h); @@ -81,6 +85,8 @@ int ge25519_frombytes(ge25519_p3 *h, const unsigned char *s); int ge25519_frombytes_negate_vartime(ge25519_p3 *h, const unsigned char *s); +int ge25519_frombytes_vartime(ge25519_p3 *h, const unsigned char *s); + void ge25519_p3_to_cached(ge25519_cached *r, const ge25519_p3 *p); void ge25519_p1p1_to_p2(ge25519_p2 *r, const ge25519_p1p1 *p); @@ -93,15 +99,29 @@ void ge25519_sub(ge25519_p1p1 *r, const ge25519_p3 *p, const ge25519_cached *q); void ge25519_scalarmult_base(ge25519_p3 *h, const unsigned char *a); +void ge25519_p2_dbl(ge25519_p1p1 *r, const ge25519_p2 *p); + +void ge25519_p3_dbl(ge25519_p1p1 *r, const ge25519_p3 *p); + void ge25519_double_scalarmult_vartime(ge25519_p2 *r, const unsigned char *a, const ge25519_p3 *A, const unsigned char *b); +void ge25519_double_scalarmult_vartime_p3(ge25519_p3 *r, const unsigned char *a, + const ge25519_p3 *A, + const unsigned char *b); + void ge25519_scalarmult(ge25519_p3 *h, const unsigned char *a, const ge25519_p3 *p); int ge25519_is_canonical(const unsigned char *s); +int ge25519_is_canonical_vartime(const unsigned char *s); + +int ge25519_is_neutral_vartime(const ge25519_p3 *p); + +void ge25519_mul_by_cofactor(ge25519_p3* p_out, const ge25519_p3* p_in); + int ge25519_is_on_curve(const ge25519_p3 *p); int ge25519_is_on_main_subgroup(const ge25519_p3 *p); @@ -124,4 +144,6 @@ void sc25519_muladd(unsigned char s[32], const unsigned char a[32], int sc25519_is_canonical(const unsigned char s[32]); +int sc25519_is_canonical_vartime(const unsigned char s[32]); + #endif diff --git a/crypto/libsodium-fork/src/libsodium/include/sodium/private/ed25519_ref10_sc_25_5.h b/crypto/libsodium-fork/src/libsodium/include/sodium/private/ed25519_ref10_sc_25_5.h new file mode 100644 index 0000000000..d8d90b803a --- /dev/null +++ b/crypto/libsodium-fork/src/libsodium/include/sodium/private/ed25519_ref10_sc_25_5.h @@ -0,0 +1,429 @@ + +#ifndef ed25519_ref10_sc_25_5_H +#define ed25519_ref10_sc_25_5_H + +#include +#include + +/* + The set of scalars is \Z/l + where l = 2^252 + 27742317777372353535851937790883648493. + */ + +typedef uint32_t sc25519_element_t; +typedef sc25519_element_t sc25519[9]; + +#define SC25519_BITS_PER_LIMB 30 +#define SC25519_LIMB_SIZE 9 + +#define mul32x32_64(a,b) (((uint64_t)(a))*(b)) + + +static inline uint32_t U8TO32_LE(const unsigned char *p) { + return + (((uint32_t)(p[0]) ) | + ((uint32_t)(p[1]) << 8) | + ((uint32_t)(p[2]) << 16) | + ((uint32_t)(p[3]) << 24)); +} + +static inline void U32TO8_LE(unsigned char *p, const uint32_t v) { + p[0] = (unsigned char)(v ); + p[1] = (unsigned char)(v >> 8); + p[2] = (unsigned char)(v >> 16); + p[3] = (unsigned char)(v >> 24); +} + +static const sc25519 modm_m = { + 0x1cf5d3ed, 0x20498c69, 0x2f79cd65, 0x37be77a8, + 0x00000014, 0x00000000, 0x00000000, 0x00000000, + 0x00001000 +}; + + +static const sc25519 modm_mu = { + 0x0a2c131b, 0x3673968c, 0x06329a7e, 0x01885742, + 0x3fffeb21, 0x3fffffff, 0x3fffffff, 0x3fffffff, + 0x000fffff +}; + +static sc25519_element_t lt_modm(sc25519_element_t a, sc25519_element_t b) { + return (a - b) >> 31; +} + +static void reduce256_modm(sc25519 r) +{ + sc25519 t; + sc25519_element_t b = 0, pb, mask; + + + /* t = r - m */ + pb = 0; + pb += modm_m[0]; b = lt_modm(r[0], pb); t[0] = (r[0] - pb + (b << 30)); pb = b; + pb += modm_m[1]; b = lt_modm(r[1], pb); t[1] = (r[1] - pb + (b << 30)); pb = b; + pb += modm_m[2]; b = lt_modm(r[2], pb); t[2] = (r[2] - pb + (b << 30)); pb = b; + pb += modm_m[3]; b = lt_modm(r[3], pb); t[3] = (r[3] - pb + (b << 30)); pb = b; + pb += modm_m[4]; b = lt_modm(r[4], pb); t[4] = (r[4] - pb + (b << 30)); pb = b; + pb += modm_m[5]; b = lt_modm(r[5], pb); t[5] = (r[5] - pb + (b << 30)); pb = b; + pb += modm_m[6]; b = lt_modm(r[6], pb); t[6] = (r[6] - pb + (b << 30)); pb = b; + pb += modm_m[7]; b = lt_modm(r[7], pb); t[7] = (r[7] - pb + (b << 30)); pb = b; + pb += modm_m[8]; b = lt_modm(r[8], pb); t[8] = (r[8] - pb + (b << 16)); + + /* keep r if r was smaller than m */ + mask = b - 1; + r[0] ^= mask & (r[0] ^ t[0]); + r[1] ^= mask & (r[1] ^ t[1]); + r[2] ^= mask & (r[2] ^ t[2]); + r[3] ^= mask & (r[3] ^ t[3]); + r[4] ^= mask & (r[4] ^ t[4]); + r[5] ^= mask & (r[5] ^ t[5]); + r[6] ^= mask & (r[6] ^ t[6]); + r[7] ^= mask & (r[7] ^ t[7]); + r[8] ^= mask & (r[8] ^ t[8]); +} + +static void barrett_reduce256_modm(sc25519 r, const sc25519 q1, const sc25519 r1) +{ + sc25519 q3, r2; + uint64_t c; + sc25519_element_t f, b, pb; + + /* q1 = x >> 248 = 264 bits = 9 30 bit elements + q2 = mu * q1 + q3 = (q2 / 256(32+1)) = q2 / (2^8)^(32+1) = q2 >> 264 */ + c = mul32x32_64(modm_mu[0], q1[7]) + mul32x32_64(modm_mu[1], q1[6]) + mul32x32_64(modm_mu[2], q1[5]) + mul32x32_64(modm_mu[3], q1[4]) + mul32x32_64(modm_mu[4], q1[3]) + mul32x32_64(modm_mu[5], q1[2]) + mul32x32_64(modm_mu[6], q1[1]) + mul32x32_64(modm_mu[7], q1[0]); + c >>= 30; + c += mul32x32_64(modm_mu[0], q1[8]) + mul32x32_64(modm_mu[1], q1[7]) + mul32x32_64(modm_mu[2], q1[6]) + mul32x32_64(modm_mu[3], q1[5]) + mul32x32_64(modm_mu[4], q1[4]) + mul32x32_64(modm_mu[5], q1[3]) + mul32x32_64(modm_mu[6], q1[2]) + mul32x32_64(modm_mu[7], q1[1]) + mul32x32_64(modm_mu[8], q1[0]); + f = (sc25519_element_t)c; q3[0] = (f >> 24) & 0x3f; c >>= 30; + c += mul32x32_64(modm_mu[1], q1[8]) + mul32x32_64(modm_mu[2], q1[7]) + mul32x32_64(modm_mu[3], q1[6]) + mul32x32_64(modm_mu[4], q1[5]) + mul32x32_64(modm_mu[5], q1[4]) + mul32x32_64(modm_mu[6], q1[3]) + mul32x32_64(modm_mu[7], q1[2]) + mul32x32_64(modm_mu[8], q1[1]); + f = (sc25519_element_t)c; q3[0] |= (f << 6) & 0x3fffffff; q3[1] = (f >> 24) & 0x3f; c >>= 30; + c += mul32x32_64(modm_mu[2], q1[8]) + mul32x32_64(modm_mu[3], q1[7]) + mul32x32_64(modm_mu[4], q1[6]) + mul32x32_64(modm_mu[5], q1[5]) + mul32x32_64(modm_mu[6], q1[4]) + mul32x32_64(modm_mu[7], q1[3]) + mul32x32_64(modm_mu[8], q1[2]); + f = (sc25519_element_t)c; q3[1] |= (f << 6) & 0x3fffffff; q3[2] = (f >> 24) & 0x3f; c >>= 30; + c += mul32x32_64(modm_mu[3], q1[8]) + mul32x32_64(modm_mu[4], q1[7]) + mul32x32_64(modm_mu[5], q1[6]) + mul32x32_64(modm_mu[6], q1[5]) + mul32x32_64(modm_mu[7], q1[4]) + mul32x32_64(modm_mu[8], q1[3]); + f = (sc25519_element_t)c; q3[2] |= (f << 6) & 0x3fffffff; q3[3] = (f >> 24) & 0x3f; c >>= 30; + c += mul32x32_64(modm_mu[4], q1[8]) + mul32x32_64(modm_mu[5], q1[7]) + mul32x32_64(modm_mu[6], q1[6]) + mul32x32_64(modm_mu[7], q1[5]) + mul32x32_64(modm_mu[8], q1[4]); + f = (sc25519_element_t)c; q3[3] |= (f << 6) & 0x3fffffff; q3[4] = (f >> 24) & 0x3f; c >>= 30; + c += mul32x32_64(modm_mu[5], q1[8]) + mul32x32_64(modm_mu[6], q1[7]) + mul32x32_64(modm_mu[7], q1[6]) + mul32x32_64(modm_mu[8], q1[5]); + f = (sc25519_element_t)c; q3[4] |= (f << 6) & 0x3fffffff; q3[5] = (f >> 24) & 0x3f; c >>= 30; + c += mul32x32_64(modm_mu[6], q1[8]) + mul32x32_64(modm_mu[7], q1[7]) + mul32x32_64(modm_mu[8], q1[6]); + f = (sc25519_element_t)c; q3[5] |= (f << 6) & 0x3fffffff; q3[6] = (f >> 24) & 0x3f; c >>= 30; + c += mul32x32_64(modm_mu[7], q1[8]) + mul32x32_64(modm_mu[8], q1[7]); + f = (sc25519_element_t)c; q3[6] |= (f << 6) & 0x3fffffff; q3[7] = (f >> 24) & 0x3f; c >>= 30; + c += mul32x32_64(modm_mu[8], q1[8]); + f = (sc25519_element_t)c; q3[7] |= (f << 6) & 0x3fffffff; q3[8] = (sc25519_element_t)(c >> 24); + + /* r1 = (x mod 256^(32+1)) = x mod (2^8)(31+1) = x & ((1 << 264) - 1) + r2 = (q3 * m) mod (256^(32+1)) = (q3 * m) & ((1 << 264) - 1) */ + c = mul32x32_64(modm_m[0], q3[0]); + r2[0] = (sc25519_element_t)(c & 0x3fffffff); c >>= 30; + c += mul32x32_64(modm_m[0], q3[1]) + mul32x32_64(modm_m[1], q3[0]); + r2[1] = (sc25519_element_t)(c & 0x3fffffff); c >>= 30; + c += mul32x32_64(modm_m[0], q3[2]) + mul32x32_64(modm_m[1], q3[1]) + mul32x32_64(modm_m[2], q3[0]); + r2[2] = (sc25519_element_t)(c & 0x3fffffff); c >>= 30; + c += mul32x32_64(modm_m[0], q3[3]) + mul32x32_64(modm_m[1], q3[2]) + mul32x32_64(modm_m[2], q3[1]) + mul32x32_64(modm_m[3], q3[0]); + r2[3] = (sc25519_element_t)(c & 0x3fffffff); c >>= 30; + c += mul32x32_64(modm_m[0], q3[4]) + mul32x32_64(modm_m[1], q3[3]) + mul32x32_64(modm_m[2], q3[2]) + mul32x32_64(modm_m[3], q3[1]) + mul32x32_64(modm_m[4], q3[0]); + r2[4] = (sc25519_element_t)(c & 0x3fffffff); c >>= 30; + c += mul32x32_64(modm_m[0], q3[5]) + mul32x32_64(modm_m[1], q3[4]) + mul32x32_64(modm_m[2], q3[3]) + mul32x32_64(modm_m[3], q3[2]) + mul32x32_64(modm_m[4], q3[1]) + mul32x32_64(modm_m[5], q3[0]); + r2[5] = (sc25519_element_t)(c & 0x3fffffff); c >>= 30; + c += mul32x32_64(modm_m[0], q3[6]) + mul32x32_64(modm_m[1], q3[5]) + mul32x32_64(modm_m[2], q3[4]) + mul32x32_64(modm_m[3], q3[3]) + mul32x32_64(modm_m[4], q3[2]) + mul32x32_64(modm_m[5], q3[1]) + mul32x32_64(modm_m[6], q3[0]); + r2[6] = (sc25519_element_t)(c & 0x3fffffff); c >>= 30; + c += mul32x32_64(modm_m[0], q3[7]) + mul32x32_64(modm_m[1], q3[6]) + mul32x32_64(modm_m[2], q3[5]) + mul32x32_64(modm_m[3], q3[4]) + mul32x32_64(modm_m[4], q3[3]) + mul32x32_64(modm_m[5], q3[2]) + mul32x32_64(modm_m[6], q3[1]) + mul32x32_64(modm_m[7], q3[0]); + r2[7] = (sc25519_element_t)(c & 0x3fffffff); c >>= 30; + c += mul32x32_64(modm_m[0], q3[8]) + mul32x32_64(modm_m[1], q3[7]) + mul32x32_64(modm_m[2], q3[6]) + mul32x32_64(modm_m[3], q3[5]) + mul32x32_64(modm_m[4], q3[4]) + mul32x32_64(modm_m[5], q3[3]) + mul32x32_64(modm_m[6], q3[2]) + mul32x32_64(modm_m[7], q3[1]) + mul32x32_64(modm_m[8], q3[0]); + r2[8] = (sc25519_element_t)(c & 0xffffff); + + /* r = r1 - r2 + if (r < 0) r += (1 << 264) */ + pb = 0; + pb += r2[0]; b = lt_modm(r1[0], pb); r[0] = (r1[0] - pb + (b << 30)); pb = b; + pb += r2[1]; b = lt_modm(r1[1], pb); r[1] = (r1[1] - pb + (b << 30)); pb = b; + pb += r2[2]; b = lt_modm(r1[2], pb); r[2] = (r1[2] - pb + (b << 30)); pb = b; + pb += r2[3]; b = lt_modm(r1[3], pb); r[3] = (r1[3] - pb + (b << 30)); pb = b; + pb += r2[4]; b = lt_modm(r1[4], pb); r[4] = (r1[4] - pb + (b << 30)); pb = b; + pb += r2[5]; b = lt_modm(r1[5], pb); r[5] = (r1[5] - pb + (b << 30)); pb = b; + pb += r2[6]; b = lt_modm(r1[6], pb); r[6] = (r1[6] - pb + (b << 30)); pb = b; + pb += r2[7]; b = lt_modm(r1[7], pb); r[7] = (r1[7] - pb + (b << 30)); pb = b; + pb += r2[8]; b = lt_modm(r1[8], pb); r[8] = (r1[8] - pb + (b << 24)); + + reduce256_modm(r); + reduce256_modm(r); +} + +static void +expand256_modm64(sc25519 out, const unsigned char *in) { + sc25519_element_t x[16]; + sc25519 q1; + + x[0] = U8TO32_LE(in + 0); + x[1] = U8TO32_LE(in + 4); + x[2] = U8TO32_LE(in + 8); + x[3] = U8TO32_LE(in + 12); + x[4] = U8TO32_LE(in + 16); + x[5] = U8TO32_LE(in + 20); + x[6] = U8TO32_LE(in + 24); + x[7] = U8TO32_LE(in + 28); + x[8] = U8TO32_LE(in + 32); + x[9] = U8TO32_LE(in + 36); + x[10] = U8TO32_LE(in + 40); + x[11] = U8TO32_LE(in + 44); + x[12] = U8TO32_LE(in + 48); + x[13] = U8TO32_LE(in + 52); + x[14] = U8TO32_LE(in + 56); + x[15] = U8TO32_LE(in + 60); + + /* r1 = (x mod 256^(32+1)) = x mod (2^8)(31+1) = x & ((1 << 264) - 1) */ + out[0] = ( x[0]) & 0x3fffffff; + out[1] = ((x[ 0] >> 30) | (x[ 1] << 2)) & 0x3fffffff; + out[2] = ((x[ 1] >> 28) | (x[ 2] << 4)) & 0x3fffffff; + out[3] = ((x[ 2] >> 26) | (x[ 3] << 6)) & 0x3fffffff; + out[4] = ((x[ 3] >> 24) | (x[ 4] << 8)) & 0x3fffffff; + out[5] = ((x[ 4] >> 22) | (x[ 5] << 10)) & 0x3fffffff; + out[6] = ((x[ 5] >> 20) | (x[ 6] << 12)) & 0x3fffffff; + out[7] = ((x[ 6] >> 18) | (x[ 7] << 14)) & 0x3fffffff; + out[8] = ((x[ 7] >> 16) | (x[ 8] << 16)) & 0x00ffffff; + + /* q1 = x >> 248 = 264 bits = 9 30 bit elements */ + q1[0] = ((x[ 7] >> 24) | (x[ 8] << 8)) & 0x3fffffff; + q1[1] = ((x[ 8] >> 22) | (x[ 9] << 10)) & 0x3fffffff; + q1[2] = ((x[ 9] >> 20) | (x[10] << 12)) & 0x3fffffff; + q1[3] = ((x[10] >> 18) | (x[11] << 14)) & 0x3fffffff; + q1[4] = ((x[11] >> 16) | (x[12] << 16)) & 0x3fffffff; + q1[5] = ((x[12] >> 14) | (x[13] << 18)) & 0x3fffffff; + q1[6] = ((x[13] >> 12) | (x[14] << 20)) & 0x3fffffff; + q1[7] = ((x[14] >> 10) | (x[15] << 22)) & 0x3fffffff; + q1[8] = ((x[15] >> 8) ); + + barrett_reduce256_modm(out, q1, out); +} + + +static void +expand256_modm32(sc25519 out, const unsigned char *in) { + sc25519_element_t x[8]; + sc25519 q1; + + x[0] = U8TO32_LE(in + 0); + x[1] = U8TO32_LE(in + 4); + x[2] = U8TO32_LE(in + 8); + x[3] = U8TO32_LE(in + 12); + x[4] = U8TO32_LE(in + 16); + x[5] = U8TO32_LE(in + 20); + x[6] = U8TO32_LE(in + 24); + x[7] = U8TO32_LE(in + 28); + + + /* r1 = (x mod 256^(32+1)) = x mod (2^8)(31+1) = x & ((1 << 264) - 1) */ + out[0] = ( x[0]) & 0x3fffffff; + out[1] = ((x[ 0] >> 30) | (x[ 1] << 2)) & 0x3fffffff; + out[2] = ((x[ 1] >> 28) | (x[ 2] << 4)) & 0x3fffffff; + out[3] = ((x[ 2] >> 26) | (x[ 3] << 6)) & 0x3fffffff; + out[4] = ((x[ 3] >> 24) | (x[ 4] << 8)) & 0x3fffffff; + out[5] = ((x[ 4] >> 22) | (x[ 5] << 10)) & 0x3fffffff; + out[6] = ((x[ 5] >> 20) | (x[ 6] << 12)) & 0x3fffffff; + out[7] = ((x[ 6] >> 18) | (x[ 7] << 14)) & 0x3fffffff; + out[8] = ((x[ 7] >> 16) ) & 0x00ffffff; + + /* q1 = x >> 248 = 264 bits = 9 30 bit elements */ + q1[0] = ((x[ 7] >> 24) ) & 0x3fffffff; + q1[1] = 0; + q1[2] = 0; + q1[3] = 0; + q1[4] = 0; + q1[5] = 0; + q1[6] = 0; + q1[7] = 0; + q1[8] = 0; + + barrett_reduce256_modm(out, q1, out); +} + +static void +expand256_modm16(sc25519 out, const unsigned char *in) { + sc25519_element_t x[4]; + + x[0] = U8TO32_LE(in + 0); + x[1] = U8TO32_LE(in + 4); + x[2] = U8TO32_LE(in + 8); + x[3] = U8TO32_LE(in + 12); + + + + /* r1 = (x mod 256^(32+1)) = x mod (2^8)(31+1) = x & ((1 << 264) - 1) */ + out[0] = ( x[0]) & 0x3fffffff; + out[1] = ((x[ 0] >> 30) | (x[ 1] << 2)) & 0x3fffffff; + out[2] = ((x[ 1] >> 28) | (x[ 2] << 4)) & 0x3fffffff; + out[3] = ((x[ 2] >> 26) | (x[ 3] << 6)) & 0x3fffffff; + out[4] = ((x[ 3] >> 24) ) & 0x3fffffff; + out[5] = 0; + out[6] = 0; + out[7] = 0; + out[8] = 0; +} + + +static void add256_modm(sc25519 r, const sc25519 x, const sc25519 y) +{ + sc25519_element_t c; + + c = x[0] + y[0]; r[0] = c & 0x3fffffff; c >>= 30; + c += x[1] + y[1]; r[1] = c & 0x3fffffff; c >>= 30; + c += x[2] + y[2]; r[2] = c & 0x3fffffff; c >>= 30; + c += x[3] + y[3]; r[3] = c & 0x3fffffff; c >>= 30; + c += x[4] + y[4]; r[4] = c & 0x3fffffff; c >>= 30; + c += x[5] + y[5]; r[5] = c & 0x3fffffff; c >>= 30; + c += x[6] + y[6]; r[6] = c & 0x3fffffff; c >>= 30; + c += x[7] + y[7]; r[7] = c & 0x3fffffff; c >>= 30; + c += x[8] + y[8]; r[8] = c; + + reduce256_modm(r); +} + +static void mul256_modm(sc25519 r, const sc25519 x, const sc25519 y) +{ + sc25519 r1, q1; + uint64_t c; + sc25519_element_t f; + + /* r1 = (x mod 256^(32+1)) = x mod (2^8)(31+1) = x & ((1 << 264) - 1) + q1 = x >> 248 = 264 bits = 9 30 bit elements */ + c = mul32x32_64(x[0], y[0]); + f = (sc25519_element_t)c; r1[0] = (f & 0x3fffffff); c >>= 30; + c += mul32x32_64(x[0], y[1]) + mul32x32_64(x[1], y[0]); + f = (sc25519_element_t)c; r1[1] = (f & 0x3fffffff); c >>= 30; + c += mul32x32_64(x[0], y[2]) + mul32x32_64(x[1], y[1]) + mul32x32_64(x[2], y[0]); + f = (sc25519_element_t)c; r1[2] = (f & 0x3fffffff); c >>= 30; + c += mul32x32_64(x[0], y[3]) + mul32x32_64(x[1], y[2]) + mul32x32_64(x[2], y[1]) + mul32x32_64(x[3], y[0]); + f = (sc25519_element_t)c; r1[3] = (f & 0x3fffffff); c >>= 30; + c += mul32x32_64(x[0], y[4]) + mul32x32_64(x[1], y[3]) + mul32x32_64(x[2], y[2]) + mul32x32_64(x[3], y[1]) + mul32x32_64(x[4], y[0]); + f = (sc25519_element_t)c; r1[4] = (f & 0x3fffffff); c >>= 30; + c += mul32x32_64(x[0], y[5]) + mul32x32_64(x[1], y[4]) + mul32x32_64(x[2], y[3]) + mul32x32_64(x[3], y[2]) + mul32x32_64(x[4], y[1]) + mul32x32_64(x[5], y[0]); + f = (sc25519_element_t)c; r1[5] = (f & 0x3fffffff); c >>= 30; + c += mul32x32_64(x[0], y[6]) + mul32x32_64(x[1], y[5]) + mul32x32_64(x[2], y[4]) + mul32x32_64(x[3], y[3]) + mul32x32_64(x[4], y[2]) + mul32x32_64(x[5], y[1]) + mul32x32_64(x[6], y[0]); + f = (sc25519_element_t)c; r1[6] = (f & 0x3fffffff); c >>= 30; + c += mul32x32_64(x[0], y[7]) + mul32x32_64(x[1], y[6]) + mul32x32_64(x[2], y[5]) + mul32x32_64(x[3], y[4]) + mul32x32_64(x[4], y[3]) + mul32x32_64(x[5], y[2]) + mul32x32_64(x[6], y[1]) + mul32x32_64(x[7], y[0]); + f = (sc25519_element_t)c; r1[7] = (f & 0x3fffffff); c >>= 30; + c += mul32x32_64(x[0], y[8]) + mul32x32_64(x[1], y[7]) + mul32x32_64(x[2], y[6]) + mul32x32_64(x[3], y[5]) + mul32x32_64(x[4], y[4]) + mul32x32_64(x[5], y[3]) + mul32x32_64(x[6], y[2]) + mul32x32_64(x[7], y[1]) + mul32x32_64(x[8], y[0]); + f = (sc25519_element_t)c; r1[8] = (f & 0x00ffffff); q1[0] = (f >> 8) & 0x3fffff; c >>= 30; + c += mul32x32_64(x[1], y[8]) + mul32x32_64(x[2], y[7]) + mul32x32_64(x[3], y[6]) + mul32x32_64(x[4], y[5]) + mul32x32_64(x[5], y[4]) + mul32x32_64(x[6], y[3]) + mul32x32_64(x[7], y[2]) + mul32x32_64(x[8], y[1]); + f = (sc25519_element_t)c; q1[0] = (q1[0] | (f << 22)) & 0x3fffffff; q1[1] = (f >> 8) & 0x3fffff; c >>= 30; + c += mul32x32_64(x[2], y[8]) + mul32x32_64(x[3], y[7]) + mul32x32_64(x[4], y[6]) + mul32x32_64(x[5], y[5]) + mul32x32_64(x[6], y[4]) + mul32x32_64(x[7], y[3]) + mul32x32_64(x[8], y[2]); + f = (sc25519_element_t)c; q1[1] = (q1[1] | (f << 22)) & 0x3fffffff; q1[2] = (f >> 8) & 0x3fffff; c >>= 30; + c += mul32x32_64(x[3], y[8]) + mul32x32_64(x[4], y[7]) + mul32x32_64(x[5], y[6]) + mul32x32_64(x[6], y[5]) + mul32x32_64(x[7], y[4]) + mul32x32_64(x[8], y[3]); + f = (sc25519_element_t)c; q1[2] = (q1[2] | (f << 22)) & 0x3fffffff; q1[3] = (f >> 8) & 0x3fffff; c >>= 30; + c += mul32x32_64(x[4], y[8]) + mul32x32_64(x[5], y[7]) + mul32x32_64(x[6], y[6]) + mul32x32_64(x[7], y[5]) + mul32x32_64(x[8], y[4]); + f = (sc25519_element_t)c; q1[3] = (q1[3] | (f << 22)) & 0x3fffffff; q1[4] = (f >> 8) & 0x3fffff; c >>= 30; + c += mul32x32_64(x[5], y[8]) + mul32x32_64(x[6], y[7]) + mul32x32_64(x[7], y[6]) + mul32x32_64(x[8], y[5]); + f = (sc25519_element_t)c; q1[4] = (q1[4] | (f << 22)) & 0x3fffffff; q1[5] = (f >> 8) & 0x3fffff; c >>= 30; + c += mul32x32_64(x[6], y[8]) + mul32x32_64(x[7], y[7]) + mul32x32_64(x[8], y[6]); + f = (sc25519_element_t)c; q1[5] = (q1[5] | (f << 22)) & 0x3fffffff; q1[6] = (f >> 8) & 0x3fffff; c >>= 30; + c += mul32x32_64(x[7], y[8]) + mul32x32_64(x[8], y[7]); + f = (sc25519_element_t)c; q1[6] = (q1[6] | (f << 22)) & 0x3fffffff; q1[7] = (f >> 8) & 0x3fffff; c >>= 30; + c += mul32x32_64(x[8], y[8]); + f = (sc25519_element_t)c; q1[7] = (q1[7] | (f << 22)) & 0x3fffffff; q1[8] = (f >> 8) & 0x3fffff; + + barrett_reduce256_modm(r, q1, r1); +} + +/* + helpers for batch verifcation, are allowed to be vartime +*/ + +/* out = a - b, a must be larger than b */ +static void sub256_modm_batch(sc25519 out, const sc25519 a, const sc25519 b, size_t limbsize) { + size_t i = 0; + sc25519_element_t carry = 0; + switch (limbsize) { + case 8: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; + case 7: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; + case 6: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; + case 5: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; + case 4: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; + case 3: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; + case 2: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; + case 1: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 31); out[i] &= 0x3fffffff; i++; + case 0: + default: out[i] = (a[i] - b[i]) - carry; + } +} + + +/* is a < b */ +static int lt256_modm_batch(const sc25519 a, const sc25519 b, size_t limbsize) { + size_t i = 0; + sc25519_element_t t, carry = 0; + switch (limbsize) { + case 8: if (a[8] > b[8]) return 0; if (a[8] < b[8]) return 1; + case 7: if (a[7] > b[7]) return 0; if (a[7] < b[7]) return 1; + case 6: if (a[6] > b[6]) return 0; if (a[6] < b[6]) return 1; + case 5: if (a[5] > b[5]) return 0; if (a[5] < b[5]) return 1; + case 4: if (a[4] > b[4]) return 0; if (a[4] < b[4]) return 1; + case 3: if (a[3] > b[3]) return 0; if (a[3] < b[3]) return 1; + case 2: if (a[2] > b[2]) return 0; if (a[2] < b[2]) return 1; + case 1: if (a[1] > b[1]) return 0; if (a[1] < b[1]) return 1; + case 0: if (a[0] > b[0]) return 0; if (a[0] < b[0]) return 1; + } + return 0; +} + +/* is a <= b */ +static int lte256_modm_batch(const sc25519 a, const sc25519 b, size_t limbsize) { + size_t i = 0; + sc25519_element_t t, carry = 0; + switch (limbsize) { + case 8: if (a[8] > b[8]) return 0; if (a[8] < b[8]) return 1; + case 7: if (a[7] > b[7]) return 0; if (a[7] < b[7]) return 1; + case 6: if (a[6] > b[6]) return 0; if (a[6] < b[6]) return 1; + case 5: if (a[5] > b[5]) return 0; if (a[5] < b[5]) return 1; + case 4: if (a[4] > b[4]) return 0; if (a[4] < b[4]) return 1; + case 3: if (a[3] > b[3]) return 0; if (a[3] < b[3]) return 1; + case 2: if (a[2] > b[2]) return 0; if (a[2] < b[2]) return 1; + case 1: if (a[1] > b[1]) return 0; if (a[1] < b[1]) return 1; + case 0: if (a[0] > b[0]) return 0; if (a[0] < b[0]) return 1; + } + return 1; +} + +/* is a == 0 */ +static int iszero256_modm_batch(const sc25519 a) { + sc25519_element_t result = a[0]; + result |= a[1]; + result |= a[2]; + result |= a[3]; + result |= a[5]; + result |= a[6]; + result |= a[7]; + result |= a[8]; + + return (result == 0); +} + +/* is a == 1 */ +static int isone256_modm_batch(const sc25519 a) { + sc25519_element_t result = a[0] ^ 1; + result |= a[1]; + result |= a[2]; + result |= a[3]; + result |= a[5]; + result |= a[6]; + result |= a[7]; + result |= a[8]; + + return (result == 0); +} + +/* can a fit in to (at most) 128 bits */ +static int isatmost128bits256_modm_batch(const sc25519 a) { + uint32_t mask = + ((a[8] ) | /* 16 */ + (a[7] ) | /* 46 */ + (a[6] ) | /* 76 */ + (a[5] ) | /* 106 */ + (a[4] & 0x3fffff00)); /* 128 */ + + return (mask == 0); +} + + + +#endif diff --git a/crypto/libsodium-fork/src/libsodium/include/sodium/private/ed25519_ref10_sc_51.h b/crypto/libsodium-fork/src/libsodium/include/sodium/private/ed25519_ref10_sc_51.h new file mode 100644 index 0000000000..26db8abbfb --- /dev/null +++ b/crypto/libsodium-fork/src/libsodium/include/sodium/private/ed25519_ref10_sc_51.h @@ -0,0 +1,375 @@ + +#ifndef ed25519_ref10_sc_51_H +#define ed25519_ref10_sc_51_H + +#include +#include + +/* + The set of scalars is \Z/l + where l = 2^252 + 27742317777372353535851937790883648493. + */ + +typedef uint64_t sc25519_element_t; +typedef sc25519_element_t sc25519[5]; + +#define SC25519_BITS_PER_LIMB 56 +#define SC25519_LIMB_SIZE 5 + +typedef unsigned __int128 uint128_t; +#define mul64x64_128(out,a,b) out = (uint128_t)a * b; +#define shr128_pair(out,hi,lo,shift) out = (uint64_t)((((uint128_t)hi << 64) | lo) >> (shift)); +#define shl128_pair(out,hi,lo,shift) out = (uint64_t)(((((uint128_t)hi << 64) | lo) << (shift)) >> 64); +#define shr128(out,in,shift) out = (uint64_t)(in >> (shift)); +#define shl128(out,in,shift) out = (uint64_t)((in << shift) >> 64); +#define add128(a,b) a += b; +#define add128_64(a,b) a += (uint64_t)b; +#define lo128(a) ((uint64_t)a) +#define hi128(a) ((uint64_t)(a >> 64)) + + + + + +static inline uint64_t U8TO64_LE(const unsigned char *p) { + return + (((uint64_t)(p[0]) ) | + ((uint64_t)(p[1]) << 8) | + ((uint64_t)(p[2]) << 16) | + ((uint64_t)(p[3]) << 24) | + ((uint64_t)(p[4]) << 32) | + ((uint64_t)(p[5]) << 40) | + ((uint64_t)(p[6]) << 48) | + ((uint64_t)(p[7]) << 56)); +} + +static inline void U64TO8_LE(unsigned char *p, const uint64_t v) { + p[0] = (unsigned char)(v ); + p[1] = (unsigned char)(v >> 8); + p[2] = (unsigned char)(v >> 16); + p[3] = (unsigned char)(v >> 24); + p[4] = (unsigned char)(v >> 32); + p[5] = (unsigned char)(v >> 40); + p[6] = (unsigned char)(v >> 48); + p[7] = (unsigned char)(v >> 56); +} + + + +static const sc25519 modm_m = { + 0x12631a5cf5d3ed, + 0xf9dea2f79cd658, + 0x000000000014de, + 0x00000000000000, + 0x00000010000000 +}; + + +static const sc25519 modm_mu = { + 0x9ce5a30a2c131b, + 0x215d086329a7ed, + 0xffffffffeb2106, + 0xffffffffffffff, + 0x00000fffffffff +}; + +static sc25519_element_t lt_modm(sc25519_element_t a, sc25519_element_t b) { + return (a - b) >> 63; +} + +static void reduce256_modm(sc25519 r) +{ + sc25519 t; + sc25519_element_t b = 0, pb, mask; + + /* t = r - m */ + pb = 0; + pb += modm_m[0]; b = lt_modm(r[0], pb); t[0] = (r[0] - pb + (b << 56)); pb = b; + pb += modm_m[1]; b = lt_modm(r[1], pb); t[1] = (r[1] - pb + (b << 56)); pb = b; + pb += modm_m[2]; b = lt_modm(r[2], pb); t[2] = (r[2] - pb + (b << 56)); pb = b; + pb += modm_m[3]; b = lt_modm(r[3], pb); t[3] = (r[3] - pb + (b << 56)); pb = b; + pb += modm_m[4]; b = lt_modm(r[4], pb); t[4] = (r[4] - pb + (b << 32)); + + /* keep r if r was smaller than m */ + mask = b - 1; + + r[0] ^= mask & (r[0] ^ t[0]); + r[1] ^= mask & (r[1] ^ t[1]); + r[2] ^= mask & (r[2] ^ t[2]); + r[3] ^= mask & (r[3] ^ t[3]); + r[4] ^= mask & (r[4] ^ t[4]); +} + +static void barrett_reduce256_modm(sc25519 r, const sc25519 q1, const sc25519 r1) +{ + sc25519 q3, r2; + uint128_t c, mul; + sc25519_element_t f, b, pb; + + /* q1 = x >> 248 = 264 bits = 5 56 bit elements + q2 = mu * q1 + q3 = (q2 / 256(32+1)) = q2 / (2^8)^(32+1) = q2 >> 264 */ + mul64x64_128(c, modm_mu[0], q1[3]) mul64x64_128(mul, modm_mu[3], q1[0]) add128(c, mul) mul64x64_128(mul, modm_mu[1], q1[2]) add128(c, mul) mul64x64_128(mul, modm_mu[2], q1[1]) add128(c, mul) shr128(f, c, 56); + mul64x64_128(c, modm_mu[0], q1[4]) add128_64(c, f) mul64x64_128(mul, modm_mu[4], q1[0]) add128(c, mul) mul64x64_128(mul, modm_mu[3], q1[1]) add128(c, mul) mul64x64_128(mul, modm_mu[1], q1[3]) add128(c, mul) mul64x64_128(mul, modm_mu[2], q1[2]) add128(c, mul) + f = lo128(c); q3[0] = (f >> 40) & 0xffff; shr128(f, c, 56); + mul64x64_128(c, modm_mu[4], q1[1]) add128_64(c, f) mul64x64_128(mul, modm_mu[1], q1[4]) add128(c, mul) mul64x64_128(mul, modm_mu[2], q1[3]) add128(c, mul) mul64x64_128(mul, modm_mu[3], q1[2]) add128(c, mul) + f = lo128(c); q3[0] |= (f << 16) & 0xffffffffffffff; q3[1] = (f >> 40) & 0xffff; shr128(f, c, 56); + mul64x64_128(c, modm_mu[4], q1[2]) add128_64(c, f) mul64x64_128(mul, modm_mu[2], q1[4]) add128(c, mul) mul64x64_128(mul, modm_mu[3], q1[3]) add128(c, mul) + f = lo128(c); q3[1] |= (f << 16) & 0xffffffffffffff; q3[2] = (f >> 40) & 0xffff; shr128(f, c, 56); + mul64x64_128(c, modm_mu[4], q1[3]) add128_64(c, f) mul64x64_128(mul, modm_mu[3], q1[4]) add128(c, mul) + f = lo128(c); q3[2] |= (f << 16) & 0xffffffffffffff; q3[3] = (f >> 40) & 0xffff; shr128(f, c, 56); + mul64x64_128(c, modm_mu[4], q1[4]) add128_64(c, f) + f = lo128(c); q3[3] |= (f << 16) & 0xffffffffffffff; q3[4] = (f >> 40) & 0xffff; shr128(f, c, 56); + q3[4] |= (f << 16); + + mul64x64_128(c, modm_m[0], q3[0]) + r2[0] = lo128(c) & 0xffffffffffffff; shr128(f, c, 56); + mul64x64_128(c, modm_m[0], q3[1]) add128_64(c, f) mul64x64_128(mul, modm_m[1], q3[0]) add128(c, mul) + r2[1] = lo128(c) & 0xffffffffffffff; shr128(f, c, 56); + mul64x64_128(c, modm_m[0], q3[2]) add128_64(c, f) mul64x64_128(mul, modm_m[2], q3[0]) add128(c, mul) mul64x64_128(mul, modm_m[1], q3[1]) add128(c, mul) + r2[2] = lo128(c) & 0xffffffffffffff; shr128(f, c, 56); + mul64x64_128(c, modm_m[0], q3[3]) add128_64(c, f) mul64x64_128(mul, modm_m[3], q3[0]) add128(c, mul) mul64x64_128(mul, modm_m[1], q3[2]) add128(c, mul) mul64x64_128(mul, modm_m[2], q3[1]) add128(c, mul) + r2[3] = lo128(c) & 0xffffffffffffff; shr128(f, c, 56); + mul64x64_128(c, modm_m[0], q3[4]) add128_64(c, f) mul64x64_128(mul, modm_m[4], q3[0]) add128(c, mul) mul64x64_128(mul, modm_m[3], q3[1]) add128(c, mul) mul64x64_128(mul, modm_m[1], q3[3]) add128(c, mul) mul64x64_128(mul, modm_m[2], q3[2]) add128(c, mul) + r2[4] = lo128(c) & 0x0000ffffffffff; + + pb = 0; + pb += r2[0]; b = lt_modm(r1[0], pb); r[0] = (r1[0] - pb + (b << 56)); pb = b; + pb += r2[1]; b = lt_modm(r1[1], pb); r[1] = (r1[1] - pb + (b << 56)); pb = b; + pb += r2[2]; b = lt_modm(r1[2], pb); r[2] = (r1[2] - pb + (b << 56)); pb = b; + pb += r2[3]; b = lt_modm(r1[3], pb); r[3] = (r1[3] - pb + (b << 56)); pb = b; + pb += r2[4]; b = lt_modm(r1[4], pb); r[4] = (r1[4] - pb + (b << 40)); + + reduce256_modm(r); + reduce256_modm(r); +} + + +/* + Input: + s[0]+256*s[1]+...+256^63*s[63] = s + * + Output: + s[0]+256*s[1]+...+256^31*s[31] = s mod l + where l = 2^252 + 27742317777372353535851937790883648493. + the output returns in sc25519 presentation + */ +static void expand256_modm64(sc25519 out, const unsigned char *in) +{ + sc25519_element_t x[8]; + sc25519 q1; + + x[0] = U8TO64_LE(in + 0); + x[1] = U8TO64_LE(in + 8); + x[2] = U8TO64_LE(in + 16); + x[3] = U8TO64_LE(in + 24); + x[4] = U8TO64_LE(in + 32); + x[5] = U8TO64_LE(in + 40); + x[6] = U8TO64_LE(in + 48); + x[7] = U8TO64_LE(in + 56); + + /* r1 = (x mod 256^(32+1)) = x mod (2^8)(31+1) = x & ((1 << 264) - 1) */ + out[0] = ( x[0]) & 0xffffffffffffff; + out[1] = ((x[ 0] >> 56) | (x[ 1] << 8)) & 0xffffffffffffff; + out[2] = ((x[ 1] >> 48) | (x[ 2] << 16)) & 0xffffffffffffff; + out[3] = ((x[ 2] >> 40) | (x[ 3] << 24)) & 0xffffffffffffff; + out[4] = ((x[ 3] >> 32) | (x[ 4] << 32)) & 0x0000ffffffffff; + + /* q1 = x >> 248 = 264 bits */ + q1[0] = ((x[ 3] >> 56) | (x[ 4] << 8)) & 0xffffffffffffff; + q1[1] = ((x[ 4] >> 48) | (x[ 5] << 16)) & 0xffffffffffffff; + q1[2] = ((x[ 5] >> 40) | (x[ 6] << 24)) & 0xffffffffffffff; + q1[3] = ((x[ 6] >> 32) | (x[ 7] << 32)) & 0xffffffffffffff; + q1[4] = ((x[ 7] >> 24) ); + + barrett_reduce256_modm(out, q1, out); +} + +/* + Input: + s[0]+256*s[1]+...+256^32*s[32] = s + * + Output: + s[0]+256*s[1]+...+256^31*s[31] = s mod l + where l = 2^252 + 27742317777372353535851937790883648493. + the output returns in sc25519 presentation + */ +static void expand256_modm32(sc25519 out, const unsigned char *in) +{ + sc25519_element_t x[4]; + sc25519 q1; + + x[0] = U8TO64_LE(in + 0); + x[1] = U8TO64_LE(in + 8); + x[2] = U8TO64_LE(in + 16); + x[3] = U8TO64_LE(in + 24); + + /* r1 = (x mod 256^(32+1)) = x mod (2^8)(31+1) = x & ((1 << 264) - 1) */ + out[0] = ( x[0]) & 0xffffffffffffff; + out[1] = ((x[ 0] >> 56) | (x[ 1] << 8)) & 0xffffffffffffff; + out[2] = ((x[ 1] >> 48) | (x[ 2] << 16)) & 0xffffffffffffff; + out[3] = ((x[ 2] >> 40) | (x[ 3] << 24)) & 0xffffffffffffff; + out[4] = ((x[ 3] >> 32) ) & 0x0000ffffffffff; + + /* q1 = x >> 248 = 264 bits */ + q1[0] = ((x[ 3] >> 56)) & 0xffffffffffffff; + q1[1] = 0; + q1[2] = 0; + q1[3] = 0; + q1[4] = 0; + + barrett_reduce256_modm(out, q1, out); +} + + +/* + Input: + s[0]+256*s[1]+...+256^16*s[16] = s + * + Output: + s[0]+256*s[1]+...+256^31*s[31] = s mod l + where l = 2^252 + 27742317777372353535851937790883648493. + the output returns in sc25519 presentation + */ +static void expand256_modm16(sc25519 out, const unsigned char *in) +{ + sc25519_element_t x[2]; + sc25519 q1; + + x[0] = U8TO64_LE(in + 0); + x[1] = U8TO64_LE(in + 8); + + /* r1 = (x mod 256^(32+1)) = x mod (2^8)(31+1) = x & ((1 << 264) - 1) */ + out[0] = ( x[0]) & 0xffffffffffffff; + out[1] = ((x[ 0] >> 56) | (x[ 1] << 8)) & 0xffffffffffffff; + out[2] = ((x[ 1] >> 48) ) & 0xffffffffffffff; + out[3] = 0; + out[4] = 0; + +} + +static void add256_modm(sc25519 r, const sc25519 x, const sc25519 y) +{ + sc25519_element_t c; + + c = x[0] + y[0]; r[0] = c & 0xffffffffffffff; c >>= 56; + c += x[1] + y[1]; r[1] = c & 0xffffffffffffff; c >>= 56; + c += x[2] + y[2]; r[2] = c & 0xffffffffffffff; c >>= 56; + c += x[3] + y[3]; r[3] = c & 0xffffffffffffff; c >>= 56; + c += x[4] + y[4]; r[4] = c; + + reduce256_modm(r); +} + +static void mul256_modm(sc25519 r, const sc25519 x, const sc25519 y) +{ + sc25519 q1, r1; + uint128_t c, mul; + sc25519_element_t f; + + mul64x64_128(c, x[0], y[0]) + f = lo128(c); r1[0] = f & 0xffffffffffffff; shr128(f, c, 56); + mul64x64_128(c, x[0], y[1]) add128_64(c, f) mul64x64_128(mul, x[1], y[0]) add128(c, mul) + f = lo128(c); r1[1] = f & 0xffffffffffffff; shr128(f, c, 56); + mul64x64_128(c, x[0], y[2]) add128_64(c, f) mul64x64_128(mul, x[2], y[0]) add128(c, mul) mul64x64_128(mul, x[1], y[1]) add128(c, mul) + f = lo128(c); r1[2] = f & 0xffffffffffffff; shr128(f, c, 56); + mul64x64_128(c, x[0], y[3]) add128_64(c, f) mul64x64_128(mul, x[3], y[0]) add128(c, mul) mul64x64_128(mul, x[1], y[2]) add128(c, mul) mul64x64_128(mul, x[2], y[1]) add128(c, mul) + f = lo128(c); r1[3] = f & 0xffffffffffffff; shr128(f, c, 56); + mul64x64_128(c, x[0], y[4]) add128_64(c, f) mul64x64_128(mul, x[4], y[0]) add128(c, mul) mul64x64_128(mul, x[3], y[1]) add128(c, mul) mul64x64_128(mul, x[1], y[3]) add128(c, mul) mul64x64_128(mul, x[2], y[2]) add128(c, mul) + f = lo128(c); r1[4] = f & 0x0000ffffffffff; q1[0] = (f >> 24) & 0xffffffff; shr128(f, c, 56); + mul64x64_128(c, x[4], y[1]) add128_64(c, f) mul64x64_128(mul, x[1], y[4]) add128(c, mul) mul64x64_128(mul, x[2], y[3]) add128(c, mul) mul64x64_128(mul, x[3], y[2]) add128(c, mul) + f = lo128(c); q1[0] |= (f << 32) & 0xffffffffffffff; q1[1] = (f >> 24) & 0xffffffff; shr128(f, c, 56); + mul64x64_128(c, x[4], y[2]) add128_64(c, f) mul64x64_128(mul, x[2], y[4]) add128(c, mul) mul64x64_128(mul, x[3], y[3]) add128(c, mul) + f = lo128(c); q1[1] |= (f << 32) & 0xffffffffffffff; q1[2] = (f >> 24) & 0xffffffff; shr128(f, c, 56); + mul64x64_128(c, x[4], y[3]) add128_64(c, f) mul64x64_128(mul, x[3], y[4]) add128(c, mul) + f = lo128(c); q1[2] |= (f << 32) & 0xffffffffffffff; q1[3] = (f >> 24) & 0xffffffff; shr128(f, c, 56); + mul64x64_128(c, x[4], y[4]) add128_64(c, f) + f = lo128(c); q1[3] |= (f << 32) & 0xffffffffffffff; q1[4] = (f >> 24) & 0xffffffff; shr128(f, c, 56); + q1[4] |= (f << 32); + + barrett_reduce256_modm(r, q1, r1); +} + +/* + helpers for batch verifcation, are allowed to be vartime +*/ + +/* out = a - b, a must be larger than b */ +static void sub256_modm_batch(sc25519 out, const sc25519 a, const sc25519 b, size_t limbsize) { + size_t i = 0; + sc25519_element_t carry = 0; + switch (limbsize) { + case 4: out[i] = (a[i] - b[i]) ; carry = (out[i] >> 63); out[i] &= 0xffffffffffffff; i++; + case 3: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 63); out[i] &= 0xffffffffffffff; i++; + case 2: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 63); out[i] &= 0xffffffffffffff; i++; + case 1: out[i] = (a[i] - b[i]) - carry; carry = (out[i] >> 63); out[i] &= 0xffffffffffffff; i++; + case 0: + default: out[i] = (a[i] - b[i]) - carry; + } +} + + +/* is a < b */ +static int lt256_modm_batch(const sc25519 a, const sc25519 b, size_t limbsize) { + size_t i = 0; + sc25519_element_t t, carry = 0; + switch (limbsize) { + case 4: t = (a[i] - b[i]) ; carry = (t >> 63); i++; + case 3: t = (a[i] - b[i]) - carry; carry = (t >> 63); i++; + case 2: t = (a[i] - b[i]) - carry; carry = (t >> 63); i++; + case 1: t = (a[i] - b[i]) - carry; carry = (t >> 63); i++; + case 0: t = (a[i] - b[i]) - carry; carry = (t >> 63); + } + return (int)carry; +} + +/* is a <= b */ +static int lte256_modm_batch(const sc25519 a, const sc25519 b, size_t limbsize) { + size_t i = 0; + sc25519_element_t t, carry = 0; + switch (limbsize) { + case 4: t = (b[i] - a[i]) ; carry = (t >> 63); i++; + case 3: t = (b[i] - a[i]) - carry; carry = (t >> 63); i++; + case 2: t = (b[i] - a[i]) - carry; carry = (t >> 63); i++; + case 1: t = (b[i] - a[i]) - carry; carry = (t >> 63); i++; + case 0: t = (b[i] - a[i]) - carry; carry = (t >> 63); + } + return (int)!carry; +} + +/* is a == 0 */ +static int iszero256_modm_batch(const sc25519 a) { + sc25519_element_t result = a[0]; + result |= a[1]; + result |= a[2]; + result |= a[3]; + result |= a[4]; + + return (result == 0); +} + +/* is a == 1 */ +static int isone256_modm_batch(const sc25519 a) { + sc25519_element_t result = a[0] ^ 1; + result |= a[1]; + result |= a[2]; + result |= a[3]; + result |= a[4]; + + return (result == 0); +} + +/* can a fit in to (at most) 128 bits */ +static int isatmost128bits256_modm_batch(const sc25519 a) { + uint64_t mask = + ((a[4] ) | /* 32 */ + (a[3] ) | /* 88 */ + (a[2] & 0xffffffffff0000)); + + return (mask == 0); +} + + + + +#endif diff --git a/crypto/libsodium-fork/test/default/Makefile.am b/crypto/libsodium-fork/test/default/Makefile.am index 6d7583e03d..85c0056667 100644 --- a/crypto/libsodium-fork/test/default/Makefile.am +++ b/crypto/libsodium-fork/test/default/Makefile.am @@ -67,6 +67,8 @@ EXTRA_DIST = \ secretstream.exp \ shorthash.exp \ sign.exp \ + sign_bv_compat.exp \ + batch.exp \ siphashx24.exp \ sodium_core.exp \ sodium_utils.exp \ @@ -146,6 +148,8 @@ DISTCLEANFILES = \ secretstream.res \ shorthash.res \ sign.res \ + sign_bv_compat.res \ + batch.res \ siphashx24.res \ sodium_core.res \ sodium_utils.res \ @@ -226,6 +230,8 @@ CLEANFILES = \ secretstream.final \ shorthash.final \ sign.final \ + sign_bv_compat.final \ + batch.final \ siphashx24.final \ sodium_core.final \ sodium_utils.final \ @@ -300,6 +306,8 @@ CLEANFILES = \ secretstream.nexe \ shorthash.nexe \ sign.nexe \ + sign_bv_compat.nexe \ + batch.nexe \ siphashx24.nexe \ sodium_core.nexe \ sodium_utils.nexe \ @@ -382,6 +390,8 @@ TESTS_TARGETS = \ secretstream \ shorthash \ sign \ + sign_bv_compat \ + batch \ sodium_core \ sodium_utils \ sodium_version \ @@ -596,6 +606,12 @@ shorthash_LDADD = $(TESTS_LDADD) sign_SOURCE = cmptest.h sign.c sign_LDADD = $(TESTS_LDADD) +sign_bv_compat_SOURCE = cmptest.h sign_bv_compat.c +sign_bv_compat_LDADD = $(TESTS_LDADD) + +batch_SOURCE = cmptest.h batch.c +batch_LDADD = $(TESTS_LDADD) + siphashx24_SOURCE = cmptest.h siphashx24.c siphashx24_LDADD = $(TESTS_LDADD) diff --git a/crypto/libsodium-fork/test/default/batch.c b/crypto/libsodium-fork/test/default/batch.c new file mode 100644 index 0000000000..7de82d7ede --- /dev/null +++ b/crypto/libsodium-fork/test/default/batch.c @@ -0,0 +1,1434 @@ +#define TEST_NAME "batch" +#include "cmptest.h" + + +#define SAMPLE_SIZE 1025 +#define MINIMAL_BATCH_SIZE 4 +#define MAX_BATCH_SIZE 64 + + + +typedef void (random_function_t)(void * const , const size_t ); + +static random_function_t *rand_func_iml; + + + + +typedef struct TestData_ { + unsigned char sk[crypto_sign_SEEDBYTES]; + unsigned char pk[crypto_sign_PUBLICKEYBYTES]; + unsigned char sig[crypto_sign_BYTES]; + char *m; +} TestData; + +static TestData test_data[] = { +{{0x9d,0x61,0xb1,0x9d,0xef,0xfd,0x5a,0x60,0xba,0x84,0x4a,0xf4,0x92,0xec,0x2c,0xc4,0x44,0x49,0xc5,0x69,0x7b,0x32,0x69,0x19,0x70,0x3b,0xac,0x03,0x1c,0xae,0x7f,0x60,},{0xd7,0x5a,0x98,0x01,0x82,0xb1,0x0a,0xb7,0xd5,0x4b,0xfe,0xd3,0xc9,0x64,0x07,0x3a,0x0e,0xe1,0x72,0xf3,0xda,0xa6,0x23,0x25,0xaf,0x02,0x1a,0x68,0xf7,0x07,0x51,0x1a,},{0xe5,0x56,0x43,0x00,0xc3,0x60,0xac,0x72,0x90,0x86,0xe2,0xcc,0x80,0x6e,0x82,0x8a,0x84,0x87,0x7f,0x1e,0xb8,0xe5,0xd9,0x74,0xd8,0x73,0xe0,0x65,0x22,0x49,0x01,0x55,0x5f,0xb8,0x82,0x15,0x90,0xa3,0x3b,0xac,0xc6,0x1e,0x39,0x70,0x1c,0xf9,0xb4,0x6b,0xd2,0x5b,0xf5,0xf0,0x59,0x5b,0xbe,0x24,0x65,0x51,0x41,0x43,0x8e,0x7a,0x10,0x0b,},""}, +{{0x4c,0xcd,0x08,0x9b,0x28,0xff,0x96,0xda,0x9d,0xb6,0xc3,0x46,0xec,0x11,0x4e,0x0f,0x5b,0x8a,0x31,0x9f,0x35,0xab,0xa6,0x24,0xda,0x8c,0xf6,0xed,0x4f,0xb8,0xa6,0xfb,},{0x3d,0x40,0x17,0xc3,0xe8,0x43,0x89,0x5a,0x92,0xb7,0x0a,0xa7,0x4d,0x1b,0x7e,0xbc,0x9c,0x98,0x2c,0xcf,0x2e,0xc4,0x96,0x8c,0xc0,0xcd,0x55,0xf1,0x2a,0xf4,0x66,0x0c,},{0x92,0xa0,0x09,0xa9,0xf0,0xd4,0xca,0xb8,0x72,0x0e,0x82,0x0b,0x5f,0x64,0x25,0x40,0xa2,0xb2,0x7b,0x54,0x16,0x50,0x3f,0x8f,0xb3,0x76,0x22,0x23,0xeb,0xdb,0x69,0xda,0x08,0x5a,0xc1,0xe4,0x3e,0x15,0x99,0x6e,0x45,0x8f,0x36,0x13,0xd0,0xf1,0x1d,0x8c,0x38,0x7b,0x2e,0xae,0xb4,0x30,0x2a,0xee,0xb0,0x0d,0x29,0x16,0x12,0xbb,0x0c,0x00,},"\x72"}, +{{0xc5,0xaa,0x8d,0xf4,0x3f,0x9f,0x83,0x7b,0xed,0xb7,0x44,0x2f,0x31,0xdc,0xb7,0xb1,0x66,0xd3,0x85,0x35,0x07,0x6f,0x09,0x4b,0x85,0xce,0x3a,0x2e,0x0b,0x44,0x58,0xf7,},{0xfc,0x51,0xcd,0x8e,0x62,0x18,0xa1,0xa3,0x8d,0xa4,0x7e,0xd0,0x02,0x30,0xf0,0x58,0x08,0x16,0xed,0x13,0xba,0x33,0x03,0xac,0x5d,0xeb,0x91,0x15,0x48,0x90,0x80,0x25,},{0x62,0x91,0xd6,0x57,0xde,0xec,0x24,0x02,0x48,0x27,0xe6,0x9c,0x3a,0xbe,0x01,0xa3,0x0c,0xe5,0x48,0xa2,0x84,0x74,0x3a,0x44,0x5e,0x36,0x80,0xd7,0xdb,0x5a,0xc3,0xac,0x18,0xff,0x9b,0x53,0x8d,0x16,0xf2,0x90,0xae,0x67,0xf7,0x60,0x98,0x4d,0xc6,0x59,0x4a,0x7c,0x15,0xe9,0x71,0x6e,0xd2,0x8d,0xc0,0x27,0xbe,0xce,0xea,0x1e,0xc4,0x0a,},"\xaf\x82"}, +{{0x0d,0x4a,0x05,0xb0,0x73,0x52,0xa5,0x43,0x6e,0x18,0x03,0x56,0xda,0x0a,0xe6,0xef,0xa0,0x34,0x5f,0xf7,0xfb,0x15,0x72,0x57,0x57,0x72,0xe8,0x00,0x5e,0xd9,0x78,0xe9,},{0xe6,0x1a,0x18,0x5b,0xce,0xf2,0x61,0x3a,0x6c,0x7c,0xb7,0x97,0x63,0xce,0x94,0x5d,0x3b,0x24,0x5d,0x76,0x11,0x4d,0xd4,0x40,0xbc,0xf5,0xf2,0xdc,0x1a,0xa5,0x70,0x57,},{0xd9,0x86,0x8d,0x52,0xc2,0xbe,0xbc,0xe5,0xf3,0xfa,0x5a,0x79,0x89,0x19,0x70,0xf3,0x09,0xcb,0x65,0x91,0xe3,0xe1,0x70,0x2a,0x70,0x27,0x6f,0xa9,0x7c,0x24,0xb3,0xa8,0xe5,0x86,0x06,0xc3,0x8c,0x97,0x58,0x52,0x9d,0xa5,0x0e,0xe3,0x1b,0x82,0x19,0xcb,0xa4,0x52,0x71,0xc6,0x89,0xaf,0xa6,0x0b,0x0e,0xa2,0x6c,0x99,0xdb,0x19,0xb0,0x0c,},"\xcb\xc7\x7b"}, +{{0x6d,0xf9,0x34,0x0c,0x13,0x8c,0xc1,0x88,0xb5,0xfe,0x44,0x64,0xeb,0xaa,0x3f,0x7f,0xc2,0x06,0xa2,0xd5,0x5c,0x34,0x34,0x70,0x7e,0x74,0xc9,0xfc,0x04,0xe2,0x0e,0xbb,},{0xc0,0xda,0xc1,0x02,0xc4,0x53,0x31,0x86,0xe2,0x5d,0xc4,0x31,0x28,0x47,0x23,0x53,0xea,0xab,0xdb,0x87,0x8b,0x15,0x2a,0xeb,0x8e,0x00,0x1f,0x92,0xd9,0x02,0x33,0xa7,},{0x12,0x4f,0x6f,0xc6,0xb0,0xd1,0x00,0x84,0x27,0x69,0xe7,0x1b,0xd5,0x30,0x66,0x4d,0x88,0x8d,0xf8,0x50,0x7d,0xf6,0xc5,0x6d,0xed,0xfd,0xb5,0x09,0xae,0xb9,0x34,0x16,0xe2,0x6b,0x91,0x8d,0x38,0xaa,0x06,0x30,0x5d,0xf3,0x09,0x56,0x97,0xc1,0x8b,0x2a,0xa8,0x32,0xea,0xa5,0x2e,0xdc,0x0a,0xe4,0x9f,0xba,0xe5,0xa8,0x5e,0x15,0x0c,0x07,},"\x5f\x4c\x89\x89"}, +{{0xb7,0x80,0x38,0x1a,0x65,0xed,0xf8,0xb7,0x8f,0x69,0x45,0xe8,0xdb,0xec,0x79,0x41,0xac,0x04,0x9f,0xd4,0xc6,0x10,0x40,0xcf,0x0c,0x32,0x43,0x57,0x97,0x5a,0x29,0x3c,},{0xe2,0x53,0xaf,0x07,0x66,0x80,0x4b,0x86,0x9b,0xb1,0x59,0x5b,0xe9,0x76,0x5b,0x53,0x48,0x86,0xbb,0xaa,0xb8,0x30,0x5b,0xf5,0x0d,0xbc,0x7f,0x89,0x9b,0xfb,0x5f,0x01,},{0xb2,0xfc,0x46,0xad,0x47,0xaf,0x46,0x44,0x78,0xc1,0x99,0xe1,0xf8,0xbe,0x16,0x9f,0x1b,0xe6,0x32,0x7c,0x7f,0x9a,0x0a,0x66,0x89,0x37,0x1c,0xa9,0x4c,0xaf,0x04,0x06,0x4a,0x01,0xb2,0x2a,0xff,0x15,0x20,0xab,0xd5,0x89,0x51,0x34,0x16,0x03,0xfa,0xed,0x76,0x8c,0xf7,0x8c,0xe9,0x7a,0xe7,0xb0,0x38,0xab,0xfe,0x45,0x6a,0xa1,0x7c,0x09,},"\x18\xb6\xbe\xc0\x97"}, +{{0x78,0xae,0x9e,0xff,0xe6,0xf2,0x45,0xe9,0x24,0xa7,0xbe,0x63,0x04,0x11,0x46,0xeb,0xc6,0x70,0xdb,0xd3,0x06,0x0c,0xba,0x67,0xfb,0xc6,0x21,0x6f,0xeb,0xc4,0x45,0x46,},{0xfb,0xcf,0xbf,0xa4,0x05,0x05,0xd7,0xf2,0xbe,0x44,0x4a,0x33,0xd1,0x85,0xcc,0x54,0xe1,0x6d,0x61,0x52,0x60,0xe1,0x64,0x0b,0x2b,0x50,0x87,0xb8,0x3e,0xe3,0x64,0x3d,},{0x6e,0xd6,0x29,0xfc,0x1d,0x9c,0xe9,0xe1,0x46,0x87,0x55,0xff,0x63,0x6d,0x5a,0x3f,0x40,0xa5,0xd9,0xc9,0x1a,0xfd,0x93,0xb7,0x9d,0x24,0x18,0x30,0xf7,0xe5,0xfa,0x29,0x85,0x4b,0x8f,0x20,0xcc,0x6e,0xec,0xbb,0x24,0x8d,0xbd,0x8d,0x16,0xd1,0x4e,0x99,0x75,0x21,0x94,0xe4,0x90,0x4d,0x09,0xc7,0x4d,0x63,0x95,0x18,0x83,0x9d,0x23,0x00,},"\x89\x01\x0d\x85\x59\x72"}, +{{0x69,0x18,0x65,0xbf,0xc8,0x2a,0x1e,0x4b,0x57,0x4e,0xec,0xde,0x4c,0x75,0x19,0x09,0x3f,0xaf,0x0c,0xf8,0x67,0x38,0x02,0x34,0xe3,0x66,0x46,0x45,0xc6,0x1c,0x5f,0x79,},{0x98,0xa5,0xe3,0xa3,0x6e,0x67,0xaa,0xba,0x89,0x88,0x8b,0xf0,0x93,0xde,0x1a,0xd9,0x63,0xe7,0x74,0x01,0x3b,0x39,0x02,0xbf,0xab,0x35,0x6d,0x8b,0x90,0x17,0x8a,0x63,},{0x6e,0x0a,0xf2,0xfe,0x55,0xae,0x37,0x7a,0x6b,0x7a,0x72,0x78,0xed,0xfb,0x41,0x9b,0xd3,0x21,0xe0,0x6d,0x0d,0xf5,0xe2,0x70,0x37,0xdb,0x88,0x12,0xe7,0xe3,0x52,0x98,0x10,0xfa,0x55,0x52,0xf6,0xc0,0x02,0x09,0x85,0xca,0x17,0xa0,0xe0,0x2e,0x03,0x6d,0x7b,0x22,0x2a,0x24,0xf9,0x9b,0x77,0xb7,0x5f,0xdd,0x16,0xcb,0x05,0x56,0x81,0x07,},"\xb4\xa8\xf3\x81\xe7\x0e\x7a"}, +{{0x3b,0x26,0x51,0x6f,0xb3,0xdc,0x88,0xeb,0x18,0x1b,0x9e,0xd7,0x3f,0x0b,0xcd,0x52,0xbc,0xd6,0xb4,0xc7,0x88,0xe4,0xbc,0xaf,0x46,0x05,0x7f,0xd0,0x78,0xbe,0xe0,0x73,},{0xf8,0x1f,0xb5,0x4a,0x82,0x5f,0xce,0xd9,0x5e,0xb0,0x33,0xaf,0xcd,0x64,0x31,0x40,0x75,0xab,0xfb,0x0a,0xbd,0x20,0xa9,0x70,0x89,0x25,0x03,0x43,0x6f,0x34,0xb8,0x63,},{0xd6,0xad,0xde,0xc5,0xaf,0xb0,0x52,0x8a,0xc1,0x7b,0xb1,0x78,0xd3,0xe7,0xf2,0x88,0x7f,0x9a,0xdb,0xb1,0xad,0x16,0xe1,0x10,0x54,0x5e,0xf3,0xbc,0x57,0xf9,0xde,0x23,0x14,0xa5,0xc8,0x38,0x8f,0x72,0x3b,0x89,0x07,0xbe,0x0f,0x3a,0xc9,0x0c,0x62,0x59,0xbb,0xe8,0x85,0xec,0xc1,0x76,0x45,0xdf,0x3d,0xb7,0xd4,0x88,0xf8,0x05,0xfa,0x08,},"\x42\x84\xab\xc5\x1b\xb6\x72\x35"}, +{{0xed,0xc6,0xf5,0xfb,0xdd,0x1c,0xee,0x4d,0x10,0x1c,0x06,0x35,0x30,0xa3,0x04,0x90,0xb2,0x21,0xbe,0x68,0xc0,0x36,0xf5,0xb0,0x7d,0x0f,0x95,0x3b,0x74,0x5d,0xf1,0x92,},{0xc1,0xa4,0x9c,0x66,0xe6,0x17,0xf9,0xef,0x5e,0xc6,0x6b,0xc4,0xc6,0x56,0x4c,0xa3,0x3d,0xe2,0xa5,0xfb,0x5e,0x14,0x64,0x06,0x2e,0x6d,0x6c,0x62,0x19,0x15,0x5e,0xfd,},{0x2c,0x76,0xa0,0x4a,0xf2,0x39,0x1c,0x14,0x70,0x82,0xe3,0x3f,0xaa,0xcd,0xbe,0x56,0x64,0x2a,0x1e,0x13,0x4b,0xd3,0x88,0x62,0x0b,0x85,0x2b,0x90,0x1a,0x6b,0xc1,0x6f,0xf6,0xc9,0xcc,0x94,0x04,0xc4,0x1d,0xea,0x12,0xed,0x28,0x1d,0xa0,0x67,0xa1,0x51,0x38,0x66,0xf9,0xd9,0x64,0xf8,0xbd,0xd2,0x49,0x53,0x85,0x6c,0x50,0x04,0x29,0x01,},"\x67\x2b\xf8\x96\x5d\x04\xbc\x51\x46"}, +{{0x4e,0x7d,0x21,0xfb,0x3b,0x18,0x97,0x57,0x1a,0x44,0x58,0x33,0xbe,0x0f,0x9f,0xd4,0x1c,0xd6,0x2b,0xe3,0xaa,0x04,0x04,0x0f,0x89,0x34,0xe1,0xfc,0xbd,0xca,0xcd,0x45,},{0x31,0xb2,0x52,0x4b,0x83,0x48,0xf7,0xab,0x1d,0xfa,0xfa,0x67,0x5c,0xc5,0x38,0xe9,0xa8,0x4e,0x3f,0xe5,0x81,0x9e,0x27,0xc1,0x2a,0xd8,0xbb,0xc1,0xa3,0x6e,0x4d,0xff,},{0x28,0xe4,0x59,0x8c,0x41,0x5a,0xe9,0xde,0x01,0xf0,0x3f,0x9f,0x3f,0xab,0x4e,0x91,0x9e,0x8b,0xf5,0x37,0xdd,0x2b,0x0c,0xdf,0x6e,0x79,0xb9,0xe6,0x55,0x9c,0x94,0x09,0xd9,0x15,0x1a,0x4c,0x40,0xf0,0x83,0x19,0x39,0x37,0x62,0x7c,0x36,0x94,0x88,0x25,0x9e,0x99,0xda,0x5a,0x9f,0x0a,0x87,0x49,0x7f,0xa6,0x69,0x6a,0x5d,0xd6,0xce,0x08,},"\x33\xd7\xa7\x86\xad\xed\x8c\x1b\xf6\x91"}, +{{0xa9,0x80,0xf8,0x92,0xdb,0x13,0xc9,0x9a,0x3e,0x89,0x71,0xe9,0x65,0xb2,0xff,0x3d,0x41,0xea,0xfd,0x54,0x09,0x3b,0xc9,0xf3,0x4d,0x1f,0xd2,0x2d,0x84,0x11,0x5b,0xb6,},{0x44,0xb5,0x7e,0xe3,0x0c,0xdb,0x55,0x82,0x9d,0x0a,0x5d,0x4f,0x04,0x6b,0xae,0xf0,0x78,0xf1,0xe9,0x7a,0x7f,0x21,0xb6,0x2d,0x75,0xf8,0xe9,0x6e,0xa1,0x39,0xc3,0x5f,},{0x77,0xd3,0x89,0xe5,0x99,0x63,0x0d,0x93,0x40,0x76,0x32,0x95,0x83,0xcd,0x41,0x05,0xa6,0x49,0xa9,0x29,0x2a,0xbc,0x44,0xcd,0x28,0xc4,0x00,0x00,0xc8,0xe2,0xf5,0xac,0x76,0x60,0xa8,0x1c,0x85,0xb7,0x2a,0xf8,0x45,0x2d,0x7d,0x25,0xc0,0x70,0x86,0x1d,0xae,0x91,0x60,0x1c,0x78,0x03,0xd6,0x56,0x53,0x16,0x50,0xdd,0x4e,0x5c,0x41,0x00,},"\x34\x86\xf6\x88\x48\xa6\x5a\x0e\xb5\x50\x7d"}, +{{0x5b,0x5a,0x61,0x9f,0x8c,0xe1,0xc6,0x6d,0x7c,0xe2,0x6e,0x5a,0x2a,0xe7,0xb0,0xc0,0x4f,0xeb,0xcd,0x34,0x6d,0x28,0x6c,0x92,0x9e,0x19,0xd0,0xd5,0x97,0x3b,0xfe,0xf9,},{0x6f,0xe8,0x36,0x93,0xd0,0x11,0xd1,0x11,0x13,0x1c,0x4f,0x3f,0xba,0xaa,0x40,0xa9,0xd3,0xd7,0x6b,0x30,0x01,0x2f,0xf7,0x3b,0xb0,0xe3,0x9e,0xc2,0x7a,0xb1,0x82,0x57,},{0x0f,0x9a,0xd9,0x79,0x30,0x33,0xa2,0xfa,0x06,0x61,0x4b,0x27,0x7d,0x37,0x38,0x1e,0x6d,0x94,0xf6,0x5a,0xc2,0xa5,0xa9,0x45,0x58,0xd0,0x9e,0xd6,0xce,0x92,0x22,0x58,0xc1,0xa5,0x67,0x95,0x2e,0x86,0x3a,0xc9,0x42,0x97,0xae,0xc3,0xc0,0xd0,0xc8,0xdd,0xf7,0x10,0x84,0xe5,0x04,0x86,0x0b,0xb6,0xba,0x27,0x44,0x9b,0x55,0xad,0xc4,0x0e,},"\x5a\x8d\x9d\x0a\x22\x35\x7e\x66\x55\xf9\xc7\x85"}, +{{0x94,0x0c,0x89,0xfe,0x40,0xa8,0x1d,0xaf,0xbd,0xb2,0x41,0x6d,0x14,0xae,0x46,0x91,0x19,0x86,0x97,0x44,0x41,0x0c,0x33,0x03,0xbf,0xaa,0x02,0x41,0xda,0xc5,0x78,0x00,},{0xa2,0xeb,0x8c,0x05,0x01,0xe3,0x0b,0xae,0x0c,0xf8,0x42,0xd2,0xbd,0xe8,0xde,0xc7,0x38,0x6f,0x6b,0x7f,0xc3,0x98,0x1b,0x8c,0x57,0xc9,0x79,0x2b,0xb9,0x4c,0xf2,0xdd,},{0xd8,0xbb,0x64,0xaa,0xd8,0xc9,0x95,0x5a,0x11,0x5a,0x79,0x3a,0xdd,0xd2,0x4f,0x7f,0x2b,0x07,0x76,0x48,0x71,0x4f,0x49,0xc4,0x69,0x4e,0xc9,0x95,0xb3,0x30,0xd0,0x9d,0x64,0x0d,0xf3,0x10,0xf4,0x47,0xfd,0x7b,0x6c,0xb5,0xc1,0x4f,0x9f,0xe9,0xf4,0x90,0xbc,0xf8,0xcf,0xad,0xbf,0xd2,0x16,0x9c,0x8a,0xc2,0x0d,0x3b,0x8a,0xf4,0x9a,0x0c,},"\xb8\x7d\x38\x13\xe0\x3f\x58\xcf\x19\xfd\x0b\x63\x95"}, +{{0x9a,0xca,0xd9,0x59,0xd2,0x16,0x21,0x2d,0x78,0x9a,0x11,0x92,0x52,0xeb,0xfe,0x0c,0x96,0x51,0x2a,0x23,0xc7,0x3b,0xd9,0xf3,0xb2,0x02,0x29,0x2d,0x69,0x16,0xa7,0x38,},{0xcf,0x3a,0xf8,0x98,0x46,0x7a,0x5b,0x7a,0x52,0xd3,0x3d,0x53,0xbc,0x03,0x7e,0x26,0x42,0xa8,0xda,0x99,0x69,0x03,0xfc,0x25,0x22,0x17,0xe9,0xc0,0x33,0xe2,0xf2,0x91,},{0x6e,0xe3,0xfe,0x81,0xe2,0x3c,0x60,0xeb,0x23,0x12,0xb2,0x00,0x6b,0x3b,0x25,0xe6,0x83,0x8e,0x02,0x10,0x66,0x23,0xf8,0x44,0xc4,0x4e,0xdb,0x8d,0xaf,0xd6,0x6a,0xb0,0x67,0x10,0x87,0xfd,0x19,0x5d,0xf5,0xb8,0xf5,0x8a,0x1d,0x6e,0x52,0xaf,0x42,0x90,0x80,0x53,0xd5,0x5c,0x73,0x21,0x01,0x00,0x92,0x74,0x87,0x95,0xef,0x94,0xcf,0x06,},"\x55\xc7\xfa\x43\x4f\x5e\xd8\xcd\xec\x2b\x7a\xea\xc1\x73"}, +{{0xd5,0xae,0xee,0x41,0xee,0xb0,0xe9,0xd1,0xbf,0x83,0x37,0xf9,0x39,0x58,0x7e,0xbe,0x29,0x61,0x61,0xe6,0xbf,0x52,0x09,0xf5,0x91,0xec,0x93,0x9e,0x14,0x40,0xc3,0x00,},{0xfd,0x2a,0x56,0x57,0x23,0x16,0x3e,0x29,0xf5,0x3c,0x9d,0xe3,0xd5,0xe8,0xfb,0xe3,0x6a,0x7a,0xb6,0x6e,0x14,0x39,0xec,0x4e,0xae,0x9c,0x0a,0x60,0x4a,0xf2,0x91,0xa5,},{0xf6,0x8d,0x04,0x84,0x7e,0x5b,0x24,0x97,0x37,0x89,0x9c,0x01,0x4d,0x31,0xc8,0x05,0xc5,0x00,0x7a,0x62,0xc0,0xa1,0x0d,0x50,0xbb,0x15,0x38,0xc5,0xf3,0x55,0x03,0x95,0x1f,0xbc,0x1e,0x08,0x68,0x2f,0x2c,0xc0,0xc9,0x2e,0xfe,0x8f,0x49,0x85,0xde,0xc6,0x1d,0xcb,0xd5,0x4d,0x4b,0x94,0xa2,0x25,0x47,0xd2,0x44,0x51,0x27,0x1c,0x8b,0x00,},"\x0a\x68\x8e\x79\xbe\x24\xf8\x66\x28\x6d\x46\x46\xb5\xd8\x1c"}, +{{0x0a,0x47,0xd1,0x04,0x52,0xae,0x2f,0xeb,0xec,0x51,0x8a,0x1c,0x7c,0x36,0x28,0x90,0xc3,0xfc,0x1a,0x49,0xd3,0x4b,0x03,0xb6,0x46,0x7d,0x35,0xc9,0x04,0xa8,0x36,0x2d,},{0x34,0xe5,0xa8,0x50,0x8c,0x47,0x43,0x74,0x69,0x62,0xc0,0x66,0xe4,0xba,0xde,0xa2,0x20,0x1b,0x8a,0xb4,0x84,0xde,0x5c,0x4f,0x94,0x47,0x6c,0xcd,0x21,0x43,0x95,0x5b,},{0x2a,0x3d,0x27,0xdc,0x40,0xd0,0xa8,0x12,0x79,0x49,0xa3,0xb7,0xf9,0x08,0xb3,0x68,0x8f,0x63,0xb7,0xf1,0x4f,0x65,0x1a,0xac,0xd7,0x15,0x94,0x0b,0xdb,0xe2,0x7a,0x08,0x09,0xaa,0xc1,0x42,0xf4,0x7a,0xb0,0xe1,0xe4,0x4f,0xa4,0x90,0xba,0x87,0xce,0x53,0x92,0xf3,0x3a,0x89,0x15,0x39,0xca,0xf1,0xef,0x4c,0x36,0x7c,0xae,0x54,0x50,0x0c,},"\xc9\x42\xfa\x7a\xc6\xb2\x3a\xb7\xff\x61\x2f\xdc\x8e\x68\xef\x39"}, +{{0xf8,0x14,0x8f,0x75,0x06,0xb7,0x75,0xef,0x46,0xfd,0xc8,0xe8,0xc7,0x56,0x51,0x68,0x12,0xd4,0x7d,0x6c,0xfb,0xfa,0x31,0x8c,0x27,0xc9,0xa2,0x26,0x41,0xe5,0x6f,0x17,},{0x04,0x45,0xe4,0x56,0xda,0xcc,0x7d,0x5b,0x0b,0xbe,0xd2,0x3c,0x82,0x00,0xcd,0xb7,0x4b,0xdc,0xb0,0x3e,0x4c,0x7b,0x73,0xf0,0xa2,0xb9,0xb4,0x6e,0xac,0x5d,0x43,0x72,},{0x36,0x53,0xcc,0xb2,0x12,0x19,0x20,0x2b,0x84,0x36,0xfb,0x41,0xa3,0x2b,0xa2,0x61,0x8c,0x4a,0x13,0x34,0x31,0xe6,0xe6,0x34,0x63,0xce,0xb3,0xb6,0x10,0x6c,0x4d,0x56,0xe1,0xd2,0xba,0x16,0x5b,0xa7,0x6e,0xaa,0xd3,0xdc,0x39,0xbf,0xfb,0x13,0x0f,0x1d,0xe3,0xd8,0xe6,0x42,0x7d,0xb5,0xb7,0x19,0x38,0xdb,0x4e,0x27,0x2b,0xc3,0xe2,0x0b,},"\x73\x68\x72\x4a\x5b\x0e\xfb\x57\xd2\x8d\x97\x62\x2d\xbd\xe7\x25\xaf"}, +{{0x77,0xf8,0x86,0x91,0xc4,0xef,0xf2,0x3e,0xbb,0x73,0x64,0x94,0x70,0x92,0x95,0x1a,0x5f,0xf3,0xf1,0x07,0x85,0xb4,0x17,0xe9,0x18,0x82,0x3a,0x55,0x2d,0xab,0x7c,0x75,},{0x74,0xd2,0x91,0x27,0xf1,0x99,0xd8,0x6a,0x86,0x76,0xae,0xc3,0x3b,0x4c,0xe3,0xf2,0x25,0xcc,0xb1,0x91,0xf5,0x2c,0x19,0x1c,0xcd,0x1e,0x8c,0xca,0x65,0x21,0x3a,0x6b,},{0xfb,0xe9,0x29,0xd7,0x43,0xa0,0x3c,0x17,0x91,0x05,0x75,0x49,0x2f,0x30,0x92,0xee,0x2a,0x2b,0xf1,0x4a,0x60,0xa3,0xfc,0xac,0xec,0x74,0xa5,0x8c,0x73,0x34,0x51,0x0f,0xc2,0x62,0xdb,0x58,0x27,0x91,0x32,0x2d,0x6c,0x8c,0x41,0xf1,0x70,0x0a,0xdb,0x80,0x02,0x7e,0xca,0xbc,0x14,0x27,0x0b,0x70,0x34,0x44,0xae,0x3e,0xe7,0x62,0x3e,0x0a,},"\xbd\x8e\x05\x03\x3f\x3a\x8b\xcd\xcb\xf4\xbe\xce\xb7\x09\x01\xc8\x2e\x31"}, +{{0xab,0x6f,0x7a,0xee,0x6a,0x08,0x37,0xb3,0x34,0xba,0x5e,0xb1,0xb2,0xad,0x7f,0xce,0xcf,0xab,0x7e,0x32,0x3c,0xab,0x18,0x7f,0xe2,0xe0,0xa9,0x5d,0x80,0xef,0xf1,0x32,},{0x5b,0x96,0xdc,0xa4,0x97,0x87,0x5b,0xf9,0x66,0x4c,0x5e,0x75,0xfa,0xcf,0x3f,0x9b,0xc5,0x4b,0xae,0x91,0x3d,0x66,0xca,0x15,0xee,0x85,0xf1,0x49,0x1c,0xa2,0x4d,0x2c,},{0x73,0xbc,0xa6,0x4e,0x9d,0xd0,0xdb,0x88,0x13,0x8e,0xed,0xfa,0xfc,0xea,0x8f,0x54,0x36,0xcf,0xb7,0x4b,0xfb,0x0e,0x77,0x33,0xcf,0x34,0x9b,0xaa,0x0c,0x49,0x77,0x5c,0x56,0xd5,0x93,0x4e,0x1d,0x38,0xe3,0x6f,0x39,0xb7,0xc5,0xbe,0xb0,0xa8,0x36,0x51,0x0c,0x45,0x12,0x6f,0x8e,0xc4,0xb6,0x81,0x05,0x19,0x90,0x5b,0x0c,0xa0,0x7c,0x09,},"\x81\x71\x45\x6f\x8b\x90\x71\x89\xb1\xd7\x79\xe2\x6b\xc5\xaf\xbb\x08\xc6\x7a"}, +{{0x8d,0x13,0x5d,0xe7,0xc8,0x41,0x1b,0xbd,0xbd,0x1b,0x31,0xe5,0xdc,0x67,0x8f,0x2a,0xc7,0x10,0x9e,0x79,0x2b,0x60,0xf3,0x8c,0xd2,0x49,0x36,0xe8,0xa8,0x98,0xc3,0x2d,},{0x1c,0xa2,0x81,0x93,0x85,0x29,0x89,0x65,0x35,0xa7,0x71,0x4e,0x35,0x84,0x08,0x5b,0x86,0xef,0x9f,0xec,0x72,0x3f,0x42,0x81,0x9f,0xc8,0xdd,0x5d,0x8c,0x00,0x81,0x7f,},{0xa1,0xad,0xc2,0xbc,0x6a,0x2d,0x98,0x06,0x62,0x67,0x7e,0x7f,0xdf,0xf6,0x42,0x4d,0xe7,0xdb,0xa5,0x0f,0x57,0x95,0xca,0x90,0xfd,0xf3,0xe9,0x6e,0x25,0x6f,0x32,0x85,0xca,0xc7,0x1d,0x33,0x60,0x48,0x2e,0x99,0x3d,0x02,0x94,0xba,0x4e,0xc7,0x44,0x0c,0x61,0xaf,0xfd,0xf3,0x5f,0xe8,0x3e,0x6e,0x04,0x26,0x39,0x37,0xdb,0x93,0xf1,0x05,},"\x8b\xa6\xa4\xc9\xa1\x5a\x24\x4a\x9c\x26\xbb\x2a\x59\xb1\x02\x6f\x21\x34\x8b\x49"}, +{{0x0e,0x76,0x5d,0x72,0x0e,0x70,0x5f,0x93,0x66,0xc1,0xab,0x8c,0x3f,0xa8,0x4c,0x9a,0x44,0x37,0x0c,0x06,0x96,0x9f,0x80,0x32,0x96,0x88,0x4b,0x28,0x46,0xa6,0x52,0xa4,},{0x7f,0xae,0x45,0xdd,0x0a,0x05,0x97,0x10,0x26,0xd4,0x10,0xbc,0x49,0x7a,0xf5,0xbe,0x7d,0x08,0x27,0xa8,0x2a,0x14,0x5c,0x20,0x3f,0x62,0x5d,0xfc,0xb8,0xb0,0x3b,0xa8,},{0xbb,0x61,0xcf,0x84,0xde,0x61,0x86,0x22,0x07,0xc6,0xa4,0x55,0x25,0x8b,0xc4,0xdb,0x4e,0x15,0xee,0xa0,0x31,0x7f,0xf8,0x87,0x18,0xb8,0x82,0xa0,0x6b,0x5c,0xf6,0xec,0x6f,0xd2,0x0c,0x5a,0x26,0x9e,0x5d,0x5c,0x80,0x5b,0xaf,0xbc,0xc5,0x79,0xe2,0x59,0x0a,0xf4,0x14,0xc7,0xc2,0x27,0x27,0x3c,0x10,0x2a,0x10,0x07,0x0c,0xdf,0xe8,0x0f,},"\x1d\x56\x6a\x62\x32\xbb\xaa\xb3\xe6\xd8\x80\x4b\xb5\x18\xa4\x98\xed\x0f\x90\x49\x86"}, +{{0xdb,0x36,0xe3,0x26,0xd6,0x76,0xc2,0xd1,0x9c,0xc8,0xfe,0x0c,0x14,0xb7,0x09,0x20,0x2e,0xcf,0xc7,0x61,0xd2,0x70,0x89,0xeb,0x6e,0xa4,0xb1,0xbb,0x02,0x1e,0xcf,0xa7,},{0x48,0x35,0x9b,0x85,0x0d,0x23,0xf0,0x71,0x5d,0x94,0xbb,0x8b,0xb7,0x5e,0x7e,0x14,0x32,0x2e,0xaf,0x14,0xf0,0x6f,0x28,0xa8,0x05,0x40,0x3f,0xbd,0xa0,0x02,0xfc,0x85,},{0xb6,0xdc,0xd0,0x99,0x89,0xdf,0xba,0xc5,0x43,0x22,0xa3,0xce,0x87,0x87,0x6e,0x1d,0x62,0x13,0x4d,0xa9,0x98,0xc7,0x9d,0x24,0xb5,0x0b,0xd7,0xa6,0xa7,0x97,0xd8,0x6a,0x0e,0x14,0xdc,0x9d,0x74,0x91,0xd6,0xc1,0x4a,0x67,0x3c,0x65,0x2c,0xfb,0xec,0x9f,0x96,0x2a,0x38,0xc9,0x45,0xda,0x3b,0x2f,0x08,0x79,0xd0,0xb6,0x8a,0x92,0x13,0x00,},"\x1b\x0a\xfb\x0a\xc4\xba\x9a\xb7\xb7\x17\x2c\xdd\xc9\xeb\x42\xbb\xa1\xa6\x4b\xce\x47\xd4"}, +{{0xc8,0x99,0x55,0xe0,0xf7,0x74,0x1d,0x90,0x5d,0xf0,0x73,0x0b,0x3d,0xc2,0xb0,0xce,0x1a,0x13,0x13,0x4e,0x44,0xfe,0xf3,0xd4,0x0d,0x60,0xc0,0x20,0xef,0x19,0xdf,0x77,},{0xfd,0xb3,0x06,0x73,0x40,0x2f,0xaf,0x1c,0x80,0x33,0x71,0x4f,0x35,0x17,0xe4,0x7c,0xc0,0xf9,0x1f,0xe7,0x0c,0xf3,0x83,0x6d,0x6c,0x23,0x63,0x6e,0x3f,0xd2,0x28,0x7c,},{0x7e,0xf6,0x6e,0x5e,0x86,0xf2,0x36,0x08,0x48,0xe0,0x01,0x4e,0x94,0x88,0x0a,0xe2,0x92,0x0a,0xd8,0xa3,0x18,0x5a,0x46,0xb3,0x5d,0x1e,0x07,0xde,0xa8,0xfa,0x8a,0xe4,0xf6,0xb8,0x43,0xba,0x17,0x4d,0x99,0xfa,0x79,0x86,0x65,0x4a,0x08,0x91,0xc1,0x2a,0x79,0x44,0x55,0x66,0x93,0x75,0xbf,0x92,0xaf,0x4c,0xc2,0x77,0x0b,0x57,0x9e,0x0c,},"\x50\x7c\x94\xc8\x82\x0d\x2a\x57\x93\xcb\xf3\x44\x2b\x3d\x71\x93\x6f\x35\xfe\x3a\xfe\xf3\x16"}, +{{0x4e,0x62,0x62,0x7f,0xc2,0x21,0x14,0x24,0x78,0xae,0xe7,0xf0,0x07,0x81,0xf8,0x17,0xf6,0x62,0xe3,0xb7,0x5d,0xb2,0x9b,0xb1,0x4a,0xb4,0x7c,0xf8,0xe8,0x41,0x04,0xd6,},{0xb1,0xd3,0x98,0x01,0x89,0x20,0x27,0xd5,0x8a,0x8c,0x64,0x33,0x51,0x63,0x19,0x58,0x93,0xbf,0xc1,0xb6,0x1d,0xbe,0xca,0x32,0x60,0x49,0x7e,0x1f,0x30,0x37,0x11,0x07,},{0x83,0x6a,0xfa,0x76,0x4d,0x9c,0x48,0xaa,0x47,0x70,0xa4,0x38,0x8b,0x65,0x4e,0x97,0xb3,0xc1,0x6f,0x08,0x29,0x67,0xfe,0xbc,0xa2,0x7f,0x2f,0xc4,0x7d,0xdf,0xd9,0x24,0x4b,0x03,0xcf,0xc7,0x29,0x69,0x8a,0xcf,0x51,0x09,0x70,0x43,0x46,0xb6,0x0b,0x23,0x0f,0x25,0x54,0x30,0x08,0x9d,0xdc,0x56,0x91,0x23,0x99,0xd1,0x12,0x2d,0xe7,0x0a,},"\xd3\xd6\x15\xa8\x47\x2d\x99\x62\xbb\x70\xc5\xb5\x46\x6a\x3d\x98\x3a\x48\x11\x04\x6e\x2a\x0e\xf5"}, +{{0x6b,0x83,0xd7,0xda,0x89,0x08,0xc3,0xe7,0x20,0x5b,0x39,0x86,0x4b,0x56,0xe5,0xf3,0xe1,0x71,0x96,0xa3,0xfc,0x9c,0x2f,0x58,0x05,0xaa,0xd0,0xf5,0x55,0x4c,0x14,0x2d,},{0xd0,0xc8,0x46,0xf9,0x7f,0xe2,0x85,0x85,0xc0,0xee,0x15,0x90,0x15,0xd6,0x4c,0x56,0x31,0x1c,0x88,0x6e,0xdd,0xcc,0x18,0x5d,0x29,0x6d,0xbb,0x16,0x5d,0x26,0x25,0xd6,},{0x16,0xe4,0x62,0xa2,0x9a,0x6d,0xd4,0x98,0x68,0x5a,0x37,0x18,0xb3,0xee,0xd0,0x0c,0xc1,0x59,0x86,0x01,0xee,0x47,0x82,0x04,0x86,0x03,0x2d,0x6b,0x9a,0xcc,0x9b,0xf8,0x9f,0x57,0x68,0x4e,0x08,0xd8,0xc0,0xf0,0x55,0x89,0xcd,0xa2,0x88,0x2a,0x05,0xdc,0x4c,0x63,0xf9,0xd0,0x43,0x1d,0x65,0x52,0x71,0x08,0x12,0x43,0x30,0x03,0xbc,0x08,},"\x6a\xda\x80\xb6\xfa\x84\xf7\x03\x49\x20\x78\x9e\x85\x36\xb8\x2d\x5e\x46\x78\x05\x9a\xed\x27\xf7\x1c"}, +{{0x19,0xa9,0x1f,0xe2,0x3a,0x4e,0x9e,0x33,0xec,0xc4,0x74,0x87,0x8f,0x57,0xc6,0x4c,0xf1,0x54,0xb3,0x94,0x20,0x34,0x87,0xa7,0x03,0x5e,0x1a,0xd9,0xcd,0x69,0x7b,0x0d,},{0x2b,0xf3,0x2b,0xa1,0x42,0xba,0x46,0x22,0xd8,0xf3,0xe2,0x9e,0xcd,0x85,0xee,0xa0,0x7b,0x9c,0x47,0xbe,0x9d,0x64,0x41,0x2c,0x9b,0x51,0x0b,0x27,0xdd,0x21,0x8b,0x23,},{0x88,0x1f,0x5b,0x8c,0x5a,0x03,0x0d,0xf0,0xf7,0x5b,0x66,0x34,0xb0,0x70,0xdd,0x27,0xbd,0x1e,0xe3,0xc0,0x87,0x38,0xae,0x34,0x93,0x38,0xb3,0xee,0x64,0x69,0xbb,0xf9,0x76,0x0b,0x13,0x57,0x8a,0x23,0x7d,0x51,0x82,0x53,0x5e,0xde,0x12,0x12,0x83,0x02,0x7a,0x90,0xb5,0xf8,0x65,0xd6,0x3a,0x65,0x37,0xdc,0xa0,0x7b,0x44,0x04,0x9a,0x0f,},"\x82\xcb\x53\xc4\xd5\xa0\x13\xba\xe5\x07\x07\x59\xec\x06\xc3\xc6\x95\x5a\xb7\xa4\x05\x09\x58\xec\x32\x8c"}, +{{0x1d,0x5b,0x8c,0xb6,0x21,0x5c,0x18,0x14,0x16,0x66,0xba,0xee,0xfc,0xf5,0xd6,0x9d,0xad,0x5b,0xea,0x9a,0x34,0x93,0xdd,0xda,0xa3,0x57,0xa4,0x39,0x7a,0x13,0xd4,0xde,},{0x94,0xd2,0x3d,0x97,0x7c,0x33,0xe4,0x9e,0x5e,0x49,0x92,0xc6,0x8f,0x25,0xec,0x99,0xa2,0x7c,0x41,0xce,0x6b,0x91,0xf2,0xbf,0xa0,0xcd,0x82,0x92,0xfe,0x96,0x28,0x35,},{0x3a,0xcd,0x39,0xbe,0xc8,0xc3,0xcd,0x2b,0x44,0x29,0x97,0x22,0xb5,0x85,0x0a,0x04,0x00,0xc1,0x44,0x35,0x90,0xfd,0x48,0x61,0xd5,0x9a,0xae,0x74,0x96,0xac,0xb3,0xdf,0x73,0xfc,0x3f,0xdf,0x79,0x69,0xae,0x5f,0x50,0xba,0x47,0xdd,0xdc,0x43,0x52,0x46,0xe5,0xfd,0x37,0x6f,0x6b,0x89,0x1c,0xd4,0xc2,0xca,0xf5,0xd6,0x14,0xb6,0x17,0x0c,},"\xa9\xa8\xcb\xb0\xad\x58\x51\x24\xe5\x22\xab\xbf\xb4\x05\x33\xbd\xd6\xf4\x93\x47\xb5\x5b\x18\xe8\x55\x8c\xb0"}, +{{0x6a,0x91,0xb3,0x22,0x7c,0x47,0x22,0x99,0x08,0x9b,0xdc,0xe9,0x35,0x6e,0x72,0x6a,0x40,0xef,0xd8,0x40,0xf1,0x10,0x02,0x70,0x8b,0x7e,0xe5,0x5b,0x64,0x10,0x5a,0xc2,},{0x9d,0x08,0x4a,0xa8,0xb9,0x7a,0x6b,0x9b,0xaf,0xa4,0x96,0xdb,0xc6,0xf7,0x6f,0x33,0x06,0xa1,0x16,0xc9,0xd9,0x17,0xe6,0x81,0x52,0x0a,0x0f,0x91,0x43,0x69,0x42,0x7e,},{0xf5,0x87,0x54,0x23,0x78,0x1b,0x66,0x21,0x6c,0xb5,0xe8,0x99,0x8d,0xe5,0xd9,0xff,0xc2,0x9d,0x1d,0x67,0x10,0x70,0x54,0xac,0xe3,0x37,0x45,0x03,0xa9,0xc3,0xef,0x81,0x15,0x77,0xf2,0x69,0xde,0x81,0x29,0x67,0x44,0xbd,0x70,0x6f,0x1a,0xc4,0x78,0xca,0xf0,0x9b,0x54,0xcd,0xf8,0x71,0xb3,0xf8,0x02,0xbd,0x57,0xf9,0xa6,0xcb,0x91,0x01,},"\x5c\xb6\xf9\xaa\x59\xb8\x0e\xca\x14\xf6\xa6\x8f\xb4\x0c\xf0\x7b\x79\x4e\x75\x17\x1f\xba\x96\x26\x2c\x1c\x6a\xdc"}, +{{0x93,0xea,0xa8,0x54,0xd7,0x91,0xf0,0x53,0x72,0xce,0x72,0xb9,0x4f,0xc6,0x50,0x3b,0x2f,0xf8,0xae,0x68,0x19,0xe6,0xa2,0x1a,0xfe,0x82,0x5e,0x27,0xad,0xa9,0xe4,0xfb,},{0x16,0xce,0xe8,0xa3,0xf2,0x63,0x18,0x34,0xc8,0x8b,0x67,0x08,0x97,0xff,0x0b,0x08,0xce,0x90,0xcc,0x14,0x7b,0x45,0x93,0xb3,0xf1,0xf4,0x03,0x72,0x7f,0x7e,0x7a,0xd5,},{0xd8,0x34,0x19,0x7c,0x1a,0x30,0x80,0x61,0x4e,0x0a,0x5f,0xa0,0xaa,0xaa,0x80,0x88,0x24,0xf2,0x1c,0x38,0xd6,0x92,0xe6,0xff,0xbd,0x20,0x0f,0x7d,0xfb,0x3c,0x8f,0x44,0x40,0x2a,0x73,0x82,0x18,0x0b,0x98,0xad,0x0a,0xfc,0x8e,0xec,0x1a,0x02,0xac,0xec,0xf3,0xcb,0x7f,0xde,0x62,0x7b,0x9f,0x18,0x11,0x1f,0x26,0x0a,0xb1,0xdb,0x9a,0x07,},"\x32\xfe\x27\x99\x41\x24\x20\x21\x53\xb5\xc7\x0d\x38\x13\xfd\xee\x9c\x2a\xa6\xe7\xdc\x74\x3d\x4d\x53\x5f\x18\x40\xa5"}, +{{0x94,0x1c,0xac,0x69,0xfb,0x7b,0x18,0x15,0xc5,0x7b,0xb9,0x87,0xc4,0xd6,0xc2,0xad,0x2c,0x35,0xd5,0xf9,0xa3,0x18,0x2a,0x79,0xd4,0xba,0x13,0xea,0xb2,0x53,0xa8,0xad,},{0x23,0xbe,0x32,0x3c,0x56,0x2d,0xfd,0x71,0xce,0x65,0xf5,0xbb,0xa5,0x6a,0x74,0xa3,0xa6,0xdf,0xc3,0x6b,0x57,0x3d,0x2f,0x94,0xf6,0x35,0xc7,0xf9,0xb4,0xfd,0x5a,0x5b,},{0x0f,0x8f,0xad,0x1e,0x6b,0xde,0x77,0x1b,0x4f,0x54,0x20,0xea,0xc7,0x5c,0x37,0x8b,0xae,0x6d,0xb5,0xac,0x66,0x50,0xcd,0x2b,0xc2,0x10,0xc1,0x82,0x3b,0x43,0x2b,0x48,0xe0,0x16,0xb1,0x05,0x95,0x45,0x8f,0xfa,0xb9,0x2f,0x7a,0x89,0x89,0xb2,0x93,0xce,0xb8,0xdf,0xed,0x6c,0x24,0x3a,0x20,0x38,0xfc,0x06,0x65,0x2a,0xaa,0xf1,0x6f,0x02,},"\xbb\x31\x72\x79\x57\x10\xfe\x00\x05\x4d\x3b\x5d\xfe\xf8\xa1\x16\x23\x58\x2d\xa6\x8b\xf8\xe4\x6d\x72\xd2\x7c\xec\xe2\xaa"}, +{{0x1a,0xcd,0xbb,0x79,0x3b,0x03,0x84,0x93,0x46,0x27,0x47,0x0d,0x79,0x5c,0x3d,0x1d,0xd4,0xd7,0x9c,0xea,0x59,0xef,0x98,0x3f,0x29,0x5b,0x9b,0x59,0x17,0x9c,0xbb,0x28,},{0x3f,0x60,0xc7,0x54,0x1a,0xfa,0x76,0xc0,0x19,0xcf,0x5a,0xa8,0x2d,0xcd,0xb0,0x88,0xed,0x9e,0x4e,0xd9,0x78,0x05,0x14,0xae,0xfb,0x37,0x9d,0xab,0xc8,0x44,0xf3,0x1a,},{0xbe,0x71,0xef,0x48,0x06,0xcb,0x04,0x1d,0x88,0x5e,0xff,0xd9,0xe6,0xb0,0xfb,0xb7,0x3d,0x65,0xd7,0xcd,0xec,0x47,0xa8,0x9c,0x8a,0x99,0x48,0x92,0xf4,0xe5,0x5a,0x56,0x8c,0x4c,0xc7,0x8d,0x61,0xf9,0x01,0xe8,0x0d,0xbb,0x62,0x8b,0x86,0xa2,0x3c,0xcd,0x59,0x4e,0x71,0x2b,0x57,0xfa,0x94,0xc2,0xd6,0x7e,0xc2,0x66,0x34,0x87,0x85,0x07,},"\x7c\xf3\x4f\x75\xc3\xda\xc9\xa8\x04\xd0\xfc\xd0\x9e\xba\x9b\x29\xc9\x48\x4e\x8a\x01\x8f\xa9\xe0\x73\x04\x2d\xf8\x8e\x3c\x56"}, +{{0x8e,0xd7,0xa7,0x97,0xb9,0xce,0xa8,0xa8,0x37,0x0d,0x41,0x91,0x36,0xbc,0xdf,0x68,0x3b,0x75,0x9d,0x2e,0x3c,0x69,0x47,0xf1,0x7e,0x13,0xe2,0x48,0x5a,0xa9,0xd4,0x20,},{0xb4,0x9f,0x3a,0x78,0xb1,0xc6,0xa7,0xfc,0xa8,0xf3,0x46,0x6f,0x33,0xbc,0x0e,0x92,0x9f,0x01,0xfb,0xa0,0x43,0x06,0xc2,0xa7,0x46,0x5f,0x46,0xc3,0x75,0x93,0x16,0xd9,},{0x04,0x26,0x6c,0x03,0x3b,0x91,0xc1,0x32,0x2c,0xeb,0x34,0x46,0xc9,0x01,0xff,0xcf,0x3c,0xc4,0x0c,0x40,0x34,0xe8,0x87,0xc9,0x59,0x7c,0xa1,0x89,0x3b,0xa7,0x33,0x0b,0xec,0xbb,0xd8,0xb4,0x81,0x42,0xef,0x35,0xc0,0x12,0xc6,0xba,0x51,0xa6,0x6d,0xf9,0x30,0x8c,0xb6,0x26,0x8a,0xd6,0xb1,0xe4,0xb0,0x3e,0x70,0x10,0x24,0x95,0x79,0x0b,},"\xa7\x50\xc2\x32\x93\x3d\xc1\x4b\x11\x84\xd8\x6d\x8b\x4c\xe7\x2e\x16\xd6\x97\x44\xba\x69\x81\x8b\x6a\xc3\x3b\x1d\x82\x3b\xb2\xc3"}, +{{0xf2,0xab,0x39,0x6f,0xe8,0x90,0x6e,0x3e,0x56,0x33,0xe9,0x9c,0xab,0xcd,0x5b,0x09,0xdf,0x08,0x59,0xb5,0x16,0x23,0x0b,0x1e,0x04,0x50,0xb5,0x80,0xb6,0x5f,0x61,0x6c,},{0x8e,0xa0,0x74,0x24,0x51,0x59,0xa1,0x16,0xaa,0x71,0x22,0xa2,0x5e,0xc1,0x6b,0x89,0x1d,0x62,0x5a,0x68,0xf3,0x36,0x60,0x42,0x39,0x08,0xf6,0xbd,0xc4,0x4f,0x8c,0x1b,},{0xa0,0x6a,0x23,0xd9,0x82,0xd8,0x1a,0xb8,0x83,0xaa,0xe2,0x30,0xad,0xbc,0x36,0x8a,0x6a,0x99,0x77,0xf0,0x03,0xce,0xbb,0x00,0xd4,0xc2,0xe4,0x01,0x84,0x90,0x19,0x1a,0x84,0xd3,0xa2,0x82,0xfd,0xbf,0xb2,0xfc,0x88,0x04,0x6e,0x62,0xde,0x43,0xe1,0x5f,0xb5,0x75,0x33,0x6b,0x3c,0x8b,0x77,0xd1,0x9c,0xe6,0xa0,0x09,0xce,0x51,0xf5,0x0c,},"\x5a\x44\xe3\x4b\x74\x6c\x5f\xd1\x89\x8d\x55\x2a\xb3\x54\xd2\x8f\xb4\x71\x38\x56\xd7\x69\x7d\xd6\x3e\xb9\xbd\x6b\x99\xc2\x80\xe1\x87"}, +{{0x55,0x0a,0x41,0xc0,0x13,0xf7,0x9b,0xab,0x8f,0x06,0xe4,0x3a,0xd1,0x83,0x6d,0x51,0x31,0x27,0x36,0xa9,0x71,0x38,0x06,0xfa,0xfe,0x66,0x45,0x21,0x9e,0xaa,0x1f,0x9d,},{0xaf,0x6b,0x71,0x45,0x47,0x4d,0xc9,0x95,0x4b,0x9a,0xf9,0x3a,0x9c,0xdb,0x34,0x44,0x9d,0x5b,0x7c,0x65,0x1c,0x82,0x4d,0x24,0xe2,0x30,0xb9,0x00,0x33,0xce,0x59,0xc0,},{0x16,0xdc,0x1e,0x2b,0x9f,0xa9,0x09,0xee,0xfd,0xc2,0x77,0xba,0x16,0xeb,0xe2,0x07,0xb8,0xda,0x5e,0x91,0x14,0x3c,0xde,0x78,0xc5,0x04,0x7a,0x89,0xf6,0x81,0xc3,0x3c,0x4e,0x4e,0x34,0x28,0xd5,0xc9,0x28,0x09,0x59,0x03,0xa8,0x11,0xec,0x00,0x2d,0x52,0xa3,0x9e,0xd7,0xf8,0xb3,0xfe,0x19,0x27,0x20,0x0c,0x6d,0xd0,0xb9,0xab,0x3e,0x04,},"\x8b\xc4\x18\x5e\x50\xe5\x7d\x5f\x87\xf4\x75\x15\xfe\x2b\x18\x37\xd5\x85\xf0\xaa\xe9\xe1\xca\x38\x3b\x3e\xc9\x08\x88\x4b\xb9\x00\xff\x27"}, +{{0x19,0xac,0x3e,0x27,0x24,0x38,0xc7,0x2d,0xdf,0x7b,0x88,0x19,0x64,0x86,0x7c,0xb3,0xb3,0x1f,0xf4,0xc7,0x93,0xbb,0x7e,0xa1,0x54,0x61,0x3c,0x1d,0xb0,0x68,0xcb,0x7e,},{0xf8,0x5b,0x80,0xe0,0x50,0xa1,0xb9,0x62,0x0d,0xb1,0x38,0xbf,0xc9,0xe1,0x00,0x32,0x7e,0x25,0xc2,0x57,0xc5,0x92,0x17,0xb6,0x01,0xf1,0xf6,0xac,0x9a,0x41,0x3d,0x3f,},{0xea,0x85,0x5d,0x78,0x1c,0xbe,0xa4,0x68,0x2e,0x35,0x01,0x73,0xcb,0x89,0xe8,0x61,0x9c,0xcf,0xdd,0xb9,0x7c,0xdc,0xe1,0x6f,0x9a,0x2f,0x6f,0x68,0x92,0xf4,0x6d,0xbe,0x68,0xe0,0x4b,0x12,0xb8,0xd8,0x86,0x89,0xa7,0xa3,0x16,0x70,0xcd,0xff,0x40,0x9a,0xf9,0x8a,0x93,0xb4,0x9a,0x34,0x53,0x7b,0x6a,0xa0,0x09,0xd2,0xeb,0x8b,0x47,0x01,},"\x95\x87\x2d\x5f\x78\x9f\x95\x48\x4e\x30\xcb\xb0\xe1\x14\x02\x89\x53\xb1\x6f\x5c\x6a\x8d\x9f\x65\xc0\x03\xa8\x35\x43\xbe\xaa\x46\xb3\x86\x45"}, +{{0xca,0x26,0x7d,0xe9,0x6c,0x93,0xc2,0x38,0xfa,0xfb,0x12,0x79,0x81,0x20,0x59,0xab,0x93,0xac,0x03,0x05,0x96,0x57,0xfd,0x99,0x4f,0x8f,0xa5,0xa0,0x92,0x39,0xc8,0x21,},{0x01,0x73,0x70,0xc8,0x79,0x09,0x0a,0x81,0xc7,0xf2,0x72,0xc2,0xfc,0x80,0xe3,0xaa,0xc2,0xbc,0x60,0x3f,0xcb,0x37,0x9a,0xfc,0x98,0x69,0x11,0x60,0xab,0x74,0x5b,0x26,},{0xac,0x95,0x7f,0x82,0x33,0x5a,0xa7,0x14,0x1e,0x96,0xb5,0x9d,0x63,0xe3,0xcc,0xee,0x95,0xc3,0xa2,0xc4,0x7d,0x02,0x65,0x40,0xc2,0xaf,0x42,0xdc,0x95,0x33,0xd5,0xfd,0x81,0x82,0x7d,0x16,0x79,0xad,0x18,0x7a,0xea,0xf3,0x78,0x34,0x91,0x5e,0x75,0xb1,0x47,0xa9,0x28,0x68,0x06,0xc8,0x01,0x75,0x16,0xba,0x43,0xdd,0x05,0x1a,0x5e,0x0c,},"\xe0\x5f\x71\xe4\xe4\x9a\x72\xec\x55\x0c\x44\xa3\xb8\x5a\xca\x8f\x20\xff\x26\xc3\xee\x94\xa8\x0f\x1b\x43\x1c\x7d\x15\x4e\xc9\x60\x3e\xe0\x25\x31"}, +{{0x3d,0xff,0x5e,0x89,0x94,0x75,0xe7,0xe9,0x1d,0xd2,0x61,0x32,0x2f,0xab,0x09,0x98,0x0c,0x52,0x97,0x0d,0xe1,0xda,0x6e,0x2e,0x20,0x16,0x60,0xcc,0x4f,0xce,0x70,0x32,},{0xf3,0x01,0x62,0xba,0xc9,0x84,0x47,0xc4,0x04,0x2f,0xac,0x05,0xda,0x44,0x80,0x34,0x62,0x9b,0xe2,0xc6,0xa5,0x8d,0x30,0xdf,0xd5,0x78,0xba,0x9f,0xb5,0xe3,0x93,0x0b,},{0x5e,0xfe,0x7a,0x92,0xff,0x96,0x23,0x08,0x9b,0x3e,0x3b,0x78,0xf3,0x52,0x11,0x53,0x66,0xe2,0x6b,0xa3,0xfb,0x1a,0x41,0x62,0x09,0xbc,0x02,0x9e,0x9c,0xad,0xcc,0xd9,0xf4,0xaf,0xfa,0x33,0x35,0x55,0xa8,0xf3,0xa3,0x5a,0x9d,0x0f,0x7c,0x34,0xb2,0x92,0xca,0xe7,0x7e,0xc9,0x6f,0xa3,0xad,0xfc,0xaa,0xde,0xe2,0xd9,0xce,0xd8,0xf8,0x05,},"\x93\x8f\x0e\x77\x62\x1b\xf3\xea\x52\xc7\xc4\x91\x1c\x51\x57\xc2\xd8\xa2\xa8\x58\x09\x3e\xf1\x6a\xa9\xb1\x07\xe6\x9d\x98\x03\x7b\xa1\x39\xa3\xc3\x82"}, +{{0x9a,0x6b,0x84,0x78,0x64,0xe7,0x0c,0xfe,0x8b,0xa6,0xab,0x22,0xfa,0x0c,0xa3,0x08,0xc0,0xcc,0x8b,0xec,0x71,0x41,0xfb,0xca,0xa3,0xb8,0x1f,0x5d,0x1e,0x1c,0xfc,0xfc,},{0x34,0xad,0x0f,0xbd,0xb2,0x56,0x65,0x07,0xa8,0x1c,0x2b,0x1f,0x8a,0xa8,0xf5,0x3d,0xcc,0xaa,0x64,0xcc,0x87,0xad,0xa9,0x1b,0x90,0x3e,0x90,0x0d,0x07,0xee,0xe9,0x30,},{0x2a,0xb2,0x55,0x16,0x9c,0x48,0x9c,0x54,0xc7,0x32,0x23,0x2e,0x37,0xc8,0x73,0x49,0xd4,0x86,0xb1,0xeb,0xa2,0x05,0x09,0xdb,0xab,0xe7,0xfe,0xd3,0x29,0xef,0x08,0xfd,0x75,0xba,0x1c,0xd1,0x45,0xe6,0x7b,0x2e,0xa2,0x6c,0xb5,0xcc,0x51,0xca,0xb3,0x43,0xee,0xb0,0x85,0xfe,0x1f,0xd7,0xb0,0xec,0x4c,0x6a,0xfc,0xd9,0xb9,0x79,0xf9,0x05,},"\x83\x83\x67\x47\x11\x83\xc7\x1f\x7e\x71\x77\x24\xf8\x9d\x40\x1c\x3a\xd9\x86\x3f\xd9\xcc\x7a\xa3\xcf\x33\xd3\xc5\x29\x86\x0c\xb5\x81\xf3\x09\x3d\x87\xda"}, +{{0x57,0x5b,0xe0,0x7a,0xfc,0xa5,0xd0,0x63,0xc2,0x38,0xcd,0x9b,0x80,0x28,0x77,0x2c,0xc4,0x9c,0xda,0x34,0x47,0x14,0x32,0xa2,0xe1,0x66,0xe0,0x96,0xe2,0x21,0x9e,0xfc,},{0x94,0xe5,0xeb,0x4d,0x50,0x24,0xf4,0x9d,0x7e,0xbf,0x79,0x81,0x7c,0x8d,0xe1,0x14,0x97,0xdc,0x2b,0x55,0x62,0x2a,0x51,0xae,0x12,0x3f,0xfc,0x74,0x9d,0xbb,0x16,0xe0,},{0x58,0x27,0x1d,0x44,0x23,0x6f,0x3b,0x98,0xc5,0x8f,0xd7,0xae,0x0d,0x2f,0x49,0xef,0x2b,0x6e,0x3a,0xff,0xdb,0x22,0x5a,0xa3,0xba,0x55,0x5f,0x0e,0x11,0xcc,0x53,0xc2,0x3a,0xd1,0x9b,0xaf,0x24,0x34,0x65,0x90,0xd0,0x5d,0x7d,0x53,0x90,0x58,0x20,0x82,0xcf,0x94,0xd3,0x9c,0xad,0x65,0x30,0xab,0x93,0xd1,0x3e,0xfb,0x39,0x27,0x95,0x06,},"\x33\xe5\x91\x8b\x66\xd3\x3d\x55\xfe\x71\x7c\xa3\x43\x83\xea\xe7\x8f\x0a\xf8\x28\x89\xca\xf6\x69\x6e\x1a\xc9\xd9\x5d\x1f\xfb\x32\xcb\xa7\x55\xf9\xe3\x50\x3e"}, +{{0x15,0xff,0xb4,0x55,0x14,0xd4,0x34,0x44,0xd6,0x1f,0xcb,0x10,0x5e,0x30,0xe1,0x35,0xfd,0x26,0x85,0x23,0xdd,0xa2,0x0b,0x82,0x75,0x8b,0x17,0x94,0x23,0x11,0x04,0x41,},{0x17,0x72,0xc5,0xab,0xc2,0xd2,0x3f,0xd2,0xf9,0xd1,0xc3,0x25,0x7b,0xe7,0xbc,0x3c,0x1c,0xd7,0x9c,0xee,0x40,0x84,0x4b,0x74,0x9b,0x3a,0x77,0x43,0xd2,0xf9,0x64,0xb8,},{0x68,0x28,0xcd,0x76,0x24,0xe7,0x93,0xb8,0xa4,0xce,0xb9,0x6d,0x3c,0x2a,0x97,0x5b,0xf7,0x73,0xe5,0xff,0x66,0x45,0xf3,0x53,0x61,0x40,0x58,0x62,0x1e,0x58,0x83,0x52,0x89,0xe7,0xf3,0x1f,0x42,0xdf,0xe6,0xaf,0x6d,0x73,0x6f,0x26,0x44,0x51,0x1e,0x32,0x0c,0x0f,0xa6,0x98,0x58,0x2a,0x79,0x77,0x8d,0x18,0x73,0x0e,0xd3,0xe8,0xcb,0x08,},"\xda\x9c\x55\x59\xd0\xea\x51\xd2\x55\xb6\xbd\x9d\x76\x38\xb8\x76\x47\x2f\x94\x2b\x33\x0f\xc0\xe2\xb3\x0a\xea\x68\xd7\x73\x68\xfc\xe4\x94\x82\x72\x99\x1d\x25\x7e"}, +{{0xfe,0x05,0x68,0x64,0x29,0x43,0xb2,0xe1,0xaf,0xbf,0xd1,0xf1,0x0f,0xe8,0xdf,0x87,0xa4,0x23,0x6b,0xea,0x40,0xdc,0xe7,0x42,0x07,0x2c,0xb2,0x18,0x86,0xee,0xc1,0xfa,},{0x29,0x9e,0xbd,0x1f,0x13,0x17,0x7d,0xbd,0xb6,0x6a,0x91,0x2b,0xbf,0x71,0x20,0x38,0xfd,0xf7,0x3b,0x06,0xc3,0xac,0x02,0x0c,0x7b,0x19,0x12,0x67,0x55,0xd4,0x7f,0x61,},{0xd5,0x9e,0x6d,0xfc,0xc6,0xd7,0xe3,0xe2,0xc5,0x8d,0xec,0x81,0xe9,0x85,0xd2,0x45,0xe6,0x81,0xac,0xf6,0x59,0x4a,0x23,0xc5,0x92,0x14,0xf7,0xbe,0xd8,0x01,0x5d,0x81,0x3c,0x76,0x82,0xb6,0x0b,0x35,0x83,0x44,0x03,0x11,0xe7,0x2a,0x86,0x65,0xba,0x2c,0x96,0xde,0xc2,0x3c,0xe8,0x26,0xe1,0x60,0x12,0x7e,0x18,0x13,0x2b,0x03,0x04,0x04,},"\xc5\x9d\x08\x62\xec\x1c\x97\x46\xab\xcc\x3c\xf8\x3c\x9e\xeb\xa2\xc7\x08\x2a\x03\x6a\x8c\xb5\x7c\xe4\x87\xe7\x63\x49\x27\x96\xd4\x7e\x6e\x06\x3a\x0c\x1f\xec\xcc\x2d"}, +{{0x5e,0xcb,0x16,0xc2,0xdf,0x27,0xc8,0xcf,0x58,0xe4,0x36,0xa9,0xd3,0xaf,0xfb,0xd5,0x8e,0x95,0x38,0xa9,0x26,0x59,0xa0,0xf9,0x7c,0x4c,0x4f,0x99,0x46,0x35,0xa8,0xca,},{0xda,0x76,0x8b,0x20,0xc4,0x37,0xdd,0x3a,0xa5,0xf8,0x4b,0xb6,0xa0,0x77,0xff,0xa3,0x4a,0xb6,0x85,0x01,0xc5,0x35,0x2b,0x5c,0xc3,0xfd,0xce,0x7f,0xe6,0xc2,0x39,0x8d,},{0x1c,0x72,0x3a,0x20,0xc6,0x77,0x24,0x26,0xa6,0x70,0xe4,0xd5,0xc4,0xa9,0x7c,0x6e,0xbe,0x91,0x47,0xf7,0x1b,0xb0,0xa4,0x15,0x63,0x1e,0x44,0x40,0x6e,0x29,0x03,0x22,0xe4,0xca,0x97,0x7d,0x34,0x8f,0xe7,0x85,0x6a,0x8e,0xdc,0x23,0x5d,0x0f,0xe9,0x5f,0x7e,0xd9,0x1a,0xef,0xdd,0xf2,0x8a,0x77,0xe2,0xc7,0xdb,0xfd,0x8f,0x55,0x2f,0x0a,},"\x56\xf1\x32\x9d\x9a\x6b\xe2\x5a\x61\x59\xc7\x2f\x12\x68\x8d\xc8\x31\x4e\x85\xdd\x9e\x7e\x4d\xc0\x5b\xbe\xcb\x77\x29\xe0\x23\xc8\x6f\x8e\x09\x37\x35\x3f\x27\xc7\xed\xe9"}, +{{0xd5,0x99,0xd6,0x37,0xb3,0xc3,0x0a,0x82,0xa9,0x98,0x4e,0x2f,0x75,0x84,0x97,0xd1,0x44,0xde,0x6f,0x06,0xb9,0xfb,0xa0,0x4d,0xd4,0x0f,0xd9,0x49,0x03,0x9d,0x7c,0x84,},{0x67,0x91,0xd8,0xce,0x50,0xa4,0x46,0x89,0xfc,0x17,0x87,0x27,0xc5,0xc3,0xa1,0xc9,0x59,0xfb,0xee,0xd7,0x4e,0xf7,0xd8,0xe7,0xbd,0x3c,0x1a,0xb4,0xda,0x31,0xc5,0x1f,},{0xeb,0xf1,0x0d,0x9a,0xc7,0xc9,0x61,0x08,0x14,0x0e,0x7d,0xef,0x6f,0xe9,0x53,0x3d,0x72,0x76,0x46,0xff,0x5b,0x3a,0xf2,0x73,0xc1,0xdf,0x95,0x76,0x2a,0x66,0xf3,0x2b,0x65,0xa0,0x96,0x34,0xd0,0x13,0xf5,0x4b,0x5d,0xd6,0x01,0x1f,0x91,0xbc,0x33,0x6c,0xa8,0xb3,0x55,0xce,0x33,0xf8,0xcf,0xbe,0xc2,0x53,0x5a,0x4c,0x42,0x7f,0x82,0x05,},"\xa7\xc0\x4e\x8b\xa7\x5d\x0a\x03\xd8\xb1\x66\xad\x7a\x1d\x77\xe1\xb9\x1c\x7a\xaf\x7b\xef\xdd\x99\x31\x1f\xc3\xc5\x4a\x68\x4d\xdd\x97\x1d\x5b\x32\x11\xc3\xee\xaf\xf1\xe5\x4e"}, +{{0x30,0xab,0x82,0x32,0xfa,0x70,0x18,0xf0,0xce,0x6c,0x39,0xbd,0x8f,0x78,0x2f,0xe2,0xe1,0x59,0x75,0x8b,0xb0,0xf2,0xf4,0x38,0x6c,0x7f,0x28,0xcf,0xd2,0xc8,0x58,0x98,},{0xec,0xfb,0x6a,0x2b,0xd4,0x2f,0x31,0xb6,0x12,0x50,0xba,0x5d,0xe7,0xe4,0x6b,0x47,0x19,0xaf,0xdf,0xbc,0x66,0x0d,0xb7,0x1a,0x7b,0xd1,0xdf,0x7b,0x0a,0x3a,0xbe,0x37,},{0x9a,0xf8,0x85,0x34,0x4c,0xc7,0x23,0x94,0x98,0xf7,0x12,0xdf,0x80,0xbc,0x01,0xb8,0x06,0x38,0x29,0x1e,0xd4,0xa1,0xd2,0x8b,0xaa,0x55,0x45,0x01,0x7a,0x72,0xe2,0xf6,0x56,0x49,0xcc,0xf9,0x60,0x3d,0xa6,0xeb,0x5b,0xfa,0xb9,0xf5,0x54,0x3a,0x6c,0xa4,0xa7,0xaf,0x38,0x66,0x15,0x3c,0x76,0xbf,0x66,0xbf,0x95,0xde,0xf6,0x15,0xb0,0x0c,},"\x63\xb8\x0b\x79\x56\xac\xbe\xcf\x0c\x35\xe9\xab\x06\xb9\x14\xb0\xc7\x01\x4f\xe1\xa4\xbb\xc0\x21\x72\x40\xc1\xa3\x30\x95\xd7\x07\x95\x3e\xd7\x7b\x15\xd2\x11\xad\xaf\x9b\x97\xdc"}, +{{0x0d,0xdc,0xdc,0x87,0x2c,0x7b,0x74,0x8d,0x40,0xef,0xe9,0x6c,0x28,0x81,0xae,0x18,0x9d,0x87,0xf5,0x61,0x48,0xed,0x8a,0xf3,0xeb,0xbb,0xc8,0x03,0x24,0xe3,0x8b,0xdd,},{0x58,0x8d,0xda,0xdc,0xbc,0xed,0xf4,0x0d,0xf0,0xe9,0x69,0x7d,0x8b,0xb2,0x77,0xc7,0xbb,0x14,0x98,0xfa,0x1d,0x26,0xce,0x0a,0x83,0x5a,0x76,0x0b,0x92,0xca,0x7c,0x85,},{0xc1,0x79,0xc0,0x94,0x56,0xe2,0x35,0xfe,0x24,0x10,0x5a,0xfa,0x6e,0x8e,0xc0,0x46,0x37,0xf8,0xf9,0x43,0x81,0x7c,0xd0,0x98,0xba,0x95,0x38,0x7f,0x96,0x53,0xb2,0xad,0xd1,0x81,0xa3,0x14,0x47,0xd9,0x2d,0x1a,0x1d,0xdf,0x1c,0xeb,0x0d,0xb6,0x21,0x18,0xde,0x9d,0xff,0xb7,0xdc,0xd2,0x42,0x40,0x57,0xcb,0xdf,0xf5,0xd4,0x1d,0x04,0x03,},"\x65\x64\x1c\xd4\x02\xad\xd8\xbf\x3d\x1d\x67\xdb\xeb\x6d\x41\xde\xbf\xbe\xf6\x7e\x43\x17\xc3\x5b\x0a\x6d\x5b\xbb\xae\x0e\x03\x4d\xe7\xd6\x70\xba\x14\x13\xd0\x56\xf2\xd6\xf1\xde\x12"}, +{{0x89,0xf0,0xd6,0x82,0x99,0xba,0x0a,0x5a,0x83,0xf2,0x48,0xae,0x0c,0x16,0x9f,0x8e,0x38,0x49,0xa9,0xb4,0x7b,0xd4,0x54,0x98,0x84,0x30,0x5c,0x99,0x12,0xb4,0x66,0x03,},{0xab,0xa3,0xe7,0x95,0xaa,0xb2,0x01,0x2a,0xcc,0xea,0xdd,0x7b,0x3b,0xd9,0xda,0xee,0xed,0x6f,0xf5,0x25,0x8b,0xdc,0xd7,0xc9,0x36,0x99,0xc2,0xa3,0x83,0x6e,0x38,0x32,},{0x2c,0x69,0x1f,0xa8,0xd4,0x87,0xce,0x20,0xd5,0xd2,0xfa,0x41,0x55,0x91,0x16,0xe0,0xbb,0xf4,0x39,0x7c,0xf5,0x24,0x0e,0x15,0x25,0x56,0x18,0x35,0x41,0xd6,0x6c,0xf7,0x53,0x58,0x24,0x01,0xa4,0x38,0x8d,0x39,0x03,0x39,0xdb,0xef,0x4d,0x38,0x47,0x43,0xca,0xa3,0x46,0xf5,0x5f,0x8d,0xab,0xa6,0x8b,0xa7,0xb9,0x13,0x1a,0x8a,0x6e,0x0b,},"\x4f\x18\x46\xdd\x7a\xd5\x0e\x54\x5d\x4c\xfb\xff\xbb\x1d\xc2\xff\x14\x5d\xc1\x23\x75\x4d\x08\xaf\x4e\x44\xec\xc0\xbc\x8c\x91\x41\x13\x88\xbc\x76\x53\xe2\xd8\x93\xd1\xea\xc2\x10\x7d\x05"}, +{{0x0a,0x3c,0x18,0x44,0xe2,0xdb,0x07,0x0f,0xb2,0x4e,0x3c,0x95,0xcb,0x1c,0xc6,0x71,0x4e,0xf8,0x4e,0x2c,0xcd,0x2b,0x9d,0xd2,0xf1,0x46,0x0e,0xbf,0x7e,0xcf,0x13,0xb1,},{0x72,0xe4,0x09,0x93,0x7e,0x06,0x10,0xeb,0x5c,0x20,0xb3,0x26,0xdc,0x6e,0xa1,0xbb,0xbc,0x04,0x06,0x70,0x1c,0x5c,0xd6,0x7d,0x1f,0xbd,0xe0,0x91,0x92,0xb0,0x7c,0x01,},{0x87,0xf7,0xfd,0xf4,0x60,0x95,0x20,0x1e,0x87,0x7a,0x58,0x8f,0xe3,0xe5,0xaa,0xf4,0x76,0xbd,0x63,0x13,0x8d,0x8a,0x87,0x8b,0x89,0xd6,0xac,0x60,0x63,0x1b,0x34,0x58,0xb9,0xd4,0x1a,0x3c,0x61,0xa5,0x88,0xe1,0xdb,0x8d,0x29,0xa5,0x96,0x89,0x81,0xb0,0x18,0x77,0x6c,0x58,0x87,0x80,0x92,0x2f,0x5a,0xa7,0x32,0xba,0x63,0x79,0xdd,0x05,},"\x4c\x82\x74\xd0\xed\x1f\x74\xe2\xc8\x6c\x08\xd9\x55\xbd\xe5\x5b\x2d\x54\x32\x7e\x82\x06\x2a\x1f\x71\xf7\x0d\x53\x6f\xdc\x87\x22\xcd\xea\xd7\xd2\x2a\xae\xad\x2b\xfa\xa1\xad\x00\xb8\x29\x57"}, +{{0xc8,0xd7,0xa8,0x81,0x8b,0x98,0xdf,0xdb,0x20,0x83,0x9c,0x87,0x1c,0xb5,0xc4,0x8e,0x9e,0x94,0x70,0xca,0x3a,0xd3,0x5b,0xa2,0x61,0x3a,0x5d,0x31,0x99,0xc8,0xab,0x23,},{0x90,0xd2,0xef,0xbb,0xa4,0xd4,0x3e,0x6b,0x2b,0x99,0x2c,0xa1,0x60,0x83,0xdb,0xcf,0xa2,0xb3,0x22,0x38,0x39,0x07,0xb0,0xee,0x75,0xf3,0xe9,0x58,0x45,0xd3,0xc4,0x7f,},{0xfa,0x2e,0x99,0x44,0x21,0xae,0xf1,0xd5,0x85,0x66,0x74,0x81,0x3d,0x05,0xcb,0xd2,0xcf,0x84,0xef,0x5e,0xb4,0x24,0xaf,0x6e,0xcd,0x0d,0xc6,0xfd,0xbd,0xc2,0xfe,0x60,0x5f,0xe9,0x85,0x88,0x33,0x12,0xec,0xf3,0x4f,0x59,0xbf,0xb2,0xf1,0xc9,0x14,0x9e,0x5b,0x9c,0xc9,0xec,0xda,0x05,0xb2,0x73,0x11,0x30,0xf3,0xed,0x28,0xdd,0xae,0x0b,},"\x78\x3e\x33\xc3\xac\xbd\xbb\x36\xe8\x19\xf5\x44\xa7\x78\x1d\x83\xfc\x28\x3d\x33\x09\xf5\xd3\xd1\x2c\x8d\xcd\x6b\x0b\x3d\x0e\x89\xe3\x8c\xfd\x3b\x4d\x08\x85\x66\x1c\xa5\x47\xfb\x97\x64\xab\xff"}, +{{0xb4,0x82,0x70,0x36,0x12,0xd0,0xc5,0x86,0xf7,0x6c,0xfc,0xb2,0x1c,0xfd,0x21,0x03,0xc9,0x57,0x25,0x15,0x04,0xa8,0xc0,0xac,0x4c,0x86,0xc9,0xc6,0xf3,0xe4,0x29,0xff,},{0xfd,0x71,0x1d,0xc7,0xdd,0x3b,0x1d,0xfb,0x9d,0xf9,0x70,0x4b,0xe3,0xe6,0xb2,0x6f,0x58,0x7f,0xe7,0xdd,0x7b,0xa4,0x56,0xa9,0x1b,0xa4,0x3f,0xe5,0x1a,0xec,0x09,0xad,},{0x58,0x83,0x2b,0xde,0xb2,0x6f,0xea,0xfc,0x31,0xb4,0x62,0x77,0xcf,0x3f,0xb5,0xd7,0xa1,0x7d,0xfb,0x7c,0xcd,0x9b,0x1f,0x58,0xec,0xbe,0x6f,0xeb,0x97,0x96,0x66,0x82,0x8f,0x23,0x9b,0xa4,0xd7,0x52,0x19,0x26,0x0e,0xca,0xc0,0xac,0xf4,0x0f,0x0e,0x5e,0x25,0x90,0xf4,0xca,0xa1,0x6b,0xbb,0xcd,0x8a,0x15,0x5d,0x34,0x79,0x67,0xa6,0x07,},"\x29\xd7\x7a\xcf\xd9\x9c\x7a\x00\x70\xa8\x8f\xeb\x62\x47\xa2\xbc\xe9\x98\x4f\xe3\xe6\xfb\xf1\x9d\x40\x45\x04\x2a\x21\xab\x26\xcb\xd7\x71\xe1\x84\xa9\xa7\x5f\x31\x6b\x64\x8c\x69\x20\xdb\x92\xb8\x7b"}, +{{0x84,0xe5,0x0d,0xd9,0xa0,0xf1,0x97,0xe3,0x89,0x3c,0x38,0xdb,0xd9,0x1f,0xaf,0xc3,0x44,0xc1,0x77,0x6d,0x3a,0x40,0x0e,0x2f,0x0f,0x0e,0xe7,0xaa,0x82,0x9e,0xb8,0xa2,},{0x2c,0x50,0xf8,0x70,0xee,0x48,0xb3,0x6b,0x0a,0xc2,0xf8,0xa5,0xf3,0x36,0xfb,0x09,0x0b,0x11,0x30,0x50,0xdb,0xcc,0x25,0xe0,0x78,0x20,0x0a,0x6e,0x16,0x15,0x3e,0xea,},{0x69,0xe6,0xa4,0x49,0x1a,0x63,0x83,0x73,0x16,0xe8,0x6a,0x5f,0x4b,0xa7,0xcd,0x0d,0x73,0x1e,0xcc,0x58,0xf1,0xd0,0xa2,0x64,0xc6,0x7c,0x89,0xbe,0xfd,0xd8,0xd3,0x82,0x9d,0x8d,0xe1,0x3b,0x33,0xcc,0x0b,0xf5,0x13,0x93,0x17,0x15,0xc7,0x80,0x96,0x57,0xe2,0xbf,0xb9,0x60,0xe5,0xc7,0x64,0xc9,0x71,0xd7,0x33,0x74,0x60,0x93,0xe5,0x00,},"\xf3\x99\x2c\xde\x64\x93\xe6\x71\xf1\xe1\x29\xdd\xca\x80\x38\xb0\xab\xdb\x77\xbb\x90\x35\xf9\xf8\xbe\x54\xbd\x5d\x68\xc1\xae\xff\x72\x4f\xf4\x7d\x29\x34\x43\x91\xdc\x53\x61\x66\xb8\x67\x1c\xbb\xf1\x23"}, +{{0xb3,0x22,0xd4,0x65,0x77,0xa2,0xa9,0x91,0xa4,0xd1,0x69,0x82,0x87,0x83,0x2a,0x39,0xc4,0x87,0xef,0x77,0x6b,0x4b,0xff,0x03,0x7a,0x05,0xc7,0xf1,0x81,0x2b,0xde,0xec,},{0xeb,0x2b,0xca,0xdf,0xd3,0xee,0xc2,0x98,0x6b,0xaf,0xf3,0x2b,0x98,0xe7,0xc4,0xdb,0xf0,0x3f,0xf9,0x5d,0x8a,0xd5,0xff,0x9a,0xa9,0x50,0x6e,0x54,0x72,0xff,0x84,0x5f,},{0xc7,0xb5,0x51,0x37,0x31,0x7c,0xa2,0x1e,0x33,0x48,0x9f,0xf6,0xa9,0xbf,0xab,0x97,0xc8,0x55,0xdc,0x6f,0x85,0x68,0x4a,0x70,0xa9,0x12,0x5a,0x26,0x1b,0x56,0xd5,0xe6,0xf1,0x49,0xc5,0x77,0x4d,0x73,0x4f,0x2d,0x8d,0xeb,0xfc,0x77,0xb7,0x21,0x89,0x6a,0x82,0x67,0xc2,0x37,0x68,0xe9,0xba,0xdb,0x91,0x0e,0xef,0x83,0xec,0x25,0x88,0x02,},"\x19\xf1\xbf\x5d\xcf\x17\x50\xc6\x11\xf1\xc4\xa2\x86\x52\x00\x50\x4d\x82\x29\x8e\xdd\x72\x67\x1f\x62\xa7\xb1\x47\x1a\xc3\xd4\xa3\x0f\x7d\xe9\xe5\xda\x41\x08\xc5\x2a\x4c\xe7\x0a\x3e\x11\x4a\x52\xa3\xb3\xc5"}, +{{0x96,0x0c,0xab,0x50,0x34,0xb9,0x83,0x8d,0x09,0x8d,0x2d,0xcb,0xf4,0x36,0x4b,0xec,0x16,0xd3,0x88,0xf6,0x37,0x6d,0x73,0xa6,0x27,0x3b,0x70,0xf8,0x2b,0xbc,0x98,0xc0,},{0x5e,0x3c,0x19,0xf2,0x41,0x5a,0xcf,0x72,0x9f,0x82,0x9a,0x4e,0xbd,0x5c,0x40,0xe1,0xa6,0xbc,0x9f,0xbc,0xa9,0x57,0x03,0xa9,0x37,0x60,0x87,0xed,0x09,0x37,0xe5,0x1a,},{0x27,0xd4,0xc3,0xa1,0x81,0x1e,0xf9,0xd4,0x36,0x0b,0x3b,0xdd,0x13,0x3c,0x2c,0xcc,0x30,0xd0,0x2c,0x2f,0x24,0x82,0x15,0x77,0x6c,0xb0,0x7e,0xe4,0x17,0x7f,0x9b,0x13,0xfc,0x42,0xdd,0x70,0xa6,0xc2,0xfe,0xd8,0xf2,0x25,0xc7,0x66,0x3c,0x7f,0x18,0x2e,0x7e,0xe8,0xec,0xcf,0xf2,0x0d,0xc7,0xb0,0xe1,0xd5,0x83,0x4e,0xc5,0xb1,0xea,0x01,},"\xf8\xb2\x19\x62\x44\x7b\x0a\x8f\x2e\x42\x79\xde\x41\x1b\xea\x12\x8e\x0b\xe4\x4b\x69\x15\xe6\xcd\xa8\x83\x41\xa6\x8a\x0d\x81\x83\x57\xdb\x93\x8e\xac\x73\xe0\xaf\x6d\x31\x20\x6b\x39\x48\xf8\xc4\x8a\x44\x73\x08"}, +{{0xeb,0x77,0xb2,0x63,0x8f,0x23,0xee,0xbc,0x82,0xef,0xe4,0x5e,0xe9,0xe5,0xa0,0x32,0x66,0x37,0x40,0x1e,0x66,0x3e,0xd0,0x29,0x69,0x9b,0x21,0xe6,0x44,0x3f,0xb4,0x8e,},{0x9e,0xf2,0x76,0x08,0x96,0x1a,0xc7,0x11,0xde,0x71,0xa6,0xe2,0xd4,0xd4,0x66,0x3e,0xa3,0xec,0xd4,0x2f,0xb7,0xe4,0xe8,0x62,0x7c,0x39,0x62,0x2d,0xf4,0xaf,0x0b,0xbc,},{0x18,0xdc,0x56,0xd7,0xbd,0x9a,0xcd,0x4f,0x4d,0xaa,0x78,0x54,0x0b,0x4a,0xc8,0xff,0x7a,0xa9,0x81,0x5f,0x45,0xa0,0xbb,0xa3,0x70,0x73,0x1a,0x14,0xea,0xab,0xe9,0x6d,0xf8,0xb5,0xf3,0x7d,0xbf,0x8e,0xae,0x4c,0xb1,0x5a,0x64,0xb2,0x44,0x65,0x1e,0x59,0xd6,0xa3,0xd6,0x76,0x1d,0x9e,0x3c,0x50,0xf2,0xd0,0xcb,0xb0,0x9c,0x05,0xec,0x06,},"\x99\xe3\xd0\x09\x34\x00\x3e\xba\xfc\x3e\x9f\xdb\x68\x7b\x0f\x5f\xf9\xd5\x78\x2a\x4b\x1f\x56\xb9\x70\x00\x46\xc0\x77\x91\x56\x02\xc3\x13\x4e\x22\xfc\x90\xed\x7e\x69\x0f\xdd\xd4\x43\x3e\x20\x34\xdc\xb2\xdc\x99\xab"}, +{{0xb6,0x25,0xaa,0x89,0xd3,0xf7,0x30,0x87,0x15,0x42,0x7b,0x6c,0x39,0xbb,0xac,0x58,0xef,0xfd,0x3a,0x0f,0xb7,0x31,0x6f,0x7a,0x22,0xb9,0x9e,0xe5,0x92,0x2f,0x2d,0xc9,},{0x65,0xa9,0x9c,0x3e,0x16,0xfe,0xa8,0x94,0xec,0x33,0xc6,0xb2,0x0d,0x91,0x05,0xe2,0xa0,0x4e,0x27,0x64,0xa4,0x76,0x9d,0x9b,0xbd,0x4d,0x8b,0xac,0xfe,0xab,0x4a,0x2e,},{0x01,0xbb,0x90,0x1d,0x83,0xb8,0xb6,0x82,0xd3,0x61,0x4a,0xf4,0x6a,0x80,0x7b,0xa2,0x69,0x13,0x58,0xfe,0xb7,0x75,0x32,0x5d,0x34,0x23,0xf5,0x49,0xff,0x0a,0xa5,0x75,0x7e,0x4e,0x1a,0x74,0xe9,0xc7,0x0f,0x97,0x21,0xd8,0xf3,0x54,0xb3,0x19,0xd4,0xf4,0xa1,0xd9,0x14,0x45,0xc8,0x70,0xfd,0x0f,0xfb,0x94,0xfe,0xd6,0x46,0x64,0x73,0x0d,},"\xe0\x72\x41\xdb\xd3\xad\xbe\x61\x0b\xbe\x4d\x00\x5d\xd4\x67\x32\xa4\xc2\x50\x86\xec\xb8\xec\x29\xcd\x7b\xca\x11\x6e\x1b\xf9\xf5\x3b\xfb\xf3\xe1\x1f\xa4\x90\x18\xd3\x9f\xf1\x15\x4a\x06\x66\x8e\xf7\xdf\x5c\x67\x8e\x6a"}, +{{0xb1,0xc9,0xf8,0xbd,0x03,0xfe,0x82,0xe7,0x8f,0x5c,0x0f,0xb0,0x64,0x50,0xf2,0x7d,0xac,0xdf,0x71,0x64,0x34,0xdb,0x26,0x82,0x75,0xdf,0x3e,0x1d,0xc1,0x77,0xaf,0x42,},{0x7f,0xc8,0x8b,0x1f,0x7b,0x3f,0x11,0xc6,0x29,0xbe,0x67,0x1c,0x21,0x62,0x1f,0x5c,0x10,0x67,0x2f,0xaf,0xc8,0x49,0x2d,0xa8,0x85,0x74,0x20,0x59,0xee,0x67,0x74,0xcf,},{0x4b,0x22,0x99,0x51,0xef,0x26,0x2f,0x16,0x97,0x8f,0x79,0x14,0xbc,0x67,0x2e,0x72,0x26,0xc5,0xf8,0x37,0x9d,0x27,0x78,0xc5,0xa2,0xdc,0x0a,0x26,0x50,0x86,0x9f,0x7a,0xcf,0xbd,0x0b,0xcd,0x30,0xfd,0xb0,0x61,0x9b,0xb4,0x4f,0xc1,0xae,0x59,0x39,0xb8,0x7c,0xc3,0x18,0x13,0x30,0x09,0xc2,0x03,0x95,0xb6,0xc7,0xeb,0x98,0x10,0x77,0x01,},"\x33\x1d\xa7\xa9\xc1\xf8\x7b\x2a\xc9\x1e\xe3\xb8\x6d\x06\xc2\x91\x63\xc0\x5e\xd6\xf8\xd8\xa9\x72\x5b\x47\x1b\x7d\xb0\xd6\xac\xec\x7f\x0f\x70\x24\x87\x16\x3f\x5e\xda\x02\x0c\xa5\xb4\x93\xf3\x99\xe1\xc8\xd3\x08\xc3\xc0\xc2"}, +{{0x6d,0x8c,0xdb,0x2e,0x07,0x5f,0x3a,0x2f,0x86,0x13,0x72,0x14,0xcb,0x23,0x6c,0xeb,0x89,0xa6,0x72,0x8b,0xb4,0xa2,0x00,0x80,0x6b,0xf3,0x55,0x7f,0xb7,0x8f,0xac,0x69,},{0x57,0xa0,0x4c,0x7a,0x51,0x13,0xcd,0xdf,0xe4,0x9a,0x4c,0x12,0x46,0x91,0xd4,0x6c,0x1f,0x9c,0xdc,0x8f,0x34,0x3f,0x9d,0xcb,0x72,0xa1,0x33,0x0a,0xec,0xa7,0x1f,0xda,},{0xa6,0xcb,0xc9,0x47,0xf9,0xc8,0x7d,0x14,0x55,0xcf,0x1a,0x70,0x85,0x28,0xc0,0x90,0xf1,0x1e,0xce,0xe4,0x85,0x5d,0x1d,0xba,0xad,0xf4,0x74,0x54,0xa4,0xde,0x55,0xfa,0x4c,0xe8,0x4b,0x36,0xd7,0x3a,0x5b,0x5f,0x8f,0x59,0x29,0x8c,0xcf,0x21,0x99,0x2d,0xf4,0x92,0xef,0x34,0x16,0x3d,0x87,0x75,0x3b,0x7e,0x9d,0x32,0xf2,0xc3,0x66,0x0b,},"\x7f\x31\x8d\xbd\x12\x1c\x08\xbf\xdd\xfe\xff\x4f\x6a\xff\x4e\x45\x79\x32\x51\xf8\xab\xf6\x58\x40\x33\x58\x23\x89\x84\x36\x00\x54\xf2\xa8\x62\xc5\xbb\x83\xed\x89\x02\x5d\x20\x14\xa7\xa0\xce\xe5\x0d\xa3\xcb\x0e\x76\xbb\xb6\xbf"}, +{{0x47,0xad,0xc6,0xd6,0xbf,0x57,0x1e,0xe9,0x57,0x0c,0xa0,0xf7,0x5b,0x60,0x4a,0xc4,0x3e,0x30,0x3e,0x4a,0xb3,0x39,0xca,0x9b,0x53,0xca,0xcc,0x5b,0xe4,0x5b,0x2c,0xcb,},{0xa3,0xf5,0x27,0xa1,0xc1,0xf1,0x7d,0xfe,0xed,0x92,0x27,0x73,0x47,0xc9,0xf9,0x8a,0xb4,0x75,0xde,0x17,0x55,0xb0,0xab,0x54,0x6b,0x8a,0x15,0xd0,0x1b,0x9b,0xd0,0xbe,},{0x4e,0x8c,0x31,0x83,0x43,0xc3,0x06,0xad,0xbb,0xa6,0x0c,0x92,0xb7,0x5c,0xb0,0x56,0x9b,0x92,0x19,0xd8,0xa8,0x6e,0x5d,0x57,0x75,0x2e,0xd2,0x35,0xfc,0x10,0x9a,0x43,0xc2,0xcf,0x4e,0x94,0x2c,0xac,0xf2,0x97,0x27,0x9f,0xbb,0x28,0x67,0x53,0x47,0xe0,0x80,0x27,0x72,0x2a,0x4e,0xb7,0x39,0x5e,0x00,0xa1,0x74,0x95,0xd3,0x2e,0xdf,0x0b,},"\xce\x49\x7c\x5f\xf5\xa7\x79\x90\xb7\xd8\xf8\x69\x9e\xb1\xf5\xd8\xc0\x58\x2f\x70\xcb\x7a\xc5\xc5\x4d\x9d\x92\x49\x13\x27\x8b\xc6\x54\xd3\x7e\xa2\x27\x59\x0e\x15\x20\x22\x17\xfc\x98\xda\xc4\xc0\xf3\xbe\x21\x83\xd1\x33\x31\x57\x39"}, +{{0x3c,0x19,0xb5,0x0b,0x0f,0xe4,0x79,0x61,0x71,0x9c,0x38,0x1d,0x0d,0x8d,0xa9,0xb9,0x86,0x9d,0x31,0x2f,0x13,0xe3,0x29,0x8b,0x97,0xfb,0x22,0xf0,0xaf,0x29,0xcb,0xbe,},{0x0f,0x7e,0xda,0x09,0x14,0x99,0x62,0x5e,0x2b,0xae,0x85,0x36,0xea,0x35,0xcd,0xa5,0x48,0x3b,0xd1,0x6a,0x9c,0x7e,0x41,0x6b,0x34,0x1d,0x6f,0x2c,0x83,0x34,0x36,0x12,},{0xef,0xbd,0x41,0xf2,0x6a,0x5d,0x62,0x68,0x55,0x16,0xf8,0x82,0xb6,0xec,0x74,0xe0,0xd5,0xa7,0x18,0x30,0xd2,0x03,0xc2,0x31,0x24,0x8f,0x26,0xe9,0x9a,0x9c,0x65,0x78,0xec,0x90,0x0d,0x68,0xcd,0xb8,0xfa,0x72,0x16,0xad,0x0d,0x24,0xf9,0xec,0xbc,0x9f,0xfa,0x65,0x53,0x51,0x66,0x65,0x82,0xf6,0x26,0x64,0x53,0x95,0xa3,0x1f,0xa7,0x04,},"\x8d\xdc\xd6\x30\x43\xf5\x5e\xc3\xbf\xc8\x3d\xce\xae\x69\xd8\xf8\xb3\x2f\x4c\xdb\x6e\x2a\xeb\xd9\x4b\x43\x14\xf8\xfe\x72\x87\xdc\xb6\x27\x32\xc9\x05\x2e\x75\x57\xfe\x63\x53\x43\x38\xef\xb5\xb6\x25\x4c\x5d\x41\xd2\x69\x0c\xf5\x14\x4f"}, +{{0x34,0xe1,0xe9,0xd5,0x39,0x10,0x7e,0xb8,0x6b,0x39,0x3a,0x5c,0xce,0xa1,0x49,0x6d,0x35,0xbc,0x7d,0x5e,0x9a,0x8c,0x51,0x59,0xd9,0x57,0xe4,0xe5,0x85,0x2b,0x3e,0xb0,},{0x0e,0xcb,0x26,0x01,0xd5,0xf7,0x04,0x74,0x28,0xe9,0xf9,0x09,0x88,0x3a,0x12,0x42,0x00,0x85,0xf0,0x4e,0xe2,0xa8,0x8b,0x6d,0x95,0xd3,0xd7,0xf2,0xc9,0x32,0xbd,0x76,},{0x32,0xd2,0x29,0x04,0xd3,0xe7,0x01,0x2d,0x6f,0x5a,0x44,0x1b,0x0b,0x42,0x28,0x06,0x4a,0x5c,0xf9,0x5b,0x72,0x3a,0x66,0xb0,0x48,0xa0,0x87,0xec,0xd5,0x59,0x20,0xc3,0x1c,0x20,0x4c,0x3f,0x20,0x06,0x89,0x1a,0x85,0xdd,0x19,0x32,0xe3,0xf1,0xd6,0x14,0xcf,0xd6,0x33,0xb5,0xe6,0x32,0x91,0xc6,0xd8,0x16,0x6f,0x30,0x11,0x43,0x1e,0x09,},"\xa6\xd4\xd0\x54\x2c\xfe\x0d\x24\x0a\x90\x50\x7d\xeb\xac\xab\xce\x7c\xbb\xd4\x87\x32\x35\x3f\x4f\xad\x82\xc7\xbb\x7d\xbd\x9d\xf8\xe7\xd9\xa1\x69\x80\xa4\x51\x86\xd8\x78\x6c\x5e\xf6\x54\x45\xbc\xc5\xb2\xad\x5f\x66\x0f\xfc\x7c\x8e\xaa\xc0"}, +{{0x49,0xdd,0x47,0x3e,0xde,0x6a,0xa3,0xc8,0x66,0x82,0x4a,0x40,0xad,0xa4,0x99,0x6c,0x23,0x9a,0x20,0xd8,0x4c,0x93,0x65,0xe4,0xf0,0xa4,0x55,0x4f,0x80,0x31,0xb9,0xcf,},{0x78,0x8d,0xe5,0x40,0x54,0x4d,0x3f,0xeb,0x0c,0x91,0x92,0x40,0xb3,0x90,0x72,0x9b,0xe4,0x87,0xe9,0x4b,0x64,0xad,0x97,0x3e,0xb6,0x5b,0x46,0x69,0xec,0xf2,0x35,0x01,},{0xd2,0xfd,0xe0,0x27,0x91,0xe7,0x20,0x85,0x25,0x07,0xfa,0xa7,0xc3,0x78,0x90,0x40,0xd9,0xef,0x86,0x64,0x63,0x21,0xf3,0x13,0xac,0x55,0x7f,0x40,0x02,0x49,0x15,0x42,0xdd,0x67,0xd0,0x5c,0x69,0x90,0xcd,0xb0,0xd4,0x95,0x50,0x1f,0xbc,0x5d,0x51,0x88,0xbf,0xbb,0x84,0xdc,0x1b,0xf6,0x09,0x8b,0xee,0x06,0x03,0xa4,0x7f,0xc2,0x69,0x0f,},"\x3a\x53\x59\x4f\x3f\xba\x03\x02\x93\x18\xf5\x12\xb0\x84\xa0\x71\xeb\xd6\x0b\xae\xc7\xf5\x5b\x02\x8d\xc7\x3b\xfc\x9c\x74\xe0\xca\x49\x6b\xf8\x19\xdd\x92\xab\x61\xcd\x8b\x74\xbe\x3c\x0d\x6d\xcd\x12\x8e\xfc\x5e\xd3\x34\x2c\xba\x12\x4f\x72\x6c"}, +{{0x33,0x1c,0x64,0xda,0x48,0x2b,0x6b,0x55,0x13,0x73,0xc3,0x64,0x81,0xa0,0x2d,0x81,0x36,0xec,0xad,0xbb,0x01,0xab,0x11,0x4b,0x44,0x70,0xbf,0x41,0x60,0x7a,0xc5,0x71,},{0x52,0xa0,0x0d,0x96,0xa3,0x14,0x8b,0x47,0x26,0x69,0x2d,0x9e,0xff,0x89,0x16,0x0e,0xa9,0xf9,0x9a,0x5c,0xc4,0x38,0x9f,0x36,0x1f,0xed,0x0b,0xb1,0x6a,0x42,0xd5,0x21,},{0x22,0xc9,0x9a,0xa9,0x46,0xea,0xd3,0x9a,0xc7,0x99,0x75,0x62,0x81,0x0c,0x01,0xc2,0x0b,0x46,0xbd,0x61,0x06,0x45,0xbd,0x2d,0x56,0xdc,0xdc,0xba,0xac,0xc5,0x45,0x2c,0x74,0xfb,0xf4,0xb8,0xb1,0x81,0x3b,0x0e,0x94,0xc3,0x0d,0x80,0x8c,0xe5,0x49,0x8e,0x61,0xd4,0xf7,0xcc,0xbb,0x4c,0xc5,0xf0,0x4d,0xfc,0x61,0x40,0x82,0x5a,0x96,0x00,},"\x20\xe1\xd0\x5a\x0d\x5b\x32\xcc\x81\x50\xb8\x11\x6c\xef\x39\x65\x9d\xd5\xfb\x44\x3a\xb1\x56\x00\xf7\x8e\x5b\x49\xc4\x53\x26\xd9\x32\x3f\x28\x50\xa6\x3c\x38\x08\x85\x94\x95\xae\x27\x3f\x58\xa5\x1e\x9d\xe9\xa1\x45\xd7\x74\xb4\x0b\xa9\xd7\x53\xd3"}, +{{0x5c,0x0b,0x96,0xf2,0xaf,0x87,0x12,0x12,0x2c,0xf7,0x43,0xc8,0xf8,0xdc,0x77,0xb6,0xcd,0x55,0x70,0xa7,0xde,0x13,0x29,0x7b,0xb3,0xdd,0xe1,0x88,0x62,0x13,0xcc,0xe2,},{0x05,0x10,0xea,0xf5,0x7d,0x73,0x01,0xb0,0xe1,0xd5,0x27,0x03,0x9b,0xf4,0xc6,0xe2,0x92,0x30,0x0a,0x3a,0x61,0xb4,0x76,0x54,0x34,0xf3,0x20,0x3c,0x10,0x03,0x51,0xb1,},{0x06,0xe5,0xd8,0x43,0x6a,0xc7,0x70,0x5b,0x3a,0x90,0xf1,0x63,0x1c,0xdd,0x38,0xec,0x1a,0x3f,0xa4,0x97,0x78,0xa9,0xb9,0xf2,0xfa,0x5e,0xbe,0xa4,0xe7,0xd5,0x60,0xad,0xa7,0xdd,0x26,0xff,0x42,0xfa,0xfa,0x8b,0xa4,0x20,0x32,0x37,0x42,0x76,0x1a,0xca,0x69,0x04,0x94,0x0d,0xc2,0x1b,0xbe,0xf6,0x3f,0xf7,0x2d,0xaa,0xb4,0x5d,0x43,0x0b,},"\x54\xe0\xca\xa8\xe6\x39\x19\xca\x61\x4b\x2b\xfd\x30\x8c\xcf\xe5\x0c\x9e\xa8\x88\xe1\xee\x44\x46\xd6\x82\xcb\x50\x34\x62\x7f\x97\xb0\x53\x92\xc0\x4e\x83\x55\x56\xc3\x1c\x52\x81\x6a\x48\xe4\xfb\x19\x66\x93\x20\x6b\x8a\xfb\x44\x08\x66\x2b\x3c\xb5\x75"}, +{{0xde,0x84,0xf2,0x43,0x5f,0x78,0xde,0xdb,0x87,0xda,0x18,0x19,0x4f,0xf6,0xa3,0x36,0xf0,0x81,0x11,0x15,0x0d,0xef,0x90,0x1c,0x1a,0xc4,0x18,0x14,0x6e,0xb7,0xb5,0x4a,},{0xd3,0xa9,0x2b,0xba,0xa4,0xd6,0x3a,0xf7,0x9c,0x22,0x26,0xa7,0x23,0x6e,0x64,0x27,0x42,0x8d,0xf8,0xb3,0x62,0x42,0x7f,0x87,0x30,0x23,0xb2,0x2d,0x2f,0x5e,0x03,0xf2,},{0x47,0x1e,0xbc,0x97,0x3c,0xfd,0xac,0xee,0xc0,0x72,0x79,0x30,0x73,0x68,0xb7,0x3b,0xe3,0x5b,0xc6,0xf8,0xd8,0x31,0x2b,0x70,0x15,0x05,0x67,0x36,0x90,0x96,0x70,0x6d,0xc4,0x71,0x12,0x6c,0x35,0x76,0xf9,0xf0,0xeb,0x55,0x0d,0xf5,0xac,0x6a,0x52,0x51,0x81,0x11,0x00,0x29,0xdd,0x1f,0xc1,0x11,0x74,0xd1,0xaa,0xce,0xd4,0x8d,0x63,0x0f,},"\x20\x51\x35\xec\x7f\x41\x7c\x85\x80\x72\xd5\x23\x3f\xb3\x64\x82\xd4\x90\x6a\xbd\x60\xa7\x4a\x49\x8c\x34\x7f\xf2\x48\xdf\xa2\x72\x2c\xa7\x4e\x87\x9d\xe3\x31\x69\xfa\xdc\x7c\xd4\x4d\x6c\x94\xa1\x7d\x16\xe1\xe6\x30\x82\x4b\xa3\xe0\xdf\x22\xed\x68\xea\xab"}, +{{0xba,0x4d,0x6e,0x67,0xb2,0xce,0x67,0xa1,0xe4,0x43,0x26,0x49,0x40,0x44,0xf3,0x7a,0x44,0x2f,0x3b,0x81,0x72,0x5b,0xc1,0xf9,0x34,0x14,0x62,0x71,0x8b,0x55,0xee,0x20,},{0xf7,0x3f,0xa0,0x76,0xf8,0x4b,0x6d,0xb6,0x75,0xa5,0xfd,0xa5,0xad,0x67,0xe3,0x51,0xa4,0x1e,0x8e,0x7f,0x29,0xad,0xd1,0x68,0x09,0xca,0x01,0x03,0x87,0xe9,0xc6,0xcc,},{0x57,0xb9,0xd2,0xa7,0x11,0x20,0x7f,0x83,0x74,0x21,0xba,0xe7,0xdd,0x48,0xea,0xa1,0x8e,0xab,0x1a,0x9a,0x70,0xa0,0xf1,0x30,0x58,0x06,0xfe,0xe1,0x7b,0x45,0x8f,0x3a,0x09,0x64,0xb3,0x02,0xd1,0x83,0x4d,0x3e,0x0a,0xc9,0xe8,0x49,0x6f,0x00,0x0b,0x77,0xf0,0x08,0x3b,0x41,0xf8,0xa9,0x57,0xe6,0x32,0xfb,0xc7,0x84,0x0e,0xee,0x6a,0x06,},"\x4b\xaf\xda\xc9\x09\x9d\x40\x57\xed\x6d\xd0\x8b\xca\xee\x87\x56\xe9\xa4\x0f\x2c\xb9\x59\x80\x20\xeb\x95\x01\x95\x28\x40\x9b\xbe\xa3\x8b\x38\x4a\x59\xf1\x19\xf5\x72\x97\xbf\xb2\xfa\x14\x2f\xc7\xbb\x1d\x90\xdb\xdd\xde\x77\x2b\xcd\xe4\x8c\x56\x70\xd5\xfa\x13"}, +{{0x0d,0x13,0x1c,0x45,0xae,0xa6,0xf3,0xa4,0xe1,0xb9,0xa2,0xcf,0x60,0xc5,0x51,0x04,0x58,0x7e,0xfa,0xa8,0x46,0xb2,0x22,0xbf,0x0a,0x7b,0x74,0xce,0x7a,0x3f,0x63,0xb6,},{0x3c,0x67,0x29,0xdb,0xe9,0x3b,0x49,0x9c,0x4e,0x61,0x4a,0x2f,0x21,0xbe,0xb7,0x29,0x43,0x8d,0x49,0x8e,0x1a,0xc8,0xd1,0x4c,0xba,0xd9,0x71,0x7a,0x5d,0xbd,0x97,0xcd,},{0xa9,0xc5,0xee,0x86,0xfb,0x06,0xd9,0xe4,0x6b,0x37,0x9c,0x32,0xdd,0xa7,0xc9,0x2c,0x9c,0x13,0xdb,0x27,0x4d,0xc2,0x41,0x16,0xfb,0xdd,0x87,0x86,0x96,0x04,0x54,0x88,0xcc,0x75,0xa5,0x2f,0xff,0x67,0xd1,0xa5,0x11,0x3d,0x06,0xe3,0x33,0xac,0x67,0xff,0x66,0x4b,0x3f,0x2a,0x40,0x5f,0xa1,0xd1,0x4d,0xd5,0xbb,0xb9,0x74,0x09,0xb6,0x06,},"\xb4\x29\x1d\x08\xb8\x8f\xb2\xf7\xb8\xf9\x9d\x0d\xce\x40\x07\x9f\xcb\xab\x71\x8b\xbd\x8f\x4e\x8e\xab\xc3\xc1\x42\x8b\x6a\x07\x1f\xb2\xa3\xc8\xeb\xa1\xca\xcc\xcf\xa8\x71\xb3\x65\xc7\x08\xbe\xf2\x68\x5b\xc1\x3e\x6b\x80\xbc\x14\xa5\xf2\x49\x17\x0f\xfc\x56\xd0\x14"}, +{{0xa7,0x5e,0x3b,0x6b,0x41,0x70,0xe4,0x44,0x78,0x1b,0xe4,0xee,0xac,0x3e,0x0f,0xda,0xa4,0xb4,0x35,0x6f,0x70,0x54,0x86,0xbc,0xb0,0x71,0xa3,0x25,0xae,0x07,0x1f,0xba,},{0x99,0x3d,0x38,0xa7,0xd7,0x2f,0x0a,0xee,0x15,0xff,0x6f,0x4f,0xdc,0x37,0xca,0x77,0x24,0xfd,0x13,0x73,0xa3,0x76,0x6b,0x27,0x5d,0xbc,0x77,0xe6,0x47,0x98,0x0e,0x0a,},{0xa5,0xdb,0x4d,0x3d,0x33,0x29,0xab,0xe3,0x69,0x79,0x59,0xe6,0xb5,0x94,0x7e,0xa8,0x60,0x1b,0x03,0xef,0x8e,0x1d,0x6f,0xe2,0x02,0x14,0x49,0x31,0x27,0x2c,0xa0,0xa0,0x9b,0x5e,0xb0,0xf3,0x90,0x57,0x2e,0xa7,0xef,0x03,0xc6,0x13,0x1e,0x9d,0xe5,0xf1,0x6b,0xf0,0xb0,0x34,0x24,0x4f,0x7e,0x10,0x4f,0xf5,0x31,0x1b,0xbf,0x66,0x3a,0x0d,},"\x40\x37\x86\x6f\x65\x48\xb0\x1c\xc6\xbc\xf3\xa9\x40\xe3\x94\x5a\xa2\xd1\x88\xb4\xb7\xf1\x82\xaa\x77\xec\x4d\x6b\x04\x28\xab\x5b\x84\xd8\x5d\xf1\x92\xa5\xa3\x8a\xda\x08\x9d\x76\xfa\x26\xbf\x67\x73\x6a\x70\x41\xa5\xeb\x8f\x0c\x57\x19\xeb\x39\x66\x93\xc4\x51\x60\xf8"}, +{{0xbc,0xbc,0xf5,0x61,0xec,0xc0,0x5a,0x41,0xc7,0xd7,0xe5,0x5e,0x69,0x6d,0x32,0xce,0x39,0xb4,0xd0,0x3c,0x1f,0x5f,0x3f,0x3a,0x89,0x27,0xfe,0x5e,0x62,0xe8,0x44,0xb2,},{0x4d,0xdf,0x53,0xfa,0xd6,0xa7,0xa9,0xed,0x30,0xf3,0xaf,0xec,0xca,0x13,0x6f,0xd7,0x84,0x3b,0x72,0xc2,0x43,0x09,0x08,0x91,0xae,0x40,0x21,0xa3,0x2c,0xad,0xff,0x1a,},{0x9f,0xf1,0x51,0x15,0xf6,0x66,0x1f,0x32,0x11,0xd7,0xa4,0x07,0x64,0x96,0x76,0x29,0xba,0x6a,0x52,0x63,0x95,0x1b,0xdc,0x3c,0x6a,0x4c,0x90,0xd0,0x70,0xf7,0xbe,0x00,0x02,0x4b,0x80,0xd8,0x3b,0x6b,0xc2,0x75,0x87,0xfc,0xff,0x5f,0x5c,0xcc,0x0e,0xb3,0xcd,0xe1,0x49,0x7c,0xf5,0x68,0x95,0x14,0x7a,0x06,0x3f,0x61,0xf0,0x8a,0xdf,0x0b,},"\x6f\x67\x16\xb6\x78\x47\x40\x98\x0a\xeb\xc3\x24\x88\x07\xe3\x1c\x12\x86\xac\x7b\x68\x1c\x00\xb6\x6c\x88\xff\x7a\x33\x6d\x44\x1f\xa5\xc3\xeb\x25\x6d\x20\xcf\x6d\x1a\xc9\x2c\xcf\xe4\xbe\x6d\xcc\x41\xb1\xaf\xf8\x46\xd3\x60\xc2\x43\x00\x1c\xab\xdf\xbf\x1a\x9b\x24\x04\x55"}, +{{0x21,0x05,0x32,0x80,0x5f,0xa9,0xcc,0x9b,0xe9,0x16,0xd2,0x13,0xca,0xc3,0x74,0xe3,0xcd,0x6f,0xc2,0x60,0x2a,0x54,0x4d,0x0c,0x1c,0xe2,0x9d,0x30,0x10,0x5d,0x69,0xab,},{0x10,0x69,0x9e,0x49,0x9b,0xe9,0x9e,0x2b,0x11,0xb9,0x8f,0x6f,0x86,0xb6,0x7c,0xdc,0x4c,0xcf,0x69,0xf3,0xc5,0x3c,0xe0,0x94,0x87,0x56,0x47,0xd2,0xd0,0xd0,0xec,0xc5,},{0x4c,0x2d,0x31,0xd5,0xbb,0xc4,0x2e,0x02,0x6d,0xc1,0xe0,0x79,0xec,0xc4,0xdd,0x07,0x2c,0x5d,0x2c,0xce,0x65,0xe3,0xdb,0x8d,0x8a,0x1d,0xd9,0x05,0x7f,0xaa,0x03,0x71,0x72,0x7f,0x72,0x72,0x31,0xa0,0xf0,0x60,0xfa,0x27,0x09,0x75,0x33,0xb6,0xdb,0x3b,0x8f,0x62,0x52,0xf2,0x79,0x3d,0x75,0x66,0x2c,0xaa,0xdf,0x5f,0x0f,0xcc,0x71,0x0e,},"\x9f\xc4\xd2\x8c\xfd\x25\xe6\xc0\xc5\xe7\x24\xe1\x9c\xa3\x9d\x71\xe5\x3b\xf4\xaa\x27\x96\xc5\x4c\x33\x51\xf1\x08\xfc\x70\xf2\x61\x1a\x62\xe0\xab\x90\xaf\x6a\xde\x52\x16\x78\x8e\x9e\xb2\xa8\x73\x05\x9b\x1e\x79\xd7\xd5\x9d\xeb\xd6\x8f\x2d\x4d\x80\xff\xe3\x1b\xf7\x4b\x92\x8c"}, +{{0x18,0x5d,0x64,0xb6,0x94,0x79,0xe0,0xba,0x0a,0x58,0x44,0xa1,0x0a,0xd8,0x41,0x25,0xba,0x11,0xc4,0xb4,0x0d,0x63,0xed,0xa2,0xc5,0x7a,0xfc,0x7e,0x01,0x9c,0x8e,0x0c,},{0xa5,0x76,0x4f,0x63,0x98,0xa5,0xae,0x22,0x66,0xa3,0x8f,0x97,0x14,0x53,0x3c,0x4b,0xbd,0x8d,0x07,0x82,0x6f,0x63,0xe2,0x04,0xcb,0xac,0x37,0x4b,0x0a,0xce,0xf1,0xbd,},{0x43,0xe0,0x38,0x7d,0xa5,0xba,0x09,0xa1,0x90,0xf6,0xe7,0xb2,0x68,0x05,0x78,0xd8,0x89,0x76,0x9b,0xcc,0x44,0x5e,0x5e,0xf5,0x71,0xb4,0x92,0x87,0x1c,0x15,0x5c,0x5b,0x9f,0x62,0x0b,0xfa,0xcf,0xbf,0x2d,0xf1,0xfd,0x87,0x44,0x46,0x04,0xb7,0x1b,0x2e,0x23,0x7b,0xaa,0xa7,0xee,0x20,0x93,0xed,0xe4,0xa6,0x01,0xed,0xf8,0x83,0xe3,0x07,},"\x4a\x08\x24\xfe\x70\xd4\x31\x54\x13\xd0\xa0\xca\xfb\xf4\xf5\xfe\x11\x7d\x5e\x07\xe1\xc3\xa4\xef\xfb\x9d\x0a\xe9\x14\x90\x23\x48\x78\xcc\xf6\x79\x2a\x91\xf6\x8c\x6a\x52\x0d\xe1\x60\x71\xf0\x8a\xbe\x35\xdc\x5e\xa4\x28\xf1\x95\x7b\x66\x33\x71\xce\x24\xc6\x09\xdd\x55\xb8\xf4\x93"}, +{{0xcf,0xa9,0xd9,0x16,0x4b,0x3c,0x4f,0x6f,0x72,0x26,0x35,0xd2,0x06,0x6c,0xd7,0xea,0x5e,0x55,0x33,0xd2,0xc7,0x4f,0x8a,0xdd,0x66,0x9c,0x37,0x1f,0xaa,0x47,0x64,0x26,},{0x41,0x16,0x9a,0x66,0xf9,0xa6,0x3f,0x28,0x57,0x82,0xa6,0xc2,0xdb,0x81,0xcc,0x3f,0x70,0xb3,0xad,0xa2,0x1a,0x68,0xc8,0x47,0x45,0xc8,0x8a,0x74,0xc3,0xb0,0xa2,0xde,},{0x01,0xd7,0xc9,0xb5,0x70,0x1a,0xf7,0x1e,0x2f,0x48,0x77,0xff,0xc9,0xb7,0xb5,0x30,0x5f,0x52,0x81,0x6d,0x44,0x58,0xe3,0x7e,0x41,0xc7,0x71,0x9f,0xac,0x1d,0x76,0xa0,0x1f,0xff,0x3f,0x50,0xfe,0x1a,0x58,0x75,0xcc,0xc3,0xfb,0x70,0x00,0x1c,0x94,0x7a,0x33,0xfc,0x8b,0x20,0x7d,0xe1,0x35,0x72,0xcc,0xdb,0x8b,0xa9,0x89,0x33,0xab,0x01,},"\x75\x76\x21\xb1\x67\x5d\xb7\xca\xce\xf7\xf2\x78\x25\x87\xff\x3a\xf5\x1a\x3e\xf2\xf4\xbc\xf9\x27\x9c\x4c\xe9\x40\x02\xe1\xf0\x04\x24\xbf\x0e\xb6\x21\x98\x2c\xc8\x5c\xb4\xd1\x71\xe5\x64\xa0\xc2\xf6\xe3\x56\x7a\x1a\xae\x2c\xdd\xb7\xe9\xb2\x5f\x47\xdc\x20\xa5\x10\x50\x54\x29\x69\xca"}, +{{0x1a,0xcb,0x4a,0x25,0x6c,0x2f,0x89,0x93,0xca,0x24,0xde,0x1e,0x00,0x14,0x60,0x6d,0x66,0x8b,0x5e,0x75,0x60,0x32,0xd2,0x69,0xf1,0xd2,0x4d,0x35,0x1c,0x8e,0xea,0x4a,},{0xcb,0xbd,0xcd,0x8c,0xbc,0x88,0x5a,0xb4,0x3a,0x05,0x7e,0x5f,0x95,0x79,0xf1,0x16,0x19,0x54,0x15,0x9e,0x7b,0x56,0x2e,0xa2,0x6c,0xd9,0xa4,0x3c,0x88,0xd3,0xf9,0x6d,},{0x05,0xaa,0x76,0xf7,0xfe,0x51,0x89,0x23,0x03,0xd7,0x89,0x14,0x71,0x59,0x95,0xe7,0xd7,0x68,0xff,0x77,0x14,0xce,0x27,0x0f,0x17,0x5e,0x56,0xaf,0x17,0xae,0x01,0x8d,0x3f,0xa9,0x39,0xf5,0xf6,0x20,0xde,0x82,0xbc,0xd1,0x54,0x96,0x87,0xb2,0x05,0xc7,0x87,0x12,0x03,0xe6,0x24,0x23,0x8c,0x4e,0x30,0x9f,0xab,0x7f,0x92,0xfb,0xaa,0x05,},"\xc4\x6a\x6d\x61\xaa\x0a\xed\x1c\x1d\x85\x47\xa7\x0b\x89\xb7\x19\x64\x75\xd5\xa4\x87\x08\x81\xb1\xec\xd0\xf0\xcb\x9c\x74\x5f\x8a\x2a\xdc\x80\x24\xe2\xdc\x55\xb5\x3a\xa5\xd3\x83\xa8\x1a\xab\xc1\xa4\x7e\x8d\x07\xd0\x0b\x7f\x0b\x56\xce\xdd\xbf\xb1\xf4\x24\xbb\x5c\x02\x18\x46\x78\xa6\x66"}, +{{0xac,0xe3,0xc4,0x64,0x24,0x82,0x36,0x22,0x97,0x9f,0xc3,0xa8,0x4a,0x7d,0xa6,0x9c,0x1d,0x52,0x7d,0x83,0x12,0xe8,0xfb,0x01,0x83,0x75,0xbd,0x3a,0x96,0xc2,0x9c,0x18,},{0x93,0x7c,0xf3,0x41,0x36,0xd9,0xe1,0xcc,0xe0,0xde,0x11,0xb1,0x2c,0x70,0xcb,0xfb,0x74,0x55,0x44,0x84,0x21,0xe9,0x2c,0x82,0xe7,0xc4,0x09,0x34,0xbf,0xf8,0xc6,0x76,},{0xfe,0xb8,0x89,0x6d,0xd3,0xfe,0x60,0x01,0xff,0xea,0x17,0x1b,0x37,0xb7,0x88,0xa6,0x9f,0x7f,0x85,0x01,0x93,0xa6,0x34,0x06,0xf5,0x63,0x76,0xdd,0x26,0x3d,0x09,0x9a,0xef,0x80,0xec,0xe6,0x7e,0x2c,0x43,0xf4,0x0e,0xca,0x46,0x2c,0x6b,0x71,0xe7,0x94,0x06,0xb1,0x8d,0xb7,0x4a,0xe5,0xd4,0x98,0x44,0xe3,0xb1,0x32,0xbc,0x2a,0x13,0x07,},"\xa9\xf1\x37\xbc\x90\x21\xbf\x10\x5a\xee\x25\xbe\x21\xcd\x9e\xe5\xb3\x54\x7c\xf1\x0c\xc5\xf9\x84\x76\xfb\x58\x8b\xd7\x0e\x2d\x6d\x6b\x08\x34\xe8\x42\xe4\xee\x94\x30\x3c\xf9\x6b\x09\xc1\x71\x53\x81\xb3\x6e\x14\xa4\x91\xb8\x0f\x89\x5e\xa4\x21\xb8\xec\x2b\x1d\x3c\x18\x7e\x02\x93\x5c\x55\x26"}, +{{0x88,0xf6,0x81,0x93,0x4e,0x33,0xc3,0x5c,0x07,0xdc,0x6e,0x5a,0x83,0x29,0x42,0xae,0x3d,0x59,0x90,0x3c,0xcd,0xe2,0xf7,0x6c,0xcb,0x75,0x87,0xce,0xa7,0xec,0x41,0xb6,},{0x6a,0x4e,0x8a,0xa5,0xad,0xb6,0x3d,0x22,0xfd,0x7b,0x14,0xa2,0x6f,0xdb,0x03,0xb7,0xc8,0xaa,0x6c,0xcd,0x5a,0x19,0x6f,0x2c,0x54,0xb0,0x46,0x5a,0xdb,0x50,0x92,0xe1,},{0x45,0xb2,0x7b,0xf1,0xb9,0xea,0xc0,0x6b,0x62,0xb6,0x86,0xf6,0xd5,0x46,0x56,0x3b,0x2d,0xfe,0x5b,0x17,0x5d,0xbe,0xf3,0x2b,0xf7,0x8c,0x35,0xa1,0x6c,0x95,0x8a,0x9d,0x4f,0x26,0xd2,0x91,0xde,0x9b,0xb2,0x06,0x6c,0x0a,0x28,0x61,0x13,0xcc,0x09,0x17,0x2d,0x40,0xa3,0x6d,0x4c,0xbd,0x95,0x17,0x08,0x86,0x02,0x26,0xeb,0x30,0xcd,0x05,},"\x6e\x8b\xac\x1f\x85\x3b\x81\xfe\xf9\x47\x07\xe1\x8c\xc6\x1c\x6f\x0a\x9c\xbc\x2a\x41\xd0\x78\xdc\xc8\x3f\xc0\x22\x9c\x7f\x8d\xbe\x6d\xbd\xd9\x08\x54\xb1\xf1\xae\x2b\x9f\x2b\x12\x0b\x86\xa8\x78\x6b\x4e\x78\xce\x23\xab\x86\xba\xaf\x88\x75\x4a\xf0\xf3\xd8\x88\x81\xda\xe0\xbc\x52\x61\xbf\xd0\x38"}, +{{0x48,0x05,0x0a,0x6e,0x01,0x58,0xf6,0xad,0x25,0x34,0x12,0xe4,0x49,0x7c,0xff,0x62,0xd5,0xee,0x55,0x5e,0xdf,0xfe,0x59,0xe4,0xdc,0x40,0x15,0x22,0x81,0x32,0x95,0xce,},{0x97,0x5e,0x01,0x0a,0xbb,0x9a,0x3e,0x56,0x65,0x91,0x37,0xb0,0x50,0x60,0x57,0xf2,0x83,0x98,0x2f,0x88,0x6c,0xa1,0x72,0xc7,0xbc,0x2c,0x50,0x0e,0xd9,0xbd,0x26,0xc1,},{0x72,0x16,0xab,0x60,0xc3,0x51,0x68,0x18,0x7d,0x0f,0xce,0x47,0x53,0xc8,0x6e,0x80,0x05,0x8d,0x54,0x0b,0x76,0xbf,0x95,0x84,0x3a,0x58,0x98,0x84,0x10,0x60,0xa9,0x9a,0x44,0xde,0x6f,0x43,0x96,0x25,0xa3,0xf6,0x36,0x5f,0x59,0xc3,0x77,0xbf,0x45,0x90,0x9b,0xbf,0xef,0x5c,0x50,0xb2,0x5f,0x31,0x94,0xe5,0xfb,0xd3,0x4e,0xa5,0xe7,0x06,},"\xed\x6e\xec\x29\xfb\x70\x49\xdf\xf7\x07\xf0\xa4\x42\x6e\xbc\x8f\x5b\x35\x0e\x95\x87\x0b\x9d\x61\x98\xc8\x13\x9e\x9c\x3e\x1e\x40\x99\x37\xd1\xa8\x58\xa0\xde\xa4\x82\xa5\xcb\x1a\x85\x4e\xd3\xb5\xa9\x39\x7a\xcb\x63\xbf\xf6\xb6\x40\x39\xef\x2e\xb1\x15\x9e\x99\x85\x83\x10\xbb\xbd\x86\x12\x5c\x3e\x0e"}, +{{0x18,0xd1,0x3d,0x0c,0x00,0xe8,0xe3,0x38,0x6a,0x5c,0xfb,0x30,0xa9,0xe7,0x9f,0xe8,0x8b,0x18,0x61,0xed,0x2d,0x12,0x01,0xeb,0x17,0x00,0x38,0xe1,0x94,0x77,0x04,0x03,},{0xa4,0xaf,0xc8,0x33,0x40,0x18,0x76,0x09,0x0d,0x9b,0x88,0x0c,0x41,0x26,0x7d,0x68,0xcb,0xbe,0xea,0xa3,0x8a,0xfb,0x20,0x88,0x4e,0x27,0x32,0x8f,0x3b,0x7f,0x53,0x5e,},{0x03,0x39,0x88,0x15,0x4c,0x5d,0x79,0xd2,0x51,0x0b,0xe8,0x3e,0x77,0x80,0x15,0xdf,0xe2,0xfb,0x85,0xb8,0x11,0x1f,0x7e,0xc1,0x39,0x91,0x8b,0x54,0x00,0xe3,0xd6,0x56,0xee,0x80,0xa9,0xf5,0xc9,0x07,0x2b,0x5b,0x46,0x7a,0x5c,0xc5,0xa5,0x7c,0xc8,0xad,0x10,0x62,0xb5,0xbf,0xf1,0x08,0x62,0xd9,0xd3,0x69,0xdd,0xe2,0xcc,0x96,0x67,0x01,},"\x91\x0f\x6c\x27\x2d\xd9\x79\x31\xac\x47\x31\x0d\x24\x4c\xad\xb4\x32\x51\x36\x5e\x02\xba\x9f\x6a\x5b\x3c\x32\x26\xbe\x9d\x7d\x3a\x74\xa2\xba\x49\x06\xe8\xe7\x1a\x4b\xf3\xd3\x55\x6e\xbd\xfc\x66\x6c\xd6\xb1\x2f\x20\xc4\xa0\x08\x34\xb8\x8f\xbb\x24\x45\x75\x19\x92\x86\xb0\xb9\x34\x4c\xf3\x34\xaf\xf0\x07"}, +{{0x4a,0xdc,0x8c,0x28,0x64,0x6a,0x93,0xa8,0x17,0x29,0x3a,0x14,0xd2,0x9b,0x48,0xe2,0xc6,0xd7,0x12,0xa6,0x89,0x93,0x54,0x7a,0x5c,0x5e,0x4d,0x14,0x52,0xac,0xbc,0x3a,},{0x7f,0x40,0x47,0x36,0x28,0xf2,0x3f,0xc0,0xdf,0xf0,0x02,0x1a,0xfd,0x48,0x77,0x40,0xd4,0x91,0x6a,0x91,0x22,0xe6,0xc9,0x7d,0x36,0x43,0x3e,0x5e,0xbf,0x04,0xf8,0x8c,},{0x6d,0x3b,0x4e,0x90,0xec,0x40,0x83,0x11,0xf9,0xb1,0x5b,0x92,0x53,0xd3,0xd9,0x5c,0x5d,0x15,0x26,0x20,0xc2,0x60,0xd5,0x63,0x02,0x55,0x5a,0x88,0x04,0xa5,0x10,0x4b,0xa5,0xe8,0xd2,0x9e,0xe1,0x08,0xe7,0x64,0xa6,0x42,0x19,0x29,0x72,0x98,0xab,0x76,0x74,0xbb,0xca,0x78,0x4d,0xee,0x28,0x77,0x3b,0x34,0xe1,0x85,0xa3,0x86,0xc2,0x08,},"\x09\xfb\x55\x01\xf1\x68\x8f\x80\xa0\xab\x9e\x22\xd7\x78\xae\x13\x0a\xca\xf7\x4d\x7f\x51\x85\xb4\xda\x19\x8c\x6b\x9e\xda\xc4\x30\x2e\x2b\x75\x3e\x57\x87\x66\xe1\x7d\x40\x56\xdc\x40\xd9\x5c\xf4\xca\x8b\xcc\x65\x65\x79\x5e\x97\xd6\x8b\xcd\xa7\x9f\xa7\x7c\x49\x33\x97\x71\x63\x56\x16\x4c\xaa\xb5\xd1\x9c\xfd"}, +{{0xf2,0x6e,0x1c,0x84,0x69,0x7a,0x49,0x08,0x15,0x1b,0x44,0x7d,0xcf,0x6c,0x7c,0x7a,0x38,0xb0,0x40,0x81,0xdb,0x9e,0x7c,0x77,0x38,0xe6,0xfe,0xc9,0x00,0xbe,0xd0,0xc1,},{0xa8,0x6e,0x14,0x22,0xc1,0x23,0x5f,0xf8,0xe1,0xaa,0x08,0x34,0x70,0xd5,0xe4,0x22,0x88,0xcb,0x00,0x7a,0xb5,0x0e,0x79,0x5d,0xd0,0xb4,0xff,0x87,0x39,0x49,0x66,0xc4,},{0x44,0xf3,0x34,0x4b,0x95,0x66,0xc9,0xdf,0xd2,0x2d,0x61,0x98,0xe1,0xcb,0xf9,0x5d,0x9e,0x28,0xf2,0x98,0x2f,0xc7,0xf1,0x66,0xab,0x25,0xdd,0xa3,0x0c,0x46,0xf7,0x68,0xc5,0x58,0xe0,0x39,0x4f,0xb9,0xab,0x3e,0x1d,0x4d,0xb4,0xcf,0x48,0x7c,0x17,0x64,0x1a,0x13,0xf3,0xf4,0x89,0x39,0xe0,0xc6,0x48,0x27,0xa7,0x51,0x03,0xc5,0x74,0x06,},"\x54\xed\x47\x60\x6a\x14\x87\xc2\xf9\x00\xce\xfb\x6e\x89\x9d\xba\xf6\xc3\x1c\xc8\x8e\xbe\x35\x58\xb8\x3b\x93\xf6\xd4\x22\xc3\x1e\x88\x8e\x48\xe5\x20\xee\xae\xdd\x7e\x55\x4a\x9c\xd4\x0c\x2c\x51\x9d\x53\x3b\x61\x44\xce\xe4\x84\xc3\x89\xe9\x76\xb1\xe4\x02\x2b\x50\xe7\xdb\xb8\x7e\xad\x7e\x54\x1a\x20\x04\xda\xf7"}, +{{0xcc,0x0c,0x33,0xf3,0xa8,0x6f,0x5a,0x17,0xd3,0x0c,0x18,0x6c,0xe0,0xf3,0xb7,0x40,0xba,0xfa,0x5f,0xe3,0xc7,0x09,0x0f,0x14,0x35,0x41,0xe2,0xb2,0xc1,0xe5,0x34,0xbc,},{0x96,0x7a,0x71,0xc7,0xcf,0x9b,0x82,0xcc,0x78,0xcb,0xe1,0x09,0x10,0x4d,0x8b,0x43,0x8a,0x8d,0x1f,0xd7,0x1d,0x26,0x0d,0x02,0x90,0x46,0xa9,0xa4,0x52,0x68,0x66,0xff,},{0xe2,0x77,0xb3,0xdd,0x65,0x5c,0x33,0xff,0x75,0xfa,0x92,0x0a,0xf1,0xfc,0xc8,0x59,0x40,0x1e,0x6c,0x7a,0x6e,0xf4,0xc6,0xbf,0xbf,0xac,0x50,0x69,0x63,0x8f,0x19,0xca,0x11,0x5b,0xaf,0x13,0xc0,0x9c,0x82,0xaf,0x79,0x3f,0xac,0xb6,0xab,0xd0,0xcd,0x58,0xe8,0x48,0x1b,0x08,0xc1,0xb6,0x8a,0xd7,0xa2,0x66,0x5c,0x4a,0x61,0x4a,0x28,0x06,},"\x19\x44\xe5\xe1\x55\xd7\x5e\x0d\x0b\xe9\x2e\x1b\xe1\x4c\xec\x37\x0a\xd1\x37\x91\xf2\xbf\xd4\x0f\x27\x12\x14\xe9\x4f\xcf\x21\x3c\x71\xbc\x20\xd7\xce\x0c\x75\x84\x42\x1a\xc4\xef\xc4\x51\x88\x3c\xc3\xf4\x95\x6f\x21\xf7\x3a\x42\x16\x72\x04\x38\xbc\x38\xff\x2c\xfd\xf3\x70\x99\x05\xa5\x0a\x9d\x94\xb1\xd9\xe7\x93\x2b"}, +{{0xf0,0xbc,0x97,0x93,0x75,0xa7,0x07,0x30,0x68,0xdb,0xa7,0xf6,0xc0,0x94,0xdb,0x65,0x98,0xb4,0xe4,0x5d,0xf7,0xd5,0x49,0x58,0x3c,0x22,0xfd,0xed,0x80,0x48,0xfa,0x2e,},{0xb4,0x2b,0x6c,0x57,0xa7,0x8f,0x1d,0x90,0x09,0x0a,0x71,0x81,0xab,0x2a,0xe0,0x9f,0x42,0x6c,0xbc,0x2b,0xe9,0x6e,0xb2,0xcf,0x27,0xab,0xc7,0x0d,0x7d,0x32,0xa4,0xb3,},{0x19,0xdb,0xc3,0x02,0x7f,0x9f,0xae,0x70,0x7d,0xeb,0x76,0xf5,0x88,0xf9,0xfd,0x07,0xaa,0x8e,0xae,0x29,0xbd,0x4e,0x1d,0x04,0xc2,0xc9,0x84,0x38,0x82,0x86,0xb3,0xb1,0x22,0x24,0x8a,0x6c,0x03,0xed,0x67,0xec,0xa3,0x5d,0xf4,0xdb,0x3d,0xc1,0xe4,0x23,0x7f,0x26,0x78,0x92,0x51,0x84,0x97,0xd9,0x55,0x2a,0x21,0xde,0x19,0xb5,0x14,0x0f,},"\x27\xab\x30\x49\xb5\xc6\x35\x1f\x6c\xfe\x38\xb1\x3a\x05\x9f\x50\x37\x25\x7e\xe3\xd6\x5d\x60\x79\x65\x68\x56\xed\xc8\x76\xea\x08\x1f\xd8\xa9\x48\x04\x66\xf8\x83\x94\x78\x08\x84\x66\xf5\x1e\xcb\xfa\xf2\xd6\x5d\xef\x25\xf0\xc4\xdd\x8d\x08\x58\x82\x02\x81\x22\x32\xf5\x79\x45\xdf\x8a\x6f\xa1\x61\xed\x8c\x03\x43\xb5\x83"}, +{{0x30,0x22,0x97,0x5f,0x29,0x8c,0x0a,0xd5,0xdd,0xbe,0x90,0x95,0x4f,0x20,0xe6,0x3a,0xe0,0xc0,0xd2,0x70,0x4c,0xf1,0x3c,0x22,0x1f,0x5b,0x37,0x20,0xaf,0x4d,0xba,0x32,},{0xb8,0x45,0xbc,0xe3,0x8e,0x26,0xab,0x02,0x7b,0x82,0x47,0x46,0x3d,0x43,0x7a,0x71,0xbb,0xdd,0xca,0x2a,0x23,0x81,0xd8,0x1f,0xad,0x4c,0x29,0x7d,0xf9,0x14,0x0b,0xd5,},{0xae,0x14,0xa8,0x60,0xfa,0xd0,0x05,0x1b,0x3e,0xb7,0x2b,0x37,0x21,0xa8,0x2f,0x7b,0x95,0x46,0xb2,0x86,0x72,0x61,0xe2,0xb7,0xb6,0x38,0x97,0x9e,0x25,0x61,0xbd,0xeb,0x89,0xb6,0x00,0x76,0x8f,0x82,0x45,0x0a,0x66,0xc8,0xb0,0x48,0x12,0x83,0xfa,0x21,0xcb,0x6c,0x53,0xbd,0xe3,0x50,0xef,0xfb,0x68,0xa7,0xd1,0x11,0x4b,0xfd,0xb2,0x03,},"\x9a\xa1\x9a\x59\x5d\x98\x93\x78\xcd\xc0\x68\x91\x88\x7e\xf5\xf9\xc2\x46\xe5\xf8\x3c\x0b\x65\x87\x10\x67\x3e\x4e\x7d\xb7\x60\xc7\x63\x54\xc4\xf5\xd1\xe9\x0d\xb0\x4a\x23\xb4\xfb\x43\x4c\x69\x38\x45\x93\xd0\x10\xe3\x12\xb1\x1d\x29\x9c\x9f\x97\x48\x2d\xe8\x87\xce\xcf\xe8\x2e\xa7\x23\xbc\xa7\x9a\x1b\xd6\x4d\x03\xef\x19\xee"}, +{{0x0f,0x71,0x0b,0x6c,0x48,0x1f,0x71,0x44,0x95,0x89,0x75,0x33,0x12,0xef,0x64,0x93,0x2b,0x46,0x52,0xeb,0xe0,0xe0,0x75,0x97,0xf7,0xda,0x1c,0x4f,0x3d,0xcf,0xfb,0x80,},{0x69,0x73,0xff,0x29,0x32,0xcc,0xdd,0xfc,0x1d,0x16,0xc4,0xc0,0xda,0x50,0xc8,0xb2,0x9f,0xe6,0x45,0x2d,0x1e,0xe8,0x4d,0x52,0x06,0x4e,0xbf,0x3d,0x62,0x8d,0x40,0x3e,},{0x02,0xa8,0xd2,0x6a,0xee,0x11,0x42,0x0f,0xb4,0xf0,0x9d,0x11,0x63,0xe1,0x4b,0x86,0x7d,0xf7,0xc6,0xf6,0xc8,0xf8,0xdc,0x7a,0x78,0x03,0x46,0x59,0xf0,0x40,0x1c,0xad,0x0a,0xa9,0x03,0x97,0xef,0xdd,0x07,0x04,0xb7,0x98,0xdb,0x19,0x36,0x50,0x30,0x26,0xe2,0xa1,0xad,0xc2,0x97,0xe2,0x79,0x74,0xd4,0xbe,0x31,0x2a,0x37,0x53,0xf8,0x04,},"\x85\xd8\x57\x44\xad\x55\xe9\xef\x9a\x65\xca\x91\xe8\x5c\x8a\x4f\x80\xe4\xc5\x8f\x8e\x4e\x93\x54\xe8\x33\x98\x60\x98\xb7\xd9\xfe\x9f\xdc\x0d\xed\xb0\xd7\x5d\x25\x39\xfb\xa0\x00\x34\xfc\x0c\x2e\x84\x34\x4d\x1e\xda\xa0\x9d\x4f\x63\xd5\x54\x6d\x67\x80\x3d\xd6\xb5\x4d\xdc\xc0\xb1\xd3\xf2\x58\x2d\xd7\x52\x89\xe3\x1d\xe4\x2e\x69"}, +{{0x7a,0x05,0xf1,0x21,0xf6,0x01,0x12,0xdd,0x16,0xfe,0xe8,0xc9,0x1b,0xc2,0xa1,0x14,0x79,0xf4,0xb6,0x7e,0xe3,0x34,0x56,0x04,0x2c,0x8d,0xe1,0x67,0xfc,0x58,0x80,0x17,},{0xb3,0xb0,0x5b,0xe9,0x89,0xce,0xa7,0x19,0x75,0x05,0xd4,0xb5,0x43,0x35,0xe5,0xe1,0xd7,0x7a,0x4b,0x52,0xba,0x72,0x82,0x60,0x4b,0xbc,0x1c,0xf6,0xc4,0xe8,0x7a,0x6c,},{0xd3,0x0c,0xe8,0xa3,0x22,0xb4,0x50,0xa2,0xfb,0x1a,0xfd,0x32,0x9c,0xec,0x85,0x59,0xcc,0xf1,0x12,0xbd,0x83,0x96,0x5f,0x9e,0xc4,0x73,0x62,0x70,0xa0,0x91,0x4e,0x06,0x11,0x96,0xbf,0x52,0x09,0x77,0x8c,0x9f,0x8c,0xcf,0x39,0xc4,0x66,0x8b,0xbf,0x0e,0x13,0x63,0xf8,0x1a,0xfe,0x45,0xdd,0x74,0xe8,0x0d,0x58,0x75,0xdd,0xbf,0x6f,0x01,},"\xd9\xc5\x9e\x8c\xc4\xed\xe5\x37\xbe\x21\x22\xab\x49\x2a\x5b\x91\x5a\x9b\x0a\x11\x4b\x2a\xde\x35\x6f\xc0\x45\x7e\xf9\x87\x22\xd5\xf5\x67\xb8\x62\x11\xe2\x83\x69\xd1\x41\x68\xec\x4a\x3c\x80\x40\x76\xe1\x54\xad\xc7\x0a\x66\x8c\xf6\x4a\x20\xd1\x3c\xf1\x90\xd1\x15\xcd\x68\x8d\x03\x6e\x46\x93\x82\x51\xdf\x49\x64\xdc\x35\x17\xb1\x0c"}, +{{0xbf,0x38,0x1f,0x8d,0xfb,0x5d,0x0c,0x6d,0x64,0xe4,0x16,0xac,0x23,0xe0,0xd0,0xfc,0xb8,0x6e,0xbb,0x89,0x9b,0x1d,0x14,0x6a,0xbd,0x91,0x1b,0x92,0xa7,0x80,0x8e,0xb6,},{0x86,0x3f,0xad,0x8d,0x1f,0x1b,0xc6,0x30,0xa1,0x5f,0x6f,0xe8,0xec,0xef,0xe6,0xb4,0x49,0x7b,0x60,0xb2,0x1a,0xe8,0x83,0x0d,0xa4,0x67,0x42,0x04,0x5f,0xef,0x15,0x6f,},{0x99,0xb7,0x53,0x78,0x73,0x8f,0xca,0xc8,0x06,0x76,0x69,0xe8,0x50,0x9b,0x5d,0x26,0x07,0xe1,0xef,0x76,0xaf,0x90,0x04,0xe1,0x3f,0xe5,0xd3,0x93,0x2d,0xf6,0x0b,0x16,0x82,0x16,0xf5,0x85,0x65,0x34,0x0f,0xa4,0xd6,0x38,0x05,0x5a,0x89,0x04,0x4e,0xe7,0xd4,0x5e,0x2b,0xd0,0x82,0xa5,0x33,0x82,0x28,0x9a,0x34,0x70,0x06,0x48,0x98,0x0e,},"\x86\x54\xf2\xf5\xc6\xdc\xd2\xcf\xcb\xb6\xed\x8d\x2b\xc5\xfb\x5f\xec\x53\xe3\xef\xfb\x0d\xe6\x5a\xac\x50\x7f\xa5\x6c\x89\x77\x32\x39\x5a\xa0\x99\x46\xd3\xb6\x58\x6a\x92\xed\xd6\xdc\x99\x31\x5e\x1b\xa7\x4c\x6a\x02\x47\xc4\xba\x77\x60\xb9\x48\xeb\x3c\x09\x32\xd9\xfe\x1f\x0e\x9f\xea\x6e\xb6\x1a\x54\x8a\x9a\xb4\x8f\xfd\xf1\x54\x73\x29"}, +{{0x36,0x98,0x32,0x41,0xa0,0xa8,0xe6,0x0c,0xe0,0x2a,0x61,0xb3,0xfa,0xfa,0xb1,0x5a,0x73,0x13,0xa5,0xa2,0x70,0xd0,0x15,0xb9,0xc9,0xec,0x07,0x0d,0xc4,0x2d,0xee,0xda,},{0x66,0x47,0x98,0x4d,0x42,0xb9,0xa5,0xb3,0xb1,0xaf,0xa3,0xb7,0xf8,0xf4,0x9d,0x4c,0x2b,0x05,0xe3,0x89,0x84,0xe9,0x9c,0xea,0x8f,0xd6,0x82,0x35,0xd2,0xae,0x46,0x27,},{0xee,0x37,0xdf,0x8a,0xf4,0x22,0xf9,0x1f,0x85,0xdf,0xe4,0x3e,0xfe,0x79,0xf6,0x23,0x78,0x06,0x8c,0xcd,0xba,0xf3,0x91,0x6e,0xec,0xbc,0x3a,0xdf,0xed,0x05,0x08,0xbd,0xeb,0xaf,0x5c,0xe0,0x6b,0x3b,0xc2,0x79,0xf7,0x80,0x87,0xf0,0xdb,0x8d,0xb3,0xc6,0x82,0x3e,0xdf,0xb3,0x2c,0x12,0x21,0x78,0x30,0xbe,0x72,0x3d,0x88,0x72,0xb3,0x0c,},"\xce\xbb\x9e\x40\x44\x51\x81\x82\x53\xc0\x39\x2a\x45\x54\xee\x73\x23\xc5\xd5\xb8\xb2\x26\x77\x57\x00\xb8\x06\xed\x5b\x91\x33\x79\x16\xea\x7e\xcb\xc3\xd4\x10\x3f\xc6\x5e\x53\x72\xae\x7e\x5f\x9b\xa2\xd8\xf5\xae\xe2\x4c\xcf\x6e\x63\x1a\xe2\x0c\x4a\xf9\xb5\xf7\x28\xcd\xf8\x9e\x81\x89\xde\xf1\xa5\xb3\xd3\x53\x47\xaa\x20\x35\x25\xea\x1d\x2e"}, +{{0xd0,0x68,0x99,0xf9,0x3a,0x40,0x8d,0xac,0xb4,0x1c,0x96,0x97,0x18,0x34,0x6f,0x1e,0x28,0x9b,0xb5,0xea,0x65,0xe2,0x83,0xff,0x79,0xc7,0x05,0xa0,0x74,0x51,0x7c,0x35,},{0x46,0xbf,0x2a,0x08,0xa0,0x76,0xc4,0x7d,0x7f,0x11,0xb7,0x33,0xf8,0x14,0x1c,0x35,0x53,0x63,0xed,0x85,0xd7,0xde,0xf2,0x6b,0xa6,0xa0,0xce,0x15,0xac,0x5f,0x2b,0xe8,},{0x6f,0x89,0xde,0x92,0xa6,0x6b,0xc5,0xf4,0x14,0x43,0x39,0x12,0x49,0x50,0xbd,0xf5,0x88,0x14,0x4c,0xb3,0x72,0xf6,0x73,0x62,0x45,0x35,0x1c,0x94,0x76,0xbe,0xcc,0x59,0xa2,0x58,0xf9,0xa9,0x33,0xff,0xff,0x2b,0xef,0x4b,0x46,0xcd,0x10,0x57,0x39,0x52,0x25,0x79,0x9f,0xd0,0x9d,0xed,0xe6,0x82,0x3d,0xb0,0xe3,0x25,0xdb,0xc8,0x14,0x0d,},"\x08\x64\xc3\x9a\xc4\xfd\xa8\xeb\x90\x48\x59\x7b\xd4\x0b\xe0\x40\x10\x21\xfd\x2d\xd3\xa3\x39\x0a\x8f\xac\xce\x98\x4b\x26\x0a\x13\xfa\x2c\x7c\xfc\x00\xd1\x92\xfa\xdf\x13\x4a\x0a\xd5\xa1\x81\xee\x89\xef\xf0\xc7\x95\xea\xa0\xfb\xfe\x2f\x3b\x26\x11\x5d\x07\x16\x8d\xb4\x2e\xd2\x1a\x51\x30\x3b\x19\x58\xe4\xa4\x2d\xc0\x65\xb2\x2c\xe4\x8f\x17\xa6"}, +{{0xee,0xbc,0xa7,0x96,0x69,0x70,0xee,0x9f,0x2c,0xc4,0xd7,0x4c,0x6f,0x1d,0x8e,0x0e,0xbf,0xf7,0xc4,0x5a,0xeb,0xad,0x34,0x9f,0xb9,0xf8,0x6d,0xf6,0x28,0xdf,0xff,0x0e,},{0x89,0x10,0x1e,0x03,0x09,0xf7,0x67,0xe6,0x4a,0xe9,0xc9,0x8c,0x4a,0x5d,0x8d,0x23,0x28,0xfb,0x3e,0xf2,0x62,0xd0,0x82,0xf4,0x9b,0x64,0xca,0x20,0x9e,0x19,0x90,0xf6,},{0x7d,0x44,0x7e,0xe5,0x32,0x8c,0x9f,0xe7,0xf1,0x19,0x36,0xcc,0x42,0x99,0x87,0x54,0xa5,0x6c,0xd1,0xd2,0xa6,0x95,0x1a,0xf4,0xfe,0xe7,0xc4,0xa8,0xeb,0x31,0x9d,0x49,0x23,0x70,0x7c,0x79,0x3c,0x55,0xd7,0x90,0x67,0xf8,0x22,0xd5,0xb1,0x6b,0xb5,0x77,0x6e,0x38,0xdf,0xfa,0xbc,0x67,0x23,0x7a,0x91,0x6a,0x81,0xa6,0x33,0x39,0xb0,0x03,},"\x0f\xac\x79\x0a\xdb\x9f\x59\xe5\xcb\x0d\xdc\xb2\xb6\x67\x17\x2f\x2a\x21\x03\x4d\x93\xbc\xad\xdf\x18\x86\x06\xfa\x9e\x77\x6d\xb3\x3a\x8f\xcc\x6b\xd7\xf5\x56\x78\x83\xfc\x0d\xe3\x51\xaa\x9a\xfa\xa3\x6d\x20\x75\xb1\xba\x85\x3b\xad\xa8\x49\xb8\x66\x1d\x5c\x81\x54\xe7\xb0\xaf\xea\x65\x6d\xd1\x5e\x01\xa9\xc5\xba\x21\x58\x9b\x02\xf8\xfc\x54\x81\xc2"}, +{{0x38,0x20,0xb6,0xb1,0x59,0x39,0xd0,0xaf,0xe1,0x8c,0x9c,0xb3,0xd9,0xa2,0xa0,0x8f,0x16,0x7d,0xd4,0x58,0xeb,0x6c,0x7e,0x3f,0x15,0x58,0xb0,0xc6,0xdb,0x4c,0x68,0x90,},{0x80,0xb8,0x5c,0x65,0x59,0xfe,0xa8,0xb4,0x00,0xe1,0x99,0x9c,0xc5,0xbf,0xed,0x50,0x7a,0xd7,0xfc,0x29,0x4c,0xd9,0xba,0x0c,0xe2,0xdd,0x25,0x84,0xa9,0x10,0x89,0xb0,},{0x82,0x3e,0xe2,0xc0,0xc8,0xd8,0x7f,0xaa,0x0e,0xc0,0x14,0x1e,0x9c,0xe0,0x8b,0x51,0xe5,0x7c,0x83,0x97,0x92,0xd1,0xfb,0xd9,0x7a,0x96,0x72,0x07,0xfd,0x41,0x58,0x49,0xeb,0xfb,0x5d,0xad,0xb5,0xa1,0xdc,0x2c,0x0a,0x8b,0x7f,0xc6,0x3f,0xc3,0x54,0x85,0x7b,0x8c,0x90,0xc4,0x47,0x20,0xe1,0x3f,0x45,0xcd,0x01,0xe7,0xaa,0x23,0x14,0x0c,},"\x3e\x5a\xd9\x2d\x44\xb4\x0e\x86\x14\xd8\x08\x7c\x9c\x74\x3d\xe0\xc0\x86\x1a\x07\xf1\xf5\x14\x6d\x71\xca\xc2\xf3\x74\x00\x24\xe8\x41\xcc\x2d\x46\x02\x7c\xf5\xd2\x61\xd3\xee\x7c\x18\x75\xb3\x95\x51\x01\x7b\x5f\xb1\x46\x81\x14\xfc\x3e\x09\x8a\x89\x9c\xdb\xd5\x58\xb3\x9f\x09\x8e\x15\x6b\x6e\x98\x01\xeb\xcd\xd6\x5f\xed\x56\xdb\xfc\xaf\x2c\x8c\x78\x7b"}, +{{0x0d,0x20,0xfa,0x4a,0x37,0xff,0x30,0xc4,0xdc,0xc3,0xe4,0x4e,0xa7,0xac,0x50,0x11,0x37,0xe5,0x80,0x7e,0x97,0x81,0x33,0x0a,0xc3,0x10,0x98,0x2c,0xc3,0xd3,0x9d,0xbd,},{0x67,0xbb,0x0a,0x01,0xbc,0x86,0x17,0xb4,0x91,0xef,0xf1,0xa3,0x26,0xc1,0xc7,0x0f,0x7d,0x0c,0x5b,0x95,0xa5,0xad,0x48,0x24,0x1a,0xed,0xce,0x1c,0x6f,0x08,0x83,0xcf,},{0xde,0xab,0x12,0xed,0x82,0xba,0x94,0xb4,0x69,0xca,0x98,0xb6,0x6f,0xa2,0x04,0x44,0xb4,0xb7,0x88,0x1c,0x4f,0x0f,0x85,0x34,0x09,0xc9,0xa1,0x50,0x4a,0x5b,0x2b,0x6d,0x78,0x60,0xf2,0x6a,0xda,0x6b,0xf7,0x34,0x59,0xb9,0xcd,0xb5,0x73,0xc8,0x01,0x71,0x21,0x33,0x8e,0xfa,0x60,0xf4,0x14,0x80,0x86,0xd7,0xa3,0xa8,0xed,0x59,0xbb,0x07,},"\x35\xe0\xf4\xb4\xa5\x17\xf9\xc7\xaa\x45\x14\xf0\x3e\x6d\x65\xf1\x9b\x27\xc6\x2c\xc0\x69\xf6\xbf\x07\xdd\x63\x78\xbd\x6a\xfe\x2b\x76\x65\x60\x00\x6c\xbd\x57\x30\xa0\x09\x19\xed\x11\x19\x1f\xb0\xc8\xda\xc5\x6e\x15\x3f\xc1\xce\xa4\xbd\xce\x50\x46\xcc\xcb\x71\x77\x59\xa4\x08\x3e\x1c\x16\xf7\x40\x76\x32\x64\xcc\x80\x4d\xe0\xd0\xe1\xa4\xb5\xa2\x30\x67\xaf"}, +{{0xbe,0xe1,0x61,0x88,0x1d,0x81,0x9b,0x37,0x0d,0x24,0x0d,0x50,0x9b,0xa4,0x6b,0x06,0xfb,0x82,0x8e,0x20,0x31,0x0d,0x9f,0x6b,0x30,0x97,0x80,0x70,0x3e,0x98,0x92,0x7b,},{0x10,0x85,0x43,0x80,0xde,0x89,0x16,0x2b,0xfb,0x9f,0x78,0x35,0xa2,0x71,0x6a,0x3a,0x6e,0x02,0x65,0x67,0x1b,0x25,0x0b,0x38,0x9d,0x01,0xc3,0xbc,0xc0,0x37,0x36,0xb8,},{0xb0,0x7d,0x07,0x2e,0xb3,0x83,0x1f,0xae,0x8a,0x06,0xef,0xfa,0x92,0x01,0x79,0x74,0x96,0xdc,0xe1,0x26,0xb8,0xe1,0x1f,0xef,0x2f,0xa0,0x7f,0x66,0x4d,0xc5,0xcf,0x3d,0x4b,0xf9,0xc3,0x8a,0x8b,0x3c,0x09,0xfb,0x5f,0x14,0xfa,0x2d,0xeb,0x21,0x9e,0x7d,0x85,0x2f,0xdd,0x27,0xc7,0xba,0x32,0xd3,0x09,0x94,0x2f,0x27,0x46,0xdf,0xe4,0x04,},"\x5a\x6f\xe5\x99\xb6\xb0\x9b\x05\xc0\xba\x6a\x62\x2d\xf3\xa9\x2b\x3d\x37\x6d\x24\xd0\x4e\xa8\x5e\xbe\x76\x7b\xc2\xec\x4d\x14\xe8\x3e\x69\x37\xdc\x0b\x91\x4b\x48\x09\xfd\xb6\x07\x90\x68\x41\xa6\xfd\x1d\xcd\xf6\x1a\xae\xa8\xf9\xbb\x81\xb2\xcc\xaa\x32\xdf\x41\x29\x89\xae\x53\x64\x66\x80\xa7\x1a\x21\x1c\x84\x40\xea\xb0\xf1\xae\xc5\xe4\xfc\x00\xe6\xa2\xc9\x6d"}, +{{0x70,0x15,0x0e,0x95,0x16,0x16,0x4a,0x3d,0x7b,0x7e,0x8b,0x6f,0x25,0x5b,0x65,0xca,0xc9,0xf0,0x74,0x59,0xb3,0x2d,0x11,0xbb,0x94,0xb3,0xd2,0x77,0x20,0x8a,0xbc,0x99,},{0x23,0x28,0xbe,0xc8,0xe4,0x03,0x51,0x04,0x78,0x82,0xe8,0xb4,0x3b,0xc1,0xab,0x08,0x53,0x86,0xfa,0x47,0x98,0x7e,0x46,0xea,0x87,0x60,0x88,0x14,0xc5,0xda,0x71,0x3c,},{0xed,0xa3,0xf5,0x03,0x3e,0xa7,0x95,0x3a,0x0d,0x58,0x3c,0x64,0x57,0x52,0x2e,0x84,0xad,0x78,0x44,0x53,0x04,0xd4,0x8e,0x57,0x7d,0x4d,0x69,0xe8,0x64,0x1f,0xeb,0xe1,0x52,0x48,0xd8,0xd9,0x0c,0xe0,0x94,0x4a,0x8f,0x80,0x1d,0x39,0x09,0x9b,0xc7,0x74,0x94,0xba,0xc4,0xce,0x2a,0x20,0xb3,0x83,0x69,0xc6,0xad,0xfb,0x71,0xe0,0x3d,0x0f,},"\x77\xbe\x8e\xce\xaa\xb4\x31\xa1\x3c\x2a\x28\xd0\xd1\x55\x64\x89\xd8\xc3\x92\xfd\x7a\xe4\x11\x57\xf7\xca\xf0\x82\xcb\x54\xe4\x5f\x08\x62\x6b\xe0\x07\x6b\xe8\x44\xd3\x8f\xde\x90\x1a\x5e\xab\x0e\x88\x32\xd6\x9d\xac\x22\xfb\x85\x07\xfb\x8e\xc4\xfa\xf7\xc8\x8f\xd2\x6d\xa3\x08\x46\x1a\xfe\x38\x59\x87\x97\x2b\x5e\x76\x0a\x34\xa5\xe1\x8b\x9a\x82\xb4\xaa\xa5\x29\xb7"}, +{{0x3f,0x87,0xfc,0xfd,0xb4,0x21,0x42,0x2a,0x9c,0x5f,0xb9,0x82,0x68,0x31,0x3c,0x15,0x12,0x8c,0x78,0x84,0x4e,0xf9,0xeb,0x3b,0x37,0x13,0xfa,0x77,0xb6,0x71,0x89,0x03,},{0x53,0x3e,0xc5,0x92,0x28,0x37,0x4b,0xd0,0x3a,0x46,0x99,0xe3,0xa8,0x89,0x6b,0x86,0x18,0x2f,0xcf,0x8f,0xc3,0x08,0x5f,0xdb,0x8f,0x5c,0x46,0x71,0x52,0x4d,0x6f,0xe0,},{0xf6,0x51,0x9d,0x7e,0xdb,0x61,0x34,0x11,0x19,0x74,0x03,0x3f,0x03,0xb8,0xd8,0x9e,0x9c,0x76,0xca,0xec,0x89,0x65,0xa8,0xe1,0x7c,0xd4,0x5f,0xff,0x19,0xde,0x26,0x15,0xd7,0x3e,0xcc,0xdb,0x4a,0x66,0x64,0xa8,0xf0,0xe2,0x3a,0xdf,0x98,0x98,0x8e,0x96,0x25,0x1b,0xf2,0x6e,0xb7,0xa4,0xcc,0xaa,0xc1,0x07,0x9f,0x0a,0x77,0x2f,0x9b,0x05,},"\xc0\x0f\xed\x2d\x68\x94\x68\xbc\xba\xcc\xcd\x44\x6e\x8d\x8f\x29\x9e\x2a\x86\x92\x5e\x62\xe5\x97\x09\xaf\xaf\x48\x57\x46\x9f\xf1\xe0\x06\xd0\x0f\xa3\xe1\x8a\x36\x15\xf8\xf0\x6b\x6e\xbd\xff\x78\x5d\xde\x58\x85\x1d\x2c\x23\x90\x38\xa0\xc3\x44\xdc\xe9\x85\xbd\x1f\xc8\xde\xb4\x77\x9a\xe5\xf8\x93\x2e\x2f\x9e\xd5\x99\x0b\x64\x72\xdb\xe4\xe6\xfe\xf6\x91\x76\x57\xe0\xb5"}, +{{0x44,0xce,0xef,0x04,0x4f,0xf9,0x98,0xd4,0xab,0xea,0xaf,0x37,0x4e,0xb4,0x1d,0x08,0x67,0x18,0xb6,0x30,0x97,0xb1,0xe3,0x5f,0x89,0x63,0x4c,0x14,0x89,0x71,0x32,0xea,},{0xe8,0x3c,0x86,0x67,0x7d,0x03,0xed,0x3a,0x5e,0x8c,0x95,0xf4,0x1f,0x0b,0x32,0x5f,0xf4,0x33,0x37,0x02,0xf2,0xff,0x69,0x36,0xf5,0x7f,0xf3,0x0a,0xa3,0x14,0x85,0xc7,},{0x55,0x45,0x52,0xd6,0xb7,0x90,0xd4,0x21,0xd0,0x6b,0x0a,0x67,0xf8,0xe0,0x02,0xad,0x7a,0x1e,0xd0,0x1c,0x06,0xcf,0x00,0xcb,0xea,0xec,0x2a,0x26,0x8b,0xda,0x29,0xf1,0x18,0x3f,0x0c,0xea,0xfc,0x62,0x5f,0xa5,0xfd,0xb8,0x47,0xdc,0x86,0xfa,0xe1,0xa2,0x04,0x06,0xe4,0x59,0xd4,0xa0,0x17,0x7c,0xb5,0x15,0x22,0x0a,0x56,0x8e,0x08,0x00,},"\x8d\x3e\x2d\xec\x46\x44\xc7\xb5\x16\x33\xb1\x3e\x63\x75\xca\x42\xff\x91\x38\x46\x5f\x43\xd7\x80\x0c\x73\x13\x19\x9f\x67\xc9\xcf\x1b\x52\x0b\x18\x20\xbd\x63\x0e\xcf\x1c\x99\x2e\x27\x67\xb3\x8e\xb5\xbb\xc4\x41\xa4\xab\x8d\x31\x7d\xb4\x41\xdb\x35\xa0\xfe\x3a\xbe\x7a\x9e\x45\x41\x88\x1c\x2d\x7b\x1a\x26\x12\x30\x69\x59\x81\x5d\x1d\xa4\x12\x67\xd9\x64\x9d\xd4\x49\x4a\xce"}, +{{0x98,0xef,0x2a,0x44,0xd4,0xc8,0x47,0x6d,0xff,0x05,0xaa,0x78,0xdc,0xf9,0xc6,0xdc,0x08,0x6c,0xb2,0xf6,0x22,0xa0,0x67,0x45,0xd6,0x0c,0xbf,0x22,0x3f,0xaa,0xba,0x66,},{0x42,0xfd,0xb1,0xda,0xa3,0x9f,0x01,0x59,0x11,0x9b,0xee,0xc1,0xbe,0xdf,0x6f,0x03,0x94,0xb2,0x6a,0x2a,0x29,0xbd,0x1f,0xde,0x08,0x1e,0xcc,0xda,0xde,0xcc,0x22,0x6a,},{0xab,0x5e,0x87,0x24,0xa3,0xe6,0xff,0x76,0x05,0x8c,0xfb,0x21,0x4d,0x57,0x4e,0x04,0xd0,0x55,0x74,0xec,0xdd,0x4f,0xfe,0x8c,0x07,0xc7,0xaf,0x39,0x6e,0x88,0x26,0x87,0xc5,0xd7,0x9e,0xf1,0xe6,0x2f,0xbb,0x4c,0x5f,0x1b,0xd0,0x6b,0x9b,0xd8,0x97,0x82,0x6e,0xdd,0xe0,0xd1,0x11,0xd9,0x18,0xe8,0xef,0x96,0x1f,0xf2,0xa0,0x0d,0x77,0x00,},"\xc8\xb5\xfc\xfc\x3c\x18\xc7\xd9\x59\x57\xb6\x68\xe9\x1c\x73\x1d\x50\xc7\xfc\xea\x4f\x95\x75\xbb\xf7\x84\x62\x58\x70\xe2\x38\xdf\x54\x6e\x2c\xb1\xa1\x9d\x28\x08\xdd\x5b\x23\x0d\x38\x71\xfd\xec\x16\x10\x0e\xe1\xfb\xf9\xb7\x22\xfa\x37\x44\xa7\x50\xa3\xb3\x96\xb0\x5f\x9c\x21\xb8\xc0\xf6\x1e\xad\x57\xa7\x8c\x5e\xcf\x72\xb5\x79\xcf\xe8\x8a\x3f\x40\x4c\x8a\xcf\x52\x4f\x9a\xb9"}, +{{0x93,0xa8,0xc7,0x92,0xa2,0x39,0xc9,0x31,0x91,0x7c,0x11,0x48,0x24,0xa0,0x17,0x4f,0x8b,0xc4,0xeb,0xbf,0x98,0xaf,0x8c,0x7e,0x32,0x1e,0x0f,0x5b,0xea,0x40,0x15,0xec,},{0x9b,0x2e,0xaa,0x8a,0x9c,0x2c,0x25,0xff,0x4f,0x6e,0x13,0xbb,0x12,0xba,0xe5,0xd0,0x6f,0xda,0x0e,0xb1,0x10,0x5f,0xaf,0xae,0x58,0x80,0xff,0x16,0x87,0x40,0xbb,0x74,},{0xcf,0xe3,0x2c,0x44,0x35,0xd9,0x11,0xd7,0x72,0xdc,0x07,0x27,0xe7,0x8d,0x68,0x9d,0x01,0x64,0xc5,0x06,0x95,0x97,0xcb,0x44,0x1b,0x22,0xc1,0xd2,0x62,0x36,0x47,0x9f,0x1a,0xfd,0x70,0x89,0x12,0x1b,0x9a,0xb4,0xf6,0x1b,0xbb,0x1f,0xae,0x1a,0xb4,0x2f,0x76,0x35,0xa9,0x2a,0x53,0x78,0x4d,0x71,0x70,0x91,0x6b,0x70,0x3a,0xa5,0xcc,0x09,},"\x90\x1b\xf4\xe0\x41\xca\xf1\x6e\x04\xf2\xff\xde\x8d\x6f\xe9\x7e\x93\xd0\x90\x0f\x6b\xc0\xfc\x09\xa9\xa0\x17\x9d\x13\x7b\x4b\x77\x88\xe5\x7e\xb9\x27\x66\xa9\xc6\x34\xf3\x5a\xdb\x5c\x29\x88\xaf\x1e\x86\x20\x8f\x46\x19\x98\xf5\x9c\xfe\xc9\x92\x04\xb4\x84\xfb\xca\xd3\x95\x1e\x7e\xe4\x40\x55\x23\x70\x5d\x97\x39\xb4\x43\x07\xdb\x03\xf7\x13\xfd\xa7\x8d\xb4\x21\xef\x31\x21\xb3\xba"}, +{{0x70,0x01,0xfa,0x0c,0x44,0x04,0xc2,0x8a,0xa5,0xb5,0xfc,0xff,0x30,0xa9,0x61,0xf2,0x1a,0x22,0xf5,0xb8,0x5a,0x9e,0x38,0x2e,0x07,0xae,0xa8,0xa8,0x92,0x4d,0x0e,0xc1,},{0xda,0xeb,0xb6,0x3c,0x4d,0x8f,0x40,0xce,0xba,0x8e,0xc3,0x5e,0x3d,0xd9,0x46,0xa6,0xb7,0x5b,0xc7,0x4f,0xcb,0x29,0xad,0xe7,0xb5,0x5e,0xee,0x3c,0xc3,0xae,0xa5,0xca,},{0x64,0xea,0xc9,0xce,0x87,0x46,0x06,0x18,0x63,0x6b,0x41,0xfd,0x2d,0xec,0xc1,0x67,0x3b,0xfc,0x48,0xc5,0xf4,0x79,0xdf,0xac,0xb5,0x1e,0x86,0x68,0x64,0x07,0x37,0x4b,0x1d,0x10,0xbf,0x65,0xd6,0xd7,0x47,0x42,0x14,0xd7,0x77,0x0c,0x9e,0x5c,0x7f,0x80,0x6c,0x80,0xd5,0x3d,0x48,0xb7,0x20,0x87,0x0e,0x5e,0x78,0xf3,0x2e,0x3a,0x7e,0x05,},"\x44\xf4\x8c\xfb\x02\xf0\x87\x77\xa5\x78\x73\x85\x5f\x96\xbe\x4c\x02\x91\x32\x3f\x27\x39\xb2\x75\xd9\x07\x57\xa1\x54\x72\xe5\x75\x04\x36\xe0\x10\x74\x08\xfe\x30\x26\xc0\x06\x25\x68\x99\x83\xf9\x90\xeb\xa9\xbe\xcb\xfc\xe4\x03\xcc\xd5\x63\x56\xad\x27\x41\xfd\x21\x44\x5d\xfb\x23\xd7\x61\x12\xe5\x78\xb3\x39\x5c\xf9\xd9\x60\x95\x5f\x1d\xa8\xf3\x99\xca\x28\x6f\x21\x39\x0e\x25\xa5\x9a"}, +{{0x3a,0xdc,0xe3,0xa3,0xd3,0xfb,0xc9,0x77,0xdd,0x4b,0x30,0x0a,0x74,0x74,0x9f,0x13,0xa3,0xb0,0x4a,0x5d,0x73,0xa2,0xcd,0x75,0xa9,0x94,0xe3,0x19,0x5e,0xfe,0xbd,0xac,},{0x6f,0xf1,0x9b,0x1f,0x18,0xd6,0x48,0x51,0xd5,0xc7,0x48,0x45,0xc6,0x40,0x7f,0x0b,0xf5,0x96,0xa5,0x2e,0x38,0x5e,0x02,0x01,0x27,0xe8,0x3e,0x54,0xcf,0xf5,0xac,0x19,},{0x7d,0xda,0x89,0xf8,0x5b,0x40,0x53,0x9f,0x5a,0xd8,0xc6,0xde,0x49,0x53,0xf7,0x09,0x4a,0x71,0x5b,0x63,0xdd,0xa3,0x0e,0xc7,0xcf,0x65,0xa7,0x85,0xce,0xae,0x5f,0xc6,0x88,0x70,0x7e,0xe0,0x0b,0xe6,0x82,0xce,0xcb,0xe7,0xee,0x37,0xd8,0xfc,0x39,0xee,0x6d,0x83,0xc6,0x44,0x09,0x68,0x17,0x08,0xa0,0x89,0x8a,0x18,0x3b,0x28,0x8a,0x06,},"\xfe\x6c\x1a\x31\x06\x8e\x33\x2d\x12\xaa\xb3\x7d\x99\x40\x65\x68\xde\xaa\x36\xbd\xb2\x77\xce\xe5\x53\x04\x63\x3b\xd0\xa2\x67\xa8\x50\xe2\x03\xbb\x3f\xab\xe5\x11\x0b\xcc\x1c\xa4\x31\x66\x98\xab\x1c\xf0\x0f\x0b\x0f\x1d\x97\xef\x21\x80\x88\x7f\x0e\xc0\x99\x1e\x8c\x11\x11\xf0\xc0\xe1\xd2\xb7\x12\x43\x3a\xd2\xb3\x07\x1b\xd6\x6e\x1d\x81\xf7\xfa\x47\xbb\x4b\xb3\x1a\xc0\xf0\x59\xbb\x3c\xb8"}, +{{0x14,0x80,0x3c,0x1f,0x23,0xa4,0x7f,0xcd,0xd3,0x5e,0x5d,0x14,0x6e,0x20,0xca,0x63,0x0c,0xd7,0x12,0xc0,0x47,0xd5,0x33,0x0b,0x65,0x2e,0x31,0x85,0x7a,0xcb,0xc9,0xe8,},{0x36,0xf2,0xd5,0xbd,0x6d,0x83,0x24,0xfa,0x6e,0x9d,0xb7,0xf7,0xd8,0x54,0xeb,0xe4,0x8c,0x0e,0x62,0x99,0x99,0x81,0x22,0xe9,0xd4,0x4b,0x8a,0xdb,0xef,0x54,0xf0,0x93,},{0x07,0xa7,0xde,0x6c,0xe9,0x76,0x64,0xb3,0xea,0x09,0x28,0xe1,0x38,0x5c,0x33,0x09,0xbe,0x08,0xa4,0x7c,0xbf,0x4d,0xaa,0x91,0x86,0xa1,0xb9,0x48,0xc8,0x6f,0xbb,0xa3,0x9c,0x4e,0xfc,0xfc,0xb7,0xa0,0xa3,0x86,0x6b,0xc9,0x4c,0x67,0x88,0xff,0xe6,0xbe,0x0d,0x49,0x72,0xe5,0x6d,0x0c,0x32,0x92,0xd1,0xcc,0x6e,0x25,0x44,0x7b,0x99,0x04,},"\x55\x59\x83\x67\x9d\x02\x6e\x53\x54\xb4\xcc\x05\x5a\xe1\xbc\x14\x65\x3c\x72\x81\xec\x72\x23\x72\xf3\xfe\xb7\x78\xe8\x41\xda\x82\x1b\x3d\x0b\x8e\xe7\xa9\xa9\x12\x9e\xa0\x68\x24\xbe\x83\x79\xfb\xbd\xcb\x07\x48\xf4\x23\x72\x1c\xcb\x17\x2a\x1b\xaf\xa1\xd5\xae\x9f\xc1\xc5\x1e\x93\xd4\x1d\xd5\x51\xc3\x08\x60\x79\xb6\x20\x28\x6c\x1c\x40\xc1\x22\x3b\xbc\xbb\x76\x72\x2e\x92\xca\x21\xd8\x41\x0a"}, +{{0x1a,0x61,0x15,0x4d,0x34,0x72,0xcd,0x96,0xb3,0x28,0xee,0x67,0x4b,0xeb,0x4f,0xc8,0x67,0x63,0xa9,0x69,0xfb,0x41,0x04,0x94,0xe0,0x67,0x84,0x14,0xe3,0x1a,0x46,0xa6,},{0x75,0x76,0xd9,0x3a,0xc8,0x5d,0x0f,0xc6,0x1f,0x25,0x8c,0x55,0xcf,0x90,0xbd,0x87,0xa6,0x35,0x09,0x9c,0x0e,0x81,0x0e,0xd0,0xb9,0x37,0x25,0x8d,0x13,0xb4,0x25,0x59,},{0xad,0xa1,0x66,0x6c,0x9c,0x3b,0x82,0x84,0xb8,0xa2,0x1c,0x4f,0x26,0x18,0xef,0x08,0x08,0xa6,0x46,0xf3,0xf1,0x09,0x41,0xe4,0x70,0xf7,0x38,0xe1,0x78,0x5e,0x2d,0xe9,0xfd,0xd9,0xc8,0xcb,0x52,0x6f,0x94,0x5c,0x7a,0x8c,0x69,0x94,0xf1,0x51,0xb7,0xd0,0x66,0x58,0x1b,0x1d,0x75,0x53,0x07,0x94,0x7c,0x62,0xbe,0xfc,0x8a,0xb7,0x07,0x0f,},"\x64\xc5\x65\xef\xbc\xb8\xb9\x52\x8e\xd4\x72\x53\xf3\xc6\xa4\x03\x5d\xb7\x81\xd6\xf0\x97\x6b\x5e\x5b\xa8\x44\x7d\x4e\xd5\x4b\x04\x10\x52\x93\xef\x4c\x00\x0d\x8b\x2e\x1b\x5b\x75\xe7\x27\xe5\xd2\xa0\x77\x74\x3b\x50\xd1\x83\xb4\x91\x76\x48\x01\xa2\x50\x4d\x16\xee\x6d\x7d\x8a\xc4\xfe\x40\xe6\xbf\xc2\xa8\x12\x9c\x72\x85\xa5\xac\x69\x1c\x35\xe6\x42\xed\x16\x2c\xf7\xfb\xc6\x45\x16\x73\x3a\x23\xb3"}, +{{0xf2,0x15,0xd3,0x4f,0xe2,0xd7,0x57,0xcf,0xf9,0xcf,0x5c,0x05,0x43,0x09,0x94,0xde,0x58,0x79,0x87,0xce,0x45,0xcb,0x04,0x59,0xf6,0x1e,0xc6,0xc8,0x25,0xc6,0x22,0x59,},{0x1e,0xd5,0x06,0x48,0x5b,0x09,0xa6,0x45,0x0b,0xe7,0xc9,0x33,0x7d,0x9f,0xe8,0x7e,0xf9,0x9c,0x96,0xf8,0xbd,0x11,0xcd,0x63,0x1c,0xa1,0x60,0xd0,0xfd,0x73,0x06,0x7e,},{0xcb,0xef,0x65,0xb6,0xf3,0xfd,0x58,0x09,0x69,0xfc,0x33,0x40,0xcf,0xae,0x4f,0x7c,0x99,0xdf,0x13,0x40,0xcc,0xe5,0x46,0x26,0x18,0x31,0x44,0xef,0x46,0x88,0x71,0x63,0x4b,0x0a,0x5c,0x00,0x33,0x53,0x41,0x08,0xe1,0xc6,0x7c,0x0d,0xc9,0x9d,0x30,0x14,0xf0,0x10,0x84,0xe9,0x8c,0x95,0xe1,0x01,0x4b,0x30,0x9b,0x1d,0xbb,0x2e,0x67,0x04,},"\xfb\xed\x2a\x7d\xf4\x18\xec\x0e\x80\x36\x31\x2e\xc2\x39\xfc\xee\x6e\xf9\x7d\xc8\xc2\xdf\x1f\x2e\x14\xad\xee\x28\x78\x08\xb7\x88\xa6\x07\x21\x43\xb8\x51\xd9\x75\xc8\xe8\xa0\x29\x9d\xf8\x46\xb1\x91\x13\xe3\x8c\xee\x83\xda\x71\xea\x8e\x9b\xd6\xf5\x7b\xdc\xd3\x55\x75\x23\xf4\xfe\xb6\x16\xca\xa5\x95\xae\xa0\x1e\xb0\xb3\xd4\x90\xb9\x9b\x52\x5e\xa4\xfb\xb9\x25\x8b\xc7\xfb\xb0\xde\xea\x8f\x56\x8c\xb2"}, +{{0x8c,0x9f,0x95,0x08,0x30,0x75,0xa4,0x3f,0xe4,0x26,0xd1,0x9f,0x1e,0x87,0x71,0x9b,0x40,0x04,0x3d,0xe8,0x8e,0xb0,0xee,0x97,0x1f,0x70,0xe1,0x0c,0x76,0x94,0xce,0x4e,},{0xe9,0x1d,0x16,0x7a,0xa3,0xeb,0xc2,0x3e,0x70,0xaa,0xb4,0x5d,0xab,0xe9,0x05,0xe4,0x16,0x26,0x2f,0x91,0x0e,0x2a,0x95,0x5d,0xd8,0x61,0x9e,0xfc,0x74,0xc2,0x4e,0x85,},{0xca,0xc5,0x55,0x22,0x2d,0xaf,0xec,0x76,0xa0,0xb4,0x7b,0x9d,0x2c,0x58,0x6b,0x3b,0x3b,0x9b,0x3b,0x9c,0x83,0x64,0xbe,0xb3,0xca,0xe1,0xe8,0xdd,0x7f,0x1a,0xe9,0xdd,0x74,0xf2,0x2b,0x8d,0xd4,0xad,0x2b,0x29,0x0f,0x81,0x35,0x1a,0x41,0x5a,0x99,0xf0,0x30,0xf1,0x07,0x78,0xbe,0x4c,0xda,0x85,0xd1,0xd3,0x53,0x33,0x1e,0x70,0xf1,0x09,},"\xb6\x9d\x70\xe8\x60\xf5\x5c\x42\x7e\xf2\xa7\x1d\xf3\x6e\x05\xbb\xc4\x3b\xb2\xe0\x64\x63\xaa\x5d\xe3\x44\x19\xc6\xa6\x14\xee\xa6\x69\x53\x35\xa8\x75\x26\xc1\x22\x64\x88\xd8\x42\x89\x1d\x05\x74\xdf\x34\x3c\x9c\x1e\x17\xae\xd6\x95\x8e\xce\xe8\x74\x74\x22\x1e\xb7\x7a\x59\x9e\xcb\x05\x93\x44\xc0\xd0\x52\xc0\x00\x2a\x66\xe5\xa6\x01\x31\x85\xaf\x69\xa0\x1b\xa5\xdb\xc6\x60\xd3\x6c\xae\x23\x5f\x67\xfe\x0e"}, +{{0xd7,0xeb,0x1f,0xba,0x42,0x4f,0xee,0xd1,0x00,0x77,0x7e,0xed,0xb4,0x87,0x4b,0xf2,0x08,0x10,0xad,0x68,0x6b,0x67,0xe3,0x1d,0x27,0xec,0xf6,0x10,0x60,0x9a,0x33,0xf5,},{0xa2,0x5a,0xcb,0x11,0xa6,0xc8,0x25,0x71,0x3a,0x08,0x5f,0xa7,0x54,0x69,0x28,0x86,0xa8,0x7d,0x07,0xfb,0x9b,0xe1,0xa5,0x3e,0xb9,0x61,0x72,0x8b,0xb6,0x6c,0x90,0x60,},{0x2b,0xf7,0x19,0x68,0x2b,0x07,0xcc,0x5e,0xcc,0x04,0x80,0xf3,0x7e,0x9d,0x12,0x3f,0xf6,0xf4,0x4c,0x26,0xe6,0x95,0x8e,0x59,0xf0,0x80,0x46,0x6f,0x9c,0xd3,0x73,0xa1,0x65,0x00,0xda,0xf1,0x23,0xdc,0x3f,0x13,0x34,0x77,0x4b,0xfc,0x9f,0xa8,0x45,0x03,0xb1,0x6d,0xbf,0x21,0xa8,0x15,0xc1,0xad,0xa6,0xeb,0xef,0x49,0x20,0x46,0x17,0x02,},"\xa1\xd0\xf8\x1e\x3d\x59\x08\x9c\xc2\xb1\x9e\x07\xd2\xfc\xe4\x3d\xb4\xcf\x17\x1f\xaa\x64\x2f\x3b\x0b\xbd\xe7\x7a\xe3\xd5\x3a\xf5\xc0\x2b\xf8\xfc\x12\xff\xb4\xe5\x7f\x7c\x8a\x01\x5d\x6c\x2d\x17\x89\x44\xfa\xe9\xf7\xc8\xfc\x96\x9d\x4b\x77\xbe\xa5\x18\x76\xae\x99\xd5\x9e\x94\xad\x24\x56\xe0\xed\x72\xc5\x2c\xf4\xe5\x34\x0d\xa1\x7c\x44\xdb\xff\x86\x45\x7a\x51\x9b\x6f\xff\xe2\x69\x06\x62\x90\xd6\x29\xfe\x69"}, +{{0x4f,0x6a,0xeb,0x35,0xfc,0xe1,0x4f,0xbc,0xbb,0x9a,0xa8,0xa4,0xf6,0x45,0x1b,0xf9,0x5b,0x98,0xdf,0x04,0x7f,0xa8,0xc4,0x3f,0x1e,0xad,0x3b,0x40,0x4d,0x3f,0x92,0x8f,},{0xbf,0x66,0xa9,0xed,0xd0,0x94,0x81,0xdb,0x84,0x44,0xa1,0x76,0xc8,0xce,0x05,0x78,0xd2,0x93,0x4f,0x0c,0xdc,0x97,0x34,0xe8,0x6f,0xca,0xac,0x05,0xbf,0x33,0x30,0xf1,},{0x6a,0xdb,0x07,0xe3,0x64,0xf2,0xa4,0x55,0xcb,0x05,0x86,0x7a,0xbc,0x51,0x1a,0xcd,0x9d,0x65,0x89,0x77,0xf0,0xca,0xca,0xfc,0x92,0x82,0x8e,0x7b,0x72,0x4f,0x6b,0xbf,0x98,0xbf,0x0b,0xfb,0x29,0xf4,0xe5,0xe6,0xc7,0x47,0x38,0xd4,0xfd,0xd8,0x16,0xd9,0x25,0x24,0x07,0xae,0x4f,0x3a,0xfc,0x57,0x4c,0x4f,0x00,0x61,0x48,0x24,0xe2,0x03,},"\x2d\xfb\xb3\xf5\x9e\x19\xea\x17\xd4\x4a\x5b\xde\x4a\xd2\x27\xa1\xa3\x51\xdd\xa1\x7a\xf8\x40\xee\x0a\x75\xda\x21\xa5\xcc\xa8\x9b\x6d\x1c\x56\x7c\x33\x3e\x9c\xc9\x10\xe2\x15\x7e\x05\xe8\x6a\xd5\xd9\x31\x14\x50\x64\x59\x4c\x47\xba\xee\xa8\x66\x3a\x34\x64\x9c\x43\xe9\x0e\xb9\x5c\xa1\x0f\x7d\x51\x59\x7b\x37\x8a\x72\x2f\x1f\x70\x4a\xdf\x9f\x22\xe9\xf8\x85\xb8\x9d\x1f\x93\x80\x06\xa2\xef\xcd\xb4\x2a\xaf\xf5\xe3"}, +{{0xef,0x4a,0x67,0x62,0xb4,0x00,0x97,0x52,0x04,0xcc,0xc1,0x3a,0xbb,0x47,0x34,0x40,0x15,0x45,0x49,0x06,0x85,0x0f,0xf1,0x49,0x40,0xcb,0xb8,0x3a,0xa2,0x24,0x14,0xae,},{0xea,0xca,0x45,0x09,0x96,0xf5,0x0c,0xfa,0xf2,0xbd,0x7f,0x9d,0x7f,0xa7,0x08,0x7f,0x09,0xad,0x49,0x66,0x42,0x06,0xa8,0x0b,0xc2,0xe5,0xbb,0xbb,0x85,0xbb,0x66,0x8e,},{0x02,0x69,0x7d,0x44,0xca,0xd8,0x62,0xf1,0xda,0xf5,0x70,0x82,0x05,0xf4,0x50,0xd4,0x08,0x52,0x5b,0x10,0xc0,0x1f,0xfd,0x06,0xcf,0xee,0x80,0x37,0x4f,0x3d,0xb1,0x6f,0xa9,0xa4,0x9c,0x19,0xa9,0x84,0x4b,0x34,0x5f,0x2f,0x95,0x59,0xea,0x74,0xaa,0xb1,0x73,0xba,0xa0,0x78,0xc5,0x43,0x70,0xa5,0x16,0x67,0x00,0xc6,0xda,0xfb,0x78,0x0a,},"\xa4\xb6\x3e\xae\xd5\xa6\x4a\x94\xf2\xca\xd2\x12\xce\x2a\xe7\x10\x92\xfd\x3e\xa7\x44\xf5\xbd\x89\x56\x2b\x2f\xc2\xa6\xc9\xe4\xd7\xaa\x27\xad\xd5\x62\x64\xa5\xa5\x50\x16\x61\x0b\xe6\xc1\x9f\xf7\xd4\x98\x9e\x95\x04\x74\x08\x53\x01\x27\x15\xa7\x9e\xce\x9e\x12\xc3\x01\xb3\x31\x7c\x7d\x9b\x67\x30\xdb\x86\x2a\x4a\x1d\x28\x05\x8e\x0f\x8b\x5d\xdd\x97\x38\xc7\xc6\x2e\xa5\x72\xcf\xe5\x9e\xae\x08\xe2\xb8\xb6\x59\x3b\x58"}, +{{0x55,0x01,0x7e,0x5f,0x61,0xf0,0xc5,0xba,0xfb,0xcd,0xe6,0xf8,0x49,0xf4,0x2a,0x31,0xe5,0xe7,0xa8,0x78,0xc1,0xd3,0xf9,0x12,0x6f,0xc5,0x69,0xfd,0x41,0x7e,0xa9,0xf2,},{0x66,0x91,0x4f,0x74,0xed,0x93,0x2f,0xc8,0x81,0xff,0x01,0x66,0x68,0x3f,0x67,0x5a,0x7c,0x28,0xa9,0x26,0xfd,0xdd,0x64,0x69,0xcd,0xb3,0xf2,0x8e,0x6d,0xec,0x42,0xcc,},{0xb1,0xa5,0xe7,0xc4,0x9b,0x8f,0xc6,0xb4,0x33,0x1e,0x04,0x16,0xce,0x7e,0x4e,0xd5,0x9e,0xdd,0x56,0x30,0x0b,0x80,0x2e,0x0d,0x72,0xab,0xca,0x4a,0x6f,0xcb,0x87,0x6c,0x03,0xbf,0x33,0x15,0x79,0x12,0x4a,0xe0,0xd3,0xfe,0x43,0xf7,0x89,0x8b,0xc8,0x7e,0x93,0xfc,0x2d,0xa3,0x97,0x0f,0xc8,0x63,0x89,0x57,0xd1,0x8c,0x66,0x13,0xc8,0x08,},"\x2f\xc8\x4a\x09\x98\xfa\x6e\x16\x8a\x86\x64\x10\xbb\x68\x10\x5d\xf2\x49\xa2\x8c\xfc\x76\x60\x4b\xe9\x4f\xd7\xdf\xff\xf2\xfc\x1d\xed\xd2\x20\x19\x94\x65\x57\x5e\x8d\xf8\x60\x19\x0f\x16\xac\xa4\x08\x41\x69\xbe\x16\xc6\xba\x32\xeb\x67\x04\x2f\xfd\x4f\x23\x03\x16\xa2\x6b\x26\x24\xa4\x2f\x8f\x90\xad\x57\xf6\x91\x64\x86\xfa\x91\xfd\x94\xed\x68\xad\xed\x4e\x63\x24\x30\xef\x71\x94\x46\x97\x9b\xfa\xf3\x45\x40\x9c\x38\x7f"}, +{{0x05,0x53,0xfb,0xa8,0x66,0x94,0x23,0x41,0x21,0x7c,0xf2,0x78,0xac,0x57,0xcb,0x21,0xac,0xd0,0x9d,0x99,0x16,0xcc,0x6a,0xf0,0xac,0x46,0x94,0x1e,0xa1,0x39,0xd5,0x45,},{0x84,0x0c,0x66,0xe5,0x7c,0x2d,0x4f,0x52,0xa4,0xa2,0x79,0x6d,0x2a,0x53,0xc5,0x70,0x9b,0x96,0xa6,0x28,0xc2,0xe0,0x63,0xfe,0x6e,0xfd,0x47,0xf2,0x83,0xef,0x5e,0x82,},{0xbc,0x33,0x64,0xc1,0x52,0xee,0x5c,0x80,0x8a,0xc3,0x40,0xf4,0x9e,0xa2,0xcc,0x40,0x4e,0x93,0x51,0x71,0x21,0x22,0x0c,0xce,0x6f,0x7c,0x30,0xa2,0x25,0x00,0xe4,0x1b,0xcd,0xb6,0xe8,0x20,0x48,0x0f,0x8f,0xcc,0xdd,0x22,0xff,0x9a,0xd9,0x6d,0xa5,0x32,0x80,0x2f,0x43,0x1e,0x94,0x24,0x0f,0xb8,0x3d,0x4b,0xce,0xaa,0x09,0xb9,0x2b,0x0d,},"\xc1\xfa\xe6\x26\x2a\x0e\x98\xa6\xb1\x23\x5f\xcb\x62\x28\x3b\x7f\x0a\x09\x7f\x9d\x00\x24\x16\xd3\x18\xfe\xfc\x60\xc5\xa1\x58\x4f\x90\x0a\xd0\xab\x26\xcc\xfa\xe0\xd6\xd8\x4a\xa9\xaa\x2d\xf1\x6d\x4c\x11\x7e\xa2\x72\x46\x76\xcb\x86\x6d\x48\x70\xa8\x72\xfc\x82\x9a\x7c\x2a\x5d\x21\xba\x83\x34\x0a\xdb\x33\x9a\x34\xc5\x18\x4c\x7f\x5e\xad\x0f\x07\x72\x89\xb3\x36\x77\xed\x6a\x1b\xa3\x4b\xe1\x99\x4e\x25\x76\x3b\xd1\xd9\xfa\xec"}, +{{0x7a,0x5a,0xc6,0x02,0xde,0x19,0xf3,0xc2,0x10,0x40,0xbc,0xdd,0xbf,0xf4,0x2f,0x6a,0xee,0x6f,0x95,0xc1,0xb0,0x93,0x86,0x8f,0x48,0xe5,0x04,0x82,0xdb,0xf4,0xf9,0xc7,},{0xfb,0xb6,0xc7,0x53,0x1c,0xda,0x21,0xe7,0xd1,0x7e,0xa9,0x03,0xc4,0xd1,0x4b,0xe6,0xc6,0x8b,0x4c,0xa8,0x03,0xa1,0x6b,0xd8,0x71,0x20,0xf5,0xaa,0xf7,0xdc,0xe1,0xd4,},{0x84,0x10,0x1d,0xd4,0xb5,0xe8,0xca,0x3e,0xd9,0x8c,0x1e,0x8a,0x06,0xe1,0x1d,0x7e,0x42,0x4b,0x0d,0x12,0xca,0x71,0x4e,0xe7,0x37,0x4b,0x64,0xc2,0x9d,0x51,0xa2,0x02,0x1c,0xc7,0x7a,0xc7,0x53,0x89,0xd9,0xb0,0xa6,0x46,0xa4,0x47,0x62,0x3d,0x7d,0x04,0xd1,0x24,0x18,0x66,0xb0,0xca,0x6e,0xdd,0x1b,0x7a,0xc0,0x15,0x66,0x6b,0x70,0x0d,},"\xbd\x16\x85\x41\x92\x79\xeb\x81\xe4\xcf\x3c\x90\x90\x31\xf0\xf0\x9c\x5f\xfa\xe7\xe2\xce\x6b\xa9\xd9\x6c\x2b\xce\x87\xb8\xba\x0d\xd7\x63\x23\x10\x01\xe5\x32\xc7\xdd\xd6\x21\x03\xab\xf7\x01\x28\x8e\x19\xdd\x8f\x53\x02\xe8\xf5\xd3\x1b\x64\xcc\x33\x9b\xd8\xb7\xa9\x55\x50\xc8\xa1\x16\xfd\x48\x69\x48\x77\x2b\xd5\xaf\x8d\xfd\x46\x00\x1c\x59\x76\x7b\x0d\x6b\xdc\xe3\x83\xa7\x07\x89\x92\xd1\x02\x2f\xbc\xaf\x90\x71\x06\x87\xb9\xaa"}, +{{0x50,0x41,0x4c,0xf5,0x49,0xbc,0xc5,0x5b,0x5b,0x6b,0x75,0xea,0x37,0x82,0xb2,0xea,0x7c,0x08,0x7b,0x6a,0x01,0x06,0x17,0x5e,0x46,0x9c,0xa2,0xcc,0x76,0x4a,0xeb,0x01,},{0xd0,0xf3,0x0c,0x12,0xe9,0x97,0xf9,0x6e,0x7a,0xee,0xcd,0x1b,0xff,0x6a,0x01,0x2e,0xc3,0x88,0xeb,0xf8,0xf3,0xf4,0xaf,0x66,0x48,0x04,0xd1,0x63,0x8e,0x4c,0x34,0x6a,},{0xb3,0x09,0x80,0x01,0x60,0xde,0x43,0xa6,0x3a,0x89,0xa0,0xac,0xb8,0xa6,0x05,0x00,0x59,0x58,0x9b,0x3e,0xae,0xca,0xc2,0x0b,0x25,0x6f,0xec,0xe4,0x38,0x04,0x2f,0x69,0x41,0x5d,0x8a,0x56,0x88,0x3e,0xe3,0x83,0x6d,0x31,0x34,0xa7,0xfc,0x1d,0xe6,0x4f,0xa8,0xc8,0xce,0xcc,0x3c,0xe2,0x75,0x89,0xf6,0x06,0x05,0x88,0x20,0x85,0x7a,0x0c,},"\x75\xad\x77\xe8\xc5\x4b\x0b\x05\xfb\x2d\x16\x2e\x7c\xad\xb8\xa7\x52\x80\x81\xb8\x63\xf7\x6a\x44\x1b\x37\x44\x69\x41\x3e\x57\x14\xed\xf5\x4f\x80\x04\x96\xaf\x01\x57\xc1\x7e\x42\x55\x83\x41\x4d\x43\x61\xf2\x13\x41\x71\xc0\xb8\x7c\x22\xce\x68\x20\xa4\x85\x0a\xb4\x9d\x99\xa9\xba\xdc\xe9\xe3\x61\x10\xe7\xf3\x06\x01\x18\xb3\x59\x0f\x82\xb4\x37\x71\xe9\xfb\xb0\x81\xaf\xe6\x22\x27\xe0\x24\xd9\x8d\xe6\xcd\xec\x02\x8d\x7c\x49\x49\x0d"}, +{{0x93,0xcb,0x00,0xd8,0xfe,0x9c,0x97,0x77,0xa6,0x83,0x63,0x1f,0x39,0xba,0x0f,0x48,0x76,0x14,0x82,0xcf,0x1c,0x36,0x6b,0xd8,0x63,0xcf,0x71,0x51,0x01,0x53,0x25,0x55,},{0x87,0xe9,0x4a,0x1e,0xa5,0x25,0x8d,0x61,0x18,0x0c,0xb8,0x28,0x59,0x0f,0xf1,0x41,0x8a,0x87,0xd0,0x1e,0x70,0x26,0x86,0xba,0x8a,0xbc,0x26,0x92,0xc8,0xdc,0x3c,0x91,},{0x09,0x82,0x4f,0xa2,0xdf,0xbc,0x4d,0x6e,0xf7,0x6a,0x9e,0x41,0x45,0x96,0x11,0x16,0x76,0x91,0x30,0x55,0x3b,0x3e,0xdf,0xfa,0x50,0xd0,0x4f,0x39,0xb8,0xb7,0x9f,0xac,0xbd,0x23,0x7a,0xcf,0x71,0x35,0x4a,0x53,0xa6,0xe5,0xfe,0xe7,0x54,0xe8,0x23,0xb0,0xb2,0x90,0xf9,0x61,0x93,0x20,0xa1,0x3d,0x56,0x12,0x69,0xa2,0x21,0x63,0x9f,0x03,},"\x88\xd8\x53\x8d\x31\x86\x78\x13\xd8\x8f\xef\x72\x28\xd4\x9a\x7e\x95\x0d\x73\x83\x96\xf1\x16\xdd\xa1\x02\x5f\x79\x13\x54\x7c\x5d\x1d\xc5\x67\x7a\x6d\xe4\xb4\xa5\x88\x05\x07\xb3\x61\x78\x0b\x61\xb4\x3f\x77\x95\x26\x3d\xb2\x2f\xf3\x41\x64\x5f\x2f\x59\x14\xfd\x60\x88\xc2\x81\x12\x11\xed\x47\x56\xac\x01\x9a\x60\x35\xd6\x6e\x31\x70\xc1\xd8\x2b\xfa\xa3\x05\x96\xb3\x96\xb3\x26\x0c\xc1\xd1\x0d\x41\x3d\xd4\x7e\xbe\x6d\xaa\x0c\x30\xdc\x42"}, +{{0x2b,0x4c,0xae,0x38,0x0e,0x95,0xce,0x69,0x4c,0x26,0xac,0x79,0x57,0x44,0x73,0x47,0xf9,0x8e,0x31,0xb4,0xbf,0x02,0xd7,0x44,0xe1,0x31,0x52,0x90,0x71,0xe2,0x30,0x1d,},{0xe6,0xfc,0x70,0x5a,0x79,0xc9,0x8e,0x11,0x5b,0x4e,0x28,0xd3,0xaa,0x15,0x06,0xb7,0x4e,0xe7,0x42,0x76,0xc5,0xfc,0x11,0x09,0xa7,0xf4,0xd8,0x9c,0x6f,0xaf,0xb8,0x89,},{0x55,0x5e,0x45,0x65,0x6b,0xa9,0xcf,0xbf,0x51,0x55,0xd0,0xe5,0x25,0x76,0xe5,0x19,0x7a,0xbb,0xbc,0x9d,0xd2,0x33,0x99,0x3e,0xec,0x2a,0x1e,0xe7,0xf6,0xa8,0x64,0x09,0xc0,0xb7,0x1b,0x0a,0x66,0x19,0x78,0xff,0x5e,0x0a,0xcd,0xc9,0x46,0x3d,0xc4,0x49,0x90,0x6f,0x47,0x4f,0x8e,0x79,0xbb,0x86,0x16,0x8b,0xf7,0x07,0x41,0xe3,0x4b,0x02,},"\xe0\xb8\x25\x0e\x27\xb7\xc0\x29\x1d\xbc\x47\xa6\xda\x6f\x12\x68\x98\x7a\xfd\xf0\xa1\xe9\x0b\xe6\x9b\xcb\xc4\x37\x08\x65\x21\x78\x30\xd5\x20\x86\x93\xbe\x7b\x70\x45\x09\x9a\x22\xea\x27\xf9\x52\xeb\x3f\x79\xa9\xa0\xf1\xb5\xa8\x7b\x19\x36\x77\x90\x78\x8d\x34\xc2\x19\xc2\xe2\xa6\xb8\x34\x02\x0f\xb4\xfd\x14\x9d\xc5\x6b\x54\x4f\xdd\xbb\x42\x07\x1a\x16\x2f\xc7\xcb\x33\xc1\x46\xca\xc0\x5a\x31\xb1\x83\xe9\xda\xad\xc6\x16\xf3\xaf\x44\x9b\x17"}, +{{0xb5,0x64,0x91,0xe5,0x49,0x99,0xbb,0x5a,0x17,0x15,0xeb,0xfa,0x2f,0xeb,0x14,0xa5,0x45,0xa3,0xa4,0x3c,0x2f,0xdf,0xd4,0xbe,0x0c,0x95,0xfc,0x11,0x81,0x9a,0xd6,0x95,},{0xcd,0x42,0xbf,0x41,0x4f,0x9b,0xfc,0x72,0xec,0x06,0x98,0x82,0xa8,0x00,0x55,0x7c,0xdf,0x31,0xbc,0x34,0x64,0xfb,0x10,0x2c,0x31,0x0e,0x6d,0xbd,0x3a,0xe2,0x08,0x63,},{0xe3,0xbe,0x3e,0x71,0xa8,0x98,0x52,0xdf,0x3c,0xff,0xd7,0x2d,0x68,0x20,0x78,0x69,0xdd,0x3e,0xce,0xb4,0x9b,0x1f,0x02,0x94,0x93,0xec,0xcb,0xb9,0x32,0x44,0x4e,0xbe,0x8c,0x8c,0x6d,0xb5,0xf0,0xa5,0xa6,0x7e,0x21,0x94,0x40,0x8d,0xf9,0x84,0x19,0x13,0xa5,0xac,0x1a,0x60,0x68,0x96,0x41,0x9a,0x66,0x8f,0x4f,0x47,0xc5,0x6c,0x2b,0x08,},"\xeb\x44\x18\xba\x30\x68\x3e\xc7\x95\x9b\xdb\x1e\xc7\xb2\x63\xf8\x3e\x81\xf0\x54\xdd\xcd\xbe\x0a\x67\x38\xca\x77\x63\xe2\x46\x93\x5b\xac\x41\x90\x26\xc2\x2b\xfb\xdd\x12\x36\x33\x6c\xc1\x61\x07\xc5\x35\x13\xe3\xdd\xf3\x4e\x12\x08\x46\x96\x2c\x3b\xdd\x54\xf5\xad\x57\x49\x59\x72\x08\xf1\x5a\x8b\xb5\x66\x67\xba\xa8\x95\xf0\x83\x40\xdb\x89\xb8\x5c\x43\x5e\x77\x09\x31\x92\x8d\x8a\xbc\x99\x26\x2f\x83\x9a\xed\xd9\xbe\x2a\xa1\x38\xc9\x25\x9a\xdf"}, +{{0x65,0x79,0xc2,0x47,0xdd,0x2c,0xd0,0x2b,0xa2,0xf7,0xd7,0xa9,0x50,0xa3,0x30,0x75,0x26,0x81,0xe9,0x2c,0x0d,0xc6,0x29,0x84,0xbb,0xea,0x27,0x9e,0xa5,0x21,0xc3,0x81,},{0x0b,0x08,0x7b,0xea,0x1a,0x1b,0x3d,0x15,0x80,0x5c,0xb6,0x04,0xf4,0xbb,0x8d,0x68,0xed,0xde,0x27,0x4f,0xaf,0x52,0x1f,0xe6,0xdf,0x50,0xc5,0x5f,0x8a,0xd4,0xa7,0x0d,},{0xec,0xca,0xf8,0x01,0xae,0x0a,0x91,0x2e,0x21,0xc6,0xb8,0x3a,0x5f,0x0e,0x4e,0x88,0xd4,0xb2,0x71,0x34,0x59,0xff,0x93,0x44,0x9f,0xc0,0xb2,0x1a,0x9f,0x41,0x60,0x50,0x11,0x3c,0xba,0xe4,0xe8,0x14,0xd2,0x0c,0x0a,0x79,0x8f,0x76,0xd2,0xf9,0xd3,0x26,0xed,0x83,0x95,0x9e,0xa0,0x2a,0xbd,0xc1,0xab,0x35,0x0a,0x46,0x71,0x23,0xf7,0x09,},"\xdf\x7c\x55\x2f\xfc\x89\x37\x4b\x95\x71\xa6\x02\x4a\x8d\x04\x71\xd7\xeb\x6b\xe8\xdf\xca\x6f\x41\x66\xb5\x81\xb6\x54\x79\x01\x5a\x05\x68\x12\x90\x74\xcc\x04\xd6\x34\x2c\x75\x8c\xa1\x8f\x79\x87\xde\xc5\x36\xb7\x03\x3d\x5f\x96\x81\x50\x43\x40\xe2\x09\x86\xf0\x27\xb8\xcf\x1f\x26\x3b\xe7\x6d\xb3\x52\x5d\x17\x34\x22\x95\x0e\xa8\xdc\xed\xdc\x58\x56\x40\x91\x8a\xa9\xd2\x5c\xa8\x9c\xba\x70\x1c\x20\x20\x15\x38\x73\xf4\x61\x08\xc7\x72\xcb\x38\x8d\x55"}, +{{0x18,0xfb,0xa6,0x0c,0x50,0x26,0xf3,0xc9,0xdd,0x7a,0xed,0xc0,0x42,0x09,0xd5,0x26,0x03,0x61,0xde,0x40,0x0e,0x19,0x0a,0xeb,0x60,0x16,0x9e,0x05,0xa3,0x36,0x7c,0x9f,},{0xdf,0xff,0x34,0x7f,0x3d,0xd2,0x55,0x53,0x0b,0xf7,0xfb,0x34,0xd0,0x2b,0xa4,0x86,0xd1,0x12,0xbb,0x46,0xe9,0x50,0xe2,0xef,0x80,0xe5,0x17,0x01,0x4c,0xc9,0x57,0x34,},{0x4b,0xc0,0x11,0xe4,0x0f,0x0f,0x59,0xc6,0x18,0xf6,0xbb,0xe2,0x30,0xb6,0xf7,0xbc,0x2f,0x50,0xe3,0x61,0x7c,0x7f,0xaa,0xb7,0xf4,0xc2,0x1c,0xb8,0x4f,0x77,0xeb,0xa9,0x94,0xcb,0x7c,0x2a,0x1b,0xf1,0x0b,0x01,0xbb,0x20,0x08,0x44,0x97,0xfd,0xf0,0xa6,0xab,0x5d,0x9b,0xcd,0x22,0xc4,0xa2,0xc5,0xa7,0x8f,0x79,0x92,0x68,0x25,0x94,0x0f,},"\x34\xf0\x8a\x80\x4d\x78\x29\xcc\x39\x14\xf0\x00\xce\x1a\x32\x88\xac\xce\x21\x49\xc8\xa0\x20\x86\xb9\xf6\x7a\xfc\xcd\x83\xa1\x78\xb0\xbc\xfd\x49\x70\xc0\x56\x99\x7d\xa7\xdc\x3d\x47\x56\x2f\x16\x66\x3c\xed\xc5\x2f\x82\xd7\x10\x85\x0c\xf4\x05\x03\x79\xef\xda\xc2\x3b\xee\x17\xc3\x30\xa3\x83\xad\x13\x7f\x78\x84\x73\xb2\xb0\x72\x36\x03\xb6\xde\xb1\xfd\xbf\x6c\x52\x3f\xc9\x48\xa0\xcc\xc4\xff\x10\x0f\xb9\x46\xd8\x74\xc1\xf9\x90\x43\x6a\xe8\xc4\xf3\xb2"}, +{{0x07,0x3c,0xc1,0x5b,0x05,0x36,0x28,0x59,0x33,0xb2,0xbe,0x39,0x25,0x3c,0xf4,0xfd,0x69,0x6b,0x81,0x61,0x0f,0x5d,0xd3,0xad,0xac,0x2e,0x9c,0xbf,0x33,0x8e,0xf2,0xf6,},{0x00,0xb5,0x51,0xd3,0x71,0x54,0x43,0x75,0xda,0xc5,0xc4,0xe9,0x6c,0xd1,0xf0,0x21,0x52,0x07,0xe8,0xe1,0x66,0xa1,0xfe,0x49,0xd5,0xb0,0xa5,0x1a,0xc1,0x84,0x43,0xec,},{0x3a,0xa5,0x2a,0x83,0x06,0x2a,0x8f,0x28,0xa5,0xd6,0xb7,0x60,0x7f,0x48,0x4b,0x66,0xcc,0x37,0x48,0x96,0xb7,0x66,0x12,0x31,0x26,0x33,0x3c,0x57,0x95,0x81,0x31,0x6c,0x74,0x28,0x06,0xf6,0x27,0xb5,0xbc,0x55,0xca,0xd7,0x05,0xcc,0x1d,0x47,0x82,0xb0,0x44,0x08,0x0c,0x8a,0xc8,0x40,0xf3,0x8c,0x0c,0x50,0xd3,0x5e,0x34,0x5c,0x78,0x03,},"\xc2\x85\x36\x2b\xc8\xef\x62\x8f\x7a\xed\xf6\x54\x23\x1e\xe5\x1a\xcd\xf2\xcf\x69\xa8\x86\xb9\x42\xbb\x9b\xfe\xd8\x15\x51\x05\xd9\x20\x9d\xed\x2a\xf2\x4f\x16\x9a\xd5\xfc\xd4\x51\x37\x0f\x58\x27\xa8\x51\x11\xc7\xa5\x2e\x03\x2c\x50\x38\x61\x7c\x0c\x01\x70\xe2\xa6\xc2\x31\xdc\x40\x1d\x12\x06\x2e\xdb\x18\x60\x36\x11\x4e\x38\x79\x3b\x79\x08\x90\x77\x58\x1b\x97\x83\xf4\x00\x07\x10\x3e\xf1\x74\x72\x49\x1c\x00\xe7\x13\x8a\xec\xc5\x08\x4d\x3c\x85\x01\x04\x70"}, +{{0xfd,0x89,0x4a,0x1e,0x82,0x32,0x20,0x3b,0x28,0x95,0x05,0xd5,0xc6,0x8c,0x68,0x79,0x1f,0xfc,0x0e,0x54,0xf2,0xa8,0x75,0x30,0xfb,0xba,0x5b,0x3a,0x3f,0x2c,0xaf,0x00,},{0xe9,0x5a,0xb5,0x65,0x94,0x5c,0x7a,0xe5,0xd5,0x33,0xdf,0x5d,0x0c,0xcc,0xc7,0xe9,0xab,0xbc,0x83,0x8e,0x20,0xa0,0xb6,0x1c,0x93,0x0f,0x5d,0x41,0xd8,0x1a,0x6f,0xe7,},{0xf5,0x11,0x02,0x21,0x9e,0x88,0x04,0xbe,0x71,0x3e,0x55,0x6d,0xf4,0xe4,0xaf,0xa2,0xf8,0x86,0x6f,0xe8,0x65,0x41,0xa1,0xc2,0xa0,0x93,0x4d,0x24,0xc3,0xc9,0xbe,0xb2,0x80,0xa7,0x0d,0xd8,0xd5,0x27,0xfe,0x8b,0x7e,0x0b,0x94,0x82,0x14,0xd5,0xf2,0xf9,0x63,0x86,0x19,0x91,0x4b,0x72,0xd5,0x5d,0xc1,0x98,0xb0,0x22,0x9a,0x84,0x87,0x08,},"\x26\x69\x62\x4a\x94\xf2\xc4\x4a\x05\xb7\xdc\x3e\xbf\x93\xe5\x8a\x4b\xf3\xa0\x1c\x27\x36\x57\xe7\xe7\x87\x89\x76\xf6\xb6\xea\x73\x7f\xa3\xf2\x2c\xc8\x36\x5b\x8b\x22\x0c\x00\x7d\x5b\x64\x27\x26\xa4\x08\xfe\x2f\xab\x69\xeb\xb3\xbd\x07\x2b\x34\x9f\x4d\xc3\x37\x7e\xe7\xcc\x75\x29\x34\x25\x42\x15\xd2\x39\x89\xbd\x3c\xd0\x2c\xe9\x99\xad\xec\x97\x84\x99\x3f\x4c\x19\x94\x08\x15\xf3\x9c\x9e\x22\x92\x47\xf5\x20\x5c\x36\xcb\xa4\x4e\x71\x42\x66\x36\x92\x89\xb4\xa7"}, +{{0x18,0xef,0x46,0x4e,0x28,0xf8,0x7f,0xfc,0xfa,0x4d,0x3a,0x9c,0x09,0xa2,0x29,0x10,0x95,0x1b,0x8c,0x71,0x9f,0xda,0xcd,0xb5,0x6d,0xe6,0x2c,0x4b,0x40,0x6d,0xf0,0x0c,},{0xc5,0x06,0x4c,0x9d,0x43,0xee,0x2d,0xa7,0x5b,0x06,0xbb,0x09,0xc7,0x72,0x67,0xdb,0xd0,0xd3,0x91,0x28,0xf1,0xcd,0xc6,0xbf,0xa4,0x51,0xa0,0x3e,0x93,0xaf,0x4a,0x70,},{0xd1,0xe7,0xf1,0x6e,0x8e,0x59,0x7d,0x42,0x8a,0xde,0xa6,0x55,0x91,0xd5,0x51,0xb5,0x4b,0x66,0x7a,0xff,0x20,0x20,0xc4,0x64,0xf7,0xf4,0xe5,0x3c,0x47,0x73,0xf7,0x04,0x33,0x24,0x9a,0x3c,0x71,0xb4,0xd1,0x1c,0x89,0xc3,0xfa,0xa8,0x92,0x80,0x92,0x27,0xb9,0xf2,0x9e,0xf4,0xf7,0xf5,0xd0,0x20,0xd4,0x67,0x4d,0x40,0x21,0x35,0x94,0x05,},"\x9c\x82\x57\x07\xd9\x35\x83\x65\xab\x9d\x38\xf7\xe7\x28\xd6\x28\xaa\x72\x2a\x4f\x1a\x20\xa3\x8e\x47\xc9\x99\xff\xf8\xfc\x32\x41\x7f\xbe\x07\x2f\x96\xeb\x6a\x0e\x11\xe4\xda\x9b\x6d\xe9\x61\x54\x45\x28\x0e\x93\xc7\x7a\x36\x34\xd3\xd2\xc6\x87\x98\x56\xc2\x48\xf9\x80\x0f\x60\xa0\xd3\x8d\xc1\xce\xa8\xb7\xf3\x1f\x28\x6c\xb0\x37\x48\x27\xb4\xc6\xba\x14\x4a\x66\x94\xf2\xb9\x08\xea\xd6\x8d\x18\x34\x01\x24\xcb\x59\xcf\x17\x01\x86\x3b\xd4\xf3\xef\xc7\x09\xf3\x62\x7a"}, +{{0xc9,0x11,0xbd,0xf2,0xf9,0xe7,0xcc,0x5f,0xff,0x35,0xc9,0x6e,0x15,0xcc,0x12,0xea,0xfd,0x05,0xab,0x0d,0xb3,0x1f,0x64,0x9f,0x74,0x08,0xac,0xd0,0xca,0xda,0x76,0xe0,},{0xde,0x44,0x69,0x6c,0xd6,0xbd,0x2c,0xbe,0x9b,0x11,0xa0,0xef,0x18,0xb8,0x81,0x64,0x80,0x1a,0x96,0x9d,0x5e,0x06,0xed,0x45,0x3e,0xb4,0x00,0x8c,0xce,0x9a,0x57,0x25,},{0xd5,0x84,0xb5,0xda,0x37,0x1a,0xe4,0xf5,0xc9,0x85,0x9b,0x25,0xf7,0x0d,0xc5,0x6c,0x1b,0x7b,0x4e,0x02,0xd1,0xae,0x66,0x36,0x28,0x3b,0x1b,0x7b,0x11,0x21,0x7a,0xfd,0xcd,0xf6,0x5d,0x1b,0x49,0xca,0x2c,0x8e,0xf1,0x79,0x66,0xe9,0xbc,0x65,0xf1,0x0c,0x31,0x0b,0x77,0xbb,0x5d,0xf7,0xaf,0xf5,0xec,0x1b,0x37,0x9a,0x2c,0xe5,0x5d,0x0d,},"\x76\xc4\x71\x24\x1d\x17\x19\x29\x84\xb0\x03\x62\x69\x6e\x4d\x9d\x4d\x2b\x7f\x83\x9c\x20\x64\x11\x7e\x50\xa1\x59\x8f\x3a\x11\x72\xb1\x6c\x55\xe5\x39\x68\x66\x08\x47\x52\x02\x4f\x3a\x7e\xb6\x8b\xb3\xff\xdb\x80\x97\x9a\x0a\xf6\xd0\xf6\xaf\x26\xb6\xf0\xbc\x0c\x03\x84\x43\x3b\xcf\xd4\x4c\x75\xeb\x65\x4a\x8a\x82\x25\xcb\x9c\x4a\x7f\xb3\xc8\x24\xc3\xaf\x61\x25\xfd\x46\xdb\x28\x7e\x70\x49\x2d\x15\x46\x32\xcb\x8f\x62\x43\x26\x59\xd9\x58\xd6\x28\x1d\x04\xa5\x4f\x5f\x5f"}, +{{0xd3,0x70,0x32,0x99,0xc4,0x1d,0xb3,0x6d,0x77,0xdd,0x3a,0x49,0x54,0x1f,0x3f,0xb2,0x1d,0x0b,0x2b,0xad,0x1f,0x6e,0x07,0x4a,0xff,0xd9,0x6f,0x1c,0x40,0xd0,0xf9,0x27,},{0x86,0x2c,0x5e,0xf6,0x16,0xa5,0xf0,0x66,0xfd,0x87,0x75,0x8a,0x56,0xab,0x45,0x05,0x6f,0xea,0x4b,0xd3,0x3f,0x00,0x8b,0xe2,0x4f,0x7b,0x54,0x0e,0x09,0x5e,0x14,0x8e,},{0xdf,0x28,0x27,0x71,0x21,0xea,0xc4,0x46,0x30,0x08,0x4c,0xce,0x75,0x91,0x7a,0xe9,0xf6,0xbe,0xc6,0x5a,0xf5,0x57,0x2d,0xc3,0x07,0x19,0xbd,0xe6,0x61,0xcf,0x69,0x6b,0x85,0xb8,0x67,0x2d,0xd4,0x98,0x3c,0xab,0x30,0xbd,0x05,0xcc,0x3a,0x11,0x9d,0x7d,0xb9,0xba,0xbd,0x52,0x2d,0x7b,0x3a,0x6b,0xcf,0x38,0x86,0xec,0xd2,0x5e,0x08,0x0f,},"\xac\x92\xed\xbe\x22\x25\x7b\xb0\x6d\x94\xaa\x95\x0e\x62\xd1\x8c\xa2\xac\x0a\x8f\xc1\x06\x00\x0d\x22\x31\xf8\xa1\x3b\x8d\x7a\x20\x9c\xcd\x8c\xc4\x9a\x6c\xd6\x8a\x7f\x36\xc0\x2f\xb8\xf7\x28\xd1\x55\x95\x16\x7f\x0b\xa8\xcf\xe9\x5c\x8a\x1e\x43\x5f\x32\x75\x13\x01\x4a\xc4\x28\xb7\x5d\x4f\x72\xe7\xc8\x34\xdd\x70\xe1\xa4\x48\xf1\x84\x7d\x34\x98\x47\x5f\x74\xe3\xd9\x33\x4d\xc7\xdc\xc4\xfe\xd7\x2b\xf6\xc7\xfe\x3b\x1d\x4f\x53\xd4\x29\x61\x6f\x1d\xf4\x4f\x19\x73\x31\x58\xb6"}, +{{0xd4,0x11,0xcd,0x33,0x57,0x6d,0x0e,0xfe,0x9e,0xc4,0x13,0xcc,0xda,0xab,0xd4,0xfc,0xba,0xfe,0xc0,0x1a,0x3a,0xf4,0xb3,0xcb,0xe3,0x4f,0x8b,0x05,0xef,0x8b,0x59,0xba,},{0xe8,0x70,0x34,0x4d,0xf9,0x8d,0xd3,0xa8,0x70,0x2c,0x45,0x19,0xbf,0x9e,0x8b,0x35,0xa9,0xd1,0x89,0xe7,0x46,0xf7,0x20,0x3d,0xbb,0xf9,0xbb,0xfa,0xb2,0x2d,0x6f,0x63,},{0x83,0x46,0x0d,0x15,0x46,0x1d,0x67,0x17,0x71,0x0b,0xaf,0xd6,0xa4,0x7a,0x1e,0xaa,0x90,0x0a,0x80,0xf2,0xbf,0x8b,0x8a,0xae,0x24,0x68,0x77,0x36,0x14,0xee,0x84,0xbd,0x62,0x8c,0x97,0x17,0x47,0x63,0x68,0xef,0x36,0x40,0xcf,0x76,0x0a,0xca,0xc8,0x3a,0xd6,0x02,0x32,0xa7,0x69,0x63,0xb7,0xd5,0x25,0x88,0xb1,0x1d,0xc0,0x04,0xd7,0x0d,},"\x11\xd2\xc2\xa7\xf0\x19\x09\x88\x12\x66\x96\x43\x1b\x4b\xbc\xd9\x0a\xb7\xb5\x6a\x32\xda\x64\x04\xae\x44\x6a\xa7\x62\xa4\xdd\xc6\x60\x94\x97\x15\x38\xee\xb8\x5b\xde\x04\x70\xa5\x10\xbe\x0d\x6d\x85\x78\x0e\xe7\x30\xa9\x85\x41\x38\x72\x8a\xe6\x81\x61\x62\x26\x8d\xa8\x52\x85\x8e\xae\xd4\xec\x74\xc7\xac\x62\xe6\xe7\x09\x6d\xc0\x02\xdf\x0b\xdf\x5f\xa4\x0d\xa5\x65\xb4\x1d\x18\x1a\x3f\x0a\xd0\xc5\xe0\xb9\x76\x74\x3e\x31\x5d\x9d\xb8\xed\x41\x60\xab\xe6\x9c\x13\xa2\xb3\xf0\x9a"}, +{{0xe1,0x0a,0x2f,0x13,0x80,0xc3,0xe4,0x72,0x0e,0x8a,0x87,0x07,0xa9,0xbc,0xb2,0x5a,0x0f,0x58,0x27,0x0d,0x70,0x59,0xcd,0x76,0x26,0xc7,0x15,0x34,0x47,0xed,0xfb,0x87,},{0xa3,0xc7,0x17,0xac,0xab,0x36,0x6a,0x40,0xb5,0x11,0x87,0xbb,0xf3,0x5b,0x2d,0x15,0xe9,0x7c,0xfe,0xac,0xd7,0x34,0x9c,0x06,0xef,0x1c,0x91,0xac,0x93,0xe9,0x06,0x56,},{0x09,0x4b,0xf6,0xf9,0x53,0xca,0x0e,0xb7,0x7d,0xf4,0x51,0x29,0xb7,0xbf,0x10,0xd1,0x92,0xcf,0x6d,0xde,0xae,0x94,0xad,0x62,0x02,0xb8,0xea,0xcf,0xbe,0xc1,0x19,0xe5,0x29,0x15,0x78,0xfe,0x64,0xa0,0x84,0xae,0x60,0x0f,0xe0,0x7e,0xfd,0xb8,0xa7,0x82,0x61,0x0d,0xbd,0xb0,0xb4,0x9e,0xb5,0xf2,0xa4,0x6c,0x43,0x23,0x55,0x55,0x2f,0x01,},"\x13\x52\x12\xa9\xcf\x00\xd0\xa0\x52\x20\xbe\x73\x23\xbf\xa4\xa5\xba\x7f\xc5\x46\x55\x14\x00\x77\x02\x12\x1a\x9c\x92\xe4\x6b\xd4\x73\x06\x2f\x00\x84\x1a\xf8\x3c\xb7\xbc\x4b\x2c\xd5\x8d\xc4\xd5\xb1\x51\x24\x4c\xc8\x29\x3e\x79\x57\x96\x83\x5e\xd3\x68\x22\xc6\xe0\x98\x93\xec\x99\x1b\x38\xad\xa4\xb2\x1a\x06\xe6\x91\xaf\xa8\x87\xdb\x4e\x9d\x7b\x1d\x2a\xfc\x65\xba\x8d\x2f\x5e\x69\x26\xff\x53\xd2\xd4\x4d\x55\xfa\x09\x5f\x3f\xad\x62\x54\x5c\x71\x4f\x0f\x3f\x59\xe4\xbf\xe9\x1a\xf8"}, +{{0xb2,0xe6,0x97,0xb3,0xd3,0xef,0xec,0x97,0x6e,0xf3,0x36,0x95,0x30,0xc7,0x92,0x71,0x7b,0xdb,0xb4,0x28,0xd9,0xed,0x0c,0x11,0xec,0x0e,0xa9,0xb2,0xe5,0xf3,0x9f,0x82,},{0xc4,0xd2,0xe4,0xb3,0xc2,0x36,0xd6,0xc9,0xb8,0xc7,0x4f,0xa3,0x84,0x61,0x2c,0x47,0x10,0xd8,0x3a,0xa1,0x6a,0xd7,0xef,0x01,0xfb,0xb7,0x42,0x1d,0x4f,0xb3,0xf0,0xf6,},{0x50,0x47,0xfa,0x38,0x19,0x7b,0x83,0x28,0xe7,0x8d,0xd8,0xa1,0x0e,0x96,0x6a,0xfb,0x7b,0xd3,0xd4,0x36,0x08,0x28,0x0f,0x1c,0x25,0x7d,0x25,0xca,0x43,0xbc,0x1c,0x06,0xe9,0x4a,0x57,0x47,0xab,0x62,0x15,0xec,0xe5,0x4c,0xde,0xff,0x8c,0x56,0x56,0x7d,0x70,0xd2,0xf9,0x1f,0x9e,0xc8,0xc2,0x60,0xaa,0x10,0x80,0xa6,0xab,0x5a,0x7a,0x02,},"\x7b\x43\x62\x32\xac\x21\x11\xa8\x40\x59\x51\x0c\x48\x36\x25\x88\xfc\xb7\x38\x34\x26\xbe\x5e\x6f\x62\xf3\x72\xe4\xf7\xcc\xa8\x3c\x81\xc2\x35\x7f\x9b\x54\xf4\xa1\x52\x91\x06\x5b\x6d\x41\xaa\xd1\xea\x93\xcf\xfa\x77\x6b\x9a\xca\xa5\x8a\xfe\x2b\x51\x64\x4b\x97\xaf\x9a\x3e\x53\xf8\x4e\x40\xaa\x6d\x86\x05\x1e\x69\x14\xcd\x03\x9d\x41\x70\xa9\xa5\x26\xdd\x69\x95\x5f\xf5\x07\xc3\x3f\x74\xe2\x17\x65\x91\xfb\x0b\x3c\xd7\xf0\x0e\xe4\x18\xf2\xc2\x58\xa9\x98\x1c\xcc\xee\x72\xf0\x1c\x84\x30"}, +{{0x19,0xa6,0x79,0xa7,0xa9,0x05,0xa1,0xe2,0xb3,0x03,0x8e,0x6e,0x41,0x8b,0x3d,0xa9,0x7c,0x30,0x89,0xc7,0xcd,0x35,0x1e,0xa0,0x7b,0xc8,0xd1,0xaf,0x64,0xea,0xcc,0x46,},{0x19,0xf0,0x83,0x61,0xf4,0x69,0xb4,0xae,0x1e,0x0c,0xeb,0x94,0xf4,0x7a,0x7d,0xe7,0x31,0x74,0x10,0xa9,0x2d,0xd0,0x13,0xb1,0x6a,0xe0,0xd0,0x53,0x2f,0xa4,0xb3,0xef,},{0x43,0x47,0xb7,0xb4,0xf7,0xc3,0xc4,0xdd,0x31,0x5b,0x83,0x84,0xa0,0xb0,0xca,0xee,0xd8,0x4b,0xda,0xbe,0x24,0xb2,0x91,0x5f,0x12,0x51,0x2d,0xfd,0x04,0x77,0x0f,0xc9,0x96,0xa1,0xbf,0xb7,0x29,0xaf,0xef,0x9e,0xdd,0x61,0x14,0x47,0x08,0x1a,0x53,0x30,0x61,0x7e,0xae,0xa1,0xc1,0xda,0xb1,0xbf,0x13,0xce,0xa8,0x99,0x72,0x04,0x91,0x0c,},"\x98\x0c\x7b\x4d\x29\x39\x06\x1a\xc7\xb9\xba\x44\x11\x17\xa1\x94\x85\x66\x17\x81\xa4\x08\x30\x67\xc5\x5a\xcf\x93\x02\x6c\x08\x2a\x93\xcc\x12\x4f\x09\x5e\x1b\x4f\x2c\x3f\x6c\x13\x54\x12\xa5\x09\x62\x28\xe8\xa0\x71\xe8\xb4\xb6\x68\xba\x9d\x96\x44\xea\x9f\x4d\xab\xfc\x54\xa9\x85\x6c\x3e\x96\x5e\x63\x63\x39\x5a\xb7\x09\x03\x7d\xda\x22\x9b\xaf\x92\x7c\xd0\x1f\x9a\xf5\xe0\x39\xaf\xc4\x2f\x3c\xec\x63\x4f\x5d\x83\x2d\x2a\xb7\xc7\xca\xd3\xad\x7b\x8c\xf2\x7e\xbd\xac\x69\x84\x31\xad\x82\x36"}, +{{0xf0,0x3b,0x83,0x63,0xee,0x5b,0x0e,0xef,0x70,0x18,0xa4,0x9b,0xc0,0x2a,0xdf,0x73,0x1d,0xa5,0x4e,0xe5,0x0a,0x7f,0x03,0xb8,0x8a,0x29,0xa2,0x08,0x2b,0x18,0x9c,0x43,},{0x31,0x28,0x7e,0xf5,0xa2,0xe6,0x41,0x04,0xab,0x77,0x90,0xb3,0x12,0xf3,0x5c,0x7a,0xd4,0xaf,0x6b,0xeb,0x0d,0x7c,0xeb,0x8a,0x58,0xf3,0x6a,0x54,0xce,0x27,0x2c,0x3e,},{0xe8,0xfa,0x96,0x7e,0x6a,0xfa,0xdf,0x6a,0x87,0x7d,0x87,0xe5,0xf5,0xc5,0x2b,0xb6,0x34,0xb7,0x5a,0x78,0x04,0x19,0x9a,0x2b,0xc9,0xd0,0x27,0xb6,0x3a,0x35,0x65,0x4d,0x9d,0xdd,0x06,0x83,0x04,0x55,0x64,0x1d,0xbf,0xb4,0x9e,0xdc,0xe4,0x2e,0x20,0xe7,0xd4,0x10,0x4a,0x07,0x1c,0x2c,0xbb,0xec,0x23,0x01,0x8c,0x29,0x7c,0xed,0x99,0x08,},"\x24\x19\x1b\x54\x64\xb3\x5a\xc7\xbc\xf4\xa3\x75\xf0\x33\xef\xba\x89\x43\xb0\x9b\x9f\xf0\xfc\x40\x3c\xa7\xaa\xe7\x02\xa3\xcb\xf3\x96\xc5\x13\x1b\xc0\x08\x13\x2c\xf5\xf1\x29\x10\xd5\x86\xdc\x1d\xb9\xc0\x84\x57\x4a\x96\xba\xbe\xe9\x56\x42\xf9\x22\x37\x1c\x03\x82\xec\x04\x02\xa2\x6f\xeb\x14\x2e\x41\x46\xbb\xd3\x36\x0c\x2b\x36\x83\x4f\xe4\x5a\xf5\xe2\x86\x8d\x4d\x56\xfd\xd5\x04\xce\xbf\x0c\x2d\x7f\x57\x91\xb4\x42\x94\x17\xc8\xb6\x5a\x98\xe0\xb1\x5c\x46\x6c\x13\x7f\x41\x05\x24\xfc\xe7\x37"}, +{{0x11,0x08,0x6b,0x0d,0x11,0xe4,0x15,0xab,0x1c,0xe0,0x2a,0xaf,0x8f,0x06,0x21,0xb5,0x44,0x30,0xf6,0xfb,0x13,0x5c,0x74,0xf4,0x0d,0x38,0xe8,0xc6,0x47,0x37,0x06,0x4b,},{0x71,0x66,0xdf,0xbc,0x69,0x1e,0xb8,0xc2,0x01,0x11,0x4b,0xa0,0xd1,0xa2,0xc7,0xb8,0x7f,0x7a,0x1f,0xd8,0xd0,0xb3,0x60,0x58,0xb0,0xd7,0xdc,0xab,0xe1,0xae,0x30,0xda,},{0xe9,0x07,0x45,0x9d,0x5a,0xdc,0xd0,0xd0,0xc3,0x64,0x18,0x58,0x1f,0x19,0xd0,0xee,0xbd,0xa7,0x13,0x8e,0xbd,0x9f,0xaa,0x0b,0x26,0x22,0x01,0xf4,0x58,0xc8,0x56,0x31,0x0b,0xb7,0x7f,0x4c,0x7d,0xe9,0x22,0x49,0x5d,0xcf,0xe8,0xb2,0x48,0xed,0xa2,0xad,0x0d,0xf6,0xa7,0x3f,0x47,0xbb,0xfb,0x89,0x4b,0xaa,0x7d,0x88,0x69,0x87,0x58,0x02,},"\x4b\x5b\x29\x36\xc5\xe3\x60\xa3\x84\x55\x50\x37\x21\x07\x8f\x8a\xdb\x40\x4a\x7e\xe7\xec\xc1\x48\x01\xdc\x87\xa6\x7a\x15\x2b\x76\x95\x69\xfb\xea\xc0\xaf\xa2\x5a\x20\x70\xa1\x68\x6b\x90\x0a\xc1\x63\x3d\x49\x98\x08\xcd\xb2\xe8\x1c\xe3\x91\x6d\x5a\x3c\x04\xd1\x9c\x5b\xb2\x69\x9a\x66\x2b\x8a\xba\x4a\xf9\x4d\x39\x0b\xac\x7c\xcc\x8e\xc9\x10\xed\x2a\xcd\xf8\x6e\xbb\x71\xad\xb6\x01\x87\x78\x85\xee\xf3\xc9\x16\x62\xfc\x30\x73\x8e\x35\x2c\xc7\x43\x53\xcc\xf8\xd8\xed\xee\xfa\xcc\x04\x2c\x10\xa0\xe5"}, +{{0xef,0xce,0x76,0x67,0xa8,0xef,0x91,0x22,0x8c,0xae,0xd1,0x4e,0xb4,0x77,0xa3,0x45,0xe5,0xe8,0x23,0x92,0x34,0x08,0x08,0x48,0x76,0x0e,0xd0,0x97,0x07,0x13,0xfa,0x86,},{0x91,0x93,0x05,0x5a,0x84,0xdf,0x1e,0xac,0xca,0x28,0xce,0x2a,0x08,0xc2,0xa0,0x7a,0x50,0xf0,0x4c,0x02,0x4e,0xcf,0x1f,0xe4,0xa4,0x7d,0x2e,0xfb,0xaf,0x63,0xed,0x58,},{0xe5,0xa6,0x31,0x24,0xdb,0x16,0x96,0xb6,0x41,0x40,0xb6,0xe9,0x61,0x2f,0xa9,0x58,0x7b,0x3e,0xef,0x71,0x01,0x09,0x39,0x8d,0x44,0xba,0x0c,0xa6,0x3c,0x0e,0xba,0xd0,0x6f,0x0a,0x6c,0x89,0x94,0xea,0x34,0xb3,0xa2,0xaf,0x91,0xa8,0x9b,0xf4,0x1a,0xe6,0x14,0xd7,0x72,0x7d,0x71,0x6f,0xd4,0x2f,0x8b,0x92,0xe1,0xac,0x64,0xfd,0xbf,0x03,},"\xaa\x1b\xc8\x0d\x7b\xcc\x1d\x94\xa2\x3a\x57\xce\xdf\x50\x27\x48\x24\x77\xdc\x46\xb8\x68\x90\xbc\x0e\x5a\xc2\x9a\xe6\xc9\x1b\xbc\x43\x13\x03\x48\x79\x73\x05\xf7\x55\x43\x58\x0a\x8a\x06\x9b\x34\x8a\x7b\xd8\xfc\x3e\x01\x52\x30\xb7\xc1\x94\x0c\x7f\x80\xa8\x2b\x12\x90\x09\x10\xdb\xcf\x06\x30\xda\x03\xf0\x81\xd4\x4c\x7f\x95\x5d\x4a\x11\x72\xf5\x6e\xcc\x7c\x5a\xc6\x46\x69\x6b\xff\xdf\x4e\xb6\xd8\x8b\xdd\x9c\xc3\x84\x35\x28\xb7\x25\x83\xab\xb3\xba\xd0\x2e\x56\xef\x76\x46\xee\xd5\x13\x95\x51\xcd\xeb"}, +{{0x88,0xfc,0xca,0xa9,0x6a,0xd8,0x84,0xd1,0x16,0x5b,0xe7,0x1d,0xd0,0xc4,0xf5,0xf8,0xf4,0x42,0x1c,0x60,0xfb,0xfa,0x49,0x8b,0xfe,0xe9,0xb9,0x67,0x46,0x24,0x43,0xbd,},{0xc7,0x5c,0xb0,0xe0,0x23,0x7b,0x45,0xb8,0x65,0x6e,0xea,0x9f,0x3d,0x1a,0x9d,0x4a,0xcd,0x01,0xa1,0x03,0xaa,0x26,0x9b,0xb2,0x4f,0xd5,0x41,0x22,0xfd,0x81,0xf2,0xac,},{0x27,0xd3,0xa1,0x97,0xcc,0x99,0x94,0x21,0x20,0x63,0xbc,0xe8,0xd7,0x99,0xe7,0x7b,0x68,0x53,0xb7,0x35,0x5e,0xbe,0x36,0x9b,0xcf,0x18,0x89,0xa4,0x18,0xa8,0x2c,0xaa,0x3a,0x79,0x87,0xa6,0x63,0xf6,0x21,0xde,0xfe,0x86,0xb3,0xac,0x4a,0xd4,0x4f,0xae,0xed,0x16,0xc9,0x11,0x6a,0xce,0x28,0xfc,0xcf,0x91,0x55,0x57,0xfa,0x77,0x99,0x03,},"\x9d\x0e\xac\x98\x55\x6b\xfa\x86\x72\xc3\x57\x05\xd1\xd6\x1a\xc4\xd0\xfc\xa1\x9d\xc0\xd9\x93\x01\x58\x77\x85\x7d\x27\xfd\x80\xf7\x4a\xca\xce\x66\x6c\x56\x34\x85\xd8\x1e\x53\x60\x3a\x6a\xef\x40\x87\x5f\xa5\x51\xcc\x10\x5f\x2c\xc1\x0b\x39\x69\x46\x79\xcd\xf4\xa6\xb0\x73\xbc\x88\x64\x5f\xc5\x1a\x36\xda\x17\x9d\x3d\x1e\x3c\x77\x22\x45\x4c\x5e\x73\x57\x7c\x61\xaa\x7d\x14\x8c\x4b\xa5\x0e\xa4\x6c\x56\xa1\xc3\xb3\xb3\xc4\x70\xf9\x31\x00\x49\x4e\x08\xbc\x55\x14\xac\x76\x3a\x85\x48\x3c\x42\xc7\xcd\xc2\x7c"}, +{{0x67,0x0b,0x30,0x62,0x6f,0xe3,0x67,0xd8,0xb4,0x5f,0x43,0x73,0x3d,0x6f,0x25,0xb3,0x7e,0xcc,0xbc,0xb5,0x51,0x96,0x3f,0x0a,0xc8,0xb6,0x66,0xb4,0x80,0x41,0xc7,0x2d,},{0x65,0xaa,0x4c,0x6d,0x4b,0xa0,0xab,0x34,0xbc,0x75,0xb3,0x9f,0x09,0x52,0x7c,0xa6,0xf2,0x42,0x5f,0x52,0x41,0x5c,0xdf,0xfd,0xf2,0xdf,0xf2,0x73,0xf8,0xea,0x61,0x2c,},{0x1b,0x6b,0x43,0x77,0xd2,0xb9,0x8e,0x0f,0x9d,0x24,0xae,0x8d,0xfe,0x30,0xe2,0x39,0x6e,0x20,0x04,0x38,0x0d,0x34,0x31,0x48,0x8e,0x58,0x43,0xcf,0x8d,0x2d,0x7a,0x00,0x70,0xab,0x21,0xf8,0xa3,0xb5,0x1c,0xe8,0x4d,0x2f,0x4b,0xa2,0x09,0xf7,0x39,0xf9,0x22,0xbe,0xbf,0x79,0x80,0x96,0x69,0x3f,0x56,0x22,0x87,0x3d,0x79,0xae,0x6f,0x04,},"\xd0\x0b\xcc\xa7\xe1\x84\xd1\x0e\x1f\x1f\xe4\x20\xb5\x06\x39\xe1\xd5\xde\xba\x52\xa7\x51\x23\x6e\x68\xc5\x9b\xb4\xbf\xf9\x80\x2f\x5f\xc1\x65\xed\x42\xfd\x6d\x53\x46\x70\xa7\xc6\xfb\x60\xe4\x30\x7d\x94\x79\x15\xa2\x48\xbf\x2f\x93\x46\x5c\x2c\xb4\x4d\x8f\x45\x3d\x2c\x01\x5a\xfb\xc8\xed\x58\x81\x8e\xa5\x17\x26\xa2\x51\x77\x93\x0e\x9e\xa1\x92\xef\x45\x14\xf4\xbb\x0e\xb4\xe0\xf5\xd4\xae\x3c\x46\xe3\x57\xc8\x11\x87\xf7\xed\x17\x47\x33\xff\xf9\x59\xc3\xf9\xfa\xe6\x48\x6c\xfa\x13\x56\xa9\x56\x99\x21\x1d\xe5"}, +{{0x81,0x3c,0x4d,0xae,0xd6,0x7a,0x19,0x0d,0x68,0xbb,0x63,0x5d,0x73,0xaf,0x6d,0xa7,0x4f,0x32,0xfd,0xf7,0xc4,0x8c,0xca,0x6e,0x59,0x26,0x29,0x46,0xb8,0xe8,0xc7,0x1f,},{0xa2,0x09,0x54,0x57,0xd7,0x69,0x70,0x20,0xe2,0xb8,0x84,0xd9,0x5a,0x96,0x57,0x8c,0x2a,0x90,0x0a,0x76,0x66,0xac,0x0d,0xc7,0xbd,0x38,0xf1,0x93,0x1d,0x79,0x45,0xd8,},{0xb4,0x46,0x57,0x4f,0xf6,0xa4,0xbd,0x2b,0x57,0x2e,0x48,0x7c,0x4a,0xb4,0x43,0xca,0x64,0x10,0x75,0x16,0x8a,0xa4,0xe1,0x09,0x2f,0x71,0xf3,0x0b,0xdb,0x06,0x8c,0xe4,0x6a,0x39,0x5e,0xfe,0xe1,0xee,0x66,0x0b,0x9f,0xac,0x26,0xd5,0x41,0x09,0x72,0x2c,0x15,0xcd,0xb7,0x91,0xbf,0xb8,0x7f,0xff,0x63,0xc6,0x59,0x6a,0xd4,0xf2,0x27,0x0c,},"\xce\x54\xcb\x04\x50\xe6\x89\xa0\xdb\xef\x78\x53\x08\xb3\x17\x74\x72\xfc\xd6\xd3\x82\x03\xe5\x8a\x05\x90\xb3\x1f\xa2\x53\xf9\xea\x59\x0b\xe5\x36\x8a\x92\x2d\xe8\x8b\x63\x45\x01\x02\x68\x44\x43\xfb\x81\x89\xe6\x01\x28\x20\x03\x32\x3b\x89\xc8\x1e\x92\xea\xef\x2b\x5d\xdc\x4a\x55\xc5\x3f\xa3\xcf\xad\x41\x60\x24\x8b\x3c\x28\x6f\xf8\x0d\x31\xd1\x61\xb7\xb8\xde\xe7\x13\x55\x2b\x56\xf1\x50\x7f\xb7\x2e\xad\xfa\x89\x05\x4e\x9d\x16\x00\xac\x87\x4c\x4b\x0a\x96\x10\x04\xeb\x6d\x0d\x4b\xfd\x2e\xcb\x9c\x73\x4f\x00\xba"}, +{{0x84,0x00,0x96,0x2b,0xb7,0x69,0xf6,0x38,0x68,0xca,0xe5,0xa3,0xfe,0xc8,0xdb,0x6a,0x9c,0x8d,0x3f,0x1c,0x84,0x6c,0x8d,0xce,0xeb,0x64,0x2b,0x69,0x46,0xef,0xa8,0xe3,},{0x98,0xbe,0x21,0x00,0x19,0x93,0xa7,0xeb,0x1a,0x12,0x77,0xff,0x74,0xc1,0x55,0x04,0x18,0x3d,0x25,0xfd,0xfc,0xc0,0x5f,0x0d,0x4d,0xea,0x89,0x2f,0x6e,0x30,0x18,0x90,},{0x0a,0xd7,0x1b,0x00,0x25,0xf3,0xd9,0xa5,0x0d,0xb3,0x38,0x41,0x4d,0x6d,0x67,0x0e,0x77,0x99,0xb7,0x27,0x0a,0x84,0x44,0xf6,0xae,0x7f,0x12,0xae,0x7e,0xb7,0x1b,0xd0,0x3f,0xfd,0x3c,0x4f,0x36,0x63,0x1f,0x69,0xfd,0xcc,0x40,0x61,0x46,0x8f,0xf5,0x82,0xed,0xe4,0x95,0x24,0x3e,0xf1,0x36,0x1a,0x3b,0x32,0x95,0xfa,0x81,0x3b,0xa2,0x05,},"\xf7\xe6\x7d\x98\x2a\x2f\xf9\x3e\xcd\xa4\x08\x71\x52\xb4\x86\x4c\x94\x3b\x1b\xa7\x02\x1f\x54\x07\x04\x3c\xcb\x42\x53\xd3\x48\xc2\x7b\x92\x83\xac\xb2\x6c\x19\x4f\xd1\xcb\xb7\x9e\x6a\xfc\x32\xff\x68\x6b\x55\xb0\xb3\x61\x72\x18\xdc\xf3\x93\x16\xb4\xb6\x6b\x3c\x8c\x0d\x67\x26\x7a\x86\xdb\x8a\xdf\x37\x50\x80\x1b\xcf\x93\x27\xd4\xc2\x54\x41\xb9\x61\x97\x83\x2b\x4c\xde\x0e\xac\x3f\xf2\x28\x92\xa2\xf0\xbc\x17\xc2\xc2\x13\xc0\x23\x77\xa3\x33\xe3\x08\xed\x27\x16\x58\x04\x93\x83\xb7\xe2\xe5\x7b\x6b\x8b\x12\x55\x12\xe0"}, +{{0x62,0x88,0x72,0x20,0x35,0xd1,0xea,0x69,0x9b,0xc7,0xcf,0xdf,0x18,0xd8,0x96,0x25,0x42,0x31,0x80,0xb6,0x83,0xfa,0x74,0x63,0x9f,0x4f,0x30,0xf1,0x53,0x59,0xcc,0x85,},{0xe1,0x7f,0xaa,0x01,0x95,0x72,0x86,0x1a,0x06,0x4e,0x1b,0xc5,0x71,0x25,0x6d,0xea,0x14,0x68,0xf3,0xa4,0x85,0x90,0xa8,0x91,0x38,0xaa,0xa8,0x59,0x25,0x08,0x0c,0xd7,},{0x9d,0xec,0x92,0xb6,0xe8,0x9a,0xdb,0xe8,0xf4,0xe1,0xb5,0xe9,0x3a,0xc4,0xfc,0xf9,0x57,0xde,0x7d,0x19,0x70,0xa2,0x26,0x77,0x0e,0xc4,0xed,0xa6,0x47,0xc8,0xe3,0xb3,0xdf,0xfb,0x27,0x31,0xa3,0x9e,0x16,0xe4,0xa0,0x11,0x9d,0x36,0x62,0xa9,0x37,0xe5,0x60,0x52,0x24,0x91,0xec,0x7a,0x16,0x96,0xbe,0x04,0xc0,0x76,0xb1,0x2e,0x35,0x01,},"\x8b\x6c\xaa\xca\xc5\x1d\x89\x49\xfb\x86\xac\xbc\xb1\xb9\x9d\x85\x9f\xf6\x7c\x64\x14\x7b\xc1\x21\x69\x09\xdc\xab\x07\xee\x6e\xf0\x9f\x40\x38\x63\x32\x73\x94\x68\x9d\xc3\x4a\xbc\x77\x8f\xcb\x5c\x1f\x50\x91\xac\xf5\xa0\x8f\x9d\x84\x22\x11\xd1\xae\x2e\xb4\x0b\xe9\xbb\x8d\x66\x79\x07\x74\x71\x54\x7a\x6c\x71\xff\x77\xb5\x19\xd4\xb7\x10\x8e\x32\xbc\x46\x25\x1c\x60\xde\xe8\xe3\x32\xb6\x22\x93\x16\xe6\xd5\x7c\x22\xab\x82\x6f\xf1\xbc\x33\xf2\xb0\x21\x38\x07\xc1\x92\x80\xaf\x11\x0f\xd2\x6e\xe2\x74\x68\x20\x1c\xff\x49\xcb"}, +{{0x13,0x03,0x8a,0x3a,0x65,0xef,0x32,0x75,0x9a,0x9c,0xd9,0x03,0xac,0xb5,0x54,0xb2,0x52,0xde,0x00,0xe7,0xcd,0xb7,0x7b,0xbe,0xd1,0x97,0x0b,0x20,0x68,0x0e,0xe1,0x7b,},{0xb6,0xa3,0x08,0xe6,0x7f,0x9b,0x46,0xc6,0x64,0x99,0x45,0x6a,0xb5,0xcd,0x13,0x5c,0xb2,0xfe,0x84,0xa3,0x2e,0xb0,0x45,0x35,0x86,0x26,0x60,0x4d,0xa4,0x12,0x2c,0x8f,},{0x52,0x61,0x55,0x8e,0xcc,0x3c,0x98,0xff,0x36,0x35,0x1f,0x42,0xf5,0x04,0xca,0xd4,0xa3,0x2f,0xfd,0xa5,0xa7,0x44,0x56,0x09,0x60,0xb4,0xc1,0x06,0xe4,0x49,0x2f,0x02,0xe2,0x04,0x78,0x88,0x7a,0xfe,0xe4,0xf7,0x70,0xf0,0x55,0x97,0xa7,0xe3,0x88,0xca,0xce,0xae,0x80,0x5a,0xe3,0x51,0xe0,0xe4,0x5e,0x8e,0x57,0x8e,0x6a,0x6f,0xf2,0x0c,},"\xdd\xf0\x0b\x40\x33\xa2\xa0\x88\x02\x2d\xab\xe9\x33\x56\x43\x2f\x50\xdd\xc6\xc6\xe1\xa6\x59\xdc\x1a\x93\x12\x4a\x4c\x2f\xff\xfd\x18\x27\x65\xa2\xf5\x6c\x43\xea\x0b\xfd\x8d\xe8\x01\x50\x60\x88\x9a\xe6\x94\x1c\x3f\x3e\x25\x5d\x44\x21\xa1\xc3\x62\x01\xbe\x84\x6a\x27\x38\xa7\x1f\x12\x0c\xad\x59\x8c\xa8\x52\x7d\x70\xff\x8d\x5a\x09\x93\xb5\x5c\xb5\x15\x35\x17\x11\x0a\x41\x96\x2d\xaf\xf4\x22\x50\x15\x8f\x20\x96\xd1\xdd\xaf\x71\x86\xe5\x02\x98\xcb\xe5\x1f\xcb\x42\x9c\xbe\xa4\x11\x29\x3f\x8a\x7b\xd9\xcf\x06\x9f\xa2\x37\xe4"}, +{{0xb9,0xde,0x5b,0x06,0x3d,0x3c,0xa3,0xa7,0x73,0xf1,0x14,0x94,0x1b,0x2e,0x42,0x27,0xc0,0x75,0x11,0xc0,0xf5,0xc0,0x60,0x17,0xb9,0xc8,0x84,0x50,0x18,0xf2,0x34,0x32,},{0x52,0x95,0x24,0x3c,0x86,0x46,0xe0,0x96,0x67,0x4d,0xda,0x15,0x97,0x9b,0x32,0x2b,0x9d,0xd0,0xfa,0xf2,0x7d,0x02,0x4a,0x0e,0xd5,0x77,0x13,0x34,0xe1,0x17,0x9e,0xd2,},{0x92,0xba,0x76,0x0d,0x14,0xd1,0x41,0x5c,0xfa,0xf2,0x18,0xca,0x84,0x70,0x14,0x08,0x8a,0xe5,0x1a,0xd8,0x21,0x11,0x3a,0x6f,0x86,0x30,0x35,0x6f,0x7b,0xa8,0x5c,0x00,0x5e,0x23,0x30,0xf1,0x06,0x6d,0x0d,0xf4,0x64,0x80,0x60,0x52,0xa4,0x17,0x46,0x10,0x05,0x04,0x62,0xf3,0xe0,0x13,0xd7,0x02,0xe7,0xc7,0x71,0x85,0xa0,0x32,0x58,0x0b,},"\x94\x93\xcc\x23\x89\x6b\x84\x09\x60\x46\xae\x10\x53\xaf\xe3\x94\x99\xe9\x42\x42\x54\xb3\x66\xfe\x14\x3f\x4d\xa3\x21\xe2\xdc\x9e\x47\x84\x20\x8e\x12\xa5\x42\xd8\x99\x82\x8d\xde\x7e\xff\x62\x5a\x7f\x12\x41\x69\x90\xc2\x84\x1f\xfb\x09\x5b\xf9\x4c\x0c\x61\x0e\x5a\x66\x39\x18\xb6\x89\x03\x1c\xcd\x6b\x51\x93\x49\xd0\x4d\xe1\xc2\x12\xca\x2a\x9d\x7a\xbf\x52\xe1\xb4\xfd\x46\x7b\xb6\x65\xb6\x91\x9e\xf8\xf9\x16\x17\xe2\x05\x56\x5b\xf5\x66\x47\xe5\xf8\xd5\x08\xea\x20\x0a\x84\x46\x7f\x8f\xa1\x22\xe7\x4b\xc3\xb9\x97\x9f\x11\x74\xe5"}, +{{0x8f,0xf0,0x29,0x7c,0xc0,0x88,0x42,0xb5,0xe6,0x75,0x52,0xec,0x28,0x43,0xe0,0x43,0x53,0xa3,0x4d,0x74,0xef,0x89,0xb8,0x56,0x5d,0x97,0x20,0x5b,0x74,0xca,0x13,0x3a,},{0x0f,0x7e,0xf9,0x8c,0x5b,0xa4,0xaf,0x98,0x4d,0xfb,0x77,0xbc,0x4e,0x53,0x7b,0x2b,0x39,0xe6,0x27,0x3b,0xb3,0xe7,0xb9,0x5f,0xe1,0xb7,0xe6,0x78,0x19,0x52,0xbd,0x4a,},{0x07,0x83,0x73,0x7f,0x70,0x6e,0x6f,0xf3,0x66,0x14,0xf8,0x50,0x07,0x4f,0xca,0x1f,0x48,0x5f,0x24,0xfc,0xde,0x2a,0x28,0xaf,0x54,0x4f,0x37,0xab,0xd6,0x9b,0x7a,0x58,0x1d,0xef,0xd8,0xc7,0x71,0xb0,0x31,0xe1,0x08,0xd1,0x9d,0x78,0x8c,0x74,0xc5,0xf2,0x0b,0xb3,0xf1,0xc2,0x1c,0xd9,0x2b,0xe3,0x17,0xba,0xcd,0x8f,0x65,0x0b,0x49,0x05,},"\x2b\xdc\x3a\x48\x6c\x5e\x4e\xa6\x2d\xcf\xec\x8a\x9d\x4f\xcf\x9e\xa9\x49\x0d\xbc\xc7\x15\x61\x5d\x58\x49\x0a\x72\xce\x83\x3f\xa2\x23\x87\xca\x50\xa0\x05\x25\x08\xcf\x0a\xff\x1c\xa7\x27\xf0\xfe\xd4\x6f\xfa\x7d\x3c\x8e\x23\xc5\xbb\x01\xd4\x7e\x90\xff\x06\xd3\x85\x8a\x55\x7d\x99\x26\x48\x15\x79\xda\xf4\x38\x4a\xea\x50\xe9\x6e\xc6\x15\xd2\xa3\xbf\x3c\x11\x22\xf1\xf2\x4d\xd6\xed\x98\xa5\xde\x42\x18\x83\x58\x9c\x21\x39\x98\xca\x54\x32\x37\x3e\x68\xbb\xbe\x89\x42\x8c\xa9\x88\x5d\x05\x93\xd5\xe6\x21\x51\x16\xb8\x26\x63\x86\x45\x2b"}, +{{0x05,0x0d,0x55,0x3d,0x28,0x2d,0xca,0x32,0x69,0xc8,0x3c,0x18,0x17,0x68,0xec,0x06,0x7b,0x81,0xc9,0xfe,0x0c,0x94,0xf2,0xa0,0xeb,0xbb,0x0c,0x94,0x2d,0x0f,0xcd,0x7c,},{0x63,0xe2,0x30,0xb0,0x03,0xc5,0x3a,0x56,0x72,0xe8,0x32,0xff,0x7f,0x24,0x43,0x0b,0xe2,0x23,0xe4,0x97,0xde,0x84,0x02,0x33,0xf5,0x95,0xa3,0xe2,0x00,0xc7,0x12,0x7e,},{0x3f,0x0e,0x83,0x76,0x5b,0x31,0xbb,0xe8,0xe1,0xfb,0x92,0xe9,0x67,0x8d,0x6c,0xde,0x57,0x1a,0x03,0xba,0x7f,0x1d,0xcc,0x11,0x28,0x46,0x1f,0x70,0x85,0x25,0x45,0x7f,0x4e,0x0e,0x23,0x53,0xaa,0x2b,0x59,0x8c,0x06,0x3f,0xf1,0xbf,0xfd,0xac,0x91,0x6b,0x5a,0x22,0x00,0x65,0x51,0x56,0x90,0x4b,0x05,0x85,0x57,0x7a,0x16,0x28,0x56,0x0d,},"\x15\xe1\x3b\x8c\x01\x00\x4f\x6a\xa5\xb2\x36\xdb\xb2\x81\x67\x7f\x74\x6d\x81\xe5\x48\xe0\xaa\x80\xf0\xe4\x14\x52\x15\x21\xd8\x56\xcd\x69\x4e\x7c\x91\x52\xbb\x5e\x43\x77\x6b\x60\xf6\xb5\x60\xed\x1a\xd3\xe4\xb3\x90\xdb\xf3\xe4\x6e\xf9\x25\x74\x43\xf3\x9c\x14\x9e\x02\x40\xa0\x2d\x02\x1e\x1e\x3d\x7d\x04\x6b\x26\xfd\x00\x4e\xee\x7c\xa1\x6a\x80\x59\xe1\x26\xc7\x4c\xb3\xf2\x19\x4d\xb4\x7b\xf6\x04\x65\xec\xef\x5c\x70\x4d\x2e\x2c\x75\xe2\xe5\x00\x60\xea\x2a\x31\xcb\x72\xb7\xb3\xc6\xb1\xb5\xec\x72\xab\x38\x00\x40\x85\x28\x1a\x22\xfe\x86"}, +{{0x69,0x49,0x7c,0xd7,0xb4,0xe8,0x68,0xcf,0xa0,0x32,0x8d,0x92,0xbd,0x60,0x52,0xd7,0x72,0xb2,0x76,0x73,0x95,0xc1,0x45,0x95,0xb2,0x79,0x85,0x1a,0x9c,0xdd,0x31,0xaa,},{0x5d,0x27,0x6d,0x62,0x6e,0x23,0x0d,0x18,0xe7,0xbc,0xd6,0x11,0x41,0xcb,0x93,0xc9,0x0e,0xf0,0xf7,0x9e,0x01,0x32,0x12,0x12,0xd8,0x38,0xec,0x71,0x45,0x7b,0x1a,0xac,},{0xbe,0xaf,0xa5,0x83,0x40,0x96,0x09,0x08,0xe8,0xd8,0x6e,0x40,0x32,0x9e,0x3a,0x45,0x23,0xfc,0x7b,0xe7,0x70,0xad,0xdb,0x86,0xe3,0x4c,0x37,0x72,0xf8,0x4c,0xd9,0xfb,0x33,0x8d,0x1f,0x3b,0x65,0xbf,0xcd,0xb0,0x9f,0x35,0xc6,0xda,0x36,0xd1,0xa3,0xad,0xf8,0xf9,0x1f,0x1f,0xfd,0x57,0x82,0xcc,0x83,0x02,0x06,0x43,0x3a,0x08,0x41,0x0d,},"\x53\xcd\x08\x0a\x0c\x61\xf1\xa0\x93\xd3\xb3\xa7\x45\x71\xc2\x96\x30\x3f\x36\x3b\x41\x07\xed\xbe\x88\x0b\x7a\xa9\xdf\xe4\x4a\xb5\xd5\xdc\x5f\x74\xbe\x9c\x8d\x87\x6f\x04\xd7\x54\x65\x34\x91\xab\x51\xb1\x35\xfc\x95\x3f\x71\x28\x7b\x62\xff\x41\xb6\x7c\x74\x2b\xd3\x44\x56\x71\xa9\xd4\xf2\xdc\x17\x4c\xa1\xb0\x33\x5f\x78\x62\x7a\x0d\xd4\xb3\x06\x50\x50\x41\x78\x03\x9e\x73\x93\x63\x85\x10\xff\xe8\x40\x91\xb5\x72\x98\xd3\xac\x90\x01\xc3\x67\xc1\x45\x2f\xbc\xb3\x3d\xc5\x4a\x5d\xc3\x16\xfb\x2a\x52\x70\x76\x4a\x2a\xc8\x20\xa0\xb6\x3f\xbd\xc6"}, +{{0x21,0x65,0xa4,0x86,0xb6,0x12,0xbb,0xff,0x52,0x9c,0xd0,0x03,0x46,0x96,0x4a,0x3c,0xb8,0xcd,0xcf,0xfa,0x51,0xdc,0x3d,0x52,0x4d,0xd5,0xad,0xc5,0xac,0x93,0x6d,0x68,},{0x7e,0xbc,0x83,0x9a,0x46,0x5e,0x14,0xf5,0x89,0x24,0x76,0xe4,0xa1,0x3b,0x39,0x88,0xf8,0x3b,0x3c,0xd2,0x7e,0xf7,0x9e,0x19,0x3f,0x86,0xfa,0x16,0xf3,0x4a,0x1c,0xe1,},{0x7e,0xc6,0xfb,0xa5,0x6b,0xa5,0x24,0x60,0xa1,0xb4,0xf2,0x73,0x86,0x89,0xc1,0x88,0x3d,0xda,0x9a,0xaf,0xfc,0x8b,0xde,0x17,0xcb,0x60,0x29,0xbd,0xce,0x3a,0x0e,0xbe,0x2f,0xff,0xda,0x55,0x93,0x9b,0x70,0xbb,0xd0,0x7f,0xdb,0xf6,0xfc,0x5c,0xda,0x87,0xfe,0xd8,0xba,0x58,0x57,0x5f,0x89,0x4a,0x36,0x6e,0x45,0xe5,0x70,0x5e,0xea,0x09,},"\xb7\x28\xda\x7a\x36\x16\x7c\x60\x85\xbd\x2d\x96\x2c\xf6\x39\x59\xfa\xcd\x95\xc9\xad\x45\x42\x02\x8a\xfb\xa9\x0e\xc9\xc6\xc0\x76\x0b\xda\xe9\x35\x42\x9c\x3f\xeb\x39\x33\xe2\xf0\x00\x42\xc6\x72\xad\x2c\xd7\x34\x8d\x92\xbc\x33\xf8\x17\x51\xe2\x94\xae\x91\x71\xb9\x45\xb1\x93\x14\x4e\xf8\xac\xb9\xa1\xbd\x9a\xbf\x04\x75\xce\x0d\x0a\xc7\x89\xb2\x00\xc3\x2e\x9c\x9a\x27\x36\xb1\x68\x36\x9c\xe5\xf9\x7b\x1e\x8d\x2e\x79\x00\xe1\xa7\x59\x17\x84\x41\xf1\xfc\x43\x05\x64\xae\x12\x9b\xae\x78\x57\x74\x05\x11\xa6\x68\xf3\x2c\x0a\x3b\x07\x7a\x9d\x8b\x19"}, +{{0x1c,0x64,0xad,0x63,0xdd,0x14,0x70,0x34,0x59,0x8e,0x12,0x8f,0x74,0x06,0xec,0x05,0x30,0x74,0x6e,0xa1,0xc5,0xb7,0x2e,0xcf,0x79,0xe8,0x88,0x06,0x54,0x86,0xfa,0x1b,},{0xba,0xa6,0xbc,0xc1,0xc3,0xd8,0xd3,0xb1,0x1f,0xfc,0x15,0x87,0xad,0xdd,0xc5,0x8b,0xfd,0x96,0xc2,0xb9,0x92,0xb6,0xc6,0xf5,0x9f,0xcc,0x50,0xcc,0xbc,0xdd,0x0e,0xb9,},{0x74,0x77,0xe5,0x41,0x58,0xf1,0x3b,0x71,0x28,0xc0,0xa1,0x10,0xca,0x6b,0x65,0xf4,0x25,0x14,0xfb,0x70,0xcd,0x5c,0xf2,0x8a,0x8b,0x1c,0xc6,0x11,0x0e,0xa0,0x6f,0xcf,0x94,0x29,0x0d,0xa1,0x3f,0x85,0xa1,0x1c,0x23,0x51,0xd3,0xbb,0xcc,0xbb,0x4c,0x64,0xe0,0x21,0x5d,0x6d,0x0f,0x00,0x99,0xe7,0xf2,0x7b,0xc9,0x4e,0x94,0x9b,0x15,0x0b,},"\x9e\xbd\x8e\x33\x78\x93\xbb\x05\x3e\xf2\xb9\xe3\x26\x9d\xf5\x48\x48\x49\x4f\x03\xcd\x63\x57\x6b\x33\xe6\x4b\x10\x80\xbe\x4b\xe0\x15\x26\x4a\x40\x3f\xb9\x60\x2b\xbf\x90\xca\x19\xb2\x41\xa9\xb6\x68\x63\x90\x9b\x90\x08\xce\x1b\x2f\xfc\xf2\x36\xef\xa4\xc2\x66\x8f\x0f\x47\xdb\x9f\xf5\xfa\x15\x7d\x9c\xb6\x05\x41\x2b\xe7\xdd\x8b\x07\xea\x87\x8c\xcc\xae\x6b\xf5\x0f\x93\x5b\x86\xd1\x9e\x1b\x64\x8b\x69\xe5\x28\x55\x3a\x56\xd8\xaf\xb7\x82\x21\xad\x53\x30\x7b\x7a\x4e\xc8\xd2\xfd\x48\x61\xb5\x5d\xc5\xda\xe8\xe9\x3e\xf3\x87\xfb\xbe\x0b\x4c\xe7\xf7\x88"}, +{{0x55,0xab,0xbc,0x5d,0xac,0x41,0x28,0x13,0x4d,0xc8,0xc6,0x01,0x8a,0x21,0x3e,0xd4,0xb6,0x0f,0xcc,0x8e,0x90,0xcb,0xd4,0x1d,0xb2,0xd2,0x1e,0xda,0x53,0x73,0xe9,0x36,},{0x25,0x1a,0xfa,0xa2,0x64,0x69,0x26,0xb2,0xa3,0x71,0xf2,0xa0,0x9d,0x58,0x65,0xb9,0x8c,0x9a,0x5e,0xb6,0xca,0x04,0x7c,0xd0,0xd8,0xee,0x36,0xe5,0xe0,0x41,0x69,0x74,},{0xf6,0xa6,0x1c,0x2e,0x66,0x1a,0x9e,0xb7,0xbd,0xe1,0x82,0xe3,0x8e,0xc9,0x9a,0xf9,0x85,0xf6,0x16,0x98,0xa5,0xd7,0xfa,0x43,0x0d,0x16,0xe3,0xf1,0xa9,0x37,0x09,0xb7,0x55,0x22,0x32,0x0d,0xe4,0x8a,0xfc,0xc5,0x95,0xab,0x20,0x91,0x22,0xae,0x0c,0xe1,0x32,0xcd,0xf4,0xb0,0x39,0x17,0x46,0xe7,0xff,0x34,0x11,0x77,0x57,0x0c,0x81,0x08,},"\x47\x01\x0e\x13\x98\xad\x55\xfa\xbe\x37\x1d\xd8\x64\x8f\x76\x8d\x90\xdf\x4b\x96\x5a\x3b\x39\x61\x00\xb3\x03\xb4\x0a\x17\x51\x8b\xed\x6d\x86\xb0\x9f\x73\x4a\xb7\xc1\x0b\x5f\x3a\x01\xb5\x3d\xee\xc5\xf8\x53\x4b\x70\xc7\x9f\x3f\x29\xb2\x84\xfd\xec\x48\x6f\x22\xf4\x4c\x22\xcc\xd5\xc6\x46\x35\x94\x41\x52\x67\xba\xa6\x11\xf7\x0b\x1b\x31\x6c\xaa\x1b\x68\xb5\xe0\xe9\x9b\x31\xc5\xbb\x0c\xe1\x36\x79\xa2\x3c\x31\xa6\x39\x99\x69\x81\x64\xcb\xf3\x7d\x10\x3b\xa9\x24\x90\x18\x8b\xe5\x99\x37\xf1\x23\x04\x3e\xc7\x86\xef\xe3\xd4\x11\xf9\xb0\x62\x3a\x6a\xd9\x72"}, +{{0xf2,0xdc,0xf4,0xa1,0xa0,0xd4,0x6d,0xdb,0x2d,0x72,0xf8,0xfd,0xd8,0x0b,0xbe,0xc5,0xb7,0xde,0xa5,0x91,0x3d,0xa4,0x96,0x6c,0x2f,0x4d,0x12,0xc2,0x61,0xf0,0xbf,0x98,},{0xd3,0x95,0x70,0xa2,0x5c,0xa5,0x9f,0x22,0x57,0xf9,0x3f,0x96,0x60,0x0d,0xf4,0xf6,0x3e,0x68,0x4b,0xf6,0x3a,0xe8,0xdf,0xfd,0x91,0x4e,0x46,0x29,0xc3,0xd5,0x09,0x5f,},{0x42,0x88,0x2a,0x81,0x1d,0xad,0x2d,0x85,0x18,0x85,0xe4,0xcb,0xe9,0x04,0x47,0x08,0xd9,0x1a,0x86,0xf1,0x5d,0xfa,0x1d,0x66,0xc3,0xeb,0x30,0x43,0x14,0x53,0x1f,0x30,0x15,0x20,0x8c,0x71,0x1b,0x9b,0xdb,0xc5,0xfb,0x23,0x39,0x51,0xe5,0x69,0xb5,0x9d,0x34,0xe4,0x15,0xee,0xc4,0xb3,0x7f,0xfd,0x37,0x4d,0x41,0x2c,0x9a,0x36,0x0d,0x0c,},"\x3b\x00\xe8\x08\xfc\xa4\xc1\x16\x51\xd8\x53\xd6\xb9\x0f\x95\x2c\xcf\x56\x47\xe1\x02\xd4\xee\x0a\xd7\xa5\xd1\x81\xd5\xb4\x25\x8c\x52\x3c\xd3\x9e\x3d\x98\x25\x29\x8d\x84\xc8\xcb\xa0\x9f\x43\xdb\xba\x11\x99\x88\x22\x2c\x76\x05\x9c\xaf\x17\xb4\xbf\x99\x31\xc4\x5e\x61\x74\x48\xae\xad\xe1\x51\x18\x14\x97\xb2\x45\x52\x36\x7e\x52\xbc\x45\xac\x79\x08\x88\x06\xd3\x36\x82\x07\xaa\xfe\xfd\x30\x57\x84\x5d\xce\x81\x9d\x5a\xaa\xa7\x7b\x21\x8e\x2a\xed\x3d\xa7\x6d\x40\xc1\xf0\x76\x99\xf8\x17\x2e\x4a\x5c\x80\x3f\x7a\x2a\xce\xb9\xa4\x7a\x89\x52\xe1\xb2\xf0\x53\xf2"}, +{{0x22,0x46,0xbf,0xb0,0x61,0x55,0x85,0x9e,0x10,0xa7,0x48,0xff,0x8f,0x59,0x19,0xad,0x5d,0x1d,0xaa,0xb7,0x56,0xf0,0x10,0x57,0xb7,0x90,0xd0,0x74,0x74,0x77,0x5f,0x4f,},{0xfa,0x63,0x49,0xb6,0x2d,0xc8,0xc6,0xa2,0xfe,0xee,0xf6,0xff,0xc3,0x3a,0xe0,0x85,0xc6,0x49,0x79,0x5c,0x1c,0x9d,0x98,0x98,0xe7,0x5c,0x13,0xae,0x16,0x25,0xdb,0x34,},{0x2b,0xe4,0x91,0x5a,0x35,0x2f,0x77,0x85,0x48,0x30,0x46,0xd8,0xae,0x96,0x25,0xb8,0xb6,0x32,0x57,0xaf,0x57,0xc0,0x73,0x69,0x12,0x56,0xee,0x07,0x6d,0x6e,0x1b,0x97,0x2a,0x10,0x1f,0x55,0x1c,0x70,0x5d,0x3f,0x96,0x15,0x7c,0x33,0xb5,0x6e,0xa0,0x49,0xbe,0x4a,0xf4,0xdc,0x56,0x1c,0xbe,0x3c,0x1e,0xc5,0x07,0x2d,0x7f,0x13,0x4e,0x07,},"\x63\xee\x1c\x7b\xbb\x15\xce\xbe\x1c\x22\x53\x2d\x48\x16\x82\x75\x4b\xda\xf5\x8b\x8b\xc9\x97\xae\x30\xa3\x4c\x9d\x23\xc3\x3f\x16\x90\xc3\x46\xab\x0a\x73\x65\xff\x62\x45\x74\x24\xb6\x10\x5f\x84\x21\xec\xa0\xce\x3c\x63\x0a\xcf\xeb\x9a\x1c\xc4\x16\x39\x0e\xdf\x49\x20\xe2\x2b\x23\x67\xe9\xfb\x5d\x2a\xb2\x5b\xee\x56\xda\x03\xea\x55\xe3\xf5\x78\x82\xd4\x8b\x89\x22\x93\x14\xd7\x34\xcb\x83\xc7\x9f\x4e\x17\xee\x64\xba\xe6\xf7\xad\xdb\xe9\xb5\x25\xfc\xd0\x3a\x91\x40\x9a\x2d\xde\x90\x77\x51\xdb\x8c\xc9\x7e\x08\xd0\xea\x89\xc4\xd1\x87\x18\xd2\x6d\x0b\x89\x7b\x64"}, +{{0xc0,0x88,0xa3,0xdd,0x2c,0xb8,0xbd,0x5d,0x68,0x4d,0xb8,0x53,0x8d,0xc2,0x24,0x73,0xb6,0xf0,0x14,0xf6,0x4f,0xe8,0x6a,0xf1,0x68,0xb4,0xbb,0x01,0xb9,0x0a,0x1d,0xd0,},{0xaa,0xd6,0x15,0xa9,0xc2,0x87,0x59,0xf0,0x3d,0x37,0x3a,0xbe,0x66,0x66,0x91,0xde,0xad,0x8b,0x84,0xf9,0xb8,0xb5,0x0a,0x67,0xf8,0xf0,0xaa,0x4a,0x70,0x15,0x80,0xd1,},{0x3b,0xb4,0x59,0xd1,0xac,0x57,0x5a,0x18,0x0c,0x17,0x28,0xd8,0xb8,0x92,0x49,0x70,0x49,0x2a,0x0c,0x8d,0x2a,0x37,0x8c,0x29,0xd1,0xd4,0x17,0x85,0xc8,0x37,0x9a,0x58,0xe2,0xba,0x36,0x06,0x78,0x5e,0x1c,0x5d,0xa2,0x9e,0x55,0x27,0x55,0x2b,0xc6,0xdc,0x89,0xa2,0xb6,0x9c,0x27,0xfe,0x51,0xed,0x25,0x3a,0x9f,0x3b,0x56,0x5b,0x27,0x00,},"\x74\x90\x6a\xe0\x5a\x5a\xf8\xe9\x96\x8b\x6f\xeb\x49\x85\x69\xd6\x34\x5a\x24\xf9\x71\x1b\xef\xb1\x36\xe6\xc3\xb5\xed\x49\x33\x9e\x59\xa7\x93\x8b\x4b\xa1\xa1\x18\xf1\x69\xb9\xac\xe0\xf7\x84\x2a\x26\xa6\x45\xf1\x4c\x0a\xd2\x2e\xbb\xcd\xa9\x3e\x67\xe4\xc3\x48\xef\xc3\xd9\xec\xbb\x14\x19\xe6\x26\x2d\x04\x36\xa5\x8e\xa8\x2c\x22\x02\x38\x90\x65\xcc\xf6\x7c\x4f\x55\x0e\x45\xb5\xf6\xa1\x2a\x6c\x01\x1b\x2e\x0a\x30\x10\x1d\x5c\x62\x32\x8b\xbf\x99\xc8\xc9\x55\x63\xa6\xe3\x3b\xdd\x9c\xce\x72\xb1\xf7\x20\x13\x9c\x2f\xd3\xe0\x49\x13\x14\x6a\xe5\xba\xc5\x28\x8e\x0e\x3e"}, +{{0x45,0x66,0x7d,0x1e,0x7b,0x59,0x10,0x97,0x9c,0x4a,0x32,0x83,0x17,0x96,0x83,0x71,0xc8,0x64,0xd5,0x64,0xa6,0x61,0xc5,0xcc,0xe5,0x57,0xc9,0xec,0xc6,0x1b,0xab,0x9e,},{0xed,0xcd,0xf5,0xe1,0xa1,0x70,0xe0,0x0c,0x8c,0x68,0x7e,0x7e,0x9c,0x18,0xf9,0x89,0x3b,0x5f,0xe4,0x95,0xcd,0x29,0x77,0xce,0xb7,0xf4,0x46,0xc0,0x14,0x9a,0xa9,0xd3,},{0x6d,0xe6,0x68,0xf1,0xca,0x6f,0x29,0x28,0x14,0x62,0x52,0x89,0xa0,0x80,0x80,0x20,0xc8,0x7c,0x89,0xac,0x94,0xf5,0xb0,0x50,0x8e,0x55,0x7b,0xdf,0x80,0x00,0xa5,0xca,0x80,0x8f,0x02,0x1c,0x96,0x79,0xb5,0x0e,0xe2,0xf3,0x20,0x06,0x4c,0x95,0xa4,0x64,0xa8,0x43,0x93,0x79,0x82,0x8c,0x3b,0x76,0xcf,0xa7,0x66,0x45,0x5e,0x12,0x8c,0x0b,},"\xcd\x66\xce\xc4\x76\xc8\x7c\x8d\xbf\x47\xec\x91\xda\xc4\x8f\xb5\xb4\x2d\xb1\x28\x2a\x57\x3e\x0a\x5c\xf0\xb9\x17\x68\x98\x66\x08\xe1\xd7\xeb\xd0\x5f\x52\x51\xbc\xf8\xb4\x7a\x17\x09\x32\x29\xac\xef\xbd\x44\xbe\xb2\x1c\x0c\x0c\x92\x8d\xd3\xcd\x3f\x89\x66\xec\xce\x69\x10\x33\x1c\x50\x8e\xa7\x6b\xaf\x90\x4d\x8c\x21\xf6\xc1\x7c\x2c\x58\xd0\x0a\xfd\x32\x59\xb8\xbf\x79\x4c\x14\x6b\x12\xb9\x95\xcd\xdd\x1c\x42\x89\xc5\xbe\x31\x68\xeb\xd6\x16\xb3\x84\xc2\x81\xce\x1b\x38\xa1\x0e\x18\x07\x80\x88\x53\xc6\x81\xa6\x40\xa0\x09\xb4\xd2\xac\xd7\x93\x4f\x8c\x6d\x07\x57\x81\x61"}, +{{0x24,0x89,0x74,0x28,0xae,0x65,0x46,0xd8,0x5b,0x31,0x90,0xeb,0xe3,0xf1,0xf7,0xbf,0x7c,0x71,0x25,0x28,0xac,0x85,0x1a,0x58,0x8b,0x07,0xd5,0xc8,0xf9,0x4e,0xec,0xd1,},{0x5f,0x34,0x8f,0xe3,0xea,0x5b,0x2c,0x02,0x3d,0x0a,0xf7,0xed,0xe6,0x0e,0x55,0xf9,0x1a,0xa5,0x51,0x99,0x69,0x9d,0xa1,0x5a,0x11,0xc3,0x79,0x1d,0x68,0xd7,0x10,0xbd,},{0x1b,0x5e,0x75,0xde,0xf4,0x9f,0x51,0xd6,0xb2,0xde,0x00,0x8c,0x71,0xfc,0x1a,0x90,0x9b,0xd4,0x2c,0xa8,0x13,0x29,0x8d,0xce,0x4e,0xee,0xf7,0x17,0x81,0x5d,0x7a,0x6c,0x07,0x8c,0x2f,0x3d,0x9a,0x3f,0xce,0x1a,0xb5,0xb3,0xad,0x8e,0xf8,0xd4,0x5c,0xdf,0x2e,0xb4,0x90,0x1c,0x32,0xee,0xa2,0xd5,0xe0,0x18,0xdc,0xf2,0x83,0x3c,0xad,0x0c,},"\x52\x01\xd9\x72\x5f\x1d\xff\xa1\x86\x3f\xa4\xd8\x4c\x30\x18\x61\x14\x1a\xcd\xfb\x64\xbe\x1f\xbf\xdd\x5b\x93\x86\xdb\x20\xef\x39\x40\x99\xee\xbc\xfd\xfe\xcc\x62\xc6\x26\x86\x07\xa8\x4d\x55\xc5\x5c\xd0\xef\xdc\x37\x2e\xcf\x30\x67\x34\x3e\x7b\x07\x31\xc2\x68\x54\x61\xe2\x4b\x95\x3f\x99\x94\x9e\x59\xba\x3e\x67\xed\x0f\x08\x48\x31\x37\x93\x96\x2a\x29\x2c\x45\x98\x14\xc5\xe2\x86\x90\xec\x1f\x45\x17\x1f\x1a\xba\xb8\x6f\xdd\x14\x56\x8b\x00\xca\xf4\x85\x81\x11\x5e\xe5\xea\x83\xb0\x00\x28\x2f\xbb\xf0\xc0\xb2\xa1\x11\x60\x39\xa3\x5c\xfa\x3f\x20\x14\x22\x20\x7a\x3d\x49\x48"}, +{{0x7b,0x04,0xac,0xa7,0xcf,0x92,0x62,0x16,0xcb,0x96,0x0a,0x38,0x90,0x78,0x63,0x39,0xd0,0xa6,0x15,0x96,0x76,0x80,0x19,0x01,0x23,0xfd,0xa3,0xb6,0x0c,0x6a,0xeb,0x11,},{0xcd,0xbc,0x3e,0x70,0xe4,0xe8,0xfd,0x13,0xd0,0xcc,0xe2,0x85,0x2a,0x3b,0x93,0x72,0xc3,0xa6,0x16,0x0c,0xd6,0xde,0xab,0xa9,0x0f,0x9b,0x30,0x22,0xf7,0x0c,0x91,0xf9,},{0x25,0xd2,0xd3,0x61,0x75,0x1d,0x52,0xb4,0xfe,0x66,0xea,0x18,0xe4,0xb9,0x86,0x6b,0xde,0x3d,0x12,0x1a,0x73,0x12,0xfd,0x9e,0x28,0xa1,0xe2,0x95,0xe0,0x87,0xe3,0x17,0x6c,0x94,0xc8,0x74,0xa2,0xe8,0x16,0x00,0xf2,0x4c,0x46,0x54,0xf4,0x3d,0x1b,0x67,0xd4,0x7b,0x64,0x82,0x26,0x48,0x59,0x0c,0xe5,0xce,0x44,0xf3,0xb5,0xdd,0xc5,0x02,},"\x1c\xb0\x96\x24\xb1\xf1\x4a\x02\x60\xc7\xf5\x6d\x8c\x60\xb5\xfe\x45\x83\x71\x14\x23\x25\x51\xef\x59\x66\x38\x6e\x0c\x2b\x44\x1b\x75\xcf\xdb\x8d\xf2\x18\x57\x85\xd2\x2c\xf5\x26\xfa\x9d\xf7\xfd\x45\xd9\xd8\x38\x81\xb6\x6c\x1f\xee\xe0\x91\x3e\x23\x81\x21\xee\xdb\xb7\xab\x50\x4d\xa0\xbe\xe8\x99\x80\x16\x68\x45\x35\x03\x19\x91\xf1\x1b\xfc\xd9\xb9\x56\x90\xaa\xd2\xd1\x9b\xd6\xa9\xde\x18\x44\xed\x13\x62\x30\x2d\xf4\x21\x72\x30\xb2\x5c\x05\x52\xce\x27\x75\x34\xc6\x50\xca\xe5\x26\x57\x7f\x25\xd8\xb1\xfe\x9f\x9f\xeb\xca\x2c\x81\x46\x70\xd4\x80\x5b\x21\xad\xef\x85\x2d\xaf\x94"}, +{{0xea,0x73,0xbf,0x64,0xa1,0xa9,0x78,0x77,0xc3,0xc3,0xe7,0xca,0x46,0x44,0xb7,0x1a,0xaa,0x66,0x31,0x4c,0x8f,0x1b,0x66,0xba,0xfa,0xeb,0xd5,0xed,0xfb,0x88,0x8b,0xcd,},{0xca,0xac,0x93,0x90,0x2e,0x57,0x64,0xad,0xe4,0x72,0x94,0xed,0xd5,0x1f,0xaa,0x14,0x62,0x09,0x40,0xc6,0x68,0xb5,0xc1,0xc3,0x92,0xa6,0x92,0x83,0x25,0xd4,0xc3,0xfd,},{0xbd,0x86,0xcb,0x9c,0x70,0xa0,0x55,0x27,0x9a,0x86,0xa9,0xe6,0x48,0x70,0x98,0x8b,0x8a,0x73,0x45,0xc3,0xcd,0x29,0x48,0xa0,0xfa,0xbc,0xfb,0x38,0xab,0xce,0x3c,0x42,0x0b,0x4d,0x55,0x21,0x61,0x8e,0x11,0xd2,0xde,0x82,0x7d,0x9d,0xe5,0x69,0xf6,0xbc,0x3b,0xe6,0x6a,0xad,0x40,0x63,0x6c,0xda,0xa6,0x47,0x60,0xde,0xd3,0xb7,0xc2,0x09,},"\x36\x2e\xec\x68\xb9\x12\x85\x27\x86\xbb\x4f\x9a\xff\xf9\xec\xf7\xcb\x28\xc9\xde\x6b\x18\x42\x2a\x8c\xa9\x40\xb0\xd7\xe6\xdc\xb8\x3a\xa4\x4b\xe0\xaf\xb5\xf1\x80\x6d\x43\xf0\xe3\x1d\x71\xf9\x22\xf8\x53\x61\x5a\x26\xe2\x87\xa2\x7f\x08\xa0\x4f\xbc\xe3\xd4\x5a\x0c\x6c\x31\x1d\x4b\x7c\xb1\x7e\x42\x5b\xbe\xb0\xa6\xb4\x10\xb5\xd6\xdb\xb7\xac\x11\xdf\x98\x50\xa1\x31\xa6\x91\xe3\xb6\x0b\x0b\x21\x4e\xbe\x04\x41\x06\xe9\x82\x43\x32\x87\x59\x52\x67\xb0\x31\xb5\xd4\xa0\x92\x62\xde\xd8\x93\x4f\xdf\xdf\x96\x4d\x86\x8e\xf9\xa2\xc8\x42\xf8\x04\xea\xfd\xde\xfc\xb7\x1d\x9f\x16\xa5\x9b\xf8"}, +{{0xb8,0x12,0x3c,0x11,0x6b,0x33,0xba,0xd0,0xdc,0xbc,0x2c,0x4d,0xc0,0x6a,0x3d,0x66,0x85,0x0d,0xab,0x36,0x0c,0xdb,0x5a,0x03,0x3c,0x14,0x89,0x5c,0x4e,0xe3,0x1b,0xfb,},{0xbd,0xca,0x15,0x1b,0xa3,0x2c,0x6b,0xb3,0x15,0x31,0xb0,0x5f,0xdf,0x86,0xc6,0xd7,0x8c,0x8c,0xd1,0x93,0x56,0x11,0xd5,0xff,0x11,0x1a,0x0f,0x00,0x63,0x5b,0x18,0x85,},{0x9c,0xf1,0x3e,0xba,0x3d,0xcc,0x37,0xb8,0xfc,0x70,0xcc,0xb2,0x32,0x74,0x36,0xb9,0xf0,0x88,0x55,0xe7,0x26,0xaa,0x7e,0xd8,0x2b,0xd5,0xcb,0x7d,0xf4,0x5f,0xdf,0x9e,0xc1,0xf9,0x6a,0xfa,0xd1,0x93,0xf4,0x75,0x72,0xd7,0x70,0x44,0x4b,0x65,0xb7,0x4a,0x37,0xcc,0x03,0x4f,0xc5,0x14,0xcb,0x3f,0x91,0xb2,0xd8,0xad,0xa5,0xb0,0x20,0x06,},"\x79\x70\xf6\x66\x66\x34\x54\x8c\x84\x8b\xb5\x23\x38\x81\x7b\x26\xa4\xd0\xca\x68\xdf\x3d\x28\xaf\xff\x20\x7c\x2d\x02\x80\x67\xa1\x8e\x4c\x95\x43\x02\x5f\x5b\x02\x28\xaa\x69\x1e\x50\x88\x51\x31\x51\xa9\x44\x94\xe1\x5d\x1f\x54\x21\x03\x28\xe0\xdf\x15\x9b\x35\x2c\x30\xaa\xa7\xa8\x44\xf1\x8a\x9f\x4c\x39\x5d\xcb\xb3\xfb\x9f\xcf\xbe\xd1\x10\x3e\x07\x06\xfb\xf9\xc3\x5f\xe2\x66\x68\x48\xfa\x35\xdc\x2c\xf5\x22\x7e\xbe\xe8\x9e\x7d\x3b\xcf\xae\x27\x21\xb2\x5f\xde\xc3\xd3\x17\x4e\xa7\xce\x26\x7a\x55\xdd\x61\xd5\x82\x01\xe9\x6b\xda\x30\x3c\xf4\x18\xed\xf6\xe3\x2f\xb9\x2f\x5d\xc1\xa0\xb1"}, +{{0xb1,0x8e,0x1d,0x00,0x45,0x99,0x5e,0xc3,0xd0,0x10,0xc3,0x87,0xcc,0xfe,0xb9,0x84,0xd7,0x83,0xaf,0x8f,0xbb,0x0f,0x40,0xfa,0x7d,0xb1,0x26,0xd8,0x89,0xf6,0xda,0xdd,},{0x77,0xf4,0x8b,0x59,0xca,0xed,0xa7,0x77,0x51,0xed,0x13,0x8b,0x0e,0xc6,0x67,0xff,0x50,0xf8,0x76,0x8c,0x25,0xd4,0x83,0x09,0xa8,0xf3,0x86,0xa2,0xba,0xd1,0x87,0xfb,},{0x6b,0xd7,0x10,0xa3,0x68,0xc1,0x24,0x99,0x23,0xfc,0x7a,0x16,0x10,0x74,0x74,0x03,0x04,0x0f,0x0c,0xc3,0x08,0x15,0xa0,0x0f,0x9f,0xf5,0x48,0xa8,0x96,0xbb,0xda,0x0b,0x4e,0xb2,0xca,0x19,0xeb,0xcf,0x91,0x7f,0x0f,0x34,0x20,0x0a,0x9e,0xdb,0xad,0x39,0x01,0xb6,0x4a,0xb0,0x9c,0xc5,0xef,0x7b,0x9b,0xcc,0x3c,0x40,0xc0,0xff,0x75,0x09,},"\x91\x6c\x7d\x1d\x26\x8f\xc0\xe7\x7c\x1b\xef\x23\x84\x32\x57\x3c\x39\xbe\x57\x7b\xbe\xa0\x99\x89\x36\xad\xd2\xb5\x0a\x65\x31\x71\xce\x18\xa5\x42\xb0\xb7\xf9\x6c\x16\x91\xa3\xbe\x60\x31\x52\x28\x94\xa8\x63\x41\x83\xed\xa3\x87\x98\xa0\xc5\xd5\xd7\x9f\xbd\x01\xdd\x04\xa8\x64\x6d\x71\x87\x3b\x77\xb2\x21\x99\x8a\x81\x92\x2d\x81\x05\xf8\x92\x31\x63\x69\xd5\x22\x4c\x99\x83\x37\x2d\x23\x13\xc6\xb1\xf4\x55\x6e\xa2\x6b\xa4\x9d\x46\xe8\xb5\x61\xe0\xfc\x76\x63\x3a\xc9\x76\x6e\x68\xe2\x1f\xba\x7e\xdc\xa9\x3c\x4c\x74\x60\x37\x6d\x7f\x3a\xc2\x2f\xf3\x72\xc1\x8f\x61\x3f\x2a\xe2\xe8\x56\xaf\x40"}, +{{0x93,0x64,0x9c,0x63,0x91,0x0b,0x35,0x71,0x8e,0x48,0xc5,0x90,0xd2,0x61,0xc4,0x8e,0x4e,0xf8,0x33,0x66,0x13,0xf6,0xaa,0x07,0x7b,0x46,0x26,0x76,0xb3,0xba,0x88,0x29,},{0x06,0xa6,0x85,0x89,0x8b,0x85,0x52,0x12,0xeb,0xc2,0x89,0x91,0x5d,0x10,0x5a,0x43,0x20,0xd6,0x20,0xd8,0x57,0x71,0xb8,0xc6,0xb1,0x5b,0xf1,0x0a,0x1b,0xe6,0xe9,0xb8,},{0x62,0x74,0xf2,0xd4,0xf4,0x31,0xd5,0xaf,0xfe,0xfa,0x35,0xe7,0xcf,0x58,0x4a,0x59,0x90,0x17,0x19,0x3d,0xa9,0x90,0x94,0xca,0x90,0x8b,0x75,0xac,0xb6,0x08,0xd1,0xbf,0x98,0x18,0x57,0xbe,0x93,0xa7,0xda,0xfb,0x0f,0xad,0xb3,0xff,0x09,0x06,0xf4,0x8a,0x5e,0xe9,0x50,0x45,0x6f,0x78,0x2c,0x2d,0x60,0x5b,0x14,0x09,0x5b,0xa0,0xff,0x0f,},"\x2c\xd1\xa9\x51\x05\x6c\x9e\xba\xe1\x39\x9b\x6b\xd2\xd8\x2c\x0a\xe2\x77\x85\x62\x90\xd0\x69\x20\xac\x56\xca\xc8\xfb\x42\x43\x51\x01\xc7\x2a\xa9\xc0\x8d\xd2\xd1\x24\x26\x32\x55\x62\xc2\xf0\xa4\x9c\xd8\x21\xb1\x1b\x93\x9a\xaf\xa5\x93\xb4\x09\x5c\x02\x1b\xcb\x48\x27\xb1\x07\xb9\x66\x4d\x68\x28\x28\x88\xbc\x4a\x44\xaf\x3e\x3b\xdc\x86\x1b\xe6\xaf\x30\x90\x44\xc3\xda\xab\x57\xb7\x70\x23\xdc\x90\x2d\x47\xeb\xc3\x26\xf9\xbd\xd0\x2d\xbc\x02\xcd\x54\x0f\xf8\x1b\x2d\xdf\x7c\xf6\x79\xa4\x11\x93\xdf\xe5\xf8\xc8\xca\x1a\xae\xfc\x41\xef\x74\x02\x80\xd9\x82\x3e\x30\xa3\x54\x71\x7c\x84\x31\xf5\xd8"}, +{{0x1c,0x15,0xcb,0xeb,0x89,0x36,0x2d,0x69,0x47,0x6a,0x2a,0xa4,0xa5,0xf3,0xef,0x20,0x89,0xcf,0x87,0x28,0x63,0x49,0xe0,0xdf,0xe0,0xe7,0x2d,0x9e,0x3e,0x5a,0x66,0xc7,},{0x13,0xa8,0x82,0xa1,0x06,0x41,0x82,0x58,0x2c,0x21,0x18,0x47,0xe1,0x9b,0x4d,0xac,0x59,0x72,0x2c,0x9f,0xfd,0x34,0x82,0x6d,0x96,0xf3,0x31,0x13,0x40,0x0f,0xac,0x7a,},{0x59,0x98,0xb2,0x80,0x8a,0xdf,0xde,0xea,0xeb,0xe2,0xc3,0xea,0xc0,0x26,0xd3,0xf8,0x25,0xf9,0xc7,0xf2,0xaf,0x97,0xca,0x32,0x4f,0xbd,0x57,0xaa,0xc1,0xbe,0xdf,0xf7,0x8a,0x8e,0xe6,0x21,0xd0,0x37,0xee,0x3a,0xd2,0xa7,0x12,0xe9,0xa0,0x09,0xc5,0x8e,0xa3,0xe6,0xf2,0xa8,0x28,0xf7,0x4b,0x86,0xda,0x27,0x5a,0x44,0xa4,0xb1,0xe5,0x0b,},"\x09\x1c\x9b\x9b\x11\x6a\xe8\x3d\x23\xd0\x1a\x62\x95\x21\x17\x85\xd4\x46\xb6\x22\x8d\xd6\x87\xdd\xf7\x9b\xd0\xd5\xa4\xda\xa8\xc7\x9d\x2c\xbf\xc3\x73\x65\xf1\xf2\x85\xe3\x61\x73\x81\x23\xe3\x4e\x2b\xcb\xfc\x66\x4c\xe1\x25\x3a\x11\xd9\xe4\xa7\x98\x2e\x58\xcf\x94\x68\xe1\x01\x7e\xa1\x4d\x2c\xc6\xd0\x86\x5d\x40\xfd\xe8\xcb\x56\x02\x41\xe9\x6a\xc1\x61\x7c\x79\x1f\x0c\xa7\xc6\x41\x0c\xad\xf3\x28\x61\x1b\x18\xae\xf3\x33\xd8\x35\x0a\xc4\x97\xf0\xa4\xae\x2d\x03\xfd\xf0\xe2\x3e\x42\x6d\x34\xf4\x51\x47\x80\xd1\x47\x4e\x11\x35\x83\x54\x1f\x3c\x04\x36\x72\x05\x71\x72\x61\x8c\xb2\x05\x9e\xaa\xed\x56"}, +{{0x11,0x24,0x1f,0xfd,0xf3,0x4a,0xe8,0xab,0x87,0x54,0x75,0xe9,0x4c,0x6c,0xc3,0x29,0x1f,0x0b,0x88,0x20,0xdc,0x85,0xe2,0x0f,0x32,0xfc,0x53,0xb2,0x4a,0xe6,0x89,0x78,},{0x09,0xc0,0x45,0xe4,0xbd,0x51,0x37,0x31,0x4c,0x0e,0xc1,0xd0,0x31,0xfa,0xf9,0x14,0x91,0x0c,0x45,0xa4,0x67,0x6f,0x5a,0x3c,0xd8,0xf5,0x81,0xbc,0xcc,0xb0,0x3c,0x97,},{0x72,0xce,0x9f,0x91,0xbe,0x2e,0x66,0xcf,0xc9,0x0f,0x95,0x25,0x95,0x94,0x6f,0xfc,0x90,0xbf,0xce,0x53,0x08,0x7d,0x49,0xe5,0xdd,0x7c,0x08,0x7f,0x3f,0xaa,0x8f,0x18,0xf2,0x35,0x6d,0xe9,0x71,0xe4,0x42,0x9d,0x98,0x5a,0x99,0x19,0x4b,0x4f,0x92,0xce,0xd3,0xef,0x47,0xcd,0x71,0x14,0x37,0x9e,0x0b,0x32,0x67,0xa9,0xf8,0xb1,0xe7,0x06,},"\x3b\x89\xde\xcc\xb7\x02\x3e\x4b\x2b\x7a\xff\x2c\x39\x51\x87\x0a\xf4\x13\xa9\xb0\x4d\xd8\x6a\xc7\x8b\x7c\x8f\xd8\x87\x49\x2d\x8d\xde\x49\xd8\xfd\xa1\x49\xed\xd5\x47\x81\xae\x2b\x50\x80\x30\xd1\x44\x16\xa9\xa3\x8b\xed\x2b\x9a\xeb\xbb\xb2\x02\x50\xb3\xc9\x31\xac\xd4\xe3\x2f\xbe\xee\xc5\xa2\x65\x01\xbe\xab\x72\x68\xd1\x44\xfc\xe8\x95\x1a\x10\x1c\x4b\x51\x78\x16\x6f\xbb\x59\x27\xb1\xdf\xb1\xe1\xce\x90\xd1\xd1\x23\x06\x8e\x3f\x47\x2c\x88\x8f\xdb\x01\xfd\xf7\x0e\x7f\x8d\xe9\xb0\xad\xb2\x84\xb7\x11\x9f\x55\x35\x43\x16\xf8\x4e\xd0\x90\x03\x0f\x9c\x26\x62\x06\x1c\xa4\x84\x47\xcc\x0a\xef\x96\x41\x26"}, +{{0x3b,0xdb,0x16,0x24,0x65,0xea,0xce,0xff,0x98,0xd6,0x9c,0x86,0xf7,0x00,0x39,0xc5,0x17,0xd1,0x68,0xae,0xfe,0x6b,0xb1,0x01,0xb4,0xf7,0x69,0xa8,0x6b,0x17,0xc9,0x72,},{0xd7,0x6c,0xb7,0xbe,0x74,0x32,0x82,0x89,0xfd,0x1c,0x64,0xbe,0x74,0x7c,0xca,0x5b,0xb3,0x02,0x95,0xdf,0xac,0xcd,0x0f,0x2e,0x43,0xf5,0x17,0x03,0xfd,0x5d,0x36,0x83,},{0x6f,0x13,0x62,0xa4,0x02,0x06,0x37,0x91,0xf9,0x50,0x98,0x4f,0x54,0x49,0x28,0xe6,0x16,0xa4,0xef,0x79,0xbb,0xeb,0x68,0x54,0xe9,0x61,0x5a,0xab,0x9c,0xdb,0xae,0xc4,0x83,0xfb,0x9a,0x04,0xbf,0x22,0xde,0x5d,0x97,0xa1,0x5b,0xda,0x2d,0x39,0x04,0x83,0xc7,0xf6,0x1d,0xbe,0xe0,0x7b,0xb5,0x14,0x1f,0xc1,0x73,0xb1,0xaa,0x47,0x65,0x0d,},"\xfb\xf3\x68\xfe\xae\xba\x87\x91\x8b\x1b\x8c\x7b\x8a\x26\x83\x2b\xe6\xe7\xfc\x1c\xbd\xb8\x90\x25\x19\x28\x1a\x06\x54\xec\x73\xde\x0b\xb0\x71\x01\xa9\xd6\x03\xf7\x45\xd4\xec\x23\x57\xae\xe9\x87\x0c\xb1\x9a\x56\xcb\x44\xfb\xd9\xc9\x1f\xc3\x47\x52\x61\x2f\xbd\x83\xd6\xfc\x1a\x16\xbf\x8a\x85\xa2\x15\xd0\x14\x8e\x4a\xf3\x7d\x29\x84\x67\xe5\xcc\x48\x6b\x13\x13\x52\xce\x09\x21\x82\xce\x82\x84\x15\x9a\x38\x12\xb3\x0b\xac\xbf\xf5\x95\x86\x38\x11\xbf\x9a\x30\xa9\xda\x49\x45\x65\xc3\xac\x18\x14\x43\x00\x18\xea\x0e\xee\xd3\x9c\xdb\xca\x27\xf9\x31\x40\xe4\x69\x49\xdb\x57\x0b\xfa\x2e\xd4\xf4\x07\x3f\x88\x33"}, +{{0xd5,0xef,0xe5,0x1d,0x5c,0xd8,0xe1,0x08,0xbd,0x92,0x2f,0xc0,0xea,0x12,0x61,0x90,0xa9,0x46,0x28,0xff,0xa5,0x3c,0x43,0x3a,0x51,0x80,0x22,0x79,0x2d,0xdc,0x78,0xef,},{0x42,0x6b,0x01,0xcc,0x61,0xff,0x5e,0x0e,0x72,0x4d,0xa1,0xd3,0xb2,0x97,0xf5,0x32,0x5c,0x18,0xc6,0x2f,0x64,0xd5,0xeb,0x48,0xd4,0xa5,0x21,0x6a,0x8e,0x9a,0x40,0x73,},{0x23,0x06,0xf5,0x8f,0xcd,0x4c,0xff,0x22,0x22,0xd8,0x1b,0x05,0xa4,0x75,0x53,0x2b,0x8b,0x19,0xdc,0x67,0xe6,0xd7,0x8d,0xdb,0x42,0x05,0xa3,0xb7,0x62,0x1c,0xc5,0xae,0xf0,0xb3,0x93,0xd5,0xd2,0x4d,0xd9,0x6c,0x88,0xcc,0xbc,0x53,0xa3,0x20,0x8d,0xa3,0x23,0xbe,0x45,0x87,0xd5,0xec,0x06,0x7c,0x82,0x0f,0x07,0x23,0xaa,0x44,0xe9,0x0e,},"\x9d\x17\xbc\xfe\x2d\xfc\x74\x2f\x41\x1c\xb5\x3a\x94\xf3\x59\xc0\x01\xab\xf0\x96\xc7\x41\xf3\x4a\xf4\x86\x79\xf2\x81\xe7\xce\x6b\xbd\x9e\x87\x70\x9f\xc0\x72\x8a\x56\x3d\xb2\xb9\xcf\x8e\xa4\xfb\xdc\xc3\x44\xc1\x84\x8e\x65\x3c\xe9\x70\xc6\xce\x29\xde\x2c\xcd\x52\x03\x00\x64\x9a\xdc\xdd\xfc\x75\x39\x71\xf8\x46\xaa\xc1\xba\x42\xae\x45\x28\x95\x2d\x94\x98\x0a\xa7\xc6\xcf\xa2\x14\x29\x07\x64\x7f\x89\x4a\xe9\x74\xa7\x4d\x59\x03\x5a\x73\xef\x56\xa1\x0b\x66\x12\x62\x48\x09\x52\x01\x90\xac\xe6\x61\xc3\xa4\x70\x95\xe0\x32\x2e\xfd\x78\x1d\x50\xd1\x16\x35\x98\xf2\xda\x32\xf3\x1b\xc9\xc4\xf9\x13\xd1\xb1\x48\x61"}, +{{0x18,0xaf,0x89,0x02,0x5e,0xbf,0xa7,0x6b,0xd5,0x57,0xcf,0xb2,0xdf,0xf1,0x48,0x24,0x52,0x14,0x64,0x1f,0xd5,0xbd,0xa1,0x59,0xf7,0x3d,0xa0,0x4b,0x08,0xe8,0x7c,0x88,},{0x0c,0x58,0x44,0x59,0xb9,0xeb,0xcc,0xca,0xd5,0x87,0xb2,0x72,0x16,0x0b,0xc6,0x0b,0x27,0xf4,0xf7,0x72,0xb4,0x32,0x1d,0xe7,0x72,0x3a,0xfe,0xf5,0x77,0xed,0xc7,0xb4,},{0x26,0xbb,0x08,0x82,0x29,0x7c,0x2c,0x08,0xa7,0x52,0xd3,0x98,0x11,0x45,0xdc,0xde,0x55,0x89,0x3a,0x11,0xdf,0x77,0xf8,0xaa,0x4c,0x19,0xd0,0xb9,0xed,0x6e,0x52,0x20,0xed,0x12,0xe9,0xfa,0xc3,0xaf,0x13,0xd0,0xf0,0xc7,0x15,0x68,0xf4,0xa5,0x47,0xd3,0x01,0x14,0xa6,0x59,0x9a,0x23,0x68,0x06,0xc4,0xbe,0xee,0x67,0x65,0x28,0x44,0x08,},"\xe8\x2f\x46\x65\x2a\xb9\x14\xaf\x53\x5d\x8f\xb7\x20\xb5\x57\xac\x95\x01\x8d\x9f\x2a\x3f\xcc\xe8\x57\x71\xbb\x40\xab\x14\xcb\x9a\x98\x6e\x09\x6f\x3a\xfe\x5b\xee\x82\x9d\xfd\x8b\x97\x33\x5c\x53\x6a\xc9\x71\xa2\x16\x55\xaf\x16\xa2\xf8\xfd\xba\x18\x3a\x4e\x18\x56\x4c\x21\x49\x29\x56\x53\x7a\x41\x9a\xbb\xbb\xb0\x2a\x4b\xbd\xc0\x14\x81\xf5\xc6\xe6\x58\xec\xf3\xc3\x4f\x01\x1a\xd8\x46\xf5\xed\xcd\x49\x39\x19\x5d\xf8\x5e\x41\x30\x3f\xb9\xa8\x8f\xdf\xbd\x70\x43\x96\xf7\x55\x9a\x32\x73\x18\xb9\x52\xb3\xe6\x0c\xe8\xdd\xde\x56\x37\x85\x79\x23\x2f\xaf\x95\x0c\x78\xe7\xf0\xb1\x7c\x3b\x8d\xec\xe3\x6b\x78\x8a\x84\x73"}, +{{0x0c,0x93,0xd9,0x98,0x15,0xff,0xf8,0xfe,0x22,0xb9,0xe4,0x5a,0xa0,0x2b,0x3e,0x64,0x45,0xce,0x1d,0x6b,0xf5,0xa6,0x5d,0xce,0x3d,0xa1,0x07,0xaa,0x10,0x55,0x94,0x0e,},{0x4d,0x27,0xa4,0x7b,0x0f,0xc8,0x08,0x00,0xd8,0x4d,0x24,0x4e,0xeb,0xb1,0xde,0xb4,0x43,0x6d,0x97,0x63,0x3a,0x83,0xe6,0x71,0x25,0xad,0x52,0xea,0x01,0x68,0x50,0x57,},{0x7d,0xc4,0x46,0x7a,0xbc,0xf6,0x43,0x1a,0xdb,0x7c,0xcf,0xe8,0x68,0xea,0xc8,0xcd,0x8a,0x61,0x5a,0x0f,0xf6,0x5f,0x6a,0x9e,0x33,0x83,0x75,0xb1,0xaa,0xe3,0xc4,0x9a,0x12,0x6c,0x9e,0xba,0x79,0x42,0x6d,0x16,0x41,0xc6,0xb9,0x7c,0x3e,0x92,0xc1,0x94,0xe5,0xee,0x44,0x31,0xef,0xa2,0x43,0x9f,0xd4,0x50,0xf2,0xcd,0x01,0x8c,0x87,0x00,},"\x11\xe8\x77\xde\x58\xc1\x34\xea\xf4\xc9\xf1\xb5\x3c\x3d\xc4\x51\xd3\xc0\x55\xf1\x6b\x09\x62\x27\x25\xb2\x79\x76\x85\x12\xfe\x10\xa7\xad\xb0\x76\x5b\x68\x9e\xc2\x1d\x5b\x6e\xfa\xa1\x9f\x1b\x9d\x36\x25\x4d\xf0\xa9\x36\x7f\x44\x1b\x26\xbd\xb9\x0b\x28\xcb\xc4\x03\xe5\x07\x40\x82\xfa\x1f\xed\x58\xe1\x40\xda\xc9\x7a\xea\xf4\x83\xe2\xc1\x3f\x3c\xc5\x60\xab\xff\xab\xa0\x5b\x76\x3f\xee\xdb\x51\xe6\x06\x98\x15\x1c\xf5\x6e\xfd\xf1\xd3\x7d\x6c\xe0\x56\x44\x86\x21\x0f\x05\x2e\x93\x7f\x2e\xa2\x6f\x63\xef\xa5\xd2\x47\xff\x18\x83\x29\xbb\x1a\xa8\x3c\xe3\xf4\xf3\x5a\x3d\x7d\xec\x14\x59\x9e\x5f\xeb\x7b\x6d\x5f\xe4\x29\x6a"}, +{{0x98,0x9e,0x99,0x94,0x56,0x35,0x19,0x2c,0x02,0x3c,0xc5,0x18,0x6f,0xc2,0x5b,0xba,0xef,0x47,0x24,0x07,0x75,0xd1,0x5a,0x56,0x19,0x5d,0x88,0xcd,0x07,0xc3,0x74,0x8e,},{0xca,0x0b,0xea,0xfd,0xf7,0x31,0xd8,0x93,0x01,0xf7,0x72,0x3c,0x5b,0xb7,0xe5,0xa1,0xc3,0xff,0x3e,0xab,0x27,0xc9,0x7d,0x71,0x1b,0xcd,0x76,0xe4,0x20,0x54,0xbe,0xe4,},{0xae,0xf7,0x56,0xbf,0xb8,0xa7,0x26,0x6e,0x17,0xd1,0x5f,0x3f,0x11,0xee,0x50,0xed,0x25,0xbe,0x42,0x0e,0x95,0xa0,0x74,0x22,0x71,0xeb,0xd1,0x22,0x94,0xe2,0xcb,0x96,0xea,0xd0,0x83,0xb8,0xff,0x0b,0x82,0x9d,0x2e,0xde,0xb1,0x4d,0xa8,0x6e,0x40,0x2e,0xf2,0x5e,0x6d,0x4a,0x5a,0x79,0x58,0xc1,0x84,0xed,0x10,0xc1,0x76,0xcb,0x57,0x0b,},"\xc4\x84\x14\xf5\xc7\x57\xd0\x3c\x52\x3e\xf3\xf3\xb8\x51\x07\x71\xb0\xff\x3b\x4b\x97\xde\x27\x96\x25\xd3\x49\xec\x18\x5a\x29\x92\x7a\x66\xb9\x59\x3b\xa1\x93\x38\xc2\xf5\xe4\x13\x1f\x1a\xc0\x7e\xa4\x6d\x2c\x1b\x6e\x4a\xb5\x22\x92\x80\xb2\xe2\xbb\x9d\x14\x0d\x1e\xf7\xaf\x7b\x16\x92\xbf\x2d\x09\x7b\x80\xf8\x11\xad\xcf\xa9\x5d\x5c\xbf\x9e\xee\x92\xa1\x64\x1c\x55\x2b\x4b\xe4\xa0\xd7\x34\xf0\xaf\xd4\x70\xb9\xd7\xf4\xe4\x57\x78\x95\x1e\x21\xfc\x53\x4f\x20\x0a\x12\x8b\x96\xad\xb8\x37\x3f\x10\xce\xce\xc2\xda\xc2\x99\x6a\x06\x2f\xb3\xc2\x94\x31\x59\x65\xa9\xd5\xd7\xb0\x77\xc4\xb0\x13\xc6\x4a\x38\x42\x97\x69\xd2\x3e\xab"}, +{{0x6b,0xdb,0xbe,0x06,0xd9,0xf4,0x21,0x9e,0xea,0x64,0x03,0xa3,0x57,0xb2,0x5e,0x56,0x19,0x92,0xfa,0xe0,0xf0,0xf6,0x14,0x56,0x1d,0xd8,0x6d,0x23,0xde,0x41,0x5a,0x43,},{0xed,0x52,0xdd,0x1c,0xce,0x32,0xd9,0xb4,0x85,0xe0,0x94,0x07,0x46,0x42,0x1d,0x36,0xb9,0xfd,0xe6,0xcd,0xf0,0x21,0x15,0x45,0xb6,0x34,0x04,0x4d,0x4b,0x3c,0xb8,0xf1,},{0x95,0x02,0x06,0x60,0x5b,0x0f,0x41,0x7c,0x90,0x84,0x3e,0x2c,0x8d,0x8e,0x66,0xc8,0x28,0xbb,0x10,0xb9,0x9b,0x36,0xee,0xee,0xe8,0xca,0xf2,0xe0,0xe5,0x48,0x4d,0x93,0xfe,0x02,0xbf,0x53,0x34,0x05,0xf4,0xbb,0x74,0xa5,0x0e,0x55,0x85,0xfa,0x0d,0xae,0xf4,0x82,0x1f,0x03,0x01,0xd0,0x1b,0x46,0x32,0x1b,0xaa,0x31,0xe1,0xf0,0x8d,0x03,},"\x58\x2a\xda\x13\xd6\x92\x93\xe4\x9b\xbd\x46\x10\x32\xdf\xea\x1c\xa2\x02\x5b\x52\xe0\x13\xa3\x3a\x03\x87\xfc\xfc\x5f\x7c\x0b\x8e\xc9\x55\x98\x26\x07\xfc\x90\x1e\x1b\x7f\x63\x6a\x9d\x37\x1e\x1f\x91\xfe\x47\x6b\xdd\x44\x85\x6e\x27\x5d\x67\xef\xa1\x42\x38\x16\x43\x54\xc2\x31\x12\x4c\x84\xde\x8f\x5b\x89\xd5\xa5\x8e\xa6\x74\x4b\x4d\x3b\x3d\x79\x06\x90\x52\x33\xcc\xe6\x94\xa6\x4d\x69\x6f\x5a\x70\x24\xfc\x90\x33\xb1\xce\x39\x08\x99\xa3\xb4\x41\xa4\x8e\x53\xc7\xc9\xb3\x0b\xa1\x2e\x7d\x61\xf3\x5f\x15\xe6\x58\xc7\xcc\x44\x07\xe2\xf6\x89\xea\x8a\x55\xd0\x1b\xf5\xdb\xac\xb1\x19\x54\x75\x4f\x92\x0f\x09\xdb\xd4\x84\x09\xbb\xb5"}, +{{0xd7,0x61,0xc8,0xc5,0xa9,0x60,0x1b,0x91,0x45,0xb7,0xd0,0x51,0x24,0x9b,0x00,0x41,0x07,0xe4,0x52,0xe5,0x63,0x10,0x0c,0x6c,0x78,0x80,0x38,0xc9,0xee,0x8a,0xda,0xd7,},{0xe6,0x48,0x87,0x75,0xd6,0x40,0x7e,0xfc,0x7b,0x2b,0xca,0x89,0x0a,0x7f,0xc6,0x22,0x66,0xfc,0x54,0xcd,0xac,0x89,0x33,0x43,0xb4,0xf5,0x9a,0x19,0x6d,0x94,0x88,0x98,},{0x7a,0xb7,0x8b,0x64,0xe6,0xdb,0x35,0x9a,0x2d,0xc8,0x30,0x2e,0x10,0x92,0xed,0x66,0xfa,0x73,0x6b,0x53,0x62,0x53,0xa1,0xcd,0x90,0xfd,0xb8,0xc1,0x0e,0xfd,0x78,0x30,0x02,0x25,0xe1,0x91,0x96,0x35,0x99,0xba,0x54,0x9c,0xc8,0x59,0x20,0x9d,0xf0,0xff,0x61,0xcd,0x06,0x9b,0x03,0xd2,0x54,0xe6,0xe7,0xd7,0x6c,0x79,0x84,0x40,0xf9,0x07,},"\x84\xea\xd5\xea\xbd\x2f\xd4\xb7\xc7\x9a\x9a\x92\x8a\xb8\xee\x0a\x16\xa5\xfd\x66\x7a\x05\x7f\x8a\x25\x46\x63\xd5\x6d\xaa\xe1\x56\xd1\xa4\x9a\xff\xb2\x99\x61\x37\xb9\xd8\xb3\x40\xe6\x35\x73\x2f\x9d\x2b\x4c\x60\x21\x84\x42\x54\x1e\x72\xd2\xb0\x0e\x1e\xe7\xa7\x3c\x3f\x67\xca\xa4\x99\xfa\x9d\x07\x0b\x57\xd0\x76\xdc\xde\x96\xb0\x76\x47\x23\xc3\xc6\x59\xc7\xa0\x0c\x1b\x78\xb1\x5c\xcc\x22\x23\x89\x0b\x51\x06\x7f\xc8\x1e\x23\xe9\x45\x8a\xb0\x68\x3b\xa6\x26\xa5\x3d\x0c\x37\x93\xa5\x8a\x98\x57\xbb\x44\xb3\xbd\x85\xbb\x6c\xe5\x3a\x85\x69\x4e\x7f\x53\xcc\x1b\xd4\x6d\x50\xed\xa3\x7d\x81\xf5\x38\x1b\x51\x3d\x1f\x38\x33\x9d\x29\x1b"}, +{{0xc5,0xe0,0xc7,0xa7,0xbb,0x8b,0x7c,0xa0,0x7b,0xf0,0xa0,0x5e,0xa6,0x7e,0xff,0x6d,0xee,0xbf,0xe3,0x71,0x4e,0xe3,0xe1,0xa2,0x27,0xf4,0xdc,0x8e,0x24,0x2a,0x2f,0xa0,},{0x51,0x35,0xef,0xcd,0x90,0x52,0xbe,0xc5,0x7a,0x44,0x31,0xca,0xab,0xe8,0x26,0x80,0xee,0xc0,0xa3,0x3a,0xfd,0x59,0xb3,0x02,0x03,0xb2,0x80,0xba,0x12,0xbe,0x48,0x5c,},{0x2e,0x7f,0xde,0xb3,0x48,0x4d,0x0a,0x5e,0x8d,0xce,0x94,0x44,0x89,0x79,0x49,0x6b,0x06,0x42,0xca,0xbc,0x37,0x33,0xa5,0x1f,0x8c,0x3c,0x5c,0x51,0xc1,0x9a,0xe3,0x19,0x01,0x8d,0xa9,0x10,0x91,0xc2,0x38,0x5f,0x2f,0x4e,0x9a,0x59,0xed,0xbc,0xa2,0xab,0xd0,0xd0,0x85,0xee,0x40,0xd3,0xf0,0xd4,0x20,0x61,0xa5,0xa9,0x83,0x2a,0x37,0x0c,},"\x37\x70\xa6\x78\x66\x52\xc4\xb7\x8a\x04\x3e\xdc\xe0\x7f\x3e\x20\x4d\x81\x99\x7c\x42\xaf\xc2\x23\x31\xf7\x5a\x54\x94\xa8\x26\xd7\xcb\x69\xab\x43\x14\xa4\x73\x72\x10\x58\xa1\x83\x99\x81\xd5\xb7\x02\x2d\x0c\xd8\x67\x03\x77\xda\xf3\x32\x04\x76\xd2\x5b\x9f\x55\x95\x61\xd6\x6e\xe0\xa7\x09\xfe\x17\x36\x1e\x2a\x52\x89\x8f\x57\x53\xc4\xfb\x43\xbd\x0c\x98\xb3\x68\xf5\x12\xad\xc0\x9c\xd9\x27\xc6\x62\x26\x76\x92\x6d\x8c\x2d\x91\xa1\x4a\xca\x32\xf2\x26\xf7\x00\x36\xc1\xc8\x58\xbc\xff\xc2\xb5\x9f\x54\xc1\xc3\x7b\xf8\x1e\xb5\x2e\xcb\x3f\x00\xda\x60\x2c\x94\x36\x1b\x52\xa5\xaf\xdd\xbf\xd7\xe0\x50\x36\xe3\x77\x50\x30\x50\x33\x3b\xe5\x12"}, +{{0x11,0xbb,0x47,0x48,0xd2,0x54,0x7e,0x61,0x96,0xbe,0x82,0x3c,0x9b,0xe7,0xaa,0x18,0x15,0x0c,0x20,0x4b,0x12,0xca,0x8d,0x73,0xc1,0xbd,0x46,0xb1,0x1a,0x54,0xb4,0x75,},{0xef,0xeb,0x42,0xda,0x28,0xd7,0x64,0x96,0x64,0x03,0xdd,0x30,0x0d,0x9f,0x94,0x51,0xb2,0x58,0xab,0x1c,0x80,0xdf,0x06,0xfe,0x59,0x43,0x15,0x3f,0x53,0x01,0xcc,0xcb,},{0x44,0xc5,0x8d,0xa4,0x9d,0x23,0x65,0xd2,0x70,0x29,0xd1,0xee,0xbb,0x3b,0xeb,0xf7,0xc0,0x32,0xd8,0x58,0xaa,0x07,0xe0,0x75,0x6b,0x1c,0x26,0xa5,0x41,0x2d,0x22,0x69,0x11,0x76,0x03,0x13,0x41,0xad,0x37,0xd7,0xbb,0x78,0x43,0x28,0x9e,0xb3,0x9d,0xb4,0x91,0x58,0x4c,0x1b,0x2a,0x1d,0xa2,0xe4,0xa2,0x64,0x9c,0x22,0x93,0x82,0x66,0x06,},"\xf4\xb7\x65\xb2\x58\xba\x35\xb4\x27\x52\x5c\x7f\x10\xa4\x6f\x0b\xcc\xd3\x57\xec\x1a\xd5\x2a\x5b\x13\x94\x17\xa9\xd3\x89\x4c\x51\x2d\x89\xeb\x88\xe6\x81\xb1\xf3\x0a\xac\x4c\x11\x5c\xcf\x36\x54\x5e\x83\xf3\x78\x34\xc8\x2e\x83\x00\xcc\x1e\xb2\x89\xaf\x43\x75\x96\x8c\x29\xc0\xff\xef\xb4\x0e\x15\x6c\x20\xc0\x43\x26\x69\xac\x8d\xc0\xa8\x3c\x13\xb1\xe8\x55\xa8\x4a\xd0\x13\x3c\x40\xc8\x2c\x87\xee\x1e\x7d\xd4\x08\x4d\x74\x1c\x80\xde\x8a\x7a\x9f\x77\x59\xe8\x43\xa5\x62\x09\x9c\x4d\x7d\xf8\x75\x35\x20\x39\xff\x4d\x38\x24\x65\x13\x86\xc9\x77\x59\xff\x7d\xba\x52\x06\x4e\x6d\x31\x12\xe0\x80\x81\x9a\xee\x8c\xe7\x23\xa1\xa2\xaa\x46\x4d\x8a"}, +{{0x74,0x52,0xa0,0x01,0x56,0xd7,0x94,0xed,0xeb,0xff,0x4a,0xdb,0x1f,0x7a,0x7e,0xec,0x26,0x21,0x7f,0xef,0x67,0xc3,0xd2,0x68,0x35,0x2b,0x2b,0x54,0x60,0xa7,0xdc,0x25,},{0x5f,0x4d,0xc3,0x38,0xcf,0xbd,0x38,0x4b,0x5f,0x1c,0x14,0xc2,0x26,0x70,0x14,0x46,0xb5,0x2b,0x1e,0x3e,0x2a,0x3c,0xba,0x1a,0x40,0xee,0x28,0x25,0x08,0x0d,0x1d,0xe6,},{0xa8,0xf9,0xfa,0x24,0xa3,0xde,0xa1,0x02,0x2e,0x73,0xf0,0xd8,0x8b,0x1c,0x37,0xd0,0x6d,0x0f,0x0b,0x20,0xbb,0xff,0x0e,0xcd,0xb4,0xa4,0x0c,0x86,0xd7,0xe4,0x75,0x61,0x7c,0x03,0x57,0x0a,0x74,0x19,0xd7,0x4b,0xa0,0xf1,0x32,0x70,0x96,0xbf,0x19,0xf0,0xd0,0xcf,0x9f,0x51,0xd4,0x83,0x11,0x2f,0x26,0x92,0x23,0x78,0x68,0x2f,0x48,0x07,},"\x8c\x4e\xe2\x86\x76\x56\xe3\x3f\x52\x69\x41\x4d\x77\xb4\x2d\x8e\x47\x50\xdb\xa9\x3c\x41\x8b\xac\xca\x10\x93\x8c\xc3\xb5\x70\xc6\x60\x3d\x52\xc2\x34\x44\x88\x60\x7b\x2f\x93\x4f\x6d\x26\x9f\xcb\x2a\xd9\x66\x21\x9b\x1a\xb1\x14\x72\xf4\x2c\x67\x2c\xe2\x05\x92\x49\x0e\xc5\xba\xf6\xa2\xd2\xfc\x8a\x3e\xe3\x53\x74\xb1\x90\x2f\xde\xfc\x78\x70\xb1\xb6\x26\xfa\x46\xb1\x2b\x6c\xee\x24\x1f\x60\x1a\x9b\x3f\xe4\xc5\x08\x12\xe5\x73\xe6\x75\x2c\xe2\xc7\x64\x4e\x33\x67\xa6\xa6\xb7\x77\x58\xd8\xe4\x93\x4b\x58\xaf\x23\xab\xae\x8f\xec\xac\x25\xed\xd7\x34\x03\x0e\xe7\xcf\x39\x90\x7e\x3e\xed\x81\x86\xa1\x9a\x80\x71\x03\xa9\xfc\x49\xd3\x8f\x4c\x84\x60"}, +{{0x88,0x0e,0xf1,0x06,0x73,0x3f,0x04,0xe7,0x61,0x95,0xeb,0xa2,0x80,0xb3,0xfa,0xdd,0xa0,0xf2,0x5d,0xcf,0x96,0xa6,0xa9,0x9c,0x8c,0xcf,0x84,0x2c,0x68,0xaf,0xda,0xe5,},{0x70,0xce,0xe3,0x3d,0x41,0xc7,0x28,0xce,0x7b,0x14,0x19,0x31,0xe6,0xe8,0x52,0x45,0x67,0xd7,0x60,0x1e,0xb7,0x9f,0x67,0xfd,0xcd,0x07,0xb9,0xd6,0x82,0xc6,0x50,0xf0,},{0xff,0x6c,0xae,0xdd,0x8a,0x46,0x8a,0xa0,0x7d,0x4c,0x6e,0x71,0x31,0xbb,0xda,0x76,0x18,0x2b,0xa9,0x58,0x64,0x93,0x76,0xe7,0x11,0xf4,0x4c,0x7b,0xba,0xcb,0xa6,0x07,0x7b,0xea,0x87,0x8b,0xa5,0x94,0x9c,0xde,0xee,0xf0,0x5c,0xfd,0x49,0x83,0xb0,0x05,0x7d,0x27,0x5e,0xa3,0xe1,0x8c,0x32,0x65,0x94,0x68,0xc3,0x0c,0x47,0xac,0x8f,0x0b,},"\xf4\xf3\x8d\x07\x7f\x2b\x03\xda\x82\x1b\xd3\x6f\xde\x67\x3d\x66\x6e\x52\xf4\x83\x2e\x1c\x0d\xcf\xee\xf0\x49\x32\x8a\xcb\x7b\xd7\x1a\xd2\xbf\xc4\x9c\x12\x35\x16\xe1\x96\xc4\x70\xdf\x08\x47\xb3\x84\x8a\x45\xa2\xc6\x9b\xea\x03\xe2\xaf\xa7\xe5\x82\x05\xb6\x3b\x52\x38\x14\xfc\x8e\x24\x2f\x05\x9c\x69\xff\x7e\x40\xf9\x7b\xe8\x12\x5b\x70\xa5\x4f\xda\xf3\x5a\xea\xfa\xc7\x91\x14\xa7\xb4\x19\xe6\xbb\x9e\x70\xbf\x07\xad\xb5\x59\x81\x96\x00\xdc\x25\xe5\x1b\x4b\x70\x0d\x27\xca\x54\x72\xa0\xe7\xcb\xbf\xd1\x4e\x09\x9f\xaa\x3a\x72\x00\x2d\xa5\x38\xcb\xe4\x5d\x62\x1e\xf0\xd5\x25\x2b\xa2\x9d\x83\xf8\xb3\xec\x83\x89\xc9\xce\xb6\xc6\xb2\xe8\xd8\xa2\x0f"}, +{{0xa2,0xd8,0x8f,0x37,0xec,0xc2,0xb2,0xc0,0x5d,0xd6,0xcb,0x31,0x59,0x96,0x2c,0x5f,0x64,0x6a,0x98,0x15,0xb2,0xfb,0x37,0x79,0x1f,0xc7,0xb6,0x06,0xe2,0x91,0x3e,0xd5,},{0x58,0xdd,0x67,0xd7,0xa1,0x5d,0x4c,0xa0,0x34,0x1a,0x4c,0x86,0x95,0x66,0xca,0xd8,0xc4,0xee,0x16,0xe5,0x83,0xa1,0x0b,0x48,0x24,0x17,0x3b,0x08,0x29,0x0d,0x92,0xd1,},{0xcc,0xf2,0x40,0x0c,0xd6,0x73,0xe1,0xef,0xfd,0x20,0x16,0x1d,0x7b,0x68,0xa5,0xfb,0x87,0xc1,0xe9,0x9d,0x36,0x35,0xd7,0x8c,0x2d,0xa1,0xb5,0x09,0xfa,0xc3,0x33,0x46,0xc0,0x69,0x16,0x3a,0x6c,0x46,0xc7,0x82,0x6a,0x48,0xbb,0xbd,0x03,0xb0,0x5e,0x6e,0x23,0x51,0xfa,0x62,0xbf,0x89,0xbf,0x7c,0xcf,0x9a,0x90,0x24,0xbd,0x15,0x7d,0x07,},"\xd1\xb8\x7e\x9e\x88\x6d\xfb\xbd\xc8\xca\x8a\xb9\x01\x0e\xcf\x9b\xba\xf2\x3f\x72\xab\x3c\xbe\x76\x9d\xb1\xd4\x3c\x2a\x47\x4a\x81\x65\x1c\x46\x4e\x9f\xb9\x27\x34\x63\x46\x41\xc9\x48\x5a\x02\x39\xb3\x11\x07\x71\xe7\xf7\x5e\x05\x25\x2e\x4d\x8f\x4c\x0a\xa1\xba\x08\x62\x6d\x7e\x96\x31\x7c\x20\xac\xde\x2a\xd9\x9b\x23\xbd\xad\xfd\x6f\x17\x46\x8e\xb4\x02\xec\x5e\xef\xa5\x7b\x47\xca\xf9\x72\xb3\xdd\x21\xd8\x9f\x0e\x29\x89\xff\x87\xd5\x1e\xd2\xe2\xd6\x39\xc1\x64\x4e\x69\x8c\xbe\x02\x21\xb8\xe1\x79\xf3\xcf\xb0\x4a\x20\xcb\x24\x70\x21\x6a\x68\x82\xfb\x4f\xf7\x99\xe1\x15\x36\xcf\x64\x21\x9f\x0c\x07\x51\x76\xbc\x7c\xf0\xf6\xc5\xb7\x92\x5f\xcd\x61\x55"}, +{{0x42,0xaa,0xfd,0x0a,0xe2,0x6d,0xf1,0xe7,0xaa,0x02,0x76,0x86,0x0d,0x75,0x27,0x83,0xaf,0x97,0x28,0x04,0x39,0xbb,0x23,0xea,0xe4,0x6e,0x3f,0x84,0xca,0xac,0x78,0xde,},{0xda,0xa2,0x35,0x0a,0xdb,0x55,0xdb,0xa9,0xdf,0x7d,0x7a,0xf5,0x10,0x19,0x98,0xfe,0x51,0x5d,0x31,0x1c,0x3c,0xba,0x3e,0xea,0xb9,0x13,0x82,0x33,0x19,0x0c,0x3b,0x4e,},{0x11,0x61,0x43,0x65,0x0b,0x6c,0x13,0x3d,0x61,0x78,0x59,0xdb,0x24,0x29,0xc2,0x91,0x35,0x79,0x79,0x0b,0x21,0x97,0xd7,0xb7,0xb1,0xb4,0x96,0x2b,0x32,0x87,0x21,0x03,0x2c,0xee,0xca,0x58,0xb2,0xd5,0x64,0x39,0xe2,0x33,0xbb,0x84,0xdc,0x52,0x5e,0x28,0x4f,0xf8,0xdf,0x2b,0xde,0x1d,0xb4,0x98,0x6f,0xaf,0xd2,0x1b,0x3d,0x7d,0x6a,0x0a,},"\x72\x13\x1b\x80\xad\x59\x9b\x6f\x5f\xf6\x98\x54\x7d\x16\xe7\x49\x9d\x71\x27\x5e\x4e\x9b\x30\x52\x6a\x5a\xac\x0b\x0c\x8b\x14\xfa\x4a\x54\x0c\xfb\x11\x45\xfc\x00\x44\x18\xbc\xd3\x18\xc1\xa7\x0e\x62\x69\xa3\xfb\x69\xba\xed\x86\xf3\x63\xf5\xb8\xf9\x7f\x56\x9c\x20\xd4\xf4\x99\x0e\x7b\xb4\xd0\xc3\x99\x21\x26\x8d\x63\x6e\xd0\x55\x4b\xd6\x2a\xcf\xca\xcd\x3b\x8e\x03\x02\x17\xaa\xfa\xc3\x04\x4c\x03\x7e\x0f\x94\xda\x18\xc6\xb9\xa0\x93\x2c\x3c\x58\x75\xd3\xa9\x3f\xbd\xad\xcf\x67\x96\x4e\xec\x9e\xc2\xbe\x69\xb4\x8f\x02\x0f\x6c\x98\x74\xde\x5f\x8a\x51\x67\xb5\xee\x02\x4a\x2c\x2e\xfd\x0c\xdc\xd2\xac\xd8\xc1\xf7\x87\x81\x41\x41\xe3\x0b\x38\xb1\x63\x17\x5b"}, +{{0xb6,0x9c,0x33,0xb1,0x1b,0xa6,0x78,0x41,0xc3,0xd4,0xe6,0xf9,0x23,0x4e,0x35,0x37,0x0a,0x28,0xb4,0x76,0x62,0xac,0x56,0x0b,0x27,0xc0,0x78,0xb6,0x6a,0xb1,0xb0,0x21,},{0x9d,0xf6,0x8e,0x9a,0xcf,0x67,0x37,0x92,0x61,0x74,0x4d,0xb5,0xd1,0xe3,0x77,0x89,0x2f,0x2b,0x69,0x2e,0xd5,0xa3,0x8b,0x37,0x07,0x3c,0x04,0xde,0x5d,0x22,0x67,0x37,},{0x24,0x36,0x8f,0xee,0x5b,0xd8,0x48,0xb4,0xc6,0x61,0xa3,0xbe,0x4f,0x31,0x0c,0xfc,0x43,0x6e,0x79,0xec,0x4a,0x78,0x50,0x1b,0x81,0x09,0x5f,0xe5,0x16,0x14,0x23,0x1b,0x6c,0xa1,0xab,0x12,0x69,0x99,0x6a,0xd2,0xe9,0x8e,0x29,0x97,0x81,0xaf,0x8e,0x29,0x80,0x4b,0x24,0xfe,0x56,0x79,0xca,0x3b,0xa6,0x50,0xc5,0xc4,0xcc,0x58,0xce,0x01,},"\xf9\xea\x12\x6d\x3a\xb2\x19\x61\xaa\x24\x33\x90\x0a\x39\x82\xb8\x3e\x0e\xf8\x6d\x52\xd1\x34\x40\xaf\xa4\x81\x7f\x9b\x82\x2f\xb5\x82\xcc\x39\x32\xbf\x45\x0d\x46\x77\xc9\x18\x81\x81\xfe\x75\x26\xad\x6f\xe5\xab\xc6\x1d\x0a\xe7\x59\xf2\x15\x01\x3c\x0b\x2b\x41\x06\x4c\xb6\x27\x8b\xa7\xe3\x9e\x2f\x4c\x10\xd6\xcc\x96\x05\xb3\x86\x9e\x16\x9d\x7d\xa4\x2e\x88\xeb\x85\x78\x70\xfe\x61\x18\xbb\x02\xbc\x08\xc8\x05\x5f\x0c\x18\x9b\x62\xf7\x9f\xb1\x46\xb4\xc5\x43\xaa\x30\xcc\x0c\xd5\x7f\x03\x7e\x9e\xf7\xa6\x37\x11\xf6\x6e\x6f\x28\x78\x93\x17\x02\x20\x27\x02\x61\x42\x77\xd5\x13\xf0\x85\x0b\x75\x85\x49\x33\x6b\x30\xcf\x40\xab\x8b\xd4\x60\xe6\x0e\x12\xde\xed\x04"}, +{{0x7b,0x63,0x61,0x3f,0x6d,0xae,0x01,0xcd,0xcd,0x5e,0x6b,0x37,0x68,0x69,0x71,0xcd,0x8d,0x8a,0x99,0x54,0x2f,0x63,0x29,0xa1,0x28,0x54,0xa9,0xd8,0xff,0x81,0x05,0xac,},{0x72,0xec,0x43,0xfa,0xf3,0x4d,0x87,0x30,0x17,0x7d,0x1f,0x07,0x43,0xc7,0x4c,0x20,0xbf,0x72,0xc2,0x39,0x4b,0x8a,0x7d,0x47,0x1f,0xfe,0x2a,0x04,0xab,0x00,0x81,0x1c,},{0x76,0xf5,0x0b,0x2b,0x9c,0x2a,0xd9,0x7b,0xfb,0x94,0x99,0xee,0x41,0x92,0x8a,0xc0,0x72,0xda,0x5e,0x8b,0xc7,0x1d,0x02,0x12,0x55,0x09,0x42,0x33,0x2b,0x62,0xe7,0x0c,0x8b,0xfe,0x1c,0x72,0x25,0x42,0x39,0x46,0x88,0xde,0xcd,0x91,0x7a,0xec,0x8f,0x95,0x35,0x3e,0x1d,0x72,0x62,0x4b,0x70,0xeb,0xed,0x5d,0x17,0xf6,0xc5,0x49,0x77,0x02,},"\x18\x16\x48\x8f\x1f\xc8\x3e\x1e\xd5\x91\x16\x37\xdd\x42\xba\x20\x77\x65\x7d\xfe\x1a\xe4\x22\xad\x0a\xee\x59\xdf\x9d\xd5\x6a\x27\x63\xc2\xdd\x0e\xf6\x1a\x12\xbb\x82\x5b\x0d\xac\x1e\xda\x5f\xbb\x69\x1c\x5e\xd5\x8f\x3f\xb3\x25\x05\x0b\x45\x63\xa4\x04\x20\x99\x98\x2f\xff\xa5\xd6\xed\x74\x2d\x95\x82\x3d\xa8\xe1\x78\x7c\xf7\x46\xef\x63\xb3\xfb\xb0\xe8\x8a\x6c\x0b\xea\xe4\xf7\x31\x83\x66\x93\x6b\x49\x17\xf5\x07\x33\x60\x68\xb1\x94\x68\x09\x00\xa7\xbf\x4a\x6f\xb6\x9a\x5c\x38\x7b\x97\xe3\x1b\xc7\xf9\xbe\x53\xc2\xa8\x9e\x36\x51\xce\x1d\xe4\x1b\x10\xe9\x21\xb2\x06\xeb\xf3\x2e\x56\x21\xef\x80\x81\x61\x6d\xcd\x7a\x20\x59\x43\x7e\xfa\xd0\x14\xbb\x8e\x2c\x82\x21"}, +{{0x35,0x58,0xd3,0xa7,0x43,0x95,0xbd,0xcb,0xa5,0x60,0xe2,0xc4,0x5a,0x91,0x96,0x0c,0xec,0x6c,0xb3,0xed,0xbc,0xd3,0x0e,0x72,0x2f,0x7f,0x05,0x52,0x10,0xf3,0x7b,0x51,},{0x53,0x4f,0x43,0xeb,0xa4,0x03,0xa8,0x4f,0x25,0x96,0x7c,0x15,0x2d,0x93,0xa0,0x17,0x5e,0xc8,0x29,0x3e,0x6f,0x43,0x75,0x31,0x9e,0xad,0xf9,0x57,0x40,0x1f,0xbb,0xd2,},{0xb3,0x65,0xb5,0x56,0x1a,0x13,0xa5,0x45,0x17,0xcf,0x90,0xd8,0x8b,0x35,0xeb,0x09,0x67,0xd6,0xd5,0x84,0x14,0xb8,0xc1,0x54,0x7e,0x69,0x31,0x59,0xe0,0x13,0x78,0x56,0x36,0x54,0xc5,0x0f,0xb4,0x23,0x23,0xf0,0x9d,0xd7,0x8f,0xfe,0x28,0x05,0x6d,0xdf,0xa5,0x4f,0xeb,0xf4,0x48,0x91,0xe8,0xa7,0x41,0xb6,0xa1,0x68,0x7d,0x72,0x86,0x05,},"\xbe\x75\x44\x4f\x9c\xe6\xbe\x1d\x83\xaf\x62\x2a\x8c\x47\x8d\x51\x01\x27\xdb\x56\xf1\xde\x6e\xb8\xa5\x12\x65\x22\xb0\x9f\xdc\x6c\xa0\x86\x2c\xec\x0b\x8b\x2a\xaf\xa3\x1c\x17\xa2\xcc\x47\x7d\xa5\x33\xd2\x76\xa1\xae\x4f\x8e\x07\x59\xd6\xaf\xa0\xb1\x74\x11\xb5\x17\x0b\x52\xf2\x05\x47\xc7\x2f\x3e\x88\xd4\x8c\xb4\x56\xfe\x62\x5b\x62\xfe\xb0\xf8\x13\x17\xed\xf1\xec\x09\xec\xe5\x34\xb9\xf5\x00\xd4\xe1\xb1\xbd\xa2\xdb\x21\x98\x2a\xa9\x50\x94\x22\x6e\xe9\xf5\xb0\xa6\x5d\xa8\x3f\x91\x12\x1c\x96\xb3\xb4\x01\x0a\xe7\x82\x6c\x9e\x80\x63\x6c\xba\x00\xf7\x0c\x3c\x8a\x27\x9b\x01\xb9\x52\x94\xcb\x85\x0f\x91\x70\x9f\x43\x76\x66\x2a\x58\x0b\x15\xac\x29\x81\xaf\xe9\xf8\x54"}, +{{0xa3,0x5b,0x92,0xf2,0x44,0x06,0x3a,0x19,0xbb,0x5e,0x3e,0xd4,0xd6,0x99,0xed,0x20,0x69,0x60,0x71,0x16,0xd2,0xbd,0x08,0x11,0x3f,0x0d,0x83,0x73,0x61,0x3f,0x35,0xb7,},{0x7e,0xc9,0x36,0x01,0x86,0x4e,0xe4,0x99,0x5a,0x4f,0x7a,0xbc,0xd3,0xdf,0xc1,0x01,0xe9,0xe7,0xf3,0x69,0xe6,0x3d,0xe1,0xae,0x68,0xa0,0x7a,0xa7,0xf0,0x75,0xb3,0x29,},{0xa2,0x3d,0xbe,0x37,0x57,0xe4,0x78,0xdb,0xc8,0x4d,0x3d,0xb3,0xa9,0x33,0xb0,0x42,0x8c,0xed,0xb6,0xb0,0x1b,0x86,0xd8,0xd7,0x3f,0x39,0x59,0x87,0x8d,0xae,0x6f,0x05,0x88,0xf5,0x05,0xcd,0x4d,0x39,0xf2,0xab,0x46,0x77,0xb6,0x48,0x05,0xd6,0x29,0x65,0x2a,0x22,0x52,0x98,0x25,0xc3,0xa9,0x1d,0x04,0x37,0x49,0xfc,0x71,0xf0,0x37,0x06,},"\x65\xcd\x36\xda\xe0\x16\x8d\x69\x97\x4f\x95\xf0\x9d\xd9\xa5\x9d\xb7\x99\xf9\x11\xe1\xa1\x5b\x85\xa0\x08\x93\xb8\xc9\xa3\xd4\x8a\x2f\x58\xac\x12\x6b\xfa\xa0\xa6\x06\xc0\x5d\x94\x70\x1d\x27\x3a\xbf\x7d\x68\x81\x7f\x2c\x71\xb1\xc5\x41\x79\x5c\x4f\x60\x95\xe2\x6c\x9d\xff\x80\x3f\x03\x2f\x75\x66\x3f\xd1\x69\x8e\xdd\x97\xff\x3a\x0e\x72\xe1\xb7\xc9\x94\x8b\x08\xba\xcb\x5f\x7d\xe5\x02\xb2\xfe\xa6\x7c\xa2\xfe\xf1\x90\xd6\x0e\xae\x92\xd1\x51\x58\xda\x44\x4a\x49\xd2\xe9\xd5\xa5\x73\xe8\xe1\x77\xe8\xbb\xf7\xe6\xc4\x9f\x90\x71\x36\xe7\x1d\x2a\x66\xcb\x07\x63\x6d\x48\x76\x8f\xf4\x17\xc8\xbe\xcc\xf4\x32\x31\x81\xfe\xfb\x31\x24\xe4\x34\x04\x9e\xa4\x5d\xd5\x01\x9e\x40\xb4"}, +{{0x72,0xd4,0xa5,0x64,0xca,0x15,0x49,0x9b,0x5e,0x4e,0x75,0xd8,0xac,0x0f,0x28,0x21,0x7d,0x32,0x11,0x4a,0x0c,0x64,0x9a,0x7c,0x8e,0xaa,0xdd,0x0c,0xc7,0x8c,0x52,0x0b,},{0xc7,0x66,0xbd,0x73,0x83,0x7c,0x4f,0xaa,0x52,0x15,0x50,0x2f,0x1e,0xfc,0x90,0xc0,0x03,0xf7,0x11,0xbb,0xef,0x55,0x17,0x00,0x91,0x02,0x8a,0x34,0x49,0x34,0x08,0xa9,},{0x8f,0xc4,0xf1,0x79,0x33,0x0b,0x64,0x2d,0xd8,0x6c,0xa9,0x36,0x26,0x51,0xb8,0x3b,0x00,0x6d,0x83,0x75,0xcc,0xef,0x81,0x1d,0x3c,0x67,0x06,0xf9,0x15,0x94,0x65,0x1d,0xf2,0x76,0x99,0x53,0x72,0x30,0x46,0xcc,0xb9,0xbf,0xe6,0x6a,0x66,0x7e,0x0d,0x11,0xfc,0x3e,0xa2,0xd8,0x22,0x62,0x34,0xfd,0xd5,0x16,0x47,0x65,0x26,0x0f,0x7b,0x05,},"\x6c\x7e\x7b\x62\xeb\x24\x4a\x45\xd7\x84\x36\xe2\x97\x0d\xcd\x6c\x0f\x7d\xb8\x22\x97\xa8\x61\x40\xea\x58\xdd\x22\xc2\x19\x5a\xdb\xc9\x56\xd4\xc4\xec\x05\x35\x4b\x21\xef\xe2\x4c\xfc\xfe\x10\xe1\x76\x22\x36\x88\x48\x18\x0d\x2c\x46\x80\xcc\x21\x5e\x8c\xee\xa6\xcc\xe2\x22\x16\x1f\x1e\x09\x22\x39\x25\x3b\x97\x46\xf7\x88\x7d\xf2\x42\x5a\xb5\xa8\x80\xbd\xba\x98\x15\x3b\xe7\x86\xdc\x83\x8c\xbe\xca\x01\x6b\x1d\x06\x52\x4b\xd6\xbf\xba\x80\x9a\x8b\xb3\x7a\xda\xb1\x5d\x42\x41\x5f\x86\xec\x03\x58\x36\x5e\xa8\x7b\x81\x50\xb0\x54\x41\xd9\xd4\x98\x46\x87\x14\x85\xca\xae\x6d\xe3\x59\x73\x6c\x27\x18\x97\x36\xd8\xf1\x76\x5f\x3e\x5c\x5f\x6b\x92\x16\x83\x96\x39\x0b\xee\x94\xcf\xbd"}, +{{0x2e,0x5a,0xaa,0xb2,0x98,0xe6,0x6c,0x2d,0xc1,0xd7,0x7e,0xa7,0x42,0x1f,0xf8,0x95,0x25,0x5f,0x9d,0x90,0x0d,0xb0,0x45,0x0d,0x63,0xf9,0xf7,0x9c,0x1a,0x70,0x13,0xcf,},{0x03,0x81,0xf3,0xf1,0x90,0x45,0x71,0x9b,0x9e,0x8c,0xeb,0x56,0x2f,0x0e,0x96,0x5d,0xc0,0x7b,0x09,0xf3,0x71,0xa9,0x63,0xa2,0x81,0xc7,0x49,0xc2,0x53,0x2f,0x65,0x4a,},{0x7c,0x74,0x30,0x30,0x5b,0x36,0x1a,0x9e,0x35,0xb2,0x78,0x0c,0x4d,0x44,0x08,0x07,0x1b,0x21,0x30,0x93,0x1d,0x39,0x83,0x0e,0xc8,0xd3,0x13,0xaa,0xfb,0xc8,0x3a,0x65,0xda,0xe1,0x9c,0xb7,0x47,0xd9,0xd1,0xc4,0xce,0x3f,0x35,0x9c,0xc8,0x24,0xea,0x8c,0x92,0xf6,0x6a,0x42,0xb8,0x61,0x4e,0x78,0x48,0xb8,0x84,0xac,0x8a,0xa4,0xae,0x02,},"\x3d\xf0\xe5\x4c\x71\x1e\x31\x32\xd7\xae\x95\x3d\xeb\x7b\x66\x86\x9e\xe5\x31\xee\x40\xb6\x3c\xe6\x93\x20\x6c\xdb\x2f\x4b\xda\x0a\x25\x69\xe9\x13\xac\x3e\x65\x32\xc5\xd9\x64\x8e\xfd\x46\x27\x78\x0f\xb8\xa3\x1d\x10\x7e\x03\x3f\x05\x4d\x19\xed\x8b\x7c\x49\xdc\x40\x7d\x2e\x94\x9d\xe2\x5f\x99\x30\x72\x21\xd3\x58\x43\xf6\xd5\xeb\x7d\xe5\xcd\xf4\x1b\x91\xdb\xbf\x34\xcb\x6c\x9c\x53\x00\x21\x01\x4b\x56\xab\xc4\x4a\xc2\x30\x03\x13\x61\x56\x08\xa7\xb4\xa2\x35\xe9\x9c\x14\xce\xf8\x05\x08\x87\x03\x22\x09\x48\x8b\x9e\xae\xaa\x82\xc0\x94\x05\xfc\x75\xbe\xc9\x4d\xd4\x2d\x6f\xf1\xb5\x99\xa6\x3e\xe5\x74\x2f\x33\x64\x09\x3a\xc9\x2c\xab\xab\x30\x35\x82\x2a\xa8\x67\xae\x56\xdc\xc9\x9d"}, +{{0xb6,0x36,0xa0,0x24,0x48,0x00,0x35,0x43,0xdb,0x86,0x4b,0x40,0xb5,0xd8,0xd6,0xdd,0x9a,0xd6,0x11,0x62,0x4c,0x9b,0x0f,0xc6,0x89,0x0c,0x51,0xea,0x55,0x92,0xc7,0x90,},{0x1e,0xf3,0x60,0x49,0x59,0x68,0xe5,0x6e,0x6d,0x3f,0xe7,0x40,0xb1,0xc8,0x4c,0x4e,0x44,0x90,0xed,0x68,0x2d,0xeb,0x43,0x05,0xaf,0xd5,0x96,0xef,0xb2,0x80,0x22,0x3b,},{0xd4,0xba,0x80,0x30,0x0d,0x5c,0xb5,0x13,0x53,0xc0,0x3f,0x28,0xc4,0x4f,0xd0,0xa4,0x24,0xff,0xe1,0xe4,0x0d,0x78,0xed,0x7b,0xb1,0x13,0x3e,0x8f,0xe4,0xe1,0x87,0x50,0x52,0x93,0xb2,0x0a,0x39,0x1d,0xa9,0x62,0xc6,0xa8,0xac,0x0a,0xce,0xc9,0xc6,0x72,0x26,0xaf,0x3b,0x61,0x95,0xda,0xbe,0x39,0xb3,0x66,0x22,0x94,0xda,0x3e,0x0e,0x09,},"\x4a\xa8\x5a\xac\x25\x03\x4f\x61\x4e\xd4\x4f\x7a\xdc\xdb\xee\xec\x25\xfc\xc2\xa9\xee\xa3\x2a\xb6\xa8\x69\x95\x06\xf7\xa1\xca\xd3\xbc\x89\x2e\x9d\xce\x93\x4e\x75\xb0\xa8\xcd\x14\x64\x2b\x77\x85\x99\x28\x6c\xfd\x8f\x50\xa9\xe4\xf2\xed\xf9\xf9\xd6\x29\x1a\x2e\x29\x79\xcf\x18\x06\xb9\x3e\xd8\xc9\xa7\x8f\xae\x19\x9b\x28\x54\xa0\x3e\xc4\x06\xab\x3f\x72\x08\x35\xee\x26\x3f\xbb\xc9\x1c\xb4\xef\x07\x58\xd7\x75\xfc\x78\x4c\x7d\x5b\x25\x1a\xc8\x93\x79\x19\xa9\xe6\x7b\xe8\x8c\x9e\x44\xcf\x2e\xc7\xf5\x60\x26\x9a\xa0\xf1\x11\x3d\x91\xb8\x44\x01\xdb\x15\xa3\xc4\x8c\x7d\xac\xff\x49\x39\xee\x01\xba\xbb\x98\x2f\xb9\x56\x25\xc6\xc3\xad\x78\x74\x90\x60\x55\x1b\xfd\xe8\xcc\xe4\xfb\x8a\x29"}, +{{0x5c,0xa0,0x54,0x3c,0x71,0xf5,0x68,0xa0,0x0e,0xed,0xf5,0x0a,0x95,0x20,0xf4,0xc1,0x5b,0x52,0x6e,0x3f,0xb0,0xda,0x81,0x6c,0x29,0xea,0x3d,0x50,0xb2,0xf6,0x2a,0x12,},{0xd4,0xa2,0x93,0x3c,0xe1,0x94,0x54,0xe3,0x31,0xb5,0x28,0x01,0x00,0x20,0x9a,0x6c,0xe8,0xe5,0x69,0xf9,0x93,0xc2,0xac,0xab,0x51,0xdb,0xe8,0x64,0xc5,0xcb,0x25,0x63,},{0x43,0x68,0x23,0xee,0xff,0x3e,0xdc,0xe5,0xd8,0x58,0x7d,0x68,0xe5,0x47,0x3e,0xf3,0xd8,0xdc,0x94,0x65,0xb5,0x58,0xb6,0xe8,0xe7,0xcd,0x31,0x37,0xec,0xcc,0x80,0xb4,0xc4,0xe8,0x06,0xed,0xf1,0x36,0x19,0xd8,0xe7,0x17,0xe6,0x9f,0x48,0xd7,0x06,0x1b,0x68,0xde,0x02,0xc8,0x20,0x9b,0xe1,0xf7,0xac,0x26,0xba,0x8e,0xdf,0x60,0x6d,0x02,},"\x4e\xf8\x49\x69\x78\xd2\x8c\x10\xab\xd5\x4a\x26\x35\x6e\xe5\x59\x21\xce\xb3\x50\xdd\x4b\x74\x2c\x41\x61\xfb\xeb\xa8\xa1\x60\x1f\x8a\xd0\x48\x4b\x21\xa8\xcf\x5a\x29\x4f\xac\x00\xec\x8a\x6f\x59\xe3\x36\x2e\x47\xbf\xae\x1e\x28\xa2\xe6\xd0\x17\xc5\xca\xa7\x5f\xb0\xf4\x84\x82\x80\x80\x37\xca\x21\x47\x69\x54\xd7\x78\xff\x1a\x05\x86\xda\x3e\xf6\x9d\x6c\xef\x6d\x2d\x8d\xf4\xae\x7a\x85\x44\x2a\x1e\x46\xc9\x98\xcf\x40\x7a\x6a\xd4\xc5\x46\x3a\x43\xc2\x48\xf3\xb6\x93\x7f\xdb\xc8\x45\xb6\x0c\x6d\x85\xe0\x56\x3c\xc1\x6b\xa9\x67\x5d\x36\x4f\x52\x5f\x66\x9a\xaa\xc9\x5f\x42\x8b\xb5\x82\x05\x09\x9f\x9e\x4a\x6d\xbb\xd0\x15\x1f\xb6\x5b\xab\xe1\x23\xe5\x39\x3a\xd6\x40\x26\x93\x5c\xb4\x88\xaa"}, +{{0x5f,0x87,0x11,0x7d,0xa9,0xbb,0xb6,0x09,0x1c,0x94,0xda,0x6b,0x23,0x0b,0x7d,0x8f,0x6d,0xe0,0xed,0x2a,0x07,0x64,0x13,0xb9,0x2e,0xac,0xdc,0x43,0xab,0xbc,0x68,0x97,},{0xaa,0x78,0x6a,0x14,0x62,0x26,0x83,0x2a,0xa7,0x3c,0x43,0x4b,0x0e,0xdc,0x2d,0x41,0xd2,0x55,0x8f,0x82,0x0a,0xb8,0xf8,0x7e,0x09,0xe6,0xcd,0xa9,0x10,0x72,0xb9,0xb6,},{0x0f,0x19,0xe6,0xea,0x0c,0x05,0xf3,0x81,0x85,0xc0,0x1c,0x2d,0x64,0x77,0x99,0x5d,0xaf,0x50,0x65,0xba,0x9d,0x80,0x17,0x3f,0xa6,0xbb,0x23,0xa7,0x74,0xdc,0x88,0xb3,0xaa,0xe8,0x79,0xd8,0xa6,0x24,0x71,0xd2,0xd3,0x04,0xcc,0x3d,0xc6,0x62,0x78,0xa7,0xab,0xcb,0x0b,0xb0,0x77,0x1c,0xd2,0x78,0xe1,0x1e,0x7b,0x93,0x2e,0x9f,0x9b,0x0f,},"\x22\x97\xc4\x0a\x2e\x83\x65\xba\xe4\xc5\xf0\x63\x0c\x50\xb1\x3b\xdd\x9a\xd9\x77\x0a\x5d\x9a\x94\x51\xd0\x08\x74\xb0\x23\xd2\x5e\xcd\x46\x8b\x96\x57\x1b\x2f\x16\xdc\xb1\xb0\xd3\xd7\x56\xc1\xf0\x44\xfc\xdd\xd1\xc5\x1f\x27\x72\x7a\x03\x69\xc9\xcf\x25\xbd\x6a\xa5\x95\x51\xb5\xb0\x7c\xf8\xf8\x07\xd9\x2b\x15\x91\x98\x63\x97\x04\x74\x0f\xe6\xed\xa0\xf2\x6d\xba\x7e\x75\xd4\x53\x0b\x28\x00\xf0\x3f\xb6\xaa\x67\x7d\x84\xdf\x75\xd6\x8d\x4f\xbb\x64\xad\x21\x00\x1e\x3f\xc8\x7b\x60\x9b\x9c\x25\x1e\x8c\xcb\x12\xbb\xca\x92\x74\x47\xe2\x05\x4e\x07\x68\x8e\xb8\xa2\x05\x21\xa5\x22\x49\xe7\xb9\x43\xbe\xd6\x0e\x6a\x93\xc0\x1e\x3e\xb6\x21\xf0\x46\x0c\x18\xa6\x90\xb6\xf6\xb6\x6e\xdc\x6e\x87\x43\xa6"}, +{{0xb5,0x3a,0x64,0x4c,0x92,0xba,0x2d,0xc7,0x10,0x8b,0x16,0x83,0x3f,0x09,0xad,0x59,0x17,0x84,0x64,0x37,0x22,0x5a,0x77,0x3d,0x32,0xd7,0x9c,0x97,0x73,0x3c,0x0a,0x58,},{0x51,0x58,0x18,0xc6,0x9c,0x0e,0x0a,0x17,0x06,0xb0,0x41,0x43,0x84,0x2f,0x3e,0x9e,0x27,0x14,0x48,0xfb,0xaf,0x3a,0x89,0x91,0x19,0xc3,0x2f,0x42,0x56,0x6f,0xfd,0x33,},{0x13,0xd2,0xcb,0xac,0x79,0x76,0xad,0x27,0xf0,0xbf,0x66,0x9a,0xd5,0x88,0xef,0xb2,0xc9,0x1b,0xab,0x85,0x07,0xd5,0x7f,0xb1,0x6b,0xfe,0xa9,0xca,0xff,0x2b,0x09,0x64,0xe7,0x56,0x25,0xc4,0xd8,0x08,0xd7,0xbb,0xb7,0x8c,0x5b,0x46,0x4e,0xdf,0xfe,0x49,0x49,0xec,0xfb,0xc8,0xb9,0x5f,0xf6,0xfd,0xb1,0xbd,0xca,0x27,0x42,0x06,0x81,0x00,},"\x13\x03\x6d\xaa\xee\x45\xfc\xfd\xe0\xc5\x3e\x06\xd0\x5a\xa9\xc0\x1e\xa9\x4a\x67\xe8\x6c\x6c\x53\x8c\xcb\x28\x3b\x36\x8d\xaf\x70\x78\xd3\xfb\xab\x58\x0c\x76\xec\xf8\x2b\x4e\x96\x60\xf0\x68\xdc\xbb\x50\x0b\x80\x59\x50\x17\xc5\xbe\x3c\x44\x8f\xbd\x8a\x17\xd9\x7c\x56\x43\x19\x78\x90\xe1\x67\xb3\x53\x45\xbf\x65\xe7\x5b\x82\xc8\xd6\x52\x29\xf2\xf6\x0a\xae\x27\x72\x58\x1b\xc9\x9c\x49\xd4\x16\xbc\x3d\x78\x74\x6e\xf8\x30\xf1\xaf\x94\x4f\x4a\x67\x15\xab\x4f\xfb\x01\x59\x1b\xac\x28\x57\xf1\xa9\xc9\xd1\x70\x08\x88\x78\x00\x06\xa3\x16\x07\x33\x8f\x7a\xf7\xbe\xdf\x6e\xfe\x0b\x57\x29\x9a\xc9\x15\x52\x6f\xe5\xe1\xe1\x01\x29\x87\x08\xc6\xe6\x1b\x84\x22\x0a\xfe\x95\xb5\x3f\x89\x59\x87\x45\x61\x52"}, +{{0xd2,0x7c,0x9e,0xaf,0xcf,0x88,0x15,0x19,0x90,0xbb,0x5b,0x2f,0xa8,0x44,0x3e,0x70,0x9b,0x5f,0xd8,0xd7,0x8d,0x23,0x38,0x03,0x32,0x2d,0xc8,0x6d,0x93,0xd9,0x32,0x95,},{0x08,0xe0,0xef,0xf5,0x29,0x77,0x67,0x14,0x68,0x61,0x96,0xd8,0x17,0xfd,0xf7,0x1e,0xb5,0xb6,0xe8,0x32,0x65,0x16,0xef,0x48,0x9b,0xfe,0x18,0x6a,0xc5,0xc5,0xbf,0x6d,},{0xc2,0x54,0xe3,0x71,0x44,0x56,0x33,0x13,0x74,0x42,0xee,0xfe,0x40,0xad,0x4a,0x82,0xe6,0x9b,0x1e,0xbf,0x48,0xa6,0x85,0xa2,0xbc,0x6f,0xfb,0xac,0x12,0x6d,0x22,0x84,0x87,0xb2,0xe3,0x53,0x7c,0x97,0xef,0x74,0x10,0x34,0x20,0x91,0x96,0x2e,0x50,0xc0,0xcb,0x85,0xde,0x7b,0x39,0xce,0xb4,0x1a,0xc4,0x07,0x8d,0x40,0xf3,0x40,0x71,0x06,},"\x77\xc3\x5b\xda\x32\xa5\x96\x7d\x8b\x30\x2f\xa7\xa4\x75\x83\xce\xab\x89\xc9\xa6\x09\xa6\x67\xb7\x53\x15\x5f\xa6\x99\x6f\x86\x31\xd0\xeb\xed\xfe\x0a\xc3\x64\xc7\x7e\x85\xba\x37\x31\x1f\x0d\xe5\x7a\x0d\xc2\xc1\xe9\xe4\x00\xd5\x8b\x42\x4a\x32\x2e\x1d\x57\x71\xe0\xa9\xfd\x95\x02\xad\x02\x32\xce\x54\x4f\x07\xd8\xc6\x6e\x7c\x31\x47\xf8\x60\x7a\xc6\x18\x9b\xb6\x90\x66\xf2\xfa\xd6\x31\x18\x5f\x45\x7f\x46\x7e\xba\x33\x22\x8e\xcc\x40\xe8\x94\xa7\x7b\x57\x16\x98\xa9\xbf\xac\x84\x1a\x54\xea\xc5\x21\x9d\xa9\x9c\x6a\x91\x25\xc4\x69\xa2\x2f\xe8\x1f\x3b\x95\x14\x33\x89\x6f\x19\xce\x39\xb3\x73\xfd\x7e\x5c\x7b\x65\x0a\x5e\xf2\x36\x5a\xe7\x51\x0b\x0d\xa5\xe4\x9d\x7c\x07\x07\x3c\xf1\x66\xa9\x83\x87\xe8"}, +{{0x70,0x21,0x3d,0x3a,0x79,0xc6,0x5d,0x6d,0xbb,0xa5,0x42,0xa3,0x67,0x96,0x35,0x00,0x3a,0x68,0x2a,0xf5,0xfa,0x58,0xde,0x6b,0x0d,0x65,0xbf,0xa2,0x41,0x84,0x90,0x1c,},{0x44,0x02,0xfb,0x92,0xcc,0x12,0x49,0xdd,0x1a,0xe1,0x69,0x0f,0x03,0xb3,0xec,0x4f,0x1e,0x9b,0xda,0xb0,0xde,0x5b,0xfd,0x28,0x9f,0x10,0x29,0x68,0x30,0xfd,0x40,0x3e,},{0x5b,0x6c,0xe2,0x77,0x4d,0x40,0x0e,0xce,0xa8,0xa8,0x08,0xf5,0xfd,0x0a,0x79,0x7f,0xfc,0x61,0x16,0x75,0x23,0x76,0xcd,0x7b,0xfa,0x3b,0x2c,0xca,0x3a,0x84,0xd5,0x59,0x3f,0x5c,0x03,0xad,0x3e,0xec,0x1d,0x89,0x53,0x22,0x75,0xc4,0x7b,0x7c,0xe2,0xa0,0xe9,0xc5,0x9c,0xc4,0x02,0x8a,0x8a,0x65,0xe5,0xbb,0x90,0x97,0xea,0x71,0xc2,0x08,},"\xcd\x6e\x1c\xd9\xc9\x0f\x56\x6d\xe0\x43\xd7\x5d\x72\x44\xec\xfd\xb3\x8e\x8b\xde\x2f\x9a\x6c\xd5\xa4\xfd\xac\x72\xb5\xed\xe6\xaf\x62\xd9\x81\x91\x8c\x5e\x61\x0a\x38\x78\x92\x74\xfa\x10\xe5\x27\xf8\x5f\xad\x20\x9b\x76\xca\x1c\x28\x1a\xd5\x89\x0f\x9c\x96\xd3\x5d\xe5\x22\xf1\xdd\xcc\xb5\x39\xb8\x79\x8a\x00\x67\xac\xdd\x45\xb6\xe3\x44\xa5\xd9\xa9\x77\x31\xf5\x45\xff\xa4\xb1\x7b\x87\x5c\x67\xb4\x8e\x9d\x4c\x4b\xa7\x2c\x98\xa4\x50\x55\x83\xfd\xbf\x1e\x12\xf2\x2b\x5a\x7a\x49\x47\x46\xcc\x9b\x6c\x1b\x57\x19\x06\xc6\x7f\xcc\x88\x3a\x9c\x15\xa3\x80\x68\x75\xb6\x59\xe5\x81\x6b\x42\x76\xc3\x19\x0e\x25\xcc\x1a\xc3\xde\x47\xbf\x99\xc4\x99\x65\x38\x8f\x54\xf3\xef\x8e\xb5\x69\x90\x6c\x60\x08\xe5\xfb\xbd"}, +{{0x5d,0x54,0x0b,0x3b,0x14,0xf0,0xc0,0x17,0x5c,0x04,0x7e,0xaf,0x02,0x6c,0x90,0x70,0x65,0x9e,0xf1,0x3e,0x9d,0x28,0xe0,0xc5,0xc5,0x16,0xa4,0x28,0x26,0x9b,0x14,0xeb,},{0x1d,0x2d,0x4d,0x55,0x1a,0x57,0xc6,0xfb,0x2b,0x04,0x18,0x10,0x49,0xd4,0x03,0x9d,0x57,0x5c,0xf8,0x0c,0x0b,0xc6,0xec,0x70,0x33,0x06,0x7f,0x27,0x30,0x93,0x44,0xde,},{0x32,0x52,0x7d,0xa7,0x55,0x31,0x28,0x89,0x93,0x5d,0xd5,0xee,0x91,0xb1,0xbb,0x11,0x7a,0x5d,0x37,0x7d,0xd2,0x3e,0xf5,0xb7,0xe1,0x5b,0xaf,0xfa,0xe9,0xa5,0x43,0x91,0xa3,0xfd,0x23,0x4b,0xdc,0xe0,0x73,0xe0,0x98,0xc5,0x8d,0x05,0xbf,0x19,0x5b,0x4c,0x3c,0xc6,0x39,0x72,0x38,0x3b,0xa4,0xb5,0x10,0x72,0x97,0x1a,0xeb,0xcb,0x62,0x0d,},"\xe4\xc9\xe8\x70\x68\x98\xca\xd4\xac\x68\xd7\x3c\x13\x0e\xfa\x04\xa5\x4f\x8c\xa2\x59\x19\xea\x6b\xfa\xa5\x4c\x8c\x72\x0c\xed\x85\x4c\x5e\x95\x09\x10\x2c\x7b\x88\x5a\xed\xdf\xfb\xd1\xb7\xf2\xc5\x92\x25\x83\x67\x7a\xc9\xee\xa9\xa1\x08\xc7\xe8\x3e\x88\x71\xae\xd5\xa0\x84\xf5\x44\x0b\x0f\x39\x1a\xd7\xff\xc6\xba\xb4\x57\x4a\xf1\xb9\x67\x70\xf4\x37\x0e\x8e\x98\x8e\x85\xec\xb1\xa8\xd6\x03\x4f\xc3\xd7\xf4\x9f\x74\x22\x02\x3b\x9d\xab\x5d\x0c\x16\xbe\xab\x5f\x5d\x37\xb0\xa4\xd7\xde\x19\x7a\xd8\x7c\xd4\xff\x8c\xe7\x8e\xb1\x2e\x1d\xaf\x73\x9d\x8b\x47\xab\x38\x0a\xbe\x90\x93\x35\x6d\xb5\xb5\x97\x17\x75\x1a\x49\xe1\x94\x84\x72\xfd\xac\xc2\x59\xff\xff\xc8\xc1\xdb\xae\x59\x26\x07\xd4\xec\x71\xcc\x6a\x8f\x6b"}, +{{0xca,0x41,0x76,0x9c,0xaf,0x17,0x17,0xb4,0xe4,0x5c,0x93,0xc1,0x21,0xdc,0x82,0xa5,0x34,0xfb,0xc6,0xec,0x09,0x86,0x66,0x2c,0x32,0x22,0xd7,0x14,0x92,0xbd,0x11,0x76,},{0xaf,0x3f,0x89,0xf6,0x18,0x7d,0xbc,0xf9,0x21,0x77,0x50,0xc6,0x7e,0xf8,0x9e,0xd4,0x7b,0x03,0x9f,0x9e,0xb0,0x62,0xff,0xec,0x9d,0xf6,0x4a,0xb5,0x2b,0x0b,0x45,0xcb,},{0x5c,0xda,0x87,0x2f,0x7e,0xd6,0xd7,0xc9,0x02,0x18,0xac,0x10,0xbe,0xe8,0xe2,0x14,0xf3,0xb3,0x4d,0x15,0xd2,0x5c,0x39,0x25,0x5e,0xc9,0xe6,0xb0,0x17,0x7a,0xa3,0xcb,0x73,0x68,0xd1,0x1c,0xb8,0xed,0x6f,0xf5,0xcf,0x0c,0x04,0x28,0x1d,0x06,0xbc,0x42,0x72,0xb8,0xbc,0x09,0xc2,0x3f,0x6f,0x4c,0xd5,0xa8,0x10,0xdd,0xc7,0xb9,0xc1,0x03,},"\x9d\xe8\x47\x6c\x58\x13\x84\x8a\xb1\x45\x15\x37\x84\x1c\xc1\x78\x00\x21\x81\xa2\x18\x2a\xf3\x05\xb1\x2e\x5f\x7c\x3b\x1d\x56\xb2\x2c\xf4\x6a\xe6\x27\x6d\x18\x26\xec\x0a\x8c\x9a\x7d\x9f\x68\x08\x3b\x72\x25\xbb\xfa\xef\xce\x82\xb3\xb6\x45\x94\x05\x2a\x77\x00\xf3\x09\x23\x3a\x79\xff\xfd\xfc\xcc\x5c\x21\x40\x0c\x91\xcc\x0e\x41\x8d\x51\x41\xd4\x86\xb5\x21\x99\x01\xd6\xdd\x24\x47\xc1\xf7\xb7\xcf\x5a\x08\x79\xe7\x0e\x1d\xd6\x58\xd0\xf2\xec\xf3\x1e\xbe\xee\x11\xa5\xc7\x44\x40\xc6\x3b\x9d\x8b\x45\x31\x8c\x34\x65\xd7\xff\x03\x36\x5e\xdd\x03\x85\xed\xf8\x0d\x4f\xde\xd5\x1f\x0f\x75\x33\xee\x40\x99\xf1\x9e\x93\xbc\x9d\x08\xda\xdc\xd1\x34\x85\xdb\x23\x95\x22\xff\xc8\x1e\x2c\x05\x1f\x87\x96\xd6\x2e\x97\x9f\xcf"}, +{{0xfe,0xdd,0x63,0xff,0xd4,0xcf,0xbf,0x61,0x88,0x94,0x96,0x2e,0x12,0x1a,0x90,0x25,0xee,0xa3,0x18,0xa8,0x0a,0x1a,0xdf,0x16,0x9d,0x64,0x90,0x44,0x5d,0x2e,0x02,0xa0,},{0x54,0x2f,0x22,0x44,0xbd,0xb7,0xd8,0x4b,0x87,0xe6,0x28,0xa8,0xe6,0xa1,0x2f,0x17,0xbf,0x74,0xa9,0xa6,0xd0,0xea,0x46,0xc5,0x95,0xdb,0xfd,0xc6,0x80,0xc0,0x4b,0x26,},{0xed,0x59,0xd9,0xe2,0x3d,0xec,0x34,0x94,0xb0,0xfb,0xc5,0xd1,0x0c,0xd0,0x2b,0xab,0x86,0xb3,0xeb,0x35,0xab,0xbf,0x9e,0x4d,0x4a,0x92,0x64,0x79,0xf1,0x34,0x58,0x3a,0x44,0xce,0x72,0xdc,0x41,0x22,0xac,0xa3,0x77,0xa4,0x07,0x2b,0x71,0x56,0x46,0x2b,0x74,0xe8,0xdf,0x46,0xb6,0x86,0x69,0x86,0x36,0x83,0x6e,0xf2,0x03,0x17,0x9c,0x07,},"\x2e\x2a\xe5\x84\x64\x1b\xe0\x3d\xd4\x8f\x9c\x61\x80\x77\xae\xaa\x18\x21\x2a\x42\x41\xf0\xc0\x19\x4e\xd2\x3e\x37\x0d\x74\x1a\x3a\xe1\x1a\x5f\xec\x3b\x04\x0c\x16\xea\xfa\x4a\xc8\xd1\x8a\xba\xa7\xce\x8f\x28\x69\x67\x33\x71\x89\xf0\x49\x5f\xfd\xd6\x19\x95\xcd\xe3\x1d\xd8\xdf\xc3\xdf\x57\x00\xb5\x7a\x7a\x29\x98\x0e\x9c\x82\x3f\xee\x85\xd6\x14\x51\x17\x67\x29\xe7\x27\x87\xc6\x10\x9b\x47\x35\x9b\x93\xdf\xd6\x2e\x1e\x5a\x2d\x64\x2c\x05\x72\x42\xda\xe5\x00\xa9\x4c\xa1\xa9\x3b\xc5\x7b\xe1\xad\xe7\x6f\xe4\x50\x1c\x0f\x63\x77\xed\x0e\x92\x46\x17\x9a\xec\xdd\x99\x46\xb6\x71\xe8\x19\x0e\x1e\xd2\x3f\x96\x6e\x96\x40\x9b\x94\x82\x22\xd8\xea\x58\x39\xde\x90\x4f\xc5\x13\x48\x07\x3b\x8f\x40\xed\xbd\x9b\x4a\x4b\x22\x75"}, +{{0x38,0xf2,0x18,0x4e,0xaa,0x55,0x36,0x56,0xee,0x29,0x02,0x70,0x6b,0xce,0xc4,0xac,0xb5,0xaf,0x25,0x15,0x7c,0xa0,0xf6,0xa2,0xd4,0x8d,0xe8,0x52,0x85,0xfa,0x3b,0xc0,},{0x7f,0xf0,0x3f,0xb4,0xc8,0x2e,0x9c,0x15,0xd6,0x59,0xdf,0x42,0x4b,0x3e,0x73,0xed,0x1d,0x78,0x00,0x6f,0x3e,0x0b,0x79,0xeb,0x64,0xd9,0x8c,0x13,0xae,0xc6,0xba,0x37,},{0x4a,0x64,0x13,0xc2,0xc8,0x7f,0x2b,0x38,0x56,0xa8,0xde,0xcb,0xce,0x49,0x3a,0xde,0xae,0x0c,0x69,0xc9,0x41,0x34,0x70,0x7f,0xb0,0xf1,0x8f,0x30,0x49,0xfd,0x3e,0x3d,0x05,0x1a,0xbd,0xb9,0xd4,0xbe,0xe2,0x53,0xc6,0x10,0x7c,0x02,0xd5,0x7a,0xd7,0xcc,0x9f,0x31,0x01,0xdb,0x66,0x0a,0xfa,0xc2,0xb7,0x98,0x19,0x38,0xe9,0x56,0x4f,0x01,},"\xc2\xdf\x77\xc9\xe4\x79\xf6\x19\x83\xb6\xc7\x48\x3e\xf9\x3f\xb8\x5a\x10\x3b\x21\x39\x23\x92\x65\x23\x06\x5e\xbf\xf2\x25\x7e\x85\x42\x7e\x05\xcd\xc2\x75\x82\xef\x6c\x16\xbe\x35\x3a\x3b\x25\x03\x72\xd6\x37\x0e\xec\xb6\xc8\x96\x29\x17\xeb\x65\x6f\x26\x41\x69\x01\x89\xd1\x72\xa1\x11\x05\x15\x57\xab\xc2\x49\x4e\x32\xca\xb6\x5e\xd0\x63\x3a\xff\xe9\x24\x08\xb5\x5c\x4e\xd8\xaf\x65\xe2\xc5\xe7\xaa\xb8\x87\xa3\xcc\x8d\x28\xc5\x2e\x9e\x13\x36\xd0\xb7\xbb\x3f\xe2\xcd\x84\x3e\x7f\xa1\x68\x03\x42\xf8\xa4\xaa\xfa\x02\xc4\xab\x25\x2f\x08\xc3\xd4\x6d\x5f\x00\xfd\x01\x48\x42\x63\xee\x63\x52\x84\xf6\xdb\x26\xd6\x29\x8d\xe5\xb0\xdd\x23\x8d\xa4\x0a\x8d\x2a\x93\x37\x6d\xa0\x30\x27\x83\xa0\xe3\xbe\x23\xd9\xe7\xf9\x90\xd2\x5b"}, +{{0x8b,0xfc,0xa4,0x84,0x62,0xd2,0x53,0x6f,0x74,0xb8,0x4f,0x6a,0xf5,0x9f,0x5d,0x85,0x82,0xff,0x8f,0x7e,0xc2,0x87,0x45,0xd6,0x72,0xe7,0x2e,0xb7,0x2e,0x79,0xd3,0xe9,},{0x9d,0x10,0xd2,0x75,0xc3,0xd3,0xfe,0x45,0x9f,0x7f,0xe2,0x90,0x1b,0xce,0x38,0x91,0x91,0xcc,0x84,0x83,0xc0,0xf5,0x11,0x40,0xd9,0xc6,0x2b,0x08,0xfa,0xde,0x81,0xbb,},{0x44,0xd7,0x7e,0x43,0x9e,0xf6,0xca,0x5e,0xb9,0x40,0xc6,0x0f,0xf8,0x73,0x2d,0xdc,0x16,0x26,0x9e,0xa0,0x23,0xbb,0x26,0x13,0xbd,0x44,0x7e,0xba,0x7f,0xd6,0x98,0x51,0x22,0x6c,0x48,0x19,0xce,0x8d,0x44,0x98,0x5a,0x49,0xf3,0xf4,0x1a,0xc7,0xaf,0x33,0xc4,0x7f,0xfe,0x5f,0x89,0x30,0x4a,0x32,0x56,0xe4,0x45,0xf8,0xd6,0x86,0xe3,0x07,},"\x81\xee\x4c\xb9\xc4\x5d\xa6\x91\xda\xcd\x7d\xd0\x9a\xff\x59\x73\x72\x67\xbb\x55\xc3\xad\xe1\xba\x32\xc1\x7b\x7d\x0d\x2d\x0c\x60\x79\xc3\x9d\x5f\xd5\xb2\x9b\xa5\xf9\xc1\x76\x20\x97\x70\x98\x43\xee\xe5\x61\x2b\xd2\x0b\xc8\x18\x5b\xf6\x4d\x5c\x93\x41\x84\xe1\x36\x24\xe6\xf8\x77\xa2\xa5\xdd\xa1\x5c\x0d\xf6\x2a\xfb\xb9\x70\x57\xcc\x91\xca\xc9\xa1\x84\x06\xa0\xe0\x10\x9c\xc3\x9b\x2e\x3f\x81\x2e\x22\x7a\x40\x62\xd5\xef\x81\xc9\x2c\x22\xa7\xdc\x79\x7c\x84\x5d\x71\xeb\x6e\xa9\xe4\x2e\xc8\x41\x7f\xba\x90\xa9\x6d\x2b\xb1\x43\x94\x18\x33\x0b\x4b\xb2\xf9\x9c\x6d\x63\xd3\x04\xa0\xe5\x06\xdc\xa9\x65\x3e\x5d\xe0\xdd\x56\xe3\x09\xdb\x1a\x76\xa0\xfa\xab\xab\x16\x37\x74\xf0\x00\x08\x8c\xef\x3d\x1b\x7a\x6c\xf6\x61\xd2\xe1\xd9"}, +{{0xd7,0x48,0x0d,0x42,0x72,0xbc,0xb1,0x55,0x7b,0x1b,0xbe,0xe0,0x49,0x15,0xc1,0x26,0xa5,0x2c,0xa6,0xd6,0xa8,0xbb,0x53,0x14,0xa0,0xe1,0xa5,0x2b,0x59,0xbf,0xc9,0x9c,},{0x99,0xc8,0x39,0xd3,0x6d,0x8f,0x5b,0x86,0x52,0x61,0x8e,0xd7,0xb0,0xfe,0x9e,0xc3,0xd9,0x4e,0xff,0xf4,0xc4,0x53,0xc5,0x40,0x63,0x14,0x76,0xa5,0x97,0x9b,0xbb,0xe0,},{0xe0,0x4d,0xc8,0x44,0x2d,0x35,0x21,0x73,0xe9,0x31,0x81,0x8e,0x29,0x08,0x58,0xde,0x85,0x68,0x8a,0x46,0x49,0xea,0x3e,0x3c,0x3a,0xe7,0x4e,0xda,0xa5,0x4a,0xd0,0x1b,0x64,0x62,0x2a,0xd8,0xa0,0x90,0xb6,0xad,0x60,0xad,0xfd,0x01,0x88,0x18,0x82,0x82,0x8d,0x39,0x07,0x8b,0xb5,0xb2,0x71,0x4f,0xd3,0xea,0x83,0x97,0xa3,0x42,0xfd,0x04,},"\x61\x5c\xc1\x9f\x94\x20\x17\x36\x5b\xa8\xbf\xa2\x56\xce\xcc\xc8\x5e\xe2\x89\xa1\xc3\x4b\xb1\x44\x2a\xcc\x07\x16\xc7\xfc\x2c\xae\xb7\x6a\x9d\xe1\x9a\xde\xc1\x06\x37\x1e\x47\xa3\x0d\x2e\x12\x39\xce\x1f\x7d\xca\x25\x52\x6d\x60\x4b\xdd\x64\x76\x59\xd9\x42\xbc\xba\xc3\x68\x91\x13\x49\xc3\xb9\x46\xa9\x7d\xa1\x0a\x42\xdb\xcf\x3c\x73\x41\x6d\x2e\x6b\xa2\x2b\xd2\x9d\x9f\x70\x56\x72\xe9\xe3\x38\x94\x4c\xef\x01\xad\x21\xf0\x09\x74\x2e\x07\xbc\xd8\x88\xca\x31\xe1\xee\x95\x3e\x8c\x1b\x1f\xd9\x54\xb7\xdc\xf1\xa0\xb1\xd5\xa0\x69\x06\x5a\x66\xcb\x72\x1a\xdc\x02\x0f\x4e\xfe\x1a\xbd\xd1\x67\x42\x74\x69\x39\x28\x57\x80\xd7\x53\x13\x7a\xe0\x14\x0b\xb4\x10\xfb\x6c\xe3\x36\x76\xc2\x7a\xee\xc5\x93\xa8\x8c\xbc\x73\xaf\xd9\xf4\x05\x11"}, +{{0x3c,0x2d,0x36,0x50,0x73,0x5b,0x41,0xef,0x90,0x06,0xbb,0x45,0xe4,0xbe,0x2e,0x0a,0xa5,0xcd,0xe8,0x51,0xae,0xac,0x42,0x1e,0xe9,0xc1,0xb4,0x92,0xd8,0x7a,0xa1,0x8a,},{0x3e,0x46,0xdd,0xce,0x29,0x88,0x44,0xfc,0xaf,0xa0,0x0a,0x1b,0x47,0xea,0xf3,0xde,0x70,0x59,0x6d,0xf1,0xbb,0xee,0x3c,0x80,0x9d,0x1b,0xe7,0xdd,0x94,0x08,0x0e,0x34,},{0x3f,0x2a,0xf0,0x1a,0xd5,0x37,0x7a,0xc3,0x90,0x40,0xd4,0x1a,0x41,0xe3,0x6e,0x7b,0x93,0xfa,0x72,0x35,0xb8,0x41,0x79,0x1f,0x43,0x2e,0xcd,0x7f,0x91,0xa3,0xb2,0x1a,0xb7,0x19,0x6c,0x88,0x3a,0xd5,0xa7,0xdb,0x44,0x6f,0x6c,0x06,0x67,0x24,0x60,0xf3,0xf6,0x3e,0xf8,0x63,0xd9,0x43,0x2b,0xe9,0xca,0xea,0xbb,0x79,0xe8,0x7e,0x22,0x08,},"\x14\x25\xd8\xd2\x18\xda\x1a\x10\xa8\x0b\x6a\x9c\x3c\x27\x50\xef\xe4\x16\x57\x98\x4a\xbd\x51\x00\xf4\x51\xba\x94\x9d\xb0\x10\x46\xb7\x12\x6b\xe8\x40\x23\x34\xed\x57\x52\x8b\xac\x05\x62\x25\x53\xa8\x6b\x72\x67\x22\x69\x5a\x8f\xb3\x31\xd8\x56\x54\x17\xc4\xff\x0f\x25\x1a\x32\x0a\xd0\x6d\xed\xbb\x75\x0d\xef\x35\xd5\x21\xc3\xc4\xcd\x57\x1a\x45\xad\xa8\x45\x06\x53\xd5\xe8\x1f\xe0\xbe\xb5\x3a\xaa\xe7\x87\xb3\xeb\x65\x3c\x23\x81\xed\x55\xaa\xf2\x59\x0e\xe5\xed\x8b\x66\x26\xf1\xc4\xb0\x43\x0a\x54\xf3\x96\x58\x62\x4e\x66\x35\xfe\xfc\x98\xfe\xe8\xfc\x3e\x1c\xc7\xff\x3d\xd4\x20\xde\x9d\xa1\x1a\x62\xfc\xae\x0e\x0c\xb4\x54\xfc\x6f\x7d\xf0\x39\x54\x29\x1d\x26\x20\x2f\x1b\x18\x8b\x65\x7b\x3b\xae\x07\x38\x94\x49\xb7\x5e\x67\x42\x2f"}, +{{0x74,0x96,0x59,0x96,0x26,0x8c,0xdc,0x4c,0x09,0x22,0x0b,0xd3,0x1c,0xe0,0x7b,0x21,0x7a,0x03,0x82,0x6e,0xe9,0x81,0xfa,0x89,0xf3,0xa2,0x35,0x9c,0xed,0x09,0x5e,0xf1,},{0x40,0x96,0xd0,0x27,0xc1,0xc5,0xee,0x4c,0xbf,0xc0,0x4b,0x9d,0x53,0x41,0x74,0x02,0x9f,0xdb,0x50,0xcf,0x56,0x10,0xd3,0x02,0x1e,0xf9,0x33,0xb4,0xca,0xf3,0x39,0x85,},{0x8c,0x66,0x28,0x34,0x43,0x17,0xa6,0x3a,0xca,0x6f,0x78,0xcf,0xae,0xa9,0x65,0xb3,0xaa,0x55,0x22,0xce,0x91,0x41,0x95,0x14,0x1c,0x08,0x87,0x0a,0x1b,0x8d,0xac,0xf3,0x4b,0x79,0xc7,0xab,0xc6,0x93,0xcd,0x9e,0x5e,0xbe,0x1a,0x2e,0x86,0xf0,0x33,0x2d,0x20,0x48,0xdb,0x3c,0xbd,0xef,0x01,0x68,0x79,0x62,0xd6,0xdf,0x24,0x9e,0x38,0x00,},"\x45\xb2\xf0\x64\x61\x5b\xf7\x74\xfc\xe9\x7f\x51\xc4\x64\x68\x5d\x7b\x3e\x4f\xef\xff\x92\x31\x24\x0a\x71\x9b\x3b\x06\x21\xcd\x4a\xd8\x33\x05\x67\x5c\xd6\xea\xae\xbf\xf7\x91\x00\x0b\x0b\x1f\xa3\x1d\x82\xd8\x18\x1b\x7f\xe5\x7c\x5e\x00\xce\xc5\x6f\xf9\x02\x2e\x9c\xe8\xdb\x66\x35\x6e\x40\x8e\x3e\xe2\x62\xfe\x62\x77\x89\xe6\x55\x35\xef\x1a\x63\xe8\xfe\xc9\x33\xbe\x3d\xee\x34\xd2\xfa\xcd\xb8\x92\x8c\xc4\x56\xab\xf2\xf3\xe8\xca\xb4\x7e\xff\x1c\xa4\x2e\x8b\x0e\x48\xd2\xc7\x3e\x7b\xcc\x5d\xe3\xf1\x05\x6f\xc5\x23\xdf\xef\x6b\x00\x23\xf3\x28\x89\xed\x39\x4e\xed\xa0\x32\xab\xf6\xbc\xaa\xda\xa7\xf3\xee\x74\x11\x87\x60\xab\x6d\x91\xdf\x52\x8b\xdc\x58\x07\x97\x2c\x85\xfa\x7c\xb5\x6e\x38\x7d\x73\x32\xe7\x79\xe5\x2d\x0d\xd7\xdb\x0c\xfb"}, +{{0x0a,0xbf,0x06,0x9c,0x08,0xb2,0x69,0x1c,0x3a,0x26,0xf7,0x9d,0xc8,0xed,0x05,0xcb,0x71,0xd2,0x20,0xff,0x78,0xf3,0xa5,0xc5,0x78,0x0a,0xe9,0xda,0x18,0xe4,0x56,0x43,},{0x9e,0xf3,0xb5,0xcc,0x01,0x6c,0xc8,0x2d,0xbd,0xda,0x70,0x57,0x66,0xaa,0x44,0x8b,0xd6,0x1f,0xa1,0xaa,0xf1,0x17,0x0e,0xfe,0x91,0x49,0xda,0xa9,0xfe,0x64,0xa1,0xae,},{0xc7,0x56,0x6f,0xb3,0xb4,0xd8,0xde,0xf6,0x67,0xe0,0x40,0xf2,0x76,0xd3,0xed,0x98,0xd3,0x6d,0xff,0x46,0x01,0x26,0xa7,0x5b,0x4c,0xc2,0x10,0x03,0x86,0xbb,0x01,0xc6,0x42,0xf6,0xd8,0xde,0x7e,0x64,0x9b,0xe6,0xe0,0x81,0x8b,0x08,0xd7,0x7c,0xe6,0x0f,0x4e,0xe5,0xe7,0x71,0x7a,0x50,0x88,0x4b,0xde,0xe0,0x20,0x34,0xec,0xf1,0xcd,0x0c,},"\x0d\x05\x52\x91\xb2\xe8\x61\xea\xe1\x9e\xa0\xfb\x20\x69\xd8\xc9\xee\xf4\xf1\x34\x7f\x35\x76\xd7\x84\x11\xae\x7c\x0b\x1c\x1c\xaf\x31\xfd\xe7\x36\xdc\x8a\xcc\xac\xb6\x62\xdf\x76\xb6\x20\xb6\x2c\xe9\x0b\x9f\x92\xc8\x33\x09\x12\x86\x21\xd0\x57\xcf\x84\x58\x05\x94\x90\x88\xe9\x38\xdd\xbc\x3d\x41\xc5\xe5\x54\x1f\xec\x82\x98\x68\x7a\xd2\xf7\x9a\xcd\xa0\x1a\xa2\x15\xd2\x58\x21\x43\x6e\xac\x9d\x26\x87\x16\xd4\xcd\x60\x50\x26\x0c\xb4\xef\x6a\xad\xa4\x83\x5e\x07\x3a\x84\x58\x21\xff\x21\x1a\xe2\xba\xad\xce\xb6\xe5\x7f\x06\xf8\x83\x45\xed\xbf\x93\xbf\xdf\x54\xfb\x74\x12\x3b\x57\xc0\xfb\x4a\x79\x60\x8d\x8d\xb6\x74\x08\x89\xe1\x57\x33\x50\x77\x99\xf7\xa1\xfd\x30\x17\xbc\xd7\x7b\x28\xa2\xbb\x6c\x91\xec\xd1\x54\xe9\xc5\xa5\xff\xa0\xeb\x62"}, +{{0xf3,0xfd,0x5e,0xc5,0xe2,0x30,0xb6,0xda,0xd1,0xac,0x3d,0x3a,0xeb,0xad,0xc7,0x86,0x3f,0xf8,0x9d,0xe2,0xa1,0x31,0x7f,0x42,0x4d,0x15,0x98,0x9a,0x3e,0xfb,0x0a,0xfd,},{0xf9,0x9e,0x5d,0x5e,0xee,0xae,0xd1,0x20,0x5c,0xfb,0x5c,0x2c,0xc4,0xe5,0xe9,0xf6,0xb4,0xe7,0xf6,0x41,0x29,0xf8,0x60,0x10,0x4c,0xa6,0x24,0x4e,0xb9,0xfe,0xb5,0x64,},{0x44,0xb0,0x12,0x46,0x63,0xad,0xb0,0xc7,0x3a,0xed,0x49,0xf7,0x34,0x03,0x46,0x1f,0xcb,0x19,0x11,0x1b,0x0b,0xa1,0x7a,0xa9,0x96,0x56,0x6f,0x47,0x7e,0x37,0xd5,0x24,0xb0,0xe1,0xf1,0x07,0x61,0x2f,0xc5,0x2a,0x7c,0x76,0x7b,0x18,0x1f,0xbf,0x4d,0x62,0x9b,0xdd,0xc0,0x8f,0x30,0x58,0x4d,0xec,0x61,0x24,0xc5,0xd3,0x9d,0x42,0x31,0x02,},"\x71\xf2\x89\x73\xed\x3d\xf0\x59\x45\xfa\x0b\xdb\x23\xe9\xbe\xca\x65\x1d\x3e\xe6\xbf\x9f\xa4\x5f\xfd\xc6\x06\x1e\x42\xfa\x2e\x8d\x76\x23\x5f\x0e\x9e\x2d\xaa\x65\xe5\x26\x31\xfc\x3b\xea\xd3\x3d\xa0\x55\xbb\x49\x2e\x47\x58\xe5\x98\xa0\x30\xa3\x3b\x3c\x40\xb3\x43\x71\x45\x9b\x23\x3c\xcc\x04\x3c\xcc\xc3\xa3\xcb\xce\x54\x9e\x20\xe0\xb2\xb4\x33\x05\xb6\x4a\xec\x66\x1a\xad\xba\x65\x56\xb1\x7d\x76\xe3\xbb\xed\x62\xc4\xa4\xea\xc4\xf8\x86\x03\x99\x67\x52\xd2\x36\x3c\x8d\x4a\x27\x89\xd1\x28\xf6\xe9\x59\x94\x5c\x68\xc3\x01\x46\xd1\x94\xcc\xb6\x83\x9e\xc6\x53\x44\x60\x16\x52\xc1\x8b\x00\x74\xe2\xbc\x76\x68\x31\x16\x97\xd9\x60\xc7\x06\x65\x97\x92\x4d\x70\x4d\x02\xa0\x19\x3f\xaf\xbf\xdf\x57\x1e\xe0\xdf\xe4\x14\xdc\x2f\x52\x89\x69\x12\xbc\x32"}, +{{0x73,0x8f,0x13,0x10,0xa4,0xe0,0x8f,0x91,0x7a,0x0a,0x5c,0x1f,0xba,0xf4,0xef,0x72,0xf9,0x5e,0xe6,0x2f,0xcd,0xed,0x50,0x86,0x8a,0x3d,0xaf,0x98,0x85,0x6a,0x44,0x8d,},{0x42,0x27,0x2c,0x2c,0x8b,0x08,0x47,0x0e,0xe5,0xdd,0x8a,0xf8,0x84,0x9c,0x01,0xb7,0x50,0x8d,0x3a,0x3c,0x65,0xb0,0x33,0x0e,0x69,0x5c,0x84,0x1d,0x5d,0xcc,0xb2,0xf5,},{0xce,0x1e,0x35,0x77,0xb6,0xa2,0x10,0x16,0xb9,0xdd,0x0b,0x51,0x7b,0xaa,0x0c,0xcb,0x10,0x7b,0xc1,0x99,0xb8,0xbb,0xae,0xf6,0x8f,0x95,0x0c,0x8e,0xd5,0x80,0x13,0xc8,0x53,0xb4,0xd3,0x38,0xee,0xdc,0x67,0x50,0x79,0xab,0x13,0x90,0x46,0x2f,0xfe,0xfa,0x6a,0x95,0x9b,0x04,0x3f,0x8b,0x56,0x51,0xc6,0xca,0x37,0x5c,0xe0,0xb4,0xa4,0x03,},"\xf0\xe7\xef\x67\x82\xd0\x4c\x69\x43\xb1\x9e\xb6\x6f\xf6\x22\x6b\x73\x6e\x3b\x09\x40\xc0\x9b\xb1\x26\xbf\xc4\xc4\xca\x7a\x5e\x70\x16\xc2\x86\xb7\xbf\xd7\x3a\xa6\xa7\x9a\x96\x03\x1b\xc8\x1c\xb5\xda\x68\xce\xc7\x1a\x6a\x0d\x39\x78\x0c\xbe\x6a\x0c\xd4\x77\x4d\x3a\xa0\x6a\x88\x16\x10\x44\x4a\x8c\x9d\x19\x10\x22\x94\xe5\xf6\x35\x18\x7a\xa6\xf4\x8d\x11\x91\x2c\x70\x94\xb3\x88\x33\x02\x8d\x57\x0c\xb1\x10\xdb\x60\x62\x5b\xb1\xbd\xc3\x7a\xff\xa2\x5e\xa3\xc8\xf8\xdb\xfc\x25\x14\xf4\x36\x5c\x62\xb2\x98\x9a\x66\xd2\x7c\x80\x38\x4e\x74\xae\x5f\xba\x8c\x1c\x2a\xf9\xc7\x2c\x49\x71\xe6\x4f\xa6\xa1\xdc\x25\x17\xb3\x1e\xa5\x7c\xcb\x08\x15\xa7\xfe\x2d\xa0\xf1\x46\xca\xa0\x84\x31\xd2\x5d\x15\x16\x62\xd9\xd2\x6e\x95\x22\x9d\x0c\x62\x82\x36\x64\x12\x3c"}, +{{0x88,0x41,0xd2,0x2a,0xde,0xd6,0x9c,0x13,0x1e,0xf5,0xee,0x0a,0x10,0xab,0x0a,0x9b,0x77,0xcb,0x75,0x4e,0xde,0x8d,0x25,0x7a,0x53,0x72,0x72,0x6e,0x2b,0x49,0x9c,0x6e,},{0x71,0x5e,0xcc,0xa6,0x36,0x81,0xbc,0x6e,0x9e,0x31,0xd1,0x88,0x48,0x90,0x2f,0x4d,0x96,0xfe,0xaf,0x43,0xb9,0x5d,0x00,0x86,0x42,0x90,0x3b,0x17,0x63,0xbc,0x9f,0xb8,},{0xbb,0x2b,0xab,0x70,0x03,0xf1,0x31,0x1b,0xe9,0xb8,0xc8,0x83,0xfc,0x4f,0xd5,0x28,0xad,0xfd,0x51,0xa9,0xc9,0x9d,0xb3,0xdc,0xa8,0xda,0x0f,0xca,0x95,0x8d,0xa1,0x9a,0x10,0xeb,0x22,0x33,0x26,0x67,0xb1,0xa0,0x06,0x5d,0x3d,0xbc,0x0d,0x06,0x26,0x9a,0x12,0x59,0xb6,0xa8,0x90,0x48,0x4a,0xa2,0x14,0x3a,0x52,0x69,0x5f,0x14,0x5b,0x0a,},"\x08\x7c\xa6\xbe\x2a\x95\x0c\x02\x4b\x3e\x74\x67\xfe\x00\xa7\xd3\x64\x55\x5d\x5d\xc6\x77\x0f\x5e\xbd\x26\x06\x42\x52\x5b\xd3\xc0\xf9\x65\xdb\x36\xd7\xb2\x29\xa5\x74\x21\xee\xc6\x4e\x4d\x99\x1c\xdd\xe5\x91\x23\x03\x44\x70\x55\x3f\x4e\xb0\xbe\x81\xad\x29\x36\xc8\xca\x26\xbc\xab\x4e\x5d\x79\x04\x0e\x29\x79\x87\x28\x60\x16\x84\xa4\x68\x32\x3c\xf3\xba\xae\x4d\x94\x8d\x0a\x1f\xd9\x05\xef\xfe\x16\xdc\x44\x64\x20\x88\xdf\x53\xf6\x38\x8b\xc4\x80\xed\xf4\xaa\x20\x7d\x0e\xd1\x61\xed\xa3\x45\x71\x2b\x4c\x00\xcb\x05\xfc\xf6\x35\xec\x25\x88\x78\x5b\xfb\x8a\x27\xcd\xc2\x89\x96\xa1\xdb\x3e\x67\x87\x02\x33\x93\xc0\x75\xd8\x3c\x90\x38\xfe\xd7\x89\x9c\x55\xfe\xc3\x07\xde\x32\x49\xc1\x4b\xda\x49\xe8\xb8\x95\x86\x09\x42\xc3\x6d\x64\x0b\xb8\x93\x77\x91\x42"}, +{{0xc0,0x21,0x35,0xe7,0xb6,0x5a,0xac,0x72,0xf6,0x3c,0x32,0xbf,0x5b,0xef,0x5b,0x68,0xc7,0xf3,0xb8,0xed,0x56,0x20,0x8e,0x59,0xe4,0x75,0x20,0x70,0xe9,0xd0,0x70,0x95,},{0xdc,0xf6,0x00,0xf2,0x44,0x03,0x7a,0x75,0x20,0x3a,0xe1,0x1a,0xc3,0x16,0xe8,0xdb,0xe9,0x98,0x6f,0x0d,0xce,0x23,0x47,0x39,0x39,0x33,0x4b,0xf5,0xce,0xa4,0x8b,0x0d,},{0xdd,0x5c,0xba,0xe4,0x79,0xeb,0x5e,0x22,0x95,0x74,0xc2,0x1e,0xc3,0xbe,0xd9,0x11,0x11,0x3a,0x57,0xa1,0x91,0x6d,0x33,0x13,0x45,0x75,0x15,0xd5,0x5c,0xc5,0xb6,0xe6,0xeb,0xc5,0x2c,0x93,0xf8,0x21,0xd1,0x39,0x88,0xdb,0xba,0x8d,0xf5,0x09,0x6d,0x55,0xff,0x9c,0x39,0xe7,0xf9,0xd5,0x61,0xcb,0x58,0x93,0x0c,0x96,0xa7,0xa5,0xd6,0x0b,},"\x86\xd9\x49\x13\x50\xd2\x56\x6e\x70\x8e\xd3\x56\x18\x5d\x61\x0c\x73\x46\x5b\x2a\x5c\x70\x12\x91\x99\x58\xaf\x2c\xf7\x6a\xf9\x95\x23\x0d\x36\x0d\xe4\x00\xb7\x13\x71\x70\xdd\x08\x35\xf1\x0f\xcb\xec\x22\x4e\xe4\xe4\x2c\x7d\x1c\xeb\xb7\xf5\x80\xfe\xa8\xed\x62\x23\x16\x3b\xac\xdd\x19\x23\xa5\x72\xcb\xb6\xdc\x26\xca\x8b\x17\xad\xe6\x8c\x6d\x28\x08\xc4\xca\x1e\xca\x28\xea\xe9\xa1\x45\xf6\x8d\x40\x79\xd8\xd5\x9d\x14\x0e\x95\x82\x28\xe7\xe9\x95\x20\xe3\x42\xdb\xd7\x45\x7a\x91\x59\x74\x0f\x48\xbd\xc2\x7b\x93\xbd\xab\xeb\xa4\x65\xcb\xf0\xc8\xdf\x5e\xf2\xc0\xf9\x38\x6e\xeb\xe6\x56\xf5\xd7\x49\xd5\xf9\x14\x7f\x52\x52\x66\x91\x0d\x7b\x80\x39\x6a\x90\xbe\x5c\xc1\x88\xa9\xa9\x45\xf9\x3e\x75\x3f\xc9\x9b\xaf\xa1\x8e\xe0\xa6\xdf\xf7\x9b\xf8\x48\x48\x98\xef"}, +{{0x15,0x4a,0x47,0xeb,0xa1,0xb8,0xc3,0x83,0x62,0xea,0x61,0xfa,0xeb,0x0c,0x0a,0xd7,0xe6,0x1e,0x41,0x2a,0x3c,0xba,0x46,0x88,0xaf,0x0d,0xb2,0xa4,0x87,0x20,0x8b,0x1c,},{0x16,0xde,0x2c,0x89,0x4a,0x50,0xcb,0xd4,0xca,0x90,0x41,0x9a,0x4c,0xa6,0x49,0x42,0xcb,0x14,0xbd,0x33,0x5c,0x5d,0x3f,0x4a,0x53,0xe2,0x39,0xc2,0x80,0xbd,0xa7,0x25,},{0xf4,0xb6,0xeb,0x1a,0x8d,0x95,0x0e,0x88,0x7f,0xd2,0xf3,0x0f,0x70,0xa2,0x3b,0x41,0x87,0x14,0x95,0xbf,0xa5,0xb8,0xa4,0xad,0x39,0x96,0xcd,0x9b,0xf5,0x1e,0xb7,0x42,0xe0,0x7f,0x4c,0x4d,0x2d,0xa4,0xb0,0x1a,0xb0,0x87,0x36,0x7a,0x50,0xe2,0xb6,0x5b,0x3c,0xef,0x51,0x4e,0x40,0xd8,0x37,0x54,0x0b,0x8c,0x89,0x96,0x64,0x85,0x91,0x0f,},"\xbf\x60\x7e\x8b\x6e\x14\xd9\xc8\xac\xd9\x68\x15\xaf\x0c\x03\x5a\xc7\x3c\x41\x04\xc9\x37\x86\xcc\xc1\xc9\xf8\x59\x39\x5d\xd7\x81\x90\x03\x20\xeb\xf3\x56\xaa\x99\x1c\xdc\x9f\x50\x3f\xce\xe9\xf8\x36\x75\x88\x8a\x7d\x59\x20\x02\xd2\xa5\x4a\x57\x3a\x96\x99\x4b\x3f\xa8\x65\x53\x8c\x61\x7e\xd8\xad\x1f\xf6\x20\x18\x28\x8a\x67\x4f\x44\x9b\xe0\xaa\xb5\x22\x2f\x74\xc4\xfd\x47\x5e\xd6\xa8\xdf\xb2\x7f\x45\x28\x7b\x22\xb2\xb6\xc3\xbd\x15\x17\x9f\x26\x7d\x15\x7d\x7d\x8a\x41\x59\x67\x9b\xe8\x5b\x25\xc2\xbb\x2b\xa8\x50\xaa\xed\x9a\xe3\xae\x57\x1b\xe4\xf7\x58\x36\x32\x9c\xf3\x6f\x41\x2c\x1c\x80\xf1\x41\x3b\x76\x61\xea\xb4\xa8\xe1\x1b\x60\x24\x24\x4f\xc6\x23\x23\xff\x02\xe3\x8a\xce\xb1\x73\x7b\xd4\x74\xbf\x1e\x98\x01\x5d\xbc\x78\x8b\x02\x7b\xbe\x21\x7c\xf4\xe7"}, +{{0xd3,0x02,0x84,0x31,0xce,0x2e,0xef,0x73,0xbd,0x94,0x0a,0xb8,0x4c,0xa2,0x9f,0x13,0xfb,0x26,0x43,0x6a,0xa2,0x5e,0x1b,0x7b,0xf2,0x6c,0xb3,0x3f,0x17,0xfd,0xf8,0x17,},{0x63,0xdf,0x20,0x3e,0x28,0x60,0xba,0xc4,0xd3,0x52,0xe7,0x22,0xc1,0xc9,0x1f,0xe3,0x77,0x6e,0x1c,0xbc,0xae,0x85,0x53,0xa4,0xf1,0x98,0x90,0x26,0x0b,0xf0,0xe4,0x57,},{0xce,0x97,0x29,0xa9,0x6c,0x3e,0xd2,0x89,0x43,0xb2,0x78,0x39,0xc7,0x33,0x82,0xec,0xd5,0x72,0x96,0x0c,0x1f,0x9e,0x90,0xc5,0xef,0xf9,0xdd,0x49,0x9f,0xf4,0x8f,0x17,0xd2,0x5e,0xdd,0x12,0x68,0xef,0xfe,0x41,0xee,0x6a,0x81,0xce,0x48,0xd8,0x4d,0xe5,0x13,0xdf,0x9c,0x41,0x44,0x26,0x21,0xb2,0xf5,0x49,0x1e,0x34,0x6b,0xe1,0x8c,0x04,},"\x08\x63\x35\xd6\x12\x75\xd1\x68\xea\xac\x05\x40\x47\x7f\x50\xd4\xb1\x5f\x9e\x50\xb9\xbe\x69\x39\x21\xed\x54\xa9\x94\x1b\xc4\x06\x43\xcd\xa6\x2e\x1d\x80\x5d\x02\x50\xa8\x11\x46\xbd\x5f\xe2\xd3\x9e\x81\x44\x4d\x21\xe2\xb2\x1b\x03\x1c\x11\x13\x06\xca\xcb\xf5\x27\x17\xf6\xfb\x4c\xd3\x41\x6f\x12\x15\xf8\xdd\xdc\xed\xd2\xf0\x09\x6b\x0f\xcf\xa0\xa6\xcc\x2c\xde\x7a\x2b\xab\x7f\x1e\x32\x79\x0b\x53\x61\xdf\x36\x71\x42\x4c\xc7\x22\xf2\x31\xbf\x71\x89\x5b\xcd\xcb\x7b\x22\xee\x07\x4e\x8f\xb4\xa9\x67\x85\x04\xe7\x35\x36\x6c\x17\x2f\x07\x63\x7b\x7a\x93\x14\x9b\xb2\x1f\x38\x88\x33\x78\xa1\xdb\x27\x3f\xc2\x32\x39\xe3\x53\x37\xf9\xce\x56\x6d\x8d\xdf\x3b\x31\x33\xca\xd7\xf2\xce\x81\xed\xb5\x03\xce\x1d\x27\xc5\xa6\x57\x16\x0b\x78\xdc\xa9\xae\xae\xa3\x79\xbe\x9c\x85"}, +{{0xee,0x89,0x85,0xdc,0x27,0x50,0x44,0x40,0xa8,0x75,0x8d,0x4c,0x53,0xe4,0x22,0x52,0x15,0x79,0x7a,0x00,0xcd,0x86,0x31,0xd5,0x9b,0xd9,0x3b,0xc6,0x6f,0x37,0x3d,0x5e,},{0xcd,0x64,0x7b,0xb0,0x65,0x69,0x3d,0x48,0x65,0x89,0x15,0x6a,0x9f,0xa2,0x61,0x43,0x75,0x34,0xdc,0x86,0xf4,0x6f,0x72,0xd0,0xa8,0x00,0x39,0x9a,0x7a,0xf0,0x10,0xf7,},{0x5b,0xd6,0x0a,0xd5,0xe9,0xba,0xd9,0x93,0x2c,0xa9,0xc7,0x5f,0x23,0x1a,0x76,0x88,0x9a,0xe7,0xa8,0xb8,0x64,0xb9,0x1d,0x1f,0xcb,0xa5,0xc5,0xd4,0xbf,0xa1,0xd9,0x28,0x38,0xad,0xb9,0x74,0x84,0x2a,0x07,0x10,0x77,0x9b,0x3e,0x30,0x94,0x04,0x49,0x09,0xe9,0x2c,0x7c,0xf0,0x46,0xce,0x51,0x9f,0x4c,0x68,0xe8,0xf1,0x9e,0xc0,0x3c,0x02,},"\xf2\x22\x04\x85\xad\xdf\xeb\xce\x02\xa8\x33\xac\xa3\x33\x81\xd1\xdf\x91\x7e\xd6\x09\x95\x0e\xd2\x4f\x85\xe3\xb0\x2b\x2b\x99\x4b\x4d\x93\x97\x84\xe3\x32\xf4\x10\x64\xc8\xb4\xa2\x63\x0a\xb3\x69\x61\x74\x2a\xa1\xcf\xfd\xcb\x08\xc1\x44\xee\xae\xde\xaf\xd4\x8b\x5d\xbe\x96\xbf\x24\x35\x0e\x14\xfd\x68\x28\x6b\xc0\x8e\xea\xef\x8b\xc6\xad\x9e\x19\x5d\x14\x84\xaf\xcd\x30\xaf\xa8\xce\xd4\x84\x81\x26\xd5\x6c\x81\xb4\x3c\x27\xa5\xdb\xbd\xec\x1a\x50\xc1\x10\x62\xce\x21\xc6\x1d\x86\x0c\x25\xa8\x62\xfb\xb7\x5c\x3b\xd5\x1c\x8d\xc0\x76\x36\x66\x86\x69\xbb\xf7\x51\xea\xca\xcc\xb3\xb5\x1d\x2c\x0d\x41\x40\x31\x6c\xfc\xe2\xeb\x18\xd2\x90\x8c\xec\xd5\xa1\x88\x67\x9b\xc5\xf5\xde\x29\x0f\x54\x8e\x7e\xbc\x57\xd4\x1b\x58\x9a\x24\xce\x88\xee\x48\xd9\x7e\x8d\x0c\x7c\x76\x99\x60"}, +{{0x80,0xdf,0xe2,0xbf,0x73,0x87,0xba,0xd4,0x65,0x4e,0xb0,0x76,0xf8,0xda,0xe9,0x59,0x51,0x63,0xe4,0x01,0x27,0xf5,0xdf,0x49,0x2d,0xad,0x7d,0xf0,0x4c,0x72,0x21,0xc4,},{0xd1,0x78,0x3c,0xee,0xb9,0xcf,0x8e,0x4d,0x07,0x76,0x4c,0x47,0x3f,0xa4,0x06,0x1b,0x82,0x74,0x39,0x71,0x03,0xf2,0x07,0x6d,0x70,0x32,0x49,0xd7,0x58,0xb8,0xfb,0xd5,},{0x27,0x27,0x9e,0x3c,0xdc,0xb0,0x3e,0xf5,0x57,0xa5,0xde,0xfc,0x2f,0x6c,0x58,0x12,0x8a,0x6d,0xc3,0xf8,0xb0,0x38,0x59,0x58,0x01,0x4e,0x70,0x9c,0x1f,0x61,0xb0,0xae,0x6b,0x40,0x35,0x76,0xf0,0xe4,0x54,0xd5,0xe4,0xc6,0x4c,0x17,0x31,0x38,0xee,0x4b,0xbd,0x5f,0xe7,0xb6,0x0d,0x06,0xc5,0xab,0xe2,0x3f,0xe9,0x9e,0xe3,0xb4,0x6a,0x00,},"\xaa\x09\xd7\x84\xbb\x09\xdc\x99\x99\x31\xeb\xb4\xc0\x0e\x42\x4c\xef\xec\xa1\x04\x81\x8d\x8e\xaf\x06\x61\xf0\x97\x28\xad\x02\x5e\xf4\x73\x93\x21\x05\x71\xf1\x74\x04\xe9\xaa\x6d\x8c\xbd\x5f\xd8\x8c\xd7\xdf\xb8\xe2\xe8\xa1\x08\xc0\x5d\xe2\x06\xf3\x40\x82\x34\xa3\xb4\x63\xdb\xe7\x1a\x07\xd0\x55\x87\x32\x45\x24\xb7\x32\x6e\xe7\x9d\x33\x48\xdd\xbe\xd7\x87\x1b\x86\xfc\xb4\x88\x03\x1d\xc9\xea\x93\xf6\xb8\xd7\xfd\xa6\x23\x93\x48\xa5\x62\x44\x4f\xaf\x1e\x72\xd3\x1a\xf3\x54\x43\xe9\xdf\x53\xe7\x62\xf3\xe5\x6b\x48\x66\x8f\x97\x84\xb3\x36\x8a\xb2\x78\xa4\x8e\xf4\x54\x6a\x26\xcf\xad\x0d\x0a\x51\x61\x69\x8f\x26\xee\x8d\x34\xfc\x2b\x3d\x6d\xfb\x93\xb0\x09\xac\x29\x6f\x6a\xfe\x48\x7e\xe3\x35\xea\xc9\xf0\x2c\xfc\xae\x5f\xcb\xd1\xa1\x6b\xa4\xe7\x1b\xe1\xb1\x12\x56\x2f\xc2"}, +{{0xda,0x1f,0x86,0x85,0x42,0xcd,0x7c,0xce,0x7a,0x5c,0xa3,0xfa,0x3c,0x24,0x08,0x1b,0x4d,0x23,0x44,0xb2,0x1a,0x15,0x7f,0x02,0x64,0xa3,0x47,0x13,0x2d,0x19,0x65,0x9d,},{0xcb,0x3a,0x25,0xa5,0x3f,0x27,0x2e,0xa8,0x13,0x80,0x44,0x68,0xd6,0x50,0x0e,0x96,0xa1,0xea,0xf8,0x22,0x70,0x5b,0x77,0x90,0xa8,0xac,0x3e,0x98,0xcc,0x4e,0x52,0x4b,},{0x75,0xc5,0x17,0xad,0xe4,0xf0,0x8d,0x77,0x46,0x30,0x57,0x43,0xd1,0xa7,0x76,0xc3,0xc5,0x5e,0xb5,0xee,0xdf,0xdf,0xcb,0x5e,0xb1,0xd5,0x63,0x4a,0x1b,0xda,0xf7,0xa4,0xb8,0xd2,0x41,0x87,0xd6,0xc8,0x85,0x0e,0x3c,0xed,0x65,0x67,0xa0,0x3c,0x4c,0x59,0x38,0x9a,0x4c,0xf4,0x71,0x14,0xce,0x54,0x73,0x16,0x0f,0x23,0x05,0x46,0xe6,0x0d,},"\xc6\x98\x7e\xf3\x80\xd5\xd0\xe7\x41\x96\x44\x3a\xaa\x3a\x32\x35\x6c\xbc\x02\x63\x6c\x5a\x4b\x6d\x62\xa8\x11\x4b\x21\x11\xbc\x1a\xbd\xdd\x9e\x44\xb3\x67\x2c\x18\xb5\x8d\x4e\xf5\x91\xaf\x45\x62\xe0\x20\x04\x9f\x8e\x12\x74\x68\x8e\x1f\x8e\x52\x96\xd2\xf9\x25\x2e\x7f\xc8\x4c\xd1\xd0\xc5\x8e\x98\xf0\xf1\x60\x53\x0a\xa2\x2c\x87\x1e\xef\x65\x2e\x71\x97\x4c\xe9\x1b\x4a\x65\xfc\x25\xfd\x09\xfa\x1b\x6c\x32\x08\x6e\x98\xec\x70\x8d\x9a\xbc\xb1\xd9\xcc\x8e\x1a\x08\x9e\xd8\xdb\x22\x06\xee\x95\x70\x23\x6a\xd6\x9b\x3d\xe6\x82\x18\x62\xfd\x2c\x70\xcd\x83\xa3\x2a\x68\xb0\x48\x62\x29\x55\x3d\x92\x8d\xe4\x8d\x03\xa1\x04\xe8\x73\x81\x96\x4a\xbe\xa7\x66\x83\x97\x6d\x52\x7c\x84\x16\x3a\x12\xee\xe0\xa5\x59\x86\xcf\x14\x31\xe9\xc8\x6c\xba\x81\x82\xca\x94\x68\x9b\xac\xd1\x65\xfb\xce"}, +{{0xf1,0x3d,0xae,0xc0,0xef,0x33,0xdd,0xd1,0x33,0xc7,0xd2,0x44,0xd1,0x0f,0xd2,0x7d,0xdb,0x23,0x70,0x52,0x80,0xff,0x5f,0x18,0x15,0xf0,0xf6,0x56,0xd8,0x36,0xfe,0x84,},{0x2d,0xc7,0xf1,0x36,0x7d,0xe6,0x72,0xc5,0x1e,0x00,0x5c,0x74,0xf8,0x76,0xf9,0x82,0x59,0x39,0x96,0x87,0x3a,0xcb,0xa0,0x79,0x29,0x27,0x34,0xc2,0x09,0xc2,0xb1,0x11,},{0xdb,0x77,0x18,0x33,0xf7,0xfd,0xba,0xcd,0xab,0x2b,0x5c,0xc8,0x0e,0xed,0x50,0xaf,0xdf,0x13,0x78,0x3b,0x7f,0xe5,0xe9,0x03,0xd5,0xdb,0xb4,0xc2,0xe5,0x35,0x31,0x6a,0x6e,0xef,0x4c,0x34,0xf0,0x04,0xd2,0xb9,0xa4,0xe2,0x70,0x0b,0xd6,0xe2,0xac,0xdd,0x56,0x4c,0x3c,0x80,0xcc,0x68,0xa3,0x03,0xf5,0xfb,0x09,0x1c,0xb4,0x34,0x0f,0x0a,},"\xec\x02\xff\x18\x04\xb2\xb3\x09\xaf\x31\x58\xb6\x62\x72\xa1\x4a\x3a\xad\x83\xc4\x1a\x71\x98\x46\xf7\x08\x8c\xa9\x79\x2a\xf5\x75\xc7\x89\x13\xc4\x32\x75\x9f\x0b\x9a\x74\x8b\xdc\x55\x68\x49\x6e\x41\x65\x8c\xc1\xcd\xb8\xda\x6c\x91\xd0\x7c\x3e\xc2\xf4\xaf\x50\x42\x49\xb9\x96\xaa\x00\xc0\x07\x1c\xdf\xa7\x93\xf8\x2d\x0e\xc5\xd2\x67\x26\x2f\x51\x8f\xc0\x29\xb8\x8e\x20\xb6\x20\x1f\xb9\xe0\x5a\xbd\x3f\x95\x24\xc5\xda\x2f\xa8\x97\x8f\xf2\xef\xd4\x81\x20\xcf\x00\x82\x2d\x1b\xee\x90\xdf\x81\x61\x25\xd8\xed\xc0\xcf\xb5\xde\x66\xd1\x6b\xe6\x38\x96\xa4\x12\xa6\x2b\x03\x1b\x71\x18\xac\x13\xfe\x2c\x9f\xaa\x6b\x1a\x33\x42\xf9\xcc\xf7\x88\x41\x66\xcf\x48\x9a\x84\xde\x26\xb5\xce\x5b\x21\x85\x6a\x3a\xf2\x89\xbc\x66\x22\xc0\xaa\xb9\xf2\x14\x2d\x39\x3f\x5d\x4b\x23\x67\x79\xdb\xb0\x66"}, +{{0x42,0xdc,0x16,0xc5,0x7f,0xb6,0xf1,0x28,0x94,0x5f,0xa1,0x01,0xe0,0x5b,0xbf,0x54,0x8e,0xf7,0xd9,0x77,0x26,0xb6,0x92,0xfe,0x40,0x40,0x69,0xcc,0x57,0xcc,0xef,0xa0,},{0x0a,0x1b,0xa5,0xdf,0x52,0x39,0x96,0xf9,0x54,0xb3,0x4d,0xdc,0xfa,0xba,0xd3,0xf3,0xde,0xe2,0x1a,0x5f,0xa7,0xa4,0xce,0x32,0x2d,0x21,0x6b,0xd8,0xcc,0xaf,0x43,0x8c,},{0xc7,0x59,0x77,0xe8,0x3b,0xcf,0xe9,0xdf,0x72,0x92,0xa8,0x60,0xed,0x97,0x25,0x55,0xb5,0xc2,0x44,0x16,0xfd,0x4b,0x7e,0xe3,0x28,0x53,0x88,0xfa,0x5b,0x14,0x47,0x60,0x8e,0x4a,0x34,0x78,0x13,0xcf,0xe0,0x93,0x51,0x2a,0x76,0x51,0xe4,0x22,0xe9,0x86,0x7d,0xb7,0xb9,0x7c,0x0b,0x08,0x67,0xf0,0xb8,0xc7,0xb7,0xf4,0xf0,0x2c,0x31,0x0d,},"\xf2\x71\x4c\x23\xa3\xa6\xfc\x11\xad\x15\xc9\x80\xb7\x35\x0f\xc8\x42\x17\x87\x76\x61\x18\x80\x55\xff\x75\x0d\x82\xc4\x9c\x5f\xef\x7b\xc8\xe6\xaa\xc5\x74\xa1\xb7\x9a\x3f\x26\xd1\x69\x69\xc0\xf4\x06\xee\xab\x3e\x9e\x12\x85\x0a\x55\x70\x97\x45\xe3\x0d\xff\xa6\x2a\x69\xdf\xb2\xb6\x4b\x3c\x1b\xd2\xbc\x35\x86\xe2\x6d\x4e\xea\x71\x4d\x2a\x7b\x71\xcf\x79\xfb\x8f\xfb\xf2\xaa\xad\x00\xca\x3e\x4f\x2b\x6f\x50\x3c\xc1\xfe\xf2\xea\xb3\x65\x6f\xb4\x4f\x8d\x62\xa8\xdb\x8a\xb5\x8f\x39\x46\x93\x94\x9e\xea\x57\xfa\xfe\xcf\x00\x5f\x6e\xbf\x12\x87\xdb\xa4\xd2\xd6\x23\xc0\x2e\xa1\x71\xf5\x67\xe5\x26\xad\xd2\x07\x09\xeb\xca\xb9\x62\xf8\x3d\x98\xef\x66\x8e\xbd\x01\xef\x20\x48\x8b\x36\x65\xe3\xa4\x46\xfb\xfb\x13\xd3\x40\x50\x94\x2c\x74\x9b\xb2\xdf\xfc\x76\x63\x67\xfd\x45\x2e\x68\xe5\xb0\xc6"}, +{{0x90,0xb4,0x55,0xc6,0xbb,0x9c,0xec,0x83,0xe1,0x37,0x35,0x70,0x65,0x33,0x9d,0x03,0x05,0x25,0xd0,0xea,0x7f,0x5b,0x92,0x3a,0x2d,0x59,0x72,0xc3,0xc1,0x2a,0xa3,0x7b,},{0x5c,0xef,0x03,0x8c,0x16,0xbf,0xa4,0xb4,0xc9,0x23,0xa0,0xfe,0x70,0xcd,0x7f,0x25,0xc8,0xbc,0x83,0x7f,0xdf,0x5a,0x7e,0xfb,0x9d,0x95,0xf2,0x1b,0x96,0xbe,0x92,0x5a,},{0xc9,0x34,0x5e,0xec,0x2c,0x4a,0x0a,0xec,0x73,0x23,0x86,0x49,0x4a,0x69,0xa3,0xfc,0xe8,0xb8,0xa1,0xbe,0x36,0x6b,0xbe,0xd1,0x65,0x9f,0x13,0x1f,0xe9,0x7c,0xc0,0x37,0xfb,0x1b,0x7c,0x1b,0x68,0xb0,0xf3,0x02,0x39,0x45,0xd2,0x00,0x90,0xa0,0xcd,0x2c,0x15,0x53,0xa4,0x7f,0xae,0xc4,0xd6,0x6f,0xd8,0x16,0xce,0x12,0x11,0x68,0xf3,0x09,},"\xc6\x2c\xfd\xb9\xd2\x1e\xee\x6b\xe4\x7f\x30\x72\x7a\xae\xe5\x1f\x07\x03\x78\x9a\x43\x1d\x32\x22\x85\x33\x35\x02\x17\xa9\x3a\x18\x90\x06\x69\xc9\x59\x56\xf3\xf2\xae\x90\xdc\x74\x5a\x71\xe1\x83\x40\xd0\x58\xd1\x6b\x4c\x6f\xe3\x3b\x64\xaf\x8d\xad\x97\x3f\xe5\xdc\x02\xe8\x52\x07\x05\xc7\xa8\xbb\x3c\xcb\xe1\x83\x8c\x6c\x24\x93\x37\xf9\xb6\xa4\xc0\xe1\xf8\xa4\xe5\xd1\x03\x19\x6f\xa7\x99\x98\x92\x3d\x04\x22\xe9\xd0\x79\xa7\x2c\xc2\xa8\xf8\x6d\x65\x90\x31\xa6\x07\xd4\xcc\xa0\xb9\x47\xb3\xab\xee\xee\xf6\x4c\x28\xda\x42\x0d\x05\xde\x66\x5a\x55\x10\xfe\x55\xf7\x75\x98\xec\xad\x7f\xaa\x0a\xc2\x84\x80\x0b\x53\x82\x93\x94\xc4\xae\x90\xbe\x66\x67\x8f\xf0\x4a\xb4\x6d\xa2\x65\xae\x06\x40\x2d\x8c\x83\xca\xd8\x4d\x61\xa0\x51\xde\x02\x60\x55\x98\x88\xe7\x79\xf7\x4b\x72\xa5\xd7\x1c\x13\x2f"}, +{{0xdc,0x18,0x5c,0x2b,0xa0,0xb3,0x78,0xdf,0xe5,0xdd,0xa5,0x10,0xc3,0x2f,0xef,0xf5,0x35,0xca,0x2e,0x8a,0x02,0x43,0x4b,0x32,0x6e,0x01,0x58,0xbc,0x87,0x8e,0x88,0x48,},{0x33,0xd6,0xcc,0x05,0xa4,0x34,0xe4,0x19,0x28,0x0d,0x58,0x64,0xa1,0xaf,0x20,0x9a,0x2c,0x67,0x68,0x14,0xb7,0x0f,0x72,0xf8,0x14,0x1a,0xc7,0xe0,0x57,0x3e,0xe6,0x3e,},{0xf1,0xe4,0x45,0x14,0xd2,0xec,0xbc,0xc8,0xd1,0xa7,0xe8,0x4b,0xf5,0x84,0xce,0x73,0x18,0x35,0xe9,0x89,0x4f,0x88,0x97,0x4f,0x09,0x8d,0x45,0x6b,0x60,0x71,0x8f,0x57,0x5e,0xf4,0xd8,0x06,0x2f,0x21,0x82,0x50,0x42,0x50,0xcf,0x83,0xbb,0x2a,0xf2,0xa7,0x9b,0x1f,0x58,0xa6,0xa9,0x7b,0xd9,0x8d,0xa4,0x67,0x13,0x2d,0x7b,0xec,0x2f,0x05,},"\xe2\x76\xb1\x19\x12\xcc\xa5\xa8\x4b\xba\x65\x0c\x17\x2a\xef\x3a\x4d\x5f\x91\xac\x72\x29\x13\xbb\x89\x1a\x3a\xb0\x42\x4a\xb0\x7e\xa7\x09\xcb\x8b\xba\x3a\x3d\x11\xf8\x2f\x51\xc2\xaf\x01\x62\xa8\x2f\x72\x19\xce\x27\xb3\x5a\x30\x50\x7d\x53\x6a\x93\x08\x17\xe4\x0f\x85\xa2\x2a\x5a\x43\x2b\x94\xd1\x92\xc3\xc8\x91\x17\x77\xcf\xdb\x7f\xe9\x37\xa6\x75\x02\x77\x0d\x6d\x75\x75\x3d\x3a\xe8\x82\x29\xe0\x8f\x1e\xd2\x3b\x43\x28\xd8\x62\xac\x61\x86\x3c\x06\x3e\xa9\x84\x8f\x8a\xb9\x6a\x02\x13\xd7\xb9\x36\xc4\x8f\xe7\x54\x83\x6c\x98\x48\x78\x59\xd1\x99\xb3\xd9\x40\x39\x27\x16\xa1\xd5\x69\xe6\xc0\xcb\x1b\xa9\x18\x93\x2c\xf8\x85\x25\xe2\x56\xc8\xab\xb1\x1a\xaf\x0b\x45\x46\x55\xd5\xdb\x55\x71\x3c\xeb\xba\x28\x7a\xe2\x02\x65\x1a\xc8\x72\xbf\xc8\x0f\xea\xa7\xe0\x0d\x47\xc0\xbe\x38\xe6\x58\xf7\xc5"}, +{{0x90,0x72,0x1c,0x43,0xbc,0x36,0x6f,0x24,0xbf,0x4e,0x8c,0x99,0x3e,0x13,0x80,0x24,0x68,0x2f,0x10,0x29,0xdb,0xa3,0x5a,0xbe,0xb0,0xd6,0x0c,0x7f,0xa7,0x10,0x02,0x1c,},{0x7c,0x63,0xa2,0xf1,0x3b,0x7b,0x22,0x0a,0x0b,0xb7,0x52,0xe3,0x80,0x07,0x53,0xb8,0xb6,0xb3,0x26,0x69,0x37,0x8c,0xe1,0x31,0xbb,0x77,0xa9,0xa8,0xd2,0x30,0xe9,0xae,},{0xd2,0x06,0x4a,0x6d,0x6c,0x99,0xc6,0xc3,0xf1,0x52,0xd2,0xd4,0x35,0xf2,0x4e,0x34,0xb5,0x45,0x9b,0x08,0x2e,0xf1,0x1e,0x94,0x4a,0x77,0xff,0x54,0xdd,0xf9,0x86,0x27,0x37,0xec,0xb2,0xac,0x8d,0x54,0x20,0x7d,0x36,0xc5,0x1a,0xd4,0x1f,0x36,0x49,0x0a,0x11,0x1b,0xa8,0x0e,0x12,0x6b,0xfe,0xcb,0x09,0xde,0xf6,0xac,0xcb,0xdf,0x88,0x0e,},"\x65\x1c\x96\x17\xca\xc9\x58\xc7\xed\xd4\xa5\xf3\xfe\xdf\xb8\x3d\xc9\x71\xab\xfb\xb6\x9a\x31\xe8\x98\xcc\xa8\x47\x2e\xf0\x68\x03\x4a\x6d\x23\x76\xee\x0e\x72\xd0\xa9\xbf\xee\x27\x57\x96\xc3\x79\x5a\xda\xc8\xeb\xe1\xd1\x2b\x66\xec\x26\x8f\x6b\x75\xfa\x39\x41\x15\x4f\x99\xe2\x23\xfa\xf2\xcb\xab\x5b\x92\xe2\xb3\xba\x7b\x79\xbe\x77\x00\xef\x9d\xba\x69\x25\x3c\xce\x53\x56\xb0\xc4\xe7\x47\x03\xcf\xca\xfd\xb5\x54\x68\x50\xb4\x62\x32\x67\x5c\x90\xc0\x2d\x5e\x42\x6d\x33\xd6\x0c\xeb\xf0\xc7\x93\x01\x82\x37\x9d\xbb\x00\x7f\x53\x61\x63\xc8\xdd\xbb\xd3\x15\x7b\xb2\xda\x62\x34\x01\x33\xf0\x0a\xe2\x68\x2e\xc6\xba\xa6\x41\x6b\x5a\x01\x52\x1c\xc1\x0e\x04\x69\x52\x95\xf2\xe5\xb9\x4c\x05\xf0\x03\x83\xff\xe9\x54\x83\x07\x97\xf6\xdf\x82\x31\x72\x53\x2f\x98\x16\x5f\xe3\x14\xab\x32\x59\x29\xaf\x83\x85"}, +{{0x9c,0xec,0x24,0x67,0x58,0xe4,0x12,0xe7,0x37,0x8b,0x45,0x79,0xea,0xfe,0x9f,0xac,0x5a,0x25,0xd5,0x40,0x5f,0x92,0x70,0xb5,0xd7,0xe5,0x43,0x41,0x4e,0xc3,0xd5,0xda,},{0x97,0x5a,0x9e,0x6a,0x15,0x2c,0xae,0xbb,0x2f,0x9d,0xd0,0xde,0xb7,0x6d,0xd9,0x22,0xb6,0xdc,0x77,0x05,0x5d,0xda,0x03,0xfb,0xae,0x9e,0x7c,0x68,0x5d,0x07,0x3a,0xa1,},{0x9b,0xad,0x1e,0x3b,0x12,0x79,0xef,0x65,0x8f,0x4d,0x07,0x16,0x44,0xc6,0x3a,0xe2,0xb7,0xa7,0x80,0x35,0x7e,0x9d,0xc4,0x26,0xf1,0x65,0x0e,0xc0,0x63,0x4d,0xfc,0x52,0x0f,0x8e,0xda,0x9d,0xc8,0xf1,0x0a,0xa7,0x32,0x4c,0x59,0x42,0xd2,0x34,0x7f,0xf8,0x80,0x2b,0xd9,0x0e,0x95,0xfc,0xec,0x31,0x33,0x52,0xcd,0xae,0x64,0xf3,0x2a,0x04,},"\x17\xec\x9b\xd4\x7a\xdd\x6c\xcf\xbd\x78\x7a\xf0\xd9\x01\x3e\x9c\xc9\x79\xaa\xf8\x50\xe0\x94\x26\xd3\xb2\x8e\xdf\xd7\x12\x96\xeb\x31\xff\x8b\x21\xc5\xfe\x7b\xe0\x50\xf5\x36\x32\x4c\x3e\xc4\x88\x50\xe0\xb5\x08\xa3\x6b\xb4\xcb\x7e\x75\x4b\x32\x71\x83\xa1\xb3\x94\xd8\x8a\x79\x41\xd1\xce\x8d\xac\x62\xa5\xd8\x29\x18\x74\xd7\x84\x85\xe5\x1f\x29\xed\x05\x86\x5a\x20\x6e\x52\xec\xb1\x2c\x5d\x10\x7d\x4f\xf9\x6f\x25\xd3\xc5\xd1\x81\xd2\xc4\xba\x64\x63\x60\x0d\xb1\xcc\xa3\x28\x57\xfc\xf5\x97\xcb\xdf\xb2\xfd\xa2\x70\x8a\x8a\xba\x28\x1b\x43\xc3\xd2\x8c\x4a\x4e\x79\x83\x36\x15\x09\xf6\x1a\x10\x74\xe6\xf0\xad\x61\x01\xc7\xb5\x67\xee\x40\x78\xe9\x83\x9c\x47\xf4\x65\x31\xb7\x29\xff\x0e\xfe\xef\x7c\x9d\x1a\x8d\x83\x3d\x9c\x0f\x42\x81\x2a\x34\x18\x7c\x3a\x77\x8c\x16\x5c\x09\xd6\x45\x9c\x9c\x7c\xea\xa2"}, +{{0xd1,0x40,0x3f,0x63,0x20,0x2e,0x08,0x05,0x25,0x84,0x3b,0xde,0x25,0x5e,0xeb,0x6b,0x67,0x83,0xc1,0xca,0xae,0x9d,0x6e,0xd0,0x0b,0xa6,0x08,0x05,0xbe,0xd1,0x94,0x1f,},{0x23,0x8a,0xea,0x3a,0xd6,0xd6,0xf2,0x77,0x83,0xe7,0x05,0x16,0xbb,0xfc,0xca,0x47,0x70,0x36,0x6b,0x50,0xed,0x0f,0xe6,0xa4,0xe9,0x66,0xb5,0x3a,0xf1,0x21,0xa7,0x21,},{0x8e,0x60,0xe7,0x3c,0x06,0x38,0x16,0x79,0x5e,0x29,0xf5,0xd6,0x4e,0xce,0x11,0x59,0xf1,0xb5,0xd5,0x02,0x1a,0x6f,0x8f,0x65,0x5e,0x26,0x1a,0x4d,0x00,0x26,0xf5,0xb9,0x4f,0xf2,0x92,0x32,0x50,0x49,0x9d,0x99,0x52,0x98,0x48,0x05,0x12,0xe4,0x12,0x62,0x76,0xaa,0x4a,0x22,0x6d,0x01,0x5a,0x95,0x82,0x7b,0x3c,0xe6,0x92,0xe2,0x33,0x02,},"\xc4\xf1\x7d\x44\x2f\xba\x4c\xa0\xdf\x8d\xc1\xd0\x62\x8d\x7d\x7f\x36\xb6\x0b\x57\x58\xd7\xc1\x3b\x80\xb8\xf9\x7a\x62\x12\x4d\x96\xa2\x3b\x27\x95\x65\x49\x5a\x8a\xcc\xab\x59\x97\x11\x5b\x13\xa4\xba\x22\x0a\x73\x95\x7e\xb7\x93\x05\x20\xac\xbb\xfb\x6f\x54\xcf\x68\x72\x6b\x64\x50\xc6\xff\xa9\x47\x0b\x05\x5e\xa2\x62\x91\x4e\x2b\xc6\x12\x63\x3f\x1a\xc3\xd0\x61\x8a\x23\xdf\xf1\x88\xa7\x33\xd7\x6b\xcb\xcc\x46\x0f\x52\xab\x61\xe1\x99\x38\xf9\xc8\xca\xaa\x79\x2c\x20\x8d\x1f\x6c\x75\x47\x28\x90\x5f\xda\x51\xd8\x81\xa3\x47\xa5\x3d\xa7\x44\xd3\xba\xad\xc0\xa7\x6c\x47\x4c\x55\x86\x80\x26\x90\x95\xf9\x08\x4a\x74\x47\x1d\x5c\x09\xff\xc2\x91\x41\xb5\xbf\xaf\x49\x54\xdf\xac\xbc\xa6\x63\xd0\x37\xb1\x7e\xbf\x95\x59\x88\x22\x33\xe5\xca\x5a\x8b\xf7\x5c\xca\x4f\xc9\xc5\xa4\x10\x9f\x32\xe1\x45\xf3\x85\x3b\x17"}, +{{0xbd,0xf6,0xbd,0xc3,0x1a,0xb0,0xb5,0x31,0x37,0x84,0x48,0x3a,0xbe,0xca,0x6e,0xa5,0xe9,0xcd,0xc6,0x8f,0x81,0xb2,0x1f,0x35,0x0d,0x09,0xc3,0x90,0x7b,0xb9,0xb6,0xa1,},{0x03,0x62,0x77,0x12,0xb7,0x55,0xe5,0x06,0x9f,0xb9,0xab,0x8f,0x9e,0x89,0x97,0x24,0x02,0x9a,0x7f,0x26,0x8a,0xf9,0x39,0x88,0x21,0xee,0xec,0x93,0x60,0xc9,0x28,0x5b,},{0x38,0xfa,0xc6,0x03,0xed,0x24,0x6f,0x83,0x3f,0x1c,0x0f,0xd4,0x58,0x56,0x98,0xb0,0xa7,0x13,0x05,0xef,0xf0,0xd1,0x4a,0x00,0x49,0xb3,0xce,0xf0,0x73,0xbd,0x03,0x6d,0xd4,0x51,0xb3,0xda,0xba,0xda,0xae,0xae,0xa2,0xae,0xaf,0x83,0xd3,0x95,0x74,0x6f,0x4e,0x86,0x86,0x6a,0xda,0x97,0x1c,0xbe,0x48,0x2e,0xdb,0x04,0x19,0x33,0x2f,0x0e,},"\x90\xa6\x6a\xaf\xa5\x64\x2a\x98\xe7\x9f\x0d\x88\x14\x70\x80\x16\x7b\x11\xe4\x46\x65\x18\xf1\x95\xcd\xdd\x89\x40\xd1\x2e\xe4\x91\x8d\x31\xa6\xd4\xcb\x77\xd0\xbf\x5a\xf2\x99\x83\xbb\xe5\x08\x56\x10\xa7\x9d\xaf\x0c\x75\xa7\x8c\xcb\xcf\xfb\xbd\xab\x21\x89\xc3\x94\xae\x24\xe2\x65\xbd\x8c\x55\xfd\x3f\x40\x98\xe1\xb1\x75\x57\x75\x49\x51\x8e\x7a\x4d\xcf\x74\x52\x08\x6d\xd1\x27\x8d\xd5\x8e\xa4\xc0\xaa\x69\x0e\x91\x79\x51\xef\x39\xfc\xff\x60\xcb\xfa\x1e\x90\x91\x0b\xab\x53\x74\x92\x8d\x47\x22\xf7\x02\xbf\x5a\xd6\x02\x8f\xfd\xa6\x54\x1f\xa5\xba\x1a\x37\x79\xec\x78\xb0\xa9\x5f\xe3\x85\x0c\x74\x8b\x6c\x8f\x42\xf3\x30\xec\x79\x54\x1a\x52\xa1\xcf\x57\xdb\x72\xdf\x4f\x92\xce\x7f\x74\x8a\xee\xf1\xaf\x33\xbc\x5a\xe0\xa8\x2c\x89\xdf\xf2\x16\xf2\x3a\xec\x16\x8a\x7d\xbb\x51\x0a\xa6\x32\xda\xab\xcc\x97\x1b\x3f"}, +{{0x57,0xb3,0xb1,0x4a,0xce,0x1c,0xd0,0xcd,0x60,0x3e,0x63,0x28,0xbd,0x21,0x9e,0xe7,0xd9,0xd0,0x94,0x48,0x7f,0xa6,0x68,0xf2,0x8a,0xee,0xc0,0x2b,0x43,0xc9,0x09,0xa7,},{0x24,0xe6,0xb6,0x39,0x5f,0x97,0xea,0x0e,0x23,0x71,0x86,0xd4,0x69,0xb7,0x19,0x23,0xd2,0x11,0x3a,0xdf,0x40,0x3b,0xee,0xeb,0x4a,0x2d,0x27,0x90,0x9a,0xaf,0x3e,0xda,},{0xfc,0x79,0xfd,0xc6,0xd0,0x90,0x88,0x7a,0x61,0xe4,0x3c,0x6b,0x91,0x87,0xb6,0x57,0xd2,0xe4,0xd9,0xcb,0xaf,0xd6,0xe7,0xca,0xeb,0x7e,0xbd,0xea,0x84,0x28,0x25,0xb7,0x8f,0xb9,0x49,0xd2,0xc4,0x9a,0x0c,0xf3,0x8b,0x6c,0x73,0x29,0x6d,0x82,0xc8,0xdd,0xeb,0x1f,0xe2,0xd4,0x0a,0xad,0xdd,0x79,0x64,0xda,0x68,0xac,0xf8,0xc6,0x6f,0x0e,},"\xb2\xe0\xde\xdd\x80\x2e\xed\x99\x6d\xbd\x58\x36\xbf\x86\x88\xb0\xd1\x20\x1b\xf5\x44\x2f\xf9\xbb\xd3\x51\xae\xef\xe1\xa0\xc2\x1f\xea\x2b\x5c\x9f\xe5\xed\xee\x47\xe9\x21\x09\x9b\x05\xae\xda\xa8\x03\x67\xc1\xce\x08\x82\x1d\x78\x3a\x5b\x64\xcf\x05\x9c\x0f\x43\x35\x08\x39\x86\xa5\xa6\xec\xff\x8c\x84\xfd\x40\xe0\xba\x5d\xd5\xe5\xd2\xf0\x11\x12\xa8\x4c\xe5\xcf\x8e\x0d\xb7\x8b\xeb\x18\x2d\x91\x39\xc0\xb0\xf3\xe0\x06\x0a\x3f\xa7\x38\x69\xe9\x64\x23\xf1\x70\xdf\x9a\xf1\xcb\x9c\x35\x56\x6d\x87\xdf\xf5\x42\x22\x3f\x6d\x43\x9b\xdb\x54\x72\x9d\x36\x6a\xff\x63\x7b\x0f\x36\xa5\xd1\x4b\x15\xd6\x12\xbd\x03\x07\x6c\xc4\xd0\x4c\x1f\x25\xb3\xba\x84\xe0\xd1\xfe\x47\x4e\x57\x18\xd1\xa1\x7d\x5a\x48\x84\x65\x66\x2e\xe4\xc3\xf6\x64\xb4\xc9\x27\x4b\x64\x9d\x78\xce\xa4\xe8\x52\x43\xf3\x71\x32\x39\x04\x8a\x90\x8c\xe3\xe1"}, +{{0x01,0x8a,0x2c,0x3d,0xee,0xa5,0x0a,0xb5,0x06,0x75,0x1f,0x9c,0x2a,0xda,0xad,0xfd,0x9e,0x21,0x92,0x12,0x16,0x09,0x93,0x16,0x84,0xeb,0x26,0x5e,0x19,0x3e,0x7f,0x89,},{0xaf,0x41,0x0b,0xdd,0xde,0xfc,0x64,0x4e,0xf1,0x2c,0x98,0x99,0xff,0x71,0xb9,0xe1,0xd0,0xdf,0xa3,0xd6,0x9d,0x8c,0x2c,0xd6,0x76,0xc1,0x91,0x6b,0x34,0x59,0x1c,0xfd,},{0x7a,0x44,0xe6,0xa3,0x19,0x32,0xde,0xe6,0xdc,0x2d,0x83,0x94,0xe2,0x9a,0x65,0x51,0xd1,0x3e,0x6c,0x6f,0xfd,0xfa,0x21,0x8f,0xa5,0xb9,0x98,0x66,0x8d,0x84,0x39,0xdb,0x5e,0x05,0x37,0x9f,0xbf,0xa0,0xda,0x5b,0x56,0x3e,0xd9,0x66,0x43,0x5a,0xe2,0xc5,0x4e,0x3a,0xd1,0x6e,0x1a,0x9f,0xca,0x1f,0x5a,0x15,0x7a,0x08,0x07,0x04,0xab,0x03,},"\xcf\x78\x13\xef\xac\x12\xad\x1c\x7c\x73\x22\xcc\xbe\x54\xaa\x0e\x9a\x8b\xa4\xfd\x43\x45\xb0\x6e\x4c\xe7\xa3\x5c\x8b\x1c\xd5\xe3\xf7\xf0\x68\x85\x33\x84\x9b\xa2\xcf\x4c\x75\xb6\xf2\x09\x26\xa1\x19\x4a\x72\xdf\x0e\x1b\x1b\x34\x45\x6a\x21\x33\x11\x2d\x00\x67\x22\xfe\x81\x1d\x5e\x40\xc4\x12\x11\x59\xde\xd8\x89\x90\xc0\xac\x2b\xfd\x34\xf3\x5a\xf4\xf0\x7c\xc4\x02\xe9\xa3\x81\xa6\x75\xd0\x3f\xec\x7e\xc4\x38\xc4\xad\x9d\x92\x9a\xec\x8f\x24\x2d\xef\x02\x3c\x99\x3c\x9e\x8b\xa1\x8c\x74\x28\xe8\x8f\xde\x68\xa4\x71\x1e\x50\x6d\x79\x69\xf6\x3c\x8e\x0b\xc8\x3f\xf0\xde\x4e\x13\x36\x10\x6c\x05\xe0\x9d\x59\x22\x40\x0e\x8a\x81\xbf\x54\x88\x56\x67\x89\x97\x85\x88\x2b\x70\xf2\x0d\xd8\xfb\x1e\x75\xf5\x85\x5b\x76\x5a\x25\x6d\xa4\x34\x1b\xf2\x3e\xa0\xff\xa1\x8a\xad\xda\x38\x18\x16\x94\x60\x01\x04\x56\x69\xc8\xd0\x4d\xf0"}, +{{0xbe,0xa4,0x45,0xe9,0xb6,0xd3,0xf2,0x12,0x35,0x91,0x2c,0xd6,0xc4,0x2e,0xc0,0x57,0x72,0x97,0xca,0x20,0xa1,0x03,0x57,0x88,0x0c,0x2b,0x84,0x6d,0xd8,0xe2,0xcc,0x77,},{0x02,0x41,0x74,0x96,0x62,0x21,0x69,0x9e,0xa4,0xb0,0xa3,0x7e,0x51,0x7f,0xf9,0xb1,0x65,0x98,0xae,0x4d,0x4e,0x83,0xbf,0xa3,0xca,0x50,0xbc,0x61,0x68,0x41,0xf5,0x95,},{0x69,0x64,0xb9,0xc5,0x90,0x3e,0x74,0xe9,0x93,0x28,0xac,0xef,0x03,0x65,0x58,0xee,0xcd,0x33,0x69,0x15,0x0a,0x52,0xe2,0xcb,0xad,0x4b,0xbb,0x97,0xd4,0x61,0xb3,0xdf,0xc6,0xb3,0xe8,0x45,0x58,0x13,0xa4,0xf4,0xbd,0xca,0x46,0x30,0x2e,0x02,0xe6,0x83,0xec,0xea,0x18,0x20,0x17,0x1c,0x53,0x8e,0x54,0xc3,0xde,0x6c,0x95,0x4a,0xa4,0x07,},"\x47\x43\xc7\xc0\x99\xab\x81\x59\x27\xb3\x67\x4d\x00\x54\xb6\xde\x59\xaf\x28\x11\xab\xc2\xcf\x7f\xde\x08\xf6\x29\x29\x18\x5a\xdc\x23\x8f\xad\xd5\xe7\x5a\xe3\xba\x00\x36\xff\x56\x5a\x79\x40\x5b\x42\x4f\x65\x52\x33\x1e\x27\x89\xd9\x70\x9a\xc1\xec\xbd\x83\x9a\xa1\xe9\x1c\x85\x48\x17\x59\x79\x58\xcc\x4b\xd9\x1d\x07\x37\x75\x07\xc2\xc8\xd3\xc0\x06\xcf\xeb\x6c\x0a\x6c\x5a\x50\xee\xe1\x15\xe2\x11\x53\xdd\x19\x8e\xa0\xa3\xaf\xf6\x2b\x70\x75\xd5\xa4\x61\x78\x87\x83\xf0\x50\xe6\x59\xc5\x72\x96\x3d\x7a\x59\xe5\xaf\xaa\x2b\x9c\x50\x1f\x43\xc6\xac\x08\xab\x47\x97\xc4\x56\x6d\x22\xb9\x3c\xdf\x65\xa9\x9a\x2a\x1d\x63\x8e\x79\xf7\x2b\x5f\x46\x31\xfe\x5e\x9e\x5f\x96\x8f\x6d\xb7\xa1\x88\x0d\xf5\x1d\x8f\xeb\xc1\x49\x42\x67\x2f\x8e\xa6\xfc\x3a\x72\x81\x4a\x44\xd6\x6d\x14\x84\x20\xa6\x90\x00\xf6\x8c\x33\x0d\xe5\xb8\x0f\xc6"}, +{{0x64,0x47,0x54,0x0e,0xd7,0xbe,0x0a,0x11,0xc2,0xa8,0xde,0x79,0x3d,0x83,0xc6,0xe2,0x44,0x98,0x3d,0xb1,0x8d,0x78,0xec,0x9d,0x75,0xf1,0x72,0x9c,0x92,0xe0,0xfd,0xf1,},{0x39,0x12,0x12,0xc8,0xed,0xc4,0xd3,0x34,0xa5,0xbe,0xc8,0x60,0xef,0x0f,0x5e,0xbb,0x5e,0xc4,0x4e,0x8b,0xb5,0x1c,0x0f,0x67,0x41,0x99,0x89,0x59,0xb2,0xb3,0x79,0xfc,},{0x3a,0xb5,0xf8,0x8e,0x2f,0x72,0x76,0xb5,0xb6,0x58,0x3d,0xff,0xba,0x56,0x39,0x99,0x3a,0x90,0x5d,0xbf,0x9b,0x88,0xce,0xea,0xaa,0xae,0x33,0x35,0x80,0x0e,0x4a,0x5f,0x10,0xf8,0x3d,0xa6,0xd6,0x22,0x5a,0x8d,0xbe,0x99,0xae,0x80,0x07,0x50,0x09,0xdd,0x50,0x87,0x86,0xb3,0x97,0x51,0x13,0xdb,0x47,0x8e,0x14,0xba,0x10,0x1b,0xee,0x0f,},"\xa4\x38\x1c\x76\x38\xc4\x87\x99\xe9\xb5\xc4\x3f\x67\xfc\x3a\xa3\xcb\xb5\xec\x42\x34\xf3\x7e\x70\xcc\xcc\xce\xd1\x62\x7a\x57\x68\x3d\x1e\x53\xf4\xe0\x88\x3d\x8b\x46\x2b\xf8\x3f\x13\x08\x63\x03\x68\xc8\x9b\x49\x15\x33\xdd\xb8\xc9\xa5\xb9\xe8\x15\x50\x02\xfd\xd5\x81\xa9\xa5\xbe\x0e\x43\x0b\x90\x86\xa6\xbe\xac\x47\x20\x21\x0f\x87\xb1\x4e\x86\x2d\x97\xe5\xcc\x69\x28\x67\x86\xa7\x58\x67\x23\xf2\x31\xef\x0e\x3e\x1b\x93\x2d\xbb\xa3\xa1\x8a\x0c\xb2\x21\xcb\x07\xf8\x0e\x6a\x8e\x13\x00\x05\x6c\x13\xe7\x02\xb2\x3b\xfb\x32\x50\xec\x7c\xc8\x64\xd5\xc7\xec\x57\x86\x24\x07\x09\xc5\x60\x24\xea\x6b\xe5\xf7\xb1\x5a\x4f\xa5\x55\x5e\x39\xa7\x44\xa1\xdc\x55\x7d\xf5\xb9\x48\xdb\x22\x0b\x3d\x57\x45\x74\x66\x91\xda\xcb\x44\x21\x64\x1c\xdc\xc1\x2e\x7e\xc0\x45\x02\x93\xf1\x9e\xc5\x7b\x09\xcf\xf1\x35\x84\x7a\xab\xe4\x46\xa6\x13\x32"}, +{{0x0c,0x58,0x7a,0x81,0x1a,0xdd,0x88,0xb9,0x94,0x45,0x8c,0x3c,0x80,0x8a,0xc4,0xe3,0xa8,0x3a,0xfa,0xb2,0x6d,0x4c,0xff,0x5c,0x96,0x1b,0x9d,0xf0,0xb5,0xc8,0x33,0x44,},{0x06,0x78,0x3b,0x0c,0xdc,0xc5,0x02,0x8c,0x56,0x38,0xbd,0x74,0x8f,0x0b,0xc7,0x6f,0x7e,0x94,0xd1,0xaa,0x20,0x15,0xca,0x94,0x87,0x38,0xa3,0x50,0x04,0x60,0xac,0xa0,},{0x33,0xb4,0xf4,0x27,0x4f,0x20,0x00,0x8a,0x72,0x1d,0x1e,0x8d,0x05,0x4a,0x2b,0x4e,0x95,0x32,0x7e,0x38,0xbb,0x07,0xb3,0x3c,0x4b,0xee,0x7e,0x1c,0xe0,0x20,0xa4,0x42,0xfb,0x26,0x27,0xed,0xa3,0xb7,0xac,0x93,0xcd,0x3a,0xb0,0xb1,0x2b,0x99,0x93,0x5a,0x1a,0x92,0x33,0x11,0x16,0x04,0xda,0x4a,0xcf,0xfb,0x53,0x15,0xb9,0x07,0x12,0x0b,},"\xf5\x6d\xc6\xb7\x60\x76\x32\x5b\x21\x26\xed\x11\xd1\xf0\x9d\xec\xef\x9d\x15\xc3\x1d\x0e\x90\xcd\xb1\xa2\x7e\x08\x9c\xc5\x63\x29\xf6\xec\x3f\x66\x5e\xb6\x73\x9e\xc5\x67\x8b\x3f\x37\xee\x1f\xb3\x7d\xeb\x9e\x24\x00\x92\xb7\xa8\x8f\xd2\x55\x25\xac\xd5\x5e\x29\x4e\xb1\x04\x6f\x9b\x1b\x69\xa8\x47\xeb\x9c\xeb\x7b\x15\x93\xb9\xf6\x97\x8e\xf6\x18\xc1\x5d\xe4\xe0\x59\xec\xc3\xbf\xda\x32\x97\xa1\x9c\x2d\xf2\x02\xad\xf7\x21\x55\xcf\x21\xea\xbd\x03\x94\x8d\xf1\x51\x98\xe8\xa6\x8b\x08\x84\xf9\x3a\xd5\xe3\x6e\xb0\x98\x3c\xca\x30\xe4\x5a\x8b\x4b\x5f\xb8\x13\x6f\xde\xa8\xa3\x34\x1d\xd7\x87\x75\x40\xa5\x57\xde\xbf\x75\x30\xcc\x33\xae\xee\xf6\x27\x1c\x3f\x0a\xf6\xd0\x97\x87\xe8\x15\xf2\xf1\xdd\x25\xce\x4d\x2f\xd0\x9f\xfa\x9f\x53\x08\x1b\x46\x9c\x50\x0d\xa4\xd4\x41\x80\xc0\x4e\xb1\x86\x93\x29\xcb\xf2\xd8\x23\x18\x7e\x83\x1c\x24"}, +{{0x66,0xcf,0x40,0x1a,0x21,0x42,0xfc,0xf4,0xa8,0x01,0x80,0x46,0xcf,0x41,0x40,0xbc,0xa1,0x8d,0x76,0xef,0x62,0x66,0xe7,0xa0,0x24,0x75,0x7d,0xf1,0x72,0xa5,0xd6,0x53,},{0x67,0xd4,0x8d,0xfd,0x23,0x74,0x3c,0xc2,0xca,0x40,0xe4,0xdf,0xd6,0xb8,0xcc,0x5d,0x84,0xbe,0x82,0xdd,0x2b,0x11,0x20,0xcc,0x47,0x6e,0x6a,0xf6,0xf2,0x5e,0xcc,0x98,},{0xd6,0xb0,0xe8,0x0e,0x60,0xbc,0x1b,0x29,0xab,0x8f,0x74,0x80,0x8f,0xc4,0x60,0x84,0x77,0x95,0xcc,0xb8,0x87,0xba,0xc0,0xec,0xaa,0x8e,0x13,0x52,0x97,0xa8,0x50,0x97,0x71,0x2b,0x24,0xb0,0xa1,0xfb,0xaf,0x7a,0x67,0xc5,0xd5,0x30,0xa4,0x7d,0x06,0x43,0xfc,0x87,0x02,0xc0,0x59,0xd2,0x15,0xfb,0x11,0x2d,0xbe,0x47,0x5e,0x5b,0xca,0x0d,},"\xda\xa8\xef\xb3\xfd\x41\xf1\x2f\xbc\x55\xbd\x60\x46\x41\x57\xa2\x6d\x71\x86\x32\xd8\x82\xae\xdb\x6b\xf9\x8e\x47\xdd\x23\x37\x87\x9e\x0b\x46\x45\x2e\x06\x2e\x6d\xfb\xff\x3e\x7b\xca\x72\x89\xe4\xef\x6b\x3f\x41\xd4\xb0\x3b\xdc\x2c\x84\x2a\xfe\x97\xf3\x02\x98\x83\xed\x45\xf6\x05\x4d\xde\x96\x90\x64\x9a\xbb\x2b\x8d\xc2\x8f\x5f\xe8\xce\xcf\x80\xfc\x1e\xa4\x11\xbf\xc4\x0b\xbf\x4f\xd2\x0b\x21\x8c\xf4\x7e\xa8\xee\x11\x8d\x4d\x5a\xef\xa5\xc1\xbf\xa0\x8a\x8f\xb1\xb3\x0d\x6d\xe0\x97\x7c\xd1\x5e\x50\x29\x2c\x50\x1f\x2e\x71\xce\x27\x40\xff\x82\x8b\x84\x32\xda\x5a\x59\x4b\xab\x52\x23\x76\x0b\x64\x79\x2e\xd3\xa6\x9d\xd7\x5e\x28\x29\x23\x49\x43\x65\x65\x13\xdf\x1a\x17\xa2\xa0\x67\xa9\xa8\xea\xa6\x4e\x19\x56\x9f\x46\x93\x9d\x34\xb9\x92\x71\xae\x50\xa4\x7d\x7d\xbc\xa3\x62\x0c\x81\x25\x5b\x0e\x1f\xd1\xf3\xce\xc8\x51\xf1\xb1\x1b\x35"}, +{{0x5d,0xbf,0x88,0x5a,0xa5,0x98,0xe8,0x95,0x57,0x1f,0x5f,0x65,0x09,0x0b,0x72,0x32,0x3e,0x9d,0x70,0xb0,0xf5,0x81,0x10,0x68,0x7a,0xfb,0xbc,0x38,0x3a,0xfe,0xdc,0xac,},{0xfa,0x17,0xeb,0xa7,0x6e,0x3b,0xc3,0xea,0x6d,0xab,0x3a,0x5b,0x12,0x0d,0xc5,0xec,0xb9,0xae,0x6f,0x00,0x13,0x8f,0x7d,0x36,0xdd,0xa9,0x26,0x8b,0xc4,0x72,0x21,0x74,},{0xe1,0x42,0x9d,0xab,0x2e,0x42,0xcd,0x03,0x5b,0x7f,0xc6,0x02,0xef,0xd6,0xba,0xf9,0x47,0x06,0xf1,0x6e,0xaf,0x2f,0x8b,0x5f,0xed,0x32,0x92,0x39,0xe8,0x75,0x60,0x5f,0xb1,0x72,0xf5,0xdd,0x9a,0xe2,0xbc,0x2e,0xb4,0x2e,0xb4,0x74,0x56,0x7e,0x29,0x2f,0x52,0x06,0xe8,0x2e,0x69,0x4b,0xca,0x0d,0x6d,0x43,0x3b,0x86,0x76,0x34,0xcb,0x0d,},"\x1e\x0b\x6c\xf1\x5c\xe0\x33\x37\x17\x9c\x02\xd6\x54\x08\xdf\x5b\xe9\x20\x0c\x37\x82\xb6\x00\x4a\xf9\x4e\xa4\xde\xcb\x25\x79\x99\xd6\xfd\xff\x30\x1d\x11\xd0\x0c\x98\xc3\x72\xfa\xc0\xd0\x26\xcb\x56\xdf\xef\xe3\xde\xf7\xeb\x99\xac\x68\xd6\x96\x8e\x17\x12\x4d\x84\x46\xf5\x3e\x8d\x2d\x3d\xd8\x90\xd3\x7a\x23\xc7\xe0\xb8\x3a\x48\x4b\x3c\x93\xbd\xdf\x6c\x11\x8e\x02\x81\x95\x9d\x27\xbd\x87\xd3\x7e\x84\x3d\x57\x85\xf4\xa4\x07\x71\x39\x84\x94\xe6\xc4\x32\x2f\xbb\x67\x5c\x1d\x47\x93\x21\x03\x21\x48\xf7\xfe\x52\x56\x4d\xdf\x7a\xe7\xac\x26\x9d\x0c\xd2\xe5\x52\xfe\xc5\x89\xae\xae\x0f\xb9\x3f\xe3\xee\xae\xf0\x85\x60\x96\xcf\x4f\x6b\x34\x97\xe7\x23\x5c\xc8\x49\x4d\x81\x0a\x0b\x46\xc5\xea\xc8\x7f\x18\x7e\x50\x5b\xb7\x76\x4f\x80\x45\xc9\x54\x19\x83\xf7\xb0\x25\x69\x80\x09\xa2\x3d\x9d\xf0\xbd\x1a\x47\x3c\xbe\xe4\xcf\x5e\x94\x88\xec\xbc"}, +{{0x84,0xb3,0xae,0xdd,0x47,0x97,0xa5,0x65,0xc3,0x51,0xde,0x7d,0xfa,0x07,0x00,0xb9,0xff,0x7c,0x4d,0x72,0x91,0xc8,0x80,0x8d,0x8a,0x8a,0xe5,0x05,0xcd,0xd2,0x25,0x90,},{0xd7,0xad,0x72,0xca,0xa7,0xc2,0x22,0x09,0xec,0x46,0x78,0xd1,0x1d,0x55,0x90,0xa6,0xcb,0x28,0xa0,0x71,0x17,0xfe,0x5a,0xef,0x57,0xb5,0x07,0x51,0x58,0x32,0x01,0xa5,},{0x92,0x20,0xf0,0xed,0xaa,0xae,0xe1,0xb8,0x76,0x35,0x0d,0xbe,0x92,0x66,0x06,0x17,0x67,0xb8,0x62,0x96,0xc3,0x51,0xd4,0xca,0xc9,0x9d,0x07,0xcd,0x61,0x2c,0x6e,0xfb,0x24,0xf8,0xf9,0xb0,0xb9,0x75,0xf9,0x5c,0x42,0xc5,0xb6,0xaf,0xed,0xc8,0x92,0xf8,0x7e,0xfe,0xdd,0x39,0xd5,0x16,0x02,0x94,0xc2,0x76,0x58,0xbd,0xcf,0x42,0x85,0x0b,},"\x53\x25\x67\xff\xa5\x3b\x5c\x0f\xcd\x29\xc3\x94\x99\xd2\xe7\x8e\xcd\x20\xe6\x31\x23\x49\x92\x40\xe7\x75\x08\x8b\x39\x4d\xc6\x5c\x8b\xaa\xa0\xfe\x8f\x6a\xa7\xe7\x01\x81\xf9\xe1\x0a\xdd\x8b\x4a\x8b\xeb\x0b\x2e\xc3\x8a\x43\x30\x9f\x10\x0c\xd4\xbe\x91\xc6\xf4\x8e\x79\xdc\x0a\xee\x93\xa1\x5c\x94\x03\x77\x3b\x35\x4a\x8d\x42\xed\x48\xd8\xf2\x76\x23\x0f\xa6\xde\x5a\xda\x50\x1e\xe0\xa6\x53\xb4\x45\x8f\x0e\xcf\x6d\x5b\x3c\x33\xe2\x14\x1c\x66\x2f\x6e\xa0\x55\xf7\x41\xe5\x45\x86\x91\x7d\x2e\x0c\x4e\xb2\xb5\x66\x21\xf9\x66\x5f\xef\x32\x46\xf0\xbd\x80\x0b\x53\x3e\x3b\xc6\x15\xc4\x02\x1f\x8d\x0e\x2a\xd2\x33\xa1\x1e\x77\x36\xc4\x93\xac\xc3\x1f\xae\xe7\x6a\x09\x7d\xc4\x0d\xb9\xef\xc2\x24\x46\xea\xcf\x1c\xc1\x8f\x51\xfd\x10\x23\x6a\x2f\x94\x2d\x0a\x53\xc3\xce\x20\x91\x08\xb5\x93\x8c\x0a\x9e\x53\x6b\x89\xef\x0a\xd6\xb4\x05\xa1\x0f\x22\xc3"}, +{{0x69,0x50,0xbf,0xcf,0x48,0x0b,0x98,0xea,0x18,0xa2,0xd5,0xae,0x5b,0xa6,0xe7,0x66,0x8f,0x4c,0x28,0x3f,0xf2,0x71,0x13,0x57,0x74,0x0f,0xfe,0x32,0xcf,0x25,0x81,0x9a,},{0x8e,0x4c,0x6f,0x23,0x3f,0x7b,0x86,0x32,0x1c,0x9d,0x67,0x99,0xba,0xc2,0x8a,0xaf,0xcd,0x25,0x03,0xd7,0xaa,0x0a,0x7b,0xde,0xd8,0x72,0x27,0x27,0xfb,0xbc,0xae,0xb8,},{0x94,0xde,0x5d,0xf7,0xa2,0x5e,0xcd,0x70,0x20,0x5d,0x40,0xbc,0x94,0x99,0xfc,0x7c,0xd7,0x13,0x65,0x68,0x06,0x0a,0x41,0x9a,0x93,0xbe,0x6e,0x31,0x86,0x64,0xbb,0x6d,0xfc,0xe6,0x0e,0x2d,0x4e,0x63,0x3f,0x7e,0xc1,0x48,0xfe,0x4f,0x83,0x4e,0xd2,0x77,0xc1,0xfe,0xc4,0xc4,0xe2,0xa8,0x6f,0x44,0xc4,0x58,0x9c,0x81,0x78,0x88,0xdb,0x00,},"\xa4\x01\xb9\x22\xab\xa5\x7e\xe0\xc6\xac\x1c\x8f\x1b\x48\x29\x6a\x85\x62\xee\xf1\x37\x52\x68\x93\x88\x6a\x08\x30\x6e\x22\x03\x66\x77\x88\x61\x8b\x93\x98\x64\x46\x7a\x31\xf1\x6e\xdc\xe1\x52\xa4\x2c\x25\x54\x6b\x64\x0e\xa8\xbe\xd1\x89\xa4\xf8\x98\x86\xa3\x7f\x10\x69\x11\xea\xe1\xf5\x00\x81\xbf\x79\x5e\x70\xc6\x50\x44\x37\xd2\xa8\x0c\xb8\x39\x47\x9e\xcb\xb8\x7c\x12\x9b\xcc\x5f\xe3\x1d\x71\x6e\xf9\x78\xc2\x06\xd7\xf0\x8a\x79\x34\x66\x59\x4f\x4d\x75\xe2\x15\xbb\x63\x74\x59\x6f\x8e\x7d\x00\xee\xa7\x24\x78\x09\x43\xe8\x9b\xd3\x86\x3c\x95\x1b\xbd\x24\xef\xee\x23\xc9\x7c\x2c\x79\x7c\x7f\xaf\xbf\x8f\x2c\x8b\x43\xf3\x7a\x5f\x88\x11\x29\xa0\x95\x73\xfa\x7a\x03\x4a\x28\x5e\x80\xdc\x4b\xa4\xbc\x95\x64\xa4\xdc\xed\xeb\x33\x16\x7e\x0b\x30\xc5\xa0\x0b\x9a\x10\x9a\x22\x31\xcf\xa0\x01\x2b\x29\xb2\xb3\x45\x0b\x89\x2e\xcc\xef\x08\x08\xe5\x03\xf8"}, +{{0x61,0xb2,0x60,0xf5,0xb8,0x48,0xb2,0x71,0xef,0x48,0xe5,0xa5,0x6d,0x29,0x74,0x32,0xd8,0x9f,0x2a,0xb8,0x5b,0xd5,0x38,0xfa,0x66,0x88,0x70,0xd0,0x56,0x02,0x20,0xe5,},{0x60,0x86,0xfe,0x87,0x35,0xf3,0x99,0xf1,0xaf,0x2e,0x39,0x5e,0x0f,0xdf,0xb5,0x62,0x9e,0xbc,0xb0,0x4b,0x6e,0xd4,0xa5,0x4a,0x9e,0x47,0x05,0x2c,0x6e,0x81,0x91,0xd4,},{0x98,0x28,0xfe,0xc8,0xff,0x5c,0xf8,0x5a,0x98,0xf4,0x50,0x77,0x0b,0x5b,0xdb,0x4b,0x80,0xda,0xca,0x44,0x37,0x9d,0x8f,0x53,0xc9,0x1c,0x34,0x8e,0x22,0xdf,0x64,0xac,0x48,0xf2,0xb6,0xe2,0xa7,0xb3,0xb6,0x42,0xbc,0x81,0x93,0xa1,0x94,0x31,0x62,0x29,0xe6,0x94,0x47,0xed,0x24,0x1c,0xd4,0x23,0xd8,0x3b,0x6f,0xe7,0xb2,0xd4,0x4b,0x00,},"\x28\x26\x29\x5d\x79\x94\x5f\x67\x54\x76\xbc\x4d\x45\xef\x80\x0d\x80\xb1\xf0\x39\x8e\x4b\xe6\x0e\x3d\xe4\x57\x1e\xd1\x08\xdf\x98\x9f\x03\x2d\xe6\xc2\x34\x5d\x99\x48\xd6\x77\x92\x7e\xa0\xb8\xcf\x1a\x5c\xa3\x6f\xd5\xf2\x3c\x25\xdc\x0d\x2a\xb5\xbd\x56\x5a\x54\xaf\x46\xfd\x97\xd3\x38\xd7\x70\xe3\xa7\xb4\x7e\xfb\x54\xc0\x7a\x16\x64\x70\x77\x71\xeb\x4e\x37\xd9\xd7\x0b\xa7\x79\x25\x1d\xcd\xcd\x3b\xf6\xd1\x24\x8a\xde\xc5\x3f\x78\x72\x59\xc4\xd5\x94\xd5\xfd\x4c\xed\x8e\x3d\xb7\x62\x1d\x49\x65\xd4\x82\x98\x17\x81\x24\x93\x1a\x3d\x0c\xd2\x69\xb2\xd5\x3b\x7c\xd2\x61\xb9\x6d\x37\x0c\x5d\x96\x93\xc8\xad\x13\x3e\xd5\x89\x45\xee\x35\x40\xe1\x06\x25\xd9\x24\xae\xba\x9b\xda\xfc\x65\x61\x00\xaa\xb2\x76\xfa\x99\x6b\x1d\xb4\x77\xbf\x85\xea\x55\x90\x81\xd5\xb4\xc7\x30\x7d\xc1\x59\x56\x54\xac\xa8\x2f\x7b\x6d\x2d\xda\xf7\x35\x7c\x15\xa4\xd7\xd8\xb9\x08"}, +{{0x93,0x6d,0xc1,0xce,0xf6,0xa3,0x10,0x74,0x7f,0x35,0x00,0x88,0x05,0x5a,0x39,0xaa,0x76,0x2d,0x9a,0x4b,0x52,0xc8,0xc8,0xe4,0xc6,0x82,0x79,0x43,0x80,0xc2,0x72,0x5c,},{0x03,0xb3,0x18,0x00,0x41,0x2d,0xf4,0xd5,0x6f,0x15,0x32,0xc0,0x58,0x28,0xc0,0xb7,0x25,0x28,0xa6,0x7a,0x78,0x1b,0xef,0x4c,0x06,0xc1,0xfb,0x6f,0xf2,0xce,0x32,0x4b,},{0x3f,0x99,0x4b,0x8e,0xf5,0x28,0xf6,0x42,0x1c,0x6a,0x6a,0x22,0xe9,0x77,0xad,0xe5,0xce,0xe8,0x87,0x26,0x3d,0xe3,0x8b,0x71,0x9a,0xcd,0x12,0xd4,0x69,0xbf,0xd8,0xc3,0xf6,0x8e,0x7a,0xc0,0x7d,0x2f,0xae,0x80,0xa2,0x09,0x27,0x78,0xdf,0x0b,0x46,0x35,0x37,0xad,0x3a,0x05,0x51,0x99,0x7a,0x3d,0x5b,0x51,0xf8,0x32,0xd9,0xc8,0x23,0x0b,},"\xeb\x58\xfe\x86\xc4\xef\x34\x9c\x29\xae\x6f\xb0\x4f\x10\x85\x0e\x38\xc6\x82\x3d\xbe\x64\xa0\x9a\x5b\xf1\xe0\xce\x60\x0d\x39\x4e\xfa\x6f\xb9\x6e\xd6\xa8\xf2\xc9\xd4\xbe\xc0\x5e\x6a\x5e\xbd\x5a\x1b\xf4\xd0\xc5\x1d\xb9\x34\xe5\x7b\x79\xe5\xc6\xa8\x79\xd9\x75\x19\x7d\xbb\x10\x47\x5f\x65\xc7\xf8\xa8\xc6\xa7\x7a\x42\x03\x84\xb5\x06\x2a\x27\x40\xf1\x40\x17\x40\xee\x0f\x5e\x04\x3a\xad\x7a\x2a\x2b\x42\x60\xc5\xd9\x07\xf7\x05\xed\xaf\x65\xb0\xe3\x75\xdf\xc7\xb0\x0b\xd6\x60\xdb\x61\x47\xf2\xeb\xe8\x70\xa0\xee\x18\xdc\x2b\xa3\xc9\x2b\x0b\x76\xfa\xe2\xb9\x09\x32\xcd\xb6\xc1\x49\xe4\x6f\x3f\xee\xcf\x4c\x26\xf0\x44\x1f\x3a\x9e\x00\x66\x78\xae\xcf\xf8\xcc\xae\xca\xed\xa7\x3a\x18\xa6\x8a\xc9\x88\xb6\x2e\x83\xa9\xbb\x51\x88\xae\xde\x38\xdf\x77\xa9\xa1\x64\xab\xbd\xd9\xd5\x8e\x52\xa6\xca\xf7\x22\x23\x89\xf1\x98\xe8\x5f\xbf\x96\x62\x36\xdc\xdb\xd4\xc1"}, +{{0xf8,0x9e,0xed,0x09,0xde,0xc5,0x51,0x36,0x1f,0xa4,0x6f,0x37,0x59,0x73,0xd4,0xfb,0xfa,0x5c,0x5c,0x12,0xf1,0xb5,0xe5,0xab,0xf4,0x5c,0xfa,0x05,0xff,0x31,0xa3,0x40,},{0x3e,0x0e,0xfd,0xca,0x39,0x19,0xfa,0x10,0xd4,0xa8,0x49,0xce,0xf1,0xde,0x42,0x88,0x51,0xbd,0x08,0xef,0xd2,0x48,0x59,0x4f,0xd8,0x9c,0xde,0xb9,0xde,0xee,0x43,0xb0,},{0x89,0x7e,0x6f,0x27,0x97,0xc3,0xf3,0x26,0xd2,0xcd,0xb1,0xd2,0x67,0x3d,0x36,0x06,0x31,0xf0,0x63,0x30,0x45,0x80,0xff,0x5b,0x4e,0xb4,0x3d,0x39,0xad,0x68,0x51,0x83,0x4c,0x9c,0xf8,0x91,0xd9,0xf0,0x90,0x5b,0xf8,0xde,0x07,0x5f,0x76,0x35,0xdf,0xca,0x60,0x1a,0xdc,0x0f,0x14,0xe7,0xb2,0xc7,0x6f,0x75,0x71,0xbf,0xa4,0x68,0xed,0x0c,},"\x4c\xf9\x77\x3d\xa0\x5f\xd3\x22\xfc\x14\x7b\xe9\x00\xef\x5c\xf2\x56\xc8\x8a\xfd\xad\x4b\x08\xc2\x30\xdf\xc8\x98\x1f\xb6\x9f\x47\x6f\x7d\x45\xef\x7c\x90\x06\xbc\x10\x03\x2b\xa5\x34\x36\xac\x22\x84\x3e\x0d\x76\x28\x9c\xf6\x8f\x98\x18\xfa\x64\x03\x1d\x4b\x40\x95\x50\x59\xaa\x69\x11\x09\x15\x88\x9f\x5e\x22\x73\x2a\x13\x43\x91\x25\x81\xab\x3b\x11\xa3\xba\xe7\xa4\x71\x35\x95\x08\x59\x65\x75\xf8\x88\x16\x0b\xee\xf9\x66\xe5\x70\x8f\x0e\x31\x47\xea\xcf\xce\xc1\xca\xa3\xef\x24\x0c\x5e\x0a\x14\xc1\x86\x54\x6c\x8e\xeb\x64\x65\x83\x50\xb1\xaf\xfc\x0c\xfd\x2a\xc2\x13\xaf\x67\x0a\xfc\xa7\xbb\xc9\xdd\xdd\x28\xa4\x65\xb5\x86\xe6\x9c\x38\x8c\xd7\x34\x78\xd6\x8e\xfb\x32\x2b\xdf\x86\xd9\x21\x30\x11\xe7\x11\xb2\xb9\x5f\xef\xa7\xbb\x9b\x59\x39\x76\x17\x06\xaa\x71\x21\x02\x49\x06\x42\x0b\xdd\xf1\xd8\x80\x0a\x43\x38\xd9\x38\xfa\x13\x7c\xf2\x7e\x9f\xfc\x51\xc6"}, +{{0x40,0x07,0x96,0xef,0x60,0xc5,0xcf,0x40,0x84,0xde,0xe1,0x80,0x1c,0x4a,0x19,0x75,0xe4,0x82,0xe7,0x0a,0xef,0x96,0x1c,0xd4,0x2e,0x2f,0xd5,0xa3,0xfa,0x1a,0x0f,0xbe,},{0xf4,0x7d,0xa3,0x81,0x28,0xf2,0xd0,0x12,0xcc,0x57,0x97,0x57,0x1d,0x47,0x9c,0x83,0xe7,0xd8,0xa3,0x40,0x98,0x02,0xf9,0xa7,0xd9,0x76,0xc2,0x70,0x67,0xcb,0xbe,0x43,},{0x84,0xd3,0xaa,0x3f,0x36,0x18,0x44,0x39,0x67,0x54,0xd8,0x0d,0x9f,0xa0,0x5b,0x8b,0x2f,0xa4,0xab,0xf3,0xa0,0xf3,0x6b,0x63,0x9b,0xee,0x9c,0xfb,0x5c,0x85,0x30,0xa3,0xa9,0xcc,0x34,0x67,0x7f,0x92,0xa9,0x13,0xc4,0x1e,0x80,0x0f,0x2e,0x80,0x41,0xf7,0x66,0x6d,0x07,0xed,0x85,0xf1,0x6a,0x57,0xd8,0x17,0xb1,0x24,0x1f,0xc5,0xee,0x04,},"\xc4\x73\x32\x5e\x78\x5b\x27\xdf\x44\x71\xee\xfb\x9e\xbe\xbd\x64\x61\xd5\x70\x80\x01\x81\x10\x0f\xf3\x6c\xaf\x3c\x38\xf6\x7c\x19\x21\xb1\x57\xec\x8e\x61\x26\xf9\x55\xae\xbd\x90\xea\x3f\xe5\x38\x5f\x80\x42\xcd\x70\x4b\x27\xcc\x1d\x69\x78\xc0\xe2\xa2\x96\x69\x5f\x5e\xf9\x7b\x7c\x2e\x16\xae\x4f\xf4\xd0\x63\xc6\x88\xd7\xf4\x6e\x96\x4e\x1f\x0a\x00\x50\x3f\x35\x73\x45\x97\x76\x83\xd6\xe4\xc3\x42\x3d\x56\xbd\xb6\xce\x86\x4b\x69\x87\xe0\x85\xe8\x3e\x70\xc7\xc1\xa1\x4e\x0e\x41\x3f\x59\x2a\x72\xa7\x1e\x01\x7d\x50\x5b\x64\xc2\x4f\x1a\x1a\x6b\x81\x3e\x06\x4e\x6e\x0c\xf8\xbd\x45\x71\xd0\xff\x2f\x26\x7a\x6a\x13\xe0\xcd\x43\x04\x63\xb6\xca\x3b\x88\xf0\xcd\x40\xb0\xfb\x83\xd5\xbe\xdf\x6f\x7d\x47\xe1\x70\xe8\x7d\x0a\x75\x00\x93\x69\x3e\xda\x23\x2a\x6d\xaf\x98\x12\x57\x27\xb9\x58\x8e\xcb\x89\x4a\xe3\x73\xba\xe3\xa4\x45\xa1\x06\x30\x64\x69\xa4\xc2\xcd\x77\xff"}, +{{0x67,0x03,0xa6,0x23,0x2c,0x5e,0x2e,0x65,0xe0,0xab,0x3b,0x92,0xe2,0xaa,0xf9,0xf5,0xfb,0xd3,0x3f,0xb4,0x69,0x88,0x04,0x7d,0x6f,0x4d,0x0f,0xf5,0x38,0x7f,0xa0,0x29,},{0x04,0x7c,0xff,0xca,0x8b,0x7b,0x11,0xac,0x6e,0xac,0xc0,0xea,0xa0,0xc5,0xb7,0x3c,0x75,0xb9,0xc6,0x37,0x95,0x69,0x73,0xaf,0x9d,0x97,0xb2,0xdd,0x5b,0x60,0x5d,0x6f,},{0xca,0xe9,0x68,0x79,0xe5,0xb6,0x03,0xbe,0x86,0x66,0x09,0xd4,0xa0,0x53,0xbf,0xa1,0x2a,0x51,0x37,0x8e,0x99,0xb2,0xa2,0x81,0x2e,0x47,0x89,0x26,0x7d,0x8f,0x32,0xf4,0x73,0x24,0x3f,0x8a,0xf7,0x4b,0x9b,0xe7,0x3f,0x47,0xde,0xa5,0x0f,0x0d,0x16,0x5e,0xbf,0x49,0x45,0x8b,0x73,0xe5,0x3d,0x88,0x58,0x0c,0x19,0x1a,0x18,0x2d,0x19,0x04,},"\xa2\x6b\x30\xa7\x69\x19\x79\x32\xa3\xa6\x28\x54\x96\x8d\x76\x01\x51\x61\x23\x66\x77\x8d\xc9\x94\x57\x6a\x2e\x0e\x03\x55\x49\x6b\x46\x20\x0e\x50\x69\x48\xa0\xd1\x02\xb6\x65\x1b\x2e\x73\x34\xca\x6c\x6e\xae\xf8\xbc\xa4\x4b\x42\x59\x70\xa0\xb3\x7d\x6b\xde\x0d\xa9\xd3\xc1\xb9\xf5\x1c\xbb\x25\xbc\x33\x5c\xd6\xfa\x92\x8a\x74\xf2\xc0\xdc\x2c\x6e\x99\xd3\x7a\x12\x86\x3a\x47\x4d\x4d\xf4\x3a\xad\x35\x41\x5f\xfc\xaa\x24\xd8\xc2\x9f\x91\x45\x72\xab\x2a\xbe\xc3\x89\x2d\xb4\x9e\x67\x9c\x5e\xa2\x20\xc2\xf5\x19\xa7\xd0\x33\xac\x1a\x2c\x5a\x46\x78\x69\xe3\x0e\xda\x3d\x26\x35\xca\x86\x34\x31\x47\x3f\x95\x8d\x55\x2b\xdc\x55\x82\x35\x2c\x29\x0d\x0c\xe4\xfa\x9c\xfd\x0a\xd4\x27\x99\xc2\x27\xec\x90\xb7\xc9\xe5\xdb\x9f\x5a\x7b\x6d\x56\x92\x12\xee\xd9\x4d\x32\x33\x26\x80\x5f\x2b\x3a\x00\x10\xd6\xc1\x1e\xb4\x10\x7c\x82\x83\x03\x76\x52\xf5\x0d\xc0\x67\xb6\xdc\x81\xf4\xdb"}, +{{0xe0,0xe7,0x2f,0x8f,0x17,0x86,0x33,0x62,0x67,0x33,0xbc,0xbd,0xa2,0xad,0x2a,0x50,0xe6,0x53,0x89,0x0f,0x15,0x35,0x9b,0x6c,0x22,0xfc,0x73,0x45,0xad,0x33,0x31,0x09,},{0xd1,0x3c,0xee,0x54,0x0d,0x84,0xb5,0x66,0x7d,0x51,0x6f,0xe7,0xec,0x72,0x39,0xbf,0x8d,0xa9,0x15,0x46,0xee,0x79,0x1f,0x84,0xed,0xd8,0xff,0xcf,0x3a,0x08,0x3e,0x76,},{0x14,0x55,0x21,0x71,0xb9,0x52,0x45,0xac,0x0f,0x0e,0x5a,0x6e,0x7a,0x2f,0x54,0x17,0x21,0x06,0x8d,0xb6,0x50,0xc6,0xda,0xda,0x04,0xc2,0x8c,0xab,0x7c,0x49,0x19,0x5f,0x64,0x36,0x71,0x21,0x44,0xcb,0x31,0x91,0x3c,0x56,0x2e,0x30,0xc3,0x9d,0x8a,0x85,0x49,0xfb,0x64,0xff,0xea,0x81,0xc7,0x44,0x51,0x43,0xb5,0xf2,0x32,0x86,0xda,0x05,},"\x79\x1f\xd6\x13\xc1\x09\x52\x92\xc8\xa4\xa2\xc8\x6b\x47\xae\x02\x61\x55\xb8\x46\x5b\x60\x7d\xbb\x41\x64\x77\xef\x79\xa2\x97\xc9\xd7\x75\x8c\xe3\x4a\xf9\xdc\xbf\x1c\x68\x47\x4f\x30\x90\x9f\xbe\x74\xb7\xba\x42\x96\x32\xf2\x40\x3a\xad\x83\x2b\x48\x6b\x72\xc2\x30\x54\xad\x42\xf7\x65\x3a\x9d\xdb\x45\x6c\xc7\x91\xf3\x48\x88\x6a\x7a\xe5\xdc\xec\x7c\x0b\xa8\x15\xf7\xa9\x3a\x10\xfe\x33\x1e\x90\x3b\x97\x0f\x7b\x50\x28\xbe\x49\xd1\x4b\xc5\x62\x0d\x63\x79\x26\x72\xb9\x8b\x94\x88\xc6\x7a\xe1\x66\x46\x69\x3e\x11\x20\x47\xf0\xac\x89\x21\xff\x56\x1c\x92\xdd\x05\x96\xd3\x2d\xf0\xa6\xe5\x07\xac\x1b\x07\xde\x51\x6c\x98\x42\x8d\x57\x0a\x37\xdb\x9b\xcd\x7c\x7e\x61\xc6\x94\x8a\xb3\xfe\x91\x25\x0d\xd1\xd5\xbd\x67\x12\x75\xdf\x9a\x97\x2f\x22\xc2\xba\x36\x80\x47\x47\xae\xc1\xea\x24\x16\xc1\xf4\x1a\xb8\x7b\xef\xde\x31\x62\x9b\x2d\x43\x31\x7c\xe4\x1c\xda\x03\x62\x62\x86\xc0"}, +{{0x54,0x4d,0xaf,0xd9,0x96,0x0d,0x82,0x97,0x56,0xc6,0xd4,0xb3,0xea,0xdd,0x44,0x37,0x5f,0xe7,0x80,0x51,0x87,0x6b,0xf9,0x78,0xa3,0x81,0xb0,0xde,0xca,0xaa,0x80,0x96,},{0xae,0x4f,0x64,0x25,0xc1,0xb6,0x7c,0xcb,0x77,0xf9,0xaa,0xcf,0xea,0x28,0xea,0xef,0x76,0x9c,0x8c,0xac,0xee,0x03,0x52,0x05,0xcd,0xcd,0x78,0x7e,0x8d,0x07,0x62,0x9d,},{0xa2,0xae,0x11,0x7c,0x8d,0xe4,0xca,0x6d,0x6f,0xe7,0x5e,0x46,0x60,0x23,0xbd,0x55,0x0c,0x26,0xfe,0xdd,0x3e,0x74,0xca,0x13,0xad,0xb6,0x25,0xf2,0x72,0xe1,0x75,0xf1,0x4d,0x5d,0xf5,0x50,0xac,0xe7,0xd8,0x22,0x88,0xef,0xef,0xab,0xf9,0x63,0x11,0xa1,0x23,0xbe,0xe2,0x38,0x89,0xad,0x37,0x11,0xbf,0xf2,0xb8,0x08,0x79,0x46,0xbf,0x0e,},"\x44\x7f\xe7\x34\x4c\xad\x1f\xae\x09\xd6\xa7\xd0\x5f\x09\xd5\x03\xc1\xb3\xd3\xd5\xdf\xa5\x84\x81\x0c\x35\xbc\x41\xe4\x95\x56\x93\x70\x61\x54\xe2\xd7\x51\xb2\xf1\xb5\x25\xe1\xa1\x45\x47\xba\x7f\x8b\x23\x20\x88\xa6\xfc\x92\x27\x02\xd9\x3a\x11\xcd\x82\x94\x9c\x27\xbe\xd6\x45\xdc\x35\x1f\xb4\xc1\x24\x2c\xf4\x1d\x01\x57\x54\x12\xe7\x92\xae\xd2\x14\x53\x1d\x94\xfd\x66\xe0\x3d\xd3\x2e\x97\x2f\xd7\x7f\x69\x47\xa3\x53\xe1\xae\x5e\x00\xf5\xa6\xca\x77\x99\x24\x72\xf0\x96\xb6\xe7\x47\x5f\xe5\x34\xe9\x13\xa7\x7b\xcb\x0d\x68\x1f\xdf\xb3\xa7\xa0\xdc\xb5\x6d\x27\x4d\xf4\xaa\x10\x9d\x4a\x8a\x37\x79\x4a\x92\x76\xf5\x00\x06\x69\x6f\xf1\x2c\xa4\xd0\x25\x40\x39\xdf\x0f\xb3\xf7\x2a\x96\x0d\xa0\x5c\x98\x72\xf2\xe3\x3e\xe8\x1d\x1c\xf7\xa6\xf4\x8b\xbc\xe0\xaa\x18\xc7\xc0\xf0\x6b\xa5\x5e\x67\x68\x9e\x0a\xf5\x87\xb5\x00\xea\xb7\x9c\xc7\xf9\x64\x0b\xca\x10\x4b\x7f\xbf\x31\xf0\x8e"}, +{{0xbf,0xbc,0xd8,0x67,0x02,0x7a,0x19,0x99,0x78,0xd5,0x3e,0x35,0x9d,0x70,0x31,0x8f,0xc7,0x8c,0x7c,0xc7,0xbb,0x5c,0x79,0x96,0xba,0x79,0x7c,0x85,0x54,0xf3,0xf0,0xf0,},{0x7c,0x5a,0xe3,0xba,0xb9,0x20,0x11,0x99,0xdf,0xbe,0x74,0xb7,0xd1,0xec,0x15,0x71,0x25,0xbd,0xba,0xa4,0x52,0x0f,0x50,0x1d,0xa3,0xf2,0x48,0x57,0x9d,0xc6,0xc2,0x2d,},{0xe4,0x86,0x15,0xb6,0x56,0x33,0xe6,0x19,0x93,0xb0,0xaa,0xa1,0xfa,0xfb,0x74,0xb9,0x62,0x9c,0x38,0x4f,0xd5,0x92,0xbd,0x73,0x5f,0xa1,0xf6,0x2c,0x5c,0xad,0x11,0x29,0x1f,0xcd,0x8c,0x2e,0x91,0xa5,0x0b,0xfe,0x0b,0x03,0xb4,0x35,0x02,0xff,0xf3,0xa5,0xc3,0x82,0xb9,0xc2,0x82,0x19,0x07,0xef,0xc3,0x4d,0xa5,0xba,0x05,0x4a,0xf0,0x0e,},"\x11\x7f\xae\x13\xe7\x87\x77\xb6\x21\x9f\x02\x02\x14\xc1\xb8\x7c\x57\x04\x6d\x1c\x09\xce\x82\xee\x2b\x56\x29\x89\x8d\x9b\x0d\xe7\x4a\x15\xcf\xe9\x9f\x80\x54\x8b\xa9\x13\xd7\x03\x6c\x56\x28\x5a\x4c\xba\x49\x3b\x52\xd2\xcb\x70\xd6\x36\x5a\xce\x3d\xa1\x2b\x1f\x34\xa2\x77\x8a\xf3\x6e\xf5\x2a\xb8\x2e\xde\x04\xca\xca\xf2\x79\x3f\x5f\x89\x83\x1e\x3b\x20\x5a\x9e\xe4\xc1\xd6\xfb\xda\xb4\xba\x4d\x9f\xae\x65\xdd\x79\xa5\xfe\x76\xb4\xb3\x9a\x30\x92\xcc\x71\x48\xd2\x11\xe8\x5e\xe8\x2a\xb4\x63\xd3\x4d\xce\xe9\x06\x1d\x9c\x21\xde\xd2\x05\x1b\xbd\x50\xb4\x13\xf0\xe2\x1a\x0e\x48\xd1\xff\xa8\xdc\xae\x24\x0b\x34\x95\xbe\x25\xd9\x31\x51\xb5\x7a\xa2\x71\xab\x99\xaa\x70\x8c\xa2\x80\x80\xca\xb4\x80\x4f\xce\xfa\x92\x9f\x5f\x1e\xf3\xf4\xc6\xc0\xfb\xfb\x40\xbe\xf7\xea\x1b\x50\x9b\x36\xba\x12\x60\x32\x35\x12\x37\x9d\x7b\xc3\xfd\xbb\x5d\x3f\xaa\xc9\xb0\x0e\x21\xf1\x2e\xa1\xca\x2e\x29"}, +{{0xdf,0x2d,0xf8,0xa9,0xd6,0x6d,0x56,0x38,0xcd,0xee,0x09,0x32,0x4e,0x7b,0x10,0xf8,0xed,0x29,0xab,0x91,0x38,0x7e,0x31,0x47,0xb7,0xdc,0x03,0xf7,0xcd,0x80,0x05,0x08,},{0x5c,0x04,0x2e,0x15,0x7f,0xb7,0xfb,0x12,0xd4,0xd4,0xfe,0xf2,0x84,0x71,0x41,0xec,0xfb,0x57,0xc1,0x25,0x3e,0x14,0xea,0xf3,0x00,0x4d,0x65,0x13,0xf5,0x2f,0xe6,0x25,},{0x9a,0x10,0x74,0x53,0x1e,0xd4,0x3d,0x07,0xbf,0xfc,0x7f,0x2b,0x6c,0x13,0xb8,0x83,0x8f,0xc7,0x5c,0xba,0x02,0xc7,0xd1,0xec,0x7b,0xa3,0x8b,0xca,0x3c,0xef,0x20,0xdc,0x9b,0xad,0xf3,0xa3,0x06,0x4a,0x2c,0x93,0xb1,0x84,0x24,0x41,0x42,0x0b,0x6a,0x8d,0x42,0x1a,0x96,0x0d,0x70,0xdf,0xb7,0xc7,0x0e,0xec,0x29,0x5f,0x21,0xf8,0x3f,0x0a,},"\x21\x57\x66\x15\xc9\x34\x6a\x63\xdc\xcf\x0c\x50\xec\xbd\x7c\x6d\x72\xad\x45\x2c\xfe\xd4\x3e\xa7\x32\x02\xcc\x7a\x98\x57\x60\x56\xb9\x66\x4b\x54\x62\x29\x05\xa1\xe7\x22\x17\x20\x73\x0a\xc6\x85\xd3\xbd\x39\x77\xec\x39\x59\xd4\x46\xbf\xa9\x41\xe7\x25\xb6\xfe\x16\xaf\xe5\x43\x2c\x4b\x4b\xde\xe7\xaa\x0f\xd8\x03\x09\x48\xed\x6f\xcb\xa7\xc0\xbd\xb4\x0c\x2e\x51\x7d\xa9\x74\x56\xe7\x4e\x1f\x93\xd5\xed\x67\x6d\xe0\xf4\xa8\xb0\xae\xa4\x49\x40\x4b\xd1\x5b\x6d\xa7\x9d\xc1\xb8\x13\x96\x5f\xe5\x57\x24\x10\xd7\x6f\x5b\x5e\xac\x66\x30\x50\x57\x03\x11\xdc\x98\x42\xb6\xfb\xf8\x80\x6a\xec\x03\x15\x17\x15\xca\xcf\x7f\x21\x80\x2e\x8b\xf5\xe9\x8a\x89\xc0\xd7\xd0\xd0\x98\xb7\x3c\x6e\xfc\x09\x96\x2e\x36\xb4\xe0\x30\xc1\xa6\x4b\x5d\x34\x9f\x5f\x20\x42\xc7\x44\x28\x67\x1e\x4a\x2c\x7f\xea\x0c\xae\xe2\x42\x2d\x85\xc4\xfc\xdd\xfe\xd3\x22\x13\x85\x9a\x69\x95\x5d\x4e\x3e\xbb\x7e\x1b\x20\x22"}, +{{0xe8,0xee,0x06,0x5f,0x99,0x07,0xf1,0xef,0xa2,0xda,0xec,0xb2,0x3a,0x04,0x25,0xf3,0x53,0x09,0x4d,0xa0,0x2b,0xc2,0xc9,0x31,0xf0,0xa5,0x87,0xef,0xc0,0xd1,0x3d,0xe1,},{0xc7,0x26,0x51,0xb7,0xfb,0x7a,0xc0,0x33,0x7a,0x17,0x29,0x77,0x49,0x6f,0xd7,0xf2,0xa7,0x2a,0xea,0x88,0x93,0x85,0x83,0x5e,0x56,0x3c,0x6b,0x60,0x53,0xa3,0x2d,0xc1,},{0xa5,0x10,0xdf,0xf4,0x2d,0x45,0x59,0xa1,0x9a,0x7b,0xf0,0xfe,0x0b,0xea,0x53,0xd3,0xe1,0xf2,0x2d,0xfa,0x6b,0xe5,0x50,0x39,0x89,0x5e,0x12,0xa5,0xd0,0x7d,0xa5,0xf2,0xe3,0x77,0x13,0xcc,0xb2,0xeb,0x21,0x60,0x11,0x62,0x8f,0x69,0x83,0xf8,0x71,0xfe,0xe2,0x86,0xe6,0x6f,0xff,0x4b,0xe7,0x58,0x2c,0x96,0x1a,0x1e,0xd7,0x56,0x84,0x04,},"\xa2\xf0\xc1\x37\x34\x73\xa3\x05\xd8\xf1\xd9\x91\x38\xb0\x6b\x9a\x96\x94\xff\xaa\x8a\x88\x22\x2d\xe9\xf7\x29\xbe\xe1\x30\x51\x75\xdf\xb1\x70\x01\xcc\x77\xf6\x7b\x6d\x40\xc9\x0c\x1a\x28\xfb\x22\x6c\x11\x28\x6d\xb4\xa1\x3e\x45\xe6\x92\x11\x24\x2b\xcd\xd0\x1c\xb6\xe2\xc4\x54\xe7\x6c\x0c\xab\x88\x1b\x4d\x2d\x9d\x3a\xb1\x00\xa5\xd6\x1d\x17\x25\xd8\x66\xe4\xfd\xb6\x6d\x93\xd7\x7f\x5b\x30\x86\x93\xb9\xb5\xa3\x33\xe5\x7f\xa2\x5d\x1e\x5d\x2e\x38\xdf\x6e\x4e\x9e\xc8\x41\x59\xbb\xee\x1f\xfe\xa9\x26\x83\x6a\x01\x01\xc9\x14\x83\xbd\x5b\xc8\x8a\x6f\x1c\xc4\xd4\xe7\xf0\x08\xad\x08\x45\x3a\x01\x23\x42\x9d\xd3\x35\x78\x1c\x7c\xbf\x8d\x68\x5a\x89\x99\xed\x11\x77\x60\x70\x04\xa1\x3c\x4c\xb5\xea\x49\x08\xc5\x42\x60\x7d\x3f\x2c\xd6\x69\x0c\xf1\xf2\xa7\x45\x5b\xbd\x38\xf5\x38\xf0\x7a\x10\x39\x64\x31\x7e\xfb\xce\xe3\x7e\xb4\x69\x31\xc0\x27\xcf\x15\x3e\xf8\x6e\x43\xd7\x82\x81\xeb\xd7\x10"}, +{{0xc7,0x2e,0x67,0xd8,0xc3,0xfe,0xc0,0x04,0xff,0x61,0x87,0x18,0xa9,0x09,0x9e,0xb8,0xad,0x7b,0x06,0xff,0x3b,0x8c,0x54,0x2a,0x7e,0x8b,0x98,0x47,0x31,0x34,0x75,0xe1,},{0x4e,0xb0,0x02,0xd3,0xcc,0xeb,0x18,0x8c,0x66,0x58,0xfe,0xc5,0x1c,0xb4,0x79,0xa6,0x52,0x64,0xac,0x55,0x5c,0x75,0xcd,0xc2,0x24,0x9c,0xf1,0xce,0x3d,0xef,0xc1,0x6d,},{0x2d,0x7b,0xab,0x8e,0xbd,0xa7,0xfc,0xa5,0xbb,0x3c,0x25,0xf5,0x1d,0xc5,0x1b,0x73,0xe6,0xff,0x6a,0x3b,0xb1,0xb5,0x2a,0xcc,0x78,0x11,0xa7,0xd2,0x59,0x5c,0xd6,0xfd,0xaf,0x73,0x04,0x94,0x41,0x8e,0x2f,0x57,0xef,0xdc,0x56,0x17,0xb0,0x66,0xfd,0x7b,0x62,0x07,0x68,0x0d,0x94,0xfb,0x8c,0x43,0xd3,0xd4,0x74,0x0b,0x41,0xcb,0x69,0x01,},"\xa8\xf3\x41\x35\xc0\x13\x2e\xc9\x5b\x64\xb0\xcb\xf5\x1d\x66\x90\x01\x43\x37\x04\x06\x79\x1f\xbb\x55\xf2\xb8\xca\x95\x3c\xc7\x4a\x46\xe0\x8b\x00\x2f\xa2\xda\x21\xb9\x51\xb8\x87\x1f\x7a\x29\xbc\x6d\x38\x79\x0a\xfc\x66\xa3\x29\xc3\x97\xd9\xf9\x25\x0b\xae\x0e\x30\xae\x34\x26\xe0\x8d\x8e\xad\x01\x79\xa3\xb3\x13\xc9\x08\x83\x91\x92\xf2\x89\xa3\xf3\xb6\xe9\x60\xb4\xc5\xce\xbe\xf0\xa0\x9d\xaa\x9c\x7a\x15\xc1\x9d\x4e\xbc\x6f\xc2\xac\x3c\xd0\x22\x32\xe8\x32\xb2\x34\xed\xd7\x96\x5d\x68\x7b\xfe\xb7\x58\xf7\x0f\xa7\x96\x38\x41\xb7\x85\x9b\xb9\x7c\x97\x1b\xd5\x57\xbc\x87\x69\x52\x4a\xc4\xc6\xee\xb3\x57\x97\x93\x33\x4b\x52\x2d\x17\x6b\xc6\x2f\x86\xb4\xd5\xc0\xd4\x01\x70\x36\xd2\xb6\xbd\x4e\x43\x84\x41\x6e\xf8\x26\x31\x39\x69\x1a\x86\x06\x17\x0d\x73\xc9\x3d\x64\x17\xdc\xc1\xa0\x8a\x53\x7c\x9e\xd4\x40\x04\x71\xa4\x6f\x52\x90\x7b\x46\xb1\x0a\x8b\x68\x89\xdb\xb4\x64\x7a\x8b\xbc\x71\x49"}, +{{0x69,0x64,0x50,0xb5,0x57,0xec,0x3c,0x94,0xcf,0x1a,0xf1,0x32,0x64,0x75,0x63,0x4a,0xa8,0x1d,0xef,0x38,0x14,0xff,0x30,0xa0,0x2b,0xa7,0xf2,0x04,0x4b,0x59,0xc0,0xfe,},{0x85,0x84,0x77,0x3c,0x56,0x6b,0x0e,0xed,0x3f,0x43,0x28,0x17,0x05,0xb5,0x75,0xa4,0x34,0xe4,0x7d,0x6c,0xf6,0xb2,0x51,0xb8,0x98,0x03,0xfe,0xf5,0x35,0x34,0xcb,0x29,},{0xce,0x8b,0x0a,0x57,0x79,0xf4,0xf5,0xf4,0x01,0xe8,0x4d,0x65,0x92,0x7a,0x0c,0x28,0xdf,0x82,0x9e,0x95,0xd0,0x9b,0xfa,0x97,0x11,0x1b,0x87,0x00,0x07,0x8f,0xf8,0x94,0xcf,0x72,0x77,0xe3,0x4a,0x71,0x61,0x44,0xd5,0x53,0x06,0xfc,0x9e,0x2f,0x64,0xcd,0x28,0x75,0x83,0xcc,0x80,0x03,0xbe,0x0e,0x8f,0xaf,0x26,0xaf,0x76,0x40,0x14,0x0e,},"\xcc\x25\x78\x29\xf3\x0a\x5f\x90\xdf\xdb\xc2\x47\xd4\x2e\x38\x87\x38\xb7\x6c\x41\xef\x8a\x82\xa5\xe0\x22\x5d\xdf\x1e\x38\x6d\x77\x08\x0b\x3b\x9d\xf8\x6c\x54\xb8\x5c\xdf\x2c\x32\xf3\x67\xab\xa0\xc3\xb6\xbf\x88\x8a\x5a\x69\x03\x52\x9b\x6a\xeb\x4d\x54\x07\xa1\x01\x80\x14\x91\x14\x13\x02\x28\xfc\x43\x56\xcc\xf3\x66\xb7\x7b\xe8\x97\x96\xa9\xe7\x1a\x0c\x69\x3f\x31\xe5\x84\xa4\xf1\x43\x09\x7b\xa3\x70\x36\x3b\x67\xb2\xf2\xe2\xfd\x8d\x6f\xe8\xb4\xe8\xdb\xf0\xd7\xdc\xc1\xa8\x36\x00\x41\x15\x8a\xa2\xaf\xf7\xe2\xa3\x25\xb8\xe5\x18\xf1\x93\xa2\x8b\xae\x05\xe3\xd5\x2b\x26\x62\x1a\xf4\x02\x02\x6d\x7f\x25\x0e\x86\xdc\xee\x30\x1a\x58\xb6\x31\xea\xdf\x45\x27\xe9\x58\xf0\x2a\x61\x58\x7f\x0b\xb5\x16\xce\xfa\xc0\x09\xfe\x51\x05\x2f\xff\x53\x33\x6d\xbd\x94\xe7\x26\x6d\x3b\x43\xca\xba\x8a\x1b\x38\xe5\xd8\x71\xc2\xa2\x4a\x4c\x41\x2f\xff\x3f\x7a\x9a\x52\xa8\xab\x23\xba\xc9\x79\x1b\x2b\x5a\x66\x9a"}, +{{0xa8,0xdd,0x35,0xf0,0x54,0xfb,0x6f,0xf6,0xf0,0xab,0x09,0x4a,0x0d,0x3d,0x1c,0x26,0x28,0x32,0x18,0x1d,0xf3,0x5c,0xcd,0x51,0x92,0x54,0x5e,0xbd,0x6a,0x9c,0xf5,0x29,},{0xca,0x41,0x23,0x38,0xd3,0x81,0x4b,0x88,0x6d,0x96,0x4b,0x71,0x92,0x5e,0x1a,0xab,0xb3,0xff,0xd0,0x78,0x34,0xdb,0xe7,0xdc,0x51,0x25,0x68,0x88,0x2b,0x53,0xe4,0xa3,},{0xfa,0x70,0x9f,0xbc,0x83,0x82,0xaf,0x83,0xd1,0x18,0x12,0x61,0x8d,0xfa,0xca,0x45,0x2e,0xab,0x83,0xe4,0xc5,0x3f,0xe9,0xe5,0x85,0x84,0x67,0xd0,0x7b,0x67,0x67,0xe1,0x79,0x75,0xc1,0xe0,0x63,0x93,0xd6,0xdd,0xe1,0x5a,0x34,0xd9,0x47,0x3d,0x1c,0xf4,0xd6,0xd8,0xc2,0xd5,0x73,0x94,0x52,0x00,0x80,0xfa,0xc4,0xe4,0x34,0x48,0xbe,0x07,},"\x55\xa7\xad\x91\x32\xd6\x3a\xc1\x61\xe7\xad\xb1\x32\xb9\x18\x9f\xdd\x84\xc3\x61\xc1\xe4\xf5\x41\x9a\x6d\xf7\x3d\xf4\xd7\xae\xb2\x9a\x8d\xc4\xbf\x01\x49\x0d\x4f\x48\x4e\x2d\x12\x07\x75\x17\xf5\xfc\x7a\xd0\xbd\xed\xa2\x0a\x6c\xb0\x22\x79\x42\x29\x0b\x08\xc3\xfe\x33\xab\x9b\x21\x35\xbc\x38\xa6\x57\x9a\x54\xbd\x98\x2f\x7d\x14\x17\xce\x86\x71\x17\xae\xa9\x18\xdb\xd3\xdd\x47\x6e\x7e\xb5\xb5\xd3\xc3\xe4\x8a\x86\x4a\x2f\x94\x2a\x31\x50\x1a\xa2\xb2\x9b\x53\xb8\x05\x13\xc9\x5d\x6a\x41\x18\x44\xf0\xde\xdf\x16\xa2\x9a\xc2\x67\xd3\x31\xe5\x3b\xdc\x25\x39\xbf\xcf\x32\xdc\x9b\x5d\x64\x0f\x12\x31\xe2\xca\xfb\x0a\xe9\x4b\xb5\x18\x94\x26\x86\x33\x64\x26\x2e\xfb\x47\xb5\xb5\xcc\xdb\xbc\x93\x32\x42\x16\xa7\x99\xb6\xf5\x0d\x37\x04\xf1\x5e\xd5\x9a\xf6\xcc\x7d\x91\x0c\xf0\x62\xd1\xbe\x63\x2d\xca\x5d\xf2\x13\xd4\x87\xd8\x56\x4f\x2b\x2b\xd7\xd8\x18\xbb\xa2\x7c\x36\x40\x13\xd9\x2d\x7f\x72\x62\x54\x62"}, +{{0xae,0x1d,0x2c,0x6b,0x17,0x1b,0xe2,0x4c,0x2e,0x41,0x3d,0x36,0x4d,0xcd,0xa9,0x7f,0xa4,0x76,0xaa,0xf9,0x12,0x3d,0x33,0x66,0xb0,0xbe,0x03,0xa1,0x42,0xfe,0x6e,0x7d,},{0xd4,0x37,0xf5,0x75,0x42,0xc6,0x81,0xdd,0x54,0x34,0x87,0x40,0x8e,0xc7,0xa4,0x4b,0xd4,0x2a,0x5f,0xd5,0x45,0xce,0x2f,0x4c,0x82,0x97,0xd6,0x7b,0xb0,0xb3,0xaa,0x7b,},{0x90,0x90,0x08,0xf3,0xfc,0xff,0xf4,0x39,0x88,0xae,0xe1,0x31,0x4b,0x15,0xb1,0x82,0x2c,0xaa,0xa8,0xda,0xb1,0x20,0xbd,0x45,0x2a,0xf4,0x94,0xe0,0x83,0x35,0xb4,0x4a,0x94,0xc3,0x13,0xc4,0xb1,0x45,0xea,0xdd,0x51,0x66,0xea,0xac,0x03,0x4e,0x29,0xb7,0xe6,0xac,0x79,0x41,0xd5,0x96,0x1f,0xc4,0x9d,0x26,0x0e,0x1c,0x48,0x20,0xb0,0x0e,},"\x9e\x6c\x2f\xc7\x6e\x30\xf1\x7c\xd8\xb4\x98\x84\x5d\xa4\x4f\x22\xd5\x5b\xec\x15\x0c\x61\x30\xb4\x11\xc6\x33\x9d\x14\xb3\x99\x69\xab\x10\x33\xbe\x68\x75\x69\xa9\x91\xa0\x6f\x70\xb2\xa8\xa6\x93\x1a\x77\x7b\x0e\x4b\xe6\x72\x3c\xd7\x5e\x5a\xa7\x53\x28\x13\xef\x50\xb3\xd3\x72\x71\x64\x0f\xa2\xfb\x28\x7c\x03\x55\x25\x76\x41\xea\x93\x5c\x85\x1c\x0b\x6a\xc6\x8b\xe7\x2c\x88\xdf\xc5\x85\x6f\xb5\x35\x43\xfb\x37\x7b\x0d\xbf\x64\x80\x8a\xfc\xc4\x27\x4a\xa4\x56\x85\x5a\xd2\x8f\x61\x26\x7a\x41\x9b\xc7\x21\x66\xb9\xca\x73\xcd\x3b\xb7\x9b\xf7\xdd\x25\x9b\xaa\x75\x91\x14\x40\x97\x4b\x68\xe8\xba\x95\xa7\x8c\xbb\xe1\xcb\x6a\xd8\x07\xa3\x3a\x1c\xce\x2f\x40\x6f\xf7\xbc\xbd\x05\x8b\x44\xa3\x11\xb3\x8a\xb4\xd4\xe6\x14\x16\xc4\xa7\x4d\x88\x3d\x6a\x6a\x79\x4a\xbd\x9c\xf1\xc0\x39\x02\x8b\xf1\xb2\x0e\x3d\x49\x90\xaa\xe8\x6f\x32\xbf\x06\xcd\x83\x49\xa7\xa8\x84\xcc\xe0\x16\x5e\x36\xa0\x64\x0e\x98\x7b\x9d\x51"}, +{{0x02,0x65,0xa7,0x94,0x4b,0xac,0xcf,0xeb,0xf4,0x17,0xb8,0x7a,0xe1,0xe6,0xdf,0x2f,0xf2,0xa5,0x44,0xff,0xb5,0x82,0x25,0xa0,0x8e,0x09,0x2b,0xe0,0x3f,0x02,0x60,0x97,},{0x63,0xd3,0x27,0x61,0x5e,0xa0,0x13,0x9b,0xe0,0x74,0x0b,0x61,0x8a,0xff,0x1a,0xcf,0xa8,0x18,0xd4,0xb0,0xc2,0xcf,0xea,0xf0,0xda,0x93,0xcd,0xd5,0x24,0x5f,0xb5,0xa9,},{0xb6,0xc4,0x45,0xb7,0xed,0xdc,0xa5,0x93,0x5c,0x61,0x70,0x8d,0x44,0xea,0x59,0x06,0xbd,0x19,0xcc,0x54,0x22,0x4e,0xae,0x3c,0x8e,0x46,0xce,0x99,0xf5,0xcb,0xbd,0x34,0x1f,0x26,0x62,0x39,0x38,0xf5,0xfe,0x04,0x07,0x0b,0x1b,0x02,0xe7,0x1f,0xbb,0x7c,0x78,0xa9,0x0c,0x0d,0xda,0x66,0xcb,0x14,0x3f,0xab,0x02,0xe6,0xa0,0xba,0xe3,0x06,},"\x87\x4e\xd7\x12\xa2\xc4\x1c\x26\xa2\xd9\x52\x7c\x55\x23\x3f\xde\x0a\x4f\xfb\x86\xaf\x8e\x8a\x1d\xd0\xa8\x20\x50\x2c\x5a\x26\x93\x2b\xf8\x7e\xe0\xde\x72\xa8\x87\x4e\xf2\xee\xbf\x83\x38\x4d\x44\x3f\x7a\x5f\x46\xa1\x23\x3b\x4f\xb5\x14\xa2\x46\x99\x81\x82\x48\x94\xf3\x25\xbf\x86\xaa\x0f\xe1\x21\x71\x53\xd4\x0f\x35\x56\xc4\x3a\x8e\xa9\x26\x94\x44\xe1\x49\xfb\x70\xe9\x41\x5a\xe0\x76\x6c\x56\x5d\x93\xd1\xd6\x36\x8f\x9a\x23\xa0\xad\x76\xf9\xa0\x9d\xbf\x79\x63\x4a\xa9\x71\x78\x67\x77\x34\xd0\x4e\xf1\xa5\xb3\xf8\x7c\xe1\xee\x9f\xc5\xa9\xac\x4e\x7a\x72\xc9\xd7\xd3\x1e\xc8\x9e\x28\xa8\x45\xd2\xe1\x10\x3c\x15\xd6\x41\x0c\xe3\xc7\x23\xb0\xcc\x22\x09\xf6\x98\xaa\x9f\xa2\x88\xbb\xbe\xcf\xd9\xe5\xf8\x9c\xdc\xb0\x9d\x3c\x21\x5f\xeb\x47\xa5\x8b\x71\xea\x70\xe2\xab\xea\xd6\x7f\x1b\x08\xea\x6f\x56\x1f\xb9\x3e\xf0\x52\x32\xee\xda\xbf\xc1\xc7\x70\x2a\xb0\x39\xbc\x46\x5c\xf5\x7e\x20\x7f\x10\x93\xfc\x82\x08"}, +{{0x6b,0xce,0x4d,0xfd,0x53,0xbf,0xa5,0x50,0x6f,0x2f,0x55,0x4d,0x2d,0x99,0x4a,0x0d,0xc4,0x0c,0xaf,0xcd,0xec,0x7e,0x1b,0xe0,0x50,0x00,0x6e,0x5c,0x5a,0x4b,0x38,0xa1,},{0xc8,0x90,0x02,0x37,0x28,0xd8,0x39,0x70,0x70,0x29,0x17,0x71,0xe6,0x5e,0x03,0x4d,0x34,0xd4,0xaa,0xe5,0xe2,0x47,0x65,0x3e,0x4f,0xf4,0xc0,0x74,0x59,0x1d,0xa7,0x02,},{0x99,0xae,0x67,0x82,0xff,0x27,0x64,0x6c,0x27,0xf6,0x1e,0x23,0x63,0x6a,0xe1,0x88,0x15,0x21,0xcf,0xa5,0xed,0x25,0x6f,0x70,0xbc,0xe7,0xce,0x00,0xb6,0x82,0x80,0xce,0x8e,0x0c,0x82,0xaa,0x76,0x5a,0xfb,0x8b,0x5a,0x1f,0xf2,0xfe,0x42,0xc5,0x74,0x41,0xe4,0x58,0xe4,0x43,0xdc,0x8b,0x12,0x34,0x77,0xae,0x33,0xd8,0x84,0x88,0x8c,0x0b,},"\x32\x39\x19\x07\x47\xee\x33\xd4\x0b\xf8\x70\xac\x9a\xd4\x9d\x88\xee\x32\x0f\x63\xc0\x52\x57\xe8\xab\x2c\x60\x30\x65\x97\xce\x76\xd1\xf1\xe7\x92\xab\x6a\x65\xca\xa5\x44\xfb\xec\x20\x89\x2f\xd4\x96\x05\x94\xf3\x1b\x37\x63\xef\x07\xd4\x98\x2e\xae\x4a\x2d\xbf\x33\x77\xdc\xc1\xe3\xf9\x5e\x46\xed\x39\xb7\xf0\x22\x2f\x04\xbb\x5c\x3b\x43\x4c\x8f\x9f\x31\x0d\xe9\xf1\x22\xa2\x9f\x82\x41\xe8\x1e\x20\x65\x49\xae\x62\x8d\x2b\x8a\xd7\x68\x97\x2c\x98\x84\x7c\x11\x88\xad\x04\xc8\x35\x35\x63\x78\xbe\xf7\x9c\xd1\x26\x86\x94\x05\xb1\x29\xfd\xbd\xc3\xbc\x48\x9c\xbd\x13\x99\x50\x5d\xad\xef\x76\x17\xb5\xbe\x5d\xa1\x73\xd3\xe8\x0e\x58\x38\xc9\x9e\x34\x92\x76\x24\x27\x29\xe0\x21\x9b\xd7\x47\x6a\xe5\xc4\xf8\x1a\x12\x87\x8f\xb4\x83\xa6\xc0\xe9\xb0\xdf\x29\x62\xeb\x0b\xf0\x01\x57\x78\x2c\xf7\x68\xa1\xb7\x1c\x01\x01\x69\xee\x85\x22\xde\xf0\x02\x4a\xd7\xe4\x57\x75\xa2\x90\x63\x9c\x53\xaa\xf4\x81\x98\xc4\x2d\xe7\x5c"}, +{{0x17,0x86,0x1a,0x8d,0x41,0x54,0xac,0xd4,0xfa,0x9c,0x8f,0xc9,0x47,0xc1,0x88,0x6c,0x11,0x29,0x0b,0xe2,0x22,0x87,0x2f,0xf4,0xf8,0xcd,0x25,0x93,0x9e,0x4d,0x13,0x61,},{0x43,0x77,0x3f,0x44,0x49,0x06,0x5e,0xae,0xba,0xf8,0x93,0x7b,0xaf,0x75,0x85,0x60,0xb0,0xc4,0xd2,0xde,0x46,0x97,0x78,0x39,0xb3,0xb8,0x73,0xd5,0xd7,0xd5,0xfd,0x8f,},{0xa5,0xee,0x02,0x4c,0xcd,0xbd,0xd4,0xc2,0x1a,0x24,0x70,0x9e,0xc5,0x3d,0xcc,0xb7,0xee,0x17,0x62,0x6d,0xd0,0x0a,0x09,0x3d,0x08,0x84,0xf5,0xb4,0x5c,0x4c,0x9d,0x16,0x91,0x84,0x01,0x51,0xc3,0x3c,0x8a,0xa0,0x7b,0x69,0xb3,0x4e,0x16,0xf6,0x16,0x47,0xeb,0xe7,0x93,0xae,0x4d,0xaa,0x70,0xcf,0xf4,0x8e,0x6a,0xb4,0x2f,0xfd,0xbc,0x00,},"\x18\x4d\xf5\xea\x32\x15\xeb\xe1\x80\x39\x0b\x0f\xf0\x42\xba\x23\x81\x15\x5a\x03\x8d\xc7\x32\xf7\x6a\x01\xc7\xe7\x0f\x82\xd1\xcc\xc9\xde\x9a\x05\x96\xb3\xfe\xe4\x47\x20\x9c\x99\x26\x84\xf6\x43\xdf\x21\xf4\xcf\x9d\x17\x92\x62\x79\x0e\x86\x23\xe4\x24\x72\xdc\x35\x19\x97\xe6\xda\x18\x9c\x07\xe1\xe8\x88\x2c\x07\xf8\x6c\x63\x37\xec\x01\x13\x91\x2c\xf9\x22\x15\xc8\xde\x19\x82\xb8\xfc\x57\xbf\xab\xc5\x5a\x3e\x87\x36\xf7\x36\x10\x42\x9d\x97\xfe\xb5\x1d\x79\x4f\x50\x5d\x0c\x5a\x0b\x3a\xbd\x48\xef\x7f\x55\xa6\x28\xf9\x0b\x85\x67\xa1\xc1\x5e\xa9\xd1\x90\xd7\xbf\x4e\xc2\xbc\x93\x34\xad\xa6\xcb\x92\x80\x8d\xfc\x20\x64\x83\x6f\xcf\xa4\x6b\x96\xfd\x7a\x5d\x6f\x4b\x05\x4d\xab\x09\xb7\x35\x95\xfe\xb8\x9e\xd0\x05\xb9\xec\x9d\x31\x88\x12\x1d\xe6\x96\x96\xd6\x4e\x7c\x7b\xbd\xfc\x1c\x46\x9f\xaf\x14\x8c\x38\xa7\x78\x59\x70\xaf\xe1\xac\xd0\x6a\x92\xc9\x94\x78\xfe\x44\x97\x4e\x3b\xb2\x09\x5e\x44\x67\xe9\xb2\xe9\x96"}, +{{0x0a,0x84,0xba,0xa5,0x4f,0x11,0xcf,0x17,0x09,0x0f,0xec,0x61,0xf3,0xf9,0x40,0x15,0x08,0xa3,0xa0,0x38,0x87,0xac,0xa1,0xa7,0x93,0x93,0x94,0xb1,0xee,0x40,0xa9,0x25,},{0x30,0x9a,0x73,0xc6,0x2d,0x23,0xd7,0x40,0xf2,0xe9,0x3c,0x18,0x58,0x7a,0xc1,0x5e,0x7e,0xc4,0x80,0xd2,0x5a,0xc0,0x79,0x4e,0x10,0xf8,0xcd,0x46,0x1c,0xc2,0xb1,0x30,},{0x4d,0x87,0x0b,0xd5,0x3a,0xf8,0xf1,0x3f,0x21,0x4d,0x99,0x34,0xec,0x90,0x3a,0xc4,0x82,0x84,0x09,0x2c,0xd9,0xb1,0x62,0xa4,0x4c,0xce,0xc8,0x51,0xfa,0x94,0x2d,0xe7,0x15,0xcc,0xda,0x07,0xb7,0x99,0x1d,0x71,0x27,0x23,0xe7,0xa4,0xd5,0xb4,0xf0,0x37,0x4a,0xb8,0x5a,0xc3,0x86,0x7e,0x0b,0x53,0xeb,0xc4,0x6b,0x53,0x0f,0x9f,0xed,0x05,},"\xfe\x70\x01\x7b\x14\x67\x8b\x0d\x3a\xd0\x3e\x18\x3d\x6f\x53\x31\x43\x78\x37\x9a\xb3\xda\x65\xb3\x51\x12\x57\xb3\xd5\x40\x86\xe8\x6f\x20\x31\x13\x90\x21\x39\x1a\xf9\xd7\x20\x85\xff\x7c\x3d\xc8\xc1\xe2\xd9\x1e\x53\x33\x38\x55\x42\x3d\x0f\x78\x5e\x2c\xc5\xf8\xb7\x79\x9f\xcf\x1b\x70\xe6\xbe\xcb\x78\x8e\x53\xe9\x02\x0f\x29\x95\xdd\xb0\xc3\x83\xa1\xf8\x10\x38\xfc\x3d\x54\x3c\xe0\xa3\x8c\x9c\x28\x8a\x9b\xc4\x07\x7f\x42\x77\xdc\xc6\xc5\x64\x22\x63\xfc\xfe\x19\x68\x80\x05\xa6\x03\xf5\x76\x75\xd2\x43\x4f\x3e\xd1\xf4\x6d\x32\xf1\x4e\xae\xb0\x73\xe8\x3e\xe7\x08\x6d\xa2\xfb\x67\x65\x9d\x3f\xb6\x8c\x62\x32\x0b\x77\x27\xb3\xb8\xea\x00\x65\x76\xbc\x2c\x7e\x6b\x5f\x1e\xce\xfa\x8b\x92\xe7\x0c\x92\xc8\x89\x51\xd0\xc1\x2d\x91\xde\x80\x1c\x38\xb7\xca\x5a\x0a\x04\xb4\xc3\x42\x9a\xba\x86\x38\x6e\x96\xe0\x6a\xfd\x20\xd4\xc5\xc2\xfe\x2b\x9b\x42\x73\xeb\x05\x20\x1a\x79\x27\x3a\xbd\xbe\xb3\x7e\xd1\x83\x0d\x22\x6b\x6b\xdb"}, +{{0x38,0x37,0x94,0x23,0xda,0xfd,0xbf,0x25,0xe1,0x9d,0x72,0x31,0xbd,0xdd,0x80,0xb4,0xce,0xfc,0xfe,0x2a,0xed,0x93,0x25,0x84,0xdf,0xa0,0xcc,0x3c,0x9f,0x92,0x32,0xde,},{0x59,0x7e,0x81,0xdc,0xee,0x94,0x48,0xb7,0x7d,0xe6,0x82,0x9e,0x79,0x21,0xc8,0xa3,0x90,0x53,0x5d,0x89,0xa0,0x84,0x94,0x30,0xae,0xd6,0x63,0x64,0xee,0x14,0x0d,0x8b,},{0xd8,0xb5,0x0a,0x88,0xae,0xd6,0xf2,0xa9,0x6d,0x08,0x22,0x13,0xad,0xf8,0xb2,0x51,0x9f,0x6a,0x0b,0xbd,0x30,0xdd,0x3c,0xb0,0xf3,0xfd,0x3c,0xe1,0xc6,0x43,0xfc,0x02,0x99,0x46,0xcd,0x43,0x46,0x2e,0xd2,0x25,0x13,0xf1,0xd6,0x5f,0xca,0x24,0xbd,0xe3,0x81,0x81,0x66,0xba,0xa8,0x6d,0xaa,0x79,0x87,0x92,0xaf,0xaf,0xe0,0xc1,0xa1,0x0a,},"\x36\x12\x5c\xa6\x66\x68\x80\x29\x06\x23\x7e\x63\xa2\xfe\x5a\xe6\x10\xf1\x1a\x7c\xf9\x25\x20\xd1\x9e\x66\x90\xa3\xad\xfa\xfd\x5d\x07\xa7\x84\xbc\x1a\x0e\x18\x52\x73\xd1\x1d\x34\x0d\x5e\xff\x90\x15\x97\xde\xdf\x45\x0c\x46\x99\xd4\x3f\x3f\xb1\x68\xd5\x57\xf6\xc9\xc0\x30\x77\xc3\xcd\xc3\x70\xd3\x48\x32\xcc\xdf\x2a\x8e\x3d\x75\x79\x64\x90\xed\x02\x42\x89\x9d\x25\xdd\xf4\x4b\xfc\x66\xf3\x29\xcf\x4c\x45\x16\x87\x03\xc3\x1b\xc9\x20\x2d\x89\x0f\x39\x69\xff\xd3\xac\x35\xa1\x28\x18\xdc\xa7\x51\xce\xb8\x80\x8f\xe8\x1e\xfa\x26\xa5\xe0\xd2\x00\xc5\xec\x1d\x94\xa5\x09\x7e\xa7\x4b\x64\x98\xfe\x28\x8f\x30\xc4\x8d\x72\x7e\x9d\x3d\x35\xc8\xe1\x2d\x85\x42\x07\x02\x55\x6f\x28\x61\x48\x4f\xfd\x09\xb4\xf1\x22\x65\xcc\x9a\xba\xfe\xb8\x2c\xf5\x90\x02\x88\x95\xa7\xd0\x50\xff\x57\xcc\xf5\xf2\x80\x22\xd0\x16\xab\x40\x94\xb0\x62\xe4\x8b\x66\xfd\x36\xd1\xe1\x96\x26\xe5\x21\x5e\xfa\x40\xfb\x7e\x3b\x70\x62\xf8\x1e\x95\x48\x30\xc9"}, +{{0xf9,0x25,0xd2,0x74,0xaa,0xf1,0xfe,0x1a,0x21,0x65,0x62,0x37,0x38,0x5e,0x97,0xf7,0x78,0x3e,0x78,0x09,0x0c,0x5d,0x42,0x17,0xfe,0xce,0x70,0x57,0xc8,0x0f,0x42,0x6d,},{0x3b,0x0f,0xc3,0x70,0xbe,0x3a,0x4b,0x19,0xa8,0x8a,0xb9,0x98,0xc5,0x95,0x04,0xff,0xb5,0x9a,0x87,0x60,0x63,0x38,0xe6,0x73,0xdf,0x5b,0x3f,0xab,0x4d,0x9b,0xfb,0x8d,},{0x79,0x54,0x9a,0x31,0x7d,0x10,0xa0,0xbe,0x32,0x2a,0x94,0xa1,0x51,0xad,0x11,0xe7,0x7e,0xfc,0x48,0x36,0xcc,0x80,0x06,0xa8,0x50,0x81,0x27,0x3d,0x76,0x02,0xa6,0x38,0x96,0x3a,0x9c,0xaf,0x19,0xc3,0xed,0xf1,0xe2,0x5f,0xad,0x1e,0x9d,0x68,0x70,0x1a,0x71,0xde,0xa7,0x27,0xda,0x6a,0x5c,0x5b,0xca,0xc9,0x33,0x95,0x89,0x22,0x4b,0x05,},"\x14\x3c\xaa\xfa\x5f\x62\xb1\x3e\x43\xdf\xfa\x49\xd4\x20\xfa\x99\xf7\x71\xb1\x92\x6d\x40\xd6\xcb\x2b\xbb\x42\x7f\x27\xb6\xc2\x66\xeb\x3d\xeb\x2d\x8b\xbb\xd4\x7b\x82\x14\xad\x40\x25\x1c\xb1\x90\x7a\xd6\x5e\xb9\x41\x93\xe5\x4a\xd8\x5c\x67\x00\xb4\x18\x9e\x80\xf1\xcc\x01\x54\xc6\x3e\xd1\x51\xa8\xbb\xbd\x30\xe0\x16\x37\xca\x58\xe7\x0a\xa3\xee\x52\xef\x75\xd0\x87\x30\x78\xa4\x05\x01\x4f\x78\x6e\xb2\xd7\x7b\x7f\x44\x22\xf9\x27\x82\x3e\x47\x5e\x05\xb2\x42\x45\xf9\x06\x8a\x67\xf1\x4f\x4f\x3c\xfb\x1e\xb3\x0b\xfe\xde\x7b\x32\x62\x23\x0c\xed\x9e\x31\x36\x1d\xb1\x96\x36\xb2\xc1\x2f\xdf\x1b\x9c\x14\x51\x0a\xcd\x5b\xc1\x8c\x0d\xdf\x76\x35\xe0\x03\x50\x3e\x6f\x71\xe1\xc3\x65\xcd\xfb\x4c\x65\xee\x75\xb4\xde\x06\x94\xaf\x87\x07\x63\x74\xd6\x31\xe6\xc4\xb8\xe2\x40\xfa\x51\xda\xb5\xe1\xf8\x0c\xa2\xa0\x6c\x49\xf4\x2e\xa0\x9e\x04\x75\xde\xfb\x18\x4d\x9c\xde\x9f\x58\xf9\x59\xe6\x40\x92\xaa\xc8\xf2\x02\x7e\x46\x81\x26\xf2\xfb"}, +{{0x97,0x1f,0x80,0x6b,0xe6,0xf0,0x7d,0x41,0xbe,0x88,0x30,0xff,0x8d,0xae,0x70,0x4b,0x08,0x63,0x8a,0xd6,0xcf,0xf7,0x22,0xd8,0x43,0x25,0x38,0x12,0x7b,0x76,0x96,0x25,},{0xaf,0x6a,0xc9,0x8d,0xce,0x20,0x78,0xa6,0xc7,0x3f,0x60,0x97,0xba,0xb6,0x3f,0x20,0x5c,0xaf,0x69,0x53,0xaf,0xa2,0x84,0xd0,0x42,0xbd,0x50,0xa4,0xfc,0xe9,0x6c,0xb4,},{0x20,0x37,0xa0,0xa7,0x67,0x4b,0x84,0xff,0x27,0xd0,0xb2,0x2f,0x62,0xb4,0xba,0xc6,0x5e,0x2d,0xc0,0xf5,0xfd,0xc8,0x99,0xfe,0xb7,0x80,0x0f,0x25,0xc2,0x99,0x81,0xde,0xe6,0x41,0xc5,0xa5,0x0f,0x8b,0x94,0x10,0x97,0x0b,0x49,0xd2,0xd5,0x36,0x58,0xc8,0x9e,0xe1,0x69,0x61,0xdc,0xcf,0x53,0x91,0xa6,0x91,0x8f,0x2a,0x84,0xea,0xda,0x0b,},"\x01\x34\x55\xd0\x49\xaa\x54\xed\x99\x5f\xbd\x94\xe6\x36\x99\x55\x49\x53\x95\xe4\x43\x88\x22\x25\x9b\x10\x60\xe9\xa3\x47\x79\x04\x2a\x1a\x69\x21\x1f\x6e\xa2\x07\x73\x99\xdd\x23\x48\x06\xba\x0b\x35\x3c\xd7\x9a\x57\xe1\xc4\x9b\x25\x0a\xb2\x71\x06\xdc\xde\x57\x6e\xcf\xa1\x15\xea\xe4\x61\xfe\xbb\x12\xd2\xda\x25\xff\xcf\x17\xb7\x15\xf8\xd9\x5c\x2f\x0c\x42\x5d\x5a\x81\xf7\x00\x11\x5b\x70\xd4\x9e\x1c\xfe\x49\xfc\xaa\x14\xfa\x20\x5e\x28\xec\x85\x24\x7f\x1a\x6e\x71\x28\xbf\x3b\xb3\x06\x0d\xc0\x84\x64\xbd\xa6\x53\x85\x40\xd0\xac\x47\x20\x93\xe5\xa0\x72\x0f\xde\x2f\x3d\xc4\x78\x8e\x0e\x9b\x0d\xbf\xe2\xa2\xb5\xf1\xa0\xf3\xf8\x0d\xe9\x84\x02\x5b\x15\xc6\x5a\xf7\x7f\x67\x1e\x1c\x5e\x28\x40\x44\x4d\xe5\xc7\xed\xa0\x25\xe6\xdc\x1a\x3f\xf1\x6e\x26\xcc\x54\xcd\xee\xd5\x6b\xe7\x3f\x9b\x01\xab\x2b\x1b\xc1\x6c\x8e\xf5\x8a\x5b\x76\xdd\x47\x28\x78\x07\xe5\xc5\x0f\x0d\x7c\x0a\x5b\x81\x20\xdf\xde\x64\x5a\x01\x2c\x5c\xf1\x14\x91\xbc"}, +{{0x2b,0xb0,0x65,0x2f,0x8f,0xff,0x69,0x01,0x99,0x11,0x48,0xc6,0x8a,0x32,0x67,0x87,0x72,0x71,0x00,0x6a,0xe9,0x58,0x91,0x49,0xbb,0x20,0x68,0x50,0xcd,0xf5,0x2f,0xb0,},{0xc0,0x3b,0x77,0xbe,0x98,0x3e,0x74,0xa2,0x34,0xc1,0x98,0x64,0x96,0xb2,0x92,0xe1,0x39,0x99,0x2e,0xb7,0x52,0x9e,0x70,0xb3,0xaf,0xad,0x7a,0xe4,0xfd,0xcf,0x8a,0x66,},{0x4e,0x15,0x8d,0xea,0xae,0xc3,0xd8,0x89,0x41,0x29,0x6a,0xf2,0xd2,0x73,0x41,0x01,0x2b,0x02,0x41,0xd4,0xe0,0xf4,0x6e,0x43,0x5e,0x37,0x5c,0x98,0x75,0xe8,0x9f,0x5e,0x32,0xc0,0x57,0xb5,0x27,0xbc,0x34,0x11,0xaf,0x09,0x6a,0x77,0xbf,0xce,0xb4,0x5b,0x98,0x3e,0xfe,0x45,0x5e,0x3f,0x03,0x15,0x5d,0x6b,0xc7,0xb0,0xac,0xc8,0xe6,0x0c,},"\xb9\x23\xca\x67\xe3\x96\xd8\x65\x6f\xa3\xdb\xce\x82\x89\xa3\x8b\xd3\xc1\x28\xce\xfb\x30\xef\xc1\x86\x2b\xb9\x44\xb4\x50\x78\x05\x41\x98\x24\xce\x2b\x83\xd6\x90\xef\x4c\xf1\x07\x49\x28\x17\x14\x3b\xf6\x4c\x02\x49\x89\xaf\x1a\x7d\x2e\x1f\x5a\xc9\x78\x74\xf8\x6b\xb0\xd3\x77\x3f\xf8\x40\xf5\x14\xd9\xa1\x39\x4a\x39\x59\xb0\x11\xd3\xa6\xb8\x16\xa3\xfa\xe5\xde\x17\xb2\xa9\xff\x34\x98\x63\xd2\x7f\xbb\xb5\x0c\xca\x73\x41\x08\x75\x10\x00\xd6\x35\x8c\xa0\x64\x7a\x93\xeb\x49\xe2\xe7\xaf\x06\x28\x7d\x48\xf2\xc0\x9d\x5c\x1c\x73\xe4\xd8\xf7\x7e\xa2\xbc\xaa\x73\x56\x79\x5b\x26\x72\x87\x19\xbe\xd5\xff\xdb\x82\x15\x78\xbd\x5d\x66\xbf\x92\xed\xaf\x8b\x23\x8b\x2b\xbd\x7d\x1e\x2c\x30\xa7\x87\xf9\x01\xa3\x3d\x0a\x76\x66\x9a\x9c\x3c\x7f\x2b\x55\x2c\xcb\x83\x49\xc7\xde\xd5\xe1\xa4\x61\x70\xcf\x28\xe3\x59\xe2\xfd\xd5\x4b\x05\xa5\x62\xf5\x28\xc6\x8a\x56\x97\x4d\xf8\x2d\x46\x66\x37\xc8\xe5\x32\x46\xa7\x21\x7e\x43\x86\x80\x1e\x0e\x32\x66"}, +{{0xdb,0x9b,0x81,0x2c,0xb3,0xc7,0xc0,0x3b,0x97,0x7f,0x48,0x7d,0x3d,0x65,0xcc,0xd9,0xcd,0x2f,0x3d,0xee,0x11,0x60,0x20,0x67,0xdb,0xfb,0x72,0xb5,0x89,0xff,0x3f,0x79,},{0xff,0xa0,0x38,0xad,0x8c,0x3b,0x37,0x8c,0xe7,0x5d,0x65,0x84,0x4d,0x08,0xe3,0xd6,0xa9,0x2d,0x19,0x4a,0x1b,0x78,0x62,0xe9,0xd9,0x72,0x0d,0x20,0x67,0x9b,0x29,0x44,},{0xa6,0x28,0xa7,0x74,0x21,0xb2,0xab,0xab,0x57,0x6e,0xed,0x35,0xd2,0xee,0x3d,0x14,0x56,0x1b,0x21,0xfa,0x14,0xa6,0xe2,0xfa,0xc2,0x63,0xc3,0xea,0xdd,0x79,0xf2,0xfc,0x06,0x69,0xf9,0x42,0x9b,0x91,0x0b,0x84,0x22,0xb4,0xb2,0x9a,0xc0,0x26,0xa4,0x2e,0x98,0xd1,0x81,0xbe,0x35,0x07,0xc5,0xed,0x7c,0x74,0x8a,0x1f,0xdc,0xf1,0xd8,0x07,},"\xa7\x00\x92\xc7\x69\x7c\xd4\xa2\x09\x56\x7c\x38\xba\x7f\xb7\x1a\xa8\xf1\x5e\x58\x27\xa2\x08\x76\x92\x39\x43\xfd\x6a\xdc\x65\x9c\x98\x67\xac\x6f\x58\xa6\x1d\xc7\xce\xc3\xd3\x62\x41\x16\x82\x00\x0c\x1a\x9a\xd1\x29\x5e\xb8\xb7\x0f\x24\x2d\x86\xb5\x86\x5e\xb7\x6b\x87\xe3\xf2\xc6\x94\x1d\x26\x12\xee\x3b\xcd\xe8\xf1\x97\x65\x56\x67\x33\x15\x2e\xf5\x4e\x95\x69\x09\x43\x28\x5f\x78\xb3\x75\xf4\x03\x65\x85\xd4\x73\x9d\xee\xde\xef\x6d\x94\x6d\xb6\x1c\xa4\x58\xef\x4f\x65\x0d\xa9\x63\xc3\x85\xe2\x9d\xfd\xee\x41\x5f\xe4\x95\x84\x5f\x55\x19\x7a\x87\x0f\x8c\xde\xb5\xa0\x10\xba\x6b\xbb\x32\xbf\x1a\x58\x8c\xc7\x74\xd4\x89\x01\x84\xc4\xb2\x92\x4a\x5b\x80\x73\x31\x3b\xce\x22\x65\x85\xf1\xad\xfc\x22\x9c\x90\xbc\x6c\xc9\xd2\x12\xe6\x2f\x05\xd3\x3b\xed\xac\x96\x1d\x77\xcf\x8c\x26\x20\xe4\x51\xde\x81\x7f\x8c\x1b\xb1\x6a\x2c\x59\xff\x80\x4b\x63\x5a\x73\xa8\xcf\x8c\x18\x1b\x3f\x94\x01\xc3\xb6\x43\xd1\x8a\x2f\x70\x6e\xa9\xca\xe4\x70\x71\xa6"}, +{{0xce,0x37,0x9b,0xbe,0x2f,0xa8,0xab,0xcb,0xa5,0x1c,0x7a,0x75,0x43,0xde,0x5b,0x71,0x80,0x77,0x1b,0x3c,0x44,0xbc,0x6b,0x41,0x89,0x2e,0x7b,0x88,0x97,0x9b,0xab,0x90,},{0x7f,0x3c,0xff,0x89,0xf4,0x1b,0xab,0xf4,0xfa,0x64,0xcb,0xa3,0x3a,0x5b,0xb1,0x7f,0x41,0x3b,0xbf,0x2a,0x1e,0x11,0x2b,0x50,0xa8,0xe9,0xb1,0xf8,0x21,0xd8,0x49,0xbf,},{0xda,0x98,0xdf,0xb1,0x89,0x38,0x5b,0x2c,0x85,0x3b,0x6c,0xf3,0x75,0x73,0x80,0x46,0xa8,0xf2,0x7e,0xf2,0x79,0x74,0xab,0xce,0xce,0xa1,0xdb,0x02,0x98,0x9b,0x95,0x1f,0xe4,0x33,0xa6,0xce,0x1e,0x22,0x5b,0x3f,0xa8,0x20,0x32,0xfe,0x06,0x0a,0x7d,0x3f,0x6c,0x18,0x3f,0xd1,0x15,0x7f,0x79,0x1a,0x06,0x4b,0x40,0x76,0x50,0x57,0x16,0x00,},"\x00\x1a\x74\xf0\x95\xc8\x14\xd3\xbe\xed\x67\xa8\xd1\x5f\xc1\x8e\xfe\x23\x5d\xc3\xf6\x45\x78\x12\xa4\x03\x9b\x7a\x46\xfe\x9a\x0e\x9d\xe8\x1a\x7a\x4e\x5f\xba\xb5\xeb\xe9\xe1\xe4\x80\x1b\xd1\x1b\x45\xc9\xf7\xad\x06\x36\xa0\x9b\xff\x42\x16\x4b\xe5\x74\x9a\x04\xc0\x2f\x0a\xb6\x1f\x0e\xcf\xdf\xef\x79\x9b\x82\x7d\xa6\xa2\x74\xc8\xd3\xb3\x9f\x2e\x38\x05\xa6\x79\x12\x87\xee\xdb\x23\x14\xd3\xf8\x42\xb5\x58\xb9\xb4\x89\xaf\xe1\xed\x37\xbb\xbc\xfc\x5e\x60\xa4\x31\xd5\xac\x60\xb3\x9e\x94\x6d\x90\x3d\x6b\xf6\xb1\x40\xe1\x2c\x7e\x07\xf9\xed\x7a\xc4\x6a\x39\x99\xc6\x24\x5c\x8a\xb1\xbd\xb2\x18\x79\xa3\x17\xa3\xdc\xd2\x57\xa5\xc4\xf3\x49\xb7\xf5\x9e\x4e\x43\xd6\x2d\x9f\x1c\xd1\x6f\x51\x8f\x1c\xa6\xca\xd3\x7e\x2c\xb2\x0f\x25\x98\xc4\x13\x42\x91\xc6\xb8\xa9\x8a\xae\x52\x47\xe2\x6e\xef\xb7\x6a\xa3\x8c\x9c\x82\x31\xc1\x7e\x9d\xbf\x27\x1c\xec\x80\xfb\xa5\xb4\xa8\x34\xbd\x9b\xe8\x1e\xa8\x41\x63\x7a\xa9\xcd\xd4\xc4\xbf\x26\xd7\xad\x24\xca\x3c"}, +{{0x2b,0x2e,0xe8,0x09,0xd6,0x47,0x02,0x3e,0x7b,0x77,0xfc,0x54,0x1f,0x44,0x87,0x5a,0x35,0xfa,0x94,0x1d,0x37,0xf7,0xc5,0xb2,0x1f,0xd3,0x49,0x34,0xd2,0x39,0x19,0x35,},{0x2c,0x29,0xd5,0x3e,0x1b,0xf2,0xc7,0x87,0x9d,0x73,0xd2,0x0b,0xa8,0x8c,0xa0,0x7a,0x0b,0x21,0x6d,0x7f,0x6d,0x05,0xd9,0x36,0x63,0xa6,0x5c,0x3d,0x9e,0x10,0x63,0x3a,},{0x12,0xd9,0x06,0x85,0x77,0x55,0x72,0xc9,0xea,0xbc,0x9b,0xe2,0x57,0x4c,0xa9,0xae,0x66,0xf0,0xe6,0x52,0xe5,0x78,0xb2,0x17,0x36,0xcd,0x6e,0x65,0x4f,0x7c,0x6b,0x15,0x45,0x88,0x3d,0x56,0xbf,0x76,0x0c,0xcf,0xc3,0xcf,0x87,0x54,0x4e,0x00,0x04,0xc7,0x98,0x06,0x12,0x57,0xe1,0x30,0x03,0x0c,0xb9,0x97,0xa7,0x88,0x36,0x9a,0x9a,0x05,},"\xc4\x14\x7d\x64\xeb\xfd\xa4\x1a\x1b\xe5\x97\x72\x62\x95\x81\x04\xe9\x40\xc3\x87\x6b\xcd\x5b\x69\x56\xac\xfd\xec\x32\xc6\x60\x91\x4d\x62\x62\x3c\x21\x06\x63\xcb\x2c\xbe\x62\x49\xd7\xf5\x27\x49\x91\xc6\x0e\x95\x0e\x8e\x28\x09\x04\x99\x53\xc6\x95\x81\xd2\x46\x9f\x4f\xe9\x82\xc7\x43\x4f\xed\xd9\xd4\xe0\x0a\xe0\x88\x96\xd6\x2c\xc1\xfb\x98\x4d\xd2\x33\x15\x0c\xc2\x48\x3e\x15\x9c\xff\x40\x97\xdf\x8c\x03\x6b\xb6\x33\x00\x3a\xbb\xfb\xe1\x8c\x8f\xa7\x9b\x5a\x22\x27\x08\x38\x12\x3f\xc9\xbe\x39\xb8\x89\x2c\x80\x38\x4a\x38\x50\x28\xc1\xa8\x1e\xc5\x8c\x8f\x21\x06\x0e\x78\xaf\xd2\xc0\x4b\xfd\x2d\x30\xca\x39\x77\xc6\xed\xad\x51\x8c\xc1\xe2\x00\x4c\xdc\x14\xbf\x3d\x15\xf5\xf5\x28\xe5\xaf\x27\x7f\xa1\x82\x27\x58\x70\xe5\xc0\x12\xf5\xf8\x2f\xb1\xaf\xd0\x4e\xdd\xe4\x57\x8d\xdd\x21\x60\xa1\xa3\xdb\xc0\x50\xe8\x0b\xdd\x81\x1b\xc8\x8e\xad\x79\xbf\x93\xf0\x10\xcd\x0f\xd4\x43\x3d\x0b\xc3\x48\xda\xcf\xd0\x94\x7c\xce\xda\x62\xbf\xa4\x97\x11\xd0\x13"}, +{{0x4e,0xa1,0x8d,0x6b,0x4a,0xf8,0x05,0x3b,0x88,0x5e,0xc1,0x88,0xbe,0x48,0xde,0xb8,0x6f,0xfb,0x2a,0x69,0xa4,0xce,0xc8,0x66,0x37,0xbb,0xd7,0xb4,0x1b,0x80,0x7c,0x46,},{0xe5,0x98,0x60,0x59,0x97,0x62,0x33,0xed,0x77,0x38,0x2c,0x3d,0x99,0x59,0xf3,0x4e,0x31,0x79,0x62,0x69,0x65,0x53,0xe8,0x6e,0xd1,0xe5,0x90,0x2c,0x4b,0xed,0xd1,0x67,},{0x27,0x57,0x0c,0x00,0x2a,0x48,0x7d,0x00,0x0c,0xa3,0x92,0x8b,0x83,0xcb,0x43,0x19,0x72,0x2c,0x46,0xdf,0xb4,0xcc,0xa2,0x60,0xde,0x79,0x0e,0xc0,0xe3,0xc1,0x93,0x26,0x88,0xf8,0x73,0x62,0x95,0x28,0x18,0xb5,0x4f,0x51,0xbc,0x7a,0xee,0xb2,0x63,0xf9,0x60,0xbc,0x0d,0xa8,0x96,0x4b,0xf3,0x12,0xef,0x93,0xe8,0x1f,0x06,0xc8,0x0b,0x04,},"\xe9\xc8\x9a\x1a\x11\x19\x37\x32\x06\xce\x40\xed\xe3\xb8\x9a\x82\xf8\x94\x62\xa1\xde\xe9\xe7\x89\xe9\x84\x5e\xec\x21\xf5\x71\xc0\xfa\xef\xd4\x30\xad\x33\x8e\x4a\x72\xc0\x47\xa3\x9a\x42\x59\x58\x03\x87\xfb\x9a\xac\xad\xdc\x36\xa2\xb5\x1e\x7b\x60\xa8\x7c\xa1\x32\x1f\xf8\x06\x79\x4c\xd6\xdd\x45\x49\xa4\xdf\x45\xc2\xda\xe3\xe5\x39\xc4\xd7\xd0\x6b\x6e\x6e\x9f\x46\x6f\xfc\xa2\xfa\x49\x78\xce\x3d\xc7\x92\xe4\x4a\x62\x83\x88\x0c\xd1\x38\xa7\x5a\x22\x6f\x98\x5d\xa4\x1f\xfd\xc0\xe3\x2a\x5a\x85\xc8\x5f\xe9\xa4\x3a\xe7\x8f\xcf\xe5\x7f\x4d\xd7\x54\x0a\x6d\xd3\x92\x4a\x49\xab\x39\xeb\x69\x95\x0d\x42\x11\x51\xd9\x6b\x1e\x4f\xd3\x93\x58\x90\xf6\x34\xcd\x52\xa7\x3a\x75\x5f\x5c\x2f\xb7\x2f\x9c\xd5\xa2\xe6\x7e\xa9\x30\x91\x5e\x13\x3b\x47\xcf\x6b\x7c\x10\xa9\xd8\x89\xc6\xaf\x6b\x5f\x1f\x4f\x51\x09\x4d\x27\xfb\xba\x22\x8a\xc2\x26\x8b\x34\x40\x27\xfd\x49\xe4\x26\x34\x3c\xc0\x13\x43\x99\xb4\xb5\x10\xaa\xea\x50\x23\x4d\xf4\x2c\x37\xfa\x1c\x4f\x4d\x0e"}, +{{0xfc,0x1b,0x75,0xd1,0x7d,0x38,0x07,0x21,0x73,0x51,0xd2,0xaa,0x40,0xd9,0xb0,0x4f,0x52,0x5b,0x89,0xed,0x3f,0x5f,0xcd,0xb3,0x11,0xbe,0xc2,0xae,0xc5,0xcb,0x7e,0xce,},{0x55,0xe4,0x84,0xe7,0x74,0xa4,0x39,0x2a,0x9d,0x6e,0xef,0xf8,0x35,0xa8,0xfb,0xb2,0x32,0xcf,0x62,0x76,0xa8,0x9c,0x74,0xfc,0x0d,0x1b,0xb2,0x04,0x5a,0x8b,0x21,0xbe,},{0x9a,0x68,0xd1,0x51,0xfe,0xa3,0x90,0x98,0x93,0x35,0x9e,0x60,0xb9,0x6b,0x68,0xb2,0xa3,0xe2,0x94,0x6f,0x2b,0x47,0xb8,0x75,0x39,0x8a,0x1e,0x39,0xeb,0x01,0x46,0x3d,0x35,0xea,0xe7,0xd9,0x76,0xf8,0x33,0xa7,0x62,0xb5,0x1f,0x27,0x26,0xee,0x0d,0xcc,0xad,0x5c,0xe3,0x60,0x05,0x64,0xfd,0x9d,0xd5,0x8c,0x23,0x80,0x7f,0xdf,0xfd,0x05,},"\xd0\x31\xbd\x11\xda\x30\x80\x97\xe3\xbe\xb6\xff\xdb\x26\x00\xee\x6a\x19\x3c\xa6\xd8\x32\x45\x01\xc9\x72\xb1\xa2\x51\x66\xfa\x7a\x36\x9f\x5b\xc8\x82\xea\x45\x61\x2c\xf0\x25\x80\x25\x4d\x21\xb4\x0b\x03\x63\x23\x7e\x83\x5d\xae\x26\x56\xc1\xb7\xf4\x73\x6e\x88\xbe\x53\xd6\xb1\x19\xc0\x7f\x57\x29\xbb\xd8\x2f\x67\xde\x03\x58\x83\x22\x87\x92\x43\xc5\x99\x0a\x7e\x61\xf5\x69\x07\xb2\x41\x71\xa5\x7c\xbb\x0b\xbe\xfb\xa2\x31\x62\x77\xaf\x93\x26\xf9\xcb\xf3\x53\x8b\xcb\xf6\x78\x0b\xe4\x18\x25\xa2\xca\x77\x4b\x41\xbd\xb1\xcd\x5c\x60\x88\x51\xec\x23\x39\xeb\x2f\x4f\xee\xdd\xaa\x89\x1a\x63\x26\xb2\x9d\x97\xd7\xfb\xf3\x11\xe3\xbb\x74\x9c\x5d\x4c\x05\x8d\xcc\x14\xf4\x52\xf9\x33\x49\x91\xe2\x71\xc1\x6d\x65\x08\xc8\x18\x63\x39\x27\xf4\x29\x80\x4c\xa7\xa3\x81\x70\xf1\xb9\xf6\xbd\x73\xed\x67\x5e\x11\xe8\xc0\xd3\x21\xfa\xc9\x12\x73\x0b\x4b\xa2\xf7\xc4\x28\x53\x4a\xdc\xaa\x4d\xad\x31\x4c\x55\x80\x7e\x6c\x64\x2d\x49\x4c\x6b\x2f\x0e\x8c\xd1\x29\x77\x5c\xc0"}, +{{0x0d,0x0b,0xf4,0xd4,0x2e,0xf8,0x10,0xb1,0x79,0xeb,0x84,0x17,0x71,0xde,0x6d,0xbd,0xe7,0x63,0x61,0xca,0xf8,0x94,0xe4,0x2a,0x14,0xb1,0xe0,0x97,0x87,0xea,0x3e,0x06,},{0x71,0x71,0x51,0x0b,0x43,0xfc,0x17,0xef,0xa8,0x0b,0x15,0xe3,0x20,0xb1,0xb0,0xa4,0x08,0x33,0x25,0x42,0xe0,0xd3,0x6e,0x4a,0xb9,0xa6,0x49,0xcd,0x94,0x1b,0x5a,0xed,},{0x24,0x44,0x6b,0xdf,0x03,0x41,0x6a,0x4d,0x08,0x61,0x44,0x66,0xfb,0x85,0x1d,0xb5,0x0e,0x91,0xa6,0x23,0xca,0xcd,0x1b,0x0b,0x35,0x66,0x0f,0x3c,0xf9,0x33,0x20,0x0e,0x15,0x30,0x87,0x08,0xda,0x34,0x99,0xa5,0xad,0x25,0xf0,0xf0,0x30,0x6b,0x79,0x42,0x76,0x2e,0x20,0xa7,0x65,0xb7,0xca,0x9b,0x90,0x1c,0x75,0x0b,0x3a,0x95,0x32,0x0a,},"\x8e\x21\x79\x97\x5d\x0a\x8e\x5a\x69\xfe\x87\x5a\x3c\xb1\xe7\x9a\xec\x49\xc3\x85\x3e\x30\xdd\x03\x20\xfe\x3e\xbf\xb6\x38\xb8\x2f\x89\xad\x16\x43\x03\x6b\x37\xe5\x6e\x0b\x55\xe0\xa9\xe2\x2a\x4e\x28\x3d\x7a\x27\x48\x5c\xe9\x10\x2d\xb6\x78\x7d\x66\x28\xb7\x79\x13\xe1\x08\x96\x77\x4e\x49\x5c\x26\xe8\xba\xb2\x6e\x7f\x9a\x94\xd2\x9a\xaa\x36\xae\xc9\xc2\x6a\xd3\xf5\x0e\x5d\x8c\x0b\x76\x98\xbb\x5f\x01\xb8\x76\xd0\xd6\x5f\xcf\x5e\x9e\x32\xcd\x7b\x89\x82\x9e\xd0\x5b\x0b\x8f\x63\xa9\x38\x58\x98\x5b\xc9\x56\x9f\xce\x42\x9f\xd3\x7a\x21\x1a\xbe\xd6\x50\xf5\x85\xc3\xb5\x59\x00\x44\x3b\x6c\x5d\x6e\x8a\x48\xba\x67\xde\xee\xd0\x7b\x76\xe9\x69\xfc\x88\x43\x0f\xce\x27\x09\xc0\xbb\x5c\xe9\x26\xab\x7f\x44\xe0\xcd\x79\xf4\xec\x35\x9e\xf7\x67\x48\x88\x3f\xcc\x3d\x02\x6e\xdd\x06\xc8\xb9\xcb\xa5\x4b\x99\x0d\x30\xaa\x41\xf1\x44\x8a\x10\x89\x3f\xb0\x53\x92\x80\xc5\x99\xd4\x23\x61\x43\x3a\x34\xcd\xaf\xd8\xeb\xdd\x92\xef\xb9\xc3\x8a\x36\xda\xf4\xc7\x40\x60\xc6\x96"}, +{{0x57,0xb5,0x19,0x4d,0x26,0xab,0xe4,0xab,0x21,0x16,0xc0,0xf0,0x3d,0x23,0xdb,0xe1,0x16,0xd4,0x88,0x25,0xa2,0x5e,0x77,0xd6,0x46,0x48,0xb4,0x36,0x92,0xae,0x25,0xbf,},{0x49,0x9c,0x02,0xdb,0xad,0x2a,0x4e,0xab,0x3b,0x6f,0xf1,0xab,0xa3,0x94,0x4b,0x91,0xc3,0xf2,0x73,0xa3,0x82,0xc5,0x48,0xa6,0xf3,0xa1,0x9c,0x83,0xf0,0xa8,0x67,0x24,},{0x4c,0x73,0x45,0x96,0x0c,0x8f,0xd4,0x8a,0x7d,0xea,0xd7,0x1d,0xbd,0x61,0x90,0x84,0x68,0xef,0xa8,0x65,0xa1,0x35,0x56,0x8c,0x8f,0x9c,0xa0,0x05,0x54,0x83,0x46,0x86,0x17,0xa7,0xe3,0x35,0x84,0x0f,0x57,0xc6,0xcd,0x8f,0x2c,0x98,0x05,0xcd,0x47,0xa9,0xd7,0xcd,0xfd,0xe5,0x3d,0xa8,0xef,0x4f,0x1a,0xdb,0xb6,0xf6,0x98,0xaa,0xf1,0x00,},"\xb4\x81\x3c\x9d\x13\x21\x5f\xe9\xf6\x3a\x78\xff\x7a\xc9\x51\x73\xeb\x81\x0b\x46\x13\xf0\xf4\x8d\x68\x76\xb2\xbd\x3b\x2c\x72\xbc\x7d\x98\xcb\x1a\xc3\x2b\xc4\x1c\xa4\x7f\x09\x89\x6f\x79\x20\x4e\xcf\xb8\x26\x4c\xe8\xf3\xc3\xe7\x6d\xc1\x24\xda\x8d\xdc\x6e\x0d\xfc\x1e\x13\xb5\xa5\x29\xf2\x0c\x82\x61\x3f\xb9\xa8\x2e\x5f\x5d\x77\x32\x6a\x86\x1f\xae\xda\xbc\x73\x25\xc5\x9a\xf3\x3d\xae\x67\x44\x02\x5e\x64\x97\x74\xfc\x4f\x79\x13\x4b\xf9\xf6\xe3\xd5\x87\x5d\xd9\x1b\xc8\xa1\x4c\xc3\x6a\x66\x28\x3d\x01\xd8\xd1\x08\xc1\x33\x27\xec\xa5\x30\x57\xba\x50\xbf\x21\x0c\x19\xf1\x39\xde\x64\x94\x98\x26\x46\x19\x8a\x12\x46\xc2\x71\xb0\xa3\x68\xc1\x0a\xab\x95\xcd\x89\x61\x23\x5d\x74\x2d\xf4\x54\x5b\xe6\x8b\xd0\x10\xdc\x0d\xb2\x3b\x67\x3e\x62\x36\x09\xe4\x20\xee\x76\xb1\x05\x6c\x52\x0f\x9c\xe8\xfb\xe8\xee\x18\x63\xdf\x97\xd1\x7b\x71\x74\x63\x6c\x3a\x2b\x61\x22\x95\x09\x19\x48\x81\x0d\x1d\x4b\x8a\x58\x43\x76\x0a\x28\x87\xdc\x55\xef\x51\x2a\xf0\x41\xec\x54\xfa\xd3"}, +{{0x06,0x8d,0x27,0xb2,0x1e,0x2a,0xcf,0xcc,0x19,0xc3,0xe9,0x67,0x3d,0xd4,0x41,0x42,0xd9,0x8a,0xac,0xae,0x89,0x49,0x30,0xe2,0x0c,0xa0,0x67,0x43,0x9e,0x74,0x9a,0x79,},{0xe2,0x2d,0xdd,0x39,0x6f,0x95,0x5b,0xb9,0x0e,0x28,0x47,0x76,0xaa,0x76,0xe9,0x21,0xe5,0x06,0x99,0xd0,0xca,0x89,0x14,0xa9,0xb7,0xb8,0x41,0xeb,0x5f,0xf4,0x7d,0x6d,},{0x0c,0x17,0x3c,0x48,0x8a,0xd0,0x01,0xcb,0xb9,0xc4,0x3d,0x7b,0x30,0xa7,0xc0,0x71,0xa2,0xfd,0xb0,0x8c,0xf7,0xf3,0x7d,0xaf,0x71,0xd7,0xae,0x71,0x28,0xdc,0x0d,0x43,0xf0,0xf0,0x95,0xb2,0x92,0x9c,0x54,0xb7,0x73,0xed,0x4a,0x1f,0x0b,0xf0,0xdc,0x4f,0x36,0x4f,0x06,0x01,0xe8,0xd5,0xae,0x06,0x2f,0x5b,0x78,0xc0,0x5b,0xfb,0xc7,0x02,},"\x1c\x68\x15\x42\x3d\x1a\x2c\x5e\xbe\x88\x28\xd1\x64\x65\x27\xc1\x7b\x20\x06\xe5\x47\xf0\x16\xb5\x35\x0f\x01\x0d\x79\xb1\x3d\xf4\xfb\x8c\x6e\xd5\x7b\xa9\xc2\x6c\x3c\xb0\xe0\xa6\x41\x78\xb6\x50\xa3\xea\x54\x44\xa4\xfa\xd5\xb2\x0a\x3e\xb8\xca\xa7\x02\x63\x40\x11\xcf\x78\x92\xa0\x72\x7b\x6e\x81\x50\xb0\x77\x04\x29\xa3\x7a\x8a\x0b\xb3\xa7\xed\xb8\x91\xa7\xc9\x02\x40\xbc\x03\x60\xb1\x4e\x6d\xd7\x70\xa9\x90\xb3\x1b\x31\xf3\x3d\xdb\xf6\x53\x98\x8f\x82\x74\x2e\x5e\xec\x31\xb2\x73\x68\xeb\x0e\x4f\x1e\xcf\x4d\x67\x6f\x49\x21\x4a\x52\x0d\x1e\x5b\x2b\xbb\x59\xac\x2e\x13\x26\x7e\x07\xa0\xcb\xac\xbe\xd9\xf9\x4d\x74\x73\xed\x69\x78\x28\xb0\x92\x8f\xcc\x61\x6e\xe0\x2e\x51\xfc\xd8\xdb\x4d\x8f\x75\x33\xb7\xb1\x39\xa0\x5e\x06\xf9\xe0\xea\xe3\x29\x93\xe3\x02\x5a\xef\x05\x90\xb3\xfb\xb4\x29\x2a\x3a\xc4\x07\x65\xe8\x58\x4e\xad\x00\x26\x6a\xcd\xcb\xdd\xe1\x45\x7a\x03\xb7\xd5\x7b\xd5\xc9\xe6\x4f\xb0\x6b\x64\xa5\x0f\x35\xf0\xa1\xec\x34\xb6\xdd\xbd\xe7\x67\xb9\x6f\xfd"}, +{{0xa3,0x4d,0x52,0x56,0x31,0x59,0xe0,0x72,0x3e,0x9f,0x3f,0xd1,0x33,0xbd,0x96,0xe2,0x0a,0xda,0xe6,0x23,0xf8,0xc7,0x98,0x01,0x3b,0xc3,0x6b,0x44,0x14,0x89,0xbd,0xc2,},{0x1f,0xb6,0x58,0xe6,0x45,0xde,0x6d,0x3e,0xfd,0xb0,0x83,0xa7,0x3f,0xbd,0x59,0x2f,0xcd,0x4b,0x80,0x0e,0x03,0xc7,0xbd,0x68,0x1a,0xea,0xe6,0x57,0x6b,0xfb,0xbe,0x2f,},{0x5f,0xab,0x5a,0x71,0x40,0xd4,0x78,0x73,0x68,0x43,0x05,0xaa,0x63,0x53,0xd3,0x86,0x2f,0x5f,0xc1,0x3e,0x54,0xa4,0x0c,0x95,0x63,0xcc,0xea,0xc8,0xf7,0x40,0x08,0xc6,0xc4,0x45,0x63,0x1f,0xa8,0x64,0xe0,0xf1,0xc3,0x45,0xb5,0x95,0x4f,0x80,0x05,0x6a,0xeb,0xa2,0x56,0x62,0xb7,0x88,0x27,0xb5,0xe8,0xe3,0xa9,0x43,0x78,0x13,0x72,0x0f,},"\x1d\x21\x5f\x85\xc0\x89\xf3\x5f\x30\x7a\x74\x6c\x66\xc7\xc1\xe4\x1d\x6b\xa3\x77\x30\xd7\x59\xe6\xe5\x62\x2d\x6c\x6a\x19\x8e\x40\xf6\x3d\x37\x87\x3b\x71\x5d\xf7\x51\x8b\x3c\x6b\xb5\xe9\x5a\x46\x77\x26\xb9\x7c\x9a\x0f\x8f\x5d\xfc\xdb\xfd\x1e\x0d\xe3\x57\x66\x1d\xde\xab\x55\x50\x42\xb9\x45\xfd\x89\x9f\xad\x6d\x38\x2d\x79\x17\xda\x9e\x12\xdf\xbd\xa0\xd6\x99\x00\xb3\x97\x51\x65\xa7\x3d\x0a\xc9\xde\x01\xfd\x30\x48\xb8\xfe\x5f\x0b\x90\xbe\x67\xe0\x3d\xc2\x2f\x65\x3a\x0a\x13\xeb\x4b\x0b\x75\x3f\x3f\x3b\xbf\x78\x73\x69\xeb\xd8\xbf\x5e\x00\xeb\x78\xbf\x0b\x35\x15\xa9\x1e\x68\xb1\xd5\xfc\x69\x20\xbf\x4f\x42\x59\xf8\xa7\x30\xef\xc7\xf1\x01\x6d\x50\x1e\xf6\xfb\x7c\xb8\x36\x6f\xc8\xe7\x16\xcf\xa5\x0e\xa8\xb2\x03\xcc\xa1\xa3\x16\x70\x7e\x0b\x0f\xc5\x7e\xaf\xce\x82\xd6\x2f\x7f\xf3\xae\x04\xac\x8f\xd0\x41\xb5\x5b\x19\xa3\x52\xa6\x9e\x6d\x4b\x79\xd0\xe6\x50\x17\x51\x68\xe3\x4f\xa3\x35\x8e\xac\x81\x6c\xec\xf2\xc8\xdd\x1b\xf2\xa5\x89\x11\x3e\x91\xbb\x81\x8f\x91\xf8"}, +{{0x58,0xdf,0xe7,0x68,0xbf,0x52,0x11,0x84,0x94,0xb2,0x99,0x75,0x15,0x4c,0xf4,0x52,0xbd,0x97,0x46,0xdc,0x7d,0xe1,0xd6,0xbc,0xd1,0x8e,0xe6,0xa0,0x5a,0xcf,0xd8,0x58,},{0x0f,0x14,0x76,0xc6,0xcc,0x2a,0x1b,0x47,0x64,0xaf,0x75,0x80,0x5e,0x77,0x34,0x1f,0x14,0xa0,0xd8,0xb0,0x9c,0x6a,0x5b,0x2e,0xa2,0x87,0xfd,0x51,0x7c,0x3f,0xa6,0xb9,},{0x97,0x71,0x37,0xa3,0x8a,0xf4,0x4f,0x4b,0x26,0x2a,0xbf,0xf7,0xe0,0x72,0x82,0x43,0x3c,0x58,0x92,0x6d,0x56,0x2f,0xbc,0x61,0x80,0xbd,0xe6,0xcd,0x94,0x97,0x86,0x1f,0xb6,0xd9,0x55,0xcf,0x38,0x3d,0x99,0x9f,0xa1,0x03,0x7b,0x8b,0x17,0x54,0xce,0x88,0x8c,0x9f,0xfc,0x15,0x60,0xa4,0x51,0xd0,0xe9,0xdb,0x8d,0x74,0xd2,0x94,0x06,0x04,},"\x60\x97\x94\x20\x1c\x4f\x6f\xaf\x48\x87\x90\xd6\x1d\xbf\xf3\xf4\x1b\x32\x8c\x5b\x06\x95\xcb\xe9\xaa\x8a\x13\x6d\x72\xb4\x97\x7b\x21\xb5\x00\xf2\x16\xe9\xf3\x21\x68\xad\xa8\xc1\x3b\xff\x25\x32\x76\x47\xe3\x0d\x8a\x24\x4d\x74\xd8\x83\x03\xab\xc9\x0b\x7f\x71\xaa\x07\xca\x04\xd1\x7b\xc8\xa0\x16\x7d\x6e\x63\xfb\x88\xba\xa1\xda\xb8\x1d\x50\xf1\xe9\x1f\x46\xf5\xaf\x77\xf2\xe8\x40\x8b\x82\x63\x36\xa3\x50\x52\xef\xff\xdf\x4a\xf7\x95\x96\xaf\x1b\xb2\x25\x9f\x83\xc1\xbc\x10\x9c\xfd\xc3\xdd\x50\xfd\x96\xd3\x10\xf2\x7e\xa4\xc6\xc7\x69\x0f\x21\x81\x5e\xa9\x2b\xd7\x93\x89\x68\x0c\xfe\x3e\xd4\x0c\x80\x18\x11\x90\x68\x8d\x24\x22\x2d\x9a\x1e\xd5\x2c\xe6\xa1\x6b\x41\xdb\xd9\x10\x7e\xb6\xd2\xe3\x59\x4e\x44\x94\xd7\x5d\xd7\xc0\x89\xe3\xb2\x6f\xfd\x00\xd1\x00\x3c\x92\xc4\xc3\x9a\xe5\x38\x2e\xf9\x29\x14\x91\xa8\x80\xca\x4e\xc3\xac\x2b\x86\xe6\x67\x19\xb9\x2b\x6f\x7c\xea\x2c\xb0\xbb\xb1\xcf\x62\x4d\x0d\x1a\xbe\xae\x55\x6e\x5f\x73\x90\x9d\xd5\x46\x27\x70\x37\xec\x97\x2f\xd4"}, +{{0x5a,0x63,0xef,0x9b,0xd7,0xdb,0xf0,0xe8,0x9f,0xef,0x15,0x59,0x83,0x65,0x9e,0x8a,0x0a,0x6c,0xa0,0x02,0xbc,0x42,0xfa,0xd5,0xa4,0x5a,0xf8,0xe0,0x28,0x19,0x23,0xf4,},{0xe6,0x32,0xf4,0xdc,0x99,0x42,0x31,0xcc,0x17,0x90,0xc2,0x1a,0xfa,0xda,0xa9,0x77,0xa5,0x89,0xb0,0xeb,0x0d,0xa1,0x9f,0xcb,0x27,0x92,0x91,0x1b,0x15,0xec,0xf8,0xaf,},{0x75,0x46,0x1f,0x99,0x65,0x0c,0x03,0x68,0x05,0x81,0x13,0xa1,0x5b,0xa1,0x6b,0xd2,0x33,0x7b,0x2e,0x63,0x3d,0xa3,0x81,0x12,0x87,0x8c,0x48,0x34,0xfa,0xc9,0xba,0x2e,0x30,0x7c,0x86,0x6c,0x02,0xaf,0x79,0xbe,0xa3,0x36,0x59,0x61,0x4c,0xbb,0x44,0x65,0xc5,0x7e,0xc3,0xef,0xfd,0x4c,0x47,0x8a,0xe3,0x8a,0x34,0xa0,0x5c,0xf1,0xed,0x07,},"\x79\x6b\xc8\x36\x1c\x6e\x8e\xec\x39\x83\x8b\x24\xf5\x39\x71\xe8\x20\xf8\x23\x61\xe0\x51\x0e\xb4\xde\xf1\xdb\x25\x12\x38\x7d\x6b\xf3\x5b\xbd\xfa\x31\x88\x79\x20\x94\x35\xd6\x88\x7b\x14\x10\xb3\xeb\xc1\x45\x5f\x91\xf9\x85\xe0\xfa\xb1\xce\x1c\x50\x5c\x45\x55\x76\xbc\xa0\x35\x39\xd0\x48\xad\x3a\x0e\xd1\xf1\x1c\x73\xba\xc6\x80\x9e\x2e\xa1\x47\x97\x5b\xee\x27\xc6\x52\x61\xac\xa1\x17\xdf\x0f\xae\x70\x08\xe2\xc3\xc1\x30\xbe\xc5\x53\x3a\xb8\x93\x51\xc2\x14\x0c\x9d\x1a\x62\xbd\xf6\x88\x62\x97\x87\xf9\x54\xe1\xc6\x10\xcb\xb7\x5e\xdb\x86\x20\x9d\x7c\x35\x7c\xd0\x6e\xf4\x19\x31\xdd\x5d\xfd\x1c\x7d\x40\x7f\xa4\xee\x1e\xf2\x93\x93\xbe\xab\x57\x13\x17\x38\x02\xcc\xe2\xd5\x62\x29\xcf\xa7\x6b\x60\x16\x62\xc4\xd9\xa8\x4a\x49\x36\xc5\x2a\xbb\x19\x81\x37\x8b\x71\x7e\xb5\x5c\xb6\x04\xa6\x8d\x34\xf0\x3b\x21\x9f\x32\x22\x6c\xa0\xe6\x69\x34\x8a\x2d\x8d\x24\x53\x93\x0e\xb6\xe9\xc2\xbf\x66\xfa\x4e\x92\xc7\x51\x36\xe1\x48\xcd\xb0\x34\x13\x0d\x3f\x64\x63\x82\xe1\xc7\x15\x79\xac\x70"}, +{{0x8b,0x2f,0x06,0x14,0x1e,0x40,0x11,0x63,0xf9,0x0f,0x67,0x4b,0x04,0xdc,0x90,0xdc,0xb6,0xdd,0x33,0x86,0x41,0x93,0x39,0x66,0x2e,0xcb,0x0d,0xff,0xad,0xf2,0x50,0x0b,},{0x54,0xda,0x93,0x4a,0x65,0x91,0x19,0x19,0x85,0x53,0xfd,0x45,0x66,0xb6,0x60,0xd8,0xd6,0x10,0xad,0xc3,0x29,0x0c,0xb8,0x48,0x29,0xc8,0x94,0x14,0x8c,0xf3,0xf6,0x7e,},{0xd6,0x8e,0x37,0x50,0xdc,0x56,0x43,0x23,0x97,0x40,0x1c,0x98,0xff,0x15,0x29,0xdb,0x9e,0xd4,0x8f,0xea,0x24,0x6d,0xd4,0xed,0x38,0x3e,0xc7,0x4c,0x1a,0x46,0x3a,0xeb,0x78,0x4c,0x87,0xb1,0xfd,0xa8,0xbb,0xce,0x97,0x0f,0xc9,0x7a,0xa9,0x80,0x7d,0xdb,0xe9,0x5d,0x41,0xfb,0x02,0x2e,0xa6,0x8c,0x1e,0x31,0x16,0x54,0xfa,0x1d,0xa2,0x07,},"\x1d\xeb\x25\xd4\x34\x58\x69\x03\x23\xa7\xd2\x6a\x26\x69\x50\x90\x99\x34\x74\xf4\x67\xc6\xfd\xe5\xdd\xb3\x4d\xa9\x45\xbe\x3c\xea\x2f\x6b\x75\x65\x2a\xe2\x1c\xbc\x4f\xd2\x27\x63\xa1\xb4\x55\x83\xe1\xc3\xe8\x8b\xbb\x5f\xea\x20\x49\xb7\x33\x6c\x91\x15\x99\x88\xc0\x15\x26\x82\x4c\xa3\xbe\xf1\x6b\x36\x2b\x92\x02\xb8\xb9\x75\x41\x85\xbd\x61\xbe\xa8\xf5\x39\xaa\xdf\x4a\x1a\xb1\x35\xfb\xc3\x1d\x2a\x8e\x33\x17\x80\x73\x10\x6c\xbb\xc0\x2d\x4c\xd0\xd3\xc8\xfe\xaa\x8e\xb7\x33\x08\x43\x56\x25\x17\x95\xaf\xbd\x78\xac\x3c\x4f\x8a\x3b\xa1\x9a\xed\x75\x5c\x64\x6f\x35\x56\x9c\x7a\x6c\x67\x5b\x6d\x69\x18\xe8\x34\x96\x9a\xca\x03\xf7\x1a\x2e\x72\xcc\xb1\x70\x03\xbb\x75\xb6\x2e\x85\x2a\xaf\x58\xb3\xba\xea\x89\xbc\xd6\x4a\x32\xeb\x14\xa6\xb9\xe1\x0d\xe4\x89\x71\xe5\x3d\x0e\x9a\xc9\x9a\x78\xf4\x2d\xe0\x38\x2e\xf0\xe8\x0e\xd3\xcf\xa3\x43\xf3\x5e\x4a\x99\x83\xb9\xae\xed\x98\x6d\x3a\x57\xf4\x7e\x5e\x46\xd4\x0e\x9d\x67\x73\x02\x80\x9a\x2d\x37\xe4\xec\x01\x1f\x05\x1b\x4d\x03\x1e\xd6\x00"}, +{{0xdc,0x64,0x9f,0xbb,0x1b,0xee,0x0a,0x44,0x81,0x4d,0x6d,0x9e,0x90,0x80,0xd5,0xd9,0x0c,0x1f,0xc1,0x73,0xab,0x5f,0xef,0xed,0x82,0x6a,0x74,0x72,0x3a,0x77,0x4e,0x0a,},{0x02,0x14,0xc8,0x9f,0x38,0x67,0xad,0x2e,0x88,0x70,0xe5,0x0f,0x8c,0x2a,0x62,0x54,0x98,0x6d,0x9c,0x22,0x0e,0x33,0x38,0x41,0x13,0x00,0xcd,0x9c,0x64,0x04,0xd4,0xb1,},{0x0e,0x0c,0x5e,0x4e,0x18,0x43,0x75,0xda,0x4e,0xf7,0xe2,0xa2,0xe4,0x88,0x80,0x50,0xcd,0x84,0xe2,0xfe,0x21,0xd0,0x8e,0x84,0xa8,0x52,0xdb,0x2b,0xe3,0xfb,0xc3,0x72,0xc4,0x72,0xde,0x09,0x54,0xdc,0xd1,0xdc,0x11,0xae,0xc4,0x93,0xc5,0x69,0xf4,0x0f,0xc6,0xf7,0x7f,0x03,0xee,0x52,0x4f,0xb0,0x6e,0xc4,0x0f,0xaa,0x1d,0x6c,0xc1,0x0f,},"\x32\x87\x00\xa8\xae\x58\x1c\x1e\xdc\x4e\x2c\x00\xc7\x8b\xf4\x60\x60\x97\xf9\xbd\x75\xaa\xde\x20\x5a\x24\x3c\x5f\xd7\x43\x4d\x62\x22\xda\x93\x7e\x28\x81\xa2\xe3\xc5\x74\x35\x6d\x4d\x56\x79\x30\x1d\xa9\x9e\x11\xcf\x74\x9c\x27\x92\x1c\x8c\xaa\x2a\xb2\xa5\x64\xd8\x7c\x5d\xf8\xec\xf1\xa7\x2b\x68\x01\x84\x82\x4f\x69\x86\x02\x2e\x3f\xc9\x8b\xd2\xa2\x1c\x34\x55\xab\xf1\x15\x49\x54\xfb\x30\xc8\x98\x82\x94\x7b\x02\xf3\x5a\xf7\xb1\xbf\xad\x05\x23\x7d\x24\x2e\x2b\x74\x83\x2f\xc5\x36\x19\x6f\x2e\x59\xd1\xac\xd0\xc1\xdb\x6f\x19\x43\xd0\xf6\x04\x3b\xbd\x6a\x76\x90\x83\xed\x66\xba\x0e\x05\xa5\x0f\xeb\x0a\xcf\x72\xb6\xc1\x6b\xa9\xaf\x03\x9a\xfb\x7f\xe2\xa4\xaa\xeb\x4d\x06\x18\x1c\x5a\x18\x78\x68\x9e\x67\xa3\xf5\xd0\xad\x39\xe7\x94\xd6\x23\x9a\x7e\x0a\x12\xce\x82\x0c\x5b\xe6\x0f\xd5\xf1\xdd\x79\x70\x2f\x49\xd0\x2b\x79\x75\x5f\xe8\x73\xf5\x78\x5c\x72\xf7\x46\x25\xcd\x7e\x24\x28\x26\x25\x97\xd3\x14\x82\xc2\xc0\x50\x88\x01\xfd\x96\x31\x9d\x61\xb9\x1b\xa2\x53\xa5\xe7\x22\xf4\x14\xcf"}, +{{0x39,0xb8,0x06,0x2d,0xa4,0x3e,0x64,0xe1,0x67,0x67,0x65,0xd6,0x2c,0x7f,0xb8,0xe0,0xa9,0x9c,0x4f,0xd4,0x17,0xd6,0xf7,0xe3,0x31,0x9b,0xb1,0x30,0x44,0x20,0x5f,0x3b,},{0x62,0x27,0xce,0xfe,0x88,0xea,0x4f,0xb2,0x7b,0x37,0xb5,0xf7,0x97,0x77,0x8b,0xd7,0x2f,0xda,0xfe,0xad,0xcc,0xd9,0xae,0xb6,0x7a,0xd4,0x37,0xce,0x08,0xfb,0xa6,0xa8,},{0xc5,0xf6,0x26,0x49,0x0c,0x0e,0xf4,0xe1,0xef,0xc3,0xed,0xeb,0x0c,0xbc,0x3f,0x7d,0xe2,0x67,0x05,0x7f,0xb7,0xb6,0xeb,0x8f,0x0c,0x81,0x35,0x84,0x96,0x5b,0xc5,0xc4,0x21,0xfe,0xed,0xf5,0x42,0x41,0xca,0xe0,0x01,0xec,0x6d,0x5e,0x25,0xc9,0xb1,0xfb,0xa0,0x38,0x5e,0x5d,0xbd,0x95,0xa0,0x6e,0xc1,0xd8,0xae,0x51,0x91,0x44,0x96,0x0d,},"\x74\x0a\xf6\x79\xe3\x06\x9f\xad\x05\x9f\xa4\x82\x5f\xa4\x1c\x59\xfb\xd4\x84\xaa\x64\x93\x03\xc2\x7c\x4f\x7a\x94\x71\x1c\x5b\x71\x3b\x2a\x6b\x89\x87\x85\x9e\x22\x71\xa6\xa7\x1e\xb0\xb4\xa1\x5a\xbd\xe4\xf5\x16\x8f\x6c\xb9\xdb\xdc\x6a\x27\xa2\xa1\x3d\x52\xc9\x72\x08\x96\xa1\xf4\xce\x3a\x53\x45\xee\x79\x3b\x6c\xc3\xad\x80\xd7\xd5\x81\x63\xd5\x45\x5b\x9c\xbd\x07\x3e\x2b\x7a\xdb\xff\x95\x59\x0c\x71\x72\x27\x1b\xd9\x1f\xef\xdb\xd0\x16\x57\xee\x17\x50\x65\x10\x36\xcd\xc3\x56\x0b\x44\x4c\xa2\x18\x4b\xf4\xf3\xea\x89\xfc\x97\x3a\xab\x6f\xb4\xa8\xee\x57\x04\xbb\xe5\xa7\x1c\x99\xfa\x3b\x5e\xf0\xd0\x39\x62\x49\x75\x82\x97\x69\x9a\xe2\x02\xb8\x19\x69\x0d\xc7\xac\x46\x92\x77\x03\x46\x90\x78\x45\xe2\x21\x0d\x53\x63\xad\xee\xc0\x3f\x0f\xc7\x76\x1b\x7e\x0e\xc0\xfe\xa1\xbc\xf6\xb0\x4f\xc5\x4b\x3e\x4c\x40\xd1\x9b\x8f\xa6\x49\xac\x84\x79\xe8\xf8\x07\x30\xc0\xc9\x4e\x9f\x4a\x1a\xd5\x06\xf2\xbc\xab\x0c\x49\x54\x0f\x6d\xec\xaa\x77\xb3\xd6\x57\xdc\x38\xa0\x2b\x28\xa9\x77\xec\xe4\x82\x54\x5a"}, +{{0x52,0xf4,0x67,0x5d,0x8c,0xcd,0x0e,0xb9,0x09,0xdf,0x0a,0x51,0x66,0x48,0xdb,0x26,0xfa,0x03,0x3b,0xa4,0x1d,0x43,0xfc,0x38,0x45,0x89,0x6d,0x45,0x6e,0x14,0x26,0x5f,},{0xf3,0x9e,0x7d,0xaf,0xc9,0x7b,0x0a,0x84,0xdc,0xbf,0x7f,0xa1,0x4a,0x94,0x03,0xee,0x1f,0xa9,0x2b,0x85,0xe5,0xa7,0xe5,0xd0,0x5f,0x03,0x1b,0x44,0xdd,0xf1,0xf7,0x94,},{0x4b,0xf6,0x68,0x82,0x7a,0x72,0x0a,0xf6,0x88,0x98,0xa0,0x6e,0xa7,0xb4,0x45,0x45,0xa3,0x4c,0xa8,0x96,0xec,0xf3,0x11,0xfe,0xea,0x47,0xe0,0x68,0x6d,0x91,0x1f,0xad,0xaa,0x03,0x11,0x89,0x97,0x15,0x3c,0x65,0x36,0x1f,0xea,0x15,0xde,0x9b,0xb8,0x91,0xb8,0x90,0x98,0x72,0x04,0x55,0x08,0xff,0xad,0x0c,0xd9,0xea,0xb2,0x1a,0x97,0x02,},"\x74\x42\x71\x10\x85\x7c\xb4\xaf\x0a\x33\x42\xc2\xb5\x29\x97\xbc\xe1\xa0\xdb\x64\x05\xc7\x4e\x96\x51\xc5\xb8\x59\x79\xac\xb0\x71\xe5\x67\xfe\x70\x41\x2c\x4e\x0d\x8c\x9f\xa4\x21\x91\x4f\x6a\x62\xf2\xae\x42\x0b\x7b\x2f\x4c\xf8\x0c\x90\x57\x42\x21\x22\x22\x88\xb6\x58\x67\xea\xa6\x6e\x7e\x0a\x05\x57\xa2\x6c\x54\x9f\x9a\x7a\x4e\x70\x83\x8b\xa4\x07\x4b\x4c\xd7\xa9\xd7\x58\xb3\x78\xb8\x8d\xd4\x94\x41\xdf\x80\x2a\x44\x4d\xcb\xc3\x06\x24\x93\x3b\x59\x92\x2f\x33\xc2\x0f\x01\x9f\xe7\x8e\xe2\x4b\x8f\xba\x79\xa6\x82\xf3\x88\x50\x5a\xc9\xc9\x7f\x4e\xb8\x7c\x61\x18\x80\x02\x6b\x4c\x23\x30\x6b\x86\x51\x73\xf5\xd7\x16\xab\xc6\xcd\x9a\x99\x06\xdb\x34\x30\x13\x6f\x75\x41\x29\xc4\x43\xb2\x0c\x42\xbe\x2f\xbc\xbc\xd4\x40\x34\xd7\x14\xf5\x8a\x4b\xa8\xe7\x56\x60\x7a\x02\xb6\x08\xef\x49\x64\x8f\x2a\xd0\xce\xa9\x9e\x7a\xb3\x0a\x8d\xd7\x81\x40\x04\xf7\x25\xf4\x93\x01\xd7\xb3\x04\xdc\xda\x62\x5c\x29\x6d\x92\x8c\xb5\x81\x73\x6a\xb7\x39\xc8\x6b\x46\x92\x41\xa8\x25\x93\x51\xfd\x37\xb4\x78\x0a\x99\x93"}, +{{0xba,0xd7,0x3c,0x9f,0xda,0x4c,0xeb,0x9d,0xa6,0xc7,0x01,0xc2,0xa6,0xe2,0xef,0xc0,0x46,0x7a,0xfa,0x0a,0x74,0xf8,0x75,0x0c,0x52,0xcf,0x1f,0xd4,0xc8,0xe7,0x48,0x9a,},{0xbb,0x0f,0x02,0x7a,0x90,0x35,0x37,0x6e,0x1a,0xa3,0x20,0x6c,0x3d,0x77,0x44,0x75,0xe3,0x51,0xf5,0x76,0x7e,0xf8,0x6e,0xf4,0x8a,0x72,0xc0,0x37,0xc2,0x4c,0xce,0x62,},{0x19,0x7d,0x6b,0x6c,0xc8,0x8a,0x98,0xc0,0x6d,0xfc,0xa0,0xc0,0x12,0x25,0xed,0xfe,0x38,0xa0,0xb2,0x28,0x9f,0x29,0xf8,0xa4,0x4e,0xc0,0x81,0x6a,0x95,0x2d,0x58,0x5e,0x2d,0x59,0xb5,0xb0,0x8d,0xe1,0x00,0xc0,0x60,0x62,0x96,0xcc,0xf5,0xe9,0x2a,0x99,0xe0,0x93,0x62,0x31,0x44,0xb8,0xb2,0x2d,0xb8,0x7d,0x92,0x92,0x25,0x54,0x60,0x05,},"\x74\xb9\x66\xcb\x78\x07\x71\xae\xe6\x3d\x73\x4d\xf3\x75\x67\x02\xd1\xd5\xfd\xed\xdf\x32\x13\x6c\x63\x58\xb8\x36\x31\x8a\x4f\x98\x4f\xe7\x1e\x77\x16\xad\xdd\xbd\x64\x9e\xba\x44\xcd\x42\x82\xe0\x05\x5d\x8c\x1e\xd2\xd3\x51\x23\xd6\x6e\x5a\x98\xf1\xc0\x83\x8d\xed\x56\x3b\x9a\x20\xeb\x80\x07\x53\x8f\xc7\xb0\x71\x3e\x7e\x48\x5e\x3c\x28\xf6\xeb\xc4\x21\xa2\x9d\xce\x25\x24\xdb\x7f\x29\x20\x57\x61\x03\x6a\xda\x62\xe5\xb0\xb7\xd5\xb7\xf2\x94\xff\x17\xf3\x38\x23\x2f\xa5\xfd\x42\xb6\xf7\x25\x33\x04\x09\x2d\x84\x8f\x50\x73\x52\x48\x59\x5d\xa0\xf7\xef\x28\xe5\x68\xe9\x91\x6b\xfc\x56\xd7\xed\x0d\x81\x1b\x59\xd5\xd8\x91\xae\x43\xe1\xb1\x98\x07\x13\x06\xbf\x52\x5c\x67\x8c\x63\x43\x99\x80\x05\xfb\xb7\x86\x9d\x1c\x40\xf8\xca\xc8\x07\xfe\x2e\xf0\x3f\x3d\x5b\x93\x3f\x58\x97\x8e\xf2\x90\x6f\xcc\xf7\x44\x4a\x29\x36\xe6\x3d\x92\x8c\x69\x09\x26\xc9\xc9\x94\xed\x3d\x66\x62\x63\xe9\x56\xfd\xfe\xa2\x77\x64\xbc\x5f\x74\x12\x5b\xc4\x6b\xc1\x02\xdd\x3e\x5f\xf9\x3b\x5e\x12\x3e\x4b\x38\xbd\xef\x69\x7e\x15"}, +{{0x70,0x73,0x27,0xa4,0x31,0xdb,0xa7,0x76,0x39,0xb3,0x96,0x6b,0x2b,0xc0,0x95,0xf8,0xee,0xdf,0x57,0xf7,0xa2,0x00,0xe3,0xb0,0x07,0x7c,0xe4,0x20,0x38,0x9c,0x92,0xfe,},{0xee,0x24,0x96,0x91,0x08,0x64,0x18,0x9f,0xda,0xa3,0xc7,0x75,0x7e,0xb3,0xcd,0xa9,0xab,0x1e,0x70,0xfc,0x9e,0x7f,0x71,0xa3,0x8a,0x0b,0xfc,0x84,0x59,0x31,0xc9,0x5a,},{0xfb,0x99,0x02,0x9f,0xec,0xa3,0x87,0xa5,0xd7,0x65,0x96,0x1e,0x36,0x1d,0x71,0x72,0xb9,0x8b,0x7e,0x0f,0x11,0x29,0x0b,0xb1,0xe5,0xb5,0x7b,0x51,0xbc,0x21,0x23,0xd0,0xbc,0xe2,0x90,0x20,0x39,0x2a,0x4f,0xec,0x9a,0xe6,0xa7,0x2c,0x4c,0x38,0x6c,0xea,0x18,0x57,0xcb,0x8f,0x9c,0x50,0xaa,0x9a,0x76,0xd7,0xf1,0x68,0x7f,0xcf,0x29,0x00,},"\x32\xef\x31\xb6\x4e\xee\x70\x0f\xca\x2a\xb2\x1a\x26\x7f\x8d\x9d\x3b\xdc\x68\x9c\x75\x38\xfe\x95\x9b\xf7\x13\xfa\x99\x5d\xb2\xc0\xad\x36\xdd\xe4\x30\xa8\x41\x7d\x43\x7b\x72\xc7\x4e\x26\xdb\xe3\x1d\x93\x70\x1d\x46\x17\xfe\x51\x82\x5c\xff\x7a\x54\x4f\xc9\xf4\x4e\x43\x45\xe1\x4b\x4b\x11\xe1\x5f\x26\xff\xc2\xaf\x80\x35\xf3\xf9\x70\xe4\xdd\xa4\x4c\x0e\xbc\x03\x63\xc2\xb5\x6f\xde\x21\x86\x63\xbf\x78\x83\x90\x92\x53\x8f\xc2\xf3\x91\x53\xd4\xeb\x29\xda\x0c\x1a\x08\xaa\x96\x66\x01\xcc\x68\xca\x96\xe9\x93\xb0\x1b\x17\x3a\x26\x1b\x2e\xf3\x27\x65\x03\x82\xf5\x68\xfe\x94\x48\x55\xb0\xf4\xfd\x9d\x15\xe7\x52\xac\x74\xdc\xfd\x37\xb3\x78\x6f\xff\xce\xf2\x33\x39\xc2\x1e\x92\x70\xdc\xe8\x89\x1d\xd5\xee\xeb\xa9\x60\x8f\xdc\x7b\x6f\xbc\xc9\x9f\xa1\xb5\x90\x3d\xaa\x09\x68\xe1\xb6\x91\xd1\x9d\x06\xf2\x15\xde\xd0\x47\xef\x9d\x76\x61\x0f\x5d\xe2\x20\xf5\x04\x1b\x31\x3f\xaf\x9e\x96\xc9\xfd\x7d\xb5\x4b\x52\x25\x72\x6a\xf4\x35\xf9\xcb\xd9\xfd\x87\xab\x40\xce\x8f\x2c\x69\x40\xb5\x5f\x0f\xaa\xe8\x78\x50\xca"}, +{{0x6a,0xa5,0xc9,0xf0,0x08,0xf9,0x90,0x47,0x3b,0xa4,0xa6,0x28,0x6a,0x41,0x66,0x14,0x02,0x66,0x61,0xf1,0x1e,0x1a,0x24,0xef,0xa8,0x1a,0xc3,0x58,0x52,0xd1,0xd0,0x70,},{0x60,0x5a,0xc9,0xb4,0xdb,0xdd,0x50,0x33,0xd6,0xc8,0x28,0xbf,0xaf,0xa9,0x3c,0x00,0x39,0x44,0x0a,0xa1,0x1c,0xa7,0x24,0xae,0x83,0x40,0x43,0xe0,0x7b,0xd0,0x32,0xd5,},{0x97,0x56,0x30,0x3b,0x90,0x65,0x5e,0x93,0x52,0x51,0x03,0x2a,0xb1,0x9c,0xfc,0x95,0xca,0x1c,0x2a,0x2c,0x3e,0xa2,0x8b,0x03,0x3b,0xd4,0x70,0x66,0xcb,0xd4,0xc7,0xd8,0x98,0x2a,0x8b,0x98,0x86,0xf1,0xb9,0xcd,0x02,0xe8,0x8a,0x65,0x56,0x4d,0xa8,0xdc,0xc3,0x4f,0x30,0x8b,0xa9,0xf1,0x01,0x44,0xba,0x46,0x9c,0x2e,0xfa,0x49,0xe0,0x04,},"\xb5\x16\x5d\x39\x63\xf6\xe6\xf9\xea\x56\x57\xe9\xf0\x7f\xf3\xa3\x21\xeb\x33\x8f\x9a\x8c\x3d\x3c\x42\x30\x6b\x2b\x27\x89\x78\xb3\x1c\x62\x3a\x63\x1b\xe3\xb0\x4c\x41\xed\xfd\xed\xdf\x53\x8e\x1b\x76\x5b\xc8\x78\x54\x01\xc1\xaf\x29\xd0\x46\x7a\x64\x41\x1c\x49\x73\x95\xd7\x55\xdc\xa0\x3a\xe3\x27\x2f\x4b\xc1\xfb\x19\x18\xdc\xc1\xed\x6f\x04\xd6\x49\x84\x04\xa8\xce\x14\x09\xd4\x47\xf5\x70\xa4\x35\x95\x22\xcc\x54\x62\x92\x02\xeb\xe5\x07\xab\x69\x38\x43\x14\x1b\xd5\xea\x05\x73\xb2\x0f\x32\x1a\x48\x3f\xf3\x83\xa4\x68\x97\xf5\x92\x6f\xe0\xb8\xaf\xc2\x55\x72\x70\x7b\x63\xee\xed\x28\x35\x32\x92\x8a\x41\x44\x19\x64\x97\x94\x2c\x57\x2a\xc5\x47\x60\x51\x39\x25\x6b\x0a\xa0\xea\xf0\x4d\xb1\xa2\x56\x01\x2e\xd4\x53\xb1\x73\xee\x19\xad\x6e\x9b\x1a\xf3\xf4\x5f\xf3\x04\x4a\x64\x1f\x8c\x8e\xb0\xac\x7b\xb4\x5a\xbb\xde\xd4\x72\x86\xb2\xa0\x69\xd3\x90\x86\x94\xee\x06\xf2\xfb\xd0\xef\x60\x5a\x79\x11\x02\x6e\xa9\xea\x3c\x49\x13\xf3\x8c\x04\xd8\xb6\x95\x65\xa7\x02\x78\x67\xab\x30\x92\xd0\x5f\x4c\xfb\x18\xfc\x7c"}, +{{0x8e,0xfb,0x8b,0x79,0x74,0x2b,0xe2,0x1e,0x6d,0x31,0xde,0x67,0x8b,0xc8,0x14,0x50,0xba,0x86,0x21,0x08,0x2c,0xd6,0xf0,0x00,0x3e,0x22,0x86,0x1e,0x22,0x91,0xc4,0x81,},{0x33,0x38,0x1e,0x35,0x6c,0x4f,0xd3,0x86,0xa3,0xf7,0xb9,0x69,0xaf,0xd9,0xf5,0xc0,0x0d,0x20,0x67,0xb6,0x98,0xb3,0xf1,0xf0,0x0f,0x37,0x84,0x20,0x2d,0x30,0x84,0xcf,},{0x92,0x30,0x05,0xcb,0x48,0x48,0x40,0x2a,0xa8,0xf9,0xd5,0xda,0x74,0x03,0x0b,0x00,0x94,0x44,0x92,0x4c,0x21,0x4a,0xd6,0x00,0xdd,0xba,0xb4,0xc1,0x53,0xa6,0xff,0x02,0x2b,0x53,0xcf,0x63,0x64,0xcd,0x7e,0xe9,0x9b,0xef,0x34,0xfe,0x14,0x4d,0xa9,0x64,0xed,0xfc,0x38,0xa0,0xba,0x63,0x33,0x12,0x65,0x0e,0xbf,0x0e,0x55,0xa0,0x60,0x09,},"\x6b\x75\x03\x25\xd3\xa0\xf0\x8a\x14\x77\x00\xb5\x1a\x9b\x37\x25\x57\x10\x94\x81\x8e\xd6\x9d\x1f\x76\x10\x13\xeb\x86\xf3\x23\xf7\x3c\x49\xf5\xe4\x39\x87\x7c\x27\x83\xb3\x36\xd1\xf1\xa6\x74\xef\x3e\x43\x1f\xc1\xae\x01\x80\x08\x2d\xf5\xfc\xa6\x9f\x84\x81\x39\xfe\x6a\xb6\x73\x9a\x05\x92\xeb\xd6\xd4\x70\x5c\x7f\x01\x36\xb2\x21\x89\xa1\x1d\x60\xd4\xd3\xc9\xbc\x80\xfe\x7d\x7c\x00\x95\x2d\x57\x42\xf9\xc0\xc2\x12\x1f\xe7\x92\xdf\x13\x3f\x22\x1d\xb9\x91\xfc\x96\x0e\xe6\x4b\x9d\x32\xe0\x17\x8e\x54\x2b\xce\x8e\xfa\x8d\x03\xac\x80\x26\xcd\x77\xba\x8b\xf0\xb2\x42\x15\xb9\xfa\xed\x2e\xae\xc9\x20\xe9\x25\xd5\xec\x46\xff\xf6\xbd\xe7\x25\xe9\x1c\x82\x80\xe4\xad\xa2\x32\xa5\x43\x3a\xe9\x68\x0e\xbb\x53\xeb\x55\x55\x31\x47\xc9\x33\x70\x57\x48\x54\x89\x61\x54\x51\x42\x99\xc0\x93\x21\x9a\x11\x1d\xca\x4e\x63\x7a\xd5\x00\x13\x38\xc6\xd4\xd5\xee\x90\x98\xc6\x58\x32\xf7\xaf\x83\x5b\xcb\x62\x21\x28\x42\x30\x36\xc7\x9a\x57\x37\x73\x8a\x75\x39\xf8\xd4\xa6\xb8\xb2\x21\xb5\x6d\x14\x01\xae\xb7\x4d\x45\x71\xbc\x00\x9d"}, +{{0xed,0x04,0x6d,0x68,0x8b,0x2b,0x0a,0x1b,0xc3,0xda,0xf2,0x11,0x9d,0xd3,0x21,0xa6,0x07,0xb1,0x6d,0x2a,0x2d,0x1d,0x96,0x3a,0xdd,0x12,0x09,0xc6,0x65,0xb5,0xcc,0xba,},{0x87,0x34,0xf1,0xff,0xcb,0xd7,0x1c,0xfd,0xe2,0x90,0x01,0x7e,0xa6,0x25,0x3e,0x58,0x0d,0x59,0xe6,0x5b,0x54,0x1b,0x46,0x52,0x1f,0x5e,0x5e,0xc1,0x45,0x1e,0xae,0xc6,},{0x72,0x1b,0xfd,0x47,0x76,0xcf,0xba,0x13,0x33,0x0f,0xd3,0x72,0x69,0xe9,0x79,0xc1,0xd7,0xb6,0xce,0x54,0xa5,0x1b,0x82,0xf4,0x56,0xe1,0x37,0x37,0x8e,0x58,0x2f,0x19,0x2a,0x12,0x08,0x9d,0xa5,0xab,0xa7,0x6a,0x7b,0x16,0x18,0x13,0xdc,0xe5,0x6b,0x72,0x89,0x2a,0x35,0x33,0x0c,0x94,0xf7,0xff,0x21,0xd0,0x9c,0xf0,0x9e,0x55,0x35,0x04,},"\xb9\xcc\x90\xfd\x8d\xe2\xa1\x41\xf9\x51\x16\xdb\x3b\x04\xbe\x83\xe9\x85\x22\x59\x7e\xc2\x17\x49\x64\x24\x51\x80\xb9\xa4\x73\x76\x7d\x6d\x47\x0a\x21\x7d\xb5\xff\x5a\x1a\xb7\x77\xe1\xe2\x8a\x0b\x16\x97\x5e\x2b\xac\xb8\x73\x02\x04\x44\xb4\x7e\xd8\x32\x64\x21\xb9\x0e\xbb\x50\x36\x88\xf0\x90\xc1\x1b\x3b\x13\x61\x7c\x5c\x50\x52\xc2\x97\xa4\x1e\x28\x93\x77\x5e\x34\xd5\x9a\xda\x49\xd9\x94\xc0\xe4\xa9\xf5\x22\x0e\x9f\x03\x15\xa6\x77\x05\xa3\xec\x08\xaf\x0d\xc7\x24\xb5\xcf\x67\xff\x34\xfa\xda\x8b\xa7\x10\x9e\xd2\xb5\xa8\x90\x7b\xb4\x03\xfb\x1a\x83\x8b\x4b\x05\x9f\x18\xc7\x92\xd7\xbf\xec\x05\xde\xe0\xc9\xcb\xbf\x17\x53\x40\x9d\x7d\xb3\xac\xea\xf4\x7b\x4c\x61\x39\x84\x97\xb0\xec\xa6\xc1\xf8\xac\x08\xa7\xea\x1e\xb9\xc4\x0b\xc4\xe9\x2e\x88\x82\x12\xf7\xd9\xee\x14\xfd\xb7\x31\x58\x16\x09\x44\xff\x9b\xcd\xfe\xf1\xa7\x46\x9c\xc7\x0f\x94\x74\xe5\xf2\x4d\xff\xfe\xa5\x85\xf0\x9e\xaa\xab\x4b\xe2\xaf\xeb\xbe\x8e\x6c\xf8\x6d\x35\x68\x0d\xc5\xd1\xb9\x29\x13\xe8\x48\x25\x6e\xc7\x36\x31\x6f\xd0\xa2\x14\x20\x63\xb0"}, +{{0x76,0xac,0x8e,0x57,0x0a,0x39,0xb3,0xa0,0x23,0x2c,0x45,0x49,0x75,0x37,0xfb,0x21,0x55,0xac,0xec,0x36,0x17,0x86,0x5e,0xd1,0xdf,0x21,0x0f,0x00,0xb4,0x9d,0x1b,0x8d,},{0x31,0x2a,0x3a,0xd8,0x99,0xae,0x6a,0x25,0x50,0x7a,0xe6,0xe4,0x52,0x4e,0x10,0xb6,0x3a,0x6e,0x7a,0xe5,0x3d,0x9c,0xff,0xd3,0x9c,0xf2,0x85,0x21,0xd9,0x35,0x33,0xd6,},{0xcf,0x03,0xf5,0x25,0x91,0x3c,0x44,0x30,0x3b,0x2f,0x80,0x07,0x93,0x93,0xc2,0x1c,0x11,0x58,0x14,0x6e,0xcf,0x99,0x63,0x6f,0x5d,0x97,0xad,0xfd,0xd9,0xf3,0x58,0x39,0x80,0x4c,0x23,0x80,0x4c,0xbf,0x1e,0x55,0x3c,0xfd,0x4b,0x73,0xf6,0x89,0xa9,0x14,0x3a,0xec,0x29,0x8f,0x82,0x76,0xe1,0xe4,0xee,0x08,0x91,0xf1,0xba,0x75,0xde,0x04,},"\x53\xce\xd9\xdb\x2b\x47\x9e\x59\xd3\xed\x64\x3f\x7c\xc3\x78\x4c\x24\xb8\xbd\x4c\x63\x20\x6c\x72\xe2\x3f\xa8\x50\x02\x88\x99\xa4\x1c\xe1\xa8\xbd\xc0\x03\xf1\x2b\x7c\x29\x97\x2c\x9a\x08\xbc\xd2\x31\xfe\x0e\x1a\x0f\xef\x0b\xaf\xbf\xa4\xe0\xe0\x27\xd7\x20\x04\x07\x5b\xa3\x7d\x49\x0e\xb9\x96\x4e\x78\x3b\xb9\x8f\x9e\x50\x3e\x9c\x1f\xd3\xd2\x3f\xb0\x01\x7c\xc7\xc7\xa9\xf8\x6d\x17\x1f\x04\x1e\x23\x55\xd8\xc5\xe6\x22\x9d\x34\xc7\xee\xac\xb6\x35\x8c\xf3\x06\x0d\x5d\x26\x5b\xae\x20\x04\xa5\x58\x87\x86\x59\xa3\x0d\xfe\xd5\xf2\xec\x78\x8b\x4e\x14\x39\x7b\x5d\x00\xc2\x9d\xb5\xd4\xeb\xf1\x66\x39\xa8\xdf\x29\x2a\x3d\x24\xf6\x98\x3c\xbc\xa7\x60\xd9\x03\xe9\x76\xf5\xb6\x98\x64\x2b\xa1\xfe\xd4\x9e\x79\xc3\x8f\x4b\xb3\x94\x6e\xfc\xcc\x9d\x6a\xef\xad\x33\x6d\x55\x8f\x78\xe4\xf2\x05\x42\x2e\x10\x38\x4a\x4e\x53\x1e\x75\x80\x7e\xfb\x38\x9d\x2a\xf4\xca\xb4\x38\x25\xfb\x87\xf1\x96\xa9\x08\x07\x69\xfe\x75\x85\x78\x29\x70\xa6\x91\x8a\xff\xe1\x0d\x20\xd6\x29\xb7\x05\x84\x55\x97\x41\x8d\x69\x9d\xe3\xf1\xde\x85\x4f\x94\xbd"}, +{{0xf6,0x4a,0x66,0xba,0x0f,0x08,0x19,0xf3,0x00,0x14,0x16,0xc2,0x20,0xbf,0x52,0xd8,0x60,0x13,0x0a,0x19,0x76,0x4a,0xa8,0xab,0x38,0xd1,0x5b,0x2a,0xa7,0x5a,0xc0,0x22,},{0x81,0x25,0x25,0x3c,0xd3,0x37,0xe0,0x0d,0x45,0xb4,0x50,0x79,0xb5,0x85,0x34,0x95,0x61,0xe5,0xf5,0x42,0xa8,0x1f,0x6d,0x2f,0xcf,0xd9,0x85,0xc1,0x0f,0xea,0xb2,0xaf,},{0x4d,0xe6,0xf5,0x25,0x08,0x22,0xd7,0xc9,0xd5,0xbb,0x98,0x58,0x25,0x00,0xb5,0xc0,0x85,0xf5,0x41,0xeb,0xdc,0x45,0x0e,0xd1,0xac,0xaf,0x83,0x68,0x48,0x27,0xed,0x1d,0xc7,0x71,0x47,0xaa,0xe4,0xb1,0x9e,0x14,0xa7,0xdc,0x5b,0xbe,0x1f,0x1e,0x4f,0x57,0x71,0xd8,0xa6,0xe4,0xf2,0x35,0x17,0x39,0xaf,0xb0,0x8c,0x80,0x6d,0x55,0x87,0x01,},"\x80\x72\x86\x2e\xd0\xab\x35\x92\x1d\xb5\xec\x2c\xba\x8e\x6a\xed\xb0\x44\x1f\xdf\x47\x49\x10\x06\xc0\x1e\x64\x56\xad\x70\xfa\xe3\xc4\x15\x2d\xcf\xbf\xdb\xb8\xf0\xfd\xde\xc5\xe9\x6b\x12\xbf\x67\x98\x9b\xa9\x67\x93\xf4\x86\x1a\x11\xb6\x39\x09\xce\x8d\x19\xb8\xca\x64\xa5\x44\xb3\x1c\xe0\x51\xfb\xc8\x8e\x06\x28\x06\xd9\x96\x5c\xbd\x29\x67\xb0\x16\x14\xe8\x6b\x53\x2f\xbf\x59\x84\x32\x18\xdc\x9c\x19\xc8\x03\x15\xf0\x44\x73\x17\x19\x37\x10\x92\xa3\xda\x38\x87\x8b\xc4\xcf\x77\xde\x97\x2e\x86\x04\x66\xb8\xfc\x45\xe4\x65\xdc\x3d\x0e\xbf\x94\xbd\xea\x60\xef\x0b\x98\x91\xce\xd4\x1b\x99\x7b\x11\xb3\x1e\xe4\x16\x7d\xb6\x0c\x9c\xfc\x8b\x85\xbe\xac\xfe\x22\x3c\xc1\x82\x92\x13\x77\x40\x85\xd7\xc0\x6d\x2b\x2e\x63\x2c\xc2\x1c\xd9\x66\x0d\xf4\x7c\x4f\xa9\x18\xbd\xd5\x96\xdd\xf6\x22\xdc\xb6\x52\x64\x2b\x67\x52\x7b\xa8\xed\x15\xa8\x19\xa8\xe2\x1f\x48\xd7\xee\x70\x24\x7f\x52\x00\xe3\x7c\x25\x9d\xff\xd1\x7e\xec\x8c\x23\x2f\x97\x0c\xb0\x31\x82\xfe\x39\x64\x13\x29\x93\xf6\xec\xb7\xc4\xdb\x18\xcc\xef\x39\x0c\x9e\xb3\x63\x9e"}, +{{0x84,0x39,0xb1,0xd6,0x0a,0xa4,0x84,0x60,0x13,0x5e,0xb1,0x00,0x2c,0xc1,0x12,0x79,0x29,0x95,0x07,0x9a,0x77,0xe6,0xe8,0xab,0x02,0x0b,0x9a,0xba,0xca,0x89,0x20,0xb4,},{0xea,0xdc,0x3e,0x0c,0x5b,0xdd,0xbc,0x30,0x52,0xc3,0xb2,0xf8,0xb0,0xa9,0x45,0x66,0xc2,0xb2,0xc8,0x79,0xed,0x17,0x03,0x4a,0xc0,0xe6,0xa4,0x5f,0x2b,0x3e,0x32,0xd2,},{0x62,0xda,0x81,0xe1,0x64,0x40,0x82,0x1b,0x59,0x3b,0x6e,0xe6,0x54,0x0e,0x15,0xd1,0xae,0xa7,0x5d,0x23,0xe0,0xa1,0xbb,0xfe,0xdc,0x80,0x8c,0x95,0x48,0xf8,0x7e,0x8b,0xbf,0x36,0x91,0x5a,0x39,0xa7,0x47,0x16,0xf6,0x45,0xcc,0xa5,0x71,0x4d,0x17,0x0a,0xf9,0x07,0x57,0x6d,0x4f,0x37,0x05,0xe5,0x43,0xd2,0xad,0xdd,0xc5,0xff,0x23,0x03,},"\x54\x19\xf6\xd2\x4e\xb4\x66\x35\xd4\xa7\xf8\xea\xb8\x03\xcf\xd0\xd0\x4d\xe0\x92\xaf\xbd\x86\xf2\xa6\x96\x1a\x8d\x1e\xb8\xc0\xd1\x97\xba\x55\xee\x08\xc9\x91\x82\x2a\x5a\xa7\x02\xba\xe0\x33\x7a\xbd\x5c\xa7\xfa\xa1\x5e\x1f\x1a\xe3\x69\x94\x6e\x9b\x81\x21\x6c\x0f\x5f\xc2\x2b\xbd\x44\x33\xc3\xde\x93\xc5\xca\xa2\x74\x16\x83\xbb\xd0\xe1\xa7\x8d\xf2\x8d\xda\x19\x17\x41\x01\x87\x63\x34\xd4\x03\x39\x65\x9f\x02\x1a\xe7\x66\x16\x2c\x6c\xc5\x42\x1b\x79\xcf\x9d\x5c\x09\x0e\xd4\xaf\x07\xec\x84\x49\x30\x35\xbd\x0b\x24\x21\xb5\x33\x68\x42\x95\xbb\xe7\x6a\x70\xfe\xc5\x96\xef\x8c\x89\xc5\xc9\xdd\xa3\xc3\x3b\x77\x35\xd2\xd2\xf2\x0b\x28\xf1\xa5\x40\x2e\x72\xd0\x4b\xa2\x91\xdd\x59\xf1\x4a\xf0\x8a\xdf\x56\xee\xb0\x86\xd7\x69\xc6\xbe\xc3\x45\x18\x91\x37\x23\x45\xfd\x6b\xd0\x2d\xcf\x95\xe8\x03\xaf\x03\x53\x15\x0e\x18\x2e\x32\x3a\xaf\x68\x3e\x03\x6d\x9a\x13\x5d\x2e\x6f\x98\xcb\x4d\x32\x7e\x2c\xe7\xd5\x42\x47\xf3\x59\x2e\xd0\x67\xb4\xce\x76\x27\x17\x4f\x99\x6f\x28\x16\x5c\x9c\x11\xf0\x7e\x5e\xe9\xce\xe6\x38\x51\xc6\xb6\x8e\xa2"}, +{{0x3a,0x04,0x63,0x97,0xf0,0xaf,0xc0,0x72,0xbc,0x7f,0x90,0x7c,0x74,0xd3,0x8f,0xd1,0xb9,0xaf,0xdf,0x27,0xe1,0x4a,0x35,0x34,0x76,0x8b,0x0d,0xd2,0xdf,0x3a,0x1c,0x22,},{0x99,0xcd,0x70,0xef,0x3b,0xe3,0x42,0x49,0x33,0x93,0x87,0x2f,0x54,0xc4,0x7d,0xea,0xa0,0x81,0x02,0x18,0x92,0xd1,0x1a,0x32,0x68,0xf3,0x14,0x5e,0xd4,0xf3,0xab,0xe5,},{0x50,0x24,0xce,0x60,0x25,0x79,0x65,0x68,0x70,0x80,0xc5,0xb1,0xfc,0x7d,0x13,0x01,0xc3,0x2a,0xa6,0xfc,0xc8,0x35,0x49,0x7d,0x9c,0xb2,0x3a,0x74,0xa6,0xca,0x27,0x24,0xf5,0x53,0x53,0xc1,0xb7,0x57,0x82,0x7c,0xa5,0x44,0x0c,0x9e,0xf8,0xf8,0xc1,0x05,0x09,0x13,0xe2,0x0a,0xab,0xec,0x35,0xc4,0x97,0xb5,0x60,0x41,0xb5,0xde,0xb2,0x09,},"\xf0\x8d\xde\xf4\x6c\xc6\xc3\x41\x79\x82\x0c\x98\x61\x37\x51\x72\xfd\xdf\x77\x4f\x8d\xc3\xf7\xd6\x4a\xa4\x32\xda\x8e\x5f\xae\x64\x4c\x0a\x8a\x9e\x69\x08\x51\x7d\x50\x5d\xeb\xd6\x12\x86\x8a\xc6\xda\xf9\x5c\xd7\xe1\x69\x97\x50\x02\x2c\xcd\x4b\x88\xdb\xae\x2b\xbf\x73\x54\x6e\xe4\xb8\x35\xd3\x19\xa8\x42\xda\xe8\xb9\xed\x68\x33\x23\xf3\x1e\x5c\xc5\x79\x19\xbc\x9d\xbe\x3b\xcf\xff\xb2\xad\xa4\x80\x72\x69\x7f\xf4\xa7\xd3\x10\xc9\x1a\xdb\xca\x81\xfa\xf2\x6a\x0e\xb7\xbb\x0c\x40\x4a\xc9\xd8\xdf\xec\x63\xe9\xc6\x4e\x2f\x42\x0c\x07\xd3\x23\xb7\xc0\xdc\x3b\x73\x50\x72\x83\xae\xb1\xce\xe5\x1d\xb4\xe1\xa8\x3a\x69\x2c\x7c\x1e\xa3\x98\xf6\xf3\x09\x40\xfa\xb8\x5e\x21\x38\xd4\xb8\x5a\xa4\xe2\x31\xe5\x42\x4f\x5b\x06\x4e\xd0\x26\xf0\xcc\xb9\x9d\x1c\x85\xa9\xeb\x15\xf5\x93\x4a\x11\x35\x9d\x41\x1c\xf9\x4a\xe8\xff\xa3\x36\x1a\x22\x4f\x46\xba\xb8\x52\xd1\x84\xa2\x48\xb4\xc3\x1f\xe3\xa7\xe7\xf5\x13\x4c\x05\x10\x31\xa9\xf3\x28\xa7\xbe\x4a\x7c\xbb\xb1\xd8\xd8\x63\xa4\x00\xfd\x2d\x58\xda\xa4\x4f\x1b\x9d\x8e\x9d\xdf\x96\x1c\xe6\x32\x2f"}, +{{0x12,0x4f,0x74,0x16,0xa8,0x04,0x53,0xe4,0xcf,0x1c,0xd7,0xb5,0xe0,0x50,0xa9,0x76,0x14,0x18,0x25,0x8b,0xf7,0xd2,0x7b,0xeb,0x7f,0x23,0x23,0x8c,0x45,0x40,0xbe,0x2d,},{0x0d,0xa3,0x4a,0xb1,0x73,0x99,0x01,0x50,0xdf,0x73,0x99,0xb6,0xbc,0xdd,0xba,0x93,0xc6,0xdb,0xcb,0xf4,0xd1,0x76,0x94,0x1c,0xb5,0x07,0x1e,0x87,0x34,0xc5,0xdc,0x92,},{0xb0,0x57,0x21,0x04,0xaa,0x69,0xe5,0x29,0xe3,0x46,0x5a,0x6f,0xd2,0x8f,0x40,0x4a,0x4e,0xc2,0x02,0x76,0xa9,0x93,0xb1,0x72,0x5e,0xb8,0xc5,0xf6,0x50,0xb4,0xa2,0x16,0xf1,0x87,0x1b,0x24,0xe3,0x68,0xcc,0x46,0xcd,0x1e,0xe0,0x17,0x4c,0xda,0x1b,0x5e,0x4a,0xe2,0x20,0x0a,0xa9,0xfc,0x44,0x52,0x2d,0x97,0x5a,0x9c,0x51,0x81,0x49,0x08,},"\x9d\xcb\x98\x73\xff\x05\x4d\xb1\x1d\x0a\x9b\x19\xde\x68\x85\xff\xba\x7f\x0e\x68\x1c\xf7\xfb\x8f\x6c\xd9\x50\xc4\x83\x28\xd1\xf9\x19\xca\x46\x05\x4e\xee\xe6\xc9\xe5\x78\x43\xeb\xdd\xa7\xb2\x4b\xc3\x50\x3c\x4d\x61\x2a\xbb\x1a\x31\x4f\x39\xf5\x82\x21\xd2\xb5\x4d\xc7\x55\xac\xca\x79\x69\x74\x0e\x7f\xa8\xb1\xa9\x52\x3b\x8c\x73\x79\xfd\x39\x52\x53\xf4\xe6\xcd\x05\x4e\xe2\x4b\x75\x61\x3c\x35\x81\xd4\x9e\x19\x24\x6a\x7b\x3b\xe1\xce\xcb\x33\x4b\xe4\x4f\x3d\x62\x6f\xe3\xb7\xb2\x69\xe6\x28\xd4\x45\x80\xc2\x06\x36\xeb\xa2\x64\x2f\x27\x44\xb9\x59\xe6\x57\x57\xd0\xee\x60\x18\x43\xf1\x88\xe9\x5d\x17\x25\x3f\xef\x56\x70\x68\xa5\x40\x5a\x3a\x9e\x67\x7f\xea\x3d\x7d\x55\xf7\xea\xd1\x9a\x3f\x30\xc5\xf9\x85\x67\x1b\x55\xfa\x12\x0c\xb9\xd0\x5f\x47\x1b\x6e\x1e\x8d\x77\x9a\x2c\x80\x3a\x19\xe6\xd0\xd7\xcd\x50\x78\x87\xed\x64\x7c\x2a\x95\x48\x3f\x93\x39\x91\xed\x45\xae\x30\x1a\x2b\x0e\x95\x4a\x57\x03\xd2\x48\xc7\x88\x10\xaa\x0b\x19\x9c\xc2\xbe\xbb\x2f\x1d\x71\xcc\x40\x48\x7d\xbd\x42\xee\xe0\xf7\x45\xf7\xd2\x85\x68\x5b\x1f\xb3\x1b\x15"}, +{{0x25,0xd1,0x3b,0x38,0x37,0x60,0x1b,0x07,0xa9,0x75,0x69,0x3e,0x5a,0x33,0xd5,0x33,0x7c,0x34,0xc1,0x12,0x7f,0xe4,0xc2,0x74,0x90,0x61,0x2a,0xaf,0x7f,0x64,0x2e,0x9a,},{0x3a,0x07,0xcd,0x68,0xee,0x26,0x92,0xd5,0x1c,0xfa,0xd1,0xa8,0x0e,0x77,0x63,0xb1,0x8a,0x04,0x3c,0x74,0xf4,0xe1,0xb0,0x1e,0xdc,0x55,0xba,0x9a,0x9e,0x07,0x79,0x5a,},{0x20,0xcb,0xf0,0x83,0x92,0xfe,0xa6,0xa9,0x9c,0xf4,0x46,0xa9,0x5c,0x19,0x9c,0xaa,0x0c,0x0f,0x98,0x13,0xcc,0x21,0x7b,0x8d,0x22,0x8e,0x2e,0xd9,0x0b,0xab,0x95,0xea,0x92,0xcd,0x73,0xac,0x95,0x83,0x47,0x64,0xd3,0x3e,0x42,0x24,0x3c,0x80,0xa7,0x60,0x34,0x91,0xc8,0xd3,0xe4,0x9a,0xc7,0x15,0xfd,0x8a,0x5b,0x9e,0x47,0x89,0xbb,0x03,},"\x11\x5b\x32\x20\xb4\x5c\xa8\xf3\x6c\x7f\xf5\xb5\x38\x87\xd4\x7e\x66\x9b\x78\xda\xc1\x3b\x98\xcc\x7a\xac\xa5\xc2\xe1\x9f\xce\x81\xec\x86\x17\xca\x41\x0e\x11\xc9\xa9\x11\x8a\x66\x84\x53\xb3\x29\xff\xb7\x18\xea\xec\x73\x91\x72\xf0\xa8\x49\xa0\x84\x81\x92\xa5\xbd\xea\x18\xab\x4f\x60\xd8\xd1\xa0\xd3\x38\x95\x2d\x77\xb2\xcc\x13\xef\xe8\x3c\x76\xe8\xdd\x58\x80\x3b\x1d\x8b\x3c\x97\x29\xef\x10\x2b\x20\x83\x5b\x7d\xe8\x72\xbe\xf3\x01\x0f\x15\xa4\xca\xdd\xf0\x7c\xf7\xbd\xd2\x22\xd8\x4b\x17\x4b\xc2\x15\x27\xcf\xfb\x1b\x7f\xfd\xe8\x1e\x28\x1d\x30\xcb\x7b\xce\x25\xea\x3d\xff\xb6\xea\x1f\xbb\x06\xcb\x70\x56\x9a\x95\xed\x1a\x07\xe9\x7c\xa4\x2d\xe7\x0a\xa2\x18\x15\x9e\xfd\x60\x8f\xa9\xb0\x89\x6e\x0b\x58\x51\x8a\x32\x2f\x25\x1d\x13\x3e\x58\xc8\xfc\x14\x28\xab\x0a\x17\x0e\xd8\x45\xc7\x5f\xb4\x03\xf1\xff\xb9\x7d\x2d\x2a\x6d\x4f\x27\x79\x11\xd3\x26\xc1\xca\xbb\xb8\x51\x6c\xbc\x17\x90\x8a\xb8\x1f\xf8\xd7\x9a\xf4\x46\x11\xea\x1d\x05\x87\x9c\x1e\xc8\x1d\x06\x93\x6e\x0f\x4a\x0a\xef\x6d\x57\x48\xe1\x81\xd3\x0e\xc2\x52\x36\x59\x7a\x97\x3d"}, +{{0x7b,0x3a,0x76,0xde,0xca,0xea,0x60,0xc4,0x1e,0x95,0xb0,0x58,0x77,0xa7,0xda,0x82,0x06,0x4c,0x27,0x27,0x8c,0x8d,0x7d,0xf5,0xf0,0xbb,0x95,0xf0,0xad,0x2d,0x04,0x35,},{0xf8,0x0d,0xb5,0xc2,0x87,0x21,0xb1,0xc6,0x11,0xbd,0x87,0xeb,0x14,0x5a,0x98,0xbb,0xf3,0x83,0xb0,0x68,0x04,0x5d,0xf2,0x45,0x8d,0x1a,0x6f,0xda,0x09,0x9f,0x7f,0xc2,},{0x2c,0xd2,0x6f,0xb3,0xc4,0xf7,0x44,0x0a,0x72,0xaf,0xfe,0x93,0x56,0x4f,0x6f,0x65,0x59,0xad,0xb1,0x5c,0xc7,0xa2,0xba,0x10,0x87,0x9f,0xb7,0xd6,0x7e,0x47,0xd4,0xeb,0xd0,0x2f,0xe4,0x82,0x36,0x98,0xa5,0xfb,0xd4,0xa9,0x07,0xfd,0x69,0x18,0x4c,0x25,0x5a,0x17,0x0e,0x5f,0x17,0x47,0xfc,0xe9,0x68,0x10,0x2d,0xc2,0x19,0xb5,0x0d,0x02,},"\x37\x5f\xad\xae\xdd\x9c\xac\x49\xb6\x4e\x15\x74\x02\x80\x46\x06\x9f\x4c\x83\x65\x4c\x8a\x70\x11\xab\xdb\x64\xdb\x16\xb4\x7f\xa3\x11\x79\x81\x72\xf9\x07\x22\x17\xb0\xa6\xa4\x3e\x5d\xf6\xff\xcc\x11\x54\xbc\xec\x1c\x68\xe1\xd3\x5e\xc0\x58\x80\xd0\x12\xce\x76\xe4\xce\xbf\x30\x1b\xb2\xec\x98\x3d\x00\xb4\xa0\x54\x0c\x93\x7f\xf1\xc6\xdf\x94\x41\xc6\x1b\xdb\x3b\xe8\xe0\xc7\xc1\x1a\x35\xd4\x9b\x6f\x55\xc3\x81\x26\x9a\x0e\x76\x8e\xfb\xd4\x53\x44\x7f\xe4\x8b\x75\xac\x39\x64\x6c\xa8\x2e\xca\x7d\x14\x93\x04\x42\x34\x91\x87\x1c\x10\xdb\xcf\xc5\x97\x3a\x57\xfa\xb8\x37\x1c\x30\xcb\xc4\xe9\x0b\xec\xc0\xb6\x71\x52\x22\x6e\xe1\x77\xb4\xff\x36\x8e\xc8\x79\xb3\x91\xeb\x95\xe3\x6d\xcb\xb0\x7b\x2c\x16\xba\x39\x55\x45\xd4\x52\x9f\x72\x7b\x1a\x11\xef\x65\xd1\x20\x97\x6b\x7c\xcc\x86\xaf\x4b\xd2\x04\xcb\x94\x89\xc9\x21\xe4\x3b\xa5\xe8\x50\xcf\xe5\x98\x99\xf1\xc1\xec\x4a\xa5\xc9\x2b\x6d\xac\x69\x14\xb1\x95\x2b\x53\xdc\xb5\x40\xb4\x09\x23\x13\x81\x56\x89\x87\xbb\x22\x36\xbc\x40\x89\x5d\xf3\xf1\x7e\xab\x7c\x02\x74\xf2\x24\x4f\x95\x86\x12\xe8\x8e"}, +{{0x5f,0xf8,0xd4,0x05,0x26,0x08,0xeb,0x03,0x3a,0x5e,0x94,0xb6,0x03,0xce,0x38,0x4d,0x84,0x52,0xf6,0x0a,0x26,0x49,0x8b,0x91,0x12,0x56,0x7f,0x34,0x10,0xc1,0x86,0x66,},{0xc4,0x90,0x0d,0xe2,0x4d,0x9a,0xf2,0x48,0x27,0x63,0x10,0x99,0x26,0xaf,0x7c,0x48,0x13,0x80,0xfa,0xbc,0xda,0x94,0x40,0xc1,0xa5,0x3e,0xa1,0xcd,0xc2,0x7e,0x65,0x68,},{0xb7,0x37,0xd4,0xe5,0xbe,0x27,0xde,0xb6,0xd8,0x77,0x29,0xc6,0x36,0xdf,0xf7,0xa4,0x06,0xc0,0x13,0xf3,0x13,0xc3,0x8c,0xf6,0x83,0xfe,0x14,0xf7,0x5a,0x3b,0x30,0x05,0xd9,0x53,0x5d,0x7e,0x58,0x15,0xc8,0xf8,0xb3,0x7c,0x51,0xd6,0x92,0x71,0x11,0xc9,0x79,0xf7,0xd9,0xd8,0x1a,0x34,0x7a,0xa9,0xcc,0x09,0xed,0x4e,0x6c,0x18,0xe9,0x0f,},"\x13\x8c\x60\x55\x7c\x2e\x90\x08\xaf\xc0\x3d\x45\xbe\xc7\x1f\x96\x11\x49\xa0\x83\x59\x26\x75\x1c\x8f\xf3\x93\x5c\x7d\x65\x2d\x83\xe1\xb0\xb1\xda\x7d\x5b\xbe\x0b\x8e\x17\x1a\x4e\x49\xaa\xe0\x6f\xd8\xa9\xde\xff\x78\xdc\xde\x4d\x25\xb1\xaa\x89\x99\x98\xa0\xf9\x9e\x1d\xf6\xf9\x33\x7a\x3e\xa2\xf2\x4b\x76\xc3\x17\xa7\x01\x4d\xb4\xe5\x28\x31\x91\x79\x5a\x70\xd8\x82\x1d\x21\x78\x46\x49\x0f\x95\x87\x01\xd3\x9d\xc2\xc8\xce\x47\xd9\x28\x93\x88\x74\xd8\x7b\x35\x58\x98\x9b\xc7\x7a\xf8\x20\x97\x9a\x35\x1e\xef\x95\x94\xaa\x5b\x94\xf3\x34\x1e\xde\xd4\xea\x20\xb0\x8c\x3e\x7c\x56\x10\xd4\x32\x67\x81\x8d\xfa\xc0\xa8\x7d\xdf\x52\x7f\xbc\xe8\x51\x2b\xbf\x85\xb6\x6c\x9b\xb5\xd6\x2f\x0f\xe8\x40\x48\xf2\x3b\x19\x60\x4a\x5c\x8d\x82\xb1\xf2\x5a\x8d\xa0\x27\x31\xfe\xb2\xec\xae\x48\x9b\x84\x75\xf7\xbd\x32\x6d\xdf\x1a\x08\x18\x9e\x46\xc0\x8c\xf5\x05\x38\xc2\xa3\x63\xe2\xf4\xeb\x2c\x01\xa2\x04\xc7\xff\xbc\x0b\x98\x1a\xdc\x0f\xd9\x97\xaa\xfd\xf2\xa2\x22\xee\x84\xc3\x09\xf6\xe9\x5e\xc7\xde\x4f\xa8\x5d\x47\x68\xd5\xc0\x03\x16\x50\x28\x22\x5e\x22\xe0\x9e"}, +{{0xee,0xde,0xfc,0x17,0x57,0xe3,0xa7,0xe5,0xed,0x39,0x46,0xdb,0xed,0xc3,0x96,0xa3,0x62,0xf6,0x83,0xd2,0xc5,0x1b,0x0b,0x9f,0x60,0x76,0x5d,0x4b,0xfc,0x51,0x34,0xde,},{0xa9,0x87,0x2b,0xc2,0x19,0x2f,0xc0,0x2b,0x18,0x9c,0xee,0xd4,0x03,0xab,0x9f,0x27,0x0a,0x03,0x2a,0x83,0x5f,0xde,0xbf,0xaf,0x1c,0x9d,0x69,0x34,0xed,0x83,0x04,0xbc,},{0xd5,0xbe,0xa8,0xea,0x9a,0x5f,0xe9,0xed,0x6d,0x2b,0xf8,0x39,0x93,0x0c,0x0c,0x6c,0xd5,0x03,0x9e,0x98,0x8f,0x55,0x1f,0xde,0xdb,0x54,0x37,0xe1,0xc1,0xaf,0x0e,0xd7,0xb3,0x89,0x7c,0x03,0x57,0x11,0xc3,0xc5,0x19,0x26,0xbe,0x8d,0x1b,0x32,0x02,0x4d,0x5c,0xd5,0x82,0xf5,0xf8,0x36,0x9a,0xd8,0x4d,0x18,0xb1,0x25,0x02,0x65,0x2f,0x07,},"\xb1\x94\xdb\x73\xf9\x94\xcb\xdc\x3c\xbe\x63\x0b\xa7\x2c\x47\xc2\x24\x9b\xc0\x59\x2a\xb5\x47\x94\x2b\x1d\x1b\x88\x2b\x44\xf5\xb3\x85\x5e\x56\x8b\xdd\xdf\x92\xef\x05\x02\x2d\x88\xfc\xfc\x29\x4e\x76\xb6\x4a\x00\xe9\xc7\x43\x55\x37\x37\x63\xe4\x9a\x4e\xbc\x47\x24\x3d\x48\xa9\xad\x58\x89\x94\xa5\x18\xf8\x0f\x86\x15\xc2\xb3\x1d\xa5\x87\xa5\x3e\x52\x9d\x43\x5a\x86\x97\x35\x0d\xfc\xde\x02\xd2\x0c\xce\x7d\x5e\xee\xfe\x3f\x5a\xb2\xaa\xc6\x01\x25\x9c\xda\x38\x53\x8a\x1b\x83\x01\xf9\x83\x2e\x75\xab\x90\xf8\xa9\x32\xf2\x67\xea\xc1\x81\x00\x39\x65\xd5\x26\x6f\x20\x61\x80\xc6\xc3\x80\xec\xe8\x03\x57\x7c\xcb\x46\x17\x6b\xf6\x07\x15\x94\x86\xf2\x42\x59\x74\x7e\x2c\xa6\xfb\x19\x12\xdb\x7b\x78\xa9\x73\xb2\x84\x63\x87\xc1\x20\x80\x30\xee\x1f\x40\x0d\x0c\x5b\x5e\x8b\xde\x96\x35\xae\x55\x63\x8b\xa1\x7c\x73\x4d\xe8\x63\x8b\xb8\x5d\xfc\xd7\x66\x29\xa7\xf9\xf4\x0d\x6a\xb9\x54\xd5\x5b\xf8\x57\x5f\xc9\xc9\xa5\x95\x09\x7e\x08\x93\xdb\x5a\x7b\x8a\x6c\x45\x5e\xcb\xd3\xd2\x2d\x72\x5e\x19\xde\x29\x41\xf4\x67\xf9\xeb\x93\xd6\x6a\x0e\x2b\xbd\xbf\x92\xed\x1c"}, +{{0x09,0xd2,0x2b,0xba,0xa5,0x95,0x6c,0xfa,0xcb,0xbf,0x9f,0xd5,0x51,0x09,0x75,0x12,0x86,0x86,0xc4,0x0c,0x6e,0xa9,0x6b,0x89,0xef,0x4c,0x0f,0x0c,0x64,0x9b,0xcd,0x7f,},{0xe5,0x59,0xea,0x8a,0xcb,0xdc,0x61,0xb6,0x70,0x9a,0x7d,0x83,0xae,0x15,0x84,0x9a,0x6c,0x78,0xb2,0x03,0x92,0x3d,0xd0,0xa2,0x99,0x23,0x9e,0xe4,0x88,0x69,0x30,0xba,},{0xe6,0x52,0x75,0xc4,0x32,0x8a,0x70,0xad,0x62,0x40,0x8e,0xd7,0xfb,0x17,0x28,0xbe,0x87,0xa7,0x3a,0x81,0x4f,0xee,0x8e,0xbd,0x94,0xf2,0x66,0x5c,0x71,0xbc,0x66,0xab,0x0c,0x1b,0x07,0xa6,0x00,0xb3,0x0b,0xc0,0x81,0xa7,0x4c,0x53,0x68,0x57,0xc2,0x06,0x10,0x38,0x4b,0xe2,0x68,0xd9,0xaf,0x3e,0x3e,0xcd,0xdd,0x3e,0xb0,0xc1,0x4c,0x0c,},"\x1c\x26\xa0\xf3\xa1\xa5\xb2\xd7\xd5\xb2\x97\xaf\x8a\x6a\x68\x9d\x7c\x62\xa2\x52\x67\xe1\x97\xd2\x3b\xec\xd2\xf2\xb8\x16\xc4\xde\x92\xfb\xda\xff\xb9\x41\xc3\xfc\x8d\xb7\xa8\x43\x35\xa8\x4c\xfb\xc9\x2c\xb3\xac\x80\x6e\xd5\x8d\xf1\x6b\x6b\x8e\x11\x9a\x48\xdf\x4f\x27\xc7\x1e\x93\x1a\x59\x38\xe7\xd0\x02\x73\x48\x85\xe1\x3a\x25\x8a\x15\xb6\xe1\x13\x6e\xfb\xa7\x2f\x1d\x09\x6b\x68\x9f\x76\x18\xf4\x9c\x96\x80\x63\xe8\xf9\x91\xfa\x0b\x55\x60\x1e\x43\x0e\xee\x13\x49\x2a\x1b\x09\x41\x3e\xb2\x38\x13\x59\x1a\x7a\x9f\x07\x0c\xc3\x96\xca\x9d\x1f\xac\xdd\x4f\x4c\xe3\x7c\x40\xf7\x24\x5f\x55\x03\x5e\x10\xfa\xd6\xb8\x5b\x5f\x01\xa1\xda\xac\xc0\xdf\x94\x06\x9f\x7d\xe8\xf6\x46\x7f\x96\xd1\xfb\x98\x64\x8e\x8a\x05\x20\xa8\xcd\x72\x3c\x98\xe9\xdc\x2d\xd4\xb2\x93\x4d\x82\x28\xf0\xae\x1a\x41\x5b\xd3\xa7\xcd\xa3\x8d\x7a\x99\x83\xce\x1a\xf6\xf8\xc9\x70\xa2\xa5\x91\x63\x5f\xe1\x2b\x91\x75\x36\xef\x81\x5e\xaf\x1a\x31\x38\xd7\x0c\xe7\x0a\x79\x42\x64\xd7\xc9\x86\xd9\xee\x32\x90\x44\x5f\x15\xa9\x24\x8f\x27\x65\x27\x1e\x5a\x99\x21\x96\xae\x33\x1a\xbd\x41\x64\xbf"}, +{{0x77,0x82,0x6e,0xd3,0x51,0xa3,0xf0,0x92,0x54,0xae,0x56,0x92,0x88,0x5d,0x77,0x4c,0xb3,0xf2,0x44,0x10,0xa4,0x80,0x9f,0xd9,0x0f,0x8a,0x00,0xda,0x9a,0xee,0x99,0x03,},{0x3e,0xac,0x8f,0x41,0xee,0x73,0xe6,0xef,0x13,0x68,0x21,0xf7,0x95,0x7a,0x1c,0x27,0xe1,0x56,0x38,0xd0,0xe3,0x91,0x6e,0x6c,0xaa,0xc6,0xfb,0x7b,0xeb,0x7b,0xcf,0xb0,},{0x97,0x7a,0xdc,0xcd,0xb8,0x29,0xb4,0x0b,0xbd,0x8e,0x53,0x85,0x6a,0x78,0x3d,0xb3,0x46,0xa3,0x9d,0xff,0x62,0x04,0x1a,0x29,0x72,0xd2,0x90,0x09,0xf1,0xc9,0xff,0x81,0xb8,0xad,0x54,0xcb,0x90,0x1e,0x49,0x7c,0x1d,0x30,0x21,0xb5,0x0b,0x6c,0x69,0xee,0x73,0x55,0x8f,0xd7,0xbe,0x05,0xd6,0x25,0xf5,0x72,0x7f,0x9a,0xf2,0xce,0x87,0x02,},"\x1f\xf0\x6c\x0b\x39\x99\xce\xcb\x19\x00\xa4\x7d\x26\x7b\xea\xfb\xb3\x5d\x93\xd1\x4c\xb2\xc8\x92\x5e\x3e\x3f\xe5\xd9\x67\x58\x69\x25\xee\x4b\xaa\x41\x99\x8e\xdd\x01\x03\x20\x58\x10\xaa\xd5\xc0\xbb\xdc\x77\x87\x44\x76\x81\x02\x46\xd1\x30\x89\xa6\x4d\xb5\x76\x42\x4f\xae\x0b\xed\x96\x64\xa4\x2a\x49\x11\x47\xd1\xee\x3b\x9c\x3b\x1b\xa4\x87\x5b\xe1\x54\x62\x39\x25\x40\xf9\x97\x8d\x9a\x46\x30\xba\x4c\x52\x54\x99\x75\x1a\x45\xef\xc2\x99\xec\x7d\x73\xb1\x7f\x9a\xd2\x75\xee\x71\xa6\x87\xe7\x26\x90\xd7\x32\x02\x42\xd2\xdc\x2b\xd4\xd5\xc5\xcf\x0f\x17\xa4\x65\x18\x5d\xcf\x60\xf8\xef\xff\x53\x90\x3f\x20\xb0\xc2\xab\x21\x92\xd4\x43\x68\xf2\xf2\xfb\x36\x04\x8a\xf0\x71\xf7\xaa\x85\x7b\x14\xad\x1d\x11\x46\x12\x05\xbe\xbe\x17\xe0\x2b\xe2\xe3\xcc\xb6\x09\x28\x21\x88\x5c\x4e\x0d\x48\x11\xbe\x3f\x45\xb1\xfe\xa0\x88\x45\x3e\x02\x24\x32\xf5\x62\x56\x2b\x43\xa3\x55\xcb\x56\x27\x0c\xed\xb6\xc2\xc4\x2d\xbf\x9b\xe8\x50\xe7\x71\x92\xfd\xc6\x5c\xfd\x36\x83\x4b\xe9\x88\xdb\xe9\xa9\x3e\x25\x18\xc1\x38\xb0\x90\xfb\x9d\xa8\x27\xcb\x1c\x91\xc8\xfe\x52\xfe\x7c\x57\xf7"}, +{{0x99,0xa9,0x95,0x31,0xc3,0xcd,0x6e,0x3e,0x9c,0x90,0x0a,0x9e,0xeb,0x26,0x26,0x7e,0x72,0xf0,0x9d,0x11,0xb6,0x51,0xa8,0x97,0xeb,0xb7,0x9b,0xe0,0x16,0xf6,0x4c,0x6e,},{0x9b,0xf9,0xf8,0xb4,0x8a,0x27,0x28,0xe0,0x26,0x08,0xfc,0x19,0x89,0x9d,0x21,0x96,0x56,0x83,0x9d,0x1c,0xc1,0xe9,0xa8,0x98,0x4d,0xf6,0x74,0xec,0x26,0x66,0x2f,0x41,},{0x0e,0x89,0xda,0x5d,0x94,0x9c,0xf2,0xbf,0x40,0xc7,0xe1,0x7c,0x2d,0x0f,0x9c,0xea,0xbc,0x88,0xa0,0x92,0xeb,0x4d,0x49,0xcf,0xbf,0xea,0xb7,0xc8,0xbf,0xf4,0x32,0x45,0xc6,0x7b,0x9e,0x2e,0x92,0xf9,0xbc,0xb9,0xb3,0x4b,0x3f,0xcf,0x8b,0x01,0xfa,0x2e,0xa7,0xa9,0x64,0x9f,0x81,0x4c,0x3a,0xa9,0x8b,0x3d,0xd0,0x45,0x40,0xc3,0x1d,0x09,},"\x7a\x89\xc0\xc1\x95\x2f\xdc\x42\x98\xdc\xae\xa8\x54\xef\xc1\x34\x65\x6b\xe1\x47\xe9\xe8\xe8\x2f\xc9\xa4\x49\x05\x9d\x80\x57\x0f\x75\x67\x6b\x81\xc4\xa9\x4f\x76\xa9\x68\x20\x0c\xde\xb0\x98\x8c\x73\xf5\x9a\xfc\x72\xad\x4c\x31\x03\xe1\x9f\xe6\x3b\x7e\x95\xe1\x40\xb5\xcb\x2e\xfc\x7b\x97\xa6\xff\xbb\x6c\x29\x8d\xda\xce\x3b\xe6\xd2\xed\x3d\x59\x8b\x8b\xdf\x0c\x2f\xe6\xc9\x76\x02\x14\x2a\x76\xe9\x78\x51\x4c\x19\x6c\x1b\x9a\x88\xef\xdc\x19\x25\xfc\x50\x61\x55\xcf\xf9\xa2\xf2\x1a\xb6\x34\xe2\xb9\x3e\x96\x92\x8a\x5d\x8f\x7c\xe4\xcb\x73\x26\xd9\x68\x94\x69\x24\x2b\xa9\xc6\xa0\x1b\x77\x49\x6b\xad\xef\x87\x57\x8f\x5a\x17\x28\x4e\x90\x0a\x72\xdf\x14\x1c\x61\x99\xb0\xe7\x1a\xb5\xda\x43\x75\x03\x76\x17\xec\x61\x96\xd4\xf4\xe2\x3a\xe2\x91\x6a\x72\xd0\xfc\xe7\x96\x02\x23\x05\xac\x9f\xbb\xbb\xe4\x70\x5b\x34\x0e\x42\xb7\x8e\x1c\x02\xbb\x10\x01\x86\x0c\xdc\xaf\x71\xed\x89\x25\x5d\xd5\x6c\xc0\xb3\x1c\x59\xd4\x59\x6d\xce\xf8\x4e\x22\x23\x4b\xe5\x62\xbd\x80\x1e\x94\x11\x1d\x83\xa7\x80\x64\xc9\x0f\x9d\x82\xfc\xe9\x1f\x68\xab\xb0\x3c\x73\xb6\xbd\x8d\x7e\x02\xd4"}, +{{0xaa,0x58,0x40,0x3e,0x76,0x3b,0xac,0x40,0x5d,0xb0,0x65,0xeb,0x11,0xeb,0x6b,0xe3,0xe3,0xb6,0xcf,0x00,0xec,0x4a,0x22,0x2b,0x52,0xbf,0xf4,0xb6,0xe3,0xd1,0x56,0xac,},{0x16,0x7f,0x9b,0x9a,0x46,0x65,0xf9,0x3f,0x5d,0x7d,0x30,0x16,0xac,0xe6,0xfb,0xd1,0x34,0x20,0xb2,0xe5,0x1e,0x72,0xbd,0xe5,0x9e,0xed,0xf2,0x69,0x93,0xb6,0x6c,0xae,},{0x64,0xb5,0x98,0xca,0x5b,0x8f,0x9a,0xe7,0x42,0xe4,0x6e,0xe0,0xd8,0xc1,0xaa,0xf3,0x14,0x58,0xb5,0x0c,0x25,0xd2,0x67,0xa6,0x77,0xe4,0x4b,0xe5,0xb7,0x55,0xf1,0x4d,0x51,0x80,0x1a,0x30,0x39,0x9b,0xfc,0xc3,0x8d,0x14,0x07,0x1a,0xa0,0xae,0x93,0xda,0x82,0x5a,0x58,0x1a,0xb6,0xc2,0x07,0x25,0xa0,0xa9,0x10,0xb4,0x73,0x5d,0xfa,0x0b,},"\x3b\xaa\x09\x98\xff\x02\xb3\x2b\x90\xb5\x1f\x9a\x84\x0c\x7b\x5c\x58\x70\xcf\xb1\x81\x0a\x9b\x0f\x77\xb5\x59\x09\xd4\x7a\xd3\x35\x14\x7a\x99\x1c\x29\xfb\xeb\xfc\x59\x2e\x93\x07\x17\x5c\x19\x64\x12\x9a\x2d\x5e\xfc\x62\x15\x80\x74\x53\xbc\xd7\x26\x96\x97\x81\x22\x2b\xca\xd1\xc9\x9a\x49\x74\x8b\x9e\xe6\x67\xc4\xd0\xc8\x28\x89\xe2\xf5\x00\x64\xc1\x15\xdb\xd8\xfb\x48\x3d\x72\xab\x0c\xca\xdf\x76\xbd\xdb\x2d\xc7\x27\xdb\xc3\xfa\x5c\x46\x24\xc2\x83\xd8\x92\x1c\x8a\xa4\x42\x51\x10\xdc\xdd\x69\xc0\x5e\x5e\xd5\x9b\x35\x96\x25\xee\xaa\xec\x1e\x27\xea\xfe\x9d\x9a\x5c\xe7\x36\xc3\xf9\xc5\x27\xea\x54\x78\x18\xb9\xbc\xa6\x81\x1b\xe4\xcc\x15\x05\x8a\x6f\x5b\x68\x33\x03\xb8\x0c\x90\xc9\x4a\x83\xb8\xb1\x58\x69\x71\x3a\x66\xb1\xe0\xf6\x56\x33\x1b\x28\x6d\x1e\xf7\x69\x88\x34\xab\x3e\x13\x84\x17\xaa\xd6\xbb\x3a\xb3\xbd\x9f\xc7\x87\x61\xa4\x82\xdf\xc6\x54\xf3\xf8\x62\x8c\x8d\x9f\xc1\x60\x18\x89\x8f\x16\x41\xe8\x62\x2b\xd2\x72\xe3\x8d\x41\x70\x6c\xb9\xce\xbe\x6e\xe5\xe1\x73\x57\x6b\xf6\x1b\xb1\x18\x8c\xf2\xf3\x9c\x62\x22\x0b\xba\x88\xfc\xb4\xde\x48\x98\xb2\x5b\x04"}, +{{0x10,0x44,0xee,0x37,0x08,0xc0,0xb0,0xe9,0x09,0xa8,0xcb,0x2b,0xa2,0xcd,0x0a,0xf8,0xd2,0x8a,0x5d,0xe0,0x1d,0x96,0x2e,0x82,0x60,0x87,0xfb,0x23,0x2d,0xf7,0xb2,0xd2,},{0x46,0xd2,0x41,0xea,0x0c,0x70,0x2c,0x18,0x89,0xd4,0x46,0x55,0x82,0x46,0x29,0xb6,0x72,0x84,0xd4,0xe6,0x44,0xa4,0x8f,0xa4,0x54,0x55,0xd2,0x7a,0xc5,0xf6,0x25,0x29,},{0x7d,0x6b,0xed,0x7f,0x87,0xd0,0x90,0xab,0xe0,0x13,0xc3,0x1e,0x12,0x03,0x90,0x3b,0xac,0x9c,0x93,0x44,0x5d,0x06,0xc7,0xb5,0x3d,0x31,0xd1,0x5f,0x97,0x0d,0x88,0x64,0x7a,0x7e,0xd2,0xc3,0xa6,0x30,0x50,0xba,0x19,0xd6,0x80,0x43,0xaa,0xdd,0x18,0xbd,0x86,0x1d,0xe1,0xac,0x47,0x15,0xb8,0xe8,0x28,0xb2,0xb1,0x6f,0x8a,0x92,0xb0,0x01,},"\xb8\xa4\x45\x45\x5f\xb6\x6e\x17\xe3\x14\x3d\x35\x20\x4c\x9e\xa9\x34\x74\xee\xbe\xef\x93\x96\x3e\xe5\xc1\xd3\x77\xca\x21\x7a\xcd\x4c\xa6\x3e\x57\x55\xda\x08\xfb\xff\xdb\xd4\x35\x2b\xf1\x65\x19\x38\x96\xc8\xd6\xf7\x6b\xb4\xcd\x3b\xc2\xd3\xa4\x76\xa4\xe3\x20\x82\x4a\x12\x10\xce\x74\xd0\x01\x4d\x74\x7f\x11\x1e\xec\x31\x0c\x5c\x89\xed\x4d\x08\x50\xe8\x11\xf8\x0a\x8b\xb2\x8d\xca\xf6\xf4\x11\xdf\x83\xe2\xc1\xdf\xd9\x0c\x4a\xd2\x35\x61\x45\x4e\xb5\xd7\x56\xb6\x3b\x4e\xa7\xf3\x7d\xc5\xd4\x66\xc1\x6e\xf7\x0d\x11\x19\x0c\x4f\x53\x16\xfe\x2a\xa8\x59\x74\x40\xe8\x8b\xbe\xba\xeb\x35\xea\x5f\x04\xf0\x7b\x03\x39\x26\x41\x58\xef\x90\x9a\xd5\x16\x3b\xfc\x24\x8c\xd7\x24\x13\x3e\x27\x4f\x81\x26\x95\xf2\x90\xe5\x71\x76\xa9\x6b\x93\x93\xd0\x7b\xb3\x10\x29\x9f\x5d\x2a\x6b\x6d\xd1\xda\xbc\xb5\x1b\xf2\x9c\x5a\xfa\x7e\xbb\x07\x01\xc6\xc8\x47\x67\xac\x13\x77\x93\x09\x1f\xe0\xed\x6e\x47\xd7\x80\x62\x8a\x32\xc8\x4f\x83\xe0\x0e\x9c\x16\x74\x2a\x52\x3e\xcb\x63\xc2\x4f\x4a\x33\x8e\xd2\x99\xa0\x61\x94\x92\x4f\x44\xc5\xa5\xd3\xc9\x37\xff\x9b\x09\x45\x98\x2a\xd2\x4a\x2d\x1c\x79"}, +{{0x95,0xdd,0x1a,0x5e,0x65,0x8f,0xa6,0xc8,0xd4,0x25,0x07,0xb3,0xe5,0xb8,0xed,0xb5,0xba,0xec,0xa6,0x2d,0xeb,0x00,0xfc,0x5d,0x4d,0xca,0x8e,0x1a,0xb5,0x83,0x5e,0x59,},{0x3a,0x53,0x23,0xdd,0x1e,0x07,0xf3,0x23,0xbb,0x6d,0x83,0xe9,0xc2,0xdb,0x92,0xa2,0x9f,0x62,0xe2,0xe0,0x03,0xee,0x0d,0xea,0xcd,0x7e,0x2e,0x4e,0x03,0x0d,0x8d,0x27,},{0xd0,0x2a,0x75,0x23,0xdc,0xbd,0x29,0x57,0x6b,0xa8,0x09,0xb5,0x31,0x03,0x77,0x74,0xdf,0x41,0x73,0x4a,0x41,0x17,0x58,0x13,0x11,0x9c,0x6a,0x6a,0x78,0x8c,0xd9,0xb8,0xad,0x78,0x08,0x65,0x67,0x86,0x67,0x69,0x9a,0xe6,0x6d,0x01,0x09,0x19,0xa9,0x66,0xa0,0x51,0xc0,0x81,0x63,0xdf,0x67,0xa9,0x77,0xee,0x6e,0x22,0x0d,0x0d,0xc3,0x0f,},"\x9b\x7a\xfd\x48\xc4\x74\x60\x4c\x26\x36\x75\x31\x55\x68\x40\xc3\x88\x66\x8b\x0f\x38\x40\x06\x3d\xfc\x98\x69\xad\x5b\x90\x12\x74\xb9\x31\x29\x3d\x04\xf3\xc8\xe8\xf7\xf8\xea\xb8\x15\xa6\x41\xd7\xc3\x51\x28\x4e\x8b\xb0\x43\x7a\xc5\x51\xbb\x29\x43\x89\x64\xe6\xa7\xc7\xba\x77\x23\x44\xb3\x33\xf9\xed\xa5\xa7\x75\x68\xc8\x93\x1d\xdc\xaf\x21\xe3\x2e\x07\xb1\x0b\xf4\x82\x0f\xb8\x59\xbc\xf8\x7b\x81\xc4\xbf\xf4\x26\xf2\x4a\x4d\x46\x8f\x2e\x9a\xed\xa8\xf1\x7d\x93\x97\x09\x97\x0d\xb1\x1d\xf7\x62\x47\xe9\x8a\x39\xeb\x8b\x38\xf5\x94\x9f\x34\x9f\x2a\xe0\x5a\xb4\x8c\x01\x85\x17\xc4\x8f\xa0\x20\x5d\xc7\xf1\x56\x64\x53\xe1\x05\xe4\x8c\x52\xeb\x45\x5c\x0c\x40\x80\x2f\x79\x7b\x3e\xef\xb1\xe2\xf3\xb1\xf8\x43\x15\xae\xd5\xb0\x71\x1c\x64\x99\xa6\x91\xb7\x4b\x91\xf1\x2e\xf7\x0f\x76\xc4\xc0\x5c\x1a\xa1\xa9\x93\xe2\xf3\xe5\x28\xab\x34\x3d\xd2\x36\x81\x62\xf4\x03\x6a\x61\xa1\x3a\x88\x04\x5d\xcd\xef\xa8\x5d\x68\x53\x22\x75\xbc\xf5\xb8\xf5\xf0\x0e\xfd\xea\x99\x9a\x95\x78\x31\x75\xd9\xee\x95\xa9\x25\xd4\x8a\x54\x49\x34\xd8\xc6\xb2\x62\x22\x5b\x6e\xbe\xa3\x54\x15\xdd\x44\xdf\x1f"}, +{{0x1a,0xbc,0x0b,0x9a,0xa0,0x1d,0xc5,0x7c,0xa5,0x3e,0xfe,0x73,0x80,0x96,0x2b,0x1a,0x88,0xd5,0x0a,0x96,0x4f,0x5c,0xd9,0x86,0x40,0x98,0x2c,0x74,0x39,0x3f,0x29,0x26,},{0x8d,0x4f,0xd1,0x43,0x94,0xd7,0xc1,0x40,0x57,0x00,0x30,0x69,0x83,0xfb,0xf7,0x6e,0xa9,0xf1,0x71,0xb1,0x5a,0x6b,0x56,0x61,0x2a,0x1f,0xeb,0x1c,0xbd,0xae,0x5d,0xd5,},{0xf7,0x38,0xaf,0x2d,0x3e,0x29,0x0b,0x3d,0x23,0xd9,0xaf,0xf7,0x41,0x4b,0xfc,0x5f,0xfa,0x47,0x23,0x5d,0xc0,0x53,0x68,0x7a,0x8b,0xa5,0xc8,0x54,0x1b,0x85,0x11,0xf7,0x81,0x56,0x6c,0xda,0xa1,0x30,0xe0,0x67,0x7d,0xb5,0x5f,0xa8,0xbe,0x9d,0x81,0xa0,0x92,0xcb,0x58,0x92,0x3a,0x86,0x28,0x49,0x4d,0x2f,0x62,0xd9,0x5c,0x16,0x71,0x00,},"\xda\x2d\xd9\x40\xd5\xe1\xdb\x6e\x80\xbf\x7e\x2b\x78\x2e\x7e\x74\x5c\xd4\xfd\x25\x2e\x98\x15\x17\x97\x58\x87\xdd\x05\xac\x77\xed\x83\x7d\x08\x29\x61\x57\x5e\xfe\xdf\x30\x1f\xdf\x24\xb7\x07\x18\xb9\x91\xb8\xd9\x2b\xdd\x2e\x6b\xee\x17\xc8\xaa\x4b\xc6\x94\xa7\x27\xbc\xfc\x78\xfd\x85\x19\x5c\x42\xca\xf8\x83\xa2\xc3\x8d\x16\x1c\xad\xd7\x9c\xfd\xa9\xa3\x91\x10\xe1\x26\x4d\x30\xbd\x4c\x5c\x4a\x58\x76\x77\x7f\x23\x3b\x07\x1b\x1b\x0b\x40\x89\x35\xf0\x46\x89\x54\xcc\x74\x4a\xf8\x06\x3b\x00\x4e\xde\x56\xcd\x98\x1c\x4d\xd5\x60\x8a\xbf\xfe\xae\xc9\xe5\x8f\x3f\xaf\xaa\x67\x14\x67\x80\x4b\x7f\xa2\x55\x8f\x4f\x95\x17\x42\x01\xf1\x83\xd8\x0a\x59\x14\x06\x5f\xed\x53\x11\x5b\x41\xeb\xc3\x38\xf7\x8d\xf0\x50\x05\x3b\x8a\x4e\x75\xea\x7c\x6f\xdc\x35\x4d\xad\x27\xbf\xd8\xa2\xe6\x6f\xcd\x7a\xe2\xf5\x87\xd2\x4b\xe0\xd4\xa3\x3d\xa3\x0a\x22\x0e\x51\xbc\x05\xfa\x4e\x41\x2b\x95\x9f\xd9\x5d\x89\xea\x6e\xc0\x16\x25\x16\xc0\x96\xa9\x43\x3a\x9e\x7c\xf5\x99\xc9\x28\xbd\x53\x05\xc2\x17\x3b\xf7\x49\x3e\xd0\xc1\xc6\x03\xcd\x03\xf0\x82\xcc\xe4\x42\x37\xa7\x9f\xfd\x8b\xe9\xa6\x72\xc2\xeb\xaa"}, +{{0xcb,0xff,0xce,0x2c,0x9b,0xd3,0xe2,0x3e,0x40,0x6e,0x5f,0x66,0xe6,0x32,0xdc,0xfa,0x72,0x66,0x54,0xd2,0x9a,0x95,0x5c,0xec,0x98,0x31,0x73,0x23,0x5f,0xa3,0x59,0xd0,},{0x49,0x65,0x3e,0xdd,0x64,0xa5,0x5f,0x7c,0xd4,0x0e,0xaf,0x3f,0x8e,0x72,0xeb,0x96,0xdb,0xcd,0xee,0x39,0x8f,0x34,0x81,0x7f,0x2c,0x95,0x86,0x79,0x49,0x71,0x0b,0x14,},{0xe7,0xce,0xd4,0xfa,0x2a,0x7d,0xff,0x73,0xf1,0x06,0x8b,0xba,0xd0,0xec,0x9a,0x11,0x09,0x04,0x3c,0x97,0xa6,0x2e,0xff,0xa1,0x48,0x87,0x6f,0x09,0x69,0xed,0x4d,0xc6,0x08,0xe2,0x8b,0xce,0x79,0x7a,0xf3,0xb8,0x25,0x32,0xc9,0x4d,0xec,0x4d,0x68,0x11,0xb7,0xf5,0x63,0x67,0x91,0x29,0xfa,0xcf,0x17,0xbb,0x73,0xd6,0x93,0x75,0xeb,0x05,},"\x1f\xfd\xe6\x82\x6e\x4f\x0c\x24\xa7\x96\x1f\x19\x1e\x74\xcc\x0b\xbc\x92\x8e\x3f\x1a\xec\x3e\xfa\xb3\x27\x65\xc2\x50\x1c\xbc\x16\x20\xe7\xee\x6f\x61\xfc\xcf\xb0\x0c\xfc\xa9\xfb\x98\x14\x3b\x52\x9b\xcc\x8c\x3d\x0f\xdf\x89\xee\x7c\x34\x2f\x10\x18\x15\xfa\xbf\x7d\xea\xf9\xf3\x02\xa2\x88\xfe\x17\x58\x26\xd5\x90\xd9\x9e\xe6\xfd\x92\xda\x74\xf9\x59\x6b\x78\x3c\x0e\x7d\x47\xd7\x11\xa3\x2f\x39\xea\x41\x65\xe5\x21\x24\x31\x44\x1b\x49\x8c\x6b\x70\xdb\x3b\x09\xd1\xf4\xe4\xa1\x4a\x6b\xae\x39\xda\x50\x88\xbb\x85\xb3\x28\x5c\xe9\xdf\x2f\x90\x68\x1a\xf2\xc7\x4d\xec\xe4\x39\xae\xb9\x1e\x1c\x1b\x07\x12\xed\xdb\xee\x8d\x72\x56\x98\x28\xf3\x7c\xb7\x20\xc5\x09\xd0\x2a\xec\x47\x60\x70\x48\x4e\x9b\x16\xec\x71\x79\x94\x7a\xc9\x6c\xaf\x0e\x1b\xe8\xb6\xb7\x4f\x37\x2d\x72\x35\xfe\x6e\x39\x99\xdf\x73\x3b\xcc\xd4\x82\xdf\xe2\xe6\x31\xf5\x6b\x58\x26\x67\xdc\xe5\xe3\x12\x17\x63\xad\xfa\xcf\x3b\x18\xcf\x20\x95\xf7\x39\x4d\xee\x49\x27\xfc\x2b\xea\x6b\x58\x24\xd9\x0c\xd5\x9e\x85\x4e\xc5\x87\x2b\x45\x51\xb0\x2e\xfa\xba\x5a\xd5\x4a\x9b\x7a\x8f\x6d\xe5\xd7\xcd\xa5\x82\x5b\x32\x5b\x07\x6d\xed"}, +{{0x9f,0x91,0x23,0x14,0x97,0x48,0x4c,0xab,0x39,0xb9,0xe2,0x0f,0x86,0x11,0x81,0xd3,0x97,0x90,0x85,0x77,0xbb,0xb2,0x96,0x82,0x42,0xd0,0x71,0xbc,0xa4,0x81,0x3f,0xfb,},{0x88,0x24,0xbc,0x6c,0xd6,0xa6,0xf1,0x5a,0x5f,0x41,0x66,0x8f,0x2b,0x3b,0xae,0x8f,0xc4,0x96,0x73,0x83,0x07,0x8d,0x08,0xb5,0x1d,0x6d,0x1b,0x2b,0x93,0xa1,0x07,0x1f,},{0x0a,0x1c,0x70,0x6d,0xd8,0xa1,0x30,0x77,0xab,0x18,0x38,0x6c,0x65,0xfa,0x97,0xcf,0x9d,0xfc,0x43,0x54,0x2d,0x18,0x46,0xec,0xbd,0xde,0xb7,0xb3,0xc9,0x3f,0x3c,0x66,0xf3,0xcc,0xd0,0x44,0x7a,0xac,0xdd,0x4d,0xad,0x8f,0xbf,0x73,0x6c,0x4f,0xf9,0xdb,0xdb,0x62,0xbf,0xc1,0x4d,0x88,0x83,0xe3,0x85,0xbc,0xe9,0xba,0xc5,0x6a,0x35,0x0c,},"\x21\xd4\xfb\xc9\x81\x63\xc3\xfb\x6e\x09\xf7\x75\xc2\xab\x7b\x18\xb1\x87\x92\x34\x0b\xaf\xed\xac\xb4\x96\x05\x62\x2e\x3c\x08\xaa\x3b\x2b\x8d\x0e\x09\x02\xf3\x61\xaa\x1c\x0f\x65\x2e\x27\x32\xb1\x0a\x0c\x5c\x6a\x05\x09\x89\x96\xb5\x88\x26\x7c\xc8\x95\x1a\x78\xb5\xd4\x31\xe7\x22\x2b\xbb\x50\x8e\xee\xf1\xb5\xe8\xb8\xd0\x1d\x39\x91\xe1\x8d\xdd\xc6\xca\x8d\x22\x2e\xf1\x77\xce\x62\x93\x8d\x18\x10\xee\xcf\x06\xf4\x73\x8b\x28\xf4\x40\x94\x6c\xca\xd2\xa1\x2e\x39\xd3\x86\x11\xbe\xd3\xa3\x9f\x93\x41\x9a\x17\x9e\xc2\xb1\xb5\x2d\x5f\xe5\xc8\x0c\x23\xb8\x4d\x88\x03\x75\x5f\x51\x46\x09\x2c\xc1\x99\xb4\xbd\xce\xa5\xbc\xf2\x03\x7b\xd5\x3f\xf6\x34\x66\x94\x15\x5f\x02\x7d\x8c\xe2\xba\xff\xe3\x0a\x56\x66\x59\x6c\x00\x78\x3a\xae\xad\xe9\xc7\x7f\xc8\x63\x79\x42\xec\xe0\x17\xd6\x48\x4c\x28\x99\xb1\x91\x8d\x3a\x48\x0b\xd5\x15\x76\x78\xd4\x77\x2d\x27\x1f\x9b\x99\x76\x8e\xe1\xbc\xc4\x6b\x24\x89\xae\x87\xcd\x03\x0f\x47\xd1\x33\x3c\x76\x72\xcb\x90\x2c\xb4\xf5\xfe\x74\x6e\x85\x3d\xe5\x79\x40\xba\x22\x64\xd3\xe6\x29\x64\x4d\x65\x3a\x5b\x7a\xf7\x8c\xe6\x4a\x99\x3f\x36\x25\x0f\x8c\xb7\xcb\x45"}, +{{0x1e,0x2b,0xd5,0x48,0x7c,0x5f,0x5c,0xed,0x46,0x1f,0x60,0x4d,0xcc,0xb4,0xe7,0x8e,0xb9,0x16,0x08,0xf0,0xb8,0x21,0xf5,0xaf,0xc4,0xe3,0xe5,0x34,0xf7,0x96,0x03,0x92,},{0xef,0x82,0x54,0x75,0xcf,0x20,0x51,0xa2,0x01,0x7a,0xe5,0x32,0xf0,0x77,0xd9,0x67,0x74,0x34,0x7d,0x27,0x67,0xea,0x7b,0x45,0xf9,0xc1,0xb8,0x60,0xab,0x99,0x35,0x06,},{0x4d,0x33,0xc9,0x6a,0x2e,0x3a,0x5d,0xb7,0x39,0x1a,0xdf,0x65,0xc1,0xcc,0x35,0x65,0xfe,0x76,0xee,0xaf,0xd0,0xb5,0xc7,0xab,0xb0,0xb4,0x92,0xa0,0xb5,0x1e,0x1f,0xa3,0x36,0x39,0x94,0x6a,0x24,0x3b,0x2d,0xde,0xf3,0x57,0x55,0x22,0x98,0xce,0x0a,0xa9,0x5e,0xac,0x6f,0xbf,0xe6,0x60,0x98,0x82,0x71,0x87,0x7e,0xb2,0xa7,0xda,0x18,0x06,},"\x1d\xbb\xbb\x13\xcd\xad\x88\x85\x4b\x80\x9c\xed\xed\x27\x33\x43\xd3\x06\xa8\xde\xab\xf3\xff\x02\xc9\xce\xc6\xf0\x02\xb8\xe9\xe1\x0e\xf5\xd1\xb0\xf5\x71\x1f\x33\x26\x7a\xa9\x1c\x17\x1b\x61\xe9\x60\xf7\x40\x45\x7b\x81\xd7\x51\xa4\x73\xf4\x4f\x75\x0a\x08\x0c\xab\x80\xaf\x7c\xcc\xa7\xdf\xfc\xfa\xc9\xee\x4c\x39\xdc\x85\xcb\xdf\x51\x25\x9c\xcd\x34\x70\xd9\xba\xd3\xad\x30\xf4\xee\x5d\xbd\x4f\xac\x6b\xd5\xc6\xc4\xdf\x73\x11\xa4\x70\x04\x46\x95\xa7\xe1\xa7\xe1\x85\x72\x20\x75\x88\xaf\xa5\x7e\xeb\xcd\x4d\x57\x5b\x6d\x42\x44\x57\xee\x92\x46\x5c\xe1\x86\x3e\x3c\x67\x7c\xf8\x75\xfd\xb9\x8d\x40\x78\xeb\xe7\x14\x42\x60\x80\x70\x52\x57\x71\x44\xcb\x8e\x03\x59\xaa\x42\xad\x15\x5d\x79\xda\xe3\xde\xb9\x9c\x46\x32\xc1\x91\xc7\x99\xcb\xfe\x58\x7d\x95\x47\x87\x06\x8d\x66\x3b\xdf\xc0\xfa\xb1\x33\x4f\x18\x76\xbf\x49\x8c\x4d\xb5\xc5\x3d\xb7\xb0\x20\x4e\xd5\xa5\x21\xc6\x2f\x09\xea\xca\x8d\x01\x89\xf3\xb3\x94\x14\x3f\x29\xc4\x21\xcb\x5c\x8d\x07\xbd\x75\x1b\xaf\x4c\xbe\x3b\xf4\xbe\x17\x01\xdf\x4b\x22\x07\xdf\xb2\x90\x4d\x84\xf4\xdb\xda\x51\xcb\xa5\x76\xd5\xa5\xbb\x16\xef\xe6\x98\xed\xd6\x08"}, +{{0xf7,0x8d,0xb1,0x4d,0x6d,0x1a,0x64,0x3d,0xd7,0x73,0x5b,0xaf,0x26,0x35,0x32,0x12,0x44,0xe7,0xec,0x8c,0xa7,0x2c,0x5c,0x38,0xc9,0x8c,0x80,0x9d,0xb9,0xcb,0x5a,0x55,},{0x54,0x14,0xf7,0x5f,0x52,0xf3,0x86,0x4a,0xfb,0x0c,0x79,0xc2,0xc5,0xc1,0xd0,0x6b,0x4b,0xce,0x40,0x0f,0xbd,0xdf,0x17,0xfe,0x9c,0xfb,0x2a,0x8b,0xac,0x47,0xa0,0xdd,},{0xd7,0xcb,0xd4,0x18,0x1f,0x67,0x71,0x20,0x07,0xb7,0xf0,0xe1,0x84,0x52,0xe0,0xa0,0x24,0x46,0x4d,0x9d,0xc9,0xb5,0xff,0x9c,0xf6,0x69,0xd1,0xb9,0x11,0x69,0xd7,0x57,0x32,0x62,0xf8,0x33,0x36,0xb9,0x7c,0x86,0x1b,0xfa,0xb3,0xfc,0xf6,0x69,0x22,0x3c,0xe8,0xca,0xf3,0x19,0xf2,0x1d,0x23,0xf1,0xfa,0x33,0x1a,0x2d,0x89,0xb6,0xca,0x0b,},"\x05\xca\xf1\xb8\xed\xc3\xb1\x73\xfb\xc1\xed\x29\xb9\x5e\x2b\xf0\x6d\x81\x4b\xa2\x40\x7d\x4b\x31\xc7\x28\xd0\x4e\xc2\x73\xd2\x53\x94\x42\x3a\xc7\xd4\xff\xf2\xca\x36\xee\x90\x27\x30\x93\xc7\x56\xe2\xbd\x13\xc9\x6d\x4a\x3d\xc7\xf5\xbe\x17\x59\xfc\xd3\x28\xeb\x66\xc5\x88\x2b\x58\xfa\x45\x88\xe5\xb2\xa3\x71\x3a\x41\x54\xa2\x34\x0d\x0b\x06\xad\x01\x96\x01\xb0\xe0\x28\xe4\x97\xf8\x98\x25\x6b\x02\x8a\xf9\x5c\xd8\x16\x8d\xf5\xe5\x8a\x57\xcd\x1e\xbf\xc0\xa0\xc9\x1c\xed\x61\xdb\xb4\x80\xac\xa7\xdf\x8d\xca\x91\xeb\x16\xe9\x80\x07\xcd\x2c\xd1\xa2\x04\x5b\x0e\x44\x77\xd1\x2d\x5a\x40\x72\xf3\x65\x42\x65\x67\xc9\xd6\x15\x77\xf3\x48\x5c\x8f\x46\x60\x5e\x7f\x47\x5e\xf0\x4a\x39\x48\xf6\x0d\xba\x8c\x55\x08\xd1\x4b\xfd\xdb\x9b\x11\xdd\x04\x4e\xf2\xd8\x4c\x16\xb9\xa9\x03\x8d\x8e\x78\xed\xa4\x3b\x91\x29\x7d\xf3\x5f\x43\x61\xa3\x83\xb4\x1d\x49\x67\x7a\x68\x7d\x5b\x34\x4a\xd1\xab\x0f\xc7\x30\x17\xb3\xbe\xbf\x32\x30\x6f\xb3\xfd\x7b\x3d\x50\x71\xf3\xab\x5f\x6e\x49\xaa\x15\x54\x0c\xad\x65\x03\xbe\xa7\x78\x4c\xf9\x42\x18\x01\xce\x13\x85\x83\x98\x93\x36\x2a\x97\xfa\xe1\x21\x30\x0d\x67\x83\xaf\x0f"}, +{{0x7d,0xfa,0x32,0x8e,0x90,0xa1,0xb8,0x49,0xc2,0x19,0xe3,0xda,0x83,0x2d,0xf9,0xed,0x77,0x44,0x82,0x34,0xf0,0xd8,0x9e,0xa5,0xd1,0x7a,0x3d,0x64,0xe7,0x88,0x3d,0xaf,},{0xe3,0x0c,0xe6,0xfd,0x5f,0x58,0x00,0x38,0x9a,0x70,0xcd,0x11,0x73,0x64,0xf5,0x99,0x45,0xaf,0xb1,0x80,0xf2,0x29,0x92,0x73,0x60,0xb0,0x6b,0x48,0x35,0xf8,0xdc,0x91,},{0x1c,0x61,0xd5,0x3b,0x87,0x2f,0x8c,0xde,0x59,0x86,0x09,0x68,0x2c,0x79,0xf6,0xc5,0xdf,0x00,0x7c,0x51,0x3a,0x71,0xcf,0xb3,0xa0,0x6d,0xcb,0x82,0xd8,0x5c,0x4b,0x00,0xcc,0xc4,0x0b,0x00,0xe5,0x9f,0x59,0x53,0x93,0x08,0x8b,0x4c,0xd0,0x43,0x28,0x55,0xc6,0x7a,0x20,0x7d,0xa7,0x1f,0x87,0xe7,0x2c,0x40,0x9b,0x3e,0x50,0x27,0x95,0x07,},"\xe5\xe4\x95\xd6\x63\xf4\x72\x36\x71\x45\x32\x68\x7a\x24\x30\x8f\x94\x2c\xa9\xc3\x3e\x08\x8f\x7f\x10\x6a\x5a\x72\x35\x18\xca\xcb\xbe\xf4\xa6\x8c\x93\x9a\x69\x50\xb2\xdc\x25\x89\xf8\x2d\x35\x4e\x57\x52\x72\xd4\x2b\x13\x83\xd3\x15\xab\x8a\x20\xaa\x0c\xdc\x9d\x4d\xf6\x78\xab\x3b\x26\x61\x2b\x5d\xca\x66\xe7\x1f\x9f\x3f\xa7\xd9\xe7\x31\xdc\x48\x1e\x2b\xc7\x12\x7c\xea\x3b\x62\x03\xca\x6c\xd8\x16\x2e\x90\x88\x6a\x73\xdc\x46\xc8\x3d\xde\xfc\x4b\x9e\x2d\x53\xd2\x9d\xd3\x87\xc6\x24\xe0\x8b\xd8\xd5\x3b\xe9\x28\xa4\x0a\x9a\xa8\xae\x8b\x1c\x8d\x0f\xb6\xa7\xbd\x6d\xce\x5f\x62\x31\x5b\x7a\x21\x81\xf6\x27\xf2\x56\xbb\xe7\xe2\xa9\x5b\xf4\x64\xe6\x13\x22\x04\xc1\x74\x20\x96\x29\x84\x02\x35\xb2\xc3\x99\x13\x30\x1a\x4b\x40\x32\x5d\x11\x8d\x38\x4b\xc7\xac\x02\x8c\xd4\xf1\x27\x02\xe1\x61\x19\x1b\x14\x9e\x42\x09\x05\x8a\x55\x12\x2b\xbb\x8b\x22\xb2\x46\x83\xba\x4f\x8e\x2e\x6c\xcf\xc0\x8d\xc8\xc8\xb1\xbc\xfb\x6d\x60\xbd\x8f\x06\x21\x96\x93\x3d\xf3\x19\xab\x16\x90\x6d\x08\x57\x30\xeb\xa1\x72\x0d\x4b\x02\xc6\x7d\xaf\x38\xcc\xe6\xab\xa3\x8e\x25\xd6\x8e\xf9\x5b\x2f\x52\x19\x13\xa1\xd7\x7d\x5e\xb6\x50"}, +{{0x6c,0xe1,0x3d,0x3c,0x2e,0xc7,0x1f,0xed,0x83,0x13,0x1a,0x69,0xd5,0xd0,0x30,0x31,0x4a,0xb4,0x9e,0x65,0x65,0xef,0x68,0x16,0x3f,0xff,0x09,0xac,0x5d,0x9b,0x47,0xe7,},{0x9c,0x7b,0x11,0x18,0xfa,0xb9,0x1e,0x0e,0x7b,0x19,0x2a,0x23,0xd9,0x5f,0xb8,0x77,0xcb,0x79,0x36,0xcc,0x6c,0x8a,0x33,0x05,0x92,0xf4,0x8e,0x67,0x84,0xed,0xc2,0x92,},{0x60,0x8b,0x2b,0xf6,0xf6,0xda,0x05,0xc2,0xac,0x5b,0xbf,0xd7,0x95,0xa2,0xac,0x32,0xc7,0x9c,0x74,0x15,0x3f,0x94,0x31,0xde,0xa5,0x97,0x68,0xff,0x4c,0x22,0x5e,0x3b,0x69,0x3b,0x64,0x5a,0x50,0x67,0x66,0xb8,0x60,0x85,0x0e,0xe9,0x7e,0xa4,0x30,0x32,0xb0,0x5b,0x69,0xe5,0x67,0x67,0xe8,0xeb,0x9d,0x19,0x18,0xdf,0x9a,0xfb,0xa8,0x05,},"\x10\xbb\xc3\x11\xeb\x2a\x76\x5e\x01\x67\xff\x37\x61\x8f\xf7\x0e\x13\xf0\x2d\x7b\x06\x17\xae\x4a\xc0\x6b\xef\xbb\xe1\x49\xc9\x72\xa9\x94\xf6\x80\xca\x4d\xc9\xa9\x2e\xc7\xef\xa5\x39\x97\xfa\xd3\x56\xb9\xff\x4e\xbd\xee\x62\x95\x41\xd1\xf4\xde\xa6\x2e\xd0\xd2\x49\x4f\x9c\xcf\xdf\x07\xa9\x31\x04\x91\xf6\x1c\x4b\x3e\x27\x00\xb4\xa3\xc6\x68\xd6\x78\x32\x9a\x38\xc2\xef\xf9\xd8\xcb\xa4\x31\xfb\x95\x9e\x7f\x76\x55\xbd\x0f\xbd\x77\xd5\x3b\xbb\xc2\xeb\x8d\xc5\x1d\xd7\x18\xed\x98\x72\x8a\x18\x16\x86\xbe\x12\x2b\x84\x4d\x3d\xa3\x31\xe3\x29\xd3\x95\x9b\x59\x23\xf7\x73\x43\x25\xa0\x21\x02\x6e\x27\x54\xe1\x7a\x15\x10\x8b\xe8\x01\x46\x5a\xd9\x58\xdb\xcf\x21\xdf\x89\x0c\xfe\x5d\x5b\x88\x3c\xa4\x3c\x61\xce\xdc\xcb\xdb\x58\xb8\x49\xea\x75\x37\x4f\x1e\x91\x8e\x80\x3e\x57\x7a\x5d\xc7\xa1\xc1\x79\x36\xec\xcf\xcd\x34\x81\xbd\x2b\x1e\xb0\x75\xb8\x32\x37\xca\x6f\x3c\x07\xc1\x9e\x9a\xf9\x73\x12\x67\xbe\x82\xd4\x89\x8e\xee\x96\xeb\xc9\x00\xd4\x8b\x05\x9d\x51\xb0\xdd\x41\x5b\x1c\x89\x06\x60\xa8\x8d\x25\xf5\xc5\xf3\x5d\x8e\x45\xe5\x23\xe0\xce\x33\x36\x92\x3a\xb4\x36\x70\xe3\x5c\x50\x57\xd5\x6c\x75\x88\x76"}, +{{0xd4,0x5e,0xe6,0x9a,0x5f,0x1a,0x7c,0xfd,0xd0,0x34,0x3f,0x87,0x70,0xd1,0xc6,0xbc,0x02,0x6f,0x06,0x7a,0x70,0xdb,0xe8,0x39,0xa8,0x6f,0x2a,0xa0,0x68,0xc3,0x3f,0x81,},{0xfc,0x8d,0x9f,0xb0,0xe4,0xf3,0x47,0x93,0x09,0x07,0x55,0xe0,0x32,0x80,0x96,0xe0,0x1e,0x28,0x1e,0xa3,0x51,0xb8,0xd9,0x5c,0xd9,0x11,0x6e,0x13,0x1a,0x5c,0xa5,0x4e,},{0x15,0x6c,0x51,0xc5,0xf9,0x15,0xd8,0x9b,0x8d,0x14,0x00,0x35,0x0f,0x8f,0x21,0x7a,0x5c,0x02,0xe2,0x62,0x9e,0xde,0x9f,0x4a,0x30,0xb6,0xe7,0x1d,0x1e,0xa7,0xa9,0x53,0xcc,0x6d,0xb3,0x1b,0xa5,0xc7,0x78,0xc2,0x69,0x92,0x0b,0x64,0x9f,0xb4,0x22,0x1c,0x6d,0x38,0xcf,0x2c,0xea,0x2a,0x7d,0xe3,0xad,0x42,0x3e,0x04,0xfa,0xaa,0x06,0x07,},"\xeb\x5e\xd8\xab\x79\xcb\xfe\x61\xc2\x59\x81\xb9\xd1\xd6\xb7\x0f\x10\xb6\x01\x94\xb4\x16\x1f\xe1\x7d\x11\xaf\xf1\x76\x79\x94\xaa\x08\x13\xe9\xec\xe2\xf4\xc5\xd5\x31\xb9\x9e\x8a\xdf\x18\x88\xc3\x0a\x63\x89\x3e\xb4\x51\xaa\xf5\x5a\xcd\x5a\x52\xad\x8c\x40\x1f\xaa\x88\xd6\xea\xcf\x3e\x49\x47\x05\x66\x11\x4f\xd0\xc6\xa2\x74\xe9\x54\x48\x46\xb0\xae\x9b\xfa\x12\x4d\x79\x51\xeb\x26\x71\x5e\x19\x25\x3f\xf7\xed\xc8\xa7\x09\x65\x77\x6f\x23\xce\x46\x03\x1e\x03\x4a\x20\x07\x23\xba\x3d\x11\xe1\x1d\x35\x3d\x7e\x7c\xd8\x4a\xed\xe2\x67\xff\x64\xbe\xd4\x18\xcb\x9f\x28\xc6\x1c\xd0\xf6\x3b\x6c\xe2\xec\xae\x14\xb2\x0b\xc6\xbd\xae\xd8\xc4\x28\xba\xd1\x8b\xe4\xb7\xd6\x63\x38\x36\x4a\xcd\x80\x42\xa8\x25\x6f\x25\x8a\x69\x96\x9b\x8d\x3c\xa2\xea\xb3\xae\xa3\x70\x6e\x5f\x21\xc3\xb1\xef\xcc\x25\x4a\x82\x4b\xb4\xe7\xea\x7a\xba\x88\x27\xc8\xeb\x82\x78\x6c\x66\x5a\xa9\x73\x82\x19\x31\xff\x99\x0a\x63\xfd\x34\xa7\x4a\x6d\x8c\x22\xa8\x82\xb0\xb9\x35\x15\x2c\xcb\x36\xfc\xc7\x6f\x4e\xca\x65\xd6\x7c\x86\x80\x94\x2f\x75\xdf\xad\x07\x34\x39\xc0\x91\x60\x65\xe8\x38\x77\xf7\xba\x20\x93\x03\xf3\x35\x48\xd9\xe4\x0d\x4a\x6b"}, +{{0x8a,0x76,0xea,0xab,0x3a,0x21,0xec,0x5a,0x97,0x5c,0x8b,0x9e,0x19,0x7a,0x98,0x9e,0x8e,0x03,0x08,0x99,0xeb,0x45,0xd7,0x89,0x68,0xd0,0xfb,0x69,0x7b,0x92,0xe4,0x6d,},{0x2d,0x9c,0x81,0x3d,0x2d,0x81,0xe2,0x73,0x0b,0x0d,0x17,0xd8,0x51,0x2b,0xb8,0xb5,0xd3,0x3f,0x43,0x6c,0xab,0xaa,0x13,0xe1,0x41,0xca,0x1c,0xb7,0x85,0x01,0x43,0x44,},{0xfc,0xee,0xcc,0xa4,0xb0,0x14,0xfe,0xcd,0x90,0xb9,0x21,0xb0,0xfa,0x3b,0x15,0xae,0xaa,0x4e,0x62,0xca,0xa1,0xfb,0x22,0x72,0x9c,0x70,0x26,0x92,0x32,0xc3,0x3c,0xef,0x0d,0x0a,0xee,0xa6,0x64,0x32,0xc1,0x28,0xaf,0xb9,0xa3,0x64,0x6b,0xc7,0xf0,0x3a,0x12,0x77,0x4d,0xa8,0x75,0x83,0x98,0xc2,0xa0,0xdc,0xce,0x0b,0xbb,0xf6,0x74,0x0a,},"\xc6\xc7\x8f\x2e\x20\x80\x46\x1a\xed\x9f\x12\xb4\xf7\x7c\x98\x9b\x19\x71\x67\x80\xfa\xb6\x0e\x6e\xcb\x97\x93\xb4\xbc\x7e\xd6\x9e\x5f\x70\xfa\x6b\xdb\xa1\x6e\x9b\xd3\x19\x49\x69\xee\xa6\x66\x5a\xbf\xd6\x30\xde\xee\xfa\x3d\x71\x7b\x6d\x25\x4d\xd2\x4b\xc9\x7d\xde\x21\xf0\xf2\x9f\x9e\xd3\x4b\x8b\xd7\xa0\x13\x38\x0f\x4f\x82\xc9\x84\xfd\xbd\x95\xaf\x98\x05\xb7\x44\xbc\xd9\x52\xc5\xa7\x1f\xbb\x57\xd1\x1f\x41\x1c\x18\xcc\x30\xbc\x35\x94\xf7\xad\x82\x28\xcb\x60\x99\x39\x4a\x1b\x6b\x0a\x81\x85\x81\xbd\xf9\x3c\xce\x58\xf3\xa4\xa2\x3e\x55\xdb\x3e\x69\xca\x9d\x60\xcf\xb3\xa9\x07\xfb\x68\x32\x9e\x2f\xfb\x6c\x65\xf1\xe8\x28\xd2\x81\x27\x10\x9c\x9e\x9f\xb7\x01\x60\xf2\xef\x82\xa2\xee\x9f\x9b\xd1\x70\xc5\x1e\x13\xfd\x3f\xc1\x86\x6b\x22\xc7\x9f\xe6\xd5\x10\x12\x17\x97\x9d\xbe\x27\x24\xdc\xad\x8a\x9b\xc6\x9a\xcc\x42\xc1\x12\xdc\x69\x7b\xd2\x71\xee\xa5\x50\xe9\xe5\x04\x06\xbf\xd2\x82\x45\xb8\x3b\x8f\x01\x2d\x34\xdb\x6d\xbd\xd5\x5a\xe6\xe5\x75\x74\x5c\x15\x3d\x6e\x75\x34\x90\x10\x27\xea\xdc\x2f\xcc\x33\xa5\x28\x7d\xdb\xca\x6d\x3a\xea\xb8\x97\x22\x94\xdc\x6c\x71\x2b\x99\x42\x54\x72\x77\x34\x0e\x7a\xd1\x9e"}, +{{0x18,0xa8,0xf9,0x36,0x48,0xcd,0xcf,0x47,0x13,0x36,0x30,0xaf,0x1e,0x11,0xc0,0xce,0xea,0x3d,0xe0,0x73,0x27,0x31,0x4c,0x96,0x58,0x0d,0xf7,0x75,0x59,0x7d,0x7a,0x9c,},{0x29,0x12,0xf4,0x1a,0xb4,0xc8,0x7e,0x39,0x37,0xa0,0x33,0x31,0x80,0x2c,0xba,0x87,0x71,0x6b,0x4e,0xea,0x14,0xb9,0xfb,0xa6,0xf5,0x46,0xd0,0xac,0x2c,0x09,0x73,0xdf,},{0x3b,0x77,0x39,0x4c,0xd6,0x9f,0x8b,0x45,0xd0,0x0c,0xfe,0x3a,0x79,0xa7,0x90,0x06,0x28,0xa5,0x65,0x18,0xb3,0x79,0xed,0x8a,0x11,0x58,0x1f,0xc3,0xa3,0x76,0xe5,0xd6,0x68,0x07,0xdf,0x11,0xe7,0x09,0x04,0xf6,0x96,0xc7,0x41,0xd2,0x1d,0x13,0x93,0x10,0xfa,0x1b,0x89,0xa9,0x3b,0xdc,0x4d,0x2c,0x39,0x97,0x99,0x1f,0x52,0x20,0xee,0x00,},"\x59\x20\x93\xac\x7c\xd6\x71\xd6\x07\x0b\x00\x27\xed\xac\x1f\xb0\x15\xcc\x20\x5d\x78\xbb\x60\x3f\x37\x8e\xb9\xf8\xaa\x38\x8c\xa8\x30\xdb\x3c\xb2\x34\x20\xc7\xe8\x52\xdb\x0b\x55\x24\x1e\xb8\x8a\x02\xcc\x62\x7a\xa9\x41\x43\xbe\x43\x9a\xab\x4b\xf2\x63\x47\x57\x47\x04\x06\xe8\x42\xf2\x0e\xb1\x0f\x07\x00\xe3\xc2\xda\x36\x4f\x58\x8a\x80\x00\xf2\x38\x50\xc1\x2c\xe9\x76\xf3\x26\xd2\xdf\x1b\xac\x13\xe9\x50\x20\xb4\x12\xb1\x75\xbf\x74\xbd\x7e\xbb\xac\xf3\xae\x55\xc0\xda\xeb\xb5\xc0\x10\xbf\x80\x4f\xee\xe1\xd7\xd4\x9f\xae\x05\x0b\xea\x55\x99\x6f\x53\xcf\xe1\xf1\x5a\x0c\xf2\x07\x27\xdb\x4e\xe3\x11\xc2\x60\xba\xd9\x68\x2d\x7b\x96\x5e\x27\xa9\x49\x1f\x47\x1d\x4a\x47\x3a\xff\x64\x6c\x7d\x42\x4d\x5a\x0b\xdc\xbb\x8a\x02\x33\xf4\xb3\x06\x0d\xd0\x4c\x98\xec\x98\xdf\xd0\x5e\xc7\x24\x78\x84\xe2\xd8\xe1\x52\xd4\xae\x52\xb3\xd5\x86\x5d\x9e\xfd\x67\x06\xa6\x0e\x08\x8e\x1e\x7c\x9f\x62\x45\x10\xab\xc7\xa2\x04\x5a\x2c\x7a\x75\x88\xe2\x53\x5e\x73\x19\x1d\xd5\xcf\x05\x42\x15\x63\xf5\x56\xa1\x3e\x82\x36\x67\x03\x43\xcd\x5b\xa4\xd4\x66\xe2\x45\xc4\xee\x3b\x5a\x41\xe7\x0c\x9a\x0f\x5e\x6e\xa2\xc5\x59\xeb\xe6\x1b\xa8\x1e"}, +{{0x20,0x6c,0xd2,0xb8,0x11,0x4a,0xae,0x18,0x8d,0x81,0x86,0x2c,0xce,0xc4,0xcb,0x92,0xc4,0xef,0x5f,0xc7,0x8c,0x24,0x43,0x5a,0x19,0xf9,0xed,0x9b,0x8a,0x22,0xf4,0x7e,},{0x97,0xa6,0x7a,0xc2,0x81,0x1f,0x52,0x94,0x56,0xdf,0x53,0x27,0x37,0xd7,0x6b,0xed,0x7e,0x38,0x7d,0xa8,0x3b,0xd5,0x54,0x59,0x37,0x2f,0xdf,0xb2,0x7f,0xfa,0xcf,0xf3,},{0x73,0xa4,0x0d,0x9d,0xa0,0x8f,0xb9,0x8e,0xa2,0x5b,0x67,0xe7,0x21,0x55,0x7a,0x1a,0x51,0x22,0x52,0x94,0xd3,0x16,0xb5,0x31,0x49,0xaf,0x89,0x5f,0xa4,0xd6,0x3c,0xb4,0xa3,0xf5,0x6f,0x68,0x85,0x66,0xef,0x6d,0xa4,0x2f,0xd2,0x94,0x1d,0xff,0xa0,0x6d,0x49,0x7a,0xa9,0x02,0x16,0x5d,0x50,0x21,0x3a,0x62,0x14,0x11,0x62,0x99,0xa9,0x0c,},"\x48\x0c\x48\x00\xf6\x8c\x79\xf5\xdf\xc0\xc3\x66\x6c\x0a\xc4\x29\xb3\x0f\xe0\xc5\xfe\x84\x87\x50\xdb\x21\x71\x38\x0b\x80\xc8\xe9\xfe\xc0\xa0\x54\xb1\x6d\x08\x67\x4c\xef\xe2\xf6\x4e\xc2\x8b\xb6\xb0\x59\x6b\x35\x23\x55\x75\xf1\x89\xbe\xe2\x59\xac\xa7\x66\xc2\x22\xac\x0a\x46\xcf\x2a\xf7\x57\x74\xda\x4e\x34\xa0\xb5\x4f\xc2\xac\x49\xec\x8b\xed\xf4\x88\x7c\xd9\xb7\xbe\x4f\xdb\x7f\x68\x69\x02\xdd\xfa\xb0\x46\x27\xe2\x6e\xa2\xdc\x3d\x97\xd6\x2a\x4b\x15\x46\x18\x02\x18\xed\x8f\xa1\x13\x33\x48\x19\xb5\x27\x5c\xc5\x4a\xfd\xee\x44\x30\x90\x08\x59\x65\x07\x97\x16\x75\xe6\xd8\xb8\xa8\xed\xec\x47\x18\xf2\xd4\xbd\x73\x52\x13\xcb\xbd\x18\x79\x1f\xaa\x80\x54\x17\x49\x07\xa7\xac\x17\xd7\x14\x3a\x47\x57\xe4\x93\xbe\xee\xc4\x84\x9d\x0b\x83\x6f\x18\xbb\x2b\x3c\x90\x16\xf2\x5a\xf4\x7f\xb9\x61\x99\x25\x17\x20\x54\x9f\x15\xd1\x49\x50\x3d\x41\x09\x5e\x25\xf2\x62\x09\xda\xac\x39\x15\x44\x85\xc3\xde\xd7\xcb\x1a\x8c\x3e\x83\xa5\x2f\x5a\x06\xec\x09\xcf\x83\xdf\x00\x72\x6b\x79\x68\xf6\x4c\x0c\xba\xe2\x99\x51\x2f\xb4\x38\x56\x0f\x04\xb3\xb6\x44\x34\x6f\x93\x8a\xc8\xe9\x04\x86\x61\x4c\xd8\x44\xb5\x4e\xae\x07\x8b\xf6\x78\xb3"}, +{{0x59,0xb1,0x44,0xa7,0x08,0xab,0xec,0x97,0x27,0x29,0xa0,0x4a,0x6c,0x13,0xf0,0xea,0x02,0x0b,0x4e,0xd4,0xa4,0x82,0x98,0x02,0x3a,0x56,0x89,0x58,0xc2,0x12,0x15,0xec,},{0xc4,0xf4,0x72,0x00,0x92,0xed,0x61,0x79,0xa0,0x82,0xae,0x4d,0x61,0x45,0xdf,0x37,0x71,0x78,0x6e,0xfc,0xa9,0xbd,0x9b,0xb7,0x9c,0x9f,0x66,0x67,0xd2,0xcb,0x56,0xb3,},{0x1a,0x80,0x85,0x0f,0xcb,0xd6,0xe6,0x43,0xc6,0xba,0x8e,0xb6,0x84,0xdb,0xef,0x7d,0xf0,0x15,0x15,0x92,0x28,0xda,0xed,0xcf,0x06,0x04,0x70,0x91,0x86,0x05,0x4d,0xb1,0x85,0xaa,0x7b,0xaa,0xcb,0x09,0xd6,0xca,0xad,0x01,0x63,0x8e,0xff,0x8e,0x46,0x87,0x35,0xa6,0x01,0x24,0xde,0x0c,0x53,0x76,0xe9,0x43,0x40,0xe5,0x41,0xa9,0x80,0x07,},"\x38\x57\xbd\x26\x0b\x8a\xad\x9d\x07\x3f\x06\x76\x5d\x37\xfe\x89\x3a\x3f\x53\xe2\x3d\xe8\x66\xdd\xac\x33\x49\x5a\x39\xad\x33\xee\x9e\x9d\x5c\x22\x50\x2b\xc1\xc4\xb5\x47\x0d\x0e\x3f\x3a\x58\x52\x23\xfe\x4c\xb9\x3c\xc4\xad\x2b\x5b\xa6\xd7\x88\x26\xa5\x3f\xc0\x25\x3d\xc5\x80\xa2\x01\x8c\xc9\xff\x1c\xfe\xdb\xd3\xac\x0b\x53\x29\x2d\xee\xfb\xc1\x4e\x58\x9a\xcf\x49\x6c\xb5\xf7\x67\x01\x30\xfd\xbb\x6c\xf3\x8d\x20\x89\x53\xc0\x15\xa0\x47\x46\x75\xb7\x24\xbd\x10\x9f\x7c\xb8\x9c\x33\x01\x67\x51\xfe\x7a\xa7\x85\xd0\x99\xd0\x9a\xb2\x0d\xd5\x25\x8c\xd7\x64\xac\x8d\xaf\x34\x3c\xe4\x79\x0e\xad\x08\x63\xaf\x43\x12\x1a\xa5\x27\xa3\x7a\x11\x62\x8f\x47\x86\x96\x68\xf8\xea\xc0\x0d\x80\xb6\xbf\x99\x06\x66\x3d\x7a\x28\x99\xc1\xcb\x67\x8c\xd7\xb3\xeb\x3b\xc8\x02\x26\xb8\xb1\x3b\x6e\x46\x87\x7f\x38\xf0\x7c\x3d\x9c\x86\xd3\x36\x8b\xaa\xc4\xa6\xf6\xb9\x3c\xce\xbc\xec\x98\x11\x47\x4b\x6a\x6a\x4d\xa5\xc3\xa5\x96\x65\x71\xee\xd0\x5e\xdc\xc0\xe3\xfe\x7c\xd1\x59\x15\xc9\x1f\x44\xee\xe8\xc1\x49\xae\x45\x1f\x37\x55\x18\xa7\x9f\xb6\x00\xa9\x71\xa3\x9b\x94\x33\xdf\xa1\x9f\x91\x93\x1b\x19\x32\x27\x57\x47\xc2\x62\xee\xdc\xbd\x27\xf1"}, +{{0x8d,0x16,0x21,0xee,0xab,0x83,0x27,0x0d,0xe8,0x57,0x33,0x5c,0x66,0x5b,0xbf,0x57,0x26,0xe3,0x72,0x22,0x25,0xfd,0x01,0x6e,0x23,0xbf,0x90,0xab,0x47,0xae,0xec,0x3d,},{0xbe,0xcd,0xbc,0x02,0x4d,0xae,0x6a,0x94,0xed,0x4e,0x29,0xc8,0x0f,0x2a,0xff,0x79,0x6a,0xed,0x8f,0xeb,0x2c,0x1b,0x37,0x90,0xa8,0xc7,0x2d,0x7b,0x04,0x8a,0x2c,0x61,},{0xe0,0x8d,0x6c,0xaa,0x5f,0x39,0x32,0x7d,0x6e,0x66,0x52,0xed,0x74,0xdd,0x1a,0x37,0x84,0x4b,0x97,0x9f,0x5c,0xce,0x74,0x7a,0x60,0x6f,0x56,0x79,0xf4,0x89,0x8b,0xbb,0x76,0x43,0xdf,0x7e,0x93,0x1b,0x54,0xa2,0xb4,0x0e,0xbd,0xef,0xe8,0x30,0x03,0xf6,0x1c,0xa0,0xf1,0x11,0x12,0xf0,0x23,0xc6,0xa3,0xe8,0xcc,0x18,0xca,0xfe,0x5f,0x0d,},"\x97\xfa\xcd\xdc\x82\xcc\xcc\xcf\x78\x8c\x31\xb3\x30\x5e\x93\xeb\xa9\x56\xf8\x96\x13\xe6\xe5\x35\x42\xb0\x43\x26\x7f\xee\x54\x4c\x2b\x0a\x8a\xe8\x88\x6a\x31\xb9\xd3\x21\xa6\x3c\x27\x62\x3b\xae\xfe\xa8\x40\xb2\xa8\xaf\x5b\x23\x30\x19\x3f\xfb\x5b\xaf\x87\x3c\x33\x55\x28\xaf\xea\xe2\x16\x01\x63\xc8\x51\xc5\xa2\xe5\x81\x54\xa1\xb0\x56\x9c\x2d\x13\x66\xc0\x71\x04\x37\x62\x3b\x0e\x08\xc6\x86\xe5\x4f\xc2\x79\xed\x4c\x45\xf3\xe8\x56\x86\x83\x75\xf7\x82\x24\xc7\x77\xb1\x3d\x75\xde\x10\xd7\x91\x73\x55\x24\x25\xd1\x5a\x56\x19\x04\x15\x5f\x21\x17\xb2\xf1\x47\x13\xeb\x0b\x04\x64\x8a\x3b\xde\xb3\x30\x21\x67\xd1\x97\x3e\x78\x8a\x06\xcb\x00\xd4\x8c\xcb\x26\x9f\xa7\x1a\xf8\xba\x68\xea\xe5\x5d\xbb\xfd\x95\x94\xd5\xc2\xb4\xdc\x13\xae\x03\x21\x71\x85\x61\xac\xdf\x67\xdc\x8c\xfc\xc2\x5b\xc4\x6b\xb6\x6e\x09\x6a\x19\x41\xd9\x33\x52\x07\xd3\xf7\xd1\x1e\x89\x04\x90\x4f\xab\xe3\xa5\x0a\x38\x83\xe7\x07\x80\x47\xdf\x25\x2f\x38\xb6\x7c\xd2\x8a\x6a\xc4\x5c\x7d\x7a\x1d\x2a\x1d\xe8\xd4\x57\x47\xcf\x09\x30\x1e\x01\xcd\xaf\xd0\xcd\x99\xa6\xe9\x1b\x70\x4d\x50\x9f\xce\x69\x2f\xbd\xef\x2f\x71\xa5\xce\x0b\x35\xbc\x15\xc6\x5f\x87\x68\x24"}, +{{0xf2,0x73,0x5d,0x50,0xee,0x3a,0x9a,0x65,0xb5,0x8c,0x8a,0xcf,0x55,0x16,0x63,0xe9,0x88,0x09,0xec,0x40,0x6f,0x73,0xe3,0xe7,0xf4,0xe7,0x3b,0xc4,0xea,0x92,0x38,0x74,},{0xdf,0x48,0xa5,0xb9,0x4a,0x07,0xaf,0x3c,0x2c,0x99,0xb8,0x38,0x87,0x62,0x24,0x32,0x33,0xc8,0x50,0xdc,0x17,0x53,0x17,0xd6,0x02,0x63,0x8e,0x5b,0x86,0xab,0x49,0xed,},{0x69,0x42,0xa7,0x69,0x64,0x17,0xef,0xaa,0x59,0x1b,0x95,0xe1,0x1f,0x02,0xd7,0x63,0xbe,0xf5,0x27,0x9b,0x93,0x2a,0x8e,0x2a,0x7c,0xbb,0x9f,0x58,0x36,0x95,0xc1,0x4c,0xe5,0xcc,0x55,0x6b,0xec,0x66,0x79,0x9b,0x33,0xcb,0x59,0x2d,0xa4,0xdf,0x27,0x35,0xf9,0xee,0xf2,0xc3,0xce,0xca,0x43,0x62,0x16,0x4b,0x6c,0xc9,0x3d,0xa4,0xe1,0x05,},"\xae\x31\xe9\x4e\x71\x97\xe4\xe4\xd0\x23\x93\x48\x02\x5e\xd6\x68\x1e\x51\x3c\xe1\xa6\xe0\xaa\x0e\x5b\x97\x93\x73\x91\x21\x50\xef\x11\x3e\x50\xef\x05\x69\xc4\x83\xf7\x56\x8c\x4b\xbc\x47\x03\xc5\xda\xca\xa8\x0a\x0d\xe4\xe7\x38\x38\x3f\xa1\xf1\x0d\x6d\x40\x71\xa3\x1b\x99\xe6\x48\x51\x43\x97\x23\x16\xc8\x65\x22\xe3\x7c\x68\x87\xa1\xc3\x07\xb2\x9b\x0d\xd6\xf9\xf1\xb4\x38\x31\x0a\xf9\xd8\xd7\x34\x6f\xb4\x1f\x9b\x2d\xd2\xe8\x0b\x14\xc4\x5e\xb8\x7d\x4e\xd4\x8e\x37\xa5\x26\x0b\x52\x25\x7b\x3e\x99\x78\x7a\x13\xc5\x53\x92\xba\x93\x0c\x08\xe0\x24\x0e\x96\x0d\xef\x0c\x29\xb8\x55\x07\x45\xcf\x14\x9d\xee\x53\xa5\xd1\x74\xec\x06\x5d\x2d\x66\x77\xde\xe1\xfc\x42\x05\x70\x62\xc3\x4e\x27\xea\x5d\xbc\xdb\x86\x1b\x9f\x67\x0c\x60\x32\xc7\x84\x6c\xec\x8e\x87\xa7\xc9\x52\x0e\x27\x96\x7b\x01\x86\xee\x71\xb7\x7e\xd6\xd0\x29\xbb\xdd\x70\x94\x9c\xec\x4a\x70\x93\x29\xfa\x37\xfe\xe0\x02\x49\x0c\xc1\xbc\x4c\x2d\xf6\xf7\x63\xf9\x85\x8f\x33\xd7\x50\xc5\xb5\x05\xa6\x7e\x23\x70\x63\xc0\x48\x6f\x94\x56\xd3\xc6\x20\xd9\xac\x7c\x98\xf1\x38\x1d\xe0\xef\xfe\x41\xc1\x82\x59\x50\x4a\x15\x0d\x68\xa6\xa2\x8b\x0a\x3e\xea\x80\x3b\x85\x53\x15\xc9\xe0"}, +{{0xca,0xd9,0xd2,0x1a,0x01,0xc7,0xe1,0xd1,0x5d,0xf2,0xfb,0xd7,0x9c,0x51,0x6e,0xb8,0xc3,0x40,0x1e,0x9f,0xe2,0x84,0x67,0xcc,0x7b,0x21,0x67,0x9d,0x4e,0x33,0x1a,0x3d,},{0xa7,0xb5,0x5c,0x15,0xd6,0x79,0x0b,0x40,0x53,0x6f,0xca,0xe5,0xad,0x28,0x92,0xcd,0x66,0xb1,0x86,0x89,0xf4,0x99,0xc1,0xfd,0xee,0xa6,0x6d,0x4a,0x7d,0xf3,0x94,0x24,},{0x31,0x92,0x7d,0x01,0xdb,0x9f,0x24,0x72,0xf4,0xdf,0x6f,0x63,0xc1,0x8e,0xbd,0x83,0xc2,0xb1,0xaa,0xf8,0x8d,0x58,0x0e,0x84,0x88,0x54,0xdf,0x8c,0xba,0x63,0x95,0xd3,0xda,0x7b,0xd6,0xbb,0x9e,0xdc,0x1f,0xce,0x1c,0x7d,0x7e,0x13,0x60,0x55,0x8f,0xcd,0xdf,0xa9,0x39,0x15,0xbe,0x07,0x6e,0xfb,0x8e,0xa2,0xdc,0x5e,0xa7,0xb2,0x0d,0x0a,},"\x70\x70\x2b\xf1\x9c\x91\x9f\x98\x36\xde\xfd\x7b\x84\x6f\xd9\x99\x2d\x8b\x7e\xb2\xe1\x06\xae\xb7\x1e\x60\xa3\x1b\x4e\xa2\x5a\x41\xb2\x12\xdc\x7d\xe7\xc9\x1c\xbd\x61\x3d\x58\xd0\x59\x5d\xb8\x33\xcf\xe7\xe5\x05\x84\xf2\x55\x69\x60\x2c\x77\x44\xfa\x67\x5d\x15\x6d\x0f\x63\xcd\x2b\x7c\x08\x9c\x8a\x00\x68\x6a\x43\x71\x69\x82\x6a\x12\xdc\x48\x5b\x38\xc0\x68\xa8\x00\x71\x42\xe5\x16\x37\x47\x01\x1a\x07\xa4\x15\x68\x36\x22\xab\x1e\x23\xce\x57\x7c\x73\x2b\xa1\x4f\x40\x1f\xbc\x30\x43\xe0\x69\x3a\x92\x05\xc1\x9a\x92\x29\x8a\x3d\x9b\x08\xfb\x7a\xfa\xfa\xe0\xa9\xf0\x16\xbc\x75\x0e\xe6\x31\xa5\xf5\xda\x5d\xb6\xf9\xba\x26\x92\xc7\x4c\xaa\xae\xb4\xd0\x97\xe9\x0e\x3c\x02\xd2\xe3\xa7\xfb\x3a\xa0\x00\x04\x0b\x7c\x17\xb7\x45\x64\xe6\x46\xbe\xa1\x6b\xad\x61\x1e\xbc\x08\x59\xa3\x82\x88\x04\xab\x4f\x5c\xfb\xa4\x17\xd2\x54\x51\x5c\xa3\x62\x0a\x3a\xd6\x83\xc4\x6c\xa6\x26\x7b\xb4\x95\x39\xbb\x30\xe3\x69\x08\x7e\x67\x43\x8e\x94\x89\x56\x27\x50\xdc\xcb\xa3\xaa\x0b\x1b\x0a\x6c\x26\x70\x32\xd2\x0c\x2a\xdb\x75\xe6\x8d\xf1\x12\x3b\x52\x59\xbf\xe4\xea\xc6\xca\xdc\xa6\x77\x81\x38\xa3\x73\x18\xad\xb3\x0e\x8d\x66\x9f\x3b\xc9\x69\x2c\xc7\x4b\x68"}, +{{0xd9,0xbe,0x84,0x22,0x55,0xe9,0xa1,0x6b,0x0a,0x51,0xa8,0x67,0x42,0x18,0xce,0xe7,0xcd,0x9a,0x8b,0xdf,0x34,0x35,0x08,0x39,0x7f,0x4d,0xdb,0x05,0xf3,0xfa,0x00,0x82,},{0x79,0x31,0xbc,0x6d,0xfa,0x33,0x24,0x94,0x3a,0xab,0x18,0x3d,0x12,0x85,0x51,0x59,0x19,0x39,0x9f,0xfe,0x0b,0x71,0x06,0x77,0xf0,0x91,0x5d,0x3a,0x5b,0xe5,0x1e,0x92,},{0xc9,0x38,0x45,0x65,0x8c,0x95,0x60,0xd2,0xc0,0xe2,0x8f,0x28,0x2a,0xdb,0xd4,0x65,0x2b,0xaf,0xd3,0xbb,0x2e,0xde,0xc1,0x7c,0x94,0x87,0x8f,0x7b,0x94,0xd3,0xc7,0x7a,0xfe,0xc9,0x06,0xed,0x29,0x2a,0x8d,0xfb,0xf5,0xf8,0xe7,0xc1,0x18,0xe8,0xf2,0xca,0x33,0xdd,0xa7,0x90,0x9d,0x9b,0x69,0x5b,0x8f,0xf5,0xa1,0xc0,0xe9,0x7a,0xc8,0x07,},"\xac\x6c\x55\xb1\x34\x66\x3e\x41\xf0\x2a\x6d\xcb\x85\x49\xea\xa1\xc0\x13\xf5\x96\x58\xd8\x1d\x81\x2f\x95\xb7\x40\x09\x51\x37\x23\x67\x19\x45\xe1\x32\x4f\x90\xf8\xa3\xf9\x71\x36\x91\x81\xb5\x87\xba\xb4\x56\x65\xf7\x88\xd6\x63\xab\x78\x14\x0c\x5a\x22\xc1\xc1\x8d\x4a\xfe\xdc\x74\x48\xa7\x48\xaf\xe5\xbf\x23\x87\x00\x3c\x1d\x65\xab\x18\x48\x2e\xf9\x89\x22\xb4\x70\xda\x80\xad\x14\xc9\x44\x95\x1c\xe4\xae\xd3\x73\x90\xcc\xe7\x9a\x8e\x01\xb2\x4c\x7d\xfc\x11\x41\xc0\xec\xa2\xc7\xf7\x73\xed\x4b\x11\x80\x6a\x34\x61\x55\x13\x48\x6e\x4e\xe1\x1a\xf0\x80\x78\xa1\xb4\x05\x4c\xf9\x88\x02\x98\x60\x8d\xd9\xb3\xfa\xa1\xa2\x42\xa4\x52\xfe\x51\x16\x04\xb3\x10\x2c\x31\x3d\x14\xcc\x27\xc6\xf0\xf8\x47\x1d\x94\x55\x53\x17\xea\xa2\x64\xcd\xf5\x2c\x69\xe1\x8f\x46\x1e\x47\x90\x3d\x21\x29\x87\x16\xb1\x72\xee\x9c\xb1\x78\xf0\x8f\xf2\xd3\xc9\xc1\x62\x12\x1c\x2e\xd2\x1d\x87\x34\xb2\xf0\x63\x0d\x39\x91\x46\xcb\xf7\x6e\x02\x8a\x14\x3f\x2b\xf7\xbb\x50\xaf\x0f\x57\xb9\xba\x80\x21\xd2\x64\xb0\x0c\x66\x62\xf8\x4c\x86\xcb\x6d\x59\x52\xb3\xd2\x41\xf7\xdc\x3e\x70\x0c\x96\x61\x6c\xbc\xfb\x0d\x0e\x75\x3f\xfd\x5d\x21\xee\x32\x0e\x65\xe9\x7e\x25\xcb\x86\x09"}, +{{0xcf,0xc4,0x8c,0xc6,0xf6,0x58,0x11,0xfe,0x7d,0x7b,0xba,0x85,0xd1,0xcd,0x84,0x85,0x8f,0xd6,0xf7,0xed,0xd6,0x38,0xf4,0xf5,0x52,0x36,0x3e,0xe7,0x68,0x5f,0x69,0xca,},{0xd2,0x9c,0x10,0x69,0x4c,0x5e,0x8e,0x3f,0x34,0x47,0xed,0x78,0xd3,0x4d,0xbd,0x74,0xa2,0xb3,0x01,0x37,0x3b,0xa8,0x71,0xb5,0x85,0x0c,0x33,0x3d,0xff,0x7b,0xf8,0xd0,},{0x80,0xc5,0xd5,0x1e,0x96,0xd1,0xca,0xc8,0xef,0xd3,0x45,0x98,0x25,0xe7,0x9c,0x1e,0x9f,0x65,0xaf,0x70,0x1d,0x1d,0x29,0xe1,0xf9,0x5b,0x03,0x67,0x07,0x11,0x3b,0x77,0x98,0x4b,0x7b,0x33,0x50,0xf0,0x40,0x77,0x33,0x3c,0x95,0x7f,0x8f,0xbc,0x7d,0x9b,0x04,0x0c,0x36,0x26,0x51,0x41,0x7b,0x98,0x99,0x02,0x7c,0xd3,0x3e,0xdb,0x11,0x03,},"\x8e\x7d\xef\xb9\xd1\x6d\x03\x6b\xd6\x42\xcf\x22\x6e\x32\x77\x3e\x60\x53\x61\xc5\xec\x4b\x95\x12\x55\x78\x8d\xb0\xa0\x42\xc6\x3e\x5a\x43\x67\xd6\x15\x24\xf1\x0e\x62\x58\x99\x13\x25\xa3\x9a\xb6\xb0\x36\x12\x26\x0c\x3f\xe3\xdf\x20\xb3\x42\x02\xd3\x43\x95\xbd\x4e\xd4\x0b\xd6\x13\x73\xdf\x78\x1a\x4c\x8b\xcf\xbd\x15\x30\x10\x60\xf0\x74\x37\x73\x23\x33\xd8\xe4\x97\x36\x32\x2d\xee\x6b\x22\x43\x8e\x78\x7d\x88\x56\xb7\x0c\x26\xec\x57\xd6\xda\xde\x9c\x3c\x28\xe2\x72\x20\xc5\x67\x0e\x39\x35\x44\xed\x09\x59\x37\x29\x8d\xc3\xad\xc7\x38\x65\xf7\x77\xe9\x00\x37\xbd\xef\x83\x47\x16\x47\x6d\x78\xf4\xe6\xcb\x49\x61\xa4\xc6\x8a\x8a\x83\x63\x38\xa9\xf5\xda\x17\x9c\x4d\x5e\x93\xc3\xf7\x0d\xd3\x5e\xec\x70\x96\x53\xdd\x8d\xe3\x79\x96\xb1\x20\x56\xd4\xee\xfc\xb4\xb6\xb3\xc1\x3b\xa9\x84\xd8\x32\x27\x5c\x43\x86\xeb\xf4\xa8\xff\x7f\x07\x8b\xe3\xd4\x28\xc1\xe0\xd9\xb1\x62\x38\x1f\x06\xa5\xb7\xbb\x12\x70\x40\x03\xd9\x1f\x25\xd1\xd8\xfd\x43\x62\x6c\xe7\x0f\xff\x59\xd2\x92\x77\x68\xa7\x6b\xf7\xf9\xef\x76\xff\x95\x48\x9f\x38\xed\xcd\x1c\x9e\x9b\x8a\x8b\x0e\xf6\x6c\x32\x80\x57\x76\xd5\xae\x9f\xbd\x84\xa7\xaf\x4f\xa6\x56\x3e\xc7\x0a\xc5\x73\x3a\x44"}, +{{0x15,0xc9,0xf7,0xc4,0xd8,0x4a,0x5a,0x47,0x90,0x41,0x95,0x2e,0x6a,0x8c,0xac,0x24,0xe7,0x6f,0xd2,0xd2,0x75,0xc1,0x97,0xe6,0xb5,0x21,0x92,0x9b,0x43,0xba,0x6c,0x5d,},{0x86,0x33,0xc1,0x82,0x9d,0x29,0x09,0x1d,0xf7,0x1f,0xd5,0xc0,0xef,0x64,0x05,0x72,0xe4,0xb6,0x49,0x74,0xcd,0x09,0x7d,0xbe,0xbb,0xcd,0xde,0xba,0x04,0x16,0x47,0xc0,},{0x1e,0x36,0xbe,0xa5,0xa5,0x83,0x76,0x7e,0xbd,0x80,0x30,0x6c,0xab,0x23,0x31,0x55,0xb7,0xb4,0x28,0x14,0xb4,0x34,0x73,0xcf,0x45,0xcd,0xc5,0x03,0x9c,0x93,0x97,0x44,0xa9,0x69,0x4b,0x87,0x22,0x0d,0xaf,0x4c,0xcd,0x29,0xf2,0x5c,0xea,0x40,0x5e,0x7c,0x08,0xdb,0x2e,0xf1,0x7f,0x3f,0x03,0x4d,0xbb,0x49,0xcf,0xf6,0x02,0x83,0xe3,0x06,},"\x11\x73\x0d\xd4\x5d\xda\x80\xd8\x4d\x08\x0d\x92\xe9\xbd\xda\xee\xa6\x87\x8e\x4a\x0b\x3b\x51\x2d\x9e\xa7\x33\x80\x8e\x1c\xef\x51\xd4\x90\x48\xd6\xc7\x81\x16\xa4\xbd\xe3\xc6\x4a\xce\xaa\x52\xbe\xca\x86\xb3\x31\xab\x59\xe9\x18\x5c\x70\x28\x6a\x02\xbb\x5d\xd0\x4f\x5c\x7f\x4e\x9c\x7e\x44\x5e\x77\x45\x85\x65\xf1\x59\xc7\x83\xdf\xd4\xd9\x76\xa9\x10\xe9\x37\x78\x9d\x21\x41\xd4\x16\xed\x3a\x7f\x60\x8d\x26\x73\x7a\x86\xb2\x0b\x62\x4e\x3c\x36\xaf\x18\xd2\x5c\x7d\x59\xb8\xd7\x42\x7e\xc6\xc4\xd3\xd4\x38\xd7\xae\x09\x49\xdd\x7d\x74\x8c\x1f\xfd\x6f\x28\xe8\x28\x5d\x44\x04\x22\xd2\x2a\x37\x61\x20\x2e\x95\x84\xf5\xcd\xb3\x50\x45\x47\xaa\x4b\x68\x57\x30\xc9\x82\xcb\xa2\x13\xde\x08\x02\x0a\x5e\x4e\x46\xa9\x5f\xac\x4b\x48\x1b\xea\x0b\x63\x0a\xbd\x03\x0d\xdd\x33\x5a\x20\xfe\x2c\xf7\x09\x4a\xef\x48\x13\x95\x69\x91\x91\x3c\x68\x21\xf4\xb5\x41\x0d\xf4\xf1\x33\xfe\x63\xe2\x2c\x08\x09\x2a\x0a\x65\x97\x27\x22\xa2\x7a\xe4\x20\x11\xa8\x07\xc3\x27\xb4\x17\x23\x7c\x54\x01\x14\xee\xcb\x9f\x0e\x96\xcd\xa5\xdc\xf0\x24\x6f\x1d\x27\x17\xf4\x9b\x9c\xea\x9d\xc6\xa3\xda\x9b\x39\x6f\x02\x70\x52\x92\x26\xf5\xdc\xba\x64\x99\x91\x8a\x6c\x28\x9f\xe0\x55\xfe\xc8"}, +{{0x6d,0x2d,0x0d,0x82,0x3f,0x29,0x47,0x46,0xb9,0xa5,0x51,0x2e,0x14,0xe7,0x3c,0x1d,0x85,0x5b,0x5e,0x4b,0xca,0x65,0xfe,0x81,0x77,0x29,0x81,0x0c,0xc5,0xef,0x84,0x0d,},{0x1b,0x64,0x80,0xa6,0xa9,0x0d,0xfb,0x47,0x29,0x84,0x85,0x5c,0xef,0x6f,0x1a,0xb3,0x1e,0xb7,0xb3,0xf1,0x3c,0x8a,0xc0,0x0f,0xa5,0x56,0xd2,0x0b,0x53,0xe5,0xae,0x17,},{0xb5,0x15,0xf4,0x9e,0xb3,0x2a,0xd4,0x78,0x69,0x2d,0xf8,0x8f,0x07,0xb7,0x80,0x2c,0x6e,0x0e,0x53,0x27,0xaa,0x08,0xa6,0x36,0x6e,0x4c,0xb1,0xd1,0xe2,0x6f,0x9e,0x65,0xfc,0x81,0xab,0xeb,0xe2,0x21,0x5d,0x64,0x91,0x00,0xf2,0x75,0x98,0x27,0x3a,0x41,0x2b,0x62,0x4e,0x84,0x2d,0x81,0x30,0x40,0x37,0x97,0xe5,0x7d,0xec,0x97,0x5a,0x0a,},"\x87\x72\x72\x1f\x72\xea\xf7\xf7\x30\x40\xc0\x68\xa7\xc3\x75\x3b\xff\xca\x7d\xc2\xd0\x93\x0c\x65\x25\xf4\x25\xe6\x00\x5c\x25\xcd\x4c\x0f\xf5\x09\x5c\x9c\x61\xa5\xd8\xa1\x96\x7b\x8c\x86\x01\x0c\x88\x4e\x50\x9e\x6b\x16\x70\xf7\x90\x46\xe2\x29\x79\xeb\xd3\x54\x73\x40\x90\xd3\xad\xa2\x14\x35\xc1\xf8\x25\x4f\x7b\x52\x22\xcd\x55\x64\xf0\x64\xe9\x77\x64\x03\x66\x44\x9f\x4e\x50\x08\xf8\x70\xf9\xc4\x84\x05\x65\xbf\x4f\xb5\xf5\x74\xc9\x77\x4b\xa2\x56\x8e\x71\xa9\xcc\xd8\x2f\xfc\x59\xb6\x94\xf2\x6e\x7d\xe4\xce\x2e\x3f\xd8\x80\xa0\xee\xf3\x87\x93\x13\x33\xed\xe0\x0d\xcb\x06\x5e\x6d\x0f\x79\x59\x1a\x2a\xa9\x56\xdf\x19\x48\xa2\x65\xcb\x95\x75\x0d\x8a\x23\x3b\x15\xc2\x88\xa0\x54\x87\xc5\x15\x66\x3f\x93\xe7\x40\xfb\x15\x70\xfb\xe4\xbd\x80\xc6\x8e\x8d\x92\x97\x34\x5a\x8a\x01\xcd\xbd\x88\xf4\xa3\x9b\xed\x9c\x5e\xf0\x9f\x14\x4b\xce\x5d\xe5\x68\xbf\x37\x33\xbc\x53\xb2\x03\x9a\x29\xcb\x3e\x19\x45\x01\xad\xc1\xc1\x0e\x86\x38\x3a\xac\x8b\x0f\x85\xc6\x7a\x66\x89\xbb\xe1\x47\x0a\x39\x24\x76\x31\x34\x39\xca\x88\xd9\x8c\x02\x1c\x0e\xae\xc2\x5f\xb2\xf9\xa1\x60\xce\x5c\x78\x61\x70\xbe\x02\x38\xfb\x87\x85\xdd\x33\xbf\xa9\x05\x9a\x6c\x37\x02\xd0\xde\x05"}, +{{0xc0,0xcf,0x79,0x9a,0xf7,0x39,0x5b,0xf2,0x7b,0xaf,0xa3,0x6c,0xab,0x43,0x70,0x45,0xe3,0x9c,0x90,0x3b,0xf8,0x07,0x54,0x83,0x19,0xce,0x44,0xf2,0x87,0x49,0x4f,0xbb,},{0xaf,0xbf,0x55,0x0c,0xa2,0x90,0xc9,0x05,0xbd,0xd9,0x2f,0xc8,0x83,0x1e,0xbe,0x3d,0xfe,0xb6,0xda,0xae,0x4f,0x56,0x00,0x52,0x53,0xcc,0x50,0x95,0x1e,0x50,0xed,0xc2,},{0x5b,0xba,0x01,0xa4,0xc7,0xb2,0x55,0x42,0xd0,0x69,0x12,0xde,0x70,0xaa,0x1e,0x22,0x04,0x23,0xfd,0xf8,0x33,0x8a,0x9e,0x69,0x33,0x95,0xcb,0x6f,0x0d,0xc1,0xfb,0xfd,0x01,0x8e,0x3c,0x77,0xe5,0x0a,0xef,0x90,0xa9,0x08,0x0f,0x30,0xf1,0xf5,0x79,0x2b,0x24,0x31,0x07,0x8f,0xe6,0xe3,0xe0,0x04,0x64,0x24,0x5e,0x17,0xcd,0x8d,0xc1,0x07,},"\xdb\xe6\x57\x80\xe9\x68\xde\x9e\x40\xff\xb5\x7c\xf5\x9a\x60\xfd\x93\xb3\xf9\xa5\xe7\xd8\xed\x51\x80\xad\xbc\x57\x8c\xa1\xbc\x48\xbd\x9f\xb6\x0a\x13\x24\xc9\xc2\xc1\x14\x14\x79\xa0\xdc\xf0\xf1\xd0\x7e\x84\x93\x65\x26\xdf\x42\x33\x3c\x0d\x77\x3e\x3f\xed\x9e\x40\x38\xde\x5b\x95\xad\x90\x5c\x92\xcb\xe0\x40\x48\x7b\xf5\x5e\x10\xe1\xed\xb4\x29\xa0\xec\xc4\xe0\xe8\xd0\x0a\x98\x8a\x9c\xd5\x3e\x2e\xb3\x72\xf4\xfc\x4c\xd9\x53\x7b\x26\x9b\xa3\xa2\x3c\xef\xbc\x8d\xf6\x47\x6e\x75\x43\x4b\x81\xd9\x3e\x88\x91\xbf\x41\x7c\x82\xe3\x63\xf3\xe4\xab\xf8\x0a\x4f\x73\xac\xa8\x4a\xc7\xdf\x63\x37\xf5\x36\xd6\x3d\x93\x9d\x92\xcb\xa6\x4b\xe7\x42\x22\x11\x16\x06\x9e\xf2\x51\xab\xba\x0b\x00\xaf\x01\x71\x8b\xb5\x80\xdd\xbe\xb7\x99\x73\xef\x10\xa6\x8b\x4d\x0f\xa0\x23\xd6\xeb\xd3\x07\x9d\x6b\x32\xa1\xaa\x20\xa2\x1e\x92\x02\xf2\x75\x90\xc3\xf0\xc0\xcc\x25\x30\x73\xc3\xf8\x22\xaa\xc4\x59\xd3\x9f\x50\x75\x8b\x70\xc0\x07\x10\xa3\xc9\x84\x38\x41\x65\x08\x52\x2e\x51\x2a\xda\xa0\xaf\xd5\x03\xa7\xce\xb0\x4f\xb9\x4a\x4a\x93\x2c\xe8\x0c\xd5\xa7\xf1\x1b\xb8\x61\x26\x3f\x58\xe5\x74\x9d\x54\x2a\x11\x0d\xe7\xc7\x68\x9d\xfc\xb0\xc5\x1a\xfa\x9d\x54\xa5\x8f\xf8\x9f\x3f\x67"}, +{{0xcd,0xaa,0x50,0xe8,0x52,0x7d,0xc7,0xa5,0x0f,0xb3,0x7e,0x28,0xfa,0x8b,0x95,0x68,0xc3,0x7e,0x85,0x67,0xe0,0xb4,0x99,0x99,0x7b,0x9a,0xed,0x67,0x61,0x80,0xc3,0xb0,},{0x7c,0x56,0xe1,0x64,0x51,0x02,0x68,0xc1,0x82,0xb4,0x23,0x74,0x79,0x04,0xf1,0xd3,0xa5,0x80,0x93,0x30,0xf6,0xe1,0xb2,0x92,0x66,0xec,0x46,0xe7,0x3b,0xe1,0x55,0x0f,},{0x13,0x7b,0xd1,0x0a,0x50,0xef,0x60,0x93,0x84,0xfe,0x66,0x87,0x68,0xfb,0x87,0x1d,0xe7,0x41,0xca,0x0f,0x53,0xff,0x84,0x77,0xd7,0xeb,0xfa,0x90,0xaa,0xfd,0x5e,0x26,0x81,0xfd,0xf1,0xb8,0x92,0x50,0x46,0x3c,0x15,0xdb,0x8e,0x17,0xa5,0x88,0x25,0xfe,0x94,0x27,0xde,0x08,0x9c,0x34,0xde,0x13,0xcd,0x07,0xbb,0xa1,0x8d,0x4a,0xa4,0x0d,},"\x94\xfc\xfb\xaa\xa3\x03\xde\xce\x7b\x90\x8f\x87\x4c\xc5\xf0\x95\x06\x1f\x17\x54\xbb\x35\x78\x0d\xb6\x66\xb6\x3a\xb8\x29\x08\x11\xbf\x1c\x52\x1a\x7f\x8f\x78\x5e\xa2\x70\xdf\xb3\x9d\x0d\x6e\xd9\x5a\xb7\x19\x55\xa1\x1f\xfa\xea\xa2\x68\xe0\x81\xff\x3e\x4f\x24\x25\xb4\x18\x80\xa9\x87\x15\x1e\x67\x8e\x89\x11\x13\x50\x94\x2d\x82\x0c\x3e\xec\x36\x21\x24\x26\x66\x3b\xe1\x75\xe5\x28\x6b\x4a\xd1\xcc\x80\x4e\x3e\x3a\x03\xb9\xfa\x3e\x82\x83\x8e\xbb\xc2\x61\x5a\x64\x5f\x2c\xa1\x46\x8a\xc4\xa1\xcd\xbe\x52\x37\x61\xe8\x3f\x43\x81\xb0\xc8\x55\x0a\xe5\xe8\xc8\xcd\x1f\xda\x57\x19\x14\x36\xe2\x7c\xb8\x83\xbc\x64\xbe\x86\xa9\xdc\x61\x10\xef\x34\x01\xd8\x8a\x7d\xeb\xd1\xb7\x01\xd9\xc2\x57\xa6\x82\x6c\xf0\x1e\x9e\x29\x22\xe3\xae\x57\x7f\x28\x34\x27\x5f\xb0\xec\xda\x80\xed\x8c\xf1\x80\x1e\x0b\xc5\xe0\x1e\x26\xa7\x7c\x48\xbd\xf4\x6a\x5c\x48\x94\xd2\x2a\xb5\x3e\x74\x18\x27\xe2\x4b\xed\x5f\x07\x50\xff\xad\x05\xe5\x3f\x1d\x5e\x61\xdf\xd3\x16\xb1\x91\xd9\x79\x7e\xf7\x13\x13\x1a\x8b\x43\x0a\xbe\x3f\xac\x5f\x3c\x4a\x2c\xa0\x21\x87\x8b\x15\xad\xc8\xc5\xf5\x42\x11\x42\x60\xe6\x87\xa9\xd1\x99\xd2\x30\xc4\xe0\xd3\xfc\x69\x69\x93\xb5\x9c\xcf\xa3\xff\xa9\xd8\xd2\xfb"}, +{{0x0f,0xde,0xa9,0xbe,0xe6,0x28,0x8f,0x94,0x7e,0x0a,0xdb,0xdd,0xa4,0xdf,0xb2,0xba,0xa0,0x38,0x91,0xaf,0x25,0x02,0x4a,0x5e,0x13,0x8a,0xc7,0x79,0x84,0xd0,0x05,0x07,},{0x70,0xab,0xd8,0x64,0x30,0xd7,0xe8,0xd6,0x32,0x09,0xc8,0xb3,0x73,0xec,0x4e,0x4b,0x79,0xe9,0x89,0xe6,0x72,0x5f,0xac,0xef,0xba,0xde,0x3c,0x75,0x74,0xd2,0x3c,0xd0,},{0x80,0xc4,0x2d,0xd5,0xdf,0x03,0xb2,0x85,0xa8,0x6a,0xc9,0x5c,0xe6,0x66,0x9f,0x78,0x6a,0x97,0x8a,0x81,0x3a,0x9d,0x7b,0x8c,0x6a,0x23,0xde,0x76,0xfb,0xd0,0x9b,0xdb,0x66,0xc5,0xdd,0x1c,0xc9,0xf1,0xa1,0x76,0xcb,0xa3,0x88,0xd5,0x05,0x17,0x64,0xa3,0x2f,0xa2,0x7f,0x00,0x28,0xba,0x48,0x98,0x06,0x8b,0xd0,0x1a,0x3e,0xe1,0x72,0x08,},"\xcf\x72\xc1\xa1\x80\xa2\xbc\x37\xd8\x47\x8d\x9a\x7a\x39\xac\xf0\x3b\xf2\xa5\x07\x90\xf7\x90\x2f\x81\x12\x12\x22\xd3\x1d\x3e\xc9\x16\xf4\xf2\x4c\xef\x9d\x7c\x41\xdc\x02\x1b\x0e\x84\x87\xbb\x89\x2e\x47\x30\x5e\x54\x52\x03\x03\xe8\x9b\x30\xb2\x63\xda\xc4\xa9\xba\x37\x5d\x46\xc4\x0f\xcf\x40\x05\x35\xc9\x59\xd2\xb7\x46\xa7\xfc\x97\x0c\xf6\x5b\x47\x2e\x84\xb5\xf1\xd0\xeb\xad\xcf\xa1\xae\xd6\xfc\x47\xfa\xcc\xe1\x6a\x36\x6a\x3b\x1d\x6e\x51\x68\x13\xc1\x96\x09\x75\xf8\xf2\xb4\x30\x42\xfb\x4e\xea\xab\xe6\x3c\x6f\x65\xdb\x45\xdd\xb7\xdb\x88\x8a\x19\xa9\xd7\xba\x6c\xa4\x79\xfc\xd7\x0c\x5d\x1e\x97\x0f\x12\xc1\x4f\x4d\x24\xfb\x7e\x2f\x35\x7b\xd3\xa9\x4a\xa1\xb8\x68\xcc\xc0\x84\x7f\x2e\xef\x21\x85\x3e\x25\x3b\xaf\xbf\x07\xc4\xe6\x17\x6a\x1e\xf0\x77\x16\x78\x41\xeb\xbe\x56\x29\x33\x71\x57\xf3\x9f\x75\xc7\x1d\x21\xe7\xe9\x6c\x51\xa1\xb1\x6f\xa8\xdc\x60\xf0\xb1\x27\x9f\xcd\xa2\x64\x1f\xc8\x59\x1e\x3c\x49\x2f\x15\xbf\x83\xca\xf1\xd9\x5b\x2c\xd9\x13\x32\xf1\xb4\x20\x2f\xe7\x28\x62\xca\x2e\xa2\xef\x92\xc1\x1d\xb8\x31\xd8\x2f\x8f\xc3\xd4\x1f\xe2\x9a\x76\xc2\x11\xa7\x58\xe2\xf7\x1b\xd8\x9d\x2c\x66\x10\xf2\x01\x42\x9f\x34\x8d\x56\xe1\x0e\x3b\x7a\xf5\x3e\x27"}, +{{0x03,0xd5,0xe4,0x66,0xf8,0x29,0x8a,0xb5,0x43,0x8a,0x30,0x97,0x6d,0x13,0x22,0xa7,0x21,0x5a,0x64,0x2d,0xd5,0xfb,0x4c,0x3f,0x85,0x19,0x40,0x9a,0x75,0x22,0xf0,0x92,},{0x4b,0x3e,0xd4,0xdb,0x08,0x0e,0x2a,0x45,0x2e,0x16,0x91,0x2c,0x14,0x50,0x44,0x24,0x92,0x0a,0x60,0x97,0x56,0x04,0xe4,0xf3,0x79,0x25,0x8d,0x1c,0x8b,0x19,0x3d,0x6f,},{0x6d,0x7e,0x46,0x58,0xf2,0x6f,0x33,0x7c,0x98,0xe0,0x3f,0x13,0x54,0x2e,0x2f,0x39,0x44,0x0f,0xf7,0xbf,0x8d,0x88,0xf3,0xf6,0xdf,0xa4,0xd6,0x49,0x48,0xcd,0x96,0xb7,0x90,0x51,0x49,0x2f,0xc2,0x8f,0x65,0xf2,0xcc,0x0d,0x23,0xa0,0xc4,0xd5,0xe2,0x30,0x7b,0xb1,0xc4,0x7e,0x11,0xe5,0x3b,0x37,0x1f,0x09,0x1b,0x69,0xf8,0x0d,0xbd,0x05,},"\x1b\x47\xb7\x00\x13\xcb\x53\xe1\xf8\xf4\x97\x1e\x0f\x39\x56\x3c\xe8\x7e\xdb\xc2\xce\xdd\x99\xe5\xa3\x55\x85\xdf\x8b\x00\xa8\x52\xf7\xb9\xc9\x7c\x7e\x4a\x54\x65\xfc\x56\x05\xae\x8c\x5c\x36\x57\x0a\x99\x20\x1a\x7a\xd6\x03\x12\x87\xef\x0c\x7b\x2b\xa6\xe5\x7b\x05\x6d\x0f\xc8\xd6\xca\x43\xbf\x6c\xbd\xab\x09\x89\x34\xb4\x03\x19\x7b\x52\x5d\x22\xd4\x5e\x6b\x29\xc7\x8f\x8d\x61\x83\xe4\x1f\xfe\x19\x7d\xae\x25\xba\x22\xb0\x66\x69\xae\x05\xba\xdd\x7e\x1d\xa6\x93\x2a\x7d\x05\x4c\xba\xb3\xf5\x4e\x51\x46\x22\x3a\xd8\x67\x12\x31\xbc\x16\xfe\x62\x67\x9b\xd2\x81\x7a\x6b\x80\xe6\x53\x99\x8c\x49\x49\xf8\x1f\xf5\x3b\x61\x73\x16\x3e\x11\xda\x3e\x6d\x3c\x76\xd8\x4c\x71\x32\x25\xb4\x17\x3d\x6b\xf0\x6a\x85\xb6\x98\x8a\x48\xbe\x43\x59\xcb\x51\x55\x03\xca\x56\x3f\x43\x53\xf8\xe7\xd4\x5e\x4d\x94\x46\x2c\x89\xa0\x4a\x00\xf1\xb3\xb0\xca\x64\x22\xd5\xdb\x02\x9c\x50\x7d\x46\x48\x34\xa2\x0c\x78\xa7\x13\x66\x1d\x84\xed\xff\xc4\x96\xd6\x92\x82\x61\x98\x94\x43\x7b\x44\x87\x95\x4c\xbe\xa2\xaa\x72\x61\xe6\xa6\x2b\x68\x51\x15\x4a\x5d\x25\xfb\x6b\x4f\x09\xc5\x94\x73\xd3\x85\xce\x03\xe9\x1b\xa8\x65\xea\xb6\x6c\x58\xc0\xab\xb0\xb7\xa7\x8e\x4b\xe9\x27\xe5\x54\x60\xcc\xd7\x0d\x82"}, +{{0x76,0xcc,0x18,0xa1,0xda,0xff,0xfa,0x10,0x05,0x86,0xc0,0x6a,0x7b,0x40,0xf7,0x9c,0x35,0xfe,0x55,0x8c,0x33,0x9c,0x29,0x99,0xa5,0xf4,0x38,0x75,0xcf,0xad,0xe0,0x3e,},{0x4b,0x9d,0xa8,0xd2,0xf1,0x37,0xdc,0x6c,0x85,0x7a,0x99,0xa5,0x99,0x8d,0xd8,0x9d,0xd5,0xf0,0x59,0x71,0xa2,0x1e,0x8c,0x77,0x66,0x70,0xeb,0x47,0xbc,0x12,0x70,0xa5,},{0xdb,0x74,0x75,0x1c,0x66,0xe6,0xb1,0x86,0x60,0x44,0xdd,0x9a,0xe9,0x9f,0x19,0xe6,0x33,0x4f,0x17,0x9e,0x79,0xd8,0xb8,0xe0,0xc8,0xcd,0x71,0xd2,0x2c,0xef,0xb9,0xea,0xb7,0xe3,0xe7,0xa9,0xc2,0xda,0x22,0x5f,0x2a,0x9d,0x93,0xa3,0x13,0xd1,0xcb,0xf1,0xb7,0xfe,0x25,0x97,0xb8,0xd7,0x02,0xbf,0x30,0x17,0xa6,0xa6,0xbc,0x7b,0x7b,0x06,},"\x45\x22\xb1\xd8\x23\x73\xf7\xa3\x18\x22\x1e\x7e\x57\x61\x75\x03\xdd\xf4\x4f\xd5\x39\x97\x52\x2a\x1d\x96\x3c\x85\xb7\x08\xd0\xb2\x45\xde\x37\x2a\xd5\x2e\xc7\xf5\x4f\x62\x13\xd2\x71\xf7\xc9\x1d\x5a\x1d\x36\xd1\x34\xdb\x38\x9d\xf0\xb0\x81\xa0\x6b\xc0\xc7\xa4\x87\x5f\x72\x40\x92\x79\x31\x72\xc9\x11\x56\x41\xc6\xd0\x54\xf1\xd9\x92\xe0\xfa\xe4\xdf\x58\x69\x5f\x0e\xa3\x44\x9d\x7a\x4b\x3a\x88\x57\xe1\x98\x03\xfe\x49\xb6\xd5\x2c\x9f\xf3\x74\x6a\x57\x4a\x27\x56\x95\x65\x79\xf9\xfb\x80\x9a\x0e\xde\xc9\x2c\x55\xe9\x5f\xfe\xfa\x3d\x05\xf1\x65\x82\x2f\x46\x4a\x21\x99\x9f\x29\x69\x1f\x67\x44\xac\x5a\x3e\xe4\x90\x17\x88\x06\x45\xe8\x37\xed\xeb\xfd\x2e\x0f\x24\x99\x7f\x04\x11\x45\xa7\x2e\x23\x76\xad\xa2\x83\x18\x6c\xa2\xb8\x36\x36\x29\x77\x19\x5b\xae\xe3\x0a\x3a\xcc\x81\xb2\x43\xf3\xee\x37\x6a\x2c\x47\x64\xc7\x83\x66\x7a\x4b\x11\x77\xe7\x95\x1d\x3e\x3c\x7b\xe4\xf1\xbd\x7a\xe8\xc6\x0f\xd5\xfb\x0f\xd9\x1f\x0c\x1c\x14\xd0\xd2\x32\x7e\x8f\x20\xd9\x2c\x0d\xfc\xc5\x38\x70\xe9\xd9\x9f\xdb\xf9\xdd\x9a\x17\xe8\x82\x50\x9a\xe7\xba\xa8\x65\x3e\x39\xed\xc8\xee\x56\x90\x00\xd6\x24\xcb\x93\xa0\x75\x4a\x79\x8d\x1f\x81\x1f\x6a\x0e\xf5\x50\x1a\x17\xbc\xf2\x5f\xd0\xf9\x16\x26"}, +{{0x71,0xad,0x98,0x0d,0x58,0xad,0x8e,0x7d,0x33,0x30,0x66,0x89,0x35,0x89,0x36,0xa3,0x72,0xd5,0x19,0x0b,0x24,0xec,0x7f,0x9b,0xde,0x74,0x9c,0xb8,0x11,0x50,0xef,0xda,},{0xfd,0x35,0xa7,0x5f,0xe5,0xab,0xc2,0x01,0x04,0x69,0x1a,0x24,0xa4,0x65,0x94,0x40,0xb5,0x5a,0xea,0xea,0x90,0x2a,0xc3,0xbe,0x27,0x4a,0xf2,0x7a,0xa8,0x31,0x28,0x69,},{0x81,0x67,0x0b,0x10,0x29,0xe4,0x81,0xe9,0xff,0x3c,0x17,0x1f,0x05,0xc1,0x68,0x61,0xc8,0x46,0xee,0x79,0xcd,0xf2,0xe2,0x1e,0x3b,0xf9,0x52,0xbc,0xfa,0xc9,0x75,0x65,0xf2,0xb1,0xdc,0xed,0xf6,0x9d,0x2e,0x7e,0xb3,0x5c,0xaf,0x56,0x62,0xe8,0xbc,0x67,0x1f,0xbb,0x96,0x75,0x6a,0x63,0xa5,0x96,0x26,0x4d,0x1b,0x7f,0x4a,0xf9,0x7e,0x06,},"\xe8\x7a\xe0\x73\xff\x5d\xcc\x54\x85\xa1\x99\x40\xe4\xe3\xff\x26\x3a\x06\x18\xa9\x02\x5a\xd4\x03\x2d\xfb\x36\xd1\x71\xce\x88\x1f\x71\xc1\x8a\x49\x21\x0e\xb4\x58\x19\x80\x61\x42\xe2\xf0\x0d\xb3\x04\x18\x35\xbf\x2c\x3b\xcc\xf1\xdb\xa0\x2b\x8b\x5a\x5b\xda\xf8\xfe\xa3\x16\xc0\x62\x3d\xd4\x8a\x56\x4e\xc1\x66\xf0\x37\xd5\x87\xc8\xc0\x16\x84\xe5\xe5\xc0\xba\x9d\xba\x4d\x23\xb4\x9a\x03\x09\x24\x4e\x28\x2a\x51\x40\x86\x22\xed\xb0\x57\x04\x74\x7e\x0c\xde\xec\x97\x68\x93\x77\x70\x71\x09\x89\x72\xc1\x13\xa8\xab\x63\x9c\x31\xf1\x61\x32\x33\xee\x46\x0e\xea\x8a\x8c\x10\xe1\xe6\xe1\x52\x21\x45\x29\x87\x8c\xf1\xad\xae\xaf\x78\xcf\x19\xba\xc7\x13\x61\x81\x5b\xf5\x79\x55\x49\x8f\xab\x4f\x0f\x2b\x75\x86\xc8\x6f\x9f\x4c\x2d\xdf\x89\x72\xf9\xb9\xe0\xeb\x63\x6d\x84\xbc\xc1\x43\x85\xb2\xd0\x38\xbe\x55\xa9\x63\x70\x2e\xfe\x22\x5a\x50\xbd\xd0\xc4\xda\x92\xa2\xa6\xa0\x91\x00\xea\x04\xa2\x11\xd3\x96\x45\x8d\xce\xb4\x48\x71\x16\x83\x7d\x13\x9e\xb0\xf1\x22\x53\x8e\xd3\x98\x6a\xd0\xaf\x4d\xa2\xdf\xfc\x89\xf3\x26\x9c\xa8\x85\x38\x08\x6e\x69\x1e\x5b\xea\xe9\x58\x1e\x7c\x63\xd8\xe6\x12\xda\x2c\x47\xf7\x4d\xde\x1d\x94\x95\x1e\xad\xb0\xdf\x60\xc3\x89\x7d\x2a\x30\x95\xc5\x06\x09\x3b"}, +{{0x61,0x59,0x4e,0x24,0xe7,0x5f,0x99,0x6b,0x4f,0xb6,0xb3,0xe5,0x63,0xf6,0xa4,0xf9,0x91,0x5c,0xfa,0x65,0xdd,0xb1,0x99,0xb0,0x1f,0xed,0x7f,0x8e,0xd7,0x82,0x4e,0xcb,},{0x86,0x27,0xd2,0x14,0x15,0x79,0xcd,0x25,0x21,0xaa,0x07,0x68,0x00,0xac,0x35,0x4b,0x9e,0x3a,0x47,0xd7,0x1c,0xed,0xc8,0x54,0x74,0x34,0x26,0x82,0x25,0xe3,0x30,0x05,},{0x63,0x02,0xb3,0xff,0x27,0x10,0xbe,0x30,0x6c,0x92,0xb9,0xaa,0xe3,0x0d,0x23,0xc3,0xd4,0xbe,0xff,0x39,0x4e,0x63,0x20,0x1e,0x6a,0xd1,0x17,0x13,0x34,0x5c,0x4f,0xcb,0x5c,0xc8,0xd3,0xdd,0x10,0xad,0xfb,0x82,0xbb,0x11,0xa1,0x89,0xce,0x7e,0xc3,0xe4,0x22,0x27,0x27,0x62,0x4f,0xc1,0x78,0x81,0xc1,0x47,0x88,0xd2,0x71,0x0e,0x16,0x08,},"\xbc\x01\xb0\x8c\x7c\xaa\x23\x61\x00\xa0\x12\xa7\x26\x47\x7d\x0e\xc3\x89\xdb\xfa\xda\xc7\x3d\x51\x06\x42\x4c\x5d\x1f\x3d\x1c\xef\x16\x95\xcf\xd9\x3a\x70\x62\xec\x8b\xf1\x06\x70\x47\x85\x49\x20\x16\x2f\x65\x13\x57\xbe\xdf\x1c\xd5\xa9\x2e\xc2\x9b\xdb\x5d\xff\x71\x6e\x8f\x60\x25\x51\x5a\x95\x49\xba\x36\xcd\xc3\x5c\xed\x7c\x5c\x0c\x36\x8e\x6c\xd9\x2f\x2f\x10\xae\x14\x6a\x20\x72\x8c\x37\x4b\xba\x50\x96\x41\xce\x88\xcb\x42\xff\xf0\xce\xdf\xd9\xfd\x67\xf3\x10\xf9\xd0\x1a\x3f\x36\x90\xeb\x21\xdb\x17\xbc\xe6\x7a\xe3\x5c\x4c\xd2\x4c\x20\x9f\x09\xf0\x44\x75\x9d\x8d\x5a\x7d\x24\x8e\x2b\xd9\x66\x52\x4b\xa8\xc0\xc2\x89\x74\x72\x6b\x43\xbd\x05\xde\x84\x34\x33\xcc\x40\x05\x98\x92\x29\x74\x62\x3d\x9a\xcb\xfd\xc7\x61\xc4\xc0\x43\x75\xa9\x52\xce\x54\xca\xff\xaa\x96\xac\xff\x6d\x9d\xc2\x78\x74\x2a\xf4\x76\xe1\x86\x5c\xb8\xc2\x0d\x13\xd1\xc1\x90\x08\x63\xbc\xa2\x31\xe4\x4c\x6b\x0d\x47\xcb\x41\xd5\x10\xf7\x95\x8f\x48\xf3\x04\xd0\x3d\xa0\x33\x48\x4a\x3e\x1f\x27\x3f\xaf\x69\x83\x37\x5b\x7d\x3b\xe0\x3d\x8a\x0a\x00\x2d\xef\x63\x65\xbe\xb2\xfa\x8c\xcf\x1a\x94\x98\x7a\xdc\xd3\x3d\x0d\xa1\x17\x7f\xc5\x15\x9b\x6e\x56\xd0\x04\x30\x1e\x92\x1d\xbc\x12\xec\x0a\x73\xf4\x13\xcf\x2c\x48"}, +{{0x54,0xe6,0xbb,0xfb,0xf8,0xc0,0x6f,0xf2,0xc0,0x66,0x31,0x8c,0x2e,0xbf,0x03,0xd5,0x06,0x54,0x7b,0xf4,0x3c,0x2d,0x7a,0x5d,0x4d,0xf3,0x05,0xa3,0x03,0x2b,0x71,0x38,},{0x3b,0x71,0xaa,0x1d,0xef,0x66,0x6d,0x91,0x88,0xf4,0x03,0xf8,0x2e,0xd3,0x04,0x54,0xab,0xa5,0xbc,0x9f,0x47,0x0f,0x6e,0xb9,0x88,0xda,0x18,0x7c,0x92,0x52,0x32,0x84,},{0x3d,0xf4,0xd0,0x90,0x79,0xf8,0x30,0xe3,0xf9,0x82,0x28,0x36,0x81,0xba,0x37,0xb5,0x0f,0x3c,0x73,0xde,0x2c,0x5d,0x22,0xa2,0x91,0x35,0x8e,0xbb,0x1f,0xb8,0x54,0xe5,0x10,0xf6,0x3f,0x9a,0x48,0xe9,0xff,0xf7,0xfd,0x83,0x11,0x30,0x2e,0xa3,0xe9,0x69,0x39,0x4e,0x6d,0x49,0xc9,0xe3,0x18,0x20,0x54,0x94,0x2f,0x6a,0x74,0x4c,0xee,0x03,},"\x03\x18\xd7\xcb\x48\x05\xaf\x98\x21\xdd\x3f\x91\x4b\x0e\x07\x6f\xea\x04\xa7\xd2\xdb\x3a\x59\xa0\x0a\xff\xea\xd3\x32\x5a\x2b\xe4\x0c\x1f\x87\xf5\x32\x76\xa8\x55\x26\x04\xf2\x28\xb9\x76\xe2\x88\xb9\xbe\x90\x6a\x7b\xd2\x5b\x2f\xfa\xb8\xa8\xaf\x5d\x0f\x6e\x08\x78\x6f\xd0\x34\xe2\xfe\x1e\xb7\xee\x03\x39\x79\x86\x0d\xd1\xe5\x32\x72\x87\xe9\xe6\x15\xf5\xdc\x5a\x96\x0f\x17\x02\x6b\x56\x84\x2f\xc8\xd4\x4c\xad\x00\x2e\xdc\x85\x01\xcf\xb9\x56\x00\x15\x02\xe4\xdd\xc8\x1a\x77\x00\xd9\xc0\xbe\x88\xeb\x4a\xaa\x64\xa6\xcb\xc3\x9d\xe8\x2f\x13\xc1\x10\x86\xde\x1a\x42\x70\xd3\xaf\x97\x28\x4b\xac\x1c\xae\xf1\xd3\xed\xaa\x10\x71\x66\x6b\xd8\x3b\x2e\xde\x39\x62\xd9\x8b\x9d\x93\x49\x7d\xdf\xd8\xe9\x7d\xab\x30\x89\x95\x0c\xf3\x0e\xd1\x1d\xb7\x7a\xd1\x43\x7a\x0a\xf5\x88\x9d\x8e\xfc\x44\xe6\x12\x42\x0e\x39\x07\x26\x7d\xf3\xac\xff\x4b\xd3\xfb\x6e\x8c\xa5\xba\xdf\x8e\x72\xf9\xde\x39\x52\x86\x53\x05\x85\x24\x45\x6a\x81\xda\x5f\x84\x98\x2a\xfa\xc3\x4b\xef\x5f\x71\xe9\x1f\x8f\x90\x93\x8a\x6f\x5f\x1f\x28\x77\x16\xde\x56\xa0\x94\x6d\x26\x1e\x87\xbc\x77\x5c\xe1\x89\xe4\x1a\x77\xba\xed\xe7\x32\x0a\x3c\x60\x8f\xc9\x71\xe5\x5d\x0a\x77\x3c\x4d\x84\x8d\x42\x86\x37\xf1\x1b\x4e\x44\x60\x39\x0c"}, +{{0x68,0x62,0x06,0x1b,0xe0,0xde,0x9d,0xfd,0x99,0x81,0x18,0x20,0x4b,0x2b,0x98,0xdb,0x3c,0xe7,0xd7,0xe8,0x19,0xdb,0xc1,0x07,0x94,0xaf,0x0a,0xb2,0xb0,0x6e,0x84,0x34,},{0x9c,0x5f,0x7c,0x22,0x65,0xdd,0xe1,0xb2,0x5e,0x4f,0x27,0xec,0x71,0x58,0x0d,0x52,0xdc,0x89,0xf2,0xc3,0xa7,0x12,0xbc,0x1a,0xd5,0xd6,0xd6,0x9e,0x71,0x1e,0x08,0xd4,},{0x96,0x5e,0xdb,0x34,0xe8,0xab,0x8b,0xc3,0x20,0x4a,0x32,0x01,0xd2,0x21,0x86,0x37,0x2d,0xe4,0x24,0x26,0x00,0x29,0x7c,0xfd,0xb5,0x7a,0xa1,0xdf,0x07,0x4e,0xc5,0x0d,0xdf,0x10,0x10,0x5e,0x9d,0x4c,0x89,0xa2,0x66,0xc3,0x4d,0xb7,0x77,0x2a,0xa9,0x4c,0xba,0x94,0x64,0x29,0xe6,0x8b,0xa6,0x2b,0xf9,0xa0,0xac,0x90,0xf5,0xf0,0x5b,0x02,},"\x17\x40\xdd\xe8\x43\x4a\x0d\x68\x99\x25\x67\x9b\x0c\x18\x03\x00\xcd\xbd\x0c\xf6\xa8\x9a\xd8\xfd\xe3\x46\x53\x31\x6c\xee\x4c\x57\x1a\x41\x05\xc9\xe9\xe0\x28\x42\x38\xfe\xf2\xc3\x8a\x09\x15\x7c\x5d\xb9\x43\x40\x57\x1b\x39\x0a\xdf\xb6\x9f\xf4\xc0\xdc\x50\x53\x25\x3a\x67\x9d\x42\xcc\x1f\x1b\xf1\xff\x42\x92\x29\xea\x0a\x50\x44\xc6\xf7\x95\x64\xe0\xdd\x28\x7f\x53\xf0\x15\xb8\x31\x87\xd9\xad\x27\xd9\x10\x39\xaf\x06\x2c\x43\x7b\x15\x75\xa0\xea\xb6\xae\xb8\xaa\x0d\x27\xb2\x76\x65\xd6\xde\xa9\x04\x1f\xf9\x96\x3a\x31\x18\xb3\x29\x8a\x85\x44\xe3\xfd\x69\xac\x68\x77\xe3\xe4\x05\x2f\xe4\x42\x2b\xf0\x35\x60\xb2\xc5\x7e\xc5\x31\xee\x8b\x5f\xf5\x3c\x28\xdb\xde\x35\xbb\x45\xc3\x50\x77\x63\x6e\x6f\x84\x1b\x59\xd7\xeb\x77\xbc\x77\x91\xb6\x09\x38\x58\xa3\xa8\x0a\x3a\xa6\xd7\x78\xdb\xf5\x3d\xb9\xd0\x61\x19\xc5\x0b\x71\xc7\x91\xc0\x49\x5c\x57\x6d\x1b\x59\xd3\x96\x87\x3e\xd8\x71\x48\x53\x52\xc8\x29\x9a\x35\x9d\xa5\xee\x9d\x7f\x36\xed\x14\x55\xf8\x98\x51\xa3\x08\x51\xbe\xa7\x19\x68\x5a\xec\xd0\x8f\x25\x56\x26\x09\xdd\x10\x66\x30\x73\x52\x77\xe1\xd6\x51\x9b\xb1\x68\x7d\xe8\xb8\xc6\x8b\x96\x71\x45\x2e\xdb\xb3\x49\x1d\xa2\x64\xcd\xfa\x00\x17\xc5\x12\xd2\x76\x97\x59\xcb\x92\x5f\xb6\x64"}, +{{0xb2,0x25,0x0b,0xbc,0xb2,0x68,0xd2,0x47,0x7c,0x83,0x12,0xb1,0x90,0x0f,0xd9,0x99,0x82,0xba,0xa2,0x9a,0x68,0x97,0x4f,0xbf,0x87,0x78,0xa1,0x22,0x8d,0xc9,0x75,0x50,},{0x44,0xaa,0x8d,0xf1,0x18,0x16,0x74,0xb0,0x5a,0xde,0x98,0x0f,0x7e,0xdd,0xba,0xf3,0xbd,0x74,0x22,0xa9,0x20,0x28,0x7c,0xb2,0xd2,0xdb,0x59,0xa0,0x63,0xee,0xbf,0x74,},{0xf2,0xb8,0xd9,0x2e,0xd5,0x1e,0xbd,0x10,0x00,0xbf,0x9d,0xd3,0x41,0x1a,0x9f,0xa9,0xe7,0xae,0xe5,0x4c,0x4c,0x86,0xe2,0x4a,0xd0,0xf9,0xad,0x5c,0x55,0x64,0x3a,0x12,0xd6,0x80,0x01,0x9c,0xa0,0x3f,0x21,0x6b,0xd4,0xbd,0x32,0xc9,0xce,0x1c,0xd8,0xa5,0x28,0xc3,0xff,0xaa,0x5d,0x5b,0x1d,0xc9,0x1a,0x4b,0xe5,0x6f,0x0e,0x2c,0x5e,0x06,},"\x7e\xf0\xae\x13\x36\xa6\xfa\xb3\x7f\x99\xda\x5f\xa7\xd0\xde\xc7\x40\x9c\x07\x26\x23\xea\xd8\x4f\x24\x1d\x53\xd0\x59\x6b\x46\x17\x05\xfb\x1b\x3c\x53\x7d\x36\xb8\x9e\x89\x60\xfe\xbb\x4c\xdc\x0d\x42\x7c\xe2\xfc\x1b\xe5\x8d\xbb\xce\x15\x1e\x35\xac\xd8\xb6\xac\xe4\x0a\x19\x82\x29\x14\xa4\xbd\x8c\x4a\xf6\x32\xf1\x36\x41\x8a\xc4\x9b\x18\x4d\x55\x19\x3e\xbc\xc3\x2d\x0d\x79\x87\x09\xb1\xa8\xfe\x29\x4f\xba\x8a\x1f\xe7\x2d\x97\x6b\x44\x00\xd4\xa3\x93\x24\x23\x11\xb0\xf8\xcc\x99\x4e\x89\x47\x5b\x00\x38\xae\x5d\x89\x14\x93\x8e\x8f\x6e\x87\xc6\xf5\x0b\x9d\x65\x6c\x45\xd7\xb1\x42\x31\xef\xed\x97\xf3\xc9\x06\x68\x91\x36\x70\xbf\x5b\xe2\xef\xd5\xc2\x70\xc7\xcb\xaf\x01\xe8\x57\x2e\x98\x00\x97\x8d\xfe\x2e\x10\xa2\xfc\x04\x40\xb8\x55\x62\x9b\xf9\xcd\x40\x9e\xa9\x41\xcb\x69\x22\x6c\xac\x77\x1b\x15\xea\x77\xc0\x32\x68\x48\x80\x6f\xf8\xd2\xe2\x01\xe6\xe2\x6c\xd5\xf4\x54\x30\xda\xdc\xff\x8f\x59\xc3\x21\xc1\xc9\xc6\xa2\x9b\x94\x88\x29\x35\x44\x7d\x3e\x6c\x2e\x88\x04\xb1\x16\x15\x76\xbd\xf0\x32\x0f\xe5\x3c\x30\x7d\x9c\xde\x42\x60\x77\xa7\x67\x7c\xde\x3c\x1b\xc8\x3e\x18\xe6\x0a\x0c\x4e\xe6\xdc\xcd\x87\x7c\x21\x3a\x8e\x4c\xca\x64\x0e\xe0\x49\x29\x80\x45\x70\xae\x1f\x96\x15\x7c\x04\x35\x7a"}, +{{0xb8,0x09,0x36,0x1f,0x55,0xcf,0xe8,0x13,0x7f,0xbd,0xa8,0x80,0xfc,0x62,0xcb,0xe4,0x4c,0x21,0x6e,0x14,0x18,0x93,0x34,0x63,0x02,0xb3,0x36,0x04,0x5d,0xe2,0x18,0x78,},{0xfd,0x23,0xe4,0x2f,0xf0,0x66,0x44,0xea,0xd3,0x47,0xab,0xcc,0x1b,0x3e,0x03,0xb0,0xe8,0x85,0x93,0xb6,0x12,0x54,0x98,0x1d,0xd8,0xae,0x59,0x45,0x4e,0x61,0xb3,0xe0,},{0xb5,0xb5,0x95,0x0d,0x37,0x72,0xd2,0xee,0xf8,0x8e,0x1b,0x0f,0x5d,0xf5,0xff,0xae,0x2f,0x21,0x03,0x88,0x5e,0x71,0x44,0x6d,0x34,0x6f,0xbb,0x5d,0xae,0xf9,0x49,0x67,0xa6,0xb7,0xb6,0xe4,0xbe,0x88,0x51,0x10,0x06,0x58,0x76,0xc6,0x65,0xb7,0x81,0x2d,0xe4,0x6a,0xd3,0x1e,0xc3,0xbf,0xcb,0xea,0xee,0x13,0xed,0x0c,0x1e,0x0b,0x30,0x0e,},"\x17\xac\xe1\x97\xd0\x83\xaa\xf1\x72\x6f\x53\xe5\xef\x81\xb5\xa8\xc0\x92\x22\xf2\x60\xee\x5f\x1f\x54\x04\xab\x78\xd9\x00\xd4\x89\x68\x84\x49\xb8\x43\xba\xd3\xc4\x98\xaa\xc6\xd8\x0b\x46\x39\xb7\x6e\x6e\x81\xc5\x52\x76\xa6\xf9\xc7\xce\xcd\x70\xb7\x1a\xaa\xf2\x01\x8e\xf7\x6c\x0e\x30\x15\x4a\xae\x86\xa5\xc8\x6d\x4e\x8d\x0e\x4e\xc6\x8c\xc4\x27\x06\x0b\xd5\x65\x14\xf7\x23\x80\x86\xbb\xef\x5b\xfc\xa1\xf5\x67\x1b\x18\x04\x18\x38\xfd\x01\x35\x72\x44\x3d\xba\x48\xfb\xdd\x95\xca\x74\x0b\x0d\xaa\x43\x27\x16\x4a\x1e\x34\x67\x72\x49\x70\x8f\x77\xbd\x79\x3e\x7c\xaa\x66\x38\xb5\xdc\x9f\xbe\x6f\x0d\xfd\x41\x20\x20\x90\x97\x20\x9c\x93\xce\xdf\xaf\x21\xb6\xbf\x59\xca\x6e\x99\xe6\x20\x96\x39\x44\x4f\x0e\x82\x7b\xbc\xc0\xa6\x1c\x3a\x23\x7c\xa2\x2a\x28\x32\x13\x22\x3a\xb6\x58\xe7\x12\xc7\x55\x62\x38\xd3\xa5\xfe\x31\x72\x2d\x65\xf5\x70\x6e\xf6\xd6\x4d\x73\x23\x2d\x30\x43\x22\x0f\x14\xe5\xcf\xd3\xc2\xc8\x3a\x83\xd6\x8e\x20\x27\x4b\x6f\x96\xb2\x9d\xe0\x40\xce\xc8\x47\x50\x30\xb6\xa8\xa8\x7d\x29\x80\x8d\xd3\x81\x79\x5c\x3d\x22\xac\xf5\xdc\x19\x3b\x72\x0d\x95\xa7\x52\xd9\xf1\x23\xc2\x09\xff\xba\x00\x4e\x48\xdd\x06\xdd\x8c\x9e\x17\x2b\xc9\xe0\x87\xd8\x0b\xc5\x21\x6c\x0b\x0b\x6e\x77\x03\x12\x41"}, +{{0xee,0xef,0x80,0x74,0xc2,0xeb,0x9a,0x1c,0xee,0x2f,0x2d,0x3b,0xb0,0x53,0x25,0x54,0x6a,0x9f,0xb7,0xcb,0xe4,0x4b,0x59,0x94,0x61,0xfc,0x58,0x85,0xf5,0xfd,0x9c,0xac,},{0x9b,0x89,0x29,0x41,0xa0,0x57,0x3b,0x7a,0x16,0x73,0xef,0x48,0x0f,0x08,0x11,0x68,0xd9,0xb7,0x49,0x6a,0x81,0xf9,0x17,0x7d,0xc4,0x27,0xca,0x1f,0x84,0xcb,0xbf,0x7d,},{0x6f,0x71,0x01,0x98,0x4f,0xd6,0x89,0x2e,0x21,0x44,0xb7,0xd4,0x56,0x19,0x83,0x0c,0xae,0xb6,0x71,0x3b,0xfa,0xb4,0xee,0xbb,0xe2,0x17,0xc5,0xbe,0xcd,0x24,0x9b,0xd9,0xd7,0x52,0xeb,0x76,0xe9,0xfa,0x99,0x5e,0x7c,0x71,0xff,0x7d,0xf8,0x6b,0xb2,0x60,0xcd,0xda,0x17,0x3f,0xf5,0xde,0xec,0x6a,0xf2,0x04,0xb7,0xdd,0xe0,0x11,0xde,0x09,},"\x9a\xe3\x9f\xea\xde\x90\x5a\xff\xcb\xed\xd2\xe7\x2a\x6f\x24\x29\xb3\xd1\x10\x8e\x5b\xc1\xa9\xdb\xaf\x49\x0a\x62\x99\xbc\xcd\x94\xac\xc4\x13\xad\xac\xc9\x18\xb1\x4a\xfa\x85\xc7\x8b\xc1\x68\xcc\x00\x74\x0c\x3d\xa0\xe0\x81\x83\x91\x5f\x79\xb7\xfe\x38\x68\xce\x2a\x7e\x88\x6b\x32\xad\x45\x00\x98\x05\xbf\xb8\x1b\x8c\x07\xb3\xb1\x02\x24\x20\xc0\xf0\x09\xb8\x89\xd7\xfc\x22\xfd\x19\x97\xae\x34\x19\x84\x38\xca\x94\x77\x85\x75\x12\x2f\xca\xaf\x96\xe6\x50\x2c\x33\xa7\x5a\x12\x9a\x2d\x0d\xbb\x07\x3d\x93\x82\x0d\x9c\x96\x68\x3d\xb3\x18\x99\x0b\xe3\xfe\xf4\xca\xfc\x89\x0a\xfb\xd9\xb1\x50\x4c\x74\x39\xa0\x8a\x06\x5e\x78\x14\xee\x4f\x9b\x6f\x57\xee\x16\xba\xed\x3f\x0e\x3a\xa3\x5d\xd2\x3d\x35\x28\xa4\x58\x91\x9a\xd7\x70\x48\xb4\xe2\xe6\x17\x23\x46\xbe\x24\x9a\x50\xaf\x02\xbc\x6c\x85\x33\x04\xc2\x08\xae\x0b\xa0\x27\x71\x26\x2a\x0d\x8a\x46\x5f\x71\xfa\x06\x35\xe5\x3e\xb2\xef\x0a\x84\x7d\x56\xa0\xbc\xd7\xdd\x3f\xe0\x77\xc9\x2b\xcd\xca\x30\x69\xa4\xa6\x82\xa2\x85\x99\x28\x31\x5c\xe3\xeb\x44\x5c\x60\x72\xa7\x14\x92\xee\x82\xe1\x72\xa2\x0b\xe0\xb6\x48\xb7\x56\xe6\xc7\x75\x37\x6f\x0c\x7c\x3d\xf8\xe6\x42\x88\x08\x9c\x2f\x81\xce\x95\x93\xc6\xe0\x8b\xb1\xcc\x1b\x27\xfc\xbd\x39\x2f\xc7\x95\x2c\x55"}, +{{0x61,0xfa,0xeb,0x15,0xf8,0x57,0xf6,0x55,0x78,0x62,0xc8,0xb8,0xc7,0xef,0x41,0xf8,0x05,0x45,0x52,0x09,0x96,0xfc,0xc1,0x12,0x7b,0x8c,0x24,0x91,0x82,0x22,0x01,0xae,},{0x60,0xa2,0x90,0xc0,0xfc,0x42,0x5a,0x08,0x74,0x67,0x3d,0x94,0xf9,0xbb,0x14,0x00,0xf9,0xda,0xcd,0xe9,0x95,0x4f,0x9f,0x5b,0x05,0xdd,0x48,0xab,0x74,0x7a,0x39,0x50,},{0x31,0xf9,0x0f,0x50,0xb2,0xdc,0x70,0x5f,0x1d,0x92,0xf1,0x2c,0xa9,0x97,0x5d,0x76,0xf1,0xb2,0x82,0x6a,0xda,0x3c,0xc1,0x85,0xb0,0xed,0x6c,0x83,0x86,0x07,0x77,0xbd,0x8c,0x48,0x9b,0x59,0x85,0x5a,0x91,0xf6,0x48,0x39,0xd4,0x9b,0xa4,0x67,0x98,0x5a,0xbb,0x37,0x6c,0x47,0xa4,0x90,0x8b,0x27,0x1b,0x8f,0x77,0xc5,0x8d,0x01,0xfd,0x04,},"\x25\x3b\x56\x6e\xcc\xb5\x63\xbd\x6e\x48\x0c\x69\x73\x9b\x8e\x37\x25\x19\xa3\x43\x72\x54\xe0\xe5\x02\x9c\xac\x86\xc7\x16\x38\xf2\xdf\x2a\x6c\xf9\xe5\x6d\xb2\x56\x99\x34\xde\xba\x90\xdb\x75\x54\x7e\x36\x71\x74\x7d\xf6\x4d\x6f\x2a\xaf\x3c\x11\x0f\xa6\x7a\x70\x94\xcc\xbe\x4c\xc5\x35\x5f\x0d\x43\x23\x51\x36\xee\x26\xdb\xe3\x7f\x42\x25\xd3\xbb\xfe\x24\x55\x95\x28\x05\x85\xfb\x54\x8f\x89\x4e\x86\xc5\x16\x10\x25\x80\x29\x1f\xa7\xa0\x28\x59\x55\x7f\xb9\x8e\xb5\x88\x87\x08\x28\xb0\x99\x0a\xe9\xd7\x4f\x38\x31\xda\x58\x94\x6b\xc7\xa5\xce\x1b\xa4\x98\xb4\xe8\xbe\x89\x89\xa3\xb5\x0d\x7e\x87\x89\xf5\x6b\x8b\x4f\xec\xbc\x2a\x33\xbf\xa3\xef\x59\x1a\x0f\xbc\xd9\x32\xfa\x93\xe1\x9f\x3a\x81\x2a\xe5\xe4\xe3\xb4\xb2\x42\xbe\x77\x05\xa5\x87\x4a\xf7\x3b\xe3\x10\xb0\x05\x82\x66\xa3\x78\xf2\x3c\x13\x48\x52\x47\x15\xb0\xcc\xc1\x8d\x66\x34\xb2\x36\x36\xc3\x16\xba\x6a\x1d\xd2\xfd\x50\x92\xc0\x67\x16\xa7\x17\xb5\x4d\x0e\xb9\xfc\x7f\x63\x6f\x85\xbb\xf2\x25\xa2\xcf\x03\x5b\x4b\x7c\xfd\xdd\x75\x35\x16\x82\xc0\x57\x6c\x6b\x3b\xa5\xa1\xc0\xb2\x5e\xc5\x94\xe7\x70\x9d\xd0\x9a\x00\x79\x77\x2f\xf3\xac\xc6\x7f\xb6\xc1\xb3\x7b\xb3\x74\x2b\x72\x6e\x77\xe8\x05\x61\xd9\xab\x73\x16\x0b\x73\x36\x25\x81\xda\x5b\x9c\x7f"}, +{{0xe6,0xb9,0xcd,0x4d,0xa0,0x7c,0xb3,0x4f,0x30,0x39,0x1c,0xf6,0x8f,0x0d,0x87,0xc7,0xcf,0xcf,0x68,0xf8,0x10,0xff,0xa4,0x0f,0x97,0x39,0xc9,0x5d,0xeb,0x03,0x7f,0x71,},{0x56,0x9e,0xde,0x0f,0x04,0x63,0x0b,0x43,0xa0,0x4c,0x5a,0x66,0xb6,0xa5,0x63,0x6b,0x76,0x6c,0x75,0x96,0x59,0x84,0xa7,0x47,0x7e,0x15,0x49,0x19,0x60,0xfd,0xd8,0x64,},{0x1e,0x37,0x5c,0x94,0xbd,0x80,0x9c,0xa0,0xcd,0xd0,0x2f,0x89,0xec,0xec,0x4e,0x43,0x77,0x32,0xdd,0x20,0xa0,0xa8,0x4b,0x25,0x4e,0xae,0x88,0x9d,0x80,0x70,0xe6,0x82,0xd1,0x13,0xb0,0xbe,0x22,0xe4,0x1e,0x6c,0xdc,0x3b,0xe8,0x77,0x68,0x0e,0x7e,0xeb,0x7f,0x09,0x95,0xe6,0x62,0x2d,0xc0,0xb4,0x34,0xfb,0x09,0x49,0xdd,0x99,0x4b,0x0c,},"\x69\xde\xf0\x52\x3a\xfd\xa6\x96\xf8\x44\x8f\x9c\x11\x43\xab\xc2\x65\x33\xe6\x86\x95\xa0\x90\xdf\x0d\x9e\x43\xd0\xc0\xef\xf4\x35\x83\xe6\xf7\x09\xd2\x04\x3c\x81\x5f\xbb\x3f\x96\xba\x2b\x0d\xc3\xbe\x6f\xec\xad\x5d\xd3\x81\x48\x78\x8e\x4a\x03\x85\xa9\xfe\x7a\x92\x1f\xcb\x8c\xce\xe0\xe4\xd3\xae\xd4\xbc\x3d\x21\x6d\x84\xb4\x14\xf9\x58\x0b\x02\x82\x0c\x03\xd9\x2e\x67\x5e\x68\x5c\x4b\x58\x51\xf3\x63\xbb\x4d\xf9\x7b\x41\x7c\x3f\xd9\x00\x22\xee\xaf\xa2\x0d\xfb\xe8\x29\x64\xf2\xff\x07\x3d\x25\x57\x58\xfb\xe5\x67\xc7\x6b\x2c\x35\xe2\xb0\x9f\x8a\x8d\x7a\xfa\x32\xc6\xf5\xad\x01\xbc\x3e\xbf\x6e\x21\x06\x06\xdb\x03\x8e\xcb\x68\x20\xce\x1e\xa4\xdd\x52\x9f\xc1\xad\xfb\xc2\xa1\x38\x56\x5a\xc6\xd0\xf4\xa4\x10\x9b\xdd\x47\xb8\xaa\x6e\xf4\xb8\xbe\xde\x45\x46\x80\xd1\xdb\xdb\x75\xfe\x1e\xb2\xe5\x48\xd5\xde\x7c\xb6\xd7\x92\xfe\xf3\xaa\x0d\x84\x80\xa6\x03\x0b\x30\xf1\x04\xd7\xe7\x6b\x58\xe9\xf4\x76\xeb\xf2\xcc\x83\x29\x23\xb5\x0c\x50\xc1\x11\xc3\x51\x5f\xc5\x18\x85\x23\x23\x42\x6c\xa7\x78\xa5\x96\xd3\x19\x5d\xa8\x58\x5d\x8c\x3a\xa9\x20\x83\x31\x3a\x6e\x65\x85\xb7\x0c\x98\xb1\x85\xb4\x72\x79\x8a\x61\xcd\xe7\x7e\x62\xec\x27\x2f\x14\xb0\xd9\xeb\x4f\x22\xf9\xc7\xc0\x58\x17\xda\x6f\xde\xfe\x78\x79\xa5\x84"}, +{{0x4d,0x90,0x44,0xf1,0x7b,0x5a,0x09,0x77,0xdc,0x5a,0xa9,0x91,0x6a,0x92,0x43,0x00,0xa2,0x44,0xa1,0xef,0x7f,0x06,0x02,0x77,0xad,0x49,0x78,0x35,0x1e,0xa6,0x42,0x91,},{0xab,0x9c,0x06,0x92,0xa6,0x06,0xb2,0x56,0x7c,0x19,0xc3,0x0f,0x9f,0xaa,0x3b,0x4c,0xfe,0x72,0xfb,0x23,0x70,0x77,0x76,0x7b,0x76,0xd3,0xb2,0xae,0x14,0x90,0xa6,0xd4,},{0x6f,0xa4,0x8a,0xea,0x4d,0x5b,0x9a,0xf6,0x5a,0xf9,0x64,0xcd,0xb7,0x09,0x44,0x3a,0x11,0xfa,0x84,0xf7,0xd4,0x4a,0xcd,0xda,0xb1,0x6e,0x04,0xa6,0xfc,0xef,0xb2,0x7a,0xe3,0x3c,0x05,0xb3,0x6d,0xa1,0x3c,0x23,0xde,0x51,0x7d,0x6e,0x6a,0xc5,0x74,0xa0,0x3e,0xa6,0x30,0xba,0x4f,0xbb,0x95,0x81,0x31,0x12,0x9a,0xa7,0xf1,0x35,0x4c,0x01,},"\x7c\x8c\x71\x89\xaf\x67\x32\x7a\xf1\xc6\xdd\x2c\x30\xe9\x75\xf1\x90\xe3\xb3\x8d\x00\x8b\x45\x85\x16\x7e\x0d\x45\x07\x40\xd4\x67\x34\x58\x7f\x6d\x20\x87\x84\x24\x5c\xc5\xcb\x06\x2a\x2a\x27\x7f\x17\xeb\xb2\x74\x6f\x9b\xdf\x4a\x82\x37\xca\x47\x9a\xb0\xa4\x30\x17\x7e\x19\xed\x7d\xd3\x62\x25\x76\xb1\x4c\xdc\x08\x28\x22\x14\xfe\x5e\xe4\xd7\x6b\x43\xc1\x6a\xc9\x08\x64\xc5\x1b\xe8\xae\xd4\x5d\x7b\x98\x0d\xf7\x91\x7f\x29\x0f\xdf\x79\x58\x46\x46\x5f\x27\xfc\xb7\xe5\x73\x06\x37\x94\x4f\x05\x77\xc9\x2f\x32\x37\x5e\x99\x5b\xc0\xcd\xa9\xd7\x19\x6f\x2c\x0c\x1a\xc8\xb8\x0d\x12\xa0\x43\x99\x63\xeb\xd2\x25\x4c\x34\x77\x03\x57\x58\x16\xe7\x96\x4c\x13\xd4\x4d\x62\x92\x80\xc3\x12\xea\x26\x53\x44\xde\x38\xf3\xb1\x8d\x91\x50\xf8\xf9\x24\xaf\xb4\x4b\x6b\xfb\x9e\xda\x51\x3d\x59\xe6\x5e\x2e\xf1\x86\x66\xe6\xc2\xa2\x1c\x40\x18\x66\x5b\xef\xe9\x2c\xae\x58\x1d\x3c\xb1\x4e\x23\xe9\x7d\x83\x00\x02\xcb\x90\x93\x1a\xe0\x21\x00\x68\xaf\x39\x4e\xbe\x35\x1b\xe5\xb8\x17\xf3\x67\x4b\xfb\xf4\x00\x49\x03\x0e\x4f\xe5\x05\xd3\x4a\x1d\x50\x2a\x2c\x50\xd8\xe6\x38\xe9\x26\xc2\x30\x67\x6b\x7e\xde\xfb\x6b\xec\x77\xb1\xc0\xce\x60\x93\x25\x28\x7b\xa5\xfd\xd7\xa9\x97\x69\x87\xbd\x07\xfc\x6a\x43\x44\x95\x6e\xbf\x81\x8f\x08\x58\x6c"}, +{{0x75,0xad,0x76,0xbb,0x4c,0x0c,0x22,0x9a,0x5a,0xdc,0x79,0xe4,0x44,0xb1,0x3f,0x88,0xa9,0x64,0x59,0x86,0x2c,0x8c,0xf0,0xba,0x49,0x8d,0x0c,0x99,0x6a,0xf9,0x4a,0x7a,},{0xf0,0x74,0xdd,0x2b,0x9c,0x1c,0x30,0x91,0x05,0xec,0x95,0x1b,0xb5,0x81,0x2a,0x91,0xdd,0xb5,0x40,0x23,0xb3,0x80,0x9a,0xb3,0x79,0xc5,0x6a,0xf0,0x46,0x1a,0xf6,0x17,},{0x0c,0x46,0x43,0xa8,0xbe,0x6d,0xc2,0x2f,0x4b,0xeb,0x6b,0xcc,0x70,0xc6,0x17,0x2e,0xc7,0x60,0x83,0x78,0x65,0x3c,0xb4,0xe9,0x9f,0x3a,0xe7,0x95,0xea,0xdf,0x4e,0x98,0x2a,0x29,0x76,0x09,0xca,0x79,0x38,0xf5,0xdf,0x63,0x2b,0x09,0x56,0x28,0xcb,0x75,0x06,0x2d,0x3d,0x51,0xfc,0x0f,0x33,0x23,0xbf,0xa7,0xb2,0x2e,0xc4,0xd4,0x72,0x05,},"\x0c\xa8\xc1\xc7\x41\x28\xd7\x4e\x9d\x0a\x7b\xf8\x96\x42\x91\xd0\x74\x91\x7f\x2f\x99\x20\xef\xb9\x11\x52\x05\x67\x64\x2a\x50\xa6\x15\xab\xcb\xd0\x0a\xed\x4a\xbb\xfe\xf1\xa9\x83\xcc\xe3\x33\xe1\xd0\xdf\x3e\x64\x04\xfb\x90\x43\xc6\x80\x39\x14\xcd\x5f\xff\xbc\x66\xa0\x79\x0c\x78\x78\xa2\x40\x89\xa5\x71\xf8\x95\x66\x2a\x1d\x18\xbe\x3f\x01\xff\x97\xfb\x33\x23\x33\x4b\x6f\x5b\xaf\x96\x55\x14\x48\xe4\x09\x0d\x03\x3c\x46\x42\x94\xd0\x91\x33\xb1\x51\xd5\xb5\xc6\x32\x1b\x50\xe2\x24\x1d\xe0\xef\x6f\x88\x28\x89\xcc\xf4\xad\x35\x40\xd5\xa1\xe3\xf7\x54\x8f\xb1\x3b\xe7\x1c\x16\x51\x66\x06\xe7\x9d\x04\x49\xc2\xa0\x8e\x5d\xc2\x31\x48\x84\x3c\x84\xe9\x7e\xd2\x40\x69\x16\x1c\x8e\x75\x20\x8f\x33\xe9\x5b\x3e\x10\xd1\xd4\x9a\x2f\xae\xf9\xd9\x86\xab\x62\x80\x9f\x62\xad\x39\xc7\xcc\x87\x1f\x37\x5a\x4f\x5a\x6f\xaf\x10\x4d\x7e\x11\xb8\x90\xcf\xb0\x58\x99\x02\x68\x52\x16\xec\x07\xcb\x8e\x8e\x9e\x7a\x7c\x43\x63\x5e\x23\x21\x2b\x69\xca\x3b\x7e\xd5\x4f\x0b\x97\x94\x9e\x3d\x9a\x66\x62\xf8\xe4\xb3\xab\x09\xcd\x49\x52\x94\xc3\x31\xc0\x47\xd8\x6e\xe7\x85\xff\x65\x8b\xcd\x7f\xcf\x9c\x48\x06\x05\xce\x05\xe8\x10\x06\x8d\x60\xfc\x9b\x26\xb5\xf0\x63\xeb\x90\x00\xd2\x65\x7a\x50\x94\x28\x4a\xc8\x0f\x13\x75\xd0\xb6\x6d\x6f\x5f"}, +{{0xad,0xc6,0xe9,0xb2,0xe1,0x03,0xb6,0x2c,0x24,0xad,0x43,0x46,0x41,0x0e,0x83,0xa1,0xa0,0xbd,0x25,0x3e,0x4a,0xbf,0x77,0x91,0x18,0x50,0xc6,0xd9,0x66,0x6e,0x09,0xf9,},{0xfc,0xe3,0x16,0xe3,0x3c,0x91,0x08,0x21,0xbe,0xed,0xdd,0x63,0x4b,0xed,0xc5,0x8e,0xe5,0x79,0x99,0xa7,0x6e,0xce,0x38,0x46,0x05,0x28,0x3b,0x99,0xb5,0x43,0xb7,0x8b,},{0xcb,0x01,0x7d,0x6d,0x26,0x82,0xc9,0x85,0x43,0x66,0x25,0x9a,0xa3,0x5f,0x30,0xd4,0x91,0xcf,0xaa,0x93,0x09,0x98,0xc2,0x97,0xdb,0xdd,0xc6,0xad,0xed,0x5b,0x3d,0x40,0x1c,0xf7,0x6d,0x80,0xd8,0xa2,0x76,0x4d,0xe1,0x31,0x71,0x8b,0x6e,0x0c,0x48,0x1d,0x71,0x96,0xbc,0x72,0x57,0x97,0x16,0xb0,0xc0,0xf6,0xff,0x05,0x3e,0x68,0xc5,0x0c,},"\x8c\xcc\xd9\x8e\xbb\xf2\x43\x9f\xfd\xfa\xc4\x16\x87\x63\x8f\xaa\x44\x4e\x1c\xa4\xb6\x3d\x13\xe8\x98\xea\xa8\x35\x54\x92\xf2\x88\x13\xab\x81\x3f\xd0\x15\x10\xe1\x12\xbe\x10\x6b\x20\x45\xd3\x0f\x63\x33\x5d\x24\x89\x04\xd5\x21\xde\x18\x1a\xba\xc0\x3e\x3d\x2c\xb2\xd1\x6c\x44\xb3\xb0\x12\xa0\xc5\x1f\x99\x01\xae\xf9\x05\x6c\x72\x4d\x7a\x2c\x6b\x2a\xcb\x0a\x07\x55\x59\x40\xe4\xc6\xe2\x11\x54\x89\x06\x11\xad\xeb\x64\x89\xf4\x61\xd3\xe5\xec\xd1\xaf\x5a\x4d\x2b\x0a\xda\xf4\x17\x47\x43\x6e\xb4\x14\x75\x7a\x8f\xe4\x77\x56\x74\xe3\xc6\xe5\xde\x45\x69\xd6\xfc\x6c\x78\x8e\x10\x90\x5e\xba\x32\xc2\x70\xa3\x93\xe6\xf7\x21\xa7\x65\x29\x4e\x2a\xc9\x9a\x9b\x6e\x53\x4d\x3d\xf0\x8d\x1d\xb9\x7d\x60\x2a\xc3\x19\x5c\xb0\xb7\x7f\x5b\xd4\xac\xaf\x73\x7f\xad\xd6\x99\x1f\x06\x88\xab\xc7\x49\x18\x04\x75\x74\xea\xc2\x82\x89\x73\x9a\x66\x4e\x0e\x0e\x20\x57\x4a\x2c\x25\xfd\xe4\x9d\x14\x53\x9d\xb1\xce\xdd\x4a\x92\x04\xa7\x0a\xcf\xf0\xa6\x2c\x8f\x25\xcd\x76\x8f\xfa\xb1\x5c\x4d\xb3\x16\x84\x0a\x4d\x1b\xc9\x2e\x21\x26\x70\xbe\x07\xc5\xbd\xcf\x53\x75\x90\x60\x7d\xfb\xbb\xb4\xd9\xf9\x8b\x89\xda\x0b\x4d\xf7\xd8\x8f\x3e\xca\x48\x14\xd1\x6b\xfa\x20\xc8\xd2\xfa\x94\xf9\xf2\x59\xf2\xee\x2d\x3a\x83\xc9\xe4\x17\x1b\x1a\x26\x2c\x4b\x99"}, +{{0x37,0xfc,0x1b,0xed,0xa4,0x06,0x0b,0x6c,0x57,0x88,0x3d,0xdb,0xa0,0x77,0x6c,0x2b,0xcf,0x5a,0xc2,0x8a,0x65,0x13,0x26,0x02,0x1c,0xca,0x97,0x72,0x37,0x30,0xfb,0xb0,},{0x7b,0xd7,0xbf,0x1c,0x99,0xdc,0x82,0xe0,0x6f,0x08,0xbb,0x45,0x4d,0x8f,0xb2,0x88,0xa5,0x79,0x27,0xe0,0x7f,0xf1,0xb1,0x2a,0xf1,0x5e,0xe2,0xc1,0x2f,0xbb,0x6b,0x3d,},{0xa0,0x1d,0xd6,0x5f,0xad,0xa2,0x70,0x39,0xf1,0x68,0xb1,0x23,0x41,0x9d,0x8a,0xbf,0xbd,0xa4,0x8c,0x57,0x2e,0xce,0x24,0xfd,0xa0,0x6e,0x1a,0x5e,0xc3,0x1e,0x08,0x4f,0x4e,0xe1,0xcb,0xf9,0x96,0x1e,0x88,0xed,0x51,0xe1,0x89,0xfc,0xb7,0xf5,0xf2,0x35,0xde,0x1e,0x5b,0x28,0xd0,0x8f,0x2b,0xfc,0xa1,0x90,0xb0,0xf0,0x19,0xec,0xc2,0x07,},"\x3d\xfc\xac\x02\x65\xa0\x24\xa8\x3c\xb9\x32\x67\x44\x89\xa1\x63\xaa\xc3\x14\xbf\x3d\x96\x9f\x27\x59\x6e\x45\x17\x33\xb9\x9d\xeb\xa5\xee\xb7\x79\x21\x0b\xaf\x95\xbf\x54\x5a\x1a\xe6\xb8\xa9\x15\x86\x06\x93\xee\x89\x0f\x93\x93\x20\xe0\x6a\x84\x44\x83\xd1\x8c\x6a\x1b\xcd\x03\xc6\x38\xbb\x7d\x1f\xe2\xa8\x2e\xb4\x48\xa3\x11\xb1\x30\x2e\xa6\x42\x8f\x54\xa3\x9f\x45\xa4\xd5\x60\xbe\x15\x57\xa2\xb2\x54\xc4\x5c\x13\x7f\x45\xcc\x68\x35\x68\x36\xe2\x1b\xed\x0b\x7f\x73\xa5\x18\xce\x09\xdb\x0b\xe3\x93\x92\x7c\x33\x9b\xf2\xa4\xb5\x98\x75\x39\x40\x4c\xe6\x50\x28\x4d\xe1\x2e\x3b\x55\x3b\x26\x2e\xfe\x23\x84\x83\x32\xcc\xfd\xc3\x5e\x79\x1a\x0a\xb4\x3f\x13\x9c\x71\xed\x0f\xcb\x2d\x17\x3b\xb3\x77\xee\x46\xb1\xa9\xdc\xa9\x27\x7e\x77\xdf\x85\x5f\x28\x30\x25\x1e\x31\xe2\x6a\xcd\x86\x76\x3c\x8d\x7e\xac\x22\xc8\x82\xfc\x17\x4f\x2b\x5e\x75\xca\x6a\xd1\xad\xe0\x3f\x94\x2b\xb2\xa1\x3b\xf5\x41\x90\x61\x59\x15\x8c\x68\x36\x3c\x74\x80\xc5\xb2\x7a\x99\x32\x0f\x82\x83\xa2\x69\x9d\x43\x69\xc0\x71\xc5\x0d\xbd\x90\xb7\x79\x2e\x47\x72\xef\xbc\x0b\x19\x5b\xce\x84\xcc\x4d\xcf\xff\x70\x72\xa4\x89\x68\xdb\x69\xf9\xfe\xdd\xd0\xf9\xce\xd6\x59\xeb\x5d\xb7\x16\x7f\x35\xf9\x88\xce\xc1\x14\x88\x7d\xcb\xfd\xf2\x7d\x02\xd3\x00\xb3\xe1\xab\xec"}, +{{0x8d,0x42,0xf4,0xdd,0xd2,0xbb,0xd2,0xb8,0x27,0xb0,0xa0,0xd3,0x1d,0x8f,0x75,0x8e,0xbd,0x13,0xa1,0xb9,0xb3,0x71,0x22,0x28,0x94,0x8c,0xa6,0x10,0xbb,0x88,0x58,0xe5,},{0xb7,0x35,0x48,0x98,0x79,0x4f,0x9d,0xb0,0xa8,0xaf,0x6e,0xea,0xfc,0xdb,0xdf,0x01,0x1d,0x3f,0xbe,0xf0,0x21,0x2a,0xd9,0x38,0xa4,0xa4,0xad,0x27,0xab,0x16,0xeb,0xbf,},{0x70,0x76,0x4b,0xe3,0x9c,0x6d,0xca,0x0f,0x06,0x7a,0xbe,0x1e,0xca,0x49,0x0f,0xda,0x95,0x1f,0xd4,0xe9,0x49,0x96,0x95,0x26,0x6e,0x27,0x0b,0x9b,0x05,0xea,0xe7,0x06,0xca,0x8d,0x1c,0xa6,0xa9,0x2d,0x7c,0x48,0x8e,0xc6,0xad,0x8b,0xa1,0x14,0x57,0xa4,0x2a,0x5e,0x31,0x70,0x2a,0x9c,0x2b,0xce,0x89,0x2d,0xc4,0x05,0x35,0xc0,0x9f,0x01,},"\xe3\xa2\xbe\xbc\x04\x96\xd8\x97\x4a\x8f\x40\x61\x88\x03\x69\x31\x4e\xd9\xe4\x40\xc1\xb7\x7e\x26\xfe\x50\x71\xce\x69\x4f\xfd\x21\x36\xdb\x0c\x4d\x5e\x88\x0e\x60\x00\x08\x3a\x75\xc9\x0d\x3c\xf7\x2b\x9c\xf5\xa2\xb1\xa9\x00\x2c\x27\x01\xa2\xff\x59\xb0\x69\x9a\x8f\x42\xd7\x9d\xd8\xa5\xfb\x71\xa8\x12\x54\x53\xd9\x1f\xb8\x00\x80\xa3\xf0\xa1\x65\x84\x28\x2f\x17\xec\x7d\xfd\xc2\xe5\xc6\x9c\x4d\x9b\xdf\x48\x4d\x55\x94\x4d\xae\x27\x3f\x21\x1c\xfb\x76\xad\x37\xda\x45\x87\x13\x65\x43\x9a\xf3\x5e\xea\x1f\xbe\xcd\x4c\xa6\x79\xb5\x9b\x5e\x01\xba\xcf\x49\xc7\xf4\xe5\xef\xaa\x40\x6b\xa1\xda\xeb\x08\x54\x82\xaf\x5d\xed\x89\xdc\x68\x85\xff\xbe\x3d\x14\xd2\x93\x1b\x83\x89\x7e\x28\xad\x06\xe5\x56\x4e\x27\x89\xba\xea\x81\xbd\x93\x2a\xa2\x79\xfe\x8e\x32\x4b\x9a\x8e\xf1\x11\xc2\xab\xe2\xf1\x37\xd4\xbb\x50\xd8\xab\x76\xce\xbc\x0b\xd9\x82\xa2\x39\x19\x75\x1a\xd4\xd4\x9e\x88\xeb\x14\x17\x3d\x33\x10\x28\x9a\x87\x23\x17\xe4\xa4\x51\xe8\x8d\x54\x32\x08\x91\x87\x0f\x15\xb2\xd5\x33\x24\x43\x08\x77\xa9\xfb\x5b\x49\xbb\x92\x9f\x21\x1c\x5b\x89\x76\x4d\xd9\xc3\xa5\x95\xa1\x45\x1e\x9f\x85\xa2\x38\x54\x00\x02\x56\x6e\x53\xa9\x9e\xd1\xe6\xdd\xc9\xb4\x85\x3f\x45\x5e\xdb\x4c\xf1\x98\x0d\x56\xbb\xdc\x13\x13\xa3\x6e\x76\xea\x9c\xbb\x04\x8a"}, +{{0xb6,0x2d,0xe5,0xa1,0xac,0xfe,0x4c,0xa2,0xd1,0xf0,0xc1,0x32,0xaf,0xcb,0xda,0xe6,0x6f,0xb2,0x9a,0x02,0xf2,0x97,0xfb,0xc2,0x40,0x7f,0xad,0xbb,0xf2,0x45,0x42,0x00,},{0xb6,0x3b,0x2d,0x0b,0xf3,0x55,0xf7,0xb6,0xd0,0xba,0xc0,0x74,0x03,0x41,0x1c,0x40,0xaf,0xbb,0xb2,0xf7,0x07,0x50,0x3b,0x3f,0xc2,0xce,0xe8,0xa1,0xc7,0xd0,0xa8,0x38,},{0x5c,0xdb,0x00,0xe9,0x8d,0xe7,0x3e,0xab,0x48,0x0b,0xe4,0x2f,0x8a,0x8a,0x61,0x63,0x80,0x9a,0x0d,0x37,0x10,0x1b,0x6a,0x5a,0x4e,0xed,0x6a,0x0c,0x92,0x03,0x0d,0x09,0xa5,0x56,0x2c,0x72,0x90,0x80,0xce,0x6f,0x65,0x94,0xc8,0xfa,0xfb,0x1f,0x59,0x47,0x72,0xdb,0x7a,0x90,0xa9,0xe7,0xda,0x15,0x89,0x6e,0x82,0xf7,0x05,0x69,0x39,0x0d,},"\xe6\x59\xe5\x1d\x7b\x19\x3c\x4b\x8e\x2b\x3e\xd7\x3a\x9d\x75\x57\xed\x2b\xab\x61\x53\x88\x3a\xb7\x23\x59\x2f\x73\x0a\x91\x45\x67\x14\x2b\x3f\xa4\x35\xdb\x32\x19\xf8\x3a\x54\x2d\xc7\xa4\xbd\x80\x5a\xf6\x66\xea\x86\x5b\x85\x31\x46\xf8\xe3\xa9\xfe\x87\x07\x11\xf9\x0d\x12\xb0\x69\x34\x92\xaf\x2a\x1e\xdf\x99\xa1\x64\x58\xf7\x81\xf1\x26\x6e\xc4\x37\xa5\x29\x6a\x82\x2c\xa9\xd6\x9c\xe8\x44\xb5\xc5\x90\x97\xa2\xa5\x6f\x3e\xb8\xfd\x27\x3a\x63\x61\x16\xdb\x77\x43\x00\x92\x2d\x45\xb7\x44\x65\x7a\x69\x2f\x5e\x8b\xfb\xcb\x06\xd2\x42\x28\x18\xae\xb5\x1e\x7c\xda\x68\xac\xfb\xed\xa1\x6e\x7c\x79\x58\x0d\xcc\xcd\xe2\x4e\x8e\x3d\x60\x1b\x16\xe0\x63\xb4\x3a\x6d\x0d\x14\x07\x55\x2f\x75\x04\xf5\xbe\x19\x88\x2e\x4f\xfe\x32\x34\x4f\x5f\x47\x3e\x73\xa8\xf6\xed\x37\xb0\xd8\xd9\xe5\xe0\xa0\xdc\x98\x28\x39\x5b\xcb\xd8\xf3\xa4\xe3\x12\x48\x69\x24\x9d\x05\x8b\xe0\xe0\x45\xde\x0b\x1e\x12\xb1\xc8\x3b\xa0\xaa\x22\x7c\x95\xb8\x2b\xf7\x42\xc3\xea\xc0\x15\x2b\x33\xe6\xd1\x9b\xe8\xb3\x3a\x35\xbf\x70\x5d\xaa\xb1\x06\x22\xa9\x0a\xed\x02\x2e\xa6\xe4\x39\xed\x50\xa9\x30\x84\x37\x92\x99\x24\xba\x3a\xb1\x11\xad\x0c\xaa\x6f\xeb\x0a\x6e\xb1\x65\x82\x4e\xbd\xb0\x86\x65\x71\xef\xc0\x7e\x52\x22\xed\x86\x86\xb1\x4d\x92\x70\xbf\x76\xb9\x45\xd5\x20\x14"}, +{{0x97,0x32,0x05,0x9d,0x7b,0xf0,0x20,0x0f,0x5f,0x30,0x41,0x24,0x30,0x33,0x6b,0xe4,0xef,0x1e,0x3c,0xae,0x62,0x93,0x8a,0xd0,0x87,0x29,0xce,0x3b,0xa7,0x14,0xcf,0xd4,},{0x0d,0xe8,0x42,0x5f,0x5e,0x30,0xb2,0xb8,0xae,0xbb,0x80,0x72,0x00,0x9a,0x30,0xcf,0x04,0x11,0xc3,0xc8,0x23,0x8f,0x4e,0x42,0x08,0x76,0x0c,0x56,0xc3,0x3e,0x43,0x4f,},{0xfb,0xa1,0x74,0x9b,0x64,0x1d,0xd4,0xdf,0x34,0x66,0x4b,0xc4,0x3c,0x00,0x46,0x8c,0x7d,0x75,0xe8,0x4a,0xfa,0xd7,0x2d,0xe4,0x73,0xfd,0x1e,0x9c,0x87,0xda,0x15,0xea,0x60,0x4f,0xc2,0x54,0x9a,0x1a,0x86,0x7f,0xa8,0x08,0x50,0xe9,0xc2,0xa5,0x9c,0xd9,0x90,0x53,0x88,0x67,0x60,0xa8,0xd9,0x76,0x4b,0x84,0xdd,0x67,0x26,0x76,0x72,0x0d,},"\x1a\x13\xe7\xab\x60\x3b\x48\xeb\x89\x6f\xe1\x71\x73\xfb\x31\x95\x0b\x0d\xcd\x5a\x35\xff\xdb\xe1\x37\x1c\x7a\x5b\xfb\xa5\x93\x31\x75\x89\xd9\x65\x2d\x88\x79\x77\x29\x18\x0b\x8d\x0e\x51\x5a\xbf\xe6\x54\x8f\x16\x04\x21\xe5\x37\xd5\xc9\x4a\xef\x2b\x34\xc7\xeb\xb0\x97\x42\x00\x03\xbc\x0f\x36\x1b\x42\x3e\x7e\x14\x63\x0a\x80\x3c\x11\x82\x02\x54\x00\x49\xf6\x8c\x9c\xf4\x6f\xae\x03\x68\xd1\x62\xe4\x00\xd7\x7b\xb4\x52\x3c\xf6\xc7\x53\xb9\x75\xc2\x45\xbc\x99\xed\x2f\x41\x3a\x9d\x06\xc2\xda\x6c\xe0\xcc\x09\x87\xb6\x40\x6b\x80\x9e\x8e\xb3\x19\x03\x3d\x2d\xe9\x13\x1d\xee\x3b\x1b\x7b\x5c\x95\xd6\x53\xce\xd8\xfc\xcf\x99\x8d\xa1\x76\x85\x11\xec\xa4\xd3\xc5\xf7\x35\xad\xab\x96\x50\x3b\x35\x51\x80\x3e\x49\x22\x63\x50\x95\xef\x81\x1b\xe4\xc0\x8a\x6c\xba\xc9\x17\xcb\xe6\xcd\x91\xa4\xae\x5a\x33\x0c\xce\xc0\xe8\xe8\x15\x37\x12\x17\xa3\xde\x62\xf2\xd2\xd6\x14\x66\x21\x98\x33\xf3\x34\x47\x13\x2f\x4d\x43\x35\x0c\x58\xcb\xaf\x42\x24\x75\xed\xb1\x28\xc5\x6d\x80\xa4\x95\x72\x6b\x1f\xdb\xc5\x65\x51\xeb\x72\xd0\xf4\xfe\xc2\x6b\xa8\xbf\xf5\xee\xd6\x77\x4b\x85\x03\x9a\x52\x92\x83\x4b\x5d\x1c\xc1\xb0\x9b\xa0\xa3\x95\x4d\x29\x32\x36\x73\xf5\xe7\x12\x76\xa1\x2a\xc4\xc5\x79\x35\x5b\xf1\xec\xca\x48\xe6\xa7\x16\xb9\xfc\xec\xdc\x56\x5c\x51\xb9"}, +{{0x9c,0x7f,0x6f,0x37,0x9e,0x38,0x57,0x00,0x7e,0x2a,0xc6,0x32,0x4c,0xbb,0xce,0xd5,0x7a,0xc9,0xee,0xe4,0x47,0x78,0x13,0xf8,0x3a,0x81,0xfc,0x8c,0xef,0xa9,0x64,0xd5,},{0xa5,0x4b,0xa3,0x96,0xd6,0x87,0x63,0x4d,0x3e,0xcc,0xf4,0x1c,0x57,0x82,0x49,0x4f,0x5f,0x10,0xa5,0x21,0xa1,0xe5,0xd3,0x88,0x52,0x3d,0x80,0xee,0xba,0x5b,0x0b,0x2b,},{0x65,0x68,0x5f,0x9c,0xa5,0x98,0x2e,0x15,0xa2,0x2b,0xa3,0xc8,0x3a,0x03,0x48,0x34,0x84,0x82,0xdf,0xae,0x57,0xce,0xa1,0x78,0xf0,0x78,0x0c,0x05,0x7b,0xae,0xbe,0x4a,0xf6,0x32,0xf9,0x84,0x54,0x0a,0x26,0x01,0x9a,0x7f,0xb3,0x42,0x53,0xc9,0xec,0xe7,0xff,0x30,0x8a,0xda,0x23,0x3c,0xe0,0x68,0x63,0x47,0xab,0x5b,0x21,0xce,0x57,0x0b,},"\x3f\x2d\x30\x72\xfe\x73\x83\xe5\x41\x55\x1e\xa9\xab\xdb\xae\xae\x6a\x46\x4a\xe6\xb9\xf0\xba\x78\x6a\x44\x1b\x2d\x08\xda\x5b\xca\xda\x3c\x54\x24\xdc\x69\x31\xd6\xb3\x95\x23\xe2\xde\x0a\x0c\x2e\x4e\x6b\x5b\x8c\xda\x92\x5e\x5e\xac\x93\x84\x16\xa2\xc5\x1b\xf1\x3d\x49\x53\x1d\x7e\xc7\x11\x4b\x1c\x82\xfe\xaf\x90\xf3\xf8\x75\x91\xe3\x97\xd0\x27\x02\xf8\xec\x1b\x30\xd9\x9f\x5b\xe7\xd2\x20\x3e\x4f\xe4\xdb\x2e\xa4\x7e\x7b\x45\x89\xd8\xac\x50\x62\x48\xd7\x34\x74\x66\xed\xbc\x96\xea\x32\xbf\x3a\x6e\xa7\x50\x2d\xd6\x0c\x9e\x84\x90\x27\x15\xab\x2c\x6c\xa6\x8f\x5b\x00\xe1\xd9\x09\xd8\x3a\xa6\xab\x66\x2d\x8a\xea\x87\x0e\xcd\x86\x1f\xec\x69\xf2\xee\xc0\xae\x67\x7d\x29\x95\xb0\xed\x68\x8f\xaa\x8e\xf7\x82\x44\xe0\xd1\x19\x56\x97\xb0\x71\x22\xce\xaa\x11\xf5\xa6\xea\x58\xfb\xdf\xa2\xe2\xec\x2d\xf9\xd1\x86\x93\xae\x96\xd4\x71\x27\x55\x6e\x91\xf0\x86\x49\x82\xc1\x34\x19\xb0\x4a\x63\xf2\x08\xe7\x30\xd2\x69\x51\x88\x2a\xef\xe0\x01\xbc\xa3\x40\x8b\xd9\x86\x27\x48\xc6\xcc\x87\x6c\x28\xca\xc3\xbb\x2e\xb3\x39\x58\x18\xc2\x09\x1e\x0f\xbd\x7a\x0b\x44\x68\xc6\xb0\xd0\x0c\xd0\x08\xc1\x1c\x3c\x3a\xd0\x10\x80\xa1\xf5\xa4\x0a\xe2\xe4\xb0\xc3\xa0\x71\xef\xc8\xe1\xd1\xba\x6a\xce\x6d\x4d\xf0\xff\x19\x82\x9b\x0c\x68\x0b\x3a\xeb\x75\x91\x77\xed\x34"}, +{{0xa4,0x78,0xf3,0x5a,0xbb,0x73,0x72,0x7b,0x6b,0xe6,0xee,0x5e,0x56,0xee,0xc3,0x23,0xc9,0x51,0x78,0x82,0xfd,0x69,0x19,0x36,0x0e,0xbb,0xbf,0x5d,0x5c,0xb8,0xb8,0x3a,},{0x7a,0x6e,0x26,0x6a,0x54,0xd1,0x35,0xdd,0xa0,0x00,0x9c,0xcd,0xa8,0xa9,0x4a,0x47,0x12,0xae,0x5c,0xb1,0x47,0x61,0xe8,0x43,0x6e,0x97,0xc4,0xb7,0x81,0x4d,0x8e,0x8c,},{0x9d,0x16,0xfd,0x40,0xb9,0xf8,0xdd,0x9b,0x4a,0x1a,0x8c,0x6d,0x70,0x3b,0x9f,0xcc,0xbb,0x94,0x0b,0x1e,0x0a,0xe7,0x7a,0x59,0x70,0x37,0x4a,0xf0,0xcf,0x72,0x6f,0x44,0x79,0xfd,0x30,0xd7,0xdf,0xf5,0xcf,0x53,0x49,0x4d,0x9a,0x29,0x6a,0xb6,0xb9,0xe4,0x6e,0xa6,0xc1,0x36,0xb4,0xdb,0x2c,0x71,0xc2,0x1b,0x97,0xc1,0xc8,0x25,0x4d,0x0a,},"\x01\x73\xa3\x40\x50\xb4\x37\x48\x06\x1f\xf8\xf5\xa3\xd7\xc4\x3b\x63\x60\x84\x77\x86\xe8\xbb\x75\xe5\x36\xfb\x47\xb6\x45\xb2\x14\xf2\x21\xba\x24\xd8\x3d\x28\xbc\x02\x50\x24\x66\x3e\x53\x4f\x90\xf6\xe8\x3a\x93\xd8\xbd\xde\xda\x2c\xd8\x80\x81\x55\x65\x2a\x90\x8c\x43\x7c\x2d\xb6\xf3\xed\x49\x12\xf5\x7c\xa5\xb9\x79\x28\xa7\x3b\xe9\x64\xaf\x59\xdf\x44\x39\x85\x4b\xb0\x06\xfc\x29\x5a\x87\xb7\xb7\x22\x39\xc7\xfa\xdf\xec\x40\x71\x55\x09\xd9\x85\x79\xda\xad\xfb\x8d\x52\x4b\x4c\xec\x66\x20\x70\x5e\xfd\x41\x04\xc2\x97\x14\x4a\xea\x72\x29\x74\xe1\x2c\x5e\xce\xe5\x39\x1e\xf2\xd9\x3a\xc2\xb1\x24\xe4\xac\x49\x61\x47\xc8\xb7\x03\x63\x58\x5d\x70\x78\xcc\xc5\x3e\x2a\xe5\x93\x35\x0b\xc2\x55\x48\xa0\x54\x25\x26\xab\x00\xaf\xe4\x77\xa0\xf4\xb2\x73\x97\xc7\x2b\xc7\x4a\x8a\x8a\xb1\x56\xe6\x2b\x8b\xb4\x7c\x3f\xbb\x4b\x34\x91\x3e\x45\x96\x87\x47\x6b\xf3\x31\x42\xc6\x14\x70\x21\x07\xff\xe2\xcc\x01\xe2\x5f\xa3\x02\x75\xe1\xe2\xe6\x3c\xea\x91\x68\xe4\xa4\x7c\x02\xde\x09\x7d\x4d\x85\x3b\x27\x67\x5c\x5b\xb3\x30\xb9\x4a\x97\x4e\xad\x85\xe2\xbd\xee\x8e\xe1\x7c\xbb\x56\x53\x34\x66\x58\xdf\x2f\x91\xf6\xbd\x73\x94\x91\xdd\x71\x98\x8b\x3a\x97\x6a\x3e\x2e\x7a\x9d\x13\x74\x10\xf4\xac\xba\x9f\xeb\x5f\x11\x79\x8c\x9a\x43\xb6\xad\xce\x14\x36\x5a\x7c\x6d"}, +{{0xff,0xe8,0x25,0x14,0x8c,0x09,0x59,0xb3,0xa6,0x8d,0xe8,0x6a,0xd8,0xe8,0xaf,0x7f,0xa5,0xe0,0x78,0xf3,0x63,0xdc,0x12,0x42,0x13,0xc9,0x00,0x20,0xda,0x0c,0x90,0x89,},{0x13,0x91,0x52,0xa0,0xbd,0x22,0x96,0x2d,0xd9,0x19,0xae,0x3e,0x0b,0x16,0x20,0xe0,0x3c,0x03,0x3c,0x2a,0xd0,0xa3,0x97,0x9e,0xc6,0xbc,0xd1,0x70,0x5e,0x23,0xd5,0x98,},{0xfe,0x4e,0x89,0xee,0x31,0x78,0x6c,0x0a,0x3d,0x3d,0xe3,0x64,0x9b,0xb9,0x3f,0x0b,0x8a,0xef,0x1c,0xaf,0x5a,0x83,0x2e,0xc5,0xe4,0x06,0x78,0x10,0x70,0x5a,0xdd,0xdf,0x53,0x9b,0x8f,0x4e,0x05,0xad,0x08,0xcf,0x34,0x79,0xe4,0x5b,0x42,0xc9,0x65,0x28,0xf6,0xd5,0x9a,0x46,0x25,0x70,0x3d,0xdb,0xf1,0x5b,0x63,0x09,0x39,0x65,0xd8,0x0d,},"\xf1\x25\x78\x0d\x0c\xd0\x88\x53\x0f\x0c\x87\xb7\x0b\xd4\x2e\xba\xb5\x6a\xdb\x5a\xd4\x34\x5f\x92\x9a\xe5\xde\xae\x07\xfb\x55\x32\x21\x53\xa8\xf0\x23\xd3\x88\x43\xbf\x5d\x6a\x93\xfe\x99\x3e\xee\x71\xbc\x2e\xe5\x63\xb2\x5a\x50\x91\x8f\x03\xef\xdb\x5d\xbf\x72\x69\xad\xd6\x9d\xed\x3e\x66\x95\x38\x95\x62\x0d\x9b\x6c\xf4\x6b\xa2\x34\x8f\x8d\x66\xd7\xf0\x92\x23\x5e\x37\x8c\x1e\x3e\xdf\xeb\xeb\x78\x08\x4b\xc8\xde\xa0\x13\xf9\x93\x3a\xae\x14\xa0\x41\x94\x82\x76\xd0\x1f\x1c\xb5\x83\x4b\x0e\x59\x0e\x13\xd9\x31\xd1\x92\x92\xbb\x1d\x80\x41\xff\x2f\xe2\xe1\x17\x1a\x2e\x0b\x9a\x05\x98\x21\xd0\x92\x4d\xde\x7f\x3b\x1b\xb5\x98\x13\xf5\xe3\xc6\x35\x20\xaa\xfb\x88\x01\xba\x62\xc7\x09\x7d\x4d\x8c\xf4\x37\xa5\x68\xa7\xf0\x08\x7c\x6e\xa0\xfc\xe6\xe5\x68\xc4\x88\x3f\x1c\xd1\x2c\x74\x9d\x06\xa6\xfe\xb2\x78\xf1\x08\x6a\x8b\x04\x76\x99\x21\xf7\x8a\x99\x59\x06\x2a\xb0\x6f\x98\xee\x80\xc2\xc7\x85\x4f\xfa\x76\x0f\x86\xa8\x9e\xe1\xa5\x12\x66\x05\x3d\x19\x5e\x61\xbb\x1d\xbd\x18\xdd\x89\xff\x39\x4e\x40\x8a\xce\x0f\x64\x1a\x39\x5d\x56\x11\x8e\xa7\x2b\x7d\x8a\xdf\x78\xb1\x65\x5e\xce\xce\x7e\x82\x50\xe8\xa3\xa9\x1c\xb8\xfc\xa0\xd9\xce\x0b\xaf\x89\x80\xa3\x87\xc5\xed\x43\x18\x66\x32\x80\xe5\xb4\x53\x1f\x31\x87\xc4\x7e\xae\xa7\xc3\x29\x72\x8d\xdd\x0e\x40"}, +{{0x49,0xaf,0xf4,0x21,0xa7,0xcd,0x12,0x72,0x2a,0xa8,0x4c,0x48,0xc1,0xfb,0x1c,0x5f,0x8d,0x9e,0x27,0x7d,0x0a,0x99,0xec,0xbc,0x93,0x48,0xc3,0xaa,0xa7,0x4b,0xe4,0x22,},{0x88,0xd2,0xc2,0x62,0x66,0xf4,0x93,0xbc,0x67,0x57,0x8c,0xa0,0xb1,0xf5,0x11,0x60,0xcf,0x0f,0xdb,0x6a,0x09,0xa9,0x06,0xdb,0x9f,0xaa,0x68,0x6f,0x11,0xf8,0x20,0x8d,},{0x74,0x91,0x81,0x28,0x4d,0xf0,0x5d,0xbe,0x59,0x74,0xb9,0x17,0x82,0xa1,0xa7,0x6e,0xa0,0x86,0x42,0xcb,0x0f,0x0c,0x98,0xdb,0x58,0x6c,0x57,0x5c,0x21,0x0c,0xdc,0x8b,0x65,0x1b,0xd3,0x4b,0x75,0x7a,0xe3,0x8e,0x4b,0x6b,0xe9,0x46,0x52,0x35,0xbd,0x0e,0xca,0x43,0x0e,0x26,0xc3,0xee,0xde,0x56,0x1c,0x6e,0x82,0x4d,0xfa,0x20,0x0e,0x0a,},"\x70\xa1\xac\x14\x4b\x75\xfd\xa7\x55\x86\xa7\x9c\x36\xfd\x39\xcc\xe5\xf5\xca\xe2\xe6\x37\x58\x52\xd3\xb6\x2a\x96\x30\x33\x6a\x29\x3e\xa6\xd2\xac\x6e\x5b\x57\xda\x21\xef\x36\x4a\x59\x5b\xb0\x75\x0f\x5b\xf4\xd2\xb3\x20\x67\x64\x23\x87\x0e\x4b\x8e\x08\x69\x60\x1f\x16\x68\x06\x19\x04\x8c\x4e\xde\x27\x6d\xa6\x9f\x20\x5a\x70\x17\x6e\x25\xea\x04\xbd\x08\x97\x63\xe7\x09\xba\x34\x3f\xc8\x83\x1e\x52\x04\x4e\xab\xf9\x44\x1e\x69\x97\xf8\xba\x1a\xeb\x9e\xf0\xf4\x91\x17\x06\x67\xa7\xf5\xfc\x96\x27\xcb\xd0\x55\x1b\x76\xbe\x27\x28\x3a\x4b\x0c\x5f\x66\x78\x46\x68\x82\x26\xa1\x15\xee\x80\x20\xdf\x08\x04\x2b\x19\xb5\x9f\xe5\x51\x31\x6a\x6c\xb6\x91\x68\x60\xb9\xec\xd7\x41\x54\xb4\x05\x10\x38\xa1\x73\x52\x37\x2e\xc1\x4d\x3c\x95\x7d\x2e\xf5\x0f\xf7\x86\x18\x9a\x8a\xeb\x9c\x08\xf4\x5e\xeb\x5e\xb8\xb0\x40\x33\x99\x74\xaa\x97\x98\xc4\x25\xd7\xbe\xcb\x22\x8c\x44\x7a\x6d\x0b\x3c\xef\x27\x18\x93\xe0\xf7\x07\x6e\x22\x3a\x7e\x87\xc6\xa3\xd2\x70\xa0\x33\xbc\x97\xa4\x56\x5e\xdc\xe0\xaa\x91\xff\xc3\xf7\x80\x17\x75\xa6\xf2\x9b\x23\x02\x45\xbd\x71\xfa\x03\x43\x53\xde\x37\x23\x95\xd1\xbf\xcb\xde\xbb\xa0\x81\x33\x0f\x7c\x07\x6b\xe9\x9c\x2c\xf4\x86\x7f\x15\xb7\x8d\x52\xf4\x6f\xc7\x39\x1c\x9c\xb9\x5e\x5d\x64\x64\x3b\xaf\xfe\x72\xa8\xe3\xa6\x50\x66\x7f\xbb\x3e"}, +{{0x70,0x3a,0x6e,0x2b,0x62,0xd0,0x09,0x0c,0x61,0xd8,0x65,0x9b,0x6a,0x96,0x3e,0x03,0xc9,0xd6,0x2c,0x1b,0x38,0xf7,0xd7,0x0e,0x5f,0x9f,0xf0,0x55,0x90,0xcd,0x03,0x60,},{0x37,0x0c,0x21,0xde,0x6e,0xf2,0xfa,0xb5,0x34,0xad,0xa9,0x99,0x86,0x9c,0x90,0xbc,0x9b,0x92,0xcc,0xbf,0x24,0x9b,0x79,0xd3,0x9d,0x95,0x44,0x1d,0x1e,0xde,0x21,0x0a,},{0xe5,0xfd,0x64,0xda,0x02,0x88,0x00,0xc6,0xce,0xed,0x06,0x8a,0x5e,0x59,0x6f,0x16,0x21,0xc7,0x0a,0x8c,0xb1,0x38,0xb3,0x1b,0x32,0x64,0x7e,0xb4,0xb0,0x7b,0xd2,0xec,0xc5,0x94,0x2c,0x18,0x84,0x4f,0x36,0x70,0x33,0xf6,0x73,0x98,0xe3,0x14,0xba,0x2c,0x7c,0xcf,0x29,0x9c,0x06,0x97,0x87,0x77,0x70,0x25,0xd8,0x45,0xf2,0xaa,0xd6,0x0e,},"\xd4\x2a\x17\x56\xe8\x4d\xf4\xb4\xe9\x77\x3f\x86\xf7\x67\x4a\x2c\xd7\x8e\x71\xe4\x0a\xa8\xf6\x44\xe6\x70\x2d\xfb\xc2\xc2\xc5\xca\x90\xfc\x24\x2e\x9c\xb0\x09\x9c\xc8\xf2\xc2\xd3\x13\x6b\xaa\xfc\x0f\xf6\x95\x48\x2f\xda\xcd\xef\x9f\x56\x56\x10\xb6\xe1\x90\x07\x22\xf4\x35\xc6\x38\x5b\x35\xe9\xf6\xc4\x36\xca\x03\x7e\x03\xf6\x4e\x22\x33\xdf\xfa\x58\xdb\x3b\x91\xcc\x1d\xaa\x0b\xb0\xc5\x4c\x8a\x43\xe4\x69\xd2\xcf\xf7\xfa\x2b\xf8\xf5\xd1\xd8\x77\x93\x10\x89\xc8\x2e\xd8\x9a\xba\x42\xf2\xee\x2b\x86\xe4\x45\xcf\xd0\x9f\x4c\xd7\x8b\x35\x19\x1b\xf4\x67\xe7\x84\xee\xf7\x5d\xc9\x87\xe0\x46\xd3\x7d\x4d\x4e\x8e\x9b\xbe\x14\xaf\x80\xd0\x3a\x1f\x40\x89\x83\x84\xb9\xd3\x27\x9f\xac\x9c\x57\xfd\x9c\x7e\xec\xbe\x19\xa5\xac\xc1\x50\x33\xb8\x4e\x07\xfd\x0e\x40\x9b\xdb\xd5\xa5\x7f\x65\x64\x11\x83\xa6\xc0\xa8\xec\x42\x6d\x1f\x1d\x22\x31\x66\xff\x0a\x19\x00\xb2\xe9\x2b\x7d\x85\x83\x5d\x01\x9d\x17\x77\x5e\x50\x93\xcc\xd1\x26\xf9\x0f\x63\xcb\x7d\x15\xcb\xeb\x53\x13\x24\x21\x9c\xd6\x4d\xed\x67\x14\xb2\x1a\x65\x37\x1a\xf0\x72\x10\xdf\xdf\x0e\x4e\x58\xdd\xc7\xd5\x9f\x4c\xfa\x65\xc4\x21\xd8\x14\xee\x2c\x9b\xf6\xdb\xf6\x48\x73\xd5\x79\xb0\x9e\xe5\xdc\xed\xd7\x33\x06\x3e\x03\x9a\xc9\xa5\xf9\xca\x4c\x25\x25\xa4\xcc\x8e\x98\x4d\xa7\x18\x5e\x2d\x64\xfa\xd8\x1c\x8a"}, +{{0x76,0x84,0x9c,0x18,0x8e,0x3e,0xdd,0x0f,0xf5,0xf8,0xfb,0x87,0x4d,0xc0,0x45,0x66,0x45,0x51,0x84,0x45,0xe4,0x1a,0x7d,0x68,0x33,0xe6,0x16,0xc3,0xc4,0x8c,0x98,0x68,},{0xd6,0x70,0xe2,0xea,0x07,0xdb,0x60,0xc2,0x2a,0xb7,0x9a,0x93,0xeb,0xf4,0x9d,0x22,0xa6,0x24,0x5e,0xe3,0xaf,0x07,0xb3,0xbe,0x58,0x4e,0xda,0x69,0x4c,0x37,0x72,0x9e,},{0x71,0x41,0x39,0x9d,0x51,0xda,0xa6,0xeb,0x45,0x19,0xbf,0x3f,0x01,0xb2,0x33,0x92,0x0f,0xa9,0x08,0xfe,0xfa,0x61,0x2f,0x0c,0xd7,0xd5,0xaf,0x8a,0x9a,0x3c,0x44,0x19,0x0e,0x3f,0x63,0x84,0xa8,0xd1,0x4d,0x37,0xc9,0x70,0x30,0xef,0x50,0x18,0xcf,0x8a,0xee,0x8a,0xeb,0x15,0x69,0xa7,0x3d,0x84,0x86,0x2a,0x59,0xb7,0xdf,0x72,0xfe,0x09,},"\x1e\xcc\xb0\xbc\x8e\xca\x3a\xb5\xbe\xe6\x8c\x5f\x8c\xaa\x34\x53\x67\x66\xc7\x05\xf5\x08\x27\xdb\x7a\xc3\x75\xd4\xfe\x30\xb5\x8f\xfb\x7e\x2f\xe4\x90\xcc\x71\xa8\xff\x86\xc0\x06\xd6\x17\x4d\x05\x79\x3a\xb8\xa5\x5d\xd5\x1b\x06\xde\x41\x7b\xc0\xac\x45\x2c\xdc\x7c\xfb\x0b\xb0\x03\x62\xb6\x76\x5d\x20\xdb\x23\xeb\x18\x48\x02\x70\x64\xa1\xd9\x09\x1d\x3b\x10\xed\x77\x6f\x28\xb7\x67\x68\xbd\xfc\x08\xf0\xbc\x51\x1f\x76\xfa\xeb\xa7\x6c\xfc\x4c\xb5\xc8\x3d\xc9\xeb\xe8\xa8\xd7\x9e\xdc\xa9\x23\xec\xcd\x52\x40\x09\xca\xfe\xdc\x90\xe3\xad\x87\xd1\x39\x2e\x1f\xcc\xf4\xe6\x0c\xca\xb9\x5d\xc0\xab\x54\xbf\x44\x24\x5a\x00\x7a\x96\xd4\x66\x34\xb1\xb2\x96\x5b\x82\x9c\x3d\x7d\xaa\x76\x59\x72\xb5\x4a\x7b\x36\x5b\x6f\x34\xd7\x7d\x71\x76\xac\xd8\xd8\x94\xf6\xb4\x17\x09\x1b\x6c\x00\xed\xb7\xa4\xe8\x13\x79\x98\x8b\xfc\xec\xb6\x92\xe9\xc3\xc4\x31\x0a\x7e\x24\x0e\x5c\x10\x63\xcd\xe1\x13\xf2\x2a\x68\x4a\x50\xa1\x12\xff\x47\xd3\x89\x88\x12\xef\xb9\x26\x37\x07\x2b\x86\x16\x3a\xd8\x93\x16\xd2\x21\x19\x5a\xcb\xfa\xd0\xa0\x3a\x1f\xbc\x2d\x96\x7f\xe8\x3f\x84\xc8\x45\x9f\xcc\xd4\x90\xb9\xc5\xb3\xe5\x5d\x27\xe9\x48\x4e\x94\x3c\x41\x7f\x21\x28\xd7\x37\x01\xda\x28\xf4\x9f\xd3\x68\x3f\x33\xa3\x9c\xde\xe2\x34\xbd\x30\x5b\x94\x91\xe2\xf3\xeb\x62\x1b\xe3\xdd\x1d\xbb\xb3\x1b"}, +{{0x83,0xae,0x48,0xad,0x70,0xda,0x0b,0xb3,0xcd,0xf8,0x74,0x81,0xee,0x2c,0x0c,0x85,0x71,0xc2,0xca,0x98,0x67,0x12,0xf8,0xbc,0x23,0x29,0xe9,0xa3,0xe3,0x33,0x83,0xc5,},{0xb7,0x85,0x30,0x90,0x00,0xdf,0x95,0xf5,0xa0,0x4f,0x7d,0x89,0xc4,0x11,0x33,0x01,0x05,0x7a,0xda,0xee,0xb2,0x9b,0xcd,0x28,0xd9,0x93,0x71,0xb5,0x37,0xbb,0xa2,0xf6,},{0x43,0x33,0x23,0x51,0xd3,0xfb,0x7b,0x45,0xfc,0xf3,0x7c,0x60,0x7d,0x44,0x2e,0xa8,0x0d,0xbd,0xa2,0xcb,0x69,0xc2,0x88,0x4f,0x42,0x4e,0x65,0xea,0x3a,0x33,0x1e,0xd8,0x47,0x2d,0x43,0x68,0x40,0x5c,0xb7,0x36,0xb2,0xd6,0x68,0x5a,0xd7,0x82,0xe2,0x39,0xfe,0x83,0x3e,0xd7,0x89,0xa2,0x92,0x31,0x85,0x16,0x6f,0x60,0x83,0x42,0xee,0x05,},"\xb7\x52\x1d\x3f\x71\xc6\x79\xfa\x70\x37\xfe\x74\x88\xa6\x41\xf6\xb9\x7c\x49\x45\x4a\xcc\x8e\x36\xb9\x03\xd8\xf9\xeb\xb5\x4d\x89\xcb\x56\xef\xd1\x9e\x04\xba\x6a\x7c\x8f\x48\xa7\xd3\xec\x9d\xec\xd3\xf1\xcd\x0f\xaf\x6e\x97\x81\x18\xe6\xad\xce\x9c\x6c\x6b\xe6\x3c\x6a\x6a\x1a\xe2\x16\x51\x82\x84\x79\xa4\x6b\xc9\xa0\xf7\x94\x30\x40\xf9\x40\xa0\xd4\x70\xc8\xe5\x77\xc5\xd5\x75\xcb\x53\xc1\xbf\x3a\xb1\xfe\xb0\x50\xdc\xb6\xfe\xf0\xba\x44\x47\xf2\x99\xfd\xb9\xf2\x7e\xcb\x07\x14\xec\xfe\xfd\x74\xba\xd7\xb1\x22\xa4\x62\xc2\x4a\x20\x98\x48\xa0\x33\x89\x07\x45\x78\xc5\xbd\xc3\x63\x96\xd8\x09\xb0\xf1\x40\x18\xda\x64\x91\x7e\x6b\xf8\x7e\xf4\x05\xc8\xf3\xe3\x33\xff\x9c\x3b\xaf\x63\x39\x66\x76\x20\x79\x4b\xb4\x74\x3f\x05\x14\xb5\xde\x7d\x7f\xdd\x94\x7a\x7e\x35\x01\xee\x88\xef\xad\x15\x9e\x33\xa1\x07\x2f\xbb\x99\xc7\xc7\x1e\x9d\x13\xa5\x02\xd5\xa0\x7c\x4f\x81\x7e\xeb\x7f\x0c\x53\x19\xaa\x41\xa9\x6d\x5f\xf4\xf1\x5a\x73\xc2\x9b\x57\x1f\xe2\x11\x09\x0e\x17\x2c\x8d\xb5\x18\x62\x46\x12\xa5\xc3\x71\xa9\xd7\xce\xf6\xde\x35\xeb\xef\x96\xe8\x8e\x1a\x78\xaf\x3b\xd5\xdd\x35\x25\x1a\xb5\x4d\x73\x71\x8f\x3e\x70\xd2\xd5\x90\x21\x53\x1d\xc7\x31\x84\xf0\xfc\x69\xc2\xe9\x29\x65\x84\x4e\xc2\x7c\x1c\x02\xaf\x5e\x9a\x34\x69\xde\x35\x5d\xb2\x25\x6e\x0e\xc2\xa4\xeb\xa3\x0a"}, +{{0x39,0xe5,0x6a,0x65,0x62,0x3a,0x0a,0xeb,0xad,0xe0,0xda,0x12,0xce,0x1d,0xf3,0x78,0xbc,0x92,0x40,0x73,0xf7,0x3a,0x54,0x9e,0xff,0xae,0xbc,0x46,0x5d,0x1a,0x78,0xe2,},{0x83,0xda,0x8a,0xd5,0x0b,0xad,0x09,0xeb,0x3e,0x94,0xc7,0x25,0xdf,0x3c,0xc3,0xa1,0x19,0x73,0x6a,0xdc,0x85,0x9c,0xa1,0xa1,0x05,0x03,0xf4,0x8f,0xf2,0xfe,0xc5,0x96,},{0x39,0x8e,0x82,0x60,0x01,0x1f,0x57,0xd8,0xac,0x8c,0x58,0xd5,0x45,0x7b,0xc6,0x52,0xc7,0x41,0x4a,0xaf,0x6f,0xb2,0xf4,0x26,0xb7,0x89,0x90,0x56,0x60,0x5c,0x0a,0xfc,0x28,0x39,0x24,0x23,0xb2,0xb5,0x71,0xf5,0xe6,0xc3,0xc7,0xf6,0xd6,0x02,0x45,0xe5,0x3e,0xbd,0x03,0xbd,0xc5,0xad,0x3c,0x1a,0xd8,0x73,0x8c,0xb3,0x22,0x14,0xd0,0x0f,},"\xa9\x6d\xc2\xea\x3f\xa1\x35\x14\x92\xa4\x61\x9d\x91\x94\x68\x1f\x8e\xc4\x00\xa9\x71\x58\x24\x44\x82\x65\x38\x38\xcc\xb7\xe1\x56\xa8\x2d\x56\x43\x68\xf8\x3a\x6e\xe1\xbe\x46\xbc\x34\xb8\x17\x20\x0e\x84\x64\xc3\xd1\x2b\x5e\xf2\xc5\x0b\x19\x56\x5b\x88\x1c\x4c\x3d\x45\x63\xfb\x94\x7e\xb4\x7c\x3e\xe9\xc1\xee\x78\x53\x26\x98\x74\x45\x5b\xfa\xcb\xa3\x05\xf3\x07\xd1\xac\x53\x09\xee\xae\x5c\x07\xfa\x5c\x4d\x42\x8e\xdb\xc8\xb9\x52\x8c\x44\x15\x24\x3a\x9e\xf5\x80\xaf\xf8\xfc\xfb\x12\x00\x0a\x71\xfc\xee\xe8\x9d\xe9\x7f\x90\x27\x95\x29\xbc\xc8\x22\xed\x3c\xb3\x4c\x82\xba\x5f\xec\x15\xf4\x94\x56\x63\x63\x6d\x67\xb5\xfe\xce\xac\xc3\x1d\x25\xf9\x8a\xea\x07\xf7\x80\x0d\x5a\x10\x34\x25\x1c\xb9\x1d\xd0\x96\x3e\xc2\xc1\xa5\x47\x73\xa4\xd9\x6c\x18\x35\x7f\x8d\x10\x1d\xe5\x8e\x93\x2f\x8c\x6c\xdd\xe8\xe3\xcf\xce\xf5\xa7\x44\x3f\xdb\xa7\xb7\x83\x20\x40\x3c\x01\x96\x84\x47\x24\xa6\x12\x18\x3e\x34\xbd\xd8\x08\xce\x7b\x95\x88\x61\xca\x37\x11\x57\x30\xea\xed\xe1\xfd\x0b\xaa\xbe\x97\x6e\xfe\xfd\x03\x65\xfd\xf9\x26\x77\x6c\x53\x6f\x47\xff\x80\xde\x5c\x18\x29\x1b\xb7\xe9\xf1\xb9\x13\xff\xd1\xd9\x44\x68\xb7\x89\x75\x2f\xae\x6c\xa8\x97\xc0\xcc\xa5\x3e\xf1\xe7\x31\xd0\x0c\x8b\xdb\xe8\x92\x9e\xa6\xb1\xdc\xe1\xf3\x1a\x20\x68\x8d\x37\xb0\xf3\xa2\xb4\x15\x3b\x30\x6b\xdb\xa1"}, +{{0x4b,0x99,0x21,0x85,0x2f,0x40,0x9a,0x32,0x3a,0xe3,0x81,0x75,0xe8,0xd7,0x6a,0x21,0x1f,0xc4,0xd9,0xc6,0x54,0x17,0x8e,0xea,0x3b,0xaa,0x7a,0x76,0x7a,0x6f,0xda,0x06,},{0x4c,0x72,0x3e,0x43,0x6b,0x6b,0xd9,0x7f,0x44,0xaf,0x52,0x50,0x3b,0x21,0xcc,0x50,0xd5,0xf6,0xad,0x6c,0xfc,0x82,0x88,0x34,0x5d,0xde,0x80,0x54,0xe9,0x95,0x58,0x2e,},{0xcb,0xf1,0xf1,0x64,0x2d,0xf9,0x50,0xeb,0x71,0xfd,0x09,0x59,0x0d,0x34,0xc2,0x65,0x92,0x2c,0x58,0xbd,0x80,0x26,0xbb,0xa3,0xfc,0x0e,0x59,0x4a,0x6b,0xb1,0xf2,0xb9,0x0d,0xa3,0xdc,0x1d,0x5f,0x6b,0x6d,0x5b,0x40,0x5a,0x89,0x6d,0x1d,0xbb,0x71,0xb8,0x68,0x5c,0x4d,0xfc,0x44,0x4a,0xca,0xff,0xe6,0x5a,0xb8,0x33,0x17,0x89,0xf5,0x07,},"\x3f\x33\xd8\xfb\x83\xe6\x87\x41\x09\x0a\x37\xbe\xdd\x74\x5c\xf1\x41\xaa\xae\xd8\xc9\x2f\xfa\x74\x2a\x52\x56\x17\x77\x88\x58\x05\xac\xe1\x42\x46\xab\x98\xa8\xcb\x59\x8c\x9c\xe3\xde\x9b\x29\xba\xe5\xfa\x04\xb1\xcf\x82\x8d\xe1\x1a\xff\x80\xa7\xef\x8a\x3a\x38\xae\xde\x4f\x3c\x35\x63\xa2\x5d\x04\x9b\xad\xca\xd5\xed\x7e\x47\xfd\xbb\xa6\xe1\x11\x30\x7e\xeb\xe9\xef\x49\x06\xbc\x98\x97\x28\xb7\x6e\x84\xaf\xe8\x08\xe6\x65\x3b\x27\x1e\x21\x10\x4a\xa6\x65\xf1\x89\x8d\xd2\xaa\xb2\x30\x90\xe2\x2b\x4e\x34\x4a\x26\x16\xfb\xd8\xee\x4a\xd8\xed\x81\x08\x39\x5e\xba\x81\x7f\xbd\x14\xfe\xc5\xc1\x7d\xcf\x56\xb8\x22\x08\x56\xb2\xb8\x33\xe0\x91\x40\x7d\x50\x89\xb3\x5d\xdf\x34\xb8\x6f\xf7\xdc\x9f\xde\x52\xb2\x1e\xf1\x21\x76\xef\x33\x70\xb7\xf3\xa0\xa8\xcb\x1b\x05\x8a\x51\xae\xff\xf3\xd2\x79\xd8\x0f\x51\xa6\x8b\xfb\x59\x25\x87\xb4\x5c\x5c\x63\xa7\xe4\xd6\x25\xb8\x87\xde\x48\x6a\x11\x83\x16\xc3\xb6\xa2\x38\x57\x5f\x92\xac\x5b\x1c\x94\xc3\xf5\xdb\xbd\x96\x68\x60\x00\xd6\xd3\x9c\xcc\xd5\x58\xd4\x20\xe4\xd4\x47\xa8\xcb\xc4\xbc\x7b\x8c\x6a\x03\xaf\x0f\x00\x34\xfb\x35\x18\xd9\x38\x00\xf0\xf7\x13\xe4\xb1\x37\x32\xe1\x6a\xda\x51\x80\x1d\x7e\x55\x9c\xf8\x39\xd1\x05\x8f\x64\x95\x56\x98\x31\x13\x99\x34\x54\x16\x85\x0d\xdd\xcc\x56\x01\xa6\x84\xfd\x09\xe6\xaf\xd3\x94\x4f\x5e\x19"}, +{{0x1b,0xff,0x65,0x2a,0x2c,0x83,0x09,0xa3,0x93,0xac,0x11,0xda,0x3a,0xa9,0x7f,0xb0,0x78,0xbb,0x28,0x4e,0xd5,0xe1,0xb8,0xcc,0xc9,0x83,0x65,0x2e,0xf8,0x55,0x6c,0xd0,},{0xaa,0xab,0xdc,0x09,0x1f,0xc3,0x68,0x23,0x54,0x20,0x17,0x44,0xe9,0xb7,0x3f,0xd2,0xa6,0xcf,0xb2,0x81,0x91,0x4b,0xf2,0xc7,0x0e,0xc3,0xdc,0x1d,0xec,0x72,0x16,0xb0,},{0x93,0xc9,0xc3,0x34,0x93,0xfc,0x64,0x17,0x2d,0x51,0xe1,0x6a,0x0a,0x1c,0xd7,0x29,0xa0,0xd9,0x9e,0x3c,0xb8,0x64,0xe8,0x9a,0x42,0x98,0x7f,0x39,0xdd,0x8c,0xd2,0x65,0x45,0xfd,0xfe,0x37,0x58,0x19,0x11,0xe8,0x03,0x67,0x7d,0xa4,0xc5,0x5b,0x0a,0x68,0x3d,0xdf,0x62,0xb7,0x28,0xf8,0xf3,0x06,0x85,0xae,0x58,0xf6,0x28,0xeb,0xe6,0x09,},"\x48\xd0\x26\x98\xa9\x7b\xdc\xb3\xef\x07\x8d\xcf\xcf\x57\x50\x00\x5f\x17\x02\xd3\x00\xe7\xe8\x9b\xc4\x36\xe3\x81\x11\x34\x01\xf8\x52\xb8\xb4\xac\xff\x60\xff\xbd\x4a\xb4\x6d\x20\x21\x68\xd9\x8b\x87\x35\xe7\x9c\xb3\x50\xe3\x5b\x07\x0f\xf6\xbd\xca\xfd\x95\x4b\x55\x19\x69\xb6\xb1\xa7\x0c\x91\x31\xeb\xd4\x0d\x96\x14\x02\x91\xd8\xd2\xb0\x91\x54\x0a\x8b\x18\xd8\xe5\x46\x59\x15\xc2\x5d\xbc\x6b\x5c\x9a\x68\x79\x42\x53\x3c\x37\x2c\x8b\x4e\x95\xa9\x53\x67\x71\x69\xb9\x50\xed\xd3\x46\x43\x75\xcd\x43\x13\x2f\xf9\xbd\x54\x1e\xe2\x2b\xd4\x18\xce\x23\x19\x5f\x65\xd8\xb2\x89\xf6\x33\xec\x8d\x71\xe1\xa8\x01\xb0\x6c\x3c\x82\x7f\x62\x7e\x72\x3d\x21\x99\x10\x0c\xe7\x3e\x8e\x4a\x44\x40\xe7\x78\x31\x7a\x47\x49\x10\x79\x3b\x47\xb1\x0f\xfb\x55\xdb\x7f\x28\x1c\x7d\x7a\x03\x3b\xd8\x00\x48\xb8\x26\x73\xb8\x7c\xf9\x5e\x99\x42\x2b\xa6\x28\x68\x8f\x3c\x97\x18\x90\xca\x15\xd1\x2f\x57\x2f\xa1\x97\x7a\x17\x30\x70\x69\xda\x30\x4e\xad\x30\x26\xeb\x01\x04\x26\x68\x89\x0d\x17\x00\x8c\xd1\xe9\x2c\x46\xcb\xe9\xc8\x57\xe7\x19\x3d\xe3\xab\xa3\x91\x1e\x4f\x86\xfe\x0a\x16\x98\xab\x7c\xdb\x92\x51\xa8\x42\x4b\x28\x48\xb9\x6a\xd8\x1e\xa2\x39\xd3\x65\xfd\xea\x92\xea\x5c\x04\x73\xd0\xa6\xbb\x1e\x37\x13\x56\xbd\xfa\xd2\xd0\x35\x03\x36\xd3\xe1\x94\x7c\x93\x6f\xd0\xc2\x51\x95\x44\x50\x11\x73\x1b"}, +{{0x00,0x2f,0xdd,0x1f,0x76,0x41,0x79,0x3a,0xb0,0x64,0xbb,0x7a,0xa8,0x48,0xf7,0x62,0xe7,0xec,0x6e,0x33,0x2f,0xfc,0x26,0xee,0xac,0xda,0x14,0x1a,0xe3,0x3b,0x17,0x83,},{0x77,0xd1,0xd8,0xeb,0xac,0xd1,0x3f,0x4e,0x2f,0x8a,0x40,0xe2,0x8c,0x4a,0x63,0xbc,0x9c,0xe3,0xbf,0xb6,0x97,0x16,0x33,0x4b,0xcb,0x28,0xa3,0x3e,0xb1,0x34,0x08,0x6c,},{0x0d,0xf3,0xaa,0x0d,0x09,0x99,0xad,0x3d,0xc5,0x80,0x37,0x8f,0x52,0xd1,0x52,0x70,0x0d,0x5b,0x3b,0x05,0x7f,0x56,0xa6,0x6f,0x92,0x11,0x2e,0x44,0x1e,0x1c,0xb9,0x12,0x3c,0x66,0xf1,0x87,0x12,0xc8,0x7e,0xfe,0x22,0xd2,0x57,0x37,0x77,0x29,0x62,0x41,0x21,0x69,0x04,0xd7,0xcd,0xd7,0xd5,0xea,0x43,0x39,0x28,0xbd,0x28,0x72,0xfa,0x0c,},"\x5a\xc1\xdf\xc3\x24\xf4\x3e\x6c\xb7\x9a\x87\xab\x04\x70\xfa\x85\x7b\x51\xfb\x94\x49\x82\xe1\x90\x74\xca\x44\xb1\xe4\x00\x82\xc1\xd0\x7b\x92\xef\xa7\xea\x55\xad\x42\xb7\xc0\x27\xe0\xb9\xe3\x37\x56\xd9\x5a\x2c\x17\x96\xa7\xc2\x06\x68\x11\xdc\x41\x85\x83\x77\xd4\xb8\x35\xc1\x68\x8d\x63\x88\x84\xcd\x2a\xd8\x97\x0b\x74\xc1\xa5\x4a\xad\xd2\x70\x64\x16\x39\x28\xa7\x79\x88\xb2\x44\x03\xaa\x85\xaf\x82\xce\xab\x6b\x72\x8e\x55\x47\x61\xaf\x71\x75\xae\xb9\x92\x15\xb7\x42\x1e\x44\x74\xc0\x4d\x21\x3e\x01\xff\x03\xe3\x52\x9b\x11\x07\x7c\xdf\x28\x96\x4b\x8c\x49\xc5\x64\x9e\x3a\x46\xfa\x0a\x09\xdc\xd5\x9d\xca\xd5\x8b\x9b\x92\x2a\x83\x21\x0a\xcd\x5e\x65\x06\x55\x31\x40\x02\x34\xf5\xe4\x0c\xdd\xcf\x98\x04\x96\x8e\x3e\x9a\xc6\xf5\xc4\x4a\xf6\x50\x01\xe1\x58\x06\x7f\xc3\xa6\x60\x50\x2d\x13\xfa\x88\x74\xfa\x93\x33\x21\x38\xd9\x60\x6b\xc4\x1b\x4c\xee\x7e\xdc\x39\xd7\x53\xda\xe1\x2a\x87\x39\x41\xbb\x35\x7f\x7e\x92\xa4\x49\x88\x47\xd6\x60\x54\x56\xcb\x8c\x0b\x42\x5a\x47\xd7\xd3\xca\x37\xe5\x4e\x90\x3a\x41\xe6\x45\x0a\x35\xeb\xe5\x23\x7c\x6f\x0c\x1b\xbb\xc1\xfd\x71\xfb\x7c\xd8\x93\xd1\x89\x85\x02\x95\xc1\x99\xb7\xd8\x8a\xf2\x6b\xc8\x54\x89\x75\xfd\xa1\x09\x9f\xfe\xfe\xe4\x2a\x52\xf3\x42\x8d\xdf\xf3\x5e\x01\x73\xd3\x33\x95\x62\x50\x7a\xc5\xd2\xc4\x5b\xbd\x2c\x19\xcf\xe8\x9b"}, +{{0x25,0xb0,0xf0,0xbb,0x3d,0xcb,0x42,0x2a,0x6f,0x3c,0x6c,0x22,0x0e,0xaa,0xdb,0x11,0xdb,0xfe,0x48,0x9c,0x2d,0x45,0x5b,0x27,0x6c,0xef,0xe8,0xcb,0xa0,0x57,0xf9,0xf3,},{0xfe,0x03,0xc9,0xc4,0x39,0x4a,0xdc,0x74,0xb1,0x3f,0x47,0x65,0x4b,0xea,0xd8,0xbc,0x85,0x59,0x58,0xb4,0x19,0x4f,0xda,0xb2,0x09,0x7a,0xc1,0xb1,0x57,0x93,0x3c,0x05,},{0xda,0x50,0xd5,0x24,0x2b,0xf5,0x1c,0x39,0x51,0x78,0x0c,0xaf,0xd9,0x26,0xd6,0x7b,0xdf,0x56,0x40,0xd5,0xd3,0xbb,0x08,0x43,0x38,0x31,0xd5,0x6e,0x48,0xe2,0x59,0x2a,0x1c,0x37,0x59,0x68,0xbb,0x4d,0x2f,0xbe,0xa5,0x61,0x45,0xab,0xf2,0xd8,0x29,0x91,0x36,0x3b,0x15,0x65,0xfa,0x1e,0xff,0xe2,0x14,0x01,0x1a,0x68,0x6e,0x39,0x95,0x0e,},"\x54\xd9\x9f\x96\x9e\xfa\x88\x70\xfc\x20\xfa\x9a\x96\x2b\xb3\x72\x61\x9c\x32\x44\x39\x72\x8a\xf3\x13\x9c\x2a\x07\xe8\xc1\xb2\x9c\x1e\x4e\xed\xc2\xd4\x0b\xa7\x22\xf6\x3c\xe3\x76\x70\x36\x2a\xf6\xf5\x20\x2a\xdd\x66\x8c\x4f\xb4\xd6\x2f\xa8\xba\xcb\xc7\xd0\x7f\xf3\xbd\x38\xc1\x5a\x01\x06\x42\x59\xcc\x34\x13\x48\x61\x63\x29\x67\x46\x05\x41\xa9\x9b\x8d\x51\x82\xbf\x59\x34\x7b\x5a\x59\x87\x9a\xa3\xb0\x91\xa1\xf3\xe0\x41\x35\xbd\x63\x01\xbe\x52\x26\xd4\x89\x5e\x5e\x9c\x2b\x15\xe4\x8e\x5e\xcd\xf4\x41\x29\xe6\x12\x28\x53\xa6\x06\xfc\x11\x84\x66\xfa\x72\x0b\x5a\xb1\x65\x63\x5c\x3b\xde\x04\xd7\x42\x89\x27\x4f\xa0\x35\x47\xac\xcb\xde\x78\x0e\x1f\xa0\xbf\x2c\x56\xf8\x43\x6a\x53\xe7\x38\x78\xa4\x24\xa2\x9a\xa9\xde\x38\x5d\xba\x41\x9a\xe6\xa5\xd1\x2e\x00\x42\x76\x15\x2b\x58\xd3\x25\xb3\x02\x40\x0a\x55\x33\x3c\x38\xcd\xe4\x90\x8a\xe1\xd0\x12\x1c\xbe\xca\x95\x08\x09\xc5\x43\x31\x42\x77\xc1\x48\x5e\x68\xd9\xf9\xc0\xa9\x62\xd1\xb1\xe0\xdd\xa1\xd4\xa5\x2b\x56\xf8\x30\x8a\x80\xb9\x2a\xcc\x9f\x4e\xbc\x3e\xd4\x5d\x91\xa1\x29\xda\x86\x75\x62\x1a\xf6\x76\x70\x3d\xef\x3b\x84\x11\x31\x83\xb2\xe3\xa8\xc5\x61\x57\xf2\x43\xf1\x39\x80\xf3\xd1\x75\x6f\xea\x76\x68\xc9\x15\x03\xd3\x5c\x83\x9a\x21\x20\xc7\x9e\xc9\x54\xfb\x54\x6d\x7b\x54\x2f\x98\x72\x89\x53\x4f\xfd\xef\x62\xd4\x7f\xd5\xec"}, +{{0xbf,0x5b,0xa5,0xd6,0xa4,0x9d,0xd5,0xef,0x7b,0x4d,0x5d,0x7d,0x3e,0x4e,0xcc,0x50,0x5c,0x01,0xf6,0xcc,0xee,0x4c,0x54,0xb5,0xef,0x7b,0x40,0xaf,0x6a,0x45,0x41,0x40,},{0x1b,0xe0,0x34,0xf8,0x13,0x01,0x7b,0x90,0x0d,0x89,0x90,0xaf,0x45,0xfa,0xd5,0xb5,0x21,0x4b,0x57,0x3b,0xd3,0x03,0xef,0x7a,0x75,0xef,0x4b,0x8c,0x5c,0x5b,0x98,0x42,},{0x27,0x9c,0xac,0xe6,0xfd,0xaf,0x39,0x45,0xe3,0x83,0x7d,0xf4,0x74,0xb2,0x86,0x46,0x14,0x37,0x47,0x63,0x2b,0xed,0xe9,0x3e,0x7a,0x66,0xf5,0xca,0x29,0x1d,0x2c,0x24,0x97,0x85,0x12,0xca,0x0c,0xb8,0x82,0x7c,0x8c,0x32,0x26,0x85,0xbd,0x60,0x55,0x03,0xa5,0xec,0x94,0xdb,0xae,0x61,0xbb,0xdc,0xae,0x1e,0x49,0x65,0x06,0x02,0xbc,0x07,},"\x16\x15\x2c\x2e\x03\x7b\x1c\x0d\x32\x19\xce\xd8\xe0\x67\x4a\xee\x6b\x57\x83\x4b\x55\x10\x6c\x53\x44\x62\x53\x22\xda\x63\x8e\xce\xa2\xfc\x9a\x42\x4a\x05\xee\x95\x12\xd4\x8f\xcf\x75\xdd\x8b\xd4\x69\x1b\x3c\x10\xc2\x8e\xc9\x8e\xe1\xaf\xa5\xb8\x63\xd1\xc3\x67\x95\xed\x18\x10\x5d\xb3\xa9\xaa\xbd\x9d\x2b\x4c\x17\x47\xad\xba\xf1\xa5\x6f\xfc\xc0\xc5\x33\xc1\xc0\xfa\xef\x33\x1c\xdb\x79\xd9\x61\xfa\x39\xf8\x80\xa1\xb8\xb1\x16\x47\x41\x82\x2e\xfb\x15\xa7\x25\x9a\x46\x5b\xef\x21\x28\x55\x75\x1f\xab\x66\xa8\x97\xbf\xa2\x11\xab\xe0\xea\x2f\x2e\x1c\xd8\xa1\x1d\x80\xe1\x42\xcd\xe1\x26\x3e\xec\x26\x7a\x31\x38\xae\x1f\xcf\x40\x99\xdb\x0a\xb5\x3d\x64\xf3\x36\xf4\xbc\xd7\xa3\x63\xf6\xdb\x11\x2c\x0a\x24\x53\x05\x1a\x00\x06\xf8\x13\xaa\xf4\xae\x94\x8a\x20\x90\x61\x93\x74\xfa\x58\x05\x24\x09\xc2\x8e\xf7\x62\x25\x68\x7d\xf3\xcb\x2d\x1b\x0b\xfb\x43\xb0\x9f\x47\xf1\x23\x2f\x79\x0e\x6d\x8d\xea\x75\x9e\x57\x94\x20\x99\xf4\xc4\xbd\x33\x90\xf2\x8a\xfc\x20\x98\x24\x49\x61\x46\x5c\x64\x3f\xc8\xb2\x97\x66\xaf\x2b\xcb\xc5\x44\x0b\x86\xe8\x36\x08\xcf\xc9\x37\xbe\x98\xbb\x48\x27\xfd\x5e\x6b\x68\x9a\xdc\x2e\x26\x51\x3d\xb5\x31\x07\x6a\x65\x64\x39\x62\x55\xa0\x99\x75\xb7\x03\x4d\xac\x06\x46\x1b\x25\x56\x42\xe3\xa7\xed\x75\xfa\x9f\xc2\x65\x01\x1f\x5f\x62\x50\x38\x2a\x84\xac\x26\x8d\x63\xba\x64"}, +{{0x65,0xde,0x29,0x7b,0x70,0xcb,0xe8,0x09,0x80,0x50,0x0a,0xf0,0x56,0x1a,0x24,0xdb,0x50,0x00,0x10,0x00,0x12,0x5f,0x44,0x90,0x36,0x6d,0x83,0x00,0xd3,0x12,0x85,0x92,},{0xba,0x8e,0x2a,0xd9,0x29,0xbd,0xce,0xa5,0x38,0x74,0x10,0x42,0xb5,0x7f,0x20,0x67,0xd3,0x15,0x37,0x07,0xa4,0x53,0x77,0x0d,0xb9,0xf3,0xc4,0xca,0x75,0x50,0x4d,0x24,},{0x7a,0x9b,0x73,0x6b,0x01,0xcc,0x92,0xa3,0x34,0x9f,0x1a,0x3c,0x32,0xdb,0xd9,0x19,0x59,0x82,0x53,0x94,0xff,0x44,0x3c,0x56,0x74,0x05,0xe8,0x99,0xc8,0x18,0x5c,0xe8,0xfa,0xd9,0x50,0x0e,0x1f,0xce,0x89,0xd9,0x5a,0x62,0x53,0xc0,0x04,0x77,0x43,0x5a,0xcf,0x04,0xbf,0xf9,0x93,0xde,0x1b,0x00,0x49,0x5d,0xef,0x08,0x34,0xee,0x1f,0x07,},"\x13\x1d\x8f\x4c\x2c\x94\xb1\x53\x56\x5b\x86\x59\x2e\x77\x0c\x98\x7a\x44\x34\x61\xb3\x9a\xa2\x40\x8b\x29\xe2\x13\xab\x05\x7a\xff\xc5\x98\xb5\x83\x73\x9d\x66\x03\xa8\x3f\xef\x0a\xfc\x51\x47\x21\xdb\x0e\x76\xf9\xbd\x1b\x72\xb9\x8c\x56\x5c\xc8\x88\x1a\xf5\x74\x7c\x0b\xa6\xf5\x8c\x53\xdd\x23\x77\xda\x6c\x0d\x3a\xa8\x05\x62\x0c\xc4\xe7\x5d\x52\xaa\xbc\xba\x1f\x9b\x28\x49\xe0\x8b\xd1\xb6\xb9\x2e\x6f\x06\x61\x5b\x81\x45\x19\x60\x6a\x02\xdc\x65\xa8\x60\x9f\x5b\x29\xe9\xc2\xaf\x5a\x89\x4f\x71\x16\xef\x28\xcf\xd1\xe7\xb7\x6b\x64\x06\x17\x32\xf7\xa5\xa3\xf8\xaa\x4c\x2e\x56\x9e\x62\x7a\x3f\x97\x49\xaa\x59\x7b\xe4\x9d\x6b\x94\x43\x6c\x35\x2d\xd5\xfa\x7b\x83\xc9\x2d\x26\x10\xfa\xa3\x20\x95\xca\x30\x21\x52\xd9\x1a\x3c\x97\x76\x75\x0e\x75\x8e\xe8\xe9\xe4\x02\xc6\xf5\x38\x5e\xaa\x5d\xf2\x38\x50\xe5\x4b\xeb\x1b\xe4\x37\xa4\x16\xc7\x11\x5e\xd6\xaa\x6d\xe1\x3b\x55\x48\x25\x32\x78\x7e\x0b\xee\x34\xb8\x3f\x30\x84\x40\x67\x65\x63\x54\x97\xc9\x31\xb6\x2a\x05\x18\xf1\xfb\xc2\xb8\x91\xdc\x72\x62\xc7\xc6\xb6\x7e\xda\x59\x4f\xa5\x30\xd7\x4c\x93\x29\xba\xd5\xbe\x94\xc2\x87\xfb\xcd\xe5\x3a\xa8\x02\x72\xb8\x33\x22\x61\x3d\x93\x68\xe5\x90\x40\x76\xfd\xbc\xc8\x8b\x2c\x0e\x59\xc1\x0b\x02\xc4\x48\xe0\x0d\x1b\x3e\x7a\x9c\x96\x40\xfe\xff\xb9\x52\x3a\x8a\x60\xe1\xd8\x3f\x04\xa4\xb8\xdf\x69\x15\x3b"}, +{{0x08,0x26,0xe7,0x33,0x33,0x24,0xe7,0xec,0x8c,0x76,0x42,0x92,0xf6,0x01,0x5d,0x46,0x70,0xe9,0xb8,0xd7,0xc4,0xa8,0x9e,0x8d,0x90,0x9e,0x8e,0xf4,0x35,0xd1,0x8d,0x15,},{0xff,0xb2,0x34,0x8c,0xa8,0xa0,0x18,0x05,0x8b,0xe7,0x1d,0x15,0x12,0xf3,0x76,0xf9,0x1e,0x8b,0x0d,0x55,0x25,0x81,0x25,0x4e,0x10,0x76,0x02,0x21,0x73,0x95,0xe6,0x62,},{0x4b,0xac,0x7f,0xab,0xec,0x87,0x24,0xd8,0x1a,0xb0,0x9a,0xe1,0x30,0x87,0x4d,0x70,0xb5,0x21,0x34,0x92,0x10,0x43,0x72,0xf6,0x01,0xae,0x5a,0xbb,0x10,0x53,0x27,0x99,0x37,0x3c,0x4d,0xad,0x21,0x58,0x76,0x44,0x1f,0x47,0x4e,0x2c,0x00,0x6b,0xe3,0x7c,0x3c,0x8f,0x5f,0x6f,0x01,0x7d,0x08,0x70,0x41,0x4f,0xd2,0x76,0xa8,0xf4,0x28,0x08,},"\x7f\x9e\x3e\x2f\x03\xc9\xdf\x3d\x21\xb9\x90\xf5\xa4\xaf\x82\x95\x73\x4a\xfe\x78\x3a\xcc\xc3\x4f\xb1\xe9\xb8\xe9\x5a\x0f\xd8\x37\xaf\x7e\x05\xc1\x3c\xda\x0d\xe8\xfa\xda\xc9\x20\x52\x65\xa0\x79\x2b\x52\x56\x3b\xdc\x2f\xee\x76\x63\x48\xbe\xfc\xc5\x6b\x88\xbb\xb9\x5f\x15\x44\x14\xfb\x18\x6e\xc4\x36\xaa\x62\xea\x6f\xca\xbb\x11\xc0\x17\xa9\xd2\xd1\x5f\x67\xe5\x95\x98\x0e\x04\xc9\x31\x3b\xc9\x4f\xbc\x8c\x11\x34\xc2\xf4\x03\x32\xbc\x7e\x31\x1a\xc1\xce\x11\xb5\x05\xf8\x57\x2a\xda\x7f\xbe\x19\x6f\xba\x82\x2d\x9a\x91\x44\x92\xfa\x71\x85\xe9\xf3\xbe\xa4\x68\x72\x00\xa5\x24\xc6\x73\xa1\xcd\xf8\x7e\xb3\xa1\x40\xdc\xdb\x6a\x88\x75\x61\x34\x88\xa2\xb0\x0a\xdf\x71\x75\x34\x1c\x1c\x25\x76\x35\xfa\x1a\x53\xa3\xe2\x1d\x60\xc2\x28\x39\x9e\xea\x09\x91\xf1\x12\xc6\x0f\x65\x3d\x71\x48\xe2\xc5\xce\xb9\x8f\x94\x08\x31\xf0\x70\xdb\x10\x84\xd7\x91\x56\xcc\x82\xc4\x6b\xc9\xb8\xe8\x84\xf3\xfa\x81\xbe\x2d\xa4\xcd\xda\x46\xbc\xaa\x24\xcc\x46\x1f\x76\xee\x64\x7b\xb0\xf0\xf8\xc1\x5a\xc5\xda\xa7\x95\xb9\x45\xe6\xf8\x5b\xb3\x10\x36\x2e\x48\xd8\x09\x5c\x78\x2c\x61\xc5\x2b\x48\x1b\x4b\x00\x2a\xd0\x6e\xa7\x4b\x8d\x30\x6e\xff\x71\xab\xf2\x1d\xb7\x10\xa8\x91\x3c\xbe\x48\x33\x2b\xe0\xa0\xb3\xf3\x1e\x0c\x7a\x6e\xba\x85\xce\x33\xf3\x57\xc7\xae\xcc\xd3\x0b\xfb\x1a\x65\x74\x40\x8b\x66\xfe\x40\x4d\x31\xc3\xc5"}, +{{0x00,0xad,0x62,0x27,0x97,0x7b,0x5f,0x38,0xcc,0xda,0x99,0x4d,0x92,0x8b,0xba,0x90,0x86,0xd2,0xda,0xeb,0x01,0x3f,0x86,0x90,0xdb,0x98,0x66,0x48,0xb9,0x0c,0x1d,0x45,},{0x91,0xa4,0xea,0x00,0x57,0x52,0xb9,0x2c,0xbe,0xbf,0x99,0xa8,0xa5,0xcb,0xec,0xd2,0x40,0xae,0x3f,0x01,0x6c,0x44,0xad,0x14,0x1b,0x2e,0x57,0xdd,0xc7,0x73,0xdc,0x8e,},{0xdc,0x50,0x1d,0xb7,0x9f,0xd7,0x82,0xbc,0x88,0xca,0xe7,0x92,0x55,0x7d,0x5d,0x27,0x3f,0x9b,0xa5,0x60,0xc7,0xd9,0x00,0x37,0xfe,0x84,0xac,0x87,0x9d,0x68,0x4f,0x61,0x2a,0x77,0x45,0x2c,0x44,0x43,0xe9,0x5c,0x07,0xb8,0xbe,0x19,0x2c,0x35,0x76,0x9b,0x17,0xbb,0xdf,0xca,0x42,0x28,0x0d,0xe7,0x96,0xd9,0x21,0x19,0xd8,0x33,0x67,0x0d,},"\xcb\x5b\xc5\xb9\x8b\x2e\xfc\xe4\x35\x43\xe9\x1d\xf0\x41\xe0\xdb\xb5\x3e\xd8\xf6\x7b\xf0\xf1\x97\xc5\x2b\x22\x11\xe7\xa4\x5e\x2e\x1e\xc8\x18\xc1\xa8\x0e\x10\xab\xf6\xa4\x35\x35\xf5\xb7\x9d\x97\x4d\x8a\xe2\x8a\x22\x95\xc0\xa6\x52\x17\x63\xb6\x07\xd5\x10\x3c\x6a\xef\x3b\x27\x86\xbd\x5a\xfd\x75\x63\x69\x56\x60\x68\x43\x37\xbc\x30\x90\x73\x9f\xb1\xcd\x53\xa9\xd6\x44\x13\x9b\x6d\x4c\xae\xc7\x5b\xda\x7f\x25\x21\xfb\xfe\x67\x6a\xb4\x5b\x98\xcb\x31\x7a\xa7\xca\x79\xfc\x54\xa3\xd7\xc5\x78\x46\x6a\x6a\xa6\x4e\x43\x4e\x92\x34\x65\xa7\xf2\x11\xaa\x0c\x61\x68\x1b\xb8\x48\x6e\x90\x20\x6a\x25\x25\x0d\x3f\xda\xe6\xfb\x03\x29\x97\x21\xe9\x9e\x2a\x91\x49\x10\xd9\x17\x60\x08\x9b\x5d\x28\x1e\x13\x1e\x6c\x83\x6b\xc2\xde\x08\xf7\xe0\x2c\x48\xd3\x23\xc6\x47\xe9\x53\x6c\x00\xec\x10\x39\x20\x1c\x03\x62\x61\x8c\x7d\x47\xaa\x8e\x7b\x97\x15\xff\xc4\x39\x98\x7a\xe1\xd3\x11\x54\xa6\x19\x8c\x5a\xa1\x1c\x12\x8f\x40\x82\xf5\x56\xc9\x9b\xaf\x10\x3e\xca\xdc\x3b\x2f\x3b\x2e\xc5\xb4\x69\x62\x3b\xc0\x3a\x53\xca\xf3\x81\x4b\x16\x30\x0a\xed\xbd\xa5\x38\xd6\x76\xd1\xf6\x07\x10\x26\x39\xdb\x2a\x62\xc4\x46\x70\x7c\xe6\x46\x9b\xd8\x73\xa0\x46\x82\x25\xbe\x88\xb0\xae\xf5\xd4\x02\x04\x59\xb9\x4b\x32\xfe\x2b\x01\x33\xe9\x2e\x7b\xa5\x4d\xd2\xa5\x39\x7e\xd8\x5f\x96\x6a\xb3\x9e\xd0\x73\x0c\xca\x8e\x7d\xac\xb8\xa3\x36"}, +{{0x15,0x21,0xc6,0xdb,0xd6,0xf7,0x24,0xde,0x73,0xea,0xf7,0xb5,0x62,0x64,0xf0,0x10,0x35,0xc0,0x4e,0x01,0xc1,0xf3,0xeb,0x3c,0xbe,0x83,0xef,0xd2,0x6c,0x43,0x9a,0xda,},{0x2f,0x61,0xa2,0x6f,0xfb,0x68,0xba,0x4f,0x6e,0x14,0x15,0x29,0xdc,0x26,0x17,0xe8,0x53,0x1c,0x71,0x51,0x40,0x48,0x08,0x09,0x3b,0x4f,0xa7,0xfe,0xda,0xea,0x25,0x5d,},{0xa8,0x17,0xed,0x23,0xec,0x39,0x8a,0x12,0x86,0x01,0xc1,0x83,0x2d,0xc6,0xaf,0x76,0x43,0xbf,0x3a,0x5f,0x51,0x7b,0xcc,0x57,0x94,0x50,0xfd,0xb4,0x75,0x90,0x28,0xf4,0x96,0x61,0x64,0x12,0x5f,0x6e,0xbd,0x0d,0x6b,0xf8,0x6f,0xf2,0x98,0xa3,0x9c,0x76,0x6d,0x0c,0x21,0xfd,0xb0,0xcb,0xfd,0xf8,0x1c,0xd0,0xeb,0x1f,0x03,0xcd,0x8a,0x08,},"\x3e\x3c\x7c\x49\x07\x88\xe4\xb1\xd4\x2f\x5c\xbc\xae\x3a\x99\x30\xbf\x61\x7e\xbd\xff\x44\x7f\x7b\xe2\xac\x2b\xa7\xcd\x5b\xcf\xc0\x15\x76\x09\x63\xe6\xfe\x5b\x95\x6f\xb7\xcd\xb3\x5b\xd5\xa1\x7f\x54\x29\xca\x66\x4f\x43\x7f\x08\x75\x3a\x74\x1c\x2b\xc8\x69\x2b\x71\xa9\x11\x5c\x58\x2a\x25\xb2\xf7\x4d\x32\x98\x54\xd6\x0b\x78\x17\xc0\x79\xb3\x52\x3a\xaf\xf8\x79\x3c\x2f\x72\xff\xf8\xcd\x10\x59\x2c\x54\xe7\x38\xdf\x1d\x64\x52\xfb\x72\xda\x13\x1c\x67\x31\xea\x5c\x95\x3c\x62\xea\x17\x7a\xc1\xf4\x73\x5e\x51\x54\x47\x73\x87\x10\x9a\xfa\xe1\x5f\x3e\xd6\xee\xb0\x86\x06\xe2\x8c\x81\xd4\x38\x6f\x03\xb9\x37\x69\x24\xb6\xef\x8d\x22\x1e\xe2\x95\x47\xf8\x2a\x7e\xde\x48\xe1\xdc\x17\x72\x3e\x3d\x42\x17\x1e\xea\xf9\x6a\xc8\x4b\xed\xc2\xa0\x1d\xd8\x6f\x4d\x08\x57\x34\xfd\x69\xf9\x1b\x52\x63\xe4\x39\x08\x3f\xf0\x31\x85\x36\xad\xff\x41\x47\x30\x8e\x3a\xaf\xd1\xb5\x8b\xb7\x4f\x6f\xb0\x21\x4a\x46\xfd\xcd\x35\x24\xf1\x8d\xf5\xa7\x19\xce\x57\x31\x9e\x79\x1b\x4e\xa6\x06\xb4\x99\xbf\xa5\x7a\x60\xe7\x07\xf9\x4e\x18\xf1\xfe\xd2\x2f\x91\xbc\x79\xe6\x36\x4a\x84\x3f\x9c\xbf\x93\x82\x5c\x46\x5e\x9c\xae\x90\x72\xbc\x9d\x3e\xc4\x47\x1f\x21\xab\x2f\x7e\x99\xa6\x33\xf5\x87\xaa\xc3\xdb\x78\xae\x96\x66\xa8\x9a\x18\x00\x8d\xd6\x1d\x60\x21\x85\x54\x41\x1a\x65\x74\x0f\xfd\x1a\xe3\xad\xc0\x65\x95\xe3\xb7\x87\x64\x07\xb6"}, +{{0x17,0xe5,0xf0,0xa8,0xf3,0x47,0x51,0xba,0xbc,0x5c,0x72,0x3e,0xcf,0x33,0x93,0x06,0x99,0x2f,0x39,0xea,0x06,0x5a,0xc1,0x40,0xfc,0xbc,0x39,0x7d,0x2d,0xd3,0x2c,0x4b,},{0x4f,0x1e,0x23,0xcc,0x0f,0x2f,0x69,0xc8,0x8e,0xf9,0x16,0x2a,0xb5,0xf8,0xc5,0x9f,0xb3,0xb8,0xab,0x20,0x96,0xb7,0x7e,0x78,0x2c,0x63,0xc0,0x7c,0x8c,0x4f,0x2b,0x60,},{0xef,0xe2,0xcb,0x63,0xfe,0x7b,0x4f,0xc9,0x89,0x46,0xdc,0x82,0xfb,0x69,0x98,0xe7,0x41,0xed,0x9c,0xe6,0xb9,0xc1,0xa9,0x3b,0xb4,0x5b,0xc0,0xa7,0xd8,0x39,0x6d,0x74,0x05,0x28,0x2b,0x43,0xfe,0x36,0x3b,0xa5,0xb2,0x35,0x89,0xf8,0xe1,0xfa,0xe1,0x30,0xe1,0x57,0xce,0x88,0x8c,0xd7,0x2d,0x05,0x3d,0x0c,0xc1,0x9d,0x25,0x7a,0x43,0x00,},"\xc0\xfa\xd7\x90\x02\x40\x19\xbd\x6f\xc0\x8a\x7a\x92\xf5\xf2\xac\x35\xcf\x64\x32\xe2\xea\xa5\x3d\x48\x2f\x6e\x12\x04\x93\x53\x36\xcb\x3a\xe6\x5a\x63\xc2\x4d\x0e\xc6\x53\x9a\x10\xee\x18\x76\x0f\x2f\x52\x05\x37\x77\x4c\xde\xc6\xe9\x6b\x55\x53\x60\x11\xda\xa8\xf8\xbc\xb9\xcd\xaf\x6d\xf5\xb3\x46\x48\x44\x8a\xc7\xd7\xcb\x7c\x6b\xd8\x0d\x67\xfb\xf3\x30\xf8\x76\x52\x97\x76\x60\x46\xa9\x25\xab\x52\x41\x1d\x16\x04\xc3\xed\x6a\x85\x17\x30\x40\x12\x56\x58\xa3\x2c\xf4\xc8\x54\xef\x28\x13\xdf\x2b\xe6\xf3\x83\x0e\x5e\xee\x5a\x61\x63\xa8\x3c\xa8\x84\x9f\x61\x29\x91\xa3\x1e\x9f\x88\x02\x8e\x50\xbf\x85\x35\xe1\x17\x55\xfa\xd0\x29\xd9\x4c\xf2\x59\x59\xf6\x69\x5d\x09\xc1\xba\x43\x15\xd4\x0f\x7c\xf5\x1b\x3f\x81\x66\xd0\x2f\xab\xa7\x51\x1e\xcd\x8b\x1d\xde\xd5\xf1\x0c\xd6\x84\x34\x55\xcf\xf7\x07\xed\x22\x53\x96\xc6\x1d\x08\x20\xd2\x0a\xda\x70\xd0\xc3\x61\x9f\xf6\x79\x42\x20\x61\xc9\xf7\xc7\x6e\x97\xd5\xa3\x7a\xf6\x1f\xd6\x22\x12\xd2\xda\xfc\x64\x7e\xbb\xb9\x79\xe6\x1d\x90\x70\xec\x03\x60\x9a\x07\xf5\xfc\x57\xd1\x19\xae\x64\xb7\xa6\xef\x92\xa5\xaf\xae\x66\x0a\x30\xed\x48\xd7\x02\xcc\x31\x28\xc6\x33\xb4\xf1\x90\x60\xa0\x57\x81\x01\x72\x9e\xe9\x79\xf7\x90\xf4\x5b\xdb\xb5\xfe\x1a\x8a\x62\xf0\x1a\x61\xa3\x1d\x61\xaf\x07\x03\x04\x50\xfa\x04\x17\x32\x3e\x94\x07\xbc\x76\xe7\x31\x30\xe7\xc6\x9d\x62\xe6\xa7"}, +{{0x0c,0xd7,0xaa,0x7d,0x60,0x5e,0x44,0xd5,0xff,0xb9,0x79,0x66,0xb2,0xcb,0x93,0xc1,0x89,0xe4,0xc5,0xa8,0x5d,0xb8,0x7f,0xad,0x7a,0xb8,0xd6,0x24,0x63,0xc5,0x9b,0x59,},{0x48,0x89,0x85,0x5f,0xe4,0x11,0x6b,0x49,0x13,0x92,0x7f,0x47,0xf2,0x27,0x3b,0xf5,0x59,0xc3,0xb3,0x94,0xa9,0x83,0x63,0x1a,0x25,0xae,0x59,0x70,0x33,0x18,0x5e,0x46,},{0xbf,0x91,0x15,0xfd,0x3d,0x02,0x70,0x6e,0x39,0x8d,0x4b,0xf3,0xb0,0x2a,0x82,0x67,0x4f,0xf3,0x04,0x15,0x08,0xfd,0x39,0xd2,0x9f,0x86,0x7e,0x50,0x16,0x34,0xb9,0x26,0x1f,0x51,0x6a,0x79,0x4f,0x98,0x73,0x8d,0x7c,0x70,0x13,0xa3,0xf2,0xf8,0x58,0xff,0xdd,0x08,0x04,0x7f,0xb6,0xbf,0x3d,0xdd,0xfb,0x4b,0x4f,0x4c,0xbe,0xef,0x30,0x03,},"\x28\xa5\x5d\xda\x6c\xd0\x84\x4b\x65\x77\xc9\xd6\xda\x07\x3a\x4d\xc3\x5c\xbc\x98\xac\x15\x8a\xb5\x4c\xf8\x8f\xd2\x0c\xc8\x7e\x83\xc4\xbb\xa2\xd7\x4d\x82\xce\x0f\x48\x54\xec\x4d\xb5\x13\xde\x40\x04\x65\xaa\xa5\xee\xe7\x90\xbc\x84\xf1\x63\x37\x07\x2d\x3a\x91\xcd\xe4\x0d\x6e\x0d\xf1\xba\x0c\xc0\x64\x5f\x5d\x5c\xbb\xb6\x42\x38\x1d\x7b\x9e\x21\x1d\x25\x26\x7a\x8a\xcf\x77\xd1\xed\xb6\x9c\x3a\x63\x0f\x5b\x13\x3d\x24\xf0\x46\xa8\x1b\xf2\x2f\xf0\x3b\x31\xd8\x44\x7e\x12\xc3\xf7\xb7\x71\x14\xa7\x0c\xbd\x20\xbb\xd0\x8b\x0b\x38\x27\xa6\xbb\xcf\x90\x40\x9e\x34\x44\x47\xa7\xfb\xc5\x9b\xdd\x97\xd7\x29\x07\x1f\x8d\x71\xdc\xc3\x3e\x6e\xf2\xcb\xab\x1d\x41\x1e\xdf\x13\x73\x4d\xb1\xdd\x97\x03\x27\x6f\x5e\xb2\xd6\xaa\x2c\xb8\x95\x2d\xd6\x71\x2b\xfa\xe8\x09\xce\x08\xc3\xaa\x50\x2b\x81\x35\x71\x3f\xac\x0a\x9c\x25\xb1\xd4\x5b\x6a\x58\x31\xe0\x24\x21\xbb\xa6\x5b\x81\xa5\x96\xef\xa2\x4b\x05\x76\xbd\x1d\xc7\xfd\xfb\x49\xbe\x76\x28\x75\xe8\x1b\xd5\x40\x72\x2b\xc0\x61\x40\xb9\xaa\x2e\xf7\xb8\x4a\x80\x1e\x41\xde\xd6\x8d\x45\x46\xac\x48\x73\xd9\xe7\xce\xd6\x49\xb6\x4f\xad\xaf\x0b\x5c\x4b\x6e\xb8\xd0\x36\x31\x52\x33\xf4\x32\x6c\xa0\x1e\x03\x39\x30\x50\xcd\x02\x7c\x24\xf6\x73\x03\xfb\x84\x6b\xd2\xc6\xb3\xdb\xa0\x6b\xed\x0d\x59\xa3\x62\x89\xd2\x4b\xd6\x48\xf7\xdb\x0b\x3a\x81\x34\x66\x12\x59\x3e\x3d\xdd\x18\xc5\x57"}, +{{0x33,0x37,0x1d,0x9e,0x89,0x2f,0x98,0x75,0x05,0x2a,0xc8,0xe3,0x25,0xba,0x50,0x5e,0x74,0x77,0xc1,0xac,0xe2,0x4b,0xa7,0x82,0x26,0x43,0xd4,0x3d,0x0a,0xce,0xf3,0xde,},{0x35,0x92,0x9b,0xde,0xd2,0x7c,0x24,0x9c,0x87,0xd8,0xb8,0xd8,0x2f,0x59,0x26,0x0a,0x57,0x53,0x27,0xb5,0x46,0xc3,0xa1,0x67,0xc6,0x9f,0x59,0x92,0xd5,0xb8,0xe0,0x06,},{0x98,0x5c,0xa4,0x46,0xdd,0xc0,0x07,0x82,0x7c,0xc8,0xf2,0x85,0x2c,0xbd,0x81,0x15,0xef,0x8c,0x59,0x75,0xe9,0xd7,0xce,0x96,0xd7,0x4d,0xfe,0xd8,0x59,0xaa,0x14,0xa4,0xc1,0x52,0x54,0x00,0x6b,0xea,0x5e,0x08,0x35,0x9e,0xfe,0x26,0x25,0xd7,0x15,0xe0,0x89,0x7e,0xe5,0xa1,0x6f,0x15,0x12,0x03,0xbe,0x50,0x10,0x41,0x86,0x37,0xde,0x05,},"\x27\xa3\x2e\xfb\xa2\x82\x04\xbe\x59\xb7\xff\x5f\xe4\x88\xca\x15\x8a\x91\xd5\x98\x60\x91\xec\xc4\x45\x8b\x49\xe0\x90\xdd\x37\xcb\xfe\xde\x7c\x0f\x46\x18\x6f\xab\xcb\xdf\xf7\x8d\x28\x44\x15\x58\x08\xef\xff\xd8\x73\xed\x9c\x92\x61\x52\x6e\x04\xe4\xf7\x05\x0b\x8d\x7b\xd2\x67\xa0\xfe\x3d\x5a\x44\x93\x78\xd5\x4a\x4f\xeb\xbd\x2f\x26\x82\x43\x38\xe2\xaa\xaf\x35\xa3\x2f\xf0\xf6\x25\x04\xbd\xa5\xc2\xe4\x4a\xbc\x63\x15\x9f\x33\x6c\xf2\x5e\x6b\xb4\x0d\xdb\x7d\x88\x25\xdf\xf1\x8f\xd5\x1f\xc0\x19\x51\xea\xed\xcd\x33\x70\x70\x07\xe1\x20\x3c\xa5\x8b\x4f\x7d\x24\x2f\x81\x66\xa9\x07\xe0\x99\x93\x2c\x00\x1b\xfb\x1e\xc9\xa6\x1e\x0e\xf2\xda\x4e\x84\x46\xaf\x20\x82\x01\x31\x5d\x69\x68\x17\x10\xd4\x25\xd2\x40\x0c\x38\x7d\x7b\x9d\xf3\x21\xa4\xae\xc6\x02\xb9\xc6\x56\xc3\xe2\x31\x0b\xff\x87\x56\xd1\x8b\x80\x21\x34\xb1\x56\x04\xf4\xed\xc1\x11\x14\x9a\x98\x79\xe3\x12\x41\xdd\x34\xf7\x02\xf4\xc3\x49\x61\x7b\x13\x52\x97\x69\xa7\x72\xf5\xe5\x2a\x89\xc0\x98\xe0\xdc\xa5\x92\x06\x67\x89\x3a\x25\x00\x61\xb1\x79\x91\x62\x6e\xb9\x31\x92\x98\x68\x5b\xe4\x6b\x6a\x8b\x68\x42\x24\x44\xfa\x5a\x36\xbc\xf3\xa6\x87\xe2\xec\xcb\x93\x22\xc8\x7d\xc8\x01\x65\xda\x89\x89\x30\x85\x0b\x98\xfc\x86\x3c\xad\xa1\xaa\x99\xc6\xd6\x1c\x45\x1b\x9c\xcf\x48\x74\xc7\xf0\xe7\x5b\x0a\x0c\x60\x2f\x04\x48\x12\xc7\x17\x65\xad\xaf\x02\x02\x53\x95\xb0"}, +{{0xbe,0xed,0xb8,0x07,0x3d,0xf5,0x8f,0x8c,0x1b,0xff,0xbd,0xbd,0x77,0xec,0x7d,0xec,0xb2,0xc8,0x2a,0x9b,0xab,0xec,0xef,0xc0,0x33,0x15,0x07,0xbd,0xc2,0xc2,0xa7,0xe7,},{0xb2,0x7e,0x90,0x8b,0x80,0x5e,0x29,0x6f,0xc3,0x0d,0x2e,0x47,0x4b,0x06,0x0c,0xd5,0x0c,0x0f,0x6f,0x52,0x0b,0x36,0x71,0x71,0x21,0x83,0xbd,0x89,0xd4,0xe7,0x33,0xe9,},{0x8c,0x89,0x0c,0xcc,0xad,0xc7,0x76,0x0e,0x1e,0x82,0xe4,0x3c,0x44,0xb3,0xdc,0x0b,0x68,0x5a,0x48,0xb4,0x79,0xae,0x13,0xcc,0x0a,0x6b,0x05,0x57,0xd0,0xfb,0x1c,0xba,0xbb,0xa6,0x3d,0x2a,0x96,0x84,0x34,0x12,0xea,0x8d,0x36,0xc5,0x0a,0xcb,0xf5,0x2b,0x92,0xcf,0xb2,0xdc,0xe4,0x9d,0xc4,0x8a,0xf6,0xdd,0xcf,0x8e,0xe4,0x7a,0x86,0x08,},"\x35\xca\x57\xf0\xf9\x15\xe5\x20\x9d\x54\xea\x4b\x87\x1f\xfb\x58\x53\x54\xdf\x1b\x4a\x4a\x17\x96\xfb\xe4\xd6\x22\x7d\x3e\x1a\xba\x51\x71\xed\x03\x91\xa7\x9e\x83\xe2\x4d\x82\xfd\xaf\xd1\x5c\x17\xb2\x8b\xf6\xc9\x4d\x61\x8c\x74\xd6\x52\x64\xe5\x8f\xaa\xac\xd2\x90\x28\x72\xfd\xd0\xef\xa2\x2e\x8d\x2d\x7c\xe8\xe3\xb8\x19\x7f\x0c\x36\x15\xb0\xa3\x85\x23\x5f\xa9\xfd\x8e\x45\x64\xee\x6e\x6b\x16\x50\xb4\xcf\xb9\x4d\x87\x2c\x80\x5c\x32\xd4\xf3\xa1\x8f\x96\x64\x61\xd3\xad\xbb\x60\x5f\xa5\x25\x88\x4f\x8e\xb1\x97\x62\x73\x96\xba\x4d\x99\x5d\x78\xac\x02\x94\x8a\x0e\xaa\xbb\x58\x51\x9b\x9a\x8e\x2e\x79\x85\xcd\x1d\xe2\xc7\x1d\x89\x18\xd9\x6a\x01\x68\x66\x0c\xe1\x7c\xdd\xf3\x64\xe3\xec\x0d\x4b\xd9\x0f\x21\x04\x75\x1a\x19\x27\xee\x1d\x23\xf3\xe7\xa6\x98\x40\xed\x04\x0b\x00\xe5\xf6\xe4\x86\x6e\xc5\x88\x13\x14\x9c\xc3\x82\xae\xbf\x61\x62\x60\x8c\x79\x57\x4d\x55\x3f\x47\x23\x0e\x92\x4a\x0e\xf1\xeb\xf5\x5d\x8e\x1a\x52\xab\xb6\x2a\x2d\x7a\xc8\x60\x27\xc7\xc0\x3c\xc8\x3f\xa1\x94\x9d\xa2\x9e\x2f\x30\x37\xab\x98\x6f\xd2\xff\xfe\x65\x0e\x31\x49\xba\xba\xe5\xa5\x0b\x1e\xe9\x69\x6f\x3b\xab\xec\x72\xe2\x96\x97\xc8\x24\x22\x81\x4d\x27\x20\x85\x50\x0f\xd8\x37\xfe\x3c\x7a\x97\x3e\xf4\xc1\x69\xaf\x12\xdd\x7f\x02\x70\x06\x20\xbb\x04\x5b\xdb\xf8\x46\x23\xf3\x26\x35\x05\x70\xb3\xca\xdb\xc9\xae\xa4\x20\x0b\x28\x28\x7e\x17\xab"}, +{{0x91,0x84,0xef,0x61,0x88,0x16,0x83,0x25,0x92,0xbc,0x8e,0xb3,0x5f,0x4f,0xfd,0x4f,0xf9,0x8d,0xfb,0xf7,0x77,0x6c,0x90,0xf2,0xaa,0xd2,0x12,0xce,0x7e,0x03,0x35,0x1e,},{0x68,0x7b,0x77,0x26,0x01,0x0d,0x9b,0xde,0x2c,0x90,0xe5,0x73,0xcd,0x2a,0x2a,0x70,0x2f,0xf2,0x8c,0x4a,0x2a,0xf7,0x0a,0xfc,0x73,0x15,0xc9,0x4d,0x57,0x56,0x01,0xe5,},{0xb3,0xc2,0x4e,0x75,0x13,0x2c,0x56,0x34,0x75,0x42,0x2d,0x5e,0xa4,0x12,0xb5,0xc1,0xe8,0xe6,0xe5,0xea,0x1c,0x08,0xea,0xd1,0x39,0x3c,0x41,0x2d,0xa1,0x34,0xc9,0xa1,0x63,0x82,0x84,0xea,0x7e,0x2c,0xa0,0x32,0xfe,0x3d,0x3e,0x32,0xa9,0x06,0x6a,0x8c,0x88,0x39,0x90,0x3f,0x6e,0xf4,0x6e,0x96,0x6b,0xb5,0xe4,0x92,0xd8,0xc2,0xaa,0x00,},"\x72\x9e\xb7\xe5\x4a\x9d\x00\xc5\x86\x17\xaf\x18\xc3\x45\xb8\xdc\x6e\x5b\x4e\x0f\x57\xde\x2f\x3c\x02\xe5\x4a\x2e\xc8\xf1\x42\x5e\xc2\xe2\x40\x77\x5b\x5a\xb0\xc1\x0f\x84\xac\x8b\xaf\xda\x45\x84\xf7\xe2\x1c\x65\x5f\xae\xcd\x80\x30\xa9\x89\x06\xbd\x68\x39\x8f\x26\xb5\xd5\x8d\x92\xb6\xcf\x04\x5e\x9b\xd9\x74\x3c\x74\xc9\xa3\x42\xec\x61\xce\x57\xf3\x7b\x98\x1e\xac\x4d\x8b\xf0\x34\x60\x88\x66\xe9\x85\xbb\x68\x68\x6a\x68\xb4\xa2\xaf\x88\xb9\x92\xa2\xa6\xd2\xdc\x8c\xe8\x8b\xfb\x0a\x36\xcf\x28\xbb\xab\x70\x24\xab\xfa\x2b\xea\x53\x31\x3b\x66\xc9\x06\xf4\xf7\xcf\x66\x97\x0f\x54\x00\x95\xbd\x01\x04\xaa\x49\x24\xdd\x82\xe1\x54\x13\xc2\x26\x79\xf8\x47\xe4\x8c\xd0\xc7\xec\x1f\x67\x7e\x00\x5f\xec\x01\x77\xfb\xd5\xc5\x59\xfc\x39\xad\xd6\x13\x99\x1f\xba\xea\xe4\xd2\x4d\x39\xd3\x09\xef\x74\x64\x7f\x81\x92\xcc\x4c\x62\xd0\x64\x20\x28\xc7\x6a\x1b\x95\x1f\x6b\xc9\x63\x9d\xeb\x91\xec\xc0\x8b\xe6\x04\x3f\x21\x09\x70\x5a\x42\xc7\xea\xe7\x12\x64\x9d\x91\xd9\x6c\xcb\xbf\xb6\x3d\x8d\x0d\xd6\xdd\x11\x21\x60\xf6\x13\x61\xec\xdc\x67\x93\x92\x9c\xa9\xae\xf9\xab\x56\x94\x4a\x6f\xa4\xa7\xdf\x1e\x27\x9e\xaf\x58\xce\x83\x23\xa9\xcf\x62\xc9\x42\x79\xff\xf7\x44\x0f\xbc\x93\x6b\xaa\x61\x48\x9c\x99\x93\x30\xba\xdc\xb9\xfc\x0e\x18\x4b\xc5\x09\x3f\x33\x0c\xbb\x24\x2f\x71\xfb\x37\x87\x38\xfe\xa1\x05\x11\xdd\x43\x83\x64\xd7\xf7\x6b\xcc"}, +{{0x35,0x4e,0x13,0x15,0x2e,0xe1,0xfe,0x74,0x8a,0x12,0x52,0x20,0x4c,0x65,0x27,0xbd,0xc1,0xb1,0xeb,0x2e,0xb5,0x36,0x78,0x15,0x0e,0x63,0x59,0x92,0x47,0x08,0xd8,0x12,},{0xd4,0x5f,0xf6,0xc5,0xfb,0x83,0xe7,0xbb,0x96,0x69,0xaa,0x89,0x60,0xde,0xb7,0xdb,0xc6,0x65,0xc9,0x88,0x43,0x9b,0x6c,0x9e,0xf6,0x72,0xc6,0x81,0x1d,0xc8,0xbc,0xf6,},{0xde,0x2b,0x46,0xe6,0x5f,0x3d,0xec,0xef,0x34,0x33,0x2e,0x50,0x0f,0x2e,0x11,0x30,0x6f,0xbd,0xcf,0x1b,0xe8,0x5a,0x1c,0x1e,0xe6,0x8b,0xa3,0x04,0x5d,0xce,0xc2,0xc7,0xbe,0x60,0x8d,0x22,0x92,0x7d,0xa1,0xf4,0x4c,0x0e,0x20,0x83,0xae,0x62,0x2c,0xf3,0xc2,0x9d,0x89,0x38,0x87,0x99,0x4e,0xfc,0xfa,0x2c,0xa5,0x94,0xf5,0x05,0x1f,0x03,},"\x8e\x5f\xcc\xf6\x6b\x1b\xa6\x16\x9c\xb6\x85\x73\x3d\x9d\x0e\x01\x90\x36\x1c\x90\xbc\xab\x95\xc1\x63\x28\x5a\x97\xfe\x35\x6d\x2b\xdc\xde\x3c\x93\x80\x26\x88\x05\xa3\x84\xd0\x63\xda\x09\xcc\xd9\x96\x9c\xc3\xff\x74\x31\xe6\x0a\x8e\x9f\x86\x9c\xd6\x2f\xaa\x0e\x35\x61\x51\xb2\x80\xbc\x52\x6e\x57\x7c\x2c\x53\x8c\x9a\x72\x4d\xc4\x8b\xf8\x8b\x70\x32\x1d\x7e\x1e\xee\xdb\x3c\x4a\xf7\x06\x74\x8c\x94\x2e\x67\xbd\xab\xdb\x41\xbe\xc2\x97\x7b\x15\x23\x06\x9e\x31\xe2\x9b\x76\x30\x02\x88\xf8\x8a\x51\xb3\x84\xb8\x0c\xc2\x52\x6f\x16\x79\x34\x0d\xde\xc3\x88\x1f\x5c\xd2\x8b\x03\x78\xd9\xcd\x0a\x81\x2b\x68\xdd\x3f\x68\xf7\xa2\x3e\x1b\x54\xbe\xe7\x46\x6a\xc7\x65\xcf\x38\xdf\x04\xd6\x74\x41\xdf\xa4\x98\xc4\xbf\xfc\x52\x04\x5f\xa6\xd2\xdb\xcd\xbf\xa3\x3d\xfa\xa7\x76\x44\xff\xcc\xef\x0d\xec\xdb\x67\x90\xc7\x0a\x0d\x73\x4e\xc2\x87\xcc\x33\x8c\xb5\xa9\x09\xc0\x05\x51\x89\x30\x11\x69\xc4\xf7\x70\x2c\x05\xc0\x91\x1a\x27\xb1\x6e\xf9\xed\x93\x4f\xa6\xa0\xca\x7b\x13\xe4\x13\x52\x34\x22\x53\x56\x47\x96\x80\x30\xed\xc4\x0c\xd7\x3e\x7d\x6b\x34\x5b\x75\x81\xf4\x38\x31\x6d\x68\xe3\xcd\x29\x2b\x84\x6d\x3f\x4f\x7c\x48\x62\xbc\x7e\x6b\x3f\xb8\x9a\x27\xf6\xf6\x0c\xd7\xdb\x2e\x34\xec\x9a\xae\x10\x13\xfe\x37\xac\xff\x8a\xd8\x88\xcb\x9a\x59\x3e\xf5\xe6\x21\xea\xe5\x18\x6c\x58\xb3\x1d\xcf\xde\x22\x87\x0e\x33\x6d\x33\xf4\x40\xf6\xb8\xd4\x9a"}, +{{0x7f,0xf6,0x2d,0x4b,0x3c,0x4d,0x99,0xd3,0x42,0xd4,0xbb,0x40,0x1d,0x72,0x6b,0x21,0xe9,0x9f,0x4e,0xf5,0x92,0x14,0x9f,0xc3,0x11,0xb6,0x87,0x61,0xf5,0x56,0x7f,0xf6,},{0x7f,0xdf,0xdb,0x9e,0xca,0x29,0xd3,0xf0,0x1d,0x94,0x86,0xd7,0xe1,0x12,0xce,0x03,0xaa,0x37,0xb9,0x13,0x26,0xa4,0x28,0x3b,0x9c,0x03,0x99,0x9c,0x5e,0xda,0x09,0x9a,},{0x05,0x8f,0x79,0x92,0x7f,0xbf,0x61,0x78,0x72,0x48,0x15,0xc7,0xb1,0x1c,0x63,0xba,0xaa,0x90,0xbc,0xc1,0x5d,0x72,0x72,0xbe,0x08,0x2f,0x8a,0x91,0x41,0x86,0x1c,0x81,0x64,0x33,0x05,0x5f,0x6c,0xf6,0x49,0x14,0x24,0x85,0x3f,0x9e,0xc7,0x8b,0xb9,0x1a,0xce,0x91,0x3a,0x93,0x41,0x1b,0x4e,0x5e,0xd5,0x8b,0xc4,0xba,0x57,0x15,0xc6,0x0a,},"\x99\xc4\x4c\x79\x65\x72\xa4\x82\x3f\xc6\xc3\x80\x77\x30\x83\x91\x73\x77\x4c\x05\xdb\xfc\x14\x92\xed\x0d\x00\x50\x9a\x95\xa1\xde\x37\x27\x4b\x31\x35\xed\x04\x56\xa1\x71\x8e\x57\x65\x97\xdc\x13\xf2\xa2\xab\x37\xa4\x5c\x06\xcb\xb4\xa2\xd2\x2a\xfa\xd4\xd5\xf3\xd9\x0a\xb3\xd8\xda\x4d\xcd\xaa\x06\xd4\x4f\x22\x19\x08\x84\x01\xc5\xdc\xee\xe2\x60\x55\xc4\x78\x2f\x78\xd7\xd6\x3a\x38\x06\x08\xe1\xbe\xf8\x9e\xee\xf3\x38\xc2\xf0\x89\x7d\xa1\x06\xfa\xfc\xe2\xfb\x2e\xbc\x5d\xb6\x69\xc7\xc1\x72\xc9\xcf\xe7\x7d\x31\x09\xd2\x39\xfe\x5d\x00\x5c\x8e\xe7\x51\x51\x1b\x5a\x88\x31\x7c\x72\x9b\x0d\x8b\x70\xb5\x2f\x6b\xd3\xcd\xa2\xfe\x86\x5c\x77\xf3\x6e\x4f\x1b\x63\x5f\x33\x6e\x03\x6b\xd7\x18\xbe\xc9\x0e\xe7\x8a\x80\x28\x11\x51\x0c\x40\x58\xc1\xba\x36\x40\x17\x25\x3a\xa8\x42\x92\x2e\x1d\xd7\xd7\xa0\xf0\xfc\x9c\x69\xe4\x3f\xc4\xea\xef\xfa\xaf\x1a\xe5\xfa\x5d\x2d\x73\xb4\x30\x79\x61\x7b\xab\xa0\x30\x92\x3f\xe5\xb1\x3d\x2c\x1c\x4f\xe6\xfa\xc3\xf2\xdb\x74\xe2\x02\x0a\x73\x4b\x61\x21\xa0\x30\x2f\xce\x82\x0b\xa0\x58\x0c\xe6\x13\x53\x48\xfd\xf0\x63\x2e\x00\x08\xdf\x03\xee\x11\x21\x68\xf5\xcf\xa0\x03\x7a\x26\xa1\xf6\x9b\x1f\x13\x17\xed\xf2\xa3\xab\x36\x74\x55\xa7\x7e\x00\x69\x12\x15\xd7\xaa\x31\x33\xc2\x15\x9d\x3d\xa2\xb1\x34\xcf\x04\xf0\xde\xfb\xf0\x7a\x60\x64\x01\x1e\x64\xdd\x14\xd4\xf8\xf0\x64\x35\x66\x55\x42\x88\x04\xc2\x77\x1a"}, +{{0x6c,0xab,0xad,0xd0,0x3f,0x8a,0x2e,0x6e,0xba,0xb9,0x6a,0x74,0xf8,0x0e,0x18,0x16,0x4e,0x4d,0x1b,0x6b,0xaa,0x67,0x8f,0x5a,0x82,0xe2,0x56,0x04,0xaf,0x98,0x9a,0xaf,},{0x2a,0x4a,0x31,0x79,0x56,0x41,0x94,0xe0,0x01,0x00,0xc1,0x8b,0xc3,0x53,0x51,0xd8,0xb1,0x35,0xbb,0xae,0x5b,0x32,0xb2,0x8f,0xce,0x1d,0x7b,0x67,0x66,0xca,0x4b,0x32,},{0x4e,0x65,0xc6,0xc1,0xd4,0x93,0x04,0x5e,0x8a,0x92,0x50,0xe3,0x97,0xc1,0xd1,0xd3,0x0f,0xfe,0xd2,0x4d,0xb6,0x6a,0x89,0x61,0xaa,0x45,0x8f,0x8f,0x0f,0xcb,0x76,0x0c,0x39,0xfe,0x86,0x57,0xd7,0xab,0x8f,0x84,0x00,0x0b,0x96,0xd5,0x19,0x71,0x7c,0xff,0x71,0xf9,0x26,0x52,0x2c,0x1e,0xfe,0xc7,0xf8,0xb2,0x62,0x4e,0xae,0x55,0xf6,0x0c,},"\x27\x9f\x78\xcf\x3b\x9c\xcf\xc6\xe1\xb0\x1e\x1a\x82\xf5\x0e\xd1\x72\xe9\xa8\xe1\xe7\x02\xbb\x15\x66\x1d\xd7\xdc\x3a\x45\x6f\xf7\xa7\xa7\xfd\xfb\x08\x1d\xb3\x86\x70\x79\x63\x0c\x7f\x70\xfd\x75\x32\x92\xec\x60\xec\xbf\x50\x63\x2e\x9a\xa4\x5b\x99\x65\x05\xc6\x6e\x6d\xc3\xc6\xae\x89\x2e\x21\xb6\xa8\x70\x5e\x4b\xba\xe8\xf1\x6a\x33\x78\x55\x4b\x31\xfd\xb0\x13\x9d\xcd\x15\xc9\x6a\x8a\x7e\x4b\x88\x75\x6a\x86\xd1\x8d\xb5\xdc\x74\xfd\x76\x91\x19\x7d\xd8\x8e\x2c\x7d\x5d\xf5\x2b\x04\x93\x44\xcd\xc4\x77\xc9\xcd\x7e\x89\xed\xa9\x9c\xcf\xb1\xd0\x08\x14\xd0\x15\x2b\x96\x54\xdf\x32\x79\x37\x2c\xa5\xf1\x8b\x1c\x94\x6f\x28\x94\xa7\x6b\x07\x9d\xdb\x1c\x3c\xd6\x1f\xbb\x96\x9a\xee\xc9\x19\x3a\x6b\x88\xfb\x7d\x13\x6c\x07\xf9\x82\x1e\x5c\x10\x74\xb4\xe9\x3b\xca\xf6\xfa\x14\xd0\xd1\xd7\xe1\x70\x75\x89\xd7\x7e\xc1\x33\x72\x06\xe5\x3a\x1f\x06\xcc\x26\x67\x2f\xf9\x5c\x13\xd5\xff\x44\x47\x66\x93\x1b\xa3\x0a\x0a\xfd\xcd\xad\xd2\x09\x8e\x9c\x41\xfd\x87\xa3\xf2\x3c\xd1\x6d\xbb\x0e\xfb\xf8\x09\x2c\xe3\x3e\x32\x7f\x42\x61\x09\x90\xe1\xce\xe6\xcb\x8e\x54\x95\x1a\xa0\x81\xe6\x97\x65\xae\x40\x09\xae\xed\x75\x8e\x76\x8d\xe5\x0c\x23\xd9\xa2\x2b\x4a\x06\xdc\x4d\x19\xfc\x8c\xbd\x0c\xde\xf4\xc9\x83\x46\x17\x55\xd0\xa3\xb5\xd6\xa9\xc1\x22\x53\xe0\x95\x68\x33\x9f\xf7\xe5\xf7\x8c\x5f\xdf\x7e\xc8\x9f\x91\x86\xa6\x21\xa8\xc0\xee\xd1\x1b\x67\x02\x2e"}, +{{0x0f,0xa0,0xc3,0x2c,0x3a,0xe3,0x4b,0xe5,0x1b,0x92,0xf9,0x19,0x45,0x40,0x59,0x81,0xa8,0xe2,0x02,0x48,0x85,0x58,0xa8,0xe2,0x20,0xc2,0x88,0xc7,0xd6,0xa5,0x53,0x2d,},{0xd6,0xae,0xe6,0x2b,0xd9,0x1f,0xc9,0x45,0x36,0x35,0xff,0xcc,0x02,0xb2,0xf3,0x8d,0xca,0xb1,0x32,0x85,0x14,0x03,0x80,0x58,0x0c,0xcd,0xff,0x08,0x65,0xdf,0x04,0x92,},{0x7e,0x9a,0xb8,0x5e,0xe9,0x4f,0xe4,0xb3,0x5d,0xcb,0x54,0x53,0x29,0xa0,0xef,0x25,0x92,0x3d,0xe5,0xc9,0xdc,0x23,0xe7,0xdf,0x1a,0x7e,0x77,0xab,0x0d,0xcf,0xb8,0x9e,0x03,0xf4,0xe7,0x85,0xca,0x64,0x29,0xcb,0x2b,0x0d,0xf5,0x0d,0xa6,0x23,0x0f,0x73,0x3f,0x00,0xf3,0x3a,0x45,0xc4,0xe5,0x76,0xcd,0x40,0xbd,0xb8,0x4f,0x1a,0xe0,0x01,},"\x53\xf4\x4b\xe0\xe5\x99\x7f\xf0\x72\x64\xcb\x64\xba\x13\x59\xe2\x80\x1d\xef\x87\x55\xe6\x4a\x23\x62\xbd\xda\xf5\x97\xe6\x72\xd0\x21\xd3\x4f\xfa\xce\x6d\x97\xe0\xf2\xb1\xf6\xae\x62\x5f\xd3\x3d\x3c\x4f\x6e\x9f\xf7\xd0\xc7\x3f\x1d\xa8\xde\xfb\x23\xf3\x24\x97\x5e\x92\x1b\xb2\x47\x32\x58\x17\x7a\x16\x61\x25\x67\xed\xf7\xd5\x76\x0f\x3f\x3e\x3a\x6d\x26\xaa\xab\xc5\xfd\xe4\xe2\x04\x3f\x73\xfa\x70\xf1\x28\x02\x09\x33\xb1\xba\x3b\x6b\xd6\x94\x98\xe9\x50\x3e\xa6\x70\xf1\xed\x88\x0d\x36\x51\xf2\xe4\xc5\x9e\x79\xca\xbc\x86\xe9\xb7\x03\x39\x42\x94\x11\x2d\x5d\x8e\x21\x3c\x31\x74\x23\xb5\x25\xa6\xdf\x70\x10\x6a\x9d\x65\x8a\x26\x20\x28\xb5\xf4\x51\x00\xcb\x77\xd1\x15\x0d\x8f\xe4\x61\xee\xd4\x34\xf2\x41\x01\x5f\x32\x76\xad\x7b\x09\xa2\x91\xb4\xa7\xf3\x5e\x3c\x30\x05\x1c\xbf\x13\xb1\xd4\xa7\xfa\x0c\x81\xa5\x0f\x93\x9e\x7c\x49\x67\x3a\xfd\xc8\x78\x83\xc9\xe3\xe6\x1f\x5a\x1d\xf0\x37\x55\x47\x0f\xda\x74\xbf\x23\xea\x88\x67\x6b\x25\x8a\x97\xa2\x80\xd5\xf9\x0b\x52\xb7\x14\xb5\x96\x03\x5b\xae\x08\xc8\xd0\xfe\x6d\x94\xf8\x94\x95\x59\xb1\xf2\x7d\x71\x16\xcf\x59\xdd\x3c\xfb\xf1\x82\x02\xa0\x9c\x13\xf5\xc4\xfb\xc8\xd9\x72\x25\x49\x28\x87\xd3\x28\x70\xc2\x29\x7e\x34\xde\xbd\x98\x76\xd6\xd0\x1a\xc2\x7a\x16\xb0\x88\xb0\x79\x07\x9f\x2b\x20\xfe\xb0\x25\x37\xcd\xa3\x14\xc4\x3c\xb2\xdc\xa3\x71\xb9\xdf\x37\xed\x11\xec\x97\xe1\xa7\xa6\x99\x3a"}, +{{0x7b,0x06,0xf8,0x80,0x26,0xfa,0x86,0xf3,0x9f,0xce,0x24,0x26,0xf6,0x7c,0xc5,0x99,0x6b,0xed,0xd0,0xcf,0xc4,0xb5,0xeb,0xb1,0xb5,0xe3,0xed,0xbb,0x47,0xe0,0x80,0xaa,},{0x3f,0x14,0x69,0xee,0x6a,0x2e,0x78,0x67,0xe2,0xe9,0x01,0x2d,0x40,0x2c,0xf5,0xa4,0x86,0x14,0x97,0xc0,0x1d,0xf8,0x79,0xa1,0xde,0xb1,0xc5,0x39,0x83,0x0b,0x58,0xde,},{0x42,0xf1,0x33,0xe3,0x4e,0x3e,0xb7,0x03,0x2a,0x13,0x3e,0xd7,0x81,0x53,0x7e,0xc6,0x2e,0x44,0xa5,0xce,0x83,0x81,0xe5,0xe0,0xbf,0x9e,0x13,0xa9,0x14,0xa4,0xb2,0xc7,0x57,0x81,0x1d,0x6d,0x3b,0x1e,0x86,0x67,0x24,0x24,0xea,0x42,0x30,0xd1,0x0f,0x7c,0x61,0x0a,0xbb,0x70,0x69,0xe6,0x1e,0x31,0x9b,0x40,0x66,0xa2,0xbd,0x7b,0xc9,0x00,},"\x71\x17\x5d\x4e\x21\x72\x12\x97\xd9\x17\x6d\x81\x7f\x4e\x78\x5d\x96\x00\xd9\x23\xf9\x87\xfe\x0b\x26\xfd\x79\xd3\x3a\x5e\xa5\xd1\xe8\x18\xb7\x1f\x0f\x92\xb8\xc7\x3a\xfd\xda\xbd\xcc\x27\xf6\xd1\x6e\x26\xaa\xfa\x87\x4c\xfd\x77\xa0\x0e\x06\xc3\x6b\x04\x14\x87\x58\x2b\xb9\x33\x76\x0f\x88\xb4\x19\x12\x73\x45\x77\x6e\xa4\x18\xf8\x35\x22\x25\x4f\xed\x33\x81\x9b\xc5\xc9\x5f\x8f\x84\x04\xcc\x14\x4e\xbf\x14\x86\xc8\x85\x15\x40\x9d\x34\x33\xaa\xf5\x19\xd9\x92\x0f\x52\x56\xe6\x29\x41\x9e\x9a\x95\x58\x0a\x35\xb0\x69\xb8\xd2\x55\x33\xdf\xcb\xc9\x8a\xd3\x64\x04\xa9\x51\x80\x8e\x01\x37\x8c\x03\x26\x63\x26\xd1\x20\x04\x69\x75\xfd\xe0\x7d\xae\xf3\x26\x6c\xaa\xcd\x82\x1c\x14\x03\x49\x9d\x7f\xdf\x17\xc0\x33\xc8\xd8\xc3\xf2\x8f\x16\x2b\x5f\x09\xdf\xda\xca\x06\x28\x5f\x00\xc6\xcb\x98\x6d\xfd\xf5\x15\x1a\xa6\x63\x96\x08\xb5\xb1\x3e\x78\xd6\x5a\x43\x68\x58\x5b\x16\x13\x87\x54\xfb\xd1\x13\x83\x5a\x68\x6c\xd0\x66\xc2\xb8\x9b\xb0\x95\x3c\x24\xd5\x0e\x77\xbf\x0f\xc4\x57\xc1\xe0\xfc\xf5\xd4\x4d\xa8\xdb\x9a\x88\xf0\x62\xbe\x3b\x68\x8d\x5c\xdc\xff\x1d\x1c\x00\xe8\x1e\xc9\xd4\x13\x88\x22\x95\xb3\x41\xfe\xe8\xfa\x42\x7d\xc1\x09\xad\xeb\x5f\x28\x4e\xec\x20\x2f\x1b\xef\x11\x5b\xf9\x6b\x17\x82\xd3\xcc\xde\xb6\x82\xb6\x9b\xf9\x2d\x17\x0c\x00\x7d\x5d\xf8\x0e\x1e\xd9\x62\xf6\x77\xdc\x24\xa1\x45\xa1\xe4\xe8\x29\xe8\xde\xc0\x10\x4e\x5f\x78\x36\x59\x44"}, +{{0xc3,0xf5,0xe1,0x49,0x96,0x8a,0x24,0xf4,0xde,0x91,0x19,0x53,0x19,0x75,0xf4,0x43,0x01,0x5c,0xcc,0xa3,0x05,0xd7,0x11,0x9e,0xd4,0x74,0x9e,0x8b,0xf6,0xd9,0x4f,0xc7,},{0x39,0xaa,0xcc,0xdb,0x94,0x8a,0x40,0x38,0x53,0x8a,0x45,0x88,0x32,0x2f,0x80,0x6b,0xb1,0x29,0xb5,0x87,0x6c,0x4b,0xec,0x51,0x27,0x1a,0xfe,0x4f,0x49,0x69,0x00,0x45,},{0x5f,0xa2,0xb5,0x31,0x67,0x7b,0x00,0xb8,0x5b,0x0a,0x31,0x3c,0xbd,0x47,0x9f,0x55,0xf4,0xab,0x3e,0xc5,0xcf,0xce,0x5e,0x45,0x4d,0x2b,0x74,0x17,0x6c,0xcc,0x33,0x99,0xc8,0x99,0xf9,0xd6,0xb5,0x1e,0xd4,0xc1,0xe7,0x61,0x85,0xac,0x9f,0xe7,0x30,0xc4,0xb4,0x01,0x40,0x44,0xf7,0x04,0x11,0x85,0xbc,0x3c,0x85,0x72,0x2e,0xb2,0xea,0x02,},"\xc4\x63\x70\xe3\x7f\x2e\x0c\xad\xcf\x93\x40\x2f\x1f\x0c\xb0\x48\xf5\x28\x81\xba\x75\x0b\x7a\x43\xf5\x6a\xb1\x1c\xe3\x48\x73\x2f\xb5\x7e\x7f\x9a\xaf\x8d\xfc\xbe\x45\x5e\x14\xe9\x83\xc2\x48\xd0\x26\xa2\x7e\x7f\x14\x8d\x5d\xb5\xa5\x3f\x94\x63\x57\x02\xb8\x95\x12\x77\x71\x04\x7a\x87\x6d\x14\x10\x73\x86\xc5\xe0\xff\x89\x33\x34\x5b\xbd\x7a\x93\x6d\x99\x0d\x33\xef\xa2\x8c\x2e\xc4\xe4\x86\x4f\xfd\x2f\xf5\x76\xf7\xc8\x8f\x95\x4c\xfc\x1c\x45\x9e\x88\x3b\xb7\x12\xda\xe3\xcd\xf6\x63\x20\x66\xf1\xf4\xd1\x3a\x50\x96\x15\xb3\x36\x0c\xad\xc5\xa3\x07\xf2\x3e\x52\xa5\x1b\x40\xa6\xfe\xeb\xe0\xb1\x8d\x0e\x9e\xe4\xe3\x48\xf3\x3c\xd8\x1a\x8d\xef\x22\x2f\x6a\x59\xb1\x28\x61\xd3\x35\xbd\x9a\xf8\x5c\xc0\x04\xbe\x46\xf1\xd3\xa4\x24\xf4\x87\x0a\xe9\xdc\x58\x7e\x5a\x4a\xde\x13\x6b\x93\x70\x64\x93\x48\xc3\x3a\xc3\xbf\x1f\xeb\xee\xbf\xfe\xa3\x70\x85\xed\x59\xca\xc9\xd9\xe6\x96\x47\x0b\x23\x46\x09\xe9\xa1\x0a\x9d\x43\x1f\xf9\x1e\x69\xcb\x51\x35\xfd\x11\x7f\xf5\x8a\x36\x53\x97\x44\xeb\xe7\x0c\xea\x69\x73\xc0\x0c\x7a\x4d\x57\xb6\x2f\x4a\x71\x36\xd7\x31\xb8\xe4\x6f\xf1\x8e\xc0\xed\x69\x07\x00\x31\x90\x50\x75\xd8\x54\x1d\x56\x8c\xfc\xe6\xee\xb7\x62\x42\xb7\x81\x9a\x7b\x6a\x93\x55\x21\x11\xbb\x88\xf1\x65\x52\x7c\xfa\x69\x66\xd3\x9f\xcb\xe0\xa7\xde\xa0\x08\xe3\x9c\x7a\x3e\x57\x7a\xb3\x07\xcd\x1d\x0e\xa3\x26\x83\x3d\x52\x65\x4e\x17\x29\x55\xf3\xfc\xd4"}, +{{0x42,0x30,0x5c,0x93,0x02,0xf4,0x5e,0xa6,0xf8,0x7e,0x26,0xe2,0x20,0x8f,0xd9,0x4b,0x3c,0x4a,0xd0,0x37,0xb1,0xb6,0xc8,0x3c,0xf6,0x67,0x7a,0xa1,0x09,0x6a,0x01,0x3c,},{0x3b,0x97,0xb1,0xf1,0x1c,0xe4,0x5b,0xa4,0x6f,0xfb,0xb2,0x5b,0x76,0xbf,0xc5,0xad,0x7b,0x77,0xf9,0x0c,0xc6,0x9e,0xd7,0x61,0x15,0xde,0xa4,0x02,0x94,0x69,0xd5,0x87,},{0x18,0xd0,0x5e,0x5d,0x01,0x66,0x8e,0x83,0xf4,0x0f,0xa3,0xbb,0xee,0x28,0xb3,0x88,0xac,0xf3,0x18,0xd1,0xb0,0xb5,0xad,0x66,0x8c,0x67,0x2f,0x34,0x5c,0x8e,0xda,0x14,0xc2,0xf8,0x84,0xcd,0x2a,0x90,0x39,0x45,0x9c,0xe0,0x81,0x0b,0xc5,0xb5,0x80,0xfe,0x70,0xd3,0x96,0x4a,0x43,0xed,0xb4,0x9e,0x73,0xa6,0xff,0x91,0x4b,0xbf,0x04,0x0c,},"\xd1\x10\x82\x8d\x44\x91\x98\xd6\x75\xe7\x4e\x8e\x39\x43\x9f\xd1\x5e\x75\xbf\x2c\xc1\xf4\x30\xab\xfb\x24\x58\x36\x88\x5b\xaf\xc4\x20\xf7\x54\xb8\x9d\x2f\xbb\xf6\xdd\x34\x90\x79\x2e\x7a\x4f\x76\x60\x73\xcf\xe3\xb3\x02\xd0\x89\x83\x1a\xce\x86\x9e\x27\x30\xfd\xe4\x5c\x21\x21\xec\x3e\xf2\x17\xaa\x9c\x43\xfa\x7c\xc7\xe9\xed\x0a\x01\xad\x9f\x1d\x2f\xc3\x61\x36\x38\xca\x9f\xc1\x93\xc9\x8b\x37\x45\x5b\xf5\xdb\xf8\xf3\x8b\x64\x70\x8d\xfd\xca\x6c\x21\xf0\x97\x5f\x10\x17\xc5\xda\x5f\x64\x34\xbd\xa9\xf0\x33\xce\xc2\xa6\x31\xab\x50\x31\x8e\x01\x7b\x17\x0b\x24\x0b\xf0\x1e\xb8\xb3\x6c\x7e\x1c\xb5\x9e\x77\x36\xac\x34\x44\x42\x08\x13\x2a\x8f\x59\xe4\xf3\x13\xd6\x5d\x84\x9c\x6a\x4f\xdf\x13\xe2\x0e\xca\xee\x38\x23\xe5\x89\xa1\x71\xb3\x9b\x24\x89\x49\x7b\x06\xe6\xff\x58\xc2\xc9\xf1\xdc\x5d\x3a\xa3\xbd\x10\xe6\x44\x3e\x22\xd4\x2d\x07\xb7\x83\xf7\x9f\xd4\x3a\x46\xe1\xcd\xe3\x14\xb6\x63\xa9\x5f\x72\x46\xde\xa1\x31\xfc\xd4\x6d\x1d\xc3\x33\xc5\x45\x4f\x86\xb2\xc4\xe2\xe4\x24\xde\xa4\x05\xcc\x22\x30\xd4\xdc\xd3\x9a\x2e\xab\x2f\x92\x84\x5c\xf6\xa7\x99\x41\x92\x06\x3f\x12\x02\x74\x9e\xf5\x2d\xcb\x96\xf2\xb7\x9e\xd6\xa9\x81\x18\xca\x0b\x99\xba\x22\x85\x49\x08\x60\xeb\x4c\x61\xab\x78\xb9\xdd\xc6\xac\xc7\xad\x88\x3f\xa5\xe9\x6f\x9d\x02\x91\x71\x22\x3a\xbf\x75\x73\xe3\x62\x30\xe0\xa8\x1f\x6c\x13\x11\x15\x14\x73\xee\x26\x4f\x4b\x84\x2e\x92\x3d\xcb\x3b"}, +{{0xc5,0x7a,0x43,0xdc,0xd7,0xba,0xb8,0x51,0x60,0x09,0x54,0x69,0x18,0xd7,0x1a,0xd4,0x59,0xb7,0x34,0x5e,0xfd,0xca,0x8d,0x4f,0x19,0x92,0x98,0x75,0xc8,0x39,0xd7,0x22,},{0x20,0x83,0xb4,0x44,0x23,0x6b,0x9a,0xb3,0x1d,0x4e,0x00,0xc8,0x9d,0x55,0xc6,0x26,0x0f,0xee,0x71,0xac,0x1a,0x47,0xc4,0xb5,0xba,0x22,0x74,0x04,0xd3,0x82,0xb8,0x2d,},{0x1e,0xde,0xf9,0xbc,0x03,0x69,0x71,0xf1,0xfa,0x88,0xed,0xf4,0x53,0x93,0xc8,0x02,0xe6,0xc1,0xa1,0x63,0x1c,0x8a,0x06,0x87,0x1a,0x09,0xa3,0x20,0x82,0x1d,0xce,0x40,0xbe,0xca,0x97,0xe5,0x3a,0x03,0x61,0xa9,0x55,0xa4,0xc6,0xd6,0x0b,0x8c,0xa8,0xe4,0x00,0xc8,0x13,0x40,0x91,0x1c,0xcb,0x4f,0x56,0x28,0x40,0x41,0xcd,0xbb,0x18,0x04,},"\xa4\xf6\xd9\xc2\x81\xcf\x81\xa2\x8a\x0b\x9e\x77\x49\x9a\xa2\x4b\xde\x96\xcc\x12\x64\x37\x44\x91\xc0\x08\x29\x4e\xe0\xaf\x6f\x6e\x4b\xbb\x68\x63\x96\xf5\x90\x68\xd3\x58\xe3\x0f\xe9\x99\x2d\xb0\xc6\xf1\x66\x80\xa1\xc7\x1e\x27\xa4\xa9\x07\xac\x60\x7d\x39\xbd\xc3\x25\x8c\x79\x56\x48\x2f\xb3\x79\x96\xf4\xbe\xb3\xe5\x05\x1b\x81\x48\x01\x9a\x1c\x25\x6e\x2e\xe9\x99\xeb\xc8\xce\x64\xc5\x4e\x07\xfe\xdb\x4f\xbd\x89\x53\xeb\xd9\x3b\x7d\x69\xce\x5a\x00\x82\xed\xd6\x20\x9d\x12\xd3\x61\x9b\x4f\xd2\xea\xe9\x16\x46\x1f\x72\xa4\xce\x72\x71\x57\x25\x1a\x19\x20\x9b\xbf\xf9\xfb\xdb\xd2\x89\x43\x6f\x3f\xca\xcc\x6b\x4e\x13\x18\x52\x1a\x47\x83\x9c\xba\x4b\x14\xf7\xd7\xa2\x1e\x7b\x5d\x6b\x6a\x75\x3d\x58\x04\xaf\xcd\x2b\x1e\xb7\x77\x9b\x92\xab\xab\x8a\xfa\x8a\xa4\xfa\x51\xca\xec\x0b\x85\xdc\xd0\xfc\x2a\x06\x76\x03\x6d\x3f\x56\x63\x0a\x83\x1f\xfe\xb5\x02\x86\x1d\xd8\x91\x61\xc7\x08\xa9\xc0\x06\xc7\x3c\x93\x0c\xe5\xb9\x47\x56\x42\x6f\xf1\x8a\xa1\x12\xfb\x4e\xb9\xa6\x85\x00\xb4\x8d\x4e\xed\xbd\x41\x67\xb6\xff\xd0\xa1\x1d\x49\x44\x3a\x17\x3c\xe9\xd9\x49\x43\x67\x48\xfc\x06\x34\xf0\x6b\xb0\x8b\x8f\x34\x23\xf4\x46\x3d\xba\x7b\x4d\x19\x9b\x64\xdf\x57\x81\x17\xf0\xa2\x64\x5f\x0b\x2a\x1e\x2a\xda\x27\xd2\x86\xf7\x67\x33\xf2\x5b\x82\xed\x1d\x48\xa5\xc3\x89\x8d\x4a\xd6\x21\xe5\x0e\xd9\x06\x0d\xaa\xd4\x0a\x39\x53\x2e\x4d\x1b\xf1\x62\xce\x36\x80\x4d\x5d\x4e\x2d"}, +{{0x2d,0xdd,0xb6,0xb8,0xfd,0x04,0xfa,0x90,0xec,0xe1,0xa7,0x09,0xf8,0x41,0x8f,0x2e,0x5d,0x0c,0x9c,0x43,0xaf,0xe7,0xcf,0xce,0x19,0xe6,0xad,0x15,0xa7,0x34,0x76,0xf7,},{0x80,0x59,0xde,0x6a,0x7c,0x47,0x76,0x48,0x9e,0xcc,0x2e,0x7d,0x70,0x7f,0xfc,0xe3,0x02,0x85,0xbf,0x30,0xa2,0x3f,0x78,0xd7,0x2d,0xb4,0x9c,0xfd,0x6e,0xd0,0xd4,0x92,},{0xc6,0x34,0xea,0x7b,0xf7,0x2e,0x89,0x5a,0x2e,0x79,0x6e,0x28,0x34,0x20,0x14,0x15,0xb8,0xb4,0x5e,0x05,0xe0,0x45,0x55,0x92,0x84,0xeb,0x90,0x52,0xc0,0xe8,0x4f,0x62,0xa5,0xa9,0xf0,0xc9,0x76,0x4f,0x75,0x76,0x78,0x8c,0x72,0x28,0xb1,0x9e,0xf5,0x17,0xc1,0x95,0x49,0x73,0x25,0xa4,0x8a,0x93,0x44,0xb1,0x47,0xc1,0x2f,0xd7,0x55,0x09,},"\x47\x4b\xaa\x59\x0a\x4c\xd7\x2d\x54\x24\xe5\x1d\x82\x57\xb3\xd4\x43\x25\xbc\x4c\x50\x63\xa0\x03\x3c\x86\xeb\xbe\x99\xed\x72\x12\x18\x4c\x19\x94\x4d\x08\x2a\x11\x53\x79\xdd\x4c\xec\xe9\x73\xfa\xa0\xbc\xa6\x48\x5b\xd2\x5f\x37\x44\xa7\x19\xe7\x0a\xa0\x29\x1e\x1b\x5a\x96\xe6\x37\xc1\x40\x61\x6a\x98\x26\x33\x57\xc7\x6b\x6e\xb0\x08\x3f\xe5\x14\x14\xe3\x86\x87\x0d\x0f\xdc\x7d\xd9\xab\xe4\xff\x6f\xb5\xbb\xf1\xe7\xb1\x5d\xac\x3e\x08\xe2\x61\x5f\x65\x5c\x31\x04\xce\xb3\x2a\x4c\xc2\xc9\xe9\xc4\x3c\xf2\x82\xd3\x46\xac\x25\x3c\xcc\x46\xb6\x35\xae\x04\x09\x73\xb4\x97\x35\x72\x0f\xfb\x89\x04\x69\xa5\x67\xc5\x82\x4e\x0c\x00\xd7\xcc\xd5\x50\x9a\x71\x80\x92\xa9\x06\x46\x1c\x4d\x61\x63\xea\xf4\x22\x41\x8f\x5f\xc6\xe0\x09\xfc\x3f\x52\x9a\xc6\x1a\x2f\x89\xbb\x8e\x0e\xd4\x5d\x94\x0c\x4c\x23\x31\xff\x8d\x8e\x1d\x6d\x58\xd4\x17\xd8\xfc\x26\x56\xa0\x2e\x87\x01\xae\xe7\x5a\xed\x91\x87\x24\xee\xbe\x4a\x2c\xf4\x74\x4c\x5c\x40\x1e\x21\x70\x23\xdf\x68\xa6\xf6\xa0\x22\x8b\xd0\x5a\x67\x9a\x69\x7d\x8d\xe7\x03\x6b\x9e\xd2\x69\x09\x0d\x3c\x65\x48\x6a\xfb\x91\xe2\x79\x54\xeb\x15\xb9\x64\x66\x5e\xde\x7a\xd0\x08\xf1\x2f\xb3\xa9\xd0\xe6\x9c\x13\xb4\x25\x4f\x43\x81\x9e\x08\x18\xa4\x19\x5f\x68\xb8\xa3\x8a\xe8\x1f\x3f\xcb\x18\x79\xc9\x5a\xb4\xcd\x0f\xfc\x38\xe3\x81\x08\x92\x60\xcc\xa9\x67\xac\xe5\xa0\x85\xb4\x57\xab\x5e\xb3\x63\x85\x21\x01\x37\x75\x70\xf9\xac\x9e\x38"}, +{{0x55,0x47,0xf1,0x00,0x4b,0xae,0xdf,0xce,0x5c,0xfc,0x08,0x50,0xb0,0x53,0x02,0x37,0x4a,0xad,0x24,0xf6,0x16,0x39,0x94,0xec,0xd7,0x51,0xdf,0x3a,0xf3,0xc1,0x06,0x20,},{0x7c,0xe6,0x20,0x78,0x73,0x85,0xee,0x19,0x51,0xac,0x49,0xa7,0x73,0x52,0xee,0x0d,0x6f,0x8c,0x5c,0xd4,0x7d,0xf7,0x4e,0x9e,0x32,0x16,0xa6,0x32,0x4f,0xc7,0xcf,0x7f,},{0x29,0xdf,0x3a,0xd5,0x89,0x00,0x9c,0x66,0x7b,0xaa,0x5e,0x72,0xda,0xbb,0x4e,0x53,0xcb,0x78,0x76,0xde,0x4e,0x7e,0xfe,0x5c,0xc2,0x1e,0xad,0x7f,0xa8,0x78,0xdb,0x57,0xf9,0x7c,0x11,0x03,0xdd,0xb3,0x9a,0x86,0x1e,0xb8,0x86,0x53,0xc1,0xd4,0xec,0x3b,0x43,0x06,0xe4,0x58,0x4b,0x47,0xb8,0xbc,0x90,0x42,0x31,0x19,0xe7,0xe4,0xaf,0x00,},"\xa6\xc1\x7e\xeb\x5b\x80\x66\xc2\xcd\x9a\x89\x66\x73\x17\xa9\x45\xa0\xc7\xc9\x69\x96\xe7\x7a\xe8\x54\xc5\x09\xc6\xcd\x06\x31\xe9\x22\xad\x04\x50\x3a\xf8\x7a\x3c\x46\x28\xad\xaf\xed\x76\x00\xd0\x71\xc0\x78\xa2\x2e\x7f\x64\xbd\xa0\x8a\x36\x2b\x38\xb2\x6c\xa1\x50\x06\xd3\x8a\xcf\x53\x2d\x0d\xed\xea\x41\x77\xa2\xd3\x3f\x06\x95\x6d\x80\xe9\x63\x84\x8e\xc7\x91\xb2\x76\x2f\xa9\x94\x49\xb4\xf1\xa1\xed\x9b\x3f\x25\x80\xbe\x3a\xc7\xd7\xf5\x2f\xb1\x44\x21\xd6\x22\x2b\xa7\x6f\x80\x77\x50\xc6\xcb\xb0\xb1\x6f\x08\x95\xfc\x73\xd9\xdf\xc5\x87\xe1\xa9\xe5\xd1\xe5\x83\x75\xfb\xab\x70\x5b\x8f\x0c\x1f\xd7\xdf\x8b\x3a\xd4\x46\xf2\xf0\x84\x59\xe7\xed\x1a\xf5\x95\x56\xfb\xc9\x66\xdc\x24\x9c\x1c\xf6\x04\xf3\xe6\x77\xc8\xa0\x9d\x43\x63\x60\x87\x74\xbf\x38\x11\xbe\xf0\x64\x27\x48\xc5\x5c\x51\x6c\x7a\x58\x0f\xa3\x49\x90\x50\xac\xb3\x0e\xed\x87\x0d\x0d\x91\x17\x4c\xb6\x23\xe9\x8c\x3a\xd1\x21\xcf\x81\xf0\x4e\x57\xd4\x9b\x00\x84\x24\xa9\x8a\x31\xee\xaa\xf5\xf3\x8e\x00\x0f\x90\x3d\x48\xd2\x15\xed\x52\xf8\x62\xd6\x36\xa5\xa7\x36\x07\xde\x85\x76\x01\x67\x26\x7e\xfe\x30\xf8\xa2\x6e\xbc\x5a\xa0\xc0\x9f\x5b\x25\x8d\x33\x61\xca\x69\xd1\xd7\xee\x07\xb5\x96\x48\x17\x9a\xb2\x17\x0e\xc5\x0c\x07\xf6\x61\x6f\x21\x68\x72\x52\x94\x21\xa6\x33\x4a\x4a\x1e\xd3\xd2\x67\x1e\xf4\x7b\xc9\xa9\x2a\xfb\x58\x31\x4e\x83\x2d\xb8\xa9\x00\x34\x08\xa0\x48\x75\x03\xfe\x4f\x67\x77\x0d\xd4\xb6"}, +{{0x3d,0xd7,0x20,0x3c,0x23,0x7a,0xef,0xe9,0xe3,0x8a,0x20,0x1f,0xf3,0x41,0x49,0x01,0x79,0x90,0x5f,0x9f,0x10,0x08,0x28,0xda,0x18,0xfc,0xbe,0x58,0x76,0x8b,0x57,0x60,},{0xf0,0x67,0xd7,0xb2,0xff,0x3a,0x95,0x7e,0x83,0x73,0xa7,0xd4,0x2e,0xf0,0x83,0x2b,0xcd,0xa8,0x4e,0xbf,0x28,0x72,0x49,0xa1,0x84,0xa2,0x12,0xa9,0x4c,0x99,0xea,0x5b,},{0x4c,0x03,0x69,0x35,0xa9,0x6a,0xbc,0x0d,0x05,0x0d,0x90,0x7b,0xed,0xbe,0x99,0x46,0xfb,0x97,0x43,0x9f,0x03,0x9c,0x74,0x2e,0x05,0x1c,0xcf,0x09,0xad,0xd7,0xdf,0x44,0xd1,0x7d,0xa9,0x8c,0x2c,0xa0,0x1b,0xdc,0x24,0x24,0xda,0x1e,0x4d,0xeb,0xf3,0x47,0xf8,0xff,0xf4,0x8a,0xc8,0x03,0x0d,0x2c,0xc0,0x7f,0x95,0x75,0xc0,0x44,0xbe,0x04,},"\xdb\x28\xed\x31\xac\x04\xb0\xc2\xde\xce\xe7\xa6\xb2\x4f\xc9\xa0\x82\xcc\x26\x2c\xa7\xcc\xf2\xa2\x47\xd6\x37\x2e\xc3\xe9\x12\x0e\xce\xdb\x45\x42\xea\x59\x3f\xea\x30\x33\x5c\x5a\xb9\xdd\x31\x8a\x3b\x4f\xd5\x83\x42\x99\xcf\x3f\x53\xd9\xef\x46\x13\x7b\x27\x3c\x39\x0e\xc3\xc2\x6a\x0b\x44\x70\xd0\xd9\x4b\x77\xd8\x2c\xae\x4b\x24\x58\x78\x37\xb1\x67\xbb\x7f\x81\x66\x71\x0b\xae\xb3\xee\x70\xaf\x79\x73\x16\xcb\x7d\x05\xfa\x57\xe4\x68\xae\x3f\x0b\xd4\x49\x40\x4d\x85\x28\x80\x8b\x41\xfc\xca\x62\xf5\xe0\xa2\xaa\x5d\x8f\x3a\xca\xb0\x08\xcc\x5f\x6e\x5a\xb0\x27\x77\xbd\xcd\xe8\x7f\x0a\x10\xef\x06\xa4\xbb\x37\xfe\x02\xc9\x48\x15\xcf\x76\xbf\xb8\xf5\xcd\xd8\x65\xcc\x26\xdc\xb5\xcf\x49\x2e\xdf\xd5\x47\xb5\x35\xe2\xe6\xa6\xd8\x54\x09\x56\xdc\xba\x62\xcf\xea\x19\xa9\x47\x44\x06\xe9\x34\x33\x7e\x45\x42\x70\xe0\x10\x36\xac\x45\x79\x3b\x6b\x8a\xce\xda\x18\x7a\x08\xd5\x6a\x2c\xe4\xe9\x8f\x42\xea\x37\x5b\x10\x1a\x6b\x9f\xcb\x42\x31\xd1\x71\xaa\x46\x3e\xeb\x43\x58\x6a\x4b\x82\xa3\x87\xbc\xdd\xaf\x71\xa8\x0f\xd5\xc1\xf7\x29\x2e\xfc\x2b\xd8\xe7\x0c\x11\xea\xa8\x17\x10\x60\x61\xb6\xc4\x61\xc4\x88\x3d\x61\x3c\xc0\x6c\x7e\x2a\x03\xf7\x3d\x90\xfc\x55\xcd\xc0\x72\x65\xee\xfd\x36\xbe\x72\x27\x03\x83\xd6\xc6\x76\xca\xe3\x7c\x93\x69\x1f\x1a\xe3\xd9\x27\xb3\xa1\xcd\x96\x3e\x42\x29\x75\x7a\xe5\x23\x1e\xea\x73\xa9\xf7\x15\x15\x62\x83\x05\x41\x0a\xc2\x59\x3b\x32\x5c\xc6\x31"}, +{{0x28,0x27,0x75,0xdf,0x9e,0xbb,0xd7,0xc5,0xa6,0x5f,0x3a,0x2b,0x09,0x6e,0x36,0xee,0x64,0xa8,0xf8,0xea,0x71,0x9d,0xa7,0x77,0x58,0x73,0x9e,0x4e,0x74,0x76,0x11,0x1d,},{0xa2,0xb4,0x96,0x46,0x03,0x3a,0x13,0x93,0x7c,0xad,0x6b,0x0e,0x91,0x4e,0x3c,0xec,0x54,0x98,0x9c,0x25,0x2c,0xa5,0x64,0x3d,0x07,0x65,0x55,0xd8,0xc5,0x5e,0x56,0xe0,},{0x15,0x76,0x39,0x73,0x85,0x94,0x02,0x90,0x7d,0x8d,0xcb,0x86,0xad,0xc2,0x4a,0x2a,0x16,0x8b,0xa3,0xab,0xf2,0x24,0x61,0x73,0xd6,0x34,0x8a,0xfe,0xd5,0x1e,0xf6,0x0b,0x0c,0x0e,0xde,0xff,0x4e,0x10,0xbc,0xef,0x4c,0x6e,0x57,0x78,0xc8,0xbc,0x1f,0x5e,0x9e,0xe0,0x23,0x73,0x73,0x44,0x5b,0x45,0x51,0x55,0xd2,0x3d,0xe1,0x27,0xa2,0x02,},"\x14\xcc\x50\xc2\x97\x3e\xa9\xd0\x18\x7a\x73\xf7\x1c\xb9\xf1\xce\x07\xe7\x39\xe0\x49\xec\x2b\x27\xe6\x61\x3c\x10\xc2\x6b\x73\xa2\xa9\x66\xe0\x1a\xc3\xbe\x8b\x50\x5a\xea\xad\x14\x85\xc1\xc2\xa3\xc6\xc2\xb0\x0f\x81\xb9\xe5\xf9\x27\xb7\x3b\xfd\x49\x86\x01\xa7\x62\x2e\x85\x44\x83\x7a\xad\x02\xe7\x2b\xf7\x21\x96\xdc\x24\x69\x02\xe5\x8a\xf2\x53\xad\x7e\x02\x5e\x36\x66\xd3\xbf\xc4\x6b\x5b\x02\xf0\xeb\x4a\x37\xc9\x55\x49\x92\xab\xc8\x65\x1d\xe1\x2f\xd8\x13\x17\x73\x79\xbb\x0c\xe1\x72\xcd\x8a\xaf\x93\x7f\x97\x96\x42\xbc\x2e\xd7\xc7\xa4\x30\xcb\x14\xc3\xcd\x31\x01\xb9\xf6\xb9\x1e\xe3\xf5\x42\xac\xdf\x01\x7f\x8c\x21\x16\x29\x7f\x45\x64\x76\x8f\x4d\xb9\x5d\xad\x8a\x9b\xcd\xc8\xda\x4d\x8f\xb1\x3e\xf6\xe2\xda\x0b\x13\x16\xd3\xc8\xc2\xf3\xed\x83\x6b\x35\xfe\x2f\xd3\x3e\xff\xb4\x09\xe3\xbc\x1b\x0f\x85\x22\x5d\x2a\x1d\xe3\xbf\xc2\xd2\x05\x63\x94\x64\x75\xc4\xd7\xca\x9f\xdd\xba\xf5\x9a\xd8\xf8\x96\x1d\x28\x7a\xe7\xdd\x80\x3e\x7a\xf1\xfa\x61\x23\x29\xb1\xbd\xc0\x4e\x22\x56\x00\xae\x73\x1b\xc0\x1a\xe0\x92\x5a\xed\x62\xac\x50\xd4\x60\x86\xf3\x64\x6c\xf4\x7b\x07\x2f\x0d\x3b\x04\x4b\x36\xf8\x5c\xec\x72\x9a\x8b\xb2\xb9\x28\x83\xca\x4d\xfb\x34\xa8\xee\x8a\x02\x73\xb3\x1a\xf5\x09\x82\xbb\x61\x31\xbf\xa1\x1d\x55\x50\x4b\x1f\x6f\x1a\x0a\x00\x43\x8c\xa2\x6d\x8a\xb4\xf4\x8b\xcd\xdc\x9d\x5a\x38\x85\x1a\xbe\xde\x41\x51\xd5\xb7\x0d\x72\x07\x32\xa0\x0a\xbe\xa2\xc8\xb9\x79"}, +{{0x47,0x30,0xa5,0xcf,0x97,0x72,0xd7,0xd6,0x66,0x5b,0xa7,0x87,0xbe,0xa4,0xc9,0x52,0x52,0xe6,0xec,0xd6,0x3e,0xc6,0x23,0x90,0x54,0x7b,0xf1,0x00,0xc0,0xa4,0x63,0x75,},{0xf9,0xf0,0x94,0xf7,0xcc,0x1d,0x40,0xf1,0x92,0x6b,0x5b,0x22,0xdc,0xe4,0x65,0x78,0x44,0x68,0xb2,0x0a,0xb3,0x49,0xbc,0x6d,0x4f,0xdf,0x78,0xd0,0x04,0x2b,0xbc,0x5b,},{0x55,0x2c,0x73,0x47,0xbd,0xfe,0x13,0x16,0x46,0xce,0x09,0x32,0xd8,0x2a,0x36,0xd2,0xc1,0xb7,0x6d,0x7c,0x30,0xee,0x89,0x0e,0x05,0x92,0xe1,0x9f,0x9d,0x18,0xb9,0xa5,0x6f,0x48,0xd7,0xa9,0xb6,0x8c,0x01,0x7d,0xa6,0xb5,0x50,0xc9,0x43,0xaf,0x4a,0x90,0x7b,0xaf,0x31,0x7e,0x41,0x9f,0xbb,0xc9,0x6f,0x6c,0xf4,0xbf,0xad,0x42,0xde,0x00,},"\xe7\x47\x6d\x2e\x66\x84\x20\xe1\xb0\xfa\xdf\xba\xa5\x42\x86\xfa\x7f\xa8\x90\xa8\x7b\x82\x80\xe2\x60\x78\x15\x22\x95\xe1\xe6\xe5\x5d\x12\x41\x43\x5c\xc4\x30\xa8\x69\x3b\xb1\x0c\xde\x46\x43\xf5\x9c\xbf\xcc\x25\x6f\x45\xf5\x09\x0c\x90\x9a\x14\xc7\xfc\x49\xd3\x7b\xfc\x25\xaf\x11\xe8\xf4\xc8\x3f\x4c\x32\xd4\xaa\xbf\x43\xb2\x0f\xa3\x82\xbb\x66\x22\xa1\x84\x8f\x8f\xfc\x4d\xff\x34\x08\xbb\x4e\xc7\xc6\x7a\x35\xb4\xcd\xae\xe5\xe2\x79\xc0\xfc\x0a\x66\x09\x3a\x9f\x36\xa6\x0f\xdd\x65\xe6\x33\x4a\x80\x4e\x84\x5c\x85\x30\xb6\xfd\xa3\x63\xb5\x64\x03\x37\xd0\x27\x24\x3c\xcf\xb3\xc1\x77\xf4\x3e\x71\x78\x96\xe4\x6e\xad\x7f\x72\xca\x06\xaa\x0f\xf1\xe7\x72\x47\x12\x1b\xaf\x48\xbe\x9a\x44\x5f\x72\x9c\xa1\x39\x0f\xc4\x61\x51\xcb\xd3\x3f\xcb\xd7\x37\x3f\x27\xa6\xba\x55\xc9\x2c\xbf\x69\x45\xb0\x9b\x44\xb9\xa4\xe5\x80\x0d\x40\x30\x70\xae\x66\x04\x89\x97\xb2\x19\x7f\x02\x18\x1a\x09\x7e\x56\x3f\x9b\x9a\xcc\x84\x11\x39\x25\x8a\x25\x8b\xc6\x10\xd3\xbd\x89\x16\x37\x35\x6b\x2e\xdc\x8c\x18\x4c\x35\xc6\x5a\xf9\x1a\xaf\x7b\x1c\x16\xd7\x4a\x5f\x5f\x86\x25\x48\x13\x92\x54\xec\xf5\x50\x63\x1d\x5f\x88\x49\xaf\xdb\x5b\x64\xcf\x36\x6f\xf2\x63\x3a\x93\xf3\xa1\x8c\x39\xb5\x15\x02\x45\xfb\x5f\x33\xc9\xe4\xe2\xd9\x4a\xf6\x96\x3a\x70\xb8\x8f\x9e\x7e\x51\x9f\x8f\xa2\xa0\xf2\xe3\x74\x9d\xe8\x83\xd0\xe6\xf0\x52\xa9\x49\xd0\xfc\x71\x53\xa8\x69\x3f\x6d\x80\x1d\x73\x52\xeb\x2f\x7a\x46\x5c\x0e"}, +{{0x27,0x70,0xaa,0xdd,0x1d,0x12,0x3e,0x95,0x47,0x83,0x2d,0xfb,0x2a,0x83,0x7e,0xba,0x08,0x91,0x79,0xef,0x4f,0x23,0xab,0xc4,0xa5,0x3f,0x2a,0x71,0x4e,0x42,0x3e,0xe2,},{0x3c,0x5f,0xbb,0x07,0x53,0x0d,0xd3,0xa2,0x0f,0xf3,0x5a,0x50,0x0e,0x37,0x08,0x92,0x63,0x10,0xfe,0xd8,0xa8,0x99,0x69,0x02,0x32,0xb4,0x2c,0x15,0xbd,0x86,0xe5,0xdc,},{0xf2,0x67,0x71,0x5e,0x9a,0x84,0xc7,0x31,0x4f,0x2d,0x58,0x69,0xef,0x4a,0xb8,0xd2,0x14,0x9a,0x13,0xf7,0xe8,0xe1,0xc7,0x28,0xc4,0x23,0x90,0x62,0x93,0xb4,0x9c,0xe6,0x28,0x34,0x54,0xdd,0x1c,0x7b,0x04,0x74,0x1d,0xf2,0xea,0xbe,0xdc,0x4d,0x6a,0xb1,0x39,0x7d,0xc9,0x5a,0x67,0x9d,0xf0,0x4d,0x2c,0x17,0xd6,0x6c,0x79,0xbb,0x76,0x01,},"\xa5\xcc\x20\x55\xeb\xa3\xcf\x6f\x0c\x63\x32\xc1\xf2\xab\x58\x54\x87\x09\x13\xb0\x3f\xf7\x09\x3b\xc9\x4f\x33\x5a\xdd\x44\x33\x22\x31\xd9\x86\x9f\x02\x7d\x82\xef\xd5\xf1\x22\x71\x44\xab\x56\xe3\x22\x2d\xc3\xdd\xcc\xf0\x62\xd9\xc1\xb0\xc1\x02\x4d\x9b\x41\x6d\xfa\x3e\xe8\xa7\x02\x79\x23\x00\x34\x65\xe0\xff\xae\xfb\x75\xb9\xf2\x9d\xc6\xbc\xf2\x13\xad\xc5\xe3\x18\xfd\x8b\xa9\x3a\x7a\xa5\xbf\xb4\x95\xde\x9d\x7c\x5e\x1a\x19\x6c\xd3\xa2\xd7\x72\x1f\x8b\xa7\x85\xaa\x90\x52\xa1\x81\x1c\x7f\xcc\x8f\x93\x93\x27\x65\x05\x9c\xab\x9c\x9b\x71\x89\x45\x89\x5e\xf2\x6f\x3a\xc0\x48\xd4\xca\xbf\x91\xa9\xe6\xaa\x83\xac\x14\xd4\x31\x56\x82\x78\x37\x91\x4e\xb7\x63\xa2\x3c\xba\x53\xf6\x0f\x15\x0f\x4b\x70\x20\x3e\xc1\x83\x3f\xf1\x05\x84\x94\x57\xa8\xda\x73\x27\x66\x1f\xb2\x3a\x55\x41\x64\xe0\x5f\xcf\x01\x46\xb1\x06\x74\x96\x4b\xe6\xf6\xaa\x0a\xcc\x94\xc4\x1a\xd5\x71\x80\xe5\x18\x0d\x19\x9b\xd9\x10\x2f\x55\xd7\x40\xe8\x17\x89\xb1\x56\x71\xbb\xd0\x67\x0e\x6d\xe5\xd9\x7e\x1a\xe6\x26\xd8\xa0\xeb\xc3\x2c\x8f\xd9\xd2\x47\x37\x27\x4e\x47\xd2\xdd\x59\x41\xa2\x72\xe7\x2a\x59\x89\x28\xad\x10\x9c\xde\x93\x7b\xf2\x48\xd5\x7f\x5d\x29\x42\x98\x3c\x51\xe2\xa8\x9f\x8f\x05\x4d\x5c\x48\xdf\xad\x8f\xcf\x1f\xfa\x97\xf7\xde\x6a\x3a\x43\xca\x15\xfc\x67\x20\xef\xae\xc6\x9f\x08\x36\xd8\x42\x23\xf9\x77\x6d\x11\x1e\xc2\xbb\xc6\x9b\x2d\xfd\x58\xbe\x8c\xa1\x2c\x07\x21\x64\xb7\x18\xcd\x7c\x24\x6d\x64"}, +{{0x4f,0xda,0xb7,0xc1,0x60,0x0e,0x70,0x11,0x4b,0x11,0xf5,0x33,0x24,0x23,0x76,0xaf,0x76,0x14,0xb4,0xd5,0xda,0x04,0x6a,0xc4,0xbe,0xde,0xa2,0x1d,0x8a,0x36,0x15,0x98,},{0xa2,0x5c,0x9a,0x94,0xd6,0xe4,0xec,0xd9,0x5a,0x4b,0xd6,0x80,0x5f,0x76,0x2e,0xb1,0xc4,0x57,0xa8,0xd4,0x5d,0x24,0x32,0x38,0xb1,0x83,0x9c,0xbb,0xa8,0xf4,0x41,0xcc,},{0x50,0x75,0xc0,0x90,0xcf,0xbe,0xb6,0xb0,0x18,0x02,0xaf,0x7f,0x4d,0xa5,0xaa,0x4f,0x43,0x4d,0x5e,0xe2,0xf3,0x53,0x0e,0xeb,0xb7,0x5c,0x85,0xe0,0x86,0x21,0xf8,0x3e,0xdc,0x08,0xaa,0x96,0x69,0x38,0x94,0xa4,0x27,0x76,0x33,0xba,0x81,0xe1,0x9e,0x9e,0x55,0xaf,0x5c,0x49,0x5d,0xaa,0x5e,0x1a,0x6f,0x8c,0xbb,0x79,0xc0,0x1c,0x72,0x07,},"\xda\x40\x58\x90\xd1\x1a\x87\x2c\x11\x9d\xab\x5e\xfc\xbf\xf6\x1e\x93\x1f\x38\xec\xcc\xa4\x57\xed\xc6\x26\xd3\xea\x29\xed\x4f\xe3\x15\x4f\xaf\xec\x14\x44\xda\x74\x34\x3c\x06\xad\x90\xac\x9d\x17\xb5\x11\xbc\xb7\x3b\xb4\x9d\x90\xba\xfb\x7c\x7e\xa8\x00\xbd\x58\x41\x1d\xf1\x27\x5c\x3c\xae\x71\xb7\x00\xa5\xda\xb4\x91\xa4\x26\x16\x78\x58\x79\x56\xaa\x4a\x21\x9e\x1a\xc6\xdd\x3f\xb2\xcb\x8c\x46\x19\x72\x18\xe7\x26\xdc\x7e\xd2\x34\x52\x6a\x6b\x01\xc0\xd7\x2c\xb9\x3a\xb3\xf4\xf3\x8a\x08\xe5\x94\x0b\x3f\x61\xa7\x2a\xd2\x78\x9a\x05\x32\x00\x0f\xac\x1d\x2d\x2e\x3a\xd6\x32\xac\x8b\x62\xbb\x3f\xf5\xb9\x9d\x53\x59\x7b\xf4\xd4\x4b\x19\x67\x49\x24\xdf\x9b\x3d\xb3\xd0\x25\x3f\x74\x62\x7c\xca\xb3\x00\x31\xc8\x5e\x29\x1c\x58\xb5\xfa\x91\x67\x52\x2a\x46\x74\x6f\xc3\x07\x03\x67\x45\xd4\xf9\x81\x77\x86\xe5\xd3\x00\xe6\xc5\xd5\x03\x12\x5f\xea\x01\xde\xc3\xe3\xfe\xdb\xf3\x86\x1c\xa2\x62\x7a\x05\x18\xfb\x2b\x24\xe5\xa7\xa0\x14\x17\x87\x19\xe9\xb3\x45\xf7\xb2\x49\xce\x3a\x41\x32\x80\xc8\xde\xb6\x74\xf5\x9a\x25\xbe\x92\xa8\xab\x64\x00\xc7\xc5\x2b\x07\x28\xae\x34\xe2\x2b\x2e\xc2\x00\xc1\xcb\xab\xa2\xcc\xd8\xaf\x29\x24\x9d\x17\xaf\x60\xc3\x60\x07\xa7\x22\xfc\x80\x25\x8a\x7b\xeb\xab\x1c\xda\xad\x74\x62\xa8\xb7\x58\x8c\x2f\x7e\x27\xc6\xd0\x7a\xfc\xf6\x01\x17\xfe\xd1\x1b\xd6\x85\x9e\x75\xe3\xb4\xfc\xee\x39\x81\x88\x1e\x95\xdd\x11\x68\x27\xdd\x4b\x36\x9a\xf0\x69\xd3\xc8\xf2\x67\x6f\x8a"}, +{{0x26,0x45,0x04,0x60,0x4e,0x70,0xd7,0x2d,0xc4,0x47,0x4d,0xbb,0x34,0x91,0x3e,0x9c,0x0f,0x80,0x6d,0xfe,0x18,0xc7,0x87,0x9a,0x41,0x76,0x2a,0x9e,0x43,0x90,0xec,0x61,},{0xeb,0x2b,0x51,0x8c,0xe7,0xdc,0x71,0xc9,0x1f,0x36,0x65,0x58,0x16,0x51,0xfd,0x03,0xaf,0x84,0xc4,0x6b,0xf1,0xfe,0xd2,0x43,0x32,0x22,0x35,0x3b,0xc7,0xec,0x51,0x1d,},{0xee,0xa4,0x39,0xa0,0x0f,0x7e,0x45,0x9b,0x40,0x2b,0x83,0x51,0x50,0xa7,0x79,0xee,0xd1,0x71,0xab,0x97,0x1b,0xd1,0xb5,0x8d,0xcc,0x7f,0x93,0x86,0xda,0xdd,0x58,0x3d,0xe8,0xdc,0x69,0xe2,0x67,0x12,0x1d,0xde,0x41,0xf0,0xf9,0x49,0x3d,0x45,0x0b,0x16,0x21,0x9c,0xdf,0x3c,0x22,0xf0,0x94,0x82,0xce,0x40,0x2f,0xe1,0x7c,0xa4,0x9e,0x08,},"\x90\x1d\x70\xe6\x7e\xd2\x42\xf2\xec\x1d\xda\x81\x3d\x4c\x05\x2c\xfb\x31\xfd\x00\xcf\xe5\x44\x6b\xf3\xb9\x3f\xdb\x95\x0f\x95\x2d\x94\xef\x9c\x99\xd1\xc2\x64\xa6\xb1\x3c\x35\x54\xa2\x64\xbe\xb9\x7e\xd2\x0e\x6b\x5d\x66\xad\x84\xdb\x5d\x8f\x1d\xe3\x5c\x49\x6f\x94\x7a\x23\x27\x09\x54\x05\x1f\x8e\x4d\xbe\x0d\x3e\xf9\xab\x30\x03\xdd\x47\xb8\x59\x35\x6c\xec\xb8\x1c\x50\xaf\xfa\x68\xc1\x5d\xad\xb5\xf8\x64\xd5\xe1\xbb\x4d\x3b\xad\xa6\xf3\xab\xa1\xc8\x3c\x43\x8d\x79\xa9\x4b\xfb\x50\xb4\x38\x79\xe9\xce\xf0\x8a\x2b\xfb\x22\xfa\xd9\x43\xdb\xf7\x68\x37\x79\x74\x6e\x31\xc4\x86\xf0\x1f\xd6\x44\x90\x50\x48\xb1\x12\xee\x25\x80\x42\x15\x3f\x46\xd1\xc7\x77\x2a\x06\x24\xbc\xd6\x94\x1e\x90\x62\xcf\xda\x75\xdc\x87\x12\x53\x3f\x40\x57\x33\x5c\x29\x80\x38\xcb\xca\x29\xeb\xdb\x56\x0a\x29\x5a\x88\x33\x96\x92\x80\x8e\xb3\x48\x1f\xd9\x73\x5e\xa4\x14\xf6\x20\xc1\x43\xb2\x13\x3f\x57\xbb\x64\xe4\x47\x78\xa8\xca\x70\x91\x82\x02\xd1\x57\x42\x61\x02\xe1\xdf\xc0\xa8\xf7\xb1\xae\x48\x7b\x74\xf0\x27\x92\x63\x31\x54\xdf\xe7\x4c\xaa\x1b\x70\x88\xfd\xa2\x2f\xa8\xb9\xbc\x35\x4c\x58\x5f\x15\x67\x70\x6e\x29\x55\x49\x38\x70\xf5\x41\x69\xe0\xd7\x69\x11\x59\xdf\x43\x89\x79\x61\xd2\x4a\x85\x2e\xa9\x70\xc5\x14\x94\x8f\x3b\x48\xf7\x1e\xe5\x86\xe7\x2e\xc7\x8d\xb8\x20\xf2\x53\xe0\x8d\xb8\x4f\x6f\x31\x2c\x43\x33\xbd\x0b\x73\x2f\xe7\x58\x83\x50\x77\x83\xe9\xa1\xfd\x4f\xba\xb8\xe5\x87\x0f\x9b\xf7\xad\x58\xaa"}, +{{0x2c,0xa7,0x44,0x7a,0x36,0x68,0xb7,0x48,0xb1,0xfd,0x3d,0x52,0xd2,0x08,0x0d,0x30,0xe3,0x4d,0x39,0x7b,0xb2,0x84,0x6c,0xaf,0x8f,0x65,0x9a,0xc1,0x68,0x78,0x8c,0xa5,},{0xab,0x33,0x1c,0xd4,0x0a,0x31,0xd0,0x17,0x3c,0x0c,0x8c,0x1c,0x17,0x00,0x25,0x32,0x80,0x7b,0xf8,0x9e,0x3e,0xdb,0x6d,0x34,0xc2,0xdd,0x82,0x94,0x63,0x2b,0x9f,0xbc,},{0xf9,0x3a,0xda,0x15,0xae,0x9c,0xd2,0xb5,0x4f,0x26,0xf8,0x6f,0x0c,0x28,0x39,0x2a,0xed,0x5e,0xb6,0xb6,0xb4,0x4d,0x01,0xa4,0xe3,0x3a,0x54,0xe7,0xda,0x37,0xc3,0x8e,0x8d,0x53,0x36,0x6f,0x73,0xfd,0x85,0xbe,0x64,0x2e,0x4e,0xc8,0x12,0x36,0xd1,0x63,0xf0,0xd0,0x25,0xe7,0x6c,0x8b,0xbd,0xd6,0x5d,0x43,0xdf,0x49,0xf0,0x9c,0x1f,0x01,},"\xa8\x2b\xcd\x94\x24\xbf\xfd\xa0\xf2\xf5\xe9\xea\xe1\x78\x35\xdb\xe4\x68\xf6\x1b\x78\x5a\xab\x82\x93\x47\x37\xa9\x1c\x5f\x60\x2c\xb7\xc6\x17\xcd\xff\xe8\x7c\xad\x72\x6a\x49\x72\xe1\x5a\x7b\x8e\xe1\x47\xf0\x62\xd2\xa5\xa4\xd8\x97\x06\xb5\x71\xfa\x8a\xa2\xb9\x59\x81\xc7\x8a\xbe\xaa\xae\x86\x20\x3f\xa2\xc0\xe0\x72\x97\x40\x6e\xa8\xc2\x71\x11\xa8\x6d\xbe\x1d\x5a\x7c\x3b\x7a\xe9\x30\x90\x4d\x98\x90\xf6\xd4\xab\xeb\xd1\x41\x2a\x73\xad\x5f\xee\xa6\x4a\xcf\x06\x5d\x3e\x63\xb5\xcb\xe2\x0c\xf2\x0b\xbd\x2d\x8b\x94\xf9\x05\x3e\xd5\xf6\x66\x33\x48\x25\x30\x12\x44\x46\x60\x59\x18\xde\x66\x45\x5e\x8c\xf4\xb1\x01\xa1\x27\x23\x3c\x4e\x27\xd5\xd5\x5b\xf9\x5b\xd3\x19\x5d\x03\x40\xd4\x35\x31\xfc\x75\xfa\xf8\xdd\xed\x52\x75\xbf\x89\x75\x0d\xe8\x38\xfd\x10\xc3\x17\x45\xbe\x4c\xa4\x1f\xa8\x71\xcb\x0f\x9b\x01\x67\x06\xa1\xa7\xe3\xc4\x4b\xb9\x0a\xc7\xa8\xad\x51\xe2\x72\x38\x92\x92\xfd\x6c\x98\xad\x7a\x06\x9e\x76\xe3\xf5\xf3\xe0\xcc\x77\x0b\x9e\x9b\x35\xa7\x65\xd0\xd9\x37\x12\xd7\xcd\xab\xd1\x7e\x5d\x01\xdd\x81\x83\xaf\x4a\xd9\x36\x5d\xb0\xa0\xfa\x41\x38\x1f\xce\x60\xa0\x81\xdf\x1c\x5a\xb0\xf8\xc1\x8f\x95\xa7\xa8\xb5\x82\xdf\xff\x7f\x14\x9e\xa5\x79\xdf\x06\x23\xb3\x3b\x75\x08\xf0\xc6\x63\xf0\x1e\x3a\x2d\xcd\x9d\xfb\xee\x51\xcc\x61\x52\x20\xfd\xaf\xfd\xab\x51\xbd\xae\x42\xcb\x9f\x7f\xa9\xe3\xb7\xc6\x9c\xc8\xad\xa5\xcc\xd6\x42\x52\x9b\xa5\x14\xfd\xc5\x4f\xcf\x27\x20\xb8\xf5\xd0\x8b\x95"}, +{{0x49,0x4e,0xa9,0xbc,0xce,0x26,0x88,0x5b,0x7d,0x17,0xd1,0xfc,0x11,0x44,0x48,0xf2,0x39,0xf0,0xce,0x46,0xe5,0xf2,0x47,0xb4,0xc9,0x99,0xfa,0x86,0x29,0x69,0x24,0x72,},{0x69,0x01,0xe5,0xef,0xae,0x57,0x53,0x6b,0xa5,0xfd,0xd9,0x6b,0x59,0x65,0x73,0x59,0x06,0x5f,0x25,0xd3,0x91,0xa1,0xaa,0x8c,0xdc,0x0d,0x38,0xbb,0x5d,0x53,0xc1,0x39,},{0x54,0x8a,0x09,0x3a,0x68,0x03,0x61,0xb7,0xdc,0x56,0xf1,0x45,0x03,0xb5,0x5e,0xee,0xc3,0xb3,0xf4,0xfd,0x4c,0xa9,0x9d,0x6a,0xed,0xce,0x08,0x30,0xf7,0xf4,0xae,0x2f,0x73,0x28,0x53,0x9b,0x34,0xc4,0x8f,0xc9,0x76,0x09,0x22,0x33,0x3d,0xae,0x9c,0x7c,0x01,0x7e,0x7d,0xb7,0x3b,0x8f,0xaa,0x6c,0x06,0xbe,0x05,0xe3,0x47,0x99,0x2b,0x06,},"\x3b\xad\xbf\xa5\xf5\xa8\xaa\x2c\xce\x0a\x60\xe6\x86\xcd\xce\x65\x4d\x24\x45\x2f\x98\xfd\x54\x87\x2e\x73\x95\xb3\x94\x64\x38\x0a\x0e\x18\x55\x57\xea\x13\x4d\x09\x57\x30\x86\x4f\x42\x54\xd3\xdd\x94\x69\x70\xc1\x0c\x80\x4f\xcc\x08\x99\xdf\xa0\x24\x20\x5b\xe0\xf8\x0b\x1c\x75\x44\x95\x23\x32\x4f\xe6\xa0\x75\x1e\x47\xb4\xff\x48\x22\xb8\xc3\x3e\x9e\xaf\x1d\x1d\x96\xe0\xde\x3d\x4a\xcd\x89\x69\x6b\x7f\xcc\x03\xd4\x9f\x92\xf8\x2b\x97\x25\x70\x0b\x35\x0d\xb1\xa8\x76\x15\x36\x95\x45\x56\x1b\x85\x99\xf5\xea\x92\x0a\x31\x0a\x8b\xaf\xc0\xe8\xd7\x46\x8c\xbf\x6f\x38\x20\xe9\x43\x59\x4a\xfd\xd5\x16\x6e\x4e\x33\x09\xdd\xdd\x76\x94\xef\x67\xe6\x94\xf3\x4f\xc6\x27\x24\xff\x96\xac\x33\x64\x17\x6f\x34\xe8\xa0\x2b\x4c\xf5\x69\xdb\x5b\x8f\x77\xd5\x85\x12\xae\xda\xbf\x0b\xcd\x1c\x2d\xf1\x2d\xb3\xa9\x47\x3f\x94\x8c\x5c\x32\x43\x30\x9a\xae\x46\xc4\x9e\xfd\x08\x8b\x60\xf3\x1a\x8a\x72\xad\x7e\x5a\x35\xac\xc5\xd8\x9f\xa6\x68\x07\xeb\x5d\x3b\xa9\xcd\xf0\x8d\x47\x53\xcb\x85\x08\x9e\xe3\x6f\x5c\x96\xb4\x32\xb6\x92\x83\x52\xaf\xad\x58\x01\x22\x25\xd6\x15\x7f\x9e\x36\x11\x42\x6d\xf9\x21\xb6\xd1\xd8\x37\x46\x28\xa6\x30\x31\xe9\xff\xb9\x0e\x42\xff\xbb\xa0\x21\xf1\x74\xf6\x85\x03\x15\x54\x30\x15\x2c\x91\x55\xdc\x98\xff\xa2\x6c\x4f\xab\x06\x5e\x1f\x8e\x46\x22\xc2\xf2\x8a\x8c\xb0\x43\x11\x0b\x61\x74\x41\x14\x0f\x8e\x20\xad\xc1\x6f\x79\x9d\x1d\x50\x96\xb1\xf5\x05\x32\xbe\x50\x42\xd2\x1b\x81\xea\x46\xc7"}, +{{0x00,0xd7,0x35,0xeb,0xae,0xe7,0x5d,0xd5,0x79,0xa4,0x0d,0xfd,0x82,0x50,0x82,0x74,0xd0,0x1a,0x15,0x72,0xdf,0x99,0xb8,0x11,0xd5,0xb0,0x11,0x90,0xd8,0x21,0x92,0xe4,},{0xba,0x02,0x51,0x7c,0x0f,0xdd,0x3e,0x26,0x14,0xb3,0xf7,0xbf,0x99,0xed,0x9b,0x49,0x2b,0x80,0xed,0xf0,0x49,0x5d,0x23,0x0f,0x88,0x17,0x30,0xea,0x45,0xbc,0x17,0xc4,},{0xdc,0xdc,0x54,0x61,0x19,0x37,0xd2,0xbd,0x06,0xca,0xcd,0x98,0x18,0xb3,0xbe,0x15,0xce,0x74,0x25,0x42,0x7a,0x75,0xf5,0x0d,0x19,0x7a,0x33,0x7a,0x3b,0x8b,0xa6,0x71,0x4e,0xf4,0x88,0x66,0xf2,0x43,0xbd,0x5a,0xc7,0x41,0x5e,0x91,0x45,0x17,0xa2,0xc1,0xc5,0xa9,0x53,0xf4,0x32,0xb9,0x9d,0xb0,0xe6,0x20,0xd6,0x4f,0x74,0xeb,0x85,0x05,},"\x59\xc0\xb6\x9a\xf9\x5d\x07\x4c\x88\xfd\xc8\xf0\x63\xbf\xdc\x31\xb5\xf4\xa9\xbc\x9c\xec\xdf\xfa\x81\x28\xe0\x1e\x7c\x19\x37\xdd\xe5\xeb\x05\x70\xb5\x1b\x7b\x5d\x0a\x67\xa3\x55\x5b\x4c\xdc\xe2\xbc\xa7\xa3\x1a\x4f\xe8\xe1\xd0\x3a\xb3\x2b\x40\x35\xe6\xda\xdb\xf1\x53\x20\x59\xee\x01\xd3\xd9\xa7\x63\x3a\x0e\x70\x6a\x11\x54\xca\xb2\x2a\x07\xcd\x74\xc0\x6a\x3c\xb6\x01\x24\x4c\xf3\xcf\x35\xa3\x5c\x31\x00\xba\x47\xf3\x13\x72\xa2\xda\x65\xdc\xff\x0d\x7a\x80\xa1\x05\x5d\x8a\xa9\x92\x12\xe8\x99\xaa\xd7\xf0\x2e\x94\x9e\x6f\xee\x4d\x3c\x9c\xef\xa8\x50\x69\xea\xff\x1f\x6a\xd0\x6f\xc3\x00\xc8\x71\xab\x82\xb2\xbe\xdb\x93\x4d\x20\x87\x5c\x2a\x26\x32\x42\xcd\xb7\xf9\xbe\x19\x2a\x87\x10\xb2\x4c\x7e\xa9\x8d\x43\xda\xec\x8b\xaa\x55\x53\xc6\x78\xa3\x8f\x0e\x0a\xdf\x7d\x3f\xf2\xdc\xc7\x99\xa1\xdb\xad\x6e\xab\x1c\x3d\x94\x58\xa9\xdb\x92\x2f\x02\xe7\x5c\xfa\xb9\xd6\x5c\x73\x36\xda\xe7\x18\x95\xd5\xbb\x15\xca\xc2\x03\xf2\xb3\x8b\x99\x96\xc4\x10\xf8\x65\x5a\xd2\x2d\x3c\x09\x1c\x20\xb7\xf9\x26\xd4\x5e\x78\x01\x28\xf1\x97\x47\x46\x2a\xbc\x5c\x58\x93\x2f\xbb\x9e\x0b\xc6\x2d\x53\x86\x88\x02\xf1\xb0\x83\xf1\x83\xb8\xa1\xf9\x43\x49\x86\xd5\xcf\x97\xc0\x4e\x2f\x3e\x14\x57\x30\xcb\xa9\x87\x79\xc7\xfe\xd0\xca\xb1\xc0\x5d\x5e\x46\x53\xc6\xc3\xf6\x73\x62\x60\xbc\x78\xee\x43\x72\x86\x2f\xfe\x9e\x90\x37\x1d\x76\x2c\x74\x32\x78\x1f\x35\xce\xd8\x84\xa4\xba\xca\x05\x65\x3e\xf2\x5f\x25\xa6\xf3\xd5\x62\x83\x08"}, +{{0x8c,0x34,0xb9,0x05,0x44,0x0b,0x61,0x91,0x1d,0x1d,0x81,0x37,0xc5,0x3d,0x46,0xa1,0xa7,0x6d,0x46,0x09,0xaf,0x97,0x3e,0x18,0xeb,0x4c,0x57,0x09,0x29,0x56,0x27,0xbb,},{0xb6,0x9a,0x8b,0x2f,0xdf,0x5c,0x20,0xe7,0x34,0xc2,0xff,0xb2,0x94,0xbc,0x8a,0xe1,0x01,0x1d,0x66,0x4f,0x11,0xaf,0xe7,0xfb,0xc4,0x71,0x92,0x5c,0xf7,0x2f,0xa9,0x9d,},{0x3e,0x0b,0x72,0x07,0x3d,0xc9,0x37,0x5e,0xed,0xcc,0xa6,0xc4,0xfc,0x1c,0xd3,0x15,0x93,0x8a,0x05,0x0c,0x92,0x71,0x6b,0xd2,0x28,0x4f,0x46,0x29,0xa9,0x62,0xbe,0xec,0x0b,0x7d,0x7c,0xf1,0x6a,0xb9,0x23,0xd5,0x8f,0x5b,0x90,0xd3,0x90,0x1a,0x8e,0x5c,0x75,0xc8,0xf1,0x7d,0xab,0x99,0x98,0xe0,0x07,0xd8,0xc4,0x95,0x11,0x97,0x3d,0x0e,},"\x30\xb5\x7a\x38\x9b\x48\xa0\xbe\xb1\xa4\x84\x32\xbf\xf6\xb3\x14\xbd\xed\x79\xc4\xa1\x76\x3a\x5a\xcb\x57\xce\xa1\xbf\xb4\xc6\xd0\x16\xcf\x09\x0f\x5b\xd0\x5b\xbd\x11\x4e\x33\xae\x7c\x17\x78\x2d\xfa\x26\x4f\x46\xc4\x5f\x8c\x59\x9c\x60\x30\x16\xfe\x9f\xf0\x5b\x6b\x5a\x99\xe9\x2f\xe7\x13\xa4\xcd\x5c\x41\xb2\x92\xed\x2b\xb2\xe9\xcf\x33\xa4\x40\x54\x2e\x82\x1e\xc8\x2c\xbf\x66\x5c\x3f\x02\xe3\xdc\x33\x7d\x7f\xdb\x58\xe3\x1b\x27\xcb\x29\x54\x54\x14\x68\x81\x46\x98\x51\x0d\xf1\x8c\x85\xc8\x1f\xad\x12\xdb\x11\xec\x6b\x96\x6f\x49\x30\xda\x56\x46\xb9\x91\xdb\x97\x44\x50\x97\xda\x30\xda\xb6\x1c\xda\x53\xa4\x10\x83\xcb\x96\xad\xd1\x9d\xe6\xc5\xee\xc3\x23\xbc\xa9\xd3\x53\x0e\x38\xc0\x0b\x35\xaf\x73\x60\x07\x76\x01\xbe\x6a\xc9\x7f\x30\x30\xf9\x30\xa2\x7b\x90\xfe\x8b\x69\x11\xba\xe3\x89\x06\x5a\xdc\x15\xe1\x88\x23\x00\xe2\xa0\x03\x27\x4d\x23\x18\x2d\x5e\xfd\x5b\xa4\xb9\x13\x0c\x07\xbd\x5c\x65\xfe\xcb\x8b\x5c\xb7\xeb\x38\x83\x6b\x31\x8b\xef\xdf\xd7\x7d\xe4\xd6\xca\x01\x81\xf7\x7a\xe5\x74\x08\x91\x68\x32\x25\xf5\x49\xdd\x84\x26\x14\x5c\x97\xc5\x81\x8c\x31\x9f\x7a\xb2\xd8\x68\xe1\xa4\x1c\xea\xb6\x4c\x08\x51\x16\x06\x98\x97\xbf\x2c\xa3\x66\x76\x52\x40\x61\x55\xed\x06\x46\x43\x1b\x6d\xe1\xcc\xc0\x3b\x42\x79\xae\x4d\x32\x66\x79\x26\x5d\xce\x82\x04\x8e\x72\x98\xe1\xf8\x7f\xce\xc0\x76\x8a\xc0\xf5\xd8\xff\x84\xf7\x21\x0b\xe5\x4d\x41\x1a\xf8\xed\xea\x72\x17\xf4\xe5\x94\x13\x12\x1e\x14\x8c\x60\xda"}, +{{0x77,0xa8,0x3e,0x18,0xc9,0xf0,0x00,0xee,0xff,0x7d,0xee,0xac,0x95,0x9e,0xcb,0xa2,0x20,0x6c,0x0a,0xa3,0x9d,0x2f,0x0e,0x2a,0xed,0x57,0x29,0x48,0x2a,0x7a,0x02,0x29,},{0x62,0xb1,0xb3,0x16,0x13,0x55,0x96,0xbf,0xbc,0xa6,0x03,0x7e,0xd8,0x47,0xc6,0x1f,0xb7,0xf0,0x9f,0xa3,0x6c,0xe9,0x0a,0xbb,0x77,0x89,0xb8,0x6f,0x76,0x8b,0x59,0xdd,},{0x1e,0xaa,0xd8,0x42,0x0a,0xc1,0x2c,0x99,0xac,0x1f,0xf4,0x47,0x66,0x78,0xe3,0xcb,0xbe,0x94,0xda,0x6a,0x79,0x7f,0x17,0x46,0x64,0xd5,0xee,0x0f,0x64,0x14,0x33,0xfb,0x1e,0x7c,0xb2,0xf5,0x61,0x3e,0x10,0x80,0x5d,0xf8,0x65,0x4c,0xd8,0xe0,0xd4,0x5d,0x96,0x23,0x09,0x32,0xbc,0x7f,0x20,0xb0,0x4e,0xae,0x83,0x64,0x35,0x13,0x43,0x09,},"\xf3\xd5\xfa\x2a\xca\xef\xd8\x58\xf1\xdf\x26\xe0\x30\x59\xcd\xcb\xc2\x46\x8a\xd7\x4a\xfc\x99\x3d\x0d\xb9\xc4\xcd\xe4\x11\x3f\x8d\x55\xc7\xda\x71\xd3\x8b\xa0\x65\x20\x53\x1c\x61\xfd\xdb\x5f\x33\xd5\xf0\x35\x3b\xe2\x37\x6e\x58\x07\x11\xbe\x45\xc0\xa3\x0b\x1f\xa0\x1b\x55\xe2\x28\xc6\xfa\x35\xe3\xf9\x5b\x67\x90\x9f\xc7\xdf\x3f\xd4\x64\xd9\x3d\x66\x1a\x92\x6f\x9d\x11\xf7\x55\x0c\x17\xfb\xcc\x34\x96\x52\x6e\x8f\x10\xe0\xc8\x91\x66\x77\xb2\xbe\x5b\x31\x9b\x68\x8f\x21\xe8\x1a\xaa\x94\x82\xe5\xc9\x3e\x64\xce\x8c\x43\x7b\x9c\x1e\x14\xfe\xfe\xd7\x0a\x3f\xee\x56\x88\x11\xdc\x31\xca\xda\xb3\xd5\xb2\x20\x25\x44\x65\x33\x6d\xc4\xd9\x7a\x3b\xd0\x96\xb5\xe0\x65\xe0\xcf\xbe\x82\x84\x9e\x2c\x19\x05\xac\xa4\x86\x53\x3f\x0d\xa7\xa6\x1f\x1e\x9a\x55\xb8\xe2\xa8\x32\x62\xde\xeb\x59\xf2\xb1\x3d\x3a\x8a\xef\x57\x00\x84\x5b\x83\xb2\x5a\xe2\x18\x3c\x0d\xda\xc0\xce\x42\xf8\xd2\x56\x74\xcb\x0d\x0d\x22\x0a\x6d\xe7\xc1\x85\x8b\xb0\x7d\x59\xa3\x37\x23\x44\xd9\x44\x60\x2a\xa4\x51\xd2\xb9\x37\xdb\x0f\xe6\xfe\xca\x0b\xeb\xa8\x17\x21\xfc\x36\x1e\xa7\x50\x9e\x2b\x6d\x39\x7e\x1c\x19\x1b\x56\xf5\x4a\xb4\x36\xd0\xd2\x7a\xb4\xc0\x61\xbd\x66\x1a\xd1\xa4\x45\x23\x87\xe8\x73\x57\x54\xd0\x7f\xa7\xef\x4d\x45\x48\xb1\x72\x58\x24\x25\xb2\x99\x04\x6e\x63\x01\xb5\xba\x6b\x91\x44\x18\xf1\x49\xcf\x72\x2e\x10\xbd\xe2\xe0\xd4\x17\x00\xf1\x2c\x84\x29\xfc\x89\x7b\x78\x19\xda\x92\x29\x22\x40\xcd\x45\x56\x54\x58\xc9\xa7\xb2\x9c\x12"}, +{{0x73,0xb0,0x33,0x73,0xef,0x1f,0xd8,0x49,0x00,0x5e,0xcd,0x62,0x70,0xdd,0x99,0x06,0xf1,0x9f,0x44,0x39,0xe4,0x03,0x76,0xcd,0xbc,0x52,0x09,0x02,0xbc,0x97,0x68,0x12,},{0x66,0x37,0x19,0xe0,0x8b,0xa3,0xba,0x16,0x66,0xf6,0x06,0x9a,0x3f,0x54,0x99,0x18,0x66,0xb1,0x8c,0xc6,0xbe,0x41,0x99,0x1b,0x02,0xeb,0x30,0x26,0xff,0x9e,0x15,0x5f,},{0xa4,0x0a,0xbe,0x98,0xfc,0x69,0xda,0x8a,0x1f,0xf9,0xff,0x5c,0x2c,0xca,0x93,0x63,0x2e,0x97,0x59,0x80,0xee,0x8b,0x82,0xc3,0xc3,0x76,0x02,0x2d,0x65,0x24,0xab,0x73,0x6d,0x01,0xb0,0x72,0xf2,0xb6,0x81,0xb5,0xf1,0xcd,0x3e,0xa0,0x67,0x01,0x2e,0xd6,0xd0,0x74,0xe9,0x49,0xc4,0x23,0x27,0xa3,0x66,0xca,0xa9,0xe4,0x75,0x0a,0x3c,0x08,},"\xd5\xc2\xde\xab\xa7\x95\xc3\x0a\xba\x32\x1b\xc7\xde\x69\x96\xf0\xd9\x0e\x4d\x05\xc7\x47\xfb\x4d\xae\x8f\x34\x51\x89\x5d\xef\x6e\x16\xe7\x2f\x38\xea\xce\x75\x6f\x36\x63\x5f\x8f\xb0\xb7\x2a\x3a\x0c\x1f\x54\x66\x38\x17\xa9\x4d\x4f\xd3\x46\xf8\x35\xab\x0e\x65\x7f\x00\x1a\x6f\x2c\xec\xb8\x6d\x08\x25\xbd\x02\x63\x92\x54\xf7\xf7\xf3\x8c\xa9\x9d\xbb\x86\xc6\x4a\x63\x3f\x73\xba\xf9\x33\xaa\xe3\x56\x32\x81\xf4\x00\x5e\x2d\x0e\x7c\xec\x9f\xbd\xe8\xe5\x88\xa9\x57\xe2\x11\x06\x8b\xe6\x5b\x3d\x3d\x35\xbf\x4e\x8d\x5b\xb3\x47\x83\x33\xdf\x9c\xed\x9b\x2a\xba\xf4\x86\x97\x99\x4a\x14\x5e\x93\x21\x49\x9f\xc5\xee\x56\x0f\x4f\xbb\x68\x49\xe1\xae\x8e\xb3\xd1\xde\x00\x83\xa2\x1a\x03\xf6\xa6\xb2\x81\x76\xf0\x13\x0d\x38\x95\xe5\x0e\x75\xe3\xd7\xd0\x94\x7a\x7b\xc2\xc5\xb9\xff\x69\x89\x5d\x27\x79\x14\x42\xba\x8d\x0f\x21\x80\x71\x2b\x56\x7f\x71\x2e\xa9\x12\xf3\xb0\xd9\x2c\x19\x34\x2e\x01\x06\xff\x1d\x87\xb4\x6a\xd3\x3a\xf3\x00\xb9\x08\x55\xba\x97\x69\xd3\x66\xe7\x94\x25\xd9\x8e\x4d\xe1\x99\x05\xa0\x45\x77\x70\x7c\xbe\x62\x5b\x84\x69\x17\x81\xcd\x26\xbf\x62\x26\x0b\x4a\x8b\xd6\x05\xf7\x7a\xf6\xf9\x70\xe1\xb3\xa1\x12\xe8\x91\x83\x44\xbd\x0d\x8d\x2e\x41\xdf\xd2\xce\x98\x95\xb0\x24\x6e\x50\x88\x7a\xa3\xa5\x77\xff\x73\xbe\x4b\x6a\xe6\x0f\xeb\x0c\xa3\x6f\x6a\x5f\x81\x71\xed\x20\x9e\x5c\x56\x65\x29\xc0\x94\x0d\x9b\x4b\xd7\x44\xcc\xee\x56\xe5\x4a\x9a\x0c\x6e\x4d\xa5\x20\xdd\x31\x5c\x28\x72\xb0\x2d\xb5\x63\x70\x3e"}, +{{0xea,0xb1,0x79,0xe4,0x1e,0xd5,0xc8,0x89,0xff,0xe6,0xaa,0xbd,0xc0,0x54,0xfa,0xf1,0x30,0x7c,0x39,0x5e,0x46,0xe3,0x13,0xe1,0x7a,0x14,0xfe,0x01,0x02,0x3f,0xfa,0x30,},{0x86,0xf3,0x47,0x46,0xd3,0xf7,0xa0,0x1d,0xdb,0xe3,0x22,0xf1,0xac,0xa5,0x6d,0x22,0x85,0x6d,0x38,0x73,0x3a,0x3a,0x69,0x00,0xbb,0x08,0xe7,0x76,0x45,0x0e,0xc8,0x03,},{0x14,0x3c,0xb2,0x80,0x27,0xc2,0xf8,0x2e,0x37,0x5e,0x5f,0x34,0x0e,0x7f,0xe6,0xe6,0x0c,0xe7,0xbd,0x51,0x00,0x0b,0x49,0xc7,0x41,0x68,0xaf,0x85,0xe2,0x6e,0xd2,0xed,0x63,0x0e,0xd2,0x67,0x20,0x90,0x16,0x4c,0xc5,0x4b,0x05,0x2d,0xa6,0x94,0xeb,0xdd,0x21,0xa2,0x1b,0x30,0x53,0xf4,0xdc,0xfd,0x78,0x95,0xea,0x5f,0x6c,0x8a,0xa8,0x0d,},"\x97\x10\x95\xce\xbe\x50\x31\x53\x02\x24\x38\x7c\x5c\x31\x96\x6e\x38\x9b\x85\x66\x39\x00\x54\xcf\x45\x26\x4b\x44\xe1\x89\x64\xb7\xbe\x52\xc3\x3c\x4f\xfb\x25\x9a\xf1\x62\x83\x43\x8f\xa1\x5d\xd6\x6b\xc7\x79\x1b\x75\x33\xef\x10\xcb\x0b\xea\xb5\x24\xa6\x43\x76\x26\xf4\xcc\x74\x51\x28\x51\xad\xcc\x2f\xb1\x29\x05\x5a\x48\x2c\x61\x10\x73\x83\xfb\x7c\x52\x41\x83\x1d\x55\x51\x63\x4e\xef\x0d\xc0\xb8\xf9\x05\x3a\x00\x97\x1a\xa8\xfa\x1a\xe0\x89\x8e\x4b\x48\x1b\x67\x07\xe9\x7c\x0f\x94\x20\x40\xb3\x39\xd9\x2f\xc1\x7b\xba\xde\x74\x67\x5a\xf2\x43\xd8\xb2\xda\xfb\x15\xb1\xdb\x55\xd1\x24\x15\xb8\x5f\x30\x37\x29\x19\x30\xab\x61\x60\x0b\xa3\x43\x1f\x8e\xb4\x25\xbe\x44\x91\x61\x47\x28\xaf\x10\x1e\x81\xc0\x91\xf3\x48\xbc\x5f\xfd\x1b\xde\x6a\xe6\xca\xd5\xc1\x5b\x3a\xa7\x35\x80\x78\xcc\x4e\xff\xb5\x4a\x86\xe7\xf0\xe0\xc5\x5e\x4c\xfe\x0a\x54\x60\x5e\xd4\x43\xfd\xf2\xaa\xba\x01\x65\x85\xda\x61\x7e\x77\x34\x1d\x52\x88\x9d\x75\xdd\x54\x0d\x39\xfe\x8b\x79\x93\xed\x70\x5c\xfd\xde\xa0\xcb\x0d\x5a\x73\x1d\x6b\xfc\xdb\x81\x6a\xfa\xff\x47\xe9\x63\xee\xde\xbd\xf2\x41\xaf\x55\x93\x35\x3d\x6d\x40\x1a\x34\xf0\x29\xa8\xcd\xeb\x19\x04\xcc\x2c\xaa\x4f\x96\x35\xcc\x2b\xa6\xb7\xb1\xa2\x9d\xa6\x25\xff\xc3\x83\xbe\x2f\x5a\x8f\x1f\xa4\xf3\x9b\x2d\x4b\x4f\x4c\x2d\x88\x38\xce\x25\x8a\x04\xd4\xa1\x20\x49\x3f\xdf\x07\xf6\x8c\x0f\xfd\x1c\x16\xb7\x68\xa3\x5c\x55\xfe\xa2\xca\xc6\x96\xb5\xc2\x0e\xfc\x10\x86\x5c\xde\x8a\x64\x62\x7d\xcd"}, +{{0xfb,0xf1,0x46,0xeb,0xd5,0x10,0x75,0x57,0x0e,0xc5,0x1a,0xc4,0x10,0xae,0x9f,0x39,0x1d,0xb7,0x5b,0x61,0x0a,0xda,0x63,0x62,0xb4,0xdb,0xd9,0x49,0x65,0x6c,0xfb,0x66,},{0xbe,0x7c,0x2f,0x5b,0x21,0xd7,0x46,0xc8,0xea,0x32,0x45,0xce,0x6f,0x26,0x8e,0x9d,0xa7,0x4e,0x00,0xfa,0x85,0xc9,0xc4,0x75,0x26,0x0c,0x68,0xfa,0x1a,0xf6,0x36,0x1f,},{0x67,0x68,0x00,0x6f,0xe0,0xf2,0x01,0xb2,0x17,0xdd,0x10,0xeb,0x05,0xd4,0xb8,0x2a,0xdc,0xfe,0xb2,0xec,0xfc,0x83,0x73,0xc3,0x30,0x8f,0x41,0x50,0x39,0x48,0x11,0xeb,0x60,0x49,0x18,0x81,0xa2,0xe5,0x3d,0x12,0x89,0xd9,0x64,0x78,0xe1,0x8a,0x64,0xc3,0x4b,0x2a,0x19,0x83,0x2c,0xdc,0xcf,0xd9,0x6a,0x2e,0x4a,0x0c,0x46,0x9f,0xdc,0x0b,},"\xcd\x7a\xd4\xf1\x7f\xcf\xf7\x3a\xcc\x40\x2d\xc1\x02\xd0\x90\x79\xb2\x9a\xaf\x2a\x0f\x4b\x27\xcf\x6b\xee\xb1\xe2\xb2\x3d\x19\xab\x47\xde\xb3\xae\x1b\xec\xd6\x88\x61\xea\x27\x9c\x46\x69\x17\x38\xf4\xff\xf4\x7c\x43\x04\x7c\x4f\x8b\x56\xb6\xbb\xcc\x3f\xde\x07\x23\xd4\x41\x20\xdc\xd3\x07\xa6\x31\x0d\xc4\xf3\x66\xb8\xf3\xcd\x52\xdb\x19\xb8\x26\x6a\x48\x7f\x78\x72\x39\x1c\x45\xfe\x0d\x32\x48\xa7\xab\xf2\xc2\x00\x22\xd3\x76\x95\x47\xf6\x83\x06\x7d\xcc\x36\x3c\xd2\x2f\xd7\xcd\xa3\xca\xdc\x15\x80\x40\x56\xf0\xe2\xaa\x2b\x79\x50\x08\xc5\x98\xbe\x7a\x96\x18\x05\xe6\xdf\x29\x1b\xa3\x04\x1c\x47\xff\x56\x40\x27\x5f\x46\xe6\xae\x82\x09\x2d\x21\xab\xcb\xcf\xba\x11\xe7\x30\x21\x60\x08\x82\x2d\xe3\xce\x46\x24\x00\x59\x6d\xa7\x9f\x7a\xe5\xd1\xdf\x83\x89\x11\x2a\xd9\x88\x68\xfa\x94\xfb\x05\x46\xbf\xe6\xa6\x7a\xa8\xd2\x8c\x4d\x32\x07\x2d\x2e\xad\xd6\x25\x62\x55\xf1\x8c\x23\x82\xe6\x62\xdf\xa9\x22\xa6\x80\xe0\x6a\x43\x62\x2c\x48\x71\xd2\x7d\x18\x07\xf7\xb2\x70\x30\x70\xc8\x3d\xb8\xdd\x92\x9c\x06\x03\x8b\x21\x83\xcb\x8e\x2b\x9e\xc4\xc7\x78\xd7\xec\xf9\xe9\xff\xac\x77\xfa\x77\x37\xb0\x55\xfe\xac\x2e\x79\x82\xae\xee\xc0\xb7\x2f\x1b\xbc\xa2\x42\x4e\x1a\x84\x4b\xba\xc7\x9c\xb2\xe7\x40\x0f\x81\xdc\x44\x9d\x05\x60\xb5\x21\xa7\xc1\x6b\xb4\x16\x7e\x66\x96\x58\x60\x58\xa9\xb8\xed\x2e\x51\x16\x69\x0b\x77\xf2\xa1\x7e\x5c\x0b\x16\xa8\x3d\xcb\xd2\xe2\x45\x52\x29\x3e\x25\x8b\x32\xba\x7f\x84\x49\x44\x37\x93\x42\x69\x86\x27"}, +{{0xdf,0xf0,0xeb,0x6b,0x42,0x6d,0xea,0x2f,0xd3,0x3c,0x1d,0x3f,0xc2,0x4d,0xf9,0xb3,0x1b,0x48,0x6f,0xac,0xb7,0xed,0xb8,0x50,0x29,0x54,0xa3,0xe8,0xda,0x99,0xd9,0xfd,},{0xc2,0x45,0x08,0x5e,0xce,0x69,0xfb,0x9a,0xa5,0x60,0xd0,0xc2,0x7f,0xdb,0x63,0x4f,0x7a,0x84,0x0d,0x41,0xd8,0x46,0x36,0x60,0xfb,0xe8,0x24,0x83,0xb0,0xf3,0xcc,0x3a,},{0x6b,0x48,0xb1,0x0f,0x54,0x5d,0xdb,0x7a,0x89,0xcd,0x58,0x29,0xf4,0xe5,0xb2,0x01,0x46,0xcf,0x6b,0xc9,0x6e,0x55,0x0d,0x06,0xf6,0x5d,0xe8,0xbd,0xae,0x7c,0xcd,0xde,0xd2,0x6c,0xd6,0x30,0xf8,0x6c,0x92,0x66,0xbc,0xcf,0x88,0xe9,0x24,0x03,0x3e,0x04,0xf8,0x3a,0x54,0xf8,0x29,0x0d,0x7f,0x73,0x4c,0xf8,0x67,0x3c,0xca,0x8f,0x97,0x03,},"\xe7\xc9\xe3\x13\xd8\x61\x60\xf4\xc7\x4a\xa0\xae\x07\x36\x9e\xe2\x2b\x27\xf8\x1b\x3f\x69\x09\x7a\xff\xae\x28\xda\xe4\x84\x83\xfb\x52\xa5\xc0\x62\x30\x6b\x59\x61\x0f\x5c\xdb\xff\x63\x32\xb1\x96\x0c\xd6\xf2\xb8\xf7\xb4\x15\x78\xc2\x0f\x0b\xc9\x63\x7a\x0f\xdf\xc7\x39\xd6\x1f\x69\x9a\x57\x3f\x1c\x1a\x0b\x49\x29\x45\x06\xcf\x44\x87\x96\x5e\x5b\xb0\x7b\xbf\x81\x80\x3c\xb3\xd5\xcb\x38\x29\xc6\x6c\x4b\xee\x7f\xc8\x00\xed\xe2\x16\x15\x09\x34\xd2\x77\xde\xa5\x0e\xdb\x09\x7b\x99\x2f\x11\xbb\x66\x9f\xdf\x14\x0b\xf6\xae\x9f\xec\x46\xc3\xea\x32\xf8\x88\xfd\xe9\xd1\x54\xea\x84\xf0\x1c\x51\x26\x5a\x7d\x3f\xef\x6e\xef\xc1\xcc\xdb\xff\xd1\xe2\xc8\x97\xf0\x55\x46\xa3\xb1\xca\x11\xd9\x51\x7c\xd6\x67\xc6\x60\xec\x39\x60\xf7\xa8\xe5\xe8\x02\x02\xa7\x8d\x3a\x38\x8b\x92\xf5\xc1\xde\xe1\x4a\xe6\xac\xf8\xe1\x7c\x84\x1c\x95\x57\xc3\x5a\x2e\xec\xed\x6e\x6a\xf6\x37\x21\x48\xe4\x83\xcc\xd0\x6c\x8f\xe3\x44\x92\x4e\x10\x19\xfb\x91\xcb\xf7\x94\x1b\x9a\x17\x6a\x07\x34\x15\x86\x72\x10\x67\x04\x10\xc5\xdb\xd0\xac\x4a\x50\xe6\xc0\xa5\x09\xdd\xfd\xc5\x55\xf6\x0d\x69\x6d\x41\xc7\x7d\xb8\xe6\xc8\x4d\x51\x81\xf8\x72\x75\x5e\x64\xa7\x21\xb0\x61\xfc\xd6\x8c\x46\x3d\xb4\xd3\x2c\x9e\x01\xea\x50\x12\x67\xde\x22\x87\x9d\x7f\xc1\x2c\x8c\xa0\x37\x9e\xdb\x45\xab\xaa\x6e\x64\xdd\xa2\xaf\x6d\x40\xcc\xf2\x4f\xbe\xba\xd7\xb5\xa8\xd3\xe5\x20\x07\x94\x5e\xcd\x3d\xdc\x1e\x3e\xfe\xb5\x22\x58\x1a\xc8\x0e\x98\xc8\x63\xba\x0c\x59\x0a\x3e\xd9\x5c\xd1"}, +{{0x9f,0x32,0x95,0x8c,0x76,0x79,0xb9,0x0f,0xd5,0x03,0x60,0x56,0xa7,0x5e,0xc2,0xeb,0x2f,0x56,0xec,0x1e,0xff,0xc7,0xc0,0x12,0x46,0x1d,0xc8,0x9a,0x3a,0x16,0x74,0x20,},{0x1d,0x72,0x69,0xdc,0xb6,0xd1,0xf5,0x84,0xe6,0x62,0xd4,0xce,0x25,0x1d,0xe0,0xab,0xa2,0x90,0xef,0x78,0xb9,0x7d,0x44,0x8a,0xfb,0x1e,0x53,0x33,0xf1,0x97,0x6d,0x26,},{0x98,0x81,0xa5,0x76,0x3b,0xdb,0x25,0x9a,0x3f,0xef,0xbb,0xa3,0xd9,0x57,0x16,0x2d,0x6c,0x70,0xb8,0x04,0xfa,0x94,0xab,0x61,0x34,0x06,0xa6,0xec,0x42,0x50,0x5b,0x87,0x89,0x46,0x5c,0xa1,0xa9,0xa3,0x3e,0x18,0x95,0x98,0x88,0x42,0x27,0x0c,0x55,0xe5,0xbd,0xd5,0x48,0x3f,0x6b,0x17,0xb3,0x17,0x81,0xb5,0x93,0x50,0x7a,0x6c,0x18,0x08,},"\xa5\x6b\xa8\x6c\x71\x36\x05\x04\x08\x7e\x74\x5c\x41\x62\x70\x92\xad\x6b\x49\xa7\x1e\x9d\xaa\x56\x40\xe1\x04\x4b\xf0\x4d\x4f\x07\x1a\xd7\x28\x77\x9e\x95\xd1\xe2\x46\x05\x84\xe6\xf0\x77\x35\x45\xda\x82\xd4\x81\x4c\x91\x89\xa1\x20\xf1\x2f\x3e\x38\x19\x81\x3e\x5b\x24\x0d\x0f\x26\x43\x6f\x70\xee\x35\x3b\x4d\x20\xce\xa5\x4a\x14\x60\xb5\xb8\xf1\x00\x8d\x6f\x95\xf3\xaa\x2d\x8f\x1e\x90\x8f\xce\xd5\x0d\x62\x4e\x3a\x09\x69\x38\xb9\x35\x38\x54\xb9\x6d\xa4\x63\xa2\x79\x8a\x5a\x31\x2e\xc7\x90\x84\x2c\x10\xc4\x46\xe3\x35\x0c\x76\x4b\xf5\xc9\x72\x59\x3b\x99\x87\xbf\x23\x25\x6d\xaa\x88\x94\xd4\x7f\x22\xe8\x5b\x97\x60\x7e\x66\xfc\x08\xa1\x2c\x78\x9c\x47\x46\x08\x03\x68\xd3\x21\xbb\x90\x15\xa1\x15\x5b\x65\x52\x3a\xd8\xe9\x9b\xb9\x89\xb4\x4e\xac\x75\x6b\x07\x34\xac\xd7\xc6\x35\x7c\x70\xb5\x97\x43\x24\x6d\x16\x52\xd9\x1b\x0f\x98\x96\x96\x51\x41\x34\x5b\x99\x45\xcf\x34\x98\x04\x52\xf3\x50\x29\x74\xed\xb7\x6b\x9c\x78\x5f\xb0\xf4\x39\x52\x66\xb0\x55\xf3\xb5\xdb\x8a\xab\x68\xe9\xd7\x10\x2a\x1c\xd9\xee\x3d\x14\x25\x04\xf0\xe8\x8b\x28\x2e\x60\x3a\x73\x8e\x05\x1d\x98\xde\x05\xd1\xfc\xc6\x5b\x5f\x7e\x99\xc4\x11\x1c\xc0\xae\xc4\x89\xab\xd0\xec\xad\x31\x1b\xfc\x13\xe7\xd1\x65\x3b\x9c\x31\xe8\x1c\x99\x80\x37\xf9\x59\xd5\xcd\x98\x08\x35\xaa\x0e\x0b\x09\xbc\xbe\xd6\x34\x39\x11\x51\xda\x02\xbc\x01\xa3\x6c\x9a\x58\x00\xaf\xb9\x84\x16\x3a\x7b\xb8\x15\xed\xbc\x02\x26\xed\xa0\x59\x5c\x72\x4c\xa9\xb3\xf8\xa7\x11\x78\xf0\xd2\x0a\x5a"}, +{{0xf8,0x6d,0x6f,0x76,0x6f,0x88,0xb0,0x07,0x17,0xb7,0xd6,0x32,0x7e,0xb2,0x6c,0xf3,0xce,0xeb,0xa5,0x38,0x51,0x84,0x42,0x6f,0x9c,0xfd,0x82,0x95,0xe2,0x42,0x1f,0xf2,},{0xcb,0x1d,0x25,0x05,0x04,0x75,0x41,0x83,0x70,0x4d,0xbe,0x21,0xc3,0x23,0xd6,0x6f,0x9f,0x90,0x11,0x75,0x8f,0x6d,0x8d,0xab,0x6f,0x59,0x7b,0x19,0x96,0x62,0x14,0x5b,},{0xec,0x61,0xc0,0xb2,0x92,0x20,0x3a,0x8f,0x1d,0x87,0x23,0x5e,0xde,0x92,0xb7,0x47,0x23,0xc8,0xd2,0x34,0x08,0x42,0x37,0x73,0xae,0x50,0xb1,0xe9,0xbc,0x44,0x64,0xe0,0x3e,0x44,0x6d,0xa9,0xdc,0xe4,0xc3,0x9f,0x6d,0xd1,0x59,0xbe,0xa2,0x6c,0x00,0x9e,0xd0,0x01,0x20,0xbc,0x36,0xd4,0xa2,0x47,0xdc,0x0d,0x24,0xbc,0xef,0xcc,0x11,0x0c,},"\xda\x84\x23\xa6\xb7\xa1\x8f\x20\xaa\x1f\x90\xed\x23\x31\xb1\x7b\x24\x06\x7c\x40\x17\x5b\xc2\x5d\x81\x09\xe2\x1d\x87\xac\x00\x52\x8e\xb3\xb2\xf6\x6a\x2b\x52\xdc\x7e\xf2\xf8\xce\xcb\x75\xc7\x60\x99\xcf\xa2\x3d\xb8\xda\x89\x70\x43\xba\x1c\xce\x31\xe2\xdf\xea\x46\x07\x5f\x5e\x07\x32\x03\xea\xeb\x3d\x62\xc8\x4c\x10\x7b\x6d\xab\x33\xa1\x4e\xaf\x14\x9a\xa6\x18\x50\xc1\x5f\x5a\x58\xd8\x8a\x15\xab\xa9\x19\x6f\x9e\x49\x5e\x8d\xbe\xcb\xcf\x7e\x84\x44\xf5\xdd\x72\xa0\x8a\x09\x9d\x7f\x62\x09\x99\x0b\x56\x29\x74\xea\x82\x9e\xf1\x1d\x29\xa9\x20\xe3\xa7\x99\xd0\xd9\x2c\xb5\x0d\x50\xf8\x17\x63\x1a\xb0\x9d\xe9\x7c\x31\xe9\xa0\x5f\x4d\x78\xd6\x49\xfc\xd9\x3a\x83\x75\x20\x78\xab\x3b\xb0\xe1\x6c\x56\x4d\x4f\xb0\x7c\xa9\x23\xc0\x37\x4b\xa5\xbf\x1e\xea\x7e\x73\x66\x8e\x13\x50\x31\xfe\xaf\xcb\xb4\x7c\xbc\x2a\xe3\x0e\xc1\x6a\x39\xb9\xc3\x37\xe0\xa6\x2e\xec\xdd\x80\xc0\xb7\xa0\x49\x24\xac\x39\x72\xda\x4f\xa9\x29\x9c\x14\xb5\xa5\x3d\x37\xb0\x8b\xf0\x22\x68\xb3\xba\xc9\xea\x93\x55\x09\x0e\xeb\x04\xad\x87\xbe\xe0\x59\x3b\xa4\xe4\x44\x3d\xda\x38\xa9\x7a\xfb\xf2\xdb\x99\x52\xdf\x63\xf1\x78\xf3\xb4\xc5\x2b\xcc\x13\x2b\xe8\xd9\xe2\x68\x81\x21\x3a\xbd\xeb\x7e\x1c\x44\xc4\x06\x15\x48\x90\x9f\x05\x20\xf0\xdd\x75\x20\xfc\x40\x8e\xa2\x8c\x2c\xeb\xc0\xf5\x30\x63\xa2\xd3\x05\x70\xe0\x53\x50\xe5\x2b\x39\x0d\xd9\xb6\x76\x62\x98\x48\x47\xbe\x9a\xd9\xb4\xcd\x50\xb0\x69\xff\xd2\x9d\xd9\xc6\x2e\xf1\x47\x01\xf8\xd0\x12\xa4\xa7\x0c\x84\x31\xcc"}, +{{0xa5,0xb3,0x4c,0xef,0xab,0x94,0x79,0xdf,0x83,0x89,0xd7,0xe6,0xf6,0xc1,0x46,0xaa,0x8a,0xff,0xb0,0xbe,0xc8,0x37,0xf7,0x8a,0xf6,0x46,0x24,0xa1,0x45,0xcc,0x34,0x4e,},{0x7b,0x0f,0x4f,0x24,0xd9,0x97,0x2b,0xc6,0xfe,0x83,0x82,0x6c,0x52,0x71,0x6a,0xd1,0xe0,0xd7,0xd1,0x9f,0x12,0x38,0x58,0xcb,0x3e,0x99,0xfa,0x63,0x6a,0xc9,0x63,0x1a,},{0x2f,0xbd,0x89,0x9d,0x72,0xb6,0xd3,0x9e,0x4f,0x45,0xb8,0xb6,0x2c,0xbb,0xd5,0xf3,0xc0,0xac,0xb1,0xad,0x85,0x40,0x91,0x3f,0xa5,0x85,0x87,0x7e,0x91,0xcc,0xfe,0xf7,0xbe,0xe5,0x0a,0x4b,0x0f,0x9f,0xed,0xf5,0xcc,0x1e,0x0d,0x19,0x53,0xad,0x39,0x9c,0x83,0x89,0xa9,0x33,0x91,0xe1,0xb7,0xc9,0x29,0xaf,0x6d,0x6f,0x3b,0x79,0x6c,0x08,},"\xe2\x1e\x98\xaf\x6c\x2b\xac\x70\x55\x7e\xb0\xe8\x64\xda\x2c\x2b\x4d\x6c\x0a\x39\xa0\x59\xd3\x47\x72\x51\xf6\x17\x8a\x39\x67\x6f\x47\x49\xe7\xfb\xea\x62\x3f\x14\x8a\x43\xa8\xb0\xfe\x06\x10\x50\x6f\xa6\x58\xab\xd2\xf5\xfa\x39\x19\x8f\x26\x36\xb7\x24\xdb\x22\xd1\xae\xbc\x2a\xb0\x7b\x2b\x6d\xbf\xfd\xee\x8c\xec\xe8\x1e\x1a\xf1\x49\x3e\xc1\x96\x4e\x16\xbf\x86\xab\x25\x8c\xa0\xfe\xb7\x7e\x3c\x87\x17\xe4\x40\x38\xab\xe1\x52\xc1\x4b\xe1\x56\x60\xbf\x93\xb2\xd4\x8d\x92\xc4\xed\x70\x74\xd2\x49\x42\x10\x62\x1b\xcf\x20\x4f\xba\x88\xc6\x54\xd5\xff\xe0\x1e\x1a\x53\xd0\x8f\x70\xbb\x23\x70\x89\xdc\x80\x72\x16\xff\x6a\x85\xdb\xec\x31\x02\x23\x7d\x42\x59\x07\x78\xac\xf6\xc1\xdc\x56\x6d\x5a\x2b\xb9\xa6\x3b\xc2\x1c\x32\x9c\x27\x2e\x59\x65\xba\xee\xb0\xfe\x89\x1d\xe3\xcc\x8c\xbf\xa8\xe5\x41\xa8\x88\x1d\xf6\x89\x42\xe7\xff\x8d\xc6\x56\xbd\x08\x57\x5f\x6a\xaf\x92\x4a\x17\x6d\x66\x3b\x1a\x1f\x43\x57\x4d\x11\x76\x8c\x70\x1b\x26\x95\x61\xe5\x54\x38\xdb\xeb\xfd\x44\x3d\x21\x15\xcb\x93\x3d\x1c\xde\x4a\x91\x5b\x54\xc3\x25\xc2\x7f\x49\x9e\xf0\x2b\xd0\x12\xff\x1f\x9a\x36\x39\x09\x22\x88\x76\x00\xfe\x71\x2b\xcd\xc2\x3e\xb5\x97\x4a\x30\x53\x72\xad\x52\x95\x1f\x83\xf0\xe5\x8c\xc4\x9e\x28\x98\x41\x62\x19\x17\xf1\xfc\xb0\x23\x51\x47\x24\x0d\xae\x4c\xf3\xb9\x9b\x6a\xc6\xd8\xde\x94\xef\xe7\xc4\x43\x67\x14\x50\x8b\xcd\x01\x14\xc5\x60\x68\xff\x1b\x7c\x16\xd5\x1b\xd9\x06\x43\x78\x74\xd6\x54\x9a\xb5\xd8\x08\x78\x96\x87\x2e\xc8\xa0\x9d\x74\x12"}, +{{0xad,0x75,0xc9,0xce,0x29,0x9c,0x4d,0x59,0x39,0x33,0x67,0xd7,0x7a,0x4c,0x9f,0x8d,0xf8,0xdc,0xec,0x76,0x5c,0x6d,0xbd,0x25,0xb5,0x27,0xfb,0x76,0x69,0x91,0x36,0x04,},{0xb9,0x91,0x05,0x48,0xfe,0x63,0x12,0xa1,0x19,0xc9,0x99,0x3e,0xeb,0xcf,0xb9,0xdc,0x90,0x03,0x0f,0xfb,0x0e,0x4d,0xe2,0xb7,0xcc,0xd2,0x3c,0xbe,0xb4,0xfe,0xf7,0x1b,},{0x6b,0x7e,0xf2,0x7b,0xcf,0xbf,0x2b,0x71,0x49,0x85,0x03,0x37,0x64,0xfc,0xcf,0xf5,0x55,0xe3,0xf5,0xbc,0x44,0x61,0x0d,0x6c,0x8c,0x62,0x11,0x7c,0xb3,0x83,0x1a,0x07,0xf4,0xa8,0xbd,0xdb,0x0e,0xae,0xd1,0xd4,0x6b,0x02,0x89,0xb1,0x5d,0xe1,0xaa,0x4d,0xcc,0x17,0xd7,0x1b,0xe9,0x6a,0x09,0xe6,0x6b,0xa4,0xdc,0x46,0x27,0xc7,0x87,0x05,},"\x62\xfc\x5a\xb6\x7d\xeb\x1f\xee\x9a\xb6\xcc\xa3\xb8\x8a\x1d\xf1\xe5\x89\xf0\xfd\x4a\x88\xf4\xaa\x77\x38\x94\x87\x61\xfe\x84\x37\x2c\x5b\x18\xe4\x65\x52\x20\xc1\xd8\x4d\x52\xac\xad\x32\xe2\x29\xa5\xc7\x56\xc2\x0f\xc6\x2f\xe4\xb4\xb4\xe5\xfd\x70\x77\xae\x4e\xd5\x39\x7a\xa7\x96\xf2\x30\x7c\xee\xdb\x65\x05\xb3\x92\x97\x85\x6f\x4a\xeb\x5e\x70\x93\x8e\x36\xee\x24\xa0\xac\x7d\x98\x68\x30\x6f\x6b\x53\x91\x06\x23\xb7\xdc\x89\xa6\x67\x2a\xd7\x38\x57\x6e\xd5\xd8\x88\x31\xdd\x33\x83\x21\xc8\x90\x2b\xc2\x06\x1f\x65\xe9\x4d\x45\x2f\xdf\xa0\xdc\x66\x5c\xef\xb9\x23\x08\xe5\x23\x01\xbd\x46\x27\x00\x6b\x36\x3d\x06\xb7\x75\xa3\x95\x91\x4d\x8c\x86\x3e\x95\xa0\x0d\x68\x93\xf3\x37\x61\x34\xc4\x29\xf5\x64\x78\x14\x5e\x44\x56\xf7\xa1\x2d\x65\xbb\x2b\x89\x65\xd7\x28\xcb\x2d\xdb\xb7\x08\xf7\x12\x5c\x23\x70\x95\xa9\x21\x95\xd9\x2f\xa7\x27\xa3\x72\xf3\x54\x5a\xe7\x01\xf3\x80\x8f\xee\x80\x2c\x89\x67\xa7\x6e\x8a\x94\x0e\x55\xfb\x2d\x81\x0b\xfb\x47\xad\xa1\x56\xf0\xed\xa1\x82\x9b\x15\x9c\xf0\x5c\x7f\x36\xcf\x38\x47\xd7\xb2\x1d\xe8\x4c\x3d\xc0\xfe\x65\x83\x47\xf7\x93\x96\xa0\x11\x39\xa5\x08\xb6\x00\x22\xdb\x1c\x0e\x5a\xee\xf4\x7e\x44\x5e\x66\xf7\x83\xe6\x2c\x96\x59\x7b\xdb\x16\xf2\x09\xc0\x8a\x91\x32\xc7\x57\x31\x36\x17\x0e\xe3\xeb\xf2\x42\x61\x26\x5a\x89\xfb\x4f\x10\x33\x33\x75\xe2\x0b\x33\xab\x74\x03\x46\x4f\x52\x49\x46\x1c\x68\x53\xc5\xfd\xdb\x9f\x58\xaf\x81\x68\x92\x91\x03\x93\xa7\x07\x7b\x79\x9f\xdc\x34\x89\x72\x09\x98\xfe\xea\x86"}, +{{0x1c,0xed,0x57,0x45,0x29,0xb9,0xb4,0x16,0x97,0x7e,0x92,0xeb,0x39,0x44,0x8a,0x87,0x17,0xca,0xc2,0x93,0x4a,0x24,0x3a,0x5c,0x44,0xfb,0x44,0xb7,0x3c,0xcc,0x16,0xda,},{0x85,0xe1,0x67,0xd5,0xf0,0x62,0xfe,0xe8,0x20,0x14,0xf3,0xc8,0xb1,0xbe,0xae,0xd8,0xee,0xfb,0x2c,0x22,0xd8,0x64,0x9c,0x42,0x4b,0x86,0xb2,0x1b,0x11,0xeb,0x8b,0xda,},{0xe0,0x30,0x3a,0xef,0xe0,0x8a,0x77,0x73,0x8d,0xcc,0x65,0x7a,0xfb,0xb9,0xb8,0x35,0xed,0x27,0x96,0x13,0xa5,0x3c,0x73,0xfd,0xc5,0xdd,0xbf,0xb3,0x50,0xe5,0xcf,0xf4,0xd6,0xc9,0xbb,0x43,0xdc,0x07,0xc9,0x5b,0xf4,0xe2,0x3b,0x64,0xc4,0x0f,0x88,0x04,0xc7,0x16,0x99,0x52,0xe3,0xc8,0xd5,0x9a,0x71,0x97,0x24,0x1b,0xfe,0xd0,0x74,0x0f,},"\x1b\x3b\x95\x3c\xce\x6d\x15\x30\x3c\x61\xca\x70\x76\x09\xf7\x0e\x72\x50\xf6\xc0\xde\xba\x56\xa8\xce\x52\x2b\x59\x86\x68\x96\x51\xcd\xb8\x48\xb8\x42\xb2\x22\x96\x61\xb8\xee\xab\xfb\x85\x70\x74\x9e\xd6\xc2\xb1\x0a\x8f\xbf\x51\x50\x53\xb5\xea\x7d\x7a\x92\x28\x34\x9e\x46\x46\xf9\x50\x5e\x19\x80\x29\xfe\xc9\xce\x0f\x38\xe4\xe0\xca\x73\x62\x58\x42\xd6\x4c\xaf\x8c\xed\x07\x0a\x6e\x29\xc7\x43\x58\x6a\xa3\xdb\x6d\x82\x99\x3a\xc7\x1f\xd3\x8b\x78\x31\x62\xd8\xfe\x04\xff\xd0\xfa\x5c\xbc\x38\x1d\x0e\x21\x9c\x91\x93\x7d\xf6\xc9\x73\x91\x2f\xc0\x2f\xda\x53\x77\x31\x24\x68\x27\x4c\x4b\xee\x6d\xca\x7f\x79\xc8\xb5\x44\x86\x1e\xd5\xba\xbc\xf5\xc5\x0e\x14\x73\x49\x1b\xe0\x17\x08\xac\x7c\x9f\xf5\x8f\x1e\x40\xf8\x55\x49\x7c\xe9\xd7\xcc\x47\xb9\x41\x0f\x2e\xdd\x00\xf6\x49\x67\x40\x24\x3b\x8d\x03\xb2\xf5\xfa\x74\x2b\x9c\x63\x08\x67\xf7\x7a\xc4\x2f\x2b\x62\xc1\x4e\x5e\xbd\xdc\x7b\x64\x7a\x05\xff\xf4\x36\x70\x74\x5f\x28\x51\xef\xf4\x90\x9f\x5d\x27\xd5\x7a\xe8\x7f\x61\xe9\x65\xee\x60\xfd\xf9\x77\x24\xc5\x92\x67\xf2\x61\x0b\x7a\xd5\xde\x91\x98\x56\xd6\x4d\x7c\x21\x26\x59\xce\x86\x56\x14\x9b\x6a\x6d\x29\xd8\xf9\x2b\x31\x2b\xe5\x0b\x6e\x2a\x43\x1d\x36\xae\x02\x2b\x00\xa6\xfe\x36\x0e\x3a\xf6\x54\x32\x89\x9c\x43\xbe\x04\x27\xe3\x6d\x21\xcf\xec\x81\xf2\x1a\xa5\x3b\x33\xdb\x5e\xd2\xc3\x7d\xa8\xf9\x6a\xc3\xe7\xdc\x67\xa1\xde\x37\x54\x6c\xf7\xde\x10\x08\xc7\xe1\xad\xbe\x0f\x34\xfa\x7e\xb2\x43\x4d\x94\xe6\xa1\x3f\x4c\xf8\x6a\x98\xd4\x97\x62\x2f"}, +{{0xf0,0x79,0x0d,0x93,0xe2,0xd3,0xb8,0x4f,0x61,0xef,0x4c,0x80,0x71,0x47,0xab,0xa4,0x10,0xe4,0x15,0xe7,0x2b,0x71,0xb0,0xd6,0x1d,0x01,0x02,0x6f,0xed,0x99,0xda,0x3d,},{0xef,0xdf,0x64,0x9f,0xb0,0x33,0xcf,0x32,0x8e,0x0b,0x28,0x77,0x96,0xf8,0xa2,0x5e,0x9c,0x6e,0x2e,0x87,0x1b,0x33,0xc2,0xc2,0x1a,0x40,0x28,0xa8,0xa2,0x5a,0x4b,0x28,},{0x08,0x77,0x3a,0x6a,0x78,0x76,0x2c,0xbb,0x1e,0x25,0xfc,0xbb,0x29,0x13,0x99,0x41,0xbd,0xf1,0x6f,0x4e,0x09,0xa1,0xfa,0x08,0xfc,0x70,0x1f,0x32,0xf9,0x33,0xed,0xd7,0x4c,0x0a,0xe9,0x83,0xc1,0x2a,0x0a,0x5b,0x02,0x0b,0x6b,0xcf,0x44,0xbb,0x71,0x9d,0xde,0x8e,0xd0,0x78,0x1a,0x82,0x98,0x26,0x56,0x40,0xe1,0x60,0x8c,0x98,0xb3,0x01,},"\x79\x73\xe9\xf3\x2d\x74\x80\x59\x92\xeb\x65\xda\x0d\x63\x73\x35\xe5\x0e\xff\x0c\xe6\x8e\xa2\xd1\xf3\xa0\x2d\xe7\x04\x49\x2b\x9c\xfb\xe7\xe7\xba\x96\xfd\xb4\x2b\xb8\x21\xa5\x13\xd7\x3f\xc6\x04\x02\xe9\x2c\x85\x5d\xea\xed\x73\xff\xea\xf7\x09\x52\x02\x90\x62\xc8\x33\xe1\x4e\xc1\xb1\x4f\x14\x4e\x22\x07\xf6\xa0\xe7\x27\xe5\xa7\xe3\xcb\xab\x27\xd5\x97\x29\x70\xf6\x95\x18\xa1\x5b\x09\x3e\x74\x0c\xc0\xce\x11\xbf\x52\x48\xf0\x82\x6b\x8a\x98\xbd\xe8\xbf\x2c\x70\x82\xc9\x7a\xff\x15\x8d\x08\x37\x11\x18\xc8\x90\x21\xcc\x39\x74\xae\x8f\x76\xd8\x66\x73\xc3\xf8\x24\xb6\x2c\x79\xc4\xb4\x1f\x40\xea\xa8\x94\x37\x38\xf0\x33\x00\xf6\x8c\xbe\x17\x54\x68\xeb\x23\x5a\x9f\xf0\xe6\x53\x7f\x87\x14\xe9\x7e\x8f\x08\xca\x44\x4e\x41\x19\x10\x63\xb5\xfa\xbd\x15\x6e\x85\xdc\xf6\x66\x06\xb8\x1d\xad\x4a\x95\x06\x55\x84\xb3\xe0\x65\x8c\x20\xa7\x06\xea\xf4\xa0\x77\x7d\xa4\xd2\xe0\xcd\x2a\x0f\xca\x60\x10\x9c\x2b\x44\x03\xdb\x3f\x03\xcd\x47\x81\xc1\xfb\xb0\x27\x22\x02\xbc\xb1\x16\x87\x80\x8c\x50\xcb\x98\xf6\x4b\x7f\x3f\xd3\xd4\x33\x33\xbb\x5a\x06\x1b\x9e\x37\x70\x90\xab\xb1\xe0\xa8\x85\xcb\x26\xb7\x3c\x16\x3e\x63\xff\x64\x51\xff\x2f\x4e\xc8\x24\x9c\x7e\x15\x2b\xd0\x39\x73\xa1\xe9\x64\xe2\xb5\xb2\x35\x28\x1a\x93\x83\x99\xa1\x12\xa2\x45\x29\xe3\x83\xa5\x60\xdc\x50\xbb\x1b\x62\x2a\xd7\x4e\xf3\x56\x58\xdc\xb1\x0f\xfe\x02\x25\x68\xac\x3f\xfa\xe5\xb4\x65\xa8\xed\x76\x43\xe8\x56\x1b\x35\x2e\xe9\x94\x4a\x35\xd8\x82\xc7\x12\xb1\x87\x78\x8a\x0a\xba\xe5\xa2\x2f"}, +{{0x4c,0xb9,0xdf,0x7c,0xe6,0xfa,0xe9,0xd6,0x2b,0xa0,0x9e,0x8e,0xb7,0x0e,0x4c,0x96,0x9b,0xde,0xaf,0xcb,0x5e,0xc7,0xd7,0x02,0x43,0x26,0xe6,0x60,0x3b,0x06,0x21,0xbf,},{0x01,0x80,0x69,0xdd,0x0e,0xb4,0x40,0x55,0xa3,0x5c,0xd8,0xc7,0x7c,0x37,0xca,0x9f,0xb1,0xad,0x24,0x17,0x27,0x13,0x85,0xe1,0x34,0xb2,0xf4,0xe8,0x1f,0x52,0x03,0x3c,},{0xe3,0x3c,0x07,0x83,0x6c,0x53,0x7d,0x6b,0xfb,0xd0,0xf4,0x59,0x2d,0x6e,0x35,0xb1,0x63,0x49,0x9b,0xa7,0x8d,0xc7,0xff,0xce,0xc5,0x65,0xd0,0x4f,0x9a,0x7d,0xb7,0x81,0x94,0x3e,0x29,0xe6,0xce,0x76,0x76,0x3e,0x9b,0xad,0xdf,0x57,0x43,0x7f,0xd9,0xc6,0xb0,0x32,0x39,0xa6,0xe6,0x85,0x0e,0x45,0x02,0xa3,0x56,0xc2,0xe1,0x2c,0x37,0x05,},"\x14\x62\x7d\x6e\xa0\xe7\x89\x54\x60\x75\x94\x76\xdc\x74\xc4\x28\x00\xce\xef\x99\x43\x27\x51\x81\x51\x49\x0d\x9d\xf2\x30\x67\x91\x4e\x44\x78\x8a\x12\x76\x8c\xcb\x25\x47\x1b\x9c\x3b\xa9\xd1\x4f\xb4\x36\xdc\xba\x38\x42\x9b\x3a\x04\x56\x87\x77\x63\xc4\x91\x75\xd0\xe0\x82\x68\x3e\x07\xa9\x05\x8f\x36\x85\xc6\x27\x93\x07\xb2\x30\x3d\x12\x21\xb9\xc2\x97\x93\xd8\xa4\x87\x7f\x6d\xf5\x15\x87\x38\x4d\xad\xf7\x51\xc5\xf7\xbf\xbd\x20\x7d\x51\x96\x22\xc3\x7b\x51\xce\xee\xe2\xc2\x0d\x82\x69\xf8\xcb\x88\xd3\xfe\x43\xd6\xd4\x34\xd5\xbb\xd0\xe2\x03\xc1\x53\x2d\x97\xba\x55\x21\x47\x22\x74\x96\xc8\x7f\x67\xb5\x0b\xb7\x61\x93\xad\xd0\x14\x4d\xf1\xc1\x76\x65\x75\x85\x40\x83\x62\xca\x2e\xd0\x4a\xd6\x2a\xcf\x1c\x25\xe3\x41\xdf\xd1\x49\x8d\x85\xb4\xb1\x34\x9a\x8b\x0b\x9b\x02\xc4\x35\x23\xc5\x58\x53\x41\x9b\xfe\xd3\x7d\x5a\x2c\xdf\x17\xdf\xbf\x1a\x3b\xd7\x75\x9d\x6a\xe1\x80\xf9\xd2\x7d\xcd\x9a\x89\x33\xe2\x9a\x7c\x0a\x30\x77\x1e\xea\x7c\x2e\x0f\xa2\x42\x92\x5d\x23\x36\xdc\xe5\x85\x62\x90\x57\xd8\x44\x32\x39\x64\xf6\xd3\xd1\x1f\xf0\xb3\xf8\x29\xa3\xbe\x8c\x9f\x04\x68\xa6\x82\x3d\x8e\x70\xab\x5a\x2d\xa2\x1e\x15\xfa\x8b\x04\x1a\x29\x81\x22\x22\xe9\xc3\x0b\x2b\xd9\xa1\x2d\x1f\xde\xe6\xf8\x78\x76\xe8\xce\x81\x00\x96\x37\xa8\xbb\x22\x36\x12\x9a\x47\xca\x74\x28\x9e\xe4\xaa\xd4\x29\xff\xe2\x9f\x47\x43\x02\x41\xca\x8c\xc3\x84\x8b\x72\x00\xfd\x6e\x14\x70\x65\x1a\x9a\x0a\x6f\x72\xc9\x03\x3e\x83\x1d\xf0\x51\x40\x8a\x62\x60\xf6\x5c\xba\xf6\xe0\x12\xb1\x8e"}, +{{0xa1,0x36,0xe0,0x09,0xd5,0x3e,0x5e,0xf5,0x9d,0x09,0x46,0xbc,0x17,0x56,0x63,0xa8,0x6b,0xc0,0xfc,0xd2,0x9e,0xad,0xd9,0x5c,0xfc,0x9d,0x26,0x60,0x37,0xb1,0xe4,0xfb,},{0x9c,0x18,0x06,0xec,0x04,0x54,0xf5,0x83,0x14,0xeb,0x83,0x97,0xd6,0x42,0x87,0xde,0xe3,0x86,0x64,0x0d,0x84,0x91,0xab,0xa3,0x64,0x60,0x76,0x88,0x84,0x17,0x15,0xa0,},{0xbc,0x09,0x4b,0xa9,0x1c,0x11,0x5d,0xee,0x15,0xd7,0x53,0x36,0x1a,0x75,0xf3,0xf0,0x3d,0x6a,0xf4,0x5c,0x92,0x15,0x7e,0x95,0xdb,0xe8,0xd3,0x21,0x94,0xb6,0xc5,0xce,0x72,0xb9,0xdc,0x66,0xf7,0x3d,0xf1,0x2d,0xca,0x0b,0x63,0x9f,0x3e,0x79,0x1d,0x47,0x86,0x16,0xa1,0xf8,0xd7,0x35,0x9a,0x42,0xc8,0xea,0xe0,0xdd,0xa1,0x6b,0x16,0x06,},"\xa4\x9d\x1c\x3d\x49\xe1\x3c\x2e\xda\x56\x86\x8a\x88\x24\xaa\x9f\x8d\x2b\xf7\x2f\x21\x95\x5e\xba\xfd\x07\xb3\xbd\xc8\xe9\x24\xde\x20\x93\x6c\xee\x51\x3d\x8a\x64\xa4\x71\x73\xa3\xbd\x65\x9e\xff\x1a\xcc\xff\x82\x44\xb2\x6a\xae\x1a\x0c\x27\xfa\x89\x1b\xf4\xd8\x5e\x8f\xb1\xb7\x6a\x6c\xab\x1e\x7f\x74\xc8\x9e\xe0\x7b\xb4\x0d\x71\x43\x26\xf0\x9b\x3f\xd4\x06\x32\xfa\xd2\x08\xea\x81\x6f\x90\x72\x02\x8c\x14\xb5\xb5\x4e\xcc\x1c\x5b\x7f\xc8\x09\xe7\xe0\x78\x6e\x2f\x11\x49\x5e\x76\x01\x7e\xb6\x2a\xa4\x56\x3f\x3d\x00\xee\x84\x34\x8d\x98\x38\xcd\x17\x64\x9f\x69\x29\xa6\xd2\x06\xf6\x0e\x6f\xc8\x2e\x0c\x34\x64\xb2\x7e\x0e\x6a\xbd\x22\xf4\x46\x9b\xdf\xd4\xcb\x54\xf7\x7e\x32\x9b\x80\xf7\x1b\xf4\x21\x29\xec\x13\xc9\xdf\xe1\x92\xad\xfa\xa4\x2e\xe3\xdd\xee\xda\x38\x58\x16\xfb\xad\x5f\x41\x19\x38\xc6\x3b\x56\x0f\x4e\xcd\x94\x53\x4b\xe7\xd9\x87\x25\xcd\x94\xc9\x9c\xe4\x92\xf0\xf0\x69\xba\x0e\xc0\x8f\x87\x7a\x78\x12\xef\x27\xae\x19\xd7\xa7\x7b\xe6\x3f\x66\xbc\xf8\xd6\xcf\x3a\x1a\x61\xfc\x9c\xfe\xf1\x04\xc7\x46\x2a\x21\xca\x7f\x03\xaf\xb5\xbb\x1a\xc8\xc7\x51\x24\xb5\x54\xe8\xd0\x44\xb8\x10\xd9\x5f\xf8\xc9\xdd\x09\xa3\x44\x84\xd8\xc4\xb6\xc9\x5f\x95\xc3\xc2\x28\x23\xf5\x2c\xe8\x44\x29\x37\x24\xd5\x25\x91\x91\xf1\xba\x09\x29\xe2\xac\xdb\xb8\xb9\xa7\xa8\xad\xf0\xc5\x2e\x78\xac\xdf\xdf\x05\x7b\x09\x85\x88\x1a\xfb\xed\x4d\xbe\xbd\xeb\xbd\xae\x0a\x2b\x63\xbd\x4e\x90\xf9\x6a\xfd\xcb\xbd\x78\xf5\x06\x30\x9f\x9b\xdb\x65\x00\x13\xcb\x73\xfa\xed\x73\x90\x4e"}, +{{0xff,0x0f,0x1c,0x57,0xdd,0x88,0x4f,0xbe,0xea,0x6e,0x29,0x17,0x28,0x2b,0x79,0xba,0x67,0xf8,0xa6,0x85,0x12,0x67,0xb9,0xf4,0x63,0x6d,0xaf,0xda,0x33,0xbd,0x2b,0x5b,},{0xfe,0xf6,0x37,0x8a,0xd1,0x2a,0x7c,0x25,0x2f,0xa6,0xeb,0x74,0x2b,0x05,0x06,0x4b,0x41,0x53,0x0f,0xf0,0x19,0xdc,0x68,0x0a,0xb5,0x44,0xc0,0x27,0xea,0x28,0x36,0xe7,},{0xd5,0x00,0x84,0x86,0x72,0x6c,0xce,0x33,0x0a,0x29,0xdd,0x7e,0x4d,0x74,0x74,0xd7,0x35,0x79,0x82,0x01,0xaf,0xd1,0x20,0x6f,0xeb,0x86,0x9a,0x11,0x2e,0x5b,0x43,0x52,0x3c,0x06,0x97,0x67,0x61,0xbe,0x3c,0xf9,0xb2,0x71,0x63,0x78,0x27,0x3c,0x94,0xf9,0x35,0x72,0xa7,0xd2,0xb8,0x98,0x26,0x34,0xe0,0x75,0x5c,0x63,0x2b,0x44,0x90,0x08,},"\x52\x2a\x5e\x5e\xff\x5b\x5e\x98\xfa\xd6\x87\x8a\x9d\x72\xdf\x6e\xb3\x18\x62\x26\x10\xa1\xe1\xa4\x81\x83\xf5\x59\x0e\xce\xf5\xa6\xdf\x67\x1b\x28\xbe\x91\xc8\x8c\xdf\x7a\xe2\x88\x11\x47\xfe\x6c\x37\xc2\x8b\x43\xf6\x4c\xf9\x81\xc4\x55\xc5\x9e\x76\x5c\xe9\x4e\x1b\x64\x91\x63\x1d\xea\xee\xf6\xd1\xda\x9e\xbc\xa8\x86\x43\xc7\x7f\x83\xea\xe2\xcf\xdd\x2d\x97\xf6\x04\xfe\x45\x08\x1d\x1b\xe5\xc4\xae\x2d\x87\x59\x96\xb8\xb6\xfe\xcd\x70\x7d\x3f\xa2\x19\xa9\x3b\xa0\x48\x8e\x55\x24\x7b\x40\x5e\x33\x0c\xfb\x97\xd3\x1a\x13\x61\xc9\xb2\x08\x4b\xdb\x13\xfb\x0c\x05\x89\x25\xdb\x8c\x3c\x64\x9c\x9a\x3e\x93\x7b\x53\x3c\xc6\x31\x0f\xa3\xb1\x61\x26\xfb\x3c\xc9\xbb\x2b\x35\xc5\xc8\x30\x00\x15\x48\x8a\x30\xfa\xdc\xa3\xc8\x87\x1f\xa7\x0d\xfd\xc7\x05\x5b\xf8\xe6\x31\xf2\x0c\x9b\x25\x28\x31\x1e\x32\x4a\x7c\x4e\xdd\x54\x62\x07\x9f\x34\x41\xc9\xec\xf5\x5f\xa9\x99\xe7\x31\x37\x23\x44\xfd\xc0\xd4\x13\xe4\x17\xaa\xa0\x01\xa1\xb2\xd3\xd9\xbc\x00\x0f\xec\x1b\x02\xbd\x7a\x88\xa8\x12\xd9\xd8\xa6\x6f\x94\x64\x76\x4c\x07\x0c\x93\x04\x1e\xef\xb1\x7c\xe7\x4e\xff\x6d\x4a\xff\x75\xf0\xcb\xf6\xa7\x89\xa9\xec\xde\x74\xab\xe3\x31\x30\xfc\xa0\xda\x85\x3a\xa7\xc3\x31\x3a\xda\x3f\x0a\xe2\xf5\x95\xc6\x79\x6a\x93\x68\x5e\x72\x9d\xd1\x8a\x66\x9d\x63\x81\x82\x5a\xb3\xf3\x6a\x39\x1e\x75\x25\xb2\xa8\x07\xa5\x2f\xa5\xec\x2a\x03\x0a\x8c\xf3\xb7\x73\x37\xac\x41\xfc\xeb\x58\x0e\x84\x5e\xed\x65\x5a\x48\xb5\x47\x23\x8c\x2e\x81\x37\xc9\x2f\x8c\x27\xe5\x85\xca\xad\x31\x06\xee\xe3\x81\x4a"}, +{{0x0b,0xc6,0xaf,0x64,0xde,0x57,0x09,0xd3,0xdb,0xc2,0x8f,0x7e,0xf6,0xd3,0xfe,0x28,0xb6,0xde,0x52,0x9f,0x08,0xf5,0x85,0x7c,0xcb,0x91,0x06,0x95,0xde,0x45,0x4f,0x56,},{0xfb,0x49,0x1f,0xc9,0x00,0x23,0x7b,0xdc,0x7e,0x9a,0x11,0x9f,0x27,0x15,0x0c,0xd9,0x11,0x93,0x5c,0xd3,0x62,0x87,0x49,0xff,0x40,0xef,0x41,0xf3,0x95,0x5b,0xc8,0xac,},{0xdb,0xc7,0x13,0x4d,0x1c,0xd6,0xb0,0x81,0x3b,0x53,0x35,0x27,0x14,0xb6,0xdf,0x93,0x94,0x98,0xe9,0x1c,0xf3,0x7c,0x32,0x43,0x37,0xd9,0xc0,0x88,0xa1,0xb9,0x98,0x34,0x7d,0x26,0x18,0x5b,0x43,0x09,0x00,0x41,0x29,0x29,0xe4,0xf6,0x3e,0x91,0x03,0x79,0xfc,0x42,0xe3,0x55,0xa4,0xe9,0x8f,0x6f,0xee,0x27,0xda,0xfa,0xd1,0x95,0x72,0x06,},"\xac\x78\x86\xe4\xf4\x17\x2a\x22\xc9\x5e\x8e\xea\x37\x43\x7b\x37\x5d\x72\xac\xce\xdc\xee\x6c\xc6\xe8\x16\x76\x33\x01\xa2\xd8\xef\x4d\x6f\x31\xa2\xc1\xd6\x35\x81\x8b\x70\x26\xa3\x95\xce\x0d\xaf\xd7\x1c\x51\x80\x89\x3a\xf7\x6b\x7e\xa0\x56\xc9\x72\xd6\x80\xec\xa0\x1d\xcb\xdb\xae\x6b\x26\xf1\xc5\xf3\x3f\xc9\x88\xb8\x24\xfb\xbe\x00\xca\xcc\x31\x64\x69\xa3\xba\xe0\x7a\xa7\xc8\x88\x5a\xf7\xf6\x5f\x42\xe7\x5c\xef\x94\xdb\xb9\xaa\xb4\x82\x51\x43\xc8\x50\x70\xe7\x71\x6b\x76\x12\xf6\x4e\xf0\xb0\x16\x60\x11\xd2\x3e\xb5\x65\x4a\xa0\x98\xb0\x2d\x8d\x71\xe5\x7c\x8f\xa1\x7b\xff\x2f\xe9\x7d\xc8\x19\x31\x77\xea\xdc\x09\xfb\x19\x2d\x80\xaa\x92\xaf\xa9\x87\x20\xd4\x61\x48\x17\xff\x3c\x39\xd3\xac\xce\x18\x90\x6f\xa3\xde\x09\x61\x89\x31\xd0\xd7\xa6\x0c\x44\x29\xcb\xfa\x20\xcf\x16\x5c\x94\x79\x29\xac\x29\x3a\xe6\xc0\x6e\x7e\x8f\x25\xf1\x26\x42\x91\xe3\xe1\xc9\x8f\x5d\x93\xe6\xec\xc2\x38\x9b\xc6\x0d\xbb\xf4\xa6\x21\xb1\x32\xc5\x52\xa9\x9c\x95\xd2\x6d\x8d\x1a\xf6\x11\x38\xb5\x70\xa0\xde\x4b\x49\x7e\xbe\x80\x51\xc7\x27\x3a\x98\xe6\xe7\x87\x6d\x0b\x32\x75\x03\xaf\x3c\xb2\xcc\x40\x91\xce\x19\x25\xcb\x2f\x29\x57\xf4\xec\x56\xee\x90\xf8\xa0\x9d\xd5\x7d\x6e\x83\x06\x7a\x35\x6a\x4c\xfe\x65\xb1\xb7\xa4\x46\x5d\xa2\xab\x13\x3b\x0e\xfb\x5e\x7d\x4d\xbb\x81\x1b\xcb\xbd\xe7\x12\xaf\xbf\x0f\x7d\xd3\xf3\x26\x22\x22\x84\xb8\xc7\x4e\xac\x7a\xd6\x25\x7f\xa8\xc6\x32\xb7\xda\x25\x59\xa6\x26\x6e\x91\xe0\xef\x90\xdb\xb0\xaa\x96\x8f\x75\x37\x6b\x69\x3f\xca\xa5\xda\x34\x22\x21"}, +{{0x2f,0x5e,0x83,0xbd,0x5b,0x41,0x2e,0x71,0xae,0x3e,0x90,0x84,0xcd,0x36,0x9e,0xfc,0xc7,0x9b,0xf6,0x03,0x7c,0x4b,0x17,0x4d,0xfd,0x6a,0x11,0xfb,0x0f,0x5d,0xa2,0x18,},{0xa2,0x2a,0x6d,0xa2,0x9a,0x5e,0xf6,0x24,0x0c,0x49,0xd8,0x89,0x6e,0x3a,0x0f,0x1a,0x42,0x81,0xa2,0x66,0xc7,0x7d,0x38,0x3e,0xe6,0xf9,0xd2,0x5f,0xfa,0xcb,0xb8,0x72,},{0x9f,0x80,0x92,0x2b,0xc8,0xdb,0x32,0xd0,0xcc,0x43,0xf9,0x93,0x6a,0xff,0xeb,0xe7,0xb2,0xbc,0x35,0xa5,0xd8,0x22,0x77,0xcd,0x18,0x7b,0x5d,0x50,0xdc,0x7f,0xc4,0xc4,0x83,0x2f,0xff,0xa3,0x4e,0x95,0x43,0x80,0x6b,0x48,0x5c,0x04,0x54,0x8e,0x7c,0x75,0x42,0x94,0x25,0xe1,0x4d,0x55,0xd9,0x1f,0xc1,0x05,0x2e,0xfd,0x86,0x67,0x43,0x0b,},"\xb7\x66\x27\x3f\x06\x0e\xf3\xb2\xae\x33\x40\x45\x4a\x39\x1b\x42\x6b\xc2\xe9\x72\x64\xf8\x67\x45\x53\xeb\x00\xdd\x6e\xcf\xdd\x59\xb6\x11\xd8\xd6\x62\x92\x9f\xec\x71\x0d\x0e\x46\x20\x20\xe1\x2c\xdb\xf9\xc1\xec\x88\x58\xe8\x56\x71\xac\xf8\xb7\xb1\x44\x24\xce\x92\x07\x9d\x7d\x80\x1e\x2a\xd9\xac\xac\x03\x6b\xc8\xd2\xdf\xaa\x72\xaa\x83\x9b\xff\x30\xc0\xaa\x7e\x41\x4a\x88\x2c\x00\xb6\x45\xff\x9d\x31\xbc\xf5\xa5\x43\x82\xde\xf4\xd0\x14\x2e\xfa\x4f\x06\xe8\x23\x25\x7f\xf1\x32\xee\x96\x8c\xdc\x67\x38\xc5\x3f\x53\xb8\x4c\x8d\xf7\x6e\x9f\x78\xdd\x50\x56\xcf\x3d\x4d\x5a\x80\xa8\xf8\x4e\x3e\xde\xc4\x85\x20\xf2\xcb\x45\x83\xe7\x08\x53\x93\x55\xef\x7a\xa8\x6f\xb5\xa0\xe8\x7a\x94\xdc\xf1\x4f\x30\xa2\xcc\xa5\x68\xf1\x39\xd9\xce\x59\xea\xf4\x59\xa5\xc5\x91\x6c\xc8\xf2\x0b\x26\xaa\xf6\xc7\xc0\x29\x37\x9a\xed\xb0\x5a\x07\xfe\x58\x5c\xca\xc6\x03\x07\xc1\xf5\x8c\xa9\xf8\x59\x15\x7d\x06\xd0\x6b\xaa\x39\x4a\xac\xe7\x9d\x51\xb8\xcb\x38\xcf\xa2\x59\x81\x41\xe2\x45\x62\x4e\x5a\xb9\xb9\xd6\x87\x31\x17\x33\x48\x90\x53\x15\xbf\x1a\x5a\xd6\x1d\x1e\x8a\xda\xeb\x81\x0e\x4e\x8a\x86\xd7\xc1\x35\x37\xb0\xbe\x86\x0a\xb2\xed\x35\xb7\x33\x99\xb8\x80\x8a\xa9\x1d\x75\x0f\x77\x94\x3f\x8a\x8b\x7e\x89\xfd\xb5\x07\x28\xaa\x3d\xbb\xd8\xa4\x1a\x6e\x00\x75\x6f\x43\x8c\x9b\x9e\x9d\x55\x87\x2d\xf5\xa9\x06\x8a\xdd\x8a\x97\x2b\x7e\x43\xed\xad\x9c\xed\x22\x37\xca\x13\x67\xbe\x4b\x7c\xdb\x66\xa5\x4e\xa1\x2e\xef\x12\x94\x71\x15\x86\x10\xea\xf2\x8f\x99\xf7\xf6\x86\x55\x7d\xcd\xf6\x44\xea"}, +{{0x72,0x2a,0x2d,0xa5,0x0e,0x42,0xc1,0x1a,0x61,0xc9,0xaf,0xac,0x7b,0xe1,0xa2,0xfe,0xd2,0x26,0x7d,0x65,0x0f,0x8f,0x7d,0x8e,0x5b,0xc7,0x06,0xb8,0x07,0xc1,0xb9,0x1d,},{0xfd,0x0b,0x96,0x45,0x62,0xf8,0x23,0x72,0x1e,0x64,0x9c,0x3f,0xed,0xb4,0x32,0xa7,0x6f,0x91,0xe0,0xae,0xad,0x7c,0x61,0xd3,0x5f,0x95,0xed,0x77,0x26,0xd7,0x85,0x89,},{0xc2,0x69,0x5a,0x57,0x17,0x2a,0xaa,0x31,0xbd,0x08,0x90,0xf2,0x31,0xca,0x8e,0xee,0xc0,0x28,0x7a,0x87,0x17,0x26,0x69,0xa8,0x99,0xad,0x08,0x91,0xce,0xa4,0xc4,0x75,0x79,0xb5,0x04,0x20,0xe7,0x91,0xcd,0xec,0x8c,0x18,0x2c,0x8a,0x0e,0x8d,0xde,0x21,0xb2,0x48,0x0b,0x0c,0xfd,0x81,0x11,0xe2,0x8e,0x56,0x03,0x34,0x7a,0x35,0x2d,0x04,},"\x17\x3e\x8b\xb8\x85\xe1\xf9\x08\x14\x04\xac\xac\x99\x90\x41\xd2\xec\xfc\xb7\x3f\x94\x5e\x0d\xb3\x6e\x63\x1d\x7c\xd1\xab\x99\x9e\xb7\x17\xf3\x4b\xf0\x78\x74\xbf\x3d\x34\xe2\x53\x0e\xb6\x08\x5f\x4a\x9f\x88\xae\x1b\x0f\x7d\x80\xf2\x21\x45\x6a\x8e\x9a\x88\x90\xb9\x1a\x50\x19\x2d\xea\xaa\xcc\x0a\x1a\x61\x5a\x87\x84\x1e\x2c\x5a\x9e\x05\x79\x57\xaf\x6e\x48\xe7\x8c\xc8\x61\x98\xe3\x2e\x7a\xa2\x4d\xcf\x6c\xff\xa3\x29\xbc\x72\x60\x6d\x65\xb1\x16\x82\xc8\xba\x73\x6c\xce\x22\xa0\x57\x85\xdf\x11\x46\x33\x1e\x41\x60\x9c\xf9\xca\x71\x1c\xf4\x64\x95\x82\x97\x13\x8b\x58\xa9\x07\x3f\x3b\xbf\x06\xad\x8a\x85\xd1\x35\xde\x66\x65\x21\x04\xd8\x8b\x49\xd2\x7a\xd4\x1e\x59\xbc\xc4\x4c\x7f\xab\x68\xf5\x3f\x05\x02\xe2\x93\xff\xca\xba\xaf\x75\x59\x27\xdf\xdf\xfb\xfd\xe3\xb3\x5c\x08\x0b\x5d\xe4\xc8\xb7\x85\xf4\xda\x64\xef\x35\x7b\xc0\xd1\x46\x6a\x6a\x96\x56\x0c\x3c\x4f\x3e\x3c\x0b\x56\x3a\x00\x3f\x5f\x95\xf2\x37\x17\x1b\xce\x1a\x00\x17\x71\xa0\x4e\xde\x7c\xdd\x9b\x8c\xa7\x70\xfd\x36\xef\x90\xe9\xfe\x00\x00\xa8\xd7\x68\x5f\xd1\x53\xcc\x72\x82\xde\x95\x92\x0a\x8f\x8f\x08\x98\xd0\x0b\xf0\xc6\xc9\x33\xfe\x5b\xb9\x65\x3f\xf1\x46\xc4\xe2\xac\xd1\xa2\xe0\xc2\x3c\x12\x44\x84\x4d\xac\xf8\x65\x27\x16\x30\x2c\x20\x32\xf9\xc1\x14\x67\x9e\xd2\x6b\x3e\xe3\xab\x4a\x7b\x18\xbc\x4e\x30\x71\xf0\x97\x7d\xb5\x7c\xd0\xac\x68\xc0\x72\x7a\x09\xb4\xf1\x25\xfb\x64\xaf\x28\x50\xb2\x6c\x8a\x48\x42\x63\x33\x4e\x2d\xa9\x02\xd7\x44\x73\x70\x44\xe7\x9a\xb1\xcf\x5b\x2f\x93\xa0\x22\xb6\x3d\x40\xcd"}, +{{0x5f,0xe9,0xc3,0x96,0x0e,0xd5,0xbd,0x37,0x4c,0xc9,0x4d,0x42,0x35,0x7e,0x6a,0x24,0xdc,0x7e,0x30,0x60,0x78,0x8f,0x72,0x63,0x65,0xde,0xfa,0xcf,0x13,0xcd,0x12,0xda,},{0x0c,0xe7,0xb1,0x55,0xc8,0xb2,0x0e,0xbd,0xaa,0xcd,0xc2,0xaa,0x23,0x62,0x7e,0x34,0xb1,0xf9,0xac,0xe9,0x80,0x65,0x0a,0x25,0x30,0xc7,0x60,0x7d,0x04,0x81,0x4e,0xb4,},{0x37,0x9f,0x9c,0x54,0xc4,0x13,0xaf,0x0d,0x19,0x2e,0x9b,0xc7,0x36,0xb2,0x9d,0xa9,0xd5,0x21,0xe7,0xba,0x78,0x41,0xd3,0x09,0xf9,0xbc,0xc1,0xe7,0x42,0xec,0x43,0x08,0xfe,0x9f,0x7b,0xa5,0x1e,0x0b,0x22,0xae,0xd4,0x87,0xcb,0x4a,0xa3,0x91,0x3b,0x9b,0xeb,0xfb,0x3a,0xac,0xd3,0x8f,0x40,0x39,0xf9,0xbb,0xbe,0xbe,0x1a,0xd8,0x00,0x02,},"\xc9\x49\x0d\x83\xd9\xc3\xa9\x37\x0f\x06\xc9\x1a\xf0\x01\x68\x5a\x02\xfe\x49\xb5\xca\x66\x77\x33\xff\xf1\x89\xee\xe8\x53\xec\x16\x67\xa6\xc1\xb6\xc7\x87\xe9\x24\x48\x12\xd2\xd5\x32\x86\x6a\xb7\x4d\xfc\x87\x0d\x6f\x14\x03\x3b\x6b\xcd\x39\x85\x2a\x39\x00\xf8\xf0\x8c\xd9\x5a\x74\xcb\x8c\xbe\x02\xb8\xb8\xb5\x1e\x99\x3a\x06\xad\xfe\xbd\x7f\xc9\x85\x4a\xe5\xd2\x9f\x4d\xf9\x64\x28\x71\xd0\xc5\xe4\x70\xd9\x03\xcf\xbc\xbd\x5a\xdb\x32\x75\x62\x8f\x28\xa8\x0b\xf8\xc0\xf0\x37\x66\x87\xda\xe6\x73\xbf\x7a\x85\x47\xe8\x0d\x4a\x98\x55\xae\x25\x72\xfc\x2b\x20\x5d\xc8\xa1\x98\x01\x6d\xdc\x9b\x50\x99\x5f\x5b\x39\xf3\x68\xf5\x40\x50\x4a\x55\x18\x03\xd6\xdd\x5f\x87\x48\x28\xe5\x54\x1d\xed\x05\x28\x94\xd9\xe2\xdc\x5e\x6a\xa3\x51\x08\x7e\x79\x0c\x0d\xd5\xd9\xc4\xde\xcb\x21\x7e\x4d\xb8\x1c\x98\xa1\x84\xb2\x64\xe6\xda\xea\xc0\xf1\x1e\x07\x4c\xae\x2b\xfc\x89\x9f\x54\xb4\x19\xc6\x5d\xcc\x22\x66\x4a\x91\x5f\xbf\xff\xac\x35\xce\xe0\xf2\x86\xeb\x7b\x14\x49\x33\xdb\x93\x3e\x16\xc4\xbc\xb6\x50\xd5\x37\x72\x24\x89\xde\x23\x63\x73\xfd\x8d\x65\xfc\x86\x11\x8b\x6d\xef\x37\xca\x46\x08\xbc\x6c\xe9\x27\xb6\x54\x36\xff\xda\x7f\x02\xbf\xbf\x88\xb0\x45\xae\x7d\x2c\x2b\x45\xa0\xb3\x0c\x8f\x2a\x04\xdf\x95\x32\x21\x08\x8c\x55\x5f\xe9\xa5\xdf\x26\x09\x82\xa3\xd6\x4d\xf1\x94\xee\x95\x2f\xa9\xa9\x8c\x31\xb9\x64\x93\xdb\x61\x80\xd1\x3d\x67\xc3\x67\x16\xf9\x5f\x8c\x0b\xd7\xa0\x39\xad\x99\x06\x67\xca\x34\xa8\x3a\xc1\xa1\x8c\x37\xdd\x7c\x77\x36\xaa\x6b\x9b\x6f\xc2\xb1\xac\x0c\xe1\x19\xef\x77"}, +{{0xec,0x2f,0xa5,0x41,0xac,0x14,0xb4,0x14,0x14,0x9c,0x38,0x25,0xea,0xa7,0x00,0x1b,0x79,0x5a,0xa1,0x95,0x7d,0x40,0x40,0xdd,0xa9,0x25,0x73,0x90,0x4a,0xfa,0x7e,0xe4,},{0x71,0xb3,0x63,0xb2,0x40,0x84,0x04,0xd7,0xbe,0xec,0xde,0xf1,0xe1,0xf5,0x11,0xbb,0x60,0x84,0x65,0x8b,0x53,0x2f,0x7e,0xa6,0x3d,0x4e,0x3f,0x5f,0x01,0xc6,0x1d,0x31,},{0x84,0xd1,0x8d,0x56,0xf9,0x64,0xe3,0x77,0x67,0x59,0xbb,0xa9,0x2c,0x51,0x0c,0x2b,0x6d,0x57,0x45,0x55,0xc3,0xcd,0xda,0xde,0x21,0x2d,0xa9,0x03,0x74,0x55,0x49,0x91,0xe7,0xd7,0x7e,0x27,0x8d,0x63,0xe3,0x46,0x93,0xe1,0x95,0x80,0x78,0xcc,0x36,0x85,0xf8,0xc4,0x1c,0x1f,0x53,0x42,0xe3,0x51,0x89,0x96,0x38,0xef,0x61,0x21,0x14,0x01,},"\x27\x49\xfc\x7c\x4a\x72\x9e\x0e\x0a\xd7\x1b\x5b\x74\xeb\x9f\x9c\x53\x4e\xbd\x02\xff\xc9\xdf\x43\x74\xd8\x13\xbd\xd1\xae\x4e\xb8\x7f\x13\x50\xd5\xfd\xc5\x63\x93\x45\x15\x77\x17\x63\xe6\xc3\x3b\x50\xe6\x4e\x0c\xd1\x14\x57\x30\x31\xd2\x18\x6b\x6e\xca\x4f\xc8\x02\xcd\xdc\x7c\xc5\x1d\x92\xa6\x13\x45\xa1\x7f\x6a\xc3\x8c\xc7\x4d\x84\x70\x7a\x51\x56\xbe\x92\x02\xde\xe3\x44\x46\x52\xe7\x9b\xae\x7f\x0d\x31\xbd\x17\x56\x79\x61\xf6\x5d\xd0\x1a\x8e\x4b\xee\x38\x33\x19\x38\xce\x4b\x2b\x55\x06\x91\xb9\x9a\x4b\xc3\xc0\x72\xd1\x86\xdf\x4b\x33\x44\xa5\xc8\xfb\xfb\xb9\xfd\x2f\x35\x5f\x61\x07\xe4\x10\xc3\xd0\xc7\x98\xb6\x8d\x3f\xb9\xc6\xf7\xab\x5f\xe2\x7e\x70\x87\x1e\x86\x76\x76\x98\xfe\x35\xb7\x7e\xad\x4e\x43\x5a\x94\x02\xcc\x9e\xd6\xa2\x65\x7b\x05\x9b\xe0\xa2\x10\x03\xc0\x48\xbb\xf5\xe0\xeb\xd9\x3c\xbb\x2e\x71\xe9\x23\xcf\x5c\x72\x8d\x17\x58\xcd\x81\x7a\xd7\x4b\x45\x4a\x88\x71\x26\xd6\x53\xb9\x5a\x7f\x25\xe5\x29\x3b\x76\x8c\x9f\xc5\xa9\xc3\x5a\x23\x72\xe3\x74\x1b\xc9\x0f\xd6\x63\x01\x42\x7b\x10\x82\x4b\xb4\xb1\xe9\x11\x0b\xfb\xa8\x4c\x21\xa4\x0e\xb8\xfe\xd4\x49\x7e\x91\xdc\x3f\xfd\x04\x38\xc5\x14\xc0\xa8\xcb\x4c\xac\x6a\xd0\x25\x6b\xf1\x1d\x5a\xa7\xa9\xc7\xc0\x0b\x66\x9b\x01\x5b\x0b\xf8\x14\x25\xa2\x14\x13\xe2\xff\xb6\xed\xc0\xbd\x78\xe3\x85\xc4\x4f\xd7\x45\x58\xe5\x11\xc2\xc2\x5f\xee\x1f\xec\x18\xd3\x99\x0b\x86\x90\x30\x0f\xa7\x11\xe9\x3d\x98\x54\x66\x8f\x01\x87\x06\x5e\x76\xe7\x11\x3a\xe7\x63\xc3\x0d\xdd\x86\x72\x0b\x55\x46\xa6\xc3\xc6\xf1\xc4\x3b\xc6\x7b\x14"}, +{{0x61,0x32,0x69,0x2a,0x5e,0xf2,0x7b,0xf4,0x76,0xb1,0xe9,0x91,0xe6,0xc4,0x31,0xa8,0xc7,0x64,0xf1,0xae,0xbd,0x47,0x02,0x82,0xdb,0x33,0x21,0xbb,0x7c,0xb0,0x9c,0x20,},{0x7a,0x2d,0x16,0x61,0x84,0xf9,0xe5,0xf7,0x3b,0xea,0x45,0x44,0x86,0xb0,0x41,0xce,0xb5,0xfc,0x23,0x14,0xa7,0xbd,0x59,0xcb,0x71,0x8e,0x79,0xf0,0xec,0x98,0x9d,0x84,},{0xeb,0x67,0x7f,0x33,0x47,0xe1,0xa1,0xea,0x92,0x9e,0xfd,0xf6,0x2b,0xf9,0x10,0x5a,0x6c,0x8f,0x49,0x93,0x03,0x3b,0x4f,0x6d,0x03,0xcb,0x0d,0xbf,0x9c,0x74,0x2b,0x27,0x07,0x04,0xe3,0x83,0xab,0x7c,0x06,0x76,0xbd,0xb1,0xad,0x0c,0xe9,0xb1,0x66,0x73,0x08,0x3c,0x96,0x02,0xec,0x10,0xae,0x1d,0xd9,0x8e,0x87,0x48,0xb3,0x36,0x44,0x0b,},"\xa9\xc0\x86\x16\x65\xd8\xc2\xde\x06\xf9\x30\x1d\xa7\x0a\xfb\x27\xb3\x02\x4b\x74\x4c\x6b\x38\xb2\x42\x59\x29\x4c\x97\xb1\xd1\xcb\x4f\x0d\xcf\x75\x75\xa8\xed\x45\x4e\x2f\x09\x80\xf5\x03\x13\xa7\x73\x63\x41\x51\x83\xfe\x96\x77\xa9\xeb\x1e\x06\xcb\x6d\x34\xa4\x67\xcb\x7b\x07\x58\xd6\xf5\x5c\x56\x4b\x5b\xa1\x56\x03\xe2\x02\xb1\x88\x56\xd8\x9e\x72\xa2\x3a\xb0\x7d\x88\x53\xff\x77\xda\x7a\xff\x1c\xae\xbd\x79\x59\xf2\xc7\x10\xef\x31\xf5\x07\x8a\x9f\x2c\xda\xe9\x26\x41\xa1\xcc\x5f\x74\xd0\xc1\x43\xec\x42\xaf\xba\xa5\xf3\x78\xa9\xe1\x0d\x5b\xf7\x45\x87\xfa\x5f\x49\xc1\x56\x23\x32\x47\xda\xfd\x39\x29\xac\xde\x88\x8d\xc6\x84\x33\x7e\x40\xcd\xc5\x93\x2e\x7e\xb7\x3f\xfc\xc9\x0b\x85\xc0\xad\x46\x04\x16\x69\x1a\xef\xbd\x7e\xfd\x07\xb6\x57\xc3\x50\x94\x6a\x0e\x36\x6b\x37\xa6\xc8\x08\x9a\xba\x5c\x5f\xe3\xbb\xca\x06\x4a\xfb\xe9\xd4\x7f\xbc\x83\x91\x4a\xf1\xcb\x43\xc2\xb2\xef\xa9\x8e\x0a\x43\xbe\x32\xba\x82\x32\x02\x00\x1d\xef\x36\x81\x72\x51\xb6\x5f\x9b\x05\x06\xce\xf6\x68\x36\x42\xa4\x6e\xd6\x12\xf8\xca\x81\xee\x97\xbb\x04\xd3\x17\xb5\x17\x34\x3a\xde\x2b\x77\x12\x6d\x1f\x02\xa8\x7b\x76\x04\xc8\x65\x3b\x67\x48\xcf\x54\x88\xfa\x6d\x43\xdf\x80\x9f\xaa\x19\xe6\x92\x92\xd3\x8c\x5d\x39\x7d\xd8\xe2\x0c\x7a\xf7\xc5\x33\x4e\xc9\x77\xf5\x01\x0a\x0f\x7c\xb5\xb8\x94\x79\xca\x06\xdb\x4d\x12\x62\x7f\x06\x7d\x6c\x42\x18\x6a\x6b\x1f\x87\x42\xf3\x6a\xe7\x09\xba\x72\x0e\x3c\xd8\x98\x11\x66\x66\xd8\x1b\x19\x0b\x9b\x9d\x2a\x72\x20\x2c\xb6\x90\xa0\x3f\x33\x10\x42\x9a\x71\xdc\x04\x8c\xde"}, +{{0xf2,0x19,0xb2,0x10,0x11,0x64,0xaa,0x97,0x23,0xbd,0xe3,0xa7,0x34,0x6f,0x68,0xa3,0x50,0x61,0xc0,0x1f,0x97,0x82,0x07,0x25,0x80,0xba,0x32,0xdf,0x90,0x3b,0xa8,0x91,},{0xf6,0x6b,0x92,0x0d,0x5a,0xa1,0xa6,0x08,0x54,0x95,0xa1,0x48,0x05,0x39,0xbe,0xba,0x01,0xff,0xe6,0x0e,0x6a,0x63,0x88,0xd1,0xb2,0xe8,0xed,0xa2,0x33,0x55,0x81,0x0e,},{0x17,0xf0,0x12,0x7c,0xa3,0xba,0xfa,0x5f,0x4e,0xe9,0x59,0xcd,0x60,0xf7,0x72,0xbe,0x87,0xa0,0x03,0x49,0x61,0x51,0x7e,0x39,0xa0,0xa1,0xd0,0xf4,0xb9,0xe2,0x6d,0xb1,0x33,0x6e,0x60,0xc8,0x2b,0x35,0x2c,0x4c,0xba,0xcd,0xbb,0xd1,0x17,0x71,0xc3,0x77,0x4f,0x8c,0xc5,0xa1,0xa7,0x95,0xd6,0xe4,0xf4,0xeb,0xd5,0x1d,0xef,0x36,0x77,0x0b,},"\x01\x55\x77\xd3\xe4\xa0\xec\x1a\xb2\x59\x30\x10\x63\x43\xff\x35\xab\x4f\x1e\x0a\x8a\x2d\x84\x4a\xad\xbb\x70\xe5\xfc\x53\x48\xcc\xb6\x79\xc2\x29\x5c\x51\xd7\x02\xaa\xae\x7f\x62\x73\xce\x70\x29\x7b\x26\xcb\x7a\x25\x3a\x3d\xb9\x43\x32\xe8\x6a\x15\xb4\xa6\x44\x91\x23\x27\x91\xf7\xa8\xb0\x82\xee\x28\x34\xaf\x30\x40\x0e\x80\x46\x47\xa5\x32\xe9\xc4\x54\xd2\xa0\xa7\x32\x01\x30\xab\x6d\x4d\x86\x00\x73\xa3\x46\x67\xac\x25\xb7\xe5\xe2\x74\x7b\xa9\xf5\xc9\x45\x94\xfb\x68\x37\x7a\xe2\x60\x36\x9c\x40\x71\x3b\x4e\x32\xf2\x31\x95\xbf\x91\xd3\xd7\xf1\xa2\x71\x9b\xf4\x08\xaa\xd8\xd8\xa3\x47\xb1\x12\xe8\x4b\x11\x88\x17\xcb\x06\x51\x33\x44\x02\x17\x63\x03\x52\x72\xa7\xdb\x72\x8a\x0c\xcd\xaa\x94\x9c\x61\x71\x5d\x07\x64\x14\x0b\x3e\x8c\x01\xd2\x0f\xf1\x59\x3c\x7f\x2d\x55\xc4\xe8\x2a\x1c\x0c\xb1\xea\x58\x44\x2b\xf8\x0a\x74\x1b\xca\x91\xf5\x8a\xb0\x58\x1b\x49\x8e\xe9\xfe\x3c\x92\xca\x65\x41\x48\xef\x75\x31\x35\x43\xd1\xaf\xf3\x82\xbe\xfe\x1a\x93\xb0\x21\x90\xce\x01\x02\x17\x51\x58\xe2\x07\x1d\x02\xba\xca\xd8\xdb\xe9\xfb\x94\x0f\xcb\x61\x0c\x10\x5a\xd5\x2c\x80\xfe\xb1\xec\x4e\x52\x4f\x4c\x0e\xc7\x98\x3e\x9c\xe6\x96\xfa\x4f\xcf\x4b\xf0\x51\x4b\x8f\x04\x32\xb1\x7d\x54\x48\xfc\x42\x6f\xea\x2b\x01\xac\x7b\x26\xc2\xae\xd7\x69\x92\x75\x34\xda\x22\x57\x6f\xc1\xbb\xa7\x26\xe9\xd6\x5b\xe0\x1b\x59\xf6\x0a\x64\x8a\xce\x2f\xc3\xe5\xe2\x75\x78\x9f\xa6\x37\xcb\xbd\x84\xbe\x3d\x6a\xc2\x44\x57\xa6\x29\x2c\xd6\x56\xc7\xb5\x69\xa5\x2f\xfe\xa7\x91\x6b\x8d\x04\xb4\xf4\xa7\x5b\xe7\xac\x95\x14\x2f"}, +{{0xfc,0x18,0x00,0x35,0xae,0xc0,0xf5,0xed,0xe7,0xbd,0xa9,0x3b,0xf7,0x7a,0xde,0x7a,0x81,0xed,0x06,0xde,0x07,0xee,0x2e,0x3a,0xa8,0x57,0x6b,0xe8,0x16,0x08,0x61,0x0a,},{0x4f,0x21,0x5e,0x94,0x8c,0xae,0x24,0x3e,0xe3,0x14,0x3b,0x80,0x28,0x2a,0xd7,0x92,0xc7,0x80,0xd2,0xa6,0xb7,0x50,0x60,0xca,0x1d,0x29,0x0c,0xa1,0xa8,0xe3,0x15,0x1f,},{0xa4,0x3a,0x71,0xc3,0xa1,0x9c,0x35,0x66,0x0d,0xae,0x6f,0x31,0xa2,0x54,0xb8,0xc0,0xea,0x35,0x93,0xfc,0x8f,0xca,0x74,0xd1,0x36,0x40,0x01,0x2b,0x9e,0x94,0x73,0xd4,0xaf,0xe0,0x70,0xdb,0x01,0xe7,0xfb,0x39,0x9b,0xf4,0xca,0x60,0x70,0xe0,0x62,0x18,0x00,0x11,0x28,0x5a,0x67,0xdd,0x68,0x58,0xb7,0x61,0xe4,0x6c,0x6b,0xd3,0x20,0x04,},"\xb5\xe8\xb0\x16\x25\x66\x4b\x22\x23\x39\xe0\xf0\x5f\x93\xa9\x90\xba\x48\xb5\x6a\xe6\x54\x39\xa1\x75\x20\x93\x2d\xf0\x11\x72\x1e\x28\x4d\xbe\x36\xf9\x86\x31\xc0\x66\x51\x00\x98\xa6\x8d\x7b\x69\x2a\x38\x63\xe9\x9d\x58\xdb\x76\xca\x56\x67\xc8\x04\x3c\xb1\x0b\xd7\xab\xba\xf5\x06\x52\x9f\xbb\x23\xa5\x16\x6b\xe0\x38\xaf\xfd\xb9\xa2\x34\xc4\xf4\xfc\xf4\x3b\xdd\xd6\xb8\xd2\xce\x77\x2d\xd6\x53\xed\x11\x5c\x09\x5e\x23\x2b\x26\x9d\xd4\x88\x8d\x23\x68\xcb\x1c\x66\xbe\x29\xdd\x38\x3f\xca\x67\xf6\x67\x65\xb2\x96\x56\x4e\x37\x55\x5f\x0c\x0e\x48\x45\x04\xc5\x91\xf0\x06\xea\x85\x33\xa1\x25\x83\xad\x2e\x48\x31\x8f\xf6\xf3\x24\xec\xaf\x80\x4b\x1b\xae\x04\xaa\x89\x67\x43\xe6\x7e\xf6\x1c\xa3\x83\xd5\x8e\x42\xac\xfc\x64\x10\xde\x30\x77\x6e\x3b\xa2\x62\x37\x3b\x9e\x14\x41\x94\x39\x55\x10\x1a\x4e\x76\x82\x31\xad\x9c\x65\x29\xef\xf6\x11\x8d\xde\x5d\xf0\x2f\x94\xb8\xd6\xdf\x2d\x99\xf2\x78\x63\xb5\x17\x24\x3a\x57\x9e\x7a\xaf\xf3\x11\xea\x3a\x02\x82\xe4\x7c\xa8\x76\xfa\xbc\x22\x80\xfc\xe7\xad\xc9\x84\xdd\x0b\x30\x88\x5b\x16\x50\xf1\x47\x1d\xfc\xb0\x52\x2d\x49\xfe\xc7\xd0\x42\xf3\x2a\x93\xbc\x36\x8f\x07\x60\x06\xea\x01\xec\x1c\x74\x12\xbf\x66\xf6\x2d\xc8\x8d\xe2\xc0\xb7\x47\x01\xa5\x61\x4e\x85\x5e\x9f\xa7\x28\xfb\x1f\x11\x71\x38\x5f\x96\xaf\xbd\xe7\x0d\xea\x02\xe9\xaa\x94\xdc\x21\x84\x8c\x26\x30\x2b\x50\xae\x91\xf9\x69\x3a\x18\x64\xe4\xe0\x95\xae\x03\xcd\xc2\x2a\xd2\x8a\x0e\xb7\xdb\x59\x67\x79\x24\x67\x12\xfa\xb5\xf5\xda\x32\x7e\xfe\xc3\xe7\x96\x12\xde\x0a\x6c\xca\xa5\x36\x75\x9b\x8e"}, +{{0xa2,0x83,0x6a,0x65,0x42,0x79,0x12,0x12,0x2d,0x25,0xdc,0xdf,0xc9,0x9d,0x70,0x46,0xfe,0x9b,0x53,0xd5,0xc1,0xbb,0x23,0x61,0x7f,0x11,0x89,0x0e,0x94,0xca,0x93,0xed,},{0x8c,0x12,0xbd,0xa2,0x14,0xc8,0xab,0xb2,0x28,0x6a,0xcf,0xfb,0xf8,0x11,0x24,0x25,0x04,0x0a,0xab,0x9f,0x4d,0x8b,0xb7,0x87,0x0b,0x98,0xda,0x01,0x59,0xe8,0x82,0xf1,},{0xe6,0xa9,0xa6,0xb4,0x36,0x55,0x9a,0x43,0x20,0xc4,0x5c,0x0c,0x2c,0x4a,0x2a,0xed,0xec,0xb9,0x0d,0x41,0x6d,0x52,0xc8,0x26,0x80,0xac,0x73,0x30,0xd0,0x62,0xae,0xbe,0xf3,0xe9,0xac,0x9f,0x2c,0x5f,0xfa,0x45,0x5c,0x9b,0xe1,0x13,0x01,0x3a,0x2b,0x28,0x2e,0x56,0x00,0xfd,0x30,0x64,0x35,0xad,0xa8,0x3b,0x1e,0x48,0xba,0x2a,0x36,0x05,},"\x81\x3d\x60\x61\xc5\x6e\xae\x0f\xf5\x30\x41\xc0\x24\x4a\xa5\xe2\x9e\x13\xec\x0f\x3f\xb4\x28\xd4\xbe\xb8\xa9\x9e\x04\xbc\xa8\xc4\x1b\xdd\xb0\xdb\x94\x5f\x48\x7e\xfe\x38\xf2\xfc\x14\xa6\x28\xfa\xfa\x24\x62\xf8\x60\xe4\xe3\x42\x50\xeb\x4e\x93\xf1\x39\xab\x1b\x74\xa2\x61\x45\x19\xe4\x1e\xe2\x40\x3b\xe4\x27\x93\x0a\xb8\xbc\x82\xec\x89\xce\xaf\xb6\x09\x05\xbd\x4d\xdb\xbd\x13\xbd\xb1\x96\x54\x31\x4f\xc9\x23\x73\x14\x0b\x96\x2e\x22\x58\xe0\x38\xd7\x1b\x9e\xc6\x6b\x84\xef\x83\x19\xe0\x35\x51\xcb\x70\x7e\x74\x7f\x6c\x40\xad\x47\x6f\xbe\xfd\xce\x71\xf3\xa7\xb6\x7a\x1a\xf1\x86\x9b\xc6\x44\x06\x86\xe7\xe0\x85\x5e\x4f\x36\x9d\x1d\x88\xb8\x09\x9f\xba\x54\x71\x46\x78\x62\x7b\xba\x1a\xff\x41\xe7\x70\x7b\xc9\x7e\xdd\xf8\x90\xb0\xc0\x8d\xce\x3e\x98\x00\xd2\x4c\x6f\x61\x09\x2c\xe2\x8d\x48\x1b\x5d\xea\x5c\x09\x6c\x55\xd7\x2f\x89\x46\x00\x91\x31\xfb\x96\x8e\x2b\xc8\xa0\x54\xd8\x25\xad\xab\x76\x74\x0d\xcf\x0d\x75\x8c\x8b\xf5\x4f\xf3\x86\x59\xe7\x1b\x32\xbf\xe2\xe6\x15\xaa\xab\xb0\xf5\x29\x30\x85\x64\x9c\xf6\x0b\x98\x47\xbc\x62\x01\x1c\xe3\x87\x8a\xf6\x28\x98\x4a\x58\x40\xa4\xad\x5d\xae\x37\x02\xdb\x36\x7d\xa0\xf8\xa1\x65\xfe\xd0\x51\x7e\xb5\xc4\x42\xb0\x14\x53\x30\x24\x1b\x97\xee\xca\x73\x3b\xa6\x68\x8b\x9c\x12\x9a\x61\xcd\x12\x36\xaf\xf0\xe2\x7b\xcf\x98\xc2\x8b\x0f\xbe\xea\x55\xa3\xd7\xc7\x19\x3d\x64\x4b\x27\x49\xf9\x86\xbd\x46\xaf\x89\x38\xe8\xfa\xae\xaf\xbd\x9c\xec\x36\x12\xab\x00\x5b\xd7\xc3\xee\xaf\xe9\xa3\x12\x79\xca\x61\x02\x56\x06\x66\xba\x16\x13\x6f\xf1\x45\x2f\x85\x0a\xdb"}, +{{0xf0,0x51,0xaf,0x42,0x6d,0x0c,0x32,0x82,0xfa,0xfc,0x8b,0xf9,0x12,0xad,0xe1,0xc2,0x42,0x11,0xa9,0x5a,0xd2,0x00,0xe1,0xee,0xf5,0x49,0x32,0x0e,0x1c,0xb1,0xa2,0x52,},{0xfa,0x87,0x95,0x5e,0x0e,0xa1,0x3d,0xde,0x49,0xd8,0x3d,0xc2,0x2e,0x63,0xa2,0xbd,0xf1,0x07,0x67,0x25,0xc2,0xcc,0x7f,0x93,0xc7,0x65,0x11,0xf2,0x8e,0x79,0x44,0xf2,},{0xb8,0xf7,0x13,0x57,0x8a,0x64,0x46,0x67,0x19,0xac,0xeb,0x43,0x2f,0xce,0x30,0x2a,0x87,0xcf,0x06,0x6b,0xf3,0xe1,0x02,0xa3,0x50,0x61,0x69,0x21,0xa8,0x40,0x96,0x4b,0xfc,0x7e,0x68,0x5d,0x8f,0xd1,0x74,0x55,0xac,0x3e,0xb4,0x86,0x1e,0xdc,0xb8,0x97,0x9d,0x35,0xe3,0xa4,0xbd,0x82,0xa0,0x78,0xcd,0x70,0x77,0x21,0xd7,0x33,0x40,0x0e,},"\xb4\x8d\x9f\x84\x76\x2b\x3b\xcc\x66\xe9\x6d\x76\xa6\x16\xfa\x8f\xe8\xe0\x16\x95\x25\x1f\x47\xcf\xc1\xb7\xb1\x7d\x60\xdc\x9f\x90\xd5\x76\xef\x64\xee\x7d\x38\x85\x04\xe2\xc9\x07\x96\x38\x16\x5a\x88\x96\x96\x47\x1c\x98\x9a\x87\x6f\x8f\x13\xb6\x3b\x58\xd5\x31\xfe\xa4\xdd\x12\x29\xfc\x63\x16\x68\xa0\x47\xbf\xae\x2d\xa2\x81\xfe\xae\x1b\x6d\xe3\xeb\xe2\x80\xab\xe0\xa8\x2e\xe0\x0f\xbf\xdc\x22\xce\x2d\x10\xe0\x6a\x04\x92\xff\x14\x04\xdf\xc0\x94\xc4\x0b\x20\x3b\xf5\x57\x21\xdd\x78\x7e\xd4\xe9\x1d\x55\x17\xaa\xf5\x8d\x3b\xdd\x35\xd4\x4a\x65\xae\x6b\xa7\x56\x19\xb3\x39\xb6\x50\x51\x8c\xef\xcc\x17\x49\x3d\xe2\x7a\x3b\x5d\x41\x78\x8f\x87\xed\xbd\xe7\x26\x10\xf1\x81\xbf\x06\xe2\x08\xe0\xeb\x7c\xdf\xe8\x81\xd9\x1a\x2d\x6c\xc7\x7a\xa1\x9c\x0f\xcf\x33\x0f\xed\xb4\x46\x75\xd8\x00\xeb\x8c\xff\x95\x05\xd8\x88\x75\x44\xa5\x03\xcb\xe3\x73\xc4\x84\x7b\x19\xe8\xf3\x99\x57\x26\xef\xd6\x64\x98\x58\x59\x5c\x57\xcc\xaf\x0c\xbc\x9e\xb2\x5d\xe8\x3b\xa0\x46\xbc\x9f\x18\x38\xac\x7b\x89\x53\xdd\x81\xb8\x1a\xc0\xf6\x8d\x0e\x93\x38\xcb\x55\x40\x25\x52\xaf\xb6\xbc\x16\x94\x93\x51\xb9\x26\xd1\x51\xa8\x2e\xfc\x69\x5e\x8d\x7d\xa0\xdd\x55\x09\x93\x66\x78\x97\x18\xcc\xbf\x36\x03\x0b\xd2\xc3\xc1\x09\x39\x9b\xe2\x6c\xdb\x8b\x9e\x2a\x15\x5f\x3b\x2c\xb1\xbf\xa7\x1a\xb6\x9a\x23\x62\x5a\x4a\xc1\x18\xfe\x91\xcb\x2c\x19\x78\x8c\xf5\x2a\x71\xd7\x30\xd5\x76\xb4\x21\xd9\x69\x82\xa5\x1a\x29\x91\xda\xec\x44\x0c\xda\x7e\x6c\xc3\x28\x2b\x83\x12\x71\x42\x78\xb8\x19\xbf\xe2\x38\x7e\xb9\x6a\xa9\x1d\x40\x17\x30\x34\xf4\x28"}, +{{0xa1,0x03,0xe9,0x26,0x72,0xc6,0x5f,0x81,0xea,0x5d,0xa1,0xff,0xf1,0xa4,0x03,0x87,0x88,0x47,0x9e,0x94,0x1d,0x50,0x3a,0x75,0x6f,0x4a,0x75,0x52,0x01,0xa5,0x7c,0x1d,},{0xee,0x63,0xa5,0xb6,0x96,0x41,0x21,0x7a,0xcb,0xaf,0x33,0x39,0xda,0x82,0x9e,0xc0,0x71,0xb9,0x93,0x1e,0x59,0x87,0x15,0x35,0x14,0xd3,0x01,0x40,0x83,0x7a,0x7a,0xf4,},{0x2a,0xa2,0x03,0x5c,0x2c,0xe5,0xb5,0xe6,0xae,0x16,0x1e,0x16,0x8f,0x3a,0xd0,0xd6,0x59,0x2b,0xcf,0x2c,0x4a,0x04,0x9d,0x3e,0xd3,0x42,0xfc,0xeb,0x56,0xbe,0x9c,0x7c,0xb3,0x72,0x02,0x75,0x73,0xae,0x01,0x78,0xe8,0x87,0x8e,0xbe,0xfc,0xa7,0xb0,0x30,0x32,0x7b,0x8a,0xad,0x41,0x85,0x7d,0xe5,0x8c,0xb7,0x8e,0x1a,0x00,0xcb,0xac,0x05,},"\xb1\x98\x4e\x9e\xec\x08\x5d\x52\x4c\x1e\xb3\xb9\x5c\x89\xc8\x4a\xe0\x85\xbe\x5d\xc6\x5c\x32\x6e\x19\x02\x5e\x12\x10\xa1\xd5\x0e\xdb\xbb\xa5\xd1\x37\x0c\xf1\x5d\x68\xd6\x87\xeb\x11\x32\x33\xe0\xfb\xa5\x0f\x94\x33\xc7\xd3\x58\x77\x39\x50\xc6\x79\x31\xdb\x82\x96\xbb\xcb\xec\xec\x88\x8e\x87\xe7\x1a\x2f\x75\x79\xfa\xd2\xfa\x16\x2b\x85\xfb\x97\x47\x3c\x45\x6b\x9a\x5c\xe2\x95\x66\x76\x96\x9c\x7b\xf4\xc4\x56\x79\x08\x5b\x62\xf2\xc2\x24\xfc\x7f\x45\x87\x94\x27\x3f\x6d\x12\xc5\xf3\xe0\xd0\x69\x51\x82\x4d\x1c\xca\x3e\x2f\x90\x45\x59\xed\x28\xe2\x86\x8b\x36\x6d\x79\xd9\x4d\xc9\x86\x67\xb9\xb5\x92\x42\x68\xf3\xe3\x9b\x12\x91\xe5\xab\xe4\xa7\x58\xf7\x70\x19\xda\xcb\xb2\x2b\xd8\x19\x6e\x0a\x83\xa5\x67\x76\x58\x83\x6e\x96\xca\x56\x35\x05\x5a\x1e\x63\xd6\x5d\x03\x6a\x68\xd8\x7a\xc2\xfd\x28\x3f\xdd\xa3\x90\x31\x99\x09\xc5\xcc\x76\x80\x36\x88\x48\x87\x3d\x59\x7f\x29\x8e\x0c\x61\x72\x30\x80\x30\xff\xd4\x52\xbb\x13\x63\x61\x7b\x31\x6e\xd7\xcd\x94\x9a\x16\x5d\xc8\xab\xb5\x3f\x99\x1a\xef\x3f\x3e\x95\x02\xc5\xdf\xe4\x75\x6b\x7c\x6b\xfd\xfe\x89\xf5\xe0\x0f\xeb\xdd\x6a\xfb\x04\x02\x81\x8f\x11\xcf\x8d\x1d\x58\x64\xfe\x9d\xa1\xb8\x6e\x39\xaa\x93\x58\x31\x50\x6c\xf2\x40\x0e\xa7\xed\x75\xbd\x95\x33\xb2\x3e\x20\x2f\xe8\x75\xd7\xd9\x63\x8c\x89\xd1\x1c\xb2\xd6\xe6\x02\x1a\xe6\xbd\x27\xc7\x75\x48\x10\xd3\x5c\xd3\xa6\x14\x94\xf2\x7b\x16\xfc\x79\x4e\x2c\xd2\xf0\xd3\x45\x3a\xda\x93\x38\x65\xdb\x78\xc5\x79\x57\x1f\x8f\xc5\xc5\xc6\xbe\x8e\xaf\xfc\xe6\xa8\x52\xe5\xb3\xb1\xc5\x24\xc4\x93\x13\xd4\x27\xab\xcb"}, +{{0xd4,0x7c,0x1b,0x4b,0x9e,0x50,0xcb,0xb7,0x1f,0xd0,0x7d,0x09,0x6d,0x91,0xd8,0x72,0x13,0xd4,0x4b,0x02,0x43,0x73,0x04,0x47,0x61,0xc4,0x82,0x2f,0x9d,0x9d,0xf8,0x80,},{0xf4,0xe1,0xcb,0x86,0xc8,0xca,0x2c,0xfe,0xe4,0x3e,0x58,0x59,0x4a,0x87,0x78,0x43,0x6d,0x3e,0xa5,0x19,0x70,0x4e,0x00,0xc1,0xbb,0xe4,0x8b,0xbb,0x1c,0x94,0x54,0xf8,},{0x62,0x7e,0x7c,0xa7,0xe3,0x4e,0xd6,0x33,0x1d,0x62,0xb9,0x54,0x1c,0x1e,0xa9,0xa9,0x29,0x2b,0xe7,0xb0,0xa6,0x5d,0x80,0x5e,0x26,0x6b,0x51,0x22,0x27,0x2a,0x82,0xdb,0x7d,0x76,0x5a,0xcc,0x7e,0x2a,0x29,0x0d,0x68,0x58,0x04,0x92,0x2f,0x91,0xed,0x04,0xa3,0xc3,0x82,0xc0,0x3f,0xf2,0x1a,0x17,0x68,0xf5,0x84,0x41,0x3c,0x4e,0x5f,0x00,},"\x88\xd7\x00\x9d\x51\xde\x3d\x33\x7e\xef\x0f\x21\x5e\xa6\x6a\xb8\x30\xec\x5a\x9e\x68\x23\x76\x1c\x3b\x92\xad\x93\xea\x34\x1d\xb9\x2e\xce\x67\xf4\xef\x4c\xeb\x84\x19\x4a\xe6\x92\x6c\x3d\x01\x4b\x2d\x59\x78\x1f\x02\xe0\xb3\x2f\x9a\x61\x12\x22\xcb\x9a\x58\x50\xc6\x95\x7c\xb8\x07\x9a\xe6\x4e\x08\x32\xa1\xf0\x5e\x5d\x1a\x3c\x57\x2f\x9d\x08\xf1\x43\x7f\x76\xbb\x3b\x83\xb5\x29\x67\xc3\xd4\x8c\x35\x76\x84\x88\x91\xc9\x65\x8d\x49\x59\xeb\x80\x65\x6d\x26\xcd\xba\x08\x10\x03\x7c\x8a\x18\x31\x8f\xf1\x22\xf8\xaa\x89\x85\xc7\x73\xcb\x31\x7e\xfa\x2f\x55\x7f\x1c\x38\x96\xbc\xb1\x62\xdf\x5d\x87\x68\x1b\xb7\x87\xe7\x81\x3a\xa2\xde\xa3\xb0\xc5\x64\xd6\x46\xa9\x28\x61\xf4\x44\xca\x14\x07\xef\xba\xc3\xd1\x24\x32\xcb\xb7\x0a\x1d\x0e\xaf\xfb\x11\x74\x1d\x37\x18\xfe\xde\xe2\xb8\x30\x36\x18\x9a\x6f\xc4\x5a\x52\xf7\x4f\xa4\x87\xc1\x8f\xd2\x64\xa7\x94\x5f\x6c\x9e\x44\xb0\x11\xf5\xd8\x66\x13\xf1\x93\x9b\x19\xf4\xf4\xfd\xf5\x32\x34\x05\x7b\xe3\xf0\x05\xad\x64\xee\xbf\x3c\x8f\xfb\x58\xcb\x40\x95\x6c\x43\x36\xdf\x01\xd4\x42\x4b\x70\x6a\x0e\x56\x1d\x60\x17\x08\xd1\x24\x85\xe2\x1b\xcb\x6d\x79\x9d\x8d\x1d\x04\x4b\x40\x00\x64\xec\x09\x44\x50\x14\x06\xe7\x02\x53\x94\x70\x06\xca\xbb\xdb\x2d\xd6\xbd\x8c\xee\x44\x97\x65\x3d\x91\x13\xa4\x4d\x4d\xe9\xb6\x8d\x4c\x52\x6f\xca\x0b\x9b\x0c\x18\xfe\x50\xfb\x91\x7f\xdd\x9a\x91\x4f\xb8\x16\x10\x8a\x73\xa6\xb3\xff\xf9\xe6\x54\xe6\x9c\x9c\xfe\x02\xb0\x5c\x6c\x1b\x9d\x15\xc4\xe6\x5c\xf3\x10\x18\xb8\x10\x0d\x78\x46\x33\xee\x18\x88\xee\xe3\x57\x2a\xaf\xa6\xf1\x89\xea\x22\xd0"}, +{{0xfc,0x0c,0x32,0xc5,0xeb,0x6c,0x71,0xea,0x08,0xdc,0x2b,0x30,0x0c,0xbc,0xef,0x18,0xfd,0xde,0x3e,0xa2,0x0f,0x68,0xf2,0x17,0x33,0x23,0x7b,0x4d,0xda,0xab,0x90,0x0e,},{0x47,0xc3,0x7d,0x8a,0x08,0x08,0x57,0xeb,0x87,0x77,0xa6,0xc0,0xa9,0xa5,0xc9,0x27,0x30,0x3f,0xaf,0x5c,0x32,0x09,0x53,0xb5,0xde,0x48,0xe4,0x62,0xe1,0x2d,0x00,0x62,},{0x68,0x87,0xc6,0xe2,0xb9,0x8a,0x82,0xaf,0x5e,0xe3,0xdf,0xa7,0xca,0x2c,0xb2,0x5d,0x9c,0x10,0x74,0x56,0x20,0xa8,0x29,0x56,0xac,0xba,0x85,0xcb,0x57,0xc8,0xec,0x24,0x27,0x9f,0xa4,0x2f,0x09,0x23,0x59,0xa1,0xb6,0xbb,0xea,0xfb,0xa0,0x50,0xf1,0x4b,0x62,0x88,0x20,0x9e,0x6e,0xf7,0xbc,0x1e,0x0a,0x2b,0x87,0x2c,0x11,0x38,0xf3,0x05,},"\xa7\xb1\xe2\xdb\x6b\xdd\x96\xb3\xd5\x14\x75\x60\x35\x37\xa7\x6b\x42\xb0\x4d\x7e\xbd\x24\xfe\x51\x5a\x88\x76\x58\xe4\xa3\x52\xe2\x21\x09\x33\x56\x39\xa5\x9e\x25\x34\x81\x1f\x47\x53\xb7\x02\x09\xd0\xe4\x69\x8e\x9d\x92\x60\x88\x82\x6c\x14\x68\x96\x81\xea\x00\xfa\x3a\x2f\xca\xa0\x04\x7c\xed\x3e\xf2\x87\xe6\x17\x25\x02\xb2\x15\xe5\x64\x97\x61\x4d\x86\xb4\xcb\x26\xbc\xd7\x7a\x2e\x17\x25\x09\x36\x0e\xe5\x88\x93\xd0\x1c\x0d\x0f\xb4\xd4\xab\xfe\x4d\xbd\x8d\x2a\x2f\x54\x19\x0f\xa2\xf7\x31\xc1\xce\xac\x68\x29\xc3\xdd\xc9\xbf\xb2\xff\xd7\x0c\x57\xba\x0c\x2b\x22\xd2\x32\x6f\xbf\xe7\x39\x0d\xb8\x80\x9f\x73\x54\x7f\xf4\x7b\x86\xc3\x6f\x2b\xf7\x45\x4e\x67\x8c\x4f\x1c\x0f\xa8\x70\xbd\x0e\x30\xbb\xf3\x27\x8e\xc8\xd0\xc5\xe9\xb6\x4a\xff\x0a\xf6\x4b\xab\xc1\x9b\x70\xf4\xcf\x9a\x41\xcb\x8f\x95\xd3\xcd\xe2\x4f\x45\x6b\xa3\x57\x1c\x8f\x02\x1d\x38\xe5\x91\xde\xc0\x5c\xb5\xd1\xca\x7b\x48\xf9\xda\x4b\xd7\x34\xb0\x69\xa9\xfd\x10\x65\x00\xc1\xf4\x08\xab\x7f\xe8\xe4\xa6\xe6\xf3\xed\x64\xda\x0e\xd2\x4b\x01\xe3\x3d\xf8\x47\x5f\x95\xfa\x9e\xd7\x1d\x04\xdd\x30\xb3\xcd\x82\x37\x55\xa3\x40\x1b\xf5\xaf\xae\x10\xee\x7e\x18\xec\x6f\xe6\x37\xc3\x79\x3f\xd4\x34\xb4\x8d\x71\x45\x13\x04\x47\xe0\x02\x99\x10\x10\x52\x55\x8b\x50\x65\x54\xec\x9c\x39\x9f\x62\x94\x1c\x3f\x41\x4c\xbc\x35\x2c\xaa\x34\x5b\x93\x0a\xde\xcf\xad\xda\xc9\x1e\xe5\x3d\x14\x51\xa6\x5e\x06\x20\x10\x26\x32\x5d\xe0\x7c\x93\x1f\x69\xbb\xa8\x68\xa7\xc8\x7e\xe2\x3c\x60\x4e\xc6\x79\x43\x32\x91\x7d\xfe\x2c\x5b\x69\x66\x9b\x65\x97\x06\x91\x7f\x71\xed\xdf\x96"}, +{{0xa8,0xd7,0x3d,0x63,0x9a,0x23,0xcc,0x6a,0x96,0x7e,0xf3,0x1b,0xca,0xbb,0x5d,0x06,0x3e,0x53,0xe1,0xea,0xb8,0xfc,0xc7,0xca,0xb9,0xbc,0x3a,0x17,0xfd,0xe9,0xc2,0xf8,},{0x8d,0xaa,0x9f,0x4c,0x8b,0x1a,0x44,0x69,0x1b,0xf4,0x45,0x21,0xf2,0xf7,0xca,0x45,0xdc,0x7f,0xc6,0x1f,0x6a,0x4c,0xe6,0xf9,0x8f,0xaa,0x41,0xc2,0xa7,0x49,0x77,0xd1,},{0xc4,0xdc,0xef,0x1a,0x24,0x53,0x93,0x9b,0x36,0x4b,0x34,0x02,0x50,0xc3,0x12,0x94,0x31,0x43,0x1d,0x5b,0xa3,0xf4,0x76,0x70,0xab,0x07,0xce,0x68,0x0c,0x69,0xbf,0x28,0xb6,0x78,0x62,0x7c,0x76,0xa6,0x36,0x0f,0xc4,0x0d,0xc1,0x09,0xaa,0x7d,0xea,0x37,0x1b,0x82,0x5e,0x46,0x13,0x4f,0x62,0x45,0x72,0x18,0x2a,0xcf,0x39,0x57,0xe7,0x0f,},"\xfd\x1f\xac\x3d\x53\x31\x3b\x11\xac\xd2\x9f\x5a\x83\xac\x11\x89\x6d\xab\x25\x30\xfa\x47\x86\x5b\x22\x95\xc0\xd9\x9d\xd6\x7c\x36\xed\x8e\x5f\xa5\x49\x15\x0c\x79\x4c\x55\x49\xef\xb5\xc1\xd6\x91\x14\xd5\xd6\x07\xb2\x32\x85\xb7\x21\x2a\xfa\xab\x57\x84\x6a\x54\xae\x67\xb9\xe8\x80\xe0\x7b\x65\x86\x60\x7c\xec\xf6\xd4\xee\xd5\x16\xa3\xa7\x55\x11\xfe\x36\x7d\x88\xeb\x87\x1e\x6d\x71\xb7\xd6\xaa\x13\x67\xa0\x14\x21\xb1\x08\x8f\xc2\xd7\x5e\x44\x95\x4b\x73\x62\x5c\x52\xda\x8a\x3a\x18\x3c\x60\xbe\x9d\xa6\x05\x0f\x59\xa4\x53\xca\xa5\x35\x20\x59\x36\x71\x72\x8d\x43\x18\x77\xbf\xaa\xc9\x13\xa7\x65\xfb\x6a\x56\xb7\x52\x90\xb2\xa8\xaa\xac\x34\xaf\xb9\x21\x7b\xa1\xb0\xd5\x85\x0b\xa0\xfd\xab\xf8\x09\x69\xde\xf0\xfe\xee\x79\x4c\xeb\x60\x61\x4e\x33\x68\xe6\x3e\xf2\x0e\x4c\x32\xd3\x41\xec\x9b\x03\x28\xea\x9f\xe1\x39\x20\x7e\xd7\xa6\x26\xff\x08\x94\x3b\x41\x52\x33\xdb\x7c\xfc\xc8\x45\xc9\xb6\x31\x21\xd4\xed\x52\xec\x37\x48\xab\x6a\x1f\x36\xb2\x10\x3c\x7d\xc7\xe9\x30\x3a\xce\xa4\xba\x8a\xf7\xa3\xe0\x71\x84\xfb\x49\x1e\x89\x1e\xde\x84\xf0\xdc\x41\xca\xdc\x39\x73\x02\x8e\x87\x9a\xcd\x20\x31\xaf\xc2\x9a\x16\x09\x28\x68\xe2\xc7\xf5\x39\xfc\x1b\x79\x2e\xda\xb1\x95\xa2\x5a\xb9\x83\x06\x61\x34\x6b\x39\xef\x53\x91\x5d\xe4\xaf\x52\xc4\x21\xea\xf1\x72\xe9\xda\x76\xa0\x8c\x28\x3a\x52\xdf\x90\x7f\x70\x5d\x7e\x85\x99\xc5\xba\xae\x0c\x2a\xf3\x80\xc1\xbb\x46\xf9\x34\x84\xa0\x3f\x28\x37\x43\x24\xb2\x78\x99\x2b\x50\xb7\xaf\xa0\x25\x52\xca\xfa\x50\x3f\x03\x4f\x8d\x86\x6e\x9b\x72\x02\x71\xdd\x68\xcc\xb6\x85\xa8\x5f\xff\xd1"}, +{{0x79,0xc7,0xdc,0xb7,0xd5,0x9a,0x8d,0xf6,0xb2,0xb2,0xba,0x04,0x13,0x05,0x9d,0x89,0x68,0x09,0x95,0xc2,0x0e,0x91,0x6d,0xa0,0x1b,0x8f,0x06,0x7d,0xc6,0x0c,0xde,0xb4,},{0x29,0x87,0x43,0xc7,0x39,0x18,0xbd,0x55,0x6b,0x28,0xf8,0xd4,0x82,0x4a,0x09,0xb8,0x14,0x75,0x2a,0x7a,0xea,0xe7,0xee,0x04,0x87,0x5c,0x53,0xf4,0xd6,0xb1,0x08,0xd9,},{0x7b,0x7c,0xbe,0x44,0xc7,0x71,0xe4,0x37,0x1b,0xae,0x13,0xb0,0x72,0x2b,0xab,0xcc,0x10,0x64,0x15,0x57,0x32,0x96,0x2f,0x40,0x7c,0xba,0x2a,0xcd,0x35,0x38,0x1d,0x42,0x21,0x0b,0xec,0xe8,0x22,0xf4,0x68,0x11,0x21,0xfd,0x4d,0xab,0x74,0x5a,0x1f,0x30,0x77,0x92,0x2f,0xba,0x1a,0x78,0x04,0x5b,0x71,0x29,0x02,0xba,0xcc,0xac,0x66,0x0e,},"\x5f\xe2\x02\xf5\xb3\x3b\x77\x88\x81\x0d\x25\x08\xa1\x3b\x31\x14\xd6\x9b\x85\x96\xe6\xea\xcd\xa0\x5a\x04\xa2\xeb\x59\x7f\xa3\x27\x9c\x20\x8b\x5a\x5b\x65\xda\xac\xb6\x99\xf1\x44\xe1\xd6\x60\xe7\x8e\x13\x9b\x57\x83\x31\xab\xec\x5c\x3c\x35\x33\x44\x54\xf0\x3e\x83\x2c\x8d\x6e\x29\x84\xdf\x5d\x45\x0e\xcb\x5d\x33\x58\x2a\x78\x80\x8a\x9c\x78\xf2\x6e\xbc\xd1\x24\x4e\xf5\x2e\x3f\xa6\xdc\xa1\x15\xc1\xf0\xcb\x56\xe3\x8e\xae\x0e\x5b\x39\xf5\xfd\x86\x3d\xff\xd0\xb2\xfb\x5b\x95\x8f\x2d\x73\x9d\xb3\x12\xfc\x66\x7a\x17\xb0\x31\xc4\xc9\xf8\xc5\xa2\xad\x57\x79\x84\xcc\x41\x46\xc4\x37\x58\x0e\xfd\x21\x52\x17\x3f\xe0\xd5\x78\x2c\xc2\xae\x98\x31\xa8\xd9\xa0\x41\x77\x25\x60\x18\xff\x76\x31\xe0\xb0\xd8\xa9\x9c\xb2\x8f\x00\x8b\x32\x04\x21\xe2\x7a\x74\xc3\x13\x59\x18\x86\x63\x45\x6d\x85\xe0\x98\xc1\xeb\xd2\x81\x70\x10\x97\xb6\xae\x5a\x87\x1e\x5c\xcc\x02\x05\x8a\x50\x14\x16\xcb\x91\xc1\x2c\xef\x5b\xe6\xf1\x91\x43\x70\xe5\x63\xf1\xa1\xb2\xaa\x41\xf4\xb8\xee\x84\xcd\x32\xa1\xd5\x09\xe5\x29\x78\x7d\x14\xa4\x45\x43\x8d\x80\x7e\xcd\x62\x0e\x2f\xa2\x6d\xe0\xda\x64\x26\x86\x47\x84\xd4\xa2\x8f\x54\x10\x3e\x60\x92\x83\xb9\x9e\xe9\xb2\xb6\x99\xc9\x80\xbb\xb7\x88\x2c\x3e\xa6\x8d\xdc\x90\x80\x2a\xc2\x32\xf2\xc8\xe8\x42\x91\x98\x7b\xf3\xc5\x24\x09\x21\xb5\x9c\xfa\x21\x49\x69\x31\x76\x73\xd0\xbe\x7f\x34\xb1\xca\x0e\x15\xea\x73\xc7\x17\x54\x01\xce\x55\x0b\xe1\x06\xb4\x9e\x62\xf8\xdb\x68\x69\x5e\x74\x0e\x0f\x3a\x35\x56\xa1\x9f\x3c\x8e\x6b\x91\xac\x1c\xc2\x3e\x86\x3f\xcd\x0f\x0d\x9e\xb7\x04\x7a\xa6\x31\xe0\xd2\xeb\x9b\xcc\x6b"}, +{{0xb9,0xce,0xd0,0x41,0x25,0x93,0xfe,0xfe,0xd9,0x5e,0x94,0xac,0x96,0x5e,0x5b,0x23,0xff,0x9d,0x4b,0x0e,0x79,0x7d,0xb0,0x2b,0xf4,0x97,0x99,0x4d,0x3b,0x79,0x3e,0x60,},{0xc1,0x62,0x9a,0x72,0x31,0x89,0x95,0x93,0x37,0xf5,0x53,0x52,0x01,0xe5,0xd3,0x95,0xba,0x0a,0x03,0xea,0x8c,0x17,0x66,0x0d,0x0f,0x8b,0x6f,0x6e,0x64,0x04,0xbb,0x12,},{0xf1,0xb7,0x97,0xde,0xd8,0xa6,0x94,0x2b,0x12,0x62,0x68,0x48,0x34,0x0f,0xb7,0x19,0xfc,0xdd,0xaf,0xd9,0x8f,0x33,0xe2,0x99,0x2d,0x35,0x7b,0xfd,0xd3,0x59,0x33,0xc7,0xac,0x56,0x1e,0x5b,0x2f,0x93,0x94,0x64,0x33,0x8c,0x56,0x66,0x85,0x4c,0xa8,0x85,0xc4,0xd0,0x46,0xeb,0x2c,0x54,0xe4,0x8a,0x1b,0x5e,0xd2,0x66,0xad,0x34,0xde,0x05,},"\x55\x5b\xb3\x9c\x18\x99\xd5\x7c\xab\xe4\x28\x06\x4c\x2d\x92\x5f\x5f\xc4\xcf\x70\x59\xb9\x5f\xb8\x9a\x8e\x9e\x3a\x7e\x42\x6c\x6c\x92\x2d\x9e\x4d\x76\x98\x4e\xa2\x38\x3c\xab\xb4\xf2\xbe\xfd\x89\xc1\xf2\x0e\xaa\x8a\x00\xdb\xe7\x87\xcf\xa7\x0a\xe2\xae\x6a\xa9\x03\x31\xcb\xbe\x58\x0f\xa5\xa0\x21\x84\xed\x05\xe6\xc8\xe8\x9d\x57\x6a\xf2\x8a\xee\xaf\x7c\x4e\x25\x00\xf3\x58\xa0\x09\x71\xa0\xa7\x59\x20\xe8\x54\x84\x9b\xf3\x32\x14\x29\x75\x40\x4f\x59\x8c\x32\xe9\x69\x82\x04\x3d\x99\x2b\xcd\x1a\x4f\xe8\x19\xbb\x56\x34\xad\x03\x46\x7a\xfc\x4c\xe0\x50\x73\xf8\x8b\xa1\xba\x4a\xe8\x65\x3a\x04\x66\x5c\xf3\xf7\x16\x90\xfe\x13\x34\x38\x85\xbc\x5e\xbc\x0e\x5e\x62\xd8\x82\xf4\x3b\x7c\x68\x90\x0a\xc9\x43\x8b\xf4\xa8\x1c\xe9\x01\x69\xec\x12\x9e\xe6\x3e\x2c\x67\x5a\x1a\x5a\x67\xe2\x7c\xc7\x98\xc4\x8c\xc2\x3f\x51\x07\x8f\x46\x3b\x3b\x7c\xc1\x4e\x3b\xcf\xd2\xe9\xb8\x2c\x75\x24\x09\x34\xcb\xdc\x50\xc4\x30\x8f\x28\x2f\x19\x31\x22\x99\x56\x06\xf4\x01\x35\x10\x0a\x29\x1c\x55\xaf\xdf\x89\x34\xeb\x8b\x61\xd8\x14\x21\x67\x41\x24\xde\xc3\xb8\x8f\x9a\x73\x11\x0a\x9e\x61\x6f\x5b\x82\x6b\x9d\x34\x3f\x3a\xc0\xe9\xd7\xbd\xf4\xfd\x8b\x64\x8b\x40\xf0\x09\x8b\x38\x97\xa3\xa1\xcd\x65\xa6\x45\x70\x05\x9b\x8b\xc5\xc6\x74\x38\x83\x07\x4c\x88\x62\x3c\x1f\x5a\x88\xc5\x89\x69\xe2\x1c\x69\x2a\xca\x23\x68\x33\xd3\x47\x0b\x3e\xb0\x98\x15\xe1\x13\x8e\x9d\x06\x50\xc3\x90\xee\xe9\x77\x42\x21\x93\xb0\x09\x18\xbe\x8a\x97\xcc\x61\x99\xb4\x51\xb0\x5b\x57\x30\xd1\xd1\x33\x58\xcf\x74\x61\x06\x78\xf7\xac\x7f\x78\x95\xcc\x2e\xfc\x45\x6e\x03\x87\x3b"}, +{{0x81,0xda,0x16,0x8f,0x02,0xd4,0x6b,0xb8,0x7c,0xda,0x84,0x5d,0xa4,0x3f,0x8a,0x6c,0xba,0x2c,0x01,0x68,0x78,0xd6,0xf4,0x9c,0x6f,0x06,0x1a,0x60,0xf1,0x55,0xa0,0x4a,},{0xaf,0xf8,0x6e,0x98,0x09,0x3c,0xa4,0xc7,0x1b,0x1b,0x80,0x4c,0x5f,0xe4,0x51,0xcf,0xdf,0x86,0x82,0x50,0xde,0xa3,0x03,0x45,0xfa,0x4b,0x89,0xbb,0x09,0xb6,0xa5,0x3b,},{0x4a,0xac,0xa9,0x47,0xe3,0xf2,0x2c,0xc8,0xb8,0x58,0x8e,0xe0,0x30,0xac,0xe8,0xf6,0xb5,0xf5,0x71,0x1c,0x29,0x74,0xf2,0x0c,0xc1,0x8c,0x3b,0x65,0x5b,0x07,0xa5,0xbc,0x13,0x66,0xb5,0x9a,0x17,0x08,0x03,0x2d,0x12,0xca,0xe0,0x1a,0xb7,0x94,0xf8,0xcb,0xcc,0x1a,0x33,0x08,0x74,0xa7,0x50,0x35,0xdb,0x1d,0x69,0x42,0x2d,0x2f,0xc0,0x0c,},"\x6b\xc6\x72\x6a\x34\xa6\x4a\xae\x76\xab\x08\xc9\x2b\x17\x9e\x54\xff\x5d\x2e\x65\xeb\x2c\x6c\x65\x9a\xe8\x70\x3c\xc2\x45\xcb\xc2\xcf\x45\xa1\x2b\x22\xc4\x68\xae\x61\xfd\x9a\x66\x27\xad\x06\x26\xc9\xb1\xe5\xaf\x41\x2c\xb4\x83\xea\xee\x1d\xb1\x1b\x29\xf0\xa5\x10\xc1\x3e\x38\x02\x0e\x09\xae\x0e\xee\x76\x25\x37\xa3\xe9\xd1\xa0\xc7\xb0\x33\xd0\x97\xfd\xc1\xf4\xf8\x26\x29\xa9\xde\x9e\xf3\x8d\xa1\xcf\x96\xa9\x40\x35\x7d\x5f\x2e\x0e\x7e\x8d\xbc\x29\xdb\x72\x8a\x1e\x6a\xad\x87\x6e\x5e\x05\x31\x13\xd0\x64\x20\x27\x2b\x87\xcf\x0c\x40\xdf\xe0\x3a\x54\x4d\xe9\x6c\x7a\xea\x13\xba\x00\x29\xb5\x7b\x48\xd9\x9d\xcc\x6a\x65\x04\x92\xd7\x8c\x4c\xdd\x1b\x28\xe1\xa1\x15\xa7\xe3\xe7\xa7\xcb\x21\x33\x3d\x4f\xf8\x08\x58\xdf\xb6\x77\x82\xc1\x63\x54\xb8\x71\x65\x96\x56\x0d\x7d\x8e\x38\x9e\xb1\x5a\x05\x2a\x0b\xf5\xd1\x6e\xb5\x4f\xb3\xe4\x97\x3a\xd4\x98\x4e\x72\xa1\x87\xf5\x34\x7d\x5b\x26\x2c\x32\xb1\x64\x7e\x42\xb6\xa5\x38\x37\x09\x6c\xc7\x8c\x2a\x05\xce\x1c\x6e\x12\x49\x3a\x03\xf1\xa6\x67\x58\x4c\xb9\x7f\x4f\xcd\x57\xee\x94\x4c\x65\xb7\xee\xd2\x5f\x7a\xe0\xf3\xf6\xce\xde\x17\x3f\xdf\xac\xf5\xaf\x1d\xb1\x43\x73\x0d\x18\x09\x66\x64\x91\x4b\xa4\xcf\xc6\x96\x6f\x39\x20\x22\x78\x1c\x66\xa9\x41\x7c\xa2\x68\x0b\x51\xf6\x3e\x4f\xba\x42\x4e\xcf\xdb\xc6\xa2\xf0\x17\x87\xd0\xe7\x48\x4f\x8a\x8a\xb3\x90\xae\xaa\x6d\x1f\x7e\xd3\x25\xd8\x2f\xea\xa1\x69\x2a\x49\x84\xfa\xe4\x3d\xa8\x73\x29\xb0\x45\xda\x8f\x0a\x4f\x56\xb6\x95\xaa\x93\x5d\xe1\x52\xce\x03\x85\x15\x37\x20\x97\x9a\x2b\x70\x06\xd4\x05\xfc\xb0\xfb\xa0\x9e\x23\xb8\x5f\xd1\x9b"}, +{{0xaf,0x2e,0x60,0xda,0x0f,0x29,0xbb,0x16,0x14,0xfc,0x3f,0x19,0x3c,0xc3,0x53,0x33,0x19,0x86,0xb7,0x3f,0x3f,0x9a,0x0a,0xec,0x94,0x21,0xb9,0x47,0x3d,0x6a,0x4b,0x6a,},{0xc8,0xbf,0xe2,0x83,0x58,0x22,0x19,0x9c,0x61,0x27,0xb8,0x06,0xfa,0xbe,0xef,0x0c,0xb9,0xff,0x59,0xf3,0xc8,0x1f,0xf0,0xcb,0x89,0xc5,0x56,0xf5,0x51,0x06,0xaf,0x6a,},{0x50,0xf9,0xf9,0x41,0xa8,0xda,0x9f,0x62,0x40,0xf7,0x6d,0x2f,0xa3,0xb0,0x6d,0xd6,0xb2,0x29,0x2e,0xd3,0x2d,0x1c,0x05,0x21,0x80,0x97,0xd3,0x4d,0x8a,0x19,0xdf,0xe5,0x53,0xf7,0x6a,0xe3,0xc6,0xb4,0xa2,0xed,0x20,0x85,0x21,0x28,0x46,0x15,0x40,0xde,0xcf,0x41,0x8f,0x52,0xd3,0x8e,0x64,0x03,0x7e,0xec,0x77,0x71,0xbd,0x1a,0xfe,0x00,},"\x7d\xbb\x77\xb8\x8b\xda\x94\xf3\x44\x41\x6a\x06\xb0\x96\x56\x6c\x6e\x8b\x39\x39\x31\xa8\x24\x3a\x6c\xab\x75\xc3\x61\xfd\xe7\xdc\x53\x6a\xec\x40\xcd\xed\x83\x29\x6a\x89\xe8\xc3\xbe\xf7\xd7\x87\xcf\xc4\x94\x01\xa7\xb9\x18\x3f\x13\x8d\x50\x00\x61\x9f\xf0\x73\xc0\x5e\x2f\x84\x1d\x60\x08\x35\x8f\x10\xa2\xda\x7d\xcf\xac\x3d\x4d\x70\xc2\x0d\x2e\xc3\x4c\x7b\x6d\x5c\xd1\xa7\x34\xd6\xbb\xb1\x1c\x5f\xd8\xd2\xbc\xe3\x2a\xc8\x10\xef\x82\xb4\x18\x8a\xa8\xea\x3c\xfc\x30\x32\x23\x3d\xc0\xe2\x60\x0e\x9d\xb6\xe1\x8b\xc2\x2b\x10\x04\x4a\x31\xc1\x5b\xac\xea\xf5\x55\x4d\xe8\x9d\x2a\x34\x66\x80\x7f\x24\x44\x14\xd0\x80\xff\x29\x63\x95\x6c\x6e\x83\xc8\xe1\x44\xed\x00\x66\x08\x8b\x47\x6d\xdc\xb5\x64\x40\x34\x47\xd9\x15\x9f\x90\x89\xab\xa2\xb4\xd5\x57\x5c\x4d\x8a\xe6\x6f\xc8\x69\x0e\x73\x49\xed\x40\x83\x2e\x63\x69\xc0\x24\x56\x3e\xc4\x93\xbf\xcc\x0f\xc9\xac\x78\x7a\xc8\x41\x39\x7f\xe1\x33\x16\x72\x83\xd8\x0c\x42\xf0\x06\xa9\x9d\x39\xe8\x29\x79\xda\x3f\xa9\x33\x4b\xd9\xed\xe0\xd1\x4b\x41\xb7\x46\x6b\xce\xbb\xe8\x17\x1b\xc8\x04\xa6\x45\xd3\x72\x32\x74\xa1\xb9\x2b\xf8\x2f\xd9\x93\x35\x87\x44\xde\x92\x44\x19\x03\xd4\x36\xfd\x47\xf2\x3d\x40\x05\x2a\x38\x29\x36\x7f\x20\x2f\x05\x53\xb5\xe4\x9b\x76\xc5\xe0\x3f\xa6\xce\x7c\x3c\xf5\xee\xb2\x1d\xe9\x67\xbe\xc4\xdd\x35\x59\x25\x38\x4e\xbf\x96\x69\x7e\x82\x37\x62\xba\xc4\xd4\x3a\x76\x7c\x24\x1a\x4c\xef\x72\x4a\x97\x0d\x00\xff\x3a\x8a\xb3\xb8\x3e\xed\x84\x00\x75\xc7\x4e\x90\xf3\x06\xe3\x30\x01\x32\x60\x96\x21\x61\xe9\xd0\x91\x0d\xe1\x83\x62\x2c\xe9\xa6\xb8\xd5\x14\x42\x80\x55\x0f\xc7"}, +{{0x60,0x5f,0x90,0xb5,0x3d,0x8e,0x4a,0x3b,0x48,0xb9,0x7d,0x74,0x54,0x39,0xf2,0xa0,0x80,0x7d,0x83,0xb8,0x50,0x2e,0x8e,0x29,0x79,0xf0,0x3e,0x8d,0x37,0x6a,0xc9,0xfe,},{0xaa,0x3f,0xae,0x4c,0xfa,0x6f,0x6b,0xfd,0x14,0xba,0x0a,0xfa,0x36,0xdc,0xb1,0xa2,0x65,0x6f,0x36,0x54,0x1a,0xd6,0xb3,0xe6,0x7f,0x17,0x94,0xb0,0x63,0x60,0xa6,0x2f,},{0xdd,0x02,0x12,0xe6,0x32,0x88,0xcb,0xe1,0x4a,0x45,0x69,0xb4,0xd8,0x91,0xda,0x3c,0x7f,0x92,0x72,0x7c,0x5e,0x7f,0x9a,0x80,0x1c,0xf9,0xd6,0x82,0x70,0x85,0xe7,0x09,0x5b,0x66,0x9d,0x7d,0x45,0xf8,0x82,0xca,0x5f,0x07,0x45,0xdc,0xcd,0x24,0xd8,0x7a,0x57,0x18,0x13,0x20,0x19,0x1e,0x5b,0x7a,0x47,0xc3,0xf7,0xf2,0xdc,0xcb,0xd7,0x07,},"\x3b\xcd\xca\xc2\x92\xac\x95\x19\x02\x4a\xae\xce\xe2\xb3\xe9\x99\xff\x5d\x34\x45\xe9\xf1\xeb\x60\x94\x0f\x06\xb9\x12\x75\xb6\xc5\xdb\x27\x22\xed\x4d\x82\xfe\x89\x60\x52\x26\x53\x0f\x3e\x6b\x07\x37\xb3\x08\xcd\xe8\x95\x61\x84\x94\x4f\x38\x8a\x80\x04\x2f\x6c\xba\x27\x4c\x0f\x7d\x11\x92\xa0\xa9\x6b\x0d\xa6\xe2\xd6\xa6\x1b\x76\x51\x8f\xbe\xe5\x55\x77\x3a\x41\x45\x90\xa9\x28\xb4\xcd\x54\x5f\xcc\xf5\x81\x72\xf3\x58\x57\x12\x0e\xb9\x6e\x75\xc5\xc8\xac\x9a\xe3\xad\xd3\x67\xd5\x1d\x34\xac\x40\x34\x46\x36\x0e\xc1\x0f\x55\x3e\xa9\xf1\x4f\xb2\xb8\xb7\x8c\xba\x18\xc3\xe5\x06\xb2\xf0\x40\x97\x06\x3a\x43\xb2\xd3\x64\x31\xcc\xe0\x2c\xaf\x11\xc5\xa4\xdb\x8c\x82\x17\x52\xe5\x29\x85\xd5\xaf\x1b\xfb\xf4\xc6\x15\x72\xe3\xfa\xda\xe3\xad\x42\x4a\xcd\x81\x66\x2e\xa5\x83\x7a\x11\x43\xb9\x66\x93\x91\xd7\xb9\xcf\xe2\x30\xcf\xfb\x3a\x7b\xb0\x3f\x65\x91\xc2\x5a\x4f\x01\xc0\xd2\xd4\xac\xa3\xe7\x4d\xb1\x99\x7d\x37\x39\xc8\x51\xf0\x32\x7d\xb9\x19\xff\x6e\x77\xf6\xc8\xa2\x0f\xdd\x3e\x15\x94\xe9\x2d\x01\x90\x1a\xb9\xae\xf1\x94\xfc\x89\x3e\x70\xd7\x8c\x8a\xe0\xf4\x80\x00\x1a\x51\x5d\x4f\x99\x23\xae\x62\x78\xe8\x92\x72\x37\xd0\x5d\xb2\x3e\x98\x4c\x92\xa6\x83\x88\x2f\x57\xb1\xf1\x88\x2a\x74\xa1\x93\xab\x69\x12\xff\x24\x1b\x9f\xfa\x66\x2a\x0d\x47\xf2\x92\x05\xf0\x84\xdb\xde\x84\x5b\xaa\xeb\x5d\xd3\x6a\xe6\x43\x9a\x43\x76\x42\xfa\x76\x3b\x57\xe8\xdb\xe8\x4e\x55\x81\x3f\x01\x51\xe9\x7e\x5b\x9d\xe7\x68\xb2\x34\xb8\xdb\x15\xc4\x96\xd4\xbf\xcf\xa1\x38\x87\x88\x97\x2b\xb5\x0c\xe0\x30\xbc\x6e\x0c\xcf\x4f\xa7\xd0\x0d\x34\x37\x82\xf6\xba\x8d\xe0"}, +{{0x9e,0x2c,0x3d,0x18,0x98,0x38,0xf4,0xdd,0x52,0xef,0x08,0x32,0x88,0x68,0x74,0xc5,0xca,0x49,0x39,0x83,0xdd,0xad,0xc0,0x7c,0xbc,0x57,0x0a,0xf2,0xee,0x9d,0x62,0x09,},{0xf6,0x8d,0x3b,0x81,0xe7,0x35,0x57,0xee,0x1f,0x08,0xbd,0x2d,0x3f,0x46,0xa4,0x71,0x82,0x56,0xa0,0xf3,0xcd,0x8d,0x2e,0x03,0xeb,0x8f,0xe8,0x82,0xaa,0xb6,0x5c,0x69,},{0x38,0xa3,0x1b,0x6b,0x46,0x50,0x84,0x73,0x82,0x62,0xa2,0x6c,0x06,0x5f,0xe5,0xd9,0xe2,0x88,0x6b,0xf9,0xdd,0x35,0xcd,0xe0,0x5d,0xf9,0xba,0xd0,0xcc,0x7d,0xb4,0x01,0xc7,0x50,0xaa,0x19,0xe6,0x60,0x90,0xbc,0xe2,0x5a,0x3c,0x72,0x12,0x01,0xe6,0x05,0x02,0xc8,0xc1,0x04,0x54,0x34,0x66,0x48,0xaf,0x06,0x5e,0xab,0x0e,0xe7,0xd8,0x0f,},"\x19\x48\x5f\x52\x38\xba\x82\xea\xdf\x5e\xff\x14\xca\x75\xcd\x42\xe5\xd5\x6f\xea\x69\xd5\x71\x8c\xfb\x5b\x1d\x40\xd7\x60\x89\x9b\x45\x0e\x66\x88\x45\x58\xf3\xf2\x5b\x7c\x3d\xe9\xaf\xc4\x73\x8d\x7a\xc0\x9d\xa5\xdd\x46\x89\xbb\xfa\xc0\x78\x36\xf5\xe0\xbe\x43\x2b\x1d\xdc\xf1\xb1\xa0\x75\xbc\x98\x15\xd0\xde\xbc\x86\x5d\x90\xbd\x5a\x0c\x5f\x56\x04\xd9\xb4\x6a\xce\x81\x6c\x57\x69\x4e\xcc\x3d\x40\xd8\xf8\x4d\xf0\xed\xe2\xbc\x4d\x57\x77\x75\xa0\x27\xf7\x25\xde\x08\x16\xf5\x63\xfa\x88\xf8\x8e\x07\x77\x20\xeb\xb6\xac\x02\x57\x46\x04\x81\x98\x24\xdb\x74\x74\xd4\xd0\xb2\x2c\xd1\xbc\x05\x76\x8e\x0f\xb8\x67\xca\x1c\x1a\x7b\x90\xb3\x4a\xb7\xa4\x1a\xfc\x66\x95\x72\x66\xac\x0c\x91\x59\x34\xaa\xf3\x1c\x0c\xf6\x92\x7a\x4f\x03\xf2\x32\x85\xe6\xf2\x4a\xfd\x58\x13\x84\x9b\xb0\x8c\x20\x3a\xc2\xd0\x33\x6d\xcb\xf8\x0d\x77\xf6\xcf\x71\x20\xed\xfb\xcd\xf1\x81\xdb\x10\x7e\xc8\xe0\x0f\x32\x44\x9c\x1d\x3f\x5c\x04\x9a\x92\x69\x4b\x4e\xa2\xc6\xeb\xe5\xe2\xb0\xf6\x4b\x5a\xe5\x0a\xd3\x37\x4d\x24\x6b\x32\x70\x05\x7e\x72\x4a\x27\xcf\x26\x3b\x63\x3a\xb6\x5e\xcb\x7f\x5c\x26\x6b\x80\x07\x61\x8b\x10\xac\x9a\xc8\x3d\xb0\xfe\xbc\x04\xfd\x86\x3d\x96\x61\xab\x6e\x58\x49\x47\x66\xf7\x1b\x9a\x86\x7c\x5a\x7a\x45\x55\xf6\x67\xc1\xaf\x2e\x54\x58\x8f\x16\x2a\x41\xce\x75\x64\x07\xcc\x41\x61\xd6\x07\xb6\xe0\x68\x29\x80\x93\x4c\xaa\x1b\xef\x03\x6f\x73\x30\xd9\xee\xf0\x1e\xcc\x55\x35\x83\xfe\xe5\x99\x4e\x53\x3a\x46\xca\x91\x6f\x60\xf8\xb9\x61\xae\x01\xd2\x0f\x7a\xbf\x0d\xf6\x14\x1b\x60\x4d\xe7\x33\xc6\x36\xb4\x20\x18\xcd\x5f\x1d\x1e\xf4\xf8\x4c\xee\x40\xfc"}, +{{0x31,0x01,0x0d,0x1d,0x67,0xeb,0x61,0x63,0x48,0xe8,0x47,0x92,0xb9,0x2d,0x5d,0xc1,0x28,0x55,0x3c,0xb5,0x2f,0x63,0x68,0x15,0x9f,0xe7,0xb8,0x16,0xcd,0x0e,0x7c,0x37,},{0x26,0x65,0x43,0xd9,0x67,0x87,0xca,0x90,0x1f,0xcf,0xf0,0x6e,0x6e,0x43,0x44,0x91,0xae,0x09,0x70,0x88,0x0a,0x5a,0x18,0x7d,0x53,0x5e,0xdb,0x19,0xdb,0x5c,0xab,0xeb,},{0x7b,0x1e,0xb6,0x77,0xc3,0xe5,0xe6,0xa8,0xb4,0xba,0x69,0xfc,0xb7,0xf6,0xb1,0x87,0x0e,0x42,0xa8,0xd5,0x89,0x58,0xa3,0x5c,0x67,0x4e,0x2d,0xb8,0x21,0x07,0x48,0x1c,0x4c,0x7b,0x37,0xf0,0xf6,0x89,0xd3,0x9d,0x9f,0x51,0xe1,0x81,0xb1,0x7b,0x11,0x08,0xc1,0x5a,0x3e,0x27,0xb2,0x9d,0xf3,0xa4,0x31,0x5d,0xcc,0x4f,0xaf,0x12,0x22,0x05,},"\x39\xf8\x9a\x5e\x7a\xa5\x30\xb5\x46\x3d\x49\x8f\x80\x35\xb9\x90\x9d\x55\xda\x52\x7c\xdb\xd4\xde\x6d\x22\x83\x79\xf0\x89\xe6\x08\xa9\x20\x7a\x2c\x5b\x9c\x42\x05\x1a\x60\xc8\xca\x3f\xb9\x7a\x1c\x06\xcd\x74\x7d\x9d\x07\x39\x97\x0c\xeb\x88\xce\x52\x6f\x97\x11\x40\xea\x2e\xc2\x1f\x09\x0b\xa0\x75\xbf\x89\x75\xfa\xa5\x08\xb1\xcc\x10\xef\xa4\x94\xdc\x17\x2e\x6d\x3d\x3f\x3f\x75\xdc\x8e\x0e\x96\xf0\x5c\x0c\xcc\xb2\xf9\x6e\x91\x1c\xfa\x7a\x2c\x82\xc9\x84\x50\x18\xbb\x1f\x9d\x75\xf8\x2e\x3d\xfe\x11\x39\x34\x7b\x2a\xc0\x58\xb0\x14\xac\x93\x76\x0c\x90\xf5\x56\x7a\xb5\xc4\xeb\xa0\x4b\x49\xfb\x09\xdd\xad\xd3\x05\xbe\x51\x1d\xfe\x05\xc9\x6e\xbc\x86\xfd\x67\xb5\xd0\xab\x57\xd8\x5f\x4f\xe5\xe2\xf0\xfa\x9d\x88\xa6\x8f\x0f\x6b\x6b\xc8\xbb\x94\x4e\xb3\xc0\xb1\x75\x57\xe5\x5d\x5e\xa1\x87\xd9\x22\xa4\x28\x13\xe6\x90\x57\xc9\xb6\xa7\xf7\x5e\x49\x92\x1b\x70\x79\xe5\x8f\x8a\x63\x71\x9e\xe3\xe1\xad\x10\xcf\x0e\x8a\x70\xc4\xf1\x54\x02\x18\xb7\x04\x94\xbd\x02\x9e\xe0\x2f\xf9\x72\x7a\x7d\x85\xd3\x77\x91\x9e\xc4\x05\x14\x79\xb7\x0f\x7c\xd6\x76\x77\x23\xfe\x42\xc1\xc7\x89\x9c\x2b\x7c\x1f\x70\x2d\xd6\xb4\xd1\x3b\x67\x2d\x48\x8f\x34\xa0\xe9\x69\xdb\x79\xcc\x2c\xb2\x52\x4a\x94\x8a\x8d\xe4\xc5\xb6\x23\xec\xd9\x0d\x6e\x82\xd9\x70\x33\xc1\x25\x63\x7d\x1c\xd8\xc8\x48\x03\xd8\xfb\xc0\x12\x84\x6f\xfe\x48\x4f\x6c\x02\x14\x92\x58\xf9\x46\x2f\xa1\xe9\x9c\x30\x7d\xd0\x06\x2f\xe0\xb6\xf1\x1e\xee\x40\xc2\x62\x9e\xf7\xc0\xf6\xa5\x10\x72\x59\xea\x5b\x9f\xfb\x6f\x29\xf1\x2c\x32\xf7\xb5\x22\x8c\xab\xc9\x86\xab\x66\x45\x0a\xf9\xdc\xc3\xda\x09\xd0\xe0\xb9\xa4"}, +{{0x8f,0xf2,0x39,0x8c,0xd5,0x1f,0x51,0xd4,0xc2,0xc5,0x78,0x69,0xa2,0x21,0x8b,0x84,0x86,0x82,0x20,0x31,0xf4,0x00,0x72,0x9f,0x4a,0xc4,0xd5,0x90,0x9c,0x48,0xba,0xfe,},{0xa5,0xa8,0x87,0x04,0xb6,0x86,0x77,0xbe,0x3d,0x16,0xc3,0xdc,0x00,0x52,0xcf,0xee,0x6e,0x2b,0x30,0xe0,0x86,0x09,0x05,0x9d,0x4c,0xba,0x52,0xc6,0xd9,0x60,0x61,0xfb,},{0x41,0x7a,0x64,0x78,0x29,0xc9,0x28,0x98,0xe5,0x20,0xff,0x53,0x11,0xda,0xa0,0xa1,0x39,0xcd,0x8f,0xff,0xcb,0x25,0xa1,0x8e,0x6d,0x9b,0x50,0xcb,0x52,0xcb,0xc3,0x54,0x24,0xc3,0x9e,0xbb,0xb5,0xd5,0xac,0x6a,0x6d,0x63,0xf1,0xf5,0x3c,0x4d,0xf2,0x12,0xf7,0x02,0x5a,0x8a,0xae,0xf8,0xe3,0x64,0x93,0xc8,0x74,0xc3,0xce,0x34,0x1a,0x0e,},"\x99\x39\x53\xe4\x7a\x34\x11\x88\xbc\x59\x29\x42\xe1\x55\x7a\xf2\x95\x46\xe4\xe9\x36\x8e\x2f\x1a\x5e\xe9\x80\x6e\x2b\xaf\x66\xb6\x19\x01\x91\xfc\x5d\x2b\x7e\x47\xde\x37\xff\x05\x4f\xb2\xbb\xb1\xf0\x31\x68\x4a\xda\x5d\x60\x7a\xdd\xa3\xd6\x54\x33\x12\x2f\xa9\x04\xe0\x45\x6f\xaa\x84\x10\x9b\xbc\x51\x7f\x8a\xd3\x96\x60\x87\x63\x82\xad\xcf\xed\x0f\x76\x20\xcf\x11\x64\x62\x2e\xac\xd9\x1e\xb3\x7a\x85\x96\x46\x2e\xbe\x9e\xbe\x26\xbd\xc1\xe3\x2c\xc3\x4a\xd4\x6f\xb1\xce\xa4\x20\xe7\x3c\x31\x21\x54\x08\xe6\xd3\x54\x25\xf4\x4a\x82\x9b\x13\x2f\x63\x1a\x3f\x6d\xd4\xb8\x73\xa0\x00\x66\x7e\x19\xeb\x22\xff\xfd\x59\x03\xaa\xa7\xd4\xc8\xfd\xf2\x19\x53\xc3\xc6\x17\x8f\x5f\x8c\xb2\xaa\x6b\xff\x92\x89\x4e\xad\x83\x58\x88\xdf\x06\x0a\x3c\x90\x43\x02\x6e\x0e\x2c\xef\x27\x54\x97\xe7\xd1\x05\xdf\x3b\x64\x4a\x98\xf2\x6b\xf0\x01\x05\xc9\x94\x13\xee\x0a\xf8\x85\x19\x54\xd6\x5c\xeb\x8d\x79\xad\x30\x71\xb8\xbb\x87\xf0\xb1\x97\x43\xd2\x55\x6f\xfd\x98\x19\x83\x0b\x6e\xeb\xf7\xec\xc7\xe0\x45\x66\x1f\x43\x57\x0c\xe9\xfd\xbb\xe2\xd2\x52\x40\x6f\xa9\x0d\x04\x23\x6f\x22\x2c\x42\x9e\xc1\x6b\x12\x87\x22\x4a\xda\x1a\x53\x21\x61\xae\x8b\x48\x1b\xca\xb8\xd4\x7a\xfb\x3e\xd0\x44\x5b\x30\x60\xfd\x67\x59\x17\x98\x56\xf4\x08\x5c\x1e\x58\x5f\xd7\xc1\x40\x97\x99\xaf\x69\x3c\xf4\x27\xbd\x1d\x3d\xc1\x0b\x5a\xe3\x44\x7a\x8d\x2a\x18\xdc\x3a\x12\xa6\x86\x0b\x22\x17\x5d\xd5\xeb\x53\xa0\x95\x04\x32\xe2\xd7\xae\xfe\xce\x8a\xf0\xad\xe3\xd8\x56\x77\x43\xde\x43\x69\x0f\x2d\x25\x37\x23\xc5\xd7\xe4\x8b\xd3\x0d\x29\x37\x59\x37\x01\xce\xcd\xe9\x15\x4b\x76\x65\xcb\x61\x1d\x7d"}, +{{0xef,0x81,0x6c,0x8f,0x5e,0xc3,0x4e,0xf4,0x1f,0x68,0x83,0x1d,0x90,0xcd,0x29,0xe5,0x2d,0xe8,0x97,0x37,0x82,0xd0,0x03,0xee,0x4e,0xda,0xda,0x2a,0xda,0x26,0x91,0xd6,},{0x47,0xf9,0xb3,0x63,0xa8,0x8a,0x45,0x05,0x3a,0x05,0xbb,0x72,0x16,0x08,0x52,0xbf,0xe8,0xf7,0xdf,0xef,0xc2,0xf3,0x72,0x83,0xde,0x34,0x67,0x52,0xca,0xf0,0x92,0xcc,},{0x65,0xc5,0xd1,0x0e,0xa7,0xbf,0xdb,0xb3,0x8d,0x55,0x36,0x4a,0x99,0x68,0xf8,0x2b,0x54,0x82,0x24,0xdf,0xf3,0x36,0x3b,0x2d,0xdc,0xf5,0x85,0x16,0x3d,0xea,0x27,0xdc,0x63,0xb0,0x56,0x3e,0xb1,0xa8,0xdf,0xbe,0xe9,0x51,0xd3,0xc9,0xb3,0x3f,0xcd,0x6b,0xbf,0x09,0x21,0xc3,0xab,0xb2,0x17,0x86,0xb2,0x29,0x06,0x9b,0xd9,0xca,0x00,0x0a,},"\x95\x93\xc3\x5c\xde\xc5\x35\xbe\xbb\x69\x65\xda\x68\xea\xb0\xb6\x46\xbf\xfc\xfb\xd0\x48\x83\xbc\x4c\xef\x90\xd5\xd0\x1f\x01\x8c\x63\xc9\xb0\xdd\xfb\x3c\xef\x5e\x78\x62\x84\xd5\x21\x8c\xaa\xaf\x06\x0e\x92\x88\x95\x2f\x16\x30\x1e\xd8\xa4\xc1\xbc\xee\x25\x63\x56\xa0\xc8\xbd\xa3\x59\xfb\xaa\x27\x82\xb1\x0c\x86\xd1\x8e\x20\xf7\xa0\xec\x99\xb2\x7a\x0b\x4d\xbe\xfc\x0a\x26\x2a\x3b\xf6\x8f\xe8\x14\x44\xdc\xae\x5f\x69\x3e\xb0\xf1\x6e\x6e\xe0\x3f\x8f\xcb\xf3\xa3\x39\x81\x46\xd2\x0e\xc4\xd2\x65\x77\x61\xfd\x03\x20\xfe\xe7\xea\x70\x3c\x49\xa6\xa5\x43\xbc\x9b\xba\x91\x1e\x79\x25\x03\x87\x10\xe8\xc3\x65\x52\xd4\x76\xd6\x02\x7f\x58\xb2\xc5\x2b\xa5\x1a\xd6\x5e\xa4\xf0\x39\xc7\x8f\x96\xb8\x89\x10\x2b\xb4\xbd\xd6\x9b\x68\xe9\xc3\xd4\x5b\x51\x76\xa2\xd8\x2b\x0b\x95\xdc\x32\x10\x16\x37\x0d\xae\x30\xc3\x93\x65\x15\xdb\x04\x64\xc4\x17\x74\x30\x1c\x74\xe4\x2d\x89\xb8\xbf\x4b\x9c\x19\xed\x55\x4b\x12\xfe\xba\xc0\xf6\x0d\xdb\x32\x19\xcc\xc5\x60\x35\x31\xdb\xf2\xeb\x5f\x29\x34\x25\xd7\x2c\xce\xfa\x0c\x7f\x14\x4a\xba\x89\x34\x7b\x29\x6b\xe8\x7f\xf1\x89\x94\xb4\xa0\xc7\x0c\x93\x0f\x05\x93\x03\xb5\xdd\x4c\x8f\xe1\xe6\xbb\xc3\xcd\x68\xc6\xc0\xd8\x42\x46\xdc\x6e\x61\x40\xa2\xab\xd1\x78\x0b\x13\xf1\x59\x4a\x60\x19\xd1\x77\x8b\x7c\xbb\x3a\x3e\x3a\x34\xbf\xae\x72\x97\xf0\xb3\xed\xc3\x76\x94\x1c\x32\x35\x2a\x4b\xe3\x14\xb8\x4a\x9d\x8d\x6d\x7f\x1f\x38\xa0\xad\x37\x98\x02\x0a\xa2\xa3\x31\xa4\x02\xbe\x9c\x70\x44\x84\x74\x4a\x73\x0c\xbd\xed\xcb\x90\x4b\x6f\xde\x70\x8f\xbd\x14\xbf\xdc\x29\xef\xd4\x61\xd1\xd0\xb5\x82\x5d\xe0\xbc\x79\x42\x2b\x69\xa2\x72\x2f"}, +{{0x45,0xeb,0x0c,0x4d,0xfa,0xfa,0x2a,0x76,0x90,0xef,0x57,0x9c,0x09,0x54,0x56,0xce,0xed,0xcd,0x32,0xf0,0xb6,0x14,0x4d,0x0c,0x38,0x0f,0x87,0xfb,0x74,0x4a,0x0b,0x1f,},{0xfc,0x85,0x63,0x2c,0x98,0x38,0x4b,0x5f,0x96,0x82,0xae,0xd9,0xcd,0x66,0x4c,0xf1,0xf4,0x8e,0x58,0x8b,0xe2,0xd5,0x68,0xe5,0xc7,0x34,0x49,0x4d,0xf4,0xc7,0x12,0xb8,},{0x55,0x85,0x1d,0xe8,0xe1,0x09,0x2f,0x78,0x94,0x4f,0x6c,0x6d,0xd9,0x5b,0xf0,0x7e,0x2d,0xbc,0x8d,0xf7,0xf5,0x7a,0xd5,0x76,0x82,0x9b,0x97,0x8e,0x3a,0xf5,0x8a,0x7a,0x8e,0x94,0xed,0x4d,0xcc,0xbc,0x01,0x82,0x46,0x7e,0xdf,0x0b,0xad,0x4b,0xae,0x7c,0xa8,0x4a,0xa9,0xa0,0xc1,0x7c,0x61,0xa9,0xe0,0xdd,0xff,0x1d,0x75,0x25,0xd7,0x04,},"\x6f\x66\xd8\x47\x40\x5a\x03\xd7\xbd\x6f\x8d\x28\x97\xdb\xdf\x04\xe7\x6d\x7d\xf2\xd9\x47\x0a\x49\x96\xb7\xdd\x6d\xb8\x85\x00\xf8\xf4\xf8\x3e\x96\x0e\x21\x9a\x24\x86\xe2\x45\x45\xad\xd1\x36\x14\x55\x04\x14\xd8\x27\xc4\x1a\x9b\x08\x31\x8d\xaf\x01\xb1\x52\x14\xc6\x4a\x42\x66\xcb\xf8\xa5\x71\x7a\xda\x3e\x62\xc2\x67\x29\x07\x3e\x16\xdd\xbd\x66\xf2\xd5\x20\xe1\xe0\x99\x35\xde\x05\xe4\xdb\x11\xc3\x96\xd4\x77\x01\x0a\xec\x66\xaa\xfb\x76\x2e\x69\x23\x8d\x0b\x9e\x76\xb4\x52\x45\x4b\xf9\xe4\x51\xe7\x6a\xc7\x9e\x69\x90\xd4\x1b\x93\x2b\xc3\x29\x17\x09\x37\x83\xc9\x1b\xc9\xcf\x0b\xbe\x3b\x51\x40\x70\xa1\xe6\x92\xff\x34\xfd\x06\xb6\x6e\xa1\x1f\x39\xe1\x0a\xf9\x33\xee\x96\xd8\xe9\xb6\x77\xcb\x03\x73\x7e\x79\x64\xee\xaa\x72\x5f\x12\x12\x07\xf9\xc1\xb2\x6a\x96\xc6\x16\xdf\x7c\xb7\xca\xef\x47\xbd\xa9\x01\x36\x8f\xf2\xea\x58\x6e\x42\x2e\x65\xbf\x21\xa6\x91\xbd\xd2\xc1\x3e\x67\xff\xf5\x8c\xfb\xfe\xd8\x17\x82\x04\x9d\xaf\xa0\xf7\x27\xdf\x88\x62\x3f\x2f\x7e\x8f\x26\x2d\xaf\x93\x95\x42\xa1\x87\xb8\x72\x0a\x9b\x6b\x2b\x09\x89\x0e\x54\x87\x6b\x28\xa4\x38\x74\xab\xbe\x3b\xfa\x98\x1f\x81\x38\xb7\x72\xc5\xd5\x17\x36\x88\x5f\x86\xac\xac\x22\x15\xa0\xb0\x10\xdf\xc2\xc6\xb1\x50\x84\x5d\x4f\x82\x96\x25\x25\x86\xa3\xe1\x15\xf3\x03\xc3\xd8\xa5\x82\xe2\x0f\xd2\xd4\x3f\x6c\x44\x6e\x5d\x00\x28\x0e\xc1\x79\x82\x3b\x7f\xb4\xc1\xb0\xfe\xb9\x4e\xb4\xef\x17\x07\xf5\x18\x4e\x3b\x52\x46\x1a\x75\x62\xd1\xf3\x07\xcb\x75\x1c\xdb\xbf\x6e\xae\x49\xff\xae\x91\x86\x23\x58\xe7\x4e\x95\x48\x82\x2b\x8a\x04\x9f\xec\x6b\xf4\xc7\xa9\x9c\xab\xbe\x09\x20\x65\x77\xb6\x57\xe3\x1f"}, +{{0x70,0x9d,0x2e,0x19,0x90,0x06,0xf5,0x36,0x9a,0x7a,0x0b,0xdd,0x34,0xe7,0x4d,0xc7,0x84,0xbe,0x33,0x88,0x0e,0xa3,0xc5,0xdd,0x10,0xed,0x5c,0x94,0x45,0x1e,0x79,0x72,},{0x06,0xf9,0x89,0x20,0x2b,0xa2,0xcb,0xc9,0xc1,0x50,0xbe,0x61,0x12,0x62,0xac,0xa0,0x0c,0x45,0xf0,0x12,0xf8,0x9f,0xba,0xf8,0x9f,0x8c,0xec,0xcb,0xa0,0xb1,0x93,0x4a,},{0x62,0x9b,0xf9,0x7b,0x0c,0x78,0xee,0x6a,0x9c,0x87,0x59,0xfb,0xea,0x28,0x22,0x4e,0x27,0xab,0xbb,0x6c,0xbe,0x4d,0xea,0x5b,0xb7,0x97,0xe6,0xe0,0xfe,0x80,0xc9,0x13,0xf9,0x53,0xe3,0xa9,0xb6,0x23,0x35,0x2d,0x13,0xac,0xf4,0xce,0x62,0x50,0xfb,0x02,0x9a,0x1e,0x19,0x8d,0x72,0xbd,0x5e,0x74,0x02,0xe6,0x0e,0x9e,0x48,0xca,0x35,0x01,},"\x62\xf0\x03\x14\x0f\xa0\x9e\x03\x87\xd1\x87\xa0\xff\x96\xc4\x56\x3d\xf9\xf4\xe2\x8c\x22\x82\xc0\x18\x3a\xc3\xee\xde\x13\x12\x35\x49\x21\xf7\x80\xfc\xa5\x36\x1d\x30\x68\xd2\x99\x49\x63\x0b\x75\x30\xcd\x59\x14\xac\xe0\x46\x8d\x01\x4b\x6f\x53\xd8\x39\xb8\x2e\x38\x81\x7d\xbf\x2d\x83\x92\xc3\xce\x34\x24\xea\xb8\x6a\x24\xd8\x04\xc7\xac\xb1\xce\x7a\xcf\xe0\xa1\xcd\xa4\x39\x39\x24\x28\x31\x05\xda\x4a\x77\x41\x19\x6e\x02\x75\x50\x04\x7f\x85\xb7\xa0\xa0\x1d\x45\x41\x24\xef\xc0\xe2\x99\xf0\xef\x9a\xd1\x43\x50\x54\x30\x53\x48\x22\x61\x52\x8b\xaa\x56\xe6\x59\x99\xac\x80\x2c\x00\xa3\x36\x26\x7c\x63\x51\x06\xb2\x64\x03\xc1\x9f\x39\x1d\x53\xbd\x82\x86\x1d\x6d\x48\xa4\x38\x0b\x30\x43\xaa\x91\xd6\x49\x53\x68\x81\x20\x4e\xcc\xb0\xde\x20\xd4\x3e\x5a\x37\x55\xb7\xf6\x00\x91\x6e\xcc\xae\x42\xa0\xc9\x05\x3b\x46\x2d\x94\x17\xa1\x3d\x67\xd7\x78\x26\x4a\x89\x6e\x8e\xaf\x90\xba\xf6\x6d\x29\xe5\x43\x8a\x71\x67\x81\x12\x3a\x89\xfa\x9b\x8b\xee\xf9\x1d\x96\x5a\xf2\xf4\xa1\xa5\xbd\x5d\x2e\x2a\xaf\x46\xd5\xc9\x4b\x77\x09\xcd\xd3\x8d\x05\xfe\xee\x4b\xfb\x76\xa3\x59\x07\x7c\x16\xbc\x4b\xe9\x11\x6e\x69\x00\x12\x71\xcd\xa5\x65\xbc\x19\xbf\x47\xd4\xf9\x86\xbd\x9c\x0d\x18\x4c\xd8\xa3\x52\x0c\xa1\xbd\xb4\xb5\x05\xaa\xf7\xcb\x4e\xc9\xf9\x47\x89\x77\x9d\x30\x71\x4e\x79\x11\x6d\xd5\x01\x9d\x59\xb2\x8b\x17\xda\xd9\x6f\x4e\x21\x55\xad\x9c\x61\x27\x4a\xdd\xc6\xb6\x38\x10\x95\x04\xe9\xed\x19\xf4\xed\xa5\x37\x77\x62\x64\x8c\x40\x98\x22\x4e\x33\x91\x04\x3e\x4c\x2a\xd5\x91\x65\x4c\x9e\x7f\x97\x4e\xfd\xf0\xb0\x50\x4b\x6f\xa5\xf6\x46\xce\xcf\x44\xcd\x37\x24\x12\x37\x25\x05"}, +{{0x51,0x51,0x61,0x74,0x21,0xaa,0xdc,0x9c,0x95,0xa4,0x42,0xb4,0x5e,0x7f,0xf6,0xde,0x06,0xa2,0xc7,0x33,0xb8,0x5b,0xd7,0x89,0xfb,0xad,0x41,0x4e,0xe3,0xc9,0x1a,0xdd,},{0x14,0x94,0x1d,0x55,0x97,0x61,0xb3,0x0a,0xb0,0xa8,0x6d,0x47,0xe0,0xf7,0xd1,0x89,0x6b,0x33,0x78,0x45,0x27,0xc8,0x0a,0xf4,0x1c,0xb8,0x48,0x10,0xcb,0xff,0x9d,0xbf,},{0xfa,0xe4,0x77,0x3b,0x33,0x44,0x60,0xc7,0x7b,0xf0,0x1e,0xc6,0x36,0x6c,0x4f,0xe6,0x1c,0x0c,0xab,0x57,0xd8,0xa4,0xb0,0x39,0x09,0xc6,0x19,0xe1,0x1e,0xe3,0x46,0x1c,0x13,0xfa,0x21,0x57,0x6f,0x63,0x87,0x0e,0x42,0x3d,0xd0,0x41,0x81,0xe4,0xa7,0x01,0x3a,0x75,0x24,0xf2,0x46,0xfe,0x33,0x85,0x3c,0x67,0x41,0x62,0xa7,0x81,0x51,0x04,},"\x21\x6e\x9d\x40\xbc\xdc\x3b\x26\x50\x18\x8d\x12\x1c\x9f\x8e\xf2\x9e\x91\x4f\xac\xd0\x22\xfe\x01\xb9\x0e\xd1\x12\x25\xf2\xeb\x93\x53\x8e\x5f\xce\xe5\xab\x80\x45\xe9\x19\x9a\xa7\x6a\x16\xbd\xd0\x61\x68\x05\x66\x0e\x24\x7f\xec\xd7\xe2\x28\x21\xb6\x9b\x1f\x8e\x8a\x58\xac\x3f\xb8\x56\x91\xd7\x5d\x59\x57\xa1\xda\xf5\x3f\xf9\xee\x64\x76\xd7\xc4\xbc\x54\x1e\x6a\xd3\x8e\x3a\x34\xea\x90\xfc\x52\xa4\x8b\x93\x99\xf9\x2d\x17\xc9\xbb\x0d\x7f\xc3\x10\x4c\x55\xd0\xef\xb4\xea\x5b\x83\x1f\xf9\x49\x0b\x3f\x79\xf4\xd9\xd6\x99\x59\x4b\x74\x15\x66\xf2\xb5\x0a\x8f\xc7\x8c\xc4\x03\xfa\x40\xf5\xab\xb6\x63\x8a\x32\xf4\x49\xa8\xb3\xef\x02\x9c\x40\x2f\x46\x93\x1a\xd2\xbd\x3e\x8e\x68\x31\x08\x71\x4c\x98\x9a\xe2\x16\x89\xe9\xc4\x44\xb9\xf5\x5b\x81\x11\x9b\xb5\x03\x5b\xcf\x73\xe9\x7c\xe4\x3a\x22\x18\xc7\xbc\x3e\x43\x0d\x1e\x81\x4f\x34\xde\xe0\x57\x26\x5d\x31\x94\xb9\xf4\x38\x75\xd8\x38\x1f\x52\x5f\x78\x57\x6e\x64\xce\x69\x25\x84\xfa\xa3\x0f\xb7\x43\xa1\x2d\x1b\x77\x61\x4d\x2e\x10\xa6\xb8\x56\xb5\x2b\xe2\x7c\xdb\x63\x0b\xa1\xf0\xd3\xa6\xf8\xea\x98\x44\x54\x2e\x58\x4e\xa0\xa2\x77\x75\x27\xd0\xc5\x2a\xca\x94\x9a\xac\xda\x45\xad\x83\xd1\x6d\x5c\x83\xd6\x63\xad\xb7\x9c\xad\x6f\x3e\x39\xe9\x90\xfe\x28\x2a\x14\xc3\x53\xaa\x23\x79\xd7\xf0\x6a\xda\xb7\x4c\xea\x02\x1b\x89\x83\xa5\x7f\x1d\x0c\xf7\x03\x29\x2e\xb0\x5e\xce\x89\xc5\x3f\x3a\x12\x65\x61\x0e\x0c\x1e\xa8\xdd\xd4\x44\xd1\xff\xd6\xbc\x3d\x03\xf0\xa6\xe4\xd0\xdf\x5c\x5b\x8d\xc1\xf9\x5d\x9f\x55\x58\xb1\x18\xaf\xe6\xbe\xa0\xf6\xc2\x93\x13\x63\xf0\x3a\xb3\x4e\x75\x7d\x49\x36\x41\x74\xf6\x58\xef\xbb\xf3\x8d\xc1\x77"}, +{{0x38,0xbe,0xd4,0x45,0x55,0x6d,0xe7,0x44,0x82,0xbf,0x5f,0xec,0x05,0x06,0xf9,0xaf,0x33,0x0b,0x15,0x1e,0x50,0xd4,0x77,0x4d,0xfe,0x85,0x91,0xd7,0xb7,0xe0,0x27,0x6b,},{0x4c,0x0f,0x9c,0x49,0xa4,0x2f,0x40,0x47,0xbf,0xe6,0x88,0x55,0x51,0xc5,0xe4,0xb8,0x56,0xcf,0x77,0x1a,0x67,0xaf,0x3f,0x89,0xdb,0xf6,0x02,0xf9,0xdb,0x92,0x20,0xf3,},{0xf7,0x02,0xd0,0xd4,0x63,0x28,0x2f,0xc7,0xfd,0x5f,0x8f,0x90,0x29,0xb8,0x9c,0x62,0x6c,0xaf,0xd8,0x34,0x50,0xc3,0xbb,0x9d,0xd8,0xf6,0x58,0x9f,0x0c,0x4b,0x4b,0x71,0xf6,0x49,0xea,0x21,0x2e,0x5e,0x33,0x48,0x7c,0x59,0xc1,0x68,0xea,0x3a,0xd8,0x31,0x50,0xf1,0xfc,0xdf,0xe8,0xc5,0x3e,0xba,0x65,0xad,0xc2,0x02,0x3c,0x25,0x83,0x0f,},"\x0f\xf0\x03\x1d\xf0\xbe\xef\xf3\x71\x0c\x6b\x76\x3f\x9b\x8e\xc8\x17\x19\xbf\xa1\x52\x8c\xe4\x65\x19\xad\xf3\xd3\x41\x2d\x93\xfb\x18\x8f\xd4\x97\xd5\xd1\x70\x91\xc0\xf0\x34\x59\x60\xdd\x0e\xb0\xc0\x9f\xc4\x00\x51\x73\x66\x5d\x4d\x97\xf9\x5c\x13\x82\x8b\xc7\x6b\x34\x92\xb8\x7a\x4b\x64\x25\x3c\x8b\x5f\xa4\x7a\xa7\x5f\xa3\xb8\x6d\x5a\xbe\xea\x8d\xe5\x95\x9a\x60\x22\x89\x13\x6f\x60\xa6\x9b\x30\x9e\x77\x3b\x22\x55\xcd\xe1\x9e\xd2\xa2\xe1\x99\xc3\x3d\xb1\x1c\x16\xad\xe0\x8a\x31\x97\x50\xb8\x51\xd9\x2c\x69\x29\x24\xfc\x98\x59\xbe\x52\x34\x31\xcb\xe7\x8e\xc0\x92\xdb\x11\x29\x21\x0e\xbb\xea\xa7\xc2\xa2\xc0\x00\xee\xb1\x05\xca\x03\x01\xa4\x8f\x3e\x45\xfd\xfb\x15\xb2\x75\xcb\xab\x83\xca\x5c\x99\xd7\x37\xa5\x85\x32\x0e\x9e\x3b\x31\x71\x79\xbd\x86\x46\x7f\xa9\x69\x4f\xcd\xb2\xac\x6a\xd3\x6e\xd7\x14\x48\x43\xdb\xc3\x4e\x42\x3d\x35\xaf\xd7\xd8\x97\x2a\x1c\x43\xc1\x99\xa1\x91\xab\xd6\xce\xba\x49\x36\xd3\x95\xc9\x95\xa3\xeb\x13\xcb\x05\x7f\x88\xa9\xdc\x94\x90\xfe\x98\x84\x5e\xe5\xd2\x6a\x89\xfb\x64\x2a\x2a\x51\x6d\xc3\x05\x6c\x54\xd3\x63\x72\x13\x36\x3a\x86\x28\xa4\x2a\x39\x5d\x94\x2b\x95\x4a\x89\xe8\xef\x7a\x74\x4d\x8a\xe5\xad\xac\x88\xc6\x16\xef\xaa\x90\xe2\x07\x72\x05\xa6\x0b\xaf\xfe\xde\x5c\x87\xbb\x14\xde\xad\x30\x62\x29\x49\x5f\x69\x8f\x3e\x49\x06\x16\x96\x6b\x16\x36\x38\x7d\x0d\x86\x18\x3f\x94\x5b\x24\xa9\xdc\xfc\xcf\x4d\x36\x72\x2c\xd1\x2e\xbb\x6b\xd8\xe7\x83\x25\x75\x2a\xfa\x2b\x1a\xbd\x13\xc4\xbd\xbc\xad\xd1\x70\x86\x91\x36\x82\x62\x42\xac\xfb\x72\x1d\xe5\xff\x27\xba\x8a\xa0\xc0\x18\xb2\x25\xed\x34\x04\x80\x3c\xe9\xfa\x2d\x50\x8d\x89\x44"}, +{{0x05,0x54,0x60,0xb3,0x2d,0xd0,0x4d,0x7f,0x4b,0x23,0x11,0xa8,0x98,0x07,0xe0,0x73,0xfd,0x55,0x65,0x65,0xa4,0x77,0x18,0x57,0xd8,0x82,0x79,0x41,0x30,0xa2,0xfe,0x5d,},{0x26,0x0f,0x8f,0xed,0x4b,0xba,0x30,0xb9,0xe1,0x2a,0xd8,0x52,0x3f,0xbb,0x6f,0x57,0xf0,0xa7,0xa8,0x82,0x55,0x00,0x61,0xf1,0xda,0x46,0xfb,0xd8,0xea,0x44,0x22,0x21,},{0x23,0xf4,0xf1,0x62,0x7f,0xba,0xbd,0x78,0x91,0xd7,0xd8,0x48,0x96,0x31,0xc7,0x23,0x1d,0x22,0xde,0x71,0x86,0x4e,0x26,0x2a,0xb4,0xda,0x84,0xea,0x8a,0x13,0xa6,0x0f,0xea,0xc4,0xdc,0xfb,0x18,0x12,0xf1,0x20,0x04,0x44,0xb7,0x75,0xf1,0x21,0xd7,0x26,0x6d,0x75,0x5c,0xe9,0xb6,0xa9,0xad,0x79,0x65,0x59,0xc0,0xa2,0x6b,0x51,0x6d,0x02,},"\x74\x07\xf9\x6e\xe3\xe7\x9c\x69\xd3\x6c\xe1\xf6\x4e\x4f\x18\x86\x55\xea\x68\xb9\x47\xe7\xe2\xbe\x97\xb0\x5e\xbc\x6d\x44\x39\xe9\x50\x27\x6e\xf3\xf0\xe6\xa0\x3d\xd4\x8b\x24\xf6\x69\x29\xb4\x9c\x15\x80\xeb\x46\x88\x07\xe1\xe7\xa2\x5e\xb9\xb9\x4d\xa3\x40\xc5\x3f\x98\x4f\x8b\x81\x60\x3e\xfb\x61\x04\x7b\xf3\xf1\x4b\x68\x6d\x97\x98\x00\x3d\x2f\x68\x58\x9a\x79\xeb\xfa\xd5\x44\x09\xc7\x1c\x90\xff\x67\xc1\x1f\xbd\x76\xcc\x72\xc2\xd1\x45\xf4\x58\xe4\x2f\x88\xb7\x5d\x25\x0e\xad\xca\xfe\x66\xbf\x37\xff\xc8\x37\xb6\x2f\xf0\x06\x68\x5b\x7f\x85\xa9\xd8\x75\xfc\x07\x8c\x82\xe6\x1f\xe3\x5d\x19\x22\x52\x7a\x55\x1d\xab\x62\xf9\xe4\x77\x49\x91\x46\xba\xd9\x12\x20\x3e\x66\x4c\x41\x7c\x36\x79\xc0\x2d\x87\x2a\xba\xc0\x03\x2f\x8c\xc7\x7f\x77\xbf\xe5\x4d\x33\x26\xfd\xee\x92\x76\xa4\x8e\xa4\xeb\x25\x13\x50\x40\x68\x82\xd0\x8c\x83\x0e\x76\x49\xfe\x68\x54\x55\x8a\x75\x13\xab\x2d\x8d\x2a\xc3\xe5\xce\xd8\xa8\x08\xd2\xae\xe4\x54\x77\x9e\xda\xbd\x1a\xa6\x3b\xb1\x9f\x71\x8f\x47\x0b\xdc\x84\x51\xcd\x9b\x29\x49\x41\xe3\x49\x70\x63\xb1\xe3\x9b\x6c\xa1\x84\x56\x2f\xe8\x38\xcb\xfe\xee\x92\x2d\xe2\x4d\xdf\xcf\x98\x82\xc5\xe6\x15\xb1\x1b\xf9\x04\x81\x7f\xbd\x64\x71\x39\xdb\x80\xb4\xe8\xfe\xb3\x7f\x11\xe1\x85\x2d\x7e\x87\x6d\xb9\xcb\x63\xc9\x4d\x7e\xe3\x41\x92\xf7\x20\x0b\x5b\xc7\x7a\x03\x11\xae\x43\xb8\x06\xeb\xd4\xc2\x89\x6c\x53\xf5\x8f\x7e\xbc\x16\x25\xcb\x20\xd7\x10\x7e\xf9\xdb\x0d\xa2\x87\x88\x52\x3d\xe9\x91\xef\x6c\x58\x66\xb1\x8d\x8d\xe8\x3a\x95\x4d\x32\x81\xe0\x6d\xbf\x27\xc4\xf2\x38\x2e\x08\xcd\x0e\x0f\x6e\xba\xe3\xf9\x61\xb7\x7f\xce\x5a\x95\xa9\xb0\x62\x1b\x75\x6f"}, +{{0xe9,0xf6,0xd3,0x1b,0x93,0x69,0x42,0xc5,0x26,0xe0,0xf9,0xec,0x4f,0x5a,0x7a,0xc2,0x5f,0xa7,0x89,0xe0,0xc4,0x34,0xbc,0xd9,0x19,0x9d,0x72,0x0c,0x74,0x3c,0x84,0xc4,},{0x32,0x12,0x6d,0x26,0xe2,0x82,0x31,0xc5,0xb5,0x85,0xb1,0x3f,0x43,0xa0,0x1c,0x6f,0xe5,0x42,0x94,0x6b,0x07,0xd3,0xa9,0x1e,0x57,0xd2,0x81,0x52,0x3f,0x5c,0xb4,0x5c,},{0x7e,0x3b,0x1c,0x4c,0x71,0x6c,0x80,0x8e,0x90,0xb9,0x74,0x45,0x89,0x15,0xf3,0xb2,0x23,0x9c,0x42,0x07,0x71,0x19,0xfe,0x27,0x07,0x88,0xfa,0xe5,0x20,0x57,0x8b,0xd7,0xda,0x64,0x88,0x04,0x41,0x32,0xe1,0xbe,0xf2,0x3e,0x3b,0x23,0xc3,0x4d,0x9c,0x18,0x62,0x74,0x4f,0x28,0xfc,0xae,0xcd,0xa6,0xca,0xc0,0xfd,0x72,0xb9,0x3b,0x6a,0x0f,},"\xe8\x81\x33\xf3\xd1\x76\x42\xd5\xc2\x27\x79\xa8\x53\x16\xba\x0d\xf3\x4c\x79\x2b\x4e\xfe\xe4\x9e\xd7\xdd\x93\xca\x33\x22\xef\x47\xc7\x2e\x5b\x2e\x45\x95\xc7\x78\x00\x43\x4b\x60\x71\x9a\xdf\x54\xe4\xc1\xa3\x4c\x89\xfa\x1e\x27\xee\x8d\x35\xa0\x92\x1f\x97\x55\xac\x4a\x77\xa6\xc1\x68\x4e\xa0\xf5\xc8\xee\x5f\x75\x9c\xe5\x9b\xfe\x83\x15\x80\x0a\x67\xaa\x6c\x64\xdd\xfa\xac\x92\xea\xbe\x6c\x2c\x61\x37\x79\x78\x4b\x3a\xff\xaf\xcc\x62\x0f\x2a\x6d\xc5\xcb\x8d\x8d\xc7\xd7\x4a\xa4\xd7\x94\x94\x67\x84\x94\xe5\xe6\x39\x4c\x43\x3c\x14\x80\x9f\xf4\x0c\x9a\x59\x2d\x0d\x69\x4a\x81\x10\x3b\x44\x53\x1e\x1f\x48\xbc\x13\x96\x5d\x15\xaf\x8b\xf3\x34\x04\x88\xf8\xcd\x58\xf0\x9a\xe1\xa6\x61\x6b\xf8\x5a\xc9\xde\x7e\x0c\x66\x96\xaa\x2f\x1b\xec\x15\xe1\x7a\x44\xda\x4a\x84\xed\xb4\xec\x6d\x77\x24\x77\x88\xba\x0d\xe3\xae\x12\xa1\x55\xcb\xed\xc0\xda\x2f\x56\x8e\xef\x0b\x75\xa8\x77\xea\x5b\x0c\x2c\x0d\x4b\xf2\xc6\x1d\x46\x8a\x46\xfa\xad\xfa\xec\xe3\x5f\xc2\x63\xa9\xbe\x99\x87\xf4\xf7\xf7\x8f\x05\xc7\x07\x78\x43\x78\xc7\xb8\xf7\xda\xf9\xac\x3a\x12\x2a\xad\x39\xa1\x67\x79\x66\xda\x9e\xf2\x86\xc9\xe0\x62\xc4\xf4\x39\xad\x0b\xdd\xea\x26\xe5\x4b\x2f\x73\x88\xe2\x38\xb2\xa6\x49\x28\x45\x0d\x34\x56\x4c\x5a\x44\x7e\x7a\xfb\xbe\xdd\x10\x85\xf1\xf2\x4c\x11\xae\x08\x43\x22\xd1\xa3\x2c\xf8\xaa\x47\x39\x41\xf0\x0d\x56\xb1\x61\x82\x13\xca\xb3\x90\x0a\xa6\x06\x46\x3d\x9f\x80\x0e\x92\x6f\x9f\x42\xd4\xb0\x82\xd8\xc5\xec\x3a\x4a\x02\x5b\x45\xf9\xaa\xdc\x8b\xcb\xd1\x70\x91\xb3\xda\x49\xe9\x45\x3d\xc5\x5e\x89\xb5\xb5\xfe\x6b\x31\xf5\xed\xda\xd1\x0b\x66\x01\x57\x25\x68\xd8\xe2\x05\xd3\x25\x1a"}, +{{0x6b,0xf4,0xca,0xaa,0xbb,0x96,0x85,0x4a,0x38,0xa5,0x72,0xf4,0xce,0x6c,0x78,0x38,0xf7,0xe7,0x50,0x11,0x8c,0x73,0xf2,0x72,0x35,0x82,0x61,0x8e,0x23,0x07,0xf8,0x38,},{0x08,0x12,0x63,0x73,0xd0,0x56,0xf0,0x0e,0x54,0xb8,0xd4,0x3d,0x77,0xc3,0x5f,0x5f,0x91,0x98,0x33,0xe9,0x0d,0x8a,0xaf,0xd6,0xc8,0x24,0x6d,0x27,0x91,0x7a,0xd0,0x91,},{0xd2,0x11,0x3f,0x80,0xd6,0xcf,0x92,0x84,0x86,0xa2,0x50,0xa6,0x79,0xd6,0xe7,0x4b,0x35,0xea,0x9d,0x26,0x06,0x1f,0xa9,0x4d,0x76,0x9e,0x1a,0x8f,0xbf,0xa0,0xa7,0x34,0x22,0x7f,0x55,0x53,0x7e,0x4e,0xbf,0xf5,0x93,0x36,0xdb,0x14,0x1c,0xf5,0xd6,0xd4,0x82,0xa0,0x71,0x1f,0x1e,0x9f,0xc7,0x2f,0xf7,0x09,0x56,0xa1,0x1b,0x4f,0xb9,0x09,},"\x47\x76\xe9\xd6\x00\x85\x48\x1f\xa5\x37\xbf\x29\x5b\xda\xbd\x8b\x1c\xf6\x32\xa8\xcd\x40\xbc\xe6\xbd\x32\x5c\x12\x9f\x97\x70\x00\xe8\x84\x68\xeb\xf2\xdc\x15\x8a\xc0\xf2\x07\x21\x2d\xb0\x0f\xb6\x0b\x8e\xc8\xba\xe2\x29\x37\x2e\x9a\x6b\x01\x53\x0a\x7e\xd1\xbc\x9d\x38\x9e\xc8\x91\x3f\x59\x03\x0d\x5b\x54\xaf\x56\xae\x1c\xcc\x28\xf3\x7c\xc9\x6a\x8e\x53\x20\x4e\x92\xa6\x77\x76\x6a\xdf\xaa\xda\x99\xb0\x28\x1f\x86\x7f\x61\xac\x9f\xf7\xd9\x72\xee\x3e\xd4\x27\xd7\x2f\xaa\xe7\x5d\x4a\xec\x01\xb5\xff\xc3\x70\x61\xb6\xf0\xf7\xe5\x71\x4c\x4c\xf3\x0d\x5b\x73\x1b\x07\x46\x06\x5f\x19\xe4\xc8\x92\x2d\xde\x64\x2f\x80\xfe\x24\xa3\xc8\xdc\xb2\xe5\xf1\xc2\x66\xe2\xaf\x6c\x37\xde\xcf\x55\xa2\xba\xa5\x4f\x0d\x5c\xf0\x83\x93\x70\xc3\xe0\xb4\xe7\x7a\x4f\x36\xbb\xb3\x16\x20\x14\x93\x3a\x4a\x4e\xbc\xae\x8c\x60\x96\x1a\xc6\xdc\xf1\x34\xf3\x08\x28\xd3\x14\x02\xae\x74\xe7\xe8\x51\x3c\x9d\x2a\xd8\xee\x46\xb7\xa9\xd5\x3a\x1f\x87\xeb\xfc\xe0\x4f\x46\x1b\xde\xd1\x74\x9b\x6f\xc4\xc4\xf2\x57\x93\x52\x56\x92\xd7\xa0\xe4\x26\xc8\x4e\x06\x08\x2c\xc3\xe6\xab\xb5\x13\x68\x37\x0c\xbb\x10\x6c\x7a\x08\x97\xf6\x6d\x92\xc9\x73\x9c\xff\x9f\x27\x06\xd6\xa2\x98\x0e\xce\xa3\xac\x49\x45\xf0\xf4\x7e\x65\x6b\xd9\x63\x77\x77\xe8\x53\xd2\xa8\x39\x10\x43\x27\xdc\x04\x9e\xbc\x34\xf0\x49\xd6\xc2\xf8\x0e\xca\x99\xdb\x7b\x41\x84\x24\xac\xef\x75\x22\x60\xd2\xd4\x27\x94\x93\x23\x99\x7c\xd9\x61\x7e\xdf\x50\xd4\x41\xd0\x08\x8b\x1d\x47\x91\x2e\x35\xcf\x54\x23\x15\x26\x58\x29\xf3\x83\xf4\x58\x60\xd3\xb4\x5e\x73\x5b\xb2\xf8\x58\x6d\xcf\x58\xdb\x4f\x2a\xcf\xb4\xa6\x88\x53\xa9\x6e\xed\x7b\x89\x76\x9d\x36\x56\x13"}, +{{0x5d,0x95,0x85,0x73,0x6a,0xb2,0x09,0xb0,0xab,0xe8,0xbf,0x74,0xac,0xa4,0xee,0xa4,0xf6,0xd1,0x65,0x0b,0x53,0x25,0x50,0xa2,0x23,0xe0,0x44,0x58,0x0f,0x8e,0x20,0xde,},{0xe7,0x77,0x29,0xed,0xfd,0x21,0x44,0xb2,0xb1,0x20,0x78,0x76,0x54,0x17,0xfa,0x21,0xf1,0x59,0x4f,0x09,0xb2,0x69,0xe9,0xb6,0x70,0x68,0x02,0xb4,0xf3,0xbd,0xfe,0x85,},{0xe7,0xb0,0x8e,0x1d,0x58,0x09,0xfd,0xd8,0x52,0x94,0x43,0xd6,0x5a,0xda,0x5d,0xd6,0x55,0xea,0x55,0xb5,0x41,0x5a,0x01,0x13,0x93,0xbe,0x70,0x71,0x67,0x64,0x86,0xd3,0x58,0xe8,0xd2,0xa4,0x60,0xeb,0xe0,0x75,0xb0,0xe7,0x01,0xb2,0x4c,0x9e,0x3a,0xb5,0xf2,0xb0,0x33,0x59,0x2d,0x4d,0xe3,0xb7,0xf3,0x7f,0xd5,0x41,0xf6,0x92,0x09,0x09,},"\x08\x69\x35\x91\xe6\xc5\x8a\x5e\xad\x9c\x85\xfe\x8e\xc5\x85\x08\xf8\x1a\x34\x67\x63\x6c\x2d\x34\xfc\xc1\xf4\x66\xe5\xc6\xda\xfd\xc3\x7c\x35\xcb\xee\x35\x58\x9c\x69\x97\xe2\xb1\x54\x48\x13\x27\x44\xe5\xa1\xe1\x31\xbb\x49\xbf\x5c\x25\x63\xf8\x7e\xad\x3e\xfe\x01\xe8\x8c\xbf\x24\xcc\x17\x69\xc7\x8c\xdf\xc1\x67\xe3\x78\x21\x5b\x15\x85\x9c\x7a\x28\xec\xe7\x0e\x18\x8f\xa3\x30\x26\x7d\x3f\xc5\x7b\x4a\xce\x6c\x15\x20\xec\x67\x87\x50\x67\xfd\x33\xbe\x86\xf4\xa1\x96\x7a\xfb\x3e\xb1\x64\xc7\x97\xcf\x28\xd8\x07\x2a\xa6\x9d\x82\xaf\xa3\x83\x74\xf8\xe5\x79\x7c\x4c\x28\x47\x1b\x7d\x69\xf5\xb9\xc7\xb4\xac\xdb\xc1\x9f\x3c\x5c\x5d\x40\x08\x08\xa9\x82\xa4\x78\x37\xae\xd1\xb3\x84\x1d\x69\x89\x0e\xeb\x31\x49\x4e\x10\xe3\xe5\x13\xd1\x2d\x0c\xa6\x86\xc7\xce\x65\x17\x78\x09\x27\x03\xfe\xf0\xdc\xc0\x21\x40\x77\xdf\xb3\x61\x25\x1b\xde\xa4\x36\x4d\xd4\x1b\x97\xbc\xeb\x0f\xb1\x47\x5a\x50\xe4\x70\x8f\x47\xf7\x87\x8c\x74\x40\x1e\x97\x71\xcc\x3f\xce\xac\xe8\x91\x69\x98\x1a\xa7\x72\x50\x85\x00\x90\xd1\x81\xd8\x35\x8e\xbb\xa6\x5e\x29\x0a\xcb\x03\x52\xbe\xce\x8c\x57\x98\x32\xa6\x01\x55\x18\x16\xd1\xc0\x56\x21\xcc\xbb\xee\x0f\xbe\x39\xea\x2f\x19\x53\x93\x19\x9e\x69\xc2\x34\xc2\xfb\x1c\x37\xe4\x74\x84\x08\x60\xce\x60\x91\x61\xfc\xfc\xe2\x86\x95\x74\xbe\x0d\x38\xf9\x5e\x20\xf4\xf8\x72\x52\x47\xb9\x62\x7b\x46\xe8\x34\x90\x51\x01\xac\x12\xb9\x34\xcb\xf8\x7c\xb2\xd1\x90\xd2\xf5\x14\x90\xa8\x2c\x4e\x81\x0e\xdd\xb8\x1f\x95\x6a\x9f\x36\xbd\xa4\x97\xbc\xa5\x06\xa4\x9e\xe9\xcd\x47\xfd\xa5\xb7\xf2\xb8\x84\xa3\x64\x8c\xad\xd1\x2a\xb6\x18\x98\xad\xa4\x6e\xcc\x97\x0f\x81\xdc\x9f\x87\x68\x45\xdb"}, +{{0x60,0xb1,0x42,0xf1,0x65,0x11,0x41,0x43,0xca,0x30,0xa6,0x04,0xfe,0xf5,0x1c,0x68,0x64,0x36,0xaa,0x1b,0x9a,0xfd,0xb2,0x66,0xb3,0xe3,0x98,0xcc,0xb3,0xc4,0xd8,0x55,},{0xea,0xf6,0xc5,0xa7,0x6c,0xa9,0x9b,0xf7,0x30,0x64,0x98,0x88,0x8c,0x3b,0x7a,0x1f,0xea,0xe9,0x8b,0xf8,0x98,0x8d,0x7f,0x2e,0x15,0x47,0xf8,0xf5,0x3a,0x45,0x28,0xaa,},{0xa6,0x21,0xf0,0x84,0xea,0x1a,0x36,0xef,0x81,0x2a,0x97,0x55,0xc9,0xaf,0xbb,0x53,0xda,0xda,0xae,0x6b,0x3a,0x53,0xfa,0x83,0x44,0xca,0x40,0xd3,0x61,0x2a,0x26,0x8a,0x35,0xfe,0xd0,0xfd,0x39,0x8a,0xb7,0x5b,0xcd,0x63,0x9c,0x54,0x79,0x37,0xc9,0x41,0x55,0xab,0x1a,0x7a,0x34,0x67,0xdd,0x4b,0xfd,0xdf,0xac,0xab,0x16,0x55,0xe9,0x08,},"\x18\x15\xde\xe1\x17\x3b\x78\x26\x47\x20\xd3\x5b\x7c\xc2\x45\x4a\x00\x0a\x65\xff\xf2\x14\xe2\x47\x3e\x20\xbc\x83\xf3\xec\xde\x9c\x04\xc1\xe0\x69\x6c\xe6\xe5\x55\x19\xdd\x2a\x75\xce\x04\x64\xbf\x60\x1a\xdc\x38\x1e\x79\x3e\xcb\x9f\x8c\xe7\xab\x87\xb6\xca\x2a\x3e\x41\x0f\x63\x90\x69\x45\x19\x78\xd1\x48\x73\xd3\x39\x0f\xab\x86\x23\x96\x97\x13\xc3\xdf\xcd\x58\xd8\x6d\x12\x40\x73\x76\x1e\xe0\x9a\x65\x2a\x48\x76\x7f\x96\x46\xcb\x72\x6a\xc4\x54\xac\x9a\x1b\xc5\xfa\xed\x30\x26\xb7\x03\x98\x2b\xc2\xb1\xe0\x75\x82\x10\xe1\xd6\x25\x19\x23\x0e\xb2\xb2\xf4\xa4\x86\xbc\x55\x16\x85\x60\xc4\x36\x3d\xf5\xff\x5a\xdf\xda\x11\xac\x7e\xf5\x1b\x18\x19\x6c\x94\x33\x7c\x07\xae\xf1\x17\x99\x0f\x77\x0c\x0f\x1e\x8c\x0f\x88\xeb\x6f\xfc\x40\xe8\xed\x7c\x3a\x80\xa6\x32\xdb\x1e\x7f\x63\xb6\x30\x96\xe2\xac\x49\xe5\x77\x92\xb3\x11\x43\xe2\xf4\xfa\xab\xce\xae\x66\xb2\x74\x71\x68\x1c\x36\xfc\x11\x39\x00\x7f\x9b\x54\x8c\xdc\x6e\x3b\x8f\xbb\xda\xba\x7a\x8a\xdb\x84\x34\x31\x23\x8b\xb4\x61\xba\x24\xf6\xe0\x9f\x62\xc7\x2d\x63\x77\xb4\x04\x8c\xb0\x13\x4c\x25\xa5\x41\x1a\x20\xbf\xcf\xc1\x3e\x48\xd8\x0e\x36\xbf\xb0\xda\x7e\x01\x85\xd3\x3f\x19\x28\x63\x6e\x15\xde\xe0\xe5\xdf\x89\x92\xa1\x65\x72\xb1\x3e\xa8\xf7\xcf\x85\xca\xe3\x2d\x52\x9f\x66\xe8\xf6\xd2\xfb\x2a\xd0\xbb\xfe\x71\x99\x16\x9b\x25\x67\xba\x00\xc7\x81\xb2\x0a\x48\xe1\xd7\x0d\xf9\xfa\x31\x19\xcd\x7e\x5b\xbe\x58\x88\x4b\x0b\x51\x21\x89\x40\xfa\x81\x5f\x85\x62\x5f\xa2\x03\x47\x1c\xee\x80\x84\x78\x0e\xb0\xb9\x35\x6f\x9f\x3d\x4f\x6d\xf7\x40\x30\x1d\x70\x7e\xf1\xff\xb3\x51\x9e\x3f\x90\xb8\x06\x4b\x98\xe7\x0f\x37\x5d\x07\x14\x26\x88\x17\x18"}, +{{0x73,0x4b,0xa4,0x70,0x33,0xc6,0x14,0x02,0x32,0xdd,0x4a,0x7a,0x14,0xf1,0xa7,0x74,0x3e,0xef,0xe9,0x07,0x0b,0xad,0x96,0x62,0x49,0x16,0x30,0xcc,0x9d,0x28,0xc1,0xf3,},{0x2f,0xa5,0xdf,0x30,0x26,0xd6,0x07,0x42,0xe2,0xaf,0xf6,0xb5,0x78,0x42,0xc7,0x12,0x68,0x46,0xc8,0xa7,0xbb,0xe9,0x26,0x6e,0xfa,0x7b,0x3f,0x23,0x98,0xc3,0x57,0xea,},{0x9b,0xd0,0x74,0xd1,0xd0,0xbd,0x28,0x00,0x1b,0xaf,0x7d,0x2d,0x4e,0x82,0x43,0x5d,0xf0,0x8c,0x42,0x64,0xd8,0xcb,0xb1,0xc3,0x81,0x18,0x3c,0x2f,0x01,0x22,0x3f,0x79,0xf9,0x49,0x23,0xca,0x17,0x8c,0xac,0x75,0x56,0x4e,0x16,0xc7,0xf5,0x60,0x79,0x08,0x8f,0x7e,0xd8,0x85,0xde,0x4d,0x50,0x9f,0xbc,0x78,0xf4,0x38,0xfb,0xa3,0xf6,0x07,},"\x5d\x3c\x65\x98\x10\xc3\xfe\xa5\x2a\x6d\xf3\x86\x1e\x5c\xdc\x5b\x70\x3c\xc1\xce\xf4\x85\x58\xc6\x1d\x8c\x51\xd0\xed\xea\x5a\x14\x79\xcf\xe5\x06\x3d\x82\xde\xd9\xca\x68\x1e\x57\x48\x88\x7c\x40\xec\xfb\x9e\x1a\x9a\x8b\x7f\x85\x09\xd1\x07\x76\x46\x1c\x39\x23\x39\x96\x93\xa7\x81\x89\x08\x91\x78\xd5\xaa\xbd\x15\xf8\xc8\x46\x64\x2b\xe4\x7d\x6d\x4c\xaf\x13\x82\x4e\xdc\xef\xb8\x09\x86\x8f\xa7\x2d\xdf\x03\x5c\x4d\xe8\xef\x0a\x9c\x83\x22\x64\xf6\x6f\x01\x27\x61\xce\x69\x55\xbc\x3c\x41\x6e\x93\xe2\x91\x88\x02\x5e\xbb\xb1\x3a\x55\x32\x58\xc1\xd7\xc4\x99\xc9\xa4\xae\xb1\x0b\xb3\x6f\x61\xd1\xbb\x4c\xec\x5a\xe5\x5d\x17\x57\x22\xb9\xa9\x69\x6d\xf8\x81\x95\x1e\x35\x20\x0b\x96\x53\xcf\x6e\xd4\xb3\xd1\x5d\xe0\x87\xa9\xd1\xc3\x19\xfc\xe8\x58\x21\x56\xbe\xbf\x3f\xc9\x1e\x0e\x61\x0f\xf7\xa1\x53\x08\xfd\x1d\x2c\x60\x69\xfb\xbb\x29\x47\xd3\x11\x07\x31\xd2\x45\xae\x29\x63\x01\x4b\xd7\x6d\xea\x42\xdb\x12\x5c\xec\xc4\x93\xc8\xe9\x09\x1a\x76\x64\x65\x77\x72\x9a\xed\x49\x66\xfc\xe9\x69\x9f\xe1\x2e\x36\x7d\x66\x5d\xf9\xe9\x5a\x91\x93\xe1\x13\x3e\x14\x3a\xf9\x2f\x82\xb6\x6a\xc7\x76\x4e\x50\x33\x17\x86\x90\x52\x18\x09\xa7\x10\x7d\x8a\xe9\xb8\x8e\x0e\xd1\xf3\x5b\x17\x19\x90\x1b\x93\x0a\xd0\xe1\xcb\xce\x7f\xb3\x02\x67\xb1\x15\x52\x04\xf6\x05\xf5\x25\xe4\x9d\xe2\x98\x8e\xa7\xf7\x4b\xe8\x81\x51\x77\xfd\x97\x6a\x1b\xcc\x12\x6d\x9c\x9c\x13\x5c\x5b\x42\x76\xd3\x80\x19\xc3\x4a\xef\xb7\xa0\x22\x0f\x7f\x5a\xef\xf3\x80\xae\xd6\x27\xb0\x70\xc2\xc9\xe2\x15\x33\xbb\x35\xc0\x8e\x39\x4c\x85\xae\x25\xe6\x86\x29\x42\x59\x9c\x65\xdb\xae\x59\x77\xa5\x84\xa8\x81\x80\xe0\xc8\xc7\x1e\x5a\x84\x09\xe0\x4e\xf7"}, +{{0x45,0xe3,0x4d,0x0e,0xf4,0xc1,0x96,0xfa,0x6d,0x57,0x2b,0x6b,0x17,0x74,0xb5,0x21,0x8f,0x7c,0x32,0x91,0x30,0x4c,0x13,0x50,0x0d,0xf7,0x07,0x0d,0x90,0xe8,0x03,0x9e,},{0x13,0xa7,0x30,0x4d,0xff,0x42,0x33,0x59,0x17,0x7a,0xba,0xfa,0x5e,0x65,0x08,0xd2,0x67,0x69,0xca,0x99,0xcf,0x8a,0xf4,0x5c,0x38,0x3f,0x3f,0xf6,0x34,0x40,0x60,0x03,},{0xb4,0x2c,0x1f,0x92,0x5f,0x4b,0xac,0xcd,0x12,0x9e,0xfb,0x10,0x9d,0xb3,0x54,0xac,0xa3,0x1c,0x68,0x98,0xf4,0xf4,0x51,0x29,0x47,0x49,0xa2,0x6a,0x6d,0xa1,0x67,0x7b,0xd3,0xa5,0xc0,0x41,0x19,0xe3,0x5f,0x47,0x31,0x9f,0x20,0xcf,0xdf,0xc0,0x8b,0xb4,0x52,0x8b,0x21,0x00,0x9e,0x00,0xbd,0x41,0xeb,0xc0,0xf4,0x68,0x63,0xbe,0xd1,0x0b,},"\x3d\x9e\xd5\xc6\x4b\x75\xe1\x35\xdf\x2f\x5e\x85\x30\x0d\x90\xf2\x1b\x36\x39\x35\xe2\x81\x75\x56\xfc\x93\x11\x75\x1b\xa7\x53\x54\x77\xde\xc8\x35\x6e\xc3\x85\xef\xb8\x2b\x41\x40\x62\xf3\x5b\xb6\xd3\xed\xea\xfd\xe3\x05\xf9\x90\x0a\x25\xe9\x81\x3c\x9e\xe0\x23\x7d\x46\x40\x96\x50\xcd\xcd\xb5\xdf\xa2\x30\x1a\x8e\x26\x47\xf8\xd3\x81\x9d\x86\xf7\xb7\xe3\x07\x0d\x33\x44\x0f\x82\xc4\x05\x4b\x1a\xb5\xed\xeb\xeb\x27\xf9\x5b\x3c\x4c\x6f\xdd\x46\x8f\x21\x60\x0f\x03\xb3\x49\x4d\xa2\x00\xba\xb9\x29\x3c\x38\xd0\x2f\xc4\x40\x48\xe5\x2f\xf5\xfd\x0f\x72\x17\xa0\x4d\x4c\xe9\x12\xa1\x80\xd1\x62\x8f\x36\x82\x80\xb6\x89\x26\x72\xe8\xff\x98\xd4\x62\x9a\xc2\x8b\x60\xc0\x2a\x30\x1e\x6c\x60\x26\xc1\xb9\xe9\xef\x21\xcf\x03\x92\xdf\x22\x50\x08\xd5\xa0\xe0\x28\x4b\x28\x26\x31\xad\x17\x10\xf8\x11\x61\x56\x97\x06\x6c\x98\x29\x65\x19\x94\x8a\x7c\xfe\xd5\xae\xeb\x45\x4e\xe7\xa6\x1c\xc2\x71\xbd\x3d\x49\x9b\xe1\x7d\xf0\x9d\x3a\x0e\x79\x0e\xe6\xb9\xbd\x99\xe1\xb9\x19\xbe\xd4\xa0\x63\xb8\xd1\xa3\x4f\x1a\xfd\x2e\x95\x2b\x9d\xfe\xfd\x77\x09\x69\xc8\xb2\xfc\x37\x97\x7a\xbb\x0f\xee\x63\x17\x25\x3a\x23\xec\xc9\x75\x78\x16\x89\x73\x33\x4c\x8f\x91\x76\x3a\xb9\x7f\x29\xc4\x9b\xae\xee\x7b\x35\xf3\xae\x7f\x5c\xd3\xa4\xa6\xe6\x97\xef\x25\x5a\x3c\x2e\xc0\xc7\x52\xa3\x39\x6f\x69\xf6\x63\xca\x1f\xc2\xb3\x32\xdf\xe6\xc0\xfa\xf7\x8a\xfe\x9c\x68\xd9\x95\x71\xe8\xe8\x96\xc5\x09\x30\x85\xe9\x86\x3a\x27\x64\x8a\x9e\x58\xf3\xa9\xa8\x4c\xbb\xfe\x2b\x41\xca\x36\x33\xdd\x5c\xf6\xe8\x2c\xb7\x7c\xec\xac\xad\x8d\x78\xb3\x53\xf4\x8d\xb4\x2d\x99\xc3\x6b\xca\xd1\x70\xea\x9e\x98\xab\xb2\x78\x8c\x33\xa3\xc7\x06\x26\x8f\x36\x31"}, +{{0x88,0x8c,0xe2,0xec,0xce,0xda,0x9c,0xa2,0xb9,0x48,0xac,0x14,0x43,0xc2,0xae,0xdd,0x75,0x95,0xaa,0xcf,0x36,0xed,0xaf,0x27,0x25,0x5b,0xde,0x7a,0x69,0x91,0xdc,0xc0,},{0x01,0x6e,0x57,0x2b,0x4f,0x98,0x41,0x7c,0x6e,0xe2,0x97,0xab,0xd7,0x84,0xea,0x48,0x22,0x6f,0xf4,0xfb,0xf0,0x05,0x0a,0x5a,0xde,0x88,0x06,0xe7,0x04,0x6d,0x3b,0xa3,},{0x99,0xd8,0x3f,0x14,0x8a,0x23,0x6e,0xbb,0xef,0x1c,0xad,0x88,0xcb,0x3c,0x76,0x94,0xf4,0x98,0x6c,0x92,0x50,0xe2,0x1c,0x36,0x03,0xa0,0xd9,0x41,0xbf,0xf1,0x99,0xcf,0x77,0xd6,0xce,0x99,0xef,0xdb,0x20,0x53,0x31,0x88,0xd6,0x8a,0xd1,0x33,0xde,0x03,0x3a,0x1f,0xb3,0x46,0x8a,0xbb,0x70,0x6d,0x2b,0x8b,0x4f,0xba,0xc0,0x8d,0xfe,0x03,},"\x5c\x80\x1a\x8e\x66\x4e\x76\x60\x76\x0a\x25\xa5\xe1\x43\x1a\x62\x15\x9f\xc3\xf3\xaa\x71\x37\x80\xae\x7c\xbc\xe2\x3b\x85\x64\x78\x27\x99\xbf\x2b\xe4\x81\x7e\xe2\x92\x19\x65\xba\xb7\xe1\xd4\x48\x33\x82\x4c\x16\x28\xd4\x2d\xce\xe3\xe4\x6a\xe4\x2b\x28\x16\xd0\xa4\x32\xa1\xab\x0b\xd2\x1f\xcf\x30\xad\xb6\x3d\x8d\xd7\x65\x69\x54\x43\x43\xd0\x03\x5c\x76\x05\x22\xca\x68\xbe\xa7\x2c\x40\x4e\xdd\xa1\xe9\x09\x5e\xc9\x0f\x33\x25\x68\x1c\x6d\xe0\xf4\xc1\x2d\x1a\xfb\xcb\xa2\xc7\x87\x1a\x1b\x1e\x1f\x19\xc3\x5b\x0b\xed\x9e\xc2\xa8\x7c\x04\x3d\x36\xd8\x19\x39\x6b\xd5\xd0\x99\xe1\xaa\x09\x03\x91\x29\x7c\x73\x3f\x65\xa8\xc5\xd2\x12\x0c\x67\x63\x53\x16\xfa\xb2\x5b\x4d\x48\x47\xa4\x5f\xc3\xf7\x6f\x2e\x24\x26\xdb\xee\x46\x29\x97\x50\x62\xfc\xe1\x4e\x21\x89\xdb\xa2\x7f\xb1\xde\xd2\x45\x3f\x00\x1d\xeb\xfa\xa8\x99\xc1\x16\x60\x61\x2d\x2c\xe2\xad\x2f\x76\x2e\xa5\xde\xe7\xe7\x1e\x58\xad\xcd\xce\xfa\x79\xe8\xe8\xb2\x7f\xc4\xcc\xf8\x9a\xab\xf1\x76\xb5\xd3\x4f\x82\xdd\x15\xd8\x89\xf9\xf0\x87\xdc\x9a\xe8\xa4\x2a\x72\xf3\xb8\x35\x83\x61\x6e\x17\x06\x37\xcd\x1a\xdf\x38\xaa\x65\x51\xcb\xac\xca\x36\x02\xbd\xc7\xae\x21\x0c\x4a\x44\x6b\x3a\xf8\xdb\x27\x20\xe5\x49\xbb\xed\xb8\xbe\xd2\x15\xae\x00\xf1\x9d\xa2\x9d\x8f\xb0\xb6\x42\xd2\x7b\x2d\x88\x57\x5f\x0e\xe8\x4f\x3d\x12\x9e\xb7\x74\xd2\x0f\x53\x7a\x1c\x0f\xdc\xf7\x17\xbd\xeb\xcf\xe4\x7f\x83\x31\xa3\x41\x86\x43\x46\xfa\x6a\x1c\x6b\xbf\xd1\x78\x81\x9e\x38\x7a\x0d\x54\x99\xa6\x8e\x81\xcc\x9f\x82\xad\x39\xe3\x1e\x4d\xfe\x71\x95\x2d\x5e\xa5\xcc\x80\x52\xa3\xce\xed\x17\x51\xf5\x9d\xc7\xec\xc9\x74\x2f\xad\x14\x4e\x18\xdd\xa8\xd0\x58\x2e\x74\xe3\x9c\xa8\xc4"}, +{{0x61,0x73,0x90,0x85,0x7d,0xc1,0x0c,0xdf,0x82,0xb5,0xc9,0x42,0x61,0xf5,0x8c,0xe2,0xd4,0x4a,0xa2,0xf5,0x7d,0x29,0x8f,0x08,0xa2,0xd6,0xc7,0x4d,0x28,0x14,0x7d,0xaf,},{0x89,0xe0,0xc3,0xe0,0xa0,0xf1,0x30,0xd1,0x91,0x6e,0x0e,0x38,0x49,0xb7,0x28,0x6f,0xa2,0xe3,0xac,0x4c,0x17,0xbd,0x1f,0x71,0x6e,0xe5,0xa7,0x2f,0x02,0x57,0xfb,0x8d,},{0x63,0xe9,0x0a,0x6a,0xfb,0xbb,0xb0,0xee,0x69,0x6b,0xfb,0x56,0xef,0xd6,0x79,0xd6,0x8a,0x98,0x51,0xa8,0x94,0x76,0x40,0xa9,0x7f,0x41,0xf6,0x8e,0xdf,0xea,0xdd,0x21,0x6e,0xd8,0x69,0x8e,0x2e,0x43,0xc8,0x20,0xc9,0x04,0x4c,0xaa,0x7a,0xda,0xab,0x5b,0x76,0x76,0x2b,0x68,0x18,0x31,0xa9,0xf7,0x60,0x47,0x6a,0x84,0x43,0xc4,0x3c,0x06,},"\x1f\xd9\xe7\x45\x3e\xaf\xfd\x7c\x9b\x54\x05\x56\x22\xdd\xe1\x70\xdd\x58\xb7\x1c\xb9\x45\xde\x75\x35\x1d\x5f\xce\xb1\xf5\x36\xbd\xe2\x51\x58\xf0\x37\x86\x15\x5f\x95\x3d\xc2\x07\xa1\x70\x8f\x90\xd9\x5b\x15\xac\xa0\xae\xe3\x09\x7f\xdc\xaa\xe8\x5e\x4a\xb1\xc2\xcd\xb7\x05\xc5\x3e\x6c\x2e\xd2\x1a\x99\x4b\x30\x4a\x75\xca\xf2\xce\x4f\xc7\xd6\x1f\x56\x1e\x74\xe2\x97\x39\x7e\x2c\xde\x5c\xc6\x90\x56\x94\x03\x43\xaa\x81\x37\x5d\x0a\xf1\x8d\x17\xd2\xf3\x4c\x0a\x71\xdc\xf1\xde\x3c\x4f\xc4\x88\xa1\x4c\x5f\xa6\xb3\x33\x7a\x31\x74\xb1\xda\x79\x58\xfb\x00\xbd\x59\x55\x14\x82\x21\x42\x7c\x60\xdb\xa0\x41\x17\xc8\x0d\x24\x88\x65\x6d\xbd\x53\x43\xde\x89\x12\x87\xb5\x0e\xf4\xdf\x98\x25\xed\xa7\x6b\x49\x77\xf3\xac\xd4\xab\x6d\x31\x02\xfa\x56\x87\x83\x06\xcd\x76\x56\x14\x91\xbc\xfd\xaa\x1d\xa5\x67\xe6\x77\xf7\xf0\x3b\xae\x5d\xbf\x44\x26\xc3\xc4\xa6\xc3\xd0\x82\xf9\x17\x8b\x2e\xfd\xd2\xbd\x49\xee\xe9\x7e\xf4\xdc\xf3\xf0\xf5\x1b\xbd\xef\xfe\x5a\xe6\x60\x1e\x28\x01\x95\x18\xf8\x27\xf0\x2e\x51\xf6\x67\x9b\x87\x15\x97\x8b\xec\x3e\x69\xd5\x77\x15\x6d\xd7\x19\x95\x93\x71\xba\xf0\x34\x21\x9f\xbb\xd1\x7a\x23\x69\xa8\x54\x14\x90\xf6\xa0\x20\x13\xe3\x3e\x74\xf4\x76\x9b\xe3\x7a\xef\xa4\xde\xfb\x6b\xfb\x3f\x35\x1c\x2a\x26\x14\x82\xc2\xfb\xec\x49\xf8\x5f\x84\x45\x45\x6e\x8f\x5a\x47\x40\x30\xcd\x72\xd0\x95\xef\x6a\x62\x20\x30\xe1\xe4\x3a\x0c\x5d\xeb\xb0\x34\x73\x1d\x2f\x5e\x8e\x4b\xa3\x99\x0f\x07\x7d\x0c\x16\x26\x49\xd1\xfa\x3e\xa4\xfe\x1e\x81\xd7\x4a\xa8\x49\xe2\x1b\x05\x9d\x96\x6c\xba\xd4\xc4\x93\xca\x10\xba\xfe\x7a\x69\x24\x3e\x3c\x0a\x6e\xbf\xd1\x3d\x69\x79\x06\x30\x33\x92\xba\x65\xd4\xfe\x06\xb6\xa5"}, +{{0x87,0x7d,0x01,0x74,0x36,0x36,0x9e,0xc2,0x45,0x3f,0xed,0x46,0xe9,0x77,0xd6,0xac,0xc3,0xa7,0xbe,0x60,0xd3,0x13,0x95,0xad,0x6e,0x7e,0xa9,0xe0,0x74,0x80,0xe4,0xc9,},{0x4e,0x65,0x42,0x2f,0xed,0x33,0x4a,0x55,0xe8,0xb6,0x73,0x89,0x3e,0xba,0x7c,0x18,0x1d,0xd7,0x24,0xdd,0xa0,0x02,0x81,0x7b,0x0b,0xae,0x28,0xac,0xdc,0x3f,0x7f,0xc0,},{0x76,0x88,0xf3,0xf2,0x40,0x1e,0xac,0xaf,0x2d,0xd8,0x8e,0x17,0x0f,0xf1,0xc4,0xd7,0xe9,0x48,0x22,0xa7,0x7f,0x6b,0x55,0x0b,0x56,0x9e,0x82,0x15,0x2b,0xbb,0xb4,0x34,0x05,0x7e,0x01,0x23,0x0b,0x05,0xce,0x58,0xee,0x1d,0xee,0x52,0x26,0xb5,0xc7,0xcd,0xbe,0x5a,0x8a,0xde,0x3b,0x94,0x65,0xf5,0x9a,0xed,0x74,0x14,0x5d,0x14,0x33,0x0c,},"\x4e\xd3\xf5\xbd\xbd\x41\xd0\xe3\xb0\xa8\xa7\xfc\x37\x52\xee\xa4\x96\xd6\x14\x16\x78\xcb\xfe\x06\x75\x7f\x61\xe1\xa1\x68\xd7\x61\xb6\xda\x83\x05\x2f\x79\x94\x95\x0d\x24\x62\x6f\x00\x4f\xbe\x9b\x8c\x95\x62\xe0\xc9\x55\xfb\x3b\x5c\x08\xfd\x2d\x3d\x25\x83\x93\xa3\x49\x03\x0c\x8e\x15\x62\x05\xb4\x04\x83\x03\x8b\xe1\x95\x9f\x1c\xba\x49\x0a\x87\xfe\x13\x89\x9e\x4f\x37\x52\x06\x3b\x68\xfe\x3e\x1c\x50\x71\xf7\xdb\x00\x02\xf0\x14\x94\xb4\xa3\xee\x2e\x07\x99\x2b\xdd\x20\x0d\xb4\x31\x66\x29\xee\x8a\x95\xca\x34\x7f\x0b\x28\xd6\x40\x2a\x6d\xa8\xb5\x3e\x6b\x32\x58\x1c\x36\x91\xe1\x1a\xe9\xb6\xe0\xf0\x49\x48\x94\xe6\x49\xa9\x2d\x03\xeb\x49\xc4\xd6\x83\x3f\xa1\xf5\x4f\x8d\xcd\x91\xd0\x69\x36\xa6\xe6\x2d\x49\x1e\x2c\xea\x46\xdd\x07\xd9\xf0\x2d\x32\x54\xb8\x50\xbc\x97\x49\xf2\x58\xa6\x1a\xd3\xb9\xcc\x24\xb0\x32\x87\x33\x1b\x85\xa2\x41\x43\xaa\xf8\xfc\xcc\xac\x5f\x18\xbf\xc7\x2d\xec\x75\xc0\x23\x35\x16\xaa\x6e\x45\x89\xc7\x8c\x66\x5a\x18\x6e\xd9\x02\x09\x1d\xf9\x7b\x0d\x04\xe8\x3a\x2d\x74\xd7\x89\x89\x1a\xea\x2c\xac\xf8\x13\xff\xfb\x5e\xfa\xf7\x8d\xbc\xd7\xaf\x54\xef\x55\xc7\x7b\x1c\x4c\x8a\xce\x9e\x92\x78\xad\xc2\x3d\x76\xc7\x79\xd6\x4b\x3b\xbb\xd1\xfb\x33\xb0\x98\x36\xea\x64\xa7\x1e\x47\x11\xe8\x9e\x8d\xa0\xf7\x09\x21\x33\x42\x17\x6a\xe2\x2c\x6e\x78\x52\xc3\x97\x3b\x60\xd9\xf9\x88\x89\xb4\x42\xaa\x48\xd7\xbf\xdf\xde\xf6\x4c\x36\xc5\x86\xc4\xfb\x2a\xd2\xe2\x7e\xbe\x47\x9f\x6d\x72\x2f\x06\x9f\xd6\x10\x6b\x0d\x08\x97\x5d\x5f\x72\x15\x47\xc3\xb9\xc5\x2f\x9f\xc5\xf4\x5b\xb4\x5b\x5b\x63\x21\x88\xe8\x06\x26\x51\x8a\x79\x05\x6b\xdc\x4e\xe1\xd2\xbe\x6c\x65\x42\xa2\x1f\xad\xea\x92\xc6\xdf\xb7\x76"}, +{{0x4f,0x0b,0x36,0x07,0xd7,0x0b,0x0f,0x26,0x98,0x32,0x7e,0xf4,0xf1,0x98,0x2c,0x5b,0x4b,0x94,0xbe,0x78,0xf5,0x0c,0x76,0xf4,0x3b,0xd6,0x42,0xf1,0xf0,0xed,0xe3,0x9b,},{0x94,0x2b,0x43,0x08,0x9f,0xd0,0x31,0xce,0xc0,0xf9,0x9e,0x5e,0x55,0x0d,0x65,0x30,0x7f,0xb6,0xc3,0xe7,0x93,0x44,0x9f,0xb3,0x90,0xff,0x73,0x0f,0xff,0xd7,0xc7,0x4b,},{0xf3,0x96,0xa1,0x1f,0x2f,0x03,0xc6,0x14,0x39,0x68,0x4f,0x79,0x00,0x1b,0xd4,0xf3,0x46,0xa3,0x48,0xdc,0xf1,0xd3,0xbe,0xb2,0xd3,0xbf,0xe3,0x3e,0xa7,0x3a,0x5a,0xd4,0xeb,0x97,0x50,0x6a,0xcf,0xbf,0xfb,0x78,0x4e,0x77,0x54,0x81,0x89,0xcd,0x59,0x9f,0x8c,0xcf,0x17,0x35,0x5d,0xde,0x80,0xe7,0x50,0x24,0xef,0x2a,0x78,0xd5,0xfa,0x03,},"\x9f\x70\x0a\x1d\x25\x60\xf6\x9d\x9b\xc1\x05\xbc\x83\xbf\xf5\x39\xe4\x25\x8c\x02\x48\x60\x20\x13\xa9\x59\xb9\x78\xa1\x9c\xc2\x73\x28\x0d\x90\xc0\x17\x80\x89\x57\x8b\x50\x51\x8e\x06\xad\x1e\xab\x79\x0f\xfe\x71\x0c\x63\xd7\x88\x87\xa9\x55\x69\x14\x4f\x3e\x58\xa8\x83\x7f\x93\xdd\x51\x6f\xcd\xdd\x22\xbc\x97\xa7\xf1\x44\x11\xd4\x24\xb2\xe8\xe9\xaa\x7c\x28\x01\x19\xad\x94\xce\x92\x53\x3f\xc7\xfe\xa6\xc6\x62\x48\x64\x4a\xc3\xe1\xbe\xef\x25\x53\xa6\xf6\x1e\x91\xb9\x37\x9b\x0f\xe0\xc6\x8b\x40\x68\x14\x55\xb3\x11\xf4\x0d\xf0\xc9\x7f\x53\xfc\x95\x42\x42\xc3\x75\xe7\x70\x8d\x61\xba\xd9\xf5\x12\x96\x24\x72\x74\xfa\x01\xa7\x32\x8f\xa5\x00\x9d\x99\x95\xf5\x01\xae\x86\x83\x55\x2b\x11\xa4\x9d\x26\x38\x11\x67\x23\xb1\x31\x94\x50\xa9\x01\x38\xd2\x78\xcd\x95\x12\xb8\x0c\xa5\x79\x2e\xd1\x6c\x68\x3b\xef\x92\xec\x87\x88\x4c\x9f\x07\xf1\x37\xdc\x47\xa1\x31\x46\xe5\x11\x06\x5c\x2e\x1b\x4b\x80\xef\xde\x88\xae\x12\xe2\x94\x31\xbe\xb7\xae\xe3\x65\xc1\x6d\x80\x50\x6b\x99\xaf\xa6\xa1\x40\x6e\xdb\x06\x17\x66\x87\x58\x32\xdb\xa4\x73\xe5\x19\xdd\x70\x18\xf4\x02\xeb\x1b\xb3\x01\x4b\x7c\xee\x4f\x02\xe9\x80\xb1\xb1\x71\x27\xe7\xd2\x5d\xfe\x0c\x16\x8c\x53\x44\xf1\xc9\x00\x44\xf8\x27\x70\x7d\xca\x03\x07\x0e\x4c\x43\xcc\x46\x00\x47\xff\x62\x87\x0f\x07\x5f\x34\x59\x18\x16\xe4\xd0\x7e\xe3\x02\xe7\xb2\xc2\xca\x92\x55\xa3\x5e\x8a\xde\xc0\x35\x30\xe8\x6a\x13\xb1\xbd\xfa\x14\x98\x81\x30\x98\xf9\xba\x59\xf8\x18\x7a\xbc\xaf\xe2\x1b\xa0\x9d\x7c\x4a\xaa\x1a\xd1\x0a\x2f\x28\x33\x4a\xb5\x39\x96\x14\x7c\x24\x59\xc0\x1b\x6a\x10\x83\x9e\x03\x01\x12\x3d\x91\xa3\x5c\xed\x7a\xf8\x9a\xfb\xac\x7d\x9c\xf8\xac\x9a\x38\xce\xeb\xef\x83"}, +{{0xb8,0xa0,0x01,0x0c,0x78,0x4d,0x8d,0x00,0x2a,0x31,0xda,0x11,0xd0,0x22,0xd3,0x01,0x88,0xa4,0x19,0x7a,0x1d,0x5f,0x14,0xea,0x4c,0x0d,0xab,0x29,0xa2,0xe4,0x06,0x68,},{0x8b,0xdc,0x63,0xe5,0x0b,0xed,0xe1,0x3c,0x91,0xa4,0x1e,0x4b,0x4b,0x78,0x57,0xb9,0xe5,0x53,0xf4,0x84,0xe3,0xc1,0xec,0x16,0x7d,0xc0,0x4c,0x28,0x1e,0xa8,0x66,0x22,},{0xb3,0xf6,0xcf,0x4c,0x0e,0x0f,0x90,0x74,0xff,0x2c,0x2c,0x47,0xe1,0x63,0x20,0x2f,0x1e,0x9d,0x6e,0xe1,0x17,0xcf,0x75,0x76,0x33,0xe4,0xab,0xe7,0x44,0x23,0xaa,0x70,0x00,0x8a,0xda,0x15,0x09,0xec,0x1d,0xc1,0x17,0xc1,0xc2,0x30,0xe9,0xb2,0x37,0x86,0xf3,0xd0,0xf2,0x9b,0x73,0xaa,0x28,0x45,0x36,0xe9,0x58,0x01,0x06,0xa8,0xa7,0x0c,},"\x5c\x6c\xcb\x29\x8b\xe2\x16\x80\x8b\x81\x1e\x56\xd9\x72\xf4\x56\xb6\x9a\xd3\x95\x94\xee\xe3\x54\x70\x1c\xa6\xb3\xe3\x8d\x1f\x41\xa3\x59\xe5\x51\x2a\xf9\x8a\x3a\x08\x73\x26\x5f\xe5\x19\x1f\x4f\x2e\xca\xf6\x6b\xee\x75\xa3\xac\x0b\x71\xa4\xdd\xf2\xa7\x59\xeb\xdd\xdb\xd8\x8a\x6a\x1c\x6f\xd0\xfc\xf7\xd7\xcb\x92\xa8\x4e\x33\x07\xb4\xa4\xf9\x8c\x71\x0a\xbf\x4f\x55\x3d\xee\x74\xf6\x52\xd2\xac\x64\xbc\x30\xf7\x2b\xf4\x35\x4e\xf7\xe8\x06\xa1\x90\x71\xa0\x51\xbc\xfc\xfb\x27\xe3\x7f\xdd\xd4\x1e\xce\xae\xc1\x75\x8e\x94\x69\x5c\x67\x0e\xf4\xc5\xa5\x90\x21\x78\x32\x9d\xb9\x58\x5c\x65\xef\x0f\xa3\xcd\x62\x44\x9b\xb2\x0b\x1f\x13\xae\xcf\xdd\x1c\x6c\xf7\x8c\x51\xf5\x68\xce\x9f\xb8\x52\x59\xaa\xd0\x5b\x38\xc6\xb4\x85\xf6\xb8\x60\x76\x92\x8d\xdb\x4e\x20\x36\xf4\x5e\x7b\x9c\x6a\x7f\xf2\x4a\xe1\x77\x60\x30\xe2\x57\x68\x25\x01\x9a\xb4\x63\xeb\xf7\x10\x3a\x33\x07\x20\x33\xea\xcb\xb5\xb5\x03\xf5\x32\x66\xaf\xb8\x2f\x9b\x24\x54\xb8\xdc\x05\x7d\x84\xf3\x0d\x9d\x2c\xb7\xc3\xa3\x1a\x7d\xbd\xfb\xa5\xb8\xe4\x92\x31\xc2\x31\x39\x6c\x47\xca\x04\x2c\x8e\x48\xa1\xa5\xe3\xec\x9a\xfe\x40\x20\x59\x53\x90\xf9\x99\x0d\xfb\x87\x4e\x08\x25\xae\x9a\xe5\xe7\x52\xaf\x63\xaf\x6f\xd3\xe7\x87\xe7\x5e\x8d\x8d\xc4\xc6\x63\x02\x27\x7a\xc0\x1b\x30\xa1\x8a\x56\xcb\x82\xc8\xa7\xeb\xdc\x91\x5b\x71\x53\x25\x5a\x1f\xed\xc4\x92\xe4\x96\x60\x26\x2b\xb2\x49\x78\x0d\x17\x3e\x1f\xd2\x0d\x18\xc4\xf6\xb0\xb6\x9a\xa2\xec\xa0\x24\xbf\x3c\x80\xd7\xd5\x96\x2c\xc4\xa1\x29\xa7\x94\x3b\x27\xf3\x3c\xc7\x99\xa3\x60\x45\x54\x12\x75\xa2\xcd\xb9\x2a\x40\xe4\x85\xba\x8b\x73\x7a\x04\xb4\x3d\x29\xc3\xe2\x5f\x76\xcb\x3d\x93\xa6\xb9\x44\x61\xf8\x8f\x56\x96"}, +{{0xef,0xc8,0x6c,0xbe,0x40,0x36,0x3a,0xbf,0xbb,0x2a,0x4b,0x1f,0xcc,0xe5,0xfd,0x60,0x84,0xda,0x96,0xe7,0xe8,0x14,0xde,0x71,0xaa,0xdf,0x9a,0x61,0x8f,0x30,0x36,0x25,},{0x22,0xf2,0x95,0xce,0xe7,0x27,0xd2,0x8d,0x2b,0x93,0x17,0x15,0x3e,0x7d,0x94,0x12,0xda,0x10,0x65,0xc1,0xb1,0x6a,0xe2,0xa2,0x51,0xdd,0x1f,0xb4,0x31,0xc6,0x2b,0x01,},{0xf8,0x81,0x83,0x10,0x22,0x8c,0xa7,0x61,0x11,0x52,0x4c,0xe9,0x4b,0xfc,0xb0,0x24,0x6e,0xa6,0x35,0x08,0xce,0xe9,0x30,0x65,0x92,0xb2,0xf7,0x75,0x48,0xed,0xef,0xcf,0x76,0xbd,0x14,0x54,0x50,0x8e,0xa7,0x15,0x04,0x2c,0xec,0x16,0x9c,0xea,0x51,0x15,0xab,0x54,0x23,0x5c,0xb1,0x09,0x7b,0x10,0x70,0x2a,0xa3,0x83,0x78,0x02,0x8e,0x0c,},"\x9e\x4f\xa4\x5d\xc0\x26\x71\x0f\x6b\xef\x4e\xd0\xf0\x7c\x54\x4b\x0b\xb0\xd8\x8f\xa7\x9e\x71\x77\xd8\x44\x8b\xc2\x09\xd7\x1c\xfe\x97\x43\xc1\x0a\xf0\xc9\x93\x7d\x72\xe1\x81\x9e\x5b\x53\x1d\x66\x1c\x58\xc6\x31\x41\xce\x86\x62\xc8\x83\x9e\x66\x4d\xb7\x9e\x16\xc5\x4d\x11\x3a\xbb\x02\xa7\x5b\xdf\x11\xb3\x45\x3d\x07\x18\x25\xbc\x41\x57\x41\xe9\x94\x83\x54\x6b\x8e\x1e\x68\x19\xde\x53\x01\x70\x92\xe4\xef\x87\x1f\x1c\xa0\xd3\x50\x8f\x93\x78\x28\xa4\x66\x7d\xb1\x1f\xff\xf9\x41\x6e\xeb\xb9\x4b\xf9\xb8\x4d\x65\x46\x03\x09\x48\x34\xa9\x9c\xa7\x0b\x90\xf5\x62\xa8\x68\x23\x62\x4d\xfe\x9c\xb2\xf9\xe8\x8c\x17\x3f\x13\x46\x4d\x4c\xe2\x55\xf2\x22\xdb\x50\xdd\x63\xab\x42\x46\x57\x34\xe7\x52\x95\xc0\x64\xb6\x4c\xc3\xf1\x5e\x62\x37\xe3\x7f\x33\xd6\x15\xf7\xc2\x43\xe4\xba\x30\x89\x60\xcf\xd4\x39\x34\x02\x52\x55\x00\xbb\x79\x02\x97\x0b\x39\x31\xd4\x8b\x35\x66\x6a\x2d\x4d\x2a\xb0\x8f\xa1\x2a\xf3\x66\xa0\x04\x34\x6c\x9d\xd9\x3d\x39\xfb\x1b\x73\x40\xf1\x04\xe5\x1f\xed\xbb\x53\x36\x05\xb5\xff\x39\xcf\x6d\x59\x51\x3f\x12\x85\x6d\xcf\xa1\x98\xd7\x93\xb0\xfc\x87\x5c\xde\xa0\x74\x1f\x14\x55\x74\x6d\x8a\x19\xc3\xe9\xd9\x28\xf0\x02\x1b\x01\xc2\x51\x31\x81\x1e\x48\xc3\xc7\x5c\x6f\x41\x42\x2a\x88\x10\xc6\xc8\x1f\x35\xb4\x54\xee\xae\x8c\xd1\x7c\xf3\xf2\xe6\xf0\xbc\xd9\xf2\x90\x98\x4f\x49\x65\x78\x62\x3a\xb8\xe2\x73\x8d\x2d\x10\x84\x0e\xb9\x1d\x10\x1c\xb4\xa2\x37\x22\xb7\x2e\x3d\xd1\x85\x44\x0c\x3b\x9f\x44\xd4\x6a\x39\x3a\x34\xc1\x87\xa2\x0d\x61\x0b\xb6\x98\xc5\x05\x31\x74\x1e\xfe\x96\x32\x35\x12\x32\x98\x00\x77\x2a\x40\x80\x65\xa7\xef\x8e\x4e\x41\x05\xeb\x1f\x5b\xf6\xd3\xfd\x6b\x21\x7f\xd8\x36\xd8\x9f\x53\xb9\x6f\x45"}, +{{0x33,0x55,0x6c,0x60,0xde,0x2f,0x2c,0x9a,0x93,0x03,0xb9,0x9a,0xdd,0x37,0x85,0x92,0x06,0x05,0x05,0xf8,0xe4,0x98,0x61,0x08,0x5a,0x4b,0x15,0xf0,0x72,0xa7,0xef,0x28,},{0x23,0x1e,0xc8,0xcd,0x84,0x58,0x59,0xf6,0x99,0x61,0x27,0x51,0x19,0xdb,0xe4,0xf7,0x15,0xe5,0xec,0x5a,0xa9,0x8b,0xb8,0x74,0x16,0x75,0xb3,0xc2,0xd0,0xc8,0x9f,0xee,},{0xe0,0x6a,0x7a,0x41,0x44,0x57,0xbb,0xbe,0xf2,0xba,0xc3,0x77,0x5c,0xca,0xd0,0x87,0xda,0xcb,0x1f,0xa4,0xbf,0x93,0x88,0x94,0xe8,0xc9,0x29,0x11,0x8e,0x09,0xe6,0x78,0xdd,0x19,0x93,0x8b,0xc8,0x8f,0x43,0xed,0x0f,0x7d,0x31,0xcc,0x6a,0x0e,0x60,0x2c,0x4e,0x4d,0x1f,0xee,0x33,0xd4,0x1e,0x74,0xa1,0x19,0xfa,0x2d,0x1e,0x4e,0x34,0x0f,},"\x96\xaf\x54\x0e\xa2\xb1\x92\x3f\x5f\xd0\xaa\xd3\x21\xac\x03\x20\x70\xc2\xd6\x5b\xa1\x3d\x16\x4e\x75\xc3\x46\x97\x58\xfc\xf3\x1b\xb3\x16\x55\xcb\x3a\x72\x1f\x9c\xb3\x4b\xe2\xc9\x0c\x77\xeb\x65\xbe\x37\xf6\x06\xd3\x2a\x91\x7a\x4c\xb9\xa7\x09\xac\x07\x05\x22\x99\x30\xef\x6e\xb6\xfd\xb0\xfa\x3c\x0f\xd3\xa9\x0c\xe1\x71\x67\x4e\xe3\xed\x06\x35\x4b\xaf\xc3\xc7\x07\x54\x67\xa5\x74\x45\xb8\x03\x85\x64\x04\x47\x90\x2b\xe3\x92\x62\x89\x4b\x1f\x64\xfe\xa5\x82\x87\xdc\x32\x2d\x19\x87\x59\x72\xa7\xc8\xbe\x91\xd3\x1f\x02\x1c\x70\xeb\x68\x2f\xdf\x11\xa1\x0f\x8f\x58\x2a\x12\x6e\x06\x47\x94\x83\x8c\x69\xfd\xf6\x4f\x5b\x6e\x8b\xa5\x9d\x48\xb4\x38\x4f\x8e\x9f\xb5\xc0\x87\xcc\x77\x38\x29\x5c\xd3\x23\x44\xba\x3b\x69\x7e\xe6\xb6\xa8\xb7\x8e\xe7\xa9\x57\x5c\x97\x97\x2a\x4d\x1b\xb1\x84\x86\xf9\x03\x7a\x0f\x3c\x6f\x47\x1a\x90\xf8\x64\x98\xdb\xc0\xdf\x52\x32\xc0\x7e\x8c\x01\xb6\x90\xbe\xe7\x53\x02\x99\x2a\x7a\x36\xfb\x44\x37\xc2\x5a\x8b\xf5\xe3\x4c\xf7\xd5\xb5\x55\x72\xc7\x00\xa0\x79\x84\x8d\x38\x13\x64\xf9\x94\x6a\x91\xeb\x16\x03\xff\x3d\xe5\xeb\xdd\x52\x3b\xd9\x25\x64\x81\x8e\x23\x7a\x53\xe8\xf5\x22\xde\xaa\x2c\x29\xb8\x97\xe9\x61\x58\x6e\x10\x0e\xd0\xfc\x0a\xd7\x0d\x16\x09\x34\xe6\x94\x02\x7e\x5c\x95\x79\x20\xbc\x05\x46\xe9\x01\xbe\x39\xa8\x45\x35\x59\x7e\x1f\x28\x0c\x22\x22\x67\xab\xe9\x7f\x41\x20\x5d\x81\x71\x82\x0d\xd2\xfa\xaf\xc0\x69\x94\x19\x32\x1a\x91\x60\xf6\x9b\x99\xfd\x41\x18\x09\x45\xb6\x2d\x2d\xd1\x05\xcc\x7b\xbe\x82\x1d\x28\x60\x5e\x09\x8e\xdf\xa8\xb2\x30\x9a\xeb\x05\x34\xe7\x56\x37\x7f\x59\x93\x7c\x67\x46\x3f\xd8\x7c\x8b\x92\xab\x58\x11\x9c\xf4\xce\x6c\x66\x5a\xf5\x72\xfb\xae\x1d\xe4\xa2\xcc\x71"}, +{{0x7a,0x5c,0x74,0x31,0x4e,0x11,0x83,0x33,0x4a,0x4b,0x62,0x26,0xb9,0xa8,0x2d,0x70,0xfc,0x2a,0x12,0x4e,0x3f,0x87,0xdb,0x6a,0x22,0x83,0xee,0x05,0xb6,0x8e,0x34,0xe0,},{0xbe,0xae,0x7d,0x3d,0xd9,0x7c,0x67,0xf6,0x27,0x3b,0xfa,0xa0,0x66,0x13,0x1f,0xed,0x8a,0xce,0x7f,0x53,0x5f,0xe6,0x46,0x4e,0x65,0x79,0x1c,0x7e,0x53,0x98,0x57,0x6c,},{0xc2,0xab,0x1f,0x6f,0x51,0x14,0xa8,0x4f,0x21,0x85,0x02,0x58,0x2c,0x56,0x7b,0x37,0xa8,0xbd,0xbc,0xdf,0x63,0x40,0xfa,0x46,0x22,0x87,0x3b,0xe8,0x91,0x06,0xf0,0xa9,0x0b,0x48,0x29,0x50,0x5f,0x72,0x12,0x9d,0xf0,0xab,0x3d,0x85,0x13,0x26,0x87,0x74,0xa3,0x4d,0xf3,0xad,0x21,0xce,0x25,0x4b,0x46,0x44,0x88,0xad,0xdd,0x6c,0x9b,0x04,},"\x98\xba\xc6\x72\x47\x55\x91\x29\x92\xad\xc2\xa4\x8b\x54\x42\x37\x6f\x2d\x92\x79\x97\xa0\x40\xfb\x98\xef\xe5\x44\xeb\x0c\x8e\x18\x66\xb9\x61\x6e\x29\x8d\x33\x60\x31\x6e\xd9\x76\xbd\x94\x6a\x41\x1f\xdd\x3a\x6b\x62\x5c\x0c\x1a\x37\xaf\x0f\x41\xcf\x65\x69\xa7\x88\x4a\xb8\x46\x74\x91\xa9\x87\xdf\x3e\xa7\xa0\xb7\xeb\xc4\x69\x25\x69\xa3\x4c\xe3\xa2\xea\x35\x03\x49\x5b\x2c\x02\xd4\x9d\x7d\x7d\xb5\x79\xd1\x3a\x82\xcf\x0c\xf7\xa9\x54\x7a\x6e\xae\xbe\x68\xe7\x26\x7d\x45\xa6\x0b\x8d\x47\x72\x45\x52\x28\xcc\xa4\x03\x6e\x28\x2e\x1a\x12\x16\xf3\x4c\xef\x7e\xa6\x8f\x93\x82\x70\xbd\xb0\x42\x93\xc8\x85\xd0\x05\xf9\xf7\xe6\x38\xa8\xb4\xea\xd2\x62\x6c\x09\x45\x17\x4f\xf2\xa3\xe2\xd6\xe1\x5a\x4c\x03\x38\xc0\x9e\x12\x60\xf0\x92\x8c\xa9\xd3\x49\x98\x24\xf3\xfe\xdc\x47\x85\xda\x49\xc5\xc3\x4a\x56\x85\x5e\x24\x1f\xac\xc6\x34\x7a\x39\x9d\xdc\xac\x43\x99\xa8\xb1\x58\x19\x8c\x15\x14\x61\xa3\xb1\x89\xe5\x8e\xc1\xf7\xef\xcf\x2a\xb2\x03\x1f\xb1\x7b\x6f\x03\x5b\xa1\xf0\x92\xe9\xee\xe2\xe9\x2c\x2d\x6c\xc2\x03\x22\x87\xf8\x54\xb4\x1e\x70\xfc\x61\xc8\xd1\x1a\x2e\x4f\x07\x08\xf0\x2e\xeb\xd0\x2e\x8c\x7e\x8c\x7b\x38\xa5\x7b\xfa\x1a\x74\x5f\x3a\x86\xc2\x39\x09\xf6\xf8\x9a\xb1\x6c\xe7\xe1\x81\x3c\x1d\x20\x14\x7f\x31\xb4\xcf\x2a\xd0\xb6\x06\xfb\x17\xe5\xac\x1a\xb5\x1e\xf4\xa7\xd8\x09\x3c\xee\x9a\x65\x5f\x47\x1d\xc5\xb1\x46\xbd\x1b\x93\xe5\x40\xa3\xd3\xd3\xe2\xde\x81\x05\x91\x1c\x10\xd6\xab\x5f\xf7\x9c\x2d\x06\x02\x7f\x7a\x54\x56\x1f\x20\x71\x41\x4b\xd3\x30\xa8\x78\x54\x42\x25\x1c\x81\x0e\x23\x2f\x83\xc3\x67\xf0\xbe\x77\x99\xa9\x3f\x52\x38\xf7\xf1\x7b\x5b\xe8\x29\xfd\x89\x12\x3c\x04\x83\x3a\xf8\xb7\x7e\x5a\x43\x63\x04\x7c\xec\xa7"}, +{{0xda,0x80,0x06,0xad,0xc4,0x92,0xca,0x5d,0xc8,0x6c,0x29,0x59,0x43,0x7a,0x75,0xde,0xb6,0x12,0x0f,0xf7,0x87,0xd2,0xec,0xb9,0xc2,0x0c,0x30,0xb5,0x2c,0x26,0xbc,0x41,},{0xff,0x11,0x3b,0xf0,0xaa,0x58,0xd5,0x46,0xf2,0x38,0x5d,0x44,0x4e,0xcb,0x78,0x88,0xf8,0xca,0xba,0x43,0xa1,0x74,0xa8,0x9f,0xd6,0x06,0x5f,0x2b,0x7d,0xc1,0x7b,0xf0,},{0x1f,0x53,0x75,0xdc,0xb3,0xad,0x2b,0xaa,0xff,0x95,0x6d,0x85,0x54,0xec,0xb4,0x24,0x17,0x6b,0xe9,0xa6,0xeb,0x9e,0xa5,0x4e,0x81,0x4e,0x0a,0x73,0xdf,0x2a,0x5d,0x84,0x8a,0xda,0x26,0xba,0x8e,0x18,0x05,0xcd,0x51,0xc5,0xe1,0x69,0x50,0xc1,0xff,0x7d,0x4d,0x27,0x64,0xda,0xa6,0xf4,0xc7,0x50,0x2f,0xb8,0x65,0xcb,0xe5,0x5a,0xaf,0x0b,},"\x3e\xb4\x32\x4d\xbc\x01\x49\xd2\xe7\xd6\xdf\x63\x2b\xb0\xcb\xe9\xa9\xf6\xdf\xa8\x3e\x22\x7f\xc0\x7b\xde\x1b\x57\x7b\x36\x11\xfb\x92\x1c\x9f\x83\x13\xf0\x68\xe6\x29\x5d\x49\x13\xa8\x19\x6b\xe5\x30\xf6\xa0\x1f\x57\xc0\x9c\x02\x84\x91\x44\x4b\x78\x47\x20\xe9\x09\xea\x1f\xb6\x9c\x1c\x1d\xd6\x30\x44\x00\x32\x7b\x77\x31\xb3\x3c\xc4\x6d\xeb\x04\x6c\xda\xb6\xad\x1b\x53\xf1\x74\x9a\x0c\x65\xcb\x9a\x7e\x37\x6f\xfa\x02\x23\x0f\x53\x65\x84\xae\xa2\x43\xc6\x39\x10\x3a\xdb\xba\x76\x43\x21\x64\x9d\x7e\x01\x26\xf8\x2e\x0b\x4f\xd9\xdc\xb8\x6c\x73\x1c\xbc\xc5\x17\xf2\x01\x68\x41\xe9\x16\xbc\xd5\xfd\xe8\x71\xdc\x09\x8c\xd9\x13\xdc\x54\x62\x84\xd1\xb2\x16\x5c\x63\xe8\x8f\x32\xa2\x78\x9a\x50\x08\x56\x37\x1b\x50\xd2\x2f\xb8\xc8\x7d\x1a\x3c\xae\xdc\xdf\xd0\x1e\xe5\xf8\x70\xa5\x3c\x28\x41\x81\xd6\x32\xec\x66\xd4\x8b\x6b\xdd\x56\x46\xac\x39\xc9\xe7\x53\x38\xa5\x20\x21\x20\x62\xbc\x34\x66\xef\x5c\x58\x76\x55\x70\xb9\x05\xf6\x3a\x93\xd0\x7f\x8f\x1b\xaa\xc3\x52\x6b\x01\x6d\xa7\x99\xf3\xe9\xe0\x3a\x4f\x7f\x81\x35\x5e\x0f\x7a\x76\xf3\x0a\x42\xb8\x07\x32\x20\x51\xb7\x1c\x62\x6a\x7a\x29\x6d\x75\xb9\xd9\xd1\xa2\x3b\xcb\x13\xc9\xef\x48\xa9\x12\xdc\x05\x73\x25\xd3\xbc\xfb\x3f\x9f\xad\xaf\x0c\x24\x9b\x10\x2a\xeb\x85\x4a\xa3\x63\x1e\x34\xf6\x9a\xd9\x0c\x2a\xb2\xed\x33\xba\xcc\x40\xb9\xed\x10\x37\xfa\xe6\x7c\xdf\x79\x9d\x5a\x9b\x43\x78\x59\x61\x12\x7d\x62\xf8\xe0\xbc\x15\x89\xfd\x1a\x06\xfc\xa2\xae\xa7\xcf\xc0\x12\xcb\xf7\xb5\xb2\x07\xdd\xc4\xe6\x77\xd8\xae\x4a\xec\x10\x00\x45\xce\x36\xc0\x0b\x74\xd1\xd2\x82\x50\x79\x12\x36\xdc\x5d\xcc\x1e\xd3\x13\xc8\xc2\x46\x17\x26\x66\xf7\x52\x17\x43\x7c\x60\x34\xac\xd6\x41\x98\xcd\x96\xdf\x2a"}, +{{0xa2,0x84,0xe2,0x6b,0x97,0xe5,0x38,0x83,0x9c,0x80,0x8d,0x45,0xbd,0xe6,0xf0,0x12,0xa3,0x54,0x45,0x4a,0xef,0x81,0xca,0xa8,0xc5,0x59,0x14,0x62,0x4f,0x2b,0x7d,0x66,},{0x5a,0xe4,0x6e,0x34,0x69,0x5e,0xfa,0xf4,0x63,0xa4,0x20,0x8f,0xc4,0xe3,0x5b,0x81,0xf2,0xc6,0x35,0x93,0x23,0x8a,0x56,0xf2,0x44,0x4b,0x85,0x0f,0x05,0x8c,0x3c,0x5c,},{0xbf,0x11,0x0e,0x2e,0x9c,0xec,0xbc,0x31,0xfa,0x3e,0x0c,0x24,0x38,0xcd,0x1f,0x43,0x21,0xf9,0x2c,0xd2,0x87,0x00,0x5a,0x48,0x52,0x8a,0xdd,0xf7,0x6c,0xad,0x8d,0x88,0xbb,0x22,0x71,0x9e,0xf9,0x1b,0x13,0x95,0x62,0xa1,0x51,0x18,0x38,0x68,0x26,0x74,0xfa,0xa9,0xff,0x7e,0x7a,0xde,0x6c,0x9d,0x57,0x3f,0x84,0x50,0x36,0xd1,0x89,0x05,},"\x9e\xbf\xe9\x10\xb5\x0a\x5c\xb7\x19\xd9\x5b\x96\x1e\x59\x05\xf0\x0e\xc7\x94\x3b\x55\x46\x8a\xb5\x95\x66\x92\x01\x76\x45\xb3\x66\x07\x1f\x8f\xbb\x77\xeb\x49\xec\x73\xea\x7d\x64\x51\x14\x05\xb9\x0d\xe2\x2d\xb9\x8c\x3e\xae\x39\xc4\x03\x9c\x7a\x13\x34\x30\xe8\x01\x0b\xdd\x39\xa0\x0f\xd1\xa5\x28\xb1\x13\xda\xe1\x49\xcf\xad\x3a\xe3\x40\xda\x27\xdc\xc5\x07\x78\x2e\xcd\x89\x29\x23\x75\x17\xaf\xe7\x46\x3e\xca\x24\x73\xc7\xac\xf6\xf7\xaa\x04\xef\xc9\xf2\x66\xae\x7b\x6d\x63\xbb\x8c\xc2\xa4\x38\xb3\x44\x82\x7f\x07\x13\xd1\xf1\x73\x6f\x0c\xbb\x65\xb9\x93\x53\xf2\x03\x55\xfa\x02\x30\xd4\xfa\x70\x73\x28\xa8\x66\x26\x54\xe8\x3a\xd0\x53\x0a\x10\xf9\xa6\x9e\x17\xc0\x99\xe1\xe2\xb5\xdb\x18\xe5\xf6\xf1\xdc\xed\xa5\x88\x3e\x8c\xab\x79\x70\x1a\x5e\x90\x89\x56\x2e\xd1\x53\xad\x08\xc6\x74\xf0\x97\xc2\x8e\x4d\x16\x63\x3e\x09\x29\x69\xa8\xf0\xbd\xac\x54\x52\x7c\x0e\xe0\x3b\xc2\x00\xe5\xbe\x61\x2e\x3d\x1e\xab\xd8\x70\x91\x10\x1b\x49\x62\xaf\xa0\x7b\x31\x08\x06\x99\x2f\x37\x30\x76\xd7\x6a\x58\x18\x51\x18\x13\x7c\x9d\x26\xee\x2c\xd4\xc6\x18\xc1\x82\x83\xdd\x19\xf0\xe7\xa0\x89\xee\x37\x30\x5b\x6b\x95\x18\xa7\x8d\x80\x98\x43\x6e\xf6\x2b\xe7\xd6\x99\x80\x8a\xce\xcf\x67\x93\x9d\x61\xb3\xe0\x29\x37\xcd\x8c\x5f\x1e\x74\x6d\x42\x74\x33\x4b\xc9\xc3\x7f\xdc\xba\x23\x4c\x16\x6f\xd7\x12\x89\x3f\x3a\x04\x08\x32\xec\x54\x25\xe5\x7d\x80\xf1\x1e\xf9\xca\x5f\xbc\xd6\xc1\x47\xfb\xbf\x5e\x2f\xae\x74\x6e\x0d\xdb\x60\x58\x67\xe3\xbd\x05\x04\x83\xc3\xcd\x13\x29\xab\xe5\x7a\x60\xbf\x88\x89\x8d\xc7\xe8\x0e\xde\x0f\x45\x17\xde\x8f\xc8\x07\xe8\x88\xb6\x21\xa0\x0f\x66\x30\x84\xff\x94\xb9\x99\x96\x62\x8f\x3b\x11\x69\x0a\x60\xf0\x91\x8c\xb5\xc9\xa7\xef"}, +{{0xcc,0x97,0xa9,0x63,0x01,0xce,0xed,0x0f,0x92,0x27,0x31,0xb6,0x85,0xba,0xd8,0xad,0x4f,0x06,0x20,0x7b,0xe3,0x40,0xf5,0xa4,0x4f,0xd1,0x87,0xf2,0x99,0x03,0xec,0x20,},{0xeb,0x56,0x3a,0x7b,0xce,0x12,0xdb,0x97,0xf1,0x89,0x1d,0x0f,0x61,0x0b,0xeb,0xd5,0x51,0x01,0xa3,0x12,0x5c,0xa8,0xdb,0xb5,0x0b,0x25,0xa6,0xb5,0x05,0x0d,0x37,0x84,},{0xff,0xbd,0xd3,0x24,0x41,0x81,0xcd,0xf6,0x03,0x4f,0x4a,0x45,0x0f,0xdd,0x95,0xde,0xe4,0x97,0x1a,0x93,0x3f,0x8b,0xe0,0x22,0xbb,0x0a,0x41,0x06,0xae,0xf3,0x9a,0xf3,0x05,0x5b,0x72,0x18,0x81,0xc9,0xb5,0x4d,0x1e,0x99,0xb9,0x40,0x90,0x96,0xfb,0xe6,0xdc,0x2c,0x99,0x66,0xe3,0x67,0x99,0x64,0xbd,0x7e,0xf4,0xc8,0x08,0xca,0xbf,0x01,},"\xb9\xea\x3b\x3d\xf7\x18\x7e\xa4\x15\xa3\xc3\x35\xe0\x83\x4e\x10\xf4\x40\x91\x5b\x2a\xd4\x1c\x71\xf2\x55\xd6\x95\x0a\x4e\x91\x20\xe4\xd4\x94\xfd\x9e\x67\x2c\xe5\x32\x06\xfd\xc4\x17\xd8\x65\x89\x7b\x47\xac\x10\x54\xe1\xca\x10\x68\x19\x52\x32\xd4\x29\x74\x35\xe4\x4e\x12\x24\xe6\x6a\x91\x2d\x9d\x7d\x18\x29\x46\xff\x5a\x9f\x08\x5b\xb8\xba\x19\xc5\x4d\x16\xb5\x86\xa9\xb3\x04\x61\xb6\x77\x3b\x93\x95\x03\x11\xe1\x61\x98\x86\xf5\xa5\xb3\xf1\x11\xaa\xad\x09\x4b\xae\x31\xc4\x8f\x19\x41\x08\x09\x68\xbd\x02\x77\xbb\x6f\xa9\x2e\xeb\xf3\x24\xb1\x92\xdf\x5c\xc9\x69\x51\x6c\x78\xc7\xb2\xd1\x21\x59\xb4\xd1\xc8\xeb\x03\x16\x0c\x4c\xd1\x90\x7f\x62\xed\x4b\x85\x4c\x56\x9e\xcc\x48\x1c\x08\xe6\x36\xf4\x4e\xd7\xc3\x90\xe5\x8b\x59\x37\xd2\x90\x6b\x28\x17\xbc\x37\x69\xda\xd9\xda\x1b\x0f\x79\x39\x1b\x55\x94\x20\x63\x05\x5d\xa0\xd6\xf2\x49\xa3\xe4\x52\xba\xdd\xaa\x03\x29\x98\xd7\xf7\x33\x98\xcc\xd0\x15\x1b\xfc\x92\xc5\xe2\xfd\xfa\x9b\x14\x85\x5e\x6b\x0d\x37\x46\xdc\xe2\x48\xe2\x19\x67\x29\x87\x25\x2e\xc7\x47\xdf\x27\x47\xfd\x3f\xbd\x8b\x71\x4c\x88\x2d\x70\x7e\xe3\x02\xa9\x04\x95\x0c\x34\x75\x4f\x85\x35\x0e\x1a\xa3\xf8\xea\x62\x93\xcf\x01\xf7\x17\xce\xfb\x6b\x83\xa2\x21\x26\xdf\x5c\x4f\x56\x98\xaa\xfd\x06\xa2\x24\x4a\xd7\xd0\x1f\x34\x01\x7c\xa0\xec\xe6\xf2\x10\x40\x04\x8a\xba\x6c\xa4\xae\xb0\x43\x25\xb9\x40\x2b\xcd\x43\xab\x13\x0a\x10\x57\x88\xac\x3d\x7b\x7d\xa0\x1e\xa9\x42\x6d\xd0\xea\x19\x33\xa8\x18\x99\x33\xa6\xc0\xc6\xcd\x64\x8e\xa3\x16\xa7\x46\x9a\x5f\xdc\x6e\x7c\x93\x4d\x91\x86\x58\x60\x97\xb5\x5d\xd5\x1a\xc4\x87\xbb\x80\xed\x11\xd4\xdf\x8d\x33\x62\x6b\xbc\xe9\x5e\x4f\x13\xbd\x49\x92\x2f\x00\xc9\x20\x22\x3f\x4c\xbf\x93\xcb"}, +{{0x67,0x9e,0x3e,0x34,0x77,0x3a,0xbe,0x4a,0xe2,0x5c,0xae,0x7d,0x07,0xcc,0xd0,0xeb,0x3b,0x0e,0xc0,0xa3,0x5d,0x57,0x02,0x57,0xd6,0x25,0x70,0xde,0x58,0xea,0x25,0x16,},{0x18,0xac,0xff,0xce,0x25,0x3b,0x27,0x25,0x95,0x79,0xed,0x99,0x24,0xf4,0x79,0xca,0xe3,0x12,0x16,0x7b,0xcd,0x87,0x6e,0xdb,0xa8,0x8b,0x5d,0x1d,0x73,0xc4,0x3d,0xbe,},{0x1a,0x51,0x02,0x26,0x28,0xcc,0xbb,0x88,0xea,0xe9,0xb2,0x17,0x73,0xc3,0xf8,0x30,0xb7,0xb6,0xe5,0xbc,0x36,0xc9,0x90,0x3c,0xe7,0x0f,0xbc,0xf4,0x59,0xd6,0xa1,0xed,0x8a,0x1d,0xce,0xff,0x5b,0x19,0x26,0x9e,0xbf,0x5a,0x6f,0xd3,0xd8,0x95,0x88,0x60,0xf5,0x54,0x46,0x1f,0x0e,0x9f,0xc0,0xe2,0x9a,0xf9,0xb1,0xfb,0x17,0x44,0xa8,0x0b,},"\xfb\x2b\x64\x8e\xbb\x16\x68\x82\x44\xf7\x8b\x2e\xe9\xa2\x73\x59\x9d\x56\xb6\x19\x89\x00\xd4\x38\xa9\xe9\x9c\x19\x14\x25\xc7\x2b\xec\x4f\x23\x58\x47\xe1\x8e\x47\xf5\x7c\x3c\xb3\x96\x65\x5f\x77\x89\x21\xf9\x08\x58\x0e\x8e\x83\xc9\x6c\x10\x8b\x20\xdd\x41\x66\x78\x02\x1b\xca\x25\x9b\x98\x51\x8f\xab\xb2\xd3\x53\x2e\x48\x51\xd9\xd5\x2a\xdd\x25\x42\xc0\xcb\x3e\xfa\x38\x57\xa1\x7e\x51\x24\x38\xbc\x0e\xc4\x76\x2e\x2f\x9b\xab\xa4\x29\xc0\x3e\x99\xbe\xc4\x03\x8e\x6b\x0c\xa4\x2b\xff\x5b\x23\x3b\x24\xc3\x33\xb4\xca\xea\xd2\xde\x37\x4a\x87\xb2\xab\x5d\x80\xd6\xe4\x9e\x44\x56\x32\x9d\x51\xae\x97\x3b\xc8\x3d\x78\x62\xf3\xd3\x15\xe5\x14\x48\x1b\x12\x85\x4a\x9d\xfc\x09\xe7\xd1\x4f\x0d\x02\x2c\x0b\xa3\x02\x25\x78\xeb\xa8\xf8\x74\xde\xba\x4a\xa8\xc8\x33\xf2\xb1\x32\x86\x1d\x4d\x51\xe5\x0f\xe9\xaa\x4b\x78\x7b\xd2\xf0\x51\xaa\xc5\x0c\x37\x53\x90\xcb\xbc\xfb\xa2\x00\x2b\x80\xad\x00\xcd\xc1\x29\x80\xf8\xba\x8b\xcb\x70\x64\xaf\xc0\x4d\x5c\x46\x82\xc1\x02\x9b\x10\xa6\xd4\x5f\xe6\xec\xd7\x04\x24\x5f\xaf\x59\x8c\x46\x59\x59\x7c\x5d\x68\xa1\x92\xcc\x1c\xd4\xfa\x45\xe8\x4b\x54\x9e\x8e\x5e\x67\xda\xa8\x79\xae\x5a\x52\x0a\x6b\x55\x50\x51\x98\x76\xa5\x62\xac\x49\xc6\xdb\x0a\xa7\x6e\xc6\x9b\xb6\x4d\xd6\xb5\xe1\xa3\xaf\x2e\x13\x1e\x72\x2e\x7c\xdd\x05\xbe\x34\xb5\xfc\xc6\x25\x9a\xa1\x24\xcc\xf8\x14\xcf\x5b\x50\x0d\x17\x6b\xe2\x8e\xbc\x40\xbb\x21\xf0\x3e\x24\xcc\xc1\x31\xe0\xf4\x1d\xaa\x1c\xa0\x2e\x6b\x00\xc9\xc5\x3f\xad\x12\x48\x61\x4e\x94\x0d\x4b\x23\x77\x60\xab\x75\x69\xa7\x67\xb7\x51\x5d\xd2\xd6\x23\xe5\x7a\x28\x41\xb7\xd2\x44\x1c\xf4\x30\x49\xe4\x69\x8d\x2f\x9c\x9e\xae\x7b\x29\x10\xf6\xad\x65\xed\xf9\xcb\x2b\xdb\xd9\xb2\x9f\x60\x6e\x0d"}, +{{0x9b,0xfa,0x60,0x92,0x3a,0x43,0xed,0x0c,0x24,0xe2,0xf1,0x2f,0x5b,0x86,0xa0,0x71,0x63,0x29,0xf9,0x3d,0x4d,0x8d,0x3e,0x06,0x23,0x80,0x02,0x89,0x32,0x78,0xc1,0x9a,},{0xfb,0x1c,0x00,0x68,0x77,0x81,0xb5,0x5b,0x89,0x3d,0x6b,0x2f,0x4f,0x49,0xcf,0x5f,0x73,0xd2,0x90,0x3c,0x31,0x6d,0x1e,0xee,0x75,0x99,0x1d,0x98,0x3a,0x18,0x68,0xc0,},{0x55,0xf2,0x02,0xef,0xb2,0xa5,0x7b,0xe8,0xb4,0xe4,0xfd,0x89,0x4d,0xcc,0x11,0xa4,0xfc,0x5f,0x82,0x76,0x61,0x8e,0xf5,0xcd,0x34,0xa4,0x49,0x5a,0xdb,0x01,0x6a,0x29,0x8e,0x64,0x80,0xa3,0x5c,0xfc,0x53,0xed,0xb2,0x5f,0xf1,0x49,0x9f,0xc5,0x32,0xa3,0x30,0x61,0xcc,0x01,0xa2,0x50,0x45,0x8a,0xa5,0xe4,0xf7,0xf1,0x6f,0x51,0x44,0x0d,},"\xa9\x90\x28\xb0\xf4\xa3\xaa\x5e\x79\xab\xef\x6c\x0d\xf4\xa7\x83\xef\x47\x0f\x1a\x29\xba\x51\xeb\xa0\x0f\x62\x14\xe8\x40\xfe\x19\xe5\xb6\xdc\x60\x21\xab\x59\x9b\xb2\xee\x36\x99\x57\x60\x15\xd7\x9a\x79\x39\xaf\x82\x35\x35\xb6\x30\xe3\x93\x8c\x72\x3f\x6e\x0b\x92\x29\xd4\x6b\xb3\x37\x9a\xcd\xba\x58\x7c\x23\x85\x67\xe3\xd8\x9b\xc3\xbd\x35\x19\xb7\x27\xfc\x69\x4f\xff\x11\x18\xbf\x22\xc8\xbc\x8b\xc8\x2c\x4d\xf7\xf5\xad\x38\xde\x05\xfe\x9f\x76\x29\x99\xec\xaa\x79\x5f\x3a\xe6\x30\xa9\xa3\x16\xd2\x6d\xce\x9f\x15\x68\xff\xa3\xf2\x2b\x02\x95\x21\x40\x20\xb3\xd3\xf5\x33\x7c\x14\x95\x68\x19\x22\x18\x13\x2a\x90\x70\x92\x79\xc0\x1d\x23\xba\xef\xa6\x69\xe1\xc4\xe4\x20\x38\x17\x3f\x13\x19\xc2\x12\xda\x14\x4f\x1c\x4e\xa4\xc5\x2c\x00\x5c\xbc\x0b\x5b\xc2\x83\xe7\x44\x83\xa0\xdc\xa6\x92\x79\xde\xb1\x7a\xe5\xb2\x9c\xfa\xfa\x7d\x00\x63\xf4\xe1\xbc\x93\x53\x7e\xfd\x93\x7e\x58\xa8\xac\xa7\x37\x22\x8f\x93\x7f\xf2\xa7\x41\x89\x0e\x96\xc5\x72\x5d\xa1\x1b\x45\xc4\x13\xa9\xbb\xb4\x18\x0a\x41\x99\x87\xbb\xf0\x46\xbf\xd3\x46\x29\x5d\x62\xf0\x81\xc7\x6d\xaf\x2b\x0e\x1e\xb4\xf6\x71\x2f\xee\xbe\x6f\x0a\x92\xe3\x58\xe7\xdd\xb8\x58\x96\x50\x7c\x34\x0a\x01\xf6\x8d\x1b\x0f\x08\x57\x78\xb7\xc4\x4b\x01\x4a\xa6\x67\x3e\x50\x17\x96\x95\x9a\x17\xa6\x88\xdb\x09\x59\x05\x84\x88\xa7\x11\x25\x72\xf2\x3c\xf9\xcd\xb5\x3b\x5e\xb4\xb4\x5f\x59\x53\xba\x0c\x0c\x69\x0f\x86\xbd\x75\xe8\x9a\x04\x7b\xeb\xaf\x84\x7c\x1d\xfc\x34\x5a\x4f\x3c\x7d\x3b\xee\xc9\x8b\x84\xb0\x21\x90\x03\xe8\x19\xf5\xc2\xad\xb4\x5f\x87\x17\x90\x3d\x1f\x5b\xd5\xd7\x19\x14\xc5\x6f\xca\xbc\x7a\x29\x0f\x9c\x41\x69\x9c\x95\x58\x4d\x6a\x3a\x16\x34\x0c\xb1\x7b\xaa\x1f\xc5\xe5\x46\x7a\xf7\xac\x32\x21"}, +{{0x6e,0x3a,0xf4,0x5e,0x66,0xe2,0x28,0x90,0xc3,0xf3,0xc9,0x34,0xf5,0x23,0xa4,0xd6,0x94,0x27,0x97,0x6e,0x6e,0x52,0x62,0x5f,0x8b,0xad,0x55,0x89,0x93,0x96,0x32,0x19,},{0xe0,0x97,0x36,0x4e,0x76,0xff,0x9f,0x2e,0x1d,0x16,0x7f,0x6b,0x20,0xc1,0xbc,0x58,0x30,0x08,0x5e,0x7e,0xc9,0x93,0xc1,0x38,0xf8,0xb1,0xb2,0x17,0x56,0x37,0xe7,0x41,},{0x26,0xba,0x56,0x2e,0x8a,0x40,0x65,0x70,0x82,0x07,0xc2,0x5e,0x23,0x9b,0x78,0x0a,0xee,0x38,0x79,0x4c,0xf9,0x83,0xa3,0x7a,0xcb,0xb9,0xd5,0x57,0xa6,0x5c,0xee,0xd3,0xc0,0xda,0x47,0xd1,0x7f,0x3e,0x8b,0x8f,0x4e,0xeb,0x1b,0x65,0xa2,0xc1,0x82,0xea,0x6f,0x29,0x62,0x3b,0x63,0xbb,0x0f,0x1c,0x72,0x59,0x26,0x83,0xb1,0x26,0xb9,0x01,},"\x5c\xfc\x2f\x4b\x55\x9f\x82\x05\xb3\x91\x02\x08\x76\x17\xf4\xd8\x6c\x7c\xe6\xcb\x25\x1e\x5f\x89\x60\x1d\xfc\x88\xed\x28\xe8\xd7\xa6\x70\xec\x00\x87\xd2\xea\x5d\x89\x30\x21\xc7\x04\x4d\xa2\x89\x9a\x22\xd7\x76\xfe\x90\x17\x0e\x51\xc2\x03\x25\x06\x90\xd3\x7a\x29\x45\x55\xe7\x4a\xf9\x23\x4c\xbf\x1a\xd8\xf2\x2c\xee\x89\x74\x82\x8a\x0d\x09\xe9\x55\x4b\x71\xee\x3b\xcf\x88\x0a\xb9\x83\x25\xf7\x06\x27\x21\x94\xeb\x2e\x80\xc7\x01\xd4\x41\xb5\xf8\x66\x85\x61\xb8\x88\x49\xf8\x27\xaf\x70\x3a\xb0\x95\x41\x05\xfd\x3c\x54\xb3\xf6\xec\x54\x93\x59\x6d\x0e\x3b\xc6\x78\x18\x04\x83\x10\xc4\xa3\xe0\xc5\x56\xbc\x80\x67\x5f\x20\x1f\x9b\xb9\xc6\x53\x8a\x41\xd9\x9a\xa4\x0c\x88\x6f\xc4\x31\x46\x72\x18\xd8\x19\xc2\x3e\x78\x49\x8a\xed\x06\x13\xfa\x6f\x97\x3e\x22\x11\xdf\x9f\xb8\x7f\x44\x11\x6f\x3f\xe4\xc2\x6d\x6c\xb2\xfa\x33\x4c\x87\xf7\x8c\x08\xca\x8c\x9b\x90\x41\xd8\x3a\x12\x30\x67\x7e\x0a\xf7\x88\x59\x8a\x42\xe4\x4c\xfd\xf6\x96\x4a\x4e\xe8\x0e\x38\x40\x2b\xa6\x7c\x73\xa5\x81\xe5\x52\xba\xa2\x28\x24\x25\xcb\x2c\xa1\x7c\xa9\x2e\xdf\xbf\x98\x29\x91\x02\xfb\xa7\x61\xb9\xb7\x1a\x54\x52\x14\x1b\xb9\xc1\x8d\xd9\x5f\xeb\xc2\xa7\x82\xde\x9c\xee\xc0\x8b\xd2\xee\x3f\x7f\x0c\x1b\xd8\x94\x6d\xba\x99\xcf\x9e\xa0\x86\xab\xaf\xd3\x7c\x9c\xa6\x02\x13\xf0\xde\x17\xc6\x1f\xf9\xc3\x91\xc9\x81\x8e\xd5\xcd\x85\x71\x77\x8b\x7d\xcc\x13\x22\x49\x62\x38\x6f\xb8\xca\x14\xf8\x61\xe9\x9f\x3b\x18\xed\xac\x8a\x5f\x13\x0f\x7b\xfc\xd4\x5d\x04\x5d\x0f\xf3\x4c\x81\x57\x2a\x51\x23\x63\xd6\x53\x0f\x93\x81\x3e\x5f\xb1\x0e\x9c\xb8\x33\x8a\x7f\x93\x80\x04\x91\x00\x6f\x44\x63\xe8\x9f\x0e\xd4\x53\x0e\x5f\x12\xdf\x67\x4f\x59\x89\x04\x78\x0a\xd0\x81\x2b\x1e\x35\x21\xfc\xd0\xf8\x3e"}, +{{0x5f,0x1f,0x27,0x18,0x44,0xd9,0xed,0x5a,0x6a,0x6f,0x20,0x9a,0x21,0x40,0x8d,0xae,0xa4,0x70,0xf6,0xfd,0x53,0xba,0x64,0x79,0xd7,0x40,0x71,0x05,0xb7,0xde,0x4d,0x65,},{0x60,0x85,0xd7,0xfb,0x5a,0x9b,0x2e,0xd8,0x06,0xc1,0xfd,0x30,0xa2,0xaf,0xde,0x76,0x09,0x61,0xf7,0xa3,0x6b,0x48,0xf4,0x87,0x52,0x46,0xe6,0x15,0xa2,0xbd,0x99,0x28,},{0x31,0x9b,0xb4,0xde,0xb2,0x17,0x81,0x12,0x24,0x1b,0x3f,0xb8,0xf4,0x6e,0x10,0x5c,0x3b,0x8e,0x4e,0xf7,0x21,0xeb,0x20,0x0d,0x76,0x2e,0xf3,0x63,0xe2,0x71,0x6f,0x2a,0x89,0xf8,0x0b,0x5b,0x9e,0x89,0x97,0x08,0x90,0xa0,0x98,0x92,0xad,0x6a,0x58,0x80,0x8b,0x47,0x7e,0x94,0x3b,0x3c,0xfa,0x77,0x77,0x4a,0x36,0x45,0xbc,0x74,0x5f,0x03,},"\xee\xd6\xb4\x47\x5d\xc2\x63\xbd\x22\x07\xfe\x9d\x41\xd4\x82\x82\xb7\x13\xf6\x80\xf2\xe0\x37\x38\x4f\x18\xb4\xbf\x22\x43\x47\xf5\xe4\xc4\xb0\x60\xb8\x08\xd4\x12\xea\xab\xcf\x73\x3d\xc3\x9a\x40\xc6\xbd\xa0\x50\x5c\xe7\x1f\xa8\x23\xbd\x1b\x17\x94\x84\x76\x78\xdc\x03\x4e\x79\x99\xc1\x63\x69\x34\x0b\xc6\x0c\x64\xd0\x9b\xb9\x18\x7b\x2e\x32\x60\x55\xa0\x53\xf8\xe5\x05\xea\x41\x96\x86\x14\x71\x62\x2d\xb0\xe4\x6f\x0f\x89\x54\xd8\xa1\xf0\x73\x32\xda\x4d\x8a\xc5\x57\x12\x62\x60\x09\x91\x2f\x8a\x15\xa9\xcd\x63\xa7\x4a\x03\xc9\x2f\x24\x6c\xb6\x3c\xc7\x3f\x92\xe5\x1d\xad\x1b\xc9\x71\x5b\x1e\xd3\xfe\x5f\x2e\x1b\x29\x59\xb9\xb7\x1e\x0e\x37\x36\x0e\xb2\x95\x36\xcf\x79\x71\x47\xfa\xb1\x08\x64\xd6\x14\x6c\x36\xb8\x23\x35\xa0\xce\x93\x14\x08\x47\x9c\x7e\xde\x48\x4f\xf7\x3e\x2d\xbf\xff\xc6\xc9\x22\x7e\x16\xd7\xa2\x3f\x4d\x90\xf1\x55\x84\x51\x4c\x39\x59\x4e\x17\xbf\xbb\x29\x5d\xe9\xd6\x2a\xda\xdb\x58\x9d\xbb\xe0\xb0\x6d\xc8\xda\xc5\xb3\xbf\x51\x7b\x24\xc1\x83\x7b\x39\x47\x2a\x6d\xd3\x89\x31\xff\xbb\xff\x5b\x76\x36\x38\x80\x5b\x4e\x22\x32\x1f\x7a\xfe\x92\xcd\xf5\x02\xfb\x63\xd1\x09\xdd\xcd\x9e\x40\x51\xad\x6f\x45\x59\x85\x32\xbe\x17\x95\x23\x71\x08\x51\xd3\x93\x1e\x88\x7d\x02\xc3\x45\xc7\x9c\x48\x9f\xc1\x06\xa4\xae\x16\x2f\x7d\xf7\x1a\xb9\x0b\x75\x1d\xa7\x03\x8a\x6d\xf7\x61\x6c\xfc\x11\x88\x7e\x21\x06\x8f\xb9\xe3\x3b\xe5\x66\x40\x2b\xe5\x04\xf3\xfc\x27\x42\xb8\x81\x50\x9b\xd4\xfe\x6a\x0f\xc7\x22\x64\x98\x83\xf8\xcb\x65\x55\x98\xa1\x5a\x1d\x4c\x22\x9d\xd8\x6b\x5c\xae\xb7\x11\xa0\x28\xde\xfd\x43\x11\x54\xbb\xa4\x6b\x48\x17\x2a\x4d\x8c\xbd\x45\xbc\x90\xaa\xf8\x74\xb6\x08\x5f\xa2\x84\xf5\xfe\xd6\x55\xad\x6f\xa1\x7d\x67\xb3\xb9\xa7\x96\xfa\x3e"}, +{{0x04,0x8a,0xc9,0xec,0x3e,0xcb,0x30,0xa3,0xb1,0xbf,0xda,0x9b,0x3b,0x79,0xa4,0x8c,0x07,0x93,0xb4,0x90,0x87,0x9e,0x3c,0x8a,0x5e,0x23,0xee,0x2b,0xab,0xcd,0x9b,0x7c,},{0x94,0x6c,0x18,0x6f,0xea,0xfc,0x35,0x80,0xa5,0x8d,0xdd,0x52,0x6f,0xf2,0x29,0xc0,0x47,0x20,0x25,0x0f,0x4c,0xf6,0xbd,0xe0,0x27,0x1e,0xef,0x9b,0x12,0xb1,0xc3,0xf3,},{0x2e,0xcf,0x5b,0x8a,0x59,0xa8,0xe2,0x7d,0x25,0x89,0x0a,0x2a,0xa3,0x2f,0x4a,0x06,0x73,0x27,0x5d,0x53,0x9b,0x17,0x4a,0xfa,0x7b,0x2c,0xeb,0xf2,0xe7,0x62,0x80,0xdf,0xfc,0x33,0x8e,0xde,0x85,0xac,0x8f,0x61,0x40,0x39,0x56,0x0e,0x28,0x06,0xd9,0xe1,0xe3,0xcf,0x9c,0xce,0x2c,0xeb,0x78,0x74,0xff,0xe1,0xa7,0xe8,0x0c,0xde,0xf4,0x0b,},"\xd6\x8b\xe8\xef\x7b\x4c\x7a\x42\x89\xf2\xb1\x8b\x16\xad\xe9\x7f\x4e\x4f\xa1\x64\x52\x97\x6a\xfb\x58\x16\x93\x38\x0c\xc5\x4d\xe3\x8a\x07\x58\x7f\x32\xe2\xd4\x54\x9f\x26\x59\x5f\xee\x23\x93\xbd\x06\x2e\x9b\x00\xba\xe7\x24\x98\xe4\x14\x8c\x8b\x88\x2a\x88\x40\xe1\x5b\x58\x5c\x82\xb5\xc0\xde\xfb\x23\x35\x18\x40\x99\x16\x61\x5d\xeb\x3a\x55\xa5\xf8\x4e\x6b\x3a\xab\x93\x84\x4d\xe3\xb1\xe4\xd8\x6e\x09\xf8\x89\xac\x71\xc3\x24\xeb\x12\xd0\xfb\xd8\x61\xcc\x31\x22\x95\x40\xe8\x43\xa3\x4f\x8d\x5b\xe4\x7c\x0e\xc0\xd2\x3d\xf4\x3e\x06\x81\x3f\xca\x30\x94\x39\x90\x4c\x16\x7d\x10\x43\xc0\xdc\xd4\x44\xb0\x04\xbe\x1f\xf2\x7b\x78\x62\xb0\x0e\xba\x94\x33\xb9\x4b\x0f\xcd\xc6\x75\x21\xda\x0c\x1d\x53\x58\x63\x6c\x78\xf5\x30\x43\x11\x64\xdd\xe2\x0a\x1c\xf1\x64\xf5\x1e\x29\xb8\xe6\x3e\xac\xde\xcc\x86\x9b\x41\x39\x2c\x66\x76\x64\xd9\x16\x80\xd9\xac\x51\x6a\xf5\x48\xf0\x9e\x60\x56\x4e\x81\x4e\x36\xe0\xb5\x63\xdb\xae\x55\xc6\x27\xff\xc1\x41\x58\xa5\x6d\x8e\xb3\x60\x9e\x17\x43\x81\xb2\x1d\xe4\xba\x82\x34\x44\x66\xdd\x57\x7f\x4d\x11\x03\xc4\x3c\x27\xfb\x83\xcb\x83\x3d\x87\xaf\xdf\x74\x12\xb4\x09\x09\x09\xb1\xdd\xe2\x64\xda\xdd\xce\x96\x7f\x49\x6b\xf6\xf1\x71\x12\xbf\x35\x1e\x41\x7d\xb5\x95\x3b\x13\xb8\xf0\xfc\xcc\xbf\x30\xf5\xbc\xf3\x76\x86\x1c\x12\xef\x20\xee\xc8\x9e\xd2\x3c\xf3\x84\xee\x78\xdc\x6e\xb4\x0f\xd5\x81\x1a\x7b\x23\x92\x7c\x13\xe7\xdc\x5d\xa3\xa9\x21\xb8\x83\xa9\xb2\xb1\x15\x59\x70\xfb\x0d\xa7\xd2\x99\x3d\xcd\xfd\x43\x43\x64\x2a\x9d\x5a\x63\x47\xe4\x3c\x19\x3b\x57\x93\xe4\x45\x3a\xc1\x53\x7a\xa3\xd0\x4d\xc9\xf7\x74\xe8\x40\x93\x48\x81\xd7\x8a\x39\xba\x25\x04\x38\xc5\x07\x25\x0e\xed\x2f\x6e\x07\xcc\x95\x3f\x78\x3d\x6b\x72\xb1\xcc\x61\x99\x81"}, +{{0x2f,0x05,0x7d,0x20,0xb1,0x67,0x85,0x31,0x61,0x1f,0x48,0xf0,0x03,0xb7,0xd2,0x2e,0xba,0x5d,0xbb,0xd7,0xe2,0xdd,0x41,0xb7,0xc7,0x9d,0x09,0x07,0x1f,0x85,0xe9,0x93,},{0x62,0x0f,0xc4,0xea,0xa3,0x4d,0x78,0x7d,0xf6,0x75,0xcc,0xbf,0x7e,0x89,0x32,0x04,0x82,0x8d,0xb9,0x2e,0xad,0x17,0xa1,0x16,0x5a,0xc7,0xfa,0x1a,0xb4,0x27,0x19,0xd8,},{0x30,0xdf,0x7b,0x0b,0x1c,0x04,0xfb,0x1e,0xfa,0x35,0x17,0xe9,0x28,0xd6,0xd5,0x7c,0x2c,0xa0,0xd0,0x7f,0x4e,0x04,0xff,0xb1,0xf0,0x8b,0x47,0x92,0xc5,0x93,0x7d,0xd2,0x71,0xcc,0xab,0xdc,0x00,0xdc,0xe8,0x50,0xaf,0xe5,0x0a,0xf5,0x99,0x0f,0x22,0x4e,0x84,0x20,0xa6,0x81,0xd9,0x5f,0x9f,0x7f,0x51,0x5a,0xfe,0xc1,0x02,0xef,0xd1,0x0e,},"\x6e\x35\xf6\xea\xa2\xbf\xee\x06\xea\x6f\x2b\x2f\x7a\xb1\x5f\xa9\x7c\x51\x80\x95\x8a\xf2\xe9\x0a\xf9\x18\xad\xfb\x3d\xb8\x32\x3f\x44\x7c\x7b\xf2\x6d\xc5\x34\x99\x7c\x38\xb7\xfc\x97\x7f\x64\x2d\xe2\x88\xcd\xf2\x53\x07\x1c\xac\xf3\x56\x4e\x3b\x8e\xd6\xdc\xe5\x7d\xdf\xba\x9f\xf7\x83\xba\xd2\xe7\x6d\xf1\x24\x82\x8f\xc1\x03\x1a\xcf\xad\xf0\x1a\x44\xd4\x1b\x42\x16\x1a\xd9\x06\x03\x01\xc1\xaf\x19\x28\xb9\xe5\xb7\x3b\x9b\xd2\x1c\xac\x60\xa8\x42\xb5\x04\xdc\x3c\xc3\x11\xc5\x22\xe3\xbb\x04\x8b\xf2\x21\x44\x4f\x53\xce\xb0\x8e\x77\xe9\x48\x59\x0e\x94\xed\x98\xf1\xb6\x04\xcb\x9e\xad\xc9\x3b\xbe\x74\x31\xc1\x14\x9b\x23\x19\x3f\xf9\x3e\x85\x69\xf1\x13\xe1\x68\x4d\x89\x76\xec\xae\x6f\x09\xe0\x10\x36\x14\xbe\x41\x8a\x47\x2e\xf5\x5b\xb8\x89\x0d\x72\xb3\x41\xcd\xd7\x50\x5b\x50\xa4\x55\x22\xab\x63\xed\x79\x1c\xe8\xf8\x2f\xed\xdd\x7a\x62\x0a\x4f\x6f\xb1\xd2\xfb\x0e\xd0\xc4\x56\x0d\x78\x44\x6d\x83\xb3\xd1\xb1\xbb\x56\xb3\x66\xd1\x96\x02\x0d\x06\x24\xb1\xfb\xdb\x75\xce\x73\x5d\xd4\x3e\x8e\x8d\xf1\x63\xc4\x4e\x23\x69\x93\xdc\xa3\x41\xf5\x13\x2d\x82\x5d\x0a\x4e\x39\x3a\x19\xd3\x8f\x61\xe1\x1e\x0c\xf3\x92\xcb\x9b\x64\x6e\xa2\x3c\x58\x09\x98\x24\xdd\x8d\x9f\xbe\x26\xa4\x9e\x33\xb2\x3d\xf8\x06\x07\xab\xf1\x97\x15\x79\x9c\x19\xac\xc7\x22\xed\x9b\xcf\x94\xa0\xc2\x9a\xd2\x4b\x78\xb0\xb0\x35\xb3\x24\x1c\x64\xcd\x86\xed\xea\xc8\x10\xe6\x67\x45\x69\x4b\x5e\xb1\x62\x50\x60\xed\xf2\xd9\x49\xde\x0d\x34\xf5\x22\xdf\x2d\xc6\x0a\xe6\x94\xa1\x93\xf3\xb8\x2c\x1d\x6f\x83\xa0\xcb\xb8\x40\xf4\x6c\x49\xa3\xd7\xd1\xcf\x06\xde\xaf\x96\xc6\x4f\x8f\x9e\x17\xbd\x9a\xd5\x12\xae\x63\x09\xc4\x86\xd9\xe2\xa7\x8d\xce\xec\xa4\x73\xa0\x42\x1d\xd1\xb6\x43\xc7\x87\x54\x27\x1b\x53\xce"}, +{{0x3a,0x3d,0x27,0x97,0x0f,0xe2,0xac,0xb6,0x95,0x1e,0xdd,0x5c,0xa9,0x0d,0xda,0x0f,0xc6,0xdd,0x22,0x9c,0x0a,0x56,0xdf,0x6e,0xb1,0x1a,0x9c,0x54,0xd2,0x42,0xdb,0xbf,},{0x56,0x4f,0x0d,0xc3,0xdc,0x47,0x20,0xe6,0x8e,0x44,0xdd,0x16,0x71,0x1e,0x04,0x9e,0x61,0x12,0x00,0x00,0x98,0xfa,0x62,0xa1,0xb9,0x8c,0x28,0x80,0x42,0xf7,0xc3,0xbd,},{0x22,0xeb,0x8e,0xa0,0x50,0x73,0x49,0xb6,0xa0,0xac,0xe2,0x5c,0xf9,0x18,0x0c,0xb0,0x8e,0x03,0x57,0xb0,0x45,0x02,0x90,0x5f,0xbe,0x69,0xb4,0xe2,0x1b,0x2b,0xd9,0x4e,0x22,0xcf,0xbd,0xb8,0x51,0xae,0x71,0x6a,0x5c,0x25,0x3c,0x70,0xd5,0xe2,0xb2,0x4e,0xa7,0x8f,0x35,0xbc,0x21,0x32,0x92,0x54,0x3d,0x94,0xe1,0x41,0x10,0xb2,0x41,0x06,},"\x43\x74\xf6\x1c\x2c\xd8\x8a\x3b\x89\x72\x24\x9b\xfa\x79\xb3\x6a\xb6\x9e\x3e\xd4\x84\xcc\x60\xe5\xd9\x54\x1f\xa7\x68\x6c\xf4\xee\xd1\x21\x0c\x5d\x0d\xcf\x42\xdd\x25\x97\x25\x01\x90\x91\x93\xca\x76\xae\x6e\xb7\xf4\x71\xd8\xbd\x0d\x5f\xb5\xa6\xb4\x31\xbc\x3d\xe0\xe0\x31\x8d\x50\x51\x45\x24\xde\x87\xc4\xb8\x30\x05\xdf\xb4\x12\x45\xfb\x1a\xf7\x9b\x84\xa9\x7b\x83\xd3\xca\xc7\xad\x7a\x53\x36\x4e\x2e\x9b\x21\xc9\x7b\x76\x9b\xdc\x57\xf0\x70\x31\x16\x16\x83\x80\xf3\xcc\x88\x36\x89\xeb\x4a\x7f\xa3\xb2\x6d\xbe\x12\xbc\x28\xf8\xc4\x03\x81\xaf\x64\xdf\x4b\x53\x61\xd1\x74\xcf\x75\xac\xbd\x46\x42\x87\x40\xb0\xd1\x32\x2d\x32\xbb\xe9\x48\x45\x21\x59\x66\xae\x58\x87\x77\xa8\xc0\x53\x36\xe3\x52\x30\x6d\x49\x27\x8d\x32\x8e\x49\x6d\xb6\x5e\x9e\xcf\x6c\xe6\x40\x5e\xd1\xc8\x93\x49\x0b\xc4\x8c\x13\xa1\x34\xe1\xfb\x6e\x80\xde\xbe\x6d\x32\xfc\xe6\xef\x74\x78\x3c\x8d\x77\x98\x0a\x44\x1a\x26\xae\xb4\xfd\x83\xcc\x85\x53\x52\xce\xdc\x18\x8f\x52\x79\xce\x21\x1f\x74\x4a\x40\xb2\x3c\xe7\xff\x24\x43\x7a\x1d\xd3\x37\x3e\xc5\xb2\x90\xda\x1f\x94\xf4\x3a\x07\xa3\xff\xea\x5b\x5f\x67\xb5\x2c\x19\x61\x85\xbc\xe9\xe9\xa8\x58\x25\x7f\xcd\x7a\x8e\xba\xf9\x04\x0e\xd0\x91\xfa\xce\x5a\x15\x5a\xa4\x47\xfa\x15\xe1\x21\x22\xd2\x5e\x8f\xc3\x6e\xae\xe2\x13\x7c\x7b\x3a\xa3\x0b\x7e\x3f\xf6\xcc\x86\xb6\xdc\xb9\xea\xf4\x9c\x95\x76\xf0\xf4\x62\x00\x84\x39\xcb\x1a\x3a\xba\x01\x3e\x89\x7a\x0f\xaf\x99\x4c\xb7\xd5\x9e\xde\x57\x74\xbb\x14\x47\x74\xf7\x3c\xa3\x0e\x64\x14\xa7\xcc\x7c\x74\xb2\x0c\x51\xa1\x40\x4d\xdc\x41\x9e\xf7\x62\x45\x93\xe9\xbc\xfb\x37\xc0\xa7\x62\xea\xb6\x8f\xac\xa5\x86\x34\x43\xe1\x6e\xdb\x75\x9d\xbc\x87\x88\x73\x2b\x9e\x4f\x59\xc1\x11\x92\xc3\xfc\xc8\x72\xaf\x55\xf3\x2d"}, +{{0x06,0xd4,0x98,0x31,0x8d,0xa4,0x56,0x24,0x2b,0x9c,0x3b,0x9a,0xb6,0xd5,0x32,0xa1,0x28,0xfc,0xe0,0x44,0xf5,0x38,0x82,0x68,0x2e,0x92,0x62,0x14,0x9c,0x16,0x52,0x88,},{0x41,0x35,0x17,0xaa,0x63,0x20,0x0a,0x17,0x17,0x32,0x09,0xa4,0xb3,0xe7,0x8a,0xb9,0x38,0x3c,0xb4,0xe3,0x9e,0xfd,0x67,0x94,0xc4,0x6a,0x2d,0x13,0xfa,0xfa,0x99,0xc0,},{0x82,0x50,0xf7,0x6d,0xc5,0x99,0xc5,0x12,0x87,0x87,0xe4,0xf6,0xd3,0xda,0x23,0x17,0x33,0x30,0xce,0x33,0x20,0xdb,0xa9,0x59,0xbd,0x71,0x4c,0xc8,0xcc,0x07,0xc6,0x79,0x45,0xd6,0x3e,0x75,0x66,0x2c,0x07,0x5e,0x26,0x74,0x60,0xab,0x7b,0xf5,0x61,0xf2,0x4f,0xaa,0xe3,0xb4,0x1d,0xbf,0x67,0x68,0x99,0x19,0x1e,0x3b,0x02,0xb5,0xaf,0x0a,},"\x3f\xe3\x0e\xcd\x55\x07\x7a\x6e\x50\xdf\x54\xbb\x1b\xf1\x24\x8b\xea\x40\x63\xe3\xfa\x75\x5f\x65\xfc\xd1\x15\x9e\xe0\x46\xef\xd0\xeb\x5f\x2f\xbb\x38\xb5\xc0\x09\x47\xc9\x7d\xc8\x79\xb3\x6b\x9e\x53\x61\x92\x28\x60\x86\xd0\xdc\x12\x05\x36\x10\x38\x61\x74\xa7\xc5\x6f\x22\xa8\x5b\x73\xff\x20\x8c\x59\x44\xf3\x93\x23\x6c\x32\x41\x58\x09\xda\x03\x6e\x73\xca\xd8\xfc\x3c\x30\x37\x80\x64\xa7\x6a\xfa\x93\x0a\x3b\xaa\xe9\xaa\x35\x70\x61\xa8\xc5\xe8\xe7\x56\xa9\xce\xcf\x94\xb7\x2d\xf4\x3f\xac\xd8\x8f\xa4\x9c\xb4\x94\x8c\x63\x68\x31\x8a\x6b\x1e\x5c\xff\x52\xe5\x87\xec\xdf\xae\xfd\xb6\x90\x81\xf2\x8c\x2d\x13\xbf\x8e\xab\x81\xdb\xaa\x5e\x37\x28\xc4\x31\x7f\xb7\x93\xdd\x19\x6b\xca\x0f\xe5\x4a\x6c\x24\x2c\xf2\x6e\x2d\x12\x9b\xa0\xd8\x2a\x2c\x3a\x45\xbc\x8d\x1d\xfd\x6f\x54\xf8\xda\x4f\x51\x89\xc9\x1a\xc2\x14\xfd\xab\xf4\xc5\x97\x38\x1b\x2e\x5c\x40\xcc\x71\xfa\x70\x51\xcf\x2e\xa9\x39\x06\xa3\x7d\x57\xdf\x12\xd5\xc7\xe5\xcd\x77\xc9\x07\xe4\x42\x56\x63\x15\xba\xe5\x1a\x22\x22\xd6\x2e\x3f\x42\xd1\x76\x78\x82\x63\x7d\x66\xa1\xd5\x30\x5a\xb4\x01\x0a\x0e\x49\xc5\x7d\xef\x69\xdc\xea\x83\x9e\x1b\x76\xa4\x11\x35\xba\x95\x2c\xc4\x24\x95\x0e\x8d\x3a\xac\x19\xe1\xd9\x3d\xe7\x75\x7c\x15\xff\x99\x97\xb3\xd2\xa8\x61\x3c\xd9\xa1\x64\x78\x1d\x1b\xe3\x31\x79\x9f\xa6\x10\x9c\xef\x61\x43\x05\xa1\x95\x8f\x62\x90\x3c\x8c\x9e\xa0\xb2\x3b\xa7\x06\xd4\x9c\x54\xba\xcc\xc1\xe6\x3c\xb4\xbf\x14\x78\x5f\xc7\xb0\x62\xa9\x80\x03\x49\xbd\xb0\xbb\x92\x72\x60\xb6\x77\xb6\x0f\x10\xe6\x2c\x87\x80\xf3\xeb\xb5\xeb\x6f\xf0\x36\x02\x63\xd4\x57\xab\x52\xfd\x11\x25\xc9\xce\x04\x6a\x95\xd8\x9d\x28\x73\x50\xc8\x04\xcf\xd4\xff\x2b\x2d\xdd\x18\xa9\xe1\x35\x19\xf2\x0b\x4d\x1e\x05\x1a\xf6\x24\x64\x0f"}, +{{0x8e,0x8e,0x1d,0xb5,0xb1,0x10,0x2e,0x22,0xa9,0x5c,0x47,0xaf,0x36,0x61,0x46,0x9f,0x00,0x0a,0x33,0xf1,0x3b,0x8b,0x87,0xb1,0x15,0xd2,0x45,0x2a,0x41,0x1f,0x6f,0x39,},{0x56,0xd7,0xb3,0x16,0x9a,0x95,0xc2,0x29,0x98,0xec,0x93,0x79,0x25,0xbd,0x7c,0xad,0x13,0xcc,0x65,0x80,0x8c,0xd5,0xd3,0x4a,0x6c,0x4d,0xa8,0x70,0xea,0xf3,0x23,0x64,},{0xf6,0xee,0x5e,0x13,0xcf,0xaa,0x36,0x2c,0x89,0x71,0xd5,0xa4,0xa8,0x79,0xa7,0xe3,0x69,0x66,0x52,0x5c,0xcd,0x86,0xc5,0xa4,0x8c,0xba,0x08,0xd9,0x13,0xec,0xe1,0xa7,0x9c,0x4c,0xd1,0x46,0xb8,0xe9,0xc6,0x51,0x25,0xfb,0xad,0xf1,0x7b,0xac,0x1c,0xab,0xcd,0xe8,0xfd,0x17,0xcf,0xd6,0x8f,0xa1,0xf9,0xc4,0x4e,0xa6,0x1c,0x08,0xa4,0x05,},"\xb2\x46\x34\xfb\xdd\x1b\x76\x61\x31\x5d\x9d\xc1\x53\xba\x90\xd6\x6a\x88\x62\x2a\x41\x58\xf8\xbc\xff\x25\xba\x9c\x29\xe6\x5f\x29\x7f\x8e\x60\x31\x18\x00\xb7\x33\x1b\x69\xfc\x20\xc9\xf8\x5b\xb7\xc1\x84\xbd\x40\x86\xb3\xa9\xf9\xa2\x71\x02\xb6\x23\x62\xbd\xb4\xfa\x5b\x20\x15\x94\x25\x0f\xc6\x28\xfd\x2e\x0e\x0d\x1b\xe0\x3d\xcf\x81\x8c\x60\x94\xc4\xc2\x91\x21\xcb\x2b\xf6\xd9\x08\xed\x8a\xab\x42\x7c\x37\x71\xc0\xc9\x5f\x0a\xc1\x46\x9a\x08\x10\xb6\x03\xa4\x70\x28\x2e\x59\x80\xa6\x07\x29\x19\x7f\xe6\xc2\x0e\xf6\x81\xcd\x1b\x96\x93\x2d\x20\x58\xf8\x96\xea\x74\x16\x42\x2a\x7e\x54\x1f\x22\x4a\x5f\x04\x25\x30\x80\x74\x1c\x5d\x4e\x3e\xb0\x39\xdb\x6b\xa0\x51\xb4\xca\x54\x17\xce\x8a\xfd\xc7\x02\x14\xba\x4d\xcc\x85\xb6\x23\xd1\x1e\x68\x1c\x60\x09\xae\xe4\xe6\x13\x0a\x83\xed\xd0\xd2\xc9\x9f\xb0\x64\x7e\x11\xed\xe7\x30\x1a\xe5\x6b\x59\x90\x4e\xf7\x02\x57\x32\xcd\xe0\x38\x80\x1e\xc7\xe8\xd9\x0a\x9a\x1b\xba\x04\x7f\xe6\x28\x35\x1b\x3b\x89\xd0\xbc\x5a\xe6\x65\xa7\x00\x89\x1f\x09\xeb\xee\xc0\x55\x91\x84\x2a\xdf\xcc\x25\xad\xc3\xc7\x1c\x1e\xbc\x4a\x31\x2e\x54\x71\xbe\x67\x25\x3b\x0e\x94\x28\xb0\xca\xe3\x76\x45\xa0\xf7\xec\xb8\x9d\xd7\x9f\xbd\x9b\xe2\x87\x54\x33\x66\x7a\xe0\x7d\x74\xa7\x98\x3c\x4c\xea\x60\x1e\x72\xe9\x75\xc2\x1d\xf9\x93\xe7\xfa\x22\xa9\xfa\xbd\x45\x45\x5d\x45\xe3\x70\x31\x55\x8e\x13\xa7\xa4\xf5\xf4\x97\xea\x78\xfb\x73\x99\xf8\x83\x8c\x0f\xd5\xde\x4e\xbb\x66\xdb\x29\x0f\x43\xa4\x86\x7d\x50\x53\x09\xf1\xc1\xbc\x27\xe9\xfa\xbc\xbb\xa7\x13\x02\xfc\x12\x04\x71\x5c\xe3\xfc\xb0\x90\x5b\xfa\x41\x1c\x9d\x1c\x9a\xb4\xa3\x99\x54\xe5\x0b\x8e\x0c\xf7\x36\xc1\x02\x89\x56\x3b\xdf\xa9\x67\x55\x3c\x36\xcd\x9e\x55\x5b\xc8\xcc\x56\xbe\x59\x48\x47\xde\x9f\x26\xf9"}, +{{0x38,0x84,0xb8,0xb7,0x9a,0xbf,0xd3,0xbe,0x6c,0x13,0x98,0x5e,0xb8,0x59,0xab,0x74,0x3f,0x15,0x7c,0xd9,0xde,0xb8,0x1b,0x2f,0xe9,0x7e,0xa4,0xd6,0x17,0x3e,0x46,0xf5,},{0xbd,0x7f,0xd9,0xa8,0xde,0xf1,0x3a,0x54,0x2e,0xd2,0xf2,0xfb,0x04,0x88,0x86,0x88,0x5b,0xa9,0xb5,0xce,0x59,0xcb,0x70,0x19,0xfb,0x54,0x66,0x79,0x86,0xee,0xbc,0x26,},{0xf4,0x20,0x6f,0xcd,0x34,0x50,0x24,0x41,0xd5,0x4a,0x73,0x32,0x3f,0x33,0xa5,0xdb,0xb4,0xc9,0x85,0x57,0x31,0x9f,0x21,0x24,0x6f,0x26,0x0f,0xfb,0xbe,0x58,0x44,0x88,0x6d,0xb5,0x67,0xf4,0xb6,0x3c,0x47,0x94,0x3d,0xbb,0x78,0xfc,0x35,0x65,0x7d,0x7c,0x04,0xd4,0xfe,0xb0,0x42,0xff,0x85,0x36,0xf6,0x72,0x92,0x5c,0x31,0x9e,0xfb,0x09,},"\x12\xad\xaf\xe3\x0e\xaf\x2b\x9c\x72\x03\xca\x5d\x44\xb9\x7f\xfe\xd4\xbf\x65\x17\xa4\x99\x88\xe4\xe6\x76\xc8\xe3\x14\xad\xbd\xbe\x23\xd8\xf2\xd3\xe2\xb0\x81\xa7\x02\x4f\xa5\x25\xab\x5a\xae\x26\xe6\x00\x57\xc1\x01\xe8\xf3\x68\xd3\xad\xdb\x93\x76\xc4\x68\x2c\x1f\x42\x24\xd7\xf1\x49\xa8\x47\x4b\xb9\xa8\xf6\x63\xef\x21\x0e\x95\x72\xce\x82\x9d\xa3\x88\xd8\xaa\xe7\x2a\x46\x71\x41\xad\xc1\x53\x47\x3b\xe3\x65\x3b\xaa\xa6\x4b\x5b\x1e\x2e\x30\x68\x3f\x6f\x06\xda\xc2\x78\x4d\x5b\xbf\x0d\x08\x2a\xab\x47\x30\x5e\xd8\xa8\xef\xd0\x88\x6c\xe6\x3a\x17\x93\x15\x22\x5d\x1e\x4d\x4f\xfc\xf1\xf2\x4a\xc2\xf4\x64\xcf\x5e\xd3\xa8\xb6\xd3\x99\x84\x54\xf1\xc0\x2c\xdb\xf0\xa4\x44\xee\x2b\x59\xdd\xbe\x0a\x17\x4a\x0d\x93\x7f\xa6\x28\x65\x08\x8a\xc6\x47\x49\x99\x57\xd2\x81\xc6\x94\x98\x03\xa5\xfb\xdf\xdd\x0d\xd9\xe9\x1b\x69\x76\x86\x1f\x3c\x5f\x21\x26\xf3\x9a\xac\x93\x5b\xe0\x9f\x4b\x97\x15\xbd\x4f\x0d\x5c\x55\xdf\x73\xa6\xb9\xf2\xc0\xad\x26\xce\x49\xd8\x22\xbf\x85\xbf\xa2\x34\x6f\x31\x65\xb0\x38\x59\xa7\x1c\x3d\x2a\x7b\x86\xdb\x6e\x9f\x2e\x5d\x7b\x16\x9a\x91\x0e\xeb\x7e\xf3\x8f\xbd\xfb\xbe\xc4\x3a\x9a\x25\xf0\x4b\xc3\xac\xfd\x3b\x06\x91\x54\x2a\xb6\xde\x9d\xb6\xf0\x30\x58\xf9\x58\x40\x24\xf9\x91\x8e\xde\xcd\x90\xfb\xb8\x57\x35\xd6\xdc\xec\x5b\xd5\x93\xae\x63\xe2\xcc\x96\x55\x35\x99\xa3\x10\xf8\xf2\x00\x9b\xa9\x53\x71\x19\x6b\x4d\x5b\x80\xe7\x55\x96\x37\xf2\x29\x26\x77\x8b\xe5\xe1\xcc\xef\x51\x26\xe2\x44\x3f\xa9\x39\xc2\xa5\x3d\xdd\xb0\x49\x61\xee\xfd\x34\xe5\x38\xcd\x8d\x7f\x0b\xec\x2b\xff\x1e\xf0\xd3\xa4\xbd\xd3\x58\x31\x76\x37\xf4\x2d\x59\x55\x38\xc1\x12\x22\x51\xa9\x4e\x96\x3d\x1f\x81\xe7\xb9\xae\xb1\x64\xf9\x5d\xa9\xa4\xed\x75\x29\xb8\x45\xeb\xc9\x61\xb2\x7b\x5c\x19"}, +{{0xec,0xd5,0x19,0xf2,0x87,0xad,0x39,0x50,0x52,0xb0,0xb3,0x0d,0xea,0xc3,0x41,0xd2,0xa9,0xdf,0x13,0xd6,0x56,0x7c,0x89,0x1c,0x81,0x3a,0x0c,0x9c,0xa5,0x2e,0x87,0x1e,},{0x8e,0xe9,0x4c,0x58,0x8e,0x0b,0x34,0x35,0x85,0xfc,0x67,0x48,0xfd,0x1b,0x54,0xb5,0x77,0x0c,0x64,0xe9,0x93,0x7a,0x56,0x35,0x7a,0x48,0xd4,0x4a,0xe2,0xf5,0x18,0x24,},{0xe8,0xf5,0x1b,0xe7,0x3f,0xc4,0xe0,0x23,0x5a,0xa1,0x53,0xa2,0xe1,0xb3,0x54,0xe9,0xc5,0xd2,0xd3,0x3a,0x11,0xae,0x0e,0x33,0x34,0x78,0xde,0x1d,0x8e,0x6c,0x44,0x56,0xd2,0xe2,0x50,0x82,0x4c,0x32,0x46,0xca,0x0e,0x8d,0x6a,0xe3,0xe1,0x66,0x77,0xa9,0x73,0x44,0x14,0x41,0x08,0xc1,0x3b,0x95,0x9e,0x1d,0xaf,0x51,0xcf,0x0f,0xe5,0x01,},"\xaa\x71\xbe\x5f\x55\x7e\x10\xc9\xfb\x5f\x09\x1a\x3a\x27\x44\x53\x94\x7c\x07\xa0\xe2\x5b\x26\xf9\x50\x92\x24\x54\x1d\xff\x76\xf4\xd9\x6e\xff\xd0\xd5\xa4\x1d\x31\x9b\xc9\x32\x1a\x86\x66\x7d\x55\xcf\x49\x43\x2f\xb5\xc3\xe7\x15\x38\x8f\x3f\x10\x6c\x91\x74\xb1\x61\x0c\x8f\x30\x75\xd5\x93\x1c\x29\x00\x99\x38\x5c\xe9\x24\x9e\x23\x51\x28\xe9\x07\xc5\x33\x90\x03\x6f\xbf\x5d\xa9\x68\xf8\xd0\x12\x33\x69\x58\xde\x90\xc5\xe8\xe6\xb1\x01\x6a\xd4\x3f\xb5\x7c\x8e\x28\x8d\xaf\xe1\x4e\x90\xe6\x4b\x63\x79\x1e\x5c\xbe\x55\x7e\x02\xdf\x8a\xc9\x37\x06\x42\xa7\x1f\xaf\x85\x10\x75\xe5\x56\x5f\x6f\x9a\x26\x7f\x4f\x6b\x45\x4c\xe4\xc5\x47\x48\x10\xb8\x04\x84\x4d\xda\x38\x39\x29\x39\x71\x97\x93\x24\x6a\xa4\x74\x54\xb9\xb0\xe8\x2e\x98\x03\xc0\x99\x35\xd0\x02\x7f\x39\x95\xcc\xa9\x71\x30\x69\xbb\x31\x02\x7f\x7b\x2a\xf1\x2f\xe5\xfe\xec\x7e\xeb\x06\x84\x3d\x82\x96\xec\x56\x82\x26\x2a\x07\xda\xe7\x47\xed\x7b\xc8\x21\xec\x17\x01\x8d\x89\x9f\xd1\x67\xb3\x6a\x7e\x37\x73\xb4\x27\x49\x9d\x99\xdc\x58\x3b\xbe\x4b\x42\x9a\xfa\x6a\x26\x59\x39\x53\xf9\x43\xe4\x67\x3b\xdd\x0d\x2a\x84\x42\x56\x13\x16\x03\xcd\x09\x03\x25\x6f\x33\x4d\x4f\x8e\xc8\x2d\xe1\x15\xb6\xca\x53\x38\xc7\x5c\x8b\xaa\x44\xb4\xba\x96\x3c\x7c\x78\x51\x0d\x8d\xe9\xb2\xa5\x85\x2f\x42\xf3\x46\x3c\x68\x5f\xb3\xa6\xda\x61\xa8\xe0\x89\x26\x62\xd6\xa2\x50\xfc\xaa\x6f\xef\x74\xd4\x50\xfc\x45\x7b\x98\x71\xd0\x8b\xb5\xbe\x30\x11\x29\x4a\xc8\x88\xfc\xe2\x15\xd5\x35\xc3\xb1\xa4\x3b\xb4\x7e\xfe\x3a\xd2\x5d\xa1\x59\x19\x1a\xed\x55\x19\x54\x69\xc5\x90\x93\xff\xb2\x4f\x65\xd6\x0c\x40\x20\xbf\xbe\x64\x7f\xf5\xdb\x7a\xb8\xa0\x1d\x5e\x48\x7b\x0b\x1b\x64\xef\x25\xda\x15\x6d\xb1\x42\xe6\xad\x87\x2a\x4d\xc1\xee\x9b\xa6\x68\x46\x52\x65\x37\x9e"}, +{{0x19,0x3f,0x3c,0x63,0x0f,0x0c,0x85,0x5b,0x52,0x9f,0x34,0xa4,0x4e,0x94,0x49,0x70,0xf4,0xa6,0x97,0x2e,0x6c,0x38,0x59,0x35,0x9c,0x2e,0x0c,0x87,0x62,0xba,0x9e,0xaf,},{0x32,0x56,0xf2,0xc8,0x2e,0x7c,0x80,0x12,0x01,0x21,0x01,0x40,0x56,0x9f,0xaf,0x18,0x50,0x7e,0x60,0x33,0x8c,0x2c,0xc4,0x11,0x8b,0xb1,0xce,0x60,0x5b,0x0e,0xbe,0x61,},{0xb1,0x25,0x10,0xac,0x5f,0x2f,0x6d,0x33,0x36,0x0c,0xdd,0xc6,0x72,0x91,0xd6,0xc2,0x70,0xfd,0x9e,0xe6,0x2d,0xc0,0x86,0xb3,0x8d,0x93,0x2d,0x26,0x47,0x3f,0xe9,0xa2,0x4e,0xfb,0xd4,0x24,0x88,0x67,0xea,0x7e,0x91,0x5a,0x30,0xc5,0xbf,0xb3,0xb8,0xb1,0x9a,0xa0,0x1a,0xa2,0xfe,0xbf,0x0d,0xac,0x6c,0xfd,0x66,0x38,0xa2,0xba,0x7e,0x0c,},"\x98\x62\x3f\x65\x16\x98\x08\x5b\xde\x02\x76\x2e\x8c\x33\x21\xf1\x4d\xa1\x61\x9b\x5c\x3f\x7c\x1a\x56\x8e\x8c\x26\xff\x0c\x62\xfd\xcc\x41\x24\x75\x91\x2e\xb8\xe8\xc4\xb0\xd3\x09\x18\xb8\xff\xee\xf3\x50\x93\x15\xe5\x8d\xa3\x59\xcd\xc2\xf2\x6b\xeb\xfb\x57\x03\x95\x3b\xe1\x6b\x8f\x3b\xeb\x1e\x54\xa1\xab\xee\x0a\xeb\xe2\x4e\x64\xdb\xe8\x73\x40\x2e\x15\x6f\x37\xdf\xc1\x68\xea\xf8\xa1\x14\xce\x08\xa6\x79\x5d\x3f\x64\xf5\x15\x1e\x9a\x8b\x82\x75\xcc\x7b\x49\xa6\xb8\xd8\xa6\x6b\x6d\x4b\x76\x32\xef\x80\x74\x0d\xc1\xc1\xb0\xa3\x8d\x1a\x28\xf7\xc1\xb2\x9f\xa4\x45\x41\xc1\xaa\xd3\x54\xd4\x59\x0c\x23\x1d\xae\x68\x7a\x2a\x8f\xed\x09\xe8\xc1\xeb\xbf\xcc\x38\xf3\x47\xbf\x06\xd9\x45\x77\xe4\x9a\xd1\x39\xf7\x10\xed\x8b\xb1\xfd\x07\x66\x3c\x03\x20\x84\x6f\xbb\x45\x5a\xb8\x37\xef\x96\x4a\xe7\xd4\xec\xee\xa4\x5f\xd7\xbd\x8d\x50\x9f\x82\x1e\x6e\xb0\x27\x49\x4e\xfd\x8d\xd8\xe9\x92\xb8\x86\x98\xee\xc2\xeb\xc5\xe0\x30\x25\xbe\x78\x9c\x18\x01\x3f\x20\x1f\x77\xaa\x2d\x34\xf5\x68\x64\x60\xe4\x3f\xb4\x89\xe0\x87\x76\xf9\x8b\xcd\xe2\xce\xeb\x9d\x4f\xaf\xdf\xfe\x03\x75\x60\x43\x71\xec\x32\xf4\x6b\x81\xfe\xc4\x74\x38\x29\x08\xe9\xd2\x50\xa0\xba\x27\x80\xa7\xd6\xdf\x40\x7b\xd2\xb1\xeb\x12\x67\x48\xd7\x25\x11\xb9\xb0\x69\xeb\x1c\xd4\x42\x70\xf2\x9f\xe8\x4b\x9a\x71\x77\x51\x83\x1d\x04\xc2\x81\x8e\x40\x8f\x22\x78\x93\x76\xc6\x1c\x2c\xa4\x5e\x32\xe7\x88\xea\xd3\xa7\x53\x6b\xf0\x9d\xa8\xaf\x47\x03\x90\x2f\x55\x16\xa0\x20\xd8\x92\x63\xe9\x37\x01\xa2\x56\x5e\xef\x12\x70\x41\x89\x25\xf3\x5a\x28\x8e\x32\x7b\xab\x62\x8a\xc2\xf0\x24\x8c\xfb\xca\x34\x82\xe2\x65\xd1\x62\x1c\xc3\x43\xc3\x1f\x65\x49\x3f\x06\x4b\xad\x0d\x76\x02\x46\x07\x15\xfa\x48\x6f\x29\x42\x63\x46\xaf\x53\xe3\x33\xb7\x5f\x59\x05"}, +{{0xa8,0x8a,0xd0,0x04,0x8d,0x38,0xc4,0x4c,0xeb,0xe7,0x35,0xea,0x38,0x02,0xca,0x57,0x6e,0x37,0x12,0x1c,0x7d,0x4d,0x76,0x0d,0xfd,0x88,0xde,0x16,0x63,0x06,0x4a,0xbb,},{0x14,0xdd,0x8b,0xb3,0x06,0x80,0x3e,0x5a,0x75,0x8e,0xd6,0x8a,0xd2,0x1d,0x07,0xd8,0x81,0x61,0xd5,0x0f,0x1c,0x74,0x71,0x37,0x77,0xda,0x12,0x09,0xaf,0xba,0xea,0x0b,},{0x13,0x41,0xa1,0x48,0xda,0x45,0x93,0xc8,0x8e,0xbc,0x5a,0x58,0x82,0x1e,0xef,0x77,0xf9,0x21,0x86,0x39,0x0f,0xf6,0x33,0xe7,0x62,0x07,0x08,0x4e,0x78,0x74,0xcc,0xf0,0xeb,0x1f,0x9e,0xc7,0x0a,0x3a,0x3f,0x96,0xb5,0x89,0x34,0xbc,0xb0,0x61,0xff,0x92,0x01,0x24,0xf7,0xe5,0x80,0xfa,0x2b,0x0b,0x27,0x95,0x83,0xad,0xf9,0x23,0x2d,0x0c,},"\x2c\xe8\xbc\xa2\x61\x78\x91\x3b\x16\x76\xe9\x0f\xfe\xfd\x94\x5b\xc5\x61\x98\x26\x60\xe2\xa7\x5d\x48\x2f\xf3\x0a\xab\xa1\xba\x43\xf8\x2d\x2e\x6b\x90\x9e\xc1\x0f\xc0\x97\x89\xff\x5c\xf3\x2a\x51\x80\xb6\x01\xea\x80\xfa\xde\xce\x6d\x7e\x7b\xae\xef\x48\x1d\xc6\x97\x9e\x2f\x65\x8a\xe0\xf6\xd8\xe4\x16\xb9\x32\x98\xf7\xd3\x40\x31\xbb\x76\xf7\x16\xed\x99\x1a\x16\xd0\x9a\x58\x2e\x58\xba\x40\x03\xac\x17\xbe\x8b\x44\x69\xe1\xa8\x89\xb2\xfb\xb2\x28\x9e\x98\xaf\x1c\x6d\x5b\xbe\xe7\x77\x56\x71\x3c\x07\x78\xb0\xdc\x44\x6a\x1f\x6c\x48\xc4\xd4\x08\x18\xec\x79\x99\x05\xf0\x69\xbc\x95\x34\x16\x57\xca\x5d\x02\xb7\xa5\x39\xa1\x3a\x02\xcd\x03\x76\xa5\x0e\x83\x43\xc0\xdc\x20\x34\x6d\xe5\x27\x5b\x1d\xcd\x4a\xd7\xaf\x72\x51\x31\xac\x75\xe9\x54\x82\x5d\x30\xea\xa5\x7a\x68\xbb\x98\xdf\xc4\x1c\xaf\xe5\x71\x05\x56\x64\x7b\x38\x7d\x9b\x7f\xd4\xe4\x76\x51\xe5\x13\x80\x50\x79\x8f\x6d\x40\xf4\xee\x71\x20\xb5\x8f\x74\xda\x94\xd7\x3c\xac\xbf\xd3\x93\xd1\x34\x73\x88\xee\x00\xb7\x9b\x8d\xbf\xeb\x57\x81\x41\x21\xbd\xda\x60\xc6\x27\xdc\xe1\x47\xd4\xd5\x68\xd7\x90\x52\xe9\x7b\x9a\x5f\x3e\xb5\x40\x7c\xc4\x64\x61\xa5\x5e\x18\xa9\x60\xd8\x09\x4a\x5f\xea\x48\xb6\x93\x75\x29\xcc\x4e\xc9\x19\xcd\xbe\xdf\x91\x85\x45\x6d\xc0\x0e\x8d\x98\xad\x15\x37\xee\x10\xa0\x57\xf4\xee\xc4\xb8\x1d\xc6\x03\x92\xfc\x91\x88\xd3\xe5\x61\x78\x59\x65\x09\x2e\x44\x31\x7f\x2a\x48\xe3\x66\x05\xfc\x58\x3f\xc1\x73\xb0\x5d\xb9\xdc\xbc\x75\x57\xd0\x64\x87\x39\x0f\xbb\xba\x77\xaf\x3a\x01\x4e\x1a\xc3\x51\x39\xca\xa1\xc5\x3a\x8d\x17\x34\x7f\x17\x8e\x1c\x54\xd0\xf5\x2b\x40\xe9\x10\x42\xc9\x3e\x7e\x48\x1d\x79\x2e\x28\x8f\xc2\x7e\x4c\x2f\xcf\x11\x1f\xe9\x7d\x9e\x23\x37\xd2\xfc\x1c\x30\x98\xf0\x66\x84\xa3\x1d\x55\xeb\xf3\x62\xc0\x27"}, +{{0x3f,0x59,0xd6,0xa0,0x18,0xf5,0x0a,0x82,0x21,0x17,0xe5,0xb4,0x73,0x60,0x9e,0x30,0xcd,0x64,0x92,0x0c,0xa1,0xc2,0x75,0x0d,0xcb,0x09,0xea,0xab,0x80,0x7a,0x3e,0xac,},{0x45,0x7d,0x0e,0x59,0xc1,0x1f,0x34,0x8f,0x3b,0xfb,0xdd,0x3f,0x32,0x7d,0xe7,0x8c,0x0a,0x75,0x77,0xc0,0xae,0xef,0x42,0xd4,0xc1,0xe5,0x67,0x00,0xd1,0x08,0x80,0x8b,},{0xd7,0x42,0x5e,0xa1,0x94,0xa6,0x71,0x5c,0x45,0x2e,0xc4,0xf6,0xd6,0xc7,0x6e,0x6d,0xd3,0x74,0xd3,0xca,0x7a,0xe7,0xa1,0x19,0x95,0xd0,0x2b,0x94,0x2d,0x4a,0x31,0x87,0x0d,0xd7,0x34,0xc1,0x2f,0xca,0x89,0xa8,0xeb,0x02,0x13,0xeb,0x13,0x9c,0x14,0xa8,0x7a,0x6a,0x33,0xe8,0x18,0x60,0x3b,0x2e,0x31,0x30,0x23,0xfa,0x58,0x73,0x7d,0x0e,},"\x7d\x10\x3a\x6c\x6b\xa2\xd0\x90\x87\xee\xf2\x25\x4c\x1c\x90\x3f\x06\x76\x95\xa5\x4c\x45\x15\xe4\xd1\x3b\xc1\xfb\xfb\x54\xd6\xe7\xa1\x67\x34\x9c\x14\x80\x99\x76\xda\x04\xa7\xe5\x8d\x96\xb4\x0a\xac\x3b\x2b\xdd\x14\xb9\xb5\x03\x22\xbb\x11\x64\x5f\x05\xe5\xe9\x78\xbc\x7f\xbd\x02\x49\x2e\xf8\x8f\x87\xd6\x68\x28\x0f\xd7\x08\x37\x32\x07\xff\x67\x0f\xcd\xa9\x7d\xf8\x48\x5d\x5e\x46\xdc\x3b\xd0\x43\x47\xf4\xd7\x52\x7e\xab\x27\x18\xf7\xd9\x3d\x13\x2b\xa7\x75\x82\x18\x89\x4e\x75\xa7\xde\xab\xe6\x93\x33\x5b\xa0\xdc\x73\xbf\x26\xc2\x88\xbf\xe9\xbe\x8a\x73\x6d\x75\xe5\xe0\xea\xa7\xbb\xe8\xd0\xb7\x7a\xbd\xd5\x14\x6e\x0f\xc9\xb3\x0d\xb9\xf0\x7c\xf4\xbf\x36\x26\x0a\x1f\x41\x41\x03\x31\xf8\xb4\x7c\x6b\x38\x33\x8c\x6d\xc9\xe8\x01\xff\xe1\xd5\x85\xf9\xb7\xfc\x31\xe9\x77\x8b\xca\x30\x27\xc2\x32\xc0\x74\xcb\x18\xe5\xb7\x29\x97\x00\x5f\xfe\xee\x4b\xf3\x7c\x8f\x87\x4b\x1b\x24\x6a\x63\x45\x41\x5d\xac\xac\xa7\x07\x5a\x60\x44\x3a\xc3\x31\x92\x36\xe2\x3c\xf6\xb7\x54\x47\x40\x80\x70\x52\x11\x49\x84\xb8\xd8\xf7\xe8\x57\xdc\xc6\xfa\xec\x88\x69\xcf\x96\xb9\x97\xdf\xa9\xaf\x91\x84\xad\x62\x3f\x1d\x90\xb8\xca\x75\x9b\x44\x8e\xab\xfc\xe1\x8c\x17\xcf\xdf\x9a\x3e\x33\x12\xe6\x3e\x5f\x08\x4c\xea\x90\x4c\x1c\x90\x99\x13\xcc\x4b\x19\xd0\x44\xa3\x72\x00\x34\x97\x3c\x73\x84\x94\x9b\xd6\xf9\xba\x92\x56\xf9\x8c\xd3\x94\xc5\x66\xda\x83\xc3\x11\x80\x10\x9f\x16\xd1\x03\x47\xb7\xe3\xe9\xdd\x6b\xe3\xbd\x3c\x77\xff\x1a\x79\x96\xa0\x78\xdc\xf8\x9d\xcd\xce\x2d\x1b\x61\x56\x95\xf4\xcc\x9f\x8f\x4f\x2a\x08\x80\x46\x41\xbc\xa8\x26\x62\xce\x88\xfa\xa5\x31\x45\xb6\xa4\x59\x55\xae\xc8\xcc\x2a\xf8\x1c\xcc\xb5\xd7\xc6\x4f\x9e\xce\x1c\x99\x83\x32\x64\x84\xa1\xe5\xec\xe4\xce\x36\x54\x4d\x63\x73\x5f\x77\x76\xf2\x1a\x20"}, +{{0xa1,0x21,0x2b,0x34,0xdb,0xca,0x63,0xb7,0x09,0x36,0x12,0xd0,0x5d,0xab,0x7b,0x4c,0xc8,0xf7,0xb6,0x76,0xa9,0x34,0xad,0x01,0xf6,0x59,0x85,0x1b,0x3b,0xb4,0x4e,0x4e,},{0xba,0x2f,0xcc,0xea,0x9a,0x08,0x05,0x91,0xbe,0x71,0x26,0x8d,0x7e,0x95,0x1f,0x25,0x0d,0xed,0xc0,0x04,0x16,0xe5,0xf3,0xf9,0x08,0xdb,0x6c,0xc5,0x71,0x25,0x49,0x25,},{0xfa,0x93,0xed,0x65,0x95,0xbc,0x95,0x8d,0xc0,0x42,0xce,0x16,0x45,0x16,0x7b,0x79,0xe8,0xf6,0x73,0x4c,0x46,0xf8,0x0f,0x63,0x1f,0xd5,0x48,0x49,0x08,0xf5,0xe5,0x1a,0x22,0x42,0x7e,0xe6,0x86,0xf5,0x64,0xff,0x98,0x2f,0x6e,0xf4,0xd2,0xca,0x1f,0x0c,0xa5,0x62,0x49,0x10,0xcd,0xd6,0x3c,0x11,0xa3,0xc2,0xb1,0x6d,0x40,0x97,0x3c,0x07,},"\x07\xc3\x7c\x46\xbe\x3c\x68\xd0\x56\x89\x57\x7a\xa6\x4a\x93\x2b\x90\x64\x46\xb2\x9b\xaf\x12\xf6\x17\x4a\x6b\x42\xbb\xae\xfd\x1f\x1f\x37\x3e\x0b\xcc\xc4\x73\xdd\xfc\xee\x1a\x7f\x21\xb9\x6a\x62\x60\xef\x0a\xa1\xf2\xd8\xb2\x95\x9e\x71\xd1\x2c\x95\x33\x58\xa2\x77\x4c\xc5\xe6\xf3\x79\xa3\x13\xe4\x35\xed\x69\xdf\xd6\xd4\xa5\x9a\xde\xe3\xcc\x7e\xc4\xba\xcb\xdb\xb3\xfe\xe5\x43\x0b\x73\xf6\x05\x1a\x60\x96\xc6\x0e\x9b\xc9\x2c\xc8\xfa\x05\x9f\xac\x2a\x93\xef\x70\x07\xd6\x4f\xbe\x50\x06\x49\x64\xd5\xa0\xad\x60\x11\x75\xcd\x9c\xab\xa4\x53\xf9\x10\x3b\x25\x48\x55\x45\xd3\x01\xf0\x3c\x5f\x9f\x94\x78\xbd\xf9\xd4\x14\xbf\x1d\xca\x3b\x1c\x1d\x9d\xaa\x99\x71\xf9\xe6\x17\xfb\xfa\xf5\xb0\x2a\x7f\xbd\x5d\x4f\xb8\x94\xc0\x97\x5c\x54\x59\x2b\x49\xa0\xfc\x85\xdd\x08\x53\xf3\x0c\x51\x50\x2d\x98\xfc\x1a\xb8\x5a\x17\xcc\x58\x96\x1a\xae\x97\x64\x57\x0b\xa5\xcb\xdb\xc9\x6d\xfc\xeb\x8d\x11\xda\x53\x36\x4b\x40\x25\xfe\x0b\x8b\xa8\xa3\x53\xad\x23\x68\x67\x20\x16\x9f\xe9\x73\x43\x2f\xfe\x29\x1a\x4b\x11\xde\xdd\xa0\xaa\xc7\x9a\x5e\x42\x62\x0a\x64\x58\x7d\x20\x59\xe7\x87\x01\x3b\x40\xce\xec\x59\x92\x08\xf6\x6e\xd0\xca\x6e\x1b\xe9\x09\x2e\xc2\x7d\xb2\x16\xee\x6d\xad\xfe\xbc\x21\x70\x5b\xc4\xa8\x5a\xee\x57\x7e\x57\xd2\x39\xaf\x58\x6e\xfe\xec\x22\xcf\x38\xd1\xcf\xb3\xcd\x74\xdd\x0d\x9a\x33\x81\xaa\x81\xe6\xa2\x97\xe3\x9b\x81\x91\x37\xad\x27\xd4\x75\xe2\xbf\x54\xaa\x42\x6d\xc2\x9c\x4c\xa8\x17\x6d\xf3\x43\x13\x7a\x2d\x79\xd1\x2e\xf9\xaa\x7b\xe1\xcf\x67\x75\xe5\xd8\xa4\x43\x0a\x85\xc3\x3d\xb6\x1c\xd2\xf3\x51\x87\xb4\xf6\xea\x9e\xbd\xd7\x53\xd1\xc4\xef\x72\x47\x11\x59\xff\x07\xb7\x78\x70\x90\x64\x96\x24\x9d\x42\x78\xe3\xf3\xca\x6b\xcb\xf3\x7a\x26\x5b\x89\x65\x39\x19\x0f\x9a\x31\xf1\xe7\xb4\xb6\x5c\xd1"}, +{{0xd9,0x68,0x20,0x86,0xfe,0x7d,0xda,0x30,0xb8,0x71,0x11,0x06,0x01,0x93,0xd8,0x47,0x56,0x6a,0xb9,0x4c,0xfd,0x9c,0x97,0xab,0x6b,0x43,0xe7,0xa8,0xd3,0xf7,0x93,0x82,},{0x8b,0x0b,0x13,0x72,0xd8,0x87,0x33,0xef,0x72,0x33,0xf6,0x37,0x97,0x90,0xd1,0xe4,0x6e,0x1e,0x07,0xe9,0xd3,0xfb,0x8b,0x0b,0xe2,0x52,0xed,0x04,0xc5,0xfa,0x16,0x3d,},{0x17,0x93,0xe4,0x97,0xeb,0x52,0x1c,0xa7,0x4e,0x35,0xd1,0x4a,0x63,0x86,0x8c,0xbe,0x94,0x99,0xda,0x2f,0x21,0xb4,0xeb,0x52,0x60,0x34,0x0f,0xca,0x3c,0x1f,0xec,0xa7,0x8d,0xbe,0x5b,0x14,0xac,0x10,0xf3,0xfa,0x76,0xfa,0x2e,0x71,0xe4,0xc9,0x14,0x61,0xaa,0x75,0x97,0x7e,0x5e,0x70,0x79,0x26,0x70,0xef,0x7f,0xf0,0xe6,0xa2,0x87,0x08,},"\xe8\x81\x4b\xe1\x24\xbe\x3c\x63\xcc\x9a\xdb\x03\xaf\x49\x3d\x44\x2f\xf2\x0d\x8b\x20\x0b\x20\xcd\x24\x93\x67\xf4\x17\xf9\xa9\xd8\x93\xfb\xbb\xe8\x5a\x64\x2b\xe2\x70\x1d\x1d\x1b\x3c\xd4\x8a\x85\xcf\x58\xf1\x59\xa1\x97\x27\x31\x43\xa5\x78\xf4\x2e\x8b\xcc\x8b\x62\x40\xf9\x32\x71\x90\x05\x38\xff\xc1\x87\xc0\xaf\xc8\xdb\xcc\x49\x2b\xcd\x67\x9b\xaa\xef\x3a\xf5\x08\x84\x34\xa9\x45\x86\xf9\x4b\x49\x97\x0b\xba\x18\xf5\xea\x0e\xbf\x0d\x27\xee\x48\x2a\xa8\x3a\xd0\xdd\x0e\xe6\x09\xdf\x59\xd3\x7f\x81\x8b\x2c\x8d\x7c\x15\xf0\xf6\xf5\x44\xdd\x4c\x7e\x7c\xb3\xa1\x67\x24\x32\x4f\x77\xd5\x89\x48\xf8\x47\x5a\x60\xd5\x3e\x5b\xd5\x10\xc1\x71\x37\xc9\x9e\x1c\xfa\x51\x5a\xf9\xbc\x85\x56\x9d\x21\x2a\x21\x19\x07\x29\xf2\x81\x7d\xe8\xc4\x69\x15\xe0\x21\xdf\x70\xff\x6d\x60\x21\x5f\x61\x4f\xc2\x11\x39\x90\x4d\xf3\xb2\x92\xb7\x49\xdc\x4d\xea\x02\x51\x8b\x62\xd1\x58\x62\xc9\x2d\x2a\x4c\x99\x67\x01\xcd\xec\xae\xd8\x4a\xb6\x28\xee\x98\x4f\xc1\x11\xee\xcb\x59\xe4\x84\x44\xef\xc0\xd4\x56\xe2\xc8\x52\x51\x84\x41\xc3\xdb\x76\x30\xdd\xd5\x15\x62\x49\xa2\x87\x30\x98\x38\x38\xae\x59\xac\x4c\xc7\x11\x0f\xd6\xde\x68\x10\x1e\xa5\xb2\xff\x69\xfd\x36\x4e\x3c\x94\x48\xde\xfe\xfe\x17\x5b\xcb\xe1\x17\xcc\x11\xb4\xff\x75\x49\xc3\x3e\x10\x25\xb6\xb5\x92\x04\x8a\x8e\x31\x96\x9e\x81\x8d\xcc\x18\x8b\xb1\x9d\x7a\x24\x40\xa3\xba\xba\x4e\xb1\xb8\x1c\x45\x67\x9d\xb4\x6b\x31\xbc\xde\x77\x76\x75\x7d\x99\x31\xec\x20\x63\xfc\x6f\x1f\xcd\x76\x1e\xcc\x57\xa7\xd0\x30\xa8\x5e\xa2\x73\xef\x18\x25\xb0\x50\x92\xab\x96\x45\x35\x9a\x44\x4f\xf7\xd1\x66\xb5\x75\xfa\xc2\x98\x30\x8d\x9f\xaa\x68\x46\x3d\x1d\x0f\x7b\x7d\xf8\xa5\x1c\x68\x15\xd3\x71\x59\xad\xc0\xb5\x93\x22\x4a\x81\x83\x21\xd7\x21\x9f\x09\x68\x6c\xfc\x95\x22\x59\x71\x8d\xfc"}, +{{0xb5,0x2b,0x24,0x9a,0x7a,0xea,0xe0,0xfb,0xd9,0x4f,0xfc,0xf9,0xa9,0xfd,0xe1,0x0d,0xe6,0x1c,0x3f,0x4c,0xbd,0xa1,0x4b,0x28,0x9f,0xe0,0x1f,0x82,0x70,0x73,0x34,0xca,},{0x73,0x51,0x63,0xbf,0xcf,0xd5,0x4f,0x9d,0x35,0x2e,0x1c,0x2f,0x3c,0x01,0x70,0xc9,0x5c,0x18,0x42,0xcc,0xc7,0x42,0x16,0x23,0xae,0x04,0x96,0x98,0x0c,0xee,0x79,0x1c,},{0x6f,0x48,0xa9,0xf7,0xf0,0xfa,0x19,0x2b,0x66,0xd1,0x21,0x75,0xa3,0x33,0x61,0x23,0x03,0xe1,0x80,0xb9,0xfa,0xb1,0x8e,0xda,0xbe,0xbc,0xdf,0x66,0x74,0xfd,0xfc,0xc5,0x36,0x07,0x08,0x9b,0xf9,0x80,0xce,0x35,0x89,0x4c,0x2f,0x9b,0xab,0xdc,0x44,0x38,0x66,0x7a,0xb3,0x29,0x7a,0x62,0x48,0xec,0x02,0x69,0xfa,0xa9,0x9c,0x72,0x48,0x07,},"\x1d\x44\x5e\x8e\xe3\x6f\x6e\x10\x64\xee\x12\x81\xe6\xb4\xa4\xce\xc5\x0a\x91\xc2\xb6\x67\xc8\x30\x5d\x1e\x9a\x5f\x7b\x73\xa3\x44\x58\x82\x58\x1f\xb0\xc1\x1e\x64\xf6\xee\x92\xe8\x11\xf9\xf2\xd6\xc5\x9c\x63\x44\xbe\x76\x91\xd1\x16\xdd\xa4\x93\xca\xde\x51\xc0\xce\x77\x37\x2b\x61\xa7\xc4\xfb\xb6\x33\x40\x13\x33\xcb\xf7\x13\x72\xad\x2f\x04\x4e\x99\x2a\xc0\x35\xf5\x87\x9c\x05\x30\x04\xf8\x22\x3f\x23\x7a\x24\xa4\x09\xb7\x89\x4f\x6a\xd5\x18\xe0\x46\xb8\xa8\x4c\x3f\x4c\x62\x60\xe6\x16\x9f\xd9\x44\xd5\x7f\xbc\xf9\xba\x27\x75\xf2\xd6\x0e\xd7\x72\xc4\x6c\xcd\x63\xc8\x50\xb8\x0d\x58\x7c\x52\x08\xdf\xb1\xa2\x58\x78\xc0\x2d\xec\xe3\xe6\x02\xe9\x63\x2f\xc3\xc2\xc7\x9b\x25\xab\x41\x03\x4c\x6e\x26\xb8\x69\x25\x53\x57\xa6\x86\x78\x1d\xfe\x6e\x64\x4b\xeb\xa9\xb6\x27\xda\x1f\xcb\x5e\xc0\xbe\x49\x7c\xf1\x88\xe1\xef\x1a\xf0\x60\x1b\xf1\x6b\x29\x11\xfd\x9f\xf3\x4f\x0e\x97\xac\x95\xa7\xfe\x2c\xf9\x0e\xa6\xce\xd3\x3c\xcb\x0e\xd1\xef\x2d\x41\x60\xef\xb0\x7c\x59\x1a\x5c\xb1\x6c\x70\xca\x16\x94\xfb\x36\xf2\xca\x19\xeb\xa5\x2b\xe3\xd4\xad\x89\x5a\xbc\xad\xa4\xb3\x6f\x02\x61\xd6\x5f\x59\xe0\xcf\xd2\xa6\x14\x8a\x88\x92\xdd\xbb\x45\x81\x0d\xb3\xbf\x4a\x9e\x26\xe9\x2c\x15\xea\x26\x18\xcf\xee\xb4\x62\xd8\x62\x8f\x25\x4f\x54\xd2\xaf\x27\x11\x3b\xab\x4f\x9a\x7d\x06\x79\x18\x11\x94\x2b\xdc\x32\xf8\x45\x92\x2d\x7b\x2d\xdb\xa9\x59\x14\x09\x28\xf8\xc2\x8d\x98\xb4\x4e\x1d\x19\xb9\x7f\xd3\x9c\xc0\xf9\xa5\x23\x6d\x34\x9f\xc8\x35\xac\x49\x21\x92\x46\x2e\x40\xac\x62\x9b\xeb\xff\xd2\xeb\xa7\x2d\x27\x88\xb2\x44\xbb\x77\x7a\xd0\xf7\xb7\xf9\x6f\x23\x41\x23\x99\xfc\x1d\x87\xa1\xd0\x87\xba\x08\x90\x27\xea\xbb\xc0\x5e\xda\xfe\xe4\x33\x79\xe8\x93\x29\x13\x31\xb4\x60\xbf\xa7\x33\x2e\x08\x42\xec\x25\x73\x39\x3d\xe9\x53\x06"}, +{{0x78,0x2a,0x93,0xef,0xe0,0xef,0x06,0xcb,0x25,0x34,0x33,0x0e,0xfd,0x0e,0x96,0x84,0xe9,0x96,0x9b,0x52,0x58,0x12,0x3e,0x49,0x02,0x39,0xbf,0x24,0xbf,0x9f,0x65,0x23,},{0x94,0x2f,0xa1,0x40,0x6e,0xe2,0x68,0x3e,0x29,0x37,0x7e,0x49,0xf7,0xba,0x75,0x7c,0xf5,0x0e,0xf0,0x72,0x37,0x07,0xd4,0x40,0x3d,0x28,0x62,0x25,0x70,0x45,0xde,0x87,},{0x93,0xe7,0x40,0x5a,0x40,0x44,0x51,0x01,0x66,0xc8,0xac,0x26,0x4c,0xe3,0xb5,0xba,0x66,0x65,0xd6,0x8b,0xad,0x45,0x87,0x12,0xdc,0x93,0xc2,0xc3,0x90,0x56,0x8d,0x74,0x02,0xef,0x7d,0x57,0xf5,0x49,0xb8,0xa1,0x04,0x2f,0x7f,0x69,0xa6,0x79,0xaa,0x85,0x5f,0x34,0xf8,0x01,0xd5,0x7d,0x79,0x89,0x5d,0xeb,0x8d,0xea,0xdb,0x35,0x23,0x08,},"\x46\xa4\xe3\x19\xa6\x70\xac\x99\x39\x94\xa5\x33\x00\xc3\xf7\x91\x44\xc2\xf7\xfe\xc1\x11\x6e\xee\xb3\x62\x1c\x76\xac\x35\xda\x79\xdb\xff\x6e\x18\x9c\xa9\xdb\xfc\x9a\xbb\xda\x05\x48\x47\xb2\x97\x1b\x02\xfa\xce\xbb\xe9\x26\xd4\x69\xeb\x0a\x86\x03\x89\xac\x74\x41\x62\xbf\x6f\xb1\x3b\x42\xcb\x9b\xb8\xc9\xd7\x26\x07\x13\x8e\x78\x00\x12\x1e\xe0\xcd\x63\x3e\xd5\x35\xc7\xae\x5f\x40\x60\xbb\xdd\x27\x1c\x9d\x11\x0a\xbf\xf5\xe0\x60\xea\x6e\xe8\x38\x90\xb1\xe9\x2a\x92\x56\xd7\xb2\xba\x98\x2a\x31\x14\xbb\x6d\xef\xfe\xe2\x69\x6f\x0a\x2f\x9c\x21\xaa\xa5\xb2\xde\xfa\x11\xaa\xb7\x07\x6d\xe6\xe5\x7e\x86\xf2\x84\xbb\x67\xf5\xa4\x9e\xe6\x85\x92\x10\x32\xc9\x5b\x74\xe7\xe3\xea\xc7\x23\xf1\x75\xaf\x08\x2c\x85\x8e\x0d\xfa\x01\x72\x8c\x38\xfb\xbb\x4c\x83\x58\x1f\x81\xac\xe6\xc6\x3c\x6b\xda\xac\x56\x20\xeb\x9a\x56\x8e\x7e\xbb\x7b\x72\xb3\xd1\xa1\x64\xef\x52\x4e\x7b\x9f\x00\x79\x9a\xb0\x86\x71\x59\x76\xc1\x4d\x0d\xf6\x5f\x7b\x96\xbf\x9e\xbc\xda\x7f\xee\xef\x11\x34\x22\x00\x1a\x03\xa7\x63\x3d\xf5\xe4\x99\x39\xa1\x21\xdb\x89\x9d\x9b\x8a\xc2\xdb\x4f\xad\x0c\x30\xcf\x0b\x8b\xdb\xc9\xe9\x80\x2a\x79\x7c\x82\x38\xe4\x65\x11\xff\x24\x06\x8c\xad\xcf\xf2\x44\x8c\xc0\xbf\xf9\x27\x69\x22\x33\x48\xd4\x5d\x6b\x6f\x2c\x8f\x15\x93\x38\x8c\x0b\xbb\xf4\x4b\x6d\xdb\x50\xb9\x8c\xd7\xf0\x9c\x73\x0f\x7d\xe4\xd0\x08\x15\x6c\xb3\xcd\xe0\xca\xb3\xad\x0a\x58\xa8\x39\x54\xe2\x34\xa0\xa8\xa0\x4b\x57\x3c\x9a\x8e\x9b\x92\x9e\xd3\x8b\x8b\x22\x8b\xf5\x5a\x3c\x6e\x2c\x6b\x51\xf6\x82\x65\x2f\xbb\x70\x8e\x74\x64\x0e\x33\x13\xe1\x7b\x46\x94\xd7\xfd\xf0\x11\x1f\x90\x60\x8c\x1b\x5a\xf4\x22\xdc\xde\xca\xd9\xdd\xb7\xf5\x0d\x1b\xf5\xbc\x63\x78\xcc\xaf\xfc\x32\x01\xe6\xc7\x87\xb4\x8c\x44\x3b\xa2\x40\xd9\xd5\x0f\xf6\xc0\xe9\xdf\x7f\x1a\x5b"}, +{{0x6f,0xe7,0xbc,0xf7,0xa6,0x84,0x42,0x3d,0xe1,0x07,0x6f,0xd7,0x6d,0xa7,0x83,0x42,0x33,0x73,0xb3,0x81,0x32,0x9e,0xfd,0x61,0x57,0x42,0x4e,0xc4,0xb2,0x65,0x5a,0x94,},{0x77,0x40,0xe9,0x1a,0xfe,0x45,0x32,0x4f,0x8b,0xb9,0x90,0xca,0x2a,0x34,0x12,0x79,0xdd,0xaf,0x23,0x2c,0x3b,0xb4,0x15,0xf1,0x78,0xb6,0x09,0x2f,0xba,0x19,0x5f,0xec,},{0x99,0x14,0xcc,0x50,0xfe,0xf0,0x93,0x5e,0xfb,0x89,0xb3,0xd6,0x4e,0x3c,0x1c,0x34,0x12,0xae,0xd6,0x59,0xb9,0x01,0x66,0x22,0x2c,0x0d,0x13,0xec,0x1c,0xe3,0xa6,0x8a,0xe6,0x28,0x1b,0x7e,0xfd,0x9d,0x4e,0xc6,0x4b,0x82,0xe7,0x3e,0x14,0x47,0x9f,0x03,0xfb,0xac,0x8f,0xa3,0xab,0xdb,0x41,0xea,0x42,0x15,0xc4,0xa4,0xd4,0x94,0x9d,0x09,},"\x0b\xaf\x0a\xd4\x40\x61\x2b\x4c\x5a\x13\x6c\x3a\x42\xbe\x1c\xa2\xb7\xc3\x19\x86\x2a\x44\xa9\xfd\x50\xc4\xee\x73\x54\x1c\x5e\x64\x57\xef\xa8\x18\x25\xb6\xdd\x4a\x72\x19\x4a\x29\x68\x68\x8b\xd4\x9e\x5a\x8f\x4c\x04\xdb\xaf\xc2\xe7\x88\x4c\x0c\x70\xc2\x08\xd4\xe9\x54\xcd\x16\x75\xda\x8e\x74\xc6\x5c\x49\x7c\xf9\xdc\x69\x42\x49\x65\xbd\xcb\xa5\xde\x52\x93\x6f\x92\x5f\x62\xe2\x01\xf9\x95\x05\xd3\x77\x7b\xeb\x3c\x2e\x08\xb2\xec\x9a\x87\x3e\x5a\x9c\x21\xfb\x4a\x2f\x3e\x86\x1f\x3c\xf4\xd6\xb5\xdc\xd1\xc8\x8b\xcd\x91\x63\x53\x9a\xc6\x2c\xd0\x65\x9f\x4e\xf2\x32\xc2\xce\x57\xfc\x77\xf9\x02\x85\xeb\x35\x01\x69\xed\xc6\xa8\x06\xff\x50\xf6\x1c\x7e\x0b\xee\xeb\xec\xec\x63\xbf\xc9\xd3\x98\x3f\x5b\xb4\xb2\x61\xc7\x46\x47\x1f\xcb\xf2\x89\x2c\x61\x08\x97\x0b\x68\xdb\x5e\x43\xc4\x50\x4d\xda\xe2\xd0\xff\xff\xa2\x8b\x67\x59\xae\x11\x28\xe1\x6f\x66\xd4\x92\xad\x61\xe3\x72\x2c\x96\x0f\x88\x69\x2b\xe8\x1a\x9f\x41\x28\x90\xff\xa3\x46\xe7\x02\xc8\x67\xdf\xa2\x59\x70\x3b\x73\xf5\x25\x07\x4f\x32\x27\xc4\x9c\xec\x1b\x64\x5a\x10\x3b\xd4\x47\x1f\x33\xf9\xf1\xba\xc3\x27\xd7\x91\x78\x61\xd0\xad\x91\xab\xee\x60\x22\x2e\xa2\xa3\xc8\xca\xc0\x52\xae\x9a\x2c\xbd\x90\x85\x5d\x73\x3d\x53\x19\x13\x3f\x95\x41\xbd\x0b\x61\xf0\x99\x52\x68\x35\x1e\x28\x63\xc1\xca\x2c\xa5\x1e\x3c\x97\x63\x83\xf5\xc4\xc1\x1f\xf4\x10\x03\x6f\xd5\x1d\x5a\xc5\x6b\x02\x3c\xe9\x02\x9c\x62\x0f\x22\x55\x70\x19\xad\x9b\x42\x64\xed\x4d\x71\xb4\x34\xf4\xa4\xd1\x7a\x7d\x57\x69\xfa\x1e\x14\xa6\x9f\x7a\xe4\x19\xcc\xf5\x94\x7f\x8c\x76\x82\x69\x71\x16\xc2\x40\x5f\x5a\x19\x59\xc5\x4b\x48\xf0\x87\x2f\x59\x6e\xd4\x59\x64\x48\x8d\xde\xc1\x2b\xdb\x63\x6d\x0b\x34\x9e\x74\x9e\xb6\x60\x92\xff\x45\x11\xfb\xa5\x9b\x59\x62\xcb\x93\xcc\x85\x51\x5c\xc8\x6a\xb0\xc6\xb2"}, +{{0xdd,0xa4,0x8a,0x0d,0x15,0xa2,0x9e,0xba,0x9a,0x76,0x30,0x5d,0x36,0x0e,0x46,0x6e,0x72,0xd8,0x04,0x0e,0xfe,0x2e,0x89,0xc0,0x4b,0x64,0x61,0x31,0x5a,0x9b,0x8b,0xf4,},{0x4f,0x5c,0xc3,0x6a,0x80,0x94,0x16,0xb5,0x8e,0x15,0xd2,0x4c,0xc5,0x79,0x68,0xcb,0x57,0x3b,0x76,0xad,0x90,0x88,0x7a,0x8e,0xf3,0x6c,0xde,0x7e,0xca,0x40,0x0f,0xcc,},{0xce,0x71,0xbc,0x82,0xd5,0x31,0xd0,0xf9,0x3b,0x57,0xbf,0xdc,0x2f,0x73,0x16,0xcf,0x40,0x4e,0xe0,0x9a,0xf8,0x8f,0x33,0xbf,0x80,0x6c,0x7c,0xad,0x6b,0x8f,0xfa,0x36,0x62,0x36,0xba,0x74,0xe7,0x5c,0x15,0x09,0x6d,0xda,0xa6,0xe3,0xa6,0x2a,0x8f,0x5e,0xb1,0xc8,0xc3,0xf6,0xb6,0xc9,0x4a,0x6a,0x34,0x9f,0xc7,0xc0,0xcb,0xfb,0x19,0x0d,},"\xf5\xac\x19\xb8\x1f\x21\x11\xa0\xdb\x0a\xe3\x0d\x15\x13\xed\x34\x3e\x7f\x57\xf7\xf7\x7d\x65\xb8\xac\x7c\xe3\xa6\x01\x17\x4b\xae\xd9\xbf\xa1\x36\x03\x59\x76\xf5\x16\xd5\xa8\x70\xf4\x5d\xb1\x91\x9f\x1e\xb1\xcb\xec\xbe\x88\xec\x32\xd1\x91\xe9\x24\x88\x21\xa7\xe7\x68\x1f\xe3\xab\xec\x11\x58\x4b\xdb\x33\xde\x1b\x4c\xa9\x48\x91\xeb\x66\xdc\xb8\x53\x9a\xc4\x11\x63\x73\x6c\xcf\xd6\x9a\xbb\x83\x81\x4d\xd3\x8c\xd6\x03\x81\x31\x87\x28\x05\x2a\x25\xcb\x66\x54\x71\x05\x86\x50\xcc\xc7\x57\x56\xdb\xee\x68\x8a\xb8\x26\xec\xad\x4a\xd5\xa7\xdb\x57\xe8\xf6\x5f\x1b\x64\xab\xff\x82\xdd\x53\x33\x4b\x79\x7a\xc4\x02\x28\xdd\x81\x7f\x23\x9d\x3e\xe8\x04\xa1\x9a\xea\xc8\xcf\xe3\x3e\xb6\x57\xec\x9c\xe9\x23\xd6\xb3\x88\x91\x4c\xfb\xa2\xe7\x2b\xfc\x2b\xc3\xd6\xf9\x85\xc0\xd9\x75\x34\xdb\x95\x8e\xed\xe5\x7b\x16\x49\x1f\xfb\x75\x5c\x1a\x58\xd7\x8a\xb3\x77\xfa\xec\x0d\x31\x18\x18\xe8\x99\x26\x0e\x3e\xbd\x1c\xcd\x29\x24\x6f\xa8\x2d\x0b\x76\x62\x2b\x2c\x4b\xc5\x2f\x54\x9f\xee\x72\xa3\x0f\x55\x4f\x33\x1f\x36\xd2\xa7\x4d\x99\x9e\xc1\x0a\x08\x29\x4f\x00\x2b\x43\x61\xe5\x90\x27\x9c\x2f\xb1\xbd\xa4\x31\x2c\xcb\x24\xd7\x52\x82\xce\x7c\x06\x1a\x0c\xa5\x52\x0c\x74\xf6\xf6\x33\x3b\x18\xc4\xb5\x41\xcb\x6c\x51\xe0\x15\x75\xba\x80\x51\x2f\xfa\x7c\xe0\xac\xcd\x22\xd1\x40\x27\xc5\x3a\xba\x1f\x74\x37\x83\x5f\x11\x14\xd6\x8e\x3a\xcf\x3f\xf8\xde\x94\xc8\xe4\xef\x6d\x3a\xb3\x12\xc9\x1d\x02\x97\x01\x57\x50\x8f\x54\xa5\x81\x6f\x46\x7a\x21\x4e\x9b\x12\x84\x30\x02\x89\xe6\x5f\x36\x5a\x61\x0a\x8e\xa2\x84\x66\x6c\xfe\x55\x18\xe4\x35\xbc\xcd\x21\x62\x75\x01\xc7\x25\xf0\xb8\xeb\x57\x25\xe0\xe0\x6e\x0c\xef\x5d\xb2\x01\xb4\x8e\xc9\x1e\xbf\x87\x8d\xd5\x7c\xe8\xda\xc7\x33\x48\x48\xa1\xbc\x82\xc1\x8b\x06\x59\x55\xe4\xf5\x9b\xe3\x39\x85\x94\xdc"}, +{{0xec,0x57,0xb9,0x41,0xad,0xf3,0xca,0x13,0xe7,0x7a,0x78,0x05,0x77,0xcf,0xd0,0xdf,0x5b,0x49,0xed,0xc8,0x53,0x51,0x05,0x2d,0xa3,0x4e,0x99,0xf8,0xa9,0xbf,0x32,0x08,},{0x28,0x59,0xc0,0x71,0x97,0x8a,0x04,0xb7,0xf5,0x40,0x7b,0x6d,0x22,0x40,0x1a,0x78,0xef,0xd0,0x39,0x4b,0xb9,0x66,0xb9,0xa0,0x4d,0xa6,0xb5,0xef,0x81,0x9d,0xe3,0xfa,},{0x11,0x8e,0x14,0x62,0x12,0x6b,0x45,0xb8,0xc6,0x80,0x35,0x23,0x75,0x5c,0x56,0xdf,0xc4,0xe1,0x23,0xe4,0xac,0xbb,0x66,0xba,0x0b,0xa6,0xfe,0x3e,0x05,0x3d,0xa4,0x11,0x9f,0x57,0x19,0x29,0x5e,0x0c,0x82,0xac,0x64,0xd7,0xc5,0xcb,0x1a,0xc8,0x98,0xdf,0x26,0x3d,0xdf,0xd3,0x60,0xf3,0x00,0x8d,0x91,0x01,0x8b,0x26,0xf6,0xa1,0x73,0x0a,},"\xd2\xbc\xbd\x1b\xc3\x61\xab\x32\xc6\x6d\x72\xfd\x48\xa8\xe2\x27\xdc\x6b\x8d\x6b\x15\x08\x48\xba\x71\x5f\xf4\x7d\xd3\x5c\x8e\x49\x38\x1b\xb4\xe2\x93\x3f\x42\xcd\x26\xb7\x5b\x14\xd9\xc0\x03\x92\x82\xb6\x2b\x85\x56\xaa\xa1\x1c\xd6\x91\xe8\x28\x38\x2b\xe3\x06\x88\x9f\xc9\x20\x51\x37\xb1\x69\xd3\xbf\x17\xb7\xf3\x76\x93\xfc\xe2\x86\x03\x9f\x03\x80\x9d\x7d\x9d\x98\xc8\xfd\xe4\x6f\x11\x01\x94\x2a\x27\x9c\x51\x67\x06\xf5\x01\x91\xa9\x11\x2f\x6a\x24\x63\x0e\x1a\x26\xc3\x21\xe4\x6c\x9c\xcc\x85\xb6\xef\x94\x2f\x35\x3a\x64\x2b\x9e\x7e\xf9\x98\xc0\xfc\xe2\xd3\xa7\x5b\x99\x9e\xeb\x77\xf3\x1f\x9b\x08\x13\xa9\x7e\x30\x14\xc3\xa8\x6e\x25\x58\x73\x46\x21\xa3\x06\x6d\xae\x35\x84\x50\x31\xe3\x56\x65\xf1\x92\x29\x07\xdb\xb7\x39\x78\x6a\x8b\x76\x58\xab\x60\x27\x6f\x2d\x92\x1d\x1a\x51\x23\x0f\xc7\x4d\x19\xe8\x01\x84\xa4\xf1\x0e\x9e\x83\x4a\xbc\x9a\x36\xc4\x29\x72\x6b\xc0\x55\xdc\x8c\x06\x3f\x0e\xca\x9c\x61\xa8\xa9\x70\xbd\x4b\xb5\xf4\x24\xee\x4d\x04\xbf\xc2\x95\xe3\xbb\x1f\x34\xbe\xcb\xd9\x92\x0f\xe2\xe7\x7f\xcf\x36\x76\x3f\x32\xfc\x9c\xfd\x5e\x46\x59\x79\xc1\x67\xca\xbf\x5a\x12\x44\xb4\x91\xfc\x06\xb8\x94\x64\x19\x04\x6b\xa5\x16\xc5\xb2\x33\xc4\x14\xdd\xef\xb6\xda\x04\xf2\xe1\x3d\xaf\xf7\xa9\xa0\xc0\x2a\x51\x8e\xde\x57\xad\x95\x21\xde\x64\xed\xdf\x6f\x49\xa9\x67\x0f\x63\x2d\x3f\x7d\x42\x42\x52\x07\xd0\x53\x60\x4f\xe3\x9d\x13\xb9\xf5\x2c\x8b\xc2\x92\xb0\x07\x6e\xa4\x2a\x56\x00\x56\xdf\x25\xde\x51\xad\x35\x88\x1d\x08\x54\x32\x24\xd7\xfa\x5d\x70\xb8\x60\x3e\xf2\x3c\xe0\x63\x39\xd6\xcd\x09\xe2\x2a\x95\x74\x9e\x50\xdf\xbd\x3b\x8a\xd6\x9f\xd3\x04\x96\xb9\x84\xd1\xc0\xa1\x99\xc8\x59\x48\x05\xf3\x8b\xa4\x46\x31\xa2\xc5\x9e\xad\xc6\x55\x4d\x19\xf9\xbc\x98\x36\x6d\xfd\xec\x2a\x12\x1d\x0e\x48\x14\xd2\xcd\x3f\x58\x71"}, +{{0xcb,0xfd,0x91,0xd7,0x69,0x5c,0x1f,0x27,0x0f,0x69,0x24,0x6a,0xb3,0xdf,0x90,0xed,0xb2,0x14,0x01,0x10,0x1c,0xa7,0xf8,0xf2,0x6c,0x6d,0x00,0xf4,0xdc,0xb7,0x23,0x3e,},{0x51,0x38,0x79,0xcf,0x79,0xd2,0xf4,0x6d,0xf4,0xb8,0x5a,0x5c,0x09,0x49,0xeb,0x21,0x16,0xab,0xf9,0x81,0x73,0x5a,0x30,0x31,0x64,0xcb,0xd8,0x5a,0xdf,0x20,0xb7,0x52,},{0xf3,0x36,0x13,0x7d,0xfe,0x6f,0x42,0xa6,0x66,0x9b,0x55,0xf7,0x4b,0x80,0xb3,0x03,0x5a,0x04,0x03,0x67,0xf9,0x06,0x56,0xfc,0xef,0x0a,0x64,0x4c,0x52,0x27,0x2d,0xdc,0x39,0x27,0x3c,0xd7,0x72,0x60,0x10,0xeb,0xcd,0x8a,0x30,0xa0,0x52,0x01,0xab,0x70,0xb8,0xff,0x97,0xd0,0x28,0x8a,0x2c,0xb9,0x4c,0xbc,0x49,0x02,0x06,0x47,0x39,0x0b,},"\x26\x4a\x93\x3f\x7d\x0a\xec\xba\xc1\x3e\xef\x64\x4b\x0b\x53\xdd\x53\xa1\x28\x09\x04\x10\x0d\xbc\x1a\xb8\x7b\x51\x14\x89\x98\xf9\xda\x0b\x3a\x0a\x63\x37\xf5\xe3\x48\x6c\x2b\x7e\x54\x8d\x21\x12\x59\x39\x7a\xaa\x19\x4e\xe4\x69\x5b\xf9\x8c\x2d\x5f\x44\x87\x69\x9f\x73\x97\xe5\xd3\xa7\xe6\xd5\xf6\x28\xfb\xd0\x54\x97\xc5\x56\xa5\x0a\x4d\x05\xe2\xb7\x12\xcd\xbc\x35\x10\x68\xe4\x2a\xf1\x95\x38\x90\x1b\x88\x25\x31\x0e\x34\x3e\x1a\x17\xa1\x86\x7d\xde\x0e\xb4\x7d\xda\xb4\x56\xd3\x16\xf3\x52\x15\x54\x93\x7b\xf8\x08\xae\x4e\x4b\xc1\xc3\xc5\xb4\x75\x6e\x4a\x16\x5a\xd9\xe8\x82\x7f\x53\x16\xf7\x48\xca\xc6\x99\x8e\xd2\xd2\x10\x4f\x26\x84\x07\xc1\x35\xe6\x2f\x26\xa9\x22\x46\x0e\xab\x6d\x85\x16\x39\xa0\x0e\x5f\x08\xb3\x47\x65\xea\x02\x44\xf4\x75\xbb\xfe\xac\x18\x3e\x3b\x5b\xd1\xaa\xb7\x98\x52\x27\x98\xa0\x8e\xc6\xbf\x22\x57\xd4\x69\x2f\x5b\x03\xcd\xd0\xa2\x13\x3d\xe9\x70\x60\x3e\x32\x51\x47\x5a\xad\x8d\x93\x4a\xf6\xb2\xbf\xc7\xa6\x50\xb9\x1b\xde\xc1\x43\xf8\xad\x25\x4c\xfa\x50\x6b\xbf\xf2\x8a\x03\xbe\xb6\x59\xef\x5e\x5d\xdf\xfe\x76\xe2\x32\x30\xc4\xcc\xd4\x63\x10\xb3\x7d\xd9\x1f\xa6\xaa\x68\x16\x7f\x62\xa5\x5c\x8a\x69\xf9\xed\x1e\xc6\xcd\xb1\x44\xdd\x81\xab\x0b\xcb\xd6\x26\x43\x42\x0b\xca\xe6\x78\x69\xf6\x4c\x0b\x16\x9f\x3c\xdf\x3c\x90\x58\x95\xb7\xd3\x5b\x6f\xaf\xda\x25\xcc\xf2\x3c\x3d\x10\xde\x32\xe7\xf2\x71\xe3\x00\xd3\x95\x97\xda\x8f\x84\x37\x22\xef\x08\x36\x4a\x5f\x7a\x10\x5b\x96\x55\x17\x2d\xf7\xc8\x2d\x73\x74\xf9\x82\x64\xc9\xcd\xcc\xb4\x96\xf2\xe1\x0f\xd8\x26\x2f\xb1\xa9\xa9\x96\x5b\x0b\x84\x1a\xc0\xd0\xe9\xc1\xa3\xd9\x49\x3e\xa7\xaa\x60\x02\x05\xb8\xf9\x00\xbe\x0d\x7a\xbb\x4d\x98\xa0\x65\x83\xd2\x29\x5c\x27\x63\x18\xbe\x28\xd4\x21\x98\x2d\xed\xd5\xbf\xc3\x3b\x88\x65\xd9\x4e\xf7\x47\xd6\x26\xaf\x99"}, +{{0x51,0xa4,0x19,0x7a,0xb7,0x68,0x6f,0x82,0xf6,0x00,0x3a,0x0c,0x32,0xf3,0x9d,0x0f,0x2e,0x47,0x55,0x5f,0x4e,0x9f,0x8d,0xee,0xe7,0x5b,0xcb,0x1b,0xd1,0xef,0x69,0xe5,},{0x06,0x38,0x6d,0xf8,0x6b,0x61,0xf1,0xf8,0xf4,0xdc,0x45,0xb7,0x3e,0xda,0xa8,0x41,0x92,0x09,0x68,0xbb,0xd1,0x31,0xcc,0x5c,0xa1,0xc5,0x29,0x4e,0xee,0xd5,0xc8,0xba,},{0x2c,0x07,0x29,0x69,0xff,0x47,0x19,0x21,0x2a,0x12,0x19,0x38,0xb5,0x06,0xc6,0x02,0x99,0x5b,0x4d,0x02,0xa2,0x2e,0x61,0x98,0xd6,0xe8,0x7d,0xd6,0xae,0x07,0x62,0x25,0xac,0x70,0xbb,0x25,0xef,0x8c,0x0e,0xe8,0x1e,0xb6,0xfe,0x95,0x3d,0xf6,0xb1,0x81,0x59,0x49,0xe8,0xed,0x05,0x06,0xcb,0x01,0x2e,0x87,0x3c,0xd3,0x6c,0xd0,0x9b,0x0a,},"\x2a\xed\xb7\xe8\x2f\x1f\xe4\xce\x46\x9a\xda\x48\x34\x5d\x00\x6d\x1b\x3b\xff\x40\xeb\x21\x86\x7f\x51\xfc\xe9\x65\x64\x0c\x40\x9e\xc1\x3a\xd4\xd5\x2f\x89\x1b\xd7\x90\x66\xd6\xb4\xd9\x44\xca\x86\x8d\x89\x86\xd2\x42\xb5\x7e\xcc\xc4\xc4\xa4\x88\x29\x1b\x15\x9c\x8d\xe4\x39\x2b\xe4\xb8\x6f\xeb\xaa\x75\xea\xc5\xd2\x2d\x3c\x4f\x8d\x6b\xef\x79\xad\xb9\xb9\x2b\x49\x14\xd5\xea\x07\xc7\xf0\x21\xe2\xc2\x9f\x58\xd0\x7b\xe8\xa0\x84\x10\x0b\xc1\x52\xd5\x1c\xa8\x97\xd7\xc1\x31\x64\x4d\x08\x95\x32\x2e\x94\x40\xa8\x33\x9e\x1a\xa3\x90\xa7\xf4\xfc\xb5\x1d\xdf\xb6\xdf\x48\xaa\xf5\x67\x63\x37\xd8\x7d\xdd\x85\xb1\xd9\x25\xe1\xa9\xc2\x9f\xe0\x81\x8f\x51\x4e\xf7\x2f\x74\x7a\x67\x49\x46\x47\x69\x07\xa7\xca\x99\xe9\xdb\x8d\x20\x96\x41\x05\x7a\x7f\x44\xa3\x17\xb9\x09\x74\xbc\x86\xf9\x61\x7a\x96\x8a\x76\xa6\xb8\x38\x7c\xf5\x85\x3e\x60\x81\x90\xc1\xa7\x9f\x1e\x1d\x68\x6e\x0d\xe2\x2d\xb6\xcd\x9a\xeb\x85\x32\xc5\xc8\x5c\xc9\x0b\x5a\x01\x85\x79\xf2\x8e\x50\x2a\x77\x0a\x4e\xc6\x75\x26\x3d\x0d\xd7\x81\xb4\xfa\x53\xc9\xdb\xf8\x09\x8d\x57\xb3\x3a\xe2\xaf\xba\xeb\x3e\x68\x26\x6a\xd9\xaa\xb7\x17\x4b\xa6\x8c\x64\x79\x88\x39\x92\x67\x0c\xcf\x3e\x5a\xc6\xa1\x7e\x65\xe3\x1e\x1f\xdc\x85\xe2\x69\xc8\x09\x35\xef\x57\x4f\x20\xd2\x39\x56\x84\x86\xe7\xd9\x4a\x4f\x72\x4a\xb7\x00\x60\x98\xb2\x4f\x3f\x61\x58\x76\x91\x43\x5c\x7f\x29\xce\x4e\x5c\xa7\x1b\x2b\x18\x74\x55\x64\x33\xa3\x58\xc8\xc5\xef\x3c\x88\x08\x43\x03\x0c\x2d\x13\xd5\x1b\x78\xc9\xbf\x1a\x88\x24\xe6\x2e\x11\x18\x44\x39\x6f\x5a\xf2\xe2\x5c\x31\x26\xef\x36\x26\xe2\x6e\xfa\xfa\xcf\x99\x83\x0a\xa4\x12\x12\x33\x2f\x37\x8a\x16\x72\x33\xa0\xb4\x22\x13\xaf\xe3\x6d\x83\xdc\x45\x82\xa7\x96\x93\xb9\xd5\x71\xa5\x77\x12\xa0\x8b\x85\x66\xd3\x61\xac\x90\x26\x47\xaf\xc8\x86\x60\x3e\x24\x28\x3e\xfb"}, +{{0xb1,0x11,0x9c,0x36,0x11,0x8b,0x7a,0x06,0x5a,0x19,0x5b,0xfb,0x8b,0x79,0xa5,0xc2,0x87,0xe0,0x9b,0xd2,0x87,0xc2,0xda,0xac,0x5e,0x6b,0x01,0x16,0x4c,0x5d,0x73,0x7f,},{0x88,0xf2,0x18,0xec,0xba,0x99,0xe7,0x70,0xed,0x21,0x4a,0x8d,0x01,0xa9,0x2a,0x10,0x40,0x0a,0xca,0xf1,0xf6,0xee,0xd4,0x20,0x06,0x7e,0x13,0x6e,0xe2,0xc0,0xc6,0x70,},{0x24,0xec,0x1e,0x54,0xfc,0x7e,0x72,0x2d,0x37,0x55,0x1d,0x02,0xcf,0x13,0x5d,0x33,0xf5,0xd3,0xff,0x53,0x57,0x73,0xe0,0x29,0x91,0xee,0x85,0xff,0xd3,0xaa,0x29,0x99,0x7f,0x9c,0x46,0x44,0x70,0x19,0x7f,0xee,0x81,0xdc,0xe1,0x10,0x60,0x9f,0x87,0x0b,0x27,0xc1,0x8d,0xfb,0xcf,0xd9,0x32,0x05,0x48,0x52,0x5e,0x93,0x14,0x8e,0x22,0x05,},"\x88\x16\xb1\xeb\x20\x6d\x5f\x6d\xcc\x2e\x4c\xc3\x91\xd2\x32\x09\x00\x6d\xe9\x35\xe3\x18\x15\x2e\x93\xfc\x8c\x2c\xf0\x8e\x26\x43\x2b\xad\x9a\xdb\x32\x03\xd8\x98\xdf\x0a\x2e\x7f\x1f\x83\xdc\x2f\x3e\xd3\x20\x5b\xec\x8e\xfc\xfd\x31\xad\xc1\xac\xa5\x75\x5d\xb9\xbd\x4e\xfe\x54\xcc\x17\x07\x30\x77\xde\x4a\x3f\xdd\x11\x99\x6e\x84\xb6\xa0\x52\xf0\x34\xb4\x10\x99\x22\x6c\x9c\x27\x2e\xae\x12\x52\x8f\x16\x58\x1b\x91\xb8\x12\x85\x0c\x20\x71\x44\xdb\xff\x3e\x85\x0c\xca\x84\x8e\xc2\xb1\xdd\x16\x47\x44\xd7\xb5\x93\x37\xd7\xe3\xef\xef\x00\x81\x62\xe6\x80\xbd\x4a\x08\x99\xce\xd6\x0b\x17\x1f\x8c\xbe\xb4\x8c\x51\x58\xdf\x6c\xbf\xdb\x26\x24\x08\x81\xbd\x58\xeb\xb8\xb6\xa0\x79\x58\x72\x79\x67\x9c\xb5\xad\x82\xf3\x71\xb5\x3c\x80\x13\x80\x4c\x35\x59\x6c\x88\x7e\x43\x6d\x23\x92\x6f\x99\x4e\x09\xd9\x8f\xbb\x8c\xe2\x70\x41\x74\xef\x38\xb6\x82\x62\xa7\xf1\xa7\x12\xda\x0e\xf0\xde\xc6\x39\x60\x68\x14\xb3\xbd\xca\xf2\x53\xff\x31\xc4\x8e\x8a\x75\x2c\x11\x1b\xd7\x10\x10\x31\xcc\x3d\x38\xef\xb0\xc9\xc7\xf1\x9c\x59\x08\x15\x84\xa0\xe0\x15\xee\x7c\x75\xb1\x0a\x4c\x51\xff\x54\x3a\x30\xe5\x2d\x5f\x94\xd8\x18\x8c\x6b\x08\xe9\xdf\x1e\x84\xa4\xe2\xc8\x07\x17\x0a\xc1\x24\xa7\x71\xb9\x94\x65\xa0\xd3\x8b\x1f\x1c\x63\x30\x40\x3c\x82\x54\x35\x82\xc5\xbb\x61\xb2\x20\xde\x1b\x9e\x0e\xf6\x9b\xda\xe2\x60\x23\x18\x1b\xa4\xcc\x07\x7a\x5f\x0d\x42\x57\x32\xac\xe1\x32\xae\x0c\x6f\xf0\xbb\x18\xba\xea\x83\xe8\x87\x7a\xfb\xe6\x50\xfe\x0b\xd0\x20\x93\xf0\x0a\x7b\x53\x65\x72\x8d\xcb\x66\xfb\xb8\x81\xf5\x92\x94\x50\x58\xa5\xb3\x50\x66\x5a\xf9\x1c\x55\x7a\x54\x72\x50\xad\x29\x5e\x68\xb4\xfb\x72\x45\x7c\xfb\x9d\x5e\xa1\xa7\xb2\xa3\x9c\x9a\xb7\xd7\xac\xe0\xaf\x5d\x51\x66\x9c\xb6\xc2\xc4\xc0\x7b\x22\x56\xd1\x0e\x5f\xfc\x6b\x97\xc6\x60\x00\x63\x13\xc4\xeb\x8d"}, +{{0xcb,0xb5,0x87,0x51,0x4e,0x0a,0x34,0xff,0xc3,0x4c,0xbc,0x04,0xf2,0x8c,0x9b,0x4f,0x64,0x65,0xf1,0xeb,0x22,0x5c,0xca,0x19,0xb8,0x64,0x87,0x6d,0xae,0xf3,0x7d,0x7f,},{0x6b,0x70,0x5d,0x46,0x77,0xd2,0xd8,0x49,0xb6,0x74,0x4b,0x1e,0xbe,0xd1,0x67,0xdb,0xcb,0xf6,0x45,0x92,0x4b,0x1f,0xf2,0xe6,0x36,0x07,0x94,0xbd,0xd0,0xe0,0x97,0x88,},{0x12,0x74,0xd6,0xf3,0x56,0xeb,0x64,0x14,0x72,0xb6,0xb9,0xe5,0xb3,0xce,0x65,0xd2,0x65,0x4e,0x6c,0xb8,0x7d,0x3a,0x83,0xfb,0x49,0xd0,0xf7,0xda,0x9c,0x44,0xbe,0x2b,0x53,0x26,0x04,0x46,0x5f,0x60,0x89,0xd6,0x80,0xd2,0xd9,0x4b,0x0e,0xdd,0x2b,0x6b,0x2b,0x80,0x5c,0x5e,0x84,0xc3,0x79,0xef,0xc0,0x59,0x67,0x3d,0x31,0x00,0x7a,0x09,},"\xbd\xf7\xd1\x7c\x70\x67\x96\xef\xd3\x48\x95\x59\xb5\x27\xb1\xc0\x58\x4b\x90\x22\xc9\xcb\xda\x3a\xac\x51\x46\xda\x34\x0d\x9c\xea\x69\xf9\x16\x03\x7c\xd2\x1b\x3e\xb1\x10\x43\x48\x88\x0f\xd5\xc5\xb7\xc6\x5f\xf8\x20\xf7\x49\x93\x46\x01\x69\x51\xcb\x71\x5d\x8d\xf2\xb4\x1c\x88\xcd\x3c\x66\x10\x54\x58\xb7\xb5\x90\xc2\x1c\x1a\xe2\xf6\xea\x9d\xde\xa7\x47\x0f\x25\xe0\x20\x27\xd1\x71\xe0\xe5\x74\xa2\xbb\x21\x64\x2f\x8f\x9d\xa5\x08\xe2\x1d\x8e\x73\x35\xb5\xac\xe5\x93\x52\x99\x40\x7b\xd1\xb0\x1b\xdd\x14\x23\x13\x3e\xf0\x45\x23\x4e\x70\x1f\x55\x54\x94\x34\xad\xe9\x4a\x60\xbe\x1e\x14\x06\xca\x5c\x75\x8c\x36\x79\x9c\xe1\x70\x30\x84\x47\x6e\x48\x4f\xb1\x74\x05\x30\xae\xe8\x42\x66\xd0\x7a\xdf\xb4\xcc\x68\x9f\x32\x65\x13\x3a\x59\xcd\xf9\x92\xfb\xb9\xa4\xb1\x2d\xef\xbe\x24\x1d\xdb\xf6\x5d\x12\xb2\xfb\xdd\xfc\x05\xaf\x0f\xb8\xde\x42\x08\x07\x75\xba\xd2\x9c\x6b\x04\x59\x84\x1c\xbb\x64\x8a\x9a\x95\xe4\x8d\x6e\x36\xac\x51\x44\x80\xa3\xde\xb4\xb3\x65\x54\xd8\xda\x62\x08\x08\xae\x9d\x47\x32\x97\x10\xd2\x0a\xaa\x6e\x5d\x7f\x54\x7d\x81\xad\x30\xf8\x4c\x0e\x3d\x23\x9c\xde\x5b\x16\x9d\x9d\xdf\x29\x48\x32\xd6\x7a\x80\x60\xba\x32\x9c\x4e\xf3\x9b\xe9\x4a\xc4\x64\x34\xdd\x21\x85\x93\x1d\x12\x31\xf9\xb6\xdf\x87\x8a\x5a\xf0\x83\x1e\x0e\x9d\x8a\x08\xd0\x80\x69\xde\xd6\xa9\x61\xef\x7f\x39\xfa\xd5\x01\xff\xd1\x7d\x6d\x9b\x7c\x65\x46\x53\xc1\xf5\x8f\xce\xe1\xa6\xcd\x80\x3d\x2a\xef\x16\x6c\x78\xef\x55\x14\xa3\x27\x6d\x69\x98\xdc\x7c\x09\xa3\xfa\x98\x2e\x42\x7c\x78\x5a\xa6\xa9\xe2\x56\xf7\xba\x72\xd5\xa6\xba\x33\xeb\x46\xf1\xf9\xfe\x9b\xe2\xbf\xc1\x41\x09\xf6\x47\x73\xc0\x0c\x06\x3b\x4d\x5c\xb4\xf4\xf8\xa0\xbe\xca\x92\xa9\xa0\x16\xc4\xf5\x40\xfe\xea\x9c\x3a\x31\xe3\x13\xbb\xcb\xc2\xff\x5e\xca\x99\x67\x85\x7f\x5f\x8a\x90\x9a\x29\xd7\xf2\x0d"}, +{{0x8b,0xde,0x3f,0xf6,0x1a,0x16,0x99,0x5a,0xb9,0xd5,0x39,0xf6,0x05,0x32,0x19,0x08,0x1b,0xca,0xea,0x1d,0x45,0x8e,0xc3,0x36,0x84,0xfc,0x1c,0x01,0xfb,0x56,0x5b,0xfa,},{0xcd,0x9d,0x78,0x2a,0x35,0x6e,0x84,0x7b,0x7a,0x04,0xc8,0x85,0xa9,0xb0,0x90,0x7c,0xc3,0x3b,0xa9,0x7a,0xd5,0x39,0x0d,0x4e,0xa5,0xfe,0xe5,0xeb,0x19,0x8d,0x08,0xb3,},{0x74,0x64,0xdf,0x0b,0x67,0xeb,0x90,0xb4,0xb7,0x3f,0xf0,0x82,0xad,0x0d,0x60,0xeb,0xfe,0x06,0x60,0xda,0xe9,0x70,0x69,0xb5,0x2c,0x37,0x27,0x22,0x3b,0xf7,0x0e,0x29,0xe4,0x87,0x11,0xa2,0xbb,0xb4,0x38,0xf5,0xf8,0xd8,0xa3,0x3b,0xb9,0xc4,0x8f,0xe7,0xb6,0x28,0xfa,0x8a,0x54,0x2f,0xf0,0xb5,0xae,0x36,0x26,0x9d,0x40,0x07,0xa5,0x05,},"\xa1\xf4\x0e\xc5\x80\x7e\x7a\x27\x06\x9a\x43\xb1\xae\xbf\xf5\x83\xef\x03\x70\x28\xc0\x2c\x85\x95\x25\xeb\x8f\xa4\xc3\xba\x95\xa9\x01\xff\x3a\xed\x78\xc4\xf8\x77\x52\xfb\x79\x55\x22\xf5\xbf\x71\x5b\xe7\xe3\xde\xfa\xc1\x0f\xcf\x17\xe3\xfa\x5c\x54\xb2\x00\x89\xa4\x72\x33\x33\x27\x25\x2e\xc9\x45\x71\x8f\xb4\x55\xe3\xf2\x7c\xcf\xde\xf8\x23\xd1\x2d\x40\x6e\x62\xa4\xae\xba\x3c\xb9\xd1\xc6\x1b\x2b\x17\xe4\x9e\x20\x0a\x84\x18\xf9\x35\xf2\x6e\xeb\x57\x60\x2c\x7a\xa3\xb3\xa2\x4f\x7e\x62\x38\xd3\xe0\x8d\x2d\x60\x9f\x2e\xad\xa0\x33\x2b\xc8\xcb\x12\x91\x6c\xb0\x3b\x0d\x4f\x9c\xd6\x02\x00\x25\x86\xd3\xe4\xcc\x7e\x0e\x03\x81\xc0\x45\xad\x2e\x1e\xe2\x82\x98\xae\x7f\xcf\x0c\x10\xf2\x12\x80\x85\x65\x29\x6f\x15\x8d\x2c\x32\xe8\xcb\x28\x15\x65\x81\xaf\x52\xbf\xc3\x47\x0c\x3c\x95\x82\x13\x8d\x22\x55\xe8\x42\x6d\x64\x8c\xa2\x37\xd7\xaa\xd2\x85\x6f\x17\x16\x38\x55\x82\x41\xd8\xae\x3f\x62\xba\x92\xdb\x59\x65\x68\xed\xee\x3e\xc0\xef\x37\x0f\x83\x62\x6a\xa0\x44\x5a\xf0\x8f\x96\x78\x63\x66\x0e\x8f\xba\x5a\x41\xc8\xe8\xed\xe1\xc9\x60\x51\x4a\x14\x68\x7a\x4a\x81\xe7\x76\xae\x0e\x8e\x77\x7f\xb0\xf2\x50\xd5\x1a\x83\xb5\x5f\x8c\x1f\xfd\xd7\x8d\xf3\xbd\xc9\x7f\xf1\x77\xaf\xec\xa0\x46\xc7\x2d\x72\xaf\x92\x4a\xd0\xd0\xab\x2b\xfc\x11\xb7\xf4\xab\xde\xd5\x1c\x39\x87\xa8\xbb\x94\xd6\x40\xc8\x71\x0e\x5f\xc9\xa4\x19\x0e\x8a\x00\x83\x63\xd7\x41\x9c\xea\x17\xc4\x0d\xea\x20\xea\x51\x56\x02\x9f\x3d\xeb\xf0\x52\x41\x91\x8f\x54\xaf\x50\x39\xe2\xc4\xcf\x2c\xa2\xe1\x39\xf6\x0e\x45\xcc\x65\x59\x5c\xdf\x54\xa6\x7d\x92\xb6\xac\x66\xfc\x0c\x5a\x29\x04\x95\xca\x57\xb0\x7e\xf5\x75\x0d\x05\xf5\x7d\x87\xd0\xc2\x28\xf7\xe4\xe1\x5a\xd0\xba\x01\x78\x73\x0f\x95\x1c\x69\x75\x83\x48\x1c\x66\xcb\xfc\xd4\x80\x32\x54\x4a\xa8\xd5\x09\x08\x30\x4b\xd8\x19\x40\x30\x87\x06"}, +{{0xda,0x59,0xbb,0xc5,0x23,0x40,0x4f,0x07,0x64,0x6a,0xdd,0x79,0x08,0x29,0x49,0x77,0xe4,0x66,0x45,0xbc,0x8a,0x38,0xba,0xd2,0x80,0x96,0x41,0xa2,0x3d,0xe3,0xb1,0x5a,},{0xb2,0x2c,0x0f,0x21,0xaa,0x1c,0x2d,0x45,0xf4,0xb2,0xe5,0x6c,0xc9,0xb5,0xe0,0x2f,0x9e,0x31,0xa2,0xea,0xa3,0x67,0xec,0xb4,0x82,0xf8,0x74,0xcb,0xd8,0xe9,0xfe,0x34,},{0x14,0x72,0x45,0x9c,0xbb,0xae,0x2c,0xf2,0x1c,0xe4,0x4a,0x15,0xba,0xe9,0xfc,0x85,0xdc,0xa4,0x0b,0x81,0x82,0xda,0x7d,0x52,0xcb,0xf5,0x6e,0xd5,0x38,0xd1,0x8e,0x03,0x47,0x7c,0x14,0x0a,0x3d,0xdd,0x0e,0xfb,0xa4,0x3c,0x96,0xaa,0x92,0xf5,0xf9,0xbc,0xdf,0x34,0x81,0x28,0x6c,0xe7,0x62,0xa7,0xe2,0xbd,0x1e,0x77,0x9b,0xa9,0x9b,0x0d,},"\x09\x71\x06\xc3\x62\x4d\x77\x4d\xde\x25\x51\xe0\xc2\x7e\x19\x50\x4e\x65\x18\xcc\x86\x36\x9a\xb2\x6f\xf8\x10\x96\x9e\x7d\xe2\x4a\xbc\x68\xb4\xb5\x3f\x11\xd9\x45\xd4\x9e\xf0\x78\xeb\x4f\x6b\xa6\xbf\x25\x7f\xf7\xb6\x08\xaf\xdc\xb3\x0a\x5c\x59\xa7\x56\xfd\x77\xa6\xc1\x24\x7f\x6f\x2a\x41\x10\x0d\x99\xfc\x52\x06\xaf\x3b\xcc\x6d\xe1\xd3\xe4\x96\x8e\x28\xfb\xa0\x12\x3f\x60\x45\xa1\xb5\x4d\x69\x3a\x42\xbd\xfa\x07\x1b\x2b\x91\x4b\x3c\x3c\x0c\x29\xb2\x59\x3d\x07\xe8\xbd\xc8\x6c\xa4\x2a\xc5\x55\xb7\xdc\xd9\x43\x9d\xf9\xfb\xd4\xbb\xec\x73\x0d\x63\x27\xbf\xae\x4f\xc4\x1e\xd4\x98\xb4\xf0\x4a\x0e\xb1\x4c\xee\x60\x82\x83\xaa\xa6\xe6\xaa\x46\x67\x6b\xc8\x8a\xed\x5d\x99\x39\x03\x7a\xad\x49\x15\x66\x1a\xf9\x4b\xb5\xf6\xe6\x53\xa2\xca\xc1\x23\x28\x70\x73\x27\x0e\x0b\x13\xfd\xa1\xdd\x48\x71\xaf\x6a\x92\xf9\x92\xf5\x39\xdf\x88\x17\x12\xfe\xfb\x03\x85\x40\xd4\x11\x91\x12\x3b\x6b\x3b\x4b\x6f\xf8\x7f\xfc\x92\x9a\x6b\xe5\x3c\x6c\xef\x02\xf4\x8f\x2f\x0c\xf2\xfe\x64\xa4\x5f\xd6\x60\x25\xcc\x2d\x7e\xe5\x5e\xbe\x23\x16\xc0\x00\x85\x56\x61\x16\x5e\x2a\x5b\xa4\x1a\xfc\x20\x97\x95\x7b\x6f\xe4\xc5\x52\x21\x20\x4b\x6f\xc1\xf3\x17\xdd\x3b\xa1\x3c\xac\x39\x92\x40\x26\xbd\xb6\x6b\xe4\x54\x22\x68\x87\x56\x31\xd2\x77\xf2\x10\x10\x7a\x33\x76\x7f\x6d\x95\x96\xe2\x57\x42\xd7\xa9\x0e\xa7\x91\xea\x4b\xc9\xee\x84\xa6\x7f\xd3\x28\xb8\x0f\x79\x1e\xde\x96\xd8\x96\x63\xe9\x37\xf0\xb7\x55\xba\xa9\xd5\x2b\xda\x21\x0c\xee\x1d\xb3\x39\xff\x1d\x3c\x4b\x00\x0b\x65\x3b\x9b\xde\x33\x80\x49\xaf\x84\x36\x4e\x21\x77\xf8\x0d\xd5\x1e\x2a\x16\x72\xee\x55\x5d\x63\x17\x58\x9f\x6f\x1d\x5a\xbe\x6c\x28\x77\x35\x8b\xf9\x4b\x0b\x80\x8f\xf8\x57\x36\x3f\xbf\xbe\x32\xe9\x73\x37\xe4\xb8\xa8\xc2\x21\xa9\xe7\x59\x62\xa8\xdc\x9b\x5a\x3d\x7c\xa5\xf9\xc9\xb6\x1c\x73\xc1\x46\x9a\x72\xbd"}, +{{0x40,0xea,0x82,0xda,0x41,0xfd,0x15,0xb0,0x6f,0xfe,0xb9,0x9c,0xd6,0x16,0xdc,0x6b,0xc8,0xc1,0xb2,0x14,0x77,0xea,0x23,0x94,0x66,0x08,0x8e,0x28,0x49,0xbf,0x10,0x16,},{0x59,0x10,0xe5,0x80,0xbf,0x41,0x2c,0x31,0xa8,0x74,0x51,0xd9,0xdd,0xf3,0x2b,0x3a,0xb7,0x13,0xf9,0xe4,0xa2,0x2c,0x59,0x0c,0x64,0x1c,0x14,0xa5,0xdf,0xbb,0xe0,0xd7,},{0xd2,0x98,0xfc,0xc9,0xa8,0xec,0xb7,0x6a,0x98,0xd4,0xa7,0x1d,0xfb,0x01,0xd2,0x76,0xab,0x2d,0x96,0x70,0xa9,0x5b,0xab,0x34,0xcf,0x1d,0x83,0x64,0x51,0x6d,0x1e,0xbd,0xb2,0x39,0x03,0x46,0x02,0x15,0x30,0x71,0x25,0xaf,0xd0,0x9c,0x75,0x8e,0x98,0x1a,0x45,0x2d,0xa9,0x5c,0x0a,0xc2,0xc0,0xb9,0x58,0xc6,0x91,0x7e,0x68,0x74,0x19,0x0d,},"\xa0\x6c\x4e\x02\xb8\x3a\xb7\xe1\x91\xad\x81\x8c\xb8\x18\x7b\x52\xa8\xda\x00\x4f\xe8\x38\xdb\x33\x3c\x4e\x02\x54\x8d\xb6\xbd\xf7\x91\x44\x46\x42\xe5\x7f\xdb\xc8\x59\x4e\x59\xd7\x02\x32\x80\xbb\xae\x82\x98\x6f\x39\x98\x05\x43\x4b\xb0\x72\xc8\xa2\x7a\x2d\xcd\x5a\xa6\x2f\x06\x5b\xc5\x8b\x06\x21\xfc\xd3\x65\xf6\xcd\xbf\x4d\x57\xd5\x77\xd9\x11\x50\x30\x1f\xa4\x8f\x18\x2f\x87\xe8\xdc\xa7\xce\x45\xa7\xd6\x48\x45\xff\x43\x4d\x1b\xab\x05\x34\xcc\xc8\x3a\xa0\x97\x4e\x88\xb3\x8f\xc2\x50\x8c\xef\xcb\xbc\x82\x13\x5b\x73\xb3\x84\xc8\x0e\xcc\xb8\xa0\x9e\x28\x73\xcc\x07\x12\x90\x21\xd8\x1c\xe1\x29\xa9\xdf\x65\xe6\x13\x41\x0a\xf9\x50\x19\x7d\xbf\x9a\xfc\x28\xed\xc4\xe6\x5c\x3e\x84\xda\x40\xd2\xef\x84\x1b\x88\x6b\xc4\x47\x19\xa5\xd5\x9d\xb2\xc6\xdc\x77\x64\x01\xc8\x95\xe2\xb3\xc8\x37\x83\xd7\x81\x7b\xba\x68\xba\xff\x59\x47\x0d\x60\x15\xbb\xa8\xd9\x75\xf0\xeb\x71\x2f\x3b\x89\x02\x91\x28\x05\x52\x3a\xa7\x1c\x90\x49\x9d\xe6\x89\xd3\x1a\xe4\x4e\x21\x0b\x84\x46\xf2\x48\x47\x27\xcc\x49\x1b\x92\xa8\xe8\xb1\x99\xd6\x28\xe1\xdf\x79\xa2\x8c\x56\x1e\x5a\x7d\x88\x2e\x30\x78\x7d\x08\xfb\x2d\x51\x96\xba\x61\x19\x63\x09\xb3\xbf\x0c\x58\x24\xa3\x54\x8c\x70\x00\x03\xfe\x99\x13\xbe\xfe\x12\x22\x31\x50\x01\x26\x85\xe9\x07\x20\xe9\xec\x6b\xc4\xdb\x60\x74\x25\xae\xc5\x31\xc4\xfa\x36\x08\x6d\x3b\x9b\xe3\x91\xa3\xf0\x46\x35\xa8\x07\x7a\x44\x7a\x16\xa6\xfd\x89\xaf\xbb\x9a\x72\xd0\xd3\x55\xcb\x0b\x22\xd5\x62\xf4\x3f\x59\xd4\xe3\x71\x28\xb3\xe2\xd9\x06\xc8\xae\x23\xd0\xaa\x59\x9c\x70\xd3\x77\x8a\x07\x6c\x1a\x39\x72\x8f\x1d\x69\x37\xbd\x48\xb9\x78\x74\x08\x50\x56\x61\x38\xd3\x48\x52\xb6\x30\x75\xe8\x9a\x8e\x22\x80\xed\xba\x6f\x4e\xe8\xf6\x15\x11\xe9\xb7\x68\xe9\x5c\x78\xd1\x97\xb6\x93\xb1\x09\xe8\x88\x18\xb4\x86\xa9\xdf\xdb\x74\xb4\xc5\x55\x0a\xcd\xfb\xd5"}, +{{0x28,0xbb,0x81,0xa1,0x7d,0x45,0x84,0x75,0x4d,0x52,0x81,0x8c,0xd0,0xf1,0xf2,0x1b,0xaa,0x77,0x7e,0x69,0x58,0x44,0xa1,0x51,0x22,0xac,0x05,0x34,0x4d,0xdd,0xc0,0x27,},{0xd5,0xf6,0x1d,0x51,0x99,0x44,0xd1,0x3b,0x84,0xbf,0xa7,0xcd,0x67,0xcb,0x0b,0xea,0x4e,0xf2,0x28,0x1e,0xfa,0x46,0x1f,0x22,0xad,0xe4,0xba,0x88,0x2d,0x11,0xb2,0x52,},{0x9c,0xe4,0x5a,0x07,0xdb,0xd2,0x8d,0x3f,0x6f,0x1b,0x35,0x63,0x0a,0x3f,0xd5,0x6f,0x1d,0x54,0x8f,0x84,0xff,0xb1,0xc6,0xae,0x64,0xb2,0x14,0x98,0xae,0x38,0xe5,0x96,0x91,0x6e,0x77,0xf7,0x99,0x05,0xe6,0x09,0xfb,0x1a,0xe0,0xda,0x36,0x13,0x8a,0x80,0xf2,0x42,0x12,0x21,0x67,0x06,0x80,0x92,0xcc,0x60,0x57,0x96,0xc5,0x66,0x9e,0x06,},"\x92\xe8\x4c\x7a\x55\xb0\xbe\xa0\x3e\x17\xcf\xb6\x5f\x70\x85\xce\x3f\x44\x5b\x15\x42\xba\xe9\x97\xde\x5f\x09\x2a\x24\xff\x24\x33\x80\x28\x6d\x13\x70\x91\xa5\x98\xf3\x5e\x6d\xae\x1a\x1c\x64\x8f\x5a\x49\x4c\x81\x9d\xfb\x24\x06\x52\xff\x90\x83\x81\xf3\x2d\x70\xbc\x51\x31\x00\xac\xa1\x6f\xe7\x22\x02\x95\xb1\xc7\x18\x35\xf1\x6d\x93\x10\xa9\xd2\x7a\x04\xa9\x80\xac\xe2\x97\xd5\xaf\x3f\x7c\xb7\xc7\x8b\x24\x99\x7c\xcb\x41\xf5\x4e\xcb\xab\x50\x7e\xb7\x3e\xa6\xa3\xed\x47\x0e\x49\x59\x05\x09\xf5\xd1\xe6\x03\x2a\x26\x05\xdb\x87\xf4\xa9\xb9\xec\x91\x60\x25\x83\xf1\x4e\x2f\xe1\xbd\xb9\x00\xec\xb8\x97\x11\x96\xb5\x5c\x0d\x43\x34\x89\xf2\x6b\xe9\xca\x15\x7c\xbd\x56\x57\x28\x87\xba\x85\x9f\x39\x67\x4a\x8e\x0c\xa0\x8f\x2d\xbb\x0f\x27\x07\x35\x51\xd0\xb1\x99\x06\x85\x17\x8b\x1a\xe9\xe7\x88\x54\x99\x14\x3d\x9d\x72\xc8\x57\x1d\x11\xe0\xd8\x5b\xf5\x8d\xf9\x4e\x2a\x74\xd9\xb6\x84\x65\x57\xf9\x12\x5c\xa0\x94\x4c\xe5\x71\x8d\x2c\xba\xe1\x67\x2b\xa0\x2b\x84\x7c\x17\xa6\xf6\xb4\x45\x63\x4d\x2f\x01\x75\xa7\x5c\xf6\x88\x3c\x62\xe5\xb5\x21\xc5\x71\x41\xf2\x18\xb2\xfb\x09\x94\xb3\x72\xa7\x16\xc4\xa2\x17\x43\x4b\xea\xb7\x57\x40\xb8\xe9\x1c\x62\x21\x87\xd0\x3c\x85\xda\x00\x1e\x00\x24\x73\x12\xa4\x65\x22\x5f\x5d\x6a\xf2\x32\x06\x4a\x42\x7d\x30\x18\x70\x0d\xed\x77\x4b\x90\x26\x77\x7a\x52\x75\xfc\x04\x75\x46\x06\xc8\x66\x00\x29\x7b\xf7\xb7\x1a\xaf\xf8\xb9\xa7\x46\x67\x7a\x36\x62\xf3\x75\x0e\x81\xb5\x01\x66\xf6\x23\x70\x00\x05\x1f\xfa\x15\x86\x8d\xef\xdf\x09\x00\x57\x72\x2a\xe2\x29\x96\x4a\x4e\xa0\x85\xe0\xdb\xc0\x4c\xe1\x99\x77\x22\xc5\xbb\x65\xd2\xb4\x7e\xcb\x74\x6f\xd8\x3a\x9f\x6a\x69\xc8\x15\x45\xa9\xb5\x02\xf5\xe7\x6d\x31\x30\xc5\xaf\xcb\x1c\x9a\xf9\x9d\x91\x87\x40\x83\x7c\xe8\x9d\x7c\xd2\x13\xfe\xf2\xfd\x06\x2c\xe8\x85\x0f\x69\x65\x9e\x4a\xd3\x27"}, +{{0x24,0xbf,0xd4,0xfc,0x45,0xd5,0x09,0x35,0x85,0x67,0x81,0x01,0xcf,0x56,0x3a,0xb8,0x01,0x1f,0xd6,0x43,0x0d,0xe1,0x55,0xf2,0xa4,0x25,0xf0,0x63,0x3e,0xe3,0xb7,0xcd,},{0x9c,0xf5,0xc5,0xfc,0x0c,0xcf,0xae,0xb2,0x8a,0x08,0xba,0x67,0x70,0x7b,0x18,0xdc,0x84,0xea,0x06,0x98,0xff,0xbd,0xbc,0x16,0x9a,0x09,0xc2,0x81,0x23,0xe6,0xc2,0xac,},{0xdc,0x93,0x5b,0x60,0xfd,0xe4,0x43,0x59,0xaf,0x8f,0x50,0xed,0x7f,0x91,0x9f,0x48,0x3c,0xe3,0xf2,0x4e,0x23,0x20,0xc5,0x5b,0xa9,0x2f,0x3e,0x76,0x17,0xc1,0x9b,0xfb,0x54,0x70,0x19,0x03,0xff,0x18,0x3b,0x42,0xcb,0xed,0xfe,0xf0,0x87,0x5f,0x42,0xb1,0x28,0x75,0xd3,0x6a,0x0a,0xee,0xc7,0x3f,0xfd,0x09,0x50,0x9d,0x92,0xb2,0x8b,0x0d,},"\xba\x54\x12\x8f\x45\xbe\x20\x01\xdb\xb0\x60\xd5\xdc\xc4\x71\x44\x99\x74\x15\xd4\x29\x4f\x6e\xba\x8d\xce\xba\x4f\x6c\xf2\x23\x46\x83\xc4\x26\x5f\x88\x03\x22\x05\x29\x6e\x9b\x27\xd6\x85\x06\x23\x2d\x57\xb6\x88\x40\x76\x48\xf8\x7c\xeb\x34\x20\x52\xbd\xe9\xd0\x06\x55\x42\xff\x17\x15\xc9\x42\x02\x7e\x67\x48\x2a\xf4\xbc\x27\x8f\xf7\x19\x66\xfb\x3f\x62\xa2\xa5\x32\x3c\xb1\xb4\xba\xe1\xe7\xb8\xfe\xdc\xbc\x73\xea\x05\xb4\x07\x64\x21\xb0\xb4\xfa\xe8\xbc\x33\x37\x41\x6a\x17\xfe\x12\x4e\x7e\xe4\x65\xeb\xb3\x8d\x87\x92\x30\x64\x29\xd8\x27\x9a\x1b\xd5\x4c\x37\xbe\xe8\xf9\xc8\x5e\xeb\xe3\xaf\xd1\xf6\x44\x89\xd4\xe5\x3a\xc5\xf5\x06\x57\xbb\x6f\xfb\x97\x12\x07\x44\xb7\x5d\x47\xc6\x22\x6d\x5a\x9c\x9c\x26\x4e\xe3\xe6\xa6\xde\xd0\x50\x62\xca\x10\x06\x66\x91\x18\x45\x45\x50\x01\x09\x19\xc2\x63\x3c\xf0\x86\x95\x03\x45\xe5\x14\xaf\x38\x43\x14\x8e\x5c\x64\x35\x2e\x69\x03\x7d\xfe\x60\xd4\xa8\xea\xb3\xeb\x8c\xb5\x4b\xd3\x9a\xf2\xf3\x53\xd5\xde\xd2\xe2\xbc\x8b\x11\xc0\x9f\x61\x2e\x12\x8c\x6e\xfa\x41\xf6\xeb\x2c\x95\x80\x87\xbe\x34\xc6\x33\x5a\x43\x00\x5d\x11\xa9\xd3\xb5\xa5\x29\xc2\xd1\xb0\x64\x2f\x77\xaf\xdd\x8c\x6b\x1d\x6f\xb2\xa9\xdc\xb6\x5f\x42\xf4\xec\xa8\xea\x9a\x05\x40\x58\xbe\x86\x13\x66\x76\x10\xe3\xee\xd8\xd1\xdf\x07\x39\xec\xa1\x71\x95\x41\x17\x98\x9d\x1b\x12\x18\x9a\xb5\x79\x04\xaa\x96\x0b\x0c\xa8\x55\x41\x74\x63\x85\xef\xa9\x85\xbe\x9d\x97\xb5\xa9\x02\x99\x89\xa9\xc7\x14\x98\xdf\xab\xdb\x81\x36\x81\xf5\x7e\x27\x6b\x64\xdb\x49\x1b\x8f\x08\x2a\x88\x51\x45\x46\x9a\x53\x1b\x7f\x9f\x04\xca\x0a\x2c\x2f\x8d\xff\x20\xcc\xb9\x9c\x28\x61\xf5\x4e\x5e\xaf\xa9\x62\xcc\x53\xea\xf1\x8d\x3d\x5e\x50\xd3\x37\xaf\x48\x5f\x19\x97\x5f\x05\x93\x07\x00\xa8\xa7\x25\x3f\x11\xf1\x84\x13\x0d\x0a\xee\x70\x96\x9d\x96\xfe\x08\xf2\x16\x95\x1d\x9d\xce\xd5\x23\x88"}, +{{0x2f,0xc2,0xf9,0xb2,0x05,0x0a,0xd7,0xd1,0x39,0x27,0x3e,0x93,0xe2,0xa0,0x45,0x1c,0x7b,0x5c,0xce,0x57,0x59,0x9a,0xa6,0xb0,0x8d,0x3e,0xdc,0x5b,0xb0,0x75,0x90,0xc8,},{0xff,0xe5,0xa1,0x78,0x80,0xd7,0x18,0xcc,0x79,0x88,0xc2,0xfd,0x98,0x25,0xb0,0x3b,0x93,0x45,0x0a,0xc1,0xde,0xb8,0xfb,0xd1,0xf1,0xbf,0x3b,0x8f,0x87,0x80,0x59,0x54,},{0x7a,0xff,0x16,0x2a,0x3c,0x0d,0x28,0xdf,0xf4,0x17,0x15,0xa9,0x74,0xaf,0x07,0xec,0xac,0x21,0x32,0xfc,0x18,0xbc,0x43,0xa1,0x98,0xfe,0x66,0x46,0x59,0x05,0x0d,0xa1,0x9a,0xe2,0x27,0x58,0xd5,0x2c,0x9c,0xbb,0x94,0xf1,0x35,0x8b,0xb0,0x26,0x10,0xa8,0xa3,0x51,0xc2,0x11,0x62,0x79,0xe7,0x24,0x5a,0xdf,0x69,0x67,0x5d,0xfd,0x36,0x0a,},"\xdc\x12\x97\x99\x0c\xc0\x27\xd5\x6d\x1f\xee\x26\x5c\x09\xbc\xf2\x07\xa9\x58\x3e\x6b\xab\x8d\x32\x47\x82\x28\xe0\xbc\x30\x5b\x98\x18\x15\x4c\x33\x8c\xee\xc3\x4b\x04\xc4\xad\xe7\xac\x61\xdc\xb0\x9b\xfa\xc8\xad\xe0\x0d\x1f\x29\xde\x31\x70\x60\xb8\xa4\xda\xf1\x98\x7d\xe4\x09\xca\x2c\x3f\xe4\x38\x00\x88\x07\x3c\xcf\x48\x5e\x9a\x69\x51\x6b\x5b\xbb\x41\x30\xf2\x0b\xe6\x9b\x2d\xd6\xa9\xb4\x65\x15\x9c\xca\x1a\xc8\x8b\x32\x8b\x80\xc5\x1b\x66\xaf\x7f\x4c\x50\xf6\x22\x87\x72\xf2\x87\x34\x69\x3c\xe4\x80\x5a\x41\x63\xdf\xf1\x4b\x4d\x03\x98\x11\xee\x3f\xce\x65\x93\x54\x44\xa6\xea\x9a\x72\xd7\x8b\x91\x5c\x9c\x3b\x76\x6c\x60\xb7\xe0\x32\x9e\x43\xc9\xc5\x7e\xde\x94\xb9\x15\x25\xce\x5a\x07\x5a\x72\x97\x21\x97\x72\xef\x3c\x02\x96\x49\xb5\x86\xa9\x5a\x73\xbb\xdf\x16\xd8\xfc\x20\x36\x8d\xe4\xba\x44\xde\x10\x64\xbe\x58\x26\xb3\x76\xbe\x31\xa8\x6c\xa4\x78\xa5\x2e\xfb\x98\xf1\xfa\x33\x31\x57\x71\x9b\xd6\xe0\xda\x80\xed\x68\xd0\xef\xea\xfe\xe5\xa1\x3b\xcc\x3b\x45\x75\x25\x25\x8f\x1f\x7e\x03\x1f\x7b\x40\x3a\x46\x15\x06\x92\x7b\x1e\x6c\x7d\x4a\x0c\x8d\x84\xb5\xf3\xdd\x0e\xb8\xbd\xb1\x3e\xdc\x2b\x51\x4a\x81\xd0\x88\xeb\x07\x7a\x52\xc8\xa8\x31\x86\x1f\xee\xe8\x11\x0e\x41\xa3\x25\xdc\xe2\x06\xb2\xd6\x7d\x25\xf9\x0e\xf5\x7e\x0f\xde\x70\x9f\x3e\x5a\x39\xc0\x4e\xed\x31\xe5\x7c\x19\x3b\x28\x3e\x2d\xa7\x27\x9e\xe3\xf1\xee\xd4\x82\xb3\xbb\xcd\x37\x39\x02\xc1\xdf\x81\x1a\xc3\x3e\x1d\xe0\x64\x29\xe8\xf8\x44\x3f\x60\x20\x19\x65\x0b\xdc\x2e\xe8\xd7\xf6\x50\x03\x6a\x7a\x22\xb8\xfd\x88\x51\x75\x11\x22\x9c\x72\x9a\x32\x69\xb3\xa3\xe8\xfc\x72\xb0\x1b\x5a\x4b\x3e\x33\xf5\x27\x2f\x3a\xd2\x16\x29\xd0\x8b\x1f\x71\x79\x35\xe9\xe1\x04\xad\xd2\xf0\xf2\x03\x34\x32\xbe\xc8\x2e\x21\x21\xd9\x8c\x9c\x1a\x58\xe0\xda\xba\x25\x53\x6a\x1b\xe8\xe5\x08\x83\x47\xf4\xa1\x4e\x48\xd8\xe3"}, +{{0x8a,0xfe,0x33,0xa0,0xc0,0x8a,0xa3,0x48,0x7a,0x97,0xdf,0x9f,0x01,0xf0,0x5b,0x23,0x27,0x7d,0xf0,0xbb,0x7e,0x4c,0xe3,0x95,0x22,0xae,0xc3,0xd1,0x78,0x16,0xe4,0x67,},{0xd0,0x04,0x37,0x0e,0x6e,0xdc,0x34,0xb3,0xe8,0x81,0x86,0x67,0x21,0x6f,0x5b,0x22,0x6b,0x0f,0xf7,0x5a,0x58,0x48,0x4c,0x86,0x16,0xe1,0xa8,0x66,0x44,0x4c,0xab,0x57,},{0x63,0xa8,0xae,0xac,0x02,0x5f,0x2d,0xde,0x9a,0x73,0x28,0x6e,0x56,0xc2,0xd6,0x2d,0xcb,0x79,0xa2,0x41,0xba,0x0b,0x2e,0x2d,0xba,0xca,0x87,0x52,0xed,0x2f,0xc8,0xcc,0x7a,0xb8,0xe6,0x60,0x0b,0x67,0x64,0x5f,0xb5,0xe8,0x18,0xa4,0xe8,0x2c,0x29,0x18,0x0a,0x6b,0x2c,0x3f,0x58,0xd0,0x99,0xcb,0x63,0x5c,0xe5,0x2b,0xdc,0x15,0x70,0x04,},"\x86\xfb\x74\x1f\x1b\x97\x08\x92\x91\x95\x03\x1a\xa1\x64\x5f\xb7\x09\xa8\xae\x32\x3f\xff\x85\xe5\x47\x01\x94\x45\x2e\x11\xb7\xb1\x27\x91\x94\xb5\xe2\x42\x7c\xe2\x3e\x1d\x74\x9c\x3d\xdf\x91\x0b\x01\x7e\x4f\x2d\xff\x86\xdb\xe4\x82\xc9\x1b\xd9\x94\xe8\x49\x3f\x2e\x68\x24\xbb\xa3\xbc\x7d\x7a\x84\x5f\x21\x7a\xe9\x76\x0b\x3c\xd0\x02\x26\xd9\xff\x26\x16\xd4\x52\x75\x1a\x90\xc3\xd0\xd3\xc3\x6d\x4a\xb4\xb2\x52\x0f\x67\x28\x81\x71\xbd\x3a\x34\xb2\xea\xca\xe8\xd4\x4c\x1e\x15\x3d\xda\x1f\x90\xbc\xd3\x59\x5d\xad\x37\x71\x3b\x8d\x34\x01\x56\xea\x90\xa4\xe1\x35\x95\x1b\xa7\x16\x9a\xc1\x75\x57\x8b\x81\xe9\x7a\x54\x1a\xb9\xbf\xb7\x63\x28\x79\x8d\x7d\x63\x1c\x14\xdf\x2a\xd6\x13\xe9\xc6\xe1\x14\x7a\x0e\x84\x06\x2d\xdb\xa0\x35\x85\x9d\x46\xba\xde\x5f\xad\xd9\xb3\x2b\x43\xda\xd4\x83\xc6\xb8\x02\x3b\x32\x39\x1e\x51\xef\x15\x20\xc6\x8c\x61\x91\x32\x6c\x49\x44\x23\x08\x0c\x62\x3d\xc4\xad\x0a\xa0\x74\x74\x8d\x82\x6c\x29\x64\x4c\x38\x98\x6a\x77\x00\x2f\x0c\xab\x90\x68\xe6\xc9\xec\x73\xcc\x2e\x0c\x58\x4b\x80\xe0\xbc\x37\x57\x21\xf7\xa8\xfc\x35\x31\x7a\x5e\x24\x0e\x8c\x66\x09\x2f\xb6\x30\x5b\x01\x2c\x70\xe1\x7a\xea\xff\x13\x38\x6d\x5e\x28\xd0\x64\x30\xca\x58\x5b\x0c\x85\xb2\x74\xe7\xfc\xbb\x63\xe3\x42\x3a\x98\x25\x79\xe5\xa6\x4a\x02\x62\xc4\x19\x08\xe5\x5d\xbe\x43\xda\xc1\xe5\xcc\x1b\xb7\x29\x8b\xe4\x28\x72\x0a\x12\xe3\xb0\x72\x55\x9e\xc2\x67\x5d\x45\x7a\xaf\x8f\x13\x25\x2e\x28\xaa\xd6\x3c\x15\x13\xf5\xf2\x39\x56\x4d\x36\x3c\x85\x05\xff\xa4\xe5\x0f\x66\x48\xc1\xcb\x82\xbb\xa8\x52\xbf\xf0\xac\xb0\x30\xcb\xe7\x3f\x05\x9d\xd8\x7b\xbd\x73\x18\xc5\x58\x6e\x70\x86\x18\xa4\xf4\xc9\xf3\xbe\xc3\xf4\xf0\x7c\x60\x9e\xeb\xb2\x4b\xa8\x78\xc6\xbf\x1e\x4f\x2d\x0f\xd1\x45\x0a\xb9\x4e\x31\x75\x52\x17\x78\x6f\xb1\x51\x82\x76\x0f\xfb\xe5\xa2\x67\xcb\xe9\x98\xa4\xff\x90\xa2"}, +{{0x6d,0xc7,0xcc,0xf3,0x29,0x37,0x8e,0x81,0x31,0xb6,0xde,0xfc,0xd8,0x93,0x70,0x30,0x10,0x68,0x94,0x63,0x36,0xb0,0xb7,0x62,0xac,0x5e,0xa5,0x14,0x87,0xdb,0xd3,0x9e,},{0x04,0xe9,0x0d,0x27,0x5e,0x79,0xdf,0x5f,0x2b,0x6e,0xf4,0xa3,0x15,0x05,0xaa,0xc0,0x5a,0x69,0x45,0x9b,0xaf,0x2c,0x58,0x1b,0x3c,0xe3,0xdb,0x29,0xf0,0xf1,0xfc,0x14,},{0x04,0x50,0x9d,0xb0,0x03,0xa1,0xa6,0xed,0x3f,0xbc,0xec,0x21,0xac,0x44,0xec,0x10,0xcc,0x06,0xd7,0x9f,0x27,0x14,0x96,0x08,0x82,0x17,0x03,0x16,0x27,0x5d,0xf8,0x04,0x23,0xa1,0xc1,0xa1,0x12,0xd8,0x81,0xfc,0x24,0xd2,0x81,0x25,0x26,0x07,0x90,0x58,0xaa,0x8b,0x60,0x8b,0xfc,0x6b,0x5e,0x57,0x63,0x22,0x40,0xc6,0x36,0xd6,0xeb,0x00,},"\x20\xce\xbb\xe9\x84\x01\xac\x89\x34\xc3\xe6\x5a\x57\x38\xcb\x0e\xc0\xcd\xc7\x5f\xdb\x09\xdc\x96\x31\x28\x94\xb1\x87\xc0\xa4\x6d\x2c\x38\xf4\x85\x5b\xe3\xee\xcc\xdc\xdc\xc5\x6d\x92\x6a\x8c\x08\xce\x6e\x74\x8e\x2a\x85\x8f\x53\x53\x2e\x7e\x5f\xc5\xf7\x01\x4c\x8c\x6f\x86\x31\x0c\xc2\x6e\xfe\xf3\x0a\xe5\x25\xa5\x15\x79\x40\xab\x53\x5e\xd8\xe4\x03\x11\x2b\x08\xe3\x5e\x2b\xb3\xdd\x91\xa9\xae\x8f\x77\x2d\x2a\xff\x37\xd8\xc4\x0d\x2b\x5c\xc8\x87\xa6\xf1\x50\x50\xa0\xf5\xbc\xf0\x36\x0c\x3a\x9d\x12\xd5\x91\x86\x55\xed\xc3\xc1\x3c\x86\xba\x6f\x4a\x2f\xa3\xbf\xcd\x40\x5e\xd3\x8f\x87\x1c\xf7\xdf\xf0\xf7\x5d\xaf\x2c\x32\x10\x84\xee\x9f\xa8\x12\x11\xad\xb1\x05\xb2\x5c\x22\x88\xf0\xf2\xf7\xf9\x3e\xf6\x56\xb2\xde\x19\x01\x22\xe7\xa4\xbf\xd4\xa1\xbd\x98\x93\xa8\x48\x5b\x50\x9f\xf0\xbc\x46\xcc\x96\x10\x51\xc1\xdb\x5a\x12\x49\x0c\x7e\x74\x19\x22\xcc\xc0\xa6\x65\x49\x64\x70\x27\x6f\x69\xc7\xb7\x70\x98\xc1\xe6\x70\xaf\x6b\x9f\x85\x12\x52\x99\x68\x75\xeb\x80\x35\xa8\x17\xfa\x9b\xe0\x7f\x2b\xe0\xbb\xb1\x20\x25\xe0\x56\x54\x14\xc8\x17\xe9\x42\x1a\xc7\x00\x37\x38\x93\x86\x2f\x24\xcb\x16\x5f\x9a\x27\x1a\x64\xfd\x23\x05\xc6\x67\x2c\x46\x76\x7f\x8f\x07\x5b\xe5\xd2\xd4\x07\x9b\xfa\xdc\x39\x56\x28\x8b\x02\x15\x60\x53\x11\xb5\xbf\x32\xf0\x03\x7b\x7c\x5a\xd5\x02\x01\x3e\x82\xae\x34\x19\xd9\xd8\xf3\x9c\x54\x5b\x58\x88\xf4\x71\x06\xc9\x4d\x5f\xd6\x08\x4d\x26\x03\x4a\x99\xf5\xdc\xbf\x26\xa8\x4e\xb4\xee\x14\x9c\x62\xa0\x41\x0d\x8c\x70\x7b\x1a\x9b\x07\x1f\x74\xed\x23\x93\x25\x85\x07\x2c\xe6\xcb\xd3\x3d\x4d\x54\xee\x91\x79\x16\xf5\xdf\xc6\x4d\x26\xa4\x98\x01\x84\x38\xb4\x55\x73\x93\x45\xdd\x60\xae\x0f\x47\x50\x62\x59\x15\xcc\x82\x9a\xb6\x82\x2d\x6f\x05\xf6\xd2\xbd\xa0\xa7\xbf\x56\x01\xe9\xa2\xed\x6d\xe9\x60\x37\x1d\x17\xe6\xf4\x37\x09\xc9\x67\x8c\xa7\x43\xad\xfb\xdb\x45"}, +{{0xcc,0xae,0x07,0xd2,0xa0,0x21,0xfe,0x3e,0x6e,0xe2,0x38,0x36,0xa7,0x11,0xb9,0x7b,0x04,0xe0,0xa4,0x41,0xf1,0x69,0x60,0x75,0x72,0x73,0x1c,0xb0,0x8c,0x26,0x94,0x88,},{0xa3,0x22,0x65,0xe5,0x32,0x8a,0x4f,0x49,0xcf,0x06,0xb4,0x67,0xa9,0x8b,0x9f,0x9d,0x5b,0x99,0x7b,0x85,0xdf,0xb7,0x52,0x3c,0xa6,0xa0,0xa1,0xd6,0x27,0xd3,0x28,0x91,},{0x0e,0xec,0x75,0x41,0x05,0x44,0x7f,0x97,0xd4,0xa9,0xcd,0x24,0x6c,0x7e,0xed,0xe3,0xfd,0x06,0x90,0x18,0xf0,0xd0,0x1a,0x41,0xdf,0xab,0xca,0x3e,0x90,0xa7,0x41,0x83,0x5e,0xa4,0xa9,0xd6,0x82,0x34,0x22,0x67,0xb2,0x50,0xfc,0x1c,0x8c,0x54,0x7c,0x89,0x63,0x2d,0x9f,0x68,0x9a,0xf5,0x36,0xc7,0x92,0x90,0x04,0xde,0xd0,0xd9,0x6f,0x09,},"\xa4\xbf\x82\x97\xd0\xdc\x5e\x4c\x92\xbd\x00\xad\x5b\x9c\x09\xb1\x23\x8b\x50\x3d\x61\x91\x16\xef\x74\x26\x03\x78\x34\x9a\x92\x82\xb4\x1f\x3f\x46\x76\xa6\x21\x5e\x3c\xe6\xd0\x22\x38\x48\x0a\x96\x04\x3b\x29\x42\xb3\xfe\xed\x12\x62\x0b\x1f\xa9\x7f\x77\x03\xb3\xeb\x68\x3c\x16\x01\xbd\x2f\x51\x82\x5c\x45\x0d\xf4\xfd\x1f\x33\xb0\xbf\x9c\x23\xc0\x32\x23\x78\x9e\x06\xe2\x4c\xf1\x36\xd3\xb5\x57\x40\x3a\x66\x98\x1f\x4b\x77\x7d\xcf\xe8\x90\xd2\xba\x96\xda\x4a\x47\x42\xae\xed\xdd\x6a\x61\x1d\x05\xfc\x21\x56\x94\xa5\xd8\x9a\x5d\xe6\x76\x0b\x1d\x94\x15\x15\x50\x44\xc0\x49\xcb\x02\x29\x1a\x15\x14\xfa\xa2\xe7\x7d\x2a\xe3\x3d\x44\x58\x5b\xda\xc6\x36\x5b\xf4\x81\xd9\xc9\x78\x33\x93\x7e\xab\x63\x6e\xd6\x57\x42\xa0\xd5\x97\x3b\x24\xd5\x40\x89\xb2\xda\xf0\x84\xd5\x41\x47\x65\x10\x5e\x4e\xca\x14\xaa\xad\xd1\x05\x33\x38\xa8\x47\x05\x05\x23\x2e\x4a\xc6\x33\x34\x5c\x5c\xde\xe1\xe4\x65\x3d\x1d\x93\x58\x3a\xf1\x18\x54\xb1\xd9\xb6\x5f\xc2\x02\x81\x83\x8c\x56\xdf\x11\x48\xf3\x5c\xcf\x9b\xfe\x2f\x3f\x80\xab\x73\xf5\xb7\x91\xcb\xed\x2d\x92\x06\x44\xcf\x03\x16\xf0\xcb\x5d\x36\x62\xb9\x12\x06\x47\xda\x56\xaf\xbe\xb4\x7a\x95\x29\x53\xbc\x1a\x37\xde\x85\x7e\x4b\x39\xfd\x92\xb6\x32\xb8\x51\x59\xf4\x6c\xd0\x5b\x6a\xbc\x23\x38\xd4\x63\x2d\x48\xe9\xa1\x78\x86\x0d\xe8\xf6\x5d\x9b\xc2\x3f\x24\x50\x7b\x7c\x56\x29\xe0\xbd\xaa\xc0\x67\xc4\x76\xc9\xc3\x94\x1d\x86\xf7\x88\x94\x4d\x74\x48\x52\xa6\x1d\xa7\x16\xf9\x5f\x3b\x04\xf0\x78\x3a\x56\x29\x41\xbc\xdd\xa4\x39\x59\x0f\xd1\x86\xb2\xa8\xeb\xf1\x9a\x5a\x7e\x4f\x4a\x3a\xaa\xb7\xa8\x7a\x43\x45\x24\xfb\xc9\x79\x9c\x99\x31\xeb\x8c\xe4\xe3\x4e\x99\xb6\x08\xca\xc9\x4a\xb7\xe7\x44\x95\x66\x8d\xf1\x36\x18\x5f\x48\x7d\x9f\xbc\xb6\x60\x5a\xd7\x25\x34\x54\x03\xec\x57\xf3\xf6\xdb\x36\x4a\x87\xf3\x8f\xea\x4b\x4c\x27\x15\x52\xe9\xf2\xe4\xa1\xbe"}, +{{0xdb,0x5d,0x5f,0x41,0xfd,0xdd,0x67,0x68,0x70,0x97,0x47,0xab,0x82,0x39,0xbb,0x4f,0x42,0xa3,0x1d,0x34,0xb4,0xfa,0x88,0x82,0x4d,0x94,0xbf,0x78,0xd3,0x14,0x92,0x64,},{0x03,0x85,0x8c,0xe6,0xb2,0xd2,0x40,0x79,0xee,0xad,0x66,0xca,0x0d,0xfe,0x77,0x2e,0xcd,0xa9,0xaf,0x4d,0x46,0xbc,0x9b,0x5e,0xdf,0xdc,0x28,0x6b,0x95,0xfe,0x97,0x16,},{0x5b,0x3d,0x0d,0xa7,0x10,0x23,0x55,0x48,0x6b,0xe4,0xd6,0x9c,0xfd,0x65,0x88,0x6c,0x9d,0x9c,0x87,0x38,0xb2,0x93,0xca,0xfb,0x23,0xb2,0x10,0x4b,0xfd,0xac,0x8d,0x7d,0x01,0x29,0x8e,0xeb,0x18,0xfd,0xe3,0xde,0xd6,0x49,0x1d,0x41,0xb4,0x19,0xcc,0x66,0x37,0x52,0xc4,0xe6,0x7d,0xbe,0x89,0x86,0x83,0x3d,0x20,0xe4,0xef,0x34,0x18,0x0b,},"\x67\xee\x03\xde\x45\xc3\xe7\x03\x0d\xb5\x24\x6e\xe5\xb5\x1b\xf2\x98\xbb\xa3\xe4\xd0\x93\x49\x37\xfc\x12\xd9\xa6\x29\x60\x4c\x53\xc0\x70\xe3\x0d\x61\x19\x99\xa9\xcd\xda\xf2\xd9\xac\xda\x6a\x9f\x67\x20\x2b\x35\x23\x69\xd4\x82\x60\xee\xbc\xe0\xe7\x8e\x4d\x5a\xe5\x4f\x67\x75\x21\xf8\x4a\x7b\xe0\x01\x7f\xab\x27\x8b\x2b\x57\x27\x5e\xfc\x5f\xa5\x7c\x61\x71\x86\xfc\x1b\xa4\x9e\xdf\xbd\x33\x08\x63\x48\x78\xd8\x64\xf2\xda\x15\x83\xca\x8d\x56\xce\x9f\xae\x77\xc4\x62\x03\x9a\xbc\x32\xd0\x53\x9c\x0a\x60\xb7\xbb\xba\x50\x29\xe9\x32\x9d\x27\x56\x83\xd9\xc4\xce\x77\xd0\xb9\x08\xad\xe9\x8b\x0e\x32\xb4\x42\x0d\x9a\xee\x2c\xc1\x0e\x4b\xe9\x22\xf9\x57\x25\x82\xdd\x89\x67\x14\x1c\x1d\x40\x2e\x21\x5f\x20\xae\xe0\xa8\x90\xe2\x36\x8e\x40\x6d\xea\x11\xbd\x11\x17\x7f\x2e\x03\x8a\xa2\xf1\xa0\xdf\xf5\x1a\x12\x8d\x95\x5d\x5e\x5f\x8d\x5d\x00\x09\xaa\xa8\x24\x40\xa9\x68\x64\xd6\xc6\x97\xf9\x10\xd1\xdf\x23\x0f\x46\x7f\x0e\x02\xa2\xe0\x2b\xf9\xe4\x5d\xa9\x5f\x25\x54\x10\xcc\x5a\xab\x8d\x85\xf4\x49\xa5\xde\x99\xaa\xbd\x44\xfd\x76\x3e\xc1\x46\x29\xf3\xdb\xab\x1a\x24\x7b\xff\xb7\x17\x46\x48\xe4\x3b\x9f\xb1\xeb\x0d\xf5\xe4\x10\x9b\x7a\x88\xe0\x55\x12\xb2\x08\x65\xba\xd3\x9f\x9e\xa7\x9d\x52\xf5\x18\x8e\x7c\xa5\x19\x44\x05\xbf\xb1\xa0\x97\x27\x61\x7f\x3f\x6c\x88\x19\x20\x08\xed\xbc\x0c\x65\x85\xdb\xf2\x61\xf1\x49\xdf\xfb\x59\x3d\x42\x71\x6e\x5a\x57\x77\xf5\x46\x2b\xee\xb1\xe9\xa5\x6a\x2c\x76\xe6\xcb\x73\x51\x17\xcc\x11\x83\xa3\x8d\x1e\x00\xb3\x03\xd1\x74\xaa\x9c\xf5\xc7\x31\xb2\xc7\x0e\xdd\x79\xcc\x5d\xc9\x6f\x40\x18\xf1\xd7\x1d\x71\x98\xbb\xb7\xd1\x34\xcd\x2f\xf8\xc1\x5f\x9a\x04\x28\x0d\xb2\x6a\x8f\xa9\x99\x7e\xb8\x6b\x13\x3c\x02\x2e\xda\x15\xd8\xad\x5e\x77\xcc\x9f\x62\x61\x59\x60\xba\xc2\xf9\xbb\xc3\xeb\xbd\x19\x8f\x72\xc5\x72\xb9\x71\x56\xfa\x7f\xa2\x29\xa9\x80\x14\xe1\x70"}, +{{0x7f,0x04,0x8d,0xfc,0xc2,0x65,0x0c,0xda,0x59,0x49,0x1d,0x4c,0xe2,0xb2,0x53,0x3a,0xec,0xc8,0x9c,0xc4,0xb3,0x36,0x88,0x51,0x94,0xb7,0xad,0x91,0x7d,0xb5,0xcd,0x14,},{0x08,0x00,0x1b,0x5d,0x40,0x95,0x8b,0xcb,0x27,0x0b,0xee,0xa9,0xba,0xba,0x33,0x87,0xe3,0xa4,0xb9,0x00,0xfc,0x42,0x27,0x56,0x57,0xc6,0xc6,0x91,0xa2,0xe2,0x64,0xf2,},{0x58,0x33,0x70,0x97,0x1d,0x24,0x65,0x2a,0xd2,0x13,0xc4,0x26,0x15,0x91,0x19,0x38,0xfa,0x9a,0xa3,0xd9,0xb7,0x19,0x69,0x40,0xe6,0xeb,0x08,0x15,0x12,0x00,0xc7,0xb6,0x72,0x9d,0x1e,0xff,0x8f,0x4f,0x09,0x04,0x07,0x4d,0xab,0x3d,0xdd,0xa6,0xaf,0x1e,0x4e,0x56,0x2b,0x7d,0x62,0x20,0xc1,0xa5,0x62,0x68,0x3b,0xea,0xb2,0x68,0xf8,0x0e,},"\x91\x75\x19\xcd\xb3\x35\x19\x68\x0b\xca\xe0\x4f\xaa\x79\x07\x71\xce\x7d\x13\x97\xc3\x45\xf1\xb0\x3d\xd7\x62\x57\x76\xf3\xf1\x95\x80\x99\x32\x61\x8b\x1c\x64\xac\xd9\x3a\xd0\x00\xea\xd0\x96\x54\xa3\x3d\x14\xf7\x48\xb4\x6b\x67\xaa\xe0\xff\x12\xdf\x3c\xc1\x63\x28\x0f\x47\xce\xdc\x16\xa8\x57\x90\x34\xe4\x98\x84\x29\x67\x72\xec\xbd\xbb\x71\xca\x29\xc1\x66\x23\x35\x33\xc8\xde\x54\x01\x2b\x41\x2c\xa1\x3c\xc2\x58\xf7\xc5\x46\x5d\x83\x42\x2f\x52\x4e\x4c\x05\xf8\x06\x31\x34\x78\x31\x9f\xd1\x43\xcf\x50\x88\xe6\x98\x37\x69\x7d\x36\x15\xd8\x0a\x7f\xa7\xe7\x44\x3f\xca\x65\xe7\x53\xac\x1b\x11\xd8\xef\xf3\x47\x66\x36\xae\x02\xd7\xa2\x0f\x4b\x23\x88\xda\xd6\x84\x00\x2f\x5c\xe9\x57\xca\xdd\xd2\x05\x3d\x0e\xd5\x33\x13\x2a\x81\xca\x19\xbb\x08\x0b\xd4\x3b\xe9\x32\x02\x8c\xb5\xf6\xb9\x64\xf0\x08\xb5\xb1\xc1\xc5\x99\x3b\xc9\xb5\x48\x5b\x22\xbb\xef\x70\x1f\x0a\x26\xa3\xe6\x75\xea\x31\x12\x2b\xba\xe9\x1d\x86\x4b\x54\xd8\x95\xaf\xdc\x79\xca\x58\xd4\xfe\x44\x92\x13\x35\x3b\x14\x9f\x31\x43\xb5\x14\x4d\x74\x7c\x5b\x46\x97\x47\x9a\xe6\x85\x28\x48\x53\x84\x04\x4a\xa2\xc9\x9b\xa4\xb1\x7b\x18\x4e\x94\x98\x22\x69\xbd\xe2\xde\x0b\x17\x70\x5d\x0b\xfc\x46\xd6\x90\x6a\x90\xed\xef\xe8\x91\x95\xde\x6b\xb8\xf3\xfb\x6a\x37\x41\x86\xc7\xcd\x08\x6d\x13\xd1\xb3\x52\x5a\x39\x94\xdc\x80\x20\xe1\xa0\x05\x54\xac\x8a\x82\xd6\x04\x7c\x5b\xff\x5e\x7f\x12\x45\x0f\x48\x65\xda\x16\x1e\x1a\x02\x1f\xd9\xbe\x8b\xd3\x3a\x32\xbb\x54\xa4\xdd\xf8\x74\x51\x2e\x74\xb5\xcf\xd3\xfc\x3c\xd9\xac\x11\xed\xd8\x78\x43\x36\x68\xe3\xfc\xc7\x82\xb9\x7b\x6d\x90\x5a\xdb\x0e\xbe\xc4\x2c\x92\x54\xac\x90\xf3\x58\x22\xc0\x0f\x97\xff\x3f\x0c\x7c\x39\xed\x3c\x7c\xb3\x92\x0f\x56\x08\xbb\x45\x83\x8b\xb2\x42\xa5\x2a\x86\x37\xd7\xce\xcd\xcf\x48\x9f\xa1\x83\xb4\x54\x51\xc6\xc9\xfc\xbb\xbf\x91\x4f\x5f\x7e\x6b\x22\x3b\xcb\x46\x75"}, +{{0x9f,0xeb,0x3d,0xf8,0x8c,0x49,0x4a,0x99,0x84,0x9c,0x6f,0xca,0x19,0x42,0x01,0x47,0x7a,0x2f,0xa7,0x56,0x4e,0x29,0xfb,0x06,0xcb,0x44,0xc1,0x15,0x4e,0x8c,0xea,0x3a,},{0xc3,0x56,0x28,0xca,0x6e,0xe2,0x8e,0xc1,0xc2,0x39,0xdd,0xc5,0xbb,0xa2,0xa9,0xe0,0x9e,0x48,0x46,0x81,0x6b,0x14,0x3c,0x74,0xdf,0xa2,0xae,0xc1,0xf6,0x25,0x51,0xb6,},{0xa1,0xc2,0x60,0x78,0x35,0xbe,0xc1,0xa1,0xd8,0x78,0x72,0xfd,0x8e,0xe4,0x88,0xd0,0xae,0x9e,0xd2,0x3d,0x49,0xfd,0x67,0x86,0xfc,0x49,0x96,0x72,0x5e,0x49,0xb3,0x26,0x21,0x18,0xba,0xbb,0x48,0x34,0x87,0x7c,0x7f,0x78,0xfb,0xea,0xc0,0x2d,0xf4,0x0a,0xb0,0x91,0xb8,0xb4,0x20,0xdc,0x99,0x51,0x38,0x1e,0x3b,0xcd,0xa0,0x67,0x05,0x02,},"\x95\xfb\x75\x81\xbd\x25\xff\xd4\x42\xc3\xae\x38\xa1\x9b\xea\x73\x49\xc7\xb7\x68\x3b\xa6\x76\x7e\x14\x8f\x0a\xfc\x15\x37\x3f\x67\xc1\x6d\x47\x17\x81\x20\x2e\x6d\xa8\x05\x4e\xd7\xfb\x9e\xe2\x04\xcc\x0f\x63\xc2\x10\xa6\x70\xa5\xf9\xce\xd4\x29\x45\x88\x19\x63\x30\xd3\x1b\x8e\x83\x92\xbe\xf6\xb4\x8f\xe3\xc9\x20\x78\xfa\xe1\x12\x84\xb4\xc3\xba\x20\xd9\x37\xe2\x71\x9d\xe7\xbf\x67\xc0\x06\x69\xad\x23\xe6\x13\x84\xeb\xdf\x8c\x6e\x60\x73\x54\x28\xc0\x84\xfe\x21\x7f\xdb\x47\x09\xcc\xb6\x08\x3f\xc0\xae\x4a\x05\x27\x3e\xef\x73\x90\x23\xd3\x4b\xb7\x3f\x66\x2d\xac\xdf\x11\x0b\x6d\xbd\x3e\x74\xfc\x14\x91\xe8\xc9\x65\x96\x07\x5f\xae\x5c\x36\xaa\xbe\x2a\x0a\x53\x05\x2b\xf7\x7c\x44\x62\x43\x80\x63\xaa\x7b\xc0\xc5\x0a\xb9\x20\xc9\xeb\x28\x86\x71\x56\x0c\xa5\xba\x7a\xf4\x4a\x53\xdb\x2e\x2f\xf4\x3c\xa5\x60\x69\xea\x55\x17\xcb\x21\x4e\x76\xfa\xa5\x3d\xbd\xa1\x00\x00\x3c\x4f\x61\x75\x41\x40\x41\xbe\x74\xde\x22\xce\x15\x5d\x22\x81\xb6\xf4\x03\x5b\xe3\x98\x41\xaf\xdb\x96\xdd\x89\xaa\x80\x8e\x68\x65\xba\xe6\x2d\x6b\xed\xd9\x19\xd3\xe8\x65\x10\xb9\xfa\x5f\xed\xd1\x97\x7c\x41\x31\xb2\xb8\x6e\x0f\x48\xd7\x21\x5e\xb1\x3d\x54\x98\xca\x5d\x23\x68\xf8\x18\x95\xed\x85\x5a\x52\x71\x24\x65\x7e\xc9\x53\x9e\xfe\x3b\x24\x99\xa3\xb0\xb3\x38\x26\x2f\x26\x34\x0e\x22\x55\x4c\x79\xf4\xfa\xd2\xb4\xe4\x19\xc7\x0b\xc1\xa2\x10\x7d\x20\x64\x56\xb6\x36\x87\x81\xbe\x4b\x5e\x2c\x54\xda\x42\xd3\x36\x04\x0f\xb7\xba\x49\xc3\x2d\x75\x23\x21\xad\xcd\x92\x98\x6e\x78\xbe\xdb\x22\x6c\xea\xc5\x02\x92\x08\x9b\xb5\x79\x02\x7f\x70\x22\x17\x74\x5a\xfe\x06\xa5\xbe\x13\x6b\x39\x98\xa3\x60\x4c\x9f\xf2\xac\xd6\xfa\x3f\x3f\x71\x63\x3d\x31\x02\xfb\xf0\x30\x47\xc5\x48\x6f\x84\xc4\xdc\x24\x47\xd8\x63\x79\x63\x83\xd5\x5f\x08\xc9\x81\xfd\x4d\xd7\xdc\x1c\xb7\x2b\x8b\xa4\x43\x5a\xf6\xab\xdd\x74\xe6\xf6\xe6\x79\x8f\x1a\xe2"}, +{{0xbf,0xf6,0x89,0x55,0xdd,0x6a,0xe0,0xe8,0xba,0x85,0xab,0x0d,0x0c,0xda,0xf0,0x4a,0x9f,0x5b,0xef,0xd5,0xef,0x60,0x14,0xf4,0x99,0x94,0xa7,0x83,0x63,0xdc,0x17,0xf7,},{0x0a,0xd9,0x49,0x3a,0xf8,0x0b,0x15,0xf0,0x7a,0x52,0x1c,0xcd,0x67,0x4f,0xe9,0xe5,0x21,0x2a,0x4a,0x28,0xc1,0x7c,0x74,0xf6,0x60,0x5f,0xfe,0xf7,0x8a,0x4a,0xed,0x72,},{0x93,0x19,0xee,0xf7,0x40,0x63,0x3a,0xda,0x1a,0xf0,0xe1,0x37,0x64,0x4c,0x61,0xfb,0x3e,0x11,0xba,0x4b,0x01,0xd3,0xc6,0xf2,0x53,0x92,0xdc,0x93,0x67,0x87,0x2a,0x23,0xbe,0x56,0x31,0x0d,0x31,0x2e,0xfc,0xb9,0x1b,0xdb,0xab,0x78,0xa7,0x5e,0x57,0x6e,0xbe,0x90,0x81,0x97,0x24,0x15,0xf5,0x62,0xdb,0x41,0xba,0xf5,0xe2,0x33,0x8b,0x07,},"\xd8\xf5\x65\x0a\xa3\x58\x1c\x4d\x39\xbd\x1b\x8a\xfc\x96\xc1\xad\x7c\x4b\xf7\x23\x42\x6f\x9d\x7f\xab\xd1\xa5\xc8\xac\x1d\x2f\xe5\x4a\x97\x1f\xac\x76\x5e\x05\xaf\x6e\x40\x7d\x72\x69\xba\xb6\x61\xb3\x43\x22\x92\xa4\x84\xf9\x52\xc1\x10\x95\xbb\xd2\x0a\x15\xd7\x7c\x41\xf8\xf3\x73\x1a\x50\x4d\x51\x8e\xe1\x0c\xd0\x06\xc9\x6e\xe5\x73\x72\xde\x5b\xea\x34\x8e\xc8\xba\x15\x91\x62\x17\x0c\x63\xe9\x70\xf1\xc7\xa3\x46\x5a\x3d\x59\x2e\x1d\x56\xc6\x54\x0f\xbd\xb6\x02\x28\xe3\x40\x90\x96\x46\x32\x0c\x95\xf2\x56\x98\xcd\x48\x96\xbd\xff\x58\xe2\x56\x1e\x3b\x3d\x9a\x73\xb8\x97\x47\x91\x2a\x1c\xf4\x67\xd6\x3e\x41\x45\x5f\xda\x77\x47\x7f\x46\xfe\x69\x37\xbb\x0e\x79\xd9\x2c\xcd\x52\xe8\x2d\xba\x90\x8a\x05\xa5\x7c\x7e\xcf\x49\x55\x4a\xb4\x4c\x0b\x71\x8e\x3b\xdd\x5f\xc0\xbf\x70\x70\xd9\xc5\x8f\x86\x05\x91\xc1\x8b\xca\x8b\x3a\x9a\x14\x8a\x06\x54\x8e\x0f\x01\x60\x2b\x1e\x6f\x68\x60\x37\xc9\x4f\xf7\x32\xe1\x55\xd5\x2d\x5b\x0b\x44\x70\x3b\x3d\x11\x16\x3e\x3f\x56\xe3\xb9\xc1\xb8\x64\x76\xe4\xdc\xbf\xc5\x3f\xa0\x59\x84\xe8\xc7\x5d\xd2\x18\x43\xcf\x96\xf9\xe4\x94\xab\xba\xe7\x18\x4a\xa4\x27\x36\x63\x3e\x38\x11\xae\xff\x40\x2b\x2f\xcb\x7d\x7f\x70\x2e\x44\x72\x41\xe2\x2a\x58\x84\x2f\xd6\xd0\xc0\x3d\x33\xff\x5b\x8c\x79\x22\x00\xe1\x73\xda\xa7\xb2\x17\xe4\xb2\xf4\x43\x3e\x6c\x02\x0a\xcc\xe5\x01\xb9\x32\x3a\xa0\x24\x11\x44\x43\x4b\x08\xe9\xd2\x46\x91\x39\xff\x67\x34\x22\x08\x90\x05\x46\x20\x0f\xd9\x71\xa6\x5d\xbd\x6d\xb6\xc2\x1e\x3e\xf9\x17\x2a\xbb\xa1\xea\x9e\xa2\xa2\x49\xad\xdf\x1a\x1e\xaa\x3c\xe1\x19\x38\xb1\x3e\x30\x91\x3c\xd0\xda\xd4\x91\xfc\xbb\x32\x85\xea\x37\x8b\x8e\xf9\x22\x7f\x3f\xa8\x0b\x58\x6e\xcf\xea\xe1\x37\x06\x6f\x84\x48\xac\xdf\xb7\x8d\x6d\x3e\x9e\xf4\xa6\xb3\x62\xdf\x42\x41\xad\x9a\xe2\x53\xb8\xe1\x59\x7d\x65\x6e\x00\x0c\xea\x44\x7a\x02\xfa\x49\x33\x32\x86\x09\xbb\xa0"}, +{{0x1b,0xa9,0x19,0xc0,0x66,0xbb,0x56,0xe6,0x40,0xc3,0x33,0x59,0x68,0xe1,0xd1,0xb5,0xbc,0xc0,0x93,0x38,0x3e,0x2d,0x7c,0xf8,0xb5,0xff,0xf5,0xc6,0x1e,0xc4,0x7a,0x77,},{0x80,0x4c,0x90,0xbd,0xc2,0xb3,0x61,0x8b,0x01,0xf0,0x75,0xe0,0x41,0xfa,0x97,0x1b,0x83,0xc5,0xb6,0xcf,0xa3,0xb6,0xb3,0x97,0x4f,0x3f,0xa4,0x35,0x99,0xbe,0xac,0xab,},{0x50,0x3e,0xb7,0xed,0x6d,0xe1,0xb7,0x76,0xc9,0x52,0xf2,0x55,0xbb,0xd4,0xbc,0xfb,0x0e,0x48,0xbc,0x70,0xc2,0xcc,0x2f,0x1f,0x72,0xbf,0x68,0x81,0x47,0x90,0x40,0xc4,0x75,0x24,0xec,0x54,0x2a,0xe1,0x3f,0x60,0x05,0xca,0x50,0x16,0xb5,0x8b,0x73,0x6a,0x50,0x89,0x8d,0xd0,0x56,0x9d,0x4d,0x38,0xad,0x29,0x86,0x30,0xd6,0x8a,0xdb,0x0b,},"\x87\xc5\xc7\x5d\x8a\xd0\x7d\x52\xac\xd7\x81\xd1\xbb\x95\xf7\x8c\x70\xe2\x1c\x2d\xd6\x6f\x7a\xa4\x42\x34\x15\x2f\x98\x23\x4d\x12\x83\x58\xa8\xae\xe9\x8e\xa9\x03\xa7\x7b\x44\x1d\xb1\x44\x7a\xe6\xff\x34\x32\xdd\xd4\x57\x0f\x7f\x58\x03\x61\x22\xc1\xfd\xcc\x93\xcb\x21\x57\x37\x39\xc1\x9c\xca\xa4\x11\x50\x8e\x08\xde\x26\x06\xf3\xd8\xf2\xdb\x89\xdf\x6a\x44\xa4\x61\x33\xd5\x70\x18\x46\x26\x27\xe2\x2f\x57\xef\x36\xd1\xde\x02\x4d\xe3\xd4\xae\x41\xb7\x52\xdf\x48\x21\x15\x59\x34\xb4\x47\xb2\xef\xfe\x51\x24\x87\x52\x1b\xe0\x35\x68\x32\xa7\x4c\xe0\xe2\xd8\x30\x1b\x79\xf9\x31\x75\xe8\xb6\xb9\x61\xb1\xdf\x63\x7d\x8a\xca\xdc\x88\x45\x43\xc6\x86\x4f\x80\x25\xec\xec\xec\x7c\x6e\x4f\xe0\xfe\xcf\xc4\x0d\xcd\x95\xe8\xd6\xab\x93\xce\x25\x59\x53\x84\x43\x6b\x59\x8b\x73\xc7\x4b\x03\xd4\x9e\xd5\x00\x2c\x0f\x85\x8c\xfd\x9d\x0d\xf6\x1e\xde\x93\x7c\xc4\x16\x59\xd6\x70\x8b\x96\xfc\x5a\xaa\xde\xe1\x09\xe2\xa6\x88\x46\xba\xf2\xc2\x46\xdf\xcf\x3d\x27\xc2\x8b\xd1\x37\x1e\x35\xfc\x94\x12\x63\x14\x42\xee\x75\xf3\x8c\x6e\x49\x58\x07\x0a\x74\xf6\xe6\xa2\x20\xf7\x5c\x72\x80\xea\xb4\x73\x7d\x97\xe3\x78\x82\xf3\x62\x48\x11\x67\x5f\x16\xca\xf6\x0c\xb9\x44\xbc\xe9\x2e\x75\x88\x4c\x56\x48\x3c\x61\xf2\x6b\x63\x71\xb1\xb5\x12\x37\x62\x1a\x06\x54\x3e\xb4\xab\xea\x7b\xec\xc4\xfc\x31\xdb\xb5\x47\x5b\x3d\xeb\x9b\xb3\xc8\x99\x23\x87\x10\x48\x30\xc6\x07\x2a\xfe\x1a\xf2\x44\xbf\x68\x1a\x40\x32\x9c\x9b\x37\x77\x2b\x09\xc5\xe8\x8e\x78\xf7\xdf\xfb\xc0\x45\x49\xff\xa1\x3b\x41\x44\xdd\xfa\x53\x8f\xc4\xb3\x30\x05\x40\xad\x83\x02\x15\xe2\x5f\x11\x44\x6d\x28\x9f\x33\x12\x2c\x2c\x88\x0d\xe3\xda\x71\xc4\x53\xd7\xe8\x8f\x7c\xa4\xea\x3d\x12\x55\xe8\x2f\x4b\xc9\xe5\x53\x3d\xc4\x01\xc3\x30\x40\xe1\x69\x40\xb2\xcf\x9c\xf2\x1f\xea\xca\x1c\x2c\x6c\x33\x33\x7c\xf7\x5e\x18\x84\xb4\x83\xbf\x80\x15\x36\xd3\x04\x08\x91\x15\xa0"}, +{{0x9b,0x36,0x24,0x7c,0x17,0x71,0x0e,0x95,0x26,0x1a,0x7d,0x70,0x2f,0x57,0xfe,0x81,0xf2,0x97,0x11,0x17,0xa5,0x0c,0x87,0x92,0x01,0x93,0xb3,0x86,0xd4,0x94,0xca,0x97,},{0x29,0xae,0x39,0xf2,0x73,0xe3,0x5f,0xb3,0xf6,0x11,0xda,0x09,0x16,0x00,0x65,0x0e,0xfb,0xc4,0xfc,0x4d,0x1e,0x7b,0x4c,0x76,0xac,0xed,0x5a,0x83,0xf8,0x26,0x34,0xf3,},{0x03,0x59,0x70,0xa6,0x72,0xe9,0x3f,0x87,0xeb,0x42,0xcc,0x39,0x6f,0x6e,0xa7,0xe1,0xb3,0xdd,0x5c,0x59,0x51,0x57,0x28,0x26,0xd1,0x07,0x5a,0x15,0xc2,0xd7,0xe4,0x54,0xdf,0x19,0x5b,0x51,0xaa,0xe8,0xdc,0x61,0xef,0x7a,0xb8,0x95,0x48,0x5f,0x64,0xe5,0x98,0x95,0x73,0xd9,0x8a,0x06,0x2e,0x67,0xae,0x73,0x56,0xfe,0x5c,0x9e,0x3b,0x0f,},"\xe8\xd9\xd5\x3b\xa2\x7e\x98\xed\xd5\x5d\xf3\xc6\xb2\x45\xea\xcd\xdc\x8a\x40\xe3\xef\xb0\x07\xbc\x91\x8e\xc5\xa8\x69\x17\x8a\x17\x0b\xb4\xa6\x35\xb7\xf8\xf7\x42\xe3\x7a\xd4\x5d\x14\xa7\x43\x44\xa6\xb5\x22\x83\x0a\x52\x21\x06\xeb\x96\x0d\xaf\x19\x2d\xc1\xe0\xfd\x70\xf1\x61\x60\xe1\x22\x51\x68\x92\xd0\xe2\xab\xd0\xd4\xae\x0f\x0d\x2e\x5a\xdc\xc9\x9a\xd5\x53\x02\xe2\x51\xb3\xe7\xa4\xd0\xcb\x33\x77\x4a\x49\x70\x49\x90\x5c\x33\xde\x1f\xbb\xc1\xad\x2b\x6c\x64\x52\x95\xfe\x41\x6b\x4d\x12\xb2\x32\xef\xe0\xa3\x3c\xd2\xad\x87\x32\xeb\xa1\xc3\xcb\x0e\xae\xb0\xb2\xa5\x7f\xa0\x3e\xc5\x67\xca\x29\x21\x0b\xf6\xff\x95\x42\xa7\x66\xf4\x96\xfe\x68\x05\x8a\xa9\x83\x80\x6c\xbe\x7a\xb1\x0a\x47\x92\x0b\xac\x82\x48\x81\x8e\x54\xa4\x15\x51\xc9\xa0\x95\x9e\x89\x94\xca\xc6\x0f\xc8\x68\xad\x48\xb5\xa2\x4d\x5f\x24\xa7\xa5\xa3\xfd\x90\xb8\x47\xe8\x17\xad\x3d\xd5\xd0\xd6\xf8\xde\x2d\x20\x4f\x64\x24\x83\xbd\x53\x58\x5a\x92\xef\x92\x54\x15\xa9\xb3\x8f\xbb\xf0\x7f\xc0\xf3\x5e\x70\x75\x69\xcf\x48\x8b\x20\x54\x53\xce\x54\x33\xeb\xa6\xfd\xe8\x78\x1a\xf7\x2b\x52\xbf\xbc\xab\x85\xea\xd3\x85\xd9\xd3\x17\x5e\x21\xad\x33\x73\xad\x53\x5c\xf0\xe3\x57\xed\x6b\x53\x83\xef\x38\x29\xa9\xd5\x09\x5b\x87\xdc\x9a\xad\xbe\x0c\xa7\xab\xad\xf3\x3e\xc3\xb6\xff\xd6\xeb\x94\xaf\xdc\xc1\x2e\x8d\x66\xa6\xfc\x05\xac\xf9\x73\x68\xdb\x0f\x69\x56\x5d\xcd\x8f\xef\x4d\x1e\x49\xd7\xdd\x4a\xc0\x53\xc2\x18\xf5\x24\x0c\x81\x2d\x4e\xbb\xa4\x40\xdc\x54\xca\xcd\xdb\x1c\x39\x32\x9e\x5b\xd0\xc3\xc8\x0d\xc3\x25\x9a\x80\xf0\x59\xf9\x46\x79\xaa\x07\x94\xca\x01\x15\xcc\x62\xaf\x25\xe1\x24\xcb\x8a\x9d\x41\x60\xea\xce\x6d\x22\xc7\xb1\xc4\x45\x44\xf8\x11\x42\xa1\x9e\xbb\x02\xa9\xbd\xa6\x42\x9c\x50\xe7\x83\xdb\x4a\x07\xf0\x21\x9e\x85\x7c\x8d\x3c\x56\x55\xa5\x82\x83\x1c\x8e\xab\xc3\xf1\x9b\x59\xad\x8d\x2c\x71\x4a\xde\xaf\x40\x39\xd5\xcf\x70"}, +{{0x6f,0xed,0xe7,0x39,0x6c,0x46,0x20,0x33,0x18,0x9a,0xcd,0x23,0xd2,0xf9,0xd0,0x2b,0x68,0x89,0x8d,0x35,0xf3,0xa0,0x1a,0x79,0x8f,0xc2,0x4d,0x48,0x8d,0xe9,0x3a,0x78,},{0xb3,0x40,0x62,0x06,0x0b,0x2c,0x20,0x07,0x6a,0x98,0xfe,0xa9,0x39,0xb3,0xb3,0xa5,0x04,0x51,0xa5,0xf4,0x9f,0x83,0x51,0xc0,0xad,0x75,0x91,0xdb,0xbe,0xbb,0x13,0x0f,},{0x88,0xa8,0x3e,0x20,0x12,0xd2,0x09,0xca,0x03,0xb8,0xeb,0xf6,0xde,0x5b,0xb7,0xef,0x4c,0xcb,0x5e,0x3d,0xf5,0xca,0xc7,0x89,0x54,0xaa,0x69,0x49,0x30,0xe4,0xde,0x82,0x54,0x4e,0xf5,0x08,0x3c,0x48,0x92,0xdb,0x9f,0x05,0xd7,0x7b,0xf6,0x3f,0x4f,0xdf,0xce,0x15,0xa4,0xd1,0xc3,0xf8,0x5b,0xae,0x80,0x77,0x06,0x2b,0xec,0x0e,0x7b,0x07,},"\x5a\xbc\xc1\x4b\x9d\x85\x78\xde\x08\x32\x1d\xe0\xd4\x15\xe3\xd4\x0e\x9d\xe3\x1e\x18\x88\x13\x74\x75\xce\x62\xbc\x6f\xbe\xe8\xfd\xd0\x3b\x9d\x47\xc7\xb8\x8b\xbc\xeb\x80\x44\x44\x49\x0b\xf6\xa3\xcc\xb7\xa2\x73\x26\x1e\x24\x00\x4e\xa6\x7c\xef\xa3\xd5\xd1\x73\x57\x6d\x01\xe3\x8f\x76\xc1\xe0\xe5\x15\x08\x3c\x97\xe7\x99\x14\xac\xf2\xbe\x41\x60\xef\x93\x60\xbb\xe9\x86\xb3\x6e\x9f\xf9\x33\x46\xb0\xe7\x06\x91\xd9\x34\xe4\x7f\x8a\x50\x3f\xa9\x33\xab\x2a\x50\x42\x69\x47\xcd\xa8\xe8\x10\xc9\xeb\xe3\xb3\x69\x82\xf0\x9a\xee\x60\x92\x73\x9f\xa2\x35\x8b\x61\x3c\x7f\x12\x9d\xb0\xdc\xbe\x36\x8b\xee\x52\xf2\xf7\xf1\xdf\xe3\xd2\x43\x46\x05\xb5\xaf\xcf\x25\x60\x71\x71\x7d\x92\x4f\xd0\x80\x3b\xbd\x0d\xd1\xf9\x55\x5c\xe8\x34\xda\xc7\x81\xdf\x4c\xc7\xaa\x19\xe7\xf1\x1d\xa9\xfb\x99\xcb\x9e\x6b\x9e\x1e\x6f\xb4\xf7\xe8\xdc\xb2\x23\x6c\x28\xae\xb6\xcb\xc5\x5a\x13\x0e\x03\xc1\xb1\x7a\x99\x1c\xca\x1b\x79\x4e\x6c\x13\x73\x2d\x5b\x0a\x66\xf6\xeb\xa8\x60\xec\xb9\x85\x55\xaa\x4c\x21\x8d\x11\x2b\x11\x6b\xce\x23\x82\x95\xde\x14\x27\x41\xf6\x87\xbe\x0b\x24\x87\xf5\x8f\xfc\x5c\x12\xa0\xa5\x19\xf1\xe2\x37\x93\x24\x2e\xf8\x57\xed\x39\x8a\x20\x69\x9d\x43\x51\x45\x3f\xc2\xf0\x92\x76\x2a\xbd\xe3\x4f\x4d\xa2\xdb\xe0\xce\x2a\xab\xaf\x6b\xc4\xc0\x15\x9f\x3f\xe1\xae\xa1\x6a\x03\x6f\x7e\xae\xcd\x62\x95\x38\xf3\xe0\xee\xd8\x3c\x9a\x4d\xc1\xab\xc2\x38\xf9\x0d\xaa\xf4\x89\xfd\x61\xb3\x4d\x93\x7b\x6f\x46\x07\xa7\x88\xba\xa8\x20\x61\x94\x3d\xba\xb2\x6c\x1d\x38\x4d\x8d\x49\xf9\x93\x48\x80\x0b\xf3\x61\xf8\x71\xf5\xd6\xcd\xa1\x8f\x68\x99\x18\xce\xc3\x1a\xd1\x58\xf1\x86\x3d\x13\xff\xac\x54\x05\xc1\x62\xc3\x2d\xe0\x6e\x32\x99\x4c\xc4\x10\x6f\x95\xbb\x4f\xff\xdb\xef\xe7\xd6\x29\xec\x77\x97\x39\x46\x09\xfd\xbf\xea\xdb\x46\x92\x73\x70\xa1\x1f\xb3\x84\x71\x54\x0f\x95\x1b\x93\xc6\xeb\x23\x86\x68\xdc\x00\x6c\x21\x66\x0b\xa2"}, +{{0xd5,0x59,0x58,0x01,0x34,0xab,0x05,0x0a,0xca,0x44,0x6e,0xa7,0x75,0x0e,0xf6,0xb3,0x71,0xd9,0x2d,0x76,0x45,0xec,0x76,0x35,0xfe,0x78,0x51,0x10,0x0b,0xc4,0xe5,0x1e,},{0xde,0x50,0x20,0xcd,0x21,0xa8,0xb3,0x23,0x39,0xde,0xcb,0xed,0xff,0x24,0x66,0x4d,0x95,0x80,0x32,0x63,0x27,0xae,0xdf,0x09,0xc5,0xec,0x6b,0x3f,0xe5,0x40,0x52,0x26,},{0x6f,0xcb,0x1a,0xc9,0x29,0x0a,0xb7,0x67,0xd5,0x9b,0x59,0x8c,0x9a,0x24,0xec,0xdb,0x6c,0x05,0xbb,0x02,0x3e,0xc3,0x60,0x14,0xa4,0x0d,0x90,0x8e,0xf0,0xdc,0x37,0x8a,0x45,0x28,0xb3,0x76,0x0d,0x88,0x9a,0x79,0x17,0x4e,0x21,0xca,0xe3,0x5d,0xf4,0x5d,0x42,0x7b,0xa6,0xea,0x81,0x2b,0xdd,0xca,0x16,0xe3,0x5a,0x69,0xb5,0xe7,0x9f,0x0a,},"\x68\x42\xe3\x19\x0a\x11\x0e\xee\x96\xc5\x07\xd4\xbc\xb4\xc5\x48\xc3\xa0\xed\x7b\x1a\x8e\xd7\x7d\xd9\x3b\x38\x61\x3b\x23\xc7\x3e\x83\x0b\x20\x5e\x62\x65\x19\x21\xad\x82\x96\xb0\x8d\x1e\x10\x08\xad\x78\xf2\x99\x6e\x3c\x7f\x38\x03\x2e\x46\x7c\xff\xec\xd7\x7b\x85\x25\xe2\x43\xce\xc0\x21\xf8\x52\x96\xaf\xd5\x45\xd7\xbe\x1a\x62\x56\x8b\xb0\xcf\xcd\xb9\x0d\x61\x4e\xd7\x98\xbf\xb7\xef\xc6\x55\x32\x68\x16\xa6\x10\x82\x25\x1d\xf0\x16\x13\xaa\xc8\x8e\xfc\xea\x1e\x0e\xa2\x96\x1b\x8f\x92\x1e\xbe\x15\x58\xde\xe8\x33\x74\xa0\x11\x3a\x78\xc5\x58\x57\xce\x20\x55\xbb\x2c\x48\xba\xdb\xd3\xd8\xf4\xcb\x19\x73\x4d\x00\xd0\x60\x4b\x61\x90\x73\x02\x0d\x72\xa9\x9a\x19\x23\xe6\x16\x0a\x09\x94\x65\x67\xfd\x4b\xda\x66\x44\x2e\xf5\xa7\x36\x07\x86\xd1\x78\xda\xe4\x49\x22\xf3\x50\xce\x2e\xdc\x6a\xf7\x3d\x1b\xd8\x0d\xc0\x3e\xc3\xca\x70\x05\xf4\x10\x9d\x10\xc6\xd4\xf7\xd8\xfa\x61\x73\x51\x10\xf8\xdb\xae\xdf\x91\xa0\xba\xd7\xd7\xfb\x5c\x04\xd7\x06\x37\x3c\x15\xc6\x45\x06\x3f\xf4\xb4\xfb\xd2\xd5\x59\xb0\xaf\xad\x43\x2d\x4c\x49\x6c\xd8\xab\xfe\xa2\x86\xfa\x67\x5d\xc0\x76\x72\x6e\xc5\x22\xb3\xa3\xc2\xf4\x7a\xec\xc5\x39\xf4\x8a\x79\x21\x69\xc4\xcc\x8c\xd4\x1c\xd2\xcb\x6b\x63\xdd\xbc\x19\x37\x3a\xc9\x69\x1c\x2b\xc2\xf7\x8f\x22\x60\x3d\x55\x13\x71\x5a\x16\xd4\x57\x4e\x7a\xcc\x4b\xea\x6d\xcd\x8c\xa7\xf1\x98\x65\xa4\x9d\x36\x64\xa2\x10\xdf\xad\x29\x07\x74\xb1\x0b\x71\x88\xf2\x55\xb3\xbe\x4d\xc8\xfa\x86\xf8\xda\x3f\x73\xa4\xe7\xc9\x29\x95\x1d\xf3\x0f\xe6\x6a\x17\xc8\xce\xe2\x3e\x4f\x2e\xd2\x06\x3f\x0b\x02\xab\x40\x37\x2c\xbe\x54\xb9\xa7\x08\xdf\x7c\x48\xa0\x65\x66\xd3\x9b\x19\x43\x4c\x6c\x76\x69\x87\xb3\xeb\xb0\x06\x75\xf4\x4c\x4b\x3c\x1e\x9f\x45\x04\xe7\xa9\x27\x05\x89\xc0\xd0\xf4\xcb\x73\x42\x35\xa5\x8e\xf0\x74\xcf\x9d\xec\xf3\x60\x1a\xee\xca\x9f\x1d\x8e\x35\x6c\xb2\xdb\x5f\xce\x79\xcb\xc3\x61\x43\xf3\x4b"}, +{{0x9d,0x4c,0xe9,0x75,0x54,0x78,0x76,0x63,0x6f,0xea,0x25,0x43,0x7c,0x28,0x80,0xc9,0xaa,0x8e,0xe6,0xb2,0x70,0xd1,0xb2,0xda,0x19,0x7c,0x8d,0x7f,0x95,0xe7,0xdc,0xcc,},{0xbd,0xe4,0x99,0x3c,0x03,0x04,0x77,0xc3,0x58,0x90,0xaa,0xe8,0x2b,0xb5,0x08,0x7e,0x91,0x4e,0x64,0xb9,0x4f,0xfc,0x64,0xe2,0xd7,0xa5,0xa7,0xc9,0x19,0xe2,0xd9,0x02,},{0xbe,0x17,0x44,0x4c,0xd4,0x65,0xa8,0x7a,0x97,0x1d,0xf8,0x4e,0xb1,0x02,0xf9,0xc7,0xa6,0x26,0xa7,0xc4,0xff,0x7a,0xea,0x51,0xd3,0x2c,0x81,0x35,0x3d,0x5d,0xbc,0x07,0x39,0x3c,0xa0,0x3d,0xb8,0x97,0xd1,0xff,0x09,0x94,0x5c,0x4d,0x91,0xd9,0x8c,0x9d,0x91,0xac,0xbd,0xc7,0xcc,0x7f,0x34,0x14,0x4d,0x4d,0x69,0xeb,0x04,0xd8,0x1f,0x0c,},"\xea\x0f\xa3\x2a\x4a\x28\x88\x11\x30\x1b\x9e\xe5\x33\xfa\x35\x1f\xdf\xbf\x6b\xc1\xd0\x55\x5a\x74\x02\x76\x7a\x3a\x91\x98\x55\x8f\x74\xbb\xa7\x03\x18\x57\x99\x5b\x9f\x32\x62\x26\xf1\xdd\x5d\xf1\x07\xb0\x63\x42\x20\x3e\xb8\xd4\x0c\x5f\x1d\xc9\x5b\x4f\x3f\x88\x97\x5a\xa2\x4a\xf8\x76\x9e\x26\x70\xc4\x66\x71\xbe\xbb\x7a\x0f\x1b\x75\x68\x72\x9a\xee\x47\x7e\x89\x88\xaf\x9c\x74\x9f\x32\x02\x70\x81\x71\xfd\x94\xb3\x37\xae\x67\xed\x21\xa6\xc4\x41\x74\x01\x4b\x0b\x0e\xb5\xba\x71\xc2\x77\x97\x8d\x48\x8c\x24\xc4\xa7\x84\x13\x09\x84\x6b\x4e\x30\xa4\xfb\xbc\xfc\x45\x07\x8d\x7e\x14\x01\x41\x14\xb1\xac\x64\xf7\xc3\x3c\x9a\xc2\x5e\xa5\x62\x6c\x2c\x81\x9f\xba\xa2\xa4\xde\x8a\x2b\xf5\xf1\x36\x5d\x6b\x70\x40\x7e\x80\x94\xf9\x91\x97\xce\x1f\x0c\x35\xe1\x1a\x98\xfb\xe3\x72\x41\x4e\xa2\x06\x4a\x3a\x12\xd1\xcd\x5c\x8d\xf8\xfc\x0e\x79\xf5\xb7\x70\xb5\x8f\x47\x7f\x91\x97\x6c\xa0\x13\x98\x95\x12\x0e\x24\x6b\xaa\xb5\xa0\x26\xf2\xd3\x9c\x68\x7d\xc0\x78\x83\x34\xb5\xc6\x26\xd5\x2c\xde\xbe\x05\xea\xf3\x08\x64\xb4\x13\xee\xbd\xc5\x58\x1e\xf0\x0d\x43\x92\x76\xe5\x2f\x47\x9c\x9c\x05\xb1\x16\x39\x58\x26\xb6\x04\x90\xb3\xce\x70\x0c\xc0\x02\x7f\x61\xe4\x6c\xa2\xf6\xfb\xc2\xc9\xde\x2e\x80\x08\x06\x55\x0a\xfb\x06\xd4\xa0\x8e\xac\x7a\x75\x8e\x24\x58\x2a\x4d\x6d\x42\x8b\x43\x3d\x36\x5f\xc3\x1d\x44\x44\x60\x7a\xfb\x64\xf1\x5e\x37\x07\x94\x00\x5a\x3a\x22\x44\xe6\x66\xd5\xd4\xc3\x8a\xd2\x00\x9c\x76\x9a\x51\xcd\xbf\x73\x8d\x23\x59\x42\xf4\x12\xd0\x7f\xee\xb7\x3b\x36\x57\xd0\xb0\xc9\x1c\xb5\x94\x0b\xad\x6a\x70\x6e\x14\xed\xcd\xc3\x42\x25\xb1\xc1\xf3\x8b\x1a\xbe\xcb\x2a\xdc\xaf\x81\x91\x55\xa9\x4f\xe1\x90\xfd\x55\x68\x22\xd5\x59\xd9\xc4\x70\x85\x4d\x3a\x43\xbf\xb8\x68\xda\xdd\x6e\x44\x3d\x98\xee\x87\xe4\xd8\x28\x4f\x5c\xf3\xa6\xda\xfa\xf2\x95\xb9\x02\x83\x6c\x64\x05\x11\xe6\x10\xae\x7d\x0c\xb1\xb1\xd3\xd6\x07\x9f\xe6"}, +{{0x02,0x73,0x86,0x82,0x32,0xf5,0xbe,0x48,0x59,0x2c,0xfa,0x05,0x13,0x4e,0x8d,0x55,0x54,0xed,0x1f,0x9a,0x57,0xbc,0x7e,0x39,0x82,0xa3,0x30,0xc5,0x7e,0x5a,0x7f,0x3a,},{0xf1,0x72,0x20,0x87,0x82,0xdb,0x66,0xd4,0x66,0xcb,0xe4,0xf4,0x41,0x7f,0x6f,0xc4,0x77,0xb7,0x34,0x9f,0x2a,0x98,0xdb,0x56,0xc0,0x3a,0x47,0x22,0x75,0x46,0xbc,0x5a,},{0x15,0xe8,0xd8,0xdc,0x7d,0x5d,0x25,0x35,0x9d,0x6a,0x10,0xd0,0x4e,0xe4,0x19,0x18,0xa9,0xc9,0xdf,0x4c,0x87,0xbe,0x26,0x9f,0xa8,0x32,0x43,0x4d,0x53,0x01,0xdb,0x02,0x24,0x81,0xbf,0xa3,0x95,0xa3,0xe3,0x46,0x6f,0x95,0x54,0xce,0xee,0x05,0x32,0xa8,0x18,0x3a,0x0d,0x05,0x50,0xe7,0xd1,0xab,0xe9,0x9f,0xc6,0x94,0xc6,0xff,0x93,0x01,},"\xf7\xa1\xd4\x61\x4c\xc6\x4a\x3b\xc4\x8f\x00\xc6\x27\x63\x04\xf3\x4d\x4d\xfd\x15\xe0\x61\x7b\x93\xcc\xef\x12\x6c\x5c\x63\x8c\x9d\x99\x53\xaa\xbb\x7d\xf4\x2d\xf4\xe0\xaa\xa7\xea\xc9\x6a\x4b\x38\xc7\xba\x75\x8d\x86\x0c\x90\xd0\x5e\x3d\x14\xe4\x79\xe5\x45\xf3\x19\xb0\xe5\xa8\x5a\xd8\xf0\x99\x1b\x43\xd6\xe4\x9c\x24\xfa\x06\x0e\x3e\x5d\xf9\x5c\x98\xd9\x45\x1a\xb8\x33\xe1\x2a\xa9\x7f\x40\x46\x11\xbb\xa3\x59\x49\x62\x65\xa6\xdb\x11\x91\x7d\x0d\xa5\xc6\xa7\x02\xd0\xb1\x02\xde\x36\xdd\x0c\x98\xdf\x5b\x54\x80\x6c\xe6\x26\xbb\x96\x37\x44\x75\xf6\x8a\x60\x60\xeb\x35\x0a\x7d\x2a\xae\x32\x04\xb3\xdf\xdf\x9f\x1e\x31\xbe\x81\xf7\x17\x0f\x8a\x1b\x93\x85\x41\x3f\xf8\xf6\x88\x1e\x10\xc1\xe8\xda\x4c\x88\xaf\xb5\x06\x39\xab\x44\x88\x7a\xca\x2a\xbe\xec\xed\xf1\x10\xd2\x95\x8c\x13\xfd\x33\x90\xd1\xb9\x6a\x76\x2d\x16\xce\x19\x69\x20\xce\x85\xf6\xc4\x15\xbe\xd5\x45\xb1\x44\x53\x02\xa6\xf0\x01\xeb\x8d\x00\xe9\x7c\x75\x18\x87\x86\x8d\x48\x1a\x0b\x1e\x4d\xfa\x04\xb6\xf7\x61\x08\x6e\xe8\xe6\x97\xb0\x19\xe0\x17\x10\x4b\xaf\xb9\x8f\xca\x24\x2e\x33\x4c\x6f\x18\xf1\xdb\x5b\x6f\x29\x5f\x05\xc5\x59\x36\x1c\x68\x31\xda\xbc\x42\xc2\x11\x07\x03\xf9\xd1\xf6\x4e\x12\xdd\xf2\x6a\x86\x79\x85\x4e\x9f\x8e\xf8\x47\x9e\x1f\x12\xc3\x54\x47\xaa\xc0\x2e\xa7\xf2\x42\xe5\x86\x32\xcf\x2f\xd0\x63\xfe\x66\x50\x70\x44\x5b\x80\xf3\xdc\x6a\x33\x03\xbb\xa9\x6e\x05\xfa\x88\xee\xc2\x01\xc5\xc2\xd0\x0c\xa8\x1b\x8d\xa6\x96\x9d\x0a\x4d\xd0\x48\x3b\x34\x77\xd3\x25\xa7\x1f\xac\xd6\xfa\x22\x09\xb4\x8c\xb4\xf6\x52\x5d\xa7\x3c\x9c\x05\xb2\xd9\x78\x9b\x01\x44\x8e\x15\x27\xe5\x6a\x09\xa9\xbc\x61\x36\xd9\x83\x72\x43\xc2\x07\x7b\x92\x5b\xbb\x93\x3f\x8f\xb1\xda\xac\x96\x33\x98\xc5\x80\x2a\xed\xa3\xbb\xca\x8a\xe3\xb8\xf4\xa9\xa8\x71\xf7\xea\x8e\x2c\x0c\xe8\x98\xc5\x66\x21\x7b\x5c\x06\xff\x55\xff\x9f\x4f\xe7\x83\x98\xae\x79\x73\x64\x1e\xaf\xb5\x21"}, +{{0x33,0x6a,0x83,0xb5,0x5a,0xbf,0x4c,0x02,0xe2,0x5e,0x54,0x03,0x29,0xb5,0x27,0x58,0x43,0xc2,0xec,0xb8,0xdf,0x69,0x39,0x5b,0x5a,0x5e,0x24,0x1b,0xd0,0xd8,0xc1,0x0d,},{0xdd,0x60,0x56,0x98,0x44,0x57,0x0c,0x9f,0x0a,0x82,0x64,0x3f,0x44,0x64,0x78,0xb5,0xac,0x6f,0xc5,0x42,0x21,0x42,0x31,0xa7,0xca,0x65,0x6a,0x92,0xb5,0xfd,0xaa,0x54,},{0xd2,0x63,0xf5,0x6d,0x59,0xcb,0x9b,0x28,0x96,0xa9,0x47,0x26,0x7c,0x2e,0xd7,0x8a,0x94,0x5b,0xac,0x5a,0xbd,0xbf,0x3c,0x14,0xdc,0x3a,0xd0,0x92,0xb2,0x30,0x8c,0xb9,0x31,0x5c,0x46,0x49,0x42,0xa0,0xa2,0x0b,0x20,0x24,0x51,0x1d,0x76,0x6e,0x85,0xc9,0x36,0x49,0x9a,0x14,0x9c,0xd0,0xbb,0xb2,0x09,0x15,0x0a,0x16,0x43,0x26,0x52,0x00,},"\x9a\xfe\xe8\xab\x48\x20\x10\xe2\x92\x64\xb4\x06\xd9\xb4\x94\x53\xd1\xce\x6d\x55\x09\x39\x07\x21\x82\x86\x3e\x46\x65\x28\x4a\xb0\x5d\x86\x25\x8e\x06\x23\xb1\x87\x54\xc4\x78\x52\x38\xf6\x97\xf0\x75\xad\xfb\x9e\x1d\x31\xa4\x2e\x85\x93\x4e\xc0\x71\xdd\xdd\xec\xc2\xe6\xc2\xf6\x13\x34\xa7\x95\x26\x78\x8b\x49\x52\x19\x07\x16\x90\x6d\xde\x17\xfb\xa5\x56\xee\xa4\xc8\xb5\x97\x27\x51\x4f\x6f\x56\x15\xa1\x9c\xa3\x6d\xa3\x58\xfa\xe6\xa6\xc5\x4f\x7f\x4b\x7a\x92\x9e\x31\xba\x7c\xc7\x1b\xde\x78\x82\xfa\x9f\xfd\x87\x30\x01\x36\x40\x9c\xaf\x3c\xa6\x4e\xef\xea\x61\x6a\xed\x58\xda\x5d\xfb\xf2\x8b\x66\x8e\xc1\xcc\xcf\xfc\xef\x6e\x2e\x14\xf8\x10\x9e\x9c\xbf\x76\xcf\xa4\x14\xf9\x1a\xc0\x0f\x48\xe9\x3e\xad\xa3\x85\xdd\x3d\x5c\x16\xe1\xa3\x9e\xa3\xdd\x55\xc7\x61\xfc\xa3\x61\xb4\x28\xf5\x16\xc0\x5e\x69\x4f\xe5\xc3\xc3\x45\xcd\x94\x45\x71\x87\xa8\xe6\x04\xb2\x00\xa1\xa0\xf9\x37\xae\x89\xf4\xd6\xb5\x42\x1d\xff\xcf\x7c\xa1\x5f\x2e\x2c\x25\x37\x8a\x41\x13\x23\x3f\x76\x13\xf4\x57\x0a\xa4\xb9\x09\xa9\x13\x5e\xae\x4c\x7b\x9e\xad\x45\x80\x07\xae\x17\x12\x6a\x11\xd1\x45\x25\x8a\xf9\x56\x3d\xb2\xf7\xe8\x92\x54\x31\x87\x8b\x0e\xec\xa8\xaf\xfc\x01\xac\x59\x13\xbf\x5b\xac\x4f\xa3\xa8\x57\xc5\x4c\xc8\x90\x6d\x6a\xf7\x7d\xe6\xb9\x32\x6b\x65\x06\x15\x10\x99\xe8\x7e\x99\xb1\xe8\x19\xc6\xfb\xe0\x82\x68\x8f\x34\xb8\x03\xd5\x88\xe4\x16\xd8\x53\x16\x97\x65\xd6\x2f\x7e\x0b\xdf\x72\xc5\xcd\x66\x66\x9a\x03\x35\x56\x23\x36\x73\x5e\x7e\xfb\x73\x4a\x2f\xad\xa3\x27\xf8\x58\xbe\xc6\x02\xd0\xda\x08\xeb\xa4\x47\x9e\x7f\x6d\xc4\xde\xf6\xe4\xeb\xdb\xb7\x30\xee\x91\xa3\x34\x45\xca\xdc\x9d\xf5\x2c\x82\x5a\xd3\x61\x49\xce\xfb\xc5\x1a\xb1\x02\x03\x35\x30\x81\x4b\xaf\xa7\xe8\x79\x61\xb0\x63\x67\xff\x89\x6f\x08\xae\x33\x4a\x9b\x1a\xad\x70\x3d\xa6\x86\x70\x6c\x11\xa0\x49\x43\xea\x75\xe1\x29\x92\xdc\xf6\x10\x6e\x37\x20\x77\xcd\x03\x11\x02\x9f"}, +{{0x88,0x40,0x91,0x72,0x61,0x8b,0x49,0x03,0x93,0xdb,0x27,0xd9,0x60,0x17,0x1c,0xbc,0x18,0x7e,0xaf,0x4d,0xd8,0xb3,0x20,0xb3,0xd2,0xf8,0x24,0x98,0x00,0x43,0x71,0x8f,},{0xce,0x2e,0x7c,0x58,0x39,0xef,0x56,0x32,0xa1,0x23,0xdc,0x37,0x3d,0xc1,0x4b,0x1f,0x05,0x05,0x76,0x6e,0x96,0x75,0x40,0x76,0x04,0xca,0x7c,0xf5,0x4e,0x8d,0x44,0xb2,},{0x93,0xb6,0xe2,0x9d,0x63,0x94,0x5d,0x5c,0x42,0x73,0x87,0xd0,0x06,0xc7,0xf0,0xb0,0x19,0x56,0xa9,0x5f,0xc0,0x43,0x6e,0xd4,0x2b,0x46,0xd0,0xf1,0x7b,0x5b,0xb1,0x93,0xea,0x8c,0x0e,0xbb,0xf3,0xd6,0xd1,0x3b,0xb5,0x39,0xe3,0x5c,0x91,0xf3,0xf0,0xf9,0xfa,0x34,0x14,0xa0,0x22,0x3c,0x90,0x60,0xba,0xc8,0x36,0x53,0xc6,0xfc,0xd9,0x06,},"\xfb\x3e\x82\xf1\x1b\xc2\x86\x26\x7e\x12\x38\x17\xad\x88\x64\xe0\x77\xd9\xf7\xa8\xe7\xa1\x63\xac\x7e\xea\xf9\x3d\x55\xdd\x11\x1d\xe8\x08\x3b\x66\xb5\x3c\xe7\xbc\x77\x1f\xc5\x07\x1a\x2d\x7a\xc2\xf8\x5d\x6f\xc6\xad\xcf\xce\xc4\x46\xe1\x6a\xa1\x04\x6d\xf3\x72\x09\xad\x7a\x29\xcf\x96\x65\xb4\x39\xa5\x4d\x6f\x8d\x94\x2f\x89\xbd\xaa\x56\xf2\xf1\x12\x60\xcc\x95\x99\x30\x38\xb0\xe8\xfb\xdb\x32\x14\xf1\x42\xe6\xc9\x0b\x61\xa1\xd2\xb1\x42\x07\x62\x06\xaf\x30\xac\x35\x78\x4a\x6d\xc1\x5a\x1e\x79\x25\x1a\x8c\x77\x31\xa1\xc5\x39\x78\x03\x8f\x8d\x76\xd7\x0c\x6c\x1c\xdf\x52\x9f\xbd\xb8\x4d\x15\x07\xdc\xff\xdd\x42\x87\x3d\xfa\x6a\x8f\xe6\xbd\x6f\x7f\xd2\x9c\x80\xe4\xb2\xf9\x33\xd2\xb6\xc9\xe6\x2c\x94\x57\xe6\x65\x47\x26\x55\x05\x9b\x63\xb6\x18\xe2\xa9\xa8\xe5\xb9\xe4\x1c\x36\x46\x17\x3a\x89\x2b\x8e\x6d\x4b\xca\xd6\xa6\x2a\x6f\xcc\xd3\x45\x58\x90\xb5\x8e\xc2\x68\x1a\x95\xcc\x97\x76\xa9\xfc\xe8\x3c\x54\xa9\xef\x31\x2a\x33\x19\x59\xc7\xef\x3f\x79\xee\x57\x6e\xb7\xb7\x94\x69\xc9\x23\x4b\x1e\xae\xf6\x09\x88\x47\x08\xfe\x4b\xb0\xef\xac\x66\x2d\xa8\x71\xba\x61\xdd\xab\xb3\xfc\xbd\xeb\x8f\x63\x56\x57\xdd\x9a\x5d\x73\x11\xe6\x39\xa8\x24\x85\x8b\x9a\x98\x68\xd3\xf9\x38\x4d\xa6\x12\xc7\xf2\xe7\x71\xa4\x6b\xd2\x62\x4c\x99\xea\x2b\x6c\xcb\xca\x99\x6c\x1d\x9c\x37\x55\x54\xf2\xa5\x51\x61\x9c\xe6\xd5\xe6\xe4\xd6\xb8\x44\xa4\xdb\xea\x83\xba\x73\x23\x31\xfc\xf4\x65\x72\xc1\xfb\x0e\x25\x7c\xe1\x04\x1b\x26\x5d\xf0\x2e\x69\x0a\x92\x81\x4b\xbf\x3b\x5e\xca\xc6\x9e\xe9\x98\x76\x6a\x02\xb0\xd2\xf9\x08\xb3\xc1\x5f\x95\x26\x99\x61\x6f\x2c\x07\xd5\x89\x19\x89\x89\xe6\x05\x6c\x16\x31\x9a\xab\x6c\xf8\x77\x19\x02\xc0\x78\x04\x6a\x88\xb2\x57\x0c\x13\xbc\x5e\xde\xba\x2e\xd1\xe3\xba\x13\x1d\xaf\x94\xe6\x89\x18\x62\xbb\x3d\xe7\xd1\x06\x3f\xe4\x05\x30\x7a\x5c\xd9\x75\x69\x3e\x9d\x58\xe1\x7c\x69\x0e\xee\xf4\xa2\x60\x3c\xaf\xc6\x8c\x2b"}, +{{0xe5,0x71,0x18,0x9b,0x5c,0xd9,0xe7,0x88,0x30,0x2d,0xe3,0x91,0x9d,0x85,0x0c,0x22,0x7d,0xcb,0xb6,0x15,0x02,0x2e,0x56,0x8b,0xda,0xeb,0x37,0xac,0x5b,0x29,0x39,0xc5,},{0xed,0xda,0x89,0x0f,0x42,0xdd,0x5f,0xbc,0x73,0x16,0xa5,0xfa,0xdf,0xbe,0xc3,0x85,0x56,0xf2,0x3f,0x51,0xb8,0xef,0xd2,0x62,0x54,0x37,0xf6,0xb5,0x06,0x9f,0x1e,0xe5,},{0x7f,0x79,0x7a,0x31,0x71,0x5d,0x7c,0x35,0x6f,0x8f,0x1f,0x78,0x37,0x00,0xaa,0x99,0x74,0xbb,0x93,0x6d,0x66,0x16,0x61,0xad,0x96,0x8c,0x7c,0xde,0x1a,0xc9,0xe7,0x67,0xbe,0x56,0xa2,0xdd,0x49,0xb9,0x23,0x0e,0x90,0x11,0x0c,0x67,0xc0,0xed,0x18,0x7c,0xb7,0xe7,0x5c,0x30,0x53,0xec,0xe8,0x44,0x98,0x4d,0x29,0x6f,0x0d,0x85,0xcb,0x07,},"\xb6\x2c\x86\x7a\xd6\x22\x74\x35\xbf\xa6\xda\xb8\x30\x68\x4e\x38\xd1\x96\xe1\xf8\x61\xaa\xde\x0f\xd6\xa7\x69\x9b\x6d\x60\x90\x1f\xef\xb2\xd7\x99\xc3\x5c\x6f\x3d\x8b\xb9\x4d\xee\xe8\x34\x40\x39\x81\x86\x6b\xab\x84\x94\x6a\xe9\x47\x6c\x75\xe9\xf1\xd3\x60\x2b\x42\xcb\x2d\xb4\x37\xbf\xf3\x3a\x77\x58\x22\xf0\xd6\xa2\x57\xd4\xb7\x54\x00\xeb\xa5\xb8\xab\xb3\x14\xb7\x1f\xc6\xb4\x6f\x8a\x34\xe8\x61\xa9\xa6\x2a\xbf\x33\xde\x84\x82\xf6\x3f\x9d\x71\x69\xe7\x73\xa2\xdc\xeb\xee\x03\x70\x5d\xac\x11\x7f\xd1\x49\x9b\x68\xe7\x41\x4f\x51\xff\x94\x37\xf2\x53\xa1\xd9\x90\x1e\xc3\xb0\xbb\xa8\x69\x65\xa1\x93\x83\x65\x54\x87\xb5\x80\x10\xf8\x04\x90\x9d\xe1\xff\xb2\x21\x2c\x02\x52\xdd\xd9\xbf\x2a\x56\xac\x46\xbd\x59\xc0\xc3\x4d\xd5\x9e\x46\x59\x8b\x6b\xab\xd4\xe5\xf3\xff\xfd\xe5\x5e\x48\xda\xb0\x39\x8c\x22\xaf\x9e\x26\xba\xdd\xf7\x72\x75\xe5\xf0\x17\xb3\x5a\x9b\x8f\x84\x35\xf9\x63\x19\x36\xb3\x91\xcb\x95\xd7\xad\xf3\x5d\x1d\x85\x45\xa0\xfd\x06\x64\x12\xd5\x08\x96\x7b\xbe\x9a\x20\x24\x5a\x26\x9e\x3b\xe2\x77\x71\x17\xe7\x5f\xba\xc1\x70\xdb\xa3\x52\xbe\x69\xb2\x54\xd3\x53\xb3\xb2\xcb\x3b\x7e\x21\xb7\x21\xaa\x9f\xe0\x44\xf8\x91\x6b\x4b\x2a\x6f\x8c\x28\xf8\xab\xe6\x6a\xc9\x2b\x91\x32\x3a\xc7\x3a\xfd\x93\xdf\xbe\xea\xee\xf2\x6d\x19\xbd\x9f\x67\xe9\x9d\x48\xcd\x2a\xd2\xd3\xe5\x5e\x45\xd2\x4d\x54\xb5\x0f\x44\xa3\x9b\x90\xe2\x42\xeb\xe9\xb4\x2b\xeb\xdb\x23\x0c\x47\x0b\xdf\xde\x1b\xc7\x72\x1c\x31\x20\x00\x84\x77\x39\x3d\xcc\x2e\x15\xfd\x22\xb2\x51\xfe\xb0\xe1\x8b\x02\x88\x3c\x07\x8a\xee\x4f\xb7\x60\x65\x5a\x67\x1d\xc7\xb8\xaa\xdb\x9a\x56\x24\x20\xa3\xc2\xef\xa2\xd3\x42\xe1\xe0\x09\x9d\x95\x1b\x42\x24\x29\x84\xf5\x94\xe6\x91\x4f\xe2\x82\xb1\xee\x12\x87\x35\x98\x4e\xf9\x3a\x66\x9e\x6e\xcb\xa2\x6c\x9f\xcb\x9f\x09\xf0\x92\x56\x64\x56\x17\xf1\x39\x2d\x35\x90\x89\x17\xcb\x8d\x29\xe0\x89\x7c\x75\x03\xcd\xdd\x5d\xe1\x95\x96\x86"}, +{{0x37,0x17,0x44,0xab,0x63,0xc1,0x15,0x61,0x39,0x29,0xa3,0x43,0x70,0x9b,0xb0,0x19,0xb7,0x35,0x7d,0xff,0x72,0xd2,0xa1,0x49,0xf1,0xd0,0xf7,0x1d,0x3a,0x20,0x1e,0xfe,},{0xe5,0x8a,0xbf,0xad,0x4a,0x13,0x85,0x9f,0x0a,0xcb,0x05,0xd0,0xe4,0x7d,0x59,0x63,0x8f,0x7b,0x1b,0x49,0x36,0x10,0x0b,0x98,0x8d,0x61,0xe6,0xe7,0x0e,0x22,0x66,0x7d,},{0x5e,0xae,0x4a,0xc7,0x2a,0xf0,0x17,0x4a,0xb2,0x56,0x52,0x7b,0x7c,0xd3,0x37,0xa0,0xe5,0x48,0x2e,0x61,0x5a,0xf0,0x68,0xdb,0x21,0xda,0xe3,0x5a,0x64,0x64,0x07,0x42,0x60,0x4d,0xf7,0x3f,0xd4,0xca,0x02,0xed,0x95,0x15,0xa5,0x60,0x8d,0x73,0x19,0x52,0x30,0xfa,0xdc,0xa7,0xb4,0x26,0xf0,0x2a,0x2f,0xbf,0xd0,0x20,0x61,0xaf,0x36,0x00,},"\xc2\x19\xde\x1e\x8d\x7a\xd8\xdf\x08\xc4\x93\x77\x39\x6f\xe7\xc1\xf2\xd5\x7b\xd2\x17\x06\x33\xa0\x0d\x70\x8f\xaa\xde\xe1\x80\xce\xba\x92\x84\x9a\x77\x78\x50\x6c\xbb\x36\x68\x75\xbf\x91\x24\x70\x18\x94\xce\xcd\xb3\x38\x51\x47\xd0\x67\x18\x43\x92\x2a\x64\x9a\xff\x7c\x43\x5e\xb5\xa9\xc7\x49\x27\x50\x30\x72\xd0\x06\x79\x78\x71\x6d\xc8\x0b\xe1\x54\x5a\x2d\xbf\x5a\x1c\x38\x53\x6e\x12\xbd\x77\x20\xc1\x96\x5d\x38\x03\xa4\xe8\xaa\x55\x76\x51\x92\xa1\x3b\x70\x5c\xa1\x05\x9d\xed\x0e\x80\x63\x62\xfc\x5b\xbe\x6c\x76\xa1\xc9\x67\x4b\xb8\x53\x79\x0f\x7e\x90\xaf\x00\x75\x3e\x00\x43\x6d\xa4\x8c\xd0\x82\xea\xd6\x4f\xdd\xb6\x89\x89\x01\x62\x08\x2f\x84\x82\x92\x4f\x33\xac\xd6\x04\x64\x0f\x69\x92\x73\x52\xb4\x3f\x64\x40\x2d\x27\xa8\x83\xfa\x6b\x72\xaa\x70\xd2\x41\xdf\xfa\xa1\x70\x1a\x25\xcf\x10\x79\x35\x82\x60\x79\x38\x75\xf7\x6a\x29\x78\xe9\xf9\xf9\xd6\x86\x34\xeb\x3f\x5f\x01\xbd\xe1\xce\x49\xe5\x92\x12\x52\xf9\x49\xf0\x82\x79\x5e\x4e\xaf\xed\x7b\xe5\xb4\x9a\x9f\x95\xed\xbb\x4a\x13\x53\x2e\x3f\x3b\x3b\xe6\x2e\x26\x52\x23\x12\x53\xa2\x0c\x1d\x54\x77\xe8\xf4\xbc\x57\xed\x76\xfa\x19\xea\xf0\x3a\x11\xbb\xa4\x29\xb6\x49\x6c\xe7\x62\x46\x17\x0e\x04\x3b\xc1\x4f\x2d\x2f\x70\x3d\x96\x8f\x1d\xeb\x09\x38\x87\x15\xc3\x7c\xb4\x75\x2d\xa8\xd4\x64\xe3\x48\xe0\x31\x3c\x89\x93\xe2\x41\x33\xa7\xc5\x45\x28\x4e\x3c\x9c\x90\x7d\x01\xb2\x60\xc4\x88\x3f\x9c\xb3\xe3\xdc\x5b\x6f\x7f\xb6\xd7\x55\x36\x36\x5f\x21\x32\xea\xed\xda\xb5\x70\xe7\x27\x3a\xfa\xc0\xbf\xf5\xc9\xfc\x0b\x82\x0f\x20\x78\xe0\x33\x60\x52\xe1\xfe\x7b\xde\xc8\x66\x74\xd0\x99\x8e\xc7\x8d\xa1\xc3\xf3\x47\x51\xf8\x86\x72\x76\x95\xf3\x5e\xca\x13\x04\xb1\x47\x34\x76\x6a\xb0\x5c\x11\x86\x30\x6d\xed\x9d\xb3\xee\xf6\x5d\x3c\x04\x56\xcd\xae\x81\x81\xaf\xee\x04\xb2\x96\xc6\x72\x2a\x88\xc7\xef\x30\x88\xd2\x6f\x7f\xe7\x4b\xc8\x9c\xf5\x28\x5c\x68\x8f\x02\x7b\x7e\x68\x60\x04\x86\xaf"}, +{{0x49,0x8b,0x6e,0xe6,0x49,0x2d,0x53,0x23,0x1b,0x35,0x32,0xd1,0x93,0x57,0x8b,0xa7,0x5d,0x6a,0x89,0x4e,0x2e,0x53,0x00,0x34,0xe2,0x1a,0xb8,0xad,0x8d,0x2c,0x0d,0x1f,},{0xd1,0x24,0x66,0x5b,0x28,0xfa,0xcd,0x2d,0x17,0x94,0x6a,0x04,0xdf,0xe3,0xd1,0x29,0xa4,0x56,0x1a,0x2b,0x24,0xeb,0x32,0x6d,0x84,0xb6,0x2b,0x42,0x2e,0x44,0xdb,0xcf,},{0x11,0x2f,0x5c,0x6d,0x3b,0xcb,0x3d,0xd9,0x93,0x46,0xd3,0x2a,0xd6,0x9c,0xbf,0xac,0x3e,0x65,0x3b,0xef,0x29,0xc6,0x8a,0x33,0xf4,0x32,0x31,0xf6,0x6c,0xea,0x1d,0x0a,0x19,0x54,0x27,0xd6,0xe1,0x0c,0x0e,0x77,0xc5,0xd5,0x5f,0xe2,0x79,0x42,0x87,0xee,0x32,0xe5,0xe2,0x2b,0xaf,0xbb,0xd8,0x05,0x2a,0xd3,0x60,0x6b,0x90,0xf9,0x45,0x05,},"\x04\x98\xa5\x9b\x87\xcd\xae\x28\x69\x55\x47\xe1\x08\x63\xbc\xe8\x04\xd9\x7d\xe0\xac\x80\x08\xf3\xd5\xfb\x65\x2c\x17\x57\x41\x9f\xdc\x9e\x0f\x97\x36\xf4\xc5\x9a\x34\xf2\x1c\xfc\x74\x59\x9f\xa7\x88\xfc\xc1\x0c\x67\x30\xc7\xdf\x8c\x3d\x2c\x1b\x6a\x78\x6d\x12\x30\xb6\x55\x85\x71\x9d\x1c\xb5\xc4\x90\x35\x9b\x94\x43\x5d\x6d\xd6\x71\xf5\x4d\x6e\x9a\x19\xb9\xb5\xaa\xad\x7e\x0f\x23\x3f\x87\x97\xdf\x99\x78\x28\xd8\x8c\xd9\x2e\xf0\x89\xef\x7d\xbf\x1e\x95\x27\x78\x94\xa2\xf7\xc2\xfd\x0c\x8e\x4d\xfd\xfa\x6d\x3d\x14\x58\x9f\xf0\x19\x16\xdb\xf9\xdd\xd8\x11\xc2\xf5\xe0\x1e\x94\x29\x89\x90\xa1\x45\xa6\xcf\xc2\x68\x95\x61\x4c\x7c\x96\x3f\xef\x30\x8a\x4e\x38\x56\xc3\x2d\xd3\xe3\x59\xbc\x56\xd2\xcc\xa4\x96\xad\x19\x9f\xf1\xa5\x68\xd6\x43\x0a\xc5\xcd\x20\x8e\x0e\x2d\x07\x80\x3c\xa5\x23\xe0\xd8\x13\xad\x37\x33\xab\x50\xbd\xca\xdc\xb9\x88\xae\xe7\x58\xea\x50\x43\x9b\xf3\x8e\xe6\x49\x99\x76\x04\xf1\x51\xc6\x02\xc8\x29\x00\xa8\x20\x5d\x8f\x6f\x67\x0c\x86\x84\xbf\x5a\xbb\x5f\x75\xff\x29\xa3\x7e\xb9\xbf\x81\x05\x19\x9f\xbb\xfb\x47\x07\xe1\x62\xe6\x4c\x71\x52\x70\xf8\x53\xe6\x48\xb0\xaa\x26\xfe\xa0\xf6\xdb\x56\x28\x96\xbf\x42\x4a\x9f\xfc\xb2\x92\xfa\xe8\x5b\x76\xce\xfb\x8b\xd5\xa4\xb3\xce\x1f\xb3\x9b\xd2\xa5\x0d\x0c\x9e\x6d\x93\x3e\x16\x7f\xf6\x29\xb8\xa4\x94\xf2\xa9\xb7\x74\xeb\x30\x3c\x78\x1e\xa0\x2a\xff\x1a\x8a\xfa\xdc\x24\x65\xcc\x61\x69\x68\x01\x5e\xd6\xa5\xa3\x3c\x31\x20\xb9\x45\xed\x53\x51\x98\x1e\x32\xfb\x9f\xb9\x6b\x22\x12\xdc\xf8\xfe\x9a\xc5\x6e\x3c\xf4\x1d\xc5\x24\xf8\x00\x63\x10\x20\xb0\x25\x91\x91\x78\xce\x07\x4e\xef\x07\x8d\x68\x42\x01\x2a\x27\x6e\xfa\x62\x8d\xb5\x40\x58\xd1\xeb\x5b\x5b\x70\x5f\x1e\x18\x18\xd2\xdf\x51\x64\xba\xab\xb0\xc6\x19\x56\xec\xdb\x8c\x70\x6e\x56\x2f\xc4\xfd\x64\x05\x28\x70\x53\x0a\xe4\x25\xb2\x21\xf8\x9d\xd6\xf9\x0d\xab\x88\x2e\x76\x3e\x7a\x7f\xfa\x14\x1b\xba\xa8\xbf\x7a\x3f\x21\xb0"}, +{{0xce,0xfc,0xfc,0xd1,0xcf,0xf4,0xd8,0x91,0x07,0x49,0x27,0x91,0x31,0x83,0x0b,0x1d,0xa1,0x9d,0xfc,0x52,0x45,0xf7,0x8c,0xa6,0x8b,0x8c,0x3c,0x1b,0x62,0x2b,0x45,0x51,},{0x1d,0x39,0x4a,0xbd,0x1b,0x4e,0xd1,0xae,0xdf,0x96,0x6a,0x60,0xef,0xd3,0xff,0x88,0x21,0x40,0xa7,0xe5,0x6b,0x42,0x83,0x74,0xec,0xb4,0x43,0x28,0x9a,0x9c,0x7f,0x00,},{0x7d,0x83,0xff,0x66,0xec,0x79,0x30,0x7b,0x1c,0x0c,0x09,0x3f,0xda,0x39,0x68,0xa9,0x6c,0xf6,0x04,0x4f,0x5c,0x80,0x28,0x88,0x58,0x40,0x18,0x84,0x5e,0x7c,0xaf,0x2a,0x13,0x5a,0xc6,0xf1,0x67,0x7e,0x84,0xd2,0x2e,0x45,0x8e,0x22,0x7e,0x4f,0x93,0x02,0x09,0x91,0x9b,0xc1,0x1b,0x12,0xf7,0xaa,0xf2,0xb8,0xc9,0x43,0x02,0xd6,0x42,0x00,},"\x5e\xc9\x4e\xd0\x6f\xc1\x25\x7a\xe9\xc1\x83\xce\x56\x27\x12\x07\xac\xa3\x7a\x23\xfd\xb4\xb0\xe7\x4a\xc9\x30\x7a\x1b\xb1\x12\xe0\x5e\xd5\xa5\xd0\x47\xc9\x31\x09\xe2\xe5\x94\x77\xb0\x33\x78\x34\x64\x22\xde\x36\x71\x4c\x29\x61\xbb\x97\x36\xa5\x13\xca\x36\x71\xc6\x03\xa6\x8c\x2b\xe7\x31\x7b\x1b\x52\xa0\x76\xda\xe2\xaf\xf7\xbc\x88\xcd\x5e\xea\x0a\xa2\x68\xfa\xaa\xda\xe5\x39\xc9\x38\xbb\x4f\xd4\xb6\x06\x9b\x19\x45\xeb\x6a\xf0\xc9\xe6\xc8\xaa\x5e\xe4\xa4\xaf\x37\xe9\x0c\x67\xe2\x48\xe8\xd2\x7b\xd7\xf9\x58\x9c\x4d\x30\xe9\x05\x65\x1b\xaf\x45\x36\x4f\xa0\x49\x95\x7e\xa5\xd9\xb7\x14\x6c\xa6\x82\x04\xe5\xe9\x73\xd0\xf1\xc9\x1a\x1c\x4b\xde\xd6\x61\x15\x02\x8a\x71\x11\x4f\x0f\x4f\x85\x1b\xd1\x15\xfa\xeb\x95\x4e\x3f\x71\xa0\x14\x70\xb2\x48\x1a\x00\x98\xd9\x9f\x9d\x74\x89\x8c\x8b\xa0\x28\x7c\xc7\x83\x41\x55\x21\x41\x73\xd1\xfc\xba\xfc\xfe\x9b\x08\x25\x03\x84\x43\x94\x76\x05\x58\x83\x83\x38\x16\xc9\x52\x4c\xfd\x57\x44\xaa\xa2\x59\xdb\x7e\xbd\x3a\x6a\xa2\x0b\x5a\x65\x46\xda\xde\xfd\x14\x06\x68\xeb\x0e\xcc\xb5\xf6\x68\xdb\x9f\xc6\x29\x83\xdf\x98\x08\x50\xc9\xd1\x98\x82\xa1\x75\x50\xd5\xdc\xa3\x54\x2c\xd3\x60\x03\xa0\xd0\x3c\xff\xb0\x45\x75\xa3\xe8\xe1\xd0\x70\x15\xc7\xb3\x0e\xca\x91\x15\xcd\x2b\x72\xe4\x6d\xfd\xdf\x6a\x4d\xda\x1f\xaa\x2d\xbd\xc8\x90\x00\xd4\x33\xf6\xec\x9a\xdc\x46\x14\x6d\x93\x9f\x32\x12\x1b\x99\xb2\x89\x83\xd9\x8b\x9d\xde\x8c\x3f\x6e\x57\x79\xf2\xb0\x70\x0c\xb0\x23\xdb\x13\xde\x65\x6e\x0a\xed\x1d\xa2\xd5\xc6\xba\x26\x52\x34\x36\x48\xad\x42\x0f\x6a\xb9\xe5\x5a\x97\x48\x2a\x1a\x22\xb3\xbc\x2e\xe5\x98\x62\x9a\xba\xd9\x54\x7e\xdb\x5f\xf7\x90\x99\x05\x64\xbd\x87\x1f\x81\xb2\x4b\x12\xf2\xbf\x8d\xbd\xfe\x7a\x88\x37\x5f\xad\x9c\xcb\xd9\xfc\x0b\xa1\xd3\xbb\xa5\xe3\xc4\x81\x3c\x18\xa0\x34\x8a\xad\x83\xfb\x1b\x82\x68\x90\x54\xd9\x9b\x46\x00\xdd\x17\x60\xd0\xdc\xce\x44\x75\x74\x67\xbe\xc1\x94\x64\x06\xd5\x30"}, +{{0xd1,0x07,0xcf,0x26,0xf5,0x27,0xdb,0x71,0xa2,0x06,0xe4,0x1d,0x17,0x95,0x53,0x21,0x01,0x32,0x25,0xbb,0x20,0xf9,0x3e,0x12,0xdf,0x3d,0xc7,0x39,0x9e,0x72,0x0c,0xa3,},{0x18,0x6b,0xf4,0x53,0xc9,0x5d,0xc0,0xa2,0xfd,0x58,0x9a,0x78,0xe2,0xc8,0x00,0x40,0xb3,0xf6,0xdd,0xf9,0xa6,0xf8,0x68,0x1d,0x14,0x60,0x36,0xcf,0x21,0x46,0xe8,0xfc,},{0x80,0x71,0xd9,0x7f,0x32,0x4f,0x10,0x35,0x8f,0x13,0xac,0x8c,0x61,0xd4,0x24,0xb4,0xf3,0x00,0xdd,0x04,0x19,0x57,0x1c,0x39,0xe4,0x0d,0x99,0xae,0xa5,0xf0,0x31,0x40,0xe6,0x2a,0xb4,0xc9,0x71,0x27,0xab,0x33,0xe9,0x82,0x69,0x96,0x6a,0xe1,0xd4,0x55,0x7e,0x45,0x9b,0xf7,0xf5,0x97,0xb3,0x13,0xf3,0x51,0xa2,0x01,0x22,0xf0,0x66,0x0e,},"\x78\xeb\x9e\x13\x78\x99\x28\xa7\x4f\x36\x01\x41\x72\x8e\xde\x98\x38\x96\x85\xc8\x36\xb9\x1f\xaf\xbf\x1a\x7e\x8c\x19\xcf\xbe\x21\xbd\x3c\x3d\x6c\x6e\xd8\x3c\x40\x9e\xf6\x93\xf1\xd7\x35\xda\x3f\xa4\x66\x49\x7e\x19\xf3\x8e\x30\xfb\xa2\xa1\x02\x37\x85\x45\x90\x70\xe6\xe9\x2c\x1c\xb7\xc9\xbd\x0c\x9b\xa6\x12\x20\x15\x78\x66\xc3\xbe\xd2\xb0\x1e\x6e\x6b\x9b\x8d\xd3\xf0\xc4\x7c\x02\xf1\x81\x34\x6a\x0a\x9b\x9b\x5d\x3d\x7e\x18\xa9\x4d\x69\x56\x85\x5e\x16\xe8\xea\xaa\xab\x71\xb1\x03\x02\xf3\x5b\xd8\xfb\x1f\x9b\x58\x47\x30\x41\x60\x32\x49\x26\x64\x5b\x05\x82\xc2\xf2\xf1\x53\x3a\x24\x28\x14\x61\x51\x42\x41\xdb\x28\x50\xef\x31\xc5\x76\x3b\x2e\x3d\x4f\xb1\x8f\xc6\xd8\xc1\xd7\xe5\x2f\x7c\x13\x39\x2c\x17\xe2\x70\x19\xff\x60\x00\x8e\x43\x1f\x17\x14\x37\x0b\xc0\xef\xd9\x45\x2a\x61\xf5\xc5\x64\x88\xd9\x1a\x18\x50\x37\xf1\xf6\x47\xf7\x2f\xa7\x85\x01\x0d\x5d\x78\xf0\xa1\x15\x87\xcc\xf6\x6b\x80\x88\xe0\xe6\x35\xff\xf3\x77\x41\x93\xb2\xed\xef\xfd\x92\xd6\xe8\xa0\x32\x11\x28\xae\x64\xcd\xb8\x62\xe6\x31\xe2\xee\x5b\xa0\xda\x44\xbb\xd5\x89\xdc\x39\x2b\x5a\x11\x3b\x86\xa7\x27\xa8\xdd\xb6\x98\xa3\x34\xcc\x66\x8b\x39\xb1\xcd\xe1\x99\xb8\x88\x37\xca\x5f\x00\xf5\x53\xf8\x9c\x62\x28\x34\x27\x36\x41\xd3\x9b\xc1\x0c\x6a\x24\xe1\xeb\x42\x58\x75\x42\xf0\x3f\xc1\x62\x75\x24\xed\x6b\x74\x93\x91\xf1\x10\x28\x70\x6c\x42\x36\x44\x25\xb2\xca\xf2\x01\x80\xe1\xb8\x02\xc7\x44\xb4\x9b\x7b\xcd\x9b\xf7\xb1\x5c\x23\xa0\xbf\x1c\x69\x65\x96\x0d\x34\x15\x54\xe1\x96\x6b\x6e\xf8\x2f\xcf\xbb\xe4\x1d\x1e\x09\xd7\x41\xe3\x09\x25\x44\x46\x77\x7f\x13\xc2\x9a\x67\xb8\xbd\xeb\xc5\xf7\xf0\x4d\x16\x0d\x60\xe3\x32\xe3\xd0\x44\x1a\x0f\x2f\x7b\x19\x2c\x3e\x2b\xdf\x6d\xad\xec\x2a\x42\x4f\x88\x66\x98\x06\x23\x6e\xe0\x4d\xea\x69\x2b\xd8\xbb\x6f\x91\xca\x06\x82\xec\xe3\x49\x14\x25\x75\x35\x8b\x9b\x7b\xe7\x06\x00\xb3\xcb\x81\xe1\x45\x6b\xa0\x79\x9f\xdc\x01\xff\xd6\x86\x23"}, +{{0xaf,0x7e,0xa8,0xe4,0x1c,0x89,0x37,0xa4,0xec,0x47,0x5a,0xd8,0x13,0x71,0xa1,0x71,0xd3,0xd0,0xf9,0xfd,0x75,0x19,0xa0,0x4c,0x75,0x1e,0xd4,0xad,0x8f,0xf8,0xfe,0xf9,},{0x15,0xdf,0xc7,0x15,0x85,0xba,0xc7,0x1e,0xf2,0x0f,0x37,0x49,0x87,0xc5,0x55,0xa3,0xf2,0xf0,0x7d,0x6b,0x9c,0x78,0x70,0x66,0xc1,0x0d,0x63,0xcf,0x06,0xe0,0x2a,0xb0,},{0xc0,0xf1,0x73,0x91,0x67,0x27,0x4b,0xf9,0x18,0x31,0xc7,0x4b,0xeb,0x64,0x5a,0xf7,0x90,0x45,0x9b,0x28,0xbb,0x3f,0x21,0x32,0x53,0x65,0x13,0x0f,0x40,0x9a,0xcb,0x66,0xdf,0x1d,0x22,0x37,0x59,0xa9,0x75,0x8e,0x08,0xfd,0x72,0x53,0x73,0x74,0x84,0xe2,0x85,0xa6,0xfb,0x47,0x40,0x4a,0xbe,0x2e,0xba,0x5e,0xf2,0x49,0xfd,0x02,0x5c,0x0a,},"\x05\xf2\x26\x3f\x02\x45\xec\xb9\xfa\xeb\x14\xe5\x7a\xca\x43\x66\x68\x30\x8c\x81\x25\xdf\x31\x16\xc4\xee\x20\x50\x1d\x0c\xde\x70\x1b\x36\x6e\x2b\x50\xa1\xc5\xed\xf4\x84\x14\x4c\xe1\x6b\xfb\x1f\x7d\x26\xdc\x42\x75\xea\x97\x32\xe2\x64\xba\x4d\x4a\x36\x2b\x40\x27\x5b\xa4\x73\x77\xdb\xc3\x32\xcb\x65\xe2\xf4\xc8\x85\x38\x94\xaa\x87\x8a\x4c\x17\x5d\xc5\xb3\xb2\xa7\x57\xff\x3c\x8d\x7d\xe6\x60\x97\x3b\x89\xda\xdf\x07\x6e\x2e\x4f\xc7\x62\x39\xb7\xbc\x75\x2a\x22\x9d\x44\xe0\x00\xce\xb6\x67\x10\x4c\xb0\x74\x6b\xfc\xf5\x9d\x69\x60\x3a\xe7\xfc\x1b\xcf\x11\xd2\xe3\x3f\x61\xdc\x49\x7e\xc1\xb0\xbd\x5e\x4f\x1d\xbe\xf4\x35\xf2\xf2\x91\xf3\x0b\x00\xa8\x5e\x83\x39\x46\xc8\xb1\x04\x84\xe4\xab\xd7\xd6\x0b\xdb\xb1\xfe\x6d\xff\x58\x07\xa5\x3b\xb8\x93\x82\x15\x30\x13\xb7\x0c\xa0\x8e\xfc\x91\xb7\xe9\xfc\x5b\x5d\xbb\xb6\xaf\x12\x3b\x57\xbe\x2e\x14\x0f\xc4\x71\xa4\x5d\x89\xfa\x82\x84\xcc\x27\xe0\xa1\xfe\x77\x1f\x55\x59\x8b\xbd\xcf\x06\x8d\x50\x6d\xad\x0a\x59\x21\x79\xce\xca\x39\xee\x95\x26\xf9\xe4\xfe\x47\xbf\x2b\xb1\x4f\xb1\x48\x6a\x67\x7d\x4d\x7b\x99\xa5\x20\x54\x56\x76\xa0\xf1\xfa\x80\x90\x49\xaa\x24\x14\xae\x7b\x81\x7d\x9a\x03\x6e\x5c\x15\x78\x86\xe8\x34\x1d\x4e\x81\x9c\x09\x2a\x3b\x48\xb3\x60\x6b\x03\xac\xb7\x27\xc6\xc2\x21\x7d\x0a\xf3\x01\x21\x54\x6a\x94\xaf\x6b\x49\xca\xa2\xa8\xc9\xb1\x78\x6f\xa0\xc2\xa5\x24\xec\x7a\x02\x3e\x92\x4b\x5f\x8a\x89\xa5\x37\x80\xc7\xf8\x78\x1c\x5b\x8e\x86\x94\x30\xca\xa0\xe6\xd0\x43\x79\x67\xe3\xae\xd4\x4f\x45\xc9\x01\xcb\xcf\x10\x26\xfb\xbd\x4e\x3d\xd9\xa0\x91\xec\xf8\xb3\x4f\x7d\xd5\x03\x8e\x54\x3d\xc7\xeb\x6a\xd5\x49\x4e\xfb\x14\x5c\xf6\x3e\xc0\xd3\x55\xbb\x8e\x17\x2f\x45\x5d\x8a\x6b\x13\xda\xca\xad\xdb\xc5\x6e\x47\xde\x3c\xf7\x62\xa1\xa7\x38\xef\x09\x2f\x14\x36\x68\x04\x67\xb5\xcd\x82\xe9\xe3\x6e\x2d\x2b\x68\x42\xb3\xbd\x5d\xce\x77\x18\x0d\xda\xf0\xb6\x43\x37\x8e\x69\x85\x99\xdd\x47\xf5\xcd\xbb"}, +{{0x0c,0x57,0xcb,0xfc,0xeb,0xde,0x10,0xed,0xe0,0x2d,0x1c,0xb0,0x1d,0xf3,0x60,0xd4,0x1f,0x2e,0x66,0xa5,0x04,0x43,0xd5,0x8b,0x5d,0x4f,0x08,0x28,0xc9,0xa1,0x8b,0xb7,},{0xc4,0xd7,0x61,0xba,0x18,0x99,0x71,0xb9,0x46,0x2c,0x61,0xbf,0x46,0xa7,0x65,0xf8,0x8e,0x2e,0xca,0xa5,0xbf,0x22,0x11,0x22,0x0a,0xfb,0x00,0xac,0x65,0x7f,0x7c,0xe5,},{0x8a,0xf7,0xbb,0xe0,0x1b,0x8a,0xb9,0x39,0x51,0xd1,0x6f,0xca,0x05,0xa9,0xc9,0x67,0xd1,0xc5,0x2c,0x97,0x4b,0xea,0x15,0x1e,0xa7,0x2e,0x4c,0xeb,0xaa,0x20,0xcc,0x78,0x3b,0xb6,0x1d,0x8d,0x69,0x38,0x5c,0xac,0x5b,0xc6,0xd7,0x2d,0xbd,0x16,0x2b,0xee,0xf1,0xfc,0xb5,0xdd,0x0e,0x0a,0x08,0xb4,0x8c,0xa0,0xb9,0xf6,0xd9,0xa9,0x88,0x0c,},"\x33\x77\x03\x24\x3a\xb5\xb4\xe4\xd3\x48\x1e\xe8\xdd\x1f\x44\x94\x50\x71\x74\x41\x26\x58\xa9\x39\x88\xb5\xc3\x04\x03\xa7\xb7\xed\x85\x22\xce\xb4\x6f\xa1\xee\x02\x75\x3a\x87\x4e\xf0\x67\x5d\x39\x7c\x57\x5d\xa0\xb0\x8c\xaa\x8c\xee\x33\x93\x78\x4d\x0f\x0d\xb8\x45\x98\x37\xaf\x90\xb9\x05\x6d\xf4\xe3\x8e\x41\x7f\x3a\xd2\xeb\x1a\x10\x0e\xf2\x07\xce\x2c\xa6\xc6\x10\x01\x80\x21\x66\x1e\x30\x70\x99\xf2\xb7\xc4\xae\x87\x59\x91\x14\x0b\xdd\x3f\x0f\x99\xad\x2c\x5d\x55\xaa\xcb\x84\xcc\x1c\xdc\xd5\x79\xe0\x80\x72\xb6\x95\x1f\xd4\x5e\xd2\x89\xac\x9f\xf7\xf0\x98\x6a\xc8\x8a\x4f\xbb\x9d\xc9\x20\x3d\x9b\xaf\x18\x0c\x90\xed\xf9\x37\x25\x8c\x9d\x0a\x6d\x48\xe2\x20\xf7\x2d\x25\x0c\x7f\x2c\x77\x7e\xaa\x7f\xb9\xfa\x11\xd5\x0a\x57\x98\x77\x2f\x9f\xd9\x76\xb0\x05\x99\xf1\xf0\x27\x6f\x3a\x2e\x4d\x98\x8a\xe9\x21\x25\x46\x7a\x8d\xed\xb7\xa1\x6f\x9e\x3a\x56\xe8\xd0\x06\x62\xb3\xeb\x67\xa3\x5b\x9b\x60\xe7\x3b\xd9\x35\x07\x7e\xe2\x38\xdf\x8f\x6e\x83\x3b\x9a\x55\x23\x38\x68\x26\xc1\xf2\x91\x7b\x1c\x3e\xc9\x8e\x0a\x5f\xde\x89\xc4\x8b\x1d\x44\x6d\xa5\xd0\xc8\x85\xfe\xf0\xe3\x74\xbf\xf3\x0a\x99\x7c\x7b\xaf\xd5\xe7\x43\xc8\x5d\x0c\x6a\xaa\x6e\xf1\x0a\x06\x12\x11\xa2\x32\x7c\x6d\x84\xeb\x74\x7a\x56\xe9\xbf\x60\xfc\xd5\xb5\x53\xb7\x98\x83\x4d\x0c\x5c\xca\xdb\x9d\x4b\x54\xe7\x23\x7d\x12\xc6\x79\xc1\x93\xa2\x87\xbb\x2f\x51\x1c\xd4\xee\x2a\x2d\x85\x49\xb4\x4b\x21\xc1\x1f\xbe\x57\x23\x38\x1c\x6c\x5f\x78\x46\x87\xfd\x90\xce\xbc\x5b\x49\x5a\xf9\xe4\x14\xf2\x96\x1b\x06\xa1\xc8\x43\x3b\x9a\xa3\x29\x2b\xcf\xf4\x24\x1c\x22\x71\x67\xf8\xd1\xde\x05\x4b\xa3\x3a\xd8\x1d\xa3\xeb\x3e\xc6\xe4\x0a\x6e\x26\x85\x4a\xf3\x49\x54\x01\x71\xb7\x5d\x75\xfb\x9a\x8d\x12\x93\x78\x27\xfd\x59\x4d\x31\x7b\x7a\x8d\x9f\x1c\x2f\xca\xbd\xa5\x63\x75\x56\x8c\x3e\x9e\x51\x4c\x2e\xff\xfc\x38\x78\x36\x3d\xcf\xad\x9f\xd9\x54\x36\xb0\x22\xe8\x77\x2a\x88\xcb\x71\xe8\x03\xbf\x90\x38\x19\x62"}, +{{0xfe,0x71,0x72,0x27,0x83,0x64,0x19,0x4b,0xcf,0xef,0xb4,0x78,0x31,0x42,0xb7,0x9f,0x59,0xd5,0xfd,0x97,0x8b,0x1e,0x47,0xc3,0x14,0xd7,0x8d,0x4c,0xb3,0xf6,0x1c,0x8a,},{0x2e,0x82,0xcc,0xe4,0x79,0x10,0xc7,0xe2,0xa7,0x9b,0xc1,0xf4,0x19,0xdc,0x3c,0x3d,0xf5,0x4f,0x23,0x29,0x1f,0xc8,0x19,0x3e,0x82,0x58,0xcc,0xd2,0xfd,0x38,0xd5,0x48,},{0xf6,0xc2,0xa4,0x29,0x6b,0x9a,0x34,0x07,0xc6,0xd7,0xa5,0x67,0x9d,0xae,0x86,0x66,0xb5,0x03,0xd1,0xa1,0x7e,0xac,0xf7,0x1d,0xf4,0x93,0x79,0x1b,0x8f,0xf0,0xc0,0xaa,0x8e,0xed,0x36,0xb3,0x27,0xa2,0x9a,0xb7,0x82,0x8f,0x46,0xf2,0x2d,0xe8,0x68,0xb6,0x28,0xb1,0xcf,0xd5,0x01,0xe8,0x59,0x9f,0xa3,0x16,0x93,0xb1,0x5f,0x61,0x08,0x0f,},"\x23\x50\x94\x51\xa0\x59\x96\x9f\x2b\x4b\xdf\xce\xe5\x38\x89\x57\xe9\x45\x6d\x1f\xc0\xcd\x85\x7e\x4f\x4d\x3c\x25\xa4\x15\x5d\x5e\xe9\x1c\x20\x53\xd5\x58\x06\x2e\xea\x68\x27\x95\x0d\xe8\x63\xbc\x9c\x3d\xf9\x67\x2c\xde\x8b\xa7\x41\x74\x4e\xbb\xdd\xb4\x5e\xc1\xf4\x28\x45\x70\xfd\x0a\xac\xd0\x7e\xa5\x8c\x58\x1b\xe2\xaf\xc9\x5a\xe4\x44\xe6\x78\xed\xc2\xa0\x24\x39\xf3\x87\xce\xc9\x82\xea\x3a\x44\x81\x4a\x8a\x30\x2b\xb3\xbf\xe8\x22\x8d\x58\xde\x03\x9d\xeb\xdf\x7c\x2a\x7e\xdd\xb4\xe7\x1c\xa4\x74\xf9\x4f\x7e\x2b\xd8\x9d\xc6\x5b\x16\x10\x73\x3c\x91\xff\xf8\x9b\xd4\x99\xf4\x01\x54\xa6\x19\x8f\xdf\x5e\xc7\xad\x37\x22\xd9\x25\xb2\x92\x19\x6c\x42\x94\x99\x07\x5b\xe0\xc5\xb6\xda\x9c\x09\x0c\x07\x91\xa7\x01\x9e\xb5\xe7\x36\x6b\xe6\xce\x58\xab\x2f\x04\xfe\xcd\x91\x27\xc4\x27\x18\x04\x7b\xf4\x70\x30\x69\x15\x21\x31\x2c\x08\x77\xaa\x3f\x36\xcc\x5f\xbc\x9c\xaa\xe0\xfd\xe3\x94\x5d\x2a\x86\x8e\xe2\x50\x2a\x38\x33\x20\x8e\xb8\x50\xa1\x63\xcf\xcb\xf6\xda\x9e\xe6\xad\x9f\xe0\x67\xfe\x24\x19\x86\xfe\x44\x36\xd6\xae\x4e\xdc\x61\x56\x19\x38\xe2\xa3\x3f\x4a\x33\xdb\x63\xf6\x9d\x3f\x1a\x88\x50\xed\x40\x02\x88\x69\x16\x41\x03\x48\x8f\xb7\x95\xcd\x82\xca\x06\x7f\xe1\xb4\x89\x7c\xaa\x49\xa7\xca\x9a\x80\xf3\xa8\x15\x1f\xd1\x3b\xbb\x7f\xf3\x50\xe8\x57\x9f\x56\x5d\xc1\xc4\xa9\xca\x93\x8d\x27\xb1\x5b\x3f\x85\x8e\xf4\x5d\x3d\xd7\x8b\x2c\x35\x86\x35\x35\x63\x15\xf5\x5a\x97\x52\x8e\xcf\xec\x5d\x11\xa5\xb7\x21\x50\x31\x07\xfa\xa4\x06\xc1\x70\x34\xe6\x01\x47\x4b\x3b\x60\xcf\x48\x69\x2e\x26\x92\x61\x15\x8f\xc3\x53\xd4\xdf\x42\x74\x38\x13\x57\x79\x0b\x77\x56\x08\x7b\x00\xcc\x79\xe3\xb9\xd2\x8a\x3f\x24\x39\xfe\xbf\x19\x9e\x64\xa8\xb3\x7c\x91\xb5\xa4\x33\x4e\x33\x54\xe8\xfa\xf3\xa3\x61\xe8\x56\xc5\x4b\xda\xa4\x3b\xfd\xcd\x6e\xe6\xc9\xf9\x67\x95\x88\xf6\x06\x99\x50\x83\x23\x48\xaa\xcb\xa2\xbf\xee\xba\xca\xa2\x07\x1d\xdc\x7d\x77\x89\x8e\xf0\xf6\x87\x93\xcd\x25"}, +{{0xa9,0x51,0xe4,0xe6,0xba,0x9f,0x1f,0x0b,0x35,0x48,0x31,0xc9,0x86,0x94,0x24,0x48,0xfa,0xed,0xe3,0x7e,0x11,0xb0,0xf2,0x47,0xda,0x27,0x06,0xdc,0xee,0xf7,0x3a,0xc7,},{0x30,0x36,0x20,0x14,0x97,0x4b,0xf7,0x5c,0x84,0x95,0xc2,0xe2,0x71,0xe7,0x13,0xd5,0x73,0x84,0x38,0x4d,0x0a,0x5d,0xa8,0x8e,0xde,0xea,0x79,0x27,0x9c,0x0c,0x58,0xec,},{0x02,0x78,0xc8,0x6a,0x15,0x20,0x8d,0x9b,0xe5,0xb1,0xe1,0x57,0x47,0x61,0x86,0x1b,0x8a,0xf7,0x2a,0xe0,0x8d,0x40,0xcd,0xcb,0xec,0x35,0x4e,0x65,0xa9,0xc3,0xd0,0xa0,0x6b,0x5f,0xcb,0xb2,0x97,0xd0,0x9b,0xef,0x39,0x74,0x62,0x39,0x59,0x86,0xc3,0x09,0x3e,0xeb,0x22,0x64,0x4c,0x00,0x3c,0x30,0x78,0x17,0x8c,0xdf,0x67,0x4e,0x99,0x0a,},"\x20\x57\x7d\xca\xc8\x91\x74\x88\x5e\xed\xb0\x62\x48\x9c\xd5\x12\xfa\x72\x86\x3e\xc5\x43\x8e\x31\xe9\x58\x78\xb7\x5c\xe2\x77\x2a\xee\x62\x90\xa0\xba\x3c\x8f\x64\x2c\x1d\x0e\xf5\x5d\xa8\xd5\xbc\x14\x84\xf8\x3b\xb9\x87\x6c\x7a\x8c\x0b\x6b\x60\x9b\x94\xd1\x12\xa0\x6f\xc8\x3c\xe8\xd2\xc1\xe0\x8e\xd6\xc7\x35\xe5\x7b\x24\x4a\xad\x6e\xcf\x70\x75\x36\x3d\x56\x5b\xa4\x78\x65\x69\x5c\x84\x23\x51\x09\x09\xe0\xa3\xdb\x4b\x61\xed\x7a\xa6\x7a\x74\x71\x33\x1e\x83\xa0\xc5\x8b\x82\x20\xa6\x24\x5f\x65\x66\x15\x49\xc1\xa1\x2d\x4c\x0d\x50\xc3\x26\xfb\x94\x91\x7c\xbd\x07\xbe\x51\xe8\x3f\xe8\xbb\x3e\x46\xca\x01\xb0\xa2\x60\xda\xaf\x1d\x6a\xbe\x37\x03\xd6\xa9\x25\x11\x3b\xb4\xd5\x7e\xa1\xa4\x8b\x4c\x7d\xbd\xaa\x03\xee\xa8\x14\xa4\xb5\xf0\x2e\x1d\xfb\x54\x5c\xc6\x23\xfe\x17\xa3\xbb\x18\xe4\x37\x3f\x5f\x7e\xc2\xfb\x52\x17\xd2\x3e\x4f\xed\x54\xa7\x72\xe1\x13\x23\xe7\x30\xaa\xd7\xef\xca\x8c\x46\x44\x00\xe7\x67\x90\x55\xfc\xc1\x25\xa8\x76\xef\x7b\x8b\x9d\xe1\x86\xe2\x29\xa7\xab\xf1\x91\xd0\xc5\x6d\x91\x81\x5f\x67\x87\x2e\x95\x7b\xfb\xc7\x63\x4a\xac\x40\x35\x76\xa5\x8f\x42\x7b\xdb\xb3\x0e\x8c\x4b\x6f\xc6\xc4\x47\x74\x10\x24\xeb\xb5\x03\xa5\xa9\x02\x51\x24\xa4\x88\x7f\x82\x5a\x43\xee\x94\x0f\x21\x0a\x1b\xd5\xae\x4f\x67\x32\xd6\x0f\x95\xf2\xb8\x32\x01\xc4\xc6\xdf\xe2\x79\x41\x2d\x75\x02\xa5\x21\x1f\x8f\x48\xf8\x00\xdb\x30\xfc\x37\x76\xc4\xed\x3a\x38\xbb\x46\x34\x82\x2c\x98\xa6\xd6\xdd\x32\x33\xbe\x60\xe4\x2c\xca\x45\xa3\x16\x3c\xc8\x4e\x9e\x8d\xa6\x47\xc0\x71\x1b\xc4\xc6\xcc\xd6\x5a\xa1\xe9\x72\xc0\x74\x04\xd1\x03\xe7\x4b\xcc\x31\xa7\xe2\xc3\xee\xa5\xac\x92\x57\xab\x42\x89\x47\xab\x3d\xd3\xfb\x15\x3d\x90\x69\x4a\x40\x73\x37\x3c\x4d\xd9\xce\xb1\x31\x15\x4f\xe8\x77\x47\x3f\xd9\x96\xf4\x24\xf3\x3e\x31\x6e\x4e\xb0\x2b\x8c\x75\x13\xbe\x69\x98\xe5\x16\xcb\xba\x54\xd9\x4c\xd0\xa4\x35\xe0\xff\xcc\x2c\x0a\x8e\xf7\x2b\x63\x0e\xc2\x47\x81\x06\x6a\xa5\xef\xb9"}, +{{0x38,0xa9,0xb2,0xd4,0x9b,0xa8,0xb8,0x2f,0x30,0x1a,0x57,0x72,0xce,0xa0,0xef,0xc2,0x21,0x84,0x55,0xc8,0xb2,0x18,0xb2,0x2c,0xba,0xa2,0xaa,0xd2,0xd7,0xad,0x3b,0x35,},{0x9d,0xf5,0xea,0x1f,0x78,0xf8,0x10,0xa5,0x21,0x77,0x46,0x02,0xbb,0xba,0x49,0x42,0xf0,0x45,0x92,0x38,0x96,0x6c,0x8b,0xcd,0x21,0x90,0x0a,0xfb,0xf3,0xd8,0x42,0x93,},{0xe1,0x9e,0x62,0xac,0x53,0x9a,0x9c,0xa2,0x51,0xd1,0x2d,0x4c,0x71,0x05,0x5b,0x0a,0x3f,0x58,0x1d,0x19,0xf2,0x68,0x2e,0x67,0x24,0x04,0xc7,0x8a,0xc1,0xf1,0x2b,0xbe,0xfc,0x91,0x51,0x92,0x76,0xa5,0xcb,0xe1,0x6f,0x52,0x0c,0xf7,0xa7,0xf6,0x87,0xa2,0x40,0xf0,0x32,0x91,0x57,0xc5,0x9f,0x50,0x02,0x6a,0x58,0xdc,0xdc,0x50,0xfc,0x08,},"\x17\x78\x16\x7c\x49\xb3\xa4\x4d\x4a\x5b\xa8\x38\xb7\x38\x85\x53\xb1\xe1\x3d\x36\xea\x4f\x86\xd3\x02\x42\xe1\xa8\x22\xa3\xbb\xaf\xf5\xce\xa6\x3e\x2a\xe2\xa4\x63\x5b\xe2\x36\xfe\xf2\xb8\x13\x5d\x14\xfb\x62\x1c\x0b\xb7\x73\xc9\xc1\x77\x53\xf8\x09\x26\xeb\x55\xd0\xf1\x15\xbd\x09\xa8\x85\xd8\x44\xb8\x18\xc9\xf0\x44\x89\xa3\x31\xbb\x5e\x03\x2b\x8e\x58\xcd\xa3\x69\x49\xc5\xa8\xd0\x8b\x55\xbb\x8d\xe9\x65\xe1\xf9\x0d\x3b\x9c\xfe\xec\xfc\x6a\xd9\xa4\xee\x5c\xb4\x04\x7e\x94\x50\xac\xdc\x64\x64\x01\x66\xa8\xc0\x69\xea\x84\x9a\xeb\xdd\xac\x1a\xe4\xaf\xec\x91\xdd\xd1\x7f\xa5\x55\x3f\xa8\x7c\x56\xf7\xe5\x1e\xc1\xcd\x6b\x5c\xc2\x33\x51\xd0\x57\xa4\xce\x4a\x89\x23\xc8\xae\x6a\xc7\xa8\xaf\xdc\xc0\x88\x1c\x0e\x74\xeb\xb0\x24\xef\x72\x96\x16\x2c\xb9\x3c\x68\xe5\x0b\xbb\x07\x4e\x65\x1a\xc8\x7d\xac\x9e\xa5\x9d\x4c\x3f\xbf\x0f\xe3\x79\xf3\xe9\x7a\x24\x56\x6e\xca\xe5\x43\x03\xbc\xfb\x6f\x0c\xc9\xf1\x5f\x66\x39\x43\x0e\x66\xb1\x9a\x42\x78\x49\xfd\xff\xf8\x33\xdf\x02\x68\x9e\x9d\xe4\x40\x06\xc9\x03\xc5\x59\x18\x34\x59\xb9\xf4\xa9\x7f\x54\xa0\xf2\xa2\x8d\xf7\xb0\xe9\xde\xed\xa8\x23\x9d\x7b\x51\x69\x77\xf5\xe7\xd6\x97\x1b\x45\x02\xe9\x88\x5f\x75\x0a\xf8\xd1\xa6\x66\x9e\x25\xe7\x7d\x5f\x32\x7c\x77\xc8\x7a\x86\xe0\xa1\x87\x2b\xc9\x6a\x76\x06\x0f\x5f\x8a\x0c\x40\xcc\x97\x3b\xfc\x7f\xe6\xed\x9b\xca\x78\xf8\x84\xe6\xa2\x82\x8b\x94\xd4\x89\xd3\x2a\x0f\xd3\x37\xe6\x9d\xb8\x3f\xb8\x78\x9a\xfd\x4e\x8e\xf5\x4c\x22\xa7\x8c\x25\x87\x46\x8b\x9a\xe0\x71\xba\xe3\xb2\x02\xd3\x18\x3a\xd5\xf0\xf8\xe8\x42\xe5\xa8\xde\x85\xbf\xff\x49\xe0\x3c\x83\x81\xbc\xa7\xfd\x42\x78\xdd\xcc\xaf\x01\x34\xfb\x55\x93\xa3\x95\xa7\x7a\x5c\xbd\x43\x45\x93\xbc\x4a\xd0\xff\x4b\x84\x00\xec\x67\x4c\x4e\xca\xf1\xd5\x77\x54\xbe\x0c\xb2\xfa\x9a\x64\x41\xa9\xab\xad\x7b\x42\x19\x7a\xd8\x2e\x50\x82\x7e\x4a\x42\x45\x57\x3a\x8f\x0e\xf8\x7f\x58\x22\x8a\x28\x67\xf4\xb3\xb8\x34\xb6\x63\x50\x37\x94\x0a"}, +{{0x9a,0x17,0x17,0x87,0x36,0x89,0xa0,0x3c,0x11,0x2d,0xd6,0xb4,0xd7,0x6a,0xe7,0x3b,0x89,0xb4,0x16,0xa5,0x98,0xce,0xec,0x20,0x9e,0x27,0x96,0x1e,0x7b,0xb1,0xee,0x8a,},{0xee,0xca,0xd1,0xe0,0xe4,0xb8,0x63,0x29,0x18,0x81,0xa8,0xc2,0x41,0xdb,0x9c,0xcf,0xff,0xe4,0xe5,0x5d,0x8b,0x5a,0x42,0xf3,0x07,0xb4,0x43,0x6a,0xcd,0x06,0x49,0xa6,},{0x1a,0xf8,0xbe,0x09,0x55,0x38,0x96,0x58,0x00,0xd8,0xef,0xf6,0xd7,0x23,0xd0,0x28,0xd6,0x5d,0x0e,0x9c,0x6e,0xb5,0xe9,0xd1,0x25,0xbb,0x3b,0x17,0x83,0xf1,0x1e,0xf7,0x07,0x9a,0x49,0xa8,0x07,0xe2,0x7e,0xf1,0x26,0x0b,0xe2,0x6a,0x3b,0x23,0x1d,0x03,0xb2,0xae,0x15,0x1e,0x49,0xf6,0xf1,0x89,0xf1,0x5b,0x1c,0x83,0xea,0xb0,0x1c,0x02,},"\xe2\x65\x80\x47\x09\x01\xa0\x7a\xb0\x93\x1a\xa2\x38\x29\x80\x2c\xe0\x4d\xa5\x9f\xdc\x2f\x77\x3b\xc5\x67\xf1\xe6\x5b\x4f\x2e\x2d\x4a\x1a\x6a\xec\x1f\x54\x15\x8a\xdf\xce\x9b\x09\x97\x90\xb5\x03\xa1\x3d\x22\x09\x7a\xe2\x3e\xbc\xcf\x92\x3f\x3b\xb1\x98\x6d\x6e\x49\x11\x1a\x8c\xf0\xd4\xeb\x82\x36\xbf\xe0\xd7\xc9\xe9\x3a\x5e\xfc\x7f\xeb\x8e\x6a\x9c\xd1\xb8\xd9\x21\xef\xa2\x1e\x44\x9f\xf4\x9e\x06\xc1\xcc\xfe\xa3\x1f\x93\xe0\x33\xc3\xc2\xa5\x4d\xdb\x0f\x65\x3a\x09\xfb\xd1\x8a\x70\xb5\x63\x15\xf1\x93\xe7\xbe\x56\xe5\x16\x8f\x59\x56\x38\x21\xd4\xbc\x3b\xbb\x0e\xaa\x20\x48\x28\x6b\xbe\xee\x5a\xa3\xf3\xe7\x53\x6c\xf2\xb7\x50\xfd\x32\x26\x02\xbb\x38\x47\xce\xca\x39\xb7\x54\x74\x32\x2d\x76\xb1\xde\x80\xfa\x2e\xad\xba\x15\x2d\x6f\x8f\x02\x0d\x4d\x93\x1c\x53\xf0\xa2\x80\x12\x24\xd3\x5d\xeb\x6e\xc1\x3b\x01\x48\x73\xe6\x89\x90\x36\x07\xde\x96\xd9\xb7\xa7\x43\xa8\x87\xd2\xf4\x8d\xaf\x2e\xd2\xee\xfb\x20\x2a\xbf\x60\x82\x79\x69\x81\x12\x3b\x96\x6e\x93\x6d\xcf\x34\x83\xe2\xd2\x4d\x69\x4e\xcb\x86\x5f\xbe\xb6\x96\x9f\x34\x70\x27\xfb\x8b\x17\x5d\x24\xa4\xc0\x45\xc0\xbb\x4a\xb5\xe0\x2d\xdc\xbe\x77\xd4\x75\x6c\x46\xd1\x37\xb0\x94\x47\x3a\x02\x30\x7a\x10\x83\x40\xac\xad\x9d\x03\xba\xe8\x40\x3a\xf1\x99\xcb\x75\xca\xe3\x16\x2f\x38\x15\x81\x3c\xc6\x8b\xf2\xa5\xe4\x99\xe5\x94\x92\x11\x49\xf3\xbb\xd2\x14\xda\x51\x37\xe7\x56\x52\x15\x59\xdc\x80\xd9\xa4\xb7\x4a\x0f\x49\x43\x02\x2c\x7c\xd5\xfc\xa4\x23\x15\xe0\xbc\xee\xae\x90\x69\x61\x5c\xe6\x7a\x04\x38\x24\x12\x31\x3a\x31\xd6\x7b\x34\x6c\x32\x9a\xd8\x2e\x74\x2c\x0a\x6c\xe0\xa6\xa0\x24\x54\xc1\x13\xe5\x20\x22\xf3\xcc\x03\xfd\xa6\x91\xeb\xdf\xe1\x4c\x53\xc8\xce\x5c\xa9\xb9\x32\xca\x1a\x38\x6e\x3e\xb4\xe9\x0a\x4d\xc6\xe8\xad\x85\x33\xb5\xaf\x1a\xae\xf5\x00\x31\x28\x65\x5c\xa6\x4f\x67\xfc\xd9\x7c\x6a\xc8\x03\x00\x24\x04\x90\x0b\xc0\xfa\xe9\x84\x63\xbc\xc3\x14\x09\xf9\x98\x17\x48\x78\x9a\xde\x2d\x07\x78\x3b\xc3\x2b"}, +{{0x43,0xbd,0x92,0x4d,0xb8,0x15,0x60,0x08,0xc6,0xb3,0x99,0x4a,0x81,0x30,0xd4,0x27,0xd5,0x14,0xdb,0x8a,0x61,0x3b,0x84,0xdf,0xb0,0xb8,0xe0,0xde,0x6a,0xc3,0x06,0x76,},{0x1b,0x34,0x61,0xc2,0x69,0xd5,0xb0,0x06,0x2d,0x5d,0xf6,0xfa,0x65,0x4a,0x25,0x86,0xf6,0x47,0xa0,0x68,0x42,0x18,0xa0,0x6e,0x5e,0x2f,0x7b,0xad,0xfb,0x39,0x41,0x31,},{0xd2,0xa0,0x5d,0x88,0xd9,0xd5,0x43,0xd9,0x4d,0x57,0xec,0x88,0xae,0x55,0x68,0x17,0x50,0xf2,0x0b,0x9b,0xe9,0xc1,0xe9,0x18,0xcd,0xaf,0x45,0x77,0x67,0xf2,0x94,0x8d,0xd6,0x29,0xe9,0x4f,0x06,0x8e,0xdc,0xf3,0xd9,0x92,0x7e,0x33,0x02,0x34,0xba,0xdc,0x3a,0x02,0xfa,0x5a,0xd3,0xd9,0xd8,0x5e,0x94,0x8c,0xb0,0xb0,0xcb,0x3c,0xd7,0x0a,},"\x61\x84\xe6\x48\x0c\x42\xe9\x6c\xc8\x77\x26\x9b\x16\x37\x15\x45\xff\x95\x23\xc4\x5e\xa8\x8e\x76\xa1\x34\x8c\x68\xae\x7f\x31\x8b\x08\x8f\xe4\x61\x09\x28\x23\x91\x85\xb6\xb5\x5b\xfa\x0f\x43\x64\x4c\x4a\x4c\x97\xc5\x6e\xd7\x7d\x08\xb1\xf4\xaa\xd2\xf4\xaa\x06\x99\x94\xab\xec\xa9\x6b\x7b\xf8\x1b\x80\x64\xea\x43\x50\xd8\xa8\xb0\x22\x97\xa5\x13\x08\xb6\x1c\x57\xc8\xf1\x87\x3c\x6f\x97\x00\x7a\xca\x31\x80\x42\x9e\x73\x0a\x66\x43\xf2\x87\x33\x54\x7b\xcf\x7b\x9a\xdf\xe3\x27\xe8\x57\x36\xbd\x04\xaf\x7f\x1d\x9f\x4f\xb8\x4a\x7f\x3a\xff\xdf\x4e\x22\xb5\x74\xec\xb4\xbc\x88\x36\xb1\x0b\x84\x53\xae\xaa\x5c\x1b\xf1\x32\x24\x8b\x82\x6c\xc5\x23\x0f\x75\xe0\x75\xfa\xc9\xf0\x37\x56\x11\x36\xe0\x06\x43\xd0\x82\x53\xe7\xad\x65\x2f\x70\x2c\x0d\x15\xb6\xd7\xd4\x8a\xa6\xf8\xe9\xb5\xf5\xcc\x14\x6e\x3f\x15\x6f\xb2\x52\x27\x51\xc3\x71\x00\x41\xbd\x92\x2f\x37\xa5\x03\x77\xe0\x28\xb0\xc4\xe4\xbc\x34\x65\xd7\xc8\x4a\xf6\xa5\xfb\x42\x7a\xcb\x3b\x41\x37\x8b\x10\x2b\xda\x46\xd8\xf6\xf2\x03\xa5\xff\xcf\x39\x5d\x43\x5e\x93\x45\x8a\x0b\x0a\x4c\x2e\x77\x82\xfa\xfe\x11\x9f\x76\x9f\x67\x05\x8c\x66\x77\xf6\xd1\x0d\x9c\xf5\xcb\x87\x48\xe1\x80\x57\x98\xed\x23\x3f\x6f\x93\x0e\xee\x0e\x50\x75\xbc\x58\xb9\x7a\xf9\x17\x7f\xda\x75\xd5\x37\x08\xbe\xb0\x4d\xc4\xf1\x9a\x43\xe7\x68\x07\x46\x09\xf1\x40\x65\xf4\x8f\xda\xd5\x07\x7c\xe1\x09\xba\xcc\x35\x71\x74\xa6\xb7\x95\x6f\x6e\x7f\x32\xe3\x84\x15\xbe\x52\x63\x70\xfa\x58\xc3\xc0\xb3\x1f\x51\xe6\xcd\x4b\x2c\xf2\x7f\x8b\xcb\xc2\x12\x59\xd9\xe5\xc3\xb5\xc2\x94\x6a\x9f\xc1\xb0\x0d\x9d\x15\xc3\xb7\xd8\x0b\xfd\x9d\x05\xdb\x91\xd2\x49\xd3\xe4\x2d\x89\x56\x68\x20\x44\x54\x8d\x83\xbd\xa8\xd5\xcc\x92\x12\x44\x2f\x30\xb4\x5c\xf4\xae\xad\x80\xcc\xe9\xb3\x51\x2c\x39\xc5\xc7\x37\xd3\xf8\xd7\x47\xaf\xba\xb2\x65\xaf\x5e\xee\xf8\xca\x93\x62\xec\x76\xe9\x43\xb0\xa0\xd7\xa3\x9f\x3d\xb1\x1e\xca\x14\x45\x8a\x7b\x59\x2e\x5e\x4f\xf2\x27\x5d\xd4\x8b\x28\x53"}, +{{0x8f,0xb0,0x86,0x20,0x6d,0xd9,0x5a,0x26,0x21,0xf5,0x98,0x56,0x0c,0xcb,0x28,0x1f,0x82,0x73,0xc8,0xfc,0x72,0xe2,0x36,0x11,0x08,0x9b,0xaa,0xc8,0x9d,0x3c,0x3c,0x78,},{0x20,0x27,0x6e,0xf4,0x79,0xf4,0xd4,0x52,0x3a,0xb7,0x74,0x20,0xd4,0x24,0xe8,0x81,0x9c,0x33,0xc8,0x37,0x79,0xed,0x80,0xc7,0xf6,0x66,0xe8,0xf4,0x40,0x3f,0x94,0xd7,},{0xa9,0x30,0x5e,0x00,0x16,0x00,0xd5,0x97,0xd0,0x5e,0xf6,0x71,0x69,0x9b,0xf0,0x9f,0x0d,0xcc,0x0c,0x44,0x47,0x5d,0x3c,0xa3,0x1e,0x7f,0xf1,0xbf,0xfe,0xdc,0x0c,0x67,0xda,0xa1,0xf3,0xb7,0x6a,0x03,0x59,0x48,0xc5,0x9c,0xd8,0x7f,0x82,0x45,0x3a,0x40,0x95,0x0a,0x1c,0x97,0x03,0xc2,0xe7,0xd9,0x28,0x0e,0x73,0x03,0x96,0x6d,0xa3,0x01,},"\xf0\x29\x03\xed\x42\x66\xe8\x49\xa4\x48\x52\x05\x95\x4f\xff\xa8\xa1\x08\xc3\x23\xb7\xe3\xf8\x43\x31\x04\x35\x14\xe4\x85\x56\xab\x01\x94\x97\x23\x3a\x5a\x12\x7b\xff\x3c\xd7\xc9\x70\x86\xbe\xce\xf5\x38\xb3\xf3\x39\xd7\xd0\x6e\x53\x2d\xc7\x32\x5e\x59\x7a\xe3\x57\xf8\x16\xde\xa4\x2a\x6a\x22\xc7\x9d\x22\x07\x4a\x2e\x1a\xd8\x02\x3c\x42\x4b\x7e\x09\x6e\x5a\xd8\x89\x7b\x05\xef\x7d\x00\xd3\x0a\x04\xaa\xf2\x98\x1e\xdd\xff\x2b\x34\x7f\x1e\x27\xe2\x0a\xab\xbe\x7e\x7a\x95\x44\x97\x8e\x09\x2b\x00\xcc\xe4\x20\xab\xa0\x61\x87\x37\x4f\xfb\xb3\x7b\x4c\x22\xd7\x5f\x04\xe5\x75\x90\xf6\x10\xa2\x73\x47\x28\x6c\x29\x83\x12\xa6\xc9\xb1\xbd\xf2\x4f\xbd\xa8\x51\x3c\x4f\x83\x56\xcc\xf7\x57\x06\x8f\xfc\x11\xbc\x65\x11\x37\x83\xa5\xdd\xe7\x72\x2f\xaf\x4c\xeb\x19\xfb\xb6\x2f\x40\x70\x2e\x2c\x6e\x6a\x8b\xb4\x9e\xf4\x04\x46\x45\x0c\x4c\x59\xa2\x99\x09\x44\xda\x47\x44\xf6\xee\x77\x0b\x93\x0c\x24\x66\x69\x81\x3c\xe5\xa9\xf5\xa4\x7d\xd8\x03\x88\x98\x1b\xfc\xc3\xa5\x6b\x5b\xe2\xc4\xc7\xe6\x59\xa2\xe9\x18\x2d\xec\x0a\xaa\xfe\x90\x31\xaa\x39\x54\xd4\xfe\x7c\x43\x11\x96\xa5\x61\xa5\xb7\x8e\xab\xa6\x4f\x3d\xb1\xb5\x86\xc5\x3b\x16\xf6\x79\xa8\x49\x21\xa6\x42\xc2\x60\xe4\x65\x3a\x61\xde\x10\x8e\xbd\xe6\xf7\x05\x3a\xfa\x2c\xb3\xf3\x66\x8e\xde\x12\x10\x20\xdd\x1b\xac\xe8\x41\x8a\xeb\xac\x3a\x5b\xd5\x14\x2f\x10\x5a\xc2\x6f\xe4\x9e\x5f\xb1\x40\xc1\x9b\x22\xd5\x4a\x62\x91\xdf\xc9\x54\x67\x02\x47\x88\x16\x46\x87\x4d\xef\xad\x81\x49\x95\x51\x9f\x62\x60\xe9\x77\x4a\x8d\x18\x5c\x37\x88\x1b\x4f\x25\x43\xc4\xb6\x3f\xbf\x19\x85\x01\x6a\xb4\x1c\x4d\x72\x8c\xbc\x90\xb3\xab\x87\x62\x67\xbe\xd4\x1d\x0c\x09\x02\xf6\xb5\x0e\x8f\xa9\x06\xfc\x47\x88\xf7\xb8\x20\x46\x73\x06\xe0\xfe\x9e\x03\x6a\x0a\x00\xf8\x04\xf9\x1c\x3c\xa7\x18\xb9\x5f\xf6\xd9\xe2\x20\x4b\xc3\x16\x1b\xf7\x0f\xcc\x17\xb2\x96\x4b\x56\xbc\x61\x2e\x29\x40\x2d\x96\xf5\x09\x86\x51\x4b\xc7\xd8\x31\xd5\x8e\x42\x79\x37\x86\xd5\x80\x6f"}, +{{0xaf,0xa1,0xb8,0x46,0xc2,0x10,0xb5,0x23,0x00,0xe9,0x76,0x96,0xf8,0x1b,0x8e,0xa7,0x74,0xd1,0xdf,0x12,0xe6,0x12,0x52,0x7c,0x55,0x74,0x7f,0x29,0xc1,0x93,0x73,0x96,},{0xb6,0x09,0x56,0x6b,0xbd,0x19,0x47,0xbd,0x7a,0xfa,0xce,0xb1,0x43,0x89,0xe8,0x36,0x22,0x71,0x69,0x21,0x5f,0xab,0x66,0x85,0x1a,0xa5,0xd7,0x0d,0x6e,0x2e,0x3b,0x89,},{0x98,0xb0,0xc6,0x31,0x3c,0xec,0xaf,0x7c,0x82,0xcb,0xde,0xb3,0xd0,0x28,0x06,0x41,0xc6,0x1a,0x06,0x0f,0x65,0xe5,0x63,0xaa,0x93,0xce,0x18,0x30,0x0a,0x9b,0x58,0x27,0x2d,0xc8,0x68,0x0b,0x48,0x5e,0x8c,0xd1,0x1c,0xf8,0x0f,0xdc,0xa8,0x68,0xfa,0xb3,0x65,0x37,0x83,0x84,0xa1,0x42,0x72,0x7f,0x2f,0x84,0x4f,0x87,0xcf,0xdf,0x19,0x05,},"\x4c\xac\x1b\x1f\x4b\xd4\x82\x84\xdc\xc9\xaf\xc8\xb5\x95\x5b\x64\xb4\x36\xdb\x70\x4b\x03\x35\xd9\x75\x5c\xc1\xf9\x74\x77\xf8\xd3\x23\xcb\x64\x10\xef\x14\x6a\xb8\xa9\xef\xb9\x52\x6d\x8b\x62\xe3\xbb\xad\x1f\x72\x95\xf4\x7b\xa9\xf0\xde\x95\x8f\x8e\xc9\xb7\x7a\xb4\x22\x32\x43\x7e\xd9\x74\x85\x64\x44\xcd\x22\xe2\x0b\xe3\x5e\x91\x81\x3b\xff\x4b\x01\x6f\x81\x0d\x0f\x61\xd8\x9f\x6b\x61\x4d\xb3\x3f\x34\xbd\x09\x98\x5b\x59\x3f\xe3\xe0\x6e\x06\x5b\x7b\xc6\xcd\x39\xd5\x5c\x2c\xfb\xec\x7b\x6d\x59\xc0\xb3\x7d\xd1\xd0\xd3\x51\x35\xab\x1d\x1b\x04\xf2\xf3\x0c\x2f\x04\xf4\xba\x2b\x36\x58\x27\x38\x08\x1c\xf5\x91\x90\xf5\x28\x36\x3d\xb9\x44\xed\x61\x29\x31\xd1\xd5\x14\xc6\x21\x4f\x9a\xb9\x2a\xbb\x18\x33\x92\x61\x83\xac\x52\xfb\xa2\xa4\x55\x1e\x20\xe4\xc0\xac\x95\x9a\x49\xdd\xb1\x67\xa3\x81\xe0\x24\x1d\x40\xc0\x86\xe9\x0e\x52\xac\xa0\x17\x25\x89\x75\xdb\xab\x2b\xa4\x51\xee\x53\x9a\x71\x8f\x07\x6a\x58\x70\x9c\x66\x97\x41\x8d\x9c\x6f\x13\xe4\xd3\x91\x36\x8b\xf0\xe8\xbd\x8f\x29\x32\xdd\x95\xce\xaf\x7a\xac\xa1\x24\x11\x47\xd3\x41\xa3\xac\xd0\x8d\xc3\x29\x05\x48\x35\x72\xb8\x9a\x80\xcc\x47\x23\x14\x68\xab\x8d\xe3\x59\xdd\x52\x5a\x62\x57\xcf\x19\x6c\x2e\xcb\x82\xfa\x8a\x78\xaa\x3a\x85\x1c\x7c\x96\xca\x25\xbf\x7c\xa3\xdc\xf3\xca\x21\x45\x3d\x0d\xfd\x33\x23\xd5\xa4\x22\xde\xc8\x43\x16\x10\x2f\x68\x4c\x35\x9f\x22\x6b\xb5\x37\x79\xc0\xb9\x95\x09\x39\x28\x1e\xf7\x9a\x58\xc0\x11\x99\x3e\xac\xe0\x85\x49\x7a\xfa\x4d\xaf\x64\xc9\x68\x7b\x0a\x11\xaa\x11\x6c\xfa\x7b\x03\x93\x62\x41\xa5\x56\x7b\x64\x6e\x7e\x42\xe9\xfb\x59\x24\x05\xb8\xfa\x3c\x0a\x82\x1f\xc3\x12\x1b\x45\xb1\x75\x3c\xec\x9a\x83\x94\x7d\x21\x1a\x45\x49\x9b\xd6\x37\x90\xb8\x7f\x01\x47\x2f\xe5\x66\xd8\x76\x96\xef\xed\xbb\x74\xed\x00\x04\x8c\x38\x4b\xa7\xf0\x27\xb3\xaa\x42\x98\xdc\x41\x10\x34\x9f\xed\xf5\x2a\x96\xcd\x05\xd0\x8b\xd6\x35\x77\x1e\xd4\x51\x07\x38\xd8\xf0\x7a\x60\x21\x24\x4d\x19\x03\x57\x9a\x3e\xa7\x39"}, +{{0xc8,0x59,0x13,0xa6,0x87,0x78,0x77,0x13,0x10,0x01,0x62,0x3c,0xcd,0xa9,0xcd,0xc1,0x2b,0x9d,0x40,0x43,0xb8,0xa8,0x37,0x93,0xc4,0x46,0x96,0x63,0x2c,0xd6,0x42,0x1c,},{0x9c,0xc6,0x7c,0x69,0x48,0xf7,0xbf,0x6e,0x55,0x6d,0x08,0x49,0xd3,0xb8,0xd2,0x03,0x45,0x7a,0x7b,0x61,0x54,0x9b,0x36,0x68,0x1d,0x75,0x4f,0x1d,0xc0,0x84,0x1e,0x96,},{0x01,0xfc,0xcf,0xdb,0x1f,0xb6,0x88,0x8b,0x03,0x10,0xa9,0x13,0x17,0x0f,0x7e,0x36,0x68,0x16,0xda,0xeb,0xe7,0x65,0x0d,0x72,0x51,0x3d,0x95,0x06,0xe6,0x6f,0x7d,0x62,0x20,0x8a,0x49,0xec,0xe0,0xaf,0x18,0x71,0x49,0x7f,0x45,0x41,0xef,0x60,0x5b,0xde,0x71,0x1c,0x9e,0x0a,0x12,0x05,0xef,0x48,0xf2,0x6c,0x03,0xdc,0x1a,0xd4,0xaf,0x03,},"\x91\xb5\x00\x9e\x83\xd0\xf6\x10\x33\x99\xc2\xd3\xfe\xec\x00\x84\x97\x3a\x30\x5b\xf4\x17\x6e\xc7\x82\x53\x75\x60\x47\x2d\xb1\x87\xa1\x1b\x4d\xcb\x4b\x2f\xfb\x7f\x06\x44\xfe\xb3\x94\xb2\x8e\x5b\xfe\x97\x24\x7c\x4a\x4a\x23\x1c\xf6\xe9\x16\xbf\x99\x34\x4c\xcd\xa8\x8a\x7f\x5d\x83\x1d\x6d\xe3\xd5\x63\xdd\x10\x2e\xae\xb1\x08\xc5\xbd\xce\x44\xe0\x63\x2d\x17\xe6\xfa\x55\xb1\x80\x67\xdf\x2f\xa8\xd2\x00\xa9\x86\x9f\x6a\xff\x92\x0c\x51\xd4\x6a\x1c\xed\x2d\x90\x3b\x1d\x9b\x6b\x07\x5f\xac\xbf\x91\xcd\x05\xeb\x41\xad\x81\x1a\x8e\xf4\x0d\x91\x18\x26\x10\x12\xc7\x2b\x89\x79\xf1\x51\x53\xdb\xb8\x56\x12\x93\xda\x9f\x8b\x77\xc8\xff\x14\xf7\x53\x87\x53\x6f\x00\x36\xd1\x71\x3a\x72\xce\x8c\x35\xb1\x06\x2f\x2c\x67\x32\xae\xbf\x32\x93\x67\x99\xb5\x1c\x2c\xbc\xd6\x57\x24\x13\xe7\xdf\xaa\xb8\x64\x1a\x02\xc1\x50\x23\x73\x81\xcf\x7a\x14\xe2\x2c\x74\xc6\xc2\x00\x09\xde\x7d\x3b\x7e\x69\xcd\x1b\x45\x84\xac\x2c\x01\xba\xba\xf9\x73\xc5\x6b\x38\x14\xbb\x00\x89\x72\x0e\x41\x96\x81\x06\xcf\x26\x50\x9d\x4a\xa5\x46\xfc\xad\x55\x34\xaf\x30\x3f\xfc\xa4\x2b\x16\xae\x6c\x93\xee\x06\xbc\x3c\xac\xe1\x2e\x4e\xc7\x18\x84\x4b\xd3\x0d\x22\x24\xcc\x48\x6d\x10\x6d\x1c\x45\x6b\xfa\x16\x5e\xa0\x12\x0f\xab\x3d\xf2\xc5\xab\x3a\x52\x3b\xbf\xa7\x89\xde\xed\x44\x03\x2a\xb0\xbe\x86\xeb\x7c\xc0\x9c\xdb\x7c\x07\xaa\x94\x8d\xd5\x27\x7c\x3d\xf1\xd9\xd1\x84\x35\x67\xde\xc8\x4f\x92\x88\xe0\x85\xb0\x5a\xe4\xb8\xaf\x2c\xea\x5d\x9a\x18\x4d\x50\xbe\xf8\x55\x50\xc8\x36\x61\x3d\x5d\x3a\xf5\xf9\xc2\x92\x8e\x6a\x89\x66\x0f\xa6\x27\x19\xeb\xff\x77\x3e\x46\xb7\x7e\x34\xbc\x04\x70\xda\x4d\x2c\xdb\xc7\x07\x1d\xa7\x58\xc4\xd3\x9f\xe6\x52\x01\xc8\x8a\xaa\x8e\x66\x03\xd0\xbb\xe7\xc3\xe9\xb2\xd9\xe4\x1b\x63\x46\x82\x09\x2f\x14\x73\x41\xad\x6d\x66\x7f\x20\xc6\x4e\x81\xa6\x8d\x62\x94\x67\xa5\x4d\xd8\x6e\x1c\xe1\x2c\x56\x0a\x6f\x9b\x64\x51\x2d\x6f\x38\x86\xcb\xb9\xf3\x7c\x37\xeb\x39\x85\xc8\xac\x38\xdd\x66\x82\xf4\x8f\xe1"}, +{{0xfa,0x1e,0x11,0xdc,0x83,0x64,0x20,0x8d,0x8e,0x1c,0xb6,0x6a,0x36,0x1b,0xe7,0xe8,0x4c,0x5e,0x36,0x81,0x66,0x58,0x7d,0x4f,0xdb,0x06,0xac,0xed,0x7f,0x62,0xe1,0x7c,},{0x4d,0x8e,0x6f,0x4b,0x34,0x15,0xdf,0x6c,0xed,0xab,0xfb,0x29,0x5c,0x19,0x84,0xfd,0x41,0x99,0x23,0xc6,0xac,0x41,0x76,0x4e,0x32,0xd2,0x2d,0xaf,0x37,0x2c,0x50,0xfc,},{0xe8,0x57,0xdb,0x08,0x7e,0x28,0xd6,0x75,0x0b,0xf5,0x4e,0x53,0x79,0x72,0x51,0xd8,0x43,0x99,0x89,0x57,0x6c,0x12,0xda,0x2d,0x9c,0x81,0x1a,0x14,0x87,0x7c,0x3b,0xd4,0x6c,0x4e,0xfa,0xb8,0x61,0xa1,0x0e,0xeb,0xe7,0xda,0x04,0xc0,0xb0,0xb4,0x45,0xc7,0xa3,0x90,0xa5,0x0c,0x13,0xde,0x36,0xf3,0xa3,0xc7,0xae,0x01,0x57,0x02,0x2c,0x0e,},"\x29\x4e\x63\xba\xcc\xcb\x80\x1b\xbf\x04\xc1\xf1\x9d\x0a\xee\x16\xf5\x65\x0a\x6e\x8e\xea\x6f\xe4\x11\x10\x66\x3e\xc0\x15\x32\xbd\x49\x60\xa5\x27\xf1\x5e\xca\x4a\xf2\xf4\xe6\xb7\xb0\xfc\x34\x0c\xf9\x7a\xa2\x34\xe9\x2c\xf7\xd6\x9d\x50\xe4\x00\x9c\x24\x96\xe3\xed\x4d\x9a\xff\x00\x0f\x9e\x18\x52\x75\xb8\x17\xd2\x6a\x0b\xab\x69\xb7\xf7\xee\x1e\xa3\x0d\xae\xc8\xbc\xee\x38\x7a\xe4\x6b\x4b\x29\x9c\x27\xbd\xc0\x6e\xea\x63\xf2\x4d\xbe\xe9\x55\xa6\xc0\x96\x90\x37\xee\xf9\x1c\x34\x32\x1e\x3c\x5c\x97\x2f\xde\x99\x31\x83\xb7\xd2\x3f\x6e\x01\x9c\x3e\x0c\xac\x75\x89\xae\x4a\x15\x21\xaf\x87\xea\x42\xdf\x8c\x22\xc2\x27\x0e\xc2\x3d\x6d\x14\x0f\x9c\xf6\xd4\xd5\x2f\xac\x1b\x9d\x6c\x89\x39\xef\x81\x31\xcb\x62\xa0\x35\xc5\x26\x15\x38\xbc\xdf\xd6\xdb\x41\x9a\x55\xef\x9f\xe5\xd7\xa5\xac\x44\x57\x9d\xe7\x00\x85\x8d\x74\xa3\x43\x48\x44\xf2\x83\x42\xc5\x65\x89\x27\x22\xe2\x7f\x40\x7d\x7f\x17\xb7\x4a\x59\x34\xbe\x91\x5b\x20\xc2\x40\x06\x43\x23\x5f\x8a\xb5\x79\x5f\x32\x4e\x33\xc5\x06\x44\xa0\x40\x33\x54\x2c\xb3\x81\x6d\x77\x0f\xa8\x99\xe7\x31\x1c\x14\x30\x1c\x1b\xd0\xf5\xaa\x60\xa2\xeb\x31\x65\x68\x0c\x72\x0e\x1e\xfa\x80\x96\xfc\x25\xd2\x77\x92\x75\xf1\x84\x2b\x2d\xb5\x3b\x4d\xa0\xad\x3e\x59\xc0\x75\x40\xc2\x84\x60\xce\xc1\xfd\xd3\xcd\xb7\xa3\x47\x8b\x91\xa9\xca\xf9\xac\x89\x1c\xdf\x3a\xea\xee\xca\x9a\x96\x56\xac\x13\x07\x25\x99\x22\xfc\xa7\x4c\x5c\xc6\x9f\x7e\x25\xc6\xbf\x58\x79\x73\xa4\xb7\xd3\xe3\xac\x06\x35\xb0\xdb\x22\xa0\x09\x3a\x79\x07\x68\x81\xc7\x17\x36\xee\x1d\x4d\x45\xf8\xed\x2d\x29\xa0\x67\x1a\x64\xe6\xca\x2f\x7a\x5e\xf4\x04\xb1\xed\xeb\x84\x20\x34\xf5\x71\xb6\x99\xbc\x59\xe5\xa3\x7d\xf0\x20\x54\xe8\x48\x2b\xf1\xe7\xb7\x7d\x8e\x83\x97\xda\x15\xd8\x9d\x73\x55\xa5\xdc\xe8\x6b\x16\x83\xa9\xac\x4e\x40\x6c\x08\xa9\x4a\x6e\xb0\x0e\x5a\xe1\x6d\x96\x72\x29\x72\xe5\xc5\x0c\x7b\xee\x4a\x84\xd0\x69\x7b\xbe\x67\xce\xb7\xef\x29\x5f\x06\xaa\xea\x5a\xbb\xa4\x44\x66\xbe\x0f\x67"}, +{{0x24,0xa9,0x14,0xce,0xb4,0x99,0xe3,0x75,0xe5,0xc6,0x67,0x77,0xc1,0xed,0x20,0x43,0xbe,0x56,0x54,0x9d,0x5e,0x50,0x2a,0x84,0x47,0x10,0x36,0x40,0x42,0xba,0x9a,0xcb,},{0x20,0xd2,0x1e,0xe7,0x64,0xb1,0xf3,0x5f,0x94,0x56,0x82,0x00,0xd6,0x3b,0xd5,0x82,0x8a,0xca,0x8c,0x5d,0x3e,0x90,0x47,0xd2,0x3f,0x47,0x8b,0x92,0x52,0x95,0xfa,0x2e,},{0x3a,0xe0,0xcc,0x7b,0xca,0x8d,0x73,0xbe,0x83,0xa9,0xb8,0x09,0xb1,0x33,0x38,0xc1,0x27,0x06,0xaa,0xef,0x75,0xc4,0xd1,0xa4,0x78,0x17,0x8f,0x9d,0xc5,0x65,0x51,0x4c,0x75,0x29,0xe2,0x98,0x04,0x3e,0xa7,0x8d,0x21,0xa5,0xa0,0x9d,0xd0,0x4f,0x10,0xae,0x87,0x44,0x1e,0x56,0x86,0xa9,0x33,0xc9,0x2c,0x75,0x54,0x84,0x27,0xad,0x3a,0x03,},"\x3f\xf9\xf6\x6f\xa2\x64\x6e\xc6\x6a\x1b\xf9\x33\xc2\xb4\xcc\x0f\xbf\x91\x2b\x4d\x6d\xb5\x05\x34\x25\x7f\x97\xd0\x1e\x69\x8d\x05\x48\x57\x47\xde\x25\x44\xe9\xf5\xa4\xa4\xa0\x75\x38\x8c\xf4\x40\x0a\xb8\x9b\x03\x53\xce\x86\x19\x82\x02\xdb\x3a\x90\x37\x67\xb8\x79\xa2\xaf\x9d\xaa\x15\x58\x43\x11\x1a\xf1\x5a\x2b\xc3\x5e\xfe\x41\xbc\xc9\x2c\x82\x07\xe0\x01\x13\xb0\x4f\x13\x03\x00\x79\x49\xff\xb6\xce\x8d\xf4\xb0\xb3\x42\x48\xfe\xdf\x5d\x9c\xb2\xce\xe9\x4b\x81\x2e\xd5\x8e\xce\x2a\x0c\xe0\x45\x4c\xf1\x4c\x20\xe4\x9e\x09\xfe\x66\x4d\x6e\x25\x76\x2e\x87\x89\x59\x32\xcd\x5c\xd3\x2e\xb6\xa3\xab\xb3\x8e\xe1\x63\x07\x8c\x13\x3e\x93\x58\x87\x91\xdb\xf6\xaf\x49\x9a\x31\xea\x44\x53\xbb\xcc\x7a\x85\xe4\x06\xc9\x84\x8a\x66\x40\x52\xf1\x11\x13\xfb\xb4\xff\xa7\x60\xde\xe4\xc2\x61\xe3\x96\x94\x24\x91\x11\x9d\xa2\x9a\x33\x58\x2f\x82\x1d\x41\x25\xe0\xb4\x16\x2f\x28\xbe\xb0\x66\x03\x1a\x65\x2d\x05\x74\x9a\xa7\x24\x4d\xd4\xf3\xd3\xbb\x15\xd2\x68\x32\x8d\x6a\x02\xfc\xe2\x50\x18\x15\x25\x7f\x8a\xd5\xaf\x4e\xcb\xe7\xcb\x8a\xe9\x66\x1e\x34\x4f\x90\x72\x31\x87\x91\xf3\xe8\x59\x09\x11\x21\xe0\x8a\xef\xca\x89\x82\xea\xaf\x66\x25\x9d\x9d\xe4\xf4\x6a\x31\xe7\x16\xdc\x03\x3d\x0f\x95\xd1\xfa\x93\x6b\x6c\x60\x79\xb1\x37\xdd\x11\x58\xd1\xde\xf1\x13\x01\x8c\x73\xf8\xeb\xb9\x80\x7e\x0f\x74\x15\x40\x4e\xa9\xc7\x85\x44\xac\xe7\xce\x46\x3c\xd1\xd1\xc5\x7e\x31\xf4\x09\x1b\xc0\x91\x80\x4c\xbc\xdd\xad\x0e\x15\xa4\x0c\xa9\x1a\xcb\xe1\xc6\x22\x4e\xd1\x3c\xaf\xb4\xdf\x2c\x84\xac\x9f\x0c\x3c\x9b\x54\x60\x07\xd9\xdd\x6e\x52\x4c\x46\x70\x72\x56\x3d\x4a\xc0\xd7\x00\xcc\x1b\xf3\x0f\xeb\xb3\x34\x31\x3d\xae\x57\x61\x74\x5e\xc0\xa5\xe9\xe8\x81\x50\x25\x95\x8f\x00\xfa\x2e\x58\x06\x0d\x7e\x9a\x5f\x2b\x72\x7f\x48\x69\x9f\x92\x9c\x84\x59\x93\x08\x92\x57\x3f\x78\x4f\xef\x56\x92\x51\x8b\x5c\xa2\x68\xe2\xa7\x3e\xbe\xad\x6e\xbd\xeb\x7e\xc2\x4e\xac\x92\xaa\x7d\xcb\x41\xb5\x98\xbd\x6e\xff\x36\x32\xd0\x69\x72\x62\x91"}, +{{0x55,0x32,0xe0,0x9b,0x93,0x7f,0xfd,0x3d,0x5f,0x4c,0x1d,0x9f,0x1f,0xfc,0xde,0xd2,0x6e,0xe7,0x4d,0x4d,0xa0,0x75,0x26,0x48,0x44,0x69,0x0b,0xd9,0xc8,0x61,0x39,0x94,},{0x50,0x93,0x96,0x9f,0x37,0x7b,0xec,0x3e,0x35,0xf5,0x9e,0xfd,0xa0,0x1a,0xb4,0x18,0x6c,0x5d,0x2a,0x36,0x74,0x0c,0xf0,0x22,0x67,0x5e,0x01,0x09,0x6b,0x1a,0x3f,0x0a,},{0xd5,0x27,0xff,0x0d,0x4a,0x21,0x9d,0x61,0xf4,0x18,0x12,0x12,0x06,0xa5,0x4a,0xe4,0x98,0x58,0x54,0xa3,0x10,0x48,0x27,0x44,0x48,0x6e,0x4d,0x13,0x0a,0x7d,0xe9,0x7c,0x31,0x9d,0xf8,0x37,0x2c,0x82,0x82,0x8c,0x93,0x6e,0x6a,0x8a,0xfd,0x9c,0x5d,0xe1,0x82,0x85,0x73,0xd8,0x26,0x1a,0xe9,0x36,0x5b,0x8f,0x23,0x76,0x76,0x18,0x24,0x02,},"\xad\xd4\xd7\xa9\xce\x3f\x63\xd1\xf9\x46\xe8\x67\x90\x65\x54\x5d\x8c\x7b\xf0\xa2\xcc\x3a\x4c\x00\xb8\xf1\x42\xf0\x94\x5a\xe3\x62\xc4\xc9\x46\x2a\x75\x76\xa4\x05\x9d\x57\x86\x16\x62\x88\x4b\xd8\x0b\x96\xd9\x0d\x27\x9a\x95\x2e\xda\x95\x2d\x37\xd4\xf9\x5c\xf0\xd7\x0d\xa9\x8f\x4f\xba\xca\x39\xe1\x69\xf9\xd9\x45\xd4\x1f\x87\x23\x97\xbb\xdd\x57\x01\x45\x43\x03\xd7\x7d\x31\xe8\x63\x48\x27\x1d\xa4\x0a\x1b\x8f\x1e\x57\xc3\x6f\xcd\x80\x3e\x14\xfa\x17\x71\x6c\x56\x31\xef\xa0\x1d\x3a\x79\x5d\xc2\x0b\x2b\xde\x36\xab\x73\xff\x6a\x2d\x53\x3b\xc1\x5c\xce\x22\x32\x87\x13\xc3\xc9\xcc\xd0\x72\xc3\xe4\x50\xd7\xf2\x2c\x0c\x9f\x94\x91\x97\x52\xcb\xfe\x45\xee\x65\x5d\x1b\x53\x67\x65\x93\xcd\xb4\x48\x70\x41\x02\x63\x1c\xaa\xa9\x76\x95\x2e\xaa\x1f\x6c\x2e\x87\x65\x64\xe4\x20\xf0\xc6\x46\xa0\xf8\x83\x65\xf7\x64\x15\xb4\x08\x5f\x60\xa3\x38\xb2\x9c\x51\x63\x3e\x54\x0f\x0b\xf3\x2d\x40\x87\xe7\xd0\xfb\x68\x5b\xe8\x8c\x75\x95\xdc\x53\x1c\x99\xb4\x89\x58\x45\x60\xad\x82\x34\xb1\x8e\x39\xa1\x07\xcf\x5d\x84\x2d\xab\xd4\x21\xe7\x7d\x26\xea\x5e\x0f\x14\x05\xce\x35\xfe\x79\x27\x14\xeb\x4e\xe1\xa8\x01\x76\x48\xac\x1a\xe7\x39\xa3\x3d\x7b\x1e\x08\x91\x05\xd1\xe5\xad\xd2\x7a\x62\xce\x64\x15\x45\x70\x34\x0a\xf9\xeb\x14\xe7\xfd\xfc\x2f\x9a\x2c\x2f\xcf\xcd\xac\x3c\xc4\x22\x77\x63\xf4\xd6\x29\x49\x74\x79\xf8\x49\x21\x6e\x5d\x90\xec\x16\xdf\xa3\x6b\x72\x51\x7f\x7b\x54\x86\xba\xee\x7f\xda\x44\x50\xc3\x52\xcf\xfb\xba\xe7\x39\x26\xc8\x43\x22\x4f\x8c\xe4\x4b\x38\xda\xe5\x3f\x3e\xad\x21\x89\x0b\x52\xa7\x80\x10\x75\x29\x16\x84\xfd\x59\x10\xed\x86\xad\x33\xe8\xa0\x07\xf6\xc3\xf8\x5c\x16\xb2\x09\x29\x37\x40\x18\x4f\x58\x90\x87\x4d\x43\x1c\xd4\xe0\xea\x40\x87\xc4\x9c\x34\x71\xd7\x89\xc8\x13\xc6\xdc\x9a\x78\x69\x93\x63\xa1\xd8\x71\x97\xd3\xb9\x2c\x02\x86\x68\x93\x11\x82\x3f\x4d\xf2\x2c\xe8\x03\x5e\x75\x73\x2c\xde\xa7\xf5\x62\x1f\x67\xdb\x0e\x2a\x4c\xa6\x61\x61\x93\x22\x1c\x0a\xa3\xd6\xde\x50\xd8\x52\x82\xee"}, +{{0xeb,0x36,0x51,0x10,0x09,0xd3,0x7a,0x9c,0x46,0xc4,0xd1,0x37,0x4d,0x0b,0xbd,0x0d,0x99,0x81,0xe7,0x8c,0xee,0x7d,0x18,0x8c,0x5a,0xab,0x98,0x3e,0xc2,0x39,0xe1,0x0c,},{0xb1,0xcc,0x21,0x2b,0x45,0x21,0xbb,0xe7,0xb1,0x9a,0x76,0x93,0x87,0x8a,0x55,0x84,0x40,0xee,0xc3,0x62,0x05,0xd8,0x43,0x9d,0x04,0x0a,0x46,0xa9,0x90,0x2f,0xbf,0x55,},{0x9f,0x58,0x37,0x24,0xde,0x55,0x2e,0xae,0x82,0xf2,0x54,0xac,0x6e,0x2e,0xd4,0x83,0xec,0x1a,0x07,0x34,0x62,0x66,0x73,0x5c,0x49,0x09,0x20,0x69,0x0c,0x1e,0x3f,0xb2,0xa9,0xe9,0xa3,0x41,0x94,0xed,0x64,0x73,0x73,0x3b,0x30,0x0d,0x4f,0x23,0xc9,0xae,0xc0,0xda,0x5a,0x20,0x22,0x05,0x4c,0xa4,0x38,0x85,0xa1,0x5a,0x29,0x84,0x32,0x0e,},"\xba\x24\x66\xe5\x6c\x1d\xf7\x7f\x22\xb6\xf0\x24\x1f\xc7\x95\x2a\xe9\xbc\x24\x75\x64\x19\xa9\x44\x6d\xd2\xb4\x9e\x2c\xb9\xdf\x59\x4e\x5b\x6c\x77\xa9\x5a\xa5\xfb\xd9\xdc\x57\xfe\xc8\x39\x62\xc7\x75\x1e\xeb\xb4\xba\x21\x82\x53\xf9\x16\xa9\x22\xa5\x13\x96\x63\xe3\x20\x3e\x3b\xe4\x82\xbe\x37\x9c\xa1\x51\xc4\x63\xd9\xad\xa2\x14\x46\x13\x5f\x35\x69\x94\xfa\x54\x49\xf0\x84\x47\x8f\x5b\xb4\xf5\xba\x61\x45\xc5\x15\x8e\xb7\xb1\xc4\x3c\x32\xeb\xea\x25\xe0\x9c\x90\x0f\x01\xef\x91\xe9\x2f\x88\xc0\x3c\x76\x50\x4a\xce\x96\x46\x01\x6f\xfc\x27\x89\x55\x9d\x0f\x3c\xc9\xd0\x0f\xb6\x1b\xdc\x6a\xf7\xd3\x94\x0f\x30\x2e\x58\x8e\x04\xf7\x9f\x7b\x3d\x4b\x91\xa5\xd1\x93\xa4\xf8\x22\x2b\xfe\xb6\x9b\xf0\x34\x7d\x98\xad\x81\xef\x99\xd1\x30\xeb\xc7\xb3\x6b\x07\x83\x39\x4e\xea\x92\xa3\x8d\xdd\x5e\x74\x80\xd2\xad\xd4\xe4\xde\xf5\x3e\xb9\x9c\x44\x9b\xff\x94\xe4\x71\x8b\x09\xf2\xea\x9b\x1f\x2b\x88\x65\x94\xa9\x5c\x33\xa6\x9e\x03\x33\x15\x4e\x44\x0a\xb3\x4b\x7b\x6c\x11\x34\xd8\x17\x9b\x6f\x0c\x56\x25\x1a\x9a\xd8\xe1\xb6\xb0\xf9\xb8\xa5\xc9\x70\x81\xa7\xf8\xfd\x05\xd0\xb0\xaf\xfc\x82\xdb\xdd\xc8\xb0\xc0\xab\x7e\x83\x3f\x30\x06\x26\xd4\xb9\x73\xb3\xf6\x0f\xea\xc5\x55\x71\xe8\x9c\xda\x0f\x2b\x44\x1e\xd2\xfa\xa6\x69\xa7\x0d\x55\x6c\xb4\x8f\x9b\x1d\x1c\xbc\xe3\x2e\xde\x5d\x16\x6b\x11\x43\xe2\x64\xb1\x1e\xa3\x27\x68\x1c\xb5\x59\xed\xd1\x3c\x36\x4b\xd2\xba\xf1\xfd\x54\xbb\x78\x18\x07\xbd\x59\xc8\x68\xb0\xe4\x79\x5a\x77\x9e\x67\xf0\xbd\x0d\x14\xb5\xa6\xb9\xe4\x40\xb5\x7a\x58\x23\x32\x8b\x59\xaf\xfb\xd0\x27\xed\xa7\xdd\x78\x50\x79\xc5\xf0\x2b\x5e\x32\x89\x0b\x03\x87\x30\x98\x6a\x39\xa5\xa9\x83\x4a\x3f\xed\x86\x8b\x6f\x45\xcb\xdd\x28\xac\xb2\x70\x9a\xff\x55\x62\x63\x86\x4f\x9a\xe1\xe7\x57\xb3\x27\x8c\x28\x8d\xbe\x29\x32\x82\x57\x12\x77\x3e\x43\x1f\x7c\x29\x32\x98\x57\xfd\xae\xa7\x98\xed\x93\x92\x08\x93\x63\x14\x02\xe6\xb1\x3b\xab\x62\xb4\x85\x54\x61\xed\xb9\x46\x20\xf2\xd1\x75\x18\x65\xf4\x45\xc4\x66"}, +{{0x7d,0xbc,0x81,0x90,0x2e,0x4e,0xaa,0xb3,0x07,0x75,0x40,0xf5,0x59,0x99,0x5c,0x38,0x74,0x03,0xca,0xc3,0x06,0xd4,0x86,0xe9,0x59,0xc5,0xeb,0x59,0xe4,0x31,0xc0,0xa8,},{0xe0,0x30,0x66,0x13,0x90,0x82,0xf6,0x13,0x44,0x8b,0xdb,0xc2,0x7f,0xe5,0x3a,0xa3,0xf8,0x89,0x94,0xc3,0x1d,0xdc,0xe0,0x02,0xe3,0x6b,0xbb,0x29,0x63,0xdf,0x3e,0xc8,},{0x5b,0x7f,0x65,0x2f,0x08,0xf2,0x29,0xfd,0xa1,0xb0,0xbd,0x75,0x93,0x77,0xb3,0xfb,0x72,0x6c,0x1b,0x9c,0x9a,0x10,0xef,0x63,0x42,0x6d,0x35,0x2d,0xd0,0x86,0x9b,0xd5,0x4d,0x87,0x6c,0x30,0x92,0xf1,0xcd,0x41,0x1c,0x37,0x57,0xd3,0xc6,0xb6,0xea,0x94,0x2a,0xa7,0x0c,0x3a,0xae,0xb4,0x21,0x7a,0x4c,0x73,0x64,0xd1,0x8e,0x76,0xe5,0x0f,},"\xdf\xf7\x98\xb1\x55\x7b\x17\x08\x5a\x06\x34\x37\x1d\xed\x5d\xdf\x7a\x5a\xcb\x99\x6e\xf9\x03\x54\x75\xe6\x82\x63\x36\xf6\x4a\xd8\xb8\x4b\x88\x2e\x30\xba\xde\xc2\xb4\xa7\x11\x99\x87\x52\xf4\xa1\x57\x4b\xc1\xf8\x9d\x43\x25\xcf\x2b\x39\x86\x10\x44\xdd\x03\x69\x1e\x71\xd0\x77\x68\xb5\x93\x3a\x30\x52\xcc\x7c\x81\xd5\x71\xa9\xde\x06\x1d\xc1\x90\x26\xc2\xf1\xe7\x01\xf2\xdc\xf2\x6a\x88\xd3\x40\x1b\xc9\x9f\xb8\x15\x59\xdc\xa7\x6d\x8a\x31\xa9\x20\x44\xa2\x73\x58\x7d\x62\x2a\x08\xd1\xcc\xe6\x1c\x8f\x94\x8a\x34\xde\xd1\xac\xb3\x18\x88\x1c\x9b\x49\xf6\xf3\x7c\x30\xa6\x5d\x49\x5b\x02\xd5\x42\x9e\x7a\xb4\x04\x0d\x8b\xeb\xeb\x78\x79\x4f\xf7\x36\xd1\x51\x10\x31\xa6\xd6\x7a\x22\xcd\xf3\x41\xb9\x80\x81\x1c\x9d\x77\x5f\xb1\x9c\x64\x78\xf0\x5e\xd9\x84\x30\x10\x3e\xa2\x4c\x0f\x41\x4d\x4c\xc0\x7d\x86\x0b\x72\xdc\x54\x2f\xf2\x2d\x83\x84\x5a\x42\xf8\xba\x45\xca\x7f\xf3\xaa\xb0\xb1\xe7\xde\x2b\x10\x94\xde\xac\x08\xd1\x6e\xee\x01\x96\x9f\x91\xbc\x16\xfe\xc2\x9c\xcc\x06\x1c\x54\xdb\x53\x45\xba\x64\x84\x2d\xac\xc9\x9e\xe7\x72\x94\x68\xd8\x0a\x3f\x09\x55\x83\xd8\xe8\x01\x24\x08\x51\x9d\x58\x2c\xc3\xff\x9a\x2e\xb7\xae\xba\xa2\x2d\xb8\x1f\xfc\x78\xee\x90\xef\x4e\xc5\x89\xdc\xce\x87\x11\x8d\xab\x31\xa6\x32\x8e\x40\x9a\xd5\x05\x9a\x51\x32\xc8\x2d\xf3\xce\xfe\x2e\x40\x14\xe4\x76\xf0\x4c\x3a\x70\x18\xe4\x52\x67\xec\x50\x18\xec\xd7\xbf\xf1\xdd\xa9\x26\x7e\x90\x66\x6b\x6b\x14\x17\xe8\x9d\xda\xcb\x50\x85\x94\x3b\xef\xc7\xad\x2f\x4d\xf5\xf1\xee\x0a\xf9\x43\x1a\xee\xb6\xb2\x4a\x55\x15\xb9\x3d\xbc\xf6\x86\x40\xf7\xda\xf8\xc9\x61\xe5\x67\xd7\x53\x49\x00\x20\x5c\x3d\xf2\x18\x4b\x6a\xc2\xda\x96\x1c\x4c\x1d\x2b\xc4\x9b\x4e\xa9\x6b\x81\x54\xff\xd4\xef\xff\xdc\x5e\x55\xa7\x11\x9c\xb8\xaf\x42\x9e\x85\x10\x5d\xff\xd4\x1f\xe4\xa2\xeb\xba\x48\x16\x8a\xa0\x5f\xa7\xdf\x27\xc4\x29\x87\x35\xff\x86\x8f\x14\x96\xbe\xb4\xb2\xed\x0b\x89\x80\xc7\x5f\xfd\x93\x9d\xdd\x1a\x17\xe4\x4a\x44\xfe\x3b\x02\x79\x53\x39\xb0\x8c\x8d"}, +{{0x91,0xb0,0x95,0xc8,0xa9,0x99,0xe0,0x3f,0x3e,0xd7,0x49,0xcd,0x9f,0x2f,0xaa,0xcc,0x00,0x76,0xc3,0xb4,0x77,0xa8,0x7a,0xb5,0xcc,0xd6,0x63,0x17,0x38,0x76,0x74,0x46,},{0xda,0xd1,0x74,0xd3,0x59,0xda,0xec,0xca,0x9c,0x6b,0x38,0x9b,0xa0,0x96,0x45,0x2a,0xb5,0xca,0x91,0xe6,0x38,0x3c,0x6d,0x04,0x2a,0x28,0x4e,0xce,0x16,0xba,0x97,0xb6,},{0x64,0xee,0x9e,0xfd,0xb0,0xc2,0x60,0x1a,0x83,0x5f,0x41,0x85,0x20,0x64,0x1e,0x43,0x6c,0x7d,0xd4,0x7c,0x33,0x3d,0x9f,0xc3,0x0c,0xfb,0xb9,0xe3,0x90,0xfe,0x76,0x45,0x30,0x65,0x47,0x08,0xb4,0x0b,0x03,0x58,0x18,0x99,0xa9,0xac,0x87,0x0e,0xfd,0x76,0x6f,0xfb,0xb4,0x63,0x71,0x52,0xf8,0xff,0x27,0x79,0x64,0xfe,0x35,0x42,0x52,0x09,},"\x9b\x0d\x8b\x00\x29\x98\x52\xd6\x8b\xbf\x49\x7f\xe6\x03\x96\x1a\x48\x54\x66\xa9\x9a\x54\x84\x00\x5d\xb7\x3d\x4e\x4b\xad\x81\x4e\x85\x74\xef\xd5\x4d\x64\x8b\xd5\xc9\x1a\xe8\x48\x3c\x54\xb2\xf9\x98\xb0\x2e\x1a\xbd\x6f\x40\x1a\x25\x52\x68\x43\xa5\xf2\xa2\x3a\x97\xbd\x58\x9d\x1f\x7e\x1a\xb1\x49\x15\xb1\xe3\x59\xa3\x96\xd3\x52\xc3\x60\xae\x65\x84\x32\x5a\xe4\xbb\x7d\x62\x4f\x61\x25\x5c\x5c\x7b\xf0\xa6\x7a\xca\xb4\x6c\x3b\x57\xb3\x45\x34\xc0\xee\x84\x31\xd2\x60\x57\x66\x06\xcb\xd8\x4d\x8d\x18\x39\xe7\x3d\xa6\xfe\x4b\x0b\x8b\x78\xf0\xf9\x58\x82\x7c\x2f\x1d\x93\xba\x7a\x34\x6d\xcc\x75\xcb\x56\x3d\xff\xde\x26\xf9\x97\x59\x8e\x8b\x5c\x2f\x16\x17\xc6\xfe\xfc\x9b\xe4\xb2\x8b\x54\x01\xb0\x00\x64\x13\xa2\x51\x69\x0d\x12\x03\xaa\xae\x4f\x6d\x8a\x3f\xb2\x1f\x24\x00\x9a\xb3\xbf\xf1\x37\x37\xa8\xa7\xe6\x64\x6c\x02\x73\x2d\x9e\xc5\xa4\xa5\x10\x46\x9e\x2d\x29\x9e\x4c\xc1\xad\x64\x80\xa4\x82\xaa\x95\x6f\x89\xdd\xcc\xcc\x64\xa1\x36\xfb\x15\xb8\x76\xb6\xec\xd8\x8c\x7c\x86\xa4\xdf\xc6\x0e\x66\x62\x07\xc6\x04\x16\x7d\x16\x34\x40\xca\x9a\xb9\xcf\x87\xa5\xe0\xf7\xbb\xc5\x51\x7d\xe4\xde\xe8\x76\xc0\x37\xf8\xcc\x9d\x95\x9c\x8f\xf5\xdb\xe9\x44\xff\x54\xcd\x91\xa7\x71\xe2\x92\x31\xf8\xb5\xf1\x7d\x61\xde\x90\x4c\x95\x5f\xe2\x02\x5d\xc5\x2e\xd4\x80\xfb\x3c\xc9\x0f\x23\x24\x59\xc6\x07\xef\x7e\x2a\xdb\x52\xc7\x48\x2b\xec\xd6\x7a\xd2\x14\x9a\x41\x28\xf9\x84\x03\x8b\x58\xaa\x90\x17\x67\x82\x39\x36\x04\xaa\xc7\x4c\x18\x20\x9a\x3d\x6a\x78\x63\x0c\x01\x95\x5a\x7c\xec\xe5\xda\x83\x84\xda\x3b\xaf\x63\xaa\x2d\xdf\x59\x63\xfa\xe0\x5b\xa3\xb8\x1c\x6a\x03\xd8\x6a\x00\xef\x78\xed\xb4\x18\x4f\xdc\x89\xb1\xd6\xbf\xeb\x31\x0f\xd1\xb5\xfc\xce\x1e\x21\x95\x24\xa3\xcf\xb2\xe9\x72\x57\x7f\x06\xb1\xdd\xde\xba\x00\x86\x5d\xae\x49\x79\x00\x0c\x00\x8a\xd9\x9f\x3b\x63\x8c\xce\xb8\xe8\xc7\xa0\xf9\x98\xd3\x4d\x92\x14\x3d\x81\xc0\xe1\xc0\x96\xa9\x25\xce\xba\x65\xc4\x30\x03\xee\x18\xd4\x94\xd0\x03\xe9\xc6\x1f\x77\xd6\x57\x59"}, +{{0x8c,0x56,0x8b,0x31,0x0a,0xce,0x7d,0x1f,0x0e,0xde,0xce,0xfd,0x60,0x3a,0x88,0x40,0x00,0x54,0x4c,0x79,0x25,0x65,0xd4,0x81,0xc3,0xd3,0xe0,0x6e,0x2d,0x82,0xca,0x96,},{0x5f,0xa6,0xe2,0x67,0xc7,0x66,0x73,0x68,0x41,0x41,0x10,0x72,0xd1,0x98,0x3d,0x19,0x00,0xac,0xf0,0x1d,0x48,0xc3,0xce,0x11,0x77,0x0b,0x26,0xf7,0x8d,0xa9,0x79,0xf7,},{0xde,0xbd,0xd8,0xe5,0xd3,0x11,0x2f,0xd7,0x7b,0x39,0x4a,0xa0,0xe3,0x6e,0x94,0x26,0xba,0xc9,0x1d,0xf1,0x26,0xfa,0x9c,0x31,0x7c,0xea,0x7c,0x9d,0x45,0x95,0x7c,0xdd,0x96,0xa4,0x5a,0xe3,0xad,0x76,0x04,0x13,0xee,0x12,0x05,0xaf,0xd7,0x1a,0x29,0xf9,0xc3,0xcb,0x58,0x6c,0xd2,0xd7,0xcd,0x1e,0x93,0xbc,0x16,0x52,0xfc,0x34,0xdc,0x04,},"\xb5\x9f\x5f\xe9\xbb\x4e\xcf\xf9\x28\x95\x94\x72\x1f\x26\x47\x04\x7b\x0d\xa5\xe0\xe4\x94\x1b\xbe\x57\xc5\xb7\x22\xb4\x76\x72\x3f\x0a\xc5\x97\x0b\x41\x11\xf8\x93\xbc\xaa\x41\x1f\x28\xfc\xeb\x4f\x58\x5a\x2a\x71\x87\x01\x8a\x90\x4b\x70\xef\x8f\xe1\xf6\x56\x9a\x54\xd0\x0a\xda\x37\xb6\x9c\xb5\xe9\xc9\xd2\x6c\x16\xa9\x03\x51\x81\x48\xe0\x4a\x1b\x93\x6a\x32\x32\x9c\x94\xee\x1a\x8f\xb6\xb5\x91\x89\x2c\x3a\xff\x00\xbf\x6e\x44\xdd\x0a\x76\x2b\xab\xe8\x9d\x70\x60\xc1\x7b\x90\x39\x0d\x23\xbf\x9d\x36\x0a\x29\x3b\x83\x08\x38\x30\x86\x91\x6e\x11\x82\xb1\xba\x43\x36\xf0\x01\xb8\xd2\x0d\xea\xe9\xa0\x29\xf7\xe8\x53\x97\xa9\xae\x5c\xf3\xca\x10\xc7\xf3\x87\x55\x88\xb8\xff\xab\xb0\x63\xc0\x0c\xa2\x6f\x58\x0f\x69\xed\xc5\x27\xa1\xac\xcf\x4f\x41\x39\x7b\x33\x76\x6b\xcf\x6d\x55\xeb\x8d\xe0\x81\xa4\x8c\x98\x1d\x05\xc0\x66\x61\x7b\x80\xd8\xf6\xf5\xe6\x0e\x59\xdd\x9b\x93\x0b\xc4\xd0\x45\x86\x40\x3b\xb8\x68\xdf\x75\x93\x3b\xdd\x86\x23\x0e\x44\x70\x36\xc1\x75\xa1\x0d\xe9\xbb\x39\x95\x3d\xcb\x19\x66\xa1\xf1\x19\x12\x07\x8e\x35\x8f\x48\xc5\xb2\x09\xa6\x36\xc7\xf7\x83\xf4\xd3\x6a\x93\xad\x2c\xc2\xe3\x24\x45\x19\x07\x8e\x99\xde\x1d\x51\x58\xb3\x96\x1e\x0f\xc5\xa4\xf2\x60\xc2\x5f\x45\xf5\xe8\x58\x5e\x60\x1d\xb0\x8b\xa0\x58\xd2\x90\x9a\x1b\xf4\x99\x5f\x48\x13\x46\x0d\x36\x95\x03\xc6\x87\x36\x85\xeb\xcd\x33\x30\xa1\x30\xb7\x5f\x23\x65\xfb\x2a\x5a\x34\xea\x63\xd9\x58\xa2\xa8\x67\xe9\x05\x52\xd2\xce\xc8\xc3\x90\x08\x4b\xe0\xc1\x08\xb0\xfd\x2d\x83\xcb\x92\x84\xdb\x5b\x84\x2c\xbb\x5d\x0c\x3f\x6f\x1e\x26\x03\xc9\xc3\x0c\x0f\x6a\x9b\x11\x8e\x1a\x14\x3a\x15\xe3\x19\xfd\x1b\x60\x71\x52\xb7\xcc\x05\x47\x49\x79\x54\xc1\xf7\x29\x19\x9d\x0b\x23\xe5\x38\x65\x40\x3b\x0a\xd6\x80\xe9\xb4\x53\x69\xa6\xaa\x38\xd6\x68\x5a\xbd\x39\x7f\x07\xfb\xca\x40\x62\x7e\xca\xf8\xd8\xd3\x01\x33\xa6\xd9\xd5\xaf\x00\x91\x92\x75\x1c\x9c\x45\xf7\x7c\x0b\xc0\x11\x26\x88\x00\xbf\x55\x25\x12\x73\x0e\x69\x97\x3c\x5b\xf3\x62\xab\x16\x48\x94\xbf"}, +{{0x3d,0x09,0xaf,0xce,0xe3,0xc4,0x32,0xfd,0xfb,0x6b,0xdc,0xea,0xd5,0x4e,0x3d,0xa5,0xb1,0xb4,0x16,0x5c,0x50,0xd6,0xd3,0x10,0xb7,0xfa,0xd7,0x87,0xb4,0x44,0xd6,0x80,},{0xb0,0xd9,0x02,0x8c,0x4d,0x14,0x87,0xd2,0x93,0xed,0x58,0x5a,0x76,0xbc,0x94,0xff,0xfb,0xaf,0xe2,0xc6,0x5d,0x98,0x0c,0x49,0x4e,0x14,0x1e,0x48,0x10,0xa3,0x5c,0xb9,},{0x89,0x73,0x9f,0xe4,0x41,0xca,0x0c,0xed,0x08,0xa6,0xeb,0x57,0x96,0xe9,0xbd,0xda,0x0e,0x74,0xfb,0x47,0x35,0x28,0xfd,0x49,0x07,0xed,0xb6,0x59,0xaa,0xb4,0x4d,0x33,0x43,0x22,0x90,0x46,0x71,0x63,0x68,0xfa,0xf8,0x8e,0x85,0xc1,0x64,0x4a,0xf6,0x6f,0xf2,0xdc,0xaf,0x0b,0x17,0xac,0x93,0xca,0x13,0x81,0x9f,0x3f,0x24,0x1d,0xd3,0x00,},"\x76\x71\x65\xca\xae\x0e\x57\x8f\x16\x53\x7e\x17\x50\xbe\x7d\xe8\x7a\x78\x9a\x51\xff\x2d\xe1\x18\x38\xf5\x64\xe2\x58\x0b\x23\x91\x36\x2d\x28\x68\xa5\xa4\x70\x8a\xf1\x5d\x2e\x2d\xb7\xb9\xbe\x39\xc1\x6a\xdc\xc1\x20\x0b\x34\xe6\xb4\xd4\x02\x7d\xdf\xfc\x1a\x2a\x35\x95\xe2\x9e\x85\x5e\xc5\x26\x1b\x20\xbd\x55\xc4\x28\xb0\x13\x09\xba\xdb\x59\xe2\xca\x3e\xdb\x96\x7f\xc2\xf4\xba\xc0\x72\x9d\xdf\x54\xfb\x6c\x20\x05\x7b\xdd\xa9\xe7\xaf\x7c\xbf\xc0\x92\xfb\xa8\x65\xfd\x32\x75\xb9\xd3\xbc\xb0\xc3\x46\xb9\x51\xd1\x70\xac\x9a\xa6\x50\xa8\x6d\xf4\x98\x55\xd4\x8a\x1b\x37\xce\x56\xc9\xf2\x73\x89\xf5\xc8\xb1\x5f\x5c\x2c\x90\x0c\x4f\x10\x7c\x06\x4f\x60\x3e\x4f\x86\x7e\xf2\xe9\xc1\x0a\x1b\x74\x21\x0e\x6b\x89\xbb\x01\x17\x93\xaa\x85\xde\xd4\x3b\x51\xb7\x49\xba\x7f\x70\x28\x7b\x6b\xc1\xb8\x94\x34\xdb\x8b\x8c\x8b\x5d\x73\xb2\x14\xb4\x1e\x36\xb5\x28\x00\x5b\xfb\xfe\x00\x2e\x21\xb1\x00\x6f\xb9\xd2\x4b\xab\xd7\x21\x06\xd0\x93\xe3\xc7\x09\x3b\x31\x38\xae\xa7\x19\xd6\x94\x79\x08\x46\x47\x49\x8c\xd6\xc9\xbb\xb7\x44\x50\x9c\xd7\xda\x8d\xd6\x1a\x62\x71\x00\xf0\x3c\x21\xe7\x50\xac\xb3\xfc\xf4\x63\x1d\x7c\x0f\x61\x81\x54\xd2\xe5\xfa\x66\x56\xfb\x76\xf7\x4c\x24\x79\x50\x47\xbb\xce\x45\x79\xeb\x11\x06\x43\xfa\x98\xe1\xf7\x76\xca\x76\xd7\xa2\xb7\xb7\xb8\x67\x81\x73\xc7\x73\xf4\xbe\x7e\x18\x2f\xd2\x4d\xd7\x62\x91\xac\x67\xd9\xf2\x6a\x28\xc5\xe3\xcb\x02\x5c\x68\x13\xa3\x78\xb3\x83\x22\x46\x42\xb4\xae\xfa\xd0\xc7\x6a\x65\x79\x51\x7b\x8f\x36\x07\x97\xdd\x22\x61\x3e\xe6\x82\xb1\x79\x38\x19\x50\xfb\x71\x60\x9a\x5f\xb5\x49\x4d\x2d\x57\xdc\xb0\x0f\x26\xd1\xe7\x29\x56\xf4\xd6\x67\x28\x30\xe0\x5c\x01\xb3\x77\x96\x77\xc0\x7e\xa0\x09\x53\xc6\xb8\xf0\xdc\x20\x4c\x8d\xbd\xcc\xb3\x81\xbc\x01\xb8\x9c\x5c\x26\x1d\xb1\x89\xab\x1f\x54\xe4\x6b\xc3\xed\xc4\xde\x5a\xd4\xf0\xeb\x29\xc0\xa1\x20\xe4\x37\xcd\x8f\x37\xac\x67\xd4\x8c\x7f\x0e\x73\x02\x78\x70\x8f\x02\xb5\x4a\xee\x62\xb7\x29\x52\xbc\x1c\x0e\xb4\x37\xca\x8b\xd5\x65\x54\x37"}, +{{0x41,0xc1,0xa2,0xdf,0x93,0x69,0xcd,0xc9,0x27,0x16,0x4a,0xa5,0xad,0xf7,0x75,0x71,0x36,0xab,0xe5,0x13,0x95,0x60,0x42,0x66,0x33,0x4c,0xc5,0x46,0x0a,0xd5,0x68,0x3e,},{0x40,0x55,0x78,0x34,0xcc,0xe8,0xe0,0x43,0x58,0x0a,0x42,0x72,0xa8,0x80,0x4d,0x4f,0x92,0x6e,0x88,0xcb,0x10,0xd1,0xdf,0x0c,0x5e,0x28,0xb9,0xb6,0x7e,0x1b,0x63,0xda,},{0xb8,0xb2,0x75,0x2a,0x09,0x71,0x96,0xc2,0x89,0x84,0x9d,0x78,0xf8,0x11,0xd9,0xa6,0x2f,0xc7,0x67,0x27,0x8f,0x0c,0x46,0x62,0x8b,0x52,0x1f,0x62,0xed,0x27,0x59,0xd7,0x44,0x62,0xa1,0x75,0xda,0x22,0x40,0x3f,0x15,0x02,0x04,0x45,0xca,0xe0,0x6d,0xa3,0xed,0x61,0xcc,0xa6,0x20,0x3b,0x70,0x06,0x36,0x2a,0x0e,0x19,0x89,0x63,0xd2,0x0e,},"\xb6\x4b\x14\xba\x77\xd2\x39\xe6\xf8\x1a\xbe\x06\x0a\xcc\xef\x85\xf0\x44\x2b\x65\x0c\x44\x01\x5e\xfc\x43\xa0\xaa\x2b\xa1\x0b\xf4\x8d\x30\x18\xb1\x95\x3d\xdf\xff\xbc\xda\x5b\xf3\xbb\xe0\xb6\xb3\xe4\xb0\xd9\xa3\x2c\x6b\x72\x5b\xbb\x23\x1e\x0a\x27\x04\x47\x1e\xe8\xbc\x1d\x59\x4f\x5c\x54\x22\x6f\x5d\xd9\xdf\xa1\x63\xcf\xc1\x45\x2c\x61\xf9\x3e\x4f\x81\x39\xab\x4c\xe4\x47\x6f\x07\xec\x93\x36\x61\xea\xe9\x1b\x6d\x50\x0b\xf5\x08\xac\x63\xe4\xba\xaf\x1f\xfc\x8f\x00\x07\xd8\x02\xe0\x05\xf1\xb4\xfc\x1c\x88\xbe\xe4\xd5\xe9\xe7\x63\x84\xf5\xa7\x04\x3b\xd6\x60\xcc\xe7\x1f\x3b\x67\xf0\x1f\x6a\xb8\x44\x29\x85\x31\xaa\xc7\x3a\x39\xd0\x45\x37\x00\x88\x85\x50\x05\xa0\x9c\x6d\x04\x23\x8e\xa4\x78\xdf\xac\xad\x1e\x6b\x22\xb2\xbe\x4c\x46\xb0\xd5\x9b\x1e\xba\x1f\x06\x0b\xf7\xda\x5d\x15\x66\xcf\x1f\xdb\x5c\x54\x3a\x33\x92\x6a\xf6\x3f\x01\xa0\xdb\x86\xe1\xa6\x71\x1c\x47\x3d\xc7\x95\xab\x28\x3c\x8d\x93\xfa\xcf\xb5\x70\x1f\xa2\xf2\xf6\xbb\x99\xf9\xb7\xe3\x74\x9b\x07\x1d\x58\x60\x7b\xe4\x4a\x70\x89\xbc\xb5\x03\xec\x14\x95\xb5\xfe\xed\xb3\x99\x96\x1f\xd3\x67\x7d\x74\x93\xea\xa3\xb3\xe9\xcc\x5e\x36\x42\xf4\x0d\x47\xde\x9b\xfe\xe7\xc2\x0b\x0e\x51\x9c\x4e\xb4\xa4\x0f\x4d\xa4\x46\xed\x6a\xc7\xaa\xca\x05\x3e\x75\x9c\x97\xda\xbe\x0a\x8e\xc2\xf5\x8e\x7f\x2f\x9b\x20\x72\x76\x2f\x9f\x79\x4a\x6a\x4e\x36\x06\x0b\x88\x72\xbd\x2c\x18\xd0\x6a\x85\xc2\xc1\x41\xa7\x82\x93\x77\x3e\xe8\xcf\xbf\x15\x4b\x99\x30\xcd\x39\xda\x31\xb4\x97\xe7\x37\xa7\x75\x0c\x90\xa1\x3f\x5a\xaa\x14\x7c\xd0\xdc\x43\x11\xf2\xe3\x49\x41\x25\x2e\xf1\x98\xb0\xc1\xf5\x08\x27\xe5\x6c\x9f\x16\xf5\x95\xac\xed\x6d\x2a\x69\x34\x65\x31\x49\x5a\x64\x99\x77\x4d\x36\x07\x66\xca\x9b\xe5\xed\x88\x81\xc0\xdb\x26\xed\x7c\x5e\x6f\xf3\xa4\xf9\xb7\x3c\xd8\xb6\x54\x64\x0d\xc9\x6b\xf4\x3b\xd4\x26\xa0\xf2\x8c\x9b\x25\xfa\x70\x4d\x62\xff\x02\x88\xfc\xce\xff\xaa\xeb\xd3\xea\x30\x97\xbc\xbb\xd7\x78\x42\x0e\xbc\x52\x0a\x41\x77\x30\xa1\xb5\xb3\xb8\xc9\x6c\xda\x9f\x4e\x17\x7d"}, +{{0xa0,0x06,0x11,0x48,0x94,0x67,0x12,0x2c,0x4c,0x16,0x4b,0xfb,0x6a,0x61,0x6e,0x6a,0x61,0x9b,0x9f,0x83,0xc4,0x36,0x72,0x06,0xb8,0x5d,0x3f,0xbe,0xc3,0x8c,0xd6,0x2c,},{0x57,0xab,0x58,0xba,0xbb,0x41,0xdc,0x0d,0xa0,0xbc,0xd5,0x06,0x05,0x9a,0xac,0x9f,0x46,0xec,0xa9,0x1c,0xd3,0x5a,0x61,0xf1,0xba,0x04,0x9a,0x9a,0xc2,0x27,0xf3,0xd9,},{0xc7,0x71,0xba,0x0a,0x3d,0x3c,0x4a,0x7b,0x06,0x4b,0xd5,0x1a,0xd0,0x5c,0x9f,0xf2,0x7f,0xd3,0x26,0x61,0x0f,0xbf,0xa0,0x91,0x83,0x03,0x9e,0x5e,0xdf,0x35,0x47,0x2d,0xde,0xd8,0xfc,0x22,0x75,0xbb,0xcc,0x5d,0xf1,0xbf,0x12,0x98,0x60,0xc0,0x1a,0x2c,0x13,0x11,0xda,0x60,0x2f,0xba,0xff,0xc8,0xb7,0x9c,0x24,0x9c,0x9c,0xc9,0x55,0x02,},"\x34\xdb\x02\xed\x75\x12\xbf\x8c\x67\xd3\x59\xe7\x20\x3a\x2e\xa4\x41\xe2\x0e\x72\x97\x66\xc1\x5a\xa0\x0f\xa2\x49\xa3\x51\x8f\xc2\x9e\xf8\x90\x5a\xa5\xb4\x67\x09\x58\xc6\xa4\x60\xd7\x7b\x3a\x80\xef\xcb\x47\x38\x59\xbb\xaf\xf8\x62\x22\x3e\xee\x52\xfe\x58\xac\xfd\x33\x15\xf1\x50\xf3\xc6\xc2\x7f\xf4\x8f\xca\x76\x55\x2f\x98\xf6\x58\x5b\x5e\x79\x33\x08\xbf\x59\x76\xba\xd6\xee\x32\x7b\x4a\x7a\x31\x32\x14\xb9\xae\x04\xb9\x65\x1b\x63\xcd\x8d\x9f\x5b\x3b\xec\x68\x9e\x0f\xd0\x00\xdd\x50\x17\x70\xdd\x0e\x99\xb8\xf9\x9e\xaf\xa0\x9c\x39\x6a\x24\x5a\x4a\x96\xe5\x68\x96\xa2\x9b\x24\x19\x0b\x1e\xf1\x10\x63\xf3\x9b\x63\xee\x3a\x58\x6b\x07\x62\x7d\xd3\x50\x0c\x4e\x17\x0b\x83\x5d\xc0\xec\x23\x6f\xa5\xa3\x5c\x44\x18\x47\x07\x56\x5c\x4a\x50\x66\x2d\x8d\xbc\xcf\xff\x7f\x9a\x7a\x68\xd0\x21\xb4\xaf\x64\xd5\x32\xb7\xc3\xd2\x74\x74\x18\xc2\xd7\x17\xbb\x6a\xca\x6b\x58\x74\x7a\xe4\xdd\x56\x41\xd8\x26\xf7\x9a\x8a\x31\x5c\x38\x21\x1a\x53\x8a\x92\x9e\x5b\x45\x1f\x62\x3f\x4f\xcb\xbc\xac\xdb\x86\xc8\x75\x2e\xa1\x3a\x61\x7a\xb4\x14\xab\x65\x3e\xb2\xe6\x8d\x54\x20\xdf\x7c\x6d\xf9\x24\x38\x16\x8d\xcf\x9c\x06\x65\x81\xdf\xe7\xb2\xc4\x68\x19\x4a\x23\x70\x7d\xe4\x65\x9b\xd6\x7e\xb6\x34\xff\x02\x47\x41\xc5\xfc\x86\x98\xfd\x4d\xc4\x1f\xe5\xdf\xc6\x29\x9b\x7a\x08\xe6\xff\xca\x37\x10\x9c\x02\x10\xc8\xf9\x4e\xa2\xd3\xdd\xc9\x77\xff\xc0\xb3\x79\x4f\xe6\xba\x43\x37\xc7\xaa\xb4\x34\xa6\x8a\xc6\x65\x48\x4e\xa8\x24\x3a\x84\xb7\x9a\xa1\x81\xee\x6a\xb5\xaa\x37\xa3\x2d\x87\x97\x25\xed\xc0\x18\xf8\x55\x21\x81\x81\x6d\x7d\x27\x2c\xa8\x81\x8a\x7b\x92\xe6\xee\x44\x54\xd1\xf7\x82\x8d\xd8\xaf\xba\x1a\x79\x03\x64\xb4\xff\x28\xd8\x4e\x02\x85\x97\x35\x3e\xbb\xef\x24\x83\x7b\xc3\x19\xe1\xae\x8f\x2b\x0b\x6a\x85\x1b\x48\x9c\x3e\x17\x0e\xef\x53\xe0\x65\xf7\x03\x26\x53\xcd\x6b\x46\xd8\xe5\x7e\x4e\x11\x1b\x78\x9b\xa9\x50\xc4\x23\x0a\xba\x35\xe5\x69\xe0\x66\x15\x40\x34\x07\xbc\xe0\x36\x9a\xaa\xb4\xea\xfa\xef\x0c\xae\x10\x9a\xc4\xcb\x83\x8f\xb6\xc1"}, +{{0xde,0x16,0x34,0xf3,0x46,0x0e,0x02,0x89,0x8d,0xb5,0x32,0x98,0xd6,0xd3,0x82,0x1c,0x60,0x85,0x3a,0xde,0xe2,0xd7,0xf3,0xe8,0xed,0xd8,0xb0,0x23,0x9a,0x48,0xcf,0xaf,},{0x9d,0xc1,0x46,0x5b,0x33,0x83,0xf3,0x7d,0xe0,0x0e,0xa2,0xd3,0xc7,0x0f,0x2c,0x8f,0xac,0x81,0x5f,0x01,0x72,0x02,0x9c,0x3f,0x57,0x95,0x79,0xc9,0x84,0xa5,0x89,0x5e,},{0xd2,0x05,0x06,0xeb,0x84,0x69,0x23,0xa0,0xb1,0x6f,0xf8,0x2f,0xb2,0xc3,0x92,0x3b,0x00,0xc1,0xb3,0xbc,0xc6,0xe2,0xf6,0x48,0x2f,0xba,0x24,0x80,0x75,0x21,0xe8,0xe0,0x22,0x3f,0x69,0x2e,0x62,0xea,0xc9,0x93,0xf4,0x98,0xf6,0x71,0x02,0xa0,0x4f,0xd1,0xac,0xf9,0xc7,0xe3,0x88,0x8d,0x85,0x7c,0x9a,0x08,0x0b,0x8a,0xf6,0x36,0x10,0x06,},"\xd1\x0c\x3e\x4d\xe7\xfa\x29\x89\xdb\xa8\x75\x37\xe0\x05\x93\xd0\xee\xd4\xd7\x5e\xe6\x58\x46\xda\xb1\x49\x8b\x47\x49\xd6\x4f\x40\xe3\x4b\x59\x11\xc5\xce\x3b\x53\xa7\xe3\x7d\x2d\x02\xbb\x0d\xae\x38\xed\x96\x2a\x4e\xdc\x86\xc0\x02\x07\xbe\xe9\xa8\xe4\x56\xec\xca\xe8\xbd\xf4\xd8\x7a\x76\x74\x60\x14\x20\x1a\xf6\xca\xff\xe1\x05\x66\xf0\x8d\x10\xda\xaf\x07\x71\x60\xf0\x11\xfe\xac\xa2\x5b\x9c\x1f\x6e\xca\x9f\xc5\x33\x14\xa8\x05\x47\x95\x17\x54\x35\x55\x25\x25\x7d\x09\xa7\xfd\xad\x5b\xc3\x21\xb7\x2a\xa2\x8d\x1e\x02\xd8\x69\x6d\x4f\x9e\xb0\xad\x3b\x21\x96\xf8\xbc\xfa\xeb\x1d\x61\x48\x28\x7a\x3f\xae\xfe\xf9\x1a\x7a\x3e\x06\x09\xc2\x8c\xe5\x9d\x0c\xa1\x4d\x0b\x30\x50\xdd\x4f\x09\x6b\x7b\xc2\x51\x39\x88\xba\x21\x21\x28\xd5\x02\x6d\xaa\xa7\x18\x88\x46\xdb\x21\xc5\xc1\xd1\x79\xab\x94\x87\xc1\xa5\xbd\x34\x65\x88\x12\x7c\x20\x39\x8d\x36\x2d\x4c\x75\x9c\xfa\xb2\xa6\x77\x75\x0b\x9e\x45\x67\x6a\x1e\x7e\x09\x2e\xf0\x2e\xdb\xf2\x78\xfb\x19\xa5\x8e\x9b\xf6\xc9\xe9\x96\xe2\x4e\xda\xd7\x3f\x3c\xe3\x1f\xa0\x4b\x6d\x85\x33\x43\x6b\xf8\x0b\x4b\x2f\x80\x5e\xd9\x1e\x7f\xcd\xa3\xbc\x2b\xab\x3b\x2b\xb1\x57\x15\x8a\xf0\xea\x8e\x3f\x07\x31\xdf\xad\x45\x9d\x2e\x79\xb6\xd3\x71\x5f\xe7\xbf\x1e\xaf\xc5\x39\x75\x93\x20\x88\x57\xe5\x7b\x7f\xeb\x2f\x73\x87\x94\x3a\x8e\x09\x13\x47\x0c\x16\x1a\xef\x4f\xe2\x05\xd3\x63\x7f\x23\x17\x7f\xf2\x63\x04\xa4\xf6\x4e\xba\x3f\xe6\xf7\xf2\x72\xd2\x34\xa6\x72\x06\xa3\x88\xdd\xd0\x36\x6e\x89\x4e\xaa\x4b\xb0\x5d\x73\xa4\x75\xf1\xb3\x4c\xa2\x22\xbb\xce\x16\x85\xb1\xb5\x6e\x03\x4e\x43\xb3\xc4\x0e\x81\xff\xf7\x96\x82\xc1\x9f\x32\xaa\x3f\x2a\x89\x5c\x07\x09\xf9\xf7\x4a\x4d\x59\xd3\xa4\x90\x29\xec\xfc\xb2\x83\x08\x2b\x06\x7f\x1a\x0d\x95\x05\x75\x0f\xd8\x67\x32\x19\x99\x48\x42\x49\xef\xa7\x25\xf5\x2c\x94\xc7\x59\x62\x06\xa9\x11\xf3\xf5\x05\xd6\x3f\x03\x13\x25\x4b\xd4\x45\xf0\x5b\xe3\x99\x6b\x58\xfe\x18\x19\xaf\x87\x35\x2e\x7f\x0a\x2c\xa3\x20\xd9\xcc\x00\xa5\xfe\x77\xad\x41\x64\x0d\x50\xbe\x84\x36"}, +{{0xc7,0x38,0xef,0x5f,0x09,0x35,0x28,0x1b,0xa6,0x25,0xfa,0x40,0x14,0xd4,0xa4,0xd0,0xbe,0x7e,0x28,0xfe,0xd7,0x79,0xa9,0xcf,0x65,0x8e,0x21,0xdb,0xa4,0x3c,0xeb,0xc1,},{0x95,0x79,0x9f,0xaf,0x70,0x6d,0x19,0x5e,0x54,0x4c,0x76,0xca,0xfd,0xdf,0x09,0xd0,0x2d,0x1b,0xea,0xfc,0x42,0xc9,0xd6,0xc9,0xea,0xd4,0xc1,0x84,0x55,0x87,0xd3,0x9e,},{0xf4,0x43,0x71,0xe6,0xc3,0x39,0x16,0x39,0xd4,0x57,0xed,0x14,0x64,0x81,0x84,0x80,0x94,0x11,0xe8,0x0a,0x32,0x01,0xf8,0x81,0x16,0x70,0xe5,0x00,0xfc,0xad,0x92,0xf3,0x00,0xaa,0xbf,0x7f,0xc6,0x8e,0x44,0x01,0x91,0xe8,0x81,0xd6,0xc3,0x47,0x4e,0xfd,0x6d,0x28,0xf0,0x9d,0xc4,0x43,0x12,0xfc,0xfc,0xb8,0x27,0x01,0xba,0x3c,0x29,0x0a,},"\x16\x8d\x0b\xc5\x59\x8b\xe0\x2f\x54\x43\xbf\xe7\xdf\xb8\x82\x99\x85\xca\x5d\x28\x2a\xf9\xcf\x1b\x14\x82\x60\x2f\x24\x3d\x48\x6b\xd8\x2b\xa0\x39\xa0\x75\x09\x09\xe9\xb3\xc7\xd4\xd5\xf8\xb8\xba\xf4\x57\x18\xaf\x03\x11\x85\x4f\x4d\x1c\x78\x37\xf3\x1d\x8e\xe6\x8d\x35\x58\xe7\xe5\x1e\x0c\x64\x6a\x4a\x63\x75\x96\xee\x90\x05\x7b\x01\xed\x0a\x17\xda\xa3\x95\x0b\x81\xab\x47\xae\x8b\x94\xc1\x7d\x40\x74\x69\x13\xc4\x6b\xa1\x47\x8b\xfc\xa5\x1b\x16\x76\x28\xfc\x3e\xe1\xe2\x2f\x2f\x19\xd6\xd8\xda\xf9\x3d\xf6\x54\x0c\xed\xb7\xa8\x59\xd1\xa2\xba\x59\x11\xba\x71\x76\x6e\x8b\x7f\xce\x0c\x0e\x86\x63\x61\x6d\x01\x80\x69\x7d\x78\xce\x30\x40\xd4\x38\x13\x19\x82\xf3\xf8\x11\x2a\xcc\xa2\x9a\xe5\x3e\x53\x9f\xf8\xc9\xec\x41\x06\xd1\x32\xf4\x02\x01\x85\x18\x30\x84\x85\xf2\xaa\x6c\x9e\x8d\x1e\x62\xfe\xd6\x0c\xb2\x49\x45\x7d\xb3\x3c\x6f\xd1\xfe\x07\x44\x53\x61\xf0\x81\x94\xa2\xb5\xa0\x57\xcb\x03\xcc\x75\x4e\x5c\x7d\x4a\x7e\xea\x53\xa7\xf7\xd2\x07\xca\xcc\xa5\xe6\x8c\xaf\xa9\x69\xa3\x52\x1d\xbb\x81\x03\x99\xa1\x7f\x32\x8e\xe7\x67\xcf\x55\x92\x6b\x2b\xd5\xf0\x29\x54\x9d\x3b\x46\x45\x79\xc4\x26\x55\x26\x53\x98\x47\x2e\x1c\x77\xcc\x8d\xd9\xaf\xf1\x87\xf7\xac\x34\xdd\x45\x6a\xce\x99\x9a\x73\x6e\xcc\xa6\xd4\x05\xd4\x92\x2c\x77\x9c\x60\x0c\x47\xb8\x4c\x9c\x1d\xf5\xe5\xf8\xed\x3b\x28\x11\xd3\x51\x33\x91\x13\xf8\x45\x3c\xca\x4c\x44\x11\x68\x8c\xb0\x38\x82\x58\xeb\xbd\x18\x72\xb8\x36\x10\x04\x22\x49\x49\x4e\xd5\x60\xd4\xcd\xa6\xa6\x84\x55\xd9\x57\xe8\x06\xdd\x0b\xdd\x83\x00\x4c\x4c\xa8\x07\x74\xb8\xa0\xa1\x66\x58\x66\xf1\x70\x85\x01\x4e\xad\xb3\xea\xe7\x38\x2f\xa8\x70\xde\xb2\x9d\xd8\xc9\x31\xb5\x30\x19\x62\x57\x40\xe2\x83\x92\xf3\x85\x75\xc0\xe2\xa9\xe5\x04\xfc\x35\xbd\x95\xdf\x56\x43\x9a\x89\x82\x30\xa2\x39\x8c\xd2\x22\x5c\x76\x6e\xf3\x6f\x12\xae\x7e\x49\xb3\x0a\x9c\x0a\xad\x46\x9d\x58\x95\xbb\xf7\x21\xcc\x0f\xf5\x1d\x84\x0c\x80\x2d\x4a\x7e\xef\xba\x84\xfe\x52\x05\xa2\xc2\xf1\x40\x11\x92\x2d\xde\x56\x14\x56\xf7\x9e\x61\x61"}, +{{0x5f,0xea,0x38,0x73,0x9c,0x61,0xca,0x83,0xbf,0x7b,0x4a,0xd1,0x75,0xa2,0x11,0x76,0x27,0xb9,0x71,0xa6,0x34,0xa3,0x05,0xa8,0x4f,0xa5,0x7f,0xec,0xb8,0x03,0x56,0x24,},{0xdd,0xd1,0x4b,0x0f,0xc0,0x67,0x68,0xd5,0x10,0x4c,0x50,0x76,0x4b,0xfd,0x3b,0x95,0x23,0x52,0xa3,0x40,0x07,0xc5,0x0d,0x5d,0xdd,0x22,0x4f,0xf5,0x1a,0xfc,0xdf,0x9c,},{0xf4,0xe2,0x74,0x82,0x3f,0x2c,0x39,0x6f,0x3a,0x32,0x94,0x86,0xaa,0x64,0x10,0xc5,0xff,0x19,0x26,0x6f,0x07,0x70,0xfd,0x04,0xfb,0x14,0xa7,0x60,0x2d,0x2b,0x69,0xa4,0xa2,0xb0,0x09,0x28,0xe9,0xe1,0xd9,0x23,0x89,0xf8,0x03,0x33,0x59,0xed,0x6f,0xb2,0x14,0x64,0x67,0xaa,0x15,0x4c,0xba,0x59,0x7d,0xec,0x6a,0x84,0x17,0x3f,0x8d,0x07,},"\x10\x13\xc6\x0a\x73\x95\x35\x49\xe5\xed\x10\x5b\xde\xa1\x50\xb9\x1e\x60\xec\x39\x20\x0d\x43\x72\x13\x04\xbf\xc8\xec\x43\x9d\x39\x60\x96\x13\xc2\xd8\x78\x04\x4a\x9d\xa0\x1b\x26\xd8\x6d\x6d\x65\xdb\x93\xd9\x1a\x13\x7e\x9c\x48\x08\xa9\x7d\x4e\xf2\x86\xa9\x03\xf3\xf1\x38\x2c\xc6\xd1\x29\x42\x16\xb9\xfa\xfc\x01\x3c\x86\xb9\xff\x68\xb5\x5a\x50\xea\x37\x66\xe6\x1d\xc1\xce\x38\x34\x8e\x91\xd6\x2c\xe7\x32\xc1\x52\xd7\x66\xb9\x33\x5c\x68\xd6\xca\xd7\x7b\xe2\xb4\xa0\xcd\x50\xb9\xa1\xec\x63\x2b\xa5\x56\x48\xa6\xe7\xe1\x1a\x14\xc0\x68\x53\xc0\x2a\xec\x48\x09\xbd\x14\x7a\x5d\xdd\x9f\xbc\x3b\xe9\xf0\xc8\x15\x8d\x84\xab\x67\x95\xd7\x71\xb4\x2b\x18\x14\xa1\x7a\x3c\x7a\x6c\xa0\xf4\xa8\xf7\xb3\xa0\xdb\x1c\x73\xba\x13\xb1\x64\x00\xdf\xec\xbd\x03\xd2\x16\x65\x0e\x4d\x69\x70\x4a\x70\x72\x46\x44\x4d\x57\x91\xfa\x27\x37\x52\xf5\x9c\xb5\xae\x9f\xd4\x16\xa5\x18\x66\x13\xd6\x6a\xfd\xbd\x1c\xe6\x91\xa8\x7b\xd7\xd8\xb6\x71\x90\xe9\xac\x68\x70\x62\xa0\x80\xd2\xec\x39\xfe\x76\xed\x83\x35\x05\x82\x51\x87\x28\x39\xe8\x5e\xb6\x2f\x18\xec\xe1\x87\xca\xba\x55\xb5\xf7\xd5\xed\xca\xde\x01\xcd\xc5\x43\xcc\x67\x7e\x50\x23\x8b\x89\xc5\x63\x5a\xd5\xc8\xfc\x22\x0f\x5e\x0b\xe1\xbc\x66\x7d\x20\x98\x97\x53\xa6\xd6\x16\xfa\x69\xf8\xb1\x29\x40\xb8\xca\x9e\x2c\x48\x57\x71\x32\xd8\x69\x1b\x05\x37\x79\xa1\x52\xcb\xac\xff\x3b\x8b\x1b\xd7\xaf\x69\x2e\x56\xc7\x3b\xba\xe4\x63\x47\x76\xcf\xc2\x13\xc9\x9b\x9a\xe4\x58\xdf\x1b\xef\xc8\xc8\x77\x74\x26\x64\xb0\xa0\xbb\x1f\x69\x15\xc8\xda\xe3\xb3\xf5\x5d\xd7\x5a\xba\x6a\x3b\xcc\x41\x76\xb4\xe3\xba\x03\xd0\xc1\xc0\x4c\x3c\x64\x08\x77\x8b\x2b\x8e\x5a\x8a\x3e\xb5\x2e\xd3\x2a\x74\x28\xc0\x0a\x98\xa5\x89\xd8\xca\x93\x90\xa2\x10\xf4\xa7\xac\x00\x4f\xa1\xfe\x4c\x6d\xa6\x94\xf1\x22\x76\xe3\x20\xb4\x1b\x0b\x59\xf7\x5d\x26\x4a\x39\x6d\x45\x0b\x63\x1a\xb3\x53\xf1\x61\x27\x09\xe7\xa2\xe6\xa5\x0d\x01\xcb\x11\x0e\x53\x04\x05\x46\xdd\x3b\x1e\x11\xd2\x57\x32\x81\x3a\xa7\x6b\xe5\xe8\x1f\xcf\x7a\x57\x73\xf6\x81\x5b\xbd"}, +{{0x60,0xf9,0xa1,0x4c,0xce,0x5d,0x43,0xfd,0x9a,0xab,0x4e,0xe8,0xcc,0x83,0x79,0xd5,0x75,0x94,0x91,0x52,0x69,0x3b,0xf2,0x9a,0x67,0x90,0xb0,0x35,0xe4,0x2a,0x44,0xde,},{0xbd,0x4a,0x70,0x74,0x0d,0x5a,0xca,0xbe,0x49,0xf9,0xa2,0x15,0x20,0x82,0xfa,0x20,0x25,0x33,0x0e,0x64,0x40,0x43,0x7f,0x1d,0x04,0x7f,0x31,0x3d,0xe4,0x90,0xdc,0xa5,},{0x72,0xf5,0x4b,0xb8,0xbd,0xd1,0x7e,0x9e,0x42,0x2c,0xd3,0x39,0x63,0x1d,0xd3,0x9f,0x57,0x35,0x50,0x15,0xd4,0xcb,0xd1,0x5a,0xca,0xb7,0x54,0x2e,0xfd,0x78,0x4a,0x32,0x1c,0x1f,0x61,0x25,0x76,0x4c,0x0d,0x15,0x40,0x45,0xb3,0x2e,0x70,0xdc,0x2e,0x03,0xfb,0xfe,0x11,0x17,0x46,0x8a,0xc3,0xe7,0x31,0x27,0xb5,0xfa,0xc8,0xd4,0x21,0x02,},"\xdd\x7f\x44\xf9\xeb\x72\x8a\xb4\x8d\xe5\x4e\xcd\xe6\xb6\x18\x4b\xd5\xdd\xd8\x70\x75\x45\xa0\x12\x9f\x2e\x90\x59\x05\xb5\x5d\x3e\x7f\xd5\x7e\x28\x48\x5d\x25\x81\x48\xf6\x60\x5e\x23\x77\xd5\xb2\x67\xd2\xea\xf4\xcd\x4b\x46\xe4\x54\x96\x22\x19\x86\x82\x32\xb6\xf4\x1f\x88\xa7\x97\xf9\xcd\xd5\xc3\x9a\xda\x51\xa6\x41\x21\x4f\xb9\xdb\x2c\x2a\x9b\x5a\x5b\x16\xe3\x03\x57\x53\x18\xb6\x25\xcc\xa9\x70\xb7\x43\x48\x72\x79\x02\xa1\xcf\x26\x8b\xd1\x6e\x10\x71\x13\x16\x1c\x8c\xbc\x99\x30\x3c\x2b\x9f\x23\x55\x41\xa7\xb3\x1e\x43\x31\x20\xfe\xba\x14\xfe\xbe\x4b\xcb\x0f\x5b\x93\x6c\x7e\xdd\xdd\x0e\xcf\xc7\x2c\x8d\x38\xf6\x4c\xdb\x6c\xfc\x29\x10\xbc\x29\xa5\x21\xc5\x0a\x51\xab\xcb\xc2\xaa\xbf\x78\x9d\xe8\x22\xcb\x04\xf5\x72\x8f\xee\x15\x3d\xd5\x50\x1b\x2d\xb5\x9c\x59\xf5\x0c\xab\x17\xc2\x92\x16\xd6\x69\x51\x01\x9e\x14\x5b\x36\xfd\x7e\x84\x1b\xfb\xb0\xa3\x28\x55\x4b\x44\xdd\x7e\xf5\x14\x68\xc3\xd5\xb7\xd3\xa1\xf7\xb9\xde\xf5\x8d\x8c\xf9\xd9\xbc\xaf\xe9\x2c\x86\xcf\x6d\x61\x19\xe9\x8d\xba\x6f\x38\xea\x57\xe3\x22\xdd\xc9\xc2\x19\x8d\x4b\xbc\x3b\x94\xea\x13\x29\xdb\x0d\x45\x8e\x01\xc7\x08\x1b\x33\x92\x5a\x3e\x28\x7f\x59\x9a\x85\x8c\x50\xc3\xa8\xf1\x8c\xc2\xaa\x63\x4d\xf6\x3e\x7f\x10\xe4\x03\xad\xea\xb2\xf4\x1d\xb5\x57\x87\x90\xc3\xb4\xf0\x41\xa8\xb7\xa4\xf6\x9c\xd6\xe0\x62\x15\xdf\x82\x01\xae\x5b\x3e\x1d\x1d\x25\xa0\xa3\x9b\xfc\x3d\x04\x1a\x2f\x98\x21\x3e\xf4\x14\x12\x45\x79\x2a\x76\xf0\x6d\x4d\xe2\x5f\x64\x67\xa0\xe5\x6f\x2f\x5c\xf6\x94\x00\xd2\x21\x17\xde\x7b\x46\x14\x95\x54\xb7\x0c\x75\xb9\xf9\x94\x84\xa4\xf6\xf0\x35\xad\x3f\x10\xe3\x75\x3c\xb1\x4f\x4f\x39\x8d\xcf\x6a\x64\xd1\x0c\xf6\xc4\xfa\xc0\x7c\x91\x19\x3c\xc0\xf5\x4f\x0d\xe5\x8c\x63\x43\xe9\xca\xaa\x6b\x4f\x47\x5e\xf9\x1a\x59\xe0\x83\xf9\xf2\x11\xf5\xbc\x8e\x7e\x45\x16\xb4\x5c\xf0\x6b\xf5\x0b\xeb\x8f\xc4\xab\x57\x9d\x86\xd4\xa4\x19\x0e\xea\xc7\x48\xd0\x6e\x08\x52\xc4\xb9\xba\x8c\xfc\x50\xdd\x0a\x03\x7a\x7b\xad\x7f\xad\x55\xaf\x30\x9a\x5f\x13\xd4\xc9\x1e\xd3\xe0"}, +{{0xa3,0x90,0x53,0xc5,0xc5,0x8b,0xf3,0x1d,0x46,0x2b,0x27,0xa6,0x20,0xb0,0xb3,0x7b,0x80,0x52,0xc6,0xb1,0xc4,0x10,0x2b,0x61,0x45,0x66,0x3a,0xa1,0x5e,0x97,0x87,0x18,},{0x36,0x42,0xac,0x2a,0x32,0x80,0xdc,0xe5,0x2a,0xd8,0xdf,0xcf,0xd3,0x70,0x94,0x36,0xed,0xc4,0xe7,0xe4,0xae,0x1b,0x45,0x2d,0x9b,0x22,0x07,0x80,0xb0,0x86,0x79,0xfa,},{0xf7,0x38,0x3e,0x96,0x6c,0xb2,0x30,0x9d,0xee,0xdf,0x86,0x01,0x00,0x18,0x3a,0xae,0xfa,0xc6,0x72,0xca,0x16,0xd5,0x41,0x9c,0xd6,0x42,0x2c,0xa7,0x0e,0x16,0xb3,0x97,0x6f,0x5f,0x16,0x5a,0xfc,0x27,0x86,0x11,0x7c,0x86,0x82,0x34,0xba,0x11,0x09,0xed,0xe0,0x31,0xf8,0x97,0x9b,0x50,0xe5,0x67,0x35,0x8b,0xd4,0xf8,0xbd,0x95,0x82,0x02,},"\xf6\x55\x40\xd3\xab\xeb\x1e\xe5\xea\x98\x70\x62\xc1\xb5\x79\x51\x6d\x3c\x29\xc3\x9c\xbc\x6b\x09\xd6\x0e\x18\xfe\x27\x4c\x2b\xef\xe0\xf5\xfe\x7d\xbd\x57\xc2\xd5\x83\x52\x29\xbb\x75\x4e\xc4\x34\x13\x94\x76\x57\x76\xd6\xa9\x17\x8c\x4e\x6a\x31\x2c\xd7\x4b\xdb\xac\xa0\xe8\x82\x70\x62\x8c\xd8\x41\x00\xf4\x72\xb0\x75\xf9\x36\x92\x83\x01\x22\xf0\x0f\x9b\xd9\x1a\xc5\x82\x83\x6c\x8b\xfa\x71\x4a\xa4\x8e\x97\x70\x03\x55\x6e\x1b\x69\x6d\xf3\x28\xef\x58\x4f\x41\x3f\x8a\xb6\x14\x76\x06\x99\xc4\xd1\x47\xc3\xee\xa1\xda\x04\x35\x83\x5c\x9b\xf7\xad\x54\x60\x6f\x02\x13\xeb\x74\xa1\xb4\x76\x14\x15\x06\xae\x2c\xd1\x24\xcd\x51\xd6\x6e\x7e\x7e\x57\x95\x60\x57\x63\x05\xc5\xfb\xe8\x43\x0b\xe3\xeb\xeb\xaa\xcb\xa3\xf9\x98\x9d\xd7\xd1\x99\xf5\xa4\x55\xa5\x0c\xdb\x37\x55\x03\x7e\x1a\x70\x67\x4a\x4f\xef\x40\xb4\xa3\xaa\xf7\xbd\x3c\x95\xb1\xab\x41\xbb\x20\x62\x11\xc3\xa1\x27\x6d\x3e\x37\xd8\xa3\xa5\xc3\xd5\xd0\xf3\x6e\xf5\xb4\xf3\xde\x26\xb7\xf2\x0f\x6b\x29\x00\x71\x6d\xcc\x22\xab\x73\x4e\xba\xf1\xe8\xd0\x00\x20\xe5\xf0\x19\x55\x16\x53\xb9\xc2\xf7\x0a\x40\x38\xdf\xb2\xf1\x2d\x25\xd6\xd8\x4e\x79\x07\x3a\x65\x48\xfe\x15\xe4\x82\x8f\xe5\xde\x83\xac\x3d\x8d\x98\xb7\xda\xf9\x27\x10\x48\x2c\x37\xf7\xbd\x24\x31\xa8\x11\x4c\x61\x37\x65\x7b\xb1\x77\x88\x2d\x8a\x3c\x76\xba\xbf\x1c\x67\x1a\x70\x55\x36\x5f\xe9\x08\x66\x16\x7a\x2d\x1d\xbc\x87\x0b\xe8\x3b\x36\x01\xf0\x9d\x4a\x31\x7a\xe2\x54\xca\xc9\xf9\x8d\xcc\x7a\xea\xd9\x22\x4c\xd9\xc9\xd8\xa2\x00\xab\xc8\x0a\x2d\xd1\x08\xaf\x28\xfd\x46\xad\x70\x80\xae\x74\x1b\x50\x05\x4b\x9b\x9a\x92\x01\xef\xb7\x83\x8b\xc4\xc5\xc2\xcc\x3d\x76\xba\x0f\xcc\x49\xc4\x6e\x79\x2c\x26\x29\x2b\x7d\x03\x12\xaf\xf9\x55\xa9\xf8\xed\xf0\xc6\x96\xa7\x0a\x61\x4f\x35\x53\xad\x38\x69\xbf\xde\x48\xd2\x6a\x4d\x36\x7b\x6c\xec\x05\x7e\x62\xa4\xe5\x48\x55\x4b\x48\xb5\x3e\xcd\xa7\x90\xba\x7a\x0a\xb2\xe3\xde\x58\x7b\xdc\x22\xb0\x2f\x59\x47\x63\x4d\x73\x09\x9f\x54\x7d\xb2\x2e\xc1\xbb\xf8\x23\x43\xf9\xa2\xca\x38\xbc\xe4\xeb\x59\xbe"}, +{{0xe0,0xc2,0x9d,0xf4,0xde,0x45,0xc4,0x75,0x39,0xe0,0x89,0x6b,0x3a,0x59,0xbc,0x3d,0xe6,0xb8,0x02,0xfd,0x14,0xdb,0xdc,0x9f,0x25,0xe7,0x17,0xac,0x82,0xc3,0x28,0xf3,},{0xa6,0x90,0x02,0xb0,0xf5,0xef,0x35,0x4c,0xe3,0xb2,0xd6,0xb8,0xd8,0xba,0x70,0xab,0x77,0x84,0x32,0xb2,0x2f,0x14,0x4d,0xc9,0xc2,0xeb,0x92,0xd9,0x9d,0x99,0xdd,0x2a,},{0xbb,0x3b,0x8c,0x5c,0x27,0x59,0x1f,0xd8,0xb9,0xc5,0xba,0x48,0x9d,0x6b,0x6e,0xe5,0xb0,0xfb,0x4a,0x7b,0x0d,0xe5,0x1f,0x16,0x39,0xaf,0xc6,0x73,0xd0,0xe5,0xf7,0x5e,0x31,0x3a,0xa7,0xe1,0xd0,0x00,0x90,0x81,0xdb,0xca,0x74,0x35,0xb6,0x87,0xcc,0xd1,0x2f,0x64,0xf7,0x4a,0x38,0x6e,0x77,0x2b,0x9e,0x24,0x78,0x1b,0x92,0x5c,0x8c,0x0c,},"\x6a\x37\xcb\x4c\x74\x9c\x58\x35\x90\xc8\xd8\x49\xbc\xe3\xfa\x65\x7f\x10\x00\x91\x90\xca\xd9\xbe\x41\xed\xe1\x9b\xf2\xfd\xb3\xc5\x62\xa6\x10\x1f\x27\xbd\x37\xf2\x23\xca\xb1\x3c\xed\x24\x5a\x1c\xed\xf8\x52\xf5\x51\xf8\x57\xaa\xd9\x72\x7f\x62\xc9\x67\xc0\xa9\x21\xdf\x11\x6f\x48\xa8\x0a\x60\x40\xb3\xc7\x23\xab\x5c\xb5\x94\xc4\x50\x7a\x3d\x20\xcd\x60\x51\x4e\x22\x16\x4a\x82\xb7\x4f\x19\xdc\xfd\xd8\x3c\x57\xbc\x36\x52\x37\x55\x17\x41\x4a\xf5\xd1\x8e\x0a\x64\xcc\xab\x36\x69\x97\x68\xd0\x7c\xf4\x0b\x70\x63\xa8\x3e\x43\xd5\xf6\x07\x96\x4b\x1b\xf0\x84\x0a\x45\xad\x50\xab\xf8\x3d\xbc\x84\x9f\x40\xe5\xb4\xcf\xb6\xa3\x34\x7b\x29\xfe\xc5\x07\x74\x04\x6a\x4b\x50\x04\x10\x32\xaa\x4d\x56\x7e\x85\x64\xb3\xee\xd1\x64\x20\x40\x68\x2d\xd8\xae\x7d\x71\x79\x28\x6c\xf6\xe1\x85\x3d\xc8\x7d\x27\xc3\xe9\xe6\x0f\xa4\x7c\xf8\xcb\x2d\xa0\x18\x1d\x53\xee\xc4\x06\x14\xb0\x73\x31\xa4\xfb\x70\x28\x08\x6d\x0b\x1c\xe2\xe1\x11\x5b\x73\xa1\x62\xc5\x27\xbd\xd7\xca\xb5\x33\x5b\x86\x3d\x10\x8b\xe0\x47\xbd\xbc\xa1\x12\xcc\x6e\x77\x6b\xb4\x53\xc3\x17\x31\x43\x88\xbb\x96\x53\xef\xb4\x44\x4b\xf5\xcf\x1e\xc8\xda\x23\xb7\x11\xba\x71\x79\x6c\x0a\xe0\x2b\xa1\xdc\xc8\x38\x45\x50\x78\xc3\x89\x7f\x07\xe9\xe1\x3b\x76\xe4\x92\x74\xc2\xe2\x07\x50\x6b\x00\xa0\xb5\x58\x88\x3a\xa1\x22\xb6\x67\xdb\x9d\x67\x05\x08\x60\x6a\x3f\x54\x32\x06\x36\xcd\x19\xf9\x73\x91\x7f\xb1\x87\x5f\x43\x63\xe2\x20\xf1\xe1\x23\x98\xcc\x6a\xfd\x79\x09\x47\x43\x33\x84\x56\x81\x3a\x58\x26\xad\x3f\x1a\xba\x7c\xd7\xbe\xab\x1f\xe1\x83\x85\x9c\x0c\xc9\xef\x40\xa5\xea\xb9\x12\xca\xf5\x15\xa8\xd4\xc3\xb9\x3d\x64\x1b\x7a\xb3\xe7\x6b\x16\xc1\x29\x71\xac\xe8\x8f\xf3\x3e\x5a\x1e\xd9\xb4\x4e\x45\xdb\x8f\x30\x85\xdb\xf0\x70\xb2\x56\xb0\xd7\x51\x2e\xe1\x06\x94\x32\x60\x3d\x73\x09\x5d\xb8\x74\x9c\xa5\x47\x96\x3b\xd7\x1a\x8a\x68\x4a\xb8\x51\x6b\x14\x6c\x41\x87\x17\x63\x86\xaf\xdf\x6c\xb1\x36\x8a\x3d\xd8\xfc\xb2\xcf\xff\x77\x05\x6a\xaf\x78\x23\xf8\x00\xb2\x66\xac\xce\x72\xbf\x64\x3c\x6d\x0c\x28\xf0\xab"}, +{{0x19,0x8b,0x5f,0xd1,0xc0,0x38,0x27,0xe0,0x99,0x4a,0xd5,0xbf,0xee,0x9b,0x5b,0x7b,0xe9,0x96,0x6c,0x9c,0x3a,0x26,0x7e,0x4d,0x74,0x30,0x34,0x37,0x67,0x40,0x3c,0x67,},{0x66,0x82,0xc6,0xf1,0xa8,0x66,0xb4,0x9b,0x2f,0x8e,0xe9,0x7f,0x2e,0x53,0x2f,0xa9,0x16,0x66,0xbf,0x38,0xda,0x1b,0x4d,0xd6,0x55,0x43,0xa1,0x77,0x77,0x94,0xcb,0xee,},{0xf4,0x54,0xf3,0x5b,0x18,0x53,0x8f,0x87,0x7e,0x5d,0x61,0x4a,0x76,0xb5,0x27,0x6a,0x27,0xfc,0x0b,0x43,0x3f,0x21,0x5d,0xc4,0xe9,0x63,0xb3,0xf0,0x47,0x69,0x4c,0x78,0x0c,0x51,0x5c,0x6e,0xf6,0xfe,0x2d,0xb4,0xb0,0x09,0x00,0x9b,0xc2,0x73,0x3a,0xec,0x4f,0xd4,0x6e,0x61,0x53,0x57,0xcc,0x0b,0xcc,0x9f,0x1f,0x7f,0xc2,0x1e,0x3c,0x02,},"\x3f\xda\xa1\x5c\x46\xf2\x51\x43\xdb\x97\x20\x79\xd7\x01\x3c\x7f\x69\xa1\x36\xf4\x5f\x3f\x6b\xa2\xce\xd8\xb8\x28\x46\x8e\xb3\xda\xa6\xb5\x0b\x4f\x8d\x33\x80\xfe\xc6\x4a\x03\x43\xbe\x11\x6f\x6f\x83\xb6\xee\x64\xcc\x4c\x1b\x1d\x08\xd5\x4f\xd4\x20\x29\xe4\x28\x5c\xfc\x6c\x6d\xd5\xcd\x18\x1a\xb5\x33\xff\xcd\x41\x1f\x23\xa1\x00\x3d\xa9\x4e\xc9\x34\x0e\x2e\xc7\x11\x99\xd6\x78\x54\x0d\x51\x82\xe1\x39\xff\xcb\xc5\x05\xa1\x70\xb8\xf0\x7f\x4a\x7e\x69\x4c\xa9\x2f\x58\x32\x0c\x0a\x07\x85\x64\xce\x9d\xe9\x9b\x0f\xa8\xe6\x6b\x0d\x82\x2e\x46\x7a\x5a\xeb\x83\x56\x79\x96\xa4\x8b\x89\xdb\x25\xca\xde\x64\x57\x79\x4e\x54\x14\xd6\x7e\x9d\x4a\xb7\xcd\x6c\xc2\x05\x8b\xb7\xa5\x13\xab\xd7\x09\xf4\xca\xf2\x4b\xb6\x7c\xe1\xc0\x3a\xb6\x2d\xbd\xfe\x30\x9e\xc7\xdb\x0f\xa3\xea\x7a\xae\x82\x36\xf2\x59\xb9\x22\xd4\x53\x61\x15\xa6\x3b\xc8\x9a\xcb\x20\x51\xd0\x9e\x73\x1c\xbb\x0d\xf1\x57\xd9\xd3\x45\xbd\x91\x09\x97\x3c\x2b\x59\x4f\x14\x8e\xfc\x6f\x33\x77\xde\x51\x63\xb7\xf6\x98\x69\xff\xef\x85\x3e\xae\xfe\xb4\x02\xe2\x35\x29\x59\x4f\xbd\x65\xca\x05\xfe\x40\x62\xc5\x29\xd8\xe3\x21\xab\xc0\x52\x00\xca\xc1\xe8\x39\xe8\x7b\x1f\xd3\xfd\xf0\x21\xd6\x8c\xbb\x3a\x41\x42\xb6\x9c\xc3\xaf\x6f\x63\x2e\xdd\x65\xb8\x3f\x5a\xa4\xcb\x17\xda\x5b\x6b\xa3\xfc\x03\xed\xb1\x7c\x2a\x3c\xb5\xb0\x48\x36\xe7\x66\x0e\x63\xc8\xa0\x48\x3e\x24\x39\x83\x37\x1d\xfa\x98\x39\xf9\x16\x4a\xd4\xda\x0d\x59\x53\x65\x5e\x3a\x95\x18\xe1\x36\xda\x74\x57\x37\xc7\x92\x43\xc3\x55\xfc\x12\x5c\xbd\xcc\x76\xae\xc9\x22\x16\x84\x6c\x45\x74\xf4\xf7\xf2\x98\xbc\xde\x54\xfd\x24\x44\xad\x30\x25\x95\x5c\x10\x03\x15\xde\x5a\x4e\x27\xc3\x33\xa0\x02\x84\xb2\xf7\x02\xfd\xd3\xde\x22\xac\x6c\x24\x0d\xbc\x14\xbf\x71\xe6\x2d\x13\x1b\x62\xf2\xdb\x99\x24\x73\xf2\xf9\x13\xf6\x0c\x91\x6e\xcf\x57\xdf\x5f\x3f\x02\x1f\xb3\x30\x83\x43\x95\xb7\x94\x72\xca\xff\x19\xfc\xfa\x0a\x27\x17\x95\xc7\x6d\x69\xb4\xdb\x3f\x85\xb8\xd2\xe5\xc3\x44\x19\x65\x48\x4d\xcc\x39\xab\xa5\x9b\x70\x12\x74\xf7\xfc\x42\x52\x46\x85\x60\x69"}, +{{0x43,0x92,0xf7,0xd4,0xfb,0xd6,0x8f,0xe1,0x54,0xe4,0xba,0x38,0xad,0x52,0x07,0x61,0x2a,0x06,0x48,0x55,0x60,0x56,0xc3,0x9a,0xc1,0x16,0xad,0x46,0x8f,0x89,0xbd,0x2d,},{0xcb,0xea,0xef,0x41,0xac,0xac,0x02,0xbf,0x1f,0x78,0x0c,0xe9,0x34,0xaa,0xbd,0x63,0x13,0x64,0xb3,0x69,0x56,0x7b,0xe1,0xbe,0x28,0xe3,0x90,0x6f,0x9d,0xb1,0x20,0xfa,},{0x86,0xe7,0xcc,0xf0,0x6e,0x79,0x36,0x2d,0x40,0xcd,0xb7,0xfb,0x75,0xa9,0x89,0x78,0xbb,0xd3,0x34,0xa1,0xdb,0x75,0x90,0x36,0x7d,0x60,0x84,0x9b,0xd5,0x3e,0x2f,0xb1,0xa4,0xbd,0xae,0x59,0x0d,0x1f,0x47,0xb5,0x49,0x0d,0x87,0x02,0xe7,0xc1,0xa8,0x72,0x68,0xb8,0xee,0x9d,0xb6,0x12,0xde,0x7b,0xdc,0x2e,0x38,0xfa,0x6d,0xeb,0x7e,0x05,},"\xcf\x17\x09\xdc\x9a\x08\x67\xee\x90\x87\x21\xb1\x36\xcb\x93\xa8\x42\x29\xe8\x3b\x46\x20\x47\x77\xca\x81\x94\xd0\x8b\x7a\x3c\xa9\xc9\x12\xeb\x24\x3e\x5b\xda\xbf\xee\xd3\x52\x34\x9d\x20\xbe\x80\x1b\x72\x2a\xf0\x89\x22\x38\xe7\x2e\xdf\x19\x0e\x63\x61\xf5\x75\x72\x78\x1a\xd3\xc2\x59\x0b\x19\x73\x57\x64\x1c\x80\x53\x83\xba\xa1\xd4\x97\x2f\x76\xc6\x54\x48\x53\x2c\x11\x08\x34\xa0\xba\xa8\xf4\x88\x63\xe1\x66\xb7\x06\x65\x37\x08\xcd\x40\x57\xd3\xa4\xf9\xfc\xb2\xce\xb4\x12\x00\x01\x27\x7d\x38\xc4\x38\x47\xd8\x22\x82\x2b\x77\x7c\x2b\xb4\xda\x40\x15\xa1\xc2\x4d\x41\x6d\x50\x62\xa8\x71\x84\x91\xd8\x55\xaa\xa5\xdb\xf5\x57\x9c\x16\x4d\x8e\x52\x4a\x9f\x2f\xa3\xf2\x2e\xb0\x98\x61\xff\xe6\xad\x65\x9f\xe3\x6e\xb4\x04\x31\x22\x2c\x22\xd7\x13\x7a\x6c\xab\xca\x8d\xb7\x86\xe3\x9d\x81\xf6\x61\xaf\xde\x4e\x39\x58\x9b\x4d\xb4\xd3\xc5\x1c\xa5\x35\x90\xa1\x4e\x11\x5d\x0a\xfc\x3a\x87\x7b\x83\x9a\x96\x38\xbe\xce\x80\xc3\x2c\x19\xe5\x1b\x75\x32\x02\x48\x45\xf7\x6c\xfe\x9b\xfb\x2a\xc0\x51\x30\xf6\x75\x8b\xf7\xfe\x99\x3a\xa9\x3a\xa2\x72\xe4\xe6\xbd\x0c\x75\xc1\x40\x99\xd4\x3e\x65\x2a\x22\x3e\x5b\xcd\x64\xc3\x62\xd4\xb8\xf4\xb9\x5e\x01\x6f\x93\x50\xc7\xfa\x74\xe6\x53\x52\x5d\x08\x01\x15\x58\xb2\xc6\xe9\xbf\x4f\xdf\x9d\xbd\x5e\xf9\xb0\x9b\xbc\x84\x6a\xfc\x2b\xcb\xc8\x6c\x4c\xcc\x31\x5f\x6d\x1c\xcd\x48\x9b\x0c\xf8\xed\x0d\x93\xf2\xf5\x32\xa4\x26\x26\x5c\x59\x0b\xa3\xa5\x90\x23\x34\x7d\x81\x9d\x9b\x28\x1e\xf8\x53\x10\xb0\x53\x16\xd4\x6c\x8a\x8c\x03\x65\xd0\x68\xa8\x70\x86\x64\xea\x4d\x77\xac\x0c\xd1\x50\xa6\x5a\x56\x58\x6b\xab\xd3\x4b\x74\x36\x5b\xb8\xfe\x3e\x61\x87\x26\x22\x84\xd6\x44\x32\xe4\xc8\x1e\xa4\xc0\xe5\x7c\x1d\x71\xae\x98\x0c\x7f\x4d\x1d\x87\x10\x32\xe1\x88\xbb\xf9\xd1\x75\x8c\xdc\x1d\xff\x98\x9f\x2d\x12\x88\xfe\xf4\xe2\x05\xe9\x9e\x7c\xbf\x2c\xc3\x24\xb8\xc9\x30\x46\xf4\x76\xc5\x9d\x3d\x0a\x59\xdb\x6f\xe3\x73\x82\xdc\x79\xc5\xec\x16\x05\x6a\xb3\x93\x4a\x52\xf7\xd2\x88\x0d\x04\x71\xa3\x77\xb6\xa8\xae\x84\xd5\x6a\xc2\x2d\x1d\x54\x55\x1c"}, +{{0x0b,0xea,0x98,0xab,0xe7,0xd6,0x3f,0x15,0x83,0x90,0xee,0x66,0x8a,0xa0,0x50,0xe8,0x4a,0x25,0xd2,0x89,0x3e,0x49,0xfc,0x83,0xf0,0x79,0xf9,0xbb,0xa6,0xa5,0x5a,0x75,},{0x22,0x19,0x2e,0xc0,0xd3,0x2e,0xf9,0x83,0x56,0x65,0xa6,0x1b,0xc8,0x8b,0xcf,0x4e,0x16,0x04,0x63,0x79,0x21,0x15,0x2c,0x11,0x6a,0xf5,0x03,0x36,0x5b,0xf6,0xbe,0x42,},{0x7e,0xb3,0x13,0x9b,0x88,0x0f,0xdf,0x66,0x37,0x6a,0x20,0x90,0x81,0x88,0x40,0x04,0x97,0x67,0xc8,0x37,0xf3,0xad,0x00,0x36,0xb1,0x41,0x66,0x70,0x52,0xb3,0x36,0x09,0x81,0x7c,0xa5,0xe2,0x40,0xed,0x8c,0xdf,0x3c,0xcf,0x3a,0xee,0x29,0x27,0x45,0x34,0x59,0x4d,0xb0,0xb4,0xcc,0xc5,0xc6,0xe5,0xbb,0xa3,0x28,0x0b,0x87,0x3f,0x29,0x01,},"\xc1\x78\xe3\x8d\x4e\x83\xed\x2b\xe5\x7c\xe1\xc3\xab\x64\x25\x3a\x81\x71\xe6\x10\x00\x81\x81\xfb\xfc\x6d\x75\x22\x69\xf7\xf1\xc5\xa9\xec\x62\xcb\x27\xf1\x9a\xd9\x9c\xe1\xf5\x11\x6a\x36\x3d\x96\xfd\xc5\xa4\x2f\x35\x8b\x6d\xbe\x7c\xab\xdf\xc9\xf6\x07\x18\xe4\x01\x2c\x1b\xb1\xf8\x42\xc5\x56\x08\x11\xba\x83\x74\xa0\x63\x77\x47\xff\x92\xea\xc2\x1c\xa6\x5d\xde\xaf\x43\xe9\x98\x9b\x7d\xe2\xd4\x32\x52\x0a\xfe\xe3\x64\xec\xfb\xa4\xda\x66\x9a\xd4\x89\x3d\x0b\xf6\x9f\x9f\x81\xe7\xdf\x69\x65\x7b\xe2\x2b\x92\x06\x97\x45\xf2\x16\xc2\x42\xcc\xd4\x6d\x02\xd3\x56\x16\xe1\x6c\x75\x5e\x0e\x37\xf9\x61\xa6\xf3\x63\x77\x52\x53\x4f\x6d\xfa\xb8\x80\x5a\xb7\x59\xa0\x32\xa4\xe7\xe4\xc8\x19\x53\x32\x5a\x2f\x68\x6b\xb6\x9a\x02\x9c\xe4\xe0\x3b\xec\xb3\x60\x56\x37\xc5\xa6\x5b\x52\xe3\x31\xc2\x6c\x92\x6e\xd4\x71\x1a\x50\x4d\x37\x33\xbb\x53\xc9\x7b\x80\xea\xfe\x4e\x75\xdd\xd9\xf4\x15\x36\x28\x88\xc3\xd4\xd3\x7b\xae\x0e\x63\xfa\x11\xbf\x75\x56\x66\x43\x7d\x72\xf5\x8c\x91\xd7\xa2\xf8\xcb\x61\x9b\x76\x20\xa0\x70\xb2\x6b\x18\xb4\xd5\x01\x84\xc5\x81\x87\x12\x11\x0e\x36\xd3\xe2\x83\x0f\x6a\x85\x76\xba\x57\xf9\xcc\xcb\x8f\xff\x40\x28\xbf\x8e\xf9\xcb\x81\x48\x25\xbb\xca\x82\x7d\x64\x95\x47\xbf\x6f\x2b\xef\x93\x17\x04\xca\x7f\x6d\xf1\x5f\x78\x01\x55\xed\x46\xea\xa7\xca\x7d\x72\xe2\x24\x34\xca\x04\x83\xbf\xb2\xf7\x90\x2d\xc7\x87\xf6\x17\xeb\x9b\xd4\x1e\xd4\x52\x0a\xdf\xd4\x30\x94\x8c\x71\x08\x05\xa7\x3c\x1b\xa5\x49\x2e\x96\x48\x4c\x4b\xaa\x7d\xa2\x4c\x74\x35\xc4\x6a\x05\x2b\xf3\x51\x5d\x33\xe4\x2d\xce\xf5\x17\xca\xa4\x5f\x36\xc8\x79\x12\x10\x78\xc6\x88\xdd\x10\xd7\x66\x56\xa1\x19\x76\x2b\x6a\x83\x41\x36\xfa\x1f\x8a\x64\x32\x24\xb9\x22\x4c\x54\x3c\xf0\x47\x0b\x3f\x8e\xe0\x17\xd6\x20\xdb\xdc\xc8\x4d\x98\x51\x54\xe9\xd1\xae\x80\xe5\xf1\x43\x87\xb8\x8a\x0f\x6a\x5c\x35\x90\x5a\xa5\x7f\xb3\xab\xeb\x0e\xa6\xec\xcd\xdb\x00\x44\x74\x63\x3c\xc4\x83\xb5\x6b\x8a\x8e\x20\xe8\xf2\xe0\x9e\x97\x9a\xa0\x98\x93\x08\x78\x75\xc6\xb1\x17\xb5\xf1\x38\x47\xad\x8f\xc0\x56\x04\xc4"}, +{{0xc2,0x58,0x78,0xb0,0xd1,0xe0,0x92,0x5c,0x8f,0x5f,0x04,0xa1,0xe5,0x79,0x90,0x80,0x96,0x3c,0x41,0x3a,0x13,0x99,0xc1,0x18,0xaf,0xb1,0x68,0x7c,0x79,0x7f,0x48,0x39,},{0x13,0xac,0x2c,0xad,0x41,0x90,0x8c,0x25,0x5f,0x67,0x1f,0x93,0x93,0x4a,0xe5,0xd7,0xbe,0x32,0x53,0x46,0x72,0x5c,0x8b,0x40,0xdc,0x39,0xea,0x80,0xd7,0x0d,0xdf,0x34,},{0x06,0xf5,0x51,0x98,0xb4,0x19,0x19,0x14,0xb7,0x43,0x06,0xf3,0x8e,0x38,0x13,0x16,0xea,0xc4,0x0b,0x5b,0x5a,0xdb,0x8a,0x31,0x24,0x64,0xf6,0x71,0x75,0xec,0xf6,0x12,0xe0,0x14,0x7b,0x1c,0xef,0x46,0xc2,0x51,0x87,0x50,0xa5,0x60,0x6b,0xb0,0x3b,0xc6,0x46,0x7b,0xb9,0x32,0x15,0x14,0xf6,0x9d,0xcb,0xeb,0xce,0x8f,0x69,0x05,0x80,0x02,},"\x68\x56\xcc\x71\x44\xb6\xbd\xdc\xc4\xb5\x89\x54\xd1\xa2\xe7\x10\x1d\x65\x84\xb5\xd5\xe7\x19\xa0\xae\xa0\xfb\xbd\xf2\x21\xc2\xa2\xaa\xcb\xac\xdc\x40\x20\xc5\xc8\xce\x68\x1f\xf7\x38\x1a\xcd\x60\x7b\x0f\x52\x39\x69\x23\x35\x70\x06\x55\xbe\x2d\x94\xc5\x3d\x7b\x51\x48\xe9\x2a\x2b\xc1\x63\x38\xc2\xf4\xc1\xa7\xd1\xc5\x95\xaf\x62\x2c\x24\x0c\xe5\x79\xa5\xe0\xf5\xb6\x51\xbf\x56\x25\x18\xce\xc8\xaa\x2c\xe4\xb4\xaa\xdb\x1f\x2f\xda\x6c\xf6\x29\x5b\xc3\x78\x03\xb5\x37\x7d\xab\x65\xc9\xb9\xa2\x94\x9f\xdd\x49\xbf\x9d\xdc\x8f\x96\xd2\x60\xff\x95\x1b\xf8\xe8\xcc\xf9\x82\x7e\x68\x69\xc4\x4b\xfd\x97\x33\x58\xce\xfd\xb0\x10\xdb\x5e\x1f\xe5\xdb\xd9\xf5\xd2\xb2\xca\x39\x3c\x17\xd4\x46\xf6\x37\x05\x9e\x69\x2d\x7a\x91\xaa\xdc\xc7\x68\x9f\x5f\x9e\x1b\x30\x52\x17\x5d\x9b\x6b\x20\x8f\x90\x26\x78\x7f\xdb\x66\x78\x3f\x45\x37\x2a\x24\x94\x6b\x1b\xd1\x68\x7b\xf0\xcf\xcc\x81\x74\xeb\xe4\xd3\x2e\x43\x28\x4f\xc7\x8d\x78\x44\xde\x0f\xa2\x2e\x20\x65\xe0\x75\x28\xba\xab\xaf\x01\x5c\xb3\x4d\x62\x9c\x35\x96\xad\x04\x0d\xe3\x1c\x56\x20\xeb\x26\x6d\xef\xa7\x53\x3a\xc0\x40\x19\x98\xe5\x67\x3a\x75\x43\x65\x04\x7d\xeb\xfc\xf7\xe1\x37\xa2\x0d\x16\xcd\xd6\xa5\x52\x19\x82\xf4\x44\xcf\xc3\x42\x93\x97\xc6\x41\xbd\x7e\x74\xa7\x70\xbb\x11\xfc\xb2\x94\x83\xe3\x37\xba\xe5\x16\x9e\xe8\x2d\xa9\xa9\x1a\xdf\x3a\xf6\x7c\xd8\x14\xc2\x82\x5d\x29\x01\x8e\xf0\x35\xea\x86\xf8\xde\x4c\x75\x63\xaa\xf6\x6e\x0c\x75\xd1\x7c\xa6\x8f\x49\xf0\x75\x8e\xc2\xd9\xc5\x17\x9d\x01\xaa\xed\x7d\x45\x15\xe9\x1a\x22\x2b\x0b\x06\xfb\xde\x4f\x07\xa7\xd9\xdf\x2d\xe3\xbc\xae\x37\xca\x2c\x84\x60\xc2\xa6\xb3\x74\x9e\x9b\xda\x36\xd0\x8e\x66\xbc\xc3\x56\xb3\x90\x43\x4b\x4a\x18\xcf\xa4\x5a\xf5\x57\xdc\xa3\xd8\x57\xff\x3a\xd3\x47\xcf\xb0\x7e\x23\x58\xc2\xac\xfd\x5c\xd5\x3b\x3b\x0e\xa2\xa4\x1e\xe5\xc0\x80\x2f\xd4\x73\xdb\x5f\x30\x52\x63\x34\xda\x41\xeb\x4b\xc7\x51\x83\x83\x89\x8a\x0b\x75\x07\xad\x4c\xa2\x89\xd6\x6c\x5e\x2e\xb7\x5c\xf2\x55\xdf\xf3\x12\xcb\x1e\x04\xee\xbe\xb4\x7f\x29\x30\xb9\x0d\x5e\x00\x2e\xb0"}, +{{0x0b,0x2e,0xc6,0x27,0x63,0xf6,0x87,0x59,0x31,0x35,0xda,0x19,0x61,0xef,0x29,0xa2,0x88,0x08,0x96,0x96,0xd9,0x44,0xb2,0x65,0xa5,0xf9,0x68,0x93,0xcd,0x2d,0x82,0x25,},{0xc1,0xe2,0x34,0xfa,0x8b,0xc9,0x6d,0x26,0x8e,0x7a,0xad,0x02,0x8b,0x03,0xf0,0xa9,0x11,0xb6,0x97,0x71,0x5d,0xb3,0xa2,0x1c,0x2f,0xc7,0xdf,0x48,0xec,0xda,0x88,0x75,},{0xff,0x70,0x1f,0x34,0xb3,0x59,0x4d,0xe3,0xb8,0x00,0x45,0xf4,0x29,0xe5,0xe3,0x2d,0xd8,0x8d,0x60,0x51,0xd4,0x19,0x5f,0x16,0x85,0xbe,0x78,0x37,0x66,0xe8,0x01,0x19,0x36,0x8f,0x56,0xb3,0x74,0x97,0x25,0xb9,0x13,0xf1,0x22,0x3f,0x87,0xfb,0x0f,0xb2,0x4d,0x9d,0xfa,0x08,0x41,0xd6,0xa0,0xe2,0xeb,0x1f,0xdd,0xf7,0x75,0xc2,0xd2,0x05,},"\xa8\x34\x34\xc6\x86\x93\xd5\xfc\xed\x91\xbd\xa1\x02\x13\xfc\xd5\x0c\x48\x92\x0b\x90\xce\xe9\xb7\x3a\x9c\x61\x08\x1a\x09\x74\x93\x3f\x4f\xdb\x0a\x67\xe6\x71\xf8\x35\x1b\x0e\xd5\xec\x0f\xe7\xb5\xfb\x0c\x87\x58\x6f\xe5\x82\xff\xb1\xbf\xa2\xdb\x5f\xce\xdd\x33\x02\x42\x82\x34\xb2\xbb\x0e\x72\x6d\xed\xf4\x5b\x13\xa7\x0c\xd3\x5a\xb3\xe2\x99\xd1\x3f\x34\x50\x35\x08\x27\x8c\x44\x58\xee\xa5\xb7\x35\x1b\x05\x83\x6b\xda\xd5\xb0\x5f\x60\xe4\x45\xfc\x65\x73\x7a\xe2\x7d\x2e\x52\xdf\x9c\x39\xe5\xda\x02\x86\x39\x2d\x08\xff\xf7\xec\xb7\x06\x68\x20\xfc\x90\xfc\x8a\x44\xd5\x61\x65\x61\xc5\x0b\x52\x71\x47\x02\x30\x2b\xca\x58\x74\xde\x85\xdb\xa0\x45\x04\x5f\x9f\x0e\x60\x4e\xb8\x6d\x6d\x7f\xbd\x77\x5f\x72\xea\x49\x3b\x2c\x4e\xf7\xc3\xbe\x16\xdb\x2c\xa7\xe4\xd8\xbd\x79\xeb\x20\xcf\xb5\xf0\xf6\xf0\x53\x36\xb7\x5c\xc8\x6d\x21\x9f\x3b\x8f\x2e\x91\xba\x7d\x52\xb6\x4f\xdd\x6a\x66\x64\xf0\x4f\x2f\xba\xb7\x58\xcd\xf9\x84\x16\x86\x91\xc3\x2f\x53\xe8\x61\x6b\x49\xf7\x6a\xb7\xb1\x92\xb9\x00\x90\x30\x82\xcc\x89\x65\x6a\x97\x05\x80\x4c\xc9\xb9\x28\x8a\x3e\x42\x17\x09\x84\xf8\xdc\x45\x4e\x08\x64\xb9\x34\x16\x72\x68\x6a\x17\x8c\x06\x00\x50\x17\x8a\x36\xc6\xd9\x06\xb2\xce\x07\x0d\x8f\xaa\xac\xd9\xa5\x8c\x79\x4a\x5e\xa4\x10\x8b\x4a\x48\x5c\x65\x81\x1c\x2d\xca\x2e\xe7\xbb\x10\xbf\xff\xf7\x5d\x45\x86\xb9\x90\xf4\x37\x63\xa1\x6f\xbc\x0b\x48\xae\x1f\xaf\xb0\x8a\x9a\x36\xfa\x43\x26\x84\x5d\xba\x5b\xa2\xfb\xd3\x2b\xbf\x66\x50\x5c\x5e\x86\x57\xed\x01\x07\xe3\xe1\x61\x44\xef\x31\xfa\x6a\xae\x72\xe7\x74\x09\x74\x83\xf5\x48\x0a\xa4\x55\x40\x56\x8f\xd0\x8c\xba\x0d\x57\x77\x68\x00\x4f\x58\xae\x9b\x95\xbe\x37\x4e\xd7\xf0\x29\x9f\xe7\x21\x27\x5e\x47\x6e\x0b\x9a\xb7\x2d\xc0\x6e\xa3\x28\x38\x4e\x39\xbf\x3a\xc3\x31\xc6\x25\x48\x43\x12\xcd\x9b\x06\xb1\x5a\x29\x54\xd3\x3e\x7a\xab\xa6\xbe\x22\x61\x88\x6c\xa8\x11\xdb\x96\xb1\x14\x3d\x06\xdd\x6e\x0f\x3c\xba\x7a\x1a\xe9\xb9\x4e\xaf\x67\x77\x1b\xb2\xd2\x4e\x2f\x94\xde\x9c\x47\x0f\xcd\xe7\xbf\xdb\x32\xf4\x10\x19\x8b\x5a\xa9\x69\x8e\x32"}, +{{0x89,0x60,0xd7,0xbe,0xe8,0xc6,0xb3,0x9c,0xa5,0x93,0x4d,0x7c,0xdd,0xd1,0x6f,0x16,0xb3,0x66,0x3e,0x6e,0x03,0xe8,0x33,0xc0,0x57,0xe2,0x18,0x1e,0x45,0x97,0xcb,0x68,},{0x43,0x40,0x90,0x95,0xd4,0xf5,0x0f,0x5e,0xdd,0xbd,0x5c,0xd4,0xd2,0x01,0x22,0x98,0xcb,0x41,0xa4,0x0e,0x99,0x49,0x2d,0x5a,0x2d,0xb0,0x8b,0xe5,0x37,0x7e,0xa1,0x83,},{0x72,0x13,0xdd,0x4a,0x79,0xfd,0x54,0xde,0xc0,0xc5,0x48,0xef,0x42,0xe6,0xca,0xe0,0x15,0xbe,0x77,0x80,0x2b,0xf5,0x15,0xcd,0x25,0x82,0x76,0x8f,0x72,0xf5,0x63,0xeb,0xb2,0xda,0x36,0xaf,0x4a,0xae,0xac,0x56,0xbb,0xff,0xc9,0x93,0x2c,0x2e,0x24,0xec,0x95,0xda,0xff,0x00,0xa5,0xf7,0xa0,0xac,0xab,0x9c,0x8b,0xd3,0xc2,0x3b,0xb4,0x0c,},"\x30\x8d\x84\xc7\xa5\xf7\x86\xe5\x63\xe5\xc1\xea\x57\xaa\xb5\xe5\x55\xc0\x09\x97\x74\x9d\x15\xae\xe3\x54\x39\xef\xa6\x45\xda\x2c\x39\x67\x70\x31\x15\xc6\xc6\x3e\xd7\xf9\x47\x85\xc5\x47\x8f\x38\x46\x7b\x86\xe7\x62\x6e\x8f\xff\xa4\xd5\x1a\x2d\xc4\x5e\x6d\xf2\xa3\x5c\xec\x99\x55\x5e\xab\xc9\xf7\xa9\x3e\x2e\x2b\x68\x94\x59\xb4\xe0\xc9\x2b\x35\x15\x62\xc4\x17\xb1\x99\x71\x13\x75\x4e\xa5\x9e\x4a\x91\x51\x07\x28\xff\x30\x71\xa2\xbb\xd1\xf4\x65\xa6\x87\xf6\x7d\xae\x95\x56\x15\x03\x1a\x8a\xd5\x51\xfe\x73\x8a\x26\x0b\xbc\x44\x6b\x48\xdc\xa1\xd9\x79\x05\x1a\xb5\x84\x08\x32\xe1\x9d\x47\x3b\x66\x62\x17\xa9\x18\x39\x80\xd6\xb2\x7e\x3d\x3c\x76\xd9\x36\x65\xba\x23\x93\xe6\xab\x1a\x42\xc3\x90\x4d\x40\x25\x93\x2d\x60\x1a\x20\x2a\x59\xa4\xc4\x9f\xdb\x77\xf0\xe0\x28\x68\x24\x7d\xe5\xaf\xdf\xaa\x1b\x89\x42\x08\xac\x00\xd7\x7c\x6b\xb5\x4c\x6b\x2a\x73\xa4\x76\x57\xe4\x4c\x85\x13\x79\x63\xb5\x75\x21\xaf\x20\x97\x62\x48\xeb\x26\x14\x82\x14\x7c\xdf\x7a\x14\x5c\x36\x43\xe2\x9e\x05\x88\xbf\xda\xe6\xa0\x82\x90\x48\x53\xce\x5a\x10\xd2\x49\x70\xeb\xdf\xb7\xf5\x9d\x5e\xfd\xd6\xa5\xe7\xe0\xd2\x87\x97\x1c\x84\x6a\xcd\x54\xd8\x4d\xd4\x54\x68\xa4\x11\x0b\xab\x6e\xf8\xd9\xa5\xb4\xb2\x42\x67\x88\x90\x0b\x7e\x1a\xdf\xe0\x62\x43\x44\xf9\x8f\xe5\x9e\xf8\xa1\xe6\xc4\x05\xb3\x44\xeb\x97\xbb\x20\x47\x73\x74\x4b\x6a\x2d\x8c\x6e\x65\xd1\x7c\xea\x07\xde\x03\xb7\xf0\xfe\x49\xf1\xa5\x5c\x33\xd5\xf1\x5c\xe5\x5d\xf7\xc9\x56\x1b\x25\x1c\x6a\xc8\x07\xa9\x25\x53\xe1\xce\x91\x70\x12\xdc\xcf\xd6\x9e\x7d\xbd\x03\x8c\x7e\xee\xca\xe9\x86\x23\xf1\x8f\xbb\x65\x0e\x22\x18\xa0\xbc\x0f\xff\x43\xa7\x5a\x11\x64\x48\xbb\x73\x62\xf5\x27\xee\x6b\xc8\xe1\x07\x61\xcc\xcf\x9b\xcf\xc0\xd0\x00\xf2\x12\x7b\x4c\xc1\x92\x11\xd0\x95\xa0\xbd\xaa\x4e\x4b\xe4\x51\x9e\x6c\x84\x45\xea\xb9\xb3\x14\x4a\x45\xca\xb9\x99\x61\x35\xbf\x7f\x75\xa7\x8d\x22\x27\x59\x00\xf4\xce\x1f\x0a\x9e\xac\x13\x63\x64\x10\x30\x62\x89\x3d\xad\x43\x90\x42\x2b\x77\xe5\xf5\xd1\xd9\x4d\x70\x29\xc6\x09\x7b\x35\xca\x64\xa7\xa4\x76\xfc\xc7"}, +{{0xef,0x6b,0x9b,0x51,0xfd,0x4f,0x85,0x86,0xca,0x62,0x65,0x8e,0x04,0x2f,0xc0,0x9a,0x83,0xb9,0x43,0x03,0x35,0x26,0xff,0xc3,0x26,0xc6,0x5e,0xb3,0xa5,0xfb,0x59,0x4b,},{0x1d,0x6e,0xec,0xe8,0x05,0xe0,0x88,0x78,0x21,0x87,0x6b,0x7e,0xd6,0xed,0x5b,0x07,0x14,0xd6,0x46,0xfb,0xec,0xda,0x38,0x76,0x4f,0x94,0xc8,0x15,0x5e,0x61,0xd0,0x04,},{0x71,0xd1,0x71,0x07,0x1c,0xd0,0xfe,0xa1,0xc6,0xa9,0xcf,0xad,0x1f,0x7f,0xd8,0x35,0xe8,0x5f,0xf9,0x06,0x77,0x8b,0xc6,0x34,0x5a,0x4d,0xec,0x43,0x13,0xec,0xc2,0xbf,0xf7,0x55,0xa7,0x17,0xeb,0xd9,0x12,0xa5,0xe0,0x28,0x40,0xac,0x07,0x38,0x42,0xf9,0xbf,0xca,0xa5,0x89,0x13,0xe2,0x60,0xe3,0xc7,0x33,0x93,0xd3,0x66,0x85,0xc7,0x0e,},"\xa8\xf3\xf1\x96\x65\xde\x23\x90\xd5\xcc\x52\xb0\x64\xb4\x85\x12\x73\x67\x74\x86\xd8\xf5\x56\x3b\xb7\xc9\x5f\xa9\x4d\xb3\x35\x61\x61\xee\x62\x22\x21\xf1\x0c\xbb\x1f\xa1\x95\xaa\xc7\x23\x1e\xa7\x16\xd7\x4b\x46\xb3\x7b\xc8\x5a\x70\xdb\xa3\xdf\xaa\x16\x75\x21\x7b\x35\x11\x99\xe7\x4a\x97\x10\x28\xf7\x29\xb7\xae\x2b\x74\xae\x8c\x6b\x3a\x06\x79\xc3\xe3\x29\x68\x02\x84\x4a\xd5\xbb\xa3\x43\xf6\xf9\xf7\xc4\x66\x1b\x4a\x29\xb4\x4f\x17\xe8\x9e\x11\x4f\xb2\x20\xe9\x84\xcd\x98\x0e\x94\xc3\xd2\xbf\x98\x73\xe0\x60\x5c\x92\x30\x17\x44\xa3\x03\x5e\xf0\x46\xba\xd2\x66\x6b\x5c\x63\xeb\xec\xf9\x3c\xc1\x40\x29\x19\x46\xc0\xfa\x17\x03\x40\xce\x39\x50\x92\xde\xed\x79\x84\x13\x52\xfb\xfe\xe0\x3a\x92\x7e\xb4\x58\xf2\xa6\x33\xed\x32\x71\x65\x2f\x5b\x0f\x99\x60\xcd\xf9\x01\x5d\x56\xfd\xab\xd8\x9e\xe7\x1e\x25\x9a\xf6\xeb\x51\x4b\x4c\x1b\xd4\xa6\x66\xf5\xb5\xa3\x5c\x90\xf3\x5b\x14\x94\x57\xaf\x29\x44\xdd\x0a\xa8\xd9\xb5\x42\x28\x3a\x7e\x54\x12\xb7\x75\xe4\x21\xd2\x12\x6f\x89\xbe\xbc\x3c\xa3\x7f\x73\x07\x16\x21\xf1\x32\x1e\xee\x52\xe9\x69\x04\x86\xa3\x3c\xd7\xff\x9c\x99\x67\xfb\x65\xee\x4e\x90\x7b\x6b\x85\x22\x11\x47\x3d\x21\xe9\xd9\x1a\x93\x36\x2a\xc7\x61\x76\x0e\x8c\x7b\xbe\xa4\x86\xc3\xd6\x05\xf9\xe1\x1b\x86\x13\x68\x19\xa7\xab\x3f\x32\xf1\x3f\xfc\xa1\x68\x17\xfe\xd1\x97\xff\x88\x0b\x4d\x6d\x9a\x80\x8f\x7f\x87\x87\x63\xa0\x45\x72\x8d\xf7\x2f\xaa\xa9\x63\xe4\xcb\x1c\x09\xcc\x2b\x2d\xa9\x20\x28\x0c\x83\x66\xb7\xd1\x8b\xf8\x97\x2d\xf1\x6c\xc2\x34\x48\xfb\xe6\xb2\xe6\xe1\x6c\xbb\xf0\x74\x51\x29\x85\x40\x53\x18\x96\x37\xce\x11\x5d\x23\x98\x43\x3c\x15\xd6\xf1\x16\xa2\x05\x33\x48\x24\xaf\x28\x2f\xa7\x58\x49\x4c\x47\x86\x8e\xa8\xf4\xdf\xad\xc7\x05\xe8\x61\xaa\xd2\xeb\x8e\xf3\xdb\xbe\xd2\xa4\x56\x9e\x15\x83\x4a\x76\x0c\xce\x0c\xbb\xc8\x4b\x28\x9e\x77\x9b\x98\x83\x46\xb9\x06\x9c\x74\x4c\x97\xab\x2b\xf4\x2b\x08\x6d\x2f\xb0\xa4\x11\xf5\xce\x99\xf0\x81\x9a\x30\x86\xb4\xfe\x9d\x96\xc7\xc9\x90\x8d\xce\x28\xdf\x1d\xdd\x30\xf3\x50\x1d\xda\xf7\x81\x10\x73\x4f\x9d\xcd\xfe\xc3"}, +{{0xba,0xd4,0x7c,0xd4,0xbd,0x89,0x84,0x90,0x67,0xcc,0xe1,0xe6,0x3c,0x3d,0x91,0xe9,0xb7,0x87,0xae,0xa8,0x58,0x4e,0xdb,0x07,0xf3,0x45,0x1e,0xf6,0x7e,0x7b,0xd7,0x9b,},{0xab,0x0c,0xe9,0xba,0x1d,0x29,0xbd,0xfb,0x85,0xa0,0xe6,0x6b,0x76,0xb5,0xe2,0xe0,0x5f,0xf7,0x32,0x56,0x9e,0x43,0x75,0xcc,0xd7,0x50,0x98,0xe9,0xe7,0x1d,0x17,0xbf,},{0xe5,0x72,0x4a,0x1d,0xd4,0x63,0xa9,0x7d,0x12,0x22,0xc5,0x18,0xc4,0x92,0x5d,0x32,0x22,0x02,0xd1,0x0f,0x04,0xcd,0x07,0x8e,0x77,0x1e,0x0f,0xb3,0x95,0x1d,0xbc,0x14,0x93,0xa2,0x34,0x46,0x07,0x54,0xc3,0xaa,0xe3,0xdf,0x93,0x00,0x8d,0xbb,0xfb,0x31,0x0c,0x99,0x59,0x2b,0xed,0xe7,0x35,0xa4,0xae,0xab,0x03,0x23,0xa1,0x21,0x0d,0x0e,},"\xb5\xa6\x1e\x19\xe4\x86\x3e\x0b\xb5\xf3\xfa\xb6\xc4\x97\x0d\x87\x85\x96\x89\x55\x21\xfa\x1e\x7f\x67\x8c\xaf\xa2\xde\x53\x32\x2f\xd4\x58\xa9\x8a\xa6\xe3\x58\x05\x42\x9f\x65\x12\x91\xb9\x5b\xd9\x95\x0e\x15\x5f\x3a\xda\x0b\x60\x91\x59\xa4\xab\xda\x59\x90\xc0\x4b\xc2\xe7\x64\x42\x2f\xb4\x9e\xf4\x2f\x12\x52\x9f\xf6\xf6\xa8\x20\x29\xff\x01\x85\x66\x2e\x65\x8f\x83\xc5\x46\xee\xd0\x9f\x06\xb5\xa6\x8e\x85\x7c\xda\xd0\xeb\x9e\xc4\xee\xcb\xfd\x88\xf3\x4b\xc8\x09\x90\xf8\x64\x4a\x9b\xfd\xde\x1d\x9f\x3a\x90\xd5\x57\xa8\xb8\x28\xd5\xce\x06\xa6\x4e\x3b\x23\x85\x82\xbb\x4c\xbe\xba\x30\xed\xc4\x9e\x81\x22\xc5\x5e\x95\xba\xdc\xf5\x02\xcc\x56\x78\x69\xc0\x9e\x9f\x46\xc6\xff\x3f\x68\x78\x98\x6b\x1d\xe0\x0b\x72\xa1\x85\x80\x46\xfc\xd3\xa6\xe9\xcd\xaf\x5b\x07\x3c\x56\xf2\x02\x50\x63\xa2\xd1\x78\xbd\x4c\x1e\x8c\xbc\x1e\x6e\x67\x1a\xa9\x7f\xb2\xcb\x4c\xc8\xa6\x2c\x20\xbe\x41\xc7\x76\x37\x2c\x8e\x7b\xe6\x3b\x48\x2e\x6c\x63\xfa\x85\xd7\xcf\xfb\xc1\xb2\x82\x0b\xae\x1f\xc1\x28\x34\x3a\x1e\x20\xfc\xf1\xbc\x35\x02\xee\xe8\x13\x58\xcc\x9a\x74\xc7\x2a\xf6\x35\x30\xf9\x6a\x25\xa6\x04\x64\x8f\xf5\x70\xdf\x1e\xb8\x9d\x1f\xdd\xba\xb2\x86\x79\xba\x2e\x9b\x41\x97\x7e\x9a\x9c\x1c\xae\xcd\xbf\xc3\x61\xa1\xdd\x05\x5e\xc5\x16\x20\xa9\xbb\xdb\xba\xf7\x18\xc9\xcc\x13\x6d\x20\x07\x71\x03\x99\x53\x6d\x13\x33\x24\x85\xec\x38\x87\x97\x85\xe0\xc9\xce\x99\x15\xa8\x02\x51\x37\x39\x90\xa5\x9b\xce\x44\x03\x26\x03\x1a\xb1\xb4\x58\xbf\xa5\xb8\xa4\x79\x3d\xa4\xee\x11\xab\x7a\xf2\x0d\xe2\xa1\x18\xc9\xae\x52\x1a\x41\x7b\x68\x20\x7f\xc8\x85\xe1\x09\xd8\x46\x3e\x9f\x02\x27\x87\xcc\x73\x0d\xb0\xb1\xfa\xae\xd2\x57\xbe\xd9\x01\x71\x08\x85\xb7\x4e\x99\x4f\x54\xf6\xf2\xae\xb6\x4f\x0f\x60\xb5\x9e\xfb\xf2\xe3\xbb\x65\x15\x42\x46\x03\xa1\x13\xc0\xb8\xa3\x1b\xa3\xc1\xe9\xa9\xb8\x11\x8c\x87\xec\x69\x49\xb7\x5f\x49\x62\x7e\xa7\xb1\x32\x88\x89\x39\x11\x04\xd4\xf4\xa3\x89\x2c\xf0\x0f\x26\xa7\x3c\xda\x2a\x40\xf9\xb7\x15\x7a\xfc\x40\x66\x7f\x4a\x04\xf6\x47\xdb\xf9\x39\x06\xb8\x4c\x9a\x35\x16\x4e\x1b\xc9\x02"}, +{{0xca,0xba,0x8e,0x05,0x33,0x11,0x3a,0x4b,0xe1,0x73,0x40,0x8b,0xa8,0x3c,0x0d,0xb7,0x42,0x60,0x80,0x2f,0x91,0x86,0xc3,0x91,0x40,0x26,0x55,0xac,0xde,0x60,0x15,0xcb,},{0x2d,0x7b,0xef,0x61,0x64,0xc2,0x79,0xfa,0x10,0x28,0xa9,0x78,0x8e,0x3e,0x8e,0xe8,0xac,0x15,0xed,0xcf,0x92,0xa5,0x85,0x50,0x62,0x95,0x23,0x10,0xb4,0x68,0x45,0x47,},{0xec,0x35,0xec,0x32,0xc8,0xa4,0x00,0x88,0x27,0xe1,0x78,0x49,0x2b,0x3b,0x8b,0xee,0x22,0xa4,0x95,0x4f,0xc6,0xb2,0x5f,0x4f,0x22,0x5d,0xd7,0xed,0x23,0x69,0x89,0x00,0xde,0x81,0x56,0x75,0x6a,0x8e,0xdc,0x35,0xc5,0x1d,0x10,0xf8,0x2b,0x83,0x0a,0x2a,0x65,0x96,0x76,0xea,0xc9,0x11,0xf9,0x60,0x24,0x47,0x66,0xe0,0xc3,0xc6,0x07,0x05,},"\x24\x13\xa3\x2b\xca\x5c\xe6\xe2\x30\xe5\x65\xeb\x85\x84\x93\xd5\xd0\x4e\x6d\x2e\x2a\x7a\xb1\xf8\x9a\x3b\x42\x33\x11\x67\x6b\xfa\x93\xc6\x7d\xaa\xfd\x1c\xfc\x71\x09\xe0\x40\xba\xc5\x2c\xbf\xe0\x7c\x28\x28\x0b\xb6\xac\xf6\xe3\xa3\x10\x73\xda\xb2\x96\x53\x78\xdd\x77\xf6\x1f\xe9\x24\x71\x35\xc1\xa6\x31\xb7\x9a\xd6\x68\xc9\xea\x1c\xd4\x11\x2d\x8d\x3a\x06\x4c\xc2\x1d\xf3\x2a\xea\xc7\xdd\x71\x8b\x09\x1f\xb6\x91\x5b\x8b\xc0\x63\xbb\x58\x15\xc3\x76\xe0\x14\x76\x31\x2a\x2e\x54\x33\x41\x7a\x7a\x93\x15\xd6\x59\x99\xb0\x2f\xf4\x64\xa4\x74\xa5\x97\xe5\x39\x88\x77\x36\x70\xec\xa4\x6a\x6e\x26\xcf\x96\xe9\x48\x8e\x9e\x63\x44\xbc\x78\x3d\xdf\xb5\x35\xe7\x6b\xb3\xb9\xa6\x03\xff\x4c\x59\xc7\xdb\xe2\xd8\xb6\x19\x8d\x5b\x24\x49\x0b\x4e\xa9\x6c\x95\x95\x9f\xfb\xf3\xd8\x21\x8e\x76\x0d\xaf\x20\xe0\x1e\x2f\x36\xc8\x4b\xb0\x97\x11\x5a\xbd\xde\xe9\x2b\xed\x82\xd1\x6b\x15\xa9\xe1\x92\xe9\x89\x3a\xc6\x38\x46\x1d\xf5\x07\x20\x7b\x0c\xf5\x95\x88\x4d\x8a\x99\xfb\x9c\x70\x45\xf9\xbf\xf7\xb7\x3f\x00\xca\x3f\xd5\x95\xa5\xce\xc2\x92\xad\xb4\x58\xbd\x94\x63\xbe\x12\x04\xd0\x16\x78\xd2\xf4\x38\x9b\x87\x20\x11\x5f\xa5\x97\xc4\x02\xb4\xff\x69\x4b\x71\xce\x4f\x3d\x33\x0d\x5e\x2f\x3c\x3a\xd6\xd9\x6a\x9b\x34\x39\x23\x0f\xc5\x3a\x44\x79\x4c\xda\x59\x55\x57\xc4\x06\xca\x15\x89\xbc\x7b\xe8\x1e\x2d\x79\x63\x60\x33\x25\x3f\xa7\xbd\xd6\x00\xc6\x7f\xc5\x59\x36\xbd\x96\xce\x04\x28\xc3\xeb\x97\xba\xd1\xde\x0a\x5f\xbb\x9b\x67\x51\x57\xde\x5f\x18\xbc\x62\xa7\xc2\x2c\x94\x83\xe2\x80\x2e\x67\x9b\x5b\x8f\x89\xdb\x0f\xc3\x7f\x7c\x71\x50\xad\x5a\xc8\x72\x2c\xeb\x99\x9b\x24\x35\xe6\x99\x72\x17\x09\x23\x36\xef\x1c\x8a\x22\x92\xda\xb9\xa4\x6f\xf8\xa9\xe1\x0d\x33\x55\x76\x5c\xac\x9d\x65\x98\x77\x0f\x4f\x01\xea\x63\x91\x25\xfd\x03\x16\x09\xdd\x1a\x50\x7d\x96\x28\x0c\x7d\x01\xa3\xee\x98\x7e\x9b\x21\x0e\xc8\x74\x4c\xd4\x8c\x74\xf8\xaf\xee\x96\x1e\x8e\xf2\x21\xf8\x26\xa1\xfe\x6e\x7d\xf0\xcb\x15\xad\x7c\x7e\xf4\xa9\x1f\x9d\x0f\x4c\x2e\x1b\xde\xa6\x35\xd2\x75\xfa\xc8\xc4\xbc\x06\x01\xf4\x90\xdb\xdb\xc7\x34"}, +{{0x9b,0xf3,0xfb,0xc7,0x30,0x8b,0x46,0xf6,0x03,0x6b,0xad,0xe0,0xc3,0xca,0x19,0x9f,0xac,0x66,0x2b,0x07,0xf1,0x03,0xbf,0x75,0x18,0x1d,0x52,0xba,0x6a,0x58,0xbe,0x05,},{0x2f,0x6a,0xc6,0xfc,0x33,0xbc,0x06,0x0c,0x1d,0xc3,0xcb,0x9d,0x1a,0x2b,0x91,0x15,0x84,0x5a,0xdd,0xb1,0x6c,0x4b,0x84,0xbe,0x37,0xed,0x33,0xad,0xb3,0xb3,0xd3,0xa8,},{0x0c,0x31,0x36,0xe0,0x1f,0x9b,0xcd,0x99,0xe1,0x0d,0x3d,0x12,0x4b,0x0c,0xdb,0x07,0x72,0xbe,0xc1,0x8a,0x86,0x4b,0xe8,0x1b,0xd1,0xda,0xa4,0x4d,0x81,0x8c,0x3d,0x47,0x0d,0xfa,0xa8,0xab,0x6e,0x9a,0x76,0x1c,0xf0,0x3f,0x93,0xef,0x9c,0xc7,0x82,0x91,0x09,0x6e,0xd6,0xd1,0x0c,0x08,0xfa,0x2f,0xba,0x3b,0xac,0x04,0xdd,0xe2,0x0f,0x0c,},"\xd6\x5e\x36\xa6\xa3\x81\x95\xec\xb9\x1d\xe3\xc8\x48\xb5\x1f\x63\x92\x45\xfa\x2b\xab\xa8\xa6\xf8\x59\x47\x15\x9d\xec\x0e\xd3\xfa\xe8\x0c\x5a\x0f\x8c\x66\xff\x24\x79\x3c\x89\xc0\xc6\x87\x54\x3b\xc6\x33\x54\x7a\x1f\x37\xf7\x30\xd9\x70\x12\xeb\xbd\xc7\xac\x33\x9c\x48\x90\xc0\x85\x6b\xbf\xe2\xba\x29\xb2\x5a\x7a\xa6\xb0\x89\xc0\x33\xfe\xcb\x76\xdb\x62\xdd\x3c\x00\xf6\x42\x1b\x9e\x76\xdd\x0e\xa3\x66\xeb\x2d\x4a\x05\x2e\xe6\xcc\x73\x6e\x38\x19\x19\x1d\x5a\xd7\xa6\x6d\x2b\xe0\x42\xcc\x65\x39\xe5\xf3\x56\x52\xb1\x55\xa7\x27\xf3\x88\x8d\x93\xf9\x3a\x91\x02\x59\x8f\x75\x38\xa9\xab\x7c\x77\x7e\xec\x79\x42\x6a\x60\x75\xd6\xf3\x8d\x64\xc4\x85\x52\x0f\x64\x13\xff\x4d\x35\x8a\x8a\x9c\xbd\xab\x01\xad\xf4\xdb\x02\xad\xae\xa2\x64\x94\xd1\xf5\xd6\x17\x63\x7f\x27\x7f\x8b\x0e\x6e\x7e\x61\xe2\xee\xcc\xdd\x33\x7d\xe2\xba\xf0\xca\x26\x4c\x14\xc8\xcb\x83\x68\x00\x0b\x9c\x71\x43\x85\xf4\x13\x73\x7d\x68\x16\xe2\x12\xca\xe2\xae\xcf\xff\xc3\x2f\xd1\x6d\x46\xc3\xec\xee\x6a\xb0\x74\xc0\xd7\x68\xbd\xfe\x99\xb8\x6c\xbb\xc8\xdf\x9c\x47\xcd\x58\x6d\x46\x58\x71\x26\x8d\x4a\x9d\x1c\x87\x72\x36\xab\x78\xf8\x85\x9c\x11\x4e\x25\x1c\xab\xc4\xbe\x0f\x8b\xc2\x5d\x14\x8c\x5f\x54\x3e\x29\x07\x45\xd1\x18\x03\xe4\x9f\x5b\x53\x19\x3f\xe3\x99\x69\xc0\x39\xb3\xf2\x49\xb3\x2f\x2b\x85\x98\xb6\xac\xf4\xed\x64\xd5\x75\x2b\xb7\x72\xff\x4e\xe0\x0c\xe0\xf8\x5e\xcb\xb4\xcf\xc4\xce\x07\xda\xf2\x80\x98\x68\xc2\x90\x3b\x78\x1e\x12\xa2\x74\x10\x5f\x06\x18\x10\x29\xe4\x7f\x2b\xfb\x21\xf4\x94\x80\xaa\x1e\x44\x47\x15\xc0\xb9\xff\x07\xea\xd8\x89\x75\xd9\x35\x85\xd2\xff\x42\x48\x32\xa9\x78\x3d\x94\x90\x6a\x60\xf8\x77\xae\x1c\x85\xff\x15\x31\x7b\xad\xca\x1e\x61\x31\x74\x33\xc7\xce\x96\x27\x9b\x67\x8e\xc9\xd1\x74\xdd\x08\x70\x08\x0b\x23\x41\x54\xf6\x26\xa5\x34\x62\xcf\xd5\x47\x84\x2e\xab\x87\x05\x60\x5b\x8e\xe8\x85\x72\x9e\xe7\x8d\x18\x33\xaa\x43\xf5\x5a\xc2\x27\x31\x98\x9f\xde\xda\x7d\xc5\xfa\x9c\x01\x98\x5f\x26\x61\xe6\xc7\x32\x6d\x34\x6e\x6d\xb2\x7e\x6f\x92\x1f\xae\x7c\x93\xa2\x17\x0e\x10\xdd\x0c\x46\x0b\xdc"}, +{{0x64,0xe8,0x93,0x04,0xa3,0x35,0xe9,0x03,0xcb,0x36,0xc0,0xbd,0xf1,0xa6,0x41,0x2e,0xf3,0x68,0x46,0x80,0x06,0xb7,0x3d,0x3d,0x2d,0x61,0xcb,0x03,0x0c,0xc5,0xf8,0xd1,},{0xa1,0x80,0xef,0x3a,0x66,0x1c,0x3c,0x47,0x9d,0x5f,0x69,0x80,0x7c,0x90,0x27,0x48,0xe3,0x5e,0x7f,0x72,0x51,0x21,0xe3,0x7a,0x5d,0x91,0xb8,0xbe,0xc8,0x8d,0x83,0xa6,},{0x92,0xeb,0x44,0x54,0x81,0x40,0x01,0xec,0xfc,0x18,0x02,0x5d,0x64,0x21,0xf6,0x46,0x45,0xa5,0xbc,0xbb,0x5c,0xb8,0xfd,0x85,0xc1,0x4d,0x77,0x26,0x17,0xc5,0x03,0xe8,0xbe,0x7d,0x3b,0xcf,0x11,0x7f,0x5e,0x68,0x01,0xd1,0xc3,0xb9,0x6f,0x90,0x90,0xa6,0x6d,0xdc,0x67,0xf8,0xcf,0x8f,0xf0,0xf1,0xc1,0x25,0xb1,0x6b,0x15,0xe2,0xce,0x07,},"\x2f\x51\x07\x4d\x98\x1b\xda\xfa\xfb\x02\xa4\x0f\xe8\x26\xc4\x5f\x31\x71\xc1\xb3\x18\x4d\x8c\x26\x0b\x82\xb8\x41\x1f\xc6\x25\xcb\x02\xcc\xfe\x75\x5d\xc2\x9d\xc7\x89\x5b\xf7\x59\xe6\x1b\x24\x50\xda\x1a\x65\x6a\x38\xd4\xf7\x0d\x2e\xe7\x48\xc5\x18\xc6\x42\x03\x06\xe5\xf0\x1e\xc7\xa0\xff\xe0\xe9\xdc\xeb\x93\xf6\xc0\x77\xb1\x26\x62\x88\x15\x84\xf9\x8c\xe6\xab\x94\x5f\x87\xfc\x6d\x12\x3c\x45\xd6\xcd\xfd\x82\x37\xa1\xce\x36\x35\xb6\x23\xa7\x9d\x02\x0d\xf4\x4c\x74\xb8\x9a\xc1\x4a\x32\x1f\xbf\x33\xa8\xc0\xa2\x55\x9f\xea\x1c\x2b\x15\x60\x76\xb8\x13\x90\x8f\x84\x2e\xbe\x4c\x2b\x94\x90\x89\xe5\x2b\x1a\xe4\x0d\xc6\xe4\xb2\xab\xbc\x43\x9a\x0b\xf7\x23\x69\x67\x9a\xab\x6f\x4c\x00\x01\x8b\xe1\x47\xf7\xc0\xa6\x7b\x96\x79\xee\x88\xa5\x38\x19\xc4\x9f\x7b\x67\x5e\x30\xa8\xb5\xaf\x39\x66\x1e\xe8\xdb\x21\x01\x04\x11\x29\x49\x68\xf8\x8e\x5d\x60\x4d\x0d\x88\xd7\x6a\x7e\x48\x64\xfa\xd3\xa5\x6f\x5f\x62\x4b\xa1\xb3\x4e\xa9\xcb\x72\x08\x50\xaa\xd3\xbd\x4f\x0a\x88\x2a\x7d\x25\xfb\xec\x2b\xb7\xca\x86\xda\x61\x6d\xa9\x6c\x15\x62\xc6\xd6\xa1\xab\xcc\x64\x1e\x1b\x58\xb2\xc1\x78\xe1\xc3\xbc\x8a\x3b\x36\xec\x9e\x14\x4d\xd2\xe7\x5b\x0b\xc8\xc0\x8c\xcb\x0d\x6e\x34\x27\xb0\x32\x2b\x3d\x6a\xb9\x3f\x3f\x60\xb9\xcc\x5b\x61\xda\xd0\x23\x85\xa1\x49\x49\xf9\xb8\x7a\x8e\x3a\xf1\xe0\xe0\xfa\xb7\xa9\xa9\x28\xc7\x53\xfc\x61\x10\x44\x4a\xf7\xcc\xaf\x80\x27\xed\x64\x1b\x9e\xd8\x7f\xa5\xd8\xe1\xf7\x6c\xae\x46\x5d\x57\xa7\x0d\xad\x9e\xbf\xdd\x3c\xe7\x57\x6a\xc4\xde\x89\xd9\x8f\x42\xe2\x82\xad\x87\xad\x6a\x50\x42\x57\x7c\xbb\xbc\x4d\x95\x1e\x2a\x86\x76\xfe\xdc\x8c\xb1\xb1\xbd\xf7\x6c\x3a\x38\x84\x63\x85\xa8\x5a\xa2\x47\x06\xc2\x0a\x8b\x38\x46\x5f\xe2\xae\x0e\x41\xf7\x8e\x61\x4b\x8e\x96\x42\xfe\x24\x71\xa9\x01\x57\x47\xdb\x97\x6e\x0c\x78\x48\xc2\x3f\xf3\xf4\x17\xcb\x05\xa8\xd5\xef\x40\x13\x0a\xdf\x85\x5c\x99\x8a\x62\x10\x4d\x7e\x2f\xb7\xc0\xf9\xaa\x2a\x49\x60\x75\x62\x3c\xed\x2c\x0f\x7e\xec\x10\x14\x7f\xf9\x60\x8a\x8a\x04\x2e\xf9\x81\x17\x45\x9b\x93\x83\x7f\xd1\xb8\xd5\xef\x03\x97\x8e\xad\xa7\x4c\xac"}, +{{0x6f,0x63,0x43,0x87,0xca,0x2c,0x0c,0xb1,0x67,0xa7,0x40,0xd6,0xaf,0xd8,0x9e,0x2a,0x28,0xf5,0x30,0x71,0x84,0xe8,0x1c,0xba,0x3c,0x03,0x70,0x46,0xa5,0xed,0xe2,0x3c,},{0x01,0x1f,0x2a,0x9a,0x11,0x1c,0x38,0xf3,0x49,0x0c,0xad,0x16,0x85,0xbe,0x78,0xec,0xee,0xdc,0x6f,0xac,0x4a,0x32,0x21,0x30,0x1c,0x69,0xc8,0x4b,0x1e,0xc7,0xb3,0xa7,},{0xfd,0x17,0xc6,0x18,0xcd,0xbb,0x5d,0x45,0x9e,0xa2,0xac,0xa8,0x86,0xf0,0x51,0x2c,0x62,0x32,0x51,0x28,0x4a,0xae,0x3a,0x83,0xeb,0x5d,0x7f,0x60,0xda,0x1d,0x9b,0x2b,0xa0,0x83,0xc4,0x55,0xa5,0xe2,0x58,0x3a,0x3c,0xba,0x73,0x6e,0x7b,0x96,0x1b,0xa1,0x9c,0x1c,0xc8,0xdd,0x90,0x74,0x5d,0xa8,0x2a,0x15,0xdf,0xc6,0x62,0xe8,0xe1,0x0d,},"\x86\x5c\x20\xa9\x4a\xc3\xf2\xe3\xbd\x5c\xb8\x5b\xec\x9d\x33\x72\x66\x71\xfe\x01\xf9\xc5\x37\x01\x7d\x59\xc8\xd5\x10\x6e\x43\x36\x0b\xf7\x6f\xc0\x61\x86\x70\x59\x80\xc8\xa8\x7b\xa3\x63\x3a\x4a\x17\x04\x26\xec\xc0\xde\xfb\x6d\xb2\x67\x0f\x5f\x59\x25\x33\x77\x4c\xda\x50\x05\x2a\xe5\x97\xd4\x8d\xea\xcc\x26\x37\x06\x3b\xfd\x51\x9f\x2e\x79\xba\xc8\x17\x75\xbe\xcc\xb1\xab\x2f\x5b\x39\x71\x2e\x2e\x82\x94\x69\xb7\x5a\x2d\x2d\xbd\x08\xaa\x6d\x24\x72\x34\x04\xb2\x5e\xb9\x48\xa4\x83\x4c\x55\x24\x6c\x80\x79\xa8\x2e\xc6\x43\x54\xe8\xc2\x38\x8f\x8c\x5a\x61\x6b\x3c\xdc\x37\x1e\x62\x63\xfa\xbc\x9f\x60\x99\x21\x9e\x86\x15\x85\xfe\x82\xa6\x7d\x61\x0d\xd1\xeb\x5c\x81\xc9\x6b\x5c\xb3\x54\xa6\x89\xfd\x8a\xac\x8d\xb7\x6c\x43\x3f\x0c\xb0\xb3\x1c\xf1\xd8\x55\xb6\xa3\x0a\x3d\x2a\x21\x2e\x9b\x4f\x7d\x7a\xfe\x61\x99\x51\xf9\x8d\x2f\x1b\xa2\xc1\x01\x08\x5b\xa8\x1f\x49\xb3\x60\x37\xcd\x64\x57\xa7\xea\xa8\xf4\xf3\xbe\xdf\x68\xd0\x9f\xc9\xfa\x25\xa9\xd7\x54\xdb\x65\x36\x02\x85\x41\x2d\x1a\x6d\xa5\x37\x88\x90\x5f\xcf\x4e\xfa\x8a\x80\xcd\x86\xca\x48\xb8\x45\x63\x3d\x8c\x31\xc2\xae\x06\xf1\x6c\x4c\x6b\xbb\xe9\xcd\x1a\xfb\x59\xe1\x01\xbe\x50\xe0\x35\x35\xdd\x8a\x65\xe4\x5b\xba\x46\xd4\x5c\xb1\x4b\xad\xfc\x8e\x93\xab\x52\x67\xf4\xe4\x92\xab\x1f\x9a\x95\xe6\x1f\xca\xb8\x1c\xbf\x2b\xd8\x67\xa3\xec\x7b\x4b\xaa\x18\x9a\x0f\x08\x56\x70\x75\x59\x61\x29\xdc\xf9\xff\x1c\x50\x2d\x32\x79\xe8\xaa\x6c\xe5\x6e\xaf\x13\x45\x82\xa9\xe4\x30\xa5\xaa\x8c\xa1\x0c\x3d\xa8\xbc\x79\x3d\x02\x56\xad\x19\xae\xa7\x14\x9f\x0e\xa7\xea\x95\xfa\xcf\xac\x1c\x5c\xfd\x29\xd7\xa3\xfe\x1a\x41\x79\x75\x73\x9e\x14\xda\x8e\xdc\x81\x99\x00\x47\x2c\xa8\xc6\x97\x16\x32\x8e\x8a\x29\x9f\x97\x4e\xdf\xf7\x41\xaa\xbc\x1c\x07\x4a\x76\x1b\x3e\xc8\x76\x1d\xda\x2e\x7e\xed\x7a\xf3\x3e\xf0\x04\x09\x84\x9d\x41\x54\x97\xc5\xed\x5d\xfa\xa2\x25\x9a\x31\xd0\x76\x39\x81\x70\xb2\xd9\xd2\x10\x20\x8b\x4a\x4c\x7d\xb8\xc6\x26\xd1\xc5\x33\x56\x2a\x1f\x95\x48\x9f\x98\x19\xe4\x98\x5f\xc4\xe1\xd1\xa7\x07\xbe\x5e\x82\xb0\x05\x48\x1d\x86\x37\x7f\x42\x4e"}, +{{0x4b,0x2e,0x1a,0xe6,0x0f,0xa5,0xd3,0x83,0xba,0xba,0x54,0xed,0xc1,0x68,0xb9,0xb0,0x5e,0x0d,0x05,0xee,0x9c,0x18,0x13,0x21,0xdb,0xfd,0xdd,0x19,0x83,0x95,0x91,0x54,},{0x36,0xc0,0x20,0xb1,0x85,0x52,0x34,0x56,0x19,0xef,0x88,0x37,0xeb,0x8d,0x54,0x94,0x84,0x0e,0x85,0xf4,0x68,0x09,0x34,0x3b,0x4d,0x6f,0x40,0x61,0x25,0xda,0x55,0x7d,},{0x22,0x20,0x11,0x9e,0x83,0xd6,0x9a,0x6a,0x3e,0xed,0x95,0xfa,0x16,0x6d,0x1d,0x11,0x28,0xa3,0xf2,0x32,0xca,0x1b,0x78,0xbc,0x94,0xb4,0xd4,0x76,0xc4,0x77,0x94,0x43,0x61,0x4b,0x87,0x72,0xaa,0x22,0x32,0xcb,0x07,0x20,0xa0,0x55,0xeb,0x71,0xd8,0x40,0x7f,0x3a,0xb1,0x9b,0xaa,0x1d,0x96,0x2c,0x05,0x2c,0x84,0xc0,0xbd,0x58,0x96,0x08,},"\xfa\xb9\x8b\x2b\xbf\x86\xae\xb0\x50\x86\x81\x2a\x4b\x00\x49\xa1\x04\x2a\xbb\x76\xdf\x9c\xd2\x90\x87\x55\x70\x63\x03\xef\xed\xb1\xad\x21\xe8\xbc\x8d\x75\x62\x34\x9e\x1e\x98\xce\x0d\x75\x2f\x4b\x3d\x99\xe6\x77\x36\x8b\xd0\x8c\x78\xfe\x74\x25\xec\x3b\x56\x0e\x38\x3b\xd4\x2a\xf6\x49\x98\x86\xc3\x5a\xdd\x80\xa5\x82\x8b\x61\xd6\x64\x4d\x7d\xc4\x43\xba\x2c\x06\xf9\xba\xd2\xec\xcb\x98\x3d\x24\x45\x8f\x6a\xda\x1b\x10\xbb\x5b\x77\x17\x2c\x5c\xdd\x56\xd2\x73\xd1\xe4\x10\x10\xb2\x5c\xf4\x8a\x7d\x58\xd7\x25\x57\x02\xac\x12\xf2\xa6\xfe\x29\x18\x46\x63\x95\xf4\x60\xd1\x52\x36\xd0\x35\xae\x94\x10\xca\x86\xc4\x60\x51\x28\x29\x9f\xaa\xf0\x90\x15\xf1\xad\xee\x77\x68\xee\x1a\x8f\x8c\xa0\x6d\x10\xdd\x7f\x95\xc4\x6f\xa1\x02\x53\x06\x5f\x9d\x6f\x90\x29\x59\x08\x80\x9f\xd7\x79\x57\x1b\xe2\x9e\x0a\xe6\x6e\x0b\xcb\xde\xb7\x91\x3d\x2b\xbb\x76\xac\x30\x2f\x34\x52\xc5\x5e\xf1\x99\xa4\x8e\xce\xb0\xe3\x59\x6c\x7b\x4c\x03\x86\xda\xe7\x10\x1e\xa2\x44\xa3\x3c\x4c\xdc\x83\x06\x72\xdf\x83\x65\x5b\x35\x33\x80\x52\x30\x7b\x94\xd2\x23\xca\xb1\xaf\x69\xe0\x7f\x78\xe5\x8c\xbb\x0c\xb3\xc5\x35\x1e\x3a\x6b\x0c\x4a\x92\x7f\x75\x62\xc5\x98\xd2\xd3\xdf\x90\x56\x9f\x61\xdb\x1a\x3c\xb0\x14\x0b\x56\xea\x02\xcf\x77\x45\xfb\xee\xc2\x02\x86\x73\xd6\x7f\x1e\xc5\xf7\xda\xf9\x71\x5f\x75\x4a\x9d\x8e\xd4\x6a\x7a\x63\xef\x72\x2e\xe0\xd5\x89\x93\x31\xb6\x3c\x97\x4f\xa8\x80\x42\x94\x35\x76\x7f\x96\x25\x4e\xf4\x6c\x99\x68\xf3\xfe\xda\xaf\xea\xf3\xe8\xf4\x56\x34\xb5\x4f\x5e\x0a\x5f\xc2\xd2\x37\x3a\xb9\xe9\x8d\x9a\xcf\xe3\x69\x7e\x64\x2a\x18\xe0\xdf\xd9\xfb\xc2\xf0\x94\x86\x6d\x40\x1f\x0a\x4c\xa2\xa4\x56\xed\xf6\xa1\xa7\x7b\x9c\x29\x6c\x39\x22\x06\x7e\xb3\xd5\xa5\xca\x0a\x77\xf4\x30\xe4\xc8\x61\x1d\x8f\x05\xa1\xba\xac\x16\x35\xef\x7b\xa8\x3d\xfc\x69\xd3\x01\x94\x98\x56\xbe\x4d\x2c\x8a\xb6\x1d\xe2\x9c\xf3\x92\x50\xc5\x79\x4c\xbf\x57\x50\xcd\xa9\x5d\x04\x68\xaf\xa2\xb7\xf2\x3d\xba\x4e\xf5\xf5\x29\x5a\x3b\xf4\x14\x00\x18\xb7\xed\x06\x18\x84\x44\x4f\x5b\xb1\xb7\xd2\x39\x31\x2d\xd7\x39\x99\x95\x36\xc6\x84\x45\x6e\xa0\x6b"}, +{{0xb2,0x16,0xce,0xbf,0x87,0x80,0x24,0xc2,0x0d,0xfc,0x86,0xce,0x4b,0x37,0xbd,0xc4,0x7a,0xa2,0x8f,0x29,0x20,0x3b,0x5b,0x44,0x92,0x50,0x65,0xd9,0x93,0xa2,0x59,0xfe,},{0xc3,0x6e,0xdb,0xb6,0x25,0x4a,0x91,0x3f,0x08,0xfe,0x25,0x9e,0x23,0x87,0x80,0x63,0x8f,0x72,0xec,0x0b,0x30,0x07,0x26,0x4b,0xcc,0x60,0xa9,0xe8,0x1e,0xe9,0x29,0x8f,},{0xb7,0x38,0x9e,0xe7,0x8d,0xd9,0x76,0x3f,0x9d,0x28,0x92,0x91,0x2e,0xdc,0xbe,0x3e,0x8a,0x23,0x6b,0x8b,0xdc,0x25,0xf4,0x4b,0x9c,0xfd,0xc8,0xc4,0x7c,0xd5,0x81,0x68,0xab,0x56,0xeb,0x04,0x02,0xa5,0xbd,0x75,0x2a,0xc8,0xf4,0x97,0x8d,0x2e,0xa2,0xb6,0x5d,0x2f,0xa8,0x52,0x65,0x96,0x6b,0x9f,0x57,0x22,0x7e,0xf4,0xa5,0x9a,0xe0,0x09,},"\x9c\x87\x17\xcc\x86\xfe\x02\x48\x0b\xfd\x9e\x92\x2b\xd7\x6b\xff\xee\x21\x70\xc4\xcb\x1b\x13\xdf\x83\x4a\xc0\x1d\x45\x00\x60\x86\x29\x7f\x1b\x8a\x26\xf2\xba\x67\x4d\x33\xe1\xd1\x62\xf1\x93\x67\xfe\xba\x97\x35\x2b\x7d\xf2\xe7\x5b\x30\x9d\x4b\x6f\x8b\x07\xcc\x0e\xb6\x77\x7e\x81\xe2\x68\xe0\x2d\x07\xf2\xa0\x8f\x8f\x39\xd5\xa8\x32\x0b\xfc\x01\xfc\x8c\x92\x27\xd2\xcf\x05\xe1\x28\x91\xff\x4d\xe8\x85\xa1\xc9\x33\x71\xa0\x91\x0b\xa5\x33\x92\xaf\xf9\xba\x2e\xed\x9a\x20\x55\x97\x7e\xc4\x15\x7b\xd6\x5b\x34\xdf\x79\x37\x2f\x4d\x50\xed\xbc\x48\x92\x43\x53\xcf\xa1\x69\x23\x19\xd8\x8a\x7a\x5b\xb7\x26\x25\x4c\x20\x92\x91\xe9\xb1\xd2\xc1\xa6\xc8\x23\x63\x98\x10\x9c\x59\xed\x42\xa0\xac\x9e\x76\x33\xc5\x20\x73\x4e\xcc\xfe\xa4\xfe\xa9\x5a\x47\xa8\xf0\xa0\x68\xb4\x27\x50\x00\x43\x9c\xc9\x7c\x57\x87\x1e\x10\x5c\xc0\x79\x0e\x9d\xcc\x9c\x25\xd5\xaf\x70\x63\xff\xd0\x5c\x4f\x37\x80\xe7\xbc\xa4\xc4\x56\xd0\x17\x0d\xa7\x09\xfc\x6c\xb3\xfa\xa7\x2b\xdc\xf5\x62\x90\x8a\xe9\x34\x0a\xef\x4d\x0c\x8b\x91\xf0\xfb\xcc\xbc\xf1\xcd\x89\x8b\x1c\x71\x6f\x4f\x14\x74\xc3\xaa\x31\x62\x42\xab\xdf\x63\x68\xe5\x7a\x24\x7f\xf2\xfd\x5c\xe2\x3d\x18\x7f\x69\x4f\x11\xe3\x8d\xfb\xfb\xc3\xd9\xdb\x20\x90\x3b\x4e\xbb\x44\x9b\x90\x49\xee\x02\x0f\x6e\x2f\x50\x8e\x8b\x2b\x16\x5b\xad\x74\x64\xdb\xdd\x17\x8c\xbd\x42\x32\x33\x76\x5d\x37\x1e\x7a\xe1\xc3\xe8\x78\xcd\xb5\xb8\x24\xb2\x0c\xb3\x09\x86\x7c\x0e\x47\x3c\x06\x7e\x67\x44\x00\x85\x27\xb6\xbc\x07\x6d\x07\x7f\x48\x67\x62\x2a\xee\xd1\xc2\x53\xdb\xde\x7c\x6a\x76\xc7\x01\x59\x62\xfb\x73\x39\x16\x98\x60\x0b\xb3\x18\xff\xa7\xb0\x13\x6e\xe4\xcc\xb0\x7d\xaa\xf0\x1f\x40\xff\x9c\x19\x4f\x98\x68\x1f\x9f\xae\xf8\xb6\xf9\xe9\x9f\x95\xdf\x00\x80\xda\x89\x66\xa8\xba\x7a\x94\x74\xc5\x37\xb9\x2d\xf9\x79\x9e\x2f\xd1\x6f\x78\x8d\xad\x7a\x7b\xcc\x74\x52\x26\xe1\xe6\x37\x1f\x52\xeb\xcd\xbd\x14\x40\x44\xdd\xfe\x63\x2d\xfc\x0a\x43\xd3\xa4\x50\x92\x31\x70\xeb\xc7\xae\x21\x9e\x50\xe0\x78\xa5\x11\xbc\x12\xef\x14\xcd\x14\xb5\x30\x9f\x38\xab\xd6\x5d\xb2\xb2\xa7\xaf\x22\x43\xb2\x29\xc9\xfd\x2e"}, +{{0xaf,0xce,0xce,0xa9,0x24,0x39,0xe4,0x4a,0x43,0xed,0x61,0xb6,0x73,0x04,0x3d,0xcb,0xc4,0xe3,0x60,0xf2,0xf3,0x0c,0xd0,0x78,0x96,0xcd,0xa2,0x0c,0xb9,0x88,0xd4,0xe3,},{0xd2,0x31,0xf6,0x92,0x35,0xa2,0xe3,0xa1,0xdd,0x5f,0x6c,0x2a,0x9a,0xaf,0x20,0xc0,0x34,0x54,0xb9,0xa2,0x9f,0x4e,0x3a,0x29,0xab,0x94,0x68,0x9d,0x0d,0x72,0x3e,0x50,},{0xa6,0x55,0x45,0xcf,0x3d,0xf4,0x56,0xb2,0x8d,0x83,0xa6,0xd9,0x4c,0x03,0x6a,0x19,0xd0,0xd2,0x9f,0xb0,0x65,0xed,0xc2,0x7e,0x5e,0x93,0xa1,0xf4,0x02,0x79,0x89,0x7e,0x1c,0x6f,0x25,0x95,0x9a,0x72,0x5a,0xba,0xbc,0x87,0xcf,0x2a,0xe7,0x27,0xf3,0x46,0x7b,0x79,0x57,0x0e,0x90,0x27,0x11,0x91,0x71,0x91,0xd9,0xcb,0x0d,0x2d,0x66,0x0c,},"\x0b\x05\xf8\x9e\xbb\x33\x97\x94\x76\x87\xaf\xbe\xf0\xed\xe8\x7c\xf3\x81\x06\x76\x27\x70\x37\x52\x1d\x95\x2a\x3b\xbb\xbd\xc8\x56\x59\x88\xa0\x95\xd8\xd4\xf6\xf5\x9b\xe5\x72\xd3\xd8\x21\xdd\x78\x99\x77\xef\x77\xa2\xfd\x71\x10\xce\xee\xd9\xf3\x75\x6e\xd8\xe1\x88\x26\x7b\x97\xa3\x0e\xf8\x95\x7c\x78\xae\xa3\xa2\x96\x3d\xec\xa6\x18\x60\x54\x5e\x0c\x40\x82\x48\x81\xeb\xb1\xdb\x10\xf6\x07\xe1\x0d\xdb\xdd\xce\x40\x0e\xa2\x36\xba\x47\x45\xaa\x99\xa0\x56\x41\x97\x67\x66\x78\x9e\xd0\xda\x7d\xb5\x5f\xda\xb4\x59\xeb\xd4\xb4\x41\xa6\x28\x2f\x7c\xfd\x5a\x20\xea\x06\xef\xfa\x33\x59\x55\xe5\xfd\x29\x18\x16\x71\xbc\x92\xc0\x00\x52\xf7\xf7\x5c\x39\x27\x7c\x9a\x43\xb7\x87\xac\x9f\xb1\x51\x6e\x99\x62\x32\xa5\x09\x77\x4d\x1d\xc2\x1d\x8c\x05\x13\xf7\x84\x4b\x0a\x5b\x5f\x18\x95\x75\x81\xf9\x90\x44\xa1\x42\x23\xcc\xda\x8a\x28\x4d\xe1\x2f\xd4\x24\x26\x5f\xe5\x7b\x27\x02\x15\xf8\xfa\x9f\xf2\xbe\xa5\x17\x93\x4e\x48\x00\xa4\x7d\x34\x6f\xb6\xc3\x61\xcf\xba\xbe\xff\xab\xd9\xc4\x16\x4f\x45\x15\x6e\x24\x5c\x97\x7e\xdb\x47\x36\x42\xc3\x94\x0b\xe5\xad\x6f\xd1\xa7\x11\x9a\x7b\x18\xe9\x8d\x6d\xc8\x43\xe0\xd2\x54\xc9\x3d\x01\x46\xd1\x8e\x5c\x62\xed\xe1\x49\x0f\x89\xa6\x05\xeb\x45\x4f\x97\x47\x78\xcf\xae\x20\x93\x2e\x95\x47\x7b\xd0\x3b\xcd\xb9\x7d\x5b\xcb\x76\x33\x59\x42\xe9\x2e\xe6\x68\xf2\x31\xe6\x9c\x57\x0a\xc5\x44\x6d\x0f\x77\x40\x66\x73\x7f\xdf\x49\xf1\x0c\xeb\x1b\x52\xd6\xd8\xa4\x63\x98\x46\xa3\x37\x3a\x7c\x6f\x3b\x4b\x31\x59\xfe\x2e\x7a\xf7\xee\xe2\xf0\xdf\x17\x2d\x94\xd2\x55\xd0\x17\x65\x1d\xa3\x00\x90\x05\xe5\xea\xc3\x17\x6c\x09\x38\x9e\xe4\x0d\x70\x38\x3b\xd3\x71\x17\xec\xa0\x83\x59\x8a\x18\x01\xf5\x92\xd0\x57\x18\x6e\x56\x8e\x24\x7c\x25\x2b\xe4\xb1\x4f\x72\x3a\xb7\xdd\xb9\x7a\xe9\x76\x8c\x26\x82\xfd\x63\xac\xc3\x00\x77\x9f\xe0\x4e\x2b\x88\x87\x47\x51\x34\x6c\x9e\x0f\x97\xa2\xa2\x16\x77\x2f\xf9\x62\x5c\x33\xbd\x7e\x29\xfe\xd8\x00\x3a\x08\xdb\xd3\x3b\x5d\x17\x89\x9c\x94\x3c\x25\xe9\x5a\xd7\x54\xfb\x63\x2e\x04\x7c\x11\x2a\xf7\xf7\xce\xba\x72\x36\x2e\x1a\x3d\xdd\x29\x35\xaa\xf7\xf8\x18\xa2\x7c"}, +{{0xb8,0x34,0xc6,0xe0,0xfa,0xcb,0xff,0x58,0x0d,0xd3,0xb2,0x37,0x53,0x95,0x9a,0x4c,0x21,0x54,0xc2,0x19,0x52,0x1b,0x3d,0x27,0x03,0x5d,0x07,0x1f,0x65,0x99,0xbd,0x02,},{0xd1,0xc3,0x84,0x71,0x5e,0x3b,0x3d,0x02,0xc1,0x3e,0x09,0x06,0x05,0x53,0x4c,0x7d,0xb7,0x40,0xda,0x2a,0xa5,0x60,0xf5,0x32,0x00,0xa3,0xce,0xd8,0xbe,0xae,0x8c,0xf8,},{0x0f,0x19,0xb7,0x06,0x6d,0x57,0x92,0x32,0x8a,0x98,0x00,0xd9,0xd4,0xf8,0xf6,0x7d,0x5b,0x08,0x9b,0x54,0x12,0x26,0xa1,0x67,0xda,0xcd,0x43,0x9f,0xa4,0x85,0xb0,0x02,0x5a,0x5d,0xc7,0xf2,0xc7,0xe2,0x3f,0xc4,0xa5,0xc6,0x86,0x9e,0x76,0x19,0xd3,0x56,0x39,0x97,0x00,0xc9,0x36,0x50,0xe8,0x9c,0xd2,0x5b,0x90,0xfb,0x99,0x25,0xe3,0x04,},"\x6c\xf1\x47\xb1\x60\x55\x28\xa3\x6b\xe7\x57\x16\xa1\x4b\x42\x0b\xcf\x06\x7c\x03\xf1\xcf\xe9\xc4\x40\x2f\x14\x98\x7f\xbf\xc9\xd3\xec\xc3\xcc\xf4\xf8\xd2\xd0\x3a\x55\x90\x0b\x8d\xc7\x9a\xf3\xb6\xe7\x74\x36\xf6\x9b\x14\x17\xad\x4b\x68\xfd\x44\xe5\xe3\x33\xed\x90\xea\x79\x43\xfb\xd1\x12\x26\x09\xec\x8f\xf6\xbb\x25\xe4\x2e\x99\x14\xf5\x92\x0f\xc7\x2c\x4d\x01\x3b\x6a\x96\x85\xc9\x96\xfb\xd8\x35\x2a\xaf\xb1\x84\xc2\x2d\x9e\x47\x87\x1a\x52\x80\xe4\xab\x7d\xd6\xa5\xcf\xd1\x0a\x59\x94\xa2\x00\xf6\x70\xe0\xb6\x22\xa9\x39\x4d\x47\x93\xd0\xa4\x20\xe7\xd8\x80\x6c\xb1\x27\xc7\xac\x69\x0d\x45\xa2\xe9\x41\x66\xce\xa6\x72\xbc\xd9\x82\xb0\xe9\xba\xad\x56\x31\x2d\x25\x70\xdd\xde\x7e\x0b\x9e\x7f\x47\x13\x6f\x04\x81\xd0\x0f\x66\xa2\xaa\xca\x4d\x1b\x09\xd7\xce\x6c\x5a\x98\xa7\x6b\x68\xcd\x97\xd5\x79\x39\x68\xd6\x67\x07\x3f\x82\x17\xf9\x05\x47\x35\x34\x0f\x9b\x14\x9c\x0d\xce\x84\x5b\x09\x9e\x88\xd0\x70\x96\x80\xf0\xf7\x76\x03\xff\x0a\x23\x31\xc5\x58\xfc\x36\xd5\xf2\x4d\xa9\xa6\x2d\x69\xaf\x51\x90\xd2\x1b\x5c\x85\x7a\x1e\x08\xf0\x14\xc6\xd4\x56\x46\x86\x65\xa7\xf8\x45\xc6\x6f\x91\x11\xf9\xc0\x98\xc6\x89\x40\xef\xcd\x87\xb6\x57\x07\x0c\xb9\x16\x4b\xc9\x74\x3a\xce\xb7\x43\x9a\x0d\x01\xc0\x06\x2a\x11\xaf\x2e\x11\x34\x93\x97\xf5\xd1\x52\x87\x2b\x13\xc5\xab\x32\xf5\x1c\xc5\x8f\x14\x75\xec\x82\xac\x67\x15\x61\xdc\xbd\x34\x3c\xfb\x3c\x5f\x78\xd0\xfc\x73\x05\x3c\x60\x04\xb0\xa4\xca\x3f\x20\x43\xff\x4b\x0c\x54\x27\x5c\x4f\xcb\x9c\xad\xc6\xba\xab\xe5\x7b\x1d\x5a\xcd\x53\x1e\x97\x2e\xf9\x33\x51\x36\xcd\x1d\x65\x51\x2b\xa1\xf5\xb6\xcc\xc4\xb6\x6b\x42\x50\xaa\xfa\x29\x67\xdd\x42\x11\xa2\x74\x2e\x0f\x17\x7d\x8f\x40\x63\x89\x9f\x61\x81\x5c\xbe\x6d\x8f\xbf\xcd\xf7\x48\x12\xbd\x40\xcc\x10\x08\x4e\x46\xa9\x9a\xc1\x28\x05\x8e\xaf\x16\xa4\x9a\x24\xb6\xae\x22\x8e\xcf\x01\x09\xc5\x2d\xfc\x06\xe3\x7d\x6a\x33\x3b\xcb\x24\xab\xa3\x12\x16\x4c\x6c\x02\x90\x48\x5d\x25\x12\x80\x53\x8c\xe9\x54\x1c\x09\x16\x64\x0e\x36\xd6\x92\x9d\xcd\x95\x88\xeb\x99\x57\x7f\x5f\x6d\x82\xbc\xbb\x19\x88\x26\x26\x7e\x49\xf5\xda\xff\x2c\x0d"}, +{{0x22,0x69,0xa5,0xd8,0xf7,0xac,0x2c,0xd9,0x04,0x8f,0x5f,0x49,0xe3,0x49,0xe5,0xc4,0x35,0xa1,0x59,0xb3,0x19,0xfe,0x3b,0x30,0xbf,0xac,0x8d,0x0d,0x50,0x59,0x43,0xf4,},{0x1c,0x81,0x79,0x43,0xdc,0x39,0xc2,0x4b,0x01,0xda,0x38,0xa4,0x87,0xb1,0x75,0x48,0x24,0x60,0xc6,0x09,0xe4,0x72,0x63,0x49,0xa9,0xaa,0x7a,0xea,0x9b,0xc0,0xfb,0x34,},{0xbe,0x0f,0xb3,0x30,0x8a,0x07,0x6a,0x61,0xa4,0xa9,0x2a,0x97,0xf6,0xac,0x55,0x32,0x71,0x90,0xe1,0x34,0x1d,0x6d,0xd4,0x10,0xd8,0x6b,0x41,0xbd,0xaf,0x2d,0x33,0x74,0x09,0x3e,0xf7,0x20,0xbd,0xb7,0x7f,0xeb,0x70,0x14,0xe0,0xf7,0x7d,0x3b,0x80,0x96,0x23,0xc7,0xca,0x53,0xe2,0xae,0x4b,0x09,0x71,0x13,0xe9,0x6d,0xb7,0x7a,0x2d,0x08,},"\x71\x53\xd4\xd9\xe6\x41\xaa\x61\x92\x0d\xb0\xff\x4b\xd5\x37\xa6\xd6\x13\x0a\x39\x65\x54\xcc\x94\x53\x76\x98\xf9\xca\xd1\x6b\x99\xee\xbe\xfa\x5f\x27\x76\xf2\xfe\xaf\xf6\xbd\x9a\x69\x04\x12\x0c\x67\xe0\x88\x3f\x6b\x96\xbb\xbb\x19\x5e\x95\xae\xc7\x53\xb6\x99\xba\xb3\xd0\x39\x44\xc1\x3c\x72\xfc\x84\xe3\xf2\xcb\xf6\x29\x6f\x64\x55\x49\x11\x1c\x93\xfa\xe1\xa7\x59\xbf\xcd\x16\xfc\x09\xe6\x0b\xb9\x78\x55\x35\xad\x27\xda\x24\x4e\xf2\xf8\x57\xf2\xde\x99\xa6\xe9\x21\x88\x89\x0e\x45\x2c\x7f\x5b\x9e\x3a\x4b\x96\x8e\x11\x74\x3b\x6f\xc7\xfa\xf1\x27\x5e\x53\x60\xa5\x46\x89\x41\x79\x78\x94\xd7\x70\xfa\x7d\xa3\x64\xa3\x37\x30\x22\x39\xfe\x83\xae\x0b\x0d\x08\x4a\xa1\x2a\xcd\xc6\x34\x62\x52\x4e\x0e\xb1\x0f\xef\xe8\x1b\xa9\x6f\x71\xf2\x75\xf3\x44\x9a\x3f\x8d\xb2\x1d\x58\x74\x9a\x38\x85\x3d\x39\xb0\xad\x8e\x69\x89\x1b\xd2\x04\xdf\xca\x8f\x6c\x23\x9d\xc9\xa0\xac\x27\xf5\x4d\xb4\x23\x8d\x47\x06\xdf\x11\xd6\x07\x36\x9d\xc7\xf7\x04\xda\x1d\x39\xf2\xe8\x2a\xf8\xc2\x83\xd2\x20\xc1\x24\x31\xf5\x6d\x80\x30\x69\xb4\xac\xb7\x70\x81\xc0\x31\xae\x33\x19\xfc\x77\xfc\xa7\x84\x50\x97\xfd\x72\x7a\xd0\xd0\x80\x89\x5b\xba\x23\xe8\x73\xd2\xde\xf8\xcd\xc2\x16\xc3\xee\xd6\x1b\x08\x76\x1b\xb9\xeb\xce\x02\x82\xcf\x50\x2a\xaf\x6c\xe7\xe8\xc0\x58\x63\x79\x58\xc3\xea\x1b\x72\xfe\x6e\x8d\xf8\xd3\x7a\xc0\x55\xdb\x69\x92\x58\x7f\xab\xbd\xc4\x67\xf5\x24\x75\x64\x4f\x91\x88\x63\xaf\x62\x04\x92\xf3\x46\x80\xf2\x05\x6c\xbc\xab\x75\xe2\x32\x36\x26\xc0\x94\x75\x9c\x0e\x0e\x99\xef\x19\x75\x95\x27\x25\x06\x46\xad\x76\x01\x20\xba\x38\x66\x99\xd5\x39\x34\xf9\x56\xb8\xbb\xc7\x39\x5b\xb4\x96\xce\xb2\xdd\x22\x3c\x7b\x50\x1b\x92\xd3\x6a\x95\xf8\xf0\xa0\x2e\xb5\xba\x4d\xdd\xf1\x66\xb9\xb9\x5b\x4a\x59\xe7\x2a\x30\xc6\x3c\xf2\x1e\x60\x85\x75\x19\x23\xd5\x4b\x30\x28\x1e\x52\xa0\x96\x18\xe6\xf0\x23\xba\x0a\x21\x67\x5e\x7f\x98\x9b\x89\x91\x58\x8c\x96\xc2\xb5\x6a\x78\xf5\xd2\x94\x5a\x7b\xae\xb6\xa0\xc1\xbb\xd5\xd9\x5a\xf3\xee\x83\x0f\x58\x09\xc7\x94\xa1\x5a\xb4\xb5\xf8\x9d\xd2\xbe\x2d\xfd\xcd\x8f\xe0\x52\x0f\xda\x2b\x3f\x02\xa1\xac\x01\x55"}, +{{0xe9,0x65,0xb3,0xf2,0x57,0x35,0x66,0x85,0xc9,0x8b,0x42,0xb9,0x64,0xa2,0x53,0xfc,0x49,0x53,0x99,0xcc,0x94,0xb0,0x99,0xc2,0x44,0x5f,0xc8,0x1c,0x75,0x9c,0x68,0xe5,},{0x68,0x9f,0x54,0x10,0xc8,0xe0,0xf4,0xd3,0x7b,0xc0,0x7c,0x85,0xd7,0xcc,0xe6,0xc9,0xb6,0x36,0x01,0xf9,0xbd,0xaf,0xec,0xaa,0x44,0x8a,0x5e,0xed,0x64,0xaf,0xc8,0xc6,},{0x8d,0x2b,0xc4,0xe1,0xcd,0x25,0x6a,0xad,0x8a,0x15,0x1d,0xec,0x01,0x0d,0xc9,0x3a,0x5e,0x5c,0xca,0x58,0x29,0x8d,0xec,0x49,0xcb,0xc9,0xc4,0x71,0x7b,0x5c,0xfb,0x54,0x60,0xd4,0x30,0xbe,0x72,0x6b,0x0f,0x30,0x2c,0xbd,0x92,0x6b,0xee,0xa1,0x9a,0xa3,0xc9,0x3a,0xeb,0x45,0x2a,0x44,0xf6,0x00,0x7a,0xf4,0x9a,0xdf,0x2f,0x05,0xbb,0x04,},"\x6f\x20\xa9\xad\x27\xe3\x0d\xac\x76\xb3\x0d\x4c\x19\xa5\xbd\x6d\xfd\x6d\x04\x92\x13\xf4\xbe\xcd\xd9\x63\xd7\x2b\x8b\x2d\xad\x68\x7b\x00\x38\x08\x20\x1d\x50\xf7\xdd\x6e\x59\x9e\xf5\x8c\xeb\x60\x68\xc5\x45\xed\x99\xb9\xe7\x63\xf9\xb0\xec\x1d\xb5\xfc\xbd\x7d\x49\x0a\x12\x1e\xce\xc6\xbb\xa1\xeb\x5e\xdb\xd6\xde\x85\x36\x47\x07\xc5\x5e\x30\x0c\x8b\x16\xbb\x25\x30\xf7\x08\x98\x13\x66\x89\xc9\x88\x59\x1d\x53\x91\xd9\xcc\x34\x7d\x79\x31\x06\x1a\x9b\x76\x96\xe2\xc9\xf3\x5b\xc0\xd3\x04\xa8\x1c\x2c\xf9\x54\xd9\xc3\xa8\x8a\x22\xe1\xd6\x7b\xbe\x0a\x85\x30\x84\x77\xf6\x29\x18\xc2\x5d\xb5\x04\xe4\x76\x2f\x0e\x3b\x42\x46\x00\x79\x08\xac\x70\x17\x79\x00\x6b\x77\xd7\x25\x10\xed\xc6\x9e\x17\xd0\xf6\x39\x4c\x77\xe5\x55\x18\x75\xa4\x46\xf8\x12\x33\x41\x5d\x0a\x91\xa0\x46\x0b\x51\xc4\x13\xd6\x44\xe8\x50\xf8\x55\x72\x81\xc4\x66\x99\xe5\x3b\x22\xa7\xc7\x3b\x06\x8e\xa3\x86\x52\xcf\xf3\xb0\xa7\xb8\xba\x30\x97\x1e\xab\x18\xfd\xbb\xd8\x73\x9e\xe1\xee\x0c\xd5\xcb\xfb\x7d\x5d\x41\x75\x7b\x63\x31\x27\x1f\xb7\x80\x97\x51\xe2\x03\x51\x3c\x99\x70\xf6\x6d\x91\xbc\x0c\xe0\x62\xf4\xfc\xb2\x8b\xe0\xa6\x99\x86\x7b\x79\x59\x4c\x64\x58\xa0\xd3\x07\xac\xac\x91\xf4\x13\xc4\x61\x58\x77\xdc\x53\xe1\xb0\x18\xda\x5c\xfc\xe1\xb6\x3f\x40\xbe\x1e\x55\x27\x4c\x43\x74\xcd\xfc\x21\x52\x44\x99\xa6\x83\xa2\x31\xad\xef\x77\x9d\x19\x21\x44\x0e\x5d\x3f\xdb\xd5\x03\x3d\xc9\x83\xcf\xc9\x31\xab\xe6\x38\xc3\x5d\x5a\x95\x86\x9e\x9f\xe3\xd9\x3e\xb9\x0b\xd1\x86\x1f\x85\x5c\xe1\xf6\x08\xb7\xbc\xad\x6b\x5e\x1b\xd9\x7e\xdc\x95\xed\x5d\xdc\xbc\xb7\x15\xd9\x19\xf5\xff\x77\xdf\x2d\xa4\x38\xf7\xa3\xa9\x82\x86\xdb\xd5\xb6\xe0\x43\xfc\x73\x72\xf6\x97\x04\xf0\x9d\x86\x55\x30\xf4\xf0\xed\xd3\x30\x0f\x18\x5b\x6d\x73\xd8\x71\x6d\x32\xd3\x2b\x1c\x9a\xc2\xdd\xf4\xf9\x02\xd3\xf2\x16\xd3\x5a\x33\xf3\x68\x09\x5d\xed\x10\xbe\x94\xbb\x53\xd6\xf2\x56\x56\x0f\xac\x2f\x4a\xf0\xed\xf5\xc5\xc7\x02\x14\x37\x77\x12\x6e\x7d\xe3\x2d\x07\x49\x39\x32\x66\x21\x29\xba\x0e\x7f\xc7\xcf\xb3\x6f\xd2\xca\x53\x16\x46\xe8\xcd\x22\x11\x85\x4f\xc5\x10\xaf\x3b\x1e\x8c\xaf\xde\x7a"}, +{{0xbc,0x3b,0x1e,0x0b,0xf8,0xd6,0x9e,0xa5,0xb4,0xcb,0xbf,0x10,0xbb,0x33,0xfc,0x95,0x5a,0xdc,0xbe,0x13,0xfc,0x20,0xaf,0x8a,0x10,0x87,0x2c,0xe9,0xdf,0x39,0xd6,0xbd,},{0xac,0xcd,0x26,0x28,0x15,0x59,0x19,0xbb,0xc7,0xf9,0xd8,0x6f,0x91,0xda,0xfe,0xc3,0x5c,0x71,0x1a,0x78,0xc7,0x9a,0xd3,0x60,0xed,0xdb,0x88,0xfa,0x8a,0x18,0x0b,0x2d,},{0x6e,0xf7,0xf0,0xe9,0x1f,0x2c,0xc6,0x71,0x5f,0x8e,0x5a,0x98,0x57,0x4b,0x44,0x00,0xc2,0x61,0xa6,0x43,0xe0,0x54,0x5f,0xf2,0x67,0x47,0xf8,0xe1,0x73,0x98,0x99,0xd7,0x66,0x40,0xb6,0x45,0x1c,0x43,0xc1,0xd0,0x3a,0x47,0x75,0xb5,0x4f,0xcf,0x9b,0xce,0x18,0xed,0x3f,0xcc,0xad,0x33,0x8b,0x77,0x64,0x02,0x4f,0xdf,0xa2,0xde,0x82,0x01,},"\x4c\x73\xe0\x4a\xbe\x08\x19\xde\x1f\x84\xd7\x05\x41\xeb\x1b\xb6\x1c\x4f\x42\x92\x0e\x1f\x2d\x1d\x9e\x62\x81\xa8\xa2\xe8\xb3\xeb\x45\x53\x7d\x83\x96\x90\x27\xf9\x9e\xf0\xea\x27\xca\x08\x5b\x13\xf9\xdb\x48\x0f\x00\xc0\x2f\x3f\xd7\x42\x9d\xd5\x67\x70\x89\x53\xbb\xf3\xb9\xe8\xe2\xc6\xac\x4d\x32\x1f\xf8\xf9\xe4\xa3\x15\x47\x23\x08\x5a\x54\xe9\xc9\x57\x3c\xc7\x35\x0c\x09\xf8\x97\x3f\x94\x8b\x08\x73\x03\x73\x59\x7a\x5f\xd0\x34\x98\x21\xae\x0a\x3c\xd6\xc8\x49\x92\xb1\x89\x12\x8f\x34\x90\x98\x7e\x1e\x9a\xd4\xf6\x57\x4c\xa5\x38\xfd\xfd\x83\x28\x4c\x1e\xb0\x95\x3f\x24\xc0\x8f\x74\x93\x2d\x43\x64\xdb\xbe\xf9\x22\x54\x24\x40\xda\xe8\x04\x24\xa9\x2e\xae\xf2\x7c\x18\x89\xbd\x08\xc4\x4f\x9d\xf0\x3a\x3a\xf3\x0d\xff\xb4\x8f\xae\x44\x5e\x62\x5f\x4d\x92\x65\xcf\x38\x7a\x1d\xa3\x5f\xe4\xc2\x31\x50\x45\x35\xdb\x72\xea\x81\xa1\x86\x80\x5f\x85\x6e\xbe\x6a\x6a\x65\x24\x14\x32\x53\x0f\xe6\xc9\x60\xc5\xf9\xbe\x6c\x22\x95\x70\x60\x30\x4e\x9d\xd8\xef\xbc\x1e\x48\x2e\x7d\xdb\xd8\xaf\x03\xbf\x23\x82\x89\x9c\x98\x6d\x91\x66\x11\xe4\xf2\x7a\xe5\x2f\x81\x7e\xf0\x1b\x6a\x14\x1f\xe4\xf6\x85\xd9\x4d\xc8\xcd\x52\x83\x00\x43\x93\x45\x87\x70\x4c\x1e\x64\x2e\x8f\xe5\x6b\xe6\xd6\xb8\x5b\xf4\xa6\xfe\xb2\xb6\x85\x8f\x1f\x00\x7f\x99\xd3\x9e\xa0\x4c\x9f\xe5\xfa\x7e\xf1\xb9\x1f\x49\x5e\xd0\xe7\xfa\x42\x13\xdd\x68\xce\xa4\x2b\x67\x29\xf9\x50\x31\x90\x7e\x27\xc4\x40\x98\x09\x43\x86\xfa\xbf\xb0\x4a\xb9\xb4\xde\x3d\x68\x61\xde\x46\x23\x12\xc5\x9b\x27\xc7\x6f\x7b\x6a\x4f\xc7\x1e\xa0\xd5\xda\xf6\xb7\x32\x05\x21\xa6\x7e\x5c\xb3\x75\x04\x97\x6a\xd7\x3d\xae\x2d\x64\x9f\xeb\x75\xe2\xea\xdd\x34\x01\xa7\xf2\xf3\x6e\x16\xdf\xbf\xbd\xb2\xaf\x57\x16\xcb\xa1\xbc\xe2\x0c\xd4\x7c\xe1\xc1\xd7\xbe\x00\x69\x70\x01\xfb\xbe\xb4\x91\x5a\xa6\xe5\x39\x3b\x5a\xb2\x0e\x0f\x31\xf5\x11\x91\x49\xa2\xcb\x4c\x4d\x45\x2c\x81\x56\x11\x3a\xc7\x82\x4f\x84\xf0\x9a\xeb\x81\x20\x2e\x8d\xd3\xda\xc0\xaa\x89\x39\x9b\x5a\x38\xb1\xe2\x18\x30\x19\x60\xa3\x7d\x52\x63\x2e\xea\xef\xe3\x68\x74\x55\x46\x42\x88\xeb\x17\xd9\xe1\x9a\x3a\x72\xed\x9d\xe3\x2c\x17\xbe\x79\xa3\xb9"}, +{{0x10,0x71,0x8f,0xa6,0xe2,0xd7,0xf6,0xed,0x38,0xfd,0x66,0xcb,0x6d,0xbf,0xa0,0x87,0xe8,0xf1,0xe8,0xa8,0xa2,0x4f,0xab,0x58,0xd7,0x9d,0x79,0x54,0xb8,0x72,0x0c,0x3e,},{0x87,0x0d,0x4f,0x66,0x6d,0x06,0xfd,0xa9,0xf9,0x51,0x1b,0x58,0x60,0x2e,0xec,0x05,0x0d,0x75,0x4e,0xa6,0xd8,0xe7,0x9c,0xdd,0x19,0xf6,0x01,0xc4,0x77,0xdf,0x1a,0xa0,},{0xe1,0x65,0x91,0x86,0xf1,0xf7,0x6f,0xe4,0x3a,0xc8,0xa1,0x17,0x03,0x36,0x0f,0xbe,0xff,0x53,0xb5,0xe5,0x7b,0x59,0x74,0xaa,0xa0,0x8e,0x25,0x75,0x57,0x9c,0x27,0x08,0x4c,0xf6,0x80,0x2e,0x7c,0x20,0x63,0x47,0x31,0x44,0x75,0xb6,0x03,0x19,0x74,0x94,0xe7,0xd6,0x1f,0xe4,0xb1,0xee,0x7b,0x78,0xe1,0x8d,0x94,0x46,0x93,0x52,0xdf,0x0c,},"\x41\x25\x9b\x6e\xef\x13\xd6\xff\xe3\x3c\xdd\xe7\x99\xb9\x95\xc4\x0b\xe7\x82\xcf\x97\x84\x40\xb6\x6b\xe5\x1c\x44\x05\x82\xab\xd4\x2f\x52\x66\x96\xbb\x3c\xb9\x22\x65\xb1\xed\x0e\x4b\xba\x76\x4c\xae\x28\x39\x83\x0a\x25\x26\x35\xdc\x80\xce\x5f\x73\xd5\x21\xb3\xd6\xff\x03\xac\x30\xe1\x98\xad\x20\x56\x7e\x75\xa3\x4f\xa8\x25\xeb\xf9\x84\x15\x08\xda\x84\xcd\x67\x42\x36\xca\x7b\x43\xde\x35\x64\xc9\x4a\xb0\x79\x40\x8f\xd9\x41\x37\xce\x3f\x90\xa5\xdd\x5d\x3a\xc3\x9a\x05\xec\x86\x71\x5a\x8f\x02\x5e\x45\x39\xa7\x64\x0a\xb8\x88\x36\xf4\xef\xba\xbd\x5e\x16\x52\xc4\x9e\xa2\x16\x13\xac\xfe\x34\x3a\x88\x0e\xe5\xa4\x2f\x2f\x91\x34\xef\x4e\x37\x16\xb1\x6d\x13\x4a\x9c\x4c\x71\xc3\x9b\x3c\x1a\x85\x7d\x3c\x89\x43\x97\x83\xee\xf1\xed\xd7\x1b\xf4\x49\x2d\x05\xfd\x18\x67\x3a\x52\x42\xff\x41\x87\xb9\xde\x47\xad\x49\x68\xda\x49\xdb\xa5\xa6\x09\x2e\x95\xea\x27\xdd\xfc\x74\x48\xdc\xf5\x97\x2d\x9d\x22\x8d\x63\xe5\x29\x1b\xa6\xe6\xfb\xd0\x7e\x32\x41\xf9\x36\x6c\xa4\x97\x6b\xb0\x4b\x22\xd0\x1f\x0d\xba\xe7\x94\xfa\x9c\x1d\x90\x29\xf8\x8a\x83\x60\x2b\x0e\x0e\xc5\x5e\x22\xc3\x7b\x20\x11\x25\xca\xdb\x53\x41\xef\x73\xf6\xda\x1a\xbb\xe2\xb1\xc4\x75\xf0\x75\x03\x45\xb1\xbe\x42\x59\xd8\xc2\x85\x31\xff\xe7\x78\x86\x67\xc4\x10\xda\xc3\x39\x91\x8c\x86\x9b\x00\xab\x80\xf2\x0b\xf7\x99\x0d\x36\x6f\x9b\x3d\x5e\x8e\xb2\xf4\x8d\x7e\xd0\xe6\x4b\x85\xdc\x9f\xe3\xbb\x99\x8b\x1e\xec\xd1\x23\x1e\x90\x2d\x2d\x15\x2e\x09\xda\x2d\x25\x92\xbd\xb3\x2c\x8c\xd2\xe2\xc4\x89\x49\x6b\x29\x80\xc0\x3d\xbb\x09\xec\x7f\x8a\x4e\xa2\xc7\x02\x0f\x2a\x0f\xaa\x65\x7c\xd6\xce\xd4\x8d\x6d\xa2\x78\x64\xcf\x5e\x97\xee\xa9\xb3\xc2\xf0\xf3\x4a\xbf\x8d\x87\xbd\x2a\xde\xb6\x0c\x72\x72\xfc\x43\x06\xd9\x55\xbd\xc8\x02\x3d\x7d\x3d\xc2\xf3\xda\xfe\x9e\xbe\x8a\x8d\x13\x89\x65\xa7\xf6\xce\x93\x51\x7c\xd2\x09\x96\x63\xf6\x7c\x34\x55\x21\x76\xdd\xb5\x95\xac\x6e\xa5\x60\x9f\xeb\xcf\x24\xc7\xd6\x9d\x41\x27\x09\xe5\x78\x67\x0a\x21\xac\x8a\xfc\xcb\x8b\xf2\xb1\x8f\xf3\xaf\x7d\xe2\x1d\xc7\x1d\x50\xd6\x0d\x37\xb6\xed\x72\x9d\xb0\x4b\xef\xf7\xd3\x4b\x29\x20\xd8\x75\x51\xce\x15"}, +{{0xc1,0xd4,0x72,0x4c,0x6c,0xb1,0xbc,0x67,0x23,0xb2,0xb4,0x30,0x34,0x27,0x8b,0x3c,0x5b,0x48,0xfe,0xd7,0xf8,0xa3,0xcc,0x23,0x18,0x03,0x3e,0x75,0x52,0x04,0x73,0x51,},{0xc2,0x7e,0x39,0x2e,0x7c,0x36,0x64,0xb9,0x06,0x1e,0xa7,0x6d,0x25,0x75,0xdd,0x7c,0x41,0xea,0xf1,0xda,0x3a,0x65,0xf3,0xa9,0x86,0xe0,0xa5,0x7f,0x6c,0x40,0xc1,0x7e,},{0xd3,0x7a,0x6e,0xc8,0x2e,0xd4,0x5c,0xa9,0xb4,0x85,0x5d,0xe9,0xcb,0x94,0x25,0x64,0xe8,0x83,0xff,0x70,0xa7,0x9b,0x8e,0x71,0x2d,0x5f,0x60,0x4e,0xc8,0x97,0x4d,0xe5,0x36,0x3a,0xc8,0x49,0xcb,0xab,0x28,0xe7,0xae,0xef,0xf2,0x8e,0xd3,0xf2,0xd1,0x4b,0x60,0x8b,0x31,0x46,0xc2,0xef,0xe0,0x73,0x5a,0xd8,0x15,0xc7,0xd7,0x5a,0x1a,0x01,},"\xde\xee\x99\xd7\xa7\x7d\x43\x00\xc1\x7a\xec\x1a\xb3\x23\xc5\x71\xc6\xe9\xe7\x3a\x43\x49\x1a\x3c\x78\x88\xb7\x6f\xc0\x3e\xc4\x3d\x07\xaf\x42\xa0\x5a\x2a\xa3\x22\xd0\x0c\x85\x60\xac\xef\x31\x41\x06\xb1\x0b\x9b\xd1\x26\x54\x35\x7f\xfa\x26\xf2\x39\x00\x50\xda\x63\xd6\x68\xc9\xe2\xdf\x54\x8f\x87\x63\x9e\x09\x6a\x35\x85\x3f\x82\xe7\x61\xfd\x71\x1d\x2a\x26\x54\x38\xf5\xd4\xdb\x5e\x32\x77\x57\x08\x15\x0d\xa6\xcb\x68\x6a\x2b\x4c\xa2\x11\xd7\xf0\x0d\xc0\xab\xcb\x2c\xa1\x50\xe7\x91\x11\x6a\x10\xa5\xef\xcf\xf3\x51\x4d\xab\x8e\xd8\x0a\x70\x92\xc3\xa0\x15\x15\x2c\xb2\x5d\x9f\x86\xec\x0d\x1c\xa6\x7d\xda\xb4\x4d\x64\xee\xb1\xf9\x31\xbf\xab\x2a\xb1\x88\x95\x6c\x74\x3d\xb4\x81\x48\x08\xc5\xcd\xe1\xb0\x74\x5b\x3e\xdd\x34\x0e\xb0\x3f\xfc\xc8\x0a\x78\xf3\xdb\x31\x0f\x4f\x5c\x20\x00\x9f\xc0\x27\x9c\x2c\x1b\xcb\x3c\xed\xf9\x90\xbd\x0e\x20\xc6\xf9\xfb\x75\x15\xad\x6e\x93\x3b\x07\xe9\x9d\xa6\xac\x32\xb9\x71\x41\x18\x7e\xf6\x3b\xdb\x10\x62\xe3\x72\x20\xa4\xdc\xd4\x19\xd6\x24\x4c\xdc\xc3\x4e\xa4\x1d\x0b\xcb\xc3\x13\x8b\x1d\x54\xae\xfc\x01\x90\xe3\x0b\x18\x7d\xb0\x73\xaa\x7d\x6c\xfe\x04\xbd\x3f\xd2\xac\x00\x31\x3e\x3d\xdd\x64\xa1\x81\x93\x5c\xa4\xb8\xb2\xa8\x5d\x36\xbc\x27\xd9\x7b\x76\x26\x76\x7b\x93\xee\x38\xde\xf8\xb6\xb2\xc8\xda\x9b\x00\x26\x36\x14\x34\x2f\xaa\x9d\x3e\x73\x8d\x27\x13\xc4\x5f\xfb\xee\xf8\xc8\x4b\xcd\xbc\x8d\xa4\x30\x9c\x84\x45\x53\x0f\x5c\x61\x7d\xc8\x66\x25\x1f\x54\x89\x50\xa1\x4f\x07\x5a\xa3\x11\x7f\x96\xe4\x1f\x89\x9d\xbe\x73\x40\xb1\xd9\x0a\x13\x52\xd3\xb8\xfb\x41\xb7\x9f\x16\xa8\x2b\xc2\xe4\xa1\x93\xb8\xa7\x23\x24\x00\x99\x6b\x73\xb1\xfc\x00\xb2\xec\x1c\x66\x75\x77\xf8\x28\x24\xd3\x9f\xb7\xf6\xe7\x69\x2d\xcd\x97\xb1\xd8\xce\x94\x08\x3c\xa1\x97\xe9\xa5\xd4\x0f\xad\xff\x0b\x9a\xc5\x7e\x9d\xe7\x61\xc1\x56\xe6\xd3\x1d\x52\xc3\x32\xd5\x13\xe9\xf5\x86\x97\xdc\xbd\xd8\x0a\x5e\x42\xc5\x51\x70\x2c\x3d\xe7\xbe\xcc\xc3\xdb\x84\x5b\x1a\x04\xc8\xcb\xd4\x16\x95\xea\x74\x28\xab\xba\x89\xe0\xdc\xe3\xe3\xd9\xe7\x02\x30\xae\x91\x47\xc2\xb8\x85\x59\xdc\x69\x5d\x68\x09\xa5\x1c\xcb\xc1\xdd\x9e\x08\x9c\x58\x5f"}, +{{0x37,0xc0,0x70,0xd4,0xa5,0x3b,0x13,0xbe,0x76,0x06,0x35,0x11,0x0d,0x1b,0xd4,0xf0,0x19,0x20,0x22,0x5a,0xfa,0xbe,0xc5,0x76,0xfa,0xae,0xc9,0x10,0xf2,0x92,0x6d,0x1a,},{0x0a,0xa8,0x5f,0x2a,0xb1,0xdf,0xf8,0x95,0xd1,0xfa,0xd0,0xc1,0x19,0xf2,0xbf,0x57,0x12,0x6a,0xab,0x60,0x1c,0x52,0x8d,0x37,0x69,0x8e,0x97,0x70,0x2d,0x35,0xf5,0x25,},{0x9d,0xa6,0x0c,0xc4,0xa6,0x4d,0x07,0xde,0xe1,0x34,0x6b,0xd3,0xd3,0x01,0x09,0x95,0xce,0x27,0x38,0x20,0x8a,0xb3,0x5b,0x34,0xc2,0xa8,0xfd,0x17,0x87,0xae,0x3a,0x1e,0x20,0x7f,0xe7,0x84,0x52,0x51,0x54,0xfa,0xe4,0xf5,0x79,0x4c,0xd8,0x50,0x30,0x45,0xfe,0xa8,0x5c,0xf7,0x7f,0xd9,0x2f,0x6a,0x70,0xcd,0x0c,0x5a,0x52,0xc0,0x81,0x0e,},"\x10\xc6\x46\x44\x7f\x81\xad\x94\xd0\x15\xd8\x6d\x0d\x98\xb2\x45\x2d\xca\x60\xa4\x7a\xb3\x52\x64\x03\x5e\x33\xa0\x94\x2b\x95\x4e\x3e\x23\xb9\x1d\x81\x23\xb8\x59\x3c\x6a\xf7\xc8\xd3\xec\xd2\x90\xe0\xe5\xee\x36\xfd\x4e\x53\xb7\xbe\x63\x3a\x6c\xf0\x27\xa5\xac\x3f\x0f\x67\x9e\xb1\xbd\xd2\x10\xa3\x8e\xa6\xe4\x8b\x05\x58\xe3\x03\x01\x0a\xf4\x74\xe7\xf6\xdf\x2a\x4e\x45\x76\x99\xfc\x38\xe3\x69\x38\xb0\x5f\xfc\xaa\x1b\x69\x4e\x32\xf3\xd1\xb2\xcc\x5d\x00\xcf\x25\x6f\x12\x18\x4c\x87\x3e\x51\x90\x89\xec\x1d\xf1\x5b\x0d\xc7\x6e\x7b\xfe\x90\x78\x0d\xf5\x81\x36\xfe\x59\x7f\xce\x89\x4c\xa5\x63\xe0\x8e\xfa\x0f\x2d\x4d\x20\x8b\xed\xe9\xa8\x74\x88\x28\x73\xd2\x51\xba\xf0\x19\xfe\x46\xd1\xd6\x50\x4b\x3b\xcd\x24\x3b\x79\x53\x51\xf3\x4d\x2e\x76\x06\xaa\x97\x55\x28\xee\x50\xd5\x9e\xfb\x6e\xe6\x99\x2a\x89\xb2\x42\x69\x56\xc2\xca\x42\x47\xe0\xdf\x01\x29\x85\x29\x83\xe9\x76\x7a\x8e\xed\x1b\xc7\x33\x5f\xfc\xa8\xd0\x28\x9f\x04\x80\x7f\x67\xca\x7d\xa9\x71\xf5\x8d\xb8\xb9\xbc\x9f\xdb\xe4\xf8\x3c\xfe\x9a\x00\xf1\xca\x58\x47\x98\xbc\x71\xd8\x51\xff\x7c\xd6\xc5\x1b\x89\x90\xaa\xba\x4d\x38\xb4\x16\xb9\x22\x40\xdf\xb7\x0e\xe3\xc1\x2b\x5e\x73\x10\x57\x76\x2e\xf9\x08\x23\xfb\xf6\x83\xca\x06\xd0\x5c\x20\xd3\xae\x2b\x97\xa8\x3e\xbe\x70\xae\x17\xaf\xff\x9d\x16\x60\x9d\x54\x6d\x8d\x3c\x74\xbc\x28\x18\x84\x89\x4f\x3d\x49\xe0\x83\xf1\x0a\xe7\xc1\x1c\x1d\xca\x0e\xff\xef\xcf\xa6\xe0\xf1\x53\x50\x81\xfa\xc3\xa2\x81\x9f\xd2\xe3\x26\x55\x27\x18\x2a\xe9\xd3\x91\xb2\x32\xbb\x75\x42\xe6\x84\x55\xcd\x26\x77\x60\xdb\x65\x2d\x19\xe2\x2f\xb2\xed\x11\xcd\x13\x05\xba\x8d\x98\xc1\xeb\xf2\xd1\x96\x9b\x24\xd6\x4f\x3e\x31\x9a\xf7\x4e\x09\x20\x06\xd2\xa3\xff\x74\x48\x72\xa2\x0e\xbf\x18\xd1\x77\x48\xab\x71\x10\x80\x50\x96\xea\x13\x6b\xce\x2f\x96\x8b\x20\x5e\x65\x0b\x80\x3c\x53\x1d\x06\x77\x5a\xe5\xce\xea\x28\xbb\x92\xe9\xa0\xed\xec\x89\x51\xce\x20\x09\xa8\x8e\xe1\xb6\x4d\x9b\x9e\x89\xf6\x90\x51\x20\x33\x84\x21\x0a\x10\x2a\x44\xd2\xd6\x70\x31\x73\xb6\x85\x07\xdc\xea\xdd\x3b\xf6\x51\x0d\xf2\xa5\xce\xfd\x9c\x80\xe4\xf3\x85\xb2\xf9\xe6\x21\x58\x13\xed\x32"}, +{{0x11,0x26,0x49,0x6a,0x58,0x2c,0xe5,0x8d,0x3d,0x61,0x8d,0xd8,0xa3,0x93,0x35,0x47,0xaa,0x7a,0x8a,0x30,0xfb,0x54,0x06,0x3b,0x8d,0xfd,0xd3,0x16,0x71,0xc6,0xc7,0x3d,},{0xe1,0x02,0x29,0xc6,0x23,0xfa,0x8a,0xd8,0x98,0x2c,0x3e,0x4c,0x36,0xff,0x52,0xdf,0x0f,0x21,0x9b,0x57,0x91,0x5b,0x6e,0x98,0x0e,0x5f,0xe7,0x2e,0xa0,0x96,0x2e,0x22,},{0xb3,0x0e,0xb5,0x6c,0xa9,0xb1,0x20,0xbf,0x84,0x9a,0x3a,0x9d,0x56,0xaf,0x03,0x3d,0xe8,0xa5,0x90,0xc9,0xe1,0x24,0x0c,0x1e,0x36,0xdb,0xc6,0xcf,0x0a,0x71,0xb7,0x8a,0x11,0xec,0x14,0x3f,0xb9,0x95,0x9a,0x8f,0x25,0xb5,0x77,0x11,0xd6,0xa9,0x0a,0x67,0xe0,0x1b,0xe3,0xa4,0xda,0x2b,0x69,0x39,0x48,0x69,0xbb,0x8d,0x64,0xb8,0x7e,0x0f,},"\x6a\x4b\x52\xd7\x30\xdd\xab\x82\x9b\x2a\x17\x95\x90\xcb\xd4\xc3\x72\x49\x8e\x9f\x43\x99\x77\xc0\xa1\x0d\xc1\x3c\x0a\xe1\x73\x6e\xaa\xff\x06\x33\x71\x43\x4f\xd0\xda\x80\x36\x0e\xc5\x89\x06\x07\xd2\xfa\xe1\xc9\xa2\xe1\xab\x0b\x7f\x3d\x66\x7f\x5b\x1b\x9c\x41\x8f\x18\xb1\x0c\x9e\x6f\xd6\x69\xd3\xeb\xec\x16\x8e\xfe\xf4\x41\x63\xe5\x77\xa2\xeb\xd0\xf2\xcb\x76\x8f\x80\xc2\x31\x88\xe8\x60\x69\xe4\xd1\x0f\x41\x03\x06\xce\xdd\x7a\x34\x1a\x61\xe0\xf4\xf3\xbc\x25\x04\x1b\xc2\xf9\x22\xed\x07\x3e\x1e\x2f\x1b\x70\x9c\x57\x9d\x10\x63\x0f\x33\x07\x17\x54\xd7\x07\x89\x4a\x1c\x62\x19\x0d\xe1\x88\x82\xc5\x64\xdc\x4c\x01\xdc\x54\x5d\xd8\x96\x64\x04\xed\x78\xfa\x32\x67\xa9\x46\x9f\x63\xb6\x12\x0a\xbb\x65\xf9\xb3\xba\x3e\xee\x28\xd7\x9c\x2e\xb4\xe7\x02\x0c\xc6\x98\x7d\xfc\x5c\x29\x67\x2f\x8c\x0f\xa3\xe6\x90\xd5\x84\xfe\x00\x0c\x64\xf3\x52\x61\x01\x79\x62\x1b\xfd\x5f\xf3\xeb\x30\xd1\x8f\x1a\x02\x50\x41\x6d\xb9\x3b\x1c\x1e\x93\xcf\x8a\x36\x46\x51\x75\x60\xd1\xcc\x8f\xff\x82\x2b\x51\xef\x27\xb2\x00\xe9\x87\xb5\x92\x39\x07\x53\x45\x3e\xf1\x38\xbd\x3d\x29\xdb\x7c\xb1\xb5\xf4\x5e\x47\x95\xb8\x9c\x53\xf4\x97\x04\x19\x27\x52\x23\x7c\x6a\xb2\x74\x84\x9f\x95\x94\xee\x97\x77\xf6\xef\xe7\x04\x83\x12\x9d\x06\x7f\x97\x19\x9d\x9a\xe3\x60\x90\x70\x38\x64\xf7\xca\x47\x50\xa6\xf3\xb6\xff\x83\x82\x4c\x91\x04\x84\x39\x4d\x1e\x2e\xce\xba\x18\x44\x6f\xe4\xe9\x94\xce\x07\x43\x3a\x74\x0d\xdd\x05\xf0\xe3\x96\xd4\x82\x89\x4e\x6f\x14\xac\xf7\xb9\x7b\xae\x6c\x7e\xb8\x87\x03\x03\x9f\xa7\x85\xd6\x0a\x3a\xf7\x8b\x13\x24\x3a\x4f\x88\xdd\xe1\xd9\x98\x61\x7f\x2e\x3f\xa7\xea\xfc\x2f\x43\x5d\xd4\xac\x1e\xa9\xc2\x38\x40\x7a\xa0\x9b\x4e\xea\x8e\xd4\x34\x92\x7b\x40\x66\x74\xac\x27\x04\x58\xcf\xb3\xbf\x29\xc3\x47\xf9\x45\x59\x61\x31\x79\xb9\x50\x21\x92\x32\x1b\x88\xe9\xaf\x0a\x90\xe9\xa4\xab\x9e\xdd\xaa\xe3\x82\xe3\x73\x4d\x14\x15\xeb\xe3\x24\x99\xc3\x4e\x6f\xde\xaf\x15\xb0\xd9\x78\x79\x85\xe0\x8d\xfe\x49\x54\x60\xc5\x4f\x67\x43\xd8\x1f\xf1\x68\x81\xe5\xe3\x0c\x51\xf4\xb0\x92\x37\x37\x83\xf1\x24\x23\xc3\xe1\xae\x85\x91\x13\x0a\x26\x99\x80\xca\xa1\xcb\x5c"}, +{{0x9c,0x16,0x7a,0xff,0x3b,0x1b,0x78,0x8f,0x13,0x3d,0x42,0x2d,0xe8,0xca,0x9a,0x64,0x31,0x64,0x09,0xf9,0xe3,0x5b,0xfe,0x22,0x03,0x2e,0xc4,0x17,0xae,0x9a,0xbc,0x6d,},{0xef,0xb5,0x34,0xf0,0xd4,0x7c,0x06,0x8e,0x77,0xb2,0x8a,0x90,0x6d,0x95,0xad,0x8d,0x21,0x3a,0x4d,0x4f,0xc1,0xc7,0x05,0x42,0xf0,0x1e,0x59,0x6d,0x57,0xb5,0xf0,0x19,},{0xc9,0xae,0x67,0xfd,0x64,0x15,0xdc,0xba,0xb2,0x92,0xfa,0xb3,0x94,0xca,0x6c,0x3b,0x7d,0x90,0xca,0x24,0x4d,0xc6,0xa7,0x76,0x4e,0x74,0xfd,0x20,0x2b,0xf4,0xb2,0x90,0x5b,0xd2,0x03,0x0e,0x6b,0xeb,0x91,0x4c,0x3c,0x23,0x8d,0xb3,0x71,0xb1,0xcb,0xa6,0xd9,0x26,0x1a,0xa3,0x92,0xec,0x87,0x1a,0x4b,0x8b,0x12,0xfe,0x9c,0x1c,0x97,0x0e,},"\x68\xac\x0f\xc2\xb6\x07\xba\x38\xe3\x77\xfa\xe8\x45\xc8\x08\xc8\xf9\xfa\x61\x4e\xb1\xf3\x11\x58\xa9\x62\x0a\x93\x7d\x3e\x30\x1e\x85\xac\xaa\x69\x14\x4b\xc3\x49\xa3\x9d\xfb\x58\x20\x41\xc4\xa1\x97\xae\x99\xb4\xd4\xd5\x9b\x7a\x2c\xa3\xd1\x62\x28\xb5\x59\x1c\xbf\x57\xc1\x8a\x78\x1e\xfd\x19\x19\x3c\x47\xb1\x6c\x60\x23\xa3\xa8\xba\x3d\x66\x8f\x05\xa3\x7f\x1e\x83\xb0\xd7\xfe\xbd\xd1\x0f\x63\xe4\x8e\xf7\xa2\x0e\x01\x5b\x1c\x67\x25\xd4\xc3\x00\xa9\x86\xc6\x0e\x3a\x11\x54\x69\xc8\xe5\x2b\xa0\x5b\x51\xc0\x5d\x0a\xf4\x0d\x89\xfd\x9e\xd7\x6f\x36\x95\x0a\xee\x3c\x78\x19\x89\x8a\x90\x3c\xfe\x03\x61\xa9\x1c\x69\x10\x0b\x49\x51\x41\xe8\x6e\xe7\x9d\x63\xd1\x74\x03\xfb\x1a\x16\x29\xef\x63\xcb\x7e\x9d\x27\x20\xcb\xff\xf0\x00\x2b\x19\x0b\xcd\xc2\x67\x94\x12\x4d\xd3\x8d\x42\xbc\xaa\x71\x75\x40\x5e\xb0\xbb\xcf\x8e\x37\xd6\x5d\x05\xa3\x71\x95\xb4\x79\x37\x1f\xa2\xbb\xbb\x16\x7d\x91\xce\xe8\x82\x35\xdd\x72\xea\x88\xfc\x73\xce\x3c\xe4\x3d\x33\xb7\x15\xf2\x5f\x19\x2e\xc2\x15\xda\xc1\x24\x89\x9c\x5e\x75\x86\xe8\x63\x40\xd8\xcb\xe5\x37\x35\xde\xfb\xe0\x2e\x4c\xc9\xfd\xe6\x9f\xb9\x79\x4d\x1d\xb7\x2b\x98\xc0\xf1\x97\x66\xee\x51\x38\xbb\xfa\x78\x90\x9a\xa2\x99\xb4\x91\x3c\x49\x9d\xea\xf5\x4b\x48\x41\xd5\x04\x48\x29\x98\x49\x36\x70\x0d\xcf\x92\xf3\x65\x42\xb2\xfc\x7e\x86\x44\x1b\x99\x25\xf5\xd0\xb7\x8c\x17\xa8\x5c\xfc\xfc\xb2\x0b\x0f\xd7\x51\x34\x9c\x27\x46\x3a\xbd\xe4\xd2\x7d\xf7\x42\x65\x28\x87\x13\xf9\x6d\xea\x01\x3b\x94\x55\x21\x80\x8b\x49\x96\xb1\xb2\xdc\x03\x38\xb6\xd2\x36\xef\xd6\xd2\xb2\x7d\xaf\xda\x46\xec\x5f\xa3\x2b\x96\x5e\x8b\xb5\xe8\xbb\x61\xbd\x96\x6e\xde\xb7\x74\x68\x1e\x0e\xa8\xc1\x7b\x8c\x99\xfa\x7d\x66\x0f\x0f\x66\xc9\xbc\x6d\x95\xcb\xd7\xdc\x09\x47\x24\x09\x8e\xb0\x51\x91\xb5\x3a\x3d\xf6\x56\x6b\x9c\x90\xe0\xd7\xdf\xf2\x94\x38\x48\xb6\x1a\x20\xd4\x8c\x22\xb6\xd3\xc9\x58\xe2\x93\xd7\x09\xc8\xf4\x81\x10\x23\x0f\xf5\x19\x18\x56\x28\x77\xda\xf6\xd9\x20\xc8\x5a\x82\xe0\x7c\x45\x1f\xe7\xae\x97\x59\xc0\xa7\x7e\x97\xbb\x29\x8b\x5d\x05\x92\xa4\x1d\x08\xf6\x7a\x4e\xd5\xa1\xbb\x41\xe9\x37\xb6\xa6\x8a\xeb\x38\xfd\x5b\xe9"}, +{{0xe9,0x94,0x88,0x05,0xeb,0x34,0x1b,0x28,0x67,0x47,0x9c,0x66,0x8f,0xd3,0x53,0x2c,0x30,0x99,0x41,0xc0,0xad,0x4c,0xb2,0xe5,0x42,0x31,0x75,0x6e,0x6a,0x1b,0xde,0xcb,},{0x54,0x47,0xa8,0xe3,0x4d,0x6a,0x64,0x00,0x02,0xd8,0xd6,0x0b,0xcf,0x1d,0xdc,0x71,0x1e,0x4c,0x46,0x5c,0x94,0xc3,0x4b,0x50,0xbd,0xef,0x35,0x89,0x60,0xff,0x81,0xf1,},{0xd3,0xdc,0x62,0xd6,0xce,0x9c,0x76,0x6f,0x2a,0xba,0xf9,0xa7,0xfb,0xe0,0x9d,0x6b,0xdb,0x07,0xa4,0x74,0x7b,0x56,0x08,0x0d,0xb0,0x9b,0xeb,0x4a,0x4e,0x80,0x4a,0x70,0xd7,0xdd,0xf4,0x11,0x94,0x75,0xc7,0xbe,0x83,0x4f,0x31,0x95,0x6f,0x4a,0x71,0xda,0xd0,0x29,0xcd,0xf2,0x36,0x3d,0xd0,0x36,0x5c,0xe2,0x2d,0xc2,0x7f,0x07,0x80,0x03,},"\x91\xcf\xfd\x7e\xb1\xcf\x6b\xd4\x75\x6b\xce\x6a\x30\xaf\x9d\xfb\xa2\x6d\xdd\x1c\xce\x03\x94\xc1\x94\xa3\xe3\x9c\xc3\xd1\xcb\xc2\x21\xb7\xeb\x70\xbe\xa1\x8d\x29\xc2\x67\x45\x71\x76\xa3\xc9\xe5\x3c\x18\xe4\x7d\x10\xa6\x7c\x46\x45\x05\x19\x77\x02\xe6\xb2\x47\x0d\x38\x86\x9d\xb5\x17\x4b\x15\x8f\x99\x92\xe4\x43\x5d\x02\x24\x6f\x54\x02\x58\xde\xdd\x3c\xe3\x3d\xf5\x82\x55\x5a\x68\x1f\xb7\x6e\xca\xcc\xb1\xc2\x98\x9b\x17\x7e\x3b\x7e\x45\x4a\xaa\x52\x9d\xe5\x9b\xf5\xa0\x31\x23\xd5\x71\xdf\x2e\x7f\x7c\xb8\x30\x80\x5c\x58\xb7\x4a\x65\x3b\xac\x0e\x5a\x88\x8e\x08\xdc\x22\x36\xd6\xcd\x49\x6a\xa0\x6d\x0d\x67\xcf\x3b\x33\x5e\x21\x8c\x49\xde\xda\xd8\x2f\xc1\xbe\x9e\xf2\x0c\xac\x61\x90\x5c\x30\xeb\x13\x2d\x73\x9b\x16\xca\x8a\x8c\x90\x66\x19\xc0\xe0\xd8\xb3\x39\x85\x32\x7e\x36\xf3\xd4\xb8\xfd\xa3\x87\xc1\x86\xcc\x50\x44\x31\x04\xdb\x76\x1f\x7f\xf9\x30\x12\x70\x20\x4a\x71\x3e\x58\x90\x21\x01\xfa\xd0\x00\xce\x93\x16\x47\xc5\x77\xfd\xec\x14\x8d\xca\x95\xcd\xc0\x89\x18\xeb\xed\x03\x7c\x60\x33\x2f\xad\xf0\x88\xf0\x36\x08\x3e\xbc\x92\xe1\x73\xb7\xdd\xcc\x30\xc4\x93\xf2\x7e\x69\xcd\x17\xa2\x0d\x30\xb7\x8f\x83\xa7\x2e\x4f\x5a\x74\x7d\x86\xd9\x6c\x5e\x1b\xb7\xa4\x38\x16\x62\x04\x01\x3e\x21\x64\xd6\xaa\xbc\x0d\x56\x2f\x54\x01\x5c\x36\x5c\x80\x44\x56\x07\x14\x5e\x56\x92\xee\x34\xf6\x35\x30\x77\xfa\xb7\x45\x2d\x88\xce\x3e\xb0\x1d\x2b\x37\x97\xdc\x91\xb3\x41\xa3\xa7\x26\x30\x15\x16\xba\xae\x18\xe8\x51\xf7\x4d\xfb\xdf\x08\x66\xbb\x23\x76\x86\x7d\xe5\x52\x31\xe3\x62\xc4\x72\xc5\x21\x16\x54\x4c\xd4\xf8\x1e\x93\x57\x1c\x4e\xc8\x20\xe7\xe6\x53\xf4\xe2\x1b\xe0\xa9\x42\x57\x6c\x9d\xe9\x1e\x7d\x12\x51\x68\x3d\x85\x9d\xe4\x48\xf8\x22\xdc\xf3\xd2\xcf\x55\xed\xe2\xf9\xc7\x1b\x60\x63\xd1\x37\x30\x61\xf8\xf5\x93\x6b\x69\x8d\x13\x84\xe6\x54\x59\xea\x2b\xc2\x6e\xc9\x67\x75\xef\x42\x52\x07\x43\x2d\xda\x0a\xc1\xfe\x28\x52\x6c\x5e\x45\x59\x34\x9c\x3d\x8d\xf9\x91\x82\x30\xf4\x04\x46\x83\xcc\x2c\x1b\x85\x8d\x14\x1a\xb8\xd0\x80\x5b\xb9\x33\x60\x67\x52\x2a\xa8\x9c\x81\x0f\x3e\xaa\x7a\xc2\xd8\xdd\x28\xc3\x75\x12\x25\xa1\x9e\xce\xc8\xbc\xca\x52\x43\x99\x46"}, +{{0xb0,0x17,0x53,0xef,0xa7,0x3b,0xb3,0xde,0x7a,0xa7,0x78,0xbe,0x7a,0xfc,0xbf,0xf6,0x6a,0x5d,0x3e,0x2c,0x2f,0x8b,0x5a,0xa2,0xb0,0x48,0x84,0x40,0x50,0x99,0x69,0x65,},{0xd0,0xcc,0x6c,0xf1,0x09,0xc9,0x99,0xfb,0xf6,0xd1,0x6f,0x47,0x1f,0xaf,0xd0,0x23,0x2b,0x0a,0x68,0xd4,0xc4,0x64,0x06,0xec,0x75,0x45,0xdb,0xab,0xa8,0x19,0x41,0x58,},{0x16,0xb7,0x42,0x12,0x27,0xae,0x09,0x13,0x06,0x85,0xcb,0xb1,0xa0,0xc6,0x0a,0xa5,0x7a,0x5e,0x1a,0xfe,0x1b,0xbe,0x6b,0xac,0xea,0x0c,0x28,0x1b,0xcc,0x89,0x98,0xe6,0x82,0x4a,0x77,0x2c,0x32,0x08,0xa6,0xb6,0xb4,0xd2,0x36,0x69,0x55,0x05,0xc9,0xbe,0x82,0x70,0x0c,0xf9,0x3a,0x78,0x39,0x85,0xa3,0x9e,0x16,0xe3,0x77,0xa7,0x41,0x0e,},"\x68\x4e\x61\x2f\x27\xee\xad\x0d\x34\x84\x4c\xc8\x1b\xa9\x11\xc2\x8a\xaf\x6d\x66\xe7\x12\x29\xe8\xcc\x34\x62\xf7\xc7\xa0\x50\xda\xa3\x0c\xb7\x44\x71\x15\x0f\x07\xda\xd4\x59\xb5\xa9\x13\x58\x47\x6c\x05\x98\x25\x5d\x8a\x64\x2d\xd7\xc0\x80\x28\x11\xbd\x88\xe4\xca\xc5\x97\xef\xe4\x1e\xbd\x96\xcd\x0f\x3b\x5c\xe7\x2d\xb4\xbe\x1a\x3d\xbd\x6b\x84\xf5\x44\x6e\x3d\xa6\x00\xd3\xb1\xd2\xb4\x60\xa0\x09\xbd\x31\xca\xcd\x98\xa9\x15\x18\xce\x33\xe9\xa7\x03\xd4\x04\x28\x87\x36\xcc\xc4\x31\x03\xfc\x69\xe6\x79\x74\xf3\x16\x52\xfa\x3d\xad\xef\x33\x37\xf6\xc8\x97\xa3\xd2\x01\x30\x3c\x8f\x03\x59\x7b\x4a\x87\xc9\x8f\x29\x1c\xcd\x58\xa3\xf1\xe8\x98\x33\x2a\xa5\x99\x3b\x47\xfc\xb5\xdd\xaa\x1c\x08\x68\xb6\x43\x74\x2d\x0e\x4a\x4b\x9c\xd4\x27\x03\x8b\x3b\x74\x99\x9b\xc8\x9a\xc3\x48\x4c\x0c\xa1\x3f\x25\xaa\xe8\xe7\x8a\xe1\xcc\xee\x62\x18\xac\xca\xb8\x1a\x4f\x69\x4f\x53\x24\xa3\x47\x62\x9d\x49\xb5\x5e\x40\x37\x50\x4a\x9a\xcc\x8d\xf5\x8c\x68\x41\xdd\xdc\xd4\xfc\x43\x47\xf7\xb6\xf1\xfd\x9d\xe0\x56\x45\x77\xe6\xf3\x29\xed\x95\x1a\x0a\x6b\x91\x24\xff\x63\xe2\x2e\xb3\x6d\x3a\x88\x63\xbc\x1b\xf6\x9c\xea\x24\xc6\x05\x96\x7e\x7d\x89\x48\x95\x3f\x27\xd5\xc4\xc7\x5f\x08\x49\xf8\x72\xa3\xe3\xd1\x6d\x42\x2f\xa5\xa1\x1e\x1b\x9a\x74\xdf\x6f\x38\xb9\x0f\x27\x7d\x81\xfc\xe8\x43\x7a\x14\xd9\x9d\x2b\xef\x18\x9d\x7c\xac\x83\xdd\xc6\x13\x77\xed\x34\x8b\x3c\x4f\xc0\x9e\xc2\xb9\x00\x59\x25\xd0\x4a\x71\xe2\x6d\x64\x16\x67\xbd\xf5\x49\x29\x43\x31\xc6\xea\x01\xcd\x5c\x0b\xd1\xb6\xa7\xec\xfd\xa2\x0b\x0f\x19\x29\x58\x2b\x74\x69\x7c\xb2\x62\xc3\x92\x7d\x6b\x22\x3f\x4b\x5f\x30\x43\xaa\x6e\xb4\x57\x1a\x78\xe9\xda\x11\xc2\xb3\x6f\x64\x55\x25\x80\xca\xa7\xb5\xfa\x6b\x90\xf9\x29\xe0\x16\x2e\x60\x8d\x12\x40\xd7\x24\x2c\xd2\xf4\x70\x25\xc0\x3d\xeb\xe0\x59\xb1\xdc\x94\x77\x02\x32\xbc\x67\x65\x14\x84\x80\xbb\x1d\x9f\x50\xda\x1e\xe6\x44\x8c\xf9\xc8\x8b\x19\xdd\x45\x99\x32\xc0\x6e\xd8\x11\xc4\xa6\x4a\x12\xd5\x93\x8b\xd1\xc7\x57\xbc\xfa\xea\xee\x89\x33\xfe\x5f\xff\x21\x76\x3d\xe7\x40\x48\x2b\xcf\x1b\xa5\x9a\xfd\xc8\xfc\xf8\x73\xc3\xd5\x07\xbb\x39\x4e\x32\xe4\x5f\x73\x65\x19"}, +{{0x4f,0x4b,0x20,0xd8,0x99,0x36,0x6f,0x2f,0x23,0xee,0x62,0x8f,0x22,0x9b,0x23,0x6c,0xf8,0x0f,0x43,0xba,0x18,0x31,0x77,0xc9,0x7e,0xe3,0x48,0x29,0x54,0x6f,0x17,0x42,},{0xc9,0x45,0x76,0x64,0x1f,0x4a,0x89,0x3c,0xdf,0xce,0xe7,0xb3,0x9f,0xc2,0x19,0x29,0xb8,0x6b,0x34,0x99,0x76,0xd7,0xb0,0xa4,0x6d,0x39,0xa5,0x88,0xbc,0xfe,0x43,0x57,},{0x0f,0x80,0xff,0x5d,0x17,0x48,0x8f,0xe2,0x6f,0x93,0xc5,0x43,0xb0,0x4e,0xd9,0x59,0xb5,0xf0,0x64,0x3f,0xc6,0x1c,0x7f,0x2c,0x3b,0xc6,0x01,0x32,0xba,0x9c,0x62,0x10,0xc8,0xb2,0x50,0xea,0x5e,0x84,0xd0,0x7b,0x01,0xde,0x68,0xbc,0x17,0x44,0x14,0xee,0xeb,0x31,0xfd,0xc2,0xba,0x68,0x23,0xe2,0x31,0xe3,0x12,0xa9,0x1e,0xde,0xdd,0x02,},"\xdb\x8e\xf0\x2e\x30\x33\xe6\xb9\x6a\x56\xca\xb0\x50\x82\xfb\x46\x95\xf4\xa1\xc9\x16\x25\x0d\xd7\x51\x73\xf4\x30\xa1\x0c\x94\x68\x81\x77\x09\xd3\x76\x23\x34\x6a\xe8\x24\x5b\x42\xbd\xa0\xda\x6b\x60\x46\x2c\xcf\xdf\xc7\x5a\x9a\xb9\x94\xe6\x6c\x9a\xb9\xfe\xcd\xd8\x59\x96\x10\x91\x0a\xff\xe4\xf1\x02\x15\xcb\x28\x0b\xf8\xf9\xf2\x70\x0a\x44\x47\x96\xda\xe9\x3e\x06\xc6\xbe\xa7\xd8\xb4\xfe\x13\x01\xba\xa7\x9c\xce\xc7\x69\x36\x8f\xeb\x24\x42\xc7\xde\x84\xf0\x95\xe6\xb3\xbf\xf6\x3d\x38\x8c\xba\xfb\x2b\x98\x09\xdc\x38\xe9\xb1\x2e\xbd\x03\x9c\x0a\x57\xf4\xd5\x22\xe9\x1e\xc8\xd1\xf2\xb8\xd2\x3a\x4a\x0a\xe0\x59\xaf\x85\x39\x3b\xb0\xa1\x5f\x74\x91\x10\xf6\x77\x4a\x1f\xd7\x31\xa6\xec\x21\x3e\x4f\xf4\x35\xda\xab\x54\x6d\x31\xed\x9e\xc3\xb6\xd8\xcc\x2e\xda\xce\xbf\x4f\xac\xc5\x56\x65\x56\xee\xa9\x2e\x5b\x3f\x25\x42\x23\x9b\x25\xe2\x80\x12\xdd\x4e\xf4\x00\x72\xee\xbf\x83\xed\x2a\x25\x51\x81\xf3\xa4\x42\x18\x9d\x68\xc6\xc6\x09\xf4\xdf\xdf\x3d\xb7\xd6\x7d\x08\x7a\x2f\xcd\x6d\x2d\xc5\x0b\xbf\xed\x8b\xfb\xbf\xcb\x74\xd3\xc4\x1f\x02\xa8\x78\x65\xb1\x3b\x8e\xfc\xf5\xc3\x58\x12\x57\xbe\x0a\xa9\x13\xf6\x0c\x37\x05\x27\xbd\xe1\x1a\x47\x5c\x13\x6a\x17\xc5\xee\xfe\xb0\x3f\x5b\xff\x28\x69\x3e\xd8\x41\xe8\xed\x1f\x7c\x29\x10\x2f\x55\x99\xdd\x44\x40\x09\xbc\xea\x6a\x92\xd5\x57\x41\x52\x45\x8e\x0c\xaf\x8a\x36\xaa\x72\xb5\xdc\x49\x08\xa6\x46\x1c\x9b\x74\x14\x53\x00\x5c\x8f\xbc\xc6\x81\x13\xae\x18\x42\x08\xee\x14\xb8\x35\x48\x0c\x6e\xfa\xfe\xd1\x8a\x76\x00\x0b\x38\xe5\x85\x82\x90\xf4\xd5\x1f\x52\xf0\x96\xcb\xe4\x90\xe1\xeb\x5c\xac\xb2\x26\xec\x49\x5a\x55\xa7\xfa\x45\x78\x43\xd5\x7f\xab\x67\xf8\xbe\x7e\x20\x93\x34\x78\x5b\xdd\x66\x5d\x7b\x63\xe4\xda\xf5\x7b\x6e\x78\x92\x8b\x60\x3c\x8c\x0f\x9b\xc8\x54\x64\x73\x3b\x61\x27\x3e\xf9\xe2\xb8\xa0\xcd\x7c\x3b\xf8\xee\x0a\x68\x72\xe3\x4d\x5a\x27\xa6\x25\xe3\x5e\xaf\x7f\xf5\x44\x0b\x8b\x14\x1a\xf7\x04\xdf\x70\xc9\xc1\x86\x23\xbd\x11\x20\x95\x13\x19\x25\x05\x10\x5c\xd7\xbc\xfa\x5f\x0d\x91\x9d\xa7\x06\x94\x8f\xbe\x1f\x76\x1f\x31\x58\x46\xaa\x3b\x48\x13\xdd\x9b\xa3\xd8\x1b\x92\x04\xe5\x40\x9c\x03\x82\xb6\xeb"}, +{{0xd2,0xe0,0x1d,0x25,0x78,0xb6,0x25,0xa7,0x06,0x0a,0xab,0xc2,0x57,0x65,0xf1,0x68,0xc6,0x80,0xce,0xf7,0x67,0xaa,0x97,0xca,0x0e,0x5e,0xb3,0xd6,0x67,0x47,0x4b,0x2a,},{0x19,0x1a,0xc2,0x23,0x57,0x54,0x24,0xaa,0x35,0x4b,0x25,0x5b,0x81,0x2d,0xd3,0x02,0x5d,0x70,0xed,0x82,0x9e,0x08,0x26,0xc0,0x16,0x29,0xf9,0xdf,0x35,0x45,0x08,0x2b,},{0x87,0xa0,0x10,0x39,0x4a,0x9f,0x2c,0x90,0x4e,0xff,0xef,0xca,0x9f,0xb4,0xd5,0xce,0x13,0x79,0x33,0x01,0xa4,0x92,0x5b,0xa5,0x1d,0xb1,0x19,0x12,0x3a,0x4d,0x73,0x0a,0xbf,0x76,0x4c,0xe0,0x65,0xe4,0x8d,0x90,0xa7,0x9d,0x90,0x7d,0x72,0x54,0xc4,0x0c,0xc3,0x58,0x98,0x7a,0x46,0x94,0x9e,0x92,0x8b,0xbb,0x3c,0xd0,0x85,0xdf,0xab,0x06,},"\x20\xd5\xdd\x69\x9b\x28\x53\x30\x2a\x68\x17\x09\x4d\x5e\xa5\x12\xbd\xf8\x53\x45\x04\xcb\x28\x9c\x60\x24\x67\x41\x07\x40\xec\x7e\xb8\xea\x64\x42\xc8\x0f\x14\x59\x35\x06\x8f\x91\x22\xfd\xf4\xa3\x9f\x20\x10\xf3\x3d\xb5\x5b\x81\x4d\x97\xbf\x2e\x58\x72\x32\x9f\x11\x26\xd4\xeb\x95\xb8\x06\xca\x19\x73\x11\x31\x65\xb1\x16\xbe\x87\x16\x37\x1f\x81\x33\x17\x79\xdc\x79\xa5\xcb\x39\x42\x08\x1a\xb5\xf2\x07\xf6\xb5\x3d\xb0\xe0\x03\x81\x07\xd6\x3c\xa9\x77\x08\x18\x19\x82\xdc\xb5\xf3\xb9\x30\x10\xec\x6e\xdf\xb2\xcf\xd3\x1c\xab\x00\x09\x0b\x3c\x38\x51\x5f\x97\x81\x76\x96\x86\xcb\x17\xab\x81\xd5\x4a\x8b\x77\x57\x54\xd4\x2f\xba\xd0\x86\xb8\x0b\x28\xd6\x36\xf7\x8b\x7e\xb7\x7e\xd9\xca\x35\xb6\x84\x3a\x51\x0f\x0a\xd0\xac\x1b\x20\x26\x7a\x00\x03\x01\xb3\xc7\x07\xa2\x0f\x02\x14\xd5\x9b\x5b\x81\x99\xc2\xf9\xee\x25\xd3\x20\x60\xac\xe3\xe0\xf2\x59\x46\x50\x41\x6a\x00\x71\x6c\xd3\xf9\x86\x04\xa5\xe1\x04\xb3\x33\x10\xfd\xae\x94\xc3\x14\x01\x3c\xdc\xa5\xba\x24\x14\x40\x9e\xb7\xf1\x90\x13\x94\xf0\x07\xd6\xfa\x0a\x29\xdb\xe8\xec\x3d\xf9\x8c\x39\x3c\x8d\x72\x69\x58\x77\xcc\x9b\xaf\x49\x1e\xf3\x0e\xf7\xdb\x33\x71\x60\x8c\xa9\x7c\xc6\x21\x56\x25\x20\xee\x58\x1d\x5d\x1c\xdb\xc7\x82\x32\xd6\xc7\xe4\x39\x37\xb2\xcc\x85\x49\xe6\xf1\xe0\x8d\xf5\xf2\xea\xc8\x44\xfe\x0f\x82\x2b\x24\x83\xad\x0a\x5d\xe3\x3b\xe6\x40\x89\x49\x0e\x77\xd6\x98\x00\xfa\xe2\x58\x9e\xe5\x87\x12\xac\x15\xa3\xf1\x9e\x6f\xfd\xbc\xa4\x2f\xe1\x89\x4e\x88\x9b\x94\xc0\x4b\x04\x24\x0d\xaf\xb0\xb2\x73\x0c\x23\x6b\x8c\xce\xb2\xcb\x97\xaf\xd1\xd5\x15\xdc\x19\xd1\x06\x7f\xd4\xab\xa8\xce\x29\x7f\xd6\xd1\x10\xb3\x5a\x21\xbd\x3c\x07\x5c\x57\x7d\x93\xfe\x1d\xf7\x7d\x64\x8f\x71\x19\x49\x20\x99\xb0\x17\xaf\x44\xeb\xa0\x9c\x80\x7f\x11\xa4\xc3\xf4\xa1\x1a\x2f\xff\x30\x6a\x72\x8b\xa7\x89\x83\x32\x3c\x92\xa2\xfd\x5f\xcc\x80\xc1\x8d\x42\x34\x26\xf8\x23\xa7\x3f\xe0\x40\x94\x95\x52\x84\x29\x3f\x5f\x6b\x3c\xa4\xff\x10\x80\xdb\xb1\xe4\xc6\xf7\x4c\x1d\x93\x5e\xd2\x1e\x30\x09\x4c\x7d\xe3\x36\xb8\x2d\xd8\x20\x0b\x0d\x65\x95\x83\xc5\xbf\xd5\x47\x0f\x9d\xb3\x42\xe7\x0e\xc4\x00\x07\x42\xc5\x64\x0a\x21\x4e\x3c\x2e"}, +{{0x7c,0xd7,0xec,0x99,0xdd,0x03,0xae,0xde,0x1f,0xf1,0x07,0x3e,0xc2,0xca,0x70,0x10,0x27,0x6e,0x94,0x7e,0x2a,0xa9,0xb0,0xe6,0x5f,0x87,0x7e,0x4c,0xcf,0x1b,0x3a,0x14,},{0xe4,0xc3,0x9d,0xbe,0x94,0x93,0x17,0x6b,0x82,0x13,0xf1,0x42,0x2a,0x9d,0xe7,0xc7,0x4f,0xb6,0xa5,0x91,0x90,0xfc,0xdb,0xf6,0x37,0xc7,0xad,0x5e,0xe1,0x65,0xc0,0x4f,},{0x6f,0x99,0x20,0x27,0x70,0x96,0x45,0x35,0xe4,0x83,0xa0,0xee,0x01,0xa5,0x29,0x44,0x2e,0xb3,0x21,0x30,0x3f,0xa8,0x05,0xd4,0x75,0x60,0x4d,0x7f,0xc7,0x28,0xa9,0x10,0x3f,0xb7,0xb5,0x58,0xb9,0x55,0xf4,0xd0,0x37,0x19,0xee,0xfa,0xa3,0xb7,0xed,0x5b,0x0d,0xa7,0x57,0x10,0xbb,0x98,0x78,0x7f,0x5c,0x22,0x82,0xed,0x66,0xe9,0xf6,0x0c,},"\xa6\x03\x4a\xa3\xc2\x48\x49\x23\xe8\x0e\x90\xe5\xa8\xe1\x74\x83\x50\xb4\xf2\xc3\xc8\x31\x9f\xaf\x1a\x2e\x32\x95\x15\x0a\x68\xe1\xee\xca\x1b\xc8\x49\x54\xcc\x89\xd4\x73\x1a\x7f\x65\x12\xaf\x01\x46\x4f\xdb\xce\x5d\xf6\x8e\xe8\x06\x6a\xd9\xa2\xfd\x21\xc0\x83\x5a\x76\x55\x9c\xa1\xc7\x44\x9a\x93\x3b\xcb\x15\xaf\x90\x22\x3d\x92\x5f\xf6\x1c\xd8\x3e\xb9\x35\x69\x83\x47\xa5\x70\x72\x70\x9a\x86\xb4\xe5\xa7\xa6\x26\xe0\x7a\x3f\x2e\x7e\x34\x1c\x77\x83\xa5\x40\xf8\x4a\xa7\x3e\x91\x7e\x86\x7b\xb8\x0b\xac\xe6\x25\x47\x05\xa9\xd1\xa1\x18\x5d\xe5\x6e\x1a\x4e\x78\xaa\xf5\x39\xe7\x49\xb8\xf7\x65\xbd\x05\x2c\x4c\xd1\x5b\x63\x8b\xf8\xec\xf8\x7d\x98\x14\x60\x6f\xed\x5a\x69\xf4\xda\xe9\xda\x47\xf3\x80\x6d\xd9\x0b\xe6\x4f\xcc\xd3\x36\x5c\xbe\x9e\x01\xc5\x88\xfe\x65\xd6\xb6\x03\x28\x07\x40\x96\x2a\xa8\xdd\xb9\x5a\x3f\x4f\x67\x4c\x03\xbc\x40\x43\x09\x2c\x54\x45\x95\x56\x82\x70\xa2\xc2\xa8\xaa\x06\xe3\xf6\x7c\x31\x99\x8c\x50\xb9\xa5\x8a\xca\xd0\x06\x90\xd3\x84\x81\x14\xcb\x19\x32\x93\xc8\xac\x21\x01\x6f\xd9\x96\xf5\xc6\x42\x14\x06\x4f\x82\x16\x7b\x2c\x92\x0c\xd8\xa8\x39\x75\x58\x52\xac\x77\xc3\xd9\x05\x26\xdd\x3a\xdb\x96\x83\x7c\xf4\xe7\x26\xf3\x4b\xd0\x29\x55\xcb\xac\x5b\x82\xc9\x2c\xf4\xaa\x8b\x54\xbb\x6e\x43\x6d\xae\x9b\xf8\x93\xef\x05\x0c\x6f\x13\x5a\x7e\x62\xfc\xd8\x34\xda\xc1\xd2\xbe\x8b\x8e\x59\xd6\x96\x13\x18\x11\x70\x1c\x43\x18\xbb\x6e\x9b\x5a\x20\xbe\xc6\x56\xfd\x2b\xa1\x92\xe2\x73\x2f\x42\x29\x63\xbe\xd4\xa4\xfd\x1e\xc9\x32\x63\x98\xdc\xe2\x90\xe0\x84\x8c\x70\xea\x23\x6c\x04\xc7\xdb\xb3\xb6\x79\x21\x44\x0c\x98\xd7\x27\x53\xf6\xa3\x32\xea\xad\x59\xfd\x0f\x57\x74\x29\x23\xfb\x62\x5f\xef\x07\x0f\x34\x22\x5e\xa0\x6c\x23\x63\xd1\x23\x66\x6b\x99\xac\x7d\x5e\x55\x0d\xa1\xe4\x04\xe5\x26\xb5\xb2\x29\xcb\x13\x0b\x84\xb1\x90\x3e\x43\x1c\xdb\x15\xb3\x37\x70\xf5\x81\x1d\x49\xfb\xd5\x0d\x60\xa3\x47\x4c\x0c\x35\xfc\x02\x1d\x86\x81\x81\x9e\xc7\x94\xcc\x32\xa6\x34\xbc\x46\xa9\x55\xaa\x02\x46\xb4\xff\x11\x24\x62\x3c\xba\xfb\x3c\xb9\xd3\xb9\x2a\x90\xfd\xe6\x48\xe4\x14\x63\x61\x92\x95\x2a\x92\x29\x1e\x5f\x86\xef\xdd\xb8\x9c\xa0\x78\xae\xa7\x71\x7f\xc7"}, +{{0xe3,0xca,0x37,0x13,0xa2,0xfd,0x41,0x2a,0xd5,0x33,0x6b,0xc3,0x56,0xb7,0x7b,0xe0,0x27,0xd5,0xb7,0x08,0x15,0xb3,0xac,0x2a,0xec,0xd8,0x34,0x0e,0xf5,0xf8,0x89,0xb1,},{0x1d,0x51,0x6c,0xb8,0xbe,0xf1,0x16,0xa0,0xc1,0xb6,0x92,0x90,0x09,0x93,0x3f,0x6e,0xb6,0x2c,0x23,0x05,0x07,0x45,0xfe,0x7e,0x8d,0x3c,0x63,0x16,0x23,0x77,0x81,0x11,},{0xb3,0x85,0x7e,0xa6,0x1b,0xaa,0x9e,0x62,0x83,0x8c,0x4e,0x3a,0x99,0x65,0x02,0xd3,0x36,0x4f,0xe1,0xec,0x59,0x42,0x58,0x35,0x50,0x73,0xdd,0x10,0xe4,0x97,0xc6,0x00,0xbe,0xfb,0x1f,0x8f,0x23,0x3f,0xd6,0xe3,0xb2,0xc8,0x7f,0x10,0xdc,0xb7,0x26,0x1a,0xaf,0x34,0x81,0xbf,0xd0,0x90,0x26,0x05,0xac,0xcc,0x90,0x0f,0xef,0x84,0xd4,0x07,},"\xdd\x99\xba\xf2\x95\xe0\x13\xee\xd1\x07\xba\x8a\xf8\x11\x21\xaa\xf1\x83\x5a\x3c\xca\x24\xf8\xe4\x64\xb4\xcf\xca\xa3\xc7\xbf\xfe\x6f\x95\x36\x01\x6d\x1c\x8c\xf3\x75\x03\x8c\x93\x27\xe8\xe2\x1b\x00\x40\x66\xf5\xea\xc0\xf7\x6a\x3e\x8e\xdf\xb0\x7b\xe8\xbd\x2f\x6b\xc7\x9c\x3b\x45\x6d\xe8\x25\x95\xe2\xc2\x10\x5b\xb1\xb0\xaa\xba\x5e\xee\xe1\xad\xef\x75\x21\x67\xd6\x33\xb3\x22\xeb\xf8\xf7\xcd\x5f\xbf\x59\x50\x8f\xdb\xdb\xec\xf2\x5e\x65\x7a\x9c\x70\x50\xaf\x26\xa8\x0a\x08\x5b\x08\x17\xc6\x21\x7e\x39\xac\xd5\x4c\xb9\xfa\x09\x54\x0f\xc7\xbd\xc5\x22\x6d\x6a\x27\x6d\x49\x2c\xc8\xa3\xdf\xfc\x2a\xbc\x6d\x0b\x9f\xb0\x8c\xbc\xcd\xd9\x43\x2e\x44\x98\x21\xa5\xdc\x98\xcf\xb3\xa4\x18\xe5\x39\xc8\x90\xfe\x5a\x04\x46\xb9\xf8\x1d\x30\x67\x00\x92\x7a\xde\x61\xcf\xdc\xc0\x62\x4f\x13\xb5\x84\x07\x48\x77\x46\x04\x80\x57\x31\xd9\x2e\x77\xd5\xde\xf6\x6b\xe4\x4c\xc8\x17\x94\x6f\x1c\xd7\x58\x19\x6c\xf4\x80\xf9\x9e\x71\x17\x83\x5c\x4c\x87\xcb\xd6\x40\x77\xa5\x62\xa8\x0c\xf1\x1d\x8c\xa6\x5b\xe7\xa9\x4d\x92\xb9\xdd\xae\xa9\x97\xe9\x3f\x14\x48\x57\x7e\xd6\xd8\x43\x6b\x2f\x31\x44\x69\x2c\x1f\xd7\xd2\x8a\x03\xe9\x27\x4b\xc9\xe8\x66\x9d\x85\x75\xf5\xde\x20\xcf\xbd\xbc\xb0\x4e\x9f\x39\xf3\x45\x1d\x70\x48\x37\x5e\x26\x98\xe7\x22\x84\x6c\xb4\xf2\xd1\x9a\x81\x0c\x53\xd4\xc1\xa6\xc3\xb7\x70\xfb\x40\x2d\xf0\x53\x0e\x7b\x29\x07\x22\x3f\xd0\x89\x9e\x00\xcb\x18\x8c\xa8\x0c\x15\x31\xb4\xe3\x7f\xba\x17\x6c\x17\xa2\xb8\xf5\xa3\xdd\xc7\xa9\x18\x8d\x48\xff\xc2\xb2\x72\xc3\xda\x9c\x9b\x89\xdf\xe5\x3f\x2f\xe7\xe3\x67\x2f\x91\xd1\x18\x18\x49\x1a\xce\x14\x0a\xdc\xae\x98\x50\x2e\x11\x4f\x4b\x35\x2b\x90\xe2\xe7\xfb\xd3\x33\xb2\x45\x9e\x7f\x15\xdd\x07\x64\xc9\xc3\x4e\x4c\xb7\xcc\x09\x55\x00\xcd\xa0\x35\xe8\xe2\xe4\xe3\xc8\xfd\x5d\xf5\xf3\xaa\x57\x9a\x73\x5d\xd8\xa9\xf1\x9e\xf3\x36\xfa\x97\x11\x14\xe4\x66\x18\x73\x4a\x4c\x13\xd3\x0c\x81\x12\x8c\xa2\x1d\xef\x47\x33\x01\x03\xd2\x3d\x80\xff\xe6\x74\x21\xa6\xcc\xf9\xf3\x6a\x93\xf0\x56\x03\xc5\x99\xee\x10\xb0\x34\x51\xf3\x6b\x21\x33\xc1\x87\xa7\x9a\xd9\xe6\xfd\xfb\xb1\x25\x95\xab\x73\xbb\x3e\x2e\x2e\x43\x03\x0f\xd3\x7e\x59\x1c\xf5\x5d"}, +{{0x29,0xa6,0x3d,0xcd,0x48,0xa3,0x51,0x77,0x14,0x11,0xfd,0xdc,0xab,0x46,0xbb,0x07,0x1e,0x91,0x49,0x85,0x76,0xe8,0xd0,0x2f,0x8b,0x60,0x44,0xf5,0xbd,0xd3,0xed,0x90,},{0x39,0x23,0xfd,0xcc,0x2a,0x9f,0xe5,0xca,0xbf,0x6e,0x99,0x32,0xe4,0x6d,0xbd,0x2b,0x7f,0x36,0x32,0x50,0x0f,0x9d,0x95,0x55,0x2d,0xb2,0xb0,0x45,0xbc,0x41,0x16,0x6f,},{0x12,0xbf,0x62,0x95,0x93,0xe2,0xca,0xad,0xc9,0x10,0xec,0x40,0xbf,0xe2,0xb7,0xa6,0x25,0x14,0x12,0x6b,0x16,0xba,0x3a,0x43,0x8d,0x88,0xe2,0xd2,0x1f,0x59,0x5a,0xae,0xe8,0xab,0xfa,0x4a,0xf2,0xec,0x87,0x03,0x61,0xd0,0xea,0x04,0xdf,0xc8,0xc6,0xa3,0x30,0xfb,0x28,0x41,0xc2,0xd8,0x21,0x1a,0x64,0xfa,0x1e,0x7e,0x7d,0x27,0x38,0x00,},"\xff\x18\xca\x0c\x20\x4c\x83\x86\xa4\xaa\x74\xec\x45\x73\xc7\xb6\x92\x16\xb3\x14\x70\xda\xed\xd9\x6a\x4f\x23\x02\x11\x6c\x79\x55\xd7\x2d\xac\xc8\x8e\x37\x14\x55\x0c\x09\xe6\xf7\xb9\xa8\x58\x62\x60\xdc\x7e\x63\xda\x4c\x63\x3b\xae\x01\x62\xe1\x16\xe5\xc1\x79\x7b\x78\xd8\x7d\x47\xff\xee\xa3\xd7\x81\x9d\xf9\xc8\x52\xf0\xff\x30\x93\x6a\x10\x5d\x3a\xf5\x53\x1a\x8f\x89\x54\x97\x11\xc1\x4c\x2d\x3e\xe1\x15\x64\xe7\xc8\x52\x5b\xd5\x88\x64\x00\x97\x62\xa0\x55\x41\xd8\xe0\x7a\xd8\x41\xa5\x5a\x6a\x9a\x00\x7e\xf2\x09\xcc\xec\x4b\x56\x40\xba\xbe\x35\x65\x1b\x61\xdf\x42\xde\x4d\x91\x0e\xe7\x3a\x93\x3c\x0b\x74\xe9\x95\x75\x7e\x84\xa9\x9e\xb0\x34\xf4\x18\x07\x18\x3c\x90\xca\x4e\xa8\xd8\x4c\xdb\xa4\x78\x61\x3c\x8e\x58\x7c\xb5\xf8\xfb\x6a\x05\x50\x81\xda\x6e\x90\x22\x0d\x5d\x86\xe3\x4e\x5f\x91\xe4\x88\xbd\x12\xc7\xa1\xa6\xb3\xc9\xfc\xe5\x30\x5e\x85\x34\x66\x58\xef\xfa\x81\x0d\x0e\x8a\x2a\x03\x9d\xb4\xa4\xc9\x49\x65\xbe\x40\x11\xf9\xd5\xe5\xda\x26\x62\x33\xe6\xc4\xe1\x8e\xd4\xf8\xa2\x5a\x57\xe4\x0a\x59\x1c\x7e\xd5\x90\xc0\xf8\xb1\xa1\x19\xc7\xc9\x74\x7f\x69\x1b\x02\x19\x6c\xd1\x8e\x69\x45\x21\x3f\x1d\x4c\x8c\x95\x79\xc6\xe0\xa2\xac\x45\x92\x41\x28\xd6\xd9\x2c\x8e\x4c\x66\x06\x53\x20\x35\x3d\x48\xd1\xd5\xe1\x31\x94\xd9\x05\xf8\x37\x07\x8f\x8d\xac\x0b\x68\xcf\x96\xae\x9e\x70\x55\x4c\x14\xb2\xfa\x29\xb1\x96\x30\xe4\xb0\xf5\xd2\xa7\x67\xe1\x90\xef\xbc\x59\x92\xc7\x09\xdc\xc9\x9a\xa0\xb5\xaa\xf4\xc4\x9d\x55\x13\xe1\x74\xfd\x60\x42\x36\xb0\x5b\x48\xfc\xfb\x55\xc9\xaf\x10\x59\x69\x27\xbc\xfa\xd3\x0b\xac\xc9\x9b\x2e\x02\x61\xf9\x7c\xf2\x97\xc1\x77\xf1\x92\x9d\xa1\xf6\x8d\xb9\xf9\x9a\xc6\x2f\xf2\xde\x3b\xb4\x0b\x18\x6a\xa7\xe8\xc5\xd6\x12\x39\x80\xd7\x59\x92\x7a\x3a\x07\xaa\x20\x8b\xee\xb7\x36\x79\x5a\xe5\xb8\x49\xd5\xda\xe5\xe3\x57\x37\x10\xaa\xa2\x4e\x96\xd5\x79\x1e\x27\x30\xd0\x27\x0f\x5b\x0a\x27\x05\xba\x51\x5d\x14\xaa\x7e\x6f\xa6\x62\x23\x75\x37\x7f\x9a\xba\x64\xd0\x25\x69\xa2\x09\xd3\x3d\xe6\x86\xe0\x89\xec\x60\x11\x8e\x48\x14\xff\xc6\xc0\x77\x8c\x64\x27\xbc\xe2\xb6\xb8\x44\xcf\xcd\x5a\x7c\xed\x0e\x35\x30\x3f\x50\xa0\xdf\xe5\xdf\x5d\xde\x1a\x2f\x23"}, +{{0xc7,0x18,0x8f,0xdd,0x80,0xf4,0xcd,0x31,0x83,0x9e,0xc9,0x58,0x67,0x1e,0x6d,0xd0,0x8b,0x21,0xf9,0xd7,0x52,0x8c,0x91,0x59,0x14,0x37,0x34,0xf9,0x4b,0x16,0x98,0x83,},{0x01,0x97,0x52,0xff,0x82,0x9b,0x68,0x59,0xb9,0x05,0x8d,0x00,0xc2,0x79,0x5e,0x83,0x56,0x55,0x44,0x06,0x75,0x75,0x3f,0x37,0xe8,0x5e,0xb7,0xbc,0x58,0x39,0xc4,0xca,},{0x35,0xc1,0x70,0xdd,0x0c,0x6d,0xc2,0x92,0x0a,0x59,0x57,0x75,0xd8,0xe2,0xdd,0x65,0x24,0x3e,0x9c,0x1b,0xf9,0x6e,0xf4,0x27,0x79,0x00,0x1e,0xd4,0x5f,0x01,0xb7,0xdf,0xeb,0xd6,0xf6,0xa7,0xdc,0x2d,0x38,0x6e,0xf4,0xd2,0xa5,0x67,0x79,0xeb,0xe7,0x7f,0x54,0xe5,0xae,0xcf,0xda,0x2d,0x54,0xa0,0x68,0x47,0x6b,0x24,0xdb,0xd7,0x8b,0x0c,},"\x4a\xf5\xdf\xe3\xfe\xaa\xbe\x7f\x8f\xcd\x38\x30\x8e\x0b\xd3\x85\xca\xd3\x81\x1c\xbd\xc7\x9c\x94\x4e\xbf\xe3\xcd\x67\x5c\xf3\xaf\xbe\xf4\x54\x2f\x54\x29\x75\xc2\xe2\xa6\xe6\x6e\x26\xb3\x2a\xc3\xd7\xe1\x9e\xf7\x4c\x39\xfa\x2a\x61\xc5\x68\x41\xc2\xd8\x21\x2e\x2b\xd7\xfb\x49\xcf\xb2\x5c\xc3\x60\x9a\x69\x3a\x6f\x2b\x9d\x4e\x22\xe2\x09\x9f\x80\xb7\x77\xd3\xd0\x5f\x33\xba\x7d\xb3\xc5\xab\x55\x76\x6c\xeb\x1a\x13\x22\xaf\x72\x6c\x56\x55\x16\xce\x56\x63\x29\xb9\x8f\xc5\xdc\x4c\xbd\x93\xce\xfb\x62\x76\x88\xc9\x77\xaf\x93\x67\xb5\xc6\x96\x59\xe4\x3c\xb7\xee\x75\x47\x11\xd6\x65\xc0\x03\x2a\xe2\x29\x34\xf4\x4c\x71\xd3\x11\x78\xef\x3d\x98\x10\x91\x28\x74\xb6\x2f\xa5\xe4\x02\x0e\x6d\x5d\x64\x58\x18\x37\x32\xc1\x9e\x2e\x89\x68\x5e\x04\x64\xe9\x1a\x9b\x1c\x8d\x52\x51\xe2\x4e\x5f\x91\x81\x3f\x50\x19\xa7\x40\xa0\x4b\x5d\x91\xcb\xb8\x30\x9e\x51\x61\xbb\xa7\x9d\xca\xb3\x82\x39\xa0\x91\xf5\x0e\x09\x9f\xf8\x19\xe3\xa7\xb5\x20\x5f\xe9\x07\xcd\xfe\x9c\x0d\xc3\xee\x85\xe3\x2d\x7b\xcd\x3c\xe0\x26\x35\xe2\x05\x83\x88\x03\x1e\x31\x7f\xbf\x22\xab\x9f\x39\xf7\xf7\xe3\xcd\x1a\x11\xa9\xc1\xf4\x5f\x4e\x1e\x42\xd2\x53\x6c\x12\x2c\x59\x18\x37\x91\x18\x47\x10\x8c\xea\xfd\x99\x08\x13\xc2\xb6\x34\x4c\xff\xc3\x4b\xe3\x71\x61\xdd\x81\x56\x26\x90\x0e\x8f\xcb\x85\xc2\x1a\xfb\x4f\x6b\xe8\xad\x01\x51\x6a\x31\xc2\xa6\x58\x03\x15\x85\x7c\x6a\x21\x67\x35\xca\x99\x10\x09\xdb\xc2\xea\x50\x34\x16\x07\x47\xa8\x69\xd5\xca\xdb\x0b\x47\xff\xbd\x5d\x3a\xc9\x7f\xdd\x05\x26\xca\xe6\xea\xa3\x5c\xff\x7a\x16\xea\xf4\xfb\x95\x0c\xa3\x15\x11\x34\x6f\xea\x61\x41\x99\x9a\x3f\x75\x4e\x62\x81\xcf\xba\x15\xe8\xa8\x26\x93\x2c\x58\x9c\x5d\x24\x7c\x90\x9d\x94\xb4\xea\xb7\xeb\xcb\x09\x07\x76\x48\xaf\x06\x5c\x2d\x86\x61\x1e\xb5\x88\x45\x3e\xd7\xc2\x47\x80\xd7\x3c\x68\x9c\x87\x44\xaf\xd5\x33\xa8\x6d\x9e\xe9\xe3\x36\x57\x32\xcb\xd0\xc3\x51\xe4\x36\xf8\x98\xb7\x04\x32\x92\x09\x7e\x03\xe6\x08\x1a\x23\xac\x86\x5e\x19\xdc\x88\x58\x96\x9b\x99\x9d\x01\xfa\x65\xef\x20\x0c\x3f\x26\x9c\x81\x8e\x30\xb9\x36\x5e\xcc\x68\x3b\xcf\xe6\x9c\x20\x3b\x4e\x0a\xb6\xfe\x0b\xb8\x71\xe8\xec\xaa\xae\x82\xd3\xac\xd3\x5d\x5b\x50"}, +{{0x38,0xba,0x06,0x21,0x70,0x4d,0x21,0x55,0xfc,0x2f,0x78,0x55,0x51,0x96,0x57,0x5d,0xe0,0x6d,0x80,0x25,0x5c,0x35,0xe9,0xdc,0x96,0x5b,0x6f,0xe9,0x6a,0x4d,0x53,0x89,},{0x43,0x88,0xf7,0xf6,0x8a,0x9e,0xff,0xbc,0x36,0x6e,0x42,0xd9,0x07,0x01,0x56,0x04,0xda,0xce,0xd1,0x72,0x7c,0xd1,0xd8,0x9d,0x74,0xad,0xcc,0x78,0x9f,0xd7,0xe6,0xe1,},{0x42,0xbe,0xd6,0xa9,0x87,0x86,0xf6,0x64,0x71,0x5f,0x39,0xbb,0x64,0x3c,0x40,0x5a,0xe1,0x75,0x00,0x56,0x46,0x0e,0x70,0x04,0x69,0xc8,0x10,0x38,0x95,0x04,0xc5,0x1c,0xff,0xd9,0xe1,0xa9,0x4c,0x38,0xf6,0x92,0xfb,0x31,0x62,0x65,0x31,0x6d,0x8f,0x4d,0xc3,0xad,0x1c,0xdd,0x8a,0x6d,0x59,0x91,0xef,0x01,0x0c,0xd1,0x48,0x9d,0x7c,0x09,},"\xed\x4c\x26\x83\xd6\x44\xb0\x5b\x39\xb0\x48\xef\x1f\x8b\x70\x25\xf2\x80\xca\x7e\x8f\xf7\x2c\xb7\xed\xa9\x93\x29\xfb\x79\x54\xb7\x00\x40\x07\x05\x27\x5f\x20\xb8\x58\xcf\x7e\x34\x9a\x35\x10\x66\x5b\x63\x06\x09\xc5\xe2\xe6\x20\x69\x26\x3a\xb9\xc5\x5e\x41\x23\xa5\x64\xdc\xa6\x34\x8c\x8a\x01\x33\x20\x75\xe7\xa5\xbe\xc9\xc2\x0a\x03\x80\x79\x57\xfe\xfa\x91\x0e\x60\xc3\x5a\xe5\x79\x77\x8c\xe2\xce\x42\xe6\xa6\x9a\x1b\x64\x76\x81\xe4\x3e\xc4\xb6\x3b\xd5\xfb\xef\xab\xb3\x17\x12\xcb\x3d\x64\x19\xea\xd7\x8d\xd4\x1c\x8a\x92\xaa\xce\xb6\x3c\xbf\xa8\x9d\x2a\xf3\x96\x06\xde\x01\x0a\x39\x7e\x30\x20\x53\xa6\x15\xc1\x6e\x5e\x95\xad\x99\x35\xc0\x79\xa0\xb8\x10\x31\x25\x78\x94\x71\xa1\xe3\x57\x4f\x42\x9b\x29\xe4\xd2\x25\xc7\x72\x3f\xbb\x3c\xf8\x8c\xbd\x73\x82\x3d\x9f\x0b\x6c\x7d\x05\xd0\x0b\xde\xb0\xfb\x0a\xd3\xd7\x13\x20\x33\x18\x3e\x21\xf6\xc1\xe8\xd8\xe4\xc0\xa3\xe4\xf5\x2f\x50\x01\xda\x68\x71\x71\x34\x5c\x6d\xc8\xb4\x2c\x42\xa6\x0d\x1f\x1f\xfa\x8f\xe3\xe7\xbc\xec\xe5\x9a\x03\x58\x78\xf9\xd4\xd8\x11\x27\xe2\x24\x96\xa4\x9b\xfc\xf6\xbf\x8b\x46\xa8\x0b\xd5\x62\xe6\x52\x55\x07\x1f\x9d\x11\xa9\xeb\x04\x81\xf4\x62\x6d\x4d\x71\xff\xc3\x8a\xfe\x6e\x35\x8a\x4b\x28\x91\x79\xcb\xce\x97\x64\xd8\x6b\x57\xac\x0a\x0c\x82\x7e\x8f\xf0\x78\x81\x33\x06\xa1\xd5\xfa\xdd\x32\xb4\x6a\x1f\xbc\xd7\x89\xff\x87\x54\x06\x3e\xec\xfe\x45\x31\x3b\xeb\x66\x01\xc3\xa3\x01\x0e\x8e\xb9\x7c\x8e\xff\xbd\x14\x0f\x1e\x68\x83\x11\x09\x2d\x27\x3c\x4d\xef\xca\x47\xda\x6f\x1f\x08\x25\x74\x46\x76\xf9\xa2\x80\xb6\xc2\xa8\x14\xfa\x47\xfa\xbc\x19\x80\xd0\xb3\x7f\x08\x7a\x53\xca\x87\x78\xf3\x9f\xfb\x47\x4f\xf5\xf1\x17\x1b\x44\x2c\x76\xdd\x00\x8d\x92\x18\x2f\x64\x4a\x71\x4a\x0f\x01\x1e\x21\x5a\x78\xb9\x7a\xf3\x7b\x33\x52\x0e\xbf\x43\x37\x2a\x5a\xb0\xcf\x70\xdc\xc1\xdc\x2f\x99\xd9\xe4\x43\x66\x58\xf8\xe0\x7c\xdf\x0b\x9e\xa4\xdd\x62\x24\xc2\x09\xe7\x52\x1b\x98\x1e\xe3\x51\xc3\xc2\xdf\x3a\x50\x04\x05\x27\xfc\xd7\x28\x04\x17\x60\x46\x40\x5d\xb7\xf6\x73\x4e\x85\xc5\xd3\x90\xf5\x20\xb0\xc0\x8d\xcb\xfa\x98\xb8\x74\x24\x80\xd5\xe4\x6f\x9b\xe8\x93\xf6\xd6\x61\x43\x40\xf8\x16\x16\x11\xd5\x05\x3d\xf4\x1c\xe4"}, +{{0xae,0x33,0x1f,0xc2,0xa1,0x47,0x59,0xb7,0x3f,0x1c,0xd9,0x65,0xe4,0x85,0x14,0xe1,0x2b,0x29,0xf6,0x3b,0x06,0xcc,0xfc,0x0a,0xd4,0x9f,0x36,0x82,0x0e,0x57,0xec,0x72,},{0x08,0x80,0x3d,0x48,0x23,0x8e,0xda,0x3f,0x9c,0xeb,0xb6,0x28,0x53,0x01,0x21,0xde,0x00,0xf0,0xf0,0x46,0x8c,0x20,0x2d,0x88,0x52,0x8b,0x8b,0xce,0xc6,0x87,0xa9,0x03,},{0x75,0xf7,0x39,0x08,0x88,0x77,0xe0,0x6d,0xc5,0x6d,0xae,0xc8,0xf1,0xe4,0xd2,0x11,0xb7,0x54,0xe3,0xc3,0xed,0xbf,0xa7,0xed,0xa4,0x44,0xf1,0x8c,0x49,0xb6,0x9c,0x5a,0x14,0x2d,0xb4,0x5a,0x0a,0x76,0x50,0xe4,0x7d,0x10,0x55,0x0b,0xa6,0x81,0xff,0x45,0xdd,0x44,0x63,0xc4,0xac,0x48,0xbf,0x44,0xb7,0x30,0x34,0xbd,0x56,0x59,0x22,0x0e,},"\x57\x16\x00\x33\x90\xe4\xf5\x21\x65\x98\xa0\x3d\x7c\x43\x0d\xbf\x49\x5e\xe3\xa7\x55\x7b\x58\x06\x32\xba\x59\xf1\x51\x98\xb6\x18\x0a\x42\x46\x9c\x23\x7d\xb5\xbc\x81\xf2\x9c\xfa\xab\x0a\xff\x3c\x99\x66\x30\x9a\xb0\x69\x58\xc9\xd7\x12\x6a\xdd\x78\xe3\xb3\x24\x59\xff\x8a\x0e\x0b\xde\xf8\x74\xb5\x8e\x60\x83\x66\x8f\x38\xad\x7d\x63\xaa\xe1\xf1\x2e\x26\xa6\x13\x34\x8f\x9f\x03\xea\x5d\x20\x5f\x04\x5d\x78\xcc\x89\x02\xd4\x7f\x81\xe8\xb5\x22\x93\xe7\x0e\x86\xc9\x80\x3d\x4d\xac\xea\x86\xc3\xb6\x74\x58\xae\x35\x79\xbc\x11\x11\x3b\x54\x90\xbc\xf3\xe1\xcd\x4e\x79\x79\xc2\x64\xd8\x35\x16\x1f\xd5\x5e\xfe\x95\x3b\x4c\x26\x39\x5d\xd9\x2c\xa4\x93\x09\x20\xe9\x04\xfa\xdc\x08\x89\xbb\x78\x22\xb1\xdf\xc4\x45\x26\x04\x84\x0d\xf0\x24\xdb\x08\x21\xd2\xd5\xe9\x67\x85\xa5\xc3\x7d\xbf\xd2\xc3\x75\x98\x32\x83\xe9\xb5\xb4\x3a\x32\x07\xa6\xa9\xb8\x33\x94\x83\x29\xd5\xde\x41\xe4\x50\x08\xbc\xba\xd4\x93\xde\x57\x54\xdd\x83\xde\xcc\x44\x0e\x51\x66\xed\xaa\xe0\x20\x8f\x00\x0c\x5f\x6d\x9c\x37\x21\x53\x20\x9e\x5b\x75\x78\x11\x6f\x89\xcf\x2f\x8b\x10\x04\xd1\x30\x7e\xa7\x9e\xd3\x74\x80\xf3\x19\x4a\x7e\x17\x98\x3a\x23\x04\x65\xcc\xc3\x0f\xcc\x1a\x62\xd2\x80\xfb\xba\xcc\xf0\x06\xdc\x4d\xee\x0e\xa7\x96\xb8\x1a\xcc\xc6\x1a\x06\x3e\x2c\x08\x3d\xae\xc0\x39\xbd\x9a\x64\xa7\x70\x24\xaf\x82\xec\x1b\x08\x98\xa3\x15\x43\x29\xfd\xf6\x16\x73\xc3\x6e\x4c\xc8\x1f\x7a\x41\x26\xe5\x62\x90\xe4\xb4\x56\x81\x9b\xde\xbf\x48\xcb\x5a\x40\x95\x5b\xab\x29\x7c\x2b\xbc\xb0\x18\xad\xbf\x24\x82\x86\x60\xa5\xd1\x2a\x06\x13\xbf\x3c\xcb\x5e\xeb\x9a\x17\xfb\x0a\x05\x47\xdb\x8d\xa2\x4d\x2e\xfb\x87\xba\x1b\x84\x31\x42\xa7\x5e\x4c\xa0\xb0\xa3\x33\xe4\xa1\x4f\xab\x35\xa6\x26\x69\x32\x9c\xa8\x75\x3f\x01\x6a\xc7\x0c\xd9\x97\xe8\xbc\x19\xee\x44\x8a\xea\xf0\xf4\xbf\x3c\xe5\x23\x05\x50\x57\x8a\xb6\x4c\x19\x01\x94\x46\xce\x2d\x9c\x01\xa0\x3d\x88\x9a\x99\x09\x86\x0a\xef\x76\xf0\x67\xc5\x0b\x61\xc3\xd0\xf1\x2c\xc8\x68\x6f\x5c\x31\xbf\x03\x2a\x84\x10\x15\xcf\xef\xf1\xcf\xda\xe9\x4f\x6b\x21\xda\xe9\x41\xb3\x35\xdc\x82\x1f\x32\x84\xce\x31\x50\x8f\x5d\xb5\xc4\x48\xff\xaa\x37\x73\xe9\xbe\x1a\x4c\x85\xa1\xc5\x8b\x00\x9f\xa3"}, +{{0x82,0x43,0x5f,0x39,0x79,0x01,0x06,0xb3,0xaf,0x72,0xf9,0x1f,0x14,0xc9,0x28,0xd2,0x46,0x5f,0x98,0xcd,0xd1,0x00,0x84,0xc4,0xa4,0x4d,0x19,0xaf,0x71,0xa1,0x92,0x7c,},{0xc5,0x2a,0x92,0x64,0x6f,0x5a,0xdb,0x21,0xc6,0xdd,0xe0,0xde,0x58,0x78,0x68,0x37,0xf8,0xa3,0x41,0x4c,0x09,0xae,0xdf,0xc2,0x7c,0x81,0x22,0x18,0xa7,0xe7,0x23,0x9e,},{0x1d,0xaa,0x44,0xef,0x06,0xd4,0xc1,0x0d,0xdb,0x48,0x67,0x84,0x23,0xc5,0xf1,0x03,0xa1,0xb5,0x68,0xd4,0x2b,0x20,0xcc,0x64,0xaf,0x11,0x0f,0xce,0x9d,0x76,0x79,0xa2,0xde,0xe4,0x12,0xb4,0x98,0x05,0x85,0xc2,0x6c,0x32,0x0d,0xba,0xa6,0x01,0xc4,0x72,0xde,0xfc,0x3c,0x85,0x41,0x5d,0xae,0xcd,0xd6,0xd2,0xd9,0xea,0xca,0xc8,0x5e,0x07,},"\xf3\xd6\xc4\x6a\xc5\x24\x8d\x53\x86\xb6\xb6\x84\x62\x59\x7d\x64\x70\x39\xf5\x44\xbb\x01\xac\x2d\x10\x67\xda\xaa\xa3\x97\xd2\xdb\xaf\x12\x5a\x1c\xf8\xfd\xf2\x80\xa6\xaf\xec\x32\x4d\x53\x11\xf5\x43\x68\x8a\x15\x6c\x84\x98\x19\xbb\x04\x6b\x91\x1c\x42\xea\x3c\xa0\x1b\x99\x80\x8c\x4d\x1f\x3b\x8b\x15\xda\x3e\xfe\x2f\x32\x52\x3e\xc3\xb0\x9c\x84\xb4\x8c\xff\xd1\x3c\x17\xc9\xe2\x6c\x91\x2d\x9c\x3e\x93\x46\xdf\xae\x3f\xd0\xc5\x6c\x88\x58\x78\x07\x82\xf6\x1a\x4c\x4d\xbf\xff\x1e\x9c\xb4\xb3\x62\xcd\x80\x01\xf9\xcd\xfe\xb1\xa7\x20\x82\xdc\xe9\xc9\xad\xe5\x2e\xff\xc9\x74\x46\x88\xac\x0b\x86\xc8\x82\x66\xb5\x3d\x89\x5c\x17\xea\xd9\xe8\x9e\xd8\xd2\x4d\x40\x64\x2f\x3a\xd3\xb9\xbf\x9b\xbc\x4d\xda\x79\x66\xef\x83\x28\x28\x9f\xb3\x1e\x17\xc8\x1f\xd0\x28\xef\x1b\xd9\xa1\xd4\xc7\x92\xe8\x6e\xc2\xdb\xdc\xe3\xf9\x37\xee\xcc\x3e\xeb\x51\x88\xd3\x25\x94\x19\x19\xbb\xf7\x5b\x43\x88\xe2\x39\x95\x07\xa3\xd7\xfb\x38\x75\x02\xa9\x5f\x42\x1c\x85\x82\x6c\x1c\x91\x76\xc9\x23\xe3\x16\x31\x0a\x4b\xa4\x5c\x8a\x5e\xf7\x55\x7c\xf8\x7b\x77\x02\x0b\x24\xf5\xba\x2b\xfd\x12\x28\x10\x95\x66\x30\x7f\xea\x65\xec\x01\x50\x19\x69\x12\x17\xbc\xe6\x9a\xee\x16\xf7\x62\x49\xc5\x8b\xb3\xe5\x21\x71\xcf\xef\xd5\x25\x4e\x5e\x0f\x39\x71\x69\x18\x6d\xc7\xcd\x9c\x1a\x85\xc8\x10\x34\xe0\x37\x18\x3d\x6e\xa2\x2a\xee\x8b\xb7\x47\x20\xd3\x4a\xc7\xa5\xaf\x1e\x92\xfb\x81\x85\xac\xe0\x1d\x9b\xf0\xf0\xf9\x00\x61\x01\xfc\xfa\xc8\xbb\xad\x17\x1b\x43\x70\x36\xef\x16\xcd\xae\x18\x81\xfc\x32\x55\xca\x35\x9b\xba\x1e\x94\xf7\x9f\x64\x55\x55\x95\x0c\x47\x83\xba\xb0\xa9\x44\xf7\xde\x8d\xf6\x92\x58\xb6\xaf\xe2\xb5\x93\x22\x17\x19\x5d\xa2\x45\xfe\xe1\x2a\xc3\x43\x82\x4a\x0b\x64\x03\xdf\xe4\x62\xd4\x3d\x28\x8d\xb3\x1f\x99\x09\x7e\xc3\xed\xc6\xe7\x65\x47\xa3\x74\x2f\x03\xc7\x77\xef\xb1\x58\xf5\x8d\x40\x53\xfa\x6c\xc8\xd6\x8b\x19\x6a\xf4\xf9\xde\x51\x6f\xd9\xfb\x7a\x6d\x5d\x9e\xe4\xa8\x9f\x9b\x9b\xce\x1e\x4d\xee\x35\x7a\x1e\x52\xc0\x54\x4c\xfb\x35\xb7\x09\x2d\x1a\xa5\xa6\xf7\xf4\xc7\x60\x26\x10\xe9\xc0\x0e\xf5\xb8\x76\x1b\xc7\x22\x79\xba\x22\x8a\x18\xb8\x40\x0b\xd7\x6d\x5b\x2b\xfd\x7c\x3c\x04\xaa\xc4\x43\x6d\xae\x2e\x98"}, +{{0x1b,0xea,0x77,0x26,0xd9,0x12,0xc5,0x5e,0xc7,0x8b,0x0c,0x16,0x1a,0x1a,0xd3,0xc9,0xdd,0x7b,0xc3,0x29,0xf8,0x5d,0x26,0xf6,0x2b,0x92,0xe3,0x1d,0x16,0xd8,0x3b,0x48,},{0xc9,0xdd,0xb4,0x21,0x06,0xcc,0xef,0x4e,0x0e,0xf4,0x79,0x45,0x51,0xd2,0x1d,0xf9,0x4a,0x63,0x06,0x87,0x2f,0x23,0x16,0x63,0xe4,0x7e,0x24,0x1f,0x77,0xcc,0x3e,0x82,},{0xf9,0xb0,0x45,0x17,0xbd,0x4f,0xd8,0xef,0x90,0xf2,0x14,0x0f,0xc9,0x5d,0xc1,0x66,0x20,0xd1,0x60,0x2a,0xb3,0x6c,0x9b,0x16,0x5f,0xff,0x3a,0xba,0x97,0x8d,0x59,0x76,0x71,0x10,0xbb,0x4e,0x07,0xa4,0x8f,0x45,0x12,0x14,0x47,0xac,0x0c,0x1a,0xba,0xc5,0x85,0xd3,0x91,0xd4,0x04,0x20,0x41,0x89,0x86,0x28,0xa2,0xd2,0xdc,0xc2,0x51,0x0d,},"\xb1\x12\x83\xb1\xf0\xce\x54\x9e\x58\x04\x73\x0a\xc3\x20\x7a\xc0\x03\x32\xd2\xaa\xcf\x9c\x31\x0d\x38\x32\xd8\x79\xf9\x63\x4b\xd8\xa5\x8a\xdf\x19\x9e\x4b\x86\x3b\xb1\x74\x81\xd2\x8a\xcb\x2d\xa0\xe1\x55\x7b\x83\x36\xa4\x00\xf6\x29\x56\x25\x03\x1d\x09\xe4\xdf\x4d\x31\x9b\xbc\x1e\x8f\x6e\x92\x32\xd2\x30\x53\xbb\x3f\xfa\xc4\xfe\x2c\x70\xce\x30\x77\xfc\x00\x60\xa5\xcb\x46\x92\xa1\xcf\x0b\x3e\x62\xfe\x45\x48\x02\xae\x10\xb8\x3d\xed\x61\xb6\xbf\x45\x4c\xa7\x5e\x4c\xda\xd5\x53\x2f\x20\xb7\x06\x54\xf1\x2b\xa9\x06\xf0\x03\xa8\xb9\xe9\x86\xf1\x5a\x39\x41\x9d\xeb\x2e\xa1\xea\xd7\x59\x82\x90\xee\xeb\xf9\x25\x2b\x0c\x27\x60\x5a\x7a\x73\xa6\xab\xeb\xb4\x22\x71\xd7\x1a\x3c\x19\x7a\x46\xbc\xc8\xdb\x11\xd9\x24\x28\x42\xf3\x78\x36\x4a\x37\xee\xca\xa3\x4e\x98\x21\x35\xbe\x34\x18\x2c\x69\xca\x8e\x6e\x3c\x8c\x90\xe1\xb4\xb2\xb4\x75\x81\x5a\x17\x83\x77\xae\x01\x65\xa7\x64\xc8\xba\x28\x89\xb5\xab\x29\x09\x49\xd8\x48\x7a\x88\xe0\xd3\xd2\xbc\x7e\x25\x20\x17\x6a\xa6\xff\x9f\xf0\xc4\x09\xff\x80\x51\x5f\x4f\x0b\x83\xc5\xe8\x2c\x23\xfd\x33\x26\xcd\xd6\xb7\x62\x52\xe7\xfd\xdc\xd6\xe4\x77\x09\x78\xcd\x50\x3e\xd2\xd6\xb4\x80\x10\x11\x67\xd3\xf1\x91\xfe\xd8\xd6\xd7\x4d\x74\xa2\x00\x7d\xb1\x09\x2e\x46\xa2\x3d\xde\xcd\xdc\xdb\x98\x46\x64\x04\x7b\x8d\xd7\xcc\x8a\x57\x6e\x1a\x80\x6f\x52\xcb\x02\x7a\x94\x80\xa9\x5c\xc4\x4b\x1e\x6f\x2e\x28\x6e\x9b\x7a\x6b\xf7\xb3\x96\xfa\x54\x96\xb7\xa5\xb1\xc0\x3d\x9c\x5c\x27\xda\x1a\x42\x99\x0d\x10\xb1\x2f\xb8\x64\x0e\x15\x96\xf2\x6b\x36\x6d\x27\x0b\xa6\x4f\x99\xaf\xff\xe3\xfe\xce\x05\xa9\xb0\x25\x4b\x20\x8c\x79\x97\xcd\xb5\x12\xfc\x77\x52\x79\x54\xa1\xcb\x50\xfd\xab\x1c\xc9\xa4\x51\x62\x74\x1f\xd6\xf9\xd3\xfd\x5f\x2e\x38\x28\x53\xd7\x33\x5d\xba\x1e\x6b\x29\x59\xdd\x86\xe1\x25\xe6\x7b\x53\xdc\x8e\x45\x3c\x81\x0b\xc0\x1b\xf2\x0b\xce\x7b\x61\x8d\xd5\xd1\xed\x78\x41\x06\xee\x06\xa3\xec\xaf\x6b\x3b\xee\x0b\x56\x83\x3b\x0b\x81\x31\x39\xc5\xa6\x96\x00\x0a\x44\x9c\x97\x90\x6a\x2f\xbd\xdc\x2d\x9d\xe9\x40\x6e\xa2\x82\xac\x4e\xe5\xef\x8b\xf3\x85\x4c\x74\xa6\xb7\x17\x3d\xd2\xf7\x9c\x7a\x12\x6f\x3c\x7b\x04\x33\xfd\x4e\xa2\x6e\x87\x7a\x14\x83\x1d\xd4\x15\xa1\x9d"}, +{{0xd0,0x1a,0x0e,0xad,0x9d,0x69,0x48,0x33,0x28,0x3b,0x9c,0xd7,0x29,0x9a,0x7b,0xd7,0x5f,0xa9,0x0b,0x1d,0x2d,0x78,0x84,0xe4,0x55,0x7b,0x33,0xc9,0x98,0x77,0x2a,0x68,},{0xa0,0xf7,0x57,0x47,0x9b,0xa6,0x27,0xef,0xef,0x95,0xd6,0xec,0x7a,0x93,0x1d,0xfa,0xc4,0x37,0x3d,0xf3,0x3d,0xaa,0xf4,0xdd,0xc4,0xec,0x68,0x94,0xc8,0x26,0x1e,0xd7,},{0x9a,0x0f,0xf7,0xf3,0x51,0x74,0xec,0x3f,0x66,0xd2,0x2a,0x6f,0x06,0xdf,0x60,0xe0,0x9c,0x8f,0x62,0x3a,0x5a,0xca,0x81,0x0e,0x23,0xa8,0x8d,0x0e,0x6a,0x31,0xcb,0x6f,0x1c,0xe1,0xc1,0xf9,0xdc,0xcc,0x9e,0x14,0x84,0xb6,0x8d,0xd0,0x04,0xac,0x53,0x59,0x7e,0x29,0xad,0x6a,0xb7,0x2e,0x8c,0xe2,0xb7,0x5a,0xd5,0xb8,0x0e,0xb8,0x48,0x03,},"\x76\x27\x53\x4e\x9a\x83\xd1\xe4\x06\xab\x94\x8d\x30\xd1\xda\x9c\x6a\x5d\xb0\x8e\x0f\xeb\x7f\xc5\xba\x5c\xbf\x76\x84\x9e\xe8\xad\xd4\x84\x7e\xf5\xca\x5a\x0d\xae\x41\x1a\xca\x09\x74\x51\xcb\x4c\x2b\x49\x8c\x94\x70\x97\x40\x70\x07\x64\x0d\xc1\x9e\xd9\x38\xe3\xb9\x1b\xf5\x1c\x95\x81\x16\x8d\xf8\x60\xbd\x94\x75\x16\x68\xda\xbd\x72\x1d\xc7\x39\x98\x40\x0b\xe2\x0c\x9a\x56\x3d\x50\x51\xef\x70\xe3\x54\x6f\xee\x67\x33\x12\xb5\x2a\x27\x40\x41\x05\x7e\x70\x84\x8e\xb7\xc5\xa2\x16\x44\xc9\x7e\x44\x8a\xbd\x76\x40\x20\x7d\x7c\xda\xfc\xf4\x5d\xa6\xdf\x34\x94\xd3\x58\x5b\x0e\x18\xac\x5a\xc9\x08\x1c\xb7\xa4\x07\xa3\x9a\x87\x77\x05\xcb\xaf\x79\xa0\x1b\x91\x5f\x73\x6e\xb0\x25\xc5\x8b\x4b\x5d\x80\x7f\xb7\xb7\x56\x6c\x59\x69\x78\x7c\x1d\x6c\xa4\xeb\xa9\x7d\x50\x9e\xf7\xfb\x35\x50\xd2\x1d\x37\x7e\xce\xff\xcf\x0e\xb6\x68\x18\x95\xad\xbd\x24\x6e\xe7\xbf\x3c\x93\x5a\x00\x64\x78\xb8\x32\xec\xe4\x6d\xe6\x11\x8b\x17\xe4\x66\xa2\x7f\xc2\xa4\x4a\x89\x6b\xaa\xe2\x72\xf9\xec\xf0\x18\xc6\x5c\xb5\x0c\xfb\xfc\x8d\x26\x09\x94\xa1\x8a\x83\x2d\x97\x19\x28\xc4\x49\x67\x57\x24\x58\x51\x31\xc8\x71\x53\x3c\x98\x97\xd8\xf8\x0f\x9c\x04\x16\xb7\x18\x78\x6b\x10\xfe\xa8\xeb\x5b\xd8\x13\xa2\x69\xa1\xb6\x77\xb7\xa2\x50\x7a\x44\xb7\x13\xd7\x05\x08\x65\x30\x99\x5e\x59\x33\x5d\xdc\x28\x55\xe8\x47\xe4\xf4\xdb\x06\xc9\x1f\x1d\x54\x02\x3d\x8a\x10\xf6\x9f\x9e\x61\xbd\xce\x4b\x68\x6f\xb6\x17\xbd\x50\x30\xe7\x55\xca\xdb\x1f\x64\x4e\x1d\xdd\x91\x61\x9b\x96\xec\xd6\x05\xb0\x01\x98\xb9\xa6\xed\xdb\x5a\x84\xeb\xd3\x69\x2b\x66\x59\x79\x76\x66\x37\xc6\x77\x37\x8c\x1c\x77\x04\x1f\xd4\xa6\xb3\x55\x5c\x1d\xc8\xa8\x3f\xe9\x01\x3b\xb6\x10\x6c\xc1\x8a\x2b\x03\x7c\x93\x77\xb7\xa1\xa5\xa5\xd0\xdc\xc5\x49\x18\xea\xad\x7e\x32\xc8\x80\x76\x7b\x26\xfd\x2e\xa2\xd6\x8b\x04\x05\xf5\xe0\x74\xf5\x5a\x19\xd8\xa3\x9f\xfb\xb7\xdc\x32\xfa\xee\x6a\x7f\x95\x32\xae\xc8\xa0\x77\x6c\x3f\xf8\x3a\xe3\xa4\x62\x77\x38\x49\x6a\x37\x1e\xb9\xe0\x90\xb7\x4e\x0e\xdd\xec\xfc\xd4\x1b\xed\x0c\x0c\xe5\x81\x27\x52\x43\x47\x2d\x26\xda\x8c\x99\x8e\x4b\x6d\x6b\x44\xfc\x88\xba\x2a\xb5\x46\x42\x22\x54\x17\x12\x02\x94\x41\x78\x05\x74\x2b\xdb\x33\xb7\xb1\x22"}, +{{0xdf,0x64,0x89,0x40,0xb5,0x78,0xbc,0x31,0xd2,0xa6,0x52,0x96,0x5f,0x30,0x39,0x1c,0xaf,0x06,0xd5,0xf2,0x51,0x59,0x9a,0x73,0x7c,0xe1,0x0b,0xe5,0x5f,0x4a,0x9d,0x0d,},{0x27,0xde,0x92,0x04,0x19,0xc1,0x86,0xb0,0x1b,0xe5,0x42,0x79,0xfb,0x8f,0x9b,0xe4,0xbb,0x4b,0x2c,0xad,0x75,0xca,0x7e,0x8f,0x79,0x2b,0xfa,0x7b,0xb9,0x7c,0x7f,0x41,},{0x62,0xbc,0x99,0x1c,0x45,0xba,0x9b,0x26,0xbf,0x44,0x01,0x16,0x26,0x41,0x62,0xc3,0x4c,0x88,0x59,0x78,0x85,0xe9,0x60,0x50,0x83,0xc6,0x04,0xb5,0xf5,0xd8,0xfa,0x6f,0x66,0x2b,0xa2,0x14,0xf7,0x6e,0x6c,0xf8,0x4e,0x5e,0xc0,0x4d,0xf1,0xbe,0xef,0xc5,0xf2,0x5d,0x3a,0x3b,0x72,0xf9,0x8b,0x50,0x69,0x83,0x19,0x16,0xa6,0x32,0x96,0x01,},"\x1a\xe5\x20\xbe\xeb\x4a\xd0\x72\x2b\x43\x06\x7f\xa7\xcd\x28\x74\xab\xcf\x34\xdd\x92\x37\xb4\x47\x8e\xae\x97\x72\xae\xa2\x97\xa6\x7f\xb7\x9b\x33\x07\x02\x04\xba\xee\x44\x0b\x9c\x87\xe2\xfb\xcb\xeb\x76\x80\x1d\xdd\xea\x5e\x45\x30\xd8\x9e\x11\x58\x31\x79\x93\x9a\x00\xa3\x2f\x81\x13\x32\xc5\x22\x91\xcc\x7a\xc9\x1e\x5a\x97\x0c\xd5\xaa\x70\x8b\x1d\xa2\x6b\xe9\xfe\x43\x2a\x9b\xbd\xa1\x31\x9e\x31\xe4\xbc\xc9\xf1\x66\x6a\x05\xb5\xc0\x5b\x87\x6b\xfd\x1f\x76\x66\x87\xcc\xea\x4e\x44\x82\xe9\x24\x32\x9a\xfa\xce\x5e\xe5\x2e\x98\x79\xfd\x69\xb7\x6e\x0f\x7e\x45\x2e\xc4\x71\x3b\xff\x21\x6d\x00\xc8\x25\x99\xd2\x7c\xa4\x81\xf7\x3a\xae\x13\x6f\x08\x75\xc8\x8a\x66\xb1\xb6\xf3\x4c\x50\x52\x3a\xb6\x02\xe9\xd4\xeb\xb7\xee\xb9\xe0\x43\xa6\x5e\x41\x89\x9d\x79\x75\x2a\x27\x9d\x2e\xd4\x69\x93\x92\x6f\x36\x21\xe7\xc3\x2c\x9a\x9b\x3b\x59\xd8\xdd\x57\xbe\xca\x39\x28\x54\x34\xde\x99\x1c\xbd\x2d\xfc\xbc\x5c\xa6\x2a\x77\x79\xf4\x75\xd0\xce\xf2\xf3\xe5\x62\xf2\x9a\xcd\x47\x4f\x3c\x99\xec\x5b\xd8\xde\x01\x10\x1b\xed\x2e\x0c\x9b\x60\xe2\xd7\x0f\xd4\x32\xc8\x92\xfc\x66\xf8\xd4\x61\x9a\x91\x1b\x56\x25\x16\x3e\x9a\x42\xbf\x9e\xa3\x85\x86\xd8\xe7\x64\x00\x15\x64\xd3\x35\x41\x12\x25\xfc\xb0\xa0\x6d\xc2\xa8\x2d\xa0\x77\x9a\x3c\x44\x4e\xb7\x86\x42\x01\xb4\x3e\xbb\x72\xb9\x21\xf3\x4d\x3c\x13\x08\x9d\xf2\xf4\xfa\xc3\x66\xff\x1e\x3c\x0b\x96\xf9\x3d\x2b\x4d\x72\x6a\x5c\xe4\xd6\x91\x6d\x82\xc7\x8b\xe3\x54\xa1\x23\x0c\x2c\xf0\x41\x8c\x78\xa1\x91\x3e\x45\x4f\x64\x8c\xc9\x2c\x8d\xd0\xe1\x84\x64\x5f\xe3\x78\x1d\x26\x3c\xff\x69\xf5\xc6\x0b\x1e\xbb\x52\x00\x5a\x8b\x78\xa5\x15\xc7\xe8\x88\x6f\xfe\x05\x4d\xab\x42\x8e\x2e\x22\x1d\x9d\x76\xaf\xf4\x26\x54\x16\x8d\x83\x3b\x88\x17\x82\x93\xe1\xfe\xdd\x15\xd4\x6c\xd6\x09\x48\x31\x29\xc4\xd2\xd8\x44\x32\xa9\x9d\x31\xff\xe9\xbd\xb5\x66\xf8\xc7\x5c\xe6\x5e\x18\x28\x8e\x4d\xf8\xc1\x67\x31\xa0\xf3\xfd\xde\x1c\xca\x6d\x8e\xde\x04\x35\xff\x74\x36\xca\x17\xd0\xae\xb8\x8e\x98\xe8\x06\x5c\xbc\xbf\xd0\xff\x83\x04\x3a\x35\x7c\xd1\xb0\x82\xd1\x70\x3d\x46\x18\x81\x87\x2c\xdf\x74\x1e\x4f\x99\xbd\x14\x67\x45\xba\x70\x39\x74\xbe\x40\xf5\x79\xbf\x5c\x4d\xba\x5b\xdb\x8c\x94\x1b\xce"}, +{{0xc8,0xac,0x23,0x45,0x58,0xaa,0x69,0x81,0x6b,0x36,0x8b,0x77,0xb7,0xcc,0xcb,0x5c,0x8d,0x2a,0x33,0xec,0x53,0xae,0xef,0x2c,0xe2,0x28,0x71,0x43,0xbd,0x98,0xc1,0x75,},{0x53,0x64,0xba,0xf1,0xfd,0xb2,0xc6,0x38,0x40,0xb3,0x0d,0x40,0x31,0xcf,0x83,0xa2,0xe1,0x8e,0x62,0x07,0x93,0xba,0xe5,0x9d,0x10,0x35,0xc0,0xed,0xe5,0x5e,0x52,0x8b,},{0x32,0x25,0x03,0x61,0xdf,0x6e,0xd2,0x83,0x48,0x5f,0x95,0xf3,0xd3,0x57,0xa4,0xf1,0xc3,0x3a,0x8c,0xf9,0x16,0x58,0x32,0x7c,0xd4,0x53,0xd4,0x9c,0x95,0x36,0x65,0x51,0x08,0x70,0xaa,0x45,0x4c,0xfa,0x3b,0x83,0x24,0x52,0x20,0xa8,0x27,0xd0,0xec,0x74,0x77,0xf9,0xec,0xeb,0x79,0xc4,0xa2,0x9f,0x30,0x1f,0x95,0x3c,0xc8,0xca,0xac,0x07,},"\xce\x48\x8d\x26\x97\x5c\x1c\x93\x28\xb4\x7f\xa9\x2e\x19\x56\x13\x30\x04\x1b\x23\xa0\xe5\x7a\x4b\x8b\xca\x89\xeb\x5f\x61\x5e\x73\xdd\x7f\xae\x69\xc2\x38\x0e\x32\x12\xf9\xb7\x33\x41\xc3\x56\xdb\x75\xa6\x25\x6d\x7a\x20\xa9\x7f\x75\x9d\x4c\xba\x71\x97\x17\x8e\xa7\x24\xdd\x93\x29\x49\x36\x0e\x96\xc5\x0a\x4b\x3b\xa5\x5a\x95\x33\x72\xc3\x97\xb0\x96\x9c\x2b\x14\xd3\x60\x9e\x0a\x85\x2d\x48\x4d\xf7\x0e\xaa\xb1\x12\x49\xeb\xeb\x32\x37\x92\x1f\x0a\x39\xa5\x5d\x7d\xcc\xfe\xf2\x05\xd9\x4e\xc8\x0d\x9e\x1f\xd6\xa2\xc1\xef\xd2\x98\x44\x10\x1d\xfe\x2c\x5f\x66\x8a\xdb\x79\x75\x91\x5d\xed\xd0\x86\x50\x0c\xee\x2c\x1e\x23\x3e\x8e\x48\x85\x5c\xc1\xa6\xf2\x87\xd6\x3d\xce\x10\xad\xdd\x13\xca\xc7\xb7\xa1\x87\xef\xe4\x7e\x12\xd1\xc3\x5b\xb3\x97\x40\x52\xb2\x3a\x73\x66\x8d\x3e\x4c\x87\xdb\x48\x41\xaf\x84\x6e\x80\x86\x72\xc4\x3d\x0a\x15\x22\xe2\x96\x5f\x08\x39\x51\xb2\xb2\xb0\xc4\x09\x54\x8e\xe6\x18\x2f\x0c\x98\x50\x51\x4c\x9e\x6c\x10\x2f\x54\xba\x41\x24\xc9\x2a\x90\x27\x4f\x40\x58\x91\xe6\x62\xf5\xeb\xb3\x77\x1b\x85\x78\x31\x56\xe9\xe5\x83\x67\x34\xd0\x9d\x1b\xaf\x5b\x21\x34\xc9\x31\x62\xee\xc4\xbe\x03\xbd\x12\xf6\x03\xcd\x27\xbe\x8b\x76\xac\xcc\x6e\x8b\x8b\xac\x02\x0c\xba\x34\x79\x65\x1c\x9f\xfa\x53\xce\x4e\xb7\x7a\x77\x31\x3b\xc1\x26\x5d\xda\xb8\x03\xef\x7a\x65\x63\xba\x6f\x79\x9d\x1e\xf3\x0e\xf5\xa0\xb4\x12\x96\x5f\xda\xc0\xb9\xda\xb8\x42\xc7\x8e\xe2\xcc\x62\x8e\x3d\x7d\x40\x61\xe3\x4e\xde\x37\x97\xe1\x54\xb0\x6e\x8c\x66\xce\xbd\xf2\xde\xd0\xf8\x1b\x60\xf9\xf5\xcd\xda\x67\x5a\x43\x52\x77\xba\x15\x24\x55\x7e\x67\xf5\xce\xfa\xfc\xe9\x29\x29\x1d\xce\x89\xec\xb0\x8a\x17\xb6\x7a\x60\xc5\x82\xb4\x87\xbf\x2f\x61\x69\x62\x66\x15\xf3\xc2\xfe\x3b\x67\x38\x8b\x71\x3d\x35\xb9\x06\x66\x69\x96\x0d\xe4\xdb\x41\x3c\xd8\x52\x8e\xe5\x6e\xd1\x73\xe9\x76\xa3\xc9\x74\xac\x63\x3a\x71\x34\xcc\xe3\x83\x19\x73\x5f\x85\x7b\x7d\x71\xba\x07\xf4\x77\xef\x85\x84\x8a\xa8\xf3\x9e\x11\x81\x18\x77\x9e\xd8\x7b\x4f\x42\xaa\x35\x8a\x89\xf7\xec\x84\x4a\x45\x1e\x7e\x8f\xc0\xaf\x41\x8b\x85\xbc\x9b\xf2\xf2\x6d\x1e\xa1\x37\xd3\x35\xec\x7e\xe7\x57\xb7\x0a\xe2\xfd\xd9\xcc\x13\x49\x32\xf0\xe5\x42\x5b\xf3\x7f\xb9\x15\xe7\x9e"}, +{{0x2c,0x47,0xf2,0xb8,0xb9,0xd2,0xce,0xe9,0xe6,0xf6,0x54,0xbc,0x24,0x65,0x8f,0x9e,0xaf,0x43,0x9c,0x23,0xbe,0xaa,0x0a,0x79,0xbf,0x35,0xcc,0x8c,0xd2,0xde,0xba,0xf4,},{0x44,0x4a,0xf2,0xf3,0x4f,0xd3,0x2e,0x5a,0x19,0xf6,0x1f,0x87,0xd0,0x3e,0x10,0x76,0x27,0xa3,0xee,0xb8,0xbd,0x94,0xd2,0xfa,0xea,0xa3,0x48,0xb0,0x5d,0xea,0x19,0x80,},{0x85,0x54,0xb0,0x1d,0x09,0xed,0x86,0xe6,0x13,0x95,0xb9,0x1a,0x2b,0x1e,0xe1,0x87,0x15,0xc4,0x2f,0x9c,0x7e,0x7f,0x07,0x00,0xd7,0x9f,0xf9,0xfb,0x57,0x81,0x29,0x3d,0x61,0xc5,0x58,0xdd,0x5b,0x43,0x1c,0x93,0x71,0x8d,0xcc,0x0f,0x98,0xfb,0x65,0x2b,0x59,0x6f,0x18,0xc3,0x0f,0x82,0x21,0x5e,0x8e,0x63,0xe4,0xf6,0x56,0x8c,0x88,0x00,},"\x04\x4c\x8f\xaa\x8c\x8a\xaf\x9f\x2b\x81\x86\xa6\xb9\xb3\x38\x47\xec\x7b\x45\x24\x23\xb2\x2a\x91\x74\x3d\x2e\x59\x7e\xcc\x1e\x1e\x22\xae\x60\x05\x3e\x9e\xe6\x23\x3b\x04\x4e\x77\x59\x20\xe4\xe3\xd6\x67\x19\x90\x13\x25\xcf\xdd\x39\xbb\x53\x2f\x8a\xa4\x69\xaa\xb4\x2e\x96\x08\xc2\x12\x60\xc0\x4c\x27\x41\x3a\x7a\x94\xe4\x66\xf6\x3c\x49\x52\xe9\x0e\xf9\x0c\x12\x81\x4b\x34\x51\xb1\xca\xd7\xda\x91\x47\xf8\x40\x92\x20\xf6\x49\x8c\xc0\xa6\x7f\xef\x4b\xc0\x4f\xc0\x6e\x1d\x89\x8a\x55\x15\x59\x1e\x8b\xe0\xc4\x3d\x75\xa6\xfe\x42\x5b\x7c\xbe\xfb\x1b\x91\xb1\xbd\x78\xb5\xbe\xc7\x82\x90\x56\x98\x2e\xfd\xc5\xbe\x24\xaf\x66\x78\x00\x6a\xdc\x6f\x04\x46\x20\x2e\x7e\xc3\xa2\xd6\x97\x9c\xb0\xdf\x7e\x25\xd7\x42\x33\x91\x4d\x9c\x58\xb8\x1c\xf5\x5b\xe0\x69\x67\xd3\xa5\x95\xc1\xb9\x67\x28\x69\x99\x4c\xfb\xa6\x71\x62\x83\x3a\x21\x43\xaa\x91\xcc\x93\xac\xda\xfa\x5b\x45\x20\x8d\xf3\xe8\x8c\xcc\x01\xa2\xa4\xd2\x20\xe3\x60\x09\x8d\x91\x54\xd2\x25\xa7\xca\x5f\x2f\x1e\x52\xb1\x00\x3d\x10\x66\x50\xa7\x7b\x28\x3b\x95\xe4\xba\xf1\xe7\x33\x6f\xa9\xa7\x47\xa2\xb3\x82\x3d\x36\x09\x10\x41\x2e\x76\xdb\x72\x5c\xe1\xab\x1e\x1d\x18\x9d\x0d\x3a\xbe\xf8\x2d\x76\x66\xbc\xf1\xb7\x66\x69\xe0\x64\x3b\x44\xf7\x4e\x90\xce\xaf\xa0\xc8\x37\x1b\x57\xc5\x8f\x3b\x37\x0a\x54\x7c\x60\x95\x8f\x0f\xcf\x46\x1b\x31\x50\xf8\x48\xc4\x70\xfa\x07\xe2\x9b\xf5\xf0\xd4\xb5\x9e\xfa\x5a\xb0\xd0\x34\x1e\x04\x51\xd0\xab\xb2\x9d\x74\x14\xcd\xdc\x46\xcc\x6d\x74\xcf\x3d\xc2\x33\xd0\xd1\x70\x73\x87\xbd\x8c\x77\x80\xff\x78\xe5\x46\xfb\x77\x29\x4d\x58\xa5\xdd\xa5\xf0\x5c\x12\x97\xe3\xd1\x77\x11\x56\xd2\x85\x63\x5b\xf7\xec\xed\xb3\x8a\x9e\x5e\x77\x44\x98\x04\xf3\x89\x9e\xa4\x6a\x50\x26\x6b\x25\x5a\xeb\x52\xd1\x8e\x0f\xa1\x36\xe5\x35\xcc\x90\x26\xf6\x78\x55\x2f\xa3\xee\x21\x46\x08\x1d\x99\x96\x85\xe2\x4b\xf7\x80\x7c\xc4\x7c\x13\x04\x36\xc5\x44\xd3\x5b\x4b\x87\x5b\xd8\xaf\xa3\x12\xce\x3a\xe1\x7c\xf1\xc7\xf5\xea\x1e\xce\xcb\x50\xf9\x53\x44\x72\x0c\xec\xf0\x88\x43\x4f\xf8\xe0\xba\x04\x4e\xc1\x9c\x98\xad\xa7\x78\x21\x16\x30\x4c\xbe\xac\x1c\x3e\x35\xf5\xa4\xf4\x43\x13\x35\x4d\xc9\xa4\x0e\xce\x5a\x0f\x9a\xd3\xa2\x02\x5a\xce\xf2\x62\xc5\x67\x9d\x64"}, +{{0x88,0x7f,0xdb,0x48,0x70,0x68,0x1d,0x4f,0xb0,0x6a,0x93,0x62,0x59,0xf7,0x5c,0xae,0x05,0x17,0xf5,0x01,0xaf,0x64,0x6b,0xc0,0x7a,0x4d,0x72,0xbe,0xe7,0xfb,0x1c,0x73,},{0xc7,0x62,0xeb,0xd4,0x8b,0x2c,0xe0,0x2d,0x06,0x38,0x4e,0x38,0x55,0x4b,0x82,0x5a,0xd3,0x22,0xeb,0xea,0x74,0xd2,0x59,0xdf,0x15,0x47,0xa4,0xd5,0x47,0xce,0x00,0x24,},{0x41,0x0a,0x5a,0xf3,0xc5,0x9b,0x7c,0x6b,0xdb,0x21,0x4b,0x16,0x6c,0xb7,0x9d,0x96,0xf8,0x30,0xcf,0x98,0xbf,0x52,0xda,0xd7,0xb6,0xff,0x29,0x79,0xc9,0x7f,0xea,0x4f,0xed,0x5e,0xf7,0xd3,0xd4,0x9f,0x03,0x09,0x72,0x79,0xb9,0xa0,0x99,0x22,0x6e,0x2a,0x08,0xdd,0x30,0xc6,0x07,0x86,0x25,0x4e,0x2d,0xa8,0xde,0xe2,0x40,0xbf,0xc3,0x08,},"\xc5\xdc\x77\x9f\x3f\x3f\xac\x06\xdd\x28\xe5\xa6\x7e\x0e\x52\x4a\xf5\xb5\xdc\x3b\x34\x40\x96\x57\xb6\x3d\xfa\xce\x94\x71\xe9\xa4\x1e\x11\x32\x17\x5a\x0b\x56\x9c\x8f\xea\x9d\x2e\xef\x2c\xf5\xd5\x96\x2c\x7e\x0b\x61\x45\xa9\xe7\xa0\xc1\xaa\x33\x77\x20\x44\xf9\xc3\x99\x8c\x5a\x8c\x48\x86\x45\x8b\x4e\x58\x6f\x93\x07\x60\x83\x61\xf5\x11\xe7\xab\x50\x92\xac\x41\xec\x76\xe0\x58\x6e\xf5\xb9\xc2\x36\xfc\xf5\xca\x2f\xc8\xdd\x6a\xae\xb7\x89\x36\x7f\x2e\x7c\x99\x09\x32\x55\x5d\xc5\x22\x61\xe4\x4e\x49\x42\x34\x98\xb5\x24\x41\x91\x83\xb6\xc1\xf1\xd4\x2c\x45\x46\x4e\xcc\xb0\xc2\xf7\xe2\x51\x77\xfe\x5c\xd4\x63\x50\x2b\x40\x3e\x06\xd5\x11\xfc\xf9\xdc\xb6\x40\x12\xe0\xf2\x0b\x34\xc2\xea\x7c\x00\x4d\x9e\x48\x4a\x7e\xd8\x1f\x32\x60\xc4\x1c\x8b\x19\x53\x52\x9f\x47\xf7\x1e\x86\x78\x43\xcc\x3c\x33\x2a\xd0\x36\x6a\x63\x81\x7e\xd1\x2d\xd4\x73\x0d\x3d\xfd\xbd\x75\x72\xb9\xff\x79\x80\x45\x94\x0d\xd1\x9f\xad\x0c\x8a\xea\x0b\x4a\xb6\x1c\x40\x16\xde\x32\x79\x9c\x73\xaa\x2b\x92\xd2\xc2\x5e\xe9\xb7\x2d\x46\xfe\x8f\x06\x93\xc5\x87\x75\xef\xb0\x5e\x9e\x17\xa5\xc3\x46\xa8\x12\x65\xd3\x5b\xe6\x9a\x22\xd0\x95\xde\x18\x60\x66\xa5\xc6\xd8\xc0\x7a\x3d\x38\xd0\x02\xa1\x0e\x5e\xfd\xb8\x66\xda\x4a\x9b\xdd\x54\xf5\x09\x26\x61\xb6\xc2\xd7\x43\xf5\xae\xaa\x4c\x6c\x31\x8f\xb5\x93\x23\x90\x30\x57\xe4\x9c\x23\x7b\x45\xf6\x75\x42\xa4\xf2\x7c\xaf\x65\xb5\x7c\xfc\xf8\x8b\x71\x20\x3d\x43\xd7\xf9\x53\x22\x16\x0f\x95\xc2\x32\xdd\x10\xab\xb1\x13\xb7\x21\xdd\xba\x22\x26\xb0\x63\x22\x9b\xb4\x41\x02\x33\x6b\x10\xbf\x16\x56\x55\x11\x61\x24\x97\x86\xd4\x54\xf4\xe0\x90\x9d\x50\x00\x17\xf6\xc7\x56\x4f\x73\x3c\x83\x1a\xf4\xe5\xec\x94\xdf\xd3\xbf\x8f\xf5\xf3\x02\x1b\x70\xa5\xca\x5d\x28\xc6\xdf\xb8\xa2\xc1\x8a\x1a\x66\x2a\x33\x35\x9f\x26\x4d\x16\x96\x98\xc1\xab\x55\x78\x3f\xac\xa7\x3b\xd6\x8c\x0f\x79\xd1\xd0\x4a\xe0\xec\xdb\x52\xae\x76\x18\x92\xc0\x24\x93\xff\x35\xf3\xd8\x4f\x66\xe2\x36\xfc\x58\x13\x4a\xd6\xa7\x7d\x92\x25\x49\x05\xd7\x73\x90\x0d\x9d\xdf\x26\x54\xc7\x0b\x46\xf3\x41\xda\xcb\x47\x93\xca\x51\xee\xde\x45\x53\x3e\xae\xeb\x6e\x33\x23\xbc\x3e\x6c\x85\xa7\x94\x06\x51\xc4\xf6\xf9\x81\x91\xc6\x18\xc8\x91\xea\x4e\x22\x0e\xa4"}, +{{0x88,0xb3,0xb4,0x63,0xdf,0xc3,0x0d,0x01,0x5e,0xef,0xbb,0xbd,0xd5,0x0e,0x24,0xa1,0xf7,0x27,0x77,0x75,0xbc,0xef,0x14,0xa6,0xbe,0x6b,0x73,0xc8,0xc5,0xc7,0x30,0x3e,},{0xf2,0xb6,0x28,0x4c,0x93,0x0d,0x4a,0xd3,0x2d,0x0a,0xc7,0x19,0x04,0x0e,0xe7,0x88,0x6b,0x34,0x72,0x2e,0xdf,0x53,0xda,0x80,0x1a,0xcb,0x5f,0x93,0x19,0x69,0xe1,0x19,},{0x82,0x5a,0xff,0x71,0xf7,0x93,0x03,0xbf,0x45,0x92,0xbd,0x8d,0xa4,0xd7,0xd9,0x43,0x7f,0xf2,0x67,0x97,0x6f,0x74,0x64,0x37,0x65,0x59,0x88,0xdd,0xcf,0x29,0x37,0x94,0x65,0xa3,0xb4,0x8c,0x9f,0xb0,0xf3,0x1c,0xef,0x03,0xe6,0x36,0x88,0x61,0xc3,0x69,0xb4,0x36,0x4f,0xb8,0xe4,0xb0,0xc7,0x2e,0x26,0xa9,0xa9,0xdd,0xed,0x1c,0x25,0x04,},"\x17\xc3\x17\xfa\x6b\xc9\x0c\x55\x32\x32\x8f\x02\xcc\xfb\x6c\x09\x9e\x6f\xe1\x00\x01\x74\xf2\xaf\x3a\x3a\x93\x09\x42\x85\x06\x71\x7c\x5c\x43\x35\xbd\xd7\xc3\x67\xff\x4e\x44\x8a\x9c\x04\x75\x03\xaf\xba\x68\xfd\x8f\x79\x87\x23\x7b\xe7\xf7\xfb\xdc\x6d\x73\xf2\x4c\x64\x21\xca\xb4\x22\xb3\xfb\x25\xf6\x7b\x2d\x71\x04\x2e\x71\x57\x0d\xf2\xaf\x37\xbf\xe5\xc1\x14\x21\x1f\xd5\x52\x4b\x6c\x1c\x6c\xc5\x2f\xab\xc3\xcd\x7f\xb4\x64\xcd\x58\x0b\xb7\x40\x71\xcb\x30\x0f\x8c\x9f\x8a\x46\x20\x8e\x5a\xa5\xdd\xfe\xa5\xfe\x90\x69\x7a\xa2\xf1\x4c\x60\x79\x50\xc9\x8f\x23\x12\xa9\xe1\x6e\xf6\x34\x6a\x8f\xd1\x29\x23\x27\x33\x82\x7e\x15\x01\xa6\x60\xc7\x7c\x29\xc5\x6d\x2f\xdd\x1c\x55\x97\xf8\xbc\x89\xaa\xef\xe3\x71\x37\x34\xfe\x82\x85\x82\x01\x89\x1a\x11\x47\xef\xaf\x1d\x78\xa4\x71\xf9\x20\xde\xfc\x88\x03\x44\x55\x3e\xb7\x16\xcc\xe3\x26\x0e\x86\xa1\xbc\x0b\xe2\x83\x73\xa6\xa0\x66\x11\x6e\x8e\xcb\x10\xa0\xc4\xa7\x0c\xa2\xb5\x36\x4e\x11\x9f\x84\xae\xc6\x0d\xec\xed\x3a\x4e\xff\x1f\xe6\x88\xc5\xe3\xe2\x51\x47\x0a\xb5\x16\xfa\x96\x4a\x4b\x6f\x28\x36\x8d\xd1\xe2\x83\x59\x79\x34\x06\x4d\xc0\xc5\xb5\x69\x10\x62\xcb\x2e\x26\x7b\xd1\x5f\xd4\x22\xbc\xfe\xfb\x83\xcc\xef\x7a\xa9\xa2\x27\x5e\xf5\x7e\x47\x31\x49\x98\x8c\x15\x78\xfd\x18\x70\x8d\x2f\xf6\x9f\x8e\x59\x80\xaa\x82\x6a\x82\xca\xb7\xd8\xb9\x2b\xb5\x3b\xdd\x46\xdb\x04\x6e\xcd\xfc\x8c\xd7\xae\x5c\xe4\x4f\x3c\x5b\x8c\x05\x65\xb5\xd3\xc0\x72\xc7\x6b\x95\xce\x90\x0a\xc3\xee\x55\x10\xdb\x0e\x75\xd3\xa4\x15\x0a\x98\xf3\xcc\xcc\xc6\x9e\x93\x0c\x6b\xa7\x41\xdb\xb0\xeb\x9f\xb3\x19\x68\x71\xba\x20\x6a\x58\xe0\xda\xe3\x9c\x8d\x6b\xb7\x2a\x82\x39\x9c\x4b\x7b\x9d\xa3\x85\x77\xac\x17\xff\x15\x24\xd6\x53\xc0\xbf\x33\x67\x93\x23\xca\x7e\xef\x4e\x92\x28\x72\x90\x31\x56\x0e\xd8\xf2\xe5\x19\x3c\x64\x0b\x2f\x5e\x60\x80\x75\xa2\xed\x61\x42\x8d\xfc\xcd\xc0\x00\x50\xba\x4b\x99\xed\x6d\x15\x36\xd5\xac\x1e\x93\x96\x74\xb4\x1d\x16\x31\x2a\xe5\xb0\x7d\xef\x1b\xf5\x35\x89\xbe\xd4\x40\x06\x02\xee\x11\xb8\x50\x33\x0f\x38\xaa\xd3\x3e\xf0\x41\x70\xa3\x90\x5c\x28\xb5\x0e\xcc\x57\xdc\xcf\x4f\x29\xd0\xc0\x0f\x71\x3d\x32\xff\xc8\x57\x95\x65\x88\xa6\x32\x6b\x95\x49\xed\xb0\xe4\xfe\x61\x85"}, +{{0x42,0x7d,0x6e,0x42,0x39,0x17,0x89,0x68,0x31,0x60,0x1b,0x8f,0x4e,0x21,0x56,0x1d,0xb6,0x10,0x85,0x71,0xbe,0x00,0x9e,0x29,0xdc,0xa4,0x9a,0x59,0x60,0xff,0x31,0x4b,},{0x8d,0x9e,0x63,0x60,0xfd,0xef,0x24,0x99,0x75,0xdf,0x27,0xb3,0x10,0x6a,0x71,0x12,0x05,0x87,0x72,0x2d,0xf3,0x27,0x0a,0x85,0xa1,0x3a,0x8c,0x3b,0xb8,0xc9,0x80,0x9e,},{0xd1,0xc9,0xa0,0x1c,0x56,0xe3,0x39,0x60,0xf4,0x9d,0xf3,0x7e,0xab,0x96,0x3b,0xc5,0xa9,0x9f,0x25,0xc6,0x00,0x44,0x6c,0xe2,0xca,0x48,0xd9,0x13,0x9d,0xa5,0x73,0x3b,0x71,0x8f,0xbf,0x1a,0x98,0x73,0x93,0xf6,0xe5,0x82,0x3c,0x2d,0x13,0x0c,0x7c,0xe6,0x0e,0xa3,0xdb,0x35,0x43,0xc8,0x85,0x4e,0xf1,0x2b,0x98,0xd3,0x3a,0xdd,0xe7,0x05,},"\x9c\x2c\xc7\xf2\x46\x2e\x09\xc4\xc5\x8c\x27\x09\xab\x42\x59\x88\x5a\x4e\x88\x7d\x9f\xa5\x31\x88\x15\x05\xaa\xf2\x03\xc1\x63\xfb\x3a\x0d\xc0\x28\xf4\xad\xa6\x06\x70\x63\x8d\x4a\x97\x27\xa3\x90\x83\xbe\xdb\xac\xed\x58\xed\xb7\x79\xe1\xce\x6c\xcd\xfb\x42\x8c\x36\x2b\xb1\xdb\x0c\x10\x53\x00\x6b\xd8\xf4\xbe\xf8\x9a\x1a\x9d\xe0\x1c\x77\x4e\x35\x7f\x91\x0e\x5c\x39\xb2\x24\x77\x55\x5e\x5f\x7c\x04\x98\xb5\xb2\x8f\x36\x9e\x5d\x3f\xa4\x2a\xb3\x60\xe4\xf4\x51\xc6\x9f\x81\xba\x0f\x3c\xce\xd4\x3a\x55\x9d\xb6\x00\x10\x42\x78\xf8\x68\x79\x6b\x2c\x91\x1b\x3b\x03\x2b\x72\x9f\x4b\x22\xac\x14\x9d\xc4\x67\xa0\xca\xe4\x8d\x19\xe9\xd9\x85\xb4\x2b\x62\x54\x9d\xe1\x71\xff\x56\x6e\x1d\x1e\x9b\xb8\xe5\x6c\xfd\x1a\xe8\xf7\xbd\xdc\xfd\x8a\x23\x41\x82\x7d\xbe\x89\xc8\x82\xab\x3e\x49\x83\x39\xff\x68\x1c\x7d\xc1\x10\x4d\xe7\x38\xb4\x80\x31\x69\x43\x10\x9f\x70\x3d\x47\x1a\xb8\x6e\x4c\xa4\x28\x7e\x4c\xd7\x4c\x31\x2f\xf7\xd0\x37\x39\x56\x06\xfb\x25\xf8\x71\xe7\x27\x70\x78\xa7\x87\xd0\x2f\x31\xcc\x9e\x81\x5b\xe8\x60\x0a\x7c\x47\xc6\xfd\xd8\x23\x31\xae\x9c\x49\x6a\x54\x7b\xdb\x23\x5b\x8a\x56\xd5\x32\x59\xe6\x29\x61\x24\xa3\x2c\x3b\x62\x5d\x20\x24\x19\xd0\x64\xb9\xa4\xe8\x3e\xfa\x87\xf1\x35\x37\xb4\xf5\x13\xb9\x16\xa8\x4f\xc8\x66\xd8\xa8\x99\x80\x4c\x78\x33\xea\xa0\x19\xe0\xd7\xe0\xe8\x07\x5b\xd6\xb5\xcb\x6f\xfc\x76\x64\x79\xf3\xf6\xe2\x0e\x48\x1e\x6a\xb2\x7b\xd8\x08\xad\x90\x6c\xdc\xc7\x82\x74\x30\xe3\x12\xf7\x40\xf2\x75\xdd\xf5\x1d\xd8\x32\x48\xfa\x05\x7c\x43\xc9\xcb\x77\x55\x7b\x2f\xd9\xc2\xd5\x28\x24\xff\x9e\x14\x6d\xea\xc1\xe6\x69\x1d\x45\x02\x13\xbc\x59\x0a\x49\xbe\xc7\x2d\x52\xe3\x8f\x6b\x4d\xc6\xcc\xa9\x51\xee\xf2\x18\x4d\x24\x25\x03\x1a\xd5\x9b\x24\x2e\xff\xa6\x8b\x6c\x72\xc5\x4c\x9d\xfd\xb4\x19\xc0\x2e\xb4\x3e\xf3\xf3\x4d\x33\x8d\x2a\x9d\xd0\x3a\x78\xcf\xdd\x01\x40\x98\xe2\x49\x25\x9e\x77\x28\x2e\x0c\x3f\xc1\x01\x0b\x02\xa6\x7f\xf8\x51\xe9\xcf\xd9\x74\x9c\x1c\xd8\xf0\x6c\xf4\x62\xe6\xad\xe9\x95\xac\x46\x6f\xab\x5c\x79\x5e\x9e\xff\x13\xe5\x5b\x43\x50\xb9\x4c\x73\x16\xaa\x49\x8d\xf9\xfd\xee\x99\x58\x04\x77\x93\xe3\xbb\xb8\x9f\xb8\x1d\xa8\x5f\x4b\x9d\x43\xe4\xb0\xd4\x3b\x38\x1b\x94\xcd\xc9\xa9\x9d\x06"}, +{{0xbe,0x93,0x52,0x09,0xf6,0x2d,0xea,0x60,0x12,0xec,0xda,0x6a,0x61,0x56,0xcd,0x16,0x6a,0x4d,0x76,0x11,0x50,0xde,0xed,0x45,0x68,0x16,0xea,0xf0,0xce,0x78,0xa7,0xf6,},{0xd3,0x9a,0x89,0xaf,0x72,0x29,0x39,0x48,0xb1,0x34,0x21,0xfb,0x88,0x3b,0xbe,0x37,0x2a,0xf9,0x08,0x9c,0x22,0x4d,0x42,0xb9,0x01,0x97,0x9f,0x7e,0x28,0x04,0xe1,0xc0,},{0x08,0xe0,0x98,0xa7,0x49,0xfc,0xe6,0xd1,0x23,0x54,0x39,0x58,0x78,0xa8,0xbe,0x35,0xfe,0x9e,0xdf,0x72,0x68,0x4d,0xd8,0x28,0x12,0x24,0x89,0x9b,0x1c,0xae,0xa4,0xed,0x68,0x77,0x85,0xdf,0xf5,0x5a,0x19,0x98,0x9e,0x03,0x63,0x6e,0x16,0x66,0x38,0x6f,0x22,0xc3,0xf4,0x43,0xec,0xf6,0xfd,0x34,0xd5,0x99,0xff,0x3e,0xc2,0xfa,0xf1,0x01,},"\x11\x7f\x42\x7c\xb6\x81\x50\xca\xfc\xfa\x46\x2c\x42\x20\x61\x41\x42\x7c\x4d\xce\xa1\xc8\xea\xcc\x2d\x30\xbe\xd1\xe9\x02\x07\xd5\xae\x30\x5e\x1f\xc1\x6c\x54\xe4\xc5\x4c\xc6\x87\x8c\xdb\xed\xc9\xf5\x1f\xe1\x84\x61\xec\x37\xc5\x57\xb1\x15\xd1\x3c\x86\x82\xc4\xe1\x5f\x50\x52\x96\xa1\x76\x0e\x1e\x75\xf5\xab\x27\xa5\xc1\x5a\x13\x57\xd2\xc8\xc4\x0d\xd5\x35\x5f\x7c\x82\xfe\xa5\xd2\x7e\x28\x87\x63\x58\xc1\x2e\x91\x13\xee\x29\x83\xea\x6f\x09\xc6\x4e\x06\xe2\x97\xdd\x96\xb3\x4d\x9b\x5e\xd4\x9f\xc4\x7a\x88\x39\x54\x9c\x66\xb0\x02\xfe\x94\x5e\x8f\x94\xe7\xd2\x31\x5c\x50\xca\x4d\xc0\x98\xbe\x4b\x32\x89\x81\x2f\xbe\xa9\x6b\x47\xce\x60\x45\x40\xbd\xe0\xe5\xab\x0b\x1b\xc0\x36\xbe\x9b\x6a\x95\xe0\x9c\x81\xe8\x98\x64\x0c\x8f\x05\xd6\x0a\xd9\x42\x18\xd0\xe6\x6c\xeb\x85\xa2\x6b\x78\x29\x22\x20\xbf\xd0\x61\xdd\x07\x35\x12\x92\x3b\x90\xc7\x9d\xcf\x5a\x19\x35\xfa\xfe\x8e\x01\xef\x8b\xf8\x1b\x4d\x37\xc5\xa5\x71\xb5\x0c\x42\x1f\x9b\xd2\x19\x4b\xef\x35\x86\xfc\xb8\x58\x48\x77\xbb\x7e\x04\x81\x65\x5b\x05\xc7\xb6\x43\xb1\xe4\x5b\x04\x03\x62\x72\x84\x18\x52\xe3\x19\x40\xef\x8f\x3b\x6d\x4f\xeb\x5d\xf0\x79\xd1\x76\xf9\x79\xc1\x8a\x11\xa6\x6d\x12\x14\xe5\x2f\x68\x7e\x90\x63\xc1\xc2\xb7\x27\x7b\x68\x5d\x5c\x72\xad\x56\x9f\x78\x73\x83\x8f\x91\x02\x57\xa0\x53\x13\x1c\x83\xeb\xce\x86\xe6\x9d\x73\x63\x62\xbe\xbc\x96\xbb\xfa\x35\xfc\xba\x1c\xb5\x27\xe7\x48\xe5\xf5\x79\x92\x9f\xd4\x0c\x56\xb1\xa5\x1a\x22\x2e\x86\x33\x02\x70\x5c\x86\xf7\xb5\x4e\xbf\xbb\x94\x82\xf7\xe2\x80\xf7\xbe\xc8\xca\xf3\xa6\xb5\x67\x1a\xc3\x0c\xd1\xbe\x52\x92\x88\x79\x7c\x01\x3c\xe5\x6b\xd1\x86\xde\x7d\xfc\x18\x28\x69\x14\x25\xc1\x47\xc5\x17\x4a\x29\x0d\x80\xcb\xd5\x9c\x19\xda\x7a\xdf\x77\x91\x88\x82\xa7\xb2\xa9\xa6\x4e\x6d\x76\xb4\x8b\x92\xf2\xa2\x66\xee\xe6\xe2\x51\xd2\xe8\x17\x65\x2b\x88\xb5\x02\xde\x73\x99\x78\x2d\x75\x29\xa8\x1d\x0a\x36\x39\x96\xb9\xdf\x68\xb1\x5a\x76\x30\x90\x4c\x8c\x24\x60\x81\xfa\x4f\x09\x29\x9f\x15\x75\x79\x58\xe0\x89\xa9\x01\xc3\x56\x46\x15\xc0\xf7\xcf\x27\x52\xb8\xb9\xe5\x21\x33\x8d\x83\x6e\x3d\xae\x4c\xe2\x37\x46\x42\x25\x3c\x4c\x98\x31\x97\x4e\x5d\x8c\x28\x42\xf4\x90\x07\xb7\x17\x75\x09\x3d\xfe\x57\xf4\x44\x92\xf0"}, +{{0x68,0x18,0xc6,0x0b,0xb6,0x43,0x9a,0xc2,0xee,0xe2,0xd4,0xe1,0x28,0xe9,0xd8,0x69,0x1d,0x4a,0xd5,0xd3,0x63,0xfe,0xd7,0xd6,0x57,0x7a,0x62,0xb6,0x56,0x99,0x94,0xa4,},{0x73,0x45,0xec,0x11,0xbc,0xcc,0x05,0x6f,0xc4,0xef,0xfa,0x3e,0x4e,0xf6,0x70,0x99,0x6a,0xa2,0x6a,0x1b,0xb1,0xb8,0x33,0x91,0xba,0xbc,0x39,0xa1,0xa5,0x96,0x01,0xf9,},{0x15,0x05,0x96,0x7a,0x27,0xb9,0xf8,0x6e,0x92,0x42,0x44,0x40,0x02,0xa1,0xe3,0x19,0x7d,0x74,0xdd,0xcd,0x89,0x65,0x9e,0xc5,0x14,0x02,0x02,0xaa,0xc7,0x94,0xb8,0xad,0xc1,0x93,0xe7,0xd3,0x0f,0x33,0x82,0x64,0x29,0x90,0xf6,0xfe,0xd7,0xa9,0x99,0xca,0xc8,0xc6,0x1e,0xaa,0x39,0xb7,0xd9,0x08,0x16,0xf1,0xd7,0x38,0x74,0x4b,0xe1,0x01,},"\xb2\xae\x65\x8b\x3c\x13\xc3\xcd\xeb\x1d\xc9\x93\xb0\xf4\x5d\x63\xa2\xea\x9a\xbd\x0b\x7a\x04\xf1\xf5\xce\x59\x32\x80\x6c\x2c\xa9\xb7\xa2\x04\xfb\xf8\xd0\x66\xb7\xf0\xfe\x6a\xe0\xd1\xda\x68\xc8\x85\xee\x11\xf6\xf6\xdb\x7e\x83\x20\xa2\xea\x65\x0b\x53\x38\x51\xcd\xd9\x9d\x90\x3a\xa0\xb3\xfa\xa3\xc9\x50\xf7\x02\xf0\x4e\x86\xb4\xee\xb3\xa1\xc7\xbc\x85\x4b\x25\x14\xfa\x5b\x47\x66\xd3\x75\xb4\xf1\xad\x61\x07\x53\x78\xdd\x92\xfd\x62\x6c\x2b\x47\xe0\x13\x83\xea\x72\x98\x79\x59\x26\x2c\x56\x28\x62\xb4\x5b\x75\x57\x67\x14\x13\xb6\x66\x14\xbc\xc9\xf7\xbd\xb9\xee\x46\xcb\xed\x89\x65\xbf\xa5\x05\x31\x50\x90\xc7\x20\x4b\xea\x89\x17\x5b\xe5\xf2\x08\x02\xe3\xde\xdd\xcb\xd8\xdd\x64\xcf\xef\x7e\xe6\xa6\xe3\x86\x0c\xe1\xe5\x79\x9d\xf5\xd8\x10\xd5\xec\xf3\x2e\x61\x5d\x16\xdf\xf8\x7a\xbd\x4a\x63\x6e\xa1\x7a\xa4\xec\xe5\xb6\xb2\xc0\x46\xb6\x5b\x5a\xf7\x49\x86\x2b\x45\x79\x0c\x39\x17\x68\x20\xb3\x69\x01\xbe\x64\x9c\xf4\x16\x9d\xf7\xe9\x23\x95\x6d\x96\x06\x49\x50\xc5\x55\xf4\x5a\xcb\x94\x50\x7c\xfd\x0c\x3b\x33\xb0\x80\x78\x5e\x35\xc0\xd2\xb0\xad\xdc\x4c\x0a\xd3\xfb\x21\x6a\xc2\xe6\x01\xc9\xc7\xe6\x17\xda\xbd\xa3\x33\xda\xe6\x03\xcc\x9d\xb1\xfc\x62\xae\x4e\x0e\x45\xe3\xcc\xdd\x16\x6a\x67\x81\xe2\x43\xb7\xda\xa1\x38\x80\x66\x32\xf5\x38\x84\x4e\xe3\xd1\x40\xb7\xa8\xbb\x2b\x54\x01\x00\x77\x8c\x45\x8e\x06\x61\x70\x70\x5e\x5f\xb2\xc8\x80\x29\x09\x8b\x99\x2c\x39\xbc\x9f\xf6\x33\x0b\xfc\xfe\x77\x52\x32\x0e\x6e\xa0\x94\x9d\x2c\x87\x1a\xed\xc1\x87\xbe\x27\xfe\xf7\xdb\x5f\x72\xa6\xa7\x73\xed\xde\x0d\xc5\x2a\xe2\xed\x93\x1c\xb2\x68\x17\xb8\x5b\x15\x45\x89\x4d\x92\x29\x8a\xaf\x87\xcc\xbc\x78\x3e\x8d\xd6\xd1\x64\x93\xf5\x6e\xad\x2b\xa8\x52\xee\x9c\x7d\x10\x07\x44\x06\x44\x0d\x2a\x27\x9a\xbc\x87\x4f\x15\x46\x8d\xd6\x6a\x71\x7b\xac\xe3\x7b\xe7\xb7\x05\x5d\xd9\x68\x1f\x8b\xe8\x13\x29\xee\x7a\xf9\x7e\x3a\xbc\x43\x4a\xc1\xc9\x3a\xec\x58\x2f\x23\xfd\x1e\xc0\xfa\x5a\xaf\xcf\x7b\xfb\xda\x00\xff\xa9\x7a\xe3\x17\xae\x91\x8d\x34\x9d\x21\xa7\xf4\x61\x91\x42\xba\x23\xda\xce\xf7\xb3\x90\xae\x26\xa1\x7e\x2e\x29\x62\xae\x27\x00\x53\x76\xb7\x2d\x4d\xa9\xe2\x97\x96\x53\xa6\x63\x25\xa1\x46\x17\x63\x8d\xbe\x1a\x55\x40\xb6\x83\xac\x00\x17"}, +{{0x6d,0x1d,0xa5,0xb4,0x83,0xe6,0x4b,0x03,0x65,0x99,0x0f,0xf0,0x93,0x81,0xfb,0x17,0x02,0xfd,0x8e,0xc3,0xa1,0xa3,0x69,0xcd,0x52,0xe4,0xc5,0x67,0x13,0xa3,0x14,0xa5,},{0x08,0x05,0x5c,0x26,0x1f,0x26,0xe0,0x2a,0x65,0x8f,0x66,0xd9,0xba,0x01,0xfc,0xde,0x53,0xe9,0xad,0xe3,0xed,0xc6,0xbf,0x81,0x5e,0x4a,0x68,0x02,0xe1,0x67,0x7a,0xb3,},{0xa5,0xb8,0xb4,0x4a,0x91,0x44,0x4c,0x64,0x37,0x4b,0x52,0x3c,0xb4,0xdc,0xb0,0xce,0xf4,0xce,0x52,0x40,0x8b,0x98,0x12,0x6d,0x7e,0x1a,0xe8,0xbd,0xc2,0x8c,0xf5,0x14,0x70,0xce,0x4e,0x25,0x3e,0x0b,0xe6,0x2b,0xd6,0x8e,0xbf,0x5f,0xa6,0xbc,0xe1,0x58,0x5e,0xcc,0xfa,0x92,0x56,0xc0,0x73,0xee,0x03,0xe5,0x4c,0x52,0x5b,0xbe,0x2d,0x0a,},"\x79\xa2\xc3\x70\x55\xf1\x89\xf3\x24\x7f\x1f\x8c\xea\x19\xb2\xea\x40\xd8\x58\xdb\x1f\x5d\x13\x92\xee\x6d\x41\x1c\x78\x02\xee\x23\xde\x52\xad\x02\x81\x17\x25\xa9\x4d\x76\x67\x5d\xa8\x9a\x96\xb5\xd0\x7a\xbc\xee\x23\x3a\x1a\x2e\x1f\xa3\x24\xff\xf9\xe7\x8a\x4c\x19\x61\x47\xf8\x57\x0b\x0b\x13\x71\x3d\x96\xaa\x5d\x75\x0a\x15\xd7\xcd\x16\x2e\x7b\xa2\xe7\x53\x33\x60\x7d\xd6\x98\xeb\x47\x73\xc7\xe9\x1f\x76\x68\xff\x8b\x62\xf0\x46\x40\xeb\x12\xec\xf1\x22\xfc\xe6\xb8\x32\xe0\xd0\xdf\x92\x8e\xef\xd2\xc2\x00\x23\x64\xaf\x6b\xb5\x52\x91\xd3\xf5\x49\x29\x08\x5b\xe3\x38\x34\x2f\x09\xda\x73\xe2\x79\xc8\x7c\x83\x24\x55\x58\x19\xed\x57\xe7\x8d\x7a\xc4\x09\x51\xd3\x3f\x65\xb9\x4a\xa1\xe5\x55\xe9\x2a\x06\x3d\x11\xf1\xff\x7b\x12\x69\x43\x41\xe3\xfe\x44\x49\x33\xd0\x1a\xa3\x67\x53\xed\x3c\xdd\xa8\x90\xbd\xf9\x5a\x82\x05\xb5\xd8\x93\x22\x19\x91\xc7\x95\xad\x0a\x4a\x94\x6f\x58\xd4\x0a\x45\x34\x51\xaf\x21\x4f\xd4\x65\xe2\x8d\x3e\x2f\x0a\x56\xaa\x56\xde\xf8\xdc\x04\xaa\xd3\x57\x13\xab\xfc\x8b\xd7\x85\x6d\x5a\x9d\xc3\xf6\x0a\x3f\x2b\xd3\xe6\x36\x6f\x1f\x24\x4e\x94\x1d\x6a\xea\x89\x2f\x6a\x88\x93\x1f\xe1\xc3\x13\xe0\x90\x78\xe9\x0b\xc6\x39\x2d\x49\x05\x33\xc9\xea\x3f\xf6\xde\xaf\x3a\xad\xfa\x8d\xfd\xc4\xe9\x0f\x64\xaf\x47\x58\x9e\xa6\x5a\x87\xac\xd2\x19\x96\x02\x35\x1d\x3a\xfc\x21\x03\x19\x6e\x03\x94\xed\x52\x3a\xa7\x99\xd3\x1e\x11\xd3\x4f\xff\x54\x6d\x44\xf4\x36\xb3\x48\x59\xf9\xcf\xbc\x9c\xe4\x03\xde\x5a\x98\x30\xec\x3d\x45\x3f\x0d\x45\x97\x0f\x57\x2c\x14\x4f\x19\x1b\x2f\xbb\x2d\x0e\xa6\xcc\x9c\x8e\x24\xd9\xc0\xb2\x18\x3b\x27\x80\x72\xeb\xb0\xbe\x2d\x70\xd0\x37\xfd\x2e\x8e\xc1\x8d\xc4\xc9\xb2\x1a\xbd\xc6\xa4\xce\x8d\x46\x68\xa2\x20\xee\xbd\x69\x34\xf0\x4b\xaf\x0e\x88\xa4\x88\xd2\xdf\xc7\x35\xa7\xc5\xa7\x0d\xbb\x01\x66\xa2\x1a\xe0\x11\xfc\x6e\x7d\xa1\x0f\xc3\x20\x33\x62\x71\xd9\xee\xad\x51\x0a\x6f\x70\x32\xf2\x29\x66\x92\xbe\x50\x80\x21\xbc\x98\xc1\x70\xbe\x42\x35\xf7\xce\x31\xf2\xbc\xd6\x34\x11\x63\x68\x33\x76\xae\x2c\x56\x62\xcb\x47\x70\xc9\x6e\x01\x8e\xf1\xbf\x47\x91\x33\x19\xc9\xa0\x9b\x9e\x96\x5a\xb5\xc3\xe9\x7b\xbc\x75\x6a\x56\x66\xb4\x56\x7f\x2c\xff\x2d\x0c\x3a\x6a\x40\x26\x15\x8c\xb9\xf9\x0f\x95\x00\x56"}, +{{0x51,0x46,0xf5,0xb7,0xf1,0xba,0xa1,0x9f,0xc8,0xcd,0x78,0x5c,0x89,0x6e,0x0f,0x90,0xf9,0xf6,0x59,0xb7,0x7b,0x1b,0x9b,0xb4,0xad,0xca,0xb5,0xa6,0x26,0x72,0x05,0xe4,},{0x68,0x8a,0x8d,0xe6,0x4e,0xff,0x33,0xba,0x6b,0xbe,0x36,0xcd,0xd6,0xa3,0x84,0xbb,0x67,0xb3,0xf4,0x26,0x36,0xdb,0x23,0x4f,0xf5,0xef,0xe0,0xb3,0x17,0x43,0xc7,0xe6,},{0x4b,0xdb,0xd7,0xc6,0x4f,0x13,0xe2,0x78,0xc2,0x39,0x69,0xe7,0xeb,0x38,0x6b,0xbe,0x49,0x9d,0xbd,0xef,0xc3,0xff,0x4e,0x30,0xcf,0xac,0x5c,0xf8,0x6f,0x21,0x6c,0x24,0xc9,0xe6,0xcd,0xe2,0x0e,0x52,0x9d,0x14,0x7f,0xb7,0xea,0x08,0xf2,0x59,0x3a,0xd5,0x09,0x03,0xb5,0xed,0xbf,0x86,0xb4,0xd2,0x8f,0x2e,0xb3,0x2e,0xf1,0x37,0xf0,0x0c,},"\x97\xbd\x99\xf5\x18\xee\x07\x88\xd5\x76\xd9\x9c\x04\x3b\x44\x9d\xfc\x24\x2a\xc5\xee\xae\xc3\x44\xa1\x94\x32\xb3\x45\x96\x2e\xc4\x12\xce\x55\x36\x2b\x3b\x85\x1d\x98\x11\x9f\xce\xb9\x32\x83\x47\xf6\xfc\xc6\x8d\xbf\x56\xa2\x81\x4d\xb0\x9e\x93\x85\x84\x3a\x93\x11\x89\xea\x3e\x72\xda\x9d\x79\xa4\x56\x93\x05\x3c\x03\x57\x01\xdc\x55\x51\x24\x0f\x95\xb3\x03\xfb\xa1\x6f\x89\xaa\x53\xa4\x38\x82\xb0\xf1\x38\x12\x02\xc7\x8f\x9c\x74\x19\x89\x9f\x23\x51\xec\xa9\x5e\x20\xbf\xee\x76\x35\x1c\x48\xd0\x04\x99\xf5\x91\xda\x56\xa9\x95\x24\xbb\x74\xfe\x1c\x83\x4e\xe9\x10\x77\x13\x9f\x1e\xdf\x67\x31\x5c\x07\xa3\xfd\x97\xf8\x0b\x7c\x27\x6b\x6c\xf6\xb5\xcc\x36\xbe\x36\x3b\x73\x12\x17\xf6\x31\x9f\x51\x29\xba\x7b\x14\xd0\x54\xc8\xd8\x1d\x8e\x3a\x3f\x3b\xe6\x2a\xc3\x1f\xf6\x2d\xf6\xa3\xb2\xee\x25\x96\x96\x9b\x99\x17\x04\xb3\x1c\x68\x99\x97\xab\x46\x28\xbc\x26\x60\xc6\x78\x72\x13\x2e\x85\xda\x0c\x4f\xcf\x56\x79\x65\xf1\x25\x4a\x8f\x43\x26\x92\xa1\x7b\xb8\x6c\xb3\xc1\xdc\xba\xac\x93\x95\x52\xf0\x9e\x50\xec\x5b\x0d\xe2\xef\x85\xe0\xac\x25\x3a\x41\x65\x65\x5d\xb5\xb5\xc4\x98\x03\x82\x1d\x85\x9c\x60\x96\x1e\x06\x1d\x58\x27\x8b\x82\x7d\xd4\xd3\xbc\x47\xf1\xc2\x2d\xe0\x94\x90\x6b\xdb\xbf\x3b\xad\xbd\xde\x22\xba\x24\x25\x58\x55\xeb\x86\xd1\xd7\xf3\x70\x82\x05\x93\x11\xdc\x07\x28\xeb\xea\xf2\x6c\x44\x73\xba\xd1\xfa\x9e\x61\x4b\x53\x3b\x81\x1b\x6b\xcb\x06\x50\xc0\x6d\x87\x9a\x52\x45\x78\x8f\x34\x01\xb4\x61\x97\x30\x07\x74\xa9\xaa\x73\xcd\x97\x8c\x05\x30\xc8\x1a\x53\xbd\xb3\xfc\x93\x24\x14\xb3\xe3\x04\x40\xdc\x12\x74\x41\xef\xf1\x60\x5e\x7f\xd9\xac\x8c\x63\x2e\x82\xbf\x1b\x45\x3d\x4f\x33\xa5\x7e\x4b\x67\xb0\xb6\xfc\xf6\xed\x55\x55\xb5\xf5\xa3\x00\xa1\x4a\x00\xd0\x38\x5a\x33\x75\x05\x25\xb0\x0e\xdb\x31\x2c\x6b\xfd\xd6\x4e\xdd\x3b\x53\x16\xd1\x9f\x95\x8c\x51\x76\x34\xf0\x13\xb0\x08\x93\x6d\x34\xe9\xb5\xe1\xe9\x28\x3a\x5f\x0f\xd7\x78\x33\x77\xc0\xe5\x09\x06\x41\xbb\x9d\x33\x8c\xf3\x13\x3a\xcd\x0b\x97\x1e\x53\x79\x04\xf1\x7a\xf9\x29\x11\xaf\xad\x72\xee\x97\xf9\xa8\x28\x3a\x16\xa7\xe2\x6a\xb4\x28\x41\x6c\x10\x17\xda\xe9\xb1\xa9\x9c\x4c\x33\x20\xad\x16\x3b\xdc\xfc\x32\x8b\xfa\xf9\xb8\xd5\xd7\xd2\x6d\x41\xd1\xef\x21\xa5\x20\x8f\x01"}, +{{0x5e,0x6f,0xda,0xc9,0x35,0x1a,0x63,0x7b,0x99,0xf3,0x3a,0x26,0x4e,0x12,0x87,0x69,0x7e,0x2a,0xba,0xb0,0xcc,0xa1,0x66,0x21,0x79,0x24,0x84,0xf5,0x60,0x6f,0x44,0xc1,},{0x57,0xe5,0xf8,0x8a,0xcd,0xdc,0x8c,0xde,0x7d,0xd0,0x7a,0x31,0x46,0xfb,0x1d,0x4f,0x7a,0x9b,0x63,0x83,0xa8,0xf6,0xb2,0xb8,0xd9,0xb0,0x7e,0xbc,0x3f,0xc4,0xdd,0x20,},{0x98,0x7e,0x32,0xe0,0x0a,0x8a,0x16,0x32,0xf4,0x7b,0x50,0x31,0x94,0x35,0x5c,0x98,0x0c,0xb2,0x2a,0xde,0xb3,0x26,0xb4,0xe3,0x11,0x5e,0xca,0xb0,0x4b,0x70,0x4d,0x18,0x6c,0xd9,0x2e,0x3c,0x3a,0xc7,0xb4,0xe2,0x93,0x6c,0xbd,0x07,0xcb,0x79,0x4e,0xc0,0xcf,0xe9,0x1a,0x97,0x87,0x2f,0xf2,0xb4,0x13,0x76,0xf5,0xf1,0x8f,0x55,0xb8,0x05,},"\x4d\x6c\xd3\xbc\x2f\x86\x26\x6b\x8b\xb1\xb6\x1d\x0e\x1c\xaa\x9b\xd2\xd4\xa1\x80\x36\x1a\xef\x3a\x18\xd3\x90\xb1\x0f\x7e\x86\x0f\x69\x7e\x24\x7e\xb6\xc3\xe5\x1d\x3b\x97\x6b\xf0\xca\x18\x3d\x01\xa6\x98\x80\xf1\x5c\x94\xb8\x75\x66\x8c\xa3\x0d\xad\xa0\x89\x5b\xed\xd4\xd7\x05\xa0\xe0\x33\x04\xd0\x63\xde\xa8\x7c\x7f\xde\xc9\x8b\x89\xc0\x6f\x13\x0d\xd5\xbd\x58\x6b\x54\xd9\xba\x73\x78\x26\xbb\x40\x5c\xd8\xac\x8b\xbc\x95\x00\xac\xda\x3c\x07\x46\x1d\x00\x94\x40\xaf\x0b\x25\x31\xe7\x2f\x3f\xf5\x01\x6a\xe2\xd8\x6d\x69\xb8\x7f\xb2\x73\xd1\xe8\xdd\x5f\x6a\x26\x4b\xee\xbb\x2f\x88\x59\x96\x74\x1f\xfd\xa2\x77\xa0\xfb\xf8\xef\x08\xf8\x1f\x22\xee\x59\x61\xd9\xd3\xfc\x93\x83\x62\xe1\xca\x12\x00\x4a\x91\xd9\xb5\xf7\xa6\x83\x3a\x6c\x22\x95\x5a\xc0\xcd\xa3\x39\x06\x71\x91\x0c\xbd\x51\xe6\x85\xfe\x09\x59\x73\xe4\x15\xfc\x2d\xb8\xad\xf1\x0b\x14\x7e\xc7\x08\x0c\x3b\x8e\xbd\x07\xd2\x1b\xb9\x55\x6d\xa8\x54\x30\xa2\x68\xee\xd8\x48\x6b\x1e\x31\xc9\x43\x13\xb0\x16\x49\xfe\x91\xb2\x22\xf8\x5a\xde\xe1\x5e\xb7\x77\x07\xd7\x8f\xfc\xb6\x60\x92\x65\x44\xd3\x3b\xe9\x99\x4a\x29\x76\x20\xdc\x7a\xed\x97\xf3\x92\x63\x90\x53\xf3\x88\xb0\xb3\xaa\x3b\xd0\xac\x5b\x03\x3c\xb4\x14\xbe\x52\x0b\x43\xdf\x68\x26\xb9\x76\x89\x0d\x0c\x53\xb9\x7b\x6c\x92\xe7\xd1\xa1\x57\x3d\x0c\x74\x94\xd7\x47\xe0\xca\xd9\xbd\x8e\xa5\x38\xd6\x2a\xd5\x98\x01\xad\x07\x16\xf1\x70\x19\x3e\x30\x09\xd9\x95\x9c\x55\xd2\xff\x64\x79\x9b\xd9\x59\x35\x9a\xbb\x94\xca\x97\x23\xb5\xff\xc2\x4c\x95\x07\xf8\xc5\xfd\x6e\x88\xea\xae\x7a\x70\xad\xd8\x4d\x74\x4c\xcf\x8b\x98\x36\x37\x88\xf0\xbf\xb1\xa0\x25\x22\x02\x57\x51\xe5\x34\x71\x0d\x40\xa2\xd3\x8a\x79\x11\x94\xeb\xa2\x93\xfd\x20\x46\xcc\x14\xdd\x38\x76\xd1\x68\xfc\x6e\x23\x6c\xbe\x14\x6d\x63\x69\xd2\x25\xbf\xa6\x7e\x53\x97\x98\x65\xf7\x88\x73\xa9\xfc\xf0\x3c\x18\x6f\xa8\x52\x1f\x0a\x55\x45\xac\xce\xe8\x0d\x1e\x55\x10\x72\x21\xe2\x1f\x0f\x22\x91\xc1\x43\xde\x02\x3e\x88\xd7\x33\x0c\xc8\x7d\x4c\x51\xff\x29\xa3\x09\x06\x05\xe9\x73\x94\x90\xc1\xdc\xee\x71\x34\x95\xf2\x31\xc2\xa3\x6b\x11\xab\x23\x55\x47\xfb\x63\x28\xf7\x47\x33\x6d\x9b\x1e\xf2\x5a\x8a\xb9\x9c\xed\xa9\x57\xb2\xdc\xce\xe4\x07\x5b\x0d\x03\x38\x1b\x94\xae\x18\xd0\x41\xea"}, +{{0xfc,0xff,0xf0,0x93,0x2d,0xc8,0x6e,0xa5,0x90,0x2a,0x8d,0x33,0x07,0x33,0x29,0x96,0x0c,0xd8,0x18,0x8a,0x07,0x5d,0xd0,0xbc,0xdf,0xa8,0x38,0x2c,0x20,0xb0,0xe7,0x8f,},{0x0c,0x92,0x05,0xa9,0x0b,0xbe,0x7f,0x2d,0x50,0x5e,0x17,0xfa,0x3d,0x08,0x0b,0x52,0x2a,0x1d,0x7a,0x15,0x2c,0xad,0x2d,0x85,0xd3,0x1b,0x34,0xa0,0x47,0x1c,0x0d,0x4c,},{0x37,0xdd,0xd8,0x3f,0x98,0xb0,0x57,0xb7,0xcb,0x32,0x08,0xa8,0x32,0xc5,0x8a,0xa9,0x06,0x94,0x56,0x3c,0x23,0x54,0x8d,0x43,0x22,0x91,0x38,0x0b,0x73,0x59,0x13,0x01,0xf2,0x74,0xb0,0x4c,0xee,0x2e,0xf7,0x8c,0x06,0xd9,0x6c,0x3d,0x9b,0x7c,0x17,0x52,0x1a,0xae,0x1a,0x8c,0xa5,0x0d,0x34,0x7c,0x09,0xc3,0xcf,0x70,0x3b,0xc8,0x83,0x0b,},"\x3d\x4b\x76\x12\x23\x73\xe2\x12\xa3\x46\xd1\x9a\x66\xbb\xfc\x4b\x62\x32\x92\x64\x9b\xd0\xce\x5c\xf6\xbb\x13\x56\x48\xbd\x01\xdb\x74\x03\xb3\xd0\xbd\xd1\x69\x7f\xf4\xe6\xe9\x08\x90\x41\x16\x75\x4d\x37\x0c\x40\xd7\x00\xcd\xb6\x64\xc4\x6a\x91\xdd\x84\xa3\x58\xb9\xd2\x38\x14\x43\xe6\x0f\x2c\x3f\x56\x40\x26\x1b\x6b\x85\x8b\xa8\xf8\x28\xb0\x97\x1f\x41\x22\xb2\x02\x88\xa2\x6b\xa2\x09\x0b\xa1\x4f\xd2\x76\x36\x0c\xc6\x86\x79\xcd\x84\x19\xae\x19\xc6\xd4\xdc\x7b\x66\x14\xc0\x6d\xf5\xe5\xc0\x51\x0e\x2c\xb6\x86\xde\x0e\xbd\x75\xe5\x21\x0a\x21\x55\x62\x58\x9b\x28\xc9\xcc\xc7\xd2\x72\xb9\x8b\xd4\xbf\x93\x49\x5e\xfe\x4f\xc5\xb7\x8d\xef\xec\xfb\xca\xa9\xfe\x12\x6b\xad\x30\xe8\x9b\x3a\x38\x9b\x42\x56\xf6\xa4\x8a\x76\xc3\x45\xde\x5a\x36\xa1\x44\x9f\x08\x34\x5b\x9a\x5e\x6a\x00\x1d\xa1\xff\x9c\xd4\x33\x70\x93\x48\xe9\xae\xfb\xc7\x8b\xa5\x2d\x3a\xb3\xb4\x69\x86\x93\x5e\xba\x8e\xcf\x81\xed\xc4\x3c\x5b\x2e\x3b\x5e\xb3\x8d\x9a\x16\x5e\x9e\x7f\x72\xf6\x17\x60\x54\x63\xbe\xdb\xa9\x73\xeb\xfd\xcd\xf2\xb0\x88\x9c\x71\x41\x2f\x8f\x85\x0c\x7a\x3b\x55\x18\xec\xd8\x9d\x2e\x25\xc0\xc1\xc3\x0f\x08\x5a\x0f\xfe\x54\x0e\xf9\xc0\xe8\x8f\xc7\xec\x4a\xf1\x94\x8a\x4e\x6f\x7a\x6e\x25\x6b\x30\x7a\x11\x27\xb7\x1b\xa6\x86\xef\xea\xdc\xa0\xe4\x86\x09\x47\xcf\x67\x4f\xce\xd6\xca\xf7\x31\x0c\xcb\xaa\x8d\x90\x47\xda\xed\x30\xfd\x55\x85\xd4\x1d\xde\xae\x4d\xf2\xfe\xd4\xb6\x22\x80\x32\xc3\xe4\xae\x23\x80\xe8\x7e\xc6\xcd\x72\xe4\xd7\x4b\x8b\x4c\x38\x13\xfb\x04\x33\x89\x39\x1e\x9c\x13\xf7\xd3\x3c\x3a\xab\x5a\x78\xfc\x4c\x6a\x63\x4c\x61\xa7\x0f\x02\xa9\x40\x54\x8d\xa1\x77\xc6\x5d\xf6\xab\x17\xcd\x96\x83\xf3\x7e\xa8\x21\xc7\x40\x88\x9d\x82\xe8\x8c\x83\x4e\x7d\x5d\xc1\x16\x62\xea\x78\xb1\x3c\x6a\x4b\x62\x18\xd3\x17\x84\x21\x9a\x47\x67\x59\x5b\x1a\x56\x21\x65\x25\xcd\x68\x93\x8b\x22\xbd\xb1\xf8\xc5\xa7\xf1\x70\x1a\xfe\xb9\x61\x88\x8e\x2e\x0e\xc0\xc8\x38\xcd\x62\x0c\xb7\xdd\x8a\x14\x93\xa0\x2c\xd5\x6b\x54\x51\x25\xe4\x70\x0c\x08\x89\xfa\x26\x44\xe6\x44\xa3\xaf\x53\x1d\x1c\xd6\xbc\x95\xe5\xdf\x91\x75\xf1\x37\xf2\x84\x08\xcb\x69\x9c\x7a\xe6\x6f\x65\xd1\xd2\x93\x0f\xac\x57\xca\x8a\x60\xe6\x31\x1a\x40\x78\x48\x8c\x9e\xa4\x04\x94\x8a\x9d\xeb\xeb\x9d\x5e\x10"}, +{{0xa1,0xe4,0xfc,0xfd,0xe0,0x44,0xf1,0xbb,0x0e,0x7b,0xbc,0x63,0x1a,0x83,0x1a,0x8d,0x07,0xe9,0x0a,0xe0,0x8a,0x96,0x6a,0xd6,0x27,0xb6,0x20,0xb1,0xe2,0x8c,0x42,0xcf,},{0x25,0x56,0x0f,0x31,0x16,0x8b,0xd4,0xb7,0x25,0x52,0xed,0xed,0xd0,0x8b,0xb6,0xbf,0x79,0xa9,0x40,0x63,0xc1,0xf1,0xe1,0xd3,0x04,0x86,0x9d,0xd1,0xce,0x04,0x9b,0x95,},{0xc8,0x00,0x15,0x27,0xbd,0x90,0x2c,0x15,0xc3,0xdd,0x5a,0xe1,0x81,0x80,0x52,0x5b,0x5e,0x82,0x02,0xbe,0x66,0x71,0x1f,0x82,0x88,0x5c,0x82,0x22,0xa1,0x5f,0x06,0x00,0x92,0xa2,0xa6,0xe2,0xf7,0xd7,0xe9,0x80,0x31,0x12,0x09,0x19,0x1b,0x32,0xb8,0xad,0xe4,0x8d,0x3e,0xa9,0x8c,0xf2,0x45,0xf0,0xfa,0xd6,0x2c,0x00,0x9c,0x5a,0x71,0x08,},"\x8c\x14\x54\xd4\xe0\x8a\x14\x01\x64\x6b\xf7\xa8\x85\x9e\x8a\x14\x5e\x85\xee\xeb\x40\xdb\x38\xff\x01\x69\x70\x96\x41\x21\x2c\x81\xb6\x73\x90\x74\x9c\x01\xa7\x98\x07\xf3\xcc\xad\xbb\xd2\x25\x6f\x36\xff\xc1\x80\xcf\x9b\xa4\x4b\xf4\xa7\x61\x2d\x44\x1c\x23\xb2\xe2\x5d\x33\xc4\x8a\x73\xe1\x6c\xe3\x57\x56\x27\x58\xad\xb0\x05\x53\xc3\x14\x2f\xb8\x17\x6b\x6a\xe8\xfb\x61\x0a\x60\xf9\x23\xb0\x91\x18\x14\xb1\x0f\x56\x79\x93\x6c\x36\x77\xb7\x0e\x84\x6e\x21\x8f\x58\x75\x67\xf2\x01\x9c\x7d\x28\x2a\x10\x7f\x3c\xc8\x47\x63\xad\xae\xc8\x89\x93\xc0\xcc\x50\x03\xe7\x7a\xf6\x0d\x67\xdb\x53\xf8\xcb\x72\x7a\xa6\x67\x2d\xe0\x04\x49\x8c\x3b\x3e\x22\x2a\xa7\x08\x2d\x91\xf9\x8a\x1a\x06\x83\x74\xc5\x10\xff\x53\xa5\xe5\x59\xcb\xe2\xd6\xc7\xc3\x44\x2d\x72\x38\x90\x7c\x81\x1d\x58\xaa\x7f\x5a\x46\xb8\x31\x12\x44\xf0\xdb\xe1\xb9\xc0\xe9\x44\xdd\xa1\xd8\x01\x08\x64\x94\x9c\x59\x39\x6c\x6b\x34\x6a\x11\xf3\xaa\x86\x6d\x6b\xce\xad\xfc\x90\x90\x38\xd2\x2e\xfb\xc8\xf1\xda\xc8\x10\xa9\xf2\xfa\xfc\xce\x7c\x03\x89\xeb\x0a\x56\xc0\xf6\x8c\xae\x24\xae\x3d\xdb\xdf\xf7\x11\x6d\x2f\xad\xeb\x9b\x0e\x75\x09\x53\x6f\xdc\x3b\x83\xe7\x13\x54\xda\x6a\x1a\xed\x16\x88\x74\x90\xdc\x2f\x4d\xf5\x7b\xba\xa7\x24\x45\x28\xfa\x30\x94\xb9\x9e\x86\x75\x81\xac\xef\x90\x62\x70\xb2\xcf\x4d\xed\xa6\xb8\xfd\x9d\xbb\x79\xad\xd7\xbe\xa8\xf8\x6f\xcb\x1f\x64\xdf\xd5\x0e\x38\x5b\x42\x09\xec\x0b\x1a\x9f\x6d\x2e\x51\x90\x68\x29\x7a\x2b\x5c\x40\x5c\x21\x6b\x4a\x2e\xd9\x83\xff\x69\xc5\x9b\x53\x0e\xff\xa6\x0c\x03\x67\x05\x12\x67\xdd\x2b\xbd\x1e\x86\xa9\xab\x5a\x11\x4d\xd4\xf6\x9b\x54\x0b\xfa\xbf\xe9\x7c\x04\x03\xb8\xfc\xbb\x27\x62\x57\x61\xed\xa3\xe2\xad\x8e\x62\x5c\xfe\x4b\x61\x5b\x70\x25\x53\x1a\x49\x89\x18\xc2\x4e\x02\xa0\x0e\x79\x7b\xba\xfd\x14\xf9\xd3\xf6\x82\x7e\x39\x00\x63\xc4\x36\x08\x06\x88\xd0\x37\xa6\xe2\x99\x3c\x56\xd3\xa8\xe9\x5f\x37\x5c\x10\x04\x0b\xf0\x4f\x03\x0c\x97\x26\x23\xd9\xe3\x80\x1c\x13\xb4\xec\x8d\x01\xcf\x18\x38\x55\xf5\x93\x5f\x10\xdd\xb2\xc5\x4c\x51\xc8\x0c\xbe\xd0\xc2\x4d\xb5\x6e\x1e\xd1\x48\x93\x1d\x89\x16\x1c\x5e\xa3\x7c\x2f\x97\x87\xf8\x8e\xf7\x33\x0e\x5d\xcd\x0e\x43\xd8\x1b\xfc\x8b\xf2\x3d\xdf\x79\x83\xcc\x1d\x73\x38\x43\xa3\x3c\xcb\x39\x5d\xfc"}, +{{0xbe,0xd1,0xbb,0xca,0xe1,0x86,0x43,0xd6,0xf6,0xaa,0xc3,0x4f,0x3d,0x9b,0x6a,0x14,0x78,0x39,0x4d,0x02,0xb9,0x31,0xcf,0xf0,0x06,0xd8,0x5f,0x21,0xb7,0xdb,0xc7,0x47,},{0x4f,0x52,0x8b,0x38,0x18,0x5a,0x42,0x4c,0x6f,0xde,0xce,0x46,0x51,0x1a,0x0c,0x29,0xb7,0xc0,0x4b,0x32,0xeb,0x04,0x83,0xab,0xb5,0x2d,0x5f,0x8e,0xb6,0xb3,0x52,0xeb,},{0x0f,0xc9,0x9d,0xd3,0xb9,0xa0,0xe8,0xb1,0xfc,0x6e,0x63,0x5a,0xf5,0xc6,0x40,0x06,0xb6,0x72,0x00,0xfe,0x95,0x8f,0x53,0xcc,0xe1,0xb9,0xb0,0x91,0xa4,0xe7,0x06,0x69,0xb5,0x93,0xf1,0x55,0x94,0xbc,0x08,0x42,0xe5,0x57,0x62,0x59,0xf9,0xa6,0x85,0x9a,0x0d,0xb2,0x2d,0x74,0x0f,0x9f,0x80,0x24,0xb5,0xba,0xf1,0xef,0x6f,0x95,0x8c,0x05,},"\xff\x7c\x64\x13\xe6\x18\xa0\x56\xde\x40\x1e\xe1\x0c\x40\xad\xe3\xd7\xc0\xe6\x86\x14\x95\xd9\x7c\x26\x89\xec\x6a\xbb\x69\xdd\x2a\xe7\x01\xfd\xca\xc8\xf0\x83\x31\xea\x5c\x5f\x5d\x80\x5b\x57\x89\xee\x5e\x24\x1f\xf4\xac\x8b\x96\x0f\x4f\x2b\x9f\xef\x6a\x72\x7f\xad\x86\xdc\xd4\x32\xde\x9f\xad\x6b\xa4\x5e\x00\xaa\x36\x87\xb0\xce\xeb\x2c\x0d\x43\x0b\x7d\x5f\xde\x63\xb4\xf6\xb9\x82\xc4\xf9\xe0\x3c\x43\x0a\xba\xd9\x04\x4d\x06\xdc\x49\xe8\x9d\xf4\x81\x40\x5d\x8f\xeb\xbb\x06\x53\xe9\x68\x69\x48\xaa\xd2\xd9\x07\x25\x44\xdf\x94\x24\xfd\x48\x7f\x4e\x24\xba\x7f\x24\x55\xdd\xec\x41\x05\x82\x8c\x39\x81\xbd\xdb\xb1\xb7\xfb\xdb\xac\x15\x59\x03\xe9\x60\xfc\xd9\x4c\x07\x16\xe7\x36\xf5\x19\x86\x7f\xbc\x52\xc5\x12\x60\xf5\x71\xd7\xed\xcb\x08\x1a\x23\x55\x0a\xd8\xc7\x0b\xb2\x68\x86\x4a\xb2\x76\xaa\x2c\xc2\xdb\xf6\x23\x83\xbb\x66\x03\x0e\xbe\x94\x35\x41\x74\xcc\xec\x2d\x2a\x90\x75\x78\x55\x64\x44\x50\x7c\xbf\x84\x88\xbb\x23\xc6\x24\x23\xa3\xa9\x8d\xa7\xcc\x96\x8f\x59\x9d\x3d\xc8\x4d\xca\x3a\xfa\xd7\xf1\x4e\xc3\x06\xe1\xdb\x53\x41\x43\x21\x6a\xa2\x2a\xd1\x80\x74\xc7\x19\x57\x08\x05\xea\x46\xbc\x86\xb7\x1a\x8f\xf5\x8e\x41\xe7\x3c\xb2\x9a\xd5\x75\x0f\xcf\xc9\xa1\xc5\x42\x92\xb6\x4b\x47\xec\x95\x38\xf5\x38\x16\xe3\x6e\xd0\xd0\xc1\xae\x5e\xad\x06\xd4\x77\xaa\x97\x5e\xce\xba\xf6\x2d\x90\x23\xb7\x7e\x50\xe7\xb6\xd4\xab\xda\xa4\x85\xea\x34\xec\x76\x6b\xeb\x1d\x9b\xa0\x3c\x9c\x06\x71\x86\xe2\xe3\x82\x66\xc6\xe2\x53\x1e\x97\x48\x02\x14\x63\x8a\x2b\xb3\x14\x31\xac\x20\x86\x79\x71\x55\xfc\x77\x5b\x3a\xad\x8d\x5a\x0b\x90\x4c\x38\x1e\xdd\x0c\x6b\xc2\x3c\x66\xa1\x90\x49\x55\xed\x45\x0a\x9c\xbd\x16\x45\x9c\x32\xf5\xca\x35\x4b\xbc\x2d\xa7\xb1\xa4\xd8\x14\xf1\xb8\x71\x0a\xad\xb2\xcc\xc4\xf3\x97\x75\x8b\x7e\x9d\x91\xf3\xa9\x1e\x58\x25\xab\x86\x82\xff\x5e\x41\x70\x2e\x07\x84\x1a\xc7\x69\x8c\x3d\xa9\xf5\x58\xed\xd0\x1f\x86\xce\x2c\x50\x6b\xf4\xc2\x14\x9a\xc9\xc1\x95\xa5\x9c\x7d\xd7\xd4\xec\xf9\x3c\x90\xb4\x42\x3b\x43\x50\x58\x8d\x41\x67\x2c\xed\xc8\x51\x0a\x7a\xd5\x3b\x4b\x7e\xdc\xaf\x23\xe4\x3e\x05\x66\x9d\x27\xa1\xfe\x97\xb7\x87\x30\xd3\xfc\x06\x0b\xd4\xed\xd9\x87\x2c\xff\xb9\x62\x85\x35\x1b\xef\x14\x8e\xf7\x83\xab\x39\x21\x16\xbd\x7b\x90\x7b\xad"}, +{{0xc7,0x18,0x82,0x3f,0x43,0xdb,0x22,0x17,0xc6,0x6a,0xb2,0x89,0x97,0x04,0x16,0x5d,0x20,0x85,0x73,0xde,0x60,0xf3,0x3b,0xc0,0xb9,0x33,0x8d,0x88,0x0f,0x19,0x3f,0xb5,},{0x29,0x40,0xb8,0x79,0xb6,0x3f,0x2c,0xb1,0xf6,0xe3,0xef,0x9c,0x9d,0x33,0x3b,0xa9,0x17,0x70,0xfe,0x18,0xcc,0x5a,0x34,0x7f,0xdf,0x12,0xb0,0xef,0xc5,0xca,0x2e,0xc9,},{0x4c,0x9c,0xdb,0x1a,0xd4,0x65,0x09,0x56,0x0d,0x87,0x1d,0x30,0x89,0xaf,0xb8,0x73,0x46,0x48,0x20,0x1b,0x10,0xac,0xc9,0x53,0xe8,0xb6,0x1f,0x2c,0xce,0x2d,0xba,0xe0,0xfb,0x9b,0x86,0x8a,0xc9,0x57,0x43,0x2b,0x72,0x22,0xdb,0xf7,0xe4,0xcf,0x0b,0xc7,0x53,0x09,0xbe,0xa3,0x60,0xb2,0x63,0xab,0xbd,0xe1,0x88,0x53,0x2d,0xda,0x25,0x04,},"\x05\x0e\x68\x77\xf6\x5e\xc7\x26\xee\xc7\x01\x86\x3f\xab\x14\x0b\x99\x4a\xa1\xe9\x2a\x48\x7d\xb1\xa1\x87\x01\x31\x20\x57\xdb\x44\xbf\xde\x70\x91\x1e\xc2\x6e\xaa\x28\x63\x2d\x03\x79\x4d\x54\x5d\xfc\xb2\xae\xd4\x34\x0c\xab\x7d\x09\x25\x95\xcd\x59\xed\x23\x99\x40\x43\xf5\x0b\xa6\x96\xe9\x80\x2b\xd6\x49\x90\x12\x13\x97\x28\x64\x57\xae\x69\xd7\x6c\xb8\xe3\x4d\x7c\x1a\xb2\x45\xcb\x07\xb1\xb4\x08\xf2\xbb\xbf\xdf\x33\xa1\xbd\xd5\x59\x63\x67\x02\xc9\x18\xf9\x82\xc2\xac\x02\x21\xf7\xf9\x4d\xb9\x1e\xde\xfc\xe2\x81\x18\x25\x9f\x89\xd9\x94\xda\xd5\xbb\x01\x3c\x67\x8c\x1c\x33\x8b\x65\x39\x6b\x15\xe8\x89\x9c\x16\x99\x21\xf2\x78\x85\x9c\xe0\xc8\x56\xd8\x89\xb8\xc6\x34\x18\xeb\xc5\x73\xd2\xd6\x25\xd5\xb5\x93\x88\x39\xf2\xb1\x69\xb6\x91\x6d\x8e\x40\xdd\xe7\x0d\x3b\x72\x88\x7a\xd2\x47\x8e\xf6\xfb\x12\x84\xfa\x0e\x4f\xc5\x24\xe3\xc6\xfa\x1d\xd2\x2b\xa6\xb8\x1d\xef\x82\x79\xf3\x82\xbc\xb4\x50\x48\x85\x1b\x17\xcd\x65\x9d\x59\x40\x9f\x57\x1f\xa8\xa9\x20\xa2\x09\x34\xd9\xdb\xe1\x02\x2d\x63\x58\x40\x96\x54\x00\x24\x0f\x87\x0a\xce\xff\xd5\xdb\x7c\x7d\xf0\x8a\xf8\x9e\x47\xe1\xb9\xe2\x0b\xb9\x9f\x96\xab\x07\x3e\xdf\x53\x69\x4c\x74\x82\x89\x0e\x36\x31\x34\x02\x17\xe6\x87\xab\x27\xc9\x84\xb6\x08\x25\x16\x94\x57\xd4\x35\xa5\x40\x9a\xd8\xe4\x2d\xa0\xaa\x63\xe2\x0c\x2b\xc6\x7b\xd8\xb9\xa2\x67\xf3\x96\x73\xa7\x7f\x7f\x31\x36\xdc\x5c\xb2\xd2\x49\x48\xdb\xe7\xbc\xd7\x12\x93\x18\xc6\x8c\x6f\xe9\x5d\xd4\xdd\x4f\xe9\x42\x28\x68\x31\xea\x53\x35\x2f\xbb\x25\x2a\x12\x88\xbc\xd8\x38\x92\x13\x56\x78\x5d\x07\x21\x34\xcb\x82\x0f\x62\x79\xcc\x71\x46\x1f\x43\x1b\xe9\xd3\x01\x47\x24\x32\x1c\x92\xfd\xc5\x76\x32\x01\x37\x70\x5c\xff\xb2\xc2\x36\x64\xb7\x05\xe9\xbe\x60\xae\x1a\x19\x0f\x3e\x34\x84\xf7\x00\x58\xe7\x02\x40\x7b\x05\x6d\x7f\xe5\xd3\x1c\xee\x9c\x2a\x6a\xc6\xea\xda\x35\x16\xab\xc5\x51\x72\x56\xdf\x12\x43\x78\x0a\x03\xbb\x00\xba\x00\xce\x24\x80\x76\xee\xca\x6f\xee\x91\xd5\xef\x9e\xb9\x07\xb8\x01\xaf\x09\x7f\x3e\x9e\xb2\x56\xbd\xcd\xe8\x1e\xfe\x4b\xaf\x81\x89\xb0\x39\x9e\x36\xf1\xea\xa3\xab\x62\x66\x17\xcf\x3b\x47\xdd\x89\xca\xf6\x9c\x64\xc5\xb8\xf6\x8b\xd9\x17\xfe\x03\xe4\x66\x85\x38\x46\x0a\x1b\xe8\x8d\x9a\x84\x6c\xef\x39\x93\x46\x27\xd4\x74\x73\x4f"}, +{{0x25,0x43,0xd1,0x66,0xc9,0xf5,0xf7,0x42,0x7f,0xf3,0x03,0x4f,0xfa,0x81,0x03,0xcb,0x11,0x7b,0xf4,0x72,0x33,0x1a,0x73,0xd9,0xa2,0xf1,0xbc,0x0a,0x02,0xa6,0xff,0x1b,},{0x42,0x67,0x8c,0xf3,0x85,0x70,0x21,0xaa,0x55,0x67,0x70,0x6d,0xb0,0x31,0xe7,0x92,0x71,0x5c,0xca,0xf8,0xab,0xb0,0x2a,0x04,0x2b,0xad,0x17,0xdb,0x3d,0x5f,0xa1,0x03,},{0x20,0xea,0x93,0x68,0xa2,0xcc,0xd0,0x8b,0xf9,0xcb,0xf4,0x8d,0x4a,0x2f,0x7d,0x03,0xf0,0xdb,0x08,0xa5,0x4b,0x87,0x67,0x9c,0xda,0x03,0xe2,0x96,0xaf,0x9e,0xf3,0x78,0xbe,0x9b,0x8f,0x04,0xb4,0x06,0x5b,0x00,0x9d,0xa6,0xdb,0x01,0x6f,0x3d,0xf9,0xdb,0x64,0x82,0x58,0x73,0xe2,0xfb,0x4d,0xe3,0x04,0x49,0x91,0x5c,0xd7,0x3c,0x46,0x09,},"\x74\x6d\x7a\xbf\x0b\xfb\x26\x62\xc2\x5a\xb5\xc5\xe4\x61\x2c\x30\x6f\x16\xd1\x3e\x44\xd0\xdb\x39\x4a\x00\x15\x67\x6c\xe6\x09\x78\x4f\x03\x23\xda\x1d\xfa\x94\xd2\xb2\xf1\xf6\xe0\x24\x44\xa9\x36\xd0\x19\xb1\x43\x02\x1f\x73\xc7\x9d\xf9\x30\x9e\x7b\xdf\xf3\x9d\xae\xec\x4c\xac\xa0\x0c\xba\x4e\xf3\x1c\x83\x10\xc1\xa0\x8e\xf4\xb3\x6f\x81\xc3\x77\x84\x6b\x5b\x90\xac\xd4\x11\xaa\x67\x1e\xd7\xaf\x27\x8a\x24\x22\x9b\x78\x93\xc1\xb4\x15\xd7\x98\x88\xd7\x63\x7f\x5c\xb5\xc9\xc6\xc6\x31\xae\x5f\xfa\x29\xf1\x34\x0e\x44\x40\x96\xab\x53\x36\x17\xfd\xcb\x80\xff\x81\xda\x0a\x7c\x6c\x14\x2e\xe0\xfe\x5e\xa8\x2f\x68\xcc\x3e\xa3\x8b\x56\xf2\x72\xb0\xd8\x0f\xd5\xf4\xf5\x5c\xa9\x34\x8c\x16\x18\x81\x43\x58\x13\xc3\xfa\x9f\xff\x66\xa2\xee\x6d\x5b\xd3\xed\xba\x0d\x2f\x9a\xa7\x4b\x1c\x44\xbf\xd0\xe6\x46\x78\xd3\x71\x51\x24\x96\x3a\xc5\x75\xff\xb0\x9e\xe1\x64\x37\xda\x48\x4b\x3b\xa5\x8e\x5a\xeb\x8e\xd8\xc5\xc0\xf4\x7b\x59\x90\x8f\xe5\x80\xf3\x7e\xc1\xde\x26\x6b\x29\x5d\x6b\xe8\x5e\x62\x35\x8e\x9b\xbd\xc7\x89\x64\xfb\x83\x7e\xea\x29\xfd\xb7\xde\x86\xcc\x56\xf4\x8b\xd9\xa3\xe6\xe2\xbe\x51\xd8\xa1\xdc\xff\x3c\xa4\xd5\x6e\xa9\x34\xc6\x82\x77\x2b\xca\xfb\x51\x49\x7b\xe5\xd0\xf2\xa2\x3d\xd4\x97\x0c\x02\xc4\x4c\x09\xad\x89\x7b\x42\x41\xac\xd7\xd6\xab\x12\xd8\xf0\x0c\x9a\xad\xc3\x34\xb4\x31\xfe\xc5\xbb\x69\xa2\x85\xb7\x55\x0a\x63\x9e\xce\x96\x95\x26\x82\xb7\x33\x4b\x68\xc6\x51\x52\xe8\x93\xb1\xc8\x10\x0c\x69\x4d\x8c\x5c\xfe\x26\xac\x03\xc1\xf3\x91\x4e\x65\xc8\x4f\x0e\x77\x72\x90\xc7\x6f\x6a\xcc\xe3\x40\xbf\xf6\x6d\xa7\x22\x0f\x73\x17\x5e\x94\xaf\x52\xf9\xf1\x9e\x61\xf8\x0d\xc1\xf3\x57\x16\xb3\xf4\x8d\xfa\x50\x25\xc9\xeb\xef\x73\x82\xe0\x55\x83\x0f\x5b\xbf\x15\xc6\xf6\xa9\x50\x32\x90\x9c\x89\x2c\x0f\x89\xc8\xc1\x5f\xc3\xea\x40\xa2\x0e\xe1\xa4\x52\x9b\x52\x19\x51\xdf\x44\xd9\xd7\x9d\x74\xe0\xc4\xc2\xe0\xfe\xd8\x49\xb8\x78\x52\x06\xdb\xe6\x2b\xfa\x2c\xa2\x10\x87\xa9\x12\xe9\xb1\x84\x55\x16\x59\xcd\x8a\x58\x7e\x95\xb0\x43\x17\x19\x25\x96\xbb\x0b\x7f\xc9\xf7\xbb\xb6\xee\x04\x9c\x8b\x02\xfd\xd7\x58\xb4\xe7\x98\x82\x07\x3b\x71\xea\xab\x18\xaa\x29\x37\x01\xc1\x7d\x55\xf9\xec\x46\xc5\x2d\xe1\xe8\x86\xb6\x75\x0f\xb0\xfb\xcd\x64\xf4\x56\x8a\x21\x0a\xe4\x51\xe9"}, +{{0x85,0xe0,0xa8,0x0f,0x3b,0x30,0xc2,0x01,0x99,0xd9,0xc1,0xec,0x66,0x2e,0x39,0x2f,0xdf,0x15,0x46,0x37,0x73,0x43,0xf1,0x24,0x71,0xdb,0x2a,0x03,0x10,0xa7,0x05,0xbd,},{0x54,0x0a,0x3a,0x1d,0x83,0x67,0x2e,0x49,0x50,0x34,0xcf,0xf4,0x08,0xe1,0xfb,0xe8,0x2e,0x53,0x8f,0x09,0x17,0xe8,0xa1,0xc7,0xd1,0x7a,0xab,0x58,0xe0,0x43,0xd3,0xc6,},{0x18,0x5e,0xf2,0x24,0x6a,0xba,0x2b,0x1a,0x56,0x80,0x32,0xc7,0xdf,0x93,0xc6,0x67,0x79,0x9b,0x8a,0x52,0x1a,0x6f,0x97,0x32,0x1e,0xad,0x58,0x66,0xb4,0xcb,0x9c,0x65,0xb6,0x4a,0x1c,0x40,0xb9,0xb6,0xa9,0x10,0xe7,0x42,0xdc,0x32,0xa7,0xe6,0x6d,0x11,0xea,0x45,0xdb,0xea,0xac,0xae,0x9f,0x09,0x51,0x1b,0x81,0x01,0xf8,0xaf,0x0c,0x0c,},"\xd2\x80\x2f\x15\x96\xf8\x38\x3b\x64\xed\xbd\xc5\x94\x06\x0b\xff\x0e\x70\x13\xd5\xb7\xc8\x5d\x83\x0f\xae\x11\xae\xb3\x4d\xd5\x94\x95\x9d\xa6\x24\xe0\x44\x47\x4c\x54\x09\xc0\x05\x96\x73\xbd\xc6\x1a\x67\x1e\xf5\xb0\xb8\xa2\x6f\x30\x10\x0b\x3b\x73\x96\x8d\x8e\x4d\x83\xa7\x2f\x25\xb5\x13\x44\x8d\x2f\x6b\x6a\x44\x75\xfd\xf8\x9e\x31\xca\x92\x68\xa3\x07\x05\xaf\x3f\x64\x9e\x3f\xe0\x1d\xde\x0c\xf4\xb2\x9e\xc2\xda\x54\x36\x44\x4a\xf0\x91\xd6\x27\x30\xac\xd4\xca\xb6\x08\xf0\xdf\x26\xf0\x88\xc6\xb9\xb9\x67\x37\x94\xf0\x74\x7d\xab\x2c\xe1\x90\xf9\x05\x92\x00\x9f\xdc\xe5\x46\x4b\x36\x61\xb7\xe8\x62\x0b\xad\x65\x50\x9a\x6c\x75\x2b\x72\x7a\x8d\xc8\xd3\xef\xa5\x84\xfd\xe0\x27\x2c\x45\x1d\x65\xa9\x3b\xec\xe4\xf5\x9d\x87\xdc\x6f\xbe\xb4\x51\x40\x1e\x3e\x2e\x00\x3c\x6a\xca\x7b\x3d\x3f\x92\x71\x91\x50\xc6\x77\x8f\x01\x5a\xff\x2a\x59\xbf\xbf\x2e\x91\xb2\x1b\x0a\xd6\x87\x75\x36\xeb\x54\x56\x70\x59\xf5\x87\xf5\x4d\x4e\x2a\x6f\xe1\xfd\xcd\xd6\xa7\xfd\xcb\x85\x15\x57\x5b\xcc\x37\x05\xd7\x78\x59\x35\x2f\xa0\xb0\x44\x16\x6e\x3c\x31\x88\x46\xa5\xdf\x33\x56\x30\x03\xcb\x20\xbc\x94\x2d\x30\x39\x10\x93\xe8\xd5\x83\xe8\xe6\x4d\xec\x57\x0e\xe1\xc4\x13\x87\x62\xf6\x48\x38\x98\xd3\x2e\x20\x32\xbd\xe9\xbb\xe0\x7e\xc2\xc3\xeb\x47\xd9\x68\x76\xf0\xfc\x0f\x02\x4d\x75\x3c\xeb\x34\xff\x84\x80\xb4\xcf\x57\x62\x30\xbb\x82\x63\xdd\x80\xee\xac\x66\x2e\xba\x31\xd8\xa6\x1f\x30\x9e\x17\x5f\x4c\x01\x43\xe2\x8a\x85\x2b\x1c\x30\x61\xce\x78\xef\xbd\x16\xa2\x87\x3d\xd2\x81\x98\xa4\x6e\xc0\xa8\x00\xb3\x0d\xc8\xa9\x3b\x8d\xbb\x81\xa7\x30\xde\x45\x0b\x86\x4d\xea\x76\x80\xe5\x09\xd8\x00\xe8\x23\x29\xc2\x61\xb0\x7e\x72\xaa\x80\xee\x16\xec\x37\x5d\xdb\xbb\x6f\xe3\xd8\xd4\x7b\x0e\x3c\x5a\x9f\x23\xc4\xd2\x0b\x72\x4c\x1d\xf5\x98\x35\xd8\x30\xdd\x22\xd1\x04\x03\xd8\xf1\x5c\x10\x2c\x4b\x37\x69\xc4\x16\x66\xc3\xab\x8c\x7e\x80\xb9\x40\xd0\xbb\xb5\x86\x52\xd1\x0a\x3f\xfe\x8d\x44\xdf\x10\x12\xa3\xdd\xc4\xe1\xc5\x18\xd4\x90\x19\xf7\xc5\xd3\xd9\xf9\x5e\xd9\x3a\x31\x97\x46\xd1\xe5\x43\xff\xa6\x9e\xdb\x49\xbb\x34\x39\xf8\xa3\x25\xac\x6a\x0c\xb4\xed\xd6\x5b\xa6\x00\x80\xa0\x44\x7c\x67\x4f\xaa\x72\xd8\xae\xbd\xb5\xd2\x54\x4f\x2f\x2d\x84\x7c\x72\xc2\xdf\xa6\x05\x7a\x69\x0a\xdc\x5c\x44\x1a"}, +{{0x82,0xa2,0xc6,0x49,0x3f,0x11,0xba,0x80,0xe4,0xb8,0xb3,0xb4,0x38,0x41,0xbe,0x97,0x0e,0x2a,0x10,0xa9,0x4d,0x22,0x49,0xd8,0xac,0x6f,0x54,0x14,0xcf,0x5a,0x3c,0xb5,},{0x4c,0x2e,0xe0,0x1c,0xde,0xa0,0x7d,0xb3,0x63,0x5f,0x5d,0x4c,0x10,0x82,0xb9,0x2f,0x29,0x8d,0xeb,0x17,0xd0,0xf9,0x05,0xdf,0x71,0xb6,0x6f,0xb2,0x27,0x4e,0xae,0x99,},{0x68,0xa9,0x1d,0x4f,0x8d,0x24,0x1c,0x1d,0xef,0xbd,0x5c,0xa9,0xe9,0xe1,0xed,0x82,0x74,0x41,0x95,0x06,0x75,0x1c,0x96,0x79,0x47,0xb1,0x0d,0x50,0x11,0x8b,0xbf,0xab,0xc7,0x65,0xff,0xd7,0xb3,0x1a,0x01,0x67,0xc4,0xfd,0x8b,0x11,0x75,0x33,0x24,0x12,0xdf,0x19,0xd8,0xaa,0x1a,0x90,0x95,0x90,0x86,0x13,0x20,0x92,0x3d,0xbc,0xb2,0x04,},"\x09\x85\x4d\x13\x68\x49\x50\x41\x9e\x0b\xb1\x64\x64\xe0\x99\x88\x90\x5c\x02\x17\x18\x3a\xa1\xe4\x8a\xdb\x14\x7b\xfc\xc2\xeb\x57\xc2\x30\x0b\x0d\xfc\x39\xd4\x89\x66\x55\xa5\x7a\xe2\x04\x15\x40\x8b\xb5\xf2\xc2\x38\x01\x39\x55\xf0\xa4\xfc\x78\x2e\x0c\x99\x3f\xe4\x2c\xb0\x8c\xd8\xcf\x41\x5c\xcb\xd6\xcf\x1c\xee\x2e\x80\x97\xf0\x4e\x8f\x09\xae\x5d\xa5\xf4\x15\xb1\x6c\x2c\xb3\x0c\xb2\xab\x66\x52\xba\x50\xeb\xbc\xae\x4a\x59\xe3\x1f\xe1\x1e\x7e\xf3\x69\x9c\xa9\x0a\xaf\xa5\x86\xbb\x24\x2c\x89\xcd\x2e\x33\x2b\x2b\xfa\x2f\x81\x42\xac\xca\xf4\x36\xf8\x9b\x64\x53\xbb\x48\x05\xa1\xe7\xf3\xab\x62\x70\xf0\xda\xf8\x93\x89\xe7\x17\xd1\xb7\x01\x75\xec\x57\x07\xc8\xf5\x12\xc4\x0a\xb9\x24\xc4\x57\xe9\xf0\x91\x47\x91\x75\x0d\xc2\x92\xbb\x27\xd6\xf6\x3b\xa8\xcc\xf5\x4b\x90\xd3\xeb\xa7\xf1\x9e\xb3\x00\xd9\xeb\x8f\x3b\x72\x03\x2b\xa9\x30\x37\xf5\x52\xb4\x09\xb5\x80\xa5\xf6\x51\x16\xfa\xff\xe0\xfd\xfd\xc6\xdb\x38\x81\x38\x6c\x3c\xbc\x16\xb6\x7e\xb2\x57\x63\xd7\xae\x3a\xac\x0b\x85\xaa\x1e\x9a\xa2\x2e\x49\x59\x60\x9d\x43\x81\xe4\xb6\xd7\x15\x9f\xf3\xe3\xb2\xd3\x7b\x64\x0f\x88\xcf\xbe\x4f\x8a\x77\xf8\x01\x64\x57\x22\x8b\xa6\xd3\xaf\x5c\x4e\x33\x12\x5d\x48\xbc\xfc\xf3\x67\x8c\x16\x3b\x69\x8e\x52\xe8\x56\x17\xab\x1a\x75\xff\x20\xc6\x90\xab\x07\x15\x5e\xe7\x57\x59\x85\x78\x07\x2d\x4a\x09\xdf\xc6\xc6\xc0\x94\xec\x04\x85\x67\xd5\x13\xce\x2b\x18\x34\xe1\x63\xdf\x15\x45\x31\x9d\x80\x61\xe0\xe5\x7f\x58\xef\x04\x1b\x7b\xff\xc4\x96\x6a\xc1\x66\x03\x31\xb9\x7a\xbb\xc9\x7b\xe2\x1a\xe2\xbc\x58\xc6\xc3\x27\x4a\x8a\xda\xd5\xfd\x2c\x3b\xc1\x6b\x92\xe1\xf8\xde\x87\x7b\x6a\x26\xf0\xc6\xab\x71\x62\xe8\xaa\xb9\x3a\xf8\xd8\x59\x18\xc1\x3d\x3e\x23\x5a\x27\x37\x48\xc6\x2f\x0d\x22\xcb\x1c\x93\xe1\x34\xa4\x95\xb1\xb5\xef\x8f\x1a\x11\x34\x51\x2d\x53\xb7\xa2\x11\x26\x31\x77\xf7\xa6\x0b\xdf\x47\x46\x91\xf2\x24\xa3\xb5\xba\xc4\x00\x6d\xb3\x45\xca\x67\x25\xf5\xee\x70\x3e\xca\x0d\xea\x10\xd7\x12\x67\x6f\x63\xef\x3e\x53\x7e\x63\xab\xd2\x60\x8c\xb4\xfb\xe2\x00\xe1\x5f\x18\x20\x91\x53\x49\x60\x72\x90\x80\x44\xc9\x5a\x4e\x9c\x53\x56\xaa\xe8\xed\x5f\x09\x59\xea\xc0\x91\xe2\x27\xa0\xb8\x1f\x58\x03\x27\x6b\x3b\x3b\xf4\xb6\x86\x5a\x55\xfc\x67\x82\xf6\x2e\xa6\xd6\x39\x90\xf9\xbe\xfe\x01"}, +{{0xe5,0x5b,0x34,0x3a,0x0f,0xa1,0xfb,0x74,0x71,0x89,0xcb,0x00,0xdb,0xc3,0xa6,0xaa,0x2d,0xcf,0x5b,0x86,0xe5,0x7d,0x76,0x93,0xf3,0x07,0x42,0x03,0x89,0x76,0x11,0x53,},{0x23,0xa1,0x44,0x60,0xea,0x98,0x3c,0xf9,0x97,0xc7,0x82,0xeb,0x45,0x82,0xab,0x3c,0x8a,0xa6,0xdd,0xe5,0x33,0x25,0xb9,0x77,0xb7,0x8e,0x33,0xd2,0xdc,0x5f,0x27,0xaa,},{0x07,0x26,0x6c,0x18,0x65,0x0e,0xcf,0x06,0x32,0xe2,0x25,0x62,0x4e,0xc4,0xc9,0x7f,0xc3,0x87,0xdc,0x37,0x46,0x87,0xa6,0x19,0x56,0xdc,0xcc,0xe7,0x28,0x94,0xee,0x13,0x8a,0xab,0xc8,0x0c,0xfc,0x90,0xc9,0xee,0xa6,0xdd,0x4c,0x59,0xaf,0x45,0x02,0xee,0x29,0x63,0x5a,0x92,0x88,0x07,0x86,0x67,0x8b,0x14,0xa3,0x93,0x1a,0x69,0xf9,0x07,},"\x36\x28\x9b\x5e\xaf\xf2\xa8\x5a\x7c\x6d\x57\x5b\xd1\x5e\xa5\x94\xb2\xfd\x85\x10\x87\x4a\x46\x9b\x52\x10\x91\x63\x69\x6d\x85\xb6\x8c\x5b\x21\x1d\x29\x64\xef\xdc\x66\xe6\x25\xab\xe8\xaa\xfe\x4c\xd9\x22\x0c\xdb\x34\x11\x07\xff\xa8\x27\x6e\xd4\xb3\x70\xfe\x37\x6c\x14\x82\x68\x71\x67\xdb\xc8\xf7\xb2\x05\xa3\xf3\x30\x1a\x16\x64\xd9\x07\x28\x77\xd9\xf9\x8b\x8f\x69\x83\x13\x01\xdf\x99\x94\x71\x7f\xc8\x89\x69\x24\x23\x91\xd9\xb0\x51\x7d\x6e\xfb\x27\x17\x01\xea\xb3\xf4\xa9\xb1\x20\x42\x13\xe8\xcd\x13\xf9\xd0\x99\x04\x8b\x82\x07\x56\x2f\x2e\x4e\xbc\x65\x3c\xc6\x5e\x9d\x55\x12\xd6\x5b\x41\x02\x2c\x79\xb4\xeb\x37\x29\x87\x69\xae\xaa\x6e\xfe\xd6\x9e\x9a\x8c\xb4\x45\xc7\x01\x22\x74\xde\x62\xf5\x09\xf4\xe4\x81\x4a\xdc\xbf\x44\x53\xb4\xfa\xb8\x5d\x7c\x8f\xd8\x45\xe0\x08\x30\xef\x5b\x7b\x1e\x63\xc6\x76\x13\x98\x4c\xae\xfe\x91\x5a\x54\x8e\x18\xe5\x05\x62\x2c\xb2\xb3\x92\x99\xf4\x27\xf4\xd8\x39\x83\xba\x2a\xa0\x0d\x53\xbe\xe1\xf5\x9a\xec\x83\x18\xc5\xea\x34\x5d\x29\x42\x52\x36\x97\x92\x76\x2a\xdd\x3e\x56\xfc\xfa\x6e\x77\x97\xf0\x28\xc7\x99\x47\x90\x45\xed\xb2\xe2\x05\xeb\x6d\xd6\xca\x04\xee\xe5\x6f\x94\x96\xd2\xbf\x26\x09\x93\x57\xc9\x73\x83\x5b\x99\x36\x02\x49\x11\xe4\x65\x5d\x3e\x22\xc8\x11\xc8\xd4\xdb\xd1\xb0\x4f\x78\x97\x3f\x07\x75\x23\xa3\x89\xb6\xf2\x8f\x6f\x54\x21\x61\x42\xcb\x93\xe3\x3d\x72\xb4\xa5\x05\x2d\x27\xe4\x91\x1e\x41\xe6\xce\xc7\xbe\xbe\x1b\x0a\x51\x13\xe6\xb7\x0b\x47\x9d\x2a\xbe\xed\xf6\x9b\x75\x64\xe5\xa5\x73\xb3\x52\xd1\x6c\xec\x89\x07\x01\xbb\x38\x3d\x3f\x66\x56\xed\xa0\x89\x2f\x8c\xcc\x70\x94\x0f\x62\xdb\xe5\x28\xa6\x5e\x31\xac\x53\x88\x26\xc1\x38\xac\x66\x52\x4e\x33\x16\x37\xba\x2d\x37\x73\x03\x58\xe6\xc7\x32\xcf\xf8\xfe\xe9\x40\xaf\xd2\x2c\x39\xae\x38\x1e\x5d\x88\x26\x73\x9b\x23\xfd\xc1\xb8\x0a\xea\x5a\x62\xa2\xcf\x0f\xf1\x52\x5e\x44\x6c\xf3\x10\x46\x19\x50\x51\xd5\x85\x03\xee\xd1\xbe\xfd\x79\x3e\xea\xe1\xd5\xd1\xb6\x2a\x5c\x98\x45\x15\x7a\x09\x5c\xdc\x08\xa1\xd7\x7b\xa4\x7e\x84\xa5\xa7\x39\x98\x0f\x0f\x5b\xe7\xaa\xec\x9a\x21\x5b\x20\x4b\x4b\xb7\xcb\x1b\x38\x6d\xed\x58\xd7\xaa\xf7\x28\x53\x41\x90\x7c\x63\x33\x6e\xe3\xe6\xef\x07\x7a\xd1\x11\xb9\x74\xe7\x50\x4b\xd9\x89\xf5\x66\xfd\xa1\xb1\xb5\x9a\xba\xa9\x1c\x78\xbb\x40"}, +{{0x39,0x73,0x03,0x8f,0xa2,0xef,0x6a,0x27,0x8d,0x3c,0x1c,0xff,0x9a,0x22,0x56,0x69,0xe4,0x65,0xa6,0x9d,0x07,0x50,0x50,0x3d,0xe7,0x48,0xc0,0x02,0xdb,0xf9,0x27,0x8a,},{0xc7,0x5e,0x77,0xc7,0x81,0x49,0xd9,0xd2,0xdb,0xc2,0x63,0xdd,0xf8,0xac,0x4d,0x65,0x4d,0x1f,0xf4,0x55,0xcb,0x18,0x97,0xe1,0xc3,0xce,0x31,0xb9,0x4c,0xfe,0x32,0x10,},{0xfc,0x0c,0x54,0x53,0x83,0x9e,0xa9,0x92,0x96,0xff,0xfa,0x50,0x1d,0x58,0x36,0x66,0x28,0xdf,0x89,0xf6,0x16,0x76,0x69,0x42,0xd5,0x04,0x0a,0x05,0x60,0x56,0xda,0xb1,0x8b,0x44,0x05,0xc0,0x4a,0xbf,0x90,0x59,0xc3,0x08,0x68,0xd7,0x9c,0x93,0x6c,0xcc,0xc8,0x4c,0x4f,0xbd,0x6f,0xd3,0x0b,0x60,0xf8,0xbc,0xbd,0x7a,0x66,0x40,0x42,0x02,},"\x33\x92\xe0\x2f\x3c\x84\x66\x1e\xaf\x81\xa5\xff\x04\x35\x7f\x21\x2e\x92\x36\x1c\x5c\x22\x07\x39\xd9\x6b\x4d\x3d\x9c\x22\xd1\x8d\xf4\x8b\xe6\xb5\x51\x26\xf5\x81\x60\x1f\xfe\x0d\xa6\x3f\x38\xe1\x9c\xbb\x12\x72\x6c\xa0\xa6\xaa\x32\x55\x67\xa0\x03\xa7\x84\x9d\x06\x78\x39\x92\xeb\x9e\xb9\x28\x53\x29\x7d\x72\x28\xdb\xa9\x80\xb2\x50\xbb\x11\x0f\x63\xd0\xb8\x46\x70\xe5\xec\xb3\x19\xcb\xfd\x61\x27\x8f\x1f\x4c\xab\xf1\xfc\xb3\xf7\x01\xf1\x2f\x6e\xf8\xd3\xcc\x42\x82\xfc\xbe\x58\x9e\xb5\x65\x95\x03\xa2\xdd\xd8\xbb\xa3\x8e\x5e\xff\x09\x2d\xfa\xf5\x39\xfd\x80\x4f\x21\xf7\x3a\x90\xad\xf5\x69\xa0\x0b\xf9\xd2\x5a\x9a\xd3\xa6\x33\x09\xcc\x60\x93\x14\x24\x71\xa4\x78\xf0\xb8\x99\x22\x86\xde\x02\x3c\x68\xef\xd4\x99\x87\xec\x27\x0b\xd9\x46\xf6\xdb\x48\xf6\x84\xf1\xc2\xad\xee\xe2\x6d\x68\xdc\xe9\x5a\x55\xe4\xcb\x27\xbc\x60\x52\x30\x80\xdf\x6b\xa2\xb1\x99\x99\x6b\x1f\x1d\xa6\x92\x0d\x15\x59\xf7\x9b\xfd\xe9\xfa\x1a\x02\xde\xae\x14\x80\xc7\x6f\x94\x7f\x9d\x21\x3f\xc4\x3b\xb2\x88\x0a\x1b\x4d\x03\xbb\x14\xf5\xb0\x44\xa0\xfd\x83\xce\x04\x92\xf4\x9c\xa3\xaf\x25\x21\x1b\x86\xfa\xa5\x73\x5a\xd7\xfe\xaf\x31\xa1\xa7\x49\x1e\x70\x8b\x41\x82\x9d\x68\xe3\x24\x14\xf6\x83\x52\xb7\x1d\x1c\xd2\x3c\x8e\x12\xfb\x02\xda\x71\x14\x84\xf6\xef\x97\x52\x8a\x00\xd2\x4f\xcf\x91\xd4\xe0\x6e\x9b\xad\xae\x9a\x44\xdb\xdb\x3f\x77\x80\x41\x76\x8d\x86\x37\x04\xd7\x36\x81\x04\x00\xe7\xf2\x93\x1e\xfb\x85\xc8\x72\x4a\x59\x34\x26\xaa\x2a\xf1\xec\x5b\x66\x4f\x85\xc2\x25\x48\x96\xfd\xcf\x31\x6d\xb0\x92\x4e\x11\xaa\xe8\xd6\x83\xe9\xa0\x21\x92\x9d\x0a\x9d\x6f\xec\xb4\x59\x4b\x1b\x3f\xbc\x16\xb1\x76\xd2\x9d\x1e\xfb\x18\x19\xa4\xa4\x23\xfb\xe0\xca\x05\x59\xc5\x7e\x9e\x54\x49\xf1\x4b\xce\x91\x36\x0d\xaf\xda\x6a\x42\x7c\xe4\xa0\x99\x3d\xd0\x30\x82\xdd\xee\x06\x65\x33\xf6\xd3\xbd\xa5\x66\x0f\x42\xfd\x77\x57\x69\x0d\x67\x05\x98\xec\x70\x96\xf4\x75\xa0\x1a\x51\x99\x50\x34\x1a\x83\x1f\xc9\xa2\x81\xc0\x94\x7a\x86\x3f\x1f\x6e\x03\xbb\xa7\x74\xde\x77\xad\xc2\x3f\xbe\x52\x5c\xae\x6c\xcc\xe4\x7a\x0e\xc4\x97\x9e\x8b\xec\x86\xf3\x32\xfc\x6a\x57\x36\xe3\xb9\x8f\xb3\x32\xe9\xe8\x24\x4e\x68\xa1\x00\x45\x5e\x64\x99\xba\x8d\xba\xe9\x8b\x92\xba\x3d\x9c\x6b\x4f\xf9\x80\x34\x3e\x4c\x8e\xf4\xd5\xa4\xaa\xcf\x8b\x1a"}, +{{0xc7,0x1c,0xc1,0x0a,0xd2,0xd4,0x43,0xe0,0x25,0xad,0x06,0x25,0x68,0x6b,0x12,0x35,0x03,0xe5,0x90,0x19,0x3a,0x2b,0xc8,0xcc,0x57,0xa7,0xb9,0xb4,0x15,0x8d,0xe6,0xcb,},{0xfc,0x06,0xac,0xaa,0xb5,0x3a,0xd0,0x8e,0x97,0x62,0xdd,0x11,0xcd,0x21,0x22,0xb3,0x15,0x99,0xbd,0x25,0x98,0xce,0x6f,0x24,0x87,0x95,0xe7,0x32,0x21,0x9c,0x2f,0xc7,},{0x2e,0xb3,0x3b,0xc2,0xd5,0xde,0xb7,0xf3,0xa2,0xdc,0xc3,0x77,0xb0,0xc6,0xa8,0x62,0x13,0x4b,0xf3,0x19,0x1e,0xc4,0x0f,0xc1,0x28,0xac,0x28,0xab,0xf2,0x31,0x6e,0xf1,0x40,0x16,0x49,0xb8,0xf4,0xcf,0xa1,0xa9,0x36,0xde,0x79,0xb5,0x32,0xdc,0x04,0x3b,0x6d,0x36,0x02,0x4b,0x4c,0x37,0xbb,0xa2,0x92,0x90,0xac,0x9f,0x44,0x9b,0xa6,0x0d,},"\x2e\x08\x46\x53\x6d\xc6\xcc\xe1\x9c\xcf\x82\xdc\x2d\x0c\xd2\x1b\xd4\xe1\xca\x7b\xc3\x17\x06\x7a\xf8\xd9\x0e\xe4\x81\x8c\x85\x18\xbc\x3e\xf9\x60\xce\x11\x2a\x41\xd2\xb9\x97\x9a\x28\x2a\xe1\x3d\x70\x6a\x00\x5e\x00\x34\xf0\x6b\x39\xff\x4b\x0a\x5a\xfa\xed\x70\xb5\x61\xbc\xce\xb1\xbb\xd2\xec\x19\xf9\x74\x48\xea\xed\x4b\xe6\x20\xe3\x6a\x96\x2d\x87\x8c\x6f\x80\x17\x2b\x9f\xad\x43\xee\xd0\x7f\xf9\x3d\xb9\xb9\xca\x22\x62\xd5\xa3\xc2\x29\xc5\x4e\x30\xa4\x5e\x73\x66\x08\x92\xf0\x48\xe3\x63\xf3\x71\x44\xed\x19\x21\xf7\x29\x92\xb4\xd0\x15\x29\x87\x0c\xfe\x37\x3b\x7e\x7c\xbe\xda\xf9\x69\x26\x9f\xb7\x0a\xa7\x83\xd1\xe7\x44\x17\xc7\xba\xe0\xfe\x03\xd9\x51\xfd\xb8\xc7\x1c\x62\xe9\xbe\x7f\xdd\x5d\x23\x3e\x39\xf4\x6f\xed\x05\x7e\x49\xb6\xf3\x40\x68\x45\x91\x48\xda\x3d\x42\x41\x61\xad\x2c\x86\x95\x08\x60\x2e\x9c\x0b\xb3\x0b\xfb\x88\xac\xd5\xf4\xdf\xdf\xfd\x47\x35\x03\xcd\xfe\xda\xbc\x44\x42\xb7\x43\xbe\x07\x5e\x7c\x6f\x61\x0e\x64\xff\xc2\xe5\x31\x87\x74\x5c\xd7\x19\x65\x8f\xc6\xe6\x2a\x5b\xe5\x18\x43\x7c\x5b\xd6\xa4\xfe\xba\x94\xae\x3f\x44\xf2\xf2\x93\x08\xe8\x31\xfe\xef\xed\x67\x69\x09\xce\x5e\x80\xc8\x4c\xbd\xca\xc4\x7e\x47\xd2\x7c\x97\x12\xa0\x1f\x6b\xc5\xda\xed\xc0\x2e\x64\x14\x40\x7e\x91\x1c\x0a\x5a\x53\xe5\x32\x8a\x5a\x5f\xd9\xf0\x40\xaa\x7f\xb7\x0b\x79\xb3\x1c\xd1\xb6\xfd\x9b\xd5\x02\x90\x40\xbd\x22\xae\x22\x2f\xd2\xf6\x87\x0d\x07\xf4\x35\x32\x26\x39\xcf\x31\x93\xca\x57\x09\xb8\x82\xb0\x7a\x58\xf9\x52\xa9\x96\x3e\x56\x8f\x8c\x5a\x58\x4a\x6b\x9e\x27\x5c\x5c\x07\x95\x7a\x4d\x2c\xda\xa9\xf1\xeb\x44\x4e\xd1\x22\x4b\xac\x65\x63\xb2\xf9\x27\x3e\x80\x30\x1d\x44\xd5\x0a\xe3\x83\xb5\x97\x21\x3b\x00\xda\x5b\xf2\x7e\x5d\x1f\xe2\x40\xcc\x3b\xb6\x5a\xa5\x03\x0d\x65\x1b\x6b\x5b\x31\x76\x1d\x53\xce\x0c\x6d\x74\xa1\x5d\xad\x54\x79\xf3\x1c\x91\x5c\xcf\x44\x66\x59\x85\x3b\x89\xa5\x1a\x28\xee\x89\x76\x85\x35\x53\xfd\x2e\x02\xfe\x72\x43\x53\x8d\x00\xb4\xed\x07\xd8\xb8\xa8\x0b\x5c\x16\x5c\xd4\x63\x41\xff\xd8\x16\x3c\x55\x57\x02\x66\x3a\x4e\x6a\xb2\x95\x2b\x7e\x74\x43\xd0\xf6\xb1\x23\xb6\x94\x67\x21\xaa\x63\xe8\x7b\x11\x55\xec\xa8\xa6\xa1\xbc\x9f\xd2\x5c\x67\x62\xe5\x27\x42\xc8\x6b\xca\x1b\xa9\xd8\x37\x04\x15\x24\x4f\x0e\xdf\xdb\xe0\x93\x2b\x5c\xa0\x61\x15\x09\xc9"}, +{{0x0a,0x4f,0x5e,0x16,0x70,0xf1,0xe2,0x4b,0xfa,0x37,0xb7,0x3c,0x99,0x43,0x30,0xb3,0x6e,0x7d,0xaa,0xf9,0x30,0x16,0x1b,0x78,0xa4,0xa8,0x48,0x66,0xff,0x25,0xe3,0xd5,},{0x9d,0xcb,0xba,0x90,0x39,0x81,0x59,0x4c,0x7b,0x67,0x7e,0xa8,0x00,0x20,0x01,0xd6,0x64,0xcf,0xf7,0xce,0x8e,0x5c,0xfa,0xe5,0x88,0x40,0xcf,0x74,0xaf,0xf0,0xd3,0xa9,},{0xdc,0xf3,0x53,0xb2,0xb9,0x9a,0x4e,0xf4,0x5f,0x3f,0xdf,0x65,0x28,0x63,0x2e,0x8a,0xbd,0xc4,0x33,0x34,0x24,0x76,0xa8,0xc2,0xb3,0x79,0x00,0x40,0x4a,0x4e,0x33,0x3d,0x38,0x78,0x14,0x23,0x57,0x57,0xef,0x7a,0xd0,0x38,0x58,0xa0,0xf3,0x5d,0x46,0x15,0xe8,0xab,0xa4,0x84,0xfd,0x64,0xf1,0x11,0x2e,0xc1,0xb1,0xae,0xd2,0xcb,0x64,0x0e,},"\xf4\xb0\x5b\x3e\xfd\xcb\x1d\x5c\x07\xda\x95\x0c\x46\x56\x55\x28\x44\x0b\xb4\x88\x35\xee\x4c\x13\xf4\x3d\x7a\x16\x18\xde\x11\x9e\xbb\xb2\x59\xea\x74\x80\xa5\x04\x81\x74\xfa\xec\xc1\x05\x5b\x32\xdc\x01\xac\x71\x56\x34\x43\x21\xe8\xeb\xa6\x98\xf3\x02\xee\x16\x43\xb5\xf0\x4b\x8e\x7e\xcc\xa6\x3b\x91\x56\x1c\xe3\x51\x4a\xbe\x78\x51\xb6\xfb\x17\xfc\x94\x3b\xdc\x94\xda\x30\x8c\x8e\x47\x69\xfe\xc2\x0f\xad\xf4\xfa\x8e\x7f\x62\xb6\xff\xb5\xf1\x70\xd6\x44\xed\x29\x35\x5e\xbd\x22\xcb\x3a\xa1\x48\x6b\x1e\x36\x7c\x72\x9d\xd3\xf7\x9b\xcd\x40\xff\xd0\x8a\xf2\x8c\xeb\xc8\xd7\x76\xe1\xa4\x83\xe9\x11\xd7\x9b\xc6\x13\xe0\x9c\xc6\x21\xca\xde\xb0\x34\xdd\x6f\x72\x37\x47\x71\x98\x51\x27\xf7\xa3\xa1\xaa\x78\x6a\x52\x3a\xe6\xe3\x4e\xe4\x33\xdc\x30\xc3\x75\x98\x7c\xff\x50\xbd\xcb\xc9\x97\xfc\xd5\x1c\x94\x56\x7a\x67\xae\xfb\x6e\xf5\xed\xf9\xbd\xd6\x59\x64\xd4\x64\xbe\x9e\xbd\xfb\x88\xc0\xe2\x31\xb0\x7f\xf6\x40\x5c\x00\xf8\x25\x31\xe9\x61\xbf\xc5\xea\xd2\x66\xbc\xc0\x87\x18\x87\x8c\xaf\xb1\xd3\x75\x36\xf1\x83\xe4\x8b\xf3\x8d\x3f\x6b\xe9\x00\x25\x2d\x1f\xb4\x19\xe6\xa2\xac\x58\x96\x03\x9f\x63\xc3\x14\x01\xff\xf9\x32\xce\x98\x14\xb0\x85\xab\x20\x41\x69\x72\xa2\xb3\x51\xc8\x15\xa6\x2d\xe5\x09\x67\x46\x28\xb0\xd3\x56\x6f\xc9\xc2\xe0\xa9\x23\x7b\x93\xf9\xbb\xb2\xde\xed\xf0\x2b\xff\x83\xbf\x6d\x86\x8b\x63\x99\x32\x6d\x48\x09\xd0\x41\x9f\x31\xb2\xf3\xa4\x81\x28\x5b\x94\x07\x8b\x47\x06\x1c\xe9\x1d\xad\x58\x3d\xd5\xb1\x3b\xd0\x10\xfb\x30\xf2\x49\x5b\xb7\x04\x20\x18\x3a\x93\x01\x59\xe4\xdb\x19\x3d\xf6\xac\xd1\x24\x42\x3e\x03\x9a\x67\xf1\x56\x88\xae\xc5\x0c\x59\x27\xfb\x27\x18\x22\xaa\xa6\x6f\x29\x4b\xc8\x05\xd3\xbc\x7c\x83\x41\x87\x8a\x54\x10\x09\xf3\x0d\xa9\x9f\xcc\x00\x85\x07\x9c\xe7\xfc\x55\xe0\x01\x16\x85\x56\x2a\xbd\xb3\xa9\x47\x1f\xfd\xe6\x17\x63\x00\xef\x5b\x31\xe0\xdf\x60\x9a\x54\xa1\xee\x66\x24\x07\x0d\xa9\x9c\x87\x76\x89\x1f\xdf\x6a\xa7\x8b\x4d\x55\xb1\xf5\xda\xdf\xc0\x61\xad\xd5\xaf\x00\xfd\x3a\xde\xdb\x44\x8c\x55\x9b\xff\xf2\x04\x06\x80\x43\xa5\xd1\xd6\x21\x47\x48\x62\x8c\x3e\xbc\x5f\x02\x24\x32\x6c\xa1\x8e\xf0\x48\x42\x5d\xa9\x30\x01\x33\xfb\x69\x5d\x4f\x26\x31\x65\xac\x22\xf3\x61\x9d\x40\x5a\xf2\x71\xa7\x1a\x9a\xfb\x19\x8b\xf6\x31\x24\x1d\x34\x59\xb9\x53\x98"}, +{{0xb8,0x55,0xc8,0x18,0x05,0xc7,0x08,0x74,0x10,0xe6,0x9f,0x96,0xb0,0x24,0x02,0x71,0xdc,0x76,0xc1,0xe4,0xad,0xe3,0x8c,0x6a,0x92,0x78,0xe3,0xc9,0x4f,0xbe,0xa2,0x56,},{0x6a,0xdb,0x02,0x5a,0x40,0x26,0x0f,0x56,0x98,0x84,0xb8,0xca,0xb3,0x75,0x2b,0x4f,0x25,0x5c,0x37,0x3e,0x2b,0x42,0x4b,0x62,0x87,0xeb,0xb5,0x10,0xfa,0x06,0xff,0xf0,},{0x3c,0xaa,0x81,0x32,0x73,0xe7,0x53,0x54,0x2f,0xfb,0xfe,0xb2,0x1b,0xc3,0xe2,0xcf,0x8c,0xa7,0xd9,0x20,0xfa,0xac,0x7c,0x49,0xdc,0x2a,0xa9,0x91,0x17,0x68,0xc7,0xad,0x43,0xb3,0x8b,0x02,0x36,0xdb,0x27,0xf3,0xee,0xae,0x0b,0x12,0x06,0x00,0x1e,0x66,0x5a,0x60,0x70,0x78,0xc5,0x22,0xed,0x7a,0x9d,0xc4,0x68,0x85,0x34,0x63,0x59,0x00,},"\x85\xa9\xbd\xb7\x0a\x6c\x75\x28\x97\xe4\x3a\x91\x10\x6e\xe9\xa9\x9c\x2c\xa9\x4f\xf7\xb4\x46\x1a\x44\xa3\x91\x74\xc1\x7e\xcd\x99\xdf\x46\xee\xcd\x81\xc3\xf5\x25\x13\xdc\x9d\x54\x7d\xad\x37\x21\xc6\xd5\xee\x1f\x8f\xac\x0b\xa5\xaf\xb3\x68\x70\x44\x73\x9e\xd5\x35\xb8\x44\x00\x87\x04\xc0\x9f\xe1\xe5\xd7\x85\xd4\xc9\xc3\xd0\xb0\x58\x89\xb9\xc2\x0f\xc3\xfd\x68\xdf\x12\xdb\xeb\x2c\x34\xf6\xf7\xec\x1c\x6f\xb7\xfa\x81\x1f\xf8\x46\xb5\xa6\x1f\xa5\xfe\x55\x37\x9e\xe6\x3a\xbc\xd3\x73\xfe\xd0\x02\x54\xeb\xd0\x6b\xc8\xb2\x2f\x7f\xbf\x2f\x72\x7a\x5f\xad\x88\x51\x41\x59\xe2\x6d\x78\xdf\xdb\x09\x57\xf6\xef\xaf\x51\xa8\xe8\x0b\x58\x5e\x83\x8b\x96\x21\xd0\x51\x07\x4a\x4f\x58\x67\xb4\xae\x2f\x2f\xf6\xd6\x2b\x85\xbc\xce\xc0\xb4\xaa\xa4\x79\x16\x37\x38\x8c\x09\x01\xfd\x49\xdc\xcc\xce\x72\x04\x85\x9f\x81\xee\xfc\x63\x9f\xed\x92\x28\x04\x56\xe6\x9a\x15\x09\xb4\xb1\xbd\x76\x24\x44\x7d\x86\x2c\x45\xa0\xc8\xb0\xc5\xbb\x2c\x4c\xa5\x12\xcb\xc0\x37\xf5\x1b\x78\x09\x82\xb1\x83\xa5\xca\xfa\x15\x29\x75\x85\xc9\x47\xa2\x5b\xe8\xc2\x24\x0e\xbf\xb6\x86\x8e\xce\x5e\xa2\xaa\xb2\xc2\x39\xc8\x37\x54\xc7\xd5\x94\xb3\x72\x5a\xce\xef\x34\x4b\xa7\xe6\xae\xf4\x9f\x7f\x31\x3b\x0a\xe8\x2c\xca\xca\xd3\x87\xa6\xe9\x33\x7f\x05\xf8\xc7\x99\xef\xe7\x82\x9b\x27\xb4\xd5\xb2\x01\xfd\x5a\xe5\x83\x43\x51\x69\x07\x59\xf3\xea\x17\x5f\xd4\x74\x1b\xe2\x28\xd8\x07\xfb\x54\xdf\x4a\x74\x10\x38\xfa\xee\x47\xed\xf1\xf5\x61\x65\x25\x98\x60\x1f\x27\x15\x5f\xc5\x0d\x9d\x50\x11\x43\x37\x11\xc1\x06\xd4\xb6\x07\x85\xa5\xcc\x93\xb3\xfd\xd1\xda\xd7\x0c\x0c\x8e\xaa\x33\xf1\x51\x2e\x35\xa5\x41\x74\x5e\x37\x6c\x15\x16\x7f\xa8\xf6\xb3\xb2\xc4\xc3\xa3\x66\xfc\x41\x49\x7d\x29\x73\x57\x81\x6a\xe7\x95\xa8\x04\xc9\x80\xe7\xcb\xfb\x0c\x74\xd8\x83\x5d\x92\x9a\xe3\xbb\x52\xba\xb1\x29\x64\x56\x6d\x74\x6b\xd2\xc1\xd1\x32\xb6\x23\x3f\xa3\x4f\x75\xe2\x68\xed\xee\x77\x5e\xb3\xce\x13\x2e\x6b\xeb\x2e\x8d\x71\xf0\xc8\x76\x29\x91\xcd\xe4\xe2\x6f\x71\x43\x9d\xfa\x83\x97\x8f\x99\x56\x03\x86\x1b\xc0\xb1\xd9\x06\x0b\xbc\xca\xcc\xf8\x6f\x87\x45\xad\x96\x99\x4d\x5d\x00\x7d\x52\xe8\x3a\xa5\xe6\x94\x12\x96\x4b\xdb\xfb\xe4\x78\x0a\xaa\x8d\xe4\x1b\xe1\x29\x8a\xbb\xe9\x89\x4c\x0d\x57\xe9\x7f\xca\xcc\x2f\x9b\xbd\x63\x15\xd3\xfc\xd0\xea\xf8\x2a"}, +{{0x95,0xb9,0xc8,0xa6,0xef,0x80,0xeb,0xd5,0xcb,0xd4,0x7a,0x04,0xca,0x54,0x38,0x73,0x73,0xdf,0x4d,0x67,0xa2,0xb4,0x75,0x59,0x77,0x65,0xac,0x89,0xfc,0xf9,0x3e,0x93,},{0xf2,0xc9,0x47,0xb1,0x8a,0xdc,0x3e,0xa6,0xa2,0x3f,0x7a,0xbc,0xa3,0x64,0xb9,0x85,0x3a,0xe8,0x5a,0x2b,0x0c,0x8c,0x26,0xf0,0xd3,0x17,0x3c,0x27,0x32,0xc3,0xc7,0xff,},{0x2c,0x8b,0xf5,0x43,0xe2,0xa3,0xe0,0x04,0x15,0xee,0x4f,0x10,0x7b,0x2f,0x5a,0x66,0x87,0x17,0x6f,0x5d,0x52,0x11,0x17,0x75,0x9c,0xeb,0x56,0x17,0x51,0xbc,0xc7,0x7d,0x9b,0x08,0xa6,0xa6,0x31,0xf6,0x44,0x7c,0xd9,0x01,0xde,0x96,0x69,0x9a,0xeb,0xb1,0x68,0xbf,0x97,0x50,0x0d,0xc5,0x4a,0x05,0x43,0xef,0x14,0xe4,0xb5,0xa0,0x81,0x06,},"\x78\x55\xbc\x39\x26\x30\xcc\xf5\x31\xd3\x06\x16\x06\xdd\xfc\x81\xa0\xfd\x92\x94\xc5\x47\x91\xb5\xf9\x55\x9b\x68\x27\x25\x4a\xa1\xf2\x5c\x54\x0b\x7d\x7d\xf3\xec\x9c\xdf\x14\x25\x66\x29\xdb\xcf\x9b\x72\x5f\xeb\x34\x12\xeb\xf3\x5f\x0e\xf9\x37\x9e\x41\x31\xcc\x77\xe0\xf0\xfb\x6f\x74\x59\xa7\x38\x36\x1a\x99\xae\x4c\xcb\x2b\x60\xa9\x9f\xe9\x2b\xd6\xc3\xa5\x3d\x6f\x45\x4e\xe9\x00\x5b\xce\xc5\xae\xdc\xfa\x82\x34\x73\x92\xef\xcf\x11\x75\xe5\x78\x39\x6a\x8d\x80\x0d\xab\xa0\xf4\xc2\xcf\x4d\x49\x13\xb0\x52\x86\x20\xe3\xba\xa0\xf6\xd8\x6e\x06\x28\xe4\x7c\x0c\xa2\x6d\xf3\xb0\xc7\x88\xc4\xe1\x65\x57\xf7\xfc\x28\xdf\x82\x0c\x12\xfb\xb6\xff\xbf\xec\xb9\x82\x9d\xdb\x65\xef\x8d\x63\xe9\x0d\x68\xfc\x71\x94\xb5\xb8\x85\x91\x3f\x08\xed\xee\x84\x56\x76\x47\xff\xa3\xf0\xd0\xd3\x25\xd0\x82\x60\x0c\xe7\x1a\x23\x45\xc7\x7d\x65\xbd\x96\x25\x20\x03\xe5\xc1\x25\xa7\x18\xa0\x73\x70\xc3\x1b\x57\x08\x07\x5c\xf1\x83\x7c\x69\x25\x63\x5c\xc6\x8d\xd1\xb7\x51\xe4\x0a\xb6\x08\xb0\xd9\xd8\x85\x2c\x18\xd3\x06\x92\x19\xef\x80\x7b\x76\xd2\x88\xf9\x2c\x29\xa9\x3e\x3d\x75\xb5\xb2\xe5\x36\x81\x67\x1d\x3a\xe0\x14\x5a\xc0\x3c\xca\xd3\x16\x2e\x44\x70\x3b\x04\x01\xd3\xeb\x16\x7c\xd8\xdd\xc1\xe1\xa5\xa3\x26\xb7\x28\xb1\xe0\xc0\x0a\x94\xd8\x6d\xe6\x13\x52\xa6\x61\xe4\x08\x97\x17\x5d\x28\xd3\x41\xe4\xd1\xd9\x96\x2e\x35\xf4\xde\x18\xa5\x40\x17\x61\x1a\xd0\x53\x59\xce\x08\xb9\x7b\xfe\xdb\xfb\xe3\x99\x2e\xd5\x8e\xd4\x0f\x51\x7a\xab\x01\xc0\xfe\xfe\x8b\x63\x64\x3d\xa1\xa4\x54\x15\x27\x30\xbf\x99\xaf\x87\x40\xad\xf9\x8a\x77\xb8\xd7\x3a\xdb\x08\xe6\x09\xe0\x0c\xe9\xb1\xcc\xdf\xef\x3e\x9a\x9b\x05\xaa\x56\xe0\xbc\x79\xb6\xbb\xba\x80\xdd\x8e\x46\x1a\xf7\xcb\x20\x28\x92\xd8\x9b\x2d\x05\xa4\x45\x8a\xb3\xfa\x54\xb4\x74\xb8\xf8\xf5\x81\x79\x5d\x6c\x27\x39\xe5\x9d\x0f\xe0\x62\x40\x0b\xae\x2d\x2d\x53\x4b\x34\x0b\xb8\xe2\x61\x57\x77\xa9\xa5\x61\x5b\xb2\xcf\x43\x7b\xa5\x25\xe0\x0e\x70\x38\xf2\x2a\x57\x88\x2a\xc5\x20\xb3\x33\xe7\x5c\x3c\x92\xa8\xb9\xf0\xe3\x7f\x67\x1c\x94\xb1\x5d\xd8\x18\x2a\x08\xd7\xc1\x43\xe9\x4e\x92\x62\xb3\xcc\x55\x44\xc2\x94\xf5\xf3\x35\xc2\xb2\x8a\xc1\x19\xfe\xa0\x0f\x96\x34\xdb\x06\x39\x93\x98\x8b\x5f\x15\x05\x79\xc7\xcc\x25\xb6\xa1\xfb\x0d\xde\x94\x80\x4f\xa6\xef\x66\xff\x79\xfb\x91\x07"}, +{{0xb7,0x86,0xcc,0xfb,0x58,0x6d,0x43,0xb8,0xc4,0x6b,0xb9,0x7b,0x96,0xc9,0x18,0x73,0x1b,0xc2,0xcc,0x11,0x92,0x77,0xf1,0x23,0x67,0x1e,0x30,0x14,0x81,0x58,0xd2,0xed,},{0x90,0xc7,0x00,0x46,0x00,0xf3,0xdc,0xe4,0x09,0xfd,0xea,0xdc,0x8e,0xd0,0x18,0xf9,0xea,0x26,0x3f,0x75,0x16,0x0a,0x74,0xab,0x54,0xf4,0xc2,0x39,0x9a,0x90,0xca,0x78,},{0x52,0xba,0x96,0x58,0xa1,0xa0,0xb3,0xe9,0x8e,0xd5,0x20,0x9e,0x39,0x3e,0x42,0x00,0x66,0xa3,0x7d,0x37,0x14,0xda,0xa7,0x3d,0x5c,0x67,0x1d,0x33,0x07,0x5a,0x5f,0x57,0x27,0xfe,0x4e,0x08,0x1e,0xe0,0xfa,0x3c,0x21,0x33,0xdc,0x95,0x3a,0x2d,0xa6,0x20,0x29,0x13,0x71,0xf0,0x0c,0xcb,0x57,0xd8,0x79,0x2e,0xb5,0x96,0xa2,0xff,0x81,0x01,},"\xba\xbf\x48\xbd\x55\xea\x91\xbd\x0c\x93\xb9\x70\x24\x1b\x52\x9d\x9d\xb4\x3d\x49\x27\xfe\xa5\xf1\xa1\xf7\x08\x2d\xd6\xcb\x50\xa5\x2b\x09\x4b\x31\x29\xfc\xd9\x03\xa4\x4f\xec\x8b\xfd\xb5\xc8\x6c\x00\x2a\x2a\x45\x28\x87\xca\x25\xa6\x0e\xce\xb5\xe1\xf9\xf5\xc9\x3d\xc5\x94\x23\xc7\xaf\xe7\x47\xc6\xbf\x40\x7c\xac\xad\xec\xcf\x5d\x78\x79\x70\xcb\x06\x17\xbb\x3c\xfe\x7f\xd1\x75\x63\xd3\xa0\xdc\x91\x63\x1f\x71\xb8\x4b\xe2\x4a\xe8\x00\x11\x37\x50\xf0\x31\xd0\x1f\xd0\x53\x64\xb4\xf2\x7f\x86\xf8\xdc\x3a\xd7\x40\x7e\x1a\xe9\xe7\x68\x15\x4e\x3d\xde\x58\xe8\x67\x12\x9e\x24\x74\x54\x7b\x40\x82\x17\x96\x48\x44\x85\x8d\x05\x6b\x31\xc3\x74\x99\x1b\x7f\x16\x1f\x52\xf0\x88\xb8\x06\xe0\xf3\x13\xd6\x8a\x15\xc5\x40\x1e\xd5\x5b\x2b\x77\xde\xea\x58\x6c\xb0\x54\xdc\xd7\x1a\xf2\xab\x6a\xb1\x1e\x84\xb3\x0c\x53\x93\x45\xde\x3e\xb4\x3f\xb7\xb3\xa3\xb4\x89\x87\xc3\xbf\xa7\x06\x55\xd5\x99\xf2\xe3\x1d\x12\xad\x23\xcc\x96\xe8\x6d\x38\x0b\xfd\xa8\x12\xfe\xff\x3d\xd3\x02\x42\x92\x91\x69\x07\x02\x28\x91\xe1\x19\xbf\xc3\xed\x9c\x25\x54\x6c\xd1\x9f\xc9\x92\xd8\xa6\x1e\x60\x59\xca\x3c\xe7\x80\x2a\xf1\x11\x87\x56\x62\x0b\x87\xa7\x24\x2b\xd8\x38\x97\xc9\x4d\xd5\xa3\x6e\xd4\x0f\xc0\xf3\x4c\x2c\x93\x11\x0b\x37\xd1\x7d\xd9\x6a\x22\x06\x25\x90\xbc\xdb\x54\x67\x42\xef\x72\x18\xad\xcc\xc5\xad\x28\xf4\xfc\xe6\xec\xf7\x05\x83\x5f\x41\x13\xd8\x2e\xa5\x33\x90\x3a\xec\x8c\x38\x20\xfe\x4b\x47\x15\xf3\x7e\x20\xce\xbc\x1e\x71\x51\x9a\xa0\xb2\x40\xb4\x84\x0a\xa4\xfd\xcf\xb5\x24\x67\xfe\xdd\x8f\x4d\x1f\x9b\xc3\x3e\xe1\x14\xf3\xef\x85\xf5\xfd\xb0\x9c\xa8\x84\xaf\x38\x8a\xd3\xad\xf8\x4c\x79\x3f\x38\x6e\xfe\x6f\xf8\xa4\x6e\xd8\x1e\x5d\x45\xa3\x7c\x25\xcd\x80\xf2\xd7\x36\x3f\x43\xae\x45\xe3\x77\x2c\x0d\xf8\x9f\x11\x44\x79\x39\x80\x6c\x09\x6e\xf9\x33\xa1\x39\x44\xf0\x89\x0d\x88\x7c\x2e\x5b\xbb\x6b\x12\xea\x95\x0b\x09\xb8\xfe\x42\x52\x89\x37\x73\x52\xf3\x5f\x84\xcc\x4d\xcd\x4d\x7a\x44\x94\x89\xfa\x92\x51\xc0\x31\x13\x48\x92\x25\x80\x9c\xdf\x3c\xb6\x34\x75\xf1\x0d\x34\x17\x09\x37\x1c\x6f\xd4\xbb\x7a\x94\x94\x83\xd1\xbc\x2b\x31\xdd\xf4\xd9\x63\xa0\x7d\xe7\xea\x5c\x3f\xee\x9a\x0e\x33\xf0\x76\x9f\x2f\xaa\x40\x61\x2a\x54\x69\x74\xbd\xe0\xb7\x33\x91\x79\xe4\x12\x4a\x44\x7b\xd4\x28\x79\xcc\xda\x5c\x8a\xd1\x81\x9c\x53"}, +{{0xdd,0x1a,0x97,0x74,0xf7,0x58,0x4d,0x85,0x89,0xb1,0x9f,0x92,0xab,0x69,0x39,0xac,0x48,0x56,0x02,0xfe,0x16,0x44,0xce,0xe2,0xf6,0xf3,0xcd,0x60,0xfb,0xd5,0x84,0x00,},{0x4b,0xea,0x7d,0x0b,0x0f,0x4b,0xd5,0x90,0xf9,0xe3,0x57,0x9f,0x0c,0x5f,0xa4,0xce,0xf4,0xd6,0x0a,0x49,0xd2,0xc4,0x37,0xa0,0xaa,0xea,0xd9,0xd4,0x3a,0x73,0xd4,0xa3,},{0x19,0x59,0xbd,0xe0,0xa6,0x97,0xa6,0x39,0x93,0xec,0x47,0xd1,0x58,0x22,0x37,0x39,0xfe,0x65,0x87,0x1f,0xa0,0x58,0x70,0xd7,0xde,0x0d,0x38,0x08,0x65,0x91,0x20,0x2a,0x51,0xb1,0x74,0xd1,0xc6,0x18,0x28,0x08,0xc6,0xce,0x62,0x63,0x1d,0x81,0xdb,0xa3,0x4e,0xbe,0xd4,0xaf,0x2f,0x29,0xb0,0x6c,0x00,0xa5,0x7a,0x3c,0xb6,0x66,0x36,0x06,},"\xe5\xdc\x3e\xd2\x6c\x1f\x69\x3c\xf8\x52\x46\x5a\x05\xe3\x04\x8b\x50\x5d\xb5\x11\x6d\x9e\x31\x59\x22\x05\xa9\xc3\xd4\x72\x0b\xc1\x0b\x6c\x20\x63\x9a\x0e\xe2\xf0\xe1\x47\x22\x5b\x5b\x19\xea\x51\x1c\xfb\xa0\xc2\x1a\xac\x10\x71\x5a\x2f\x23\x2f\x10\xc2\xc8\xaa\xd4\x11\x12\xb6\xb0\x12\xe7\x5a\x41\x55\xf8\xc6\x92\x62\x53\xca\x2b\x4d\xdb\x7b\xfe\x7f\x86\xe9\x0a\x53\xdb\xc0\xcb\xa8\x9e\x48\x5c\xec\xa8\xfd\x26\xe5\x0c\x7f\x28\x2a\x25\x35\x73\xcb\x0a\x8f\xa8\x8c\xc4\x46\x23\xe8\x2e\x8f\xa2\xed\xb6\xcb\xc7\x53\x8a\xc9\x2c\x11\xe4\xc5\xb1\xea\x5f\x68\x96\x6d\x15\xd9\x3c\x34\xf3\x96\xd2\x75\x72\xf8\x64\x38\x2a\xb7\x6a\x7b\xe6\x5a\x55\x7b\x13\x97\x66\x36\x8a\x20\x7d\x98\xbc\x0c\x20\x92\x63\x70\xde\xa2\x70\x48\x16\x03\x63\xed\x85\xf4\x09\x9e\x7c\xd6\x6d\x12\xd0\x98\x8c\xfc\x9e\x2f\x16\xaa\x56\x5f\x8f\x33\xb3\x9e\x97\x8c\x05\x87\x37\x1f\x92\xdb\x50\x56\x31\x75\x64\x41\x1b\xd8\xa3\xb6\xfe\xa0\x9d\x34\x87\xaa\xf7\x34\x03\x49\x18\xff\xed\x1c\x9f\xba\x7b\xde\xc6\xfe\x68\x87\x6f\xc7\x36\x0c\xc5\x62\x9b\x92\x10\x40\x27\xfe\x57\x59\xc5\xab\x36\x53\x54\x75\x1e\x79\x69\x11\x6c\x3b\x9a\x21\xb1\x52\x33\x0a\x96\xa9\x38\x1a\xf7\x30\xd1\x78\x22\xd7\x8a\xd6\xea\x86\x00\x06\x91\x5b\x5c\xab\x44\x7a\x75\x93\x72\xe0\x5d\x49\x5e\xbb\x32\x8e\x75\xd2\x48\xda\xa0\x2f\x5d\x2e\xb9\x78\xd2\x71\x0c\xf1\xc5\xfb\x82\x48\x76\x77\x0e\x32\xca\x6d\xe2\xc7\x30\x56\x48\x92\x41\x5b\xcb\x53\xe5\x98\x1d\x70\x7a\xdd\x96\x1c\x5f\x37\xfd\xaf\xa1\x39\x9a\xf8\xae\xa9\x60\x45\x8d\x2c\xa3\x10\x55\x3f\x7c\x98\x66\xcc\xbe\x8e\x9d\x88\xe0\x8a\x44\x68\x72\xea\x66\xfc\x30\x8c\x82\x45\x14\xb7\xda\xce\x03\x34\xdb\x73\x5e\x6f\x14\xc8\x5b\x5e\x61\x9a\x5d\x60\x56\x48\xa8\x81\xe8\x76\xc7\x8d\xbe\x06\x57\x23\x3d\x4f\x7f\x3b\xfd\xdf\x63\xb4\x45\x31\x1d\x6a\xbc\x47\x63\x47\xec\x4f\xb4\x3c\x89\x46\xf9\xd1\x7c\x36\x93\x81\xd1\xc5\x64\xff\xcf\xe2\xdc\x7b\x47\x26\xfd\x57\x38\x7f\x0b\x44\xdb\x8e\xf9\x5a\x0b\x4e\x32\xa7\xbe\xdf\x31\x9e\x53\xa9\xe7\x12\x6c\x28\x11\xf9\x82\x9d\x1f\x4a\xe9\xab\xd9\xd5\xf4\x2e\xfe\xf2\x07\x5f\x47\x05\x1c\x63\xa4\xf8\x20\x20\x40\xec\x47\x23\x68\x63\x82\xc6\x03\x31\x27\xc1\xfb\xff\xf4\xbc\x82\x37\x35\x08\x75\x2d\x43\x1d\xc4\x73\xf5\x2d\xde\xab\x03\x42\xdc\x4f\x54\x47\xf8\xf2\x57\x38\xef\x65\xd7\x85\x56"}, +{{0x66,0xf5,0xea,0x8c,0xdb,0x95,0xee,0x1a,0x75,0xe3,0x24,0x67,0xd7,0xc8,0x3c,0x59,0x44,0x77,0x42,0xc8,0x5d,0xdd,0x49,0x9c,0x43,0xc0,0x86,0x73,0xe1,0x49,0x05,0x3a,},{0xa8,0xad,0x04,0xb9,0xc1,0x44,0xb9,0x7f,0xe8,0x67,0x37,0x4d,0x4f,0xe5,0x7d,0x7e,0xc0,0xc2,0x49,0x18,0x3e,0x43,0xbd,0xfb,0x5d,0x52,0x64,0x4e,0x7f,0xbe,0x1d,0xf3,},{0xec,0x5c,0x7e,0x83,0x92,0xfa,0x8b,0x61,0xbc,0x82,0x96,0x81,0x86,0x6e,0x45,0xac,0x8b,0xe4,0xb5,0xb7,0xb6,0xa8,0x22,0xc1,0xbc,0xd0,0xf2,0xcc,0x2c,0x8c,0x44,0xc3,0x3c,0xf8,0x3f,0xa4,0x2d,0x43,0xa2,0xf1,0x88,0x41,0x41,0xb4,0xa5,0x9a,0xaf,0xf4,0x7f,0x9b,0xe0,0x7e,0x63,0x2e,0x20,0x18,0x75,0x93,0x24,0xea,0xc9,0xd1,0x49,0x00,},"\xc0\xd0\x1d\xce\xb0\xa2\xd1\x71\x91\x10\x18\x79\xab\xb0\x93\xfb\x07\x75\x71\xb5\x21\xbe\x7b\x93\xa1\x17\xc6\x96\xc0\x87\x2f\x70\xea\x11\x39\xab\x62\x83\x29\xee\x56\x55\xfc\x0a\xa7\x7e\x81\x11\xd2\xfc\x88\x47\x48\xc1\xf2\x67\xb9\xeb\x09\xdc\x26\xf5\x7f\xc4\x02\xd6\x1b\xa3\x6f\x63\xf4\xd5\x89\xaa\xe6\x3c\x76\xee\xee\x15\xbf\x0f\x9e\x2d\xcd\xe4\xe4\xe3\xe7\x8f\xc6\xc2\x9e\x3a\x93\xf3\xff\x0e\x9a\x6e\x0b\x35\x66\x45\x95\x38\x90\xde\xbf\x62\xdb\xea\xf4\x90\x51\x78\xd4\xf0\xa5\xa5\x92\xc1\x92\x94\xee\xba\x7c\x21\xcf\x8f\x1b\xb3\xf4\x51\x21\x87\x37\x6d\xe7\x2f\x11\x36\xa4\x8a\xc2\xdf\xaf\x32\xd0\xf3\x7d\xe0\x64\x59\x25\x92\xb6\xe1\xbc\x0c\x51\x2c\xf4\xd2\xd8\x5d\x16\x79\x78\x53\xa8\x09\x33\xb0\x9c\x2f\x7b\xfb\x9e\x54\xa6\x9e\x51\xa8\xe4\x23\xa9\x1c\x3e\x5f\xde\xb4\x79\x05\x33\xe8\x7a\x4b\x1c\x0e\x0e\x23\xa9\xdb\x95\x73\xac\x17\xab\x6e\xc7\x01\x4d\x8b\x7c\x44\x86\xe1\x57\x25\xf8\xd2\x64\xee\xa3\x05\x0e\x83\x5a\xe0\xac\x44\x9d\xb3\x34\x50\x2a\x6d\x97\x35\x8f\xa8\x59\x10\x6a\xd0\xf6\xf4\x29\x5f\x23\x44\x92\x0a\xdf\x93\x55\xa6\x94\x9d\x8d\x14\x5c\x25\x62\x8a\x46\xa1\x04\xca\x09\x9b\xd9\xdd\xe9\x41\x11\x9c\x83\x82\x0c\xdc\x2c\xb2\xd0\x97\x22\x69\x49\x01\x04\x3c\x37\xcf\x0a\xe8\x79\xbe\x20\x30\xd0\x37\x31\x58\xb9\xc4\xb0\x71\x82\x98\xbe\x45\xf6\x30\xf6\xfc\xdc\x19\x0f\x7b\x29\x26\xd8\x76\x55\xa1\x8b\xb7\x97\xac\x50\x75\x7f\xcd\x36\x55\xc9\xe4\x1d\x51\x63\x29\x3d\x9a\x13\xd9\x84\xf5\x91\xf7\x5b\x7e\x4e\x5c\xad\xb6\x4c\x4c\x9f\xdf\xef\x76\xca\xb6\x93\x81\xd0\xf6\x0b\x48\x3f\x80\x4b\xb3\xb3\x33\x64\xdf\x8c\xff\xac\xb3\xc9\xb1\x3f\xf4\xc8\xd8\xd4\xea\x40\x76\x6a\x7d\x42\xd8\x25\x6c\x6b\x1c\x11\xc1\x91\xda\xba\x1b\x8e\xf2\x15\x93\xe4\x7b\x18\x85\x8e\xc1\x9d\x81\x73\x58\x67\x8d\x85\x48\xff\x15\x35\xd5\xfc\xf4\x41\x4b\x6a\x11\xd3\x4a\x37\x42\xf8\xd7\x14\x9f\xa6\x81\x38\x3a\x94\x08\x88\x7f\x1c\x0a\x98\xed\x52\x1e\x72\x79\x32\x77\x82\x4d\x6f\x74\x6d\x49\xb6\x3d\x44\x4e\x31\x2e\x6d\x9b\x98\x66\x11\x25\x81\x96\xa5\xb0\x12\xb8\x8f\xaa\x29\xf9\xa6\xc6\x7e\xd2\x5d\xf8\x7b\x2d\xbf\x0d\xbd\x2d\xc3\x08\x0c\x5b\x8d\x15\xa3\x7d\x34\x72\x90\x98\xed\x0d\xe9\x2d\x75\x80\x74\x29\xb2\xca\xe5\xd7\x28\x3c\x4e\x5c\x9b\xd1\x96\xd1\xad\x43\x6c\x7c\x34\xf3\xc9\x46\x6e\x5c\xb3\x19\x6b\x44\x3f\x4b"}, +{{0xed,0x25,0x58,0xe5,0xc5,0x67,0x84,0xbc,0xfb,0x4f,0x4d,0xde,0xa3,0xc0,0xdf,0xbe,0xf8,0xd9,0x6f,0xf1,0xca,0xbf,0x15,0x8e,0xc4,0xab,0xe6,0x0a,0xff,0x66,0x99,0x9e,},{0x1e,0xdc,0x99,0x10,0x12,0xac,0x6f,0x88,0x8f,0xa7,0xe6,0x04,0x57,0x77,0xe9,0xba,0x1d,0x4c,0x03,0xc4,0x02,0x92,0xd2,0xda,0x6b,0x72,0x2b,0x4a,0xd0,0xa3,0xed,0x74,},{0xab,0x9e,0x01,0x16,0x65,0x24,0xfd,0x28,0x8e,0x5c,0x68,0x9e,0x56,0xd7,0x30,0xd4,0x98,0x30,0x00,0x55,0x10,0x30,0x49,0x33,0x34,0xa3,0x98,0x4e,0x22,0x23,0xdc,0x9f,0x7a,0x5b,0x91,0x0c,0x61,0x76,0x0c,0x61,0x57,0x99,0x0a,0x4c,0x33,0x5e,0x34,0x8e,0x3a,0x7b,0xc8,0x22,0x3e,0x09,0xc1,0x0c,0x5e,0x52,0x0c,0x8d,0x61,0xaf,0xf5,0x00,},"\x2c\x64\x33\xe9\xbf\xbf\x4c\xfd\x4e\x07\x1f\x15\xce\x6b\x12\x9d\x78\x0a\x4b\x3d\xe0\x14\xfa\xc0\x34\xe0\xd4\x4e\xf7\x72\xe2\xc8\xb0\xd6\xa3\x48\x1d\x7b\x3d\xde\xb2\x37\x63\x26\x73\x55\x33\x13\xde\xac\x1e\xfa\xfe\x37\x02\xa7\xa4\x41\x1e\x12\xbd\x34\x1e\x8d\x8e\x96\xc5\x9c\x5e\x30\xc3\x68\x07\xa8\x38\x5a\x53\x8e\x9b\x66\x90\x7d\x6a\x52\x84\x00\xbd\x9f\x95\xee\xdc\x52\x16\xb2\x8f\xd7\x43\x7d\x8f\x4a\x02\x9f\xdb\xdc\x7c\x93\x8e\x4e\xb9\x81\x2f\xec\x05\xea\x69\x32\x29\x62\x9a\xce\x6a\xcc\x7a\xf6\xba\x4c\x23\x8e\x77\x22\xf3\x12\xf7\x89\x6b\x00\x49\x22\xf7\x06\x7e\xde\x10\x6f\x8e\x70\x15\x4d\x78\x3f\xb4\x12\x91\xf3\xc7\xe2\xe4\x82\x60\x45\xb5\x74\x1b\xcb\x4a\x88\x38\xf8\x7a\x32\xe0\x04\x97\x04\xe9\xb5\x32\x34\xc2\x24\xff\x89\x8a\x75\x6e\x52\x91\x34\xc1\xa9\xbf\x50\xfd\x02\x98\x19\xb2\x23\x8b\x60\xb2\xae\xc1\x12\x8f\x34\xd2\x1f\x9d\x66\x98\x3b\xed\x39\x86\x59\xd8\x08\xb6\x7a\x2e\x50\x1b\x5a\x1f\x25\xf7\x1f\x0f\x0c\x1e\xb2\xfe\xa0\xab\x42\xd8\x2f\xf3\xbc\x93\x58\xbb\x20\xc2\x75\x20\xc1\x44\xcf\x21\x16\xf4\xa4\x9c\xbc\x61\x99\x4d\x2d\x71\x05\x46\x69\x4c\x4f\x60\x2d\xc4\x06\xe0\xb0\xc2\x7e\x5f\x5e\x64\x66\x7e\x95\xc2\xec\x9d\xf2\xd6\x52\x9c\xf5\x36\x22\xea\x10\xb9\x56\xb3\x45\xec\x55\xb6\xc3\x9a\x1e\x6e\xd8\x8a\xe6\x6e\x5b\x45\x71\x79\x42\x5d\x1a\x84\x90\x37\xb0\x7c\x46\xcf\x5f\x36\x33\x01\x09\x58\x37\xce\x81\x1b\xff\x49\x60\xbf\x9c\xbd\x15\x20\x1c\x1b\x67\x40\xbd\x70\x10\x21\x40\x74\x4c\x33\x27\xac\xa9\xd6\xd6\xd1\x54\x93\x67\x98\xac\x38\x1f\xa6\x39\xdb\x43\x6e\xe8\x16\x56\x67\xd5\x38\xa6\xc7\x4a\x23\x3c\x12\x4b\xf6\x04\xfd\xad\x51\x98\x4c\x41\x70\xb8\x20\x0d\x2d\xf7\x3c\x29\xbb\x1e\x37\x6a\xff\xc3\x14\xdd\xe3\xe8\x6a\xf9\xd2\xc2\xe6\xc3\xa6\x52\x4d\x32\x1b\xce\x93\xe2\x1f\xc9\x65\x56\x4f\xaf\x77\xd0\xcd\x1a\xcc\xb4\xd7\x62\x94\x85\xf5\x64\xc7\x9f\x4d\x8a\x2f\xde\xfb\x46\x54\x54\x02\x8c\x6d\xd1\x42\x80\x42\x80\x53\x70\x74\x33\x63\xbb\x18\x47\x6a\x3f\x23\x20\xdb\x25\x89\xc7\x21\x33\xcf\x5e\x29\xda\xfb\x7d\x07\xaa\x69\xa9\xb5\x81\xba\xb5\xa8\x3f\x40\x3e\xef\x91\x7a\xfa\x14\xb7\x64\xc3\x9a\x13\xc0\xc5\xea\x70\x19\xd2\xfd\xfb\xd7\xf3\xf7\xd4\x0e\xb6\x3b\x2a\x08\x4d\xa9\x21\x89\x5f\xe4\x8f\x4f\xd5\x94\x01\x7f\x82\x56\x9b\x46\x7a\xb9\x01\x16\x9e\xb5\xda\x9c\x40\x17\x1d\x5f"}, +{{0xb7,0x27,0x98,0xb8,0x11,0xe2,0x33,0x84,0x31,0x25,0x6d,0x24,0x80,0xfe,0x7a,0x36,0x63,0xac,0xec,0xbb,0xe6,0xe6,0xc1,0xb9,0x19,0x1e,0x9d,0x9a,0x22,0x44,0x79,0x40,},{0xce,0x49,0x1d,0xaa,0xd2,0x96,0xb5,0x57,0x27,0xb0,0x95,0x13,0xdf,0x02,0xba,0x59,0x28,0xa3,0x71,0x73,0x7c,0xd3,0x58,0x41,0xe5,0xf7,0x35,0xac,0xab,0x7c,0x5d,0xf8,},{0xdc,0xfc,0x6f,0xd4,0x77,0x99,0xfe,0xc7,0x72,0xc2,0x09,0x9b,0x3c,0x64,0x37,0x24,0x6c,0x3a,0xd0,0x72,0x29,0xfc,0x74,0x0e,0x05,0x31,0x1a,0x20,0x6b,0x18,0xb0,0x2e,0xcd,0xb0,0x26,0xc9,0x26,0xf4,0x9c,0x65,0x52,0xe3,0x47,0xfd,0x35,0xdf,0xde,0x06,0xcb,0x63,0x9a,0x79,0x7c,0x50,0x61,0x2f,0x98,0xe2,0x47,0x8a,0x92,0xaa,0xf6,0x09,},"\xa5\xd4\x62\x98\xb0\x79\x06\x10\xae\xdc\x09\x70\xfe\xa2\xa7\x07\x50\x81\x84\x72\x66\xf2\x2f\x12\x47\x8b\x93\xd7\xe6\x74\xc6\xc5\x17\xf3\xc1\x4e\xd0\x61\x26\x9d\x17\x0a\xc3\x1e\x2a\x64\xf9\x75\x4a\x56\x5b\xac\x1d\xd9\x75\x73\x22\xc1\x11\x32\xe7\xbb\xee\x5f\x32\x81\x8e\x0e\x30\x63\xab\x64\xe5\x52\xd0\x9b\x0f\xd1\x75\x76\x39\xb9\xb9\xd1\xc7\x70\x01\x6b\x67\x74\x65\x87\x2b\x66\x9d\xd4\x8b\xe0\x38\x66\x57\x51\x67\x4d\xd2\xf4\x0a\x96\x6a\x26\x74\x8f\xd3\xe5\xdb\xfd\x92\x26\x5e\xb9\x36\xf5\x5b\x09\x42\x86\xc0\x10\x62\x99\x04\x34\x7c\xb4\xc5\x26\xe3\x77\x47\x0a\xa9\x6e\x81\x69\xa6\xf2\x11\x63\x38\x07\xa5\x00\x30\xe7\xff\x68\xe3\x89\x11\xb3\x55\x5e\x72\x8e\xd8\x59\x0b\x2d\xc4\x5f\xea\x69\x94\x5c\xc0\xc9\xa3\xd3\xe6\xc9\x54\xb3\xe8\x01\x06\xa5\xc9\x1d\x3d\x22\xe8\x9e\x8c\x0e\x1d\xe9\x02\x05\x8e\x9c\xd0\xf8\xce\x80\x6e\xac\x4f\x89\x3e\xe0\x42\x99\x00\xfb\x54\x87\xb8\xfd\x36\xdb\xdc\xb3\x4f\x2d\x54\xfc\x6c\xc7\x4a\x92\x39\x51\xb8\x63\xda\x70\xf1\xb6\x92\xbf\x04\x38\x48\x43\x66\xcd\x85\xee\xb8\x80\xb2\x79\xf8\xfc\xa9\xd3\x24\x2c\x55\x83\x30\xf1\xca\x57\xc6\xa5\x86\x08\xcd\xbc\x07\x73\xe1\x60\x82\xbc\xa9\x64\xdd\xc4\x03\x47\xda\x8a\x36\xb2\xa9\x32\x8c\x2f\x46\x60\x9e\x09\x2f\xd6\x4b\x41\x34\xee\xe1\xd0\x99\x81\x3e\x12\x46\x48\x9e\x8e\xe5\xb1\x9b\x3d\x3b\x89\x1c\x28\xf3\x0b\x38\xb6\xa2\x8e\xc1\xd3\xe9\xb0\x05\xde\xc9\xc6\x3f\x8b\x98\x13\xbc\x1d\xe4\xaa\xf9\x95\xf1\x77\x9d\xde\xd1\x5c\x7a\x43\x0d\x70\xca\x46\xe7\xca\xfd\x4e\x9a\x54\x38\x04\x44\x6a\xb0\x80\x7d\x64\xf2\x55\xe2\x01\xef\x42\x8a\x47\x4d\xae\x8a\x0a\x75\x02\x1b\x62\xad\x39\x88\xff\xb8\x1c\xd8\x22\x1b\x24\x30\x85\xa0\xad\x04\x6f\xdc\x16\xc6\x7f\x17\xb9\xf8\x18\x20\x09\x59\x53\xa5\xb9\x8a\xcb\xdf\x93\xeb\xcf\x80\xbc\x9c\x99\xaf\x5f\xbf\xfa\xcb\x61\xa9\x25\x1c\x5a\xaf\xdb\x22\xb1\x12\x9b\xfc\x60\xc9\x8e\x0f\x17\x52\x63\xbd\xf9\x3d\xc9\xa0\x8b\x8e\xfc\x2e\x8c\xda\xf0\xf8\x3d\x6c\x49\xec\x90\x16\x45\xea\xc5\xa4\xff\x63\x38\x5a\x6f\x1a\xf2\x07\x18\x97\x66\x2a\x37\x22\x19\xc9\x30\x1f\x54\x5a\x2e\xbb\x8f\x59\x17\xdb\x7f\x29\xca\x13\xfc\x86\x1a\xf3\x8d\x90\xc3\x5c\x03\xac\x91\x84\xc1\x22\xe5\x7b\x05\x7c\xde\x42\x6f\xd7\x6d\xca\x79\xe2\x5e\x64\xdb\xb4\x1c\x84\x14\xa0\x45\x0d\xa4\x90\x5b\x90\x2a\xe9\x8d\x2d\xa4\xba\x79\x28\x01"}, +{{0x1f,0xe7,0x32,0x7e,0xa9,0x07,0xd3,0xff,0x17,0x9b,0x11,0x78,0x11,0xd3,0x01,0x93,0xfc,0xba,0x4c,0x34,0x7b,0x90,0x65,0x7f,0xee,0xd9,0x8d,0xee,0xec,0xda,0x9a,0xc9,},{0xee,0xf3,0x01,0xb1,0x6f,0xd7,0xbf,0x3c,0x7b,0x64,0x0b,0xf5,0xee,0x87,0x00,0xac,0x5a,0x87,0x16,0x9e,0xab,0x5f,0x56,0x01,0x5b,0x3f,0x49,0x9d,0x95,0x5e,0x07,0xeb,},{0x9c,0x7f,0xdb,0x53,0xfd,0x60,0x6b,0xc7,0xc9,0xc2,0x23,0xfe,0x94,0x31,0xe1,0xad,0x00,0x95,0x46,0xd0,0x00,0x98,0x81,0x2a,0x49,0x51,0x97,0xf2,0x54,0x1e,0x87,0xf8,0xd6,0xf5,0xda,0x22,0xec,0xef,0xcb,0xb7,0xda,0x56,0x66,0x2a,0x73,0x09,0xd1,0x0a,0x6c,0x4a,0x4f,0x7f,0x29,0x92,0x78,0xd5,0x1b,0xbd,0x11,0xe0,0xcc,0x1b,0x87,0x09,},"\x19\xa8\x32\xf2\x6f\xbb\x02\x39\xf0\xd9\xd2\x6a\x2e\xbd\xed\x24\x03\xc2\xa4\x06\xdd\x1f\x68\x31\x8d\x67\x7a\xfa\x64\xf3\x50\x43\x31\x6a\x5e\xfd\x72\x97\x83\xc7\xf9\xd1\x8c\x09\x82\x46\x14\x65\x20\x91\x88\x6c\xc9\x54\xbe\x9f\x93\x12\xd4\x58\x6b\xf3\x6f\x30\x35\xac\x70\x34\x38\xb0\xcf\xe3\xde\xc5\x07\x78\x13\xc7\x10\xd1\x44\x75\x61\xab\x61\x57\xbc\x7a\xd5\xea\xb5\xb0\xc0\xaf\xdc\xc9\xdb\x77\xe6\x6f\xa8\x07\x13\x66\x82\x9c\x50\x10\x96\xc3\xd3\xa9\x38\x21\x8a\x6e\x42\x07\x10\x9d\x1e\xb8\x1f\x7d\x88\xbd\x6f\xbb\x2a\xef\xb1\xad\xef\x35\x94\xaa\xe5\x7c\x46\xb7\xb9\x84\xdb\x94\x68\xcd\x96\x2c\x61\x84\xfb\x97\x6f\x0e\x2a\xa8\x41\x52\xde\xb1\xc7\x6a\xea\x75\xae\x48\x84\x42\x94\x3a\x80\xba\x7d\x98\xa2\x8c\xb8\x64\xb5\xe8\x7c\xdb\x28\x4a\xd6\xe8\xd7\xaa\xdc\x6b\x75\xd6\x9d\x3b\xd3\x45\x78\x3b\x3e\xbb\x67\x6f\xf9\x5d\x7b\x41\x91\xe5\x99\x85\x1c\x96\x28\x83\x5c\x7c\x01\x19\x7e\x7c\x8f\x86\xf9\xc8\xfb\x49\xfe\x3e\x28\x45\x8b\xa9\xb0\x23\x62\x19\xbd\x46\xc2\x8d\xf6\x53\x24\x96\x99\x4a\xc9\xba\x73\x3c\x01\x05\xa0\x2a\x26\x9a\x2b\xe8\xb7\xcb\x40\x07\x4b\x88\x16\x02\xef\x92\x47\x05\x2d\xe9\xd6\x37\x08\x91\x88\xbd\x4c\x18\x5c\xca\xe2\x58\xa2\xae\x98\x56\xa2\xcb\xf8\x45\x11\x17\x68\x3c\xe3\x41\xf8\x09\x6e\x1d\x91\xe8\x74\xc5\xcb\x8a\x4e\x09\x39\xeb\x77\x37\x3a\x9a\x0e\xb7\x91\x64\x5b\x8f\x54\x60\x47\x2d\x66\x9d\x80\x14\x68\x1a\x5e\x77\x87\x06\xcb\x55\x66\xbb\xd4\x72\x7d\x17\x16\xb2\x3c\x62\x0d\x22\x8b\x5d\x4d\xc2\xb3\x52\xb4\x23\x93\x1f\x8a\x7e\x8f\xb5\x9e\xda\xd8\xae\x42\x45\x87\x29\x86\x1a\x98\xe0\xc8\x50\xa7\x7e\xd6\x55\xe7\xfc\xfe\x4f\xe3\x6f\x97\x72\xdf\x1a\xc3\xc6\x43\xad\x31\xdb\x56\x30\xd5\x71\xdf\x9f\xcc\x9c\x50\xde\x76\x22\x10\x84\x11\x96\x2b\xbf\x72\xde\xfb\xf4\x9e\x99\x70\x59\xc7\x31\x1b\xd9\xdd\xd5\xb3\x38\xa9\x85\x19\x38\xd3\x7e\x7a\x26\x21\x08\xa2\x91\xe2\x01\x68\x03\xbb\xef\xf4\xf9\xc7\x76\x12\x5c\xeb\x7e\x72\x72\xb5\x1c\x7c\x33\x46\x1d\x80\x89\xf8\x40\x8d\x8d\xda\x92\x50\x6d\x50\x02\x08\x4d\x4f\x41\x4d\x8a\x4d\x28\xd3\x69\x4c\x88\x63\x0e\x31\x80\x19\x90\xd9\x52\x71\xce\xf4\x7a\xa5\xc2\x63\xf9\x7b\x7d\xac\xa1\x78\x87\x01\x43\x63\x29\xb5\xbf\xaf\x72\x65\x3c\x16\x6d\xb0\x87\x70\x81\x30\xc5\xc0\xd7\x8c\xc4\xe9\x06\x4f\x86\x06\x80\x27\x1a\xfe\x4c\x40\x98\x53\xc2\xfa\xd6\x75"}, +{{0x5f,0x9d,0xcd,0x93,0xfb,0x14,0x06,0x10,0xb0,0xe2,0x11,0xb3,0x9a,0xdd,0xb1,0xeb,0x87,0xba,0x97,0x80,0x48,0x77,0xaf,0xbc,0xc3,0x81,0x38,0x8c,0xad,0x65,0x08,0x45,},{0x18,0x2a,0x23,0x7d,0x87,0x8c,0x58,0x19,0x33,0x33,0x2b,0x41,0x78,0xb6,0x7e,0xc4,0x08,0xb3,0x19,0x4d,0x44,0xe4,0xe6,0x93,0x92,0xef,0x80,0x0b,0x26,0x7c,0x29,0x49,},{0xc1,0x91,0x5e,0x05,0x2b,0x66,0x47,0x97,0xe0,0xd5,0xfa,0xad,0xc7,0x8f,0x2a,0x00,0x9d,0x6f,0xbc,0xfd,0xe0,0x3f,0x3a,0xaa,0xd5,0x9b,0x9f,0x45,0x88,0xe7,0xfc,0x3b,0x21,0x99,0x0c,0x52,0x08,0xd3,0xd7,0x6b,0x4a,0xa9,0x5b,0xd9,0x34,0xe8,0x8d,0x3c,0x98,0xc5,0x91,0x93,0x0a,0x59,0xde,0x2a,0x05,0x67,0x01,0xd9,0xf7,0x57,0x74,0x00,},"\xc3\x8b\x87\x4d\x3f\xf0\x10\xff\xf1\xa6\x61\x3b\xfa\x13\x42\x57\xb2\x48\x33\xcb\x53\x6d\xe3\xe7\x49\x92\xc3\xcb\x01\xfe\x3b\xbd\xee\xd9\x7d\xc3\xc4\x59\x6f\xa4\x40\x61\x44\x2b\xd3\x1a\x9d\x4a\xa8\xc8\x1e\x34\xad\x98\x88\x71\x82\x06\x63\x55\x09\xb1\x33\xb1\xba\x69\xcb\x1a\xa0\xe7\x5c\x7a\x18\x93\xc0\x80\x16\x1d\x26\x15\x2a\xce\xf4\x0f\x6e\xf4\x21\x0e\x95\x2a\x49\x82\x8b\x5c\xdd\xe8\x04\xbc\xb5\x36\xcd\xc3\x49\xa8\xe8\x31\xb4\xb6\x9d\x37\x85\xa7\x6b\xd9\xfb\x27\x08\x05\x65\x97\x2d\x0b\x8f\xbd\x16\xf3\xf9\x60\xa6\xbf\x3b\xa0\xc5\xb9\xc4\x04\x96\x7e\xc1\xaf\xfe\x59\xb8\xc4\xec\xc6\x50\xfd\xde\x1c\xb0\x6b\x70\x59\x5a\xd4\xd3\x25\xda\x0f\xab\x4c\x55\x40\xa7\xa8\xd5\xeb\xea\xcc\x4e\x99\xbd\x0d\xc9\x6b\xde\x82\xf2\xbd\x7d\x95\x86\x30\x84\x65\xe5\x5b\x1c\xc3\x88\xd7\x50\x48\x6b\xdd\x5c\x72\x64\xd5\x4f\x56\x14\xd4\x87\x26\xd9\x9e\x44\xd7\x77\x8d\x9e\xd0\x32\x39\x58\xab\x98\x58\xe2\xb2\x5d\xf2\xbf\x99\x4b\xa3\xe6\x25\xe2\x80\x3b\x6c\x69\x31\xe7\xa9\x92\x6f\x1e\x61\xed\x86\x24\x03\xce\x39\x2a\xb8\x3b\x7d\x1b\x66\x08\x5d\xcc\x06\xd8\x2d\xbf\x17\x6d\x01\x6d\x9f\x44\xcd\xcb\x50\x72\xd0\x04\x59\x1e\x92\xd0\x45\x9e\xf0\x5a\x51\xb8\xf5\x4b\xa1\x72\x51\xe1\x66\x21\xeb\xb7\x53\xe5\xb1\x59\x0c\x02\xd2\x1e\x40\xf4\xb7\x5e\xee\x46\x02\x86\x0b\x97\x41\xfb\xbc\x0d\x2e\x38\x5b\x8d\xac\xa8\x3c\xce\x68\xc3\x4a\x99\xbd\xe6\xa6\x0d\x13\xba\x64\x34\x7d\x0a\x38\xd6\x4b\x2a\xde\x25\x0f\x38\x85\x2c\x4e\xda\x2e\x2e\x4f\x30\x3c\x3d\xe1\xa8\xa9\xd4\xab\x33\x00\xc9\xe6\x36\x22\x87\x9f\xc8\x53\x7f\xfc\x63\xb1\x85\x61\xfa\x1f\xff\x65\x53\x12\x41\x51\x5a\x62\xbb\x9b\x08\xb8\x0a\xf3\x76\x67\xa6\x01\xae\x04\x17\x17\x93\xcc\x83\xb1\x1a\xdf\x9c\x30\xca\x9f\x4d\xab\xc7\xb4\x01\xe1\x6a\x18\x14\xcf\xc7\x50\x24\x8c\xc2\xf7\x7e\x03\xf9\xc4\x33\x44\x65\xff\x6a\x2c\x83\xcb\xb5\x6d\xb4\xb7\x34\x75\x10\x43\x83\x2c\x40\x00\x97\x2e\xe3\x23\x2f\x92\x9f\x23\x33\x7e\xba\x5e\x65\x1e\x34\xcb\xdd\xfe\x68\xba\x21\x9b\x63\x2e\x7a\xcd\xbd\x46\x30\xa0\x31\xbf\x16\x89\xfb\xbc\x7f\xbb\xb2\x10\xdb\xf2\x5e\xe8\x7e\x2e\xf2\xb3\xcb\xaf\x8d\x9e\xbd\x8f\xc9\x2c\x3a\x58\xd3\xc0\x5b\x13\x85\xa7\x6c\x87\x79\x1d\x7c\xd3\x74\x1b\x71\xb6\xc3\x29\xde\x9a\x9d\x75\x08\xa0\xc1\x56\xa9\x52\x1a\x90\x20\x56\x30\x99\xa8\x2b\x87\x70\xae\x9a\x94\x4a\x7e\x94"}, +{{0x92,0x5e,0xbe,0x04,0xc6,0xea,0xc4,0x9b,0x26,0x73,0x8d,0x6c,0x13,0x00,0xf3,0x1f,0xd4,0x82,0x84,0x78,0xcb,0xe9,0x7d,0xab,0x18,0xbb,0x88,0x96,0x42,0xe1,0xe1,0x10,},{0xcd,0x72,0x31,0xb6,0xeb,0x74,0xe1,0xfe,0x9f,0x92,0x6f,0x00,0xd8,0xde,0x2c,0x51,0x3d,0x49,0x64,0x05,0x25,0xb0,0x79,0x5c,0xab,0x89,0x3d,0x0c,0x89,0x29,0xe3,0xe0,},{0x2c,0x4d,0x69,0xbe,0xd5,0xad,0x8b,0x95,0x84,0xd8,0x49,0xcf,0x3d,0xf2,0xba,0xc7,0x22,0x82,0xb5,0xf3,0x0d,0xe2,0x66,0xb1,0x4f,0x53,0x3c,0xa9,0x6e,0x95,0x50,0xc4,0xb8,0x54,0xc1,0x54,0xbd,0xc1,0x7a,0xa8,0x80,0xcf,0x00,0x1a,0x64,0x54,0xff,0xaf,0xaa,0x2e,0x50,0x17,0x8d,0xe2,0x12,0x16,0xed,0x12,0x6b,0x63,0xf7,0x7f,0x2d,0x02,},"\xe6\xc0\xba\xd2\x3a\x92\xae\x8b\x1d\x85\x77\x82\x88\x15\x7a\xc6\xc6\x17\xc6\x33\x63\x34\x1d\x77\x78\x70\x34\x1b\xb1\x0a\x8d\x3d\xfc\x89\xbe\x4f\x55\xad\x4f\x64\xe8\x3b\xf2\x49\x9b\x69\xfd\xf7\x21\x74\xd2\x84\x4e\x6b\xd2\x89\xda\xaa\x03\x5f\xec\x5b\xf7\xcf\x45\x52\x21\x19\xdc\x7a\x8c\x81\x1d\x79\x57\x8c\x5b\xb0\xf6\xd3\x4d\xb5\x07\xad\x1f\xb6\xdb\xff\xf9\x97\xb7\x9d\xac\xfb\x3d\xa5\x0a\x41\x5e\x35\x0c\x99\x8c\x0a\x02\x80\x0a\xa5\x0f\xfd\xfe\x5f\x42\x76\xd8\xe6\xbb\x82\xeb\xf0\x47\xfe\x48\x71\x1d\xaf\x7a\x89\x3b\xdc\x75\x37\xbd\xae\xdf\x3d\xcb\x4d\xec\x5d\x24\x58\x68\x11\xf5\x9b\x25\xb1\x9e\x83\xca\x61\xe5\x59\x2f\xed\xc0\x8c\xa5\x44\x73\xce\xa2\xec\x12\x1b\xaa\x0e\x77\xfb\x2d\x9d\x76\x56\x57\xde\x67\x98\x0e\xd5\x7f\x2f\x17\x78\x58\xb6\xde\xcf\x84\xff\x90\x21\x2d\x96\x47\xf4\x1e\xed\x9b\x9d\x0e\xa3\xd8\xd6\x21\xe4\xbb\x40\x41\xac\xc5\x14\x6e\x96\xdf\xcf\x14\xea\x96\x2d\x30\xc8\xcc\xb3\x9e\xa2\xbe\x95\x8c\x9b\x87\x74\x45\x1b\xfe\xb7\xdd\xce\x71\x6e\x94\x92\x3c\xc8\x5f\xbd\x3a\x31\x30\x78\x0e\x2b\x3b\x2b\xb7\x6d\xa5\x34\x19\x12\xa4\xe9\x94\xca\xfa\x19\xbb\xa1\x97\x32\xf2\xea\x40\x2d\x71\xd3\xd8\xa9\x69\x67\x9b\x9d\x10\x42\x43\xd9\x83\x9c\x69\xee\x9e\x95\x5e\x1c\x60\x44\x97\x88\xd1\xf4\xf6\x65\x1f\x4b\xc9\xb9\x4d\x73\x52\x2e\xc0\xcf\x72\xca\xcf\xcf\x19\xf1\xf0\x3a\xd6\x23\x21\x04\xb5\x5c\xbb\x8b\x5b\xb1\xe2\x13\x44\x71\x3d\x48\x27\x42\xd6\xab\xc5\xa9\x57\x17\x4f\x62\x3b\x84\x95\x27\x2c\xc1\xe2\xb8\x31\x5e\x5c\x80\xf9\x47\xf5\x00\xc8\x3d\x85\x44\xf7\xcd\x4f\x65\x34\x89\x49\xef\x44\x20\xd7\xfc\x83\x1f\xa4\xae\x2e\xe1\x8d\xbb\xa6\x14\x92\x5c\xe1\xd7\x67\xc1\x77\xa6\x26\xc4\x52\x7a\x81\x54\xb5\x72\x92\x18\x6b\x04\x4c\xbf\x92\x89\x42\x53\xb0\x0f\xd9\x34\x3f\x9e\x69\x7b\x14\x12\xeb\xa4\x35\x97\xeb\x72\xa6\x69\xaa\xa2\xd7\x7e\xac\xb9\x68\xc2\x0f\xe1\x95\x05\xa3\x80\x74\x15\x86\x21\xb6\x06\xf7\x7d\x97\xbc\x6e\xbe\x50\xe7\x58\x92\x93\xdb\x27\xfc\x7d\xfe\x63\x1a\x4b\xee\x83\xb2\x26\x82\xa7\x73\x28\xc3\x6d\x9d\x7d\x1d\x89\x1d\x65\x21\x7c\xc4\x78\x64\xf6\x80\xdc\x8b\x5f\xd1\xa0\x1a\x0f\x7c\x34\x43\x0f\x77\x06\x0b\x69\x1a\x1a\xd2\x13\xd2\x28\x68\xe6\x1b\xbd\x38\xf4\x3f\x0c\x8b\x4d\xa6\x8a\x58\x31\x86\x66\xc0\x99\x76\x61\x70\xc2\xdb\x76\x6a\xaf\x41\x7f\x55\x6c\xc9\xa0\xa3\x93\x4e\x9f\xce\xf1"}, +{{0x4d,0xd3,0xb4,0x78,0xeb,0xdc,0x59,0x47,0x2b,0xab,0x14,0xa8,0xcd,0xd0,0xc2,0xfd,0xac,0x57,0x23,0xee,0x04,0xdd,0x89,0x17,0xc7,0xcf,0xe7,0xa5,0x36,0x48,0x5c,0x77,},{0x5b,0xcc,0xb3,0x7e,0x68,0xc2,0x34,0xbe,0xad,0x49,0x33,0x7d,0xe2,0x08,0xaf,0xba,0xf6,0x11,0x81,0x1d,0x96,0x58,0x59,0xa0,0x6d,0x31,0x30,0x12,0x47,0xd6,0x6a,0xcf,},{0x57,0x88,0xe7,0x9e,0x84,0x3b,0xde,0x9e,0xf1,0x1a,0x9d,0xfa,0xc9,0x70,0x19,0x6a,0x56,0x7c,0x63,0x08,0xc3,0x48,0xe5,0x17,0x4b,0x38,0x77,0x95,0x04,0x6d,0x59,0x0a,0x47,0x49,0x1f,0xd7,0x1d,0x97,0xae,0xaa,0x78,0xc1,0x61,0x59,0x71,0xb8,0x34,0x90,0xe8,0x59,0x28,0x20,0xf9,0x59,0x2a,0xc7,0x62,0x69,0xb9,0xd2,0xba,0x70,0x29,0x01,},"\x1c\xdb\xd2\x85\x56\xec\x44\xe8\x70\x5a\xfd\xa9\x2b\xd5\xa5\x3f\x95\xd8\xfe\x8b\x0f\xfe\x46\x33\x73\x63\x33\x16\xc5\x22\x74\xc1\x1e\xdc\xd6\x15\x51\xe3\x19\x9e\x49\x4d\xff\x6d\x90\x6a\x73\x9e\x7b\x32\x43\x03\xfc\x47\x82\x7e\x56\xde\xf0\xbd\xcc\x46\xb8\x16\x01\x7c\x71\x23\x05\x37\x02\x63\xba\xbd\x2c\x71\xbe\x47\x8f\x41\xce\x30\xb1\xdf\x63\xbe\xdd\x3b\x2e\x6a\x51\x9c\x53\xdf\x51\x58\x52\xc4\x13\x7b\xc1\xac\xa4\x9b\xf4\xc4\x63\x1f\xd6\x56\x46\x57\xd1\x1c\xd8\x3e\xa7\x3c\xc3\xd0\xcf\x9e\x3b\x3c\x3e\x7c\xa9\x9b\x4f\x12\xa9\xc9\xb6\x7c\x87\x98\x14\x8e\x0a\x0d\xc1\xef\x8b\xf5\x86\x42\xa1\x4f\x97\xa5\x72\x13\x55\x14\xc1\x0b\x19\xaa\xbe\xc2\x5a\x9c\x6b\x35\xaa\x40\x34\xa5\x7a\xae\x1b\x6d\x05\xbd\xe2\xb6\x33\x0f\x25\x1d\x78\xdb\x09\x93\xf0\xca\x4c\x26\x38\x6e\x34\x89\xa2\x09\x28\x33\xb8\xac\xbb\xc4\xf4\x91\x7f\xd3\x09\x3d\xf5\x82\xff\xf7\x1e\xce\x21\x9d\x36\x72\x45\x55\x82\x60\x9c\x0d\xb8\xd9\x6a\x70\xfc\x8a\xed\x67\x98\xde\x54\xbf\xb2\xb3\xee\x6c\x5d\x32\x8d\xb1\x63\x59\x3f\x58\x01\x9f\x38\xf3\x39\xfd\x37\x53\xf8\x96\xa4\xa2\xcc\xa8\xc1\x40\x0a\x77\xea\x39\x19\x35\xf3\x4e\x26\x39\xc5\x60\x86\x08\x10\xbb\xbe\x4b\xe1\xd1\x6e\x01\x2c\x11\x49\x0a\xa8\x4f\x29\x64\xc8\x77\xc2\x93\xb3\x00\xf4\x3d\x37\x9f\x3e\xba\x9a\xf3\x91\xde\xe5\x10\x85\x6a\x4d\xdc\xf7\x6e\x0a\x0a\xe0\x6a\x6a\x7c\x0f\x9c\x5e\x3f\xa1\xb8\x35\x4f\xe8\x97\x7b\x4e\xa3\xb2\x06\x61\x49\x1f\xa4\x61\x3b\xa6\x2f\x55\x6d\x5d\x5d\xa8\x21\x3d\x01\x21\xde\x2c\x87\x25\xdf\x0a\xae\x04\x8a\xc8\x91\xab\xbc\x06\xbd\xce\xf3\xc3\xef\xfd\xf5\xa3\x17\x49\x47\x6f\x81\x4d\xb9\x45\x79\x45\xf0\xd9\x1e\x14\x08\x00\x56\xbe\x92\x1a\x16\xaa\x96\x4a\x92\x98\x22\x1b\x15\x75\x94\x97\x3e\x32\x96\x99\x93\x31\x0c\x87\x07\xe1\x9f\x31\x43\xab\xc4\xfd\xa7\xc8\xad\x01\x60\xac\xf0\x31\xab\xa6\x52\x80\x1a\xa8\x1a\x01\x6b\x31\x37\x03\x9e\x27\xd6\x73\x8d\x02\x80\x0a\x93\xa8\x6f\x9f\x55\x85\xc5\x18\xdf\xa9\xe7\xd8\xac\x72\x7f\x37\x43\x7e\x56\xd2\x78\x83\x86\xe1\x16\x53\xa0\x4e\x16\x51\x69\xf9\x03\x97\x2a\x01\x48\x47\x51\xe7\xcb\x38\x63\x25\x90\xec\x80\xd5\xfc\xe4\x54\x16\x01\xa0\xe0\x95\x78\x5a\x9e\xe8\xd3\x59\xed\xf2\x6b\x99\x46\xe7\x98\xda\x59\x98\xcb\xb7\x36\xf9\x4e\xb7\x13\x46\x3f\x79\xf5\x61\x75\x9b\xbc\xb4\xc4\xac\x69\x3c\xab\xf2\xe1\xe0\x36\xb2\xd0\xb0\x87\x9a"}, +{{0x07,0x4d,0x92,0x18,0xc1,0x21,0x7e,0x75,0x82,0x3c,0x90,0xe0,0x10,0x48,0x4c,0x2a,0xdb,0x88,0xec,0xcc,0xd2,0xbd,0xf0,0x12,0x0a,0xa3,0xed,0xff,0xcf,0xcb,0xd4,0xbf,},{0x37,0x35,0xad,0x19,0x19,0x03,0x3d,0x16,0x17,0xb8,0x5b,0xda,0x04,0xb1,0x61,0x21,0xda,0x1d,0x86,0x1b,0x40,0x41,0x54,0xfa,0x96,0x1d,0x49,0x46,0xe5,0x5e,0xcd,0x83,},{0xb1,0xf7,0x1c,0x3b,0xd1,0xb6,0xbe,0xc4,0x33,0x37,0xe2,0x6d,0xee,0x65,0x5a,0x8d,0x5f,0x4a,0x8d,0xad,0x84,0xa5,0x11,0x84,0xb7,0x75,0xb6,0x86,0xfa,0xd3,0x1d,0x80,0x29,0xe3,0x87,0x69,0x27,0xf9,0x57,0x6e,0x90,0xc3,0x62,0x48,0x75,0xfc,0x00,0x29,0xa5,0xc1,0x0a,0x8a,0x0a,0xf7,0x5d,0x7a,0x88,0x0c,0x68,0x44,0xa4,0xa8,0x3a,0x00,},"\x6b\x5a\xa4\x0e\x91\x67\xbf\xdb\x84\x7d\xaa\x7d\x27\x86\xe2\x8e\x75\x33\xe1\xd6\xac\x53\xbe\xb6\xf6\x9b\x59\x53\x79\x5a\x2b\xf5\x9b\xbf\x7d\x14\x19\x26\x96\x8f\x50\x96\x9b\xad\x74\x2a\x4f\xb5\x79\xd3\x25\x0f\xb1\xbe\x4c\x57\xeb\xf4\xf9\x11\x2c\x70\xcd\x9f\x72\xa0\x0d\xb1\xc8\x89\x6f\xe2\xb5\xbd\xa7\xc7\x03\x0f\x49\x7c\x0b\x00\x1e\xa2\x5b\xa0\xd4\x47\xf0\x8c\x36\xdb\x8b\x90\x7c\x2f\x2a\xbb\xbb\x62\x0d\x3e\x8a\x2c\x66\xe4\x17\x12\x85\xad\xca\xad\xd1\xc1\x4f\xe2\x39\xbc\x59\x5f\x09\x83\x96\xaa\x87\x80\xff\xb8\x0f\xe1\x44\x6a\x07\x00\x1e\xc2\x34\xd8\x2a\xbd\xcd\x81\x00\x79\x39\x15\xb0\xb3\xf8\x0d\x84\xe2\x0e\x51\xea\xbc\x79\x78\x06\xf3\xbe\x81\x08\xa4\xf4\x37\x55\x0b\x06\x69\x40\x50\xa8\x29\x31\xac\x40\xc0\xa4\x89\x77\xed\xf6\xce\xd2\x42\x8d\x7c\xfe\xa8\x20\x55\x06\xde\x86\x40\x80\x65\xd1\xa1\x98\x70\xfa\x33\xa7\x08\x10\x37\xb3\xee\x44\x91\xb6\xe7\xf3\xd1\x0b\x14\xa3\x0c\x20\x91\x59\xa1\xc8\x12\x31\xa3\x5f\x03\x65\xb4\x7d\x3e\x0d\xa0\x4a\x32\xc9\x5d\x98\x33\x3c\x44\xf5\x72\xcd\xaa\xa9\x05\xd0\x69\x19\x7f\x6e\x86\x1b\x5d\xfc\xdf\xb9\xdb\x6c\x7b\x0d\x0c\xb0\x0f\x37\xc9\x16\xa1\xc4\xc0\xb8\x98\x5b\x09\xf3\x34\x09\x5e\x12\x83\xed\xfd\xd4\xe6\x2a\x29\x41\x09\x9a\x2b\x69\x36\x96\x60\x4d\x99\x43\x11\xe3\xd5\xf6\x10\x66\x83\xe1\xd7\xa1\xc7\xe5\x3d\xf7\xb7\x90\x94\x7a\x9a\x80\x1a\x0c\xcd\x48\x43\x95\xf6\xcb\xfd\x9c\xa4\xd9\x80\x4f\x18\xd5\x2b\xb0\xf9\x46\xd1\xa8\x9f\x97\xa6\xfb\x06\x80\xa8\xc4\xc0\x57\xb6\x06\x2b\x2b\x9d\xe7\xc0\x37\x48\x79\xb8\xa6\xa6\xd2\xc1\x0a\xef\x78\x05\x08\xeb\x28\xbb\x56\x9a\x08\x35\x09\x44\xc8\x2f\x6e\xf2\x8d\xb2\x30\x4d\xb6\x97\xc3\xae\x1a\xf4\x3a\x50\x0b\x0b\x97\x48\x03\xe9\xf4\x6e\xa2\xa0\x2e\x85\xed\x27\xdd\xa6\x16\xd2\x4d\x6d\xb3\xcc\x4f\x5a\xed\x82\x40\xb1\xae\xa3\xdc\xf6\x9d\xee\x5f\x14\xf9\x5e\x6e\x72\x98\x7b\xbe\x61\x89\xbc\x20\x45\xf0\xd7\x83\xa7\xb4\x7b\xfc\x19\x83\x0b\xc7\xf4\xe7\x98\xab\xe9\x02\x45\xfb\xd4\x3f\x37\xc3\xf0\x36\xd1\xcb\xf1\xe7\x3d\xcb\x1d\x9d\xaa\x87\x37\x9b\x11\x06\x97\x34\x81\xa2\x15\xc1\xf4\xf4\x6c\x16\x03\xa5\xd5\xcd\x97\xb7\x07\x6f\x1f\x5d\xc7\x89\xaa\x6a\x71\xe7\x2e\xf5\x4e\xd3\x28\xa4\xab\x64\x34\x05\x39\xff\xd1\x64\xd0\xec\x64\x5f\x32\x2d\x1b\xc3\x71\x12\xdc\x08\xd8\xc8\x07\x9d\x19\xd3\x7a\xbb\x23\x53\xf4\x8b\x5c\x49\x2f\x80\x6e\xd2"}, +{{0xd2,0xea,0x2d,0xff,0x7a,0xf0,0xba,0x2a,0x6b,0xed,0x7f,0x6c,0xc6,0x8c,0x0d,0xf6,0x64,0xa6,0xb1,0x0c,0xe8,0x01,0xc4,0x2e,0xd5,0xbb,0xe6,0x17,0xbc,0xc8,0xb8,0x4a,},{0xab,0x44,0x70,0x63,0x44,0x02,0x6e,0xd3,0x5e,0x21,0x98,0x29,0x64,0xf7,0xb4,0xdb,0xbb,0xe2,0x07,0xfd,0x27,0xc4,0x67,0x99,0x70,0x1c,0x19,0xa4,0xd8,0x8d,0x1d,0x72,},{0x9a,0xbd,0xb9,0xdd,0x2a,0xb7,0x7b,0x6f,0x5e,0x1b,0x91,0xba,0x0b,0x61,0x3f,0x5f,0x36,0x0e,0xfb,0x50,0x0d,0x3f,0xe9,0x92,0x90,0xef,0x7c,0xa1,0x4b,0xd2,0xb3,0x30,0xf4,0x05,0xa4,0xf7,0xdc,0xda,0xef,0x49,0x23,0xd3,0x11,0x1d,0x40,0xbf,0x03,0x20,0x35,0x33,0x86,0xf6,0x34,0xb4,0x0d,0xe6,0xf0,0x4d,0xe9,0x19,0x0a,0xd5,0x1c,0x08,},"\x03\xab\x5d\xae\xbc\x6e\x70\xd3\x52\x97\x79\x32\xa0\x31\x07\x87\x9b\xd5\x5d\xaf\xd0\xc6\xba\x7a\xd9\x69\x7a\x17\xb1\x27\xb3\xa7\x4a\x3e\xae\xba\xbd\x0f\x8e\xee\xbf\xc0\x48\x3d\x63\xfe\xdd\xe5\x2d\xeb\x46\xa3\x75\x24\x49\xc9\xc4\x49\x5c\x51\xa1\xc9\x1f\x57\xe3\xad\x2e\x6d\x01\xa1\x3d\x0c\x47\x0c\x52\x91\xb8\xe9\x12\x28\x83\x40\x97\x0f\xbb\x85\x78\x7b\x8b\x37\x6d\x72\x17\x52\x50\xe8\xcd\x90\xc0\x78\x88\xbf\xef\x5e\xbf\x50\x86\xc8\xff\x2a\xbc\xdd\x12\xd2\x14\xb9\xc4\x5d\x12\x08\x73\xb4\x60\x2e\x57\xa6\xaa\xb0\xb8\x28\xd1\x08\x4d\xff\xaa\x36\x51\xee\x35\x66\x26\x95\xb7\xf3\x43\x3f\x4a\xb5\x30\xc2\x9a\xc6\xcc\x5b\xb4\x3e\xcc\xd1\xb6\x89\x8b\x9e\xf7\xae\xc6\xd5\xae\xc6\x8d\x5c\x11\x14\xbb\x5d\xf7\x82\x09\x66\x59\x4c\x99\x4d\x64\x08\x91\xb8\xf2\xdc\x5d\x25\x63\x8d\xe4\x35\x49\xd8\x6d\x34\x30\x6f\xf3\xf5\x74\x57\x51\x16\x40\x5b\x9e\x8e\x28\x6e\xe0\xcd\x97\x8a\x76\x00\x2c\x44\x35\xfe\xaa\xc6\xe8\x4e\xae\x16\x54\xf3\x39\xa5\x67\xd8\xd0\x4f\xcf\xa3\xeb\x6a\x04\xb9\xad\xc6\x66\x02\x13\x00\xe9\xee\x59\x72\xb3\xdf\x5d\x4d\x0d\xd4\xbf\x79\x21\xdc\x98\xde\x82\xce\xf2\xd1\xb1\xd6\x1b\x79\x7f\xc9\x96\x8e\x11\x84\x84\xc4\x13\x42\x41\x6d\xdc\x6a\xdc\x4e\xe5\xd6\x87\xd9\x4a\x40\xce\x57\x2f\x42\xa2\x04\x86\x68\xc1\x75\xcf\x7b\x1f\x24\xc4\xef\xd0\x20\x55\x4f\xc6\xf6\x42\xe1\x4a\x57\xba\xec\x23\xe9\x5c\x25\x14\x30\x6d\x0a\x6d\x33\x64\x88\x41\x49\x7e\xac\x48\xea\xbd\x96\xd0\x47\x31\xba\xb0\x8b\xf5\xea\x9d\x43\xe0\xcf\x9a\x37\xfa\xaf\xa7\x32\x86\x9d\x68\xe7\xd5\xfe\x69\x54\xf8\xa3\x19\xef\x55\xda\x1e\x17\x8e\x43\xe8\x4a\x3b\x9a\xa3\xad\x00\xc2\x9b\x1d\x16\x11\x63\xdf\x4b\x79\xf2\x88\xe9\x39\x1d\x70\xa2\xf8\x81\x3d\x66\x62\x2e\x8a\xc3\x33\xfa\x6a\xa5\x31\x1e\xab\xec\x38\x3b\xa4\xcc\x12\x28\x15\xde\x00\x88\x77\xef\xbe\x6e\x12\xc3\x22\xc9\x75\x43\x4a\xfa\xd1\x73\xeb\xe2\x42\x03\xd9\x16\xd5\x75\x78\xbd\x2b\xca\xcc\x78\xf6\xe2\x56\x45\x13\xf8\xd1\x13\xa8\x33\xc2\xc2\x26\xeb\x97\xba\x2e\x23\x36\x1a\x5d\x02\x66\x4a\xb3\x77\xf9\x64\xc4\x30\x0b\xe2\xd7\x7b\x62\xd9\x24\x08\x23\xa0\x98\x84\xdf\x30\x7e\xff\x3b\xe5\x66\x4d\x72\xd1\x1a\xd5\x13\xe1\xbc\x56\x10\xdb\xfd\x10\x09\xdb\x39\xf0\xcb\xfe\x47\x05\x55\xec\x1b\x56\xb8\x71\x67\x07\x93\xd3\xb7\x04\xfb\x06\xee\x95\x0b\x1a\xd2\xa4\xd7\x29\x7c\xa5\x8b\xba\xd8\x10\xc3\xfa\xd4"}, +{{0x7a,0x60,0xcd,0xf1,0x87,0x04,0x60,0xde,0x8a,0xe7,0x78,0x11,0x76,0xd5,0x12,0x7e,0x71,0x20,0x7f,0xaf,0x2f,0x21,0x0b,0xd4,0xdc,0x54,0x73,0x85,0xb6,0x67,0xf2,0xf2,},{0xea,0xd6,0x7a,0x9c,0xf3,0x4d,0x0f,0xf1,0x4e,0x79,0xaf,0xa4,0x6f,0x2d,0xc9,0x96,0xe9,0xac,0x0e,0x3e,0x07,0x63,0x22,0xfb,0xb4,0x00,0x97,0x67,0xb1,0x33,0xf0,0x1b,},{0xb2,0xe0,0x81,0x42,0xbd,0xd6,0x2b,0x78,0x65,0x92,0xc0,0x91,0xf5,0xfe,0x6a,0x9b,0x7f,0x30,0xce,0x13,0x4c,0x3b,0x23,0x6f,0xbc,0x6d,0xfe,0x67,0x34,0xf8,0x82,0x70,0xac,0x58,0xf6,0xd7,0x4b,0x4f,0xd9,0x9c,0x22,0x45,0x1c,0xa4,0x65,0xa4,0x2c,0x00,0x6d,0xb2,0x5a,0xf2,0x15,0xed,0x24,0x1a,0xf1,0x18,0x96,0x27,0xc6,0x05,0x0f,0x00,},"\x9d\xc0\x23\xa5\x25\xd0\x1b\xa3\x51\x37\x98\xb7\x38\xc7\x91\x62\x92\x6e\xbc\xcc\x0a\xdf\x1e\x57\xac\x47\xc2\x0d\xea\x6c\xe1\x37\x5c\x3d\x2a\xaa\x17\x33\xb7\xf0\xc3\xbd\x94\x5c\x33\x5f\xf3\x57\x61\x12\xbb\xdc\x10\xb6\x78\x3b\xa6\x54\xe8\xc6\x10\x47\xf2\x77\x3a\xa2\x29\xbf\x84\x69\x22\xa8\x9c\x6a\x73\xd5\xf1\x05\x1e\x8d\x96\xed\x36\xd7\xd6\x74\x7e\x06\x3a\x7a\xc6\x02\xf1\x9f\xc5\x2e\x02\x1a\x4b\xbc\x28\xb0\x35\x14\xfb\xd5\x1c\x7b\x3f\xd6\x59\xf1\x2d\x54\x7d\x05\x92\xdd\x09\xf8\x73\xc9\xec\xc6\x43\x9c\x7e\x93\x1a\xd0\xe4\x85\x6b\xe3\x1c\x60\x5d\xef\x2e\xd9\xb5\xd1\x3c\x59\x42\xb2\xf3\x25\x39\x7d\xac\x6c\x97\x60\xe9\xb1\xbb\x0c\x06\xf7\x13\xcb\x92\x0c\x23\x4b\xcc\xfe\xe9\xf0\xb8\x5d\xd0\x20\xf7\x98\x8f\x3b\xe1\xcc\x66\xe9\xe5\x1b\xab\xe2\xfe\xe2\x37\xeb\x84\xec\x7e\xff\x94\x09\xaa\x91\xc1\x94\xe3\x0d\xb1\xe0\x65\x01\x59\x55\xde\x97\x46\xbb\xa0\x3f\x7e\xdf\x9a\x58\x75\x12\x40\x9a\x41\x61\xfa\x77\xea\x62\xcc\xf4\x31\x60\x2d\xcd\xcf\x36\x5e\xd6\xbf\x0a\xed\xdd\x32\xf7\xc8\x44\xe3\xa3\x4d\x26\x6e\x28\x38\x2f\x40\x62\xfd\x4d\x6f\x82\x14\x25\x21\x04\xd6\x43\xa9\xbf\xd8\x07\x17\x16\x37\x1c\xcb\xb5\x4c\x8c\xc8\xdb\x79\xad\xd6\x5b\xcb\xce\xa0\xd0\x80\xd8\x40\x28\x03\xfe\x23\x2d\xf7\x0f\x76\x57\x72\x47\xa6\x3d\x55\x83\xbb\xd5\x64\x27\x67\xbc\x63\xf3\xc5\xa7\xbb\x3a\x47\xeb\x12\x98\x4e\x45\x41\xf4\x1f\xdb\x55\x86\x9a\x08\xfa\xde\x66\xc2\x0f\x69\xa5\xa9\xde\x25\xf6\xb3\x6b\xa1\x8a\xce\x5b\x4a\xc3\x36\xbb\x2a\x8e\xbf\x63\x0a\xd0\x3e\x8b\xb8\x73\x1d\x01\xe8\x4b\x91\xd0\x24\xd1\x17\x45\x9a\x74\x89\x2e\x93\xd5\x3b\x61\xe6\xb8\x06\x8e\x4f\x04\xb4\x18\x1f\x03\x87\xb4\x56\x7c\xcd\x45\xe1\xb8\x71\x8a\x2d\x7d\x78\x78\x72\xf3\xdc\xf8\x7a\x15\x93\x5a\xd7\xda\xaa\x74\x4e\xd6\x8a\x28\x66\x6a\x51\xa1\x0d\x39\xfc\x13\x9c\xdf\xe9\xa6\x87\x30\x76\xf7\xc4\x25\x00\x9c\x38\xfa\xee\x13\x5e\x51\x32\x07\xb0\x6e\x7b\xa3\x56\x85\xf5\x07\x2d\xa3\x4b\x60\x45\xb5\x7c\xd5\xd1\xb1\xa1\xfd\xf0\x17\xb8\xaa\x8e\xbd\x27\x52\x2b\xc9\x5e\x47\x90\x87\x34\xe4\x17\x22\xa7\x67\x90\x5c\x5e\xcc\x30\xc7\x24\x81\xb6\xc1\x2b\xf4\xac\xe9\x4d\x5b\xb3\xa3\x15\x56\x91\xb7\x07\x5b\x40\xeb\xf5\x96\x8f\xdd\x90\x3d\x8f\xd3\xcc\x50\xb8\xd6\x46\x48\x59\xb1\x0f\x75\x51\x32\xc6\xd9\xb6\xda\xd1\xd6\xf1\x4c\x41\x85\xb2\x64\xd3\x49\x7a\x4e\x54\x98\x77\xfe\x94\x6e"}, +{{0x33,0x79,0xd2,0x5c,0x11,0x17,0xcf,0x80,0x2e,0xc7,0x9c,0x06,0x57,0x5d,0x18,0xe6,0xbe,0xce,0x4c,0x70,0x93,0xdd,0x43,0xfd,0xee,0x03,0x68,0x5c,0x70,0xb2,0xfa,0x9f,},{0x85,0x25,0x15,0x6f,0xe2,0x9f,0xc2,0xfb,0xf6,0x61,0xba,0x50,0x18,0x2b,0xe2,0x0c,0x89,0x98,0xd9,0x41,0x49,0x3d,0x59,0x33,0xdc,0xa4,0xd8,0xb4,0x1f,0xb4,0x42,0xd5,},{0x4c,0x36,0xbf,0xc8,0x1e,0xef,0x00,0xb9,0xcb,0x3a,0xb5,0x14,0xc6,0xd4,0x51,0xb9,0x93,0x36,0x1e,0x09,0xa4,0xbe,0x4b,0x50,0x40,0x92,0x6f,0xeb,0x0e,0x0d,0x9b,0x52,0xf0,0x3d,0xe4,0x68,0xe7,0xba,0xd8,0x3f,0x37,0x91,0x54,0xbf,0x2c,0x43,0x7a,0x71,0xf7,0x54,0xf3,0xf4,0x07,0x98,0xee,0xeb,0xd6,0x2e,0x55,0xf2,0xbe,0x77,0x14,0x03,},"\x7a\xcd\xb3\x9f\x12\x26\xbd\x3a\xbf\xfa\x50\x35\x0a\x14\x97\xd7\x61\xf8\xf0\xaa\xef\xbf\xbb\xbb\x92\x5f\xf5\x63\xe3\x89\x76\xaa\x17\x2d\x40\x7b\x61\xff\xdf\xb1\xcd\x53\x8a\x4c\xd0\x00\xb5\x78\x18\xa0\xbc\x92\xc0\xe0\xcd\x0a\x5a\xbf\xcf\x57\x83\x00\xf5\xf4\xe6\xce\xfa\x26\x72\x75\xd1\x78\x45\xda\x70\x66\xfd\x4e\x18\x01\x00\x27\x96\x0c\xd3\x95\xe6\x82\xad\x71\xaf\x34\x9b\xbd\xad\x5e\xba\xa0\xf1\x1a\x77\x61\xe1\x9e\xa1\xbe\xf6\x61\x07\x43\x16\x4b\x17\x14\x14\x53\xb4\x72\xae\x2c\x8f\x36\xce\x6b\x08\x0f\x1c\x07\x45\x35\x24\x54\xce\x5a\xea\xe1\x1c\x9d\x75\xde\x3c\x08\x00\x42\x65\xfc\x4c\xa8\x0d\x33\xb2\x6e\xae\x14\x00\xdf\xd8\x97\x7b\xf7\x23\xa6\x16\xda\xeb\x6d\x42\x19\x90\x10\xb7\x3e\x19\x3a\xb7\x2a\x58\xbd\xd2\x48\xa7\xf4\x11\x1c\xa5\x0c\x1d\xe6\x46\xbf\xea\x7b\x4d\x5b\xaf\x0f\x93\xdd\x97\x3e\xe9\x36\x49\xe2\x1e\xc0\xc6\xc4\xfc\xca\x8c\xd6\xff\x69\xdf\x76\x16\x12\x02\x1d\x85\xff\x1f\xb2\xa9\x53\x37\xda\x48\x05\xa7\x6d\x34\x7e\xe7\x1e\xf1\x9c\x0d\xff\xb5\x9f\x15\xf6\x50\x29\x3a\xbb\x97\x21\x05\x3f\x74\x06\x90\x5a\xe6\x83\xf9\x6c\x83\xa3\xa7\x44\x7b\x1a\xfb\x14\xe1\x20\x8c\x63\x9f\x37\xa9\x75\x0b\xa2\x1d\xa5\x55\x2c\xc2\x04\xea\xc4\x53\xca\x03\x62\x82\xf7\xe0\x96\x10\x93\xc3\x9e\xc1\x18\x13\x8d\xcf\x71\xcf\x2d\x28\xfb\x96\xa2\x49\x62\xb5\x2d\x33\x93\xf8\x80\x65\x3b\xcb\xa2\xc9\xb9\xd5\x7b\x77\xc5\x22\xf4\x21\xfc\xf5\xad\x75\xfb\xa9\xcf\x33\x89\xb1\x23\xaa\x97\x52\x17\x13\xff\xf8\x84\x67\xde\xb8\xc8\x99\x1d\x4b\x57\xc1\x43\x81\x70\x53\x7c\xb5\x0c\xdc\xc6\x57\xe5\x0e\x5c\x48\x0e\x12\xc0\xd4\x49\x39\xb6\x39\x99\x44\xe7\xc7\x1e\x18\x6c\x2a\xbb\x81\xfc\x57\x34\x88\x36\xd5\xe5\x7b\x72\xb2\x24\xa6\xb7\x1b\x6c\xaf\x72\x1a\xca\x73\x47\x8c\xb6\xcf\x5f\xb8\x90\x71\xae\x3a\x39\x82\x02\xdb\xb3\x8c\x30\x81\x25\x63\xbb\x9a\x23\x40\x66\x57\xa9\x56\xd3\x05\xa3\x44\x9a\x60\xcc\x86\x41\xb6\x21\x75\xa7\x17\x0c\x23\xbd\x5a\x25\xf0\xf1\x2e\x15\xa7\xed\x91\xfa\xda\x6a\x4a\x2f\x0e\x7b\x15\x5a\x3d\x64\x85\xec\x03\xce\x6e\x34\xdf\x7e\x21\x62\x40\xbb\x28\xa2\xdd\x73\x2f\xf7\x90\xd2\x28\x6e\x20\x0b\x33\xc2\x9a\x31\xa5\xe1\x9a\xd2\xcd\x02\x97\x4b\xad\xc4\xbc\x22\xde\xb7\x50\x4c\x15\x24\x1f\xc1\x06\x0c\x8a\xce\xf4\xfb\xb2\x5e\xc7\x60\x2f\xce\x36\xa2\x7b\xb8\x7b\x6e\x64\x23\xe6\xb4\xf6\xe3\x6f\xc7\x6d\x12\x5d\xe6\xbe\x7a\xef\x5a"}, +{{0xef,0x38,0xc3,0xfc,0x74,0xf0,0x54,0xae,0x43,0xe8,0xd2,0x9d,0x6b,0xa6,0xdc,0x80,0xb5,0xaf,0x84,0x82,0x70,0xd4,0xaf,0x58,0x84,0x4d,0x24,0xbc,0xf9,0x87,0x41,0x4e,},{0x0a,0xe1,0x47,0x8b,0x05,0xfb,0x32,0x99,0x65,0xea,0x0f,0xa9,0x28,0xdc,0xbe,0x81,0xa0,0xbd,0xbb,0x6f,0xf6,0x6c,0x81,0x16,0x71,0x63,0x5e,0x43,0x88,0x88,0x80,0x51,},{0x1d,0x3a,0xc6,0xb6,0xbf,0x18,0xab,0x53,0x09,0x14,0x87,0x99,0x48,0x5b,0x27,0x6d,0x20,0x40,0x1c,0x6a,0xf5,0xf9,0xb2,0xf6,0x03,0x23,0x95,0xa3,0xc2,0xf4,0xb6,0x73,0xb7,0x14,0x0c,0x07,0xcc,0x26,0xf4,0xfc,0x56,0xa5,0xee,0x00,0xb0,0x74,0x6b,0x2a,0x80,0xda,0x6f,0xda,0xd1,0x7e,0xdd,0x11,0x49,0x20,0x10,0x1d,0x2c,0x89,0xc3,0x0e,},"\xbf\x29\x0d\xb3\xdd\xa8\x76\x39\x37\xae\x4c\x83\x74\x67\x05\x32\x72\x95\xc2\xc2\x48\x06\x8f\x5a\xb8\x5c\x8b\x5d\x75\x6f\x4e\x3e\x34\x06\x2b\x55\x49\x38\x72\x61\x47\x6b\xcb\xd1\xe7\x33\x19\x90\xf1\x19\x10\xd1\x1f\x94\x60\x7c\x2b\x71\xf6\x5b\x77\x1a\xac\xab\xdc\x10\xf4\x2a\xe9\x18\xdd\x25\x94\xac\x71\x05\x1c\x85\xb3\x30\x77\x9c\x47\xaf\x00\xa5\xb9\x81\x91\xb5\x6c\xbc\xf7\xef\xe4\x1a\x27\xe8\x7c\x67\x71\x68\xc8\xab\xe9\x49\x6e\xb2\xe7\xab\xbd\x0b\x16\x04\x28\x6e\xd1\xa1\xb1\x8d\x26\x4d\x73\x3d\xe8\x7d\x0d\x3f\x80\x55\x52\x8c\x4d\x42\x6d\x7f\x8e\x6e\xd0\x24\xa7\x41\x40\xab\xd3\x54\x00\x79\x62\xa2\xa9\x7a\x5c\x2f\xf9\x76\x54\x6a\x8d\x1a\xc4\x92\x4c\x09\x22\x3d\x34\x8d\xdc\xd8\x71\x0a\x37\x99\xf9\x1b\xb8\x70\xb3\xf4\x6d\x51\xf1\xe7\xf6\x89\x2d\x6b\x08\xb9\x91\x74\x8a\x03\x7a\x86\x7e\xcc\x39\xee\x8d\x64\x62\xa7\x61\x44\x88\xed\xd3\xc2\xba\x61\x5c\xa2\xe3\x78\x54\x88\x94\x41\xb1\x3d\xc8\x35\xc3\x6b\x38\x65\x3f\x65\x98\x61\x6f\x35\x78\x3e\x2e\x15\x83\x84\xbb\x93\x1c\x90\x1b\x70\x3a\xcb\x39\x91\xfb\x7a\xa5\xba\x69\xd9\xa5\xbd\x05\x70\x24\x29\x61\xa7\x1a\x52\x47\x03\x15\xe9\x82\xe3\x41\xa6\x1c\x64\xa6\x19\xbd\x16\xfe\x81\x19\xaa\xe0\xd7\x50\x3c\xe7\xd7\xe9\x26\x14\x6b\x91\xc2\x89\x2f\x13\x16\x69\xd1\xe3\x9e\x5b\x75\xe9\xc7\x24\x52\x61\x80\x99\xa5\x7d\xc2\xee\x37\x7b\xe6\x58\x75\xee\x01\xbb\x88\xed\x52\x6f\xc3\x94\xe2\xf5\xc8\x12\x7a\x5f\x69\x12\x5e\x67\x38\x5e\xf9\x4b\x1f\x33\xad\x52\x62\x9d\x72\x0e\x31\xc0\x2a\xe0\xb5\x82\x33\x9f\xf0\xf0\xbb\x07\xff\x2b\x03\x0f\x48\xfa\x7b\x69\x27\x16\x50\x1a\xd7\x77\x3a\xd3\x15\x12\x04\xa2\xa5\x40\xfa\x94\x36\xbd\xd4\x20\x2a\x15\x73\x09\xec\x36\xce\xcb\xe5\x8b\x33\xef\xf5\x57\xfd\x33\xe0\x3f\xd3\xeb\x19\x00\x9b\xd7\xa2\xde\xa9\xef\xee\xf8\x78\x55\x67\xaa\xb2\xa4\xc9\x8b\xd1\xf2\xa8\x10\x11\xb3\x43\xa9\xf2\x0c\x44\xc5\x77\xa4\x52\xfd\x54\xba\x21\x02\x9d\x47\x06\x81\x3b\x29\x87\xc7\x6b\xb2\x42\xab\x26\x20\x84\x3c\x22\x60\xb6\x69\xad\x35\x8e\xfe\xe7\xf9\x83\x0d\xc9\xc7\xd4\x78\xa2\xde\x4a\x2c\xf8\xc4\x3d\xa7\x70\xe2\x88\xe2\xed\xbb\x6d\x73\xbc\xf2\xec\xb0\x23\xde\x6b\x2d\xcc\x6b\x16\x6e\x87\xa3\x85\xeb\x0a\xdc\x30\x56\x65\xc5\xbf\xa5\x7f\x25\x0f\xe2\x23\xad\x7f\xf4\x51\x8d\xe3\x9c\x79\xe8\x7d\xc1\x01\xa9\xfa\xa6\x82\x1a\x74\x44\x2b\xfc\xfd\xf0\xa9\xe6\x3a\x50\x9e\x2a\x2e\x76"}, +{{0x7e,0x7b,0x39,0xaf,0x69,0x38,0x0c,0xf4,0x46,0x60,0xe2,0xc1,0xff,0x30,0x83,0x34,0xe8,0x25,0x0f,0xee,0xb8,0x8b,0xe0,0xd4,0x3a,0xab,0xe5,0xe6,0x8b,0x8e,0xf1,0x71,},{0xcc,0xef,0x9d,0xae,0xd9,0x25,0x23,0x53,0x3d,0x4a,0x2d,0xab,0x6d,0x24,0x19,0xf6,0xd0,0x86,0x04,0xdb,0x64,0xce,0x37,0xe3,0x29,0x04,0xac,0x77,0xb9,0xb4,0xa0,0x1c,},{0x10,0x62,0xa2,0xdc,0x9c,0xd5,0x37,0x96,0x75,0xc0,0x4f,0x5e,0x21,0x33,0x8d,0xcf,0xb7,0x7d,0xfb,0xab,0xce,0xdd,0x62,0xb2,0x60,0x71,0x00,0xd7,0x64,0x9a,0x05,0xe8,0x08,0x71,0xe9,0x61,0x23,0x21,0x4f,0x80,0xf4,0xf7,0x3b,0x0d,0x9b,0x06,0xe2,0xd3,0x1f,0x56,0x11,0x9c,0xea,0x69,0xda,0x23,0x47,0xda,0x84,0xa2,0x75,0xb7,0xb2,0x07,},"\xd4\xa3\x97\x6d\xbf\x83\x20\x18\x56\x67\xb5\xa8\x23\x66\x40\xf2\xeb\xc9\xe4\x5e\x6d\x5f\x2a\x8d\x92\x99\x79\x27\xdd\x9b\xc5\xdb\x95\xf4\x46\x34\xbd\x65\x4e\xef\xec\xe1\x0d\x99\xd9\x2b\x46\x71\x57\x91\x64\x50\x04\xac\xcc\x6d\x14\x0f\x32\xa1\xc8\x72\xe5\x4a\xa9\xa7\x49\x3a\xf9\x45\x88\xb7\xbb\x40\x0d\x94\xd4\x58\xd4\x32\x92\x30\x7c\x5a\x1a\x38\x82\xa1\xc8\xa6\xa7\x8d\x9a\x94\x5f\x79\xd6\x4b\x32\x94\xa2\x8c\x3d\x59\xd8\x20\x22\xb0\x09\xcc\x4d\x2d\xa9\x3a\x16\xb0\x71\xc9\xab\x8e\xe9\xa3\x66\x3d\x72\xed\x34\x4f\x15\x1d\x68\xc6\x66\xa4\xb4\x96\x52\xd9\x7a\x46\xd1\x42\xa4\x74\x11\x27\xf3\xc5\x7f\x15\x51\xc4\x09\x76\xcd\x13\x81\xa8\x2a\xea\xe7\xbc\x5a\xdb\x39\x87\x20\xeb\x43\x3f\x08\x99\x48\x7e\xd2\x37\x84\x46\xb1\xa8\xdc\x6a\x33\xfc\xd4\x53\x7a\x05\xfb\x60\x3e\xc0\xa9\x0a\x27\x53\x23\x00\x24\x2b\x20\x00\x10\x86\x21\xb6\x5a\xb0\x00\xbc\x06\x38\x15\x30\xf6\x90\xd7\xe5\x6f\x81\x60\x4d\xac\xff\x19\x10\x71\x50\x40\x41\x0a\xa1\xf9\x44\xc9\x2d\xd9\xbb\xaa\x5b\xd0\x8e\xa0\x0c\x84\x42\xdf\x94\xf0\x85\xeb\x3d\xe9\x73\x35\xb6\x00\x5e\x6f\x84\xf8\x23\xd4\x34\x70\xab\x1c\x67\xda\x12\xad\x44\x99\x36\xc6\xb5\x5f\x9f\xfd\x20\x3d\xfd\x6e\x3f\x33\x30\x9e\x8a\x99\x45\xa5\x93\x20\xe6\x67\x34\xc7\x9c\x48\x14\xdb\xa5\xa1\xc1\x40\x95\xc6\x29\x25\xa1\xe1\x73\x3e\xfd\x94\x81\x7a\x25\xef\x9e\x47\x9d\xd9\xcc\xde\x6c\xa8\xad\xb7\xa8\x05\x3c\x1b\x55\x13\x46\x97\x50\x4a\xf8\x05\x3d\x59\x5b\x84\x46\x40\xb6\x1e\x93\x16\x80\x75\x46\x84\x50\xeb\x5d\xe0\x35\x86\x97\xc1\x04\xaf\xa6\xa3\x79\x6a\x50\x9c\x26\xb4\xc2\x77\xc2\x3f\xff\x42\xdf\x14\x6d\xe5\x5e\x95\xd0\xd4\xb8\x0a\x7a\xa1\x77\xd9\x92\x27\xec\xb2\xa0\x59\x4d\xee\xde\xbb\x9c\xaf\xb1\xa4\x58\xac\xa8\x07\x2c\xc7\xd7\x7c\x71\x75\xf6\x10\xca\x30\x0e\xfd\x7a\xf9\x38\x83\x46\x49\x8c\x22\x99\x15\x64\x50\x0e\x0b\x0a\xa4\xd2\x94\x6f\x18\xe6\xf5\x37\x5a\x84\x82\x86\xf3\x69\x54\xc1\xca\x22\x68\x4c\x69\x28\xc2\xa2\x5c\x7f\xe2\x1a\xba\x4a\x71\x11\xd7\xe0\x5b\xc8\xd7\x0b\x3d\xcb\x4f\x6a\xae\xc0\x64\x84\x5e\xef\x55\x25\xf8\x50\x24\xc2\x57\x0f\x3b\x78\x69\x8c\x4b\xce\xc0\xd7\x1a\xad\x53\x78\xd8\x81\x9e\x1f\xac\x44\xee\x41\x63\x70\x21\x2d\xba\xaa\xe5\x4d\x2a\xf2\x93\x9b\x82\xcb\xaa\xe7\xf4\x2f\xf4\x85\xd4\x5b\x3a\xcc\x21\x09\x0f\x5b\xa4\x1e\xc0\xda\x30\x9e\x52\xef\x28\x38\xd1\xde\x47\x1e\x0b\x7c\xf9\x85"}, +{{0xa9,0x04,0x8a,0xf0,0xc2,0x0a,0x12,0x5f,0x5d,0x39,0xc5,0x0f,0x22,0xb8,0x05,0xae,0x74,0x2c,0xf6,0x4f,0x1f,0xe8,0xdf,0xbe,0x8d,0xfd,0xaa,0x51,0x1a,0xaa,0x57,0x6f,},{0x15,0x86,0x55,0xdb,0x94,0xb1,0x5c,0xa7,0x29,0x83,0x87,0x7b,0x6d,0xb2,0x31,0xa5,0x84,0x3d,0xf5,0xdb,0xca,0x28,0x10,0xa7,0xe4,0x96,0xfb,0x59,0xab,0x71,0x04,0xca,},{0x18,0xa3,0x12,0xb2,0x0d,0x86,0xac,0x33,0x9a,0x58,0xef,0x2b,0x85,0x2d,0x46,0x7c,0x23,0xbb,0x2c,0xb1,0x22,0x7c,0xb1,0x53,0x38,0xaf,0x07,0xfd,0x04,0xb9,0xa7,0x11,0xe8,0x56,0xee,0x5b,0x2c,0x82,0xe3,0x66,0xc1,0x7f,0x86,0x17,0x13,0xd1,0x08,0x8c,0x1b,0x21,0x44,0xd1,0xc3,0x7d,0x05,0xbd,0xc0,0x0d,0x73,0x96,0x73,0x85,0x20,0x00,},"\x8e\xef\x2d\x9f\x5d\x59\x70\x99\x59\xc9\x24\xf8\x7c\x22\x78\x97\x67\x39\x3a\x15\x5d\x5c\x87\xde\x48\x8c\xef\x50\xb7\xbf\x7d\xa8\x70\xe3\xad\xc3\x00\xae\xe6\x60\x3b\x2e\xf0\x87\x64\xd9\x9d\x9e\x77\x51\xe5\xdc\xe9\x2a\xaa\x71\xaa\x18\xa6\x9c\xc8\x23\x13\x4e\x85\x52\xd9\x59\xa0\xdb\xb4\x11\x17\xe0\xa5\x93\xc3\x18\x33\xb6\xec\x21\x72\xdd\xaf\xaf\x78\x48\xdd\xd1\x8d\x28\xd0\xd4\xed\x33\x23\x7e\xc8\x04\xf6\x59\x38\xae\xd8\xe8\xa3\x28\x0d\x42\xe3\x53\xd0\x1b\xe0\x18\x7b\x13\x01\xf8\x3d\x89\x84\x90\x67\xb0\x4a\x90\x31\xf7\xe0\xf3\x3e\x34\x16\x24\x0c\x53\xd9\x26\x5e\xd0\x66\x39\x59\x97\x1f\x41\x7c\xb5\xf2\x10\xcd\xc5\xae\xbc\xb5\xe1\xdb\x7d\xfb\x82\xdf\x43\x58\x76\xa6\xe9\x8f\x41\x5b\x0d\xf8\x69\xf0\xd8\x85\x15\x35\x37\x56\x45\xee\xf7\x0f\xae\xc7\x44\xee\x0d\xc3\xac\xbc\xb0\x40\xf6\x8d\x50\x2c\x2c\x62\xc8\xdb\x45\xeb\xe5\x48\x54\xa4\xb3\x6f\x43\xfe\xb4\x9a\x6d\x1c\x2c\x2e\xa7\x99\x14\xa7\xc2\x3c\x60\xba\xaa\x67\xcb\x47\xb2\x17\x8e\x12\xdc\xe7\x6b\x00\x4c\x87\xb7\xb8\x34\x6e\xfa\xdf\x38\x0b\x9e\x1e\x41\xf6\x31\x48\xda\x51\x78\x1d\x75\xce\xc0\x40\xe4\x26\x88\x20\x21\x1f\x3c\x46\x25\x01\xd8\x08\x99\x89\x4e\x79\xd6\x18\xde\x42\x46\x1d\x78\x5a\xea\xce\x53\xae\x14\xb7\x9d\x33\x50\x1e\xd5\x62\x9b\xbd\xd0\x71\x28\x15\x6d\xb0\x72\x5f\x5b\x4b\xed\x59\x3a\x95\x29\x47\x83\x03\x84\xf6\x1d\xf0\x0e\xe0\xaa\x09\x90\x99\xc3\xcd\x97\x65\xa9\xc1\xc7\xe8\xa6\xa8\x34\x30\xb8\xd9\x86\x7c\x8e\x17\x92\x0a\xd0\xff\x64\xd8\xcd\x2f\xf5\xf1\x14\x38\x8c\xe6\xd4\x3e\xec\x17\x15\xd0\x35\xf0\x22\xfa\x97\x96\x9e\x1a\x5d\xd9\xf5\x8d\x89\x6b\x17\xc1\x22\x1c\x9e\x6c\x85\x55\x59\x72\x35\xee\xda\x6e\xc4\x1b\x0c\x11\x76\x12\xb0\x0c\x5f\x0e\xd1\x81\x6b\x05\x73\x63\x58\x27\x07\xa8\xaa\x0d\x98\xd4\xd4\xbe\x5e\x8f\xa3\x2d\x6c\x9d\x27\x82\x21\xef\x30\x67\xb8\xba\x15\x16\xd9\xe0\x51\xd2\xf6\x8b\x7d\x1b\x15\x1f\x74\xa3\x53\x4e\x78\x12\xc0\x51\xe5\xf2\xb6\x3b\x30\x35\xf8\xe5\x70\x3b\x5f\x68\xfd\x2d\x65\xbb\x75\x65\xe8\xaa\x67\xbf\xd2\xa1\x2c\xaf\x0b\xc5\x48\x11\x97\xa9\xff\x89\xd7\x7d\xf7\xa0\xe9\x65\x5e\xf0\x29\xb4\x3d\xd9\x06\xd0\xb8\x88\xe3\x13\xae\x9d\x1c\x7e\x93\x68\xa0\x13\x52\xd0\x0c\x66\x80\xdd\x0f\x1f\x57\x4a\x58\x77\x34\x8a\x7e\xa2\xc0\xb9\xe8\xe2\x72\x75\x10\xbf\x0c\x9e\xf7\x44\xf3\x69\xeb\x3c\x6c\x4f\xc1\x6a\xde\xb6\xe1\x94\x5b\xe8\x28\x7d\x0f\x30"}, +{{0xf8,0xc9,0x18,0x3f,0x23,0x10,0x5f,0xad,0x0c,0x6e,0x51,0x03,0x35,0x8b,0x58,0x32,0x88,0xf9,0xff,0x6c,0x7d,0xfc,0x91,0x10,0x6d,0x07,0x98,0x7f,0xf6,0x9c,0xe1,0xeb,},{0x4c,0x79,0x62,0x8c,0x95,0x8c,0xde,0x0c,0xc3,0xcf,0x68,0x60,0x95,0xb8,0xa2,0xf4,0x4b,0x71,0x93,0xc6,0x16,0xf5,0x1b,0x21,0xb6,0x70,0xb0,0x38,0xce,0x6f,0x67,0xff,},{0xc6,0xa8,0xbc,0x7a,0x0d,0x5c,0x61,0x85,0xb6,0xec,0xd6,0x03,0x3e,0x42,0x32,0x1d,0x5c,0x87,0x1b,0xf8,0x89,0xbe,0x72,0xbd,0x54,0xcc,0x00,0x83,0xed,0x60,0xa4,0x70,0xb2,0xcc,0x0f,0xb4,0x68,0x2c,0x89,0x4c,0x75,0xb0,0xdf,0x95,0xf1,0xec,0xfb,0xba,0x2d,0x5a,0xce,0xf3,0xe1,0xaa,0xfe,0x54,0xb9,0xf7,0xe8,0x03,0xa1,0xd0,0x15,0x0a,},"\xb1\xd6\x05\x95\x32\x3f\xf3\xc8\x44\x87\x41\x90\xe1\x83\x6e\x41\x01\x40\x9c\xbc\xea\xe2\x8d\x5d\xa8\x1f\xad\x29\x8f\xe4\x7f\x6b\xdf\x44\x74\x5b\x7c\xd0\xd3\x71\x31\xc3\xec\x36\x5b\x92\xf5\xa1\xa6\x9c\x09\xfe\x2d\x9e\x81\xda\x10\xcf\x19\xd8\x5f\xf5\xff\x26\xf9\xe7\xdb\x9f\x07\x93\xb2\x5a\xb2\x6e\x6a\x74\xf4\x4e\xb8\xc4\xf0\x78\xeb\x7a\xd1\x8e\x65\xa1\x62\x10\xd5\xc8\x44\xd3\xce\xf7\x5f\x1d\xaf\x44\xee\xe5\x58\xf9\x0e\x52\x4a\x03\x2b\x6c\xae\x6c\x8d\x23\x36\x7c\x28\xce\x1c\x75\xfc\x25\xac\x87\x43\x39\x77\xd5\x97\x53\x3c\x92\xae\x65\xf2\x91\x3a\x18\x90\x7a\xc7\xd9\x54\x3d\xf2\x41\x27\x74\x39\x43\xfe\xfd\x9c\xf8\x3e\xd8\x33\xf6\x3e\xc8\x36\x72\x33\xd8\x97\xbf\xa1\x2d\x46\x6d\x2c\x4a\x9a\xd7\x0d\x5a\x67\x2f\xc1\x07\x75\xea\x2d\x20\x4e\x63\x6d\xe7\x01\x07\x88\xda\x27\x1d\xf0\x38\x81\xa2\x5c\x8d\xfa\x5a\xf7\x3e\xe5\x59\xf8\x1b\x52\x9b\x35\xaa\x12\x7f\xdc\x0e\xe8\xfd\x36\x9c\x7a\x04\x36\x62\x39\x86\xaa\x64\x07\xfa\x67\xa1\x42\x0c\x46\xf3\x21\x1a\xb8\x4f\x84\x46\x6d\xd5\x8b\xb7\x95\x08\xa1\xfe\xb0\xa5\xa5\xdc\x3b\xb0\xc1\xb2\x48\x09\x82\x62\xa0\x64\xf3\x7b\xb2\xf0\x19\xe2\x90\xc6\x0a\xfa\xa1\x20\x66\x51\xa2\x69\x7c\xaa\xcc\x3e\xcc\x02\xec\xfc\x07\x7f\x27\x2e\x8f\x75\xce\xa7\x1c\x3b\xc3\x35\x6d\x2b\x58\x07\x27\x6f\x19\x55\x00\x1c\xfe\x10\xa6\x17\x16\xb4\x08\x2b\xd6\xf8\x4c\xae\x4b\xb0\xd9\xa4\xb7\x5a\x4b\x57\x62\xf8\x10\x79\xf1\x9d\x7d\x19\xea\xff\x86\x31\xc9\x24\x88\x5b\xd3\xa6\x4e\x12\x9f\x4c\xf6\xb7\x9c\x7a\x98\x29\x66\x55\x11\xe9\xd8\x5c\x74\x5e\xb2\x2c\x1b\x7c\xb2\xa1\x7a\x49\xb6\x28\x5c\xce\x37\xb3\xde\x41\x59\x40\x32\x83\x23\xef\xe2\x4a\x1a\x07\xee\x87\x46\x8f\x65\x10\xe4\x2d\xd2\x06\xfe\x7f\x09\xe3\xd4\x33\xfb\x52\x15\x6a\xe3\x48\x38\x31\x15\x64\x88\x63\xe4\x5b\xf6\xa3\x71\xb1\x7e\x70\xe1\x9f\x96\x27\xd7\xf0\xa5\x8b\x95\xc6\xa4\x78\x8d\x5f\xd7\x86\x2f\x16\x12\xc0\x34\x73\x25\xb7\x97\x65\x1b\xe3\x0c\x3e\x1e\x60\xea\x4a\xe6\x0b\x57\x45\xa3\x8b\x6a\x9d\x4e\xb4\x93\x5d\x6f\x3c\xb8\xd7\x1a\xd3\xf3\x9a\xdd\xa5\xe4\x2e\x22\x19\xde\x0d\x38\x19\x09\xc9\xcd\x31\x7d\xd4\x37\x94\x21\xa2\xa8\x42\x68\xa7\xea\x71\x80\xa6\x4c\x12\x9b\xe1\xe5\xe8\xfc\xbb\xf5\xed\x65\x9e\x9f\x7e\x76\x3c\xe8\x4f\x63\x0d\x54\x07\x95\x4f\x9f\x75\x57\x50\xa6\xdb\xf9\xf7\x66\x07\x17\xde\x8e\x2a\xdc\x1e\x9a\xc9\xee\x31\x65\x4d\x18\x37\xce\xe3\x97\x95"}, +{{0x16,0x08,0x9a,0x1b,0x93,0x2f,0x8d,0x14,0x99,0x56,0x88,0xb4,0x8d,0xd8,0x41,0xed,0xae,0x3d,0xa5,0xcf,0xd2,0xcb,0x16,0x55,0x53,0x06,0xf3,0xfe,0x8b,0xd3,0xed,0xb9,},{0x9e,0xcd,0x9f,0xdd,0x7e,0x0b,0x92,0x3d,0xef,0xf5,0xd8,0x87,0xb2,0x42,0x58,0x5d,0x9d,0x41,0xcd,0x2c,0x7c,0x10,0xf9,0xc3,0x45,0xb3,0x9f,0x63,0x3f,0x4a,0xb9,0x03,},{0x78,0x78,0xab,0x74,0x1e,0xba,0xe2,0x74,0x7c,0x78,0x97,0xcb,0xb1,0xd1,0x05,0x48,0x2f,0x37,0xbe,0x2f,0x5f,0x91,0x79,0x52,0x32,0xcd,0xfb,0xcc,0xc5,0x26,0x60,0x89,0x18,0xe2,0x75,0x6d,0xdb,0x75,0x36,0xb3,0x68,0x0c,0x16,0x2c,0xf8,0xa1,0xef,0x38,0xa3,0x41,0xb9,0x36,0x2b,0xfe,0x5d,0x46,0x8b,0x4b,0xce,0x21,0xdf,0x23,0x4f,0x0f,},"\x58\x50\x02\x32\x38\x8d\x9a\xa4\xb5\xfa\xf8\x5b\x02\x33\x24\x7e\x71\x7f\xd1\x68\x40\xde\x9b\xfd\x0e\xf8\x6e\x01\xe6\x13\x02\x77\x55\x13\xe2\x24\x12\x5e\x0d\x20\x42\x0e\xa9\x49\xf6\xc2\x64\x25\xf7\x00\x77\x91\x1f\x97\x11\x31\x0c\xd6\xfd\x8b\xff\x27\xcd\xea\x11\x48\x0c\x73\xe8\xf8\xb3\xc3\x76\x41\xe7\xe8\xdd\x86\x07\xc1\x64\x02\x18\xfe\xc8\x0a\x02\x09\x28\xb9\x3d\x4d\x55\x7e\xbe\x82\xec\x0b\xb1\x75\x38\x86\x7d\x2c\xb1\x4d\x44\xd3\xea\x72\x7f\xdd\x52\x82\x0b\x0d\xa9\x44\xde\x21\xcd\x5d\xa3\x03\xd7\x76\xfe\x99\xcb\xc2\x64\x83\x65\xe6\xa0\xa9\x8d\x4d\xb1\x50\x84\x26\x61\x76\x8b\xe8\x4c\x68\x50\x7a\x5c\x45\xd2\x07\x84\x0b\x03\x35\x37\x78\x6c\xb2\x1d\xad\xad\x5f\xba\xb9\xc5\xcf\xc1\xe3\x54\x7d\xe5\x50\xd3\x13\x63\x1d\xd4\xfb\xb7\xca\x8f\x71\x93\x86\x27\x60\x8d\x2e\xbf\x65\x5d\xb4\x32\x5a\xbf\x3e\xd5\x04\xdc\x18\x30\x58\xf9\xde\x1e\x44\x93\x12\xd9\x04\xc8\x46\xa1\x84\xa0\x28\xf3\x64\xc0\x28\xb2\x7e\xb4\x94\x64\x27\xe3\x1c\x21\xe1\x05\x1d\xf3\x64\xd4\x99\xf4\x77\xbf\x51\xe7\xa8\x89\x31\x83\xe5\xec\xf7\x7d\x51\x3a\x1a\x76\xb1\xa6\xfd\xfb\x16\xbe\x90\xd7\x4b\xe4\xc4\x34\x5a\x4f\x9f\x87\xee\x44\x1a\x10\x22\xd6\x7e\xe8\x44\x78\x9f\x21\xb0\xc3\x1a\xdc\xc0\xd9\x56\x63\xcd\xfb\x40\xa8\x95\xb9\x22\xdc\xe8\x06\x9b\x93\x2c\x80\x2f\xd3\xab\x1e\xf0\xce\x6b\xff\xdc\xc5\x65\x3b\x1c\xd5\x25\x7e\x19\xa0\x95\x16\x87\xe5\x45\xfa\xf4\xaa\x66\x06\x5a\x55\xc4\xb4\x19\x1e\x34\xe8\x04\x7d\x6a\x4a\xb5\x2d\x1b\x06\xc3\x69\xa4\x26\xca\x2d\x16\xb5\x1a\x02\x71\xf2\x7f\x8d\x74\x4c\x71\x1f\xce\x3a\xad\x9d\x4a\xc0\x38\xee\x70\x0e\x4e\x97\x1b\x21\xca\x48\x9f\xf2\xb8\xc7\x78\xa3\x72\x1a\xdf\x47\xc1\xae\x5a\x41\xb9\xa2\x7f\xa7\x42\xfd\x0f\x18\x16\x4e\xf3\xc2\x6b\x8a\xe7\xd1\xfa\x29\xb7\xc0\xcc\x46\x83\xbe\x65\x02\x5c\x96\x53\x7a\x12\xd5\xfc\xeb\xbd\x05\xe9\x30\xc3\x69\x3e\xbb\xba\x0a\x78\xad\xf5\x9d\x8a\x3b\x59\x8a\x34\x8e\xaa\x9f\x47\xca\xf5\x31\xfe\x44\x96\x52\xdb\x5b\x20\xd6\x89\x94\xe3\x5a\xfe\xc2\xc2\x57\x09\x05\x5a\x1d\xe2\x60\x82\xe3\x91\x2d\x49\x7c\x64\x77\x20\xa3\xf8\x73\x62\x14\x56\xe6\xa5\xb9\xeb\x61\x3a\xcb\x43\xb6\x6d\x47\xd0\xb9\x54\xc6\x9e\x8f\xbf\x2c\x5e\x63\x4c\x48\x6e\x57\x24\x93\x0e\x0b\x56\xa5\x16\x94\x0c\x8c\xb0\xe7\x75\x27\x4d\xef\xf9\x7c\xbb\x77\x59\xce\x90\xa2\xb9\x3e\x9e\xfa\xa6\x24\xe6\xb3\x8a\x39\x84\x9d\xca\x1d\xf6\x12\x73\x6f"}, +{{0x94,0xd5,0x09,0x15,0x14,0x4c,0x7e,0x7d,0xd0,0xf8,0x5f,0xef,0x87,0xed,0xdc,0x22,0x06,0xc1,0x56,0x9e,0xd1,0x43,0x1c,0x8c,0x5a,0x15,0x3e,0x32,0xe1,0xcb,0x2f,0xb7,},{0x3b,0xb0,0x98,0xcf,0x16,0x0f,0x3a,0xec,0x31,0x70,0xb5,0x7d,0x6a,0xdd,0x4f,0x56,0x73,0x92,0x70,0xe4,0xb3,0xa8,0xef,0x79,0x66,0xec,0x30,0x61,0x9b,0x29,0x91,0x02,},{0x59,0xa1,0xce,0x55,0xf5,0xa6,0xba,0xdc,0x1b,0x93,0x91,0x26,0x36,0x20,0x54,0x2c,0xfc,0xae,0x87,0xa0,0xf2,0xb9,0x50,0x22,0x50,0xcf,0xe4,0xbd,0xcb,0xf7,0x6c,0x46,0x19,0x77,0xc3,0x34,0xa4,0x8d,0x91,0x6e,0xde,0xbd,0x56,0xc2,0x1c,0xe2,0x17,0xc3,0x5a,0x64,0x44,0xcf,0xbf,0xd3,0xb1,0x1a,0x3d,0x48,0xfa,0x2e,0xdb,0x6e,0xb4,0x0f,},"\x4d\x91\x5f\x27\x33\x2d\xd7\x50\x51\x71\x9a\x24\xae\x8d\x0e\x9c\x30\xda\x79\x09\x99\xe2\x2d\x9b\x58\x7e\xf2\x03\x21\xbe\xe4\xc0\x7d\x0a\x12\x49\x4f\xfe\x59\x9f\x47\xf9\x69\x25\xf5\xd9\x25\x17\xfc\x3e\x5f\x04\x1d\x0c\x70\x9f\x2a\x97\x83\x12\x5e\xec\xa6\x65\x29\x97\x20\x1c\x42\x9a\xa6\xf1\xce\x2f\x07\xa0\xd4\xa0\xa1\x8c\xf2\x0b\x3e\x9a\x4f\x76\x63\xea\x52\x62\xca\xd8\xf9\x49\x41\x1b\x05\xff\x5c\x5e\xdd\x7b\x30\xb2\x17\xd7\x5d\x8c\x86\xc9\x4e\x5f\x92\xc1\x67\x34\x37\x4e\x8c\xea\xd6\x1b\x0b\x27\xbb\x4b\xf5\xf4\x3a\x31\x3c\x1d\xd5\xb8\x3e\x0e\xa9\x33\xb6\xca\xdf\xed\xd7\xa6\x4a\xa5\xdd\x5b\x5d\x02\xc6\x95\xea\x20\xe0\x91\xfd\xaa\x72\xef\x4e\x7c\xa4\x0f\x38\x39\x5b\xe8\xbf\x7a\x25\x5c\x6d\x06\xa6\x32\xd7\xd7\x85\xd9\xe0\x47\xf2\x32\xaa\x50\xfa\x14\x52\x9f\x98\x6f\x9e\xf9\xd7\xb5\x80\xa0\x39\x65\xb0\x15\x47\x88\x82\x2a\x22\x5b\xb5\xab\x34\x38\xb8\x9a\x5c\x28\x74\x4a\xb0\xbc\x0b\x20\x14\xe5\x79\x6a\xcb\x49\x35\xa8\x1b\x02\xa0\x46\x32\xac\xb8\x8c\xaa\x7e\x39\xe0\x69\xc7\xc8\xe1\x75\x82\x91\x09\x4a\x53\xe3\x62\xfc\xed\xaa\xa5\x83\xec\xa7\x66\xef\xeb\xf6\x9b\x38\xe8\xcd\xe9\xce\x58\xe0\x12\xc6\x0e\xc8\x8e\x8c\x42\xbe\xad\xfa\x83\x8c\xfe\x44\x0f\xa0\xc0\x1d\x65\x9c\x96\x34\x57\x6d\x7d\x7a\x2d\x3a\x04\x4f\x99\xc6\xe4\x26\x3d\x4c\x0b\x37\x4a\x38\x8a\x2a\xcf\x38\xef\xf2\x9c\x77\x7e\x9d\xaa\x60\xd5\x98\x03\x5a\x7d\x9e\xdf\x67\xa5\x02\xc3\xf5\x73\x20\x7b\x11\x9c\xac\xac\x3f\xa7\x1e\x2a\x02\x07\xc6\x01\xcc\x0d\xd6\x37\xef\x56\x2b\xac\xc3\x5c\x57\x04\x27\x38\xf1\xf5\x58\x15\xa5\x26\x80\x82\xcd\x6a\x50\x82\x92\xfa\x29\xe3\x4e\x96\x45\xd8\x7a\x1a\x2b\x6e\x58\xad\xb7\xf4\xa5\x7f\xbb\x53\xe9\x21\x3e\xf3\xdc\x87\x3f\x29\x39\x62\x58\xa1\xea\x54\x6f\xb5\x95\x2c\xe3\x43\xce\xe9\xbb\xb9\x0c\x1c\xda\x72\xc6\x5a\x7c\x8e\x40\x31\x2b\x32\x8e\x23\x19\x20\xc2\x33\x07\x7d\xca\x34\xd0\x4f\x9d\x89\xda\xa9\xa2\xf4\x34\x59\x16\x5f\xd1\x02\xff\x56\x43\xc7\x17\x52\x30\xb3\x9e\xc7\xc3\xc4\x75\x65\x0e\xf1\x31\x60\x9d\x32\x20\xf5\xa2\x94\xa4\x03\xb1\xe1\xc4\x2c\xfa\x16\x2c\xd4\x26\xf0\xae\x43\xfd\x6b\x7a\xb5\x47\xa6\x2b\x7d\x5f\x84\x74\x03\xc4\xe5\x98\x79\x53\x87\x71\x58\xcf\xde\xe2\x3c\x04\xf7\x51\xc7\xc8\x6d\x07\x8e\x82\x4c\xa6\x3b\x5e\x65\x54\x3e\x97\x8b\x6b\x0c\xc6\x89\xef\x66\x44\x12\xb0\x1b\x8f\xf1\x65\xe7\xdb\xde\x3c\x09\x9b\xf4\xf3\x4e\xbd\xdc\xb4\xc4"}, +{{0x0d,0x81,0x92,0x6f,0x51,0x3d,0xb4,0xb2,0x5d,0xfa,0x1e,0x52,0xb5,0xdc,0xa6,0x78,0xf8,0x28,0xa6,0x1c,0x7c,0x91,0x3c,0x82,0x82,0x47,0xc2,0xeb,0x04,0x22,0xb7,0xd1,},{0x0f,0x32,0x41,0x1e,0xf9,0x1d,0x4e,0x4b,0x69,0x41,0xdf,0xca,0xab,0x14,0x2e,0xf3,0xbe,0xc1,0x60,0x98,0x39,0x93,0xa5,0x26,0x2c,0xcf,0x27,0xfa,0xdd,0x2a,0xf8,0x90,},{0xe0,0xcb,0x6c,0x71,0xeb,0xf8,0xd7,0x05,0xe5,0x0c,0xad,0x9f,0x0b,0x8c,0xba,0x3e,0xcf,0x4b,0x9e,0x37,0x93,0x40,0x00,0x92,0xaa,0x5b,0x12,0x1e,0x7d,0xbb,0xc8,0xbe,0xa7,0x1d,0xf2,0x95,0x28,0xca,0x9b,0x47,0xab,0xf8,0x7c,0x19,0x8a,0x8d,0xc4,0xe1,0x4d,0x51,0x80,0xce,0x93,0x2d,0xd2,0x11,0x4a,0x3c,0xda,0xa5,0x55,0x2c,0xc2,0x05,},"\xa9\x38\x37\x52\x2f\x7e\xc2\xe9\x3a\x2e\x4b\x4c\x8b\x46\xde\x92\x6a\x81\xad\xa2\xd2\x48\xbc\xd3\x3b\x39\xb6\xc9\x5f\xb6\x2a\x61\xdb\xbe\xda\x1a\xa8\x5a\x21\xd9\xb9\x6a\x08\x51\x0d\x8d\x3a\x65\x8c\xf3\x20\xa1\x09\x28\x69\x59\x99\xd2\xc0\xd6\x05\xc7\xf9\x5a\x12\xf5\x6a\x87\x18\x50\x7d\xb0\xf4\x97\xe3\xea\xd6\x13\x13\x2a\xb0\x92\xcb\xf1\x9d\x22\x60\x35\x86\x30\x35\x8d\x9b\x26\xe6\x8d\x50\xdd\xae\x37\xc8\xaf\x0b\xb7\xd2\x74\x1f\xd2\x92\x9c\x21\x27\x9a\x78\xd1\x0e\x2c\x5f\x3c\x5b\xf4\xa4\x2a\x36\x17\x03\x6d\x54\x74\x36\x47\x76\x5a\xfd\x8c\xd9\x10\xf8\x1b\x38\xce\xd7\x23\x90\x63\x0e\xe6\x89\x44\xa3\x7d\x29\xc2\xfe\xca\xda\x1c\xc5\x9e\xc5\x44\x07\x5b\xdb\xc1\x4c\x63\xc6\x23\x4b\x88\x40\x49\x00\x0c\x27\xc7\x34\x06\x03\x56\x04\xfc\xa8\x76\x0b\x49\xa5\xe2\x10\x9e\xf9\x12\x85\xad\xc4\xec\x48\xc8\x19\xd6\x2d\x94\x8f\xac\xa9\x0f\x62\xcf\xae\xf0\xb0\x7d\x6f\xe5\x76\xd7\x62\xbf\xd0\xee\xf9\x4c\xf6\xb5\x33\x2c\x4d\x42\x25\x11\x60\x7f\x2f\xac\xc7\xac\x04\x6a\x59\xb9\x61\x7e\x83\x83\xd1\x02\x9c\xc9\x1a\xc5\x92\xb5\x20\x84\x41\x30\x32\xbe\x84\x1b\xaa\x9b\xf9\x62\x51\xa6\xbd\xa6\x71\xd4\xcd\x4b\x12\x5d\xa6\x58\xa4\xe5\xa5\x0f\x44\x28\xee\xbf\x26\x14\xfb\x0c\xe5\xfe\xbe\x80\xf7\x21\xa5\xf4\xc0\x32\x55\x06\xd2\x7a\x8d\x31\xe3\x3d\x86\x25\x38\x70\xdd\x63\xc0\x8e\xdc\x73\x02\xb2\x80\xe9\xb9\xbd\xc2\x8b\xee\xf0\x5c\x7d\xcb\x30\xd4\xc1\x62\xe9\xbe\x83\x2e\x1c\x78\x5e\x37\x55\x12\x18\x42\x1e\xec\x85\x2c\x42\x98\x21\x3b\x2f\x27\xf8\xf8\xc7\x06\xd3\x91\xb9\xc6\x9a\x56\xdb\x7c\xe5\xd8\x15\x48\xfc\xa5\xfe\xd4\x56\xf2\xd8\xaf\xd0\xb7\x5f\x79\xf8\x58\x68\x31\x6f\x4a\x09\x21\xf0\xc6\x63\x99\x26\x51\x6b\x3c\x3e\x52\xa9\xcb\x22\x55\x45\x46\xef\x70\xe1\x4c\x77\xec\xbd\xcd\x5c\x0d\x59\xa8\x17\x69\xb3\x0d\x5d\x13\x1f\x2f\xb4\x49\xc9\x96\xb8\xde\x8a\xc7\xf8\x08\x4f\x84\x99\xe1\xa5\x6f\x7c\xd2\x9d\xb6\xaa\xef\xcc\xae\x8a\x60\xe7\x56\x16\xa1\xf7\x02\xc3\xbc\x8d\xea\xa1\x00\x4a\x8d\xae\x03\x92\xa5\x9c\xee\x54\x81\x0c\x6e\x94\x0e\xee\x25\xfb\x2e\x5d\x57\x32\x67\x04\x4b\x89\x3f\xfd\xe3\x78\xfe\x75\xac\x26\x13\x37\x3d\x84\xa0\xca\x81\x87\xaf\x4a\x33\x58\xe5\x0a\x99\x4e\xd0\x33\x67\xde\x64\x5e\x10\x39\x0f\xea\x4c\x33\xbb\x1a\x6c\x0c\x39\x85\x8b\x8d\xb4\xa6\x9f\xe8\x94\xa4\x22\x3d\x45\xaf\x69\xb3\x6c\x61\x17\xc4\xdc\x25\xde\x49\xa6\x30\x17\x00\x2b\xa9\xae\x55\x1e\xf9"}, +{{0x6c,0x8c,0x53,0xb5,0x6b,0xbc,0xb4,0xc0,0xa2,0x5d,0xc4,0x0c,0x18,0x24,0x0b,0x6a,0x5c,0x75,0x76,0xb8,0x9d,0xde,0x45,0xef,0x13,0xfb,0x15,0x8e,0xa1,0x7f,0x8e,0xd9,},{0x23,0x8e,0x51,0xd6,0xa4,0x4f,0xa7,0xac,0x64,0x26,0x88,0x01,0x26,0x1e,0xa3,0x5b,0x62,0x63,0x8a,0x00,0x6c,0xc4,0x52,0xbd,0xdb,0x9f,0x16,0xfc,0x58,0x03,0x06,0x0c,},{0x4b,0xf1,0xe7,0xd4,0x9c,0xd4,0xd5,0xc3,0xc1,0xfd,0x4a,0x4b,0xc4,0x8f,0xf6,0xb6,0xe5,0x2f,0xd9,0x51,0x0a,0x41,0x18,0x12,0x29,0x69,0x96,0xe4,0xfe,0xc5,0x6b,0xe4,0x45,0x14,0xc5,0x67,0xd1,0xd3,0x34,0x77,0xbd,0x5d,0xc0,0x83,0xc3,0x95,0x8b,0xd9,0x5b,0xfe,0x59,0x9c,0x15,0x3f,0x21,0xae,0x26,0x25,0x29,0x67,0xb7,0x32,0x60,0x03,},"\xb6\x0d\xf2\x94\x4b\xa0\x15\x75\x98\x02\xd3\xc5\x87\xbc\xfe\xbe\x52\x1a\x7e\x77\xb9\x98\x5b\x76\x1c\x96\x76\x45\x4d\x24\xa6\x64\xaf\x0b\x0d\x44\x22\x5a\x55\x75\x12\xe1\xc1\xcd\x7d\xd8\x33\x5c\x8f\x6a\xdf\x92\x8e\x18\xf8\x9f\xd5\xee\xdf\x6f\x41\x1d\xcd\xaf\x99\x69\x12\xe8\xc3\xe2\x3d\x1c\xb9\x5e\xca\x4b\x9e\x24\xe7\x53\x9c\x3b\x98\xbf\x3d\x07\xec\x25\x13\x92\x09\x6c\x19\xac\x53\x74\xdc\xba\x52\x61\x32\xb6\xd9\xbb\x8f\x6c\x85\x9c\xe9\x85\xd5\x84\xc7\xbb\xa5\xb0\x2a\x81\x03\x4b\x6d\x8b\x52\x1b\xd2\x80\xe5\x0d\x77\xda\xa2\xb2\x41\x3e\xd6\x79\x83\x4f\x81\x61\xd5\xd0\x57\x3b\xdd\x47\x6a\xc3\xcd\x0a\x3a\x7d\x8d\xb4\x53\x34\xe8\x9c\x00\xab\x66\xbc\x36\x8a\x07\xb4\x23\xe2\x46\x43\x46\x36\x27\x2a\xa4\xe4\x63\x7a\x53\x06\xb2\xc3\x39\x79\x92\x78\x1f\x30\x23\x8d\xe7\x9e\xc1\x04\xac\xc7\x20\x0d\xef\xad\x96\x08\x83\xd3\x91\x44\x3e\x70\xef\xbd\x22\xf1\xcf\xce\xec\x51\x12\xfe\x9e\x8e\x13\xbb\x94\x1c\x08\x34\x68\xdd\x71\xff\xca\x97\x6c\xd5\x1c\xe1\x61\x79\x31\x10\xef\x00\xaf\xf5\xee\x2c\xcb\x77\x06\xa5\x12\xb8\x5b\xeb\x94\xac\x49\xd1\x9a\xfb\x63\x33\x65\x5c\xf3\xae\xa5\x35\xa6\xf9\xc7\x5e\x03\x48\x41\xe7\x63\xc5\xa2\x49\xb4\x70\x4e\x1b\xe7\x8b\x0e\xca\xc6\x80\x2c\x34\x3c\x1b\x7e\x7b\x57\x70\xde\x4c\x93\xa3\xa7\x9c\x46\xe6\x83\x5d\xa8\xae\x5d\xb3\x83\x8e\x17\x96\xb5\x64\xa4\x80\xa4\xf2\x90\xb6\x0a\x1c\x63\xa7\x25\xff\x3f\xef\x43\x4d\x2a\x0b\x3d\x89\x31\x97\x87\x42\xb5\x25\xc8\x3b\xae\x67\x94\xae\x64\x19\x37\x94\xb3\x70\xc2\x89\xba\x35\xed\x79\xd3\x70\x72\xa8\xdc\xfc\xad\xb4\x6d\x5f\xfa\xee\xba\x1b\xfd\x4f\x87\xd7\x66\xb5\x04\xe6\x2b\x4a\xcd\xd7\x74\x46\xe7\x9b\xa9\x94\xd6\xdb\xf4\x76\x5e\xbd\x74\xb0\x36\x51\x00\xda\x56\x16\x2c\x36\xfe\x5a\x95\x07\x7f\x6b\x42\x65\xe8\x17\x96\xb4\xa5\x74\x43\x78\x29\x70\xb9\x6c\xb4\x56\x9b\xa9\x85\xc5\x5f\xe3\xa7\x18\x38\x0b\xca\x39\xf1\x66\x24\xf8\xe4\x7c\xc6\x3c\x1b\x6f\xa1\xbd\xe1\xae\xba\x9c\x51\xf9\x4b\x70\x2b\x13\x10\x8c\xc1\x48\x1d\x42\xe6\xfa\x98\x1e\x3e\xbf\xe0\x64\xd2\xdc\xa7\x42\x0c\x74\x59\x57\x92\x31\x2a\xe3\xfb\x91\x01\xd4\xb6\x6d\x99\x16\xdf\xd6\xc1\x3a\xe8\x83\xe6\x61\xc6\x28\x22\x8b\xe9\x79\x4c\xf6\x03\x45\x07\x6d\xb2\x61\x84\xb6\x17\xe2\x72\x29\x8c\xd4\x18\x3f\x27\xbd\x52\xd4\x05\x10\xbb\x01\x5d\x20\x97\xd4\xcc\x76\xe7\x6c\x0a\x62\xbb\xfd\xaf\x53\xc7\x26\x87\x75\xbb\xfb\xdb\x88\x70\xeb\x9b\xab"}, +{{0x69,0xb3,0x20,0xfb,0xd4,0x77,0x40,0x30,0xa2,0x97,0x67,0xa0,0xcc,0x15,0x50,0xd1,0x0b,0x74,0x9b,0x44,0xd6,0x19,0xd4,0x1d,0xce,0x11,0x46,0xf7,0xac,0x80,0xa7,0x55,},{0xdc,0x50,0x8a,0x79,0xc6,0xb8,0xab,0x86,0x6c,0xd1,0x17,0xa5,0xa8,0x4d,0xd9,0xd9,0x31,0xfd,0xa4,0x50,0xbe,0xc2,0x93,0x35,0x34,0x4d,0x0d,0x21,0x92,0x16,0xd6,0x5e,},{0x69,0x7d,0x4d,0x89,0x7e,0x0e,0x2c,0xc0,0x2b,0xc1,0xc2,0xdd,0xa5,0x7f,0x0d,0xda,0x62,0x0b,0x37,0xe8,0x61,0x82,0x2b,0xb7,0xf1,0xa7,0x01,0x93,0x5e,0x95,0x9e,0xa0,0xd8,0x45,0x3f,0x74,0x6f,0xb9,0x2c,0x08,0x7e,0xd6,0x5d,0x98,0x0e,0xea,0x1d,0x6f,0xdb,0xf2,0x3e,0x99,0xb2,0x89,0xaa,0xe0,0xdc,0xbb,0x12,0x8e,0xf8,0x36,0x64,0x0a,},"\x21\x7e\x33\xf8\x86\x22\xc9\x6f\x8d\x09\x2c\x9e\x26\x66\x4f\xe9\xef\xc0\xd8\xd2\xeb\x59\xa0\x36\xfa\x46\x4c\xee\x65\xce\x44\x89\xca\xf9\x03\xdc\xe1\x7a\xfa\xfb\xc4\xf1\x8d\xc9\xbb\xfd\x6c\x1a\x4b\xe7\xb8\x34\x85\xa6\xca\x94\x7d\xef\xb1\xd3\x51\x25\xd0\x77\x39\x62\xa3\x44\xa3\x8b\x6d\xca\x9a\x40\xc3\x1c\x1c\x4e\xb2\xd7\xf6\x81\x8f\x97\x8e\x57\x3d\x66\xb9\x90\x92\x1b\x92\xb7\x77\x47\x1a\x4f\x6f\x05\x47\x7e\xbc\x35\x3a\xce\x1d\x86\xb0\x0c\xc2\x51\x77\x7a\xaf\x6a\xf3\xaa\x11\x79\xbf\xf7\x8d\xf5\x04\x8e\x5e\xf2\x99\x68\x67\x0e\x53\x54\x83\x56\x8d\x6b\xb1\x6d\xa8\x29\x56\x8f\x81\xc7\x99\xb9\xaf\xd4\xaa\xd6\xef\x08\x52\x52\xc0\xce\x3a\xc0\x1a\xc2\x1a\x9e\xa6\x9b\xd5\x8e\xad\xc6\x69\x68\xf5\x5d\xee\x38\x6b\x65\x3f\x33\x34\xef\xc3\x98\xef\x3c\x37\xa3\x8c\xe9\x3b\x21\xf1\x07\xcc\x54\xde\xc2\x6f\x53\xfe\xe5\x60\x4e\xb0\x9a\x36\xaf\xe6\xb6\x65\xb6\x32\x4a\x84\xc7\xda\x7b\x7d\xd0\x1d\x92\x78\xe4\x72\xf1\x5a\x5c\xe9\xff\x0f\xd9\x3d\x0a\xa0\x60\x4d\xd2\xdf\x8d\x5b\xf6\xa9\x12\x73\x4e\xc5\x1d\xe7\x7f\x0c\xe0\x99\xba\x11\x67\x02\x10\xa6\xa2\x06\x10\x6b\x0e\xde\x2d\xed\x85\x8a\x6b\xc4\x11\xe7\x61\x3e\x6f\x80\xe1\xaa\x52\xc3\x23\xe3\x0f\xa8\x49\x95\x1c\xc9\xb7\x76\xe4\xcc\x58\xc9\x0c\xfc\x8f\x44\x2d\xf6\x41\x51\xa7\xfd\x4a\x3d\xd6\x1a\x43\x36\xda\x21\xd0\x39\x44\x63\x5d\x3f\xd6\x67\xbe\x74\x1e\xf4\x5b\x1f\x7c\xb2\x76\xd9\xf4\xde\x81\x07\xde\x64\x58\x2f\x79\x17\xc6\xea\xb3\x8e\x0a\x88\x90\xa4\xbe\xe4\x8b\xc9\x26\x17\xa3\x61\xcc\x7b\x1d\x25\xe0\x89\x45\x3c\xe0\xa5\x25\x44\xf8\x68\xdc\xb3\x24\x9d\xe7\x61\xe7\x9d\xf6\x3e\xfa\x07\x94\xe3\xc4\x61\x8c\x55\x47\x53\xee\x28\x1c\x52\xac\x8a\xd7\x8d\x53\x38\xf0\xda\xc3\x60\xa7\x69\x38\x1b\xb4\xa3\x9f\x19\x0b\x88\x7b\x47\x23\x80\x6a\xc4\xa4\xf2\xff\x30\x4b\xc6\xf9\x33\x7a\xb5\x4c\x86\x6e\x6b\xa5\x1d\xf5\x0c\x43\xea\xb5\x2e\x2b\x39\x79\x4c\x99\x17\xe0\xc3\x14\x33\xf0\x36\x81\xd2\xf1\xd9\x3a\x04\x36\x01\x8c\xaa\xae\x20\x20\x6a\x34\x58\xad\x6c\x03\x7a\xcb\x51\x1e\xf1\x28\xf6\xdc\xd0\x53\x05\xf0\x70\x49\xa1\x3b\x6c\x6c\x3c\x5b\x81\x70\xf1\x58\xc8\xf1\x2d\x46\xe1\x60\x93\x1b\xa1\x8b\xd5\x9a\xe1\x29\xec\x07\xa0\x65\x5f\xa4\x82\xeb\xbd\x3b\x85\x0d\x36\xb8\x32\xbb\xb7\x75\xf5\x38\xe3\xc1\xb3\xa4\x3e\xcf\x94\xca\x63\x0c\xa1\x5d\x50\x28\x13\xee\xd3\xe3\x5e\x8f\xd2\x3d\x2a\xb6\x38\x60\x04\x27\xd1\x59\x7c\xb2\x9d\xa2\xa5"}, +{{0x66,0xda,0x8b,0x25,0x4a,0x37,0x06,0x73,0x78,0xf6,0x81,0x38,0xaf,0xed,0xd6,0x64,0x96,0x59,0x6a,0x05,0x85,0x52,0x4c,0x71,0x6b,0xde,0x2b,0x31,0x24,0xc3,0xe7,0xd1,},{0x85,0xbd,0xe2,0x8a,0x92,0x2a,0xb5,0xee,0xaa,0x4a,0x62,0x94,0x52,0x1a,0x2c,0xca,0xc0,0xef,0x23,0x03,0xdc,0xdf,0x8c,0x7f,0xee,0x22,0x8f,0xb4,0x55,0x20,0x12,0xe7,},{0x40,0x82,0xa5,0xbc,0x73,0x0f,0xb5,0x4b,0x6b,0xd0,0xbc,0xd2,0xa0,0x44,0xed,0x5d,0x3d,0x32,0x7d,0xc1,0x9c,0xea,0xc8,0x82,0x5e,0x62,0x9b,0x9e,0x64,0x23,0xcb,0x1c,0x61,0x42,0x36,0xf0,0x97,0xa6,0xb7,0x3d,0x47,0x39,0x47,0xcb,0x81,0xc4,0xe2,0x70,0x85,0x2e,0xe5,0xf1,0x3a,0x5b,0x03,0xdc,0x18,0xe1,0xc9,0xc2,0x7a,0x9a,0x68,0x02,},"\x3f\xae\x36\x63\x88\x37\xd0\xed\xc8\xdc\xee\x51\x7e\x43\xc4\x88\xed\x57\xfa\x6c\x98\x53\xa7\x45\xaa\xed\xfb\x10\x9e\xc1\x40\x9f\xb8\xa2\xfe\x51\xd2\x3e\x0d\xd9\xfb\xfd\x94\xf9\x1c\x18\xe6\x11\x4d\x80\x89\x01\xbf\x61\x7d\x26\x67\xce\xeb\xd2\x05\xc5\xc6\x6f\x5d\x75\x34\xfd\x2e\xc3\x3d\xbf\xe5\x80\xad\x91\x9f\x50\x42\x04\xea\xf2\x42\xaf\x87\x00\xb1\x38\xcf\xbe\x0f\x37\x29\x19\xc0\x6b\x86\x1a\x27\xd7\x20\xd0\x9d\xf2\x0f\x4f\xb7\xb7\x48\xe7\x18\xb0\xfc\x48\x6d\xbd\xfc\xb6\x94\xcb\x3f\x14\x20\x03\x5a\xc1\xbe\x55\xd3\x1f\x30\xf9\x97\xa0\x43\xd0\x47\x08\xa5\xc5\x42\xee\x37\xc0\xf7\xfe\x0b\x32\x11\xd1\x8a\x87\x03\x3d\xcb\x15\xc7\x9e\x66\x81\xc4\x97\x05\x93\xd3\x2a\x13\xc4\x8f\x0a\x3a\xf8\xbf\xc1\x36\xe0\xf9\xb5\x6a\x12\x3b\x86\xc4\xc6\x40\xb6\x50\xcb\x7d\xee\x9a\x89\xe8\x2a\xee\xee\x77\x3b\x5c\xb0\x32\xfc\xa4\x1c\x20\xc4\x07\x32\x8b\xfe\xd2\x92\x44\xe4\x60\x55\xa8\x31\x14\x61\x4d\x3d\xb5\x65\x81\x60\x4b\x11\x5f\xba\x14\xf6\x18\xe1\x02\xa1\xe1\x6c\xb0\x36\xea\x69\xdf\x92\x75\xb9\x77\xa0\x85\x81\x18\xc9\x1a\x34\xb9\xa8\x51\x9b\xd0\xda\xc3\xb6\x14\x34\xea\x08\x8f\x38\x1b\xa0\x8b\xc1\x58\x31\x89\xa4\xa7\xc8\xb6\xad\x18\xf7\x32\xd7\x4e\xff\x3a\xce\xf4\xb6\x90\x4d\xf5\x8c\x64\x69\x43\x21\x51\x37\x2d\xf9\x32\x7a\xe7\x1a\x0f\x35\x6c\x94\x46\x8d\xcf\xc2\xe4\xa5\xc0\xe4\xec\x0b\x16\x6d\x90\xcd\x46\x5f\x92\x60\xeb\xd6\xa7\xa6\x2c\xe6\xc7\x15\xbc\xc7\x15\xbe\x0c\x7e\x1f\x28\xc4\x45\x60\x12\xd3\x31\x77\xa7\xd4\x11\x3c\x9a\x5a\x22\xac\xfa\xf2\xd6\xb6\x33\x09\x07\x8f\xc1\xb1\xba\xa8\xf3\x6c\x7e\x86\x6c\x1f\x97\x2a\x65\x00\xa5\xee\xa7\x92\x01\x65\x1a\x73\x05\x20\x8b\x6c\x93\xc4\x92\xbc\x77\xca\xcb\xc9\x9c\x9c\xde\xd1\x79\xe6\x64\xa2\xf4\xe1\x69\x38\xcc\x26\xfc\xa8\xb4\x33\xeb\x80\x12\xf7\xb3\xad\x19\xba\x1f\xb8\x58\xfe\x4a\x00\xfb\x3d\x1f\x8f\xd0\xed\xdf\x0c\x37\xdc\xdb\x2e\x5d\x35\xc2\x54\x6f\x22\xe8\xc0\xf8\xce\x90\xe2\xdf\x8a\xbf\x24\x82\x7a\x01\x9b\x2c\x33\xfc\x59\x0b\xbe\x71\x2f\x01\x92\x87\x00\x2b\xc2\x21\x7c\x0d\xc0\x93\x1d\xc8\xed\x8f\x50\xbb\x44\x2f\x8b\x2d\xe2\x78\x57\x36\x2c\xe5\xa9\xfd\x97\xf0\xfd\x1b\x2b\x92\x51\xca\xd2\xa4\xac\xa1\xa9\x4d\xe2\xe9\x53\x90\x2d\x72\x28\x14\x24\x07\x44\x3b\x1d\x51\x71\x07\x64\x8a\x7b\xab\x83\x07\x49\x87\xd0\x97\x8b\xc6\x1d\x41\x9b\xc8\x45\x91\xc9\x69\xc3\xd6\xf4\xe8\x6f\xc4\x73\x87\x37\xbc\x05\x58\x75\x5c\x11\x0a"}, +{{0x27,0x65,0x48,0x29,0x0f,0x3e,0x0f,0x90,0x05,0x15,0xdc,0x63,0x36,0x6c,0x03,0xfe,0x0f,0xc6,0xee,0x13,0x0c,0x21,0xfb,0x60,0xa4,0xdf,0x9c,0xf4,0x64,0x79,0x7c,0xda,},{0x7e,0x2a,0x35,0x78,0x00,0x0a,0x08,0x7e,0xdc,0xc9,0xe9,0x4f,0xde,0x50,0x9f,0xc4,0xbe,0x05,0xca,0x0d,0xd0,0x90,0xdf,0x01,0xae,0x11,0x21,0x12,0x35,0x36,0xf7,0x2a,},{0x88,0xa1,0x46,0x26,0x1a,0xd1,0x11,0xc8,0x0f,0xa4,0x29,0x95,0x77,0xe7,0x10,0xf6,0x85,0x9c,0xf0,0xd1,0xca,0x80,0xe5,0x12,0xa5,0x52,0xc7,0x25,0xb8,0x38,0x40,0x37,0xee,0xcf,0x64,0x65,0xce,0x97,0x58,0x5c,0x9d,0x66,0x0a,0x41,0xab,0x91,0x04,0xe5,0xf7,0xc9,0xb2,0xf8,0xec,0x6f,0xb2,0x1f,0x1d,0xdd,0x50,0xd6,0x5b,0x9b,0x66,0x0e,},"\xf0\xdb\x44\x2d\xe2\x9a\x7a\x1d\xed\x55\x0d\x12\x00\x02\xcc\x12\xab\xff\xf9\x8b\x1f\x57\x6d\x65\xbd\xe1\x6d\xea\xba\x68\x7e\x4e\x0b\x0d\x5a\x87\x48\xd7\x50\x3d\xa2\x96\x9c\x64\xd6\xa7\xc2\x8d\x27\xb6\xc9\x3a\xd2\x57\xce\x32\xec\xda\xee\x37\x5f\x43\xff\xf9\x7c\x43\x2d\x45\x3f\x71\x96\xc7\x09\xc3\xbd\xfb\x73\x88\xd4\xd8\xea\xf1\x39\xf1\x82\x94\x0c\xe1\x7b\x45\x52\xe2\xd2\x0a\xed\x55\x57\xba\x4d\x2a\xcb\xf8\x45\x73\x0c\x0a\x66\xb4\x5b\x40\x95\x0b\xaf\x6a\x94\x64\x37\xaf\x6c\x9e\x3b\x33\xa7\x9e\x04\xdc\xea\xe5\x7c\x2a\x54\x95\x42\xea\xbd\x21\x6b\xf1\x39\x48\xd4\x1f\xfb\x94\x83\xfe\x29\x80\x1f\xc8\xc1\x78\x28\x40\xde\xeb\x3f\xb4\xda\x31\x92\x78\x5b\xca\x13\xed\x0a\x9e\xff\x57\xd6\x13\x6b\xaf\xbf\x9d\xec\x69\x7b\x83\x24\x47\xb2\xb6\xe7\x30\xfa\x7f\x99\x95\xba\xc6\xb7\x83\x2e\xaa\x09\x90\x5e\xe4\x9d\x46\x5a\x5e\xe4\x50\xf5\x2d\x1a\x6d\x36\x4c\x61\x81\x44\xe8\x86\xe8\xef\x63\x3d\xc7\x9d\x0a\xf8\x93\xd1\x6b\x3e\xed\xa0\xfe\xfe\xfd\x87\x59\xf2\xa0\xda\x19\x30\x17\x0d\xd1\x9e\xb7\x8f\x0d\x7a\x7b\x74\x51\x54\x03\x37\x5a\x95\xbd\xbc\xce\x01\x8b\xc1\xed\xb0\x8d\x89\x7b\xb7\x98\xa9\x5e\x7e\x86\xa5\x2a\xf3\xd9\xb8\xa4\xa1\x4b\x03\x71\xd6\x34\x98\xdc\xb2\x01\x62\x48\xeb\xd0\xbe\x80\x0e\x9f\x21\xd5\x49\xe5\xe0\xe7\xb4\x89\x5c\xa5\xcb\x72\x5a\x0c\xab\x27\xda\x8a\x8b\x12\x99\xbe\x38\xa4\x26\x09\x00\xae\x10\xdf\x5b\xab\xa1\x1a\xe2\xba\xb7\x17\x9d\xd8\x45\x39\x69\x42\x9c\xcc\x4d\x41\x60\x55\xf2\xbc\xb9\x3c\x1c\xac\x6d\x7e\x80\x4c\xf8\x12\xdf\x14\x62\xf2\x2e\xe9\xe8\x33\xa9\x76\x9e\x8e\x67\x75\x50\x40\x2c\x40\x94\xdf\x21\x2f\xd2\xc5\xfc\xc0\x9a\x72\xc7\xce\x00\x77\x51\x00\x73\x09\x0d\x0e\x63\xdb\x63\x7d\x43\xd4\xc2\x1f\x86\x19\xd3\x4d\xa5\xdb\x08\x03\x3f\x68\x6c\xe8\xb8\xa0\x82\x12\x22\xf9\x54\x34\xac\x4e\x6f\x70\x30\x94\xed\xde\xd6\xfb\x1b\x84\x6e\x97\x96\x50\x97\x9d\x3c\x77\x45\x3f\x40\xf7\xfe\xe7\xc3\xe8\x8a\x96\xfd\x1d\x70\x2e\x81\xc2\xa4\xf3\xf3\x75\x3c\x79\x64\x84\x2d\xfd\x9d\x39\x58\xa7\x43\xda\x06\x3d\x1d\x64\x8e\x51\xb2\x10\xa2\x8e\xd2\x48\x7f\x14\xd5\xf1\xbc\x6f\x33\x9b\x2d\xd1\x7a\x66\x1c\x39\x73\x6d\xa9\x9e\x4a\x4f\x07\x36\x03\x42\xd2\x37\xe3\x81\x3e\xa3\x99\x8d\x66\xeb\x31\xa2\xd7\x08\xaf\x06\x5c\x32\xb9\x27\xf7\x57\xc3\x7a\x80\x06\x60\x67\x4e\x97\x17\xba\x58\xf2\x80\xeb\x2a\xa4\x64\xfa\x74\x40\x21\x08\xa5\xd5\x66\x2e\x8d\x0f\xea\xf3\x29\x68\x7a"}, +{{0x97,0x2c,0x06,0x16,0x55,0x6e,0xf2,0x2c,0x21,0x48,0x68,0xfd,0xd8,0x22,0xc5,0x57,0x39,0xe1,0xf9,0x6a,0x93,0xae,0x83,0x51,0x2a,0xfd,0xa9,0xca,0x7a,0xa7,0x4c,0xd2,},{0x9e,0x1c,0x6d,0x41,0x07,0xf8,0xab,0x81,0x61,0xc5,0xdb,0x5b,0x88,0xa3,0x7c,0xa1,0xde,0x9f,0x4e,0x29,0x13,0x67,0xab,0xb1,0xef,0xc8,0x4f,0x83,0xf7,0x07,0x69,0x53,},{0x54,0xdd,0x06,0xfb,0xb3,0xd7,0xc6,0x3f,0x8c,0xda,0xf7,0x83,0xc2,0xd7,0xba,0xc1,0x6b,0x4c,0x82,0x6e,0x2d,0x1b,0x18,0x07,0xc8,0x4e,0x04,0x9f,0x64,0xe2,0x71,0xb2,0x1c,0xfa,0x3e,0x37,0xc3,0x44,0x26,0x02,0x87,0x80,0x5d,0x71,0x88,0x06,0xb6,0x2c,0x56,0xb4,0x7f,0x6d,0x5c,0x50,0x81,0x25,0xc9,0xfb,0x5d,0x5e,0xa3,0x5f,0xd5,0x01,},"\x86\x89\xe2\xf9\x5c\x8f\xd5\x0d\xc4\x46\x64\xa1\x8f\xb1\xa9\xf2\xc8\xf3\xee\x73\xc0\xf9\x58\x7e\xe2\x8b\xfa\x35\xc9\x23\x1c\x75\xbf\xd3\xd9\x53\x41\x74\xe5\xad\x3f\xa9\xf0\x92\xf2\x59\x94\x2a\x0f\xf0\xba\x2c\xa2\xcb\x59\x04\x3d\x19\x2c\xa8\xe3\xc8\x86\x9b\xed\xd2\x35\x4c\xbc\x5a\xc7\x82\xd7\x27\xc0\xb6\x94\x07\xf6\x8d\x13\x26\xdf\x65\xa6\x0c\x4d\x32\xf8\x7f\x19\xa1\x0f\x3d\x76\x5f\xf9\x23\x43\x4f\x55\x11\xd1\x34\xd3\x97\xc4\xfe\xf6\xbb\x19\x53\xab\xfc\xe6\x08\x27\xc3\x59\xaa\x4b\x54\xf9\x12\xaa\x8b\x17\xb8\x3d\xcc\x7e\x3b\xcb\xc5\x05\xba\x04\x6f\xe5\x7c\x16\xda\xcf\x4e\xe2\xfa\xd5\x38\xbc\x06\x81\x7c\x9b\x9d\x8d\xbc\x5f\x9d\x9b\xbf\x9f\x4a\x93\x4f\x14\xa4\x2c\x29\xe0\xe2\xf3\xa4\x9f\x46\xb2\x0e\xe7\x6c\xfe\x20\xde\xa1\xe9\x74\x50\xeb\x6a\x8f\xda\x04\x81\x68\xdd\x82\x78\x10\x20\x7f\x00\x5a\x3c\xaa\x93\xca\x11\xf4\xee\x60\x8a\x7a\x93\x55\x49\x43\x13\xae\xc8\xd7\x07\x5a\xfc\x94\xc7\xcc\xcc\x75\xc2\x31\x9b\xb4\x58\xc0\xce\x37\x3e\x9d\x00\x7f\x75\x3b\x33\xb5\x27\x93\xd5\x84\x96\xb2\xd2\x5c\xd1\xdc\xd7\x83\x2a\xac\x5d\xdb\x38\xf4\xdb\x19\xc4\x27\x21\x9e\x1a\x04\x20\xea\xd4\x7b\xa9\x5a\xb6\xd8\x9c\x65\x93\x90\x41\xcc\x73\x4c\x08\xeb\x6b\x47\x6c\xaf\x7f\xc7\x6c\x59\x8d\x94\x7f\xf4\x44\xb1\x07\x70\xf6\x29\x45\xae\x65\x04\x4f\x78\x09\x82\x99\xe2\x62\x6b\x63\x8a\x73\x28\xd1\xb7\xda\xa5\x88\x9e\x8d\xb9\x4b\xbf\xf2\xde\xd6\x2e\x14\x46\x37\x60\x22\x7c\x3f\x32\x6e\xd4\x93\x56\x5d\xdf\x0a\x17\x61\xb8\xe4\xbb\x7d\x24\x10\xfa\x0f\xdb\xf3\x56\x84\x39\x7e\xef\xea\x95\x89\x58\x89\xa0\xa9\xdf\xfc\x5e\x02\xc0\x92\x38\x3b\x7c\xe7\x4d\x2d\x90\x93\x99\x16\xf2\x6b\x71\xaf\xd2\x65\xf8\xbe\xc7\x4f\x0d\xe2\x47\xc9\x64\x39\x05\x58\x3d\xf3\xce\xe2\x35\x37\xd6\xb5\x68\xc8\x33\x8c\xe5\xfe\xe4\x2f\x7d\xd1\x5d\xad\x52\x47\xf0\x09\xac\xbf\xd5\xd7\x69\xb6\x36\x69\x59\xcd\x0a\xe1\x50\xf5\x8f\x7c\x80\xfa\x10\xd9\x89\xed\x90\x11\x93\x72\xe5\xfe\xa5\xda\x48\xa4\xe8\xea\x9c\x72\x78\x75\xdc\x4a\x20\x05\xb0\xdc\x2e\x3f\x69\x7c\x0c\xe0\xa4\xbd\xb2\xf7\x50\xc0\x4f\xbc\x0c\x27\xd0\x2d\xd8\x28\x6e\x54\xc9\xc3\x95\x9b\x6f\xfb\xdb\x1d\xe2\xaf\xfe\x9e\x78\x26\x51\xe5\x16\x8a\x50\x0a\xfe\xd0\x37\xb3\xe1\x79\x0d\xdd\x59\x38\x51\xa6\xa6\xcc\xca\x9f\xff\xb4\xa9\x9e\x27\xdf\x43\x81\x88\x71\x53\x6a\xb0\x4f\x14\xa0\x6a\x1c\x7c\xb4\x7b\xed\x62\x41\xce\x74\x30\xad\x3e\x64\x0a\x72\x67\x52\xfa\x06\xa9"}, +{{0xe0,0x40,0x5d,0x37,0x89,0x3e,0x89,0xf5,0x38,0x11,0xd6,0xd4,0x46,0xe1,0xf1,0x93,0xf5,0x1a,0xfa,0x1b,0xbb,0xa7,0x25,0xf9,0x5e,0xb4,0x80,0x33,0x42,0x4a,0x25,0x09,},{0x45,0x10,0x4d,0x59,0x5e,0x44,0x3e,0x8c,0xe6,0x54,0xde,0x9d,0x65,0x50,0x54,0xbf,0x0a,0x99,0xd3,0x56,0x13,0xd7,0x7d,0x57,0x45,0x4c,0xa2,0xd1,0xc8,0x99,0xb5,0x17,},{0x77,0xdd,0xd4,0x91,0xca,0x66,0x2e,0xbf,0xfb,0x12,0xf7,0xf4,0x92,0xd7,0xfb,0xc1,0xa1,0xb4,0x47,0xf6,0xc8,0x59,0x98,0xf2,0xf7,0xcc,0x9a,0xdc,0xe6,0x7d,0xe6,0x3b,0x6e,0xeb,0xd0,0x81,0x17,0x84,0x5a,0x03,0x02,0xf7,0x34,0x97,0x14,0xba,0x9d,0xb2,0xaf,0x58,0x04,0x8b,0x85,0x83,0x7d,0x76,0x60,0xec,0x3d,0xeb,0xee,0xe2,0xd0,0x0f,},"\xdf\x58\xc4\xfd\x07\x02\xa2\x0f\xaf\xa3\xd1\xd4\xfe\x7d\x85\x93\x8b\x12\x0f\xc1\x1e\x8d\x41\xb6\x01\xf0\xe6\x0e\x42\x23\x6a\x49\xf1\x26\x81\x3b\xd5\x12\xee\x71\x35\x90\x61\xe1\x3e\xb3\x14\xd4\x17\xf5\x6d\x6d\x56\x02\x85\xfa\x89\x91\x21\x32\x84\xc4\x2b\xc2\xce\xf2\xdc\x93\x7b\xdc\x0b\x5e\x9d\xc2\x26\x9a\xfa\xb3\x2d\xb3\x0e\x68\x49\x85\x59\x51\xcf\xbc\x53\xec\xfa\x01\x64\x38\x63\xe0\x32\x89\x95\xfe\x85\x0c\x0d\xb5\x54\x21\xbf\xa5\x64\x60\x1b\x8c\x9d\xb7\x55\x2c\x7e\x6a\xa7\xad\xfa\x15\xa5\x80\x21\xa8\x42\x66\xe9\x59\x5c\x65\xfc\xa4\xa1\x5f\xa7\x0f\x55\xf5\xd2\x12\xc9\xe2\x77\xff\xb8\x30\xf4\xca\xd1\x86\x1f\x3f\x49\x5a\x9d\x67\x2f\x56\x91\x31\x06\x39\xc1\x2d\xcd\x07\xe3\xef\x17\xa2\x37\x50\xbc\xb4\x6b\x7a\xd7\xea\xc4\x62\xeb\x51\x22\x25\xf3\xbe\x7e\x32\xf8\xf4\x98\x7a\x11\xdf\x34\x11\x66\x06\x2b\x43\xc6\x3a\xb8\x58\xa6\x00\x49\x76\x67\xfb\xb8\x8e\x93\xc7\xe2\xe0\xaa\xb4\x1c\x09\xc0\x23\xeb\x90\x2e\xc3\xba\xf6\x79\xe2\x5b\x96\xe1\x06\x92\x1a\x91\x4f\xd5\xde\x20\x0a\x47\x88\x9d\xe2\x3e\x7b\x65\xd0\xcc\xdf\x0c\x29\x03\x64\x67\xa1\x21\x0c\x00\x30\x30\x9a\x2d\x04\xec\x25\x6d\x5a\x4d\x8b\x97\xd4\x6a\x3e\x15\xf3\x45\xb6\x67\x17\x08\x03\xcd\xac\xf6\xcb\x48\xad\xd0\xa1\x34\x62\xdd\x30\xfa\x06\x2b\xd4\x56\x66\x41\xda\x07\xd7\xf6\x1e\x06\x36\x86\xed\xd9\x6b\xfe\x8f\x97\xb9\x86\xb7\xc0\xe4\x42\x49\xcd\x2d\x73\x17\x47\x29\x99\xb8\xee\x4e\xa8\x0c\x90\x2f\x3b\x18\x89\x36\x71\x2e\x89\xd8\xbf\x02\xce\x8a\xe7\x7b\x6b\x31\xab\xb0\x63\x20\x65\x45\x5d\xdd\x9f\x9d\x1c\xd9\x53\xa4\xa4\x9a\xac\x1a\x15\x16\x9e\x68\x7d\x4f\xd3\xf7\xc2\xed\xfb\x3a\xab\xc3\xb6\x61\x55\xf7\xd3\x15\xf8\xa2\x94\xfa\xdd\xff\xdb\x49\x51\x36\x7a\x0c\xb8\x70\x75\x9e\x85\xa8\x38\xaf\x66\xba\x3f\xc1\x03\xda\x2b\xab\xc3\xf3\x81\x69\x6e\xf8\x88\x2d\x85\xa8\x27\x8d\x5f\xac\x3a\x72\xf1\x6e\xb1\x19\xee\x99\x00\xb1\xfd\x98\x6c\x2a\x9f\x94\xee\xd8\xe0\xd4\xf2\x73\x69\x7e\x43\x63\xa9\x75\xff\x6a\x7b\x80\xd5\xb4\xec\x53\x55\xbf\x63\xb4\x2b\x71\xcd\x48\x42\x40\x1d\x38\xb5\xe0\x0c\xc9\x7b\xfd\xa4\x0e\x45\x66\x53\x68\x3b\xc8\xe6\xda\xde\x7d\xcf\x98\x5a\x97\xb0\xb5\x77\x6c\x4d\x72\xca\x13\xa1\x47\x4e\x4e\xb2\xec\xcf\xcd\x42\x87\x86\xdd\xd0\x24\x6d\x73\xa6\x37\x7a\x79\xcb\x8d\xa7\x20\xe2\x26\xc1\x94\x89\xbd\x10\xce\xdd\xe7\x4b\x49\xfa\xc2\xcf\xa2\x07\x12\x9c\x6a\x10\x8a\xa1\x64\xbe\x9d\x80\x9c\x4d\x31\x14\x73\x60"}, +{{0x57,0x56,0xe7,0x52,0xdf,0xf6,0x9e,0x3e,0xed,0x84,0x8e,0x4a,0x49,0xc7,0xa8,0xba,0xca,0x12,0x15,0x4f,0x94,0x31,0xde,0xc3,0x56,0x26,0xef,0x8d,0x75,0xa4,0x45,0x14,},{0x59,0x10,0xef,0x00,0xa5,0xb3,0x54,0x14,0x3c,0x46,0x56,0x1d,0xa6,0x2c,0x41,0xaa,0x13,0xd2,0x9c,0x18,0xdc,0x61,0x53,0xbf,0x8e,0x50,0x2e,0x01,0x14,0x00,0x77,0x28,},{0x81,0x57,0xd8,0x33,0x4d,0xed,0x1a,0x32,0x69,0x9b,0x35,0x0a,0xc0,0xd4,0x12,0x00,0x28,0xcd,0x8e,0xf8,0x18,0x94,0x48,0x93,0x48,0x50,0xe5,0x0e,0xe4,0x99,0x9d,0x8f,0xa2,0xcd,0x25,0x76,0x46,0xd9,0x2f,0xba,0x5d,0x66,0x2a,0x82,0x3e,0x62,0x20,0x8a,0xb4,0xfb,0xe0,0x17,0x14,0xa8,0x48,0xa0,0xb9,0x0b,0x55,0xad,0xcd,0x24,0x69,0x02,},"\xeb\x21\x90\xa3\x21\x9c\x79\x2b\x66\x66\xb2\x75\x27\x33\xad\x9f\x86\xfc\x39\x01\x55\xc4\xb4\x38\xbe\x19\x69\x59\x38\x3b\x25\xf3\xa7\x49\x53\x0d\x5a\x4b\x15\xeb\xe2\xc1\x8d\x99\x17\x8e\x6d\x45\xbb\x4a\xa2\x12\x0f\x95\xa3\x52\xe0\x40\x6c\x63\xac\x86\x72\x48\xd9\xef\xba\x12\x42\x31\x06\x48\x73\xc8\x2f\xe9\x95\xdd\x03\x1c\x7c\xbc\x7d\x15\xec\x19\x1f\xbb\x6c\x47\x4d\xc4\xc7\x77\xe8\xf4\x57\x84\x1e\xb4\x62\x48\x41\xc1\x52\xd1\x5e\xde\x26\xe7\x84\x79\xa6\xa2\x5f\xfa\x33\x55\x63\xf1\x06\x4e\xf0\x95\x58\xb9\x10\xe2\x60\x84\x18\x82\x0f\x49\x55\x4b\x67\x0c\x6b\xab\x34\xd1\xd6\x09\x84\xde\xa5\x0e\xd6\xa3\x75\xf4\x5a\x74\xbe\xad\xfb\x04\xbd\x93\x00\xbd\x59\x4e\x2e\x20\xea\x5d\x30\x52\xbb\x7d\xdc\x51\xa9\x49\xa0\x04\x79\x72\x68\x2e\xbe\x66\xd3\x8a\xac\x62\x92\x72\x70\xde\x42\x15\x0d\x58\x22\x1d\x03\xb8\xac\xe3\x58\x99\x33\x48\x7b\xf2\x3d\x29\xc5\xc2\xc8\x43\xae\xfa\x2e\x1c\xa2\x2f\x9d\x16\x80\xf8\x0c\x76\x6d\x14\x3c\xe5\xec\xef\x25\x3a\x74\x5c\xb7\x1e\x72\xf6\x50\x4a\xd9\x11\xf7\xcb\x4a\x81\x9c\xd0\x74\x86\x3a\x92\x70\x69\x29\xa3\x14\x2f\x8d\xb7\xac\x16\x41\x02\xac\x2c\xa0\xd2\xe1\x9a\x72\x5e\x1b\x5f\x81\xf4\x43\xc7\x3e\x04\x84\xf2\x6a\x45\xa3\xae\xf8\x4f\x1f\x3f\xa0\x4a\x4a\xc6\x95\xd2\xda\xb6\xef\xba\x45\x6a\x28\x1a\x39\x73\xcc\x18\x6e\x68\x0a\x66\xdf\x52\x1a\x4d\x1f\x9e\xdf\x4d\xfb\x27\x4a\x42\x70\x97\xbf\x86\x32\x81\xcf\xb0\xed\x80\xf8\xd7\x67\x66\x38\xd6\xcd\xac\x93\x78\x43\xef\xbc\xfc\xe9\x1d\xe1\xdf\x6c\x52\xb5\x94\x57\x1b\x93\x15\x60\x0e\x4b\x65\x52\xde\xfb\x84\x37\xa8\x07\xba\x21\x29\x8e\x3d\x97\x22\x12\xba\x31\x46\x92\x91\x7f\x40\x07\x53\x11\xac\xd0\x09\x39\x52\x41\xb9\xf1\xb2\x56\xc5\x15\x73\x5d\xc6\x74\xf8\xe8\x66\xd1\xee\xb4\xc3\x28\x54\x8a\xee\x71\x23\x1c\x4c\x9d\x5b\xd2\x2e\x39\xde\x88\xd1\x9f\xab\xf4\x9f\x0b\x98\x69\xcb\xf8\x35\x21\x4b\x15\x52\x2a\x93\xd3\xa5\x00\x7b\x11\xf0\xb5\x0e\x52\x28\xd4\xee\xbb\x45\x71\xb3\x5d\xa8\x4f\x4f\x68\x7e\x3f\x43\x79\x3d\x54\xf3\x82\x5b\x37\xa5\x09\xea\x56\x4b\xdf\x21\x7f\xf4\xad\xf6\x84\x7b\xbe\xa4\x31\x6a\x1d\xbc\xc7\x44\x8e\xcd\x53\x63\xea\xab\xc1\x28\xde\xcf\x05\x4e\xe1\xa0\xee\x2d\x87\x19\x79\xf8\xa6\x3b\x26\x92\xb0\x9f\x6e\x98\x6a\x13\x8e\x7f\x68\xf6\x0a\xa4\x26\xa1\xc9\xb0\x1a\x49\x02\xe1\x3b\x17\xbc\x83\x12\x41\x0c\x28\xbe\xd2\x9b\x60\x1b\x0f\xc9\xf3\xbc\x2d\x22\x3f\x87\x52\x51\x10\x0f\x86\x9c\x6b\x58\x44"}, +{{0xb9,0x04,0xac,0xb1,0x9e,0x5c,0xf8,0x72,0xd3,0x64,0x0c,0xd1,0x8d,0xdf,0x3c,0x0b,0x66,0x57,0xe0,0x11,0x7c,0xe6,0x59,0xdb,0xf5,0x02,0x59,0x01,0x5d,0x3f,0xbf,0x32,},{0xe0,0x4a,0x8a,0xa5,0x6d,0x18,0x18,0x48,0x3b,0x10,0xd0,0xa7,0xc9,0x19,0xe1,0xd5,0xd8,0x00,0x1e,0x35,0x51,0x0e,0x1e,0xc6,0x2f,0x71,0x14,0xdb,0xe8,0x1a,0xe0,0xbe,},{0x9a,0xaf,0x8a,0xc9,0x71,0x40,0xd5,0x50,0x8d,0x58,0xf5,0xac,0x82,0xb7,0xfd,0x47,0xe6,0xb1,0xf6,0x8a,0x7c,0x78,0xa2,0xac,0x06,0xf0,0x41,0x6e,0xf8,0xe9,0x91,0x95,0x3f,0x62,0xc4,0x7f,0xd5,0xfb,0xc6,0xc1,0xe0,0x1b,0xae,0x1c,0x92,0xa3,0x3e,0xf5,0x2b,0x7e,0xfa,0x5f,0x17,0xbb,0x86,0x33,0xbd,0xc1,0xae,0xeb,0xce,0x31,0x8f,0x0f,},"\x83\xf4\x12\x4d\x5a\xf9\x55\x13\x9b\x1b\xc5\x44\x1e\x97\xc5\xfa\xc4\x91\xb4\xea\x91\x14\x07\xe1\x54\x20\xa0\x34\x7e\xd7\xfa\x1f\x88\x19\xe3\x6c\x8e\xd5\x74\x0c\x99\xd4\x50\x5a\x78\xb6\x19\xd5\x60\x74\x9a\xf5\x0b\x05\x73\x51\x08\x16\xd6\x13\x22\xcd\xa9\x76\xa5\xd4\xca\x32\x05\xf5\xf0\xe6\x0e\x75\x9a\x5d\xf1\xa0\xbd\xf3\x6d\xfe\x97\x17\x90\x6a\xc5\x7c\xbf\xc9\x70\xab\x43\xb6\xfa\x18\xe6\xc0\x00\x6c\x84\xfc\x72\x54\x47\x0a\x0b\x77\x47\x27\xbf\x5f\x8e\x67\x94\x23\xa5\x31\xe4\x1c\xb5\x31\x0f\x9b\xcb\xf5\xa5\x44\x5e\xbc\x39\xfb\xd9\x09\xce\x11\xe9\x7b\xc2\xf6\x6a\x4a\x1b\xb6\xc2\xf1\x67\xf2\xc6\xe8\x0e\xb9\xb8\xb7\x2d\xf3\xe8\xcf\xd4\xe5\x14\x48\xdc\x14\xc0\xb8\x37\xf2\x94\x96\x93\xd1\xd0\x54\xc8\xf9\x5b\xff\x7f\x1e\x36\x45\x67\xd0\x34\xf2\x22\x3e\x15\x94\x77\x2a\x43\xdc\xfe\x05\x97\xfd\x6d\x13\x3b\x3f\x2e\x96\xff\xc5\x66\x7d\xd5\x92\x8f\x23\xec\x3c\x75\x0f\x84\x59\x93\xa3\x4e\x97\x76\x15\x9a\x68\x30\xd6\xfd\x90\x13\xee\x7a\xea\xa1\xfc\xcd\x69\xb9\x6d\xf2\x84\x70\x4f\xd0\x88\x88\xb1\x5b\x64\xe2\xe9\x0d\x57\x8c\x5c\xfc\x0f\x95\x69\x3f\x6a\xb6\x5c\x69\x47\x44\x6a\x85\x7c\x02\x9c\x7c\xa6\x60\x80\xb7\x54\xc7\x73\x4b\x78\x99\x8a\xbe\x9b\x7c\xc6\xef\xd0\x9a\x44\x18\x19\x4d\x88\xb3\x4e\xc6\xc3\x3a\xf6\x30\xdb\x81\xde\x5b\x99\xfe\x65\xaa\xc8\xb7\x33\x62\x37\x91\x19\xc7\x00\xd1\x07\xed\xfc\x19\xf2\x70\x76\x04\x68\xee\x8e\x5f\x15\x5d\x9a\x34\x7e\x57\xb5\x93\x0f\x32\x7a\x8d\x11\xc6\x67\x4d\xdd\x02\x0f\x9e\x7d\x9b\x76\x1d\xba\x5b\x83\xa8\x73\x02\xf1\x83\x3e\x5a\xbd\x49\x52\x6d\x66\x39\x1e\x5b\xf0\xe3\x5b\x44\x53\xd6\x30\xbf\x7d\x0a\xdb\xfe\x50\x1a\xef\x81\xe6\xc5\x93\x8f\x92\xcb\x75\x2f\x5f\x14\xd2\x80\x6f\x90\xae\x15\x46\x05\x1c\xcc\x7f\x91\x3c\x5d\x6a\x38\xff\x3b\x7b\x9a\x23\x66\x2e\xf1\xf0\x08\x08\xed\xb2\xfa\x31\xec\xba\x5c\x8d\x33\x87\xe8\x75\x41\xcd\x06\x16\xed\xbf\x3a\xaa\x35\xa5\x37\x92\x28\x61\xf4\x4c\xbd\x9f\x99\x2b\x82\x46\xd9\xc6\x4c\x41\x98\x81\x70\x1a\xb4\x3f\x7f\xd4\x64\x21\x0d\x80\x2b\xa6\x56\xd9\x5c\x0f\x24\xa3\x45\x99\xb2\x0b\x1e\xc2\x00\x11\x48\x5c\xfc\xb3\x18\x6b\x7b\xcf\x69\xd7\x45\x81\xa7\xa3\xee\xd6\x13\x4c\x4e\xec\xd6\x55\x74\xa4\x32\x0d\x9c\x57\xa8\x49\xc4\xe7\x8c\x8a\x5c\xe8\x25\x05\x00\x4a\x54\xf1\x9d\x4b\xdc\x82\x23\x40\x1b\x34\x94\x6b\x7d\x66\xe4\x7e\x63\xcf\x9d\x0f\x57\xd0\x94\x54\x91\x38\x4b\xc6\x86\x8c\x4b\x47\x86\x90\xe5\x50\x02\x1d\xf1"}, +{{0x8a,0x35,0x01,0xb7,0x69,0x53,0x60,0x3c,0x90,0x33,0xe3,0xbc,0xbf,0x3e,0xc3,0x78,0xd2,0x57,0x01,0x1a,0x6c,0x50,0xb8,0x97,0x62,0xd4,0x91,0xea,0xa7,0x2c,0x5e,0x0d,},{0x77,0x8f,0x20,0x19,0xdc,0xd8,0xdb,0xb8,0x6c,0x67,0x37,0xcc,0x8d,0xc1,0x90,0xc5,0xa0,0x4c,0x50,0xb5,0xbf,0x45,0x88,0xbc,0x29,0xfa,0x2a,0x47,0xaf,0x25,0x26,0x72,},{0xa8,0xa3,0x09,0xba,0x52,0x12,0x5e,0x76,0xa4,0xa6,0x1e,0xb4,0x3f,0xd4,0x13,0x5c,0x41,0xab,0x11,0x79,0x9b,0x91,0xcc,0x54,0xff,0xc9,0xc6,0xa2,0x0f,0x05,0x0c,0xc5,0x95,0xb2,0x81,0x43,0xc8,0x74,0xbd,0xb9,0x28,0xbe,0xed,0x26,0x1d,0x9c,0x0f,0x12,0xaa,0x19,0x2e,0x66,0x40,0xbf,0xda,0xd5,0x4b,0xa0,0xd4,0x78,0x42,0x6b,0xce,0x09,},"\xe6\x09\xf1\x22\x4a\x6a\x45\x11\x40\xcb\xc0\x25\x4d\x43\x2c\xe5\xfd\xdd\x08\xa8\xe9\x12\xf8\x1c\x41\x2f\xdf\xd5\x18\x2f\xf6\xac\x2f\x13\xc5\x76\xc8\x14\x5b\x15\xf2\x5b\x40\x9d\x85\x3f\x91\x44\x09\xe4\xe0\x2c\xef\xc3\x9d\x9b\xef\x4a\x2a\x06\x04\x98\x57\x0b\x2d\x3a\x28\x38\xc9\xb0\xb8\xe3\xaf\x4f\xc3\x7e\x19\x15\xf8\x04\xa8\x01\x88\x58\x5b\x30\xb6\x8a\x3f\xfb\x2e\x96\x0c\x73\x20\xe8\x27\xd2\xfe\x36\xe6\xa3\x28\xcc\x6e\x78\x06\x34\x8a\xdb\x0b\x77\x3b\x78\x4d\xe5\x29\xbb\x6f\x64\x75\x1b\x21\x05\x85\x94\x94\xfd\x49\xdb\x0b\xc7\xf6\x2d\xf4\x6b\x9d\x7c\xe6\x76\x97\x5c\xc5\xf4\x38\x56\x49\x84\x36\x81\x2e\x04\xf2\x6f\xb8\xb8\xab\x7e\xba\x12\xf1\xd5\x67\x22\xeb\x82\xeb\xfa\xfa\x47\x35\x97\x7a\x26\x68\x1c\xb0\x3f\xa4\xbc\x69\x51\xab\x9c\xbd\xf7\x87\xe3\x27\x8f\x2f\x57\xf2\x9e\x12\x09\x5f\x8c\xa2\xa1\x78\xcf\xa7\x57\x13\x37\xf0\x27\x42\x37\x66\x9f\x97\x65\x7d\x4b\xad\xb3\x94\x36\xd7\x86\x49\x25\x80\xfd\x55\xd8\x6b\xe3\xa0\xcd\x17\xd1\x60\x57\x01\x7b\xaa\xae\xa0\x0c\x1e\x14\x55\x21\x59\xbc\xab\xc0\xe6\x66\xba\xd3\x41\x8e\x4e\xc1\x3b\xfe\x16\x3b\xe2\x56\xf0\xc8\x9b\xc2\x34\x4a\x8d\xdf\x99\xca\x81\x60\xb1\x89\x87\x5a\xd3\x22\xd9\x0f\x58\x13\x25\x28\x1d\x53\x89\x96\x5c\x0a\x7b\x7b\xca\xe2\x29\x4a\x3c\xbe\x35\xa4\xe4\xe8\x3b\x54\xc4\x27\x63\x53\x96\x0f\xad\x11\x85\x32\xd4\x9b\x70\x76\xf2\x5a\xd1\x90\xab\x56\x94\x91\x4f\x71\x08\xb0\xab\x69\x69\xa1\x91\x28\xfb\x0a\xef\x00\xe6\x5a\x04\xfc\x83\x2d\x07\x69\x61\x67\xb9\x34\x2b\x35\x5e\xc5\x77\x37\xca\x37\xcb\xff\x3b\xb3\x19\x31\xcb\x58\x71\x2a\x4c\x46\x89\x52\xc6\x45\x9d\x56\x7a\x26\xe7\x95\x01\xe4\xe3\x1b\x1b\x09\x53\x53\x76\x32\x02\x9e\x9b\x49\x0f\x72\xe5\xa6\xe0\x57\xdd\xb4\xb3\x17\x56\xfd\x97\x04\x21\x8b\x1b\x8f\x4d\xcb\x54\x30\xc0\x25\x04\x2f\x47\x16\x9b\xfc\x7c\x80\xd7\x1c\xab\x8c\xa0\x7f\x34\x0a\xfa\x00\x8a\xbb\xe2\xe3\xa0\xab\xe1\x41\xda\x8d\x41\xca\x6b\xd6\x9d\x36\xfd\xb1\x1a\x41\xce\x0b\x72\xfa\xbc\x00\xd9\x7e\xa6\x05\x27\x00\x10\xb2\x59\xdf\x8e\x10\xdd\x22\xdc\x17\xc1\x39\x90\xa0\x5f\x02\x33\xe3\xca\x85\x6b\x40\x97\x1c\xb3\xe2\x1c\x8b\x39\x50\xb1\x3f\xc8\x4e\x1f\x26\x6c\x2a\x6f\xbe\xce\x88\xd5\x97\x25\xc3\xcf\xb2\x22\x5d\xbc\x1e\xe9\x5b\x68\x6d\xb7\x04\xfc\x93\x7b\x76\x6f\x0a\x9b\xfe\x95\xa4\x2b\x90\x10\xf1\x22\x9c\x61\x0d\x7e\xde\x09\x57\x12\xc8\xf0\xf1\xfb\x00\x47\xc0\x40\xa8\x70\x30\x6c\xd8\xdc\x74\xc4\xda\x51\xbf"}, +{{0x42,0xb5,0x36,0x52,0xd0,0x8b,0x5d,0x76,0x6e,0x66,0xad,0x8f,0x3e,0xbf,0x69,0x3c,0xfd,0x77,0x90,0x7c,0xad,0xd9,0x8b,0x54,0x66,0xdf,0x77,0xdf,0xa2,0xc6,0x37,0xad,},{0x88,0x46,0x3b,0xb8,0xa4,0xb6,0x38,0x8d,0x92,0x4c,0xb8,0x62,0x09,0x83,0x41,0x95,0x43,0x5d,0x79,0xd7,0x7f,0x8c,0x02,0xf4,0x6b,0xbd,0x16,0xd8,0x2e,0xfe,0x42,0xb3,},{0x30,0xc4,0xb9,0x9e,0x68,0xec,0x33,0x51,0x30,0x8f,0xbc,0x76,0xd9,0xca,0xf0,0xaf,0x62,0x21,0xb5,0x96,0xb7,0x01,0x7f,0xe1,0x0c,0xc6,0x33,0x02,0x3b,0xa9,0x7f,0x02,0x38,0x96,0xfe,0x32,0x2b,0xaa,0x34,0x76,0x60,0x61,0x0e,0x05,0xfa,0x49,0x3d,0x21,0x8f,0xa3,0x60,0xf1,0x8d,0x93,0xe2,0x75,0xd1,0xef,0xf6,0x66,0xb6,0x3d,0xb2,0x04,},"\x9e\xe9\x13\xc7\x4e\xe3\xc5\xe8\xc9\x0d\x64\xb8\xae\x3a\x60\x04\x9f\xc7\x65\xe1\x76\x06\x0b\xcd\x1c\xd0\x9f\x0e\xda\x60\xbf\x23\xba\xdb\x8a\x1c\xaa\xc3\xd6\x6e\xbc\x52\x68\x14\x6e\xe4\xa5\x4e\x1e\xb2\x31\xed\x25\xef\xf9\x5b\x90\xa6\xe9\x83\x37\xa5\x40\xa3\xf4\x84\x49\x79\x4a\x48\x73\xbf\xc2\xe8\x47\x28\x96\x6b\xb7\xc6\xff\x67\x6a\x2f\xf5\x73\x11\xc1\xc2\x5e\x15\xfb\xf3\xd4\x0e\x9f\x25\xab\x5d\xb9\x1f\xdd\xb7\xa0\xae\x43\x6c\x8e\xc0\x70\x75\x4b\x6d\x74\x3a\xa1\xd6\x04\x8f\xb5\xbd\x7f\x5b\x8e\x4c\xca\xd2\x03\x28\x38\x95\x30\xf1\x13\x74\xa4\x89\xb1\xd5\x05\x31\xa3\x9c\x9b\x32\xb4\x03\x69\x62\x60\x06\xd2\x64\xa9\x9e\xec\x4f\xac\x13\x41\xf4\xe7\x46\x79\x45\x7b\x41\x8e\x6b\xbf\xba\x23\x3f\x1c\xa1\x58\xf7\xb2\x9d\x40\xd5\x03\x01\xf9\xd9\x25\x36\xfd\xc5\xc2\x3f\xe5\xde\xe4\xd6\xdf\x0e\xbf\x13\xdf\xa3\x75\x4a\x14\xc8\x56\x00\x9a\xde\xa1\xdd\xa4\x09\x30\x4c\x1f\x60\xd2\x53\x30\xfb\x10\x95\x79\x47\xa0\x05\x08\xf2\xfd\x76\x42\x2e\xac\x69\x4c\xc3\x9f\xa8\xae\x7f\xcc\x77\xa0\x2f\xd9\xee\x5f\x91\x0d\x93\xe8\xaa\xc6\x8f\x14\x5d\xd8\x78\x87\x6b\xa8\xed\xa0\xa4\x9f\xcb\x20\x9c\x34\xea\x22\x0d\x4d\x06\x05\x54\x6f\xc4\xa8\x09\xba\xf0\x10\xd5\x33\xe4\x5d\x17\xb0\xe1\x6a\x46\xe9\x1e\xa6\xfe\xc2\xcd\xc5\xa8\xb3\xec\x50\x14\xb2\x5e\x92\xd8\xe5\xc9\x28\xab\x06\x99\x3d\x4f\xe2\x3a\xc8\xd4\x5c\x89\x03\x78\xdd\x13\x3f\x00\xed\xb9\x37\xc0\x71\xf7\x5c\xfc\x13\xa4\x02\xe3\xe4\x29\xa8\x48\x65\x2a\x17\x5c\x9b\x6f\x6e\xac\x86\xf6\x18\x8a\x44\x48\xa9\x6c\xe2\x87\x2e\x5f\x65\xf9\xbd\xb8\x71\x66\xc9\xb8\x7a\x7e\x95\x8e\x80\xbb\x65\x66\xe3\xfc\xf8\x71\x19\x0c\xf4\xa8\x67\xe6\x12\xcf\xc1\xe4\x37\x1d\x2b\x73\xd2\xa0\xad\x0a\xa4\x00\xba\x69\xe6\x63\x36\x23\x3b\x0f\x3c\x52\xb8\xa6\x8b\xca\x05\x12\x56\x01\x25\x50\x46\xe6\xf4\x9d\x68\x8d\x2d\xb8\x5c\x7b\x82\x12\x70\x51\x6e\x3c\x06\x13\xf3\xf2\x3f\x9c\x57\xcb\x4c\x87\x14\x28\x5c\xdf\x95\xe1\x06\xa3\xb5\xaf\xca\xeb\x81\xb7\x2f\x34\x3e\x87\xbd\x92\xf1\x58\x1d\xcf\x9a\xa9\x0a\x02\x4f\xa4\xa1\x04\x80\x59\xe3\x0d\xe8\xff\x0d\x16\x79\x4d\xcd\x74\x5d\x2b\x2d\x53\x4c\x52\x0f\x82\x78\x53\x86\x74\xa9\x34\xc6\xf1\x4a\x84\x28\xe3\xda\x01\x8a\x36\xe4\x5a\xa5\x82\x7c\xf4\xb1\x52\x84\x34\x6f\xd6\x93\x63\x14\x92\x19\xbb\x0d\x1b\xc9\x27\xd8\xd1\x93\xc4\x82\x69\x2f\x97\xdc\x88\xd8\xed\x33\x7d\x0c\x9d\xc9\x9c\x7a\x5e\x11\x1d\xce\xd4\x22\x50\xd5\x80\xe2\x06\x92\xbb\x7b\x88"}, +{{0x14,0xcf,0xe0,0x0f,0xa7,0x19,0x0a,0xe8,0x10,0x88,0x8a,0xe2,0xbb,0xd0,0xff,0x64,0x12,0xcf,0x1f,0xd4,0x08,0xa3,0x08,0x29,0x43,0x83,0xa1,0x94,0x53,0xb5,0x90,0x73,},{0x4e,0x61,0xaf,0xe8,0xc1,0x74,0xb6,0xee,0x1a,0x29,0xfa,0x09,0xcf,0x87,0xb4,0x00,0x81,0x39,0xf1,0x07,0x0b,0xc8,0x53,0x1b,0x6d,0x06,0xf5,0x4c,0x95,0x62,0xa4,0xf3,},{0xf7,0x85,0xa4,0x6f,0x69,0xbb,0xd0,0x99,0xfa,0x01,0x11,0x24,0xba,0x90,0x32,0xc1,0x89,0x74,0x2c,0x9e,0x00,0x1d,0xbb,0x87,0x81,0xd8,0x22,0x33,0x45,0xa9,0x56,0x9d,0xc1,0x44,0xca,0x69,0x4d,0x90,0x24,0x5e,0x0e,0x51,0x3e,0x88,0xab,0x02,0x3f,0x7f,0x0f,0x99,0xb7,0x41,0x61,0x59,0x75,0x8d,0xd0,0x34,0xe7,0xa8,0x9c,0xff,0x36,0x00,},"\xbc\x66\xf8\x01\xda\xa8\x29\x85\x8e\x74\x02\x93\xd4\xd2\x18\x7b\x8e\x1a\x5a\xfb\xa5\xfd\x67\xb1\x09\x56\xc6\x53\x46\xac\xa9\x44\x29\xd3\x2e\x4c\xfb\x35\x84\xab\x0e\x00\x5d\x0d\xd7\x42\x78\x1d\x47\xe8\x94\x47\xc4\xe1\xd8\x1b\xf7\xe6\x15\x4f\x8f\x73\xaf\x03\x36\x1a\xd5\x6e\xa3\xc0\x60\x00\x75\x4b\x9f\x32\x7d\x4e\xde\xac\xc4\xd3\x48\xaf\xb5\x48\x23\xe1\xc9\xd4\x9c\xd8\xff\x2b\x19\xf4\x20\x21\xb4\x0d\x58\x0c\x39\xce\x3d\x24\x36\x61\xb8\x54\x21\xfe\xc9\x15\xba\x9d\xd2\x76\x2f\x85\x0b\xd2\x08\xfd\xbf\x20\xff\xab\xa5\x6a\x46\x86\x60\xf1\x7c\x00\xfb\x1c\x0f\x4e\x85\x27\xa5\x09\xdd\x4e\xec\x13\x36\x0c\xf6\xe3\xca\xc5\x42\xb8\x75\x18\x2f\x2a\x7c\xe7\xbe\x0a\x33\x30\x2f\xe2\x6d\x36\x29\x62\x93\x84\xe3\x5c\x06\x78\x9d\xe6\x34\xe9\x0e\x96\x4f\xbd\xa8\xcb\xba\x98\x11\x1e\x22\xe8\xd0\x76\x26\x84\x26\x6a\xab\x76\xae\xba\x4a\x38\x07\x78\x69\x68\x14\xa1\xe3\x11\x94\x3c\xb3\x50\x58\x92\x64\x0c\x44\xe3\xaa\xc4\x53\x0c\x50\xac\x60\x4a\x8d\x2c\xcc\x7c\xea\xbf\xfe\xa4\xaa\x3d\x7f\x48\xa6\x6d\xcd\x75\x88\xb8\x02\x09\xdb\xc1\x73\xf0\xc6\x63\xe8\xfc\x87\xa3\x6e\x89\x2e\xc9\xa3\xff\x8f\x60\xd2\xe0\xd8\x70\x4e\x5b\x6c\xbb\x87\x32\x75\x15\x1a\xd4\xcc\x00\x57\x16\x50\x31\x90\x50\x39\x65\x1c\xa1\x0a\x95\xc6\xfd\xa3\xb2\x78\x27\xa6\x57\xef\x9a\x5f\xc3\xeb\x5b\x53\xca\xc6\x1d\xda\xf5\xa4\x17\x04\xc8\x78\x57\x0c\xbc\x3c\x41\xc4\x75\xb1\x17\xc0\x5e\xab\x0b\xb1\x96\xbc\xb7\xc4\x33\x34\xde\xbd\x64\xb9\xe3\x74\x50\xd2\x3f\x5c\x10\x16\x1e\xc5\xab\x4f\xcc\xd7\xcf\x30\x8e\x2a\x99\x95\xcc\x9e\x57\x8b\x85\xe8\x28\x5a\x52\x08\xb9\xef\xd4\x2a\xf9\xcf\x2a\xc2\xb3\xb7\x46\x42\x54\x88\x9a\x21\x87\x31\x7e\x32\x49\x97\x09\xb9\x13\x95\x3a\xd4\x6f\x1c\x23\xe1\xb6\xb5\x6f\x02\x4c\x4a\x7d\x48\x46\x11\x92\xc0\x1c\x56\xc5\x4c\x56\x47\x91\xec\x0a\x67\xb6\x1a\xcb\xf9\x57\xe6\xd0\xd7\xda\x80\x53\xed\x13\xa4\x18\x93\xd7\x67\xfc\x57\x37\xcd\x19\x55\x53\xda\x5d\x5b\x07\x06\x5f\x47\xd7\x2a\x35\xc4\x2b\x00\x1e\xb6\xdb\xd0\xf8\xe7\x7a\x4b\x76\xa6\x26\x61\x92\x64\x7f\x41\x55\xea\x11\xbd\x12\x37\xba\x77\xc8\x7c\x62\xbf\x4b\x01\x14\x9f\xc5\x8b\xc2\x8f\x0b\x5a\x28\x64\x85\xd3\x71\x7d\x32\x39\x64\x04\x62\x18\xe7\x0c\x7e\x38\xb7\xd5\xe7\x4b\xa6\xb1\x2b\x02\x2f\x18\x19\x7d\x92\xc1\x3b\xca\x89\x33\x5c\x85\x6c\xbc\x57\x56\xaa\x3b\x64\xec\x1f\x46\xe3\x96\xb1\x16\x1c\x87\x1c\xd2\xdf\xde\xd1\xa4\xec\x91\x92\x74\x29\x37\xc0\x70\x45\x31\xc7"}, +{{0xac,0x0f,0x7f,0x04,0x18,0xde,0x67,0xe3,0x48,0xfa,0x6d,0x56,0x86,0xc4,0x6d,0x21,0xca,0x72,0x62,0x2e,0xe6,0x9e,0xaa,0xbe,0x00,0xd5,0xc9,0x07,0x5a,0x34,0xf1,0x79,},{0xfe,0xab,0xde,0x08,0xf0,0x0a,0x2b,0x68,0x2b,0xce,0x9d,0x45,0x99,0x0b,0xf4,0x5a,0xfc,0x95,0x83,0x39,0xdc,0x44,0x10,0x6d,0xad,0x33,0xb2,0xc4,0x90,0xef,0x70,0x90,},{0x75,0x91,0xcf,0x82,0x57,0xbe,0xad,0x39,0xa1,0xad,0x3b,0xa1,0x91,0x8d,0x51,0x8e,0x67,0x24,0x35,0x6b,0xf6,0x25,0xa5,0x73,0xea,0xe5,0x01,0xd1,0xaf,0x94,0x6c,0x13,0xc2,0x90,0xcb,0x63,0x15,0x6e,0xc9,0xd3,0x62,0x72,0x6e,0xe5,0x0b,0x39,0xfc,0x0a,0x7a,0x2b,0xbd,0x69,0xd4,0xa8,0x1b,0x75,0x93,0x2a,0x90,0xf8,0xc7,0xac,0x7d,0x03,},"\xe8\xd0\xe8\x32\x53\x35\xe0\xf3\x5a\x85\x46\x7b\xee\xd1\xe1\x1c\x6a\x20\x78\xc3\x5a\xe4\xa4\xa1\x05\x43\xed\xe4\x0c\x17\x12\xbc\x95\x20\x12\xd2\xf8\xfe\xc1\x05\xae\xf7\xc6\xc6\x5b\x36\x34\xb4\xa7\x4b\x22\xb4\x98\xb9\x13\x50\x7d\x1f\x6c\xfd\xe8\x38\x58\xe6\x83\x0c\x0a\xf4\xf4\x64\xa6\x89\x9d\x5c\x4e\x27\x9a\xff\x36\x75\x4c\x21\xda\x80\xa1\xbb\xd1\xdc\xf4\x62\x20\x37\x5b\x1e\x11\x2a\x5a\x72\xf1\xab\x6e\x8f\x64\x19\x42\xf6\x6d\x9b\xbd\xbb\x17\x9c\xf0\x13\x9e\xa8\xde\xb0\xf4\xb8\x14\xf5\x0c\x51\x33\x29\xa1\xa0\xe2\x67\xc4\x43\x3a\x23\x31\x82\xbc\x4a\x2a\xcb\x2c\x6d\x4f\x00\xb2\x40\x94\xd3\xbd\xc0\xeb\x81\xcf\x37\xd3\x82\x60\xc2\x10\x7d\xd9\x49\x06\x13\xd2\x76\xee\x1f\x72\x26\x6c\x6e\x4a\xcc\xa5\x24\x98\x11\xa0\xf8\xa7\xda\xe6\x6a\xed\xb7\x5c\x3d\xf4\xc8\xca\x3c\xb5\xd9\xc5\x67\xba\x54\x1e\xe5\xa9\x14\x0c\x50\x58\x72\x72\xaf\x34\x53\x0a\xb8\xb0\x8b\x9e\xc0\x32\xea\xc0\x60\x39\xe6\x92\x63\x0e\x2d\x55\x4d\xf7\x7c\x1a\x03\x88\xb3\xca\xaa\x3b\xe3\x75\x4a\x84\x96\x1f\xb2\x99\xe4\x02\x22\x71\x58\xce\x36\x3e\xac\x26\x47\x8d\x47\x97\x75\xe5\x68\x5a\xdb\xf8\x28\xbb\x35\x5e\x3c\x89\xcc\xe2\x41\x50\x3c\x15\x36\x64\x32\xba\x94\xcd\x3c\xd9\x54\x79\x14\x4b\x63\x6e\x0d\xe7\x0b\x3f\x16\xd1\xa3\xca\x51\x8e\x39\x90\x09\xa4\xc2\x47\xa7\xf9\x63\x67\xc7\x14\x66\x08\xaa\xcc\x00\x14\xfc\x35\xb8\x4a\xf9\x93\x3f\x09\xba\xbb\x89\x93\x7a\xbb\x8c\xed\x11\x18\x91\x34\x3d\xdb\x79\xf6\x0b\x78\x89\x8a\xb5\x93\x8f\x8b\xa3\x81\x4b\xd8\x00\x26\x05\xb1\xdf\xd2\x97\xfa\x07\xc4\x75\xa0\xd4\xf8\xf4\x45\x1a\xcd\x70\x7d\xe8\xaf\x6c\x0e\x88\x18\x83\x3a\x3a\xbe\x5c\x96\xd1\xa8\xc6\xc9\x6e\x2c\xb6\x33\x28\xeb\xa4\x4d\xd1\xd3\x46\x84\xe4\x12\xf2\x88\xe0\x65\x20\x9d\x11\xeb\x80\x94\xd2\x2e\x4c\xc8\x02\x62\x9c\xcb\xa3\x39\x26\xbf\x1a\xd3\x6a\x62\x85\x13\x8a\xbe\xe0\x5c\x5a\x39\xa4\x75\xf3\xfd\xd0\xb3\xec\x8c\x37\x0c\xd9\x57\xa8\x37\x9e\xc2\xcd\xaf\x03\xe8\x95\xc1\xba\x12\xb4\x49\xd6\xcd\x8b\xe0\xf3\x5d\x99\xe2\xb7\xfb\xaa\x92\xdd\x54\xe6\x4e\x7c\x35\xce\xb8\x8a\x71\xa6\x80\x52\x7c\xb3\x73\xaf\xe1\x4c\xdd\x15\x8a\x0b\x90\xbf\x2d\xae\xc8\x0d\x2e\xdb\xdc\x31\x28\xcd\x6b\x63\xfa\x53\x2a\x1c\x27\x8c\xdf\xe0\xf8\xeb\xb4\xab\xba\x5e\x1a\x82\xbc\x5c\x3f\xed\x15\xc5\x79\x5b\xd9\xff\xb5\x76\x08\x2c\xc4\x79\xfa\x1b\x04\xc5\xc5\xaf\xca\xd2\x69\xa0\xf1\xad\xdf\xe7\x60\x42\xc3\xa8\xf1\xf2\x53\x77\xb6\xcb\x72\xec\x16\x14\xeb\x63\x83"}, +{{0xb5,0xa7,0xc7,0x67,0x93,0x63,0x80,0xb3,0xe9,0x87,0x51,0xca,0xfd,0x3e,0xa8,0x9b,0x38,0x8a,0x32,0xcf,0x82,0x8b,0x32,0x1c,0x5b,0xd0,0xcc,0x8d,0xd8,0x5b,0xaf,0x00,},{0xbe,0x7f,0xa6,0x5f,0x1f,0x6b,0xe5,0x10,0x27,0xf8,0xb8,0x48,0xdb,0x7a,0x8c,0x40,0x49,0x61,0xbf,0x1e,0x21,0xa2,0x3d,0xf2,0x3b,0xb8,0xce,0x05,0x85,0x0c,0xda,0xa1,},{0x60,0xe4,0xd2,0x3f,0x1f,0x08,0xfc,0xe4,0x66,0xc9,0x91,0x5d,0xde,0xd9,0x32,0x56,0xb5,0x2b,0x32,0x7e,0x5f,0x81,0xfb,0xb3,0x1d,0x1d,0x10,0xd3,0x21,0xc3,0x90,0x36,0x6e,0xf0,0x01,0xfd,0x75,0x9a,0xa9,0xd0,0xa5,0x51,0x62,0xd5,0x36,0x4d,0x91,0x8b,0x48,0xc7,0x32,0x7e,0x77,0xcf,0x53,0x58,0xbc,0x43,0x19,0xe3,0x25,0xcd,0xd6,0x08,},"\x6b\x67\xc7\x95\xd6\x6f\xac\x7b\xac\x84\x42\xa6\xc0\x99\x2c\xb5\x75\x88\x43\xb3\xe3\x93\x9e\x3c\x27\x6c\x6e\x90\x08\xda\x82\x00\x76\x77\xbf\x9e\x67\xe9\xac\x5a\x1a\x0f\x48\x6b\xea\xc0\xd8\x56\x19\x1f\xae\x25\xa1\x27\x39\x2b\xed\x46\x9b\xc7\x8d\xeb\x0c\x4b\x89\x3f\x67\xf1\x71\x6d\x83\x50\x90\x77\xe4\xa1\xbf\xd4\x13\x6d\x03\x15\x2d\xcc\x3b\x76\xd9\x52\x49\x40\xa6\x06\x4c\x66\x9f\xbf\x51\xf6\xb9\x10\x34\xb6\xd5\xf2\x89\x86\x78\xa1\x3a\x24\x70\xf6\x64\x1e\xc8\x02\x45\x7c\x01\x02\xc3\xeb\xf6\x34\x5c\x32\x7e\x74\x1b\x80\x64\x4b\x3a\x99\xbf\x72\xb5\x9a\xb8\x01\x6f\x35\xd2\x51\x88\xa0\x85\x75\x0d\xc0\x60\xe5\xa8\xd5\x24\xae\x21\x3f\x07\x8f\x28\x8c\x7b\x34\xbc\x41\xf3\xce\x35\x6b\xf2\xda\xfd\xd2\xe0\xdb\x4f\xb8\xd7\xc2\xc3\x19\xf9\x90\x60\x05\x97\x17\x02\xe4\x9c\xa6\x2e\x80\x50\x54\x0d\x41\x21\xd2\x42\xf2\xee\xab\x1b\xd1\x34\xe6\x0b\xf1\x1b\x3e\xc7\x1f\x77\x65\xa9\x7c\x0e\x09\x84\x55\xe5\x9d\x22\x35\xd6\xb3\x7e\x7c\x9f\x5b\x21\xfa\x11\x2c\x3b\xa3\x9e\x4e\xa2\x00\x61\x4f\x58\xdf\xb3\xeb\x7b\x83\x6f\x0b\xec\x1d\xdd\x43\x8d\x14\x22\x45\x0a\xe7\xde\xd1\xdf\x9d\x71\xe5\xd9\xbc\x8f\xa3\xb6\xe6\xf7\x84\x46\xce\x7c\x79\xd0\xbc\xfb\x1c\x2d\x26\xc6\xfe\xce\x68\x68\x2d\xff\xc6\x0a\x9c\x6e\x0a\xd0\x5f\x2a\x09\xf2\x1d\x75\x23\x25\x1c\xb0\xc3\xd0\x8e\xfb\xbf\x8a\xc1\x63\x39\xd7\x17\x02\x4d\x67\x60\x24\xc1\xee\x3c\x1f\x62\xc5\xae\xab\x7f\xff\x93\x7c\x57\x45\x4d\xf7\xbd\x96\xf9\x84\x4a\x2a\x39\x99\x58\x41\x8a\xaa\x6f\x18\x48\xbe\xbf\x7b\xf1\x29\x2c\x24\xeb\x5c\xd8\xea\x56\x34\x0c\x5b\xeb\x26\x88\x02\x4a\x69\x53\x27\x5b\xe6\xef\xd1\xb7\x1b\xa8\xbe\x6e\xb7\x7f\x0c\x65\xa7\xc5\x11\x1b\x96\xc4\xc1\xf3\x9c\xb7\xaa\xf8\x3f\xda\xae\x8d\x14\x8d\x7a\x8a\xf4\x0a\xe9\xe6\x51\x91\x9f\x7c\xe2\x8c\x8b\x2b\x6e\x45\xe4\xd3\xd5\x6f\xdd\x54\xd0\x0c\x24\x12\x79\x0c\xbd\x6f\x80\xe1\x08\x19\xe0\xb8\xf3\x7c\x84\xfa\x00\x49\x88\xad\xaf\xcc\xbb\xc2\x1c\x63\xd6\xbf\x2e\x73\x2d\x9d\xd6\x3b\xd4\x9b\x04\x12\xb9\x67\x4e\x1e\x88\xf6\x14\x2f\x7f\x86\x7f\x1f\x26\x89\x1b\x22\x43\x04\x23\xce\xc4\xdb\x91\xb6\x1c\x2a\xbc\x5c\x8f\xbd\x46\xb8\xb9\x35\x96\xfc\x51\x60\x68\x31\x36\xe2\x11\x29\x82\x27\x96\xeb\x5e\xa0\x88\xe0\xa7\xd8\x12\x1b\x25\x57\x2e\x3e\xc3\x77\x43\xd1\xff\x6d\x8d\x1c\x35\x36\x43\x9a\x10\xe8\x4a\x66\x5f\x2c\x75\xee\x73\xcd\xc6\xff\xac\x4c\xc2\x87\x24\x46\x9f\x79\x70\xb4\x75\x07\xdf\x3e\x1b\x14\xd4\x77\xae\xc2\xbb\x20"}, +{{0xe1,0x36,0xf3,0x98,0xa6,0x05,0xd1,0x34,0x57,0x84,0x8c,0xea,0xd0,0x7c,0x72,0x86,0xf4,0x2e,0x2f,0x28,0xdf,0x8c,0x12,0x8a,0x3d,0x0b,0xb7,0x2b,0x29,0xaa,0xcc,0x19,},{0x6a,0xa5,0x04,0x5a,0x66,0xf7,0x72,0xa5,0x71,0xfe,0x3e,0x42,0xd1,0x17,0xef,0xcd,0xf6,0xc4,0x95,0x91,0x99,0x61,0x86,0x01,0x2f,0xa9,0x8f,0x7c,0x48,0xe0,0xcd,0xa7,},{0x75,0xa4,0x5c,0x6b,0x95,0x66,0x89,0x98,0x29,0xb4,0x1e,0xe5,0x17,0xb7,0x04,0x5a,0x47,0x3a,0x4f,0x7a,0x26,0x41,0x43,0x9b,0x5d,0x7c,0x56,0x73,0xe0,0x0d,0x8f,0x5c,0x06,0x6f,0x12,0x91,0xf8,0x5d,0xea,0xda,0x05,0x02,0xbd,0x16,0xe9,0x70,0x9f,0x82,0x7d,0x47,0x51,0xf2,0x87,0x38,0x62,0xe8,0x21,0x9e,0x57,0x74,0x6a,0x19,0xa9,0x00,},"\xd3\x28\x57\x9d\xe4\xc5\x37\x2f\x3b\x38\x2c\x48\x01\x1b\x2d\x4c\x60\x29\xf9\x04\xf3\xa3\x3e\x07\xd0\x83\xd7\xe2\xb0\x37\x56\xaf\x2c\x4c\x97\xa2\xd6\x6c\x10\xec\x41\x54\xd8\x74\x79\x20\x42\xb6\x46\xe4\xaa\xe5\x10\x1d\x50\x1b\xd1\xbf\x6f\x51\x17\x51\xd0\xaa\xf8\x21\xcd\x7c\x0b\x3e\xe6\xd0\xd7\xc6\x90\xa2\x77\x7f\xe1\x6b\xdc\x7e\x49\xb7\xda\x4b\xbb\x4c\xce\x3b\x61\x8e\xe9\xb6\xf2\xe3\xa1\x92\x40\xcd\xb7\x07\x33\xb9\x84\xb1\xc9\x40\xec\x66\x96\x0b\x72\x8c\xbb\x87\x4b\x80\x64\x31\x23\x72\x2d\xb9\xdb\xbe\x88\x32\x20\x08\x93\x1b\x1c\x89\x4e\xf5\xd2\x10\x99\xe6\x3e\x7c\x65\x00\x7a\xcd\x61\x78\x4d\xb4\x99\x4a\x2f\xb4\x0c\x3e\xfe\x9c\x47\xfa\xd6\x37\x63\xdd\xe0\x6f\xa0\x17\xa2\x6b\x82\xe7\x1b\x9d\xaa\xbc\x4f\xf0\xf6\xc7\x9b\x8c\xa7\xcc\xb4\xdc\x20\x31\xbe\xf1\x08\x73\x67\xc7\x08\x69\x74\xa0\x05\x66\xde\x41\xa7\x1e\x11\xd9\x93\xab\xe4\x33\x56\x98\x92\xb8\xf7\x5d\x76\x37\x99\x32\x45\xc8\x84\x47\x8a\xbe\x3f\x95\xf4\x4b\x0a\x4b\xbe\xde\xfe\xf8\x90\x6b\x75\xe0\xd3\x40\x20\xae\x53\x64\x55\xb0\xe0\x6f\x9b\xfe\xe1\x1e\xc9\xb8\x60\x4b\xac\x2c\xc6\xeb\xe0\x8c\x8f\xd5\xf5\xcc\xcc\xcb\xc1\x61\x7b\x7c\xf6\x9a\x3c\x51\x2e\x1f\x0b\xdb\x58\x5d\xf5\xe1\x27\x43\x06\x1f\x7c\x20\x53\xbc\x37\x14\x43\x61\xc0\xb3\x5f\xd3\x9d\x56\xb1\xef\xaf\x92\xc6\x10\x36\x01\x93\xec\x20\x59\x8b\x82\x85\x80\x50\xa6\xd9\x9e\x08\x2b\xce\xfd\xbd\x53\x18\xee\x5e\xfb\x3b\x26\x0f\x32\x76\xf3\xc7\x3f\x9c\x24\xce\x0c\xda\x33\xc7\xac\xc5\x0c\xa5\xdd\x61\xbd\xb8\x5d\x79\x38\x25\xf6\x73\x2a\x6e\x33\x0c\xe6\x72\xac\x44\xfe\x6b\x2b\x9a\xfe\x6e\x2e\x96\x5c\x02\xd2\xa1\xfe\x0b\x57\xcb\x1b\x31\x7c\x1d\x31\x3e\xfd\xc3\x56\x49\x2f\xe8\x96\xfd\x14\x9d\xae\x51\xc9\x5c\xcd\xbb\x7d\x11\xf7\xd6\x10\xe0\xc6\xe2\xfd\x3e\x57\xfc\xfe\xf1\xc5\x7c\x71\x19\xa0\xaf\x6c\x78\x21\xfe\xcd\xb8\x9d\x80\x30\x2b\x49\xfa\xd4\x17\x43\xf3\xd2\xd7\xa0\x75\x15\x4b\x31\x43\xe5\x1a\xeb\x94\x7d\x4b\x5e\x8b\x7e\x4c\xa8\x6f\xec\x3e\x80\xbd\x9a\x78\x6e\x4e\x46\xed\x1e\x6e\x9f\x7e\x0b\x63\x52\x66\xd9\xfa\x09\x7a\xa9\xe2\x0f\x32\xe3\xd2\x77\x2d\x7c\x1f\x00\x8b\xcd\xd3\xf9\x2c\x72\x83\xc5\x77\x90\xc3\x62\x2c\xba\xd3\xca\x35\x80\x3c\x45\xc8\x69\xdc\x37\x7f\xf3\x6b\xd7\xc0\xe6\xf1\xbb\x89\x2f\x73\x29\xa6\xe0\x8d\xf1\xdb\xeb\xc8\x1d\xc7\xb1\x15\xf8\x52\xe3\x6a\xe5\xd9\x28\x72\x5f\xa7\xc6\xfb\x9f\x28\xb0\xfb\x39\x4f\x9e\x38\xfd\x87\x62\x5c\x5f\xa2\x3a\xab\xa4\x70\x54\xe8\xcf\xea"}, +{{0x97,0xb6,0x70,0x2e,0x24,0x68,0x05,0xdb,0xcf,0xc7,0xfa,0x42,0x4a,0x8c,0xaa,0xbc,0xf2,0x62,0xd4,0x66,0xa0,0x5e,0x0d,0xd2,0xd4,0xe7,0xc3,0x74,0xd5,0x7d,0x52,0x51,},{0xa7,0x16,0xc3,0xd5,0xce,0x78,0xf4,0xd9,0xc5,0xbe,0xe3,0x44,0x7d,0xda,0xf4,0x88,0x1c,0x98,0x6e,0xfd,0xf6,0x67,0xac,0x89,0x77,0xb4,0xfb,0x69,0xb5,0xa7,0x11,0x0a,},{0x90,0x00,0x55,0x41,0xdc,0xc1,0xd7,0xab,0x83,0x7f,0x4d,0xe5,0x39,0x3f,0xad,0xd6,0xa9,0x2b,0x26,0xa7,0xd9,0x3a,0xf3,0xf6,0x69,0xe0,0xf1,0xbf,0xd6,0x21,0xcb,0xd0,0x0c,0x8a,0x23,0x05,0x6d,0x2d,0xa6,0x78,0x65,0x57,0xc8,0x28,0xa4,0x9b,0xe1,0xe4,0x02,0x1d,0x99,0x31,0x12,0x35,0xac,0x0d,0x4d,0x56,0xee,0xfc,0x7c,0x95,0x36,0x05,},"\xea\xa8\x6c\xf7\x6f\xcb\x65\xc6\xf9\xfc\x20\x8a\xc3\x6f\x28\xb2\x00\xd3\xb4\x03\xac\xa7\x32\x07\x46\x1d\x8d\x96\xaf\xa2\x46\xd7\xc6\x9d\x17\xa7\xa9\xbf\x77\xf0\x55\x43\x56\x3a\x7d\x3e\xca\x1d\x40\x79\xe2\x29\x38\xab\xa1\xf6\xe9\xe0\x4b\x49\xfb\xc8\xed\x6f\x63\xb5\x99\x73\x0d\xe9\x97\x98\x31\xc0\x2f\x8c\xba\x61\xe5\x55\x60\xd7\x11\x0d\x4c\x6e\x61\x67\x97\x06\xa7\x15\x5d\x5a\x67\x3c\x54\xd1\x6f\xe4\xd2\x28\xc2\xec\xa7\x54\x6f\xaa\x13\x39\xf2\x6d\x7a\x0b\xb4\xee\x33\x96\x11\xaf\xde\xc9\xa6\x8f\x5f\xf5\xb5\xd2\x03\xb6\x00\x53\x3a\xd5\xa3\xb3\x68\xc8\x5d\xa1\x15\x63\xf0\x98\xcc\x26\x87\x1e\x7f\xa9\x9a\xef\xd3\x8c\xc2\x61\x51\xdb\x3b\x0b\xae\x38\xdb\x6a\x87\xb6\x78\x9e\x58\x40\xb1\x08\x84\xaf\x51\x1f\x3e\xcb\x3e\xcb\xf9\x4f\xf8\x6f\xdb\x90\x55\x05\xa8\xc3\x4b\x2a\xa6\x1f\xf2\xec\x9e\xc8\xfe\xbd\x1d\xfe\xd0\x96\x5b\x6f\xc5\xb9\xf8\x86\x9d\xc3\xa4\x75\x59\x97\x4a\x88\x22\x99\x67\x06\xda\xef\xbc\x6c\x5b\xf9\x84\xce\x06\xb0\xd3\x2b\x31\xcf\x9d\x8a\xd1\x36\xae\xd4\xb0\x52\x58\x6d\xce\x70\x73\xb7\x67\xb2\x34\xe4\xa3\x7b\xeb\xbc\x39\x3d\xd2\xe0\xf7\xd1\x55\x17\x35\x48\xc3\x8a\x15\x83\xef\x94\xe0\xaa\x84\xe7\xfc\xe0\x4f\xcc\x9b\x4e\x30\x0a\xd0\x99\x44\x9a\x49\x23\x2a\xbd\xcf\x3d\x1a\x6e\x6f\xca\xb6\x96\xf5\x99\x6f\x9b\xd1\xb9\x48\x5d\x07\x47\x55\xac\x5b\x42\x97\xfe\xe3\x12\x4c\x7c\x03\x97\x6a\x40\xd5\x70\xbe\xae\xc2\xfa\xc9\x92\x33\x9f\x88\x5f\x74\xd4\x0e\xd4\xac\x87\xa4\xf4\x0c\xef\xbc\x48\x64\xf4\x4c\x36\x83\xaa\x8f\x10\x26\xe2\xc3\x7a\xef\xfc\xeb\xfd\xfe\x24\xdd\x0b\x01\x9c\x36\xa7\x98\x88\x20\x30\x04\xb2\xad\x83\xe8\x92\x21\xf3\xf6\x36\xf4\x55\xbb\x64\xe1\x7d\x17\x54\xc7\xc6\xdd\x7f\xc0\x9a\x0d\x65\xdd\xdd\xed\x46\x22\xfc\x4f\x9f\xba\x07\x2b\x45\x10\x34\x35\xe1\x02\x20\xa5\x86\xf1\x52\x26\xd2\xeb\x37\x7f\x40\x64\xd3\xff\x37\xcb\xb4\x70\x5a\x1f\xaa\xf5\xb3\x48\xf8\xc0\xef\x7f\xd1\x56\x4d\x42\x86\x88\xf5\x8f\x33\x92\x96\x7c\xf3\x96\xa8\xff\x2f\xd9\xe7\xb5\x17\xb7\xd6\xa5\xed\xe7\x44\x03\x73\xd8\xcc\x1a\x83\x99\x00\xe8\x4d\x42\x25\x42\x83\xd9\x69\x9c\x7c\xa3\x7e\x47\x76\x92\xa3\x49\x40\x08\xb8\x04\x44\xc5\xcf\x61\x4c\xbb\xc1\x69\xbf\xb9\x29\x63\x03\xc6\x45\xe2\xce\x28\xd1\x68\xdc\x6c\xba\xef\xae\x9c\x73\x19\x1f\x57\x15\x1a\xa4\x73\x00\x9d\x29\xe1\x80\x0b\x10\xf4\xc4\x98\x60\x9b\xa1\x15\x20\x98\x5c\x78\x09\x20\x58\x69\x6f\xdb\xca\x9c\x02\x0e\x2d\xfb\x8a\x04\x3a\x3d\xe8\xe4\x52\xd5\x8c\xd1\xad"}, +{{0xd1,0x52,0x8c,0x14,0x06,0xa6,0xe4,0x94,0xa0,0x2f,0x63,0x53,0x05,0xfa,0x74,0xd7,0x45,0xc6,0x93,0x27,0xfd,0x31,0xb7,0xd2,0xc2,0x62,0x3d,0xe2,0xc0,0x30,0xed,0x85,},{0x0c,0xfe,0x36,0x9c,0xf9,0x3d,0xaf,0x6d,0x53,0xef,0x02,0x8d,0xdb,0x9f,0x00,0x04,0x43,0xb0,0x97,0x2f,0xe2,0x53,0x2f,0x83,0xa4,0x1c,0xe6,0x57,0xc1,0x83,0x6c,0xa3,},{0xb8,0x39,0x9b,0xc3,0x32,0x6c,0xba,0x0a,0x93,0xa4,0x24,0x97,0x16,0x8b,0xf5,0x7f,0x91,0x06,0xee,0x43,0xd3,0x9b,0xf0,0xfc,0x86,0x68,0x51,0x99,0xdc,0x6e,0x0a,0x13,0xb9,0xc7,0x24,0xef,0x17,0xe7,0x88,0x2a,0xf8,0xc2,0xeb,0x70,0xf6,0xc9,0xe4,0x2d,0xfa,0x2f,0xbf,0x0c,0x1c,0xb5,0x00,0x2b,0x58,0xf1,0x08,0x66,0x19,0x73,0x3e,0x02,},"\xab\xb3\x67\x3f\x3f\xa1\x7a\x33\xa7\xaf\xf7\x6e\xac\x54\xe7\x68\x7c\x04\xbc\x84\xf7\x66\x65\x1a\x8b\x24\xba\x22\x94\x79\x08\xb0\x4c\xa4\x59\xfe\xb9\x8a\xce\x7c\xab\x1e\x74\x33\xa6\xa6\xbe\xff\xd8\xd9\x50\x4e\x29\x91\xda\xa0\x64\x4d\x61\xb8\xb2\xe4\x54\x48\xf5\x4d\xf8\x81\x3f\x50\xc4\x18\xb4\x8f\x49\xe1\x03\x4e\x85\x1c\xbe\xc3\xef\x0a\x18\x50\xef\x72\x67\x33\xaf\xaf\x68\xe1\xa4\x61\x04\x16\x51\xc1\x38\xd5\x4e\x4e\xf7\x81\x87\xaf\x9a\x73\x42\xf7\x12\x87\x27\xf9\x03\xbf\x4f\xc5\xef\x3e\x40\xc6\x4e\xc2\x6f\x89\x2f\x59\xad\xd9\x8f\xe3\x94\x76\x5a\xaa\x7d\x09\xca\xe8\x1b\x9f\x69\x9a\x9d\xd8\xbf\x2e\x2f\xe8\xe1\xec\x78\xfc\x88\x4e\xaa\x0d\x2d\xbd\xbf\xb8\xc1\x68\x83\x3e\xe0\xd2\x18\x03\xcc\x35\xdc\x62\x8d\x7c\x07\xe0\x44\x04\xfb\x60\xe8\xc4\x90\xa8\xdd\x34\xed\xbc\xba\xaf\x80\xcc\xda\xe3\xf7\xd3\x73\x9e\x0e\x89\x70\x23\xee\xb5\xb1\xa8\xc0\x0a\x96\x73\xc5\x92\x58\x24\x0d\xdd\x44\x20\x65\x0f\xe5\x77\x1f\x7e\x28\xcb\x23\x99\xf5\xe1\xe0\x2a\xd0\xb6\x43\x2d\x9b\x49\x60\x8f\xcf\x0b\x1c\x0d\x7c\x41\x2a\x44\x52\x55\xb8\xba\xdc\x53\x21\xc2\x4c\x1a\xc9\x2c\x79\xa0\xba\xcc\xb9\xde\xff\xed\x02\xd1\x2f\x55\x36\xcd\x59\x5d\xc6\x60\x83\xb3\x3a\x36\x03\xa9\xd1\x6e\xce\xa2\xbf\x38\xc4\xf2\xaa\xf5\x70\xf3\x0d\x21\x16\x2b\x2e\xfd\x7e\x4d\x5e\xbf\x1e\xca\xe9\x58\x8e\xee\x36\xdd\x9d\x3d\x8e\x3b\xe7\xbc\x6d\x4b\xc2\x18\x56\x22\xf1\x1d\x1d\xa7\xc4\x9c\x93\xe6\x23\xac\x56\xfe\xe7\xe3\x70\x6d\xb8\x31\x3c\xf9\x26\xbe\x92\xe5\xc8\xa5\x39\xfd\x16\xb0\xf4\x38\xda\x8e\x51\xa5\x1f\x2d\x27\x64\x03\x56\x12\x4e\xf7\xbe\x2f\x91\xff\xa1\x79\x6a\x91\xb1\x23\x01\x93\x4d\xde\xf0\xc7\x93\x8a\x7a\x45\xf3\x6f\x53\xb6\x32\x2d\x9c\x8f\x9d\x27\x5e\x1c\xd2\xc0\xf1\x29\xf8\xab\x8d\x74\x15\x5b\x5d\x9e\x5c\x15\xc0\x15\xb0\xb0\x00\x03\xb2\xbd\xdf\xa0\xbc\xfc\xc6\x93\xa1\xdf\xcb\x4f\x53\xda\xec\x12\x6d\x16\x69\xf3\x3f\x39\xad\x05\x51\x9e\xf7\xc5\xce\x40\xe6\xf4\x57\x3c\x24\x7a\x32\xc4\xa0\x16\x28\x31\x35\x2f\x6d\x55\x8f\xf5\x83\x6a\x53\x17\xdb\xc4\x51\x5b\x3d\xf2\x69\xa8\xac\x76\xd6\x43\x6f\x26\x4b\x64\x56\x1e\x79\x68\xb5\x82\x21\x08\x48\x7b\x04\x5c\x92\xd6\xc6\x14\x2a\x1c\x28\x55\xb3\x8b\xee\xbd\x64\x25\x65\x12\x3c\xc8\x27\xcb\x18\x31\x19\x9e\x6f\x12\xa7\xe4\x23\x68\x56\xb9\x4d\xad\x73\x8f\x69\xd1\x10\x6e\x77\x35\xd7\x11\xf7\xc6\xa3\xa3\x37\x80\x41\xfc\x7a\x21\x10\x3b\xbf\x86\x69\x07\xd4\xed\xdd\xaf\xa0\xe7\xf1\xbb\x5f\xfd\x41\xa6\x0d\x64"}, +{{0x51,0x23,0x40,0xf9,0x61,0xf1,0x42,0xd1,0x91,0x5e,0x85,0xfe,0x4f,0xa0,0xf5,0x51,0xf8,0x08,0x92,0xe7,0x5a,0xcc,0xce,0x7c,0xd1,0x86,0x9e,0x6e,0x2c,0x9e,0x80,0x15,},{0x0c,0xa0,0x26,0x04,0xfa,0x87,0xe2,0xc2,0x05,0x06,0x25,0x1f,0x07,0x92,0xcd,0x21,0x25,0x85,0x6f,0x0a,0xb1,0x6d,0x66,0x3f,0x28,0x11,0x96,0x3b,0x1f,0x2d,0x81,0x72,},{0x6b,0xb4,0xd9,0x75,0xaf,0xae,0xf4,0x1e,0xa9,0xef,0x08,0x5a,0x68,0xc5,0x68,0xa0,0x5d,0xa3,0x7e,0xf2,0x1d,0xad,0x46,0x4e,0xd8,0x6a,0xc0,0xd4,0x08,0x0e,0x7d,0x01,0x29,0xfb,0x02,0x31,0x31,0xec,0xa5,0xf7,0xad,0xb2,0x58,0x6a,0x18,0xbe,0x40,0x56,0x2f,0xa2,0x76,0x4c,0xa8,0x07,0xe6,0x70,0xa0,0x59,0x6a,0x5c,0x54,0x7b,0xc0,0x01,},"\xaf\x37\xb2\xc7\x58\x7a\x8d\x5b\xc8\x95\xcd\x35\x77\x46\xab\x03\x55\x2a\x0a\x56\x1a\x29\x3d\xc7\x16\x4e\x39\xb6\xa1\x33\x3a\x92\x0b\xb6\xda\xca\x60\x06\x67\x6e\x99\xbb\x7e\x92\x8f\x9e\xa3\x91\xe5\x48\x02\xa8\xd3\x15\x96\x28\x9f\xb9\xbf\xe3\x00\x00\xcf\x52\xeb\xf0\xc1\x24\xa5\x89\x5b\xce\x33\x98\xc1\xbf\x53\x56\xbe\x82\x61\x9b\x8d\xdc\x15\xa7\x7c\xa9\x22\x49\x4b\xdb\x04\xf5\xc2\xe1\xb6\xe8\xff\x77\xae\x74\x9f\xaf\x2b\x8a\x41\xd8\x22\xc1\x7c\x06\xdf\xb7\xa5\xf9\x43\x4d\x8b\xd7\x15\xec\x87\x78\xe8\x0b\x81\xd2\xe8\xd0\x62\x98\x74\x86\x90\xc6\x55\x52\x83\xc9\x8b\xb9\xb1\x9b\x92\x46\x66\x7b\xc4\x10\x46\xff\x98\xc2\xc3\x5d\x16\x1e\x1f\x4d\x69\xd2\x54\xec\x5a\x07\x6f\x25\xbd\x5c\x7e\x2c\x98\xca\x3c\x09\xd8\x08\x33\x96\x2c\xf9\x66\x02\x87\x88\x40\x96\xeb\x30\xc4\x6c\x54\x17\x41\x06\xaf\x4e\x29\x79\xa1\x12\xf3\xe8\x94\x4e\xaa\xf7\x66\x9c\x40\xd5\xaf\xb9\x1a\x02\x4a\xbb\xeb\x14\x66\x4e\x30\x89\x03\xe4\xd2\x6d\x70\x09\x44\x6e\xe2\xe8\x30\xab\x5e\xca\x0d\xbb\xc5\x13\xfb\x4e\x04\x35\x1d\xf2\xf6\x74\x18\x64\xfb\x23\x71\xb2\x50\x2b\xe4\x3d\xc1\x5f\xc0\x44\x31\xff\xf5\xeb\x8d\x4b\x68\xd7\x24\x62\xae\x32\x2e\x57\xba\x2d\x4a\xdd\xdf\x15\xa1\x90\x2c\x21\x13\xae\xbd\x3b\x5d\x61\x29\x17\xc1\xbb\x73\xe7\x08\xad\x54\x18\xe7\xd4\x5e\x4b\x72\x80\xfc\x88\x96\xab\x80\x85\x3f\xf5\xf8\xe9\x8f\x26\x55\x3f\xc7\x8e\x30\xb3\xb0\xd7\x27\xbf\x6d\x06\x4a\x8f\x32\x88\x87\x68\xc5\x1e\xbb\x61\xb2\xc6\x00\xb4\x02\x8a\x77\x06\x0f\xeb\xbb\x02\xeb\x3d\x20\x17\x80\xe7\x45\x66\xc8\x6a\x34\x03\x18\x36\xbc\xe9\xea\xda\x81\xe5\xd0\xf3\x39\x60\xcb\x2d\xf0\x8a\xff\x3c\x97\x49\x21\xfc\x9b\x7d\x3a\xa7\xc8\x1e\x9c\x67\x1e\xd6\xd3\x3e\x7a\xe5\xed\x03\xa5\x41\x7d\x7e\x5c\xd6\xfa\xac\x91\xb5\x4b\x8f\x79\x2f\x48\x28\x3c\x60\x64\x7d\xe3\xda\x81\x6c\xa9\x75\x6c\x5b\xfe\x1b\xb8\xb5\x97\x9e\x57\x54\x01\xbd\xa3\x4e\x9c\xbc\x4d\x77\xe7\x11\xd6\xb7\x3b\x82\xda\x19\xda\x47\x3b\x55\xe8\xe7\x2d\x34\x1b\x2d\x85\x03\xe4\x86\x09\xbe\x0f\xe2\x91\x44\x4c\x28\x36\x69\xe5\xde\xad\xea\xf5\x2a\xa8\xec\x48\xda\x83\xf5\x32\x8c\xc0\x99\xfb\x41\xf8\x2b\xec\xdd\x58\xd0\x4b\x1d\x66\x20\x3d\x73\x7b\xed\x06\xcf\x21\xc9\x78\x19\xac\x13\xed\x71\x1c\xa2\x17\xa5\x7c\xf7\xd8\x0f\xf0\x82\xaa\x1a\x1c\xf8\xfe\xa5\x55\xcd\x2e\x47\xe4\xdd\xab\x5e\x3f\x99\x41\xad\x4f\x77\x5f\x49\x41\x9d\xca\xdb\x5b\x00\x4b\x68\xca\xf4\x5b\x27\xef\x49\xba\x14\xfb\x52\xb0\x9f\x1b\x18\x5b\xe9\xf9\xc7"}, +{{0xb1,0xb6,0x36,0xe9,0x57,0x57,0x4c,0x21,0xa9,0x57,0xa4,0x5b,0xd1,0x95,0xc6,0xf9,0xfe,0x4c,0xc1,0xc5,0x7e,0x84,0x13,0x4d,0x39,0xb4,0x2e,0x1a,0x84,0x32,0x9e,0xdb,},{0x95,0xe7,0x7b,0x15,0xdd,0xa4,0x7c,0xaf,0x69,0xb7,0x28,0x88,0xdd,0x69,0x96,0x1b,0xac,0xbe,0xc3,0xbc,0x75,0x35,0x30,0x03,0xe8,0xbf,0xf0,0xa4,0x3d,0xdf,0x4b,0x7a,},{0x76,0x3c,0x7d,0x0d,0x46,0x87,0x8e,0x5c,0x7e,0xcf,0x71,0x04,0xfc,0x1f,0x22,0x30,0xe4,0x61,0x78,0xa2,0x7c,0x75,0xf1,0x96,0x16,0x9c,0x02,0x79,0xed,0xb0,0x1c,0x28,0xfc,0xde,0x3b,0x0d,0x5b,0x86,0x35,0xcf,0xe3,0x39,0xfb,0x23,0x27,0x74,0xb2,0x20,0x6d,0xab,0x8a,0x46,0x0c,0xe4,0x17,0xab,0xf4,0x90,0xbb,0xfa,0x78,0x5c,0x02,0x05,},"\xe2\x5d\x32\x9c\xad\x83\x64\xd2\xde\xc2\x43\x73\xe9\x2d\x9d\x50\xfc\x7a\xbe\x8f\xdc\x3d\x0b\x4e\xe5\x7e\x1c\xfa\x5b\x7c\xd5\x8c\x23\xbe\x91\x8f\x05\x17\x9b\xa8\x41\xb6\x1e\x18\x00\x34\xca\x7e\x74\xd4\x9b\x0a\x1a\x2c\xeb\xb4\xbe\x65\x34\x4c\x91\x3c\x46\xd3\x26\x52\x33\x6e\x6b\xda\x4e\xfa\x3f\x58\x73\x0d\x39\xa6\x33\xa1\x4c\xa3\xd9\xa6\x2a\xbb\x0a\x73\x98\xcc\x29\xaf\xf9\x16\xee\xea\x2e\x7c\xaa\xc8\x08\x45\x56\x2f\x73\xd4\x03\x0f\x9c\xab\x0b\xf1\xc6\x40\x7f\x54\x01\x51\x3e\xf8\x7f\xe6\xdc\x09\x9d\xbc\x5d\xfc\x33\x52\x91\x1c\x07\xaf\x6c\x52\x3b\xef\x4c\xca\x78\x37\x96\x59\xe8\x80\x3f\x58\x59\x04\xee\x6e\xf6\xfd\xe7\x73\x66\xd9\x6d\x2c\xcf\x24\x8a\x53\x20\xd9\xb8\x29\x8b\x2a\x73\x36\x38\x79\x10\x7a\x02\xb4\x7f\x57\x21\x3a\x85\x20\x3a\xbb\xca\x5a\x41\x95\xf8\xaf\x3e\x35\x93\xed\x2f\xa3\x50\x4b\xb7\x6a\x3e\x1b\xe2\x4b\x66\xd3\x55\x66\x29\x32\xcb\x67\xdc\x88\x50\x3a\xfa\xf7\x62\xbf\xf7\x41\xba\x1c\xac\xe9\x7a\xc5\x8b\xaf\xad\x5d\x36\xc3\xaa\x02\xe0\xcb\xe2\x0e\x5f\x3d\xc8\x09\x2c\x51\x2e\xaa\x9c\x49\x43\x47\x4a\xad\x41\x99\x00\x76\x72\x1a\xd3\xf5\x3f\xb0\x8a\xc2\x29\x82\xed\x9b\x15\xc7\x51\xa9\xe2\x33\x82\xf6\xa6\x9c\x72\xe6\xe2\x44\xe0\xeb\x68\x1e\x6d\xd2\x28\xd3\x77\x4f\xcc\xb3\x7e\xb6\x23\x2f\x82\x5d\x16\x9a\x2a\xc8\xb7\xe1\x8a\x42\xcd\xaa\x4f\x2c\xf0\x58\x90\xbb\x0c\x59\x8c\xf8\xc3\x1f\x82\x9e\xf8\xca\x24\x35\xbd\xcc\xeb\x0e\x61\x93\xad\xa7\x84\x1e\xe6\x92\xf3\x0a\xed\xf8\x8b\x62\x73\x11\xb1\x38\xac\x78\xb3\x91\x3e\x06\xf7\xc3\x21\xca\xfb\x39\xd9\x01\xdf\xe1\x74\x30\xb1\xa2\x0b\xc4\x37\xa5\x55\xa5\x78\xfa\x31\xe4\xb6\x80\x79\x54\x45\x6b\xd4\xb0\x4d\x5d\x88\x79\x87\xbd\xf0\x4e\x0f\x14\xaf\x31\x41\xb2\x4c\x3a\x7b\x9a\xc7\x5a\xa3\x2e\x2f\xcd\x21\x71\xa1\x26\x09\xe1\x5e\x73\x09\x4f\xd0\x92\x21\xb4\xd2\x70\x90\xe7\x32\x19\xb6\x48\xbc\xaa\xbf\x38\x07\xc9\x28\x0b\x6c\x4a\xd7\x50\xa4\x68\xbe\x0e\x1a\xd3\xe6\xe6\x30\x16\xcb\x5c\xec\x3a\xad\xdc\x56\x89\xc2\x95\x5a\x2a\x8d\x5b\x89\x84\xd7\xc4\x43\x76\xfd\xd9\x4d\x3f\x5f\xf1\x29\x8f\x78\x17\x2b\x56\x59\x13\x70\x4e\x90\xe5\xac\x03\x8c\xb1\x72\x0e\x19\xb0\x80\xf8\x1b\x53\xd6\xa4\x5d\x45\x28\x53\x07\x11\xb6\x3d\xfe\x1e\x47\x81\xc2\x4d\x74\xae\xb2\xbd\x8a\x73\xfd\x2a\x99\x3c\x5b\x08\x91\x39\x21\x96\xac\x32\xc5\x23\x69\x99\x60\xd8\xb2\x3e\x01\x66\x4c\xf9\x02\x1d\x93\x92\x80\x50\xca\xf9\x7f\xb9\x85\x55\x45\x80\xe3\x33\x36\xa4\x56\x32\x47\xdf\x59\xef\x6c\xae\x53"}, +{{0x10,0xca,0x41,0x3d,0x70,0xeb,0x3d,0xb6,0xe3,0x37,0xf0,0xf1,0x1a,0xbc,0x07,0x5c,0x95,0x85,0x9e,0x82,0x5f,0x87,0x61,0x76,0x07,0x69,0x52,0xd2,0xf1,0x88,0x80,0x30,},{0x50,0x28,0xba,0x38,0xaf,0xec,0xc2,0x42,0x63,0x5f,0x6e,0x35,0x3d,0x5f,0x4a,0xfd,0x12,0x3f,0x86,0x0a,0x04,0x25,0x22,0x0e,0x96,0x65,0x52,0xa0,0x57,0x88,0x08,0x23,},{0x6a,0xec,0x02,0xdc,0x6b,0xdf,0xcb,0x67,0xf0,0xef,0xc1,0xfd,0x31,0xe2,0x3e,0x69,0xe3,0x71,0xab,0x38,0x02,0x50,0x5b,0x32,0x01,0xa9,0x5d,0xd5,0x25,0x41,0x7e,0xd1,0xa1,0x28,0xdb,0x4e,0x18,0x2c,0xb3,0x7c,0x28,0xf6,0x28,0x06,0x66,0x70,0x99,0xa8,0xad,0x48,0x0b,0x0a,0xc9,0xe9,0x4c,0x2a,0x7d,0x5a,0x0e,0x96,0xe2,0xa7,0x36,0x0d,},"\xea\x7f\xaf\x79\xf6\xff\x5d\x78\xa8\x23\xa7\x54\x34\x71\x34\xf1\xb3\xc3\xe9\x1c\xe5\x18\xfd\xd6\x33\xfe\xb4\xf0\x5d\x12\x5f\x05\xcb\x54\x33\x6e\xf5\x60\xe9\x2d\xeb\x68\x51\x12\xa5\xff\xcd\x3d\xfd\x39\x64\xb2\x75\x8c\xe4\x78\x5f\x6a\x34\xbf\xeb\x39\x78\x4f\x0a\xee\x55\x95\x5a\xeb\xd1\x2d\xdd\xa6\x41\xd0\x57\x69\xf7\x44\x02\xf7\x06\xda\xd2\x01\xc4\x4c\x91\x08\x1c\x7d\x7f\x65\xe7\xaa\x42\x46\xde\x6d\xc3\xed\x64\x96\xd1\x0f\x4a\x41\x20\x60\xd4\x93\xba\xc9\xae\xd5\xbe\x4f\x6d\x74\x22\x9e\x3c\x55\xeb\x68\x76\xe3\xbb\x2e\xd4\x1f\xa4\x50\x4b\x66\x70\xdd\xa8\xc7\x98\xf6\xda\xa2\x80\xd1\xaa\x72\x02\x11\x74\xf6\xc0\x1a\xec\x49\xb3\x21\xd8\x7f\x53\xac\xbc\xad\xcc\x46\x07\xd5\xb1\xe4\x5d\x63\xfc\x48\x1a\x6d\x90\x57\x6c\x87\xc1\x88\x0b\x2e\x8f\xf3\xe5\x90\xa9\x6b\xee\xe1\x80\x47\x68\xc7\x56\xbe\xb8\x6b\xf1\xde\x8a\xdc\x40\x8b\x1b\x8d\x66\x6f\x74\xba\x28\x63\x08\x22\xf9\x2d\x18\xb0\x56\xae\x37\xce\x02\x93\xee\x61\xb9\xe8\x0f\x33\xac\x26\x96\x71\xbd\x62\xa4\x05\x9b\x24\xf7\xc1\xa4\x40\x80\x74\x40\xd5\xd5\x38\xa6\x54\x58\xad\xc8\x15\x87\x24\xb2\x5c\x12\x12\x7a\xa0\x34\x9e\x55\xf6\xe5\x5b\xc9\x20\x78\xfd\x1e\xf2\x74\xc2\xaa\x79\x19\x05\x76\x6b\xe3\x94\xa2\x62\x8f\x7b\xbd\x1a\x32\xda\x5e\x48\x74\x46\xbb\xef\xae\x88\xfa\x6c\xf3\xf7\xb4\x99\xf1\x31\xfa\x19\x31\x3d\x13\xb2\x80\xad\xca\x50\xf7\x78\x02\xd1\x73\x31\xb3\x81\x68\x3b\x5e\x7e\xda\xb9\x94\x73\xed\xd3\x1d\x77\x44\x34\x88\x21\x41\x35\xfd\x6f\x26\x44\x50\x93\xe9\xe2\xaf\xf7\xd7\xe8\x92\x33\x7f\xdc\x87\x79\x06\x5d\x4d\x97\xd6\xd6\x73\x57\x67\x94\x95\x8d\xbf\xa6\xc5\x0b\x1b\x13\xac\x39\x60\x7c\x1e\x66\xef\x96\x29\x76\x10\x71\x15\x5f\xbc\xa6\xf3\x6e\xb0\x2c\xee\xae\x16\x36\x7f\xea\xc0\x74\x76\x90\x8c\x84\x7c\x9a\x53\x3e\xf6\x8c\x94\x31\x1f\xa0\x89\xff\x28\xfb\xd8\x78\x09\xb0\xd3\x87\x6b\x43\x1d\x9a\x18\xb2\x02\xf9\xa4\x04\x9a\x05\x77\xb8\x17\x76\x10\xdd\x02\xe5\xc5\x20\xec\xa9\x55\xe8\x03\xc3\xad\x4f\x50\x97\x6f\x7c\x2e\xa8\xaa\x3e\xe4\x83\x6a\x19\x85\xdf\x0a\x4f\x16\xef\x46\x98\x15\x95\x41\x98\x97\x99\x35\x60\xaf\x82\x65\x1c\x2b\x49\x4e\x68\x0b\x37\x80\x2e\x75\x37\xef\x68\xa5\x75\xc3\x4f\x85\x88\x06\x3e\xe0\x19\x72\x06\xd9\xa3\x2b\xb4\x89\x0e\x7c\x21\x6a\x4d\x33\xfe\xca\x36\xb5\x49\xe5\x32\xfe\xa6\x85\x56\xe7\x54\x0a\x4f\xb1\x69\xd4\x9f\xc5\x53\xb2\xe6\x70\x0a\xe4\x2d\x9a\x51\x6e\x68\x16\x0a\xcf\x6b\x27\x0c\x77\xca\x5e\xc2\x6e\x5a\xd5\xdc\x75\xc2\xc3\x93\xe2\x99"}, +{{0x1f,0x0a,0x10,0xa2,0xcb,0x11,0x19,0x17,0xb9,0xa6,0x7a,0x2a,0x1f,0x38,0xfb,0x86,0xf8,0xed,0x52,0x60,0x7d,0x1d,0x65,0x3a,0x45,0x7d,0x7f,0x47,0x18,0xd9,0xa7,0xde,},{0x70,0xc0,0x75,0xb2,0xe9,0x4c,0x4c,0x02,0xf4,0x5e,0x73,0x04,0x4f,0x24,0x39,0x97,0x41,0xb1,0x61,0xfe,0xb6,0xf6,0x9e,0xab,0x63,0x54,0x17,0x28,0x2a,0x4a,0x93,0x68,},{0xa4,0x24,0x5a,0xa3,0x39,0x5e,0x7b,0xad,0xa2,0xbc,0xdf,0x16,0x03,0x14,0x7c,0xc5,0xf3,0xf0,0xba,0x91,0xf4,0x0f,0xda,0xd8,0xf6,0xd3,0x71,0xc3,0xeb,0xef,0xb4,0xc1,0x50,0x1d,0x07,0x87,0x5b,0x57,0x6f,0x40,0x79,0x78,0x06,0xa4,0x84,0xc7,0xa3,0xf7,0x05,0x69,0xe2,0x32,0xb0,0xc9,0x9d,0x29,0xca,0x23,0xa2,0x33,0xb6,0x8e,0xdb,0x0c,},"\x4f\x6a\x43\x4b\xd5\xfc\x77\xf0\xf1\xb7\x04\x9c\x91\x85\x3c\xcb\xd8\x94\x39\x96\x2a\x60\x78\xa6\x74\xb8\x67\x54\x3b\x6b\x7d\x10\x55\x2e\xc1\x75\x8c\x52\x83\x04\x2b\xd6\xb4\xce\xa8\x8c\x95\x20\xdb\x04\x74\x6f\x08\x9c\xf3\xa2\x60\xfb\x0f\x33\x85\x8e\xfd\x6f\x68\x0d\xe5\xb7\x2d\x98\x76\x32\x4b\xa5\x90\x29\x91\x38\xf8\x5a\x76\xf5\xbe\x0e\x05\xe8\x85\x9c\x02\xb2\x35\x12\x55\x9c\x8b\xea\xfc\x9c\xfe\x90\x1b\x28\x3e\x15\xd1\x6c\x79\x2e\xb0\x3b\x92\x88\x0f\x6f\xf9\x7a\xa3\x8e\xee\xad\x3f\x4f\xd6\xc0\xa9\x21\x43\x23\xaa\x39\xa1\xc1\x65\x15\xe3\x0d\xbd\x08\xb8\x33\xee\x40\xa8\x14\xa2\x88\x09\xc8\x70\xe1\xd0\xa6\x2c\x37\x93\x2d\x54\x08\xfc\x6a\xfc\x63\xe7\x9a\x65\x5c\x5f\xe3\xd4\x02\x6e\xf0\x9e\x02\x99\xfb\xde\x5a\xb3\x4f\xce\xab\x14\x13\x0d\xc4\xbe\x00\x7e\x8e\x64\x44\xd7\xaa\xae\xc6\x2c\x87\x3d\xf7\x7e\x80\x10\x74\x3c\x31\xe8\x75\x7f\x1e\xae\x9e\xdb\x55\x97\xa1\xb5\xd8\x4b\xd7\x7a\xe7\x64\x2e\x1a\xca\x99\x87\x3a\x15\x2f\xfd\xe0\x68\xa8\xe4\xad\x92\x40\xb9\x03\x33\x27\x95\xe4\x0b\xb3\x28\x65\xe5\xce\x03\x43\x07\xa6\xc9\xfe\x33\x9a\x1c\x93\x77\x0d\xf5\xca\x46\x32\x9f\x6b\x09\x41\x97\x85\xcb\xf2\x84\x7b\x0c\x68\x32\x83\x71\x23\x85\x3a\xd9\x52\x65\x32\x65\xc5\xb5\x74\x0d\x19\x4e\x00\xf2\x3f\x9e\x96\x67\x91\xf0\x05\xf8\xbf\x55\xc3\x88\xc2\xbe\x9e\x21\x53\x89\x25\xf8\x55\x5e\x0d\xbd\x83\xbe\x07\x3d\xf7\x65\xaf\x49\x40\xe5\x9a\x37\x90\xb9\x83\x6b\xab\x79\x09\xe5\x67\x6f\xbf\x1c\x21\x26\xfe\x22\x6d\x78\x1a\x44\x33\x0c\xc0\x1d\x32\x83\x0f\xf8\xae\x00\xb9\x79\x2e\x39\x8c\x2c\xbb\x4f\xb8\x3a\x10\x05\xc2\x45\x54\x9a\x89\x06\x3f\xbe\x06\xc6\x2a\x48\xda\xc4\x3c\x51\x01\x24\x99\x94\xe9\x5e\x37\xf2\x4c\x1d\x8b\x3b\xc6\x73\x53\x8c\x46\x05\x5f\x80\x0d\xb1\xc0\xf9\x56\x86\x9b\x6b\x29\x7d\x99\x0f\x44\xf0\x5b\x50\xc7\xad\x6b\x85\x6f\x46\x21\x28\x58\x47\x1d\xd0\xd3\x93\x72\xb0\xdb\x75\x15\x73\xdd\xb6\xb5\xb5\x6b\xa0\x1e\x37\x1c\x78\xfe\x58\xdc\xd1\xbe\x53\x11\x2a\x6a\x73\xda\x9a\x6b\xac\x75\xd3\xc3\x9a\x1a\x70\x5a\x36\xf6\x40\xfc\xfa\xd8\xcd\x04\x07\x75\x94\xd5\x96\x85\xf6\xe3\x0d\xe7\x1d\xfd\x4a\x44\xc4\xe7\xc0\x4d\x6e\xc7\xc2\xe8\xbe\x12\x78\x5b\xb0\x5b\x29\xb3\x91\x51\xd3\x29\xf5\x87\xfd\xc3\x81\xc2\xdf\x0c\xef\x73\xfe\x0e\x3f\xd9\x20\x8d\x7c\xcb\x6e\x08\xd0\x2f\x42\xd1\xfe\xed\x27\x56\x1d\x5e\x32\x3a\xa1\x48\x62\x4e\x55\x2a\xbe\x87\x53\x2d\xe1\x5b\x7f\x42\xc2\x2c\x98\xe4\x05\x25\xb1\x74\x7c\xbd\x75\x8b\xfb\x26\xfd\x3e\xed\x3b"}, +{{0x7f,0x05,0xba,0xac,0xf1,0x67,0x58,0x3c,0xf2,0xfe,0x95,0x62,0xa5,0x06,0x99,0x1e,0xd9,0x87,0xf6,0x8f,0xfb,0x71,0x56,0x7c,0x7c,0xcc,0xe3,0xfc,0xc5,0x9b,0x78,0xb0,},{0x0d,0xec,0x39,0x52,0x85,0x2b,0x96,0xfd,0x75,0x58,0x7e,0x97,0x74,0x3f,0x9e,0x41,0xc0,0x9f,0xbe,0x6b,0xa9,0x81,0xbf,0xce,0xb4,0xeb,0xb8,0x89,0x2d,0x98,0x6a,0x16,},{0x0d,0xee,0xd2,0xdf,0x82,0xac,0xf4,0x52,0x9c,0x40,0x8a,0x02,0x93,0x1f,0x67,0x6b,0xec,0x5c,0xb7,0xad,0xe8,0x4e,0xbd,0xcd,0x57,0x8f,0x70,0xf9,0x71,0x38,0x2c,0xf3,0x11,0xbb,0x83,0x09,0x73,0x00,0x45,0x6a,0x55,0x8b,0xc4,0xc0,0x9d,0x89,0x83,0xff,0x13,0x49,0x3f,0xd6,0x11,0xeb,0x66,0xc0,0x43,0xbf,0x01,0x9b,0xad,0x6f,0x33,0x02,},"\xa2\x7d\x1e\xab\x05\x15\x09\x20\xde\xd1\xb1\xc2\x57\x8a\xf5\x82\xb2\x94\xf7\x83\x7f\xe4\xfb\x1a\x31\x69\xc2\x5e\xfb\x70\x63\x4b\xa6\x6c\x7e\x29\x91\xb3\xe7\x5c\xc5\x12\x48\x26\xa0\x3e\x05\x72\x59\xb5\xcb\x70\x62\x28\x78\x0c\xbc\x82\x75\xc3\x39\xf8\x34\x0e\x40\x2a\x66\x50\x32\xa4\xab\x65\x78\x27\xb1\xc3\x48\x1f\x75\x66\xd3\x69\x73\x5b\x82\xdb\x76\x28\xc0\x22\xb2\x12\x73\x0d\xb1\xe4\x7c\x9b\x2d\x9b\xc4\xd8\x1b\x23\x42\xd8\x9c\x6e\xaf\xc3\xe0\xb6\xde\x50\xd4\x84\xcc\xef\x11\x23\x8c\x8e\x2d\x24\x0d\xd5\x95\xdc\xef\x8b\x2f\xc5\x7b\x54\xff\x9a\x8a\x74\x11\x1f\x61\xf8\xa6\x52\xf2\x0e\xa0\x12\xc1\xad\xe3\xe2\x80\xec\xde\x29\x4c\x0e\x35\x71\x71\x90\x16\x2e\xc6\xa2\x26\x5e\x7e\x6f\x3f\x07\x04\xcf\x8a\xb1\xa0\x3e\x5c\xc9\x53\xe2\x92\x62\x91\xcc\xd4\xb0\x59\x0d\x5c\x20\x56\x8f\x94\xf9\xff\x0f\xe2\xab\x78\xcf\x9a\xe2\xc3\x8b\xcd\x49\x1e\x51\x8f\x23\xe9\xb6\x36\xf8\x80\x61\x5f\xc5\x60\x78\xe5\x12\xd7\x57\x7e\x09\x49\x7c\x11\x83\x45\x3d\x50\x81\xfd\x47\x37\xf2\x80\xec\x5e\x26\x7c\x45\x86\xb7\x8b\x70\xff\xfd\xfd\x73\x0d\x80\x9d\xf5\x60\xf2\xe3\x77\x21\x91\x84\x7b\xbc\x3f\x60\x4f\xb7\xf8\xca\x49\xee\xd3\x18\xb5\xe7\xd1\xf2\xb8\x3a\x10\xda\x0c\x85\x94\xb3\x39\xb6\x87\x1a\x57\x72\xdd\x64\x16\x8e\xcc\x27\xe2\x40\xa4\x5c\x76\x72\x5e\x7d\x55\xbe\xf3\x7e\x13\x5e\x3d\x9e\x0e\x34\xe3\x6c\x16\xe3\x4d\x77\x45\x9a\x55\x2f\x40\x74\xd0\x67\xa3\x1a\x3e\xd2\xa4\x8c\xde\xa4\x89\x5b\x10\xbd\xf1\x65\x6f\x4b\x7a\x41\x3c\x6a\x08\x8c\x64\x9f\xc9\xd7\xbc\x56\xab\xf6\x44\x35\x49\x12\x14\x19\x2a\x66\x70\xcb\x8b\x9c\x91\x7f\x8e\x1b\xc7\xb2\xcf\xce\x78\xd2\x8f\xbc\x3a\xfc\x2a\x50\xe9\x82\x13\xe7\xe0\x26\x37\x8e\x4e\xa7\x11\xd1\x51\xad\xaa\xa7\x19\xbe\xb8\x97\x46\x56\xc1\x0e\xbc\x7d\xe4\x6b\x19\xec\x82\x95\x1e\xf4\x6a\x8c\x68\xe7\xf4\x36\xe1\xb3\xeb\xed\xb2\xd0\x9b\x05\x75\xc9\x91\x4e\xad\x27\x96\xb5\x3e\x00\x61\xe2\x12\x99\x4a\xc5\x02\x6a\xea\x81\xec\x37\xc8\x13\x78\xf4\xcc\xfc\x46\x77\x00\x08\x79\x68\x59\x7d\xa3\x8f\xed\x52\xfa\x48\x09\x3a\xe4\xba\x10\x66\xc3\x1e\x3c\x7d\x85\x08\x09\x5b\xb4\x5c\x28\x01\x20\xf4\xaa\x69\xa2\x4f\x3e\xfe\xf1\xf7\x67\x98\x5a\xa1\xa3\x0e\x14\x08\x56\xf7\x6d\x15\x20\x73\x28\x78\x48\x7b\xe5\x3f\x71\x2d\xbd\x7d\x77\x9e\x31\x51\x01\x58\x8f\xd7\xdb\xdb\x13\x2f\x92\xc2\x75\x75\xac\x14\x86\xf1\x76\xc7\x90\x66\x1b\x01\x48\x39\x4e\x92\xff\xa3\xae\x6f\x8a\xfb\x2f\xaa\x2b\x7f\x4f\xbd\x0a\xd9\x1e\x75\x9a\x70\x2b\x3c\x70\x2b\x4d"}, +{{0xd0,0x0c,0x21,0x64,0x26,0x71,0x0d,0x19,0x4a,0x3d,0x11,0xcf,0xc9,0x0a,0x17,0xa8,0x62,0x12,0xe7,0xa0,0xe5,0x4b,0xaa,0x49,0xb0,0x16,0x9e,0x57,0xff,0xf8,0x3d,0x61,},{0xcf,0xe6,0xae,0x89,0x03,0xc6,0xc7,0x01,0xaa,0x30,0x46,0x95,0xc6,0x51,0xbf,0xd8,0x50,0x33,0x1f,0x9a,0xd4,0x81,0x63,0x3a,0xe3,0x70,0xc8,0x6d,0x7b,0xd1,0x3f,0xb9,},{0x15,0xc4,0x5c,0x19,0x42,0x97,0xe8,0x87,0x02,0x9f,0x49,0xd8,0xbd,0xf9,0xd6,0x10,0xdd,0x8c,0x34,0x79,0x9e,0x1e,0x92,0x30,0x26,0x9e,0x7a,0x58,0x92,0x89,0x38,0xcf,0x39,0x6a,0x02,0xcd,0x42,0x20,0x54,0x90,0x39,0x1e,0x1c,0x64,0x35,0x3f,0xb0,0x6b,0x9f,0x8e,0x9b,0x81,0x8a,0x9a,0x36,0x1c,0x20,0x4a,0x38,0x69,0x95,0xbf,0x3b,0x03,},"\x82\xf9\x78\x41\xb3\xba\x22\xdd\x9a\x44\x50\x83\x7e\xa7\xbf\x8d\x27\xa9\x73\x14\x70\xca\xbb\x0c\x20\x78\x03\x4b\xf2\x4e\x4c\x1a\x62\x90\xc0\x3f\x40\x02\xb8\x6f\xa0\x9f\x07\xb5\x20\x9f\x1f\x53\xd0\xec\xf4\xd9\xe9\x22\x3b\xec\x12\x5a\x95\x45\x51\xfe\x8b\xff\x71\x8f\x5e\x26\x48\x68\xe2\x07\xf7\x01\x19\x4e\x41\xde\x39\x97\x1f\xd3\x85\xf4\x9a\x4b\x4a\xdd\xa9\x11\xeb\xa5\x52\x59\xfc\x68\x36\x65\x32\x73\xf6\x56\xf4\xaf\x60\xb2\x06\x64\x95\x6d\x4f\x21\x35\xd9\x0d\x09\xe9\x03\x7d\x53\x66\xa0\x25\x34\x44\xe0\x22\xc7\x21\x2a\xf5\xfd\x4f\xcc\xd7\x42\x37\xd2\x88\x53\x38\xe2\xfd\x72\x15\x22\xde\x67\x63\xc2\x54\x90\x28\xc6\x23\xb9\xcf\x38\x7d\x23\x4a\xb5\xe7\xfc\xbe\x5a\x47\xc6\x85\xb7\x9e\x75\xa5\x7b\x09\x57\x40\x82\xa0\x22\x21\xdf\x64\xa2\xe8\x41\x61\x80\x87\xe7\x22\xa2\x1b\xac\x1b\xa4\xf0\xd7\xd8\x7b\xdc\x51\x0a\xaa\x8f\xbd\x10\x75\x7f\x6c\x02\x9c\xa8\x20\x37\x1f\xc7\x4c\x3b\xc5\x0b\xd8\x98\xc5\x5d\x81\x67\xf7\x3a\xda\x37\x7a\xec\xc9\x16\x29\xd6\x4c\x36\x0c\x2c\x24\x1c\x5c\xb4\x2e\x3a\x51\x8c\x5d\xab\xf0\xf4\x18\xb2\xa7\xf3\xd8\x2e\xef\xd9\x20\x26\xd3\x1e\x8b\x81\x60\x35\x8e\xae\x82\x1f\x73\x0e\xca\xfe\x7a\xce\x64\x7b\xff\x87\x41\xde\x2f\x6a\x13\x1d\x11\xc9\x69\xe9\x78\x7c\xfe\x6a\x2f\xab\x37\xbf\x8d\x1c\x7f\x4a\x2f\x36\x4d\x2f\x1a\x76\xef\x04\x6c\x18\x43\xe6\x3e\xc0\x0c\xf7\x92\x0f\xfa\xae\x56\x1e\x73\x70\xb7\x19\xfc\x16\xfc\xeb\xca\x3c\xfd\xfa\xba\x43\xf4\xf0\x90\xc4\x6f\x47\x73\x03\xa6\x60\xee\x88\xdd\x4e\x89\xbf\x14\xb9\xf8\x04\xb6\xfd\x49\x5c\xb1\x41\x27\x53\x47\x4a\x05\x6a\x0d\x89\x31\xcd\x9c\xcb\xd6\x4f\x8f\xcc\x7a\x31\x23\x46\x7c\x5d\x47\xf6\x90\x67\x9e\x88\x71\x28\x80\x93\x73\x4f\xd6\xa1\x32\x60\x38\x65\x81\x56\x41\x36\x96\x59\x4c\x13\x4d\x73\x88\x7f\x34\xee\x67\x60\x9a\xe8\xff\xb3\x26\x6c\x16\xd8\x7f\x15\x34\x5a\x47\x6f\x72\x95\x0c\x15\x87\x96\xa8\x8b\xbb\x44\x4f\x1a\xa8\x09\xca\xd8\x75\xb8\x5f\xb9\x15\x1a\x0e\x2e\xef\x2e\x00\xe8\x0d\x6b\x7a\x9b\xa4\x06\xc0\x51\x9e\xff\xdd\x94\x12\x62\x32\xfd\xf6\xf1\xe7\xb9\xbb\xc0\x36\x2a\xa7\x75\x16\xfd\xf9\x39\xe7\x90\x6a\xab\x01\x30\x71\x28\xcf\x82\x4c\x10\x2c\x09\xb9\x29\xc9\xb2\xd7\xaf\x8f\x85\xb7\xd7\xf9\xa8\x38\xb2\xae\xd0\xc6\x97\xe8\xbd\xfe\xe6\x6e\xe0\x16\xbb\x1b\xf3\x5e\xff\x6b\x2f\x7e\xf4\xb9\x1b\x1f\xc0\x4f\xac\x9f\x11\x6e\x2e\xdf\xf4\x0f\x95\xc1\x5b\x77\xc3\x1e\xe5\x22\xf3\x93\x7c\x7f\xa0\x04\x7d\x62\x25\xe0\xc8\xe5\x5e\x27\x8c\x81\x03\x91\x1f\xea\xb2\xb7\xf4"}, +{{0xdd,0x12,0x39,0x72,0xe6,0x28,0x58,0x4a,0xcc,0x46,0x29,0x3b,0x8e,0x4c,0xe2,0xb2,0xdd,0x46,0x9c,0xc4,0xed,0xe1,0x4e,0xf3,0x95,0x21,0xcf,0x08,0x37,0x35,0x85,0xb3,},{0x35,0x22,0xf7,0xae,0x59,0x6e,0xed,0xb2,0x17,0x03,0x5d,0x95,0x39,0x5e,0x44,0x8d,0xbd,0x6f,0xfb,0xf4,0x25,0x85,0xea,0xeb,0x30,0x70,0x26,0x54,0x1c,0x78,0xa6,0x51,},{0x89,0x65,0xa8,0x89,0xd5,0x4c,0xd8,0x07,0x6d,0x35,0xbc,0x2e,0x12,0xb0,0x09,0xd5,0x6b,0x07,0x04,0xc8,0x94,0xf9,0x12,0xa0,0xd1,0xd3,0x07,0x20,0xc2,0x32,0xfe,0x44,0x04,0xbf,0x30,0x09,0x54,0x1e,0x8f,0x32,0x83,0xe8,0x9e,0xa8,0x6f,0x67,0x8a,0xfb,0xdf,0x1c,0x21,0xc9,0x24,0xb2,0x3a,0x52,0xb4,0xca,0x6d,0x63,0xf4,0x8f,0xc2,0x03,},"\x2b\x28\x57\xf4\x52\x80\x17\x3e\x2e\x0e\xf9\xd5\x94\xe6\x08\x3f\x1d\xc7\xa6\x54\x92\x97\x5b\x83\x7d\xef\x6c\xad\xd8\xc8\x54\x50\x31\xee\x9d\x68\x36\x9a\x93\x93\xcc\x7b\x79\x2f\xeb\x98\x04\x0b\x21\xf1\xeb\x84\x66\x5f\x87\x85\x37\xce\x41\x2e\x9d\xb6\x80\xd2\x9f\xbd\x8f\xfc\x77\x31\xea\xe9\x1a\x20\xb4\x75\x48\x99\x62\x04\xfb\x06\xad\x74\x0e\x78\xf0\xfc\x59\x0b\x67\x91\xdc\x7a\x0f\x26\x59\x28\x6c\xc1\x6d\x02\xc5\x11\x7b\x56\x58\x36\xb4\xb8\x73\x8c\xf4\x0e\x28\x5c\x69\xc5\x0e\x41\x29\x11\x29\x23\x67\x35\x2d\xfd\xae\xd9\x98\x2d\x0f\x89\x9a\x23\xc0\xab\x51\x81\x2b\x3e\xc6\x78\xf6\x88\x2e\xa4\x27\xcd\xc9\x3a\xb4\xb2\x48\x24\x37\x70\x54\xaa\x25\xd8\x22\x46\x65\x33\x40\x07\x8c\xf1\x1d\x14\xa5\x1f\x0e\x68\x6d\x7e\x01\x8b\x36\x74\x16\x68\xfc\xe7\x45\x8d\x16\x92\x93\x36\x1d\xd1\x6b\x3d\xeb\xbe\xd1\x9e\x1b\xef\x7c\x36\x93\x4e\x20\xf3\x3a\x09\xad\x3e\x82\xb5\x3a\xb4\xe9\x4c\x25\x5d\x04\x18\x98\xb9\x77\x37\xdf\x99\x58\x4a\xf1\x4e\x40\x40\x58\xd0\xc9\x3b\xca\xe7\xbb\xbc\x06\x39\x5a\x2a\xef\xbd\xef\xa7\xb2\xed\x17\xce\xbd\x15\x13\xfa\x39\x0f\xe9\xa9\xb0\xce\x68\xce\xcc\x2b\x9e\x12\x9b\x7a\x29\xf4\x9b\x6d\x18\xc2\x8b\xac\xd3\xaf\x39\xdc\x39\xca\x97\x2f\x0e\x0d\x06\x85\x5d\x57\xc2\xb5\xfc\xac\x2f\x79\xcb\x8c\x05\x79\x9e\x4f\x65\x73\x46\x68\xda\xd6\xaa\x7a\x43\xa1\x18\x56\xe2\x3b\x1e\x73\x2d\x00\xe5\xfe\x38\x85\xb7\xda\xd4\x2e\xc1\x8a\xc8\xe0\x96\xa0\x80\xf7\xd5\x50\x70\xfd\xcf\xf6\x07\xbc\x0b\x85\x2d\x8a\x08\x0d\x2a\x74\x05\xd5\x94\x14\x69\x5f\x2e\xb7\xfb\x0a\xca\x23\xc8\x63\x57\x42\xf8\xae\x57\xf1\x37\x80\x31\x6e\x28\x08\x72\x37\x4e\x69\x29\x59\x8d\x02\x8a\x33\xc0\x5d\x83\x1c\xda\xbd\x02\x94\x93\xc3\xcc\x85\x9f\xff\x1a\x67\xd5\x62\x16\xf0\x2a\x22\x95\x66\x53\x65\x88\x7a\x35\x0a\x80\xaf\xaa\x0c\x36\x7a\x74\xd3\x70\x1a\xe8\x8f\x59\xd8\xa9\xd3\xa1\xdc\xe0\xcf\xd2\xea\xbe\x2a\xf5\x06\x5a\x1c\x7f\xca\x4a\xad\xcf\x8e\x51\xe7\x56\x12\xa1\x37\x1b\x4d\xc8\xff\xc0\xc0\xb9\xc4\xfa\xdb\x2f\x08\x1e\x2e\x03\x2d\x96\x81\x8e\x55\x73\x7a\xdd\xe3\xe1\xac\x12\x1f\x56\xcc\x86\xfb\x58\xa0\xa5\x82\x69\x2f\x62\xce\x58\xac\xce\x17\xaa\xfe\xc7\xbc\xb7\xe4\x4f\x83\x92\x58\xcd\x4a\x85\x1f\xc0\x13\x44\xee\x9f\x1b\xd0\x3e\xb9\x43\x44\xf4\x77\x86\x93\xc1\x71\xdd\x28\x92\xb2\x42\x6a\x88\x29\xab\x0c\xfe\x33\xa7\xd4\xa3\x6e\xb4\x01\x7f\x7f\xcf\xd2\x41\x34\xab\x8a\x45\xf2\x37\x17\xcd\x13\x8a\xa6\x00\x01\x72\xe3\x7b\x40\x64\xdc\x9b\x6d\x1e\x1e\xf3\xaf\x84\x97\x1d"}, +{{0x33,0x35,0xea,0x92,0x81,0x17,0xcf,0xee,0xfb,0xee,0xae,0x14,0x60,0x03,0x88,0x1b,0xdc,0x88,0x89,0xd6,0x58,0x0e,0xed,0x13,0x52,0x37,0x08,0x20,0xad,0x1f,0x58,0x4f,},{0xcb,0x20,0xd4,0xfd,0x75,0x61,0x84,0x80,0x13,0x11,0x1c,0x3e,0x97,0x61,0x7f,0x34,0x18,0x1d,0x2e,0x7f,0xbc,0xf1,0xbb,0x2a,0x2c,0xd2,0xe8,0xc1,0x77,0x5b,0x8b,0x03,},{0xf7,0xc3,0x9f,0x92,0x47,0xd2,0x2f,0x01,0x89,0x99,0x24,0x7f,0x0e,0x00,0x05,0xcd,0x63,0x07,0x6c,0xcf,0x2f,0xee,0x41,0x63,0x42,0x1f,0x86,0x40,0x7a,0x41,0x69,0x8c,0x40,0x58,0x16,0x64,0x73,0x51,0xc0,0x4e,0x93,0xb5,0x44,0x15,0xb6,0x2f,0xc0,0x3f,0xc8,0xc2,0x5e,0x20,0xf7,0x54,0x1d,0xab,0x03,0x19,0x7d,0xc9,0x00,0xb2,0x9c,0x0c,},"\x0f\xa7\xf6\xa6\xfc\xa9\x81\x42\x9b\x57\x2a\x67\x04\x87\x1b\xed\x14\x0d\xab\x93\xee\x19\x92\x00\x6e\x9a\x3b\xb2\xe6\xcc\x9a\x09\xd4\xc9\xcf\x17\x06\x6b\x32\xff\x7e\xf5\xb6\xb2\xe7\x91\x11\x78\xed\x74\x62\xc4\xc1\x75\x60\x31\x71\xca\x61\x36\x68\xb3\xbe\x19\x3d\x94\xc3\x52\x1e\x58\x89\x13\xb5\x94\x8b\x55\x0b\xe9\x9d\x82\xd9\x66\x19\x7d\x71\x0a\xcf\xd9\x59\x14\xcf\x3e\x19\x75\x36\xe8\x3e\x68\x23\x0d\xc3\xd6\x7e\x67\xdc\xdb\xde\xe0\x4f\x0d\x9c\x48\x02\x37\xec\xd2\x8f\x74\x33\x8d\xb5\xf3\xf6\x97\xd3\xd0\x7f\xf3\x36\x13\xbb\xce\x54\x2a\xcc\x9a\x7f\xed\x5d\x12\x49\x0b\x9b\xfe\x1d\x10\x95\x40\xf8\x63\x80\x0d\xd3\x56\xda\x84\x1a\x45\xa3\xcd\x8a\x08\xa9\x45\xbf\xa3\xaa\x98\xe1\x71\x23\x12\xc4\xc0\xf0\xd9\xdd\x64\xf6\xef\xcf\x73\x6b\xd9\x7d\xea\xfc\xa9\xdc\xaa\x3f\x06\xd8\x7f\x2e\xd7\x2a\xeb\x6a\x94\xf3\x28\x00\x00\xc4\xbf\x72\x8a\x01\xc1\x86\x2d\xaf\xd9\xfc\x5c\x7d\x5a\x46\xec\x7d\x3a\x87\xaf\x59\xa1\x1d\x87\xf7\xff\x84\x40\x7d\x37\x01\x0e\x1d\x94\x6c\xf2\x25\xd6\xb3\xb1\xed\xee\x2e\x8b\xbf\x1e\x07\x9e\x47\xfb\x1f\x66\x66\x93\x94\xfb\xf2\xfa\x68\xfc\x56\xfc\x89\x82\x0a\x68\x09\xc2\x51\xdd\x62\xf5\xb8\x65\xc5\x47\xb1\x4f\xbd\x3a\x19\x50\x42\x44\xff\xbc\x7e\x52\x40\xf8\x8d\x43\x60\xf9\xca\xca\xaf\x5f\x82\x43\x3d\x33\x44\xfc\xae\xe0\xac\xde\xb7\xbe\xb9\xc0\xb3\xc7\x69\xea\xc9\x20\xef\x4f\x09\xab\xc2\xa2\x09\x55\x12\x04\x59\x43\xec\xcc\x53\xb1\xc0\x3e\xd2\x4e\x56\x7f\x3d\x7a\x71\x97\x7c\xab\x98\x40\xce\x89\x8e\xe5\x8e\xd5\xc7\x3f\x6a\xde\xa8\x23\x39\x4c\x5c\x8e\x36\x58\xa6\xbf\x5a\xcb\xbf\x00\x55\x99\x2c\x31\x2c\x26\xc7\x9c\x5c\xfb\xea\x38\x60\xb8\x76\x4a\x6d\x8f\xfe\x44\x91\xf8\xa5\xb8\xa2\x15\xe0\x11\x7a\x9a\x68\x16\x4a\xee\x25\xf8\xc0\xbb\x38\x11\x95\xb2\x40\x0b\xcb\x46\x44\xeb\xce\x1c\xde\x5a\x9a\x26\x58\x2c\xab\x9d\xc7\xf4\x3c\x33\xea\xe3\x50\xdb\x65\xaa\x7d\xd2\x2a\x07\x9b\xdd\xdc\xf5\x6d\x84\x8d\xeb\x0c\xfa\x50\xb3\xbd\x73\x2d\x9d\xa9\xe8\xd8\xab\x79\xe9\x34\x69\xde\x58\x02\xb6\xdf\xf5\xac\x2a\xa8\x48\x2b\xb0\xb0\x36\xd8\xf9\xd5\x95\xb8\xea\xd9\x4b\xb8\xd7\x41\x8e\x2e\xa4\x31\x92\xef\xcb\xfc\x05\xc4\x67\xbd\xe0\xa8\x68\xa5\x16\xa7\xc1\x4a\x88\x9b\x72\xc5\xb7\x3e\x7d\x85\xc2\xba\xe9\x02\xe4\xe6\x8d\x1f\x3c\xea\xb2\xb2\x77\x3a\xf5\xbb\xae\xe6\xa0\x0d\x08\x06\x3e\x78\x33\xcd\x4e\x29\x53\x47\xe5\x8f\x5d\x1b\x33\x97\xf6\x40\xc1\x59\xcc\x60\xa6\x74\xa2\x27\xb4\xcd\x8c\x10\xf1\xdb\xae\xd5\x16\xcc\xac\xdd\x29\x5f\x11\xb0\x81\x47"}, +{{0x32,0xa1,0x88,0x3e,0xff,0x57,0xa3,0xa7,0xec,0xdb,0x31,0x02,0x21,0xee,0x83,0xc4,0xde,0x92,0xb7,0x22,0x15,0x96,0x13,0xec,0xf8,0x16,0xe3,0x82,0x43,0x7b,0x60,0xb9,},{0x82,0xdd,0x1a,0x03,0xe5,0x85,0x20,0x62,0xba,0x4a,0x8b,0x6b,0x3b,0x93,0xc5,0xe9,0xc4,0x3f,0xf6,0x99,0x5b,0xd2,0xaa,0xc7,0x26,0x06,0xfa,0xc8,0x58,0x02,0xc6,0x82,},{0x83,0x09,0xcb,0xe7,0x2f,0x80,0x4b,0xd9,0x52,0x1d,0xef,0x5d,0xad,0x4d,0x8b,0xc1,0x38,0x86,0xb1,0xd4,0xf6,0x62,0xc9,0xbb,0x5b,0x97,0xba,0x47,0x90,0xf4,0x4b,0x80,0x1f,0x31,0x95,0xea,0xd0,0xd4,0xdd,0xb6,0x60,0x81,0x8e,0xcb,0xf9,0xa6,0x83,0xca,0xcf,0x85,0xf1,0xdc,0xc9,0xe8,0x2c,0x09,0x11,0x6d,0x73,0x36,0x58,0x09,0x1a,0x00,},"\xed\x2b\x12\x3b\x5d\xd7\xf5\xe7\x18\xe0\x26\xc7\x9c\xfa\x61\x11\x92\x49\x02\xd1\x89\xa4\x06\xef\x2b\x2e\x56\xa9\xee\x55\x73\xa7\x6d\xdd\x1d\x06\x29\xeb\xcd\xec\xf2\xaa\xa7\x4e\x84\xfc\xd0\x20\x8f\x14\xee\xa2\xe1\x71\xe7\xc8\x60\x8b\x81\x8f\xef\xf4\xdb\xea\x52\xdb\x35\x42\x27\xd0\x23\x25\x0b\x1f\x01\xcb\x4c\xc8\xc5\x21\x32\xa9\x8d\x4a\xcf\x55\xa5\x4f\xee\x81\xe0\x94\xae\xd6\x6f\xa0\xd6\xb6\xa2\x00\xb6\xb8\x74\x14\x40\x22\x78\x53\x8b\x90\x52\x9a\x8c\x60\x3d\x92\x7e\xdd\xda\x97\xbc\x4b\x8c\xb9\x5d\x04\xb5\x33\x7f\xa2\x2c\xea\xfc\x8b\x34\x0c\x46\xfe\xf6\x71\x98\xd1\xfd\x98\xd8\x9c\x65\xcd\x08\x9e\x23\xf5\x3d\xbd\xca\x96\x77\x98\xb5\xcd\x92\x32\x05\xad\x51\x1e\xdf\x70\x6f\x12\x25\xf4\x64\x8c\x98\x5e\x00\x9e\xf8\xa2\xf6\xa0\x11\x7c\xdb\xe1\x4e\x75\x31\x2d\x8a\xc1\xf0\x3d\x04\x6b\x37\xcd\xee\x7d\x69\xc0\xf2\x5c\xcf\x18\x14\x5a\x68\x8a\x8b\x3c\xa8\x87\x5f\xe8\xd9\x0b\xaf\x86\xd4\x39\x69\xe4\xd6\x10\x21\x4f\x1a\xc5\xdb\xba\x87\xa1\xef\x10\x37\x7e\x40\xd7\x80\x6f\xd9\xd2\x34\x57\xfc\x9d\xf2\x98\x99\x23\x9f\xd1\xd2\x78\x84\x96\x81\xa9\x43\xad\x9c\x91\xfd\x1b\xbd\x92\xb7\x3c\xb1\x77\xa8\x78\xf9\x05\x9e\xe0\x7a\xf7\xa8\x73\x16\x13\xe3\x3d\x59\xdf\x3d\x97\x79\x60\x79\xd5\x63\x1e\xd8\x5e\xb2\x24\x51\x06\xa5\xff\x6a\x2b\xca\x40\xdf\x5c\x6e\x87\x47\x3b\x2c\x08\xc2\x21\x2f\x56\xfc\x29\x33\xa9\x69\xa3\xc9\x58\xd3\x7c\x53\x43\xba\x27\x60\xc8\x13\xa7\xa5\x16\x5d\x23\x1c\x5f\xea\xae\x62\xb7\x55\xdf\x49\xfe\xca\x80\x04\x1a\x65\x35\xf7\xe0\x3b\xc4\x8e\x5f\x27\xf9\xbe\x26\xef\x53\x67\x3e\xb7\xc3\x7a\x2b\x64\x74\x4a\x6c\xf1\x7e\x88\x77\x34\xae\x01\x0b\xf4\x0e\xea\x03\xcd\xa2\x12\xf5\x12\xfb\xa0\x58\x59\x47\x17\x96\x40\xbc\xc4\x54\x4b\x8d\xeb\x4e\xad\x12\x9b\xc3\x32\x28\x00\xad\xf9\x88\x18\xf9\x95\x74\xbe\xfd\x9b\x00\x16\xd4\xee\xc8\x1a\x8e\x78\xdc\x3a\x2a\xf1\x3c\xab\x01\x64\x9a\xe2\xe3\x3d\x51\x6b\x9d\x42\x08\xad\x66\x13\xd8\xe2\x78\xc3\x93\xba\xa8\x82\x34\x0e\xf4\x61\xff\x4f\x94\x42\x3d\x55\xcf\x3c\xed\xd2\xa6\xb5\x6e\x88\x36\x55\x31\xdd\x29\xd6\x82\x73\xad\xbf\xe3\x69\x40\x2e\x6a\x7c\xee\x05\x3d\xa1\xf1\x00\x54\x00\x91\xa0\x09\x29\x25\x29\x83\x44\x90\x24\xb1\xc3\x39\x11\x10\x65\x00\x82\xf0\xe7\xdf\xdd\xb8\xed\xc2\x04\x2f\x3c\x17\x13\xc6\x94\x4b\xa5\x14\xee\x74\x07\xd3\x2b\xf0\x6c\x85\x8e\xfe\xc4\x2a\x78\xbe\xe9\x77\x46\xe5\xb4\x87\x91\x41\xa1\x3d\x9f\xc5\xcb\x12\x3b\x78\x32\x73\xb8\x4d\x57\xad\x35\x26\xb7\xda\x3c\x68\xb8\x39\xef\xd2\x3f\x5f"}, +{{0x22,0xec,0xef,0x6d,0xab,0xe5,0x8c,0x06,0x69,0xb8,0x04,0x66,0x49,0x73,0xe4,0x57,0xc0,0x5e,0x47,0x77,0xf7,0x81,0xc5,0x25,0x22,0xaf,0x76,0xb9,0x54,0x81,0xa9,0x14,},{0xd4,0x78,0x40,0x10,0xef,0x04,0x03,0xed,0xdc,0x5a,0x62,0xd5,0xd4,0x5b,0xb2,0x43,0xb8,0x0b,0x4b,0x9d,0x69,0xc3,0x9c,0xa3,0x87,0xc6,0xf5,0xcb,0xa0,0x28,0x64,0x0f,},{0x5d,0x0d,0x2a,0xf6,0x78,0xb3,0xd1,0xb6,0x77,0x51,0x6d,0x08,0xa7,0x9a,0xaf,0xd3,0x6e,0xc6,0x7c,0x14,0xca,0xf5,0xbc,0xda,0xae,0xaa,0xcc,0x51,0xa1,0x4f,0xb8,0x05,0xcf,0x29,0x04,0xe8,0x72,0x1d,0xb2,0x71,0xb2,0x0d,0xf7,0x09,0xbe,0xe1,0xa4,0xfb,0xfe,0x62,0x56,0x50,0x73,0xb2,0xa7,0xe9,0x42,0x72,0x44,0x61,0xf9,0x27,0x93,0x0d,},"\xc5\x35\xc1\x3d\x77\x9f\xc0\x98\x59\x73\xd6\xbc\xd5\x52\xd8\x17\x34\xe9\x2b\xdf\x10\x99\x4b\x00\xcd\x4d\x53\xce\x36\x5f\xad\x8c\x7c\xfa\x96\x20\x6a\xdb\x62\xd4\x56\x7b\xe5\xe4\x66\x31\x32\x38\x53\xe3\x8c\xe4\xbd\xc1\x6d\x7b\x8f\x63\x2a\x3a\xd9\xe0\x26\x19\xef\xf3\x71\x74\xea\xc3\xf0\xbf\x2f\x7a\x75\x17\xd4\xb8\x2d\xe6\xaa\x1a\xf0\x06\x38\x19\xd5\xe1\xf9\x27\x8f\xb4\xf2\x4c\x8c\xc0\x02\xaf\xb1\x5f\x33\x4c\x04\xfa\xdb\x00\x30\x30\x13\xc0\x16\x67\xf4\x93\x2a\x6c\x4b\x97\xd3\x9c\xd4\xa4\x59\x85\x06\xc0\xbd\x74\x0e\xa9\xf1\x16\x96\x35\x7d\x7d\x17\xfe\x4d\x75\xf9\xd7\x42\x41\xa7\xaf\x71\xf9\xd8\x69\xef\x6c\xd6\x95\x68\x7c\x03\xfc\x34\xad\x65\xa6\x8a\x48\x88\xa1\xa7\x41\x26\xcb\x55\xcf\x7d\xa9\xcb\x4a\x67\x17\xf6\xeb\x88\x48\x40\x89\xd2\xc5\x18\x9a\xe3\x81\xf2\x5e\x7b\x3b\xc3\xb2\x3d\x0c\x9d\x9f\x9c\xdb\xbe\xec\xfd\x1e\x72\xa0\x5e\x67\xbb\x48\x3a\x97\x64\xd9\xfc\x75\xad\x69\xe4\xab\x12\x70\xfb\x40\xf3\x95\x8f\xea\x4d\xa5\x59\xb4\x39\x80\xb2\x46\x81\x31\x3e\x85\x91\xe6\x85\x46\xa3\xbf\x76\xee\x34\xb3\x39\x70\x92\x95\xa8\xd4\x6f\xb2\x43\x2d\xda\x2f\x22\x18\x12\xdf\x69\x28\x95\xe6\x7c\xb2\x9c\xbf\x6f\xf4\x50\x2b\x43\x9a\x4e\x9e\x43\x63\x9e\xc0\x67\xbc\x90\xae\x81\x4a\x29\x3a\x7b\xd4\x69\x68\xe6\x56\x78\x76\x42\x30\x0a\x0f\xf2\x69\x7e\x33\x13\xf6\xa4\x18\xd3\xd1\x2a\x5f\x7c\x51\xa4\xc5\x7b\x63\x38\x5f\x2d\x2a\x21\xd5\xd1\xd7\x63\xfc\x8d\x1b\x93\xc1\x34\x35\xf9\xe4\x7e\xe7\xa4\x25\x98\x0a\x6a\xe6\xf1\xa9\xd0\x07\x60\x74\x76\x78\x3c\x6d\x0c\x78\x87\x38\x0f\x86\x8c\x65\xb3\x82\xd4\xcc\x8c\x04\x47\x8b\xbd\x79\xa1\xd9\xa9\x64\xb7\x81\x71\xd6\xbc\xf0\xb8\xee\xc5\x0a\x06\xa4\xea\x23\x4d\x1c\x23\x46\x5d\x3e\x75\xb8\x8b\xc5\x40\xda\xde\x74\xed\x42\x67\x5b\x07\xf7\xcf\x07\x82\x11\xe9\x07\xf8\x6d\x0d\xc4\xb9\x78\x62\x3d\x9f\x08\x73\x8a\xf9\x28\x69\x5e\x54\x2e\xc2\x98\x0e\x55\xa1\xde\x49\xe2\x52\x47\xfa\x0a\x09\x67\x81\x18\xe3\x93\x0b\xc4\xd2\x4b\x32\x14\xd6\xdc\xfb\x6e\xbd\xf4\x90\x6c\x92\x8d\xeb\x37\xbb\x9b\xa2\x9c\x8d\xe1\xbb\x94\x18\xdb\x71\x8b\x28\x53\xba\x57\xad\x8c\xae\x46\x77\xad\xdf\xd1\x8b\x6c\x7e\x8c\x24\x26\x21\xb3\x5c\x7f\x0e\xfe\x8d\xd5\xeb\x26\xff\x75\xfd\x57\x48\xb1\xd7\x83\xf6\xd6\x8a\x7d\x9d\x56\xda\x2c\x1a\x97\x8a\xc2\x5f\x84\xfb\xb2\xbe\x55\x68\xd9\x1e\x70\x93\x82\x21\xc1\x02\xae\xe6\x04\x09\xbc\xbe\xc0\xc8\x2e\x12\xdd\xb4\x25\xee\xb6\xec\xd1\x15\x51\xec\xd1\xd3\x3d\xda\xe8\x71\xae\x0c\x8f\x24\xd0\xd1\x80\x18\x73\x2b\x5e\x0e"}, +{{0x8d,0xe8,0x63,0x30,0xb2,0x56,0x09,0x5e,0x11,0x14,0xb6,0x52,0x9b,0xed,0xce,0x18,0x2c,0x16,0x6f,0x67,0xa9,0x15,0x39,0xce,0xbc,0x4b,0xec,0x25,0xad,0xd7,0xa4,0xa9,},{0x33,0xcb,0x05,0x4b,0x55,0xbb,0x79,0x0a,0xc0,0xf3,0xaf,0xdd,0x9a,0x6e,0x7c,0x05,0x0e,0xfe,0x90,0x06,0xc2,0x4f,0x60,0xb8,0x04,0x4f,0xd0,0x8a,0x5c,0x10,0x6c,0x11,},{0x6d,0x01,0xd2,0x37,0xdd,0x2b,0xb4,0x18,0x8d,0x29,0xbf,0xde,0xc3,0x87,0x97,0x6a,0x71,0xbe,0x7a,0xdf,0xbf,0x9e,0x23,0x63,0x9b,0x21,0x6d,0x0a,0xa0,0xc1,0x19,0x32,0x23,0x5e,0xdc,0xcb,0x3b,0x42,0xad,0xcd,0xb6,0x29,0x1a,0x0d,0x29,0x9a,0xed,0x64,0x8d,0xe8,0xb1,0x95,0x79,0x49,0xb9,0xd1,0xcf,0x2e,0x50,0x49,0x30,0x30,0xa4,0x0f,},"\x39\xe6\x1e\x0e\xcc\xec\x92\x9c\x87\xb8\xb2\x2d\x4f\xd1\x8a\xea\xbf\x42\xe9\xce\x7b\x01\x5f\x2a\x8c\xac\x92\xa5\x24\x48\xa4\x2f\xed\x4c\xba\xdc\x08\x5b\xbb\x4c\x03\x71\x2a\xe7\x2c\xfc\xb8\x00\xb9\x78\x35\x06\x69\xb0\x99\x00\x84\xf2\xda\xb7\x6e\xca\x60\x6d\x1a\x49\xfc\x55\xc5\x29\xe1\xe7\xda\xdf\x39\x12\x2d\xd5\xbd\x73\x38\x93\x85\x8b\x05\x23\xef\x62\xdf\x4f\x13\x4c\xf6\xc2\x6e\xed\x02\xfd\xbc\xb3\x0c\xe4\x74\xb1\xad\xa3\xf0\x60\x76\x9f\x93\x4b\xbe\x68\x6c\xce\xbd\x60\x88\x3e\xce\xc9\xce\x3f\xfb\x8a\xc4\xa0\x67\x8c\xdc\x5b\x00\x5a\xe3\xdb\xa7\xe4\xfe\x8b\xc0\x45\x73\x99\x57\xd8\x49\xf6\x9c\x14\x74\x05\x7b\x42\x8c\x54\x25\xf3\xcc\x25\x16\xe8\xbb\xe3\xbe\x81\xaf\xd4\xe7\xb5\x75\xab\xe8\x8c\x87\xf2\xf0\x3b\x56\xf6\x9f\x9e\x3b\x61\xb3\x78\x81\x20\xda\xa4\x95\xef\x0e\x50\xeb\x97\x0a\x64\x5c\x13\xd2\x13\xc7\xcf\xb7\xd0\xad\x55\x5c\x92\x0a\x1e\x5d\xbc\xb4\x67\x97\xd9\x39\xfe\x04\x01\xf5\x47\xbf\xd1\x75\x43\x22\x1a\x53\x01\x0d\xe0\x1f\x25\xb6\x45\x19\xc8\xf0\x39\x63\xe4\xb9\xca\x58\xb0\x11\x36\x27\xc0\x5b\x96\x08\xee\xaa\x7b\x9a\xe6\x30\x5c\x96\x18\x81\x60\x00\x0e\xe3\xa7\xad\xe9\x6e\x0b\x4b\xde\x9d\x0e\xd6\xa0\xce\xd7\x65\xd7\x86\x84\x0a\x48\x17\x5a\x6e\x09\x0a\x38\xaf\x6a\xde\xaa\x14\x86\xa9\xcb\x5c\x8c\x8c\x92\x23\xee\x0a\xe4\xc6\xc0\x26\x91\xa3\x54\x7e\x32\x58\x2a\x5b\x70\x59\xd2\xee\x66\xfa\x9c\xd9\x65\x61\x5c\x31\x5b\x47\x6f\xd8\x61\x27\x9c\xd1\xdd\x76\x07\x74\x3f\xc5\x56\x12\x96\x31\x2f\x11\xe4\x65\xca\x40\xbc\xe3\xcf\x0b\x1f\x1d\x5a\x30\xaf\x60\x87\xde\x4d\xe9\x6c\xe4\x39\x65\xa4\x6c\x4f\xcc\xa1\x5f\x28\x11\x49\xb5\xc1\xa0\xc8\x8f\xdb\xf2\x74\x09\xa1\x34\xed\x4f\x1f\xb7\x30\xfa\x19\x18\x16\xea\x78\x4d\x98\x6c\xc9\xec\x4b\x69\x44\x02\xde\x1d\xcc\xa9\xcc\xc6\x4f\xbd\x07\xb0\x7e\x54\xe9\x31\xde\x82\x7a\x84\x24\x60\xca\x0b\xf6\xb0\x4e\xbb\x57\x1f\xa7\x77\x87\xe3\x88\x4b\xe2\x2f\x1e\x40\x2c\xf2\xb8\xa9\x6a\x5d\x39\x77\x0e\xc4\xa8\x43\x03\x61\x42\xa0\xbe\x97\x0b\xb1\xab\x16\x5a\x63\x74\xdc\xf4\x3d\xeb\x8b\x98\x30\xb2\xc4\x9d\xb9\xcd\xfe\x4b\x52\x42\xe3\x6f\x95\xe0\xc3\xe0\x77\xe8\xd2\x38\xfa\x6a\x8a\xc0\xd5\x86\xbf\x61\xb8\x24\x8f\xb3\xa7\x9a\x27\x0a\xb2\x2b\xe8\xa9\xda\x05\x5f\xf3\xd5\xbb\x2d\x1c\xa9\xbc\x25\xf7\x01\x4b\x96\x40\x77\x19\xde\x34\x4c\x3e\x73\xb8\xc1\x14\xf7\x92\x07\x5a\x5c\x22\xfd\xd4\x16\x15\x4d\x34\x94\xec\x3f\x02\xfb\x11\x2e\xe5\x73\x7f\x70\x70\x4c\x1b\x6b\x07\xea\xcb\xf9\x45\x62\xca\x7b\x90\xdd\x84\xd9\x8c\x3e\xdf"}, +{{0xba,0xb5,0xfa,0x49,0x18,0x7d,0xa1,0xca,0xb1,0xd2,0x91,0x90,0x00,0x19,0xe6,0xcb,0xaf,0xec,0xcd,0x27,0xbf,0x7e,0xcb,0xf1,0x26,0x2a,0x70,0x05,0x16,0xe7,0xc2,0x9f,},{0xf6,0xfb,0x19,0x85,0xec,0x59,0x1f,0x69,0xe3,0xba,0xc8,0x07,0xb2,0xea,0xbf,0x26,0x39,0x90,0xcd,0xfa,0x09,0xb1,0x78,0x09,0xe4,0x8e,0x38,0x5d,0xa0,0x65,0xec,0x21,},{0xe3,0x16,0x03,0x8d,0x6a,0xa1,0x5b,0x1c,0x1b,0x61,0xc1,0xa1,0x6b,0x36,0x90,0x4f,0xe8,0xa2,0x89,0xc8,0xd6,0x02,0xbe,0xcc,0x51,0x4d,0x99,0x22,0x00,0x86,0xb2,0x67,0x85,0x9f,0x5b,0xf6,0xe9,0xc0,0x86,0x35,0x59,0xac,0x62,0x3a,0x56,0xd7,0x53,0x23,0x44,0xe8,0xd2,0xf2,0x8b,0x3f,0x9d,0xf9,0x20,0x89,0x70,0x8b,0x1b,0x05,0x90,0x08,},"\x5c\xf8\xff\x58\x7e\x52\xcc\xcd\x29\x84\xf3\x47\x91\xee\x68\x43\xe7\x70\x17\xc3\xb5\x5a\xd4\x5c\x44\x45\x09\x65\xb7\x5d\x83\x6e\x78\xfb\xd7\xa1\xd1\x72\x9e\xff\x6d\x6d\x34\x0a\x90\x3f\x3c\xf1\x7d\x9e\x2a\xec\xaa\xff\x2a\x32\x1f\xcd\xde\x0a\xbc\xfb\xbc\xbc\xc0\x9f\x40\x86\xf8\x12\xc4\x6e\xfb\x01\xb7\x83\x43\xaf\xbe\x48\x30\x9f\x91\x74\x78\x45\x5f\x32\x00\x0c\x6a\x69\xf7\x9f\xe2\x11\xb9\x9f\x03\x7f\x59\x56\xd7\x22\x75\xa7\xfe\x7b\x45\x29\x6b\x5f\x73\x9a\xa4\x51\xff\x05\x75\xbc\x70\x58\x85\xaa\x56\x31\xb0\xd0\x85\x0b\xc2\xb1\x2c\x41\x92\x43\x5a\xe5\xd2\xf5\x2b\xc5\x43\x86\x49\x7c\x4a\x24\xb8\xb6\xdb\x51\x6b\xe0\x9d\x8c\xcf\x1e\xca\x78\x5b\xde\x97\xe9\xbe\x1a\xc0\x64\xf0\x94\xe2\xaf\xcc\x30\x7c\x0e\x06\xb4\xc5\x64\xcd\x9a\x9a\x95\x30\x5b\x37\xb8\x1f\x43\x46\x11\xdc\xa5\x5c\xaa\xa0\x31\xe8\x84\x95\xd5\xdc\x5a\x04\xff\x5f\xaf\xdf\x0a\x82\xa0\xc0\x3a\xff\x1b\xfb\xf4\xff\xeb\xae\x71\x82\x4e\x35\xe7\x51\xb0\x92\x70\x00\x76\x69\x86\x0b\x58\x00\x35\x65\x9e\x23\xac\xe7\x6b\x3b\x36\x9f\xa3\x06\xf2\xbe\xd9\x57\x99\xfa\xfa\xbc\x2e\x69\xc1\x41\xbe\xb0\xba\xca\xc7\xea\xa3\x47\xe7\x7b\xe5\xaf\x3f\xcd\xbe\x7b\x36\x4a\x7f\x9a\x66\xd5\xe1\x7a\x07\xdf\x62\x02\xfd\x98\xc1\x4b\xfe\xe2\xca\x6f\x07\x45\x65\x1f\x0c\x85\x50\xf9\xff\xff\xca\xfb\x96\xff\xb3\xf1\x03\xe6\x52\xe7\x8f\x53\x91\x6c\xd6\xf1\xdd\x05\xb3\xfe\x99\xb3\x42\x01\xb0\x7e\xac\x26\x52\xf5\x25\x35\x71\xfd\x38\x22\xc6\x95\xd2\x65\xc7\xdf\xdd\x6c\x6b\x14\xa8\x0b\x6e\x87\x18\x3e\x6e\x03\x2e\x5f\x24\x01\xcd\x23\x8c\xdd\x37\x69\xbb\x6e\x39\x08\x23\x43\x8f\x56\x73\xea\x9a\x47\x9e\x5c\x63\xfe\x07\xa0\x7f\x4e\x14\xf5\x77\x57\xc4\xd7\xd2\x2b\x35\xd7\x1c\x44\xea\xad\x48\x73\xc8\xec\xa6\xf6\xb2\x1d\xcf\xa9\x55\x20\xff\x96\x14\xab\xf7\xa0\xe1\x88\x53\x09\xf2\xce\xd3\xbc\xdf\xc3\x19\x36\x3a\x2d\xa4\x6d\xed\x79\xa5\xcc\x7b\x6f\x69\x38\x3f\x94\xab\x35\xc2\x50\x62\x9c\xb9\x15\xd6\x67\xb6\x28\x11\x86\x75\x48\x95\x80\x3e\x4b\x95\xe7\x41\x82\x89\xa6\xac\x3b\xcd\xb6\xe1\xe7\xf6\xf1\xdc\x38\xe7\x7d\x28\x19\x14\xcc\x40\x4f\x97\xcf\xf1\x4f\xb2\xc4\xfd\x81\x41\x2d\x10\x1c\x1b\xfb\x36\x8c\xe5\x93\x11\xe8\x92\xa8\xb9\xcd\xca\x86\x93\x6f\x3b\xca\x7e\xc7\x91\x63\xed\xdf\x1c\xee\x68\xf4\x9f\x1e\xba\xa2\x7e\xc5\x0f\x49\x0d\x61\x60\x1c\xa3\x5f\x8d\x6e\xd2\x66\x05\x4a\xeb\x9b\x19\x9f\x93\x3b\xff\xd6\xe0\x05\x0f\x26\x1b\x4e\x13\xd5\xeb\xfe\x2c\xaa\x65\x57\xc3\x2d\xde\xae\xeb\xc2\xa1\x1f\x0a\xa2\x33\x24\x0d\xa1\xc7\xe4\x0f\x76"}, +{{0x74,0xca,0x12,0x2a,0xb6,0x0d,0xe5,0x0c,0xdc,0x04,0xa8,0xe2,0xed,0xa4,0x5d,0x96,0x31,0x06,0x1b,0xf1,0x87,0xd3,0x16,0xbe,0x5b,0x7c,0xc0,0x6f,0x02,0x0c,0x48,0x3e,},{0x78,0x7d,0xef,0xd4,0xfb,0x24,0xa3,0x99,0xbd,0x2a,0x4e,0x76,0xdf,0xf7,0xd6,0x03,0xed,0x0a,0xcb,0x32,0x69,0x81,0x3e,0x4d,0xf6,0x90,0xbb,0xf5,0xb2,0xbc,0x69,0x6e,},{0xbc,0xb4,0xb8,0x50,0x69,0x60,0x11,0x99,0x7e,0xb5,0xdf,0xe1,0x43,0xf1,0xa3,0xd5,0x62,0x8e,0xf1,0xa5,0x40,0x76,0x91,0xee,0x48,0xc7,0x9d,0x69,0xab,0xe4,0xd5,0x33,0xf8,0x17,0xad,0x73,0x13,0xb5,0x79,0x5e,0x46,0xe5,0x95,0xf3,0xae,0x3a,0x91,0x65,0xb1,0xb6,0xfd,0xda,0xe8,0x61,0x64,0xff,0xcb,0xa3,0x76,0x24,0x98,0x37,0xf6,0x09,},"\xa8\x0b\x46\x07\x9f\xa7\x75\xf8\xc1\xa1\x9f\xa0\x82\x9b\xe6\x66\xbd\xfd\xca\x07\x9c\xad\x43\xd7\x0e\x08\x42\x18\x3b\xc0\xdb\x95\x46\x8a\x53\x9f\x0d\xb2\xae\xa3\xab\x9c\x70\x73\xb4\x5d\x22\x8a\x9b\xde\x23\x28\x97\xa6\xeb\x6f\xc9\xed\xf7\x36\x5e\x71\x01\xba\x97\xc4\x46\xa5\x19\xa3\x64\x9c\xf5\x27\xc8\xa6\xde\x72\x51\xb9\x28\x06\x81\x5a\xc2\xfa\x00\x82\xef\xf7\x5e\x25\x82\xcb\xca\x7e\x1e\x4d\xa2\xa4\x46\xea\x23\x3e\x7c\xf7\xce\xdf\xb0\xe2\x39\x8e\xb6\xe1\x1b\xba\xef\xe3\xf7\xec\x89\xf5\xd7\x3d\xd3\x4b\xd4\x7f\xbc\xb4\xd7\xb2\x2f\x2a\xae\xe3\x73\x78\x56\x51\x84\x11\x35\xcd\x86\x61\xa7\x01\xb2\x10\x84\xa3\x16\xde\xac\x30\x74\xe2\x4a\x2e\x35\xa0\x33\x0f\x7d\x14\x79\xb9\x32\xf2\x85\x27\x7c\x18\xa4\x41\x78\x72\x24\xfb\xbe\x46\xc6\x2e\x83\x4a\x18\x51\xed\x23\x79\x98\xd4\x8d\xce\x20\xba\x11\x4d\x11\xe9\x41\xbe\x29\xd5\x6d\x02\xf7\x37\x0c\x8f\x6d\x6d\x7e\x50\x24\x8d\xcd\x8e\xc8\x9d\x3b\x22\xf4\xf5\x87\x78\x12\x9f\xaf\xd4\xbb\x92\xed\xe1\x77\x14\xbf\x02\x2a\x5b\xf9\x2b\xe4\x79\xf1\x8e\x63\x85\x2e\xcd\xcf\x8c\x42\x11\xf5\x30\xdd\x30\xf7\x9c\xbf\x4b\xfa\x57\x37\xf0\xba\xd3\xb0\x10\x60\x67\xf4\x13\x27\xc3\x18\x9e\x6f\x20\x6f\x0d\x4f\x3c\x70\x4b\xf2\xbd\x0b\x16\x1f\x01\x8f\xd2\x1c\xdd\xfb\x41\x8b\xac\x4d\x52\xef\x02\xc4\x1c\x87\x92\xe4\x13\xb0\x4f\x08\x36\xce\xa1\xf8\x6c\x92\xe5\xd5\x70\x3b\xee\x2b\x5c\x58\x99\xe2\x85\x99\x20\x24\xf6\x4e\x0d\x16\xc6\x0a\xd0\xfd\x92\x54\x79\x32\xd0\xc5\xcb\x98\xd8\xda\x22\xfe\xeb\xdb\xba\x8d\x1d\xe1\xe7\xe9\xbb\x21\x9a\x92\xeb\x6c\x1c\x69\x8d\x3b\x33\xa3\x7f\x9b\x81\x97\xd2\x6b\x55\x0f\xeb\xd2\x60\x1e\x7a\x64\x3e\xa7\xe1\xd9\xe4\x48\xae\x03\x7f\x62\x9a\x30\x6c\xe4\x17\xae\xb7\x9f\x2e\x3c\xa4\x4d\x8d\xb3\x84\x8a\x81\x1f\x18\x46\x81\x1c\xbc\xb8\x74\xf8\xaf\x09\xe0\xfd\x01\x73\xcf\x17\x5f\x30\x41\x15\x47\x6b\xf2\xc6\xc2\xd2\xf3\x32\xeb\xa5\x34\xf4\x6a\xae\x80\x1c\x26\x92\xc2\xd2\xfa\xdd\xfe\xac\xc0\xf1\xda\xce\x44\x0a\xbc\x2a\xe5\xe5\xa4\x9d\x57\x8f\xd7\xf9\xde\x2a\x84\x1a\xd6\xb6\x76\x9c\x32\xb1\x44\xce\xea\x16\xd0\xf3\xc0\xcb\x3a\x8e\xe6\x94\xc3\x8c\x28\x07\x35\x95\x09\x6c\x81\x37\x62\xcc\x2c\x5e\xc4\xb0\xd8\xd7\x23\xdd\x66\x08\x53\x27\x8f\xc7\x2f\xd6\xbd\x9d\x12\x72\x93\x3d\xd2\xa3\x8e\xd9\xd0\x4b\x13\x90\xff\xe4\xb2\x94\xa6\xff\xfa\x72\x1e\xe3\xbb\xa3\x3a\x03\xa1\x49\xc4\xa0\x34\x52\x65\xc0\x1c\xe0\x15\xe9\x4d\xb4\x19\xcf\xf7\x04\x98\x52\xee\x00\x00\x48\xa8\x57\x58\xf6\xd7\xb1\xc5\x9c\x50\x89\xee\x01\x8e\xd0\x9b\x52"}, +{{0x65,0xee,0xa9,0xff,0xb7,0x56,0x12,0xbd,0xe1,0xd9,0xba,0x3e,0xa4,0xfb,0x5e,0xda,0x0a,0xa6,0xf2,0x55,0x6a,0xb1,0x5b,0xf1,0x81,0x7c,0xee,0x3b,0x95,0xbb,0xba,0x12,},{0x5b,0x39,0x36,0xdc,0x74,0x9b,0x6b,0x92,0x39,0xf1,0x57,0x98,0xac,0xca,0xfd,0x88,0x4c,0x36,0x59,0xee,0x01,0xb2,0xd1,0x7d,0x74,0xfc,0x7d,0xa7,0x82,0x74,0xe7,0xe6,},{0xba,0xa7,0x11,0x31,0x55,0x35,0x8c,0x92,0x4f,0xed,0x57,0x48,0x8a,0x65,0x67,0xf8,0x72,0x38,0x50,0xa9,0xf5,0xc0,0x3a,0x0d,0x7d,0xe8,0x5f,0xcc,0xd8,0xfb,0x4d,0x17,0xd7,0x75,0x35,0x23,0xb0,0x0c,0x0d,0x8a,0xdb,0x88,0x4d,0xc0,0xc8,0xa7,0xa4,0x4d,0xc2,0xa6,0x00,0x83,0xaa,0x5b,0x3c,0x5b,0x94,0xa8,0xd8,0x80,0xf2,0xa9,0x4d,0x09,},"\xc0\x69\x36\x32\x3c\xe3\x25\x3c\xac\x5a\xb4\xf6\xb8\x32\x70\xcd\x4c\xfe\x85\xd0\xbf\x8b\xac\x1e\x1b\x8d\x5f\x0b\x15\x3f\x54\x1c\x8e\x8e\xd9\x5f\x28\xd5\xc8\x5a\x23\x15\xcd\x93\x1b\x7c\xf3\xed\xae\x50\xf9\x28\x30\x59\x91\x62\x80\x4b\x13\x63\xd3\xac\x0d\xa0\xab\xd0\x97\x51\x02\x3b\xdd\xc1\x62\x88\x94\x4e\x61\x6d\x21\xd9\x12\x71\x97\x8b\xb7\x82\xd3\xeb\xed\x7f\xa6\x12\x84\xc7\x49\x0d\x27\x59\x3c\xa8\xa3\xd5\xb4\x75\x62\x33\x07\x01\x0a\xbc\x1f\xbf\x79\x3a\x81\x6a\xaa\xb5\xe0\x92\x4d\xec\x79\xd6\x04\x98\x96\x5c\xf7\xf8\x0a\xb5\x9f\xc0\x29\xf7\x82\x16\x67\x55\xb7\x2b\x86\x90\x75\x43\x4a\xb6\x06\xcc\x87\x0a\x7c\x0b\xc8\xbf\x29\xae\xe0\x33\xfa\x9c\xc1\x22\xed\x7c\x8e\x06\x9b\x54\x7d\xba\xe2\x59\x01\xb9\xe2\x49\xb4\x1f\xea\x0b\xf8\xda\xf3\x82\x68\x66\xbc\xae\xd2\x75\x3b\x5e\x91\xae\x93\x7e\x71\x7b\x50\x8a\x0a\xcf\x4c\x3b\x06\x1f\xf0\xcb\x9c\xfd\x38\x0e\x24\x94\x50\x09\x51\xa6\x62\xfd\x49\x28\xfc\x5f\xca\xf6\xc1\x8e\x84\xb1\xd3\x78\xe4\x9b\xd9\xd5\x96\x86\xd0\x87\xeb\xd5\x52\xd0\x7f\xa9\xba\x81\x6f\xa5\x40\x2c\xa9\xe7\x25\x2a\x64\x8d\x10\x6c\xfe\x6c\x43\x1c\xc2\xa0\x53\xe2\x29\x46\x37\xcd\xb9\x9d\x96\xab\xe6\x89\xed\xab\xc5\xca\x07\x0f\x77\xc1\xec\xd1\xd5\x2d\x53\x85\x28\x9f\x17\xce\xd7\x68\xc3\x97\x16\x71\xb9\xc0\xb2\xf8\x55\xb8\x46\x1c\x1e\x74\x6c\x7b\x38\xf7\x78\x96\xb8\x5a\xfb\xbe\xdd\x08\x37\x5f\xe9\x22\x98\x46\x14\xdd\x84\x9f\xe2\xcb\x89\xae\x71\x49\xdc\xd1\xd3\x7f\x49\x36\xe6\x7b\x14\x40\xbe\x72\xe0\x09\x39\x8b\xe6\xf0\x83\xbf\x96\x11\x48\x0b\x59\x2f\xe2\xf0\x11\x8e\x25\x3d\xb5\xd2\xe9\xe4\xb4\x54\x1c\x11\xda\x00\xf7\x16\x1a\x73\x6e\x5f\x0b\xb9\x34\x20\x8e\x3e\xf4\xe0\xb9\xa5\x22\x58\x20\x3f\x06\x0d\x18\xa1\x95\x15\x9e\x5e\x26\x8a\xa2\x80\x53\xc8\x34\xf7\xbd\x5d\xb9\xbd\x71\xf5\x07\xd9\x13\x70\xb3\xff\xca\xbb\xd4\xac\xb3\x07\x1d\x3f\x6d\x52\xc3\x49\xac\xf3\x50\x95\x34\x8c\xeb\xf5\xa8\x6f\x8c\x59\xdd\xc9\x65\xef\xf6\x10\xac\x42\x58\x04\xc0\xe2\xf6\xbe\x42\x85\x3f\x5b\x46\x43\x4a\x2c\x31\xd9\xac\x99\x53\x9b\xfd\xc0\x4e\xcf\x2f\xef\xd0\x45\x98\xfa\x63\xc1\x39\xff\x6c\x6d\x88\x41\x0e\x73\xbd\x32\x8c\xc4\x34\x9a\xb4\xbb\x86\xf2\xe2\xed\x7c\x73\xde\x96\x52\x0e\xf7\x73\x0e\xf3\x83\x45\xe0\xf9\x72\xa8\x4c\x53\x88\x10\x36\x87\xe6\x8c\x50\xf9\xd8\xc9\xaf\x90\x3b\xc6\x32\xd4\x32\x04\x06\x2a\x4f\x50\x2e\x21\x4c\x07\x05\x9c\x2c\xbe\xf7\x2a\x54\x11\x0d\xbf\x73\xe4\x25\x40\x2d\x17\xe9\x78\xec\x19\x9b\x51\x8c\xec\x03\x10\xbf\xbf\x7d\x9a\xd3\x00\x43\x4a\x4a"}, +{{0x08,0xda,0xbd,0x4e,0x5c,0x11,0x9e,0xa9,0x07,0xce,0x45,0xf0,0xa7,0xaf,0x9e,0x62,0xc0,0xc3,0xf1,0xc9,0xec,0x61,0xad,0x10,0x56,0x7d,0x79,0x36,0x28,0x54,0xc5,0x57,},{0x94,0x54,0x06,0xb8,0x5d,0x7b,0x32,0xe0,0xb1,0xab,0x12,0x00,0xb9,0x42,0x22,0xde,0x1a,0xaa,0x68,0x62,0x4c,0x60,0xbb,0x47,0x16,0xb0,0xbc,0xe9,0xdf,0x00,0x57,0x71,},{0x33,0xad,0xbf,0xcd,0x4e,0xd4,0xfa,0x67,0xc5,0x8b,0x5c,0xb5,0x9e,0x16,0x98,0x71,0x48,0x69,0x78,0x12,0x66,0x0b,0x35,0x31,0xff,0x6a,0x21,0xc7,0x49,0xb9,0x60,0x16,0x60,0xba,0xee,0xe2,0x48,0x9b,0x82,0xb4,0xcd,0xe1,0x32,0xb6,0xe6,0x2f,0x2f,0x90,0xd8,0xf9,0x92,0x78,0x60,0xaa,0xad,0x25,0x28,0x1d,0x03,0xeb,0x17,0xa9,0x52,0x0f,},"\x6c\x47\x19\xa5\xa2\xa6\x89\x48\x35\xc4\xac\x1e\xd6\x91\x59\xe5\xeb\xb5\x69\x2a\xd8\xea\xad\xa4\x39\xf7\x9e\x96\x68\x4b\x36\xce\xcf\xb4\x4b\x89\x01\x56\x31\x66\x3e\x06\x44\xf6\xc7\xab\x71\x39\x89\xd7\x42\xda\x27\x42\x72\x53\x31\x8a\x52\x43\x2d\xfa\xb2\x12\x1d\x1e\x92\x33\xea\xd7\x19\xe2\xc8\x6a\x6b\xe0\x73\x63\xd0\x02\x17\x3f\x20\x54\x46\xca\x95\xfc\x17\xb2\x46\x35\x82\x7f\xe3\x15\xf2\x22\x40\x8e\x45\xe8\x33\xf2\x9f\xf0\x8f\xf3\x1d\xac\x58\x3a\x4b\xec\x70\x76\xd5\xcc\x78\xcf\xc9\x44\x51\xcb\xf4\xf7\xe2\xfc\x5b\x5e\xd8\x07\x0f\x4e\xf8\x08\xbe\x1d\x8a\x68\x0e\xcd\xff\x59\x01\x0f\x39\xb1\xde\x80\xbe\xf1\x71\x9f\x1e\x21\x8e\x0c\xe0\xa1\xe3\x93\xa5\x66\xc5\x17\x64\xd2\x37\x0d\x95\xa6\x11\x91\xd8\xf7\xaf\x74\x0d\xc2\x08\xfa\x78\x31\xb2\x10\x67\x05\x12\xcd\x73\x76\x6e\x60\x9e\x9b\x78\x00\x21\xeb\xb2\x0c\xc8\x79\x0d\x8d\xa5\xf1\x0f\x5b\x6a\x11\x4a\x1d\xb8\x8f\x66\x76\x65\x01\x80\x2d\x9c\x36\x6e\xa3\xfa\x6f\x1b\x1e\x1e\x8b\x04\x20\x94\x34\x13\xcc\x6f\xea\xb2\x8c\x6b\x68\x3c\xd2\xb3\x33\x06\x9c\x89\x51\xbc\x45\xe8\xa1\x3b\xd5\x22\x57\x83\x51\xc8\x82\xf7\xc3\x42\xfe\x43\x31\xb9\x21\xf5\x33\xc9\x2e\xc0\x4a\x49\xb2\x92\xbc\x56\x9d\xdc\xef\xca\xb5\x72\x7f\x9b\x56\x25\xb1\x67\xa9\x02\xdc\x89\x6d\x8b\xc7\xd8\xe9\x99\x20\xf5\xdb\x8d\xd7\x67\x83\x9c\x43\xe3\xcd\xf9\x47\x08\x0d\xec\x95\x42\x14\xa6\xfb\xbe\x04\x87\xa2\xf3\x2c\xd1\x7a\x6b\x00\x03\x70\xbd\x41\x44\x84\xfb\x73\xc5\x10\xea\x01\x24\xc6\xcf\x0f\xe5\x6c\x08\x46\xa7\x9b\xfc\x59\x77\x9d\x3b\x07\xa1\xbd\x2c\x7f\xb7\xe2\xd0\x03\x9f\x0b\xd2\x1c\x8a\x30\x8f\xb0\xf5\x8f\xdb\xf9\x4e\xfa\x08\x57\xac\x3b\xdd\xdd\x86\xd5\x76\x3e\x20\x5e\xe1\xb2\x21\xf0\x60\xce\xdb\x8b\xc0\x5f\x03\x1b\x60\x6c\xc7\x4d\xad\xc5\xdb\x04\x23\x27\x48\x86\x5a\x73\xd6\xcc\xdd\xb4\xd5\xe9\x30\xd5\x28\x34\x8c\x5b\xe9\x08\x8b\xfe\x34\x45\x84\x87\xa6\x7b\x19\xa1\x8e\xca\x25\xc0\xd3\xfb\xe2\x19\x5e\xb9\x17\x07\xb6\x5d\x91\x61\xea\x93\xed\xdd\x64\xa6\x34\xb2\x32\x80\x19\x5f\xdb\x0d\x13\x88\xf6\x99\x8e\x18\x58\xa4\x5b\x88\x69\x99\xb8\x44\xe6\x79\x5d\x83\xd3\x18\x37\xe4\x41\x1f\x71\x69\x92\x26\xde\x1b\xa0\x24\x56\x08\x00\x0d\xcf\x22\x3d\xd1\x83\x59\xb7\xc6\xd4\x59\xa6\x5d\xbe\x66\xc9\x0f\x5c\xb8\xc0\x91\x22\x18\x7a\x30\x46\xa1\x6d\xd1\x79\xc3\xf4\x37\x3e\x57\xcf\x5e\xe0\xea\xb6\xa2\x12\xcc\x9e\xd8\xb5\x4b\xf3\x7f\x1d\x27\xfb\xd7\x98\x48\xe4\xec\x1f\x56\x72\x43\xab\x87\x40\xa0\x51\x49\xd9\x60\x2e\xad\xa9\x20\xa4\x6d\x61\x0d\x3c\xc8\x23\xb5\x64\x98"}, +{{0xe0,0xf7,0xd0,0x08,0x24,0xc5,0xf3,0x70,0x1e,0x55,0x17,0xa4,0xab,0xc1,0x3e,0x2f,0x2c,0x0b,0x13,0x8c,0x83,0x69,0x77,0x84,0x3b,0xbd,0x1e,0xef,0xfa,0xbd,0x96,0x8a,},{0x52,0xfd,0xda,0xe3,0xe0,0x18,0xa6,0x84,0x73,0xb3,0x16,0x8d,0x07,0x64,0xcf,0xe2,0x74,0xdc,0xc8,0x34,0xc9,0x0a,0x91,0xfb,0x4f,0xe7,0x4b,0x93,0x9d,0xd2,0x38,0xb1,},{0xcc,0xdf,0xe1,0x8a,0xd6,0xd0,0xb6,0x5d,0x08,0x6d,0x63,0x2f,0x83,0xcc,0x46,0xff,0x3b,0x3f,0x2c,0x07,0xbb,0x8e,0x76,0x9d,0x0f,0xb4,0xe8,0x2d,0xf8,0xa3,0x87,0x3f,0x9a,0xee,0x35,0xfd,0xd1,0x8a,0x57,0x83,0x60,0x31,0x80,0xa9,0x5c,0x9f,0x74,0xce,0xd9,0xdb,0x51,0x46,0xaf,0xcf,0xbb,0xdd,0x40,0xdf,0x29,0xe0,0x42,0x01,0x20,0x0c,},"\xb3\x9e\x3a\xc7\x5a\x22\x1a\xdc\xce\xd0\x9a\x85\x91\xac\x5e\x2f\xe1\x5d\xfe\xd5\xb9\x19\xcb\xaf\x14\xc6\x5e\xb7\xcd\x93\x08\x6d\xde\xe3\xf7\x47\x25\x47\xe6\x6d\xdc\x70\x06\x2b\x97\x62\x97\xd1\xa3\xc1\x70\xee\x52\x5c\x9c\x53\xba\x93\xa4\xc4\xfd\xb2\x35\x72\xb7\xca\x6e\xd1\x38\x53\xe7\x0d\xb1\xd7\x2e\xde\xb9\x94\x4b\xbc\x35\x4a\x52\x0e\x77\xae\x59\x1f\x31\x80\x92\xef\xd5\xe6\x6d\x9c\x09\x81\xc4\xa4\xbd\xa9\x8a\xa4\xe5\x90\x45\xff\x9c\x4b\x4c\xa3\xac\xb2\xff\xd8\x93\x20\x1c\x70\xb3\x4a\x77\xf2\x4e\xda\x54\x54\x9d\xc8\x4a\xd1\x34\xa3\x55\x32\x55\x38\x15\x88\x8a\xe3\xdd\x9e\x24\x1e\xc4\xeb\xbf\xf8\x6f\x8c\x1e\x8a\xdb\xaa\xc4\xb9\x1a\xfd\x18\x22\x8c\xbb\xd5\xdd\x80\x5a\xca\xbf\x0a\x1e\x29\x0c\xe5\xdd\xa0\x25\x1a\xdf\xb3\x7c\xb7\x14\xc1\x39\xb5\xa3\x24\x2d\x88\xc6\x44\x84\xa3\x76\x55\xcc\x8f\xcb\xec\xff\xa9\x7f\xbd\x14\xd6\x4d\x51\x2b\xf8\xf6\x30\x5f\x89\xc5\x09\x22\xde\x54\x16\x92\x15\x8f\xb5\x47\xfd\x53\x9f\x1e\x58\x77\xcc\x64\x94\x95\x16\x63\x32\xea\x2b\x68\x5c\xfa\x3f\x60\x20\x19\xdf\x2a\xb2\xc2\x5e\xd9\x6b\x68\x74\x5e\x9a\xe8\x9c\x94\x8d\xa1\x1a\xd8\xa8\x30\xdf\x8b\x00\xf2\xe6\x68\x19\x2d\xad\xf2\xc5\x62\x0d\x35\xc6\xe8\x1a\x28\x53\xf8\x41\xe3\x75\xa0\xd9\xfc\xa2\xd2\x96\xef\xce\x2a\xc3\x8d\x40\xb0\x30\xb5\x75\x60\xae\x6e\x83\x41\x33\x9b\x3d\x3c\x2d\x06\x11\x64\x12\x43\x19\x59\x86\x88\xfc\xa6\x18\xfc\x64\xc9\xe8\xf5\xf8\x31\x09\x7a\x05\x3a\xf1\x9d\x7d\xbd\x61\x21\x8d\x92\x67\x42\xc2\xe9\xa4\x2a\x79\xcc\x1b\x14\x89\x12\x72\x2d\x8c\xd5\xca\x79\x3a\x1a\xd7\x3b\x5f\x14\x1b\x41\x80\x9c\x2f\xc0\x53\x0b\x76\x30\xe8\x03\x90\xc6\xb3\x38\xc7\x18\x68\xda\xcc\x59\xbf\x46\x3f\xfc\x48\x90\x16\xbf\x67\xf9\xc9\xd5\x55\x3c\x1e\xde\x17\x15\x28\x13\xfe\x0b\x26\x4b\x65\xdc\xa1\xb2\xb3\x8e\x4b\x80\x9f\x8c\x97\x25\xac\x5b\x1d\x8d\x2e\x56\xbe\xc9\x64\x9f\xe5\x5c\x75\x83\xff\x23\xb0\x43\xd6\xf3\x76\x86\x28\xf1\xf0\x51\x63\x37\x82\x4a\x5a\x56\xb4\x09\x52\x0a\x6a\x6c\xb7\x7e\x4f\x5f\xc2\x0b\x9f\x68\x99\xe0\x0a\xb2\x2d\xb1\x0d\x18\x2f\x09\xb8\x1e\x94\xf3\xad\x56\x8a\x0b\x81\x24\x4d\xf3\xf1\x85\x5c\x6e\xf2\x22\xa4\x1a\x51\xb6\x2a\x46\x49\xbb\x82\x69\x0a\xb6\x5f\xac\xac\x0d\x81\xd6\xfe\x02\x60\x11\x70\xa8\xdb\x62\xcb\xc5\xec\x99\x55\xd7\x71\x1a\x1c\x39\x65\x6a\x9f\x6e\x1f\xb6\xbc\x18\x3d\x9b\xea\x15\x03\x53\x1f\x17\x36\x27\x68\xbb\x84\x1f\x9d\x21\xf1\x3a\x2c\x99\x1e\x55\xdf\xf7\xf2\xb3\x36\xe2\x9e\xb2\x95\x07\x63\x8b\xdc\xad\x7b\xb3\x1c\x69\xe9\x09\x20\x7e\xba\xbc\xc6\x53\xff"}, +{{0x6a,0xcd,0x93,0x9e,0x42,0x22,0x26,0xcc,0x54,0x43,0xd4,0xaa,0xbf,0x58,0xc1,0x1a,0xf6,0x50,0xcb,0x40,0xb9,0x64,0x8b,0x4d,0xa3,0x8b,0x92,0x7b,0xff,0x9a,0x58,0xdb,},{0x4c,0x0b,0x91,0x75,0x6b,0x9e,0x20,0x6f,0x78,0x63,0xb1,0x55,0xff,0xc5,0x50,0x9b,0xb5,0x24,0x77,0xce,0xac,0xd0,0x1c,0xa0,0x11,0x43,0x51,0x53,0x67,0x86,0x46,0xcc,},{0x79,0x99,0x58,0x77,0xed,0x24,0xc7,0x91,0x68,0x4f,0x29,0x84,0xbd,0xf9,0x60,0x9c,0x3f,0x7b,0x57,0x6c,0x57,0xd1,0x62,0xee,0x62,0x2d,0x4c,0xe8,0xf3,0x6d,0x9c,0x55,0x73,0x16,0x9d,0x88,0x01,0x21,0x6f,0x1c,0x46,0xff,0xe2,0xf6,0xe2,0xc0,0x90,0x48,0xe4,0x7d,0x4b,0xeb,0x99,0x7e,0x9a,0xbc,0x4a,0xbb,0x12,0x9f,0x9b,0x79,0x69,0x0a,},"\x82\x50\xd5\x31\xcf\x2b\x66\xaa\xc2\xb3\x78\xd5\x4b\xc5\x7f\xd3\x29\xad\x5a\x41\x4a\x59\x92\x55\x89\x8b\x3c\x3b\x45\xbf\x9c\x0d\x2c\x77\x54\x75\x66\xb6\x60\xee\xcc\x76\xa6\x95\xa2\xd6\x08\xab\xf1\x1a\x5f\x6d\xb3\xe6\x07\xfd\x5a\x21\x71\x4b\x0f\xad\x5d\x81\x4c\x01\x5e\xbf\x48\xbb\x73\xad\x75\xda\x9c\x03\xc4\xaf\x54\x89\xe7\x82\xb6\xbf\x79\x08\xa1\xbd\x52\x8d\x7c\xe7\x88\xa1\x8b\xa3\x52\x8e\x35\x37\xaa\x7b\xbf\x75\xf6\x52\x4b\xbd\x19\xa5\x30\x4b\xa2\xa4\xa3\xee\x58\xc4\x1f\xec\x31\x32\xee\x65\x01\x64\x12\x15\xef\xf7\x46\xd7\x80\x0c\x4d\x33\xf5\x2b\xe8\x35\x7e\x0e\xe7\x58\x04\x1d\x91\xcf\xe4\x3c\x60\xc3\xce\xdc\x09\xb0\xd4\x6d\x4c\xfb\x9a\xe2\xa0\x23\x9b\x6f\x33\xc6\x94\x1c\xff\x35\x37\x26\x70\xee\xf5\xc8\x85\x9a\xb6\x5b\x6e\x9f\x7e\xbc\xe3\x2f\xa1\x5a\x9a\x47\x7a\xec\xdc\x96\x83\xa1\xe3\x3a\x1e\xdc\xdc\x90\xd4\x20\xa3\x1e\x78\xc1\x53\xd2\x60\x20\x87\x1d\xaa\x4f\xff\x28\xac\xc3\xf1\x1a\x72\x06\x78\x88\x06\xb6\xfa\x02\x34\x68\xea\x5a\x3d\x18\x6d\x10\xf0\xdd\x56\x77\x96\x66\x3b\xa3\x7c\x83\x2f\xe7\x5a\xae\x7d\xcc\xeb\xf3\x19\xf9\x36\x00\xc4\x6a\x22\xf5\x72\x23\x81\x2d\xdd\x0a\x68\xd7\x6b\xaf\x5e\x27\xa9\xfc\x8b\xd6\x8c\xc1\x0b\x5b\x51\x51\xd6\x2b\x41\xf9\x34\x8e\x21\xb7\x15\x35\x2f\x26\x30\xb6\x17\xf8\x13\xb0\xc2\x89\x96\x28\x59\x04\xcf\x29\x4e\x9c\x28\x56\xb1\x7b\xa3\x5f\x9a\x82\x19\x8b\x82\x14\xa0\x35\xe2\x89\x6d\x65\x68\xbe\x42\x39\x2c\xce\xf3\x2c\xd4\xeb\xfe\xeb\xf1\x2b\xe0\x12\x52\x06\xbb\xe8\x93\x36\xd3\xe7\x62\x99\x1d\xfa\xb6\x8f\xc9\x9d\xc1\x64\x9b\x89\x13\x83\xdb\x31\xfa\xb6\x49\xe6\x28\x82\x3f\x45\x98\xcb\x63\x6a\x38\xfe\x1d\xf7\x3e\x68\xd7\x42\x5f\xc5\xd2\xeb\x55\xa0\xfd\x1b\xc9\xf5\xce\xaa\xbd\x6d\xd4\x1f\x23\xe4\xf0\x86\xc6\x92\x63\x3d\xc3\xc4\x61\x9a\x97\xab\x0e\xad\xa1\x71\xf8\x4a\xdf\x20\xec\xc8\xec\xd4\x7c\x51\xcc\xa3\xe5\x9d\xd8\x09\xb0\xae\xaa\x73\x0d\xf9\x4b\xe3\xba\xcf\xd8\xee\x88\x8b\xba\x9d\x57\x08\x50\x65\x2c\xd4\xd5\xe6\xc5\x52\xa5\x7e\x9f\x48\xa2\xb0\x6a\xac\xdc\x70\x8d\x84\xa3\x76\xfb\xc6\xc9\x4b\xa6\xbf\x64\xa5\xf0\x18\x80\x0a\x7c\xc8\x51\x24\x5a\xed\xb2\x03\x78\xb3\x29\xac\xeb\xb2\x97\x7c\x13\x98\x08\x2b\x3a\x0e\x5e\x2a\x9c\x24\x84\xfa\x30\x1d\x30\x37\xa8\x22\x4d\xdc\xc0\x95\xb1\xdb\xd8\xa2\x31\x5b\x55\xbf\x33\x18\xc2\x78\x10\xef\xc3\xd8\xe2\x5f\xa7\xa8\x78\x9b\x73\xa4\xf5\x50\x59\x08\x0b\x08\xab\xb3\x69\x9b\x7b\x86\x26\xcb\x2a\x78\x0d\x97\xcc\x1c\xa8\x03\x28\x51\xba\xf4\xed\x8b\x64\xfc\x43\x30\x86\x5f\x84\xcc\xb1\x2a\x3d\xae"}, +{{0x4d,0xef,0xf6,0x47,0xcb,0xc4,0x5e,0xca,0xed,0xc3,0xf7,0xdd,0xf2,0x2c,0x16,0x7a,0xf2,0x4e,0x3d,0x63,0xda,0x22,0xb0,0xe6,0xa5,0xb8,0x43,0x9c,0x0f,0x3b,0x19,0x34,},{0x0c,0x27,0xc9,0xd7,0x7a,0xc8,0xc7,0x25,0xbb,0x06,0x63,0x93,0x3a,0xb3,0x0d,0x1a,0xad,0x09,0xcb,0xcf,0x2c,0xd7,0x11,0x6c,0x60,0x85,0xa8,0x49,0x9f,0x70,0x14,0x02,},{0xdd,0x54,0x89,0xfd,0xe4,0xba,0x87,0xd1,0x17,0x3d,0x4c,0xee,0x06,0x82,0xaf,0xdd,0x4b,0xad,0x80,0xdd,0x77,0x0e,0xa7,0xd0,0xdc,0xeb,0xaf,0x21,0xac,0xc6,0x1d,0xd6,0x32,0x4a,0xca,0x29,0x5e,0xd0,0xe2,0x3a,0x91,0x5e,0xcf,0xda,0xd5,0x0f,0x17,0x5e,0xbc,0x51,0x6f,0x1b,0xe5,0xb6,0xd8,0x7d,0x90,0xbb,0xe3,0x86,0x22,0x49,0x53,0x02,},"\xd6\x20\x1e\xbc\x21\xce\xc1\xe9\xbc\x28\xf9\x57\xc9\xd0\x29\xcc\x38\xf9\xe8\x5e\x06\xdf\xc9\x0b\xf2\x97\xe6\x1f\x2b\x73\xb4\x07\xd9\x82\xa6\x6b\x91\xe9\x4a\x24\xe9\x1d\x06\xab\x8a\x5c\x07\x9d\x0f\x69\xbe\x57\x88\xea\x8f\xea\xce\xbd\x91\x72\x91\x19\x22\x33\x86\x2e\x6a\xcd\xa1\xe8\xcf\x9a\x48\xbf\xfb\x54\x91\xdd\x65\xaf\x54\x1b\x6c\x72\xaf\x68\x1a\x81\x82\x3d\x98\xa0\xab\xee\xb6\xba\x9f\x95\x46\x5b\x84\x11\xf9\x9e\x11\x9c\xd2\x84\x79\xda\x98\x42\x59\xbd\xf8\x6c\x9f\xef\x3c\xca\x34\xe2\x24\x69\x1f\x18\x3c\xf0\x95\x03\x77\x27\xda\x9c\xad\x29\xf2\x42\xf8\x3e\xb4\xf7\x36\xe2\x7f\xdf\x67\x01\x8d\x71\x1b\x74\xc4\x5b\x29\x55\xa6\xa7\x6e\xc1\x53\x30\xdf\x5b\xad\x80\x30\xc6\xb3\xa8\x8d\x72\xf2\x84\x47\x65\x2a\xc8\x90\x2b\x5b\x76\xcb\xf6\xb9\x45\xce\xab\xfe\xc0\x4a\x9b\x8c\xb3\x0f\x43\xd9\xeb\x77\x3e\x67\x05\x59\x4f\x0d\xe1\xb7\x0f\x1a\x20\xc9\x9f\xc4\xb1\x22\x1f\x8c\x81\xb0\xbc\x30\xda\x12\xcd\x5d\xea\x8f\x4d\x90\xf1\x3a\x81\x1a\x2c\xc1\x1a\x96\x84\x6a\xaf\xb4\xc4\x2a\x00\xe9\xae\x7d\xa2\x56\xa0\xd2\x2b\x19\x8a\xfc\x25\xcc\x10\x41\xd2\x4e\x05\x6c\xf3\x87\x60\x1d\x7b\xf7\xeb\x31\x82\xd6\x05\xfe\x5e\x63\xb1\x8d\x53\x1a\x5f\x84\xe5\xdb\xd0\x18\x4a\x76\xc6\xc4\x67\xa8\x26\x3a\x98\xb5\xc0\x05\xfc\xb2\xaa\xf9\x89\xf5\xcb\xd0\xa9\xd9\x03\xfc\xfc\x60\x9d\x6e\x57\xd9\xc4\x39\x02\x1c\xea\x93\xe4\xc4\xe9\x91\xf1\x93\xca\xf3\x24\x37\x70\xb3\x25\x78\x74\x80\x76\xb7\xf4\xcb\x97\xf1\x7c\x17\xa7\x9b\x82\x25\x3c\x24\x23\xdb\x69\x8c\xd0\xa3\x3a\xb3\x3b\xb0\x9b\x0b\x08\xcb\x8c\xea\xdc\xa1\xe2\x9c\x5d\xe2\xfc\x12\xb2\x40\x7b\x6c\xc5\xaf\x5a\xe9\x76\xdd\x3e\xc6\x30\xd8\x33\x9b\x7d\xd1\x1f\xa3\x4c\xaa\xc1\x50\xc7\xc4\x79\x1d\x8c\x42\x7b\x0a\xd9\x2e\x05\x29\x06\x7a\x88\xd5\x20\x11\xe1\xe0\xa1\x82\x99\xb9\x69\x89\x6f\x8b\x83\x60\xf7\x5c\x45\xc4\x96\xda\x47\xb0\x9b\x45\x0f\x98\x22\xbc\xbc\xd4\x3f\x42\x93\xc5\x16\x80\x2b\xf7\x47\xc4\xab\xee\xdf\xaa\x3e\x79\xcb\x91\x03\xd3\x77\x0f\x56\x07\xb7\x75\x16\xe5\xb1\xce\x0f\x64\xb6\xee\xc7\xbe\xc3\xc6\x47\xc0\x06\x95\x6d\xc5\x5b\x6c\x79\xf6\xaf\xb3\x9d\x1f\xc3\xec\xf1\x1b\x97\x4b\x44\xae\xdb\x72\xae\xd1\x31\x66\x35\x08\x3c\x21\x24\x50\x2e\x5c\x72\xd8\x6e\xca\xb6\xac\x90\x24\x3e\xb3\x9a\x6a\xa9\xcb\x94\x80\xda\x38\xe1\xed\xb8\xd2\x8f\xf9\x09\x24\xc0\x5d\x5d\x21\xaf\x5a\xf9\x59\x57\xb8\x02\x07\x81\x37\x87\x11\xa2\x9d\x09\x20\xac\xad\x8c\xcb\x39\xa3\x11\x69\x32\x78\xc9\x90\x0b\x47\x0d\xa2\xbd\x4c\x12\xa0\x1d\x73\x96\x26\x44\x01\x7b\x60\x34\x71\x3b\x2a"}, +{{0x5a,0x19,0xbf,0x6c,0x94,0x1f,0x39,0x4e,0x93,0xbd,0x36,0x25,0xfb,0x81,0xcd,0x9d,0xa8,0x1c,0x90,0x20,0xb1,0xc5,0x31,0x25,0x7a,0x7b,0x59,0x57,0xbb,0x07,0x92,0x11,},{0x20,0xe8,0x69,0x9d,0x08,0x7c,0xe5,0xe8,0x15,0x1d,0x28,0x05,0x3d,0xce,0x66,0xc2,0x3f,0x28,0x08,0x1f,0x35,0xbd,0x26,0x81,0x9b,0xbe,0x85,0xd3,0x8a,0x09,0xd7,0x02,},{0x2a,0x2f,0xd6,0x05,0x4e,0xf4,0xe7,0x9b,0x72,0x19,0x1a,0x0c,0xcb,0xd2,0xb1,0x8a,0xeb,0xab,0xe8,0xb9,0xa7,0x18,0x61,0xde,0xd9,0x8b,0x7c,0xdc,0xb6,0xa6,0x25,0x53,0x28,0xbc,0x1a,0xec,0xb0,0xc9,0x33,0x57,0x21,0xa9,0xa9,0x6e,0xe4,0xb5,0xb4,0x3f,0x90,0xd3,0x22,0xec,0xf8,0x35,0xf7,0x8b,0x26,0x4d,0xae,0x6e,0x38,0x7b,0xfb,0x04,},"\xf7\x21\xca\x3a\x32\xc1\xe8\x1c\x9c\x6f\x46\xd5\xe1\xfb\x50\xe7\xce\x2f\x4e\x70\x93\x33\xca\x2b\x55\x0d\x52\x13\xb6\x77\x3d\x67\x0c\xa5\x9a\x2b\x50\x86\xa4\x43\x84\x3a\xc5\x08\x13\xb2\x44\xc9\xc9\xfa\xc6\xd1\x19\x69\x89\x27\x81\x35\x12\xc8\x4f\xe3\x0a\x89\x55\x30\x10\x13\x8f\x91\xe8\x17\x6f\x5c\xf2\x57\x89\xd7\x28\x1d\xdb\x83\xa2\x46\x70\x5d\xcc\xb9\x99\xc4\xcd\x0a\xe2\x19\xc6\x45\xf6\xd7\x1d\x45\x1a\xe1\xf8\xd2\xf9\x89\x1a\xf8\xcc\xce\x03\xf4\x38\x55\x9f\xb8\x36\x67\xb8\x07\x7f\xbe\x43\x5a\x74\x4a\xf0\x19\xd6\xd1\x39\x9f\xd2\x13\x7f\x5a\xfb\x8e\xf3\xf4\x7b\xcf\x73\x5e\x7c\x9e\xd8\xa5\x4b\xa0\xc1\xc6\x56\xb6\x65\x0b\xb3\x0a\xdb\x1d\x57\xec\xd2\x07\x46\x39\x49\x42\x31\xa2\xe9\xe2\xf9\x85\xed\x84\x22\xee\x03\xcb\x3f\xd7\x38\xc7\x35\xa1\xb8\x28\x06\x04\x74\x60\xed\x84\xf7\x46\x8c\x3c\x64\xb3\x5d\xb0\x6b\xc5\x8d\xe4\xbb\xa4\x63\xe6\x38\xa9\x41\x33\xdf\x10\x6a\xc4\xf4\x70\x36\x1c\xcd\xe4\x41\x57\x29\x9d\x22\x5b\x17\x79\x88\x91\xba\xf5\x92\x19\x86\xa2\xba\xe3\x26\xdd\xa0\xb8\x96\x17\xc6\x77\xbd\x14\x08\xba\x27\x48\xba\xa6\x7c\x8a\x2c\x5a\x96\x9b\xc0\x0c\xb4\x0d\xbf\x49\x0e\x07\xe2\x2c\x91\x3a\xfd\xde\x63\x04\xa0\x7f\xc9\xe6\x08\x46\x99\x24\x56\xbf\xb0\x66\x3a\x09\xde\xf6\x8d\xef\x67\xa1\x6d\x29\xe9\x8c\x7b\x55\x35\x18\x48\xa8\xcf\x92\x31\x0c\x74\x63\xc4\x75\xf2\x49\xc6\xf7\x55\x7f\xd0\xd7\x55\xca\x88\xf8\x77\x84\x7f\xe0\x76\x57\x56\xac\x34\xa2\x3f\x78\x40\xd9\x5c\x3d\x29\x4e\x66\x3b\xb1\x51\x8b\x75\x92\x7c\x41\x07\x57\xe0\xf5\xc0\x7c\x5a\x7f\xb2\x15\xdc\x72\x07\x43\x3e\xbf\x79\x1e\xdf\xce\xc9\x0e\x93\x0f\x8e\x3b\xa9\xdb\xbb\x98\x54\x13\xc2\x23\xbe\x87\x87\x3b\xd3\x23\x99\x75\x81\x80\x4d\x88\x96\xda\x38\x6a\x6e\x91\x20\x05\x0a\x0e\xae\xd3\x12\x40\xaa\x17\xc7\xb6\x69\x4c\x30\xcb\xcc\x3c\x69\x56\xa6\x82\x0f\xc9\xab\x21\x87\x55\x33\x96\x3d\xc3\xb0\xd8\x83\x58\x27\x12\x76\xc6\x05\x65\x28\x91\x0d\xd9\x89\xae\x0c\x33\x0d\x17\x98\xf7\xd8\xe7\xd1\x18\x4b\x84\xa8\x14\x34\x32\x5b\x8c\x30\x2e\xdf\x60\x1d\xc5\xe6\xf8\x47\xfb\xac\xbd\xee\xff\x78\xc6\x62\x1d\x1d\xaf\xdc\x23\x9b\x18\xb8\xc1\xaf\xdc\xb4\xb9\xda\xbd\x5d\x3a\x92\xa9\x32\xea\x15\x99\x54\x6e\x62\x5f\x96\xd6\xec\x6f\xb1\xcc\xcb\x76\xb4\x76\xb3\x30\xac\x59\x25\x9c\x63\x4f\xac\x9b\x3f\xa7\xde\x7a\xe7\x05\x37\x73\xb5\xbe\xfa\x00\x1b\x04\x92\x9f\x74\xb7\x12\x41\xe1\xb2\x57\x69\x6d\x65\xa2\x6c\x1b\x4a\xc8\x6b\x7b\x1f\xbd\x69\x57\xfb\x9b\x95\x08\x4c\xe7\xd7\x00\x90\xf5\x5d\x44\x53\x46\x94\x30\x5e\x91\x76\x9a\x82\x94\x13\x04"}, +{{0xb5,0x06,0xc0,0x1d,0x69,0x74,0x6e,0xb4,0xbc,0x63,0x58,0x72,0x0e,0x43,0x8a,0xd3,0x30,0xc8,0x8b,0x60,0x5a,0xad,0x65,0x2f,0x47,0x99,0x57,0x3a,0xb0,0xa1,0xaa,0xf9,},{0x7a,0xc8,0xb6,0x88,0x63,0xbd,0x69,0x15,0x15,0x83,0x78,0x9d,0x86,0x4a,0x73,0x57,0xe3,0xa0,0x45,0xfa,0x86,0x52,0x2a,0x9d,0xaa,0x6e,0x26,0xfb,0x79,0xed,0x6d,0x23,},{0x17,0xa1,0x9d,0x26,0x91,0xb7,0xb0,0x46,0xd7,0xb1,0x96,0x69,0xad,0x73,0x14,0x0d,0xb9,0x2f,0x0c,0x97,0x8c,0x7f,0x61,0xbc,0x38,0x67,0xd9,0x2c,0xa9,0xd4,0x75,0x80,0xa0,0x38,0x0b,0x59,0x01,0xba,0xd8,0x2a,0xf4,0x5f,0x67,0x6f,0x74,0x28,0x73,0x01,0x98,0x0f,0x71,0x87,0x1a,0x42,0x26,0x1d,0xbe,0x08,0x02,0x95,0x03,0x36,0xe6,0x0b,},"\xf7\xfc\x18\x06\x6e\xd0\x4b\x30\xe6\x33\xd9\x86\x5d\xa3\x21\x4b\xec\xa6\x0b\xd7\x96\x01\x9c\xd7\xec\xc9\x18\x66\xf9\xef\x24\x46\xc1\xfa\xb0\x6d\x86\x51\xbe\x7f\x10\x1a\xec\x7b\xb8\x4e\xe2\x1e\x71\xad\x02\x02\x15\xfc\xfb\x36\xf2\xd1\x1e\x45\x79\xac\x39\xf8\xe2\xb1\x29\x0e\x38\x96\xd5\x22\xbc\xf5\x13\xaa\xa0\x67\x71\xf8\x6e\xe2\x28\xcf\xf3\xa2\x0a\x1f\x10\xc5\x64\x33\x95\x89\xbb\xa9\x60\x53\x44\xc0\xa6\xe6\x82\xad\x5b\xa4\x0d\x10\x41\x94\x1b\xc4\x6f\x98\xb9\xd0\x9c\xa1\x7f\x8f\x04\x4e\x98\x3b\x8a\x49\x08\x93\x3d\xf2\x26\x3c\xf7\x88\x11\xc2\x4c\x8f\x48\x14\x35\x4f\x6f\x4c\x68\xb7\xee\x7b\x78\x30\x82\x93\xbf\x78\xfd\x0f\xf1\x22\xf0\x95\xc1\x4a\x73\xa5\x97\x97\x17\x2a\xe0\x5c\xfc\xec\x19\x56\x3e\xb1\x8d\x2b\xc5\x30\x0e\xd4\xbf\x6b\xdc\x44\x3e\xa9\xb8\xbc\x1c\xbe\xde\x94\xca\xb9\x05\xed\xa5\xa6\xa9\x31\x59\x7d\xe4\x02\x14\x6f\xac\x9c\xf8\xcd\x6a\x8d\x10\x46\x69\xf9\x13\xfa\x83\x40\x01\xca\x4d\x09\x0f\xb7\x94\x9d\x31\x09\xa6\x3c\x05\x49\xb0\x3f\x15\x1b\x71\x17\xc4\xf4\x69\x74\xba\x59\xc6\x82\x96\xed\xfd\xde\x76\x92\xee\x43\x2a\xce\xf7\x61\x06\x47\xe0\x95\x78\x65\xe6\x2c\x1a\x0c\xf0\x56\x59\x82\x3a\x55\x45\x2d\xd5\xe4\x71\xb3\x1c\x5a\x49\xab\x05\xb5\xaa\xfd\x5a\x0e\x53\x0e\x89\x6b\x58\xcc\x52\x2e\xcf\x19\xe5\x2e\xc8\x2f\xa1\x47\xf9\xe3\x85\x17\x4c\x7e\xc3\x3d\x1d\x9b\x86\x93\x4a\xeb\x4f\x6c\x57\x00\xf7\xd5\xeb\x33\xff\x73\xc9\xfc\x6a\xa4\x7d\xf5\x1e\x09\x22\x9e\x6a\xe8\x94\xe8\x6c\x81\x8b\xef\x06\x5f\x82\x59\x71\xa4\xcb\x90\xad\xfe\xfb\x31\xeb\xd9\xd1\xb7\x94\x22\xdc\x98\x68\xf9\xf7\x4e\x7a\x32\xcd\x40\x71\xef\xb6\x9b\x27\x23\x3e\x6e\x5c\x60\xde\xdc\xd5\x32\x1c\x03\x0a\x46\xcd\x26\xf5\x60\x2c\xac\x74\x7e\xe4\xb5\x22\xd8\x57\xa3\x32\x1a\x03\xf4\x03\xa6\x00\x62\x50\x40\x63\x61\xe4\x88\x15\xaf\xba\x77\xce\x08\x90\x34\x41\x84\x5b\xa8\x72\x25\xd8\xb2\x40\x46\x74\x5d\x40\x65\x64\x5a\x1b\x98\x41\x0c\xac\x48\xd1\x37\xcb\xbb\x8a\xb1\xeb\xa5\x0d\xa9\xc2\x31\xe9\xac\xf3\x22\xa6\xdb\xec\x0e\xf4\x16\xa4\x46\xc3\xb6\x10\xd9\x35\x69\xfd\xf4\x5a\xa6\xcd\xc1\xb6\x40\xd8\xf3\x01\xd7\x86\x93\xb2\x82\x6c\xc6\xed\x46\x85\x68\xad\x9a\x0f\x94\xaa\x9b\x9f\xb9\x2f\x7e\x78\xd4\x84\xfd\xf5\xd8\xd4\x5c\x99\x1e\x28\x07\x4d\xcd\xd6\x80\xd3\xb1\xf1\x89\xef\x6b\xdc\x32\x0e\xe6\xe6\x4d\xd1\xf8\x0d\x92\x64\xd8\x30\x42\xd2\xc4\x3d\x83\x58\x1e\xf0\x39\x4b\x1b\x5d\x1f\x69\xf3\xbb\xbf\x04\xb7\xc8\x08\xba\x34\xc1\x58\x0f\x16\xf7\x65\x37\xb6\xa7\xeb\xd0\xa1\x90\x8b\xe9\x49\x4d\x3f\xca\xa9\x87\x1d\xb1\x57\x50"}, +{{0xe1,0xcc,0xb8,0x0a,0x26,0x2f,0xf8,0xaf,0x1e,0xda,0x07,0x5c,0x97,0x2c,0x8e,0x94,0x1e,0x77,0xce,0xf5,0x7b,0xdb,0x0a,0x82,0x57,0x2c,0x28,0x20,0x0b,0x49,0x3c,0xa3,},{0x3d,0x37,0xe2,0xa5,0x02,0x7e,0xff,0xde,0xe0,0x7f,0xa5,0x11,0xe4,0x23,0xb2,0xbc,0x56,0xed,0xce,0xa0,0x75,0xb4,0x16,0x49,0x76,0x67,0x25,0xc6,0xb3,0x0a,0x10,0xf4,},{0xfd,0xa3,0x4b,0x65,0x2b,0x79,0x74,0x6f,0x89,0x7e,0x22,0x2d,0x37,0xb7,0x7a,0xa2,0x50,0xd0,0x2c,0x52,0x7c,0x48,0x33,0xdf,0x80,0xea,0x41,0xd5,0x21,0x89,0xd5,0x07,0x00,0xe1,0x28,0xb7,0x8e,0xe8,0x14,0x9c,0x9b,0x19,0xf3,0xab,0xf7,0x55,0xac,0xef,0x53,0x48,0xf5,0xfb,0xaf,0x1c,0xeb,0x41,0xc0,0x38,0x90,0x6a,0xc5,0x94,0x60,0x01,},"\xcf\xdc\x54\x97\xb0\x23\xaf\xa6\x2a\x7f\xe5\x92\xca\xa9\x2b\x87\x5c\x77\x05\x74\x78\x34\x00\x2f\x77\x84\xff\x16\x61\x89\x39\x88\x15\xd4\xe8\xa7\xa0\x03\x8e\x1f\xda\xdd\xde\xba\x51\x05\x73\x27\xad\x19\x60\xe8\x59\xce\xe5\x65\x26\xbb\xb4\x12\x7b\x6a\x5f\x90\xd0\x4d\x08\xb1\x5e\xee\x66\xc9\xcc\xf8\x8b\x4b\x7d\x1e\xe9\xd3\xb8\xb8\xc6\xf4\x2d\xb3\xc3\x4e\x59\x04\x8a\x15\xc6\x04\x1f\x14\x2c\x40\x79\x36\x8b\x7b\x11\xe2\x99\x70\x11\x8b\x99\xe5\x67\x0a\xe3\x1f\xcc\xfd\xff\x13\x99\x14\x2e\xe0\x6b\x2e\x3e\x2b\x3c\x97\x07\xdd\x64\x11\x97\x86\xe2\xfa\xb4\x7e\x0b\xad\x2c\xc8\xb5\x58\xd9\x63\xbb\x48\xa4\x9a\xd2\xc6\x37\xdd\x35\xb2\x5d\xb5\x4b\xc5\xa2\x63\x02\x22\xfa\x2a\xce\xce\x9c\xe1\x2a\xb0\x81\x30\x77\xf7\x65\x9f\x50\x74\x42\x9c\xa6\xb4\x94\x33\x10\x32\xae\x79\x2a\x59\x9c\x42\x5e\xe2\x97\x45\x1d\xcf\x5e\xe1\x95\x29\x03\x12\x74\x2e\x64\x7a\x77\x95\xb8\x4d\xcc\x66\x4d\xda\xe2\xa1\xfb\xf8\xc4\x54\x8a\x37\xfd\x82\xd8\x10\xe2\x14\x5f\x01\xdf\x1a\x6d\x3b\xcc\x42\xa9\x1a\x10\x76\x8e\x09\x1f\x3d\x69\x32\x9a\x7b\xad\x6c\x07\x2c\xac\x6d\x89\xaf\xa3\x1c\x02\x90\x56\xd6\xb6\x22\x12\x16\x5c\xeb\xcd\x49\xac\x67\x2e\x38\x30\x26\x7a\xf9\xf2\x8e\xa3\x19\xbd\x04\x2f\x6c\x59\xde\x47\x01\xe5\x82\x48\x73\x6c\x8d\x97\x6a\xcf\x93\xb9\x9d\x2f\x46\x47\xa5\x47\xd3\x92\x44\x7a\x48\xda\xc1\x11\x81\xe1\x6b\x15\x01\xa9\x4c\x93\x16\xe5\xa6\x7c\x99\x0b\x35\x81\x0b\x4c\xda\x04\x73\xa6\xa4\xe5\x76\x14\x21\x58\x68\xe2\xe0\x02\xc6\x05\x8b\x42\xe4\xee\xec\x84\x13\x9d\xc1\x9e\xdf\x5f\x80\xae\xef\xfa\x4f\x5b\x07\xe8\xfd\x23\x13\x9e\xdd\xa3\x18\x99\xeb\xe6\xfe\xe7\x86\x43\xce\x68\x6b\x29\x63\xa3\x20\x72\xbd\x3b\x3b\xba\x68\x48\x5a\x05\xc2\xcc\x04\x56\xc3\xda\x50\xc7\xc8\xc6\x51\xa3\x06\x6d\x13\xa3\x66\x0b\xd4\x7a\xb6\xdf\xec\x49\xe0\x15\x57\xa6\x74\x28\x96\xaa\x4b\xc6\x36\x3a\x79\x7d\xba\xd1\xa4\x09\xcd\x4a\x50\x91\x1e\x70\xea\x00\x7a\xf8\xe9\xb1\xbb\x7e\x3a\xb5\x62\x15\xa5\x75\xc9\x0f\x73\x9c\x2d\x48\xb3\xb3\x46\x94\xb5\xac\xdf\x07\x98\x0a\xe5\x28\xde\x06\x21\xed\xfa\xc8\xb8\xfa\x84\x95\x4d\x56\xdb\xb4\xd0\x30\x82\xb9\x84\xf1\x3e\x5d\xbe\x9c\x71\x12\xff\x97\x16\xf5\x50\x53\x06\x46\x62\xce\x0f\xb8\x1e\xa3\x5f\x98\xfd\x2c\xd5\x11\x37\xa4\x6f\x64\xe0\xc1\xca\xf4\x4e\x54\x07\xdc\x96\x17\x60\xb2\x59\x7f\x7f\x92\x00\x61\x7d\x47\x13\x40\xcf\x15\x17\x6c\x3d\xa8\x80\xfe\x4e\x0e\x93\xa7\x2f\xb9\x49\x26\xfa\xed\x86\x5d\xfd\xc7\x72\xe1\x85\x29\x2c\x1e\x36\xb1\x21\x17\x81\xc3\xe9\x38\xe3\xd4\xf2\x4e\x29\xaf\x51\x7a\x37\x96\x83"}, +{{0x4f,0xc5,0x12,0xef,0xd8,0x6e,0x3a,0x63,0xb3,0x95,0xea,0xff,0x1b,0xa0,0x11,0xe1,0x59,0x0f,0xb9,0x32,0x6a,0xd3,0xff,0xed,0xe7,0x87,0x6d,0xcc,0x3e,0x9f,0xab,0xdc,},{0x26,0xc2,0xa2,0x2f,0x9b,0xfa,0xd9,0x06,0x06,0xdc,0x61,0x3f,0xf1,0x07,0x02,0x1f,0xcd,0xdb,0xec,0x72,0x37,0x06,0x66,0x60,0xb4,0x88,0x96,0x43,0x49,0xe0,0xc8,0x28,},{0x82,0xc8,0x24,0xa7,0xd1,0x13,0x9e,0xc7,0x3a,0xe1,0xd0,0x23,0xad,0xf6,0x28,0x11,0x44,0x1e,0x96,0x82,0x87,0xf1,0xa5,0x80,0xb8,0x59,0xcd,0x66,0xcb,0x33,0xb5,0x8e,0x40,0x9b,0xde,0xb2,0xa8,0x74,0xbf,0x4c,0x23,0x61,0x0b,0xd4,0x4f,0x69,0x31,0x47,0xf2,0xf7,0xc2,0x9d,0x44,0x3a,0x90,0x50,0x84,0xf3,0xea,0xaf,0xd9,0x33,0x0e,0x04,},"\x07\xcd\x1e\x9b\xfa\x38\xa7\xd8\x85\x34\x65\xa9\x3c\x77\xab\x4f\x30\xfa\xf9\x14\xe4\x8b\xc4\x76\x3b\xa0\x7b\xf9\x6b\xa8\x08\xc1\xf5\x9a\xd4\xce\x9b\x7d\x92\x1f\xbb\xc7\x79\x65\x9d\x7c\xa3\x6e\xdb\x7d\xd3\xac\xf7\xa2\x94\x52\xa8\x45\xb4\x9f\xb6\x54\x3a\x3b\x6c\x5c\x1c\x29\x3a\xff\x61\x84\x85\xa1\x0e\xea\x60\xee\x96\x49\xac\x9d\x48\x1e\x69\x49\x96\x7d\x39\x38\xb5\x2f\xe0\x9c\x36\xb9\xad\xe0\x75\x81\xdb\x4e\xb5\x42\xa9\x7f\x5a\xc8\xac\x73\xd3\xee\xa1\x84\x72\x25\x56\x76\x0c\xf4\x83\x09\x05\x64\x55\x30\x61\xb9\x0a\x0b\x6d\x2d\xff\x47\x07\xbe\x76\x39\x37\xa1\x05\x94\xa8\x2b\x76\x6b\xb2\xcf\x6d\xaa\x52\xfa\x8d\x7b\x48\xf3\x21\x27\xc4\x31\xad\x9a\xae\xd3\xbf\xde\xb9\x9a\xd4\x21\x18\xa1\xb4\xde\x7b\x99\x21\x34\xed\x9c\xda\xd0\xb5\x29\x6d\x19\x7a\x48\x5e\x49\x3e\xcf\xec\xa3\x65\x3a\xd2\xce\x0f\x92\x41\xaa\xbc\x09\x6d\x7c\x4b\xa6\x03\xba\x7d\xdd\x07\xa8\xb2\x57\xfe\x52\x32\x76\x41\x70\x73\xa6\x5f\xa4\x43\x42\x56\xfd\x1f\x23\x9e\xc1\xde\x5d\xa1\xa0\xa8\xc5\xe6\x86\xee\x14\xd9\xdf\xa4\x38\xc5\x3b\x99\xc9\x54\xaf\xab\x2f\x79\xe6\x0b\x71\x26\xf2\xcb\x58\xa2\x6e\x29\x0d\xa1\xdc\xcf\xc3\x01\xf2\x39\x74\x8e\xde\x7b\xcf\x1b\xb7\xcc\xb4\x72\x0e\x69\x2f\x57\xe5\x3e\x6f\x59\x07\x53\x99\xe1\x08\x0a\xc8\xaa\x9a\x61\xa5\x68\xc4\xc5\x69\xd3\x6e\x76\xa2\xd7\x27\x1f\x2c\x44\xde\x4e\x36\x3a\x8c\x91\x6a\x4e\x44\x6b\x02\x7b\x64\x39\x2e\x90\xce\xab\xf6\xb6\x07\x1b\xc4\x7a\x13\x79\xb6\xaa\x63\x44\x76\x3b\x2a\x0e\x7f\xf7\xc4\xa2\x7b\xff\x31\x06\x72\x1c\x25\x3e\x4c\x1d\x67\xc3\x7f\xa3\xd7\xc1\xec\xd0\x55\xb8\xe9\x29\xd5\x2a\x8e\x45\xed\x89\xfb\x18\x0f\x74\xb5\x52\xfe\x06\xf0\x66\xc7\xe4\x31\x8c\xa2\xf9\x15\x94\x6e\x83\x20\xd5\x80\x65\x61\x47\x2f\xb8\xff\x7f\xa8\x07\x2d\x8e\x6f\xd1\xce\x63\xcf\x87\x38\x2f\x7b\x94\x04\x54\x0c\x1d\x40\x6c\x70\xb2\x26\x85\x36\x77\x09\x26\x45\xce\x99\x69\x22\xe7\x34\x5d\xc0\x7f\xb7\x33\x9f\x9a\x54\xff\x07\x35\x2d\xd2\xb9\x93\x06\x3c\x2c\x83\xd1\x28\x1a\x4f\xd1\x78\xe5\xa5\xf8\x0a\x5b\x33\xc2\x29\xd0\x57\x83\x67\xd4\x41\x92\xe9\xa4\xd2\x1e\x97\x34\xd3\xbd\xa0\x83\xb7\x0f\x47\x10\x3f\xd1\x25\x17\x70\x21\xdf\x3e\x53\xd7\x99\x86\xef\xea\x2d\xc0\x4f\x02\xc0\xac\x27\x87\x88\x31\x9e\xf3\xa9\x13\x2e\x62\x32\xea\x6d\xb3\x9c\xa5\x87\x08\x55\xf9\x59\x2f\xff\x6c\x20\x9a\xd2\xf1\xc2\x9d\xd1\x68\x55\x28\x98\x97\x9e\xcf\xf8\xc8\x11\x27\x24\x8f\x83\x10\x51\x53\x00\x65\x61\x29\xd9\xb7\xac\xbb\x7e\xd1\xe4\x6b\xc9\x8c\x04\xd1\xa3\x5b\x18\x91\x37\x38\xe9\xdd\xe4\xd2\xb0\x65\xf4\x18\x42\x42\xd8"}, +{{0x0b,0x7d,0xfa,0xd0,0x5b,0xa6,0x65,0x11,0x1e,0x16,0x81,0xbd,0xc0,0xbc,0x8b,0xa9,0x73,0x76,0x7c,0xb8,0x58,0x77,0x02,0x0a,0x2d,0xbf,0x91,0x83,0x25,0x57,0x1d,0x9f,},{0x95,0x05,0xd9,0xe8,0x6d,0xce,0xf5,0x6c,0x9d,0xb7,0x6f,0x28,0x62,0xb9,0x0e,0x1f,0x27,0x73,0x20,0x2f,0x17,0x50,0x40,0x5e,0x7e,0xe5,0xae,0xd0,0xfc,0x54,0xf8,0xb9,},{0x41,0x5a,0xdb,0xb2,0xf2,0xb9,0x84,0x05,0x77,0xfd,0x18,0x41,0xf9,0xaa,0xe2,0x52,0xaf,0xe8,0xf5,0xa7,0x22,0x36,0x01,0x7d,0x50,0xdb,0x22,0xd2,0x28,0xcd,0xee,0x9f,0x5b,0x3e,0x8f,0xe9,0xa1,0x7a,0x4d,0x4e,0x98,0xb7,0x34,0x13,0x81,0xe8,0xd8,0x62,0x5c,0xdc,0xea,0x95,0x6d,0x25,0x3b,0x74,0xe0,0x2d,0xac,0xb8,0x49,0x20,0xa0,0x09,},"\xc4\x3f\xd3\x4b\xb1\x42\x4c\xca\x4e\x4d\xfb\xa7\x5c\x28\xbe\x80\x18\x44\x44\x6c\xa0\x89\x02\x08\x85\xc7\x48\x38\x25\x47\x16\x4a\x9d\x4a\x7f\x95\x70\xd3\xd1\x71\xad\x69\x81\xab\x50\xee\xee\x08\xa4\xa6\xc6\x6d\x76\x99\xd2\x3e\xdb\xe1\xfa\xaf\x44\x66\x0c\x72\xf4\x55\x2d\x87\xd2\x65\xac\xe8\x79\x28\x23\x47\x4b\x90\xa5\xd7\xf7\x40\x1d\xeb\x93\x77\x62\x7f\x60\xb0\x36\xb3\x6e\x04\x4e\xb7\x6b\xf1\x32\xfd\xdf\xcc\x0e\xf5\x70\x4a\x63\x3d\x84\x5e\x96\x2b\x47\x51\x7f\x0b\xaa\x34\xd3\xd6\xe9\xa8\xb9\xf8\x16\x8b\xcd\xc8\x4c\x6d\x2b\x30\xc6\xf3\x43\xe7\x53\x57\xf7\xf2\xc0\x03\x9b\xd2\x54\xb2\x44\xd3\x6c\xd6\x16\x75\x58\x1f\xb8\x34\x57\x0e\xd4\x11\x3a\x78\xe6\x06\xf1\x45\xa1\x11\x99\x2c\x2c\x6b\x61\xc4\x26\x76\x28\xec\x87\xcd\x88\xc3\x6a\x3c\x84\x70\x6e\x44\xae\x96\xa9\x6e\x0c\x84\x80\x31\x85\x46\xd6\xea\x6a\x6d\xf1\x8a\x2b\x4f\x19\xf8\x36\x0c\xfb\xce\x4e\x9d\x1c\xf1\x01\x1f\xfe\xa5\x63\x3a\x66\x61\x9a\xa4\xa6\x5c\xf6\x9b\xe4\x45\x96\x17\x94\x5e\x43\x59\xa9\xd4\x32\x60\xca\x1a\x20\xf4\xed\x7c\x1a\xe5\xff\xff\x3b\xd9\x22\x94\xea\x70\xab\xba\xe0\x38\x5b\x09\x35\xcd\x1c\x0e\xb5\x18\x30\x29\xc5\x85\xa0\x29\x4b\x79\x99\xe3\x2e\xf7\xa2\x90\xfc\xb0\x95\x67\x5d\xc4\xf6\x01\xe8\xf2\xc9\x6f\x35\xb7\x34\x9a\x37\x05\x75\x09\xf4\xec\x70\xc9\xf5\x0f\x60\x11\xf1\xf5\xe6\xb0\x61\xc0\x91\xd1\x1c\x0e\xd5\xde\xc8\xec\xe8\x81\xaa\x34\x05\x08\xf6\x96\xd9\xe9\xcc\x72\x98\xe6\xbc\xcd\x7c\x21\x0e\x2c\xe0\xde\xd8\x35\x92\xa3\xcf\xa1\x3e\x80\x78\xfd\xb3\x25\x8b\x39\xf1\xd1\x1c\xdf\xe0\x96\x70\xc1\xe6\x0a\x39\x10\xa4\xff\xf5\x1c\x6c\x7f\x7d\x66\x24\xf4\xc9\x3d\xf8\x88\x8c\x52\x6f\x48\x4f\x9b\x13\xe0\xa7\xf6\x29\x64\x78\x39\x78\x68\x4e\x29\x26\x79\x80\x0e\xd5\xeb\x28\x0e\x28\x7c\x7e\x63\x9e\x85\xfa\xa5\x3f\xba\x2f\xa2\x04\x5c\xe2\x7d\x8f\xb3\x08\x36\x07\x26\x55\x0d\xf9\x75\x2d\xb3\x05\xf8\xf0\x66\x47\x97\x0d\x01\x46\x91\x99\x9a\xfa\x97\xb6\x19\x3f\xfc\xc6\xd5\x32\xf4\xfa\x69\xe1\x33\xa1\xd1\x0f\x30\x47\xfc\x00\x38\x1f\x49\x97\xbb\x84\xe5\xb6\xcd\x60\x28\xc6\x21\x32\xcf\xc0\x24\xbf\xeb\x98\x03\x01\xf2\x95\x12\xbb\xd1\x09\xd0\x89\xac\xe1\x82\xcf\x9c\x2f\xfa\xb1\xb1\x7e\xb0\x0b\x6e\xb4\x6a\xe1\x98\xda\x99\x3f\x5e\xfe\x7c\x1d\xc2\x2d\x25\x04\x7c\x1e\xe5\x24\x65\x17\xe7\xf5\x75\x8f\x99\x6a\xbd\x83\xf1\x3d\xa2\x2c\x13\xdd\x20\x5e\xe1\x91\xb5\x5a\xfd\x48\x31\xef\x07\x8b\xb6\xea\x07\x3a\x62\x5b\xc9\x7c\x81\x29\x61\x60\xbb\xf2\x55\x9b\x27\x5c\xc3\x7c\xcf\x01\xb9\x1f\xd8\x7d\x4d\x99\xa3\x67\xaa\x99\x78\xda\xdd\x06\x89\xf8\xa6"}, +{{0x78,0x18,0x8d,0xf8,0xc7,0x54,0x78,0x56,0x21,0xe2,0x7a,0xe5,0x8e,0x10,0x0d,0x50,0x80,0xe1,0x6e,0x0a,0x15,0xe2,0x77,0x05,0x1f,0x95,0xf0,0x80,0x90,0x0e,0xc0,0xd3,},{0xa1,0xbd,0xee,0xe9,0x8b,0x07,0x57,0xba,0x9c,0x2d,0x84,0x09,0xb8,0x74,0x24,0xe6,0x4e,0x42,0xf9,0x93,0x2a,0xcf,0xa9,0xbc,0x71,0xfb,0x3f,0x8c,0xa0,0xe1,0x1d,0x52,},{0xb9,0x41,0x14,0xed,0xa4,0x6c,0xcf,0xc2,0x2a,0x44,0x71,0xa6,0x4d,0x79,0x08,0x92,0xe5,0x9c,0x5d,0x50,0x56,0x18,0xeb,0x0e,0x70,0x13,0x92,0xc7,0x09,0x61,0x3e,0x2d,0x50,0x3a,0x5c,0x2b,0x66,0x60,0x1e,0x63,0x6a,0x3c,0x1c,0x7d,0x49,0xb1,0xac,0x79,0x8d,0x90,0x89,0xb0,0xf9,0xcc,0xd0,0x57,0x9b,0xb9,0x06,0x34,0xd0,0xbd,0x75,0x0e,},"\xcf\x70\xcc\xa5\x7f\xeb\x1b\xee\xfe\x98\x5a\xd5\xaf\x9d\x43\x48\xd3\xa4\x6a\x63\xde\x10\x75\x38\x1f\xb3\x63\x9a\x04\x4f\xd6\xe6\x09\x1f\x5d\xb9\xc9\x4d\x39\xbe\x0f\x13\xad\xe6\xd9\xa0\x74\xe6\x7b\xa7\x06\xb3\xa8\x80\x62\x95\xf6\xb6\x54\x86\x57\x28\xc5\x8c\xa6\xe9\x41\x9d\x5d\x04\x3f\x21\x10\x81\x4b\xbf\x36\xfc\x40\x70\xe4\xd9\x45\x49\x65\xc2\x51\x20\x2c\xa3\x95\xef\xe3\xfd\xbd\x54\x4f\xeb\x18\x7e\x34\xca\x3c\x80\x79\x51\x79\x55\x2f\xce\x9a\xa8\x04\x43\x0e\x5b\x6c\x86\x85\x34\x1e\x91\xd5\x88\x9f\xbf\x3f\x98\x19\x04\x62\x0f\xfe\x70\x13\xf5\x3b\x93\x9e\x17\x44\x3d\x61\x4e\x7e\x6b\xb5\x7a\xd6\x74\xf3\xb4\xb0\x01\x63\x05\x26\xcf\x73\x02\xa7\xd0\xaf\xe7\xdc\x24\xd6\xda\xde\xf6\xfe\xba\x3f\x96\x97\x3a\xa5\xb8\xd6\x27\x52\x62\xe4\x30\xa8\x2f\x67\x86\x96\x97\x1a\x8b\x60\xe3\x8d\x3b\x2b\xcc\x17\x0d\x5b\xc2\x03\x02\xa3\x9c\x59\x6d\x27\xfe\xe3\x9e\x5d\xa5\xb1\x0e\xa9\xf3\x82\x29\x9e\x19\x81\x97\x17\xa7\x18\xd3\x7d\x15\x5f\x13\x92\x31\x82\xb5\xb7\xa1\xc5\x4c\xa1\x09\xb2\x2c\xa8\xe8\xb2\x6c\xa5\xca\x3f\x3b\x90\x62\x21\x94\x61\xba\xce\x97\xe8\x90\xc9\x4e\x41\xca\x3d\x84\x58\x7f\xbd\xf6\xe2\x40\xc3\x5c\xca\xb7\x1d\x58\x47\x7d\x28\x16\x8e\x93\x37\x26\x86\xd4\x2a\xad\x32\x4a\x3f\x16\xaf\xe0\xe9\xb8\x9e\xe2\x0e\x48\x5f\xe6\xc8\x64\xb5\x01\x3b\xa8\x83\x99\xee\xaa\x15\x98\x35\xa8\xb2\xbb\x2f\x25\xf5\x79\xca\x3b\xae\x67\x5c\x63\xda\x1b\x50\xd9\x9d\x4e\xd9\x78\x69\x2e\x56\x00\x23\x3f\x38\xab\x7e\x7a\x5a\xe0\xfb\xf8\xc0\xb6\x9c\xc3\x8b\xd3\x0e\xab\xd9\x77\xef\xa0\x5e\xe2\xc8\x35\x14\x30\x2b\xd4\x0c\x4b\xdc\xe7\xa4\x11\x0a\xfb\xb6\x57\x9c\x62\x0e\x97\xf8\xcf\x2e\x9b\xab\x2d\xcc\x7c\x33\xf1\x96\xe5\x7f\xe7\x61\xa0\x50\x12\x28\x94\xb7\xa7\x5a\x92\x95\x31\x99\x6d\xda\xad\x78\xde\x1d\x4d\x92\x4c\xd9\x3a\x61\xdf\x22\x77\x76\xbc\x1c\x39\xfb\xb8\xde\x1c\x44\x38\x86\x8b\x6a\x3a\x2c\xd9\x4c\x07\xb2\x9e\x3f\x6b\x23\xcc\x7e\x0b\x63\x68\x90\x09\xd9\xd0\xba\xe1\x60\x6b\xaf\xc7\xa8\x08\xf2\xd2\xfa\x25\x62\xb8\xdc\x09\x38\x42\xc0\x1f\xdb\x84\x0d\xa4\x86\x0a\xce\xd3\xfc\x52\x5c\xa3\x34\xed\xcf\x65\x94\x8b\xc4\x16\xf9\x8c\x45\x0f\x00\x12\xa6\x10\x7d\xd7\xf8\xed\xe4\x0e\x1c\x48\xc9\xe8\xa5\x65\xa8\x10\xb9\xcf\xd2\x03\x56\xdb\x19\xf1\xdb\xde\x59\x89\x21\x33\x2e\x0d\x81\x3f\x0c\xb8\x76\x84\x37\x03\x88\x77\x2f\xf3\xcb\xfc\xbf\xa2\x99\xc1\x98\xc9\x7b\xfb\x96\x17\x76\x8a\x05\x16\x1f\x41\x69\xff\x5d\xe5\xd9\xf4\x00\x62\x09\x0f\xb8\x82\x98\x4d\x9d\x5c\x7a\xa7\x8e\xdd\xcb\x96\x34\xe4\x66\xb8\x85\x3d\x51\x2b\x4a\x54\x6d\x74\x23"}, +{{0x73,0xcb,0x02,0xb0,0xbf,0x26,0xa0,0x15,0xda,0x1d,0xc3,0x01,0xfc,0x12,0x5d,0x7e,0x6c,0x30,0xb6,0x3c,0x9e,0x6e,0xee,0x9e,0x06,0x5d,0x4e,0x84,0x71,0x32,0xc3,0x25,},{0xac,0x9e,0x3d,0xd2,0xce,0xb9,0xb2,0x3e,0x74,0x8c,0x04,0xba,0x75,0x77,0xfe,0xdf,0x7c,0xea,0xb9,0xed,0x87,0xdc,0x43,0x0b,0x5f,0xe2,0x2e,0xac,0x50,0x95,0x0e,0x0d,},{0x1a,0x5d,0xd4,0xc8,0x91,0xc8,0xe1,0x32,0x57,0x01,0x87,0xc2,0x3b,0x9a,0x1e,0x4b,0x26,0xf0,0x54,0x60,0xe8,0x75,0x67,0x38,0x19,0x39,0x6d,0xf5,0x61,0xc8,0xaf,0x0e,0x48,0x33,0x3b,0x62,0xc7,0x77,0x29,0xd4,0x9f,0xc4,0x0e,0x17,0x4a,0x7f,0x3c,0x21,0xf8,0x5e,0xf4,0xd3,0x39,0xce,0xb8,0x0b,0xd2,0xe0,0x37,0xd8,0x03,0xaf,0x56,0x0e,},"\x0a\x2b\x61\xba\x35\xe9\x6e\x58\x19\xb8\x8b\xfd\xb2\x8b\x7c\xe0\x2e\x64\xae\x9c\xf5\x72\xb2\x1f\x13\x55\x2c\x0d\xb1\x0f\x39\x60\xd4\x4b\xa3\x47\x2f\x43\xab\xc4\xe6\x29\x5b\xdf\x79\x0b\xd9\x33\xba\x39\x75\xfd\x44\x65\xfa\x3e\x2f\xe2\xdb\x02\xb6\x37\x77\x52\x22\x3d\xec\x98\xfc\xb2\x40\x4f\x3a\xba\x43\x26\x5a\x6f\xa7\x97\x6b\x6c\x6c\xb6\x86\x8b\x88\x1b\xd6\xf3\xd2\x5c\xd9\xd6\xf7\x0e\x51\x2f\x80\x89\xc8\xef\x26\xfd\x58\x24\x50\x53\x77\x9e\x59\xc4\x72\x5a\xef\xa2\x64\x67\xc9\xf5\x00\xe1\x7f\x3e\x15\x73\xf1\xa8\x55\xe9\xb8\xb2\x19\x25\xea\x05\x27\xf3\xce\x8d\x88\xfb\x54\xa4\x7a\xbe\xed\x14\xf3\x99\xcc\x2d\x9f\x1f\xe5\x46\x65\xfa\xe0\xa8\xf0\xc6\x88\x72\xa6\x00\x04\x6d\x1d\xc3\x63\x97\xd3\x10\xce\x39\x3f\xce\xaf\xe8\x7c\x17\xeb\xe1\x22\xfd\xb5\x43\xae\xa7\x10\x85\xba\xec\x98\x27\x3f\x41\xac\x96\x69\x8c\x15\x0c\xf9\x11\xd0\xe5\xde\x23\x92\xd8\x48\x41\xd0\x12\x76\xae\xfb\xfe\x99\x95\xe1\x0a\x6d\x46\xef\xdc\x26\x78\xd4\x56\xc9\xf3\x6b\x2e\x10\x11\x4d\x11\x87\xe7\xac\xa7\x39\x03\x7e\xa5\x1f\x85\xfd\x62\xa2\x94\x29\xba\x52\x9c\xdd\x8a\xd9\x13\x47\x49\x74\x87\xed\x7e\x87\x09\xd4\x77\x6e\xf6\x86\x70\x79\x2d\x06\x15\xbc\x96\xda\x51\x78\xd6\x06\xdb\x63\xe4\xe5\xcb\x17\x2a\xcf\xbc\x1c\xbe\x20\x26\x93\x50\xf1\xb6\x05\xf3\x5d\xcd\x47\x91\x35\xbd\x30\xfb\x4b\x5a\x39\x17\x6c\xff\x74\x4d\xdb\xb3\x06\xc9\xe7\xb4\x16\x7d\xe0\x37\x9a\x61\x66\xbe\x5a\xaa\x74\xd7\x15\x7f\xac\x95\x7d\x88\xdc\x57\x59\x7c\xfe\xf2\x3e\xb5\x10\x8b\x3c\xe5\x3f\xc6\x32\xda\xd1\xb9\x72\xa2\x9d\xa5\xde\x32\xd2\x0d\x8e\xce\xde\x67\xff\x00\xda\x4a\x08\xa0\xcc\x1a\x98\xbe\xe7\xa9\x4e\x3c\xb3\x2f\xee\x94\xae\x25\xa4\x13\x54\x47\x02\xc3\x7b\x3e\x17\x78\xa0\x70\xcd\xd4\x84\x0b\xd3\x9f\x5f\x45\x79\x51\x92\xa8\x67\x86\x38\x76\xed\x0d\x13\x0d\x46\xe2\x91\x39\x35\x08\x28\x09\xf7\xe1\x5a\x49\x67\x10\xf2\x55\xd7\x83\xda\x3d\x01\x6a\x65\x4c\x15\xff\x5d\xf9\x07\xa3\xcc\xaf\x37\xcf\xe1\x1c\x8c\x3d\x49\x65\x07\xd6\x76\x0c\x05\x38\x20\xf0\xf5\x94\xc3\xd0\x1c\xa2\x69\x17\x8a\xca\x52\x5a\xb2\x82\x1e\xf5\x5f\x92\xd8\x5f\xe6\x85\xea\x34\x47\x2e\xd1\x39\x81\x71\x06\x4d\x74\xa4\x22\xec\x91\xd1\xa6\x70\x61\x8f\xc9\xf3\x24\x24\xbc\xb1\x1a\x77\xf6\xfb\x4e\x2f\xef\xd2\xc4\xe8\xa7\x3c\x45\x28\x86\xe9\x31\x66\x4d\x1a\x83\xbd\x92\x73\x29\xc0\x4d\x25\x0b\x83\x52\x1d\x7d\xc1\x3c\x91\xce\xe1\xec\x05\x0e\x11\xd4\x2a\x4b\x0c\x8c\x06\x9b\x61\xc4\x42\x2d\x3a\x49\xc0\x7e\xff\x29\x05\xb7\xbc\x7f\x4a\x5b\x43\xe6\xb0\xd6\x1d\xfb\x50\xe4\xee\xa2\xe9\x0d\x29\x8a\x78\x1d\x05"}, +{{0xdb,0x05,0x60,0x63,0x56,0xba,0xcf,0x23,0xaf,0xf6,0xcd,0xdd,0x42,0xb2,0xc6,0x94,0x35,0x2b,0x5a,0x0f,0xec,0x56,0x0a,0xff,0x54,0xd9,0xbd,0x97,0x10,0xef,0xe0,0x6a,},{0x32,0xa5,0xc7,0xcc,0x49,0x09,0x78,0x6b,0x48,0xa5,0x3f,0x31,0x09,0x3f,0x54,0x9a,0x9f,0x17,0x30,0xca,0x66,0x90,0x38,0x3f,0xdb,0x5f,0x14,0xc2,0x66,0x6e,0x31,0x32,},{0x53,0x09,0x9b,0x76,0x6a,0xdf,0x29,0x44,0xb6,0x82,0x13,0x74,0x84,0x2c,0x25,0xd6,0xe6,0x7b,0x0c,0xcd,0xe9,0xc6,0x37,0xfe,0xcb,0x11,0xb8,0xb8,0xb0,0x72,0x03,0xe3,0x07,0x57,0x32,0x80,0x5f,0x4f,0x14,0xae,0xae,0x73,0xbd,0x62,0xe3,0x08,0xb5,0x88,0x7d,0x68,0x9e,0x29,0xcd,0x89,0xb2,0x3a,0x47,0x69,0x43,0x11,0x07,0x17,0xb1,0x00,},"\x1b\xc9\xc2\x83\x3f\x37\xcd\xf1\x35\x6f\xad\x16\x67\x68\x64\x27\x17\x70\x1b\x38\xa0\xab\x0c\x2f\x58\x1a\x26\xd2\x22\xd6\x5c\xce\xe4\xbf\x0f\x6d\xfe\x64\xd3\x3b\xc0\x23\x9f\x71\xd4\xb8\x26\x44\xb0\x16\x25\xa1\xa3\x5f\xe7\x98\x67\x62\x39\xe0\xca\x77\x9e\xf2\x31\x38\xee\xbe\x3b\xd1\x9d\xe2\xd8\xf7\xc1\x5b\x4d\x96\xf1\x3e\x51\xbc\x63\x3b\xea\x5d\x61\x22\x5b\xca\x1d\x63\x39\xba\x53\xe8\x1f\x7d\x8d\x24\xc5\xd6\x0f\x04\xce\x8c\x72\x67\x61\xd2\x64\x58\x4f\x1c\x7e\x5b\x5b\x69\x92\x45\x6c\x1c\x76\x89\x2d\x63\x52\x11\x1e\x3b\x92\x6f\xe0\x25\xc0\x00\x9d\xb6\x7c\xe0\xdd\xc7\xf7\x64\xe0\xc9\xad\xb0\x48\x1b\xc2\x79\x54\x84\xd9\x63\x73\xa9\x62\xa7\xb7\x4a\x55\x96\xf5\x27\xa7\x34\x76\x49\x8c\x78\x23\xdf\xfa\x6c\x85\x43\xb0\x79\x71\xb5\xaa\x27\x1c\x12\x25\x5e\x09\x18\xdd\x73\xf5\x0c\x30\xc9\xa8\x5a\xc7\xc2\x99\x3d\xd6\x55\xda\x59\x43\x12\x63\xf5\x91\x4b\xe7\x06\x37\x4b\xe9\xc0\x75\x85\xc2\x87\x13\x28\xb4\xdb\xc3\x94\x01\xc9\x57\x07\x38\x7e\x6e\x06\x9d\x44\xb9\xd8\xfb\x05\x8f\x22\xe3\x15\xaa\x0d\x5b\x4f\x11\x68\xfc\x10\x79\x62\xb0\x64\xf7\xd8\x45\xaf\x8e\x21\x31\x95\x1d\x1c\xd6\x6d\xc8\x4d\xba\x46\xd2\x00\xaf\x4f\x4c\x5f\x51\x22\x1b\xc9\xb2\x19\x69\x42\xf8\xb4\x0e\x7d\xdb\xc9\xae\xb3\xd9\xaf\xc0\x71\x25\x95\x13\x13\x5a\x01\x6f\x28\x66\x09\x9f\xa1\x0f\x4c\x3b\x73\x50\x0b\xd5\x5c\x47\x7b\x24\x15\xe1\x0a\x27\x9b\xa1\x10\xd2\x94\xf3\xdd\x18\x42\x17\x7d\x0b\x4b\xfb\x17\x34\xdd\x0c\xcb\x7e\x39\x4b\x43\xd1\x6f\x0b\x75\x48\x36\x22\x80\xf4\x34\x76\x4d\xa5\x7f\x19\xed\x3e\x30\x2e\x53\x70\xfb\xa4\x96\x64\xc2\x30\x05\x74\x33\xcc\x64\x7e\xb2\x7c\xd2\xc7\xc1\x8c\x7d\x66\x90\x6f\x08\x82\x46\xc2\x2f\x7f\x79\x03\x99\xde\xb4\xc5\xfb\xb9\x06\x18\x17\x69\xbe\xf5\xaf\xbe\x8a\xd1\xf5\xde\x55\xbe\x58\x8f\x52\xf6\x9c\x54\xd4\xef\x5a\x96\x9a\x0d\x99\x5c\x27\x40\x7b\x23\xed\xd9\x24\x3d\x24\x99\xfd\xf2\x94\x73\xb1\x95\x5c\x84\xb3\xf7\xcb\xdc\xd8\x1b\x76\x56\xec\x0b\xe9\xe0\xfd\xb3\x38\x13\x56\x96\x0f\xd0\xca\x70\xe7\xea\x74\xb6\x46\xfc\xd3\x13\x94\x8e\x6d\xdb\x47\x60\x94\x76\xfb\x6f\xa4\x84\x2f\xa7\x88\xa0\xd5\x7b\xe3\xb0\xa6\xca\x18\x19\xf7\x16\x14\x76\x00\x43\xec\x49\x04\x88\x19\x39\x96\x8a\x43\xb5\xd1\x92\x8f\x84\xa5\x91\x90\x93\xbc\x38\x41\x58\x81\x71\xa9\xcd\x39\x0f\x8f\xcd\x61\x53\x8b\x54\xe6\xef\x99\x77\x05\x73\xe1\x98\x6d\x15\x0f\xa9\x6b\x7a\x07\xe1\xd1\x94\xaf\x1c\x0b\x40\x55\x00\xac\xb3\xd1\x0e\x3b\xe6\x47\xc8\x98\x62\x00\x6f\xa7\x85\x83\xe7\x61\x66\x84\x29\x20\x16\x0e\xb5\x7f\x0b\x2a\x6e\xdf\x19\x3c\x44\xc5\xee\xac\xf4"}, +{{0x1d,0x13,0x9b,0x1a,0xd0,0xc3,0xaf,0x1d,0x5b,0x8b,0xe3,0x1a,0x4e,0xcb,0x87,0x8e,0xc6,0x67,0x73,0x6f,0x7d,0x4f,0xa8,0x36,0x3a,0x98,0x09,0xb6,0xd1,0xda,0xbf,0xe3,},{0x24,0x28,0xcf,0x1d,0xeb,0x20,0xfb,0xad,0x1f,0xdc,0x66,0x5d,0x82,0x5b,0x61,0x41,0x22,0xdf,0x10,0x1f,0xbe,0x14,0x73,0xa7,0x99,0x96,0xba,0xf6,0x96,0x74,0x34,0xb8,},{0xdd,0x64,0x5e,0x51,0xed,0xab,0x04,0xdb,0x31,0xe3,0x31,0x72,0xcf,0x27,0xac,0xee,0xed,0xcc,0x04,0x63,0xa9,0x63,0x91,0x4a,0x0e,0xac,0x8e,0xfd,0x5a,0x34,0x34,0x1f,0x6b,0xbc,0x52,0xe0,0x42,0xba,0xaf,0x3b,0x40,0xc8,0x9a,0x57,0xef,0xb6,0x45,0x74,0xe6,0x96,0x77,0xfc,0xe9,0x55,0x24,0x6c,0x1f,0xc0,0xf2,0x69,0xef,0x81,0x90,0x00,},"\x8d\xf2\xd2\xdf\x9b\x98\x4d\xa8\x44\x33\x48\x6a\x81\x3c\x98\xc5\x97\x3a\x69\x6c\x11\x62\x46\x10\xb2\x3a\xa4\x38\x08\x34\x64\xf6\x5a\x76\x79\x66\x15\xb7\x28\xc2\xed\x4e\x60\x71\x58\x55\xaf\xc2\x39\x45\x0d\x5b\xc0\x91\x1f\xf2\xa8\x52\x30\x20\x5c\x6f\x13\x49\xba\x5b\xd8\x7e\xa6\xf7\x20\xdb\x6b\xa7\x0b\x77\x42\x17\x88\xe0\xc6\x54\xae\xbc\x23\x07\x4c\x5f\x41\xd2\x29\x07\x72\x14\x0d\x98\x1a\x6b\xc4\xfe\x70\x9a\x26\x8e\x64\x17\x2a\x02\x6b\x27\x01\x18\xb4\xdb\x51\xab\x6a\x13\xc9\x9b\x06\x31\x86\xd8\xd5\xb3\x38\xe9\x77\xed\xdc\x6b\xb5\xfd\x7d\xd5\x7d\x98\x45\xa3\xc3\xfe\x76\x17\x7d\x57\x38\xdc\xa1\x6a\x8f\x91\x02\x85\x75\x00\x17\x4f\x23\xff\x4c\x3b\xf3\xc8\x53\x6f\x11\x58\x0e\xf8\x51\x4a\x40\x9f\x5b\xbc\x9c\x02\x96\xf1\x2e\x34\x78\xd4\x08\x7f\x95\xef\xaa\x6c\x63\x60\x71\xd2\x11\x57\xbf\x11\x77\x4b\xbf\xe7\x69\x33\x06\xca\x72\x13\xda\x47\x13\xeb\xaa\xab\x35\x54\xed\xf0\x80\x11\xa5\xff\x73\xda\x12\x03\x75\xae\xd1\x96\x28\x67\x0f\x28\xab\x24\xb6\xf5\xd5\xa1\xd5\x70\x48\x0f\x65\xd3\xc1\x52\xbf\xf1\xb4\x7b\xf0\x66\x69\x29\xcb\x7c\x99\xd9\x03\x3f\xaa\xe8\x53\x4f\xc3\x5d\xa7\x30\xb8\x11\xeb\xcc\x25\xae\x10\xa1\x95\xaa\xb1\x2c\x32\x6a\xa4\x5b\xf8\x05\xc6\x2d\xd4\xcd\x5f\x86\x86\x23\xc0\x4a\x8e\x1c\x6a\xa7\x2f\x1e\xa4\x40\x0c\x60\x86\x7d\xff\x62\x2f\x31\x64\x34\xf1\xec\x89\x50\x3c\x6f\x9f\x65\xc1\x37\xb4\x94\x4c\xbc\xb3\x5f\x08\x6c\x74\xcc\xea\xfa\x22\x42\xac\xca\x6f\xfe\x61\x1c\x4b\x55\x87\xf5\xb7\x5f\xfa\xd3\x49\xf0\x0b\xf9\x6e\x4a\x58\x0a\x87\x5b\x92\x65\x40\x69\xb6\x2e\xea\xc0\xbf\x78\xe5\xae\xdd\x71\x86\x9e\xe0\x5b\x9a\x94\xe1\xc9\x8e\x35\xa9\x78\x00\xa4\xa2\x12\x20\xb0\x39\xcd\x5e\xbb\xb7\x56\xd4\x0b\x40\x42\xe2\xc8\x4a\x2a\xe9\x81\x82\x51\x1d\xae\x8e\xd3\xb8\x9f\x4f\xa0\x0f\xb8\xed\x94\x63\x16\x45\x97\x10\x05\x2a\xd4\xc0\x2f\x63\xdf\x05\xd3\xbb\x1a\xce\x33\x67\x21\x51\xbd\xf5\xda\xb4\x6c\x7b\x58\x3d\xb3\x73\x89\x9d\x4f\x03\x5b\x6c\x11\x12\x58\xb4\xe5\xa9\xe7\x07\xa1\x1d\x21\x5e\x44\xe6\x8e\xf1\xa6\xf0\x53\x80\x9a\xa5\x1b\xd9\x02\xe1\x3c\xa9\x9c\x1b\x1c\xec\xc8\x3b\x9c\x23\x5c\x71\x0e\x79\x7d\x2b\x1a\x24\x9b\x2e\xa0\x79\xb5\xc1\x67\x4e\xd7\x16\x9f\x1b\x6e\x67\xf1\xac\x77\xf8\x6b\x74\x32\x98\x96\x93\x35\xa7\x72\x44\x0f\x7f\xbf\xa7\x25\x13\x50\x0d\x84\x16\x61\x14\xa8\xfd\x54\x13\x94\x64\xd4\x2b\x99\x55\x30\xd3\x23\x70\xb6\x9b\xff\xc7\x58\x9d\x6d\xcc\x97\xe0\xbf\x17\x85\x6c\xc3\xbf\x41\x64\xdb\xec\xcc\x8a\x88\x1d\x41\x4d\x6a\x62\x02\x92\x76\xc5\xf8\x13\x7c\x0b\x3c\x68\xbc\x8f\x4b\xd4\xe7\xcf\xf6\x5e\xf2"}, +{{0x4d,0x22,0xe3,0x31,0xe0,0xcf,0x6f,0x6a,0x27,0x2d,0xb4,0xd2,0x06,0x87,0xff,0xb0,0x59,0xf1,0x22,0x5d,0x81,0xe4,0x11,0x23,0xb8,0xc8,0x9b,0x07,0x4d,0xe7,0x6a,0x3b,},{0xb1,0xe4,0xcf,0xae,0xad,0xd6,0x7b,0x12,0xd7,0xb9,0xdb,0xfc,0x0f,0x88,0xed,0xd0,0x37,0x3f,0x9a,0x88,0xc7,0xfa,0x33,0xfb,0x7f,0x2b,0x1e,0x47,0x5e,0xcc,0xb6,0x1b,},{0xc3,0x66,0xb8,0x02,0xf6,0x82,0xfc,0xd7,0x05,0x25,0x26,0x4f,0xb1,0xa3,0xcb,0xcd,0x0e,0xe3,0x5e,0xcf,0xf5,0x97,0x7c,0x2a,0x55,0x4d,0xa9,0x39,0x22,0x9f,0x17,0x81,0x9a,0x96,0x1e,0xa7,0x4c,0x3d,0x7a,0x78,0x81,0xac,0x5c,0x1f,0xa1,0x6b,0xf9,0x84,0xd9,0x45,0x6a,0x13,0x88,0xd3,0x46,0x3c,0x44,0x94,0x42,0x9b,0x1d,0xc4,0x54,0x02,},"\x9c\x8e\x3f\x5b\x4d\x70\x40\x30\xe1\xba\x71\xf0\x2e\xfc\x4b\x87\xd6\xff\xfb\x55\xbc\x3d\x8d\x03\x81\x8f\x91\x56\x24\xfc\xf7\x01\xc5\x4a\xdf\xaf\xa2\xb6\x94\xb8\x77\x51\xcb\x9f\x69\x91\x8c\x0f\x05\x0f\x4c\x10\x5d\x5c\xcb\x40\x10\x0b\x28\xdf\xd4\xf4\x11\xd5\x91\xc1\x20\x19\x17\x6a\xc2\x01\x6b\xfb\xfd\xf0\xdd\xf1\x1d\xb8\xa7\xe3\x9a\xa7\xb9\xe2\x16\xf6\x67\xc0\xa1\x5f\xb9\x77\xea\xa9\xba\x3b\xc4\x55\xcc\x58\x94\x5f\x3e\x94\x4b\x8a\xc2\xfb\xf4\xd2\x4f\xe7\xe1\xe6\x19\xcd\xbe\xee\x3e\x5e\x12\xa9\xa5\x27\xd2\x8f\x5f\xd7\xcf\xd9\x22\x0f\x13\x08\xd8\x97\xb6\xd4\x31\x4a\x5a\x01\x87\x86\x4a\x2d\x62\x1c\xf1\xb2\x84\x42\x61\x24\x7b\xf5\x20\xba\xfa\x9b\xf2\x26\xe1\x15\x68\x1e\xcd\x77\x42\x79\x80\xcd\x12\xb0\x8c\x35\x9c\xec\xd1\xde\x3f\x55\x45\xf8\x07\xf8\x1e\xd7\x63\x02\xff\xd6\x47\x7f\x89\xb9\x58\xcd\xf1\x29\x54\xcf\x70\xc1\x42\x53\x29\x93\x83\x16\x47\xea\xca\xb0\xb4\x80\x7b\xfd\xad\xb4\x38\x9d\x7d\xff\x2c\x4e\xf0\xef\x5a\x5c\x61\xd0\xdf\x76\x2e\x2e\x90\x80\xa7\x18\x1c\xec\xd0\x6a\x53\x19\x9f\x0d\xfe\xf7\x02\x62\x7a\xde\xcf\x5f\xcd\x9b\x3e\x68\xc7\x23\x33\x16\x17\x27\xf8\x71\xc7\xd1\xc4\x30\x51\xff\x1c\x92\x1f\xd5\x3b\x64\x22\x38\xb9\x78\x80\xd6\x4e\x25\xfa\xc5\x12\xab\x95\x4b\xed\xbc\xa5\x40\xf5\xb2\x00\x91\xec\x72\xe6\x7f\x88\x77\x0a\xfc\x32\xf2\x12\x5c\xa0\xda\x4f\xe8\x7b\x56\xaa\xc9\x17\x7f\x1f\x4f\x67\xc8\x51\x72\x5c\x5e\x8a\xfe\x64\xf6\x64\x79\x98\x33\xfd\x79\x10\x0b\x77\xea\xd2\x58\x38\x87\x9f\xff\x47\x47\xaa\x0d\x56\x72\xec\x0a\x94\x34\x81\x34\xbd\xbd\x4b\xb3\x9b\x0c\x67\xa0\xcd\x30\x60\x2e\xdf\x4f\xec\x6f\x7a\xf0\xcc\x2b\xda\xe1\x26\xce\xa8\x42\xdf\xaa\x43\x91\xdc\x5d\xde\xa9\x38\xe1\x79\x21\x68\x24\x0c\x2d\x8b\x25\x35\x2f\x9f\x3a\x64\x42\x35\xce\x36\xfe\xfe\xb6\x99\x2a\xd8\x8e\x28\x7a\xd2\xd8\x5b\xd8\x50\x39\x6f\xc2\xe5\x17\xa1\x52\x09\xf5\x92\x0a\xc9\x8c\x53\x2b\x1f\x4d\x86\x9b\xeb\x08\xbb\x03\xcf\x7c\x91\xaf\x3f\xfc\xed\x68\xd5\xfb\xfe\xf8\x6f\xf9\x4e\xce\x6e\x2e\xad\x34\x84\xce\x08\x0d\xb1\x7b\xbe\x40\xf1\xdb\x43\x2e\xc1\x65\x0e\xd2\x4f\xdd\x25\x0f\x33\x45\x74\x5c\x9b\x7b\x91\x98\xc9\x10\x9a\x37\x26\x1f\xc5\xec\xbb\xb1\x2f\x83\xa0\xe1\x22\x0a\x18\x67\xd4\x5f\xdd\xfe\xa8\x1d\xcf\x75\xf4\xec\x7f\xdb\x52\x50\xe5\x77\x54\xd6\xde\xa2\x70\xb6\x28\xa7\x95\x30\xec\x28\xb6\x19\xbc\xa9\x49\x3e\x63\x05\xcf\xc4\x41\x4c\x1c\x1d\xe3\x38\x9e\x89\x01\x97\xc8\x5f\x28\x40\x4f\x3f\xa9\x6a\x1e\x2f\xd9\x20\x6b\x47\x2e\x8a\x0a\x0d\x32\xaf\x55\x60\x6b\xb0\x83\xf7\x6a\x19\xb8\xea\xe3\x47\x9a\xe5\x1d\x98\xa9\x9a\x62"}, +{{0xa5,0x22,0x8f,0xf9,0xbb,0xb6,0xf2,0x32,0x32,0x7e,0xb8,0xd8,0x79,0xd7,0xf8,0xb2,0x77,0xca,0x72,0xba,0xe1,0xf9,0xa9,0xd0,0xe2,0x60,0xdd,0x90,0x57,0x1d,0xb4,0xf9,},{0xd8,0x2f,0x6a,0x69,0x74,0xf5,0x1c,0x88,0x08,0xd9,0xd6,0x17,0xf4,0xce,0xc2,0xd8,0xa3,0x7e,0xb1,0x1a,0x14,0x23,0x7c,0x9a,0xb9,0xcf,0x11,0xeb,0xc8,0x0f,0xf6,0xc0,},{0x97,0x65,0x0f,0xae,0x3f,0x59,0xca,0x76,0x47,0x7f,0x25,0x47,0x16,0x77,0x49,0xc5,0x83,0x02,0x48,0x88,0x32,0x25,0xe3,0x54,0xff,0x46,0xc7,0xe3,0x81,0x96,0x52,0x20,0xd9,0xbe,0xf2,0xc2,0x05,0x7c,0x7d,0x19,0x90,0xf0,0x8b,0xca,0x4c,0xfd,0xe8,0x77,0xff,0xf2,0xb4,0xaa,0x81,0x3d,0x9c,0x4b,0x84,0xfb,0x79,0xec,0xed,0x81,0xef,0x05,},"\x1d\xf7\xa6\x83\x5e\x33\x10\x98\x3e\xe7\xec\x73\x11\x25\xf5\xb5\xcf\x11\x7a\xf0\xe3\x6b\x36\x85\xbf\x54\xac\xe1\xc4\x8c\x46\x30\x05\x60\xa4\x5e\x9f\x9b\xdd\x96\xa0\xbc\x4d\x14\xe8\x9d\x4b\x57\x21\xa2\xca\xff\x66\x18\xb1\x82\xed\xb1\x20\x2f\x3d\x0c\x5d\x11\x8d\x09\xb6\x18\x12\xc0\x10\xe8\xb1\x96\x34\x45\x41\xcd\xee\xfe\x5f\xd1\xf9\x61\xc5\xdd\x75\x45\x95\x55\xab\x72\xef\x2a\xa7\xa7\x59\xa4\xf3\xad\x3c\xae\xd4\x4f\x4c\x9a\x8e\xf9\x5b\x76\xed\x9a\x99\xb5\x5d\xd8\xa2\x60\xba\x08\x01\x0d\x29\xff\x81\x9f\x2a\xf3\x51\x3c\x1a\x64\x0d\x6c\xcd\xde\x49\x99\x20\x5f\x9f\xca\x88\x57\x11\x5d\x8b\x5d\xb9\xf7\x0a\x62\xe5\xee\xa0\xd5\xaf\x06\x5d\xe1\x53\xf2\xed\xed\xee\xc6\x3e\x15\xc8\xe0\x9a\x92\x58\x21\x82\xac\x07\xd8\x1c\xa6\x3c\xa4\xaa\x59\x7a\x22\x20\xe7\x04\x81\x95\x7d\x41\x52\x64\xe2\x58\xbc\x26\x3e\x1c\xc3\x6e\x53\x47\x8a\xac\x5c\xa0\x16\x94\xcc\xb0\x9b\x4f\xfd\x84\x73\x99\x72\xc7\xdc\xcf\x3d\xef\xea\xfd\xed\xe1\x62\xab\x6c\x58\xa1\xdf\x27\x37\x1e\x3f\x54\x93\x06\x7f\xc9\xe2\x06\x7e\x57\x96\x23\xc0\x09\xfc\x82\x5e\xef\x0e\x01\x0f\xd1\xcc\xf2\xa8\xd3\xfb\xbb\x31\x56\xf9\xdf\xde\x0c\x7c\xbb\xaf\x84\x33\x09\x85\x17\x49\x1b\x78\xdb\x96\x98\x61\x4e\xa4\x0e\x0b\x1e\x6a\x1e\x36\xb9\x00\x45\x3a\x16\xea\x27\x6f\x34\x42\xbb\xd2\x7a\x7e\xcb\x98\x15\x11\xf5\xc9\x20\x9e\xb0\x96\xe2\x85\x88\xb6\x5b\x96\xb5\x01\x88\xc0\x38\x1f\xf7\x12\xbc\x06\xb2\xc6\x55\xcc\xa0\x75\x1c\x09\x5d\x80\x16\x25\x15\x85\x85\x1e\x67\x74\x34\xdc\x3e\xfd\x08\x7a\x12\x68\x0f\xc2\x2e\x5b\x83\x10\xa1\x0e\x32\xca\xac\x9b\x71\xc8\x76\xee\xd3\x1e\xf0\x9f\x7f\xa0\x12\xba\x08\xdf\xd2\xad\x68\xc1\xe1\x47\xf5\x05\x98\xe5\x50\x46\x7e\xf9\x9f\x29\x5a\x31\x8f\xaa\x50\x7e\xbe\x77\x6c\xe5\x5c\x4d\xa1\x64\x32\x3c\x30\xa5\xe7\x2d\xbe\x02\x7c\x3c\xcf\x96\xc7\x01\x97\xa6\xfb\x1b\x74\xaf\x13\x3a\x8b\xe2\xb0\x3c\x1b\x99\xfd\x25\xb3\xce\xd5\x1f\xe3\x88\x20\x21\xa3\xaf\xd9\x22\x9f\x64\x1b\xc6\xca\xd4\xe1\xd3\xcb\x6e\xd9\xb6\xb6\x8a\x25\xf1\xe1\x39\x72\x89\x98\x1f\x78\x92\x4b\xff\x24\xc8\xde\xe6\xa1\x8a\x04\x21\xfa\x32\xae\x3a\xb6\x0a\x0d\x93\x3a\x6a\xf4\xff\x70\x48\x74\xb0\x9b\x07\x39\xe2\xf2\x9d\x8f\x25\x2d\x79\x05\x5f\x89\xd3\xbf\xf1\x0a\x22\xc5\x4a\xc3\xd8\xaf\xee\xce\x81\x83\x53\xa6\xab\xe2\xb7\xfb\x8e\x8e\x0d\xa5\xb7\xac\x1c\xfc\x98\x5d\xf9\x75\x80\xb1\x82\x11\xa4\xe3\xed\xff\x95\xaf\xdd\xa0\x61\x54\x7d\x3a\xe0\x40\x6d\x32\x86\xcd\x30\x5b\xdf\xd2\xc3\xab\xf8\xf7\x4a\xf9\xa0\x34\x20\xe5\xb0\x3f\x82\x5e\x9c\x53\x90\x7e\x13\xa5\x81\x21\x74\xbe\x42\x89\x86\x45\x14\x9d"}, +{{0xc0,0x4d,0xc0,0x9f,0x11,0x9d,0x67,0x0f,0xb1,0xea,0xe0,0x13,0x6f,0xcc,0x06,0x08,0x5f,0x29,0x0f,0x4a,0xd1,0xaa,0x1f,0xfc,0x9c,0x16,0x0e,0xa5,0xcf,0x47,0xf0,0x9d,},{0xff,0x49,0x8c,0xe8,0xc9,0xdb,0x78,0x67,0xf6,0xd0,0x27,0x64,0x52,0xa4,0x66,0x72,0x48,0x87,0xe6,0x17,0x2f,0x66,0x81,0x67,0x1b,0x8a,0xe0,0x35,0xf5,0x86,0x5e,0xa3,},{0x4b,0xd1,0x9f,0x3d,0x9c,0x51,0x16,0xec,0x6a,0xe0,0x02,0x4d,0x0f,0x24,0x6d,0x2c,0xe2,0x50,0xd9,0xe0,0x63,0x4a,0x23,0x2b,0xa0,0x6f,0xd3,0x56,0x6a,0xed,0x55,0xcb,0xe5,0x9f,0x12,0x33,0x2c,0xba,0xd6,0x5d,0x43,0x49,0xa9,0xd2,0x2e,0x7d,0x6e,0x46,0xd2,0xfb,0xdc,0x71,0xd5,0xc8,0xf9,0xda,0x15,0xdf,0xbf,0x17,0xba,0x22,0x51,0x07,},"\x1e\x42\x29\x7f\x8a\xee\xf2\x9a\x84\x2e\x0e\x21\xf5\xdb\xae\x06\x8e\x2c\x9d\xda\xa6\xfd\x34\x8e\x48\x88\x1f\x0d\x42\xc5\x0b\xf0\xec\xf1\x70\x6b\x94\xa5\xd1\x98\x17\xca\x02\xd8\x3e\x9a\xb2\xf9\x9d\x8b\xfa\xaa\x5c\x85\xad\x39\xa1\x50\xb2\x25\xad\x3e\xaf\xa0\x67\x81\x5b\x74\x67\x2f\xe0\x26\xc3\xcc\xc6\x77\x25\x54\x40\xb6\x84\xa7\x6e\x12\x8c\xa2\xcc\xc4\x29\xf1\x52\x57\x7d\x25\xb6\x9f\x40\xdb\x58\x2d\x49\x47\x9a\xfa\xe6\x80\x71\x2d\xc0\xfd\x1f\xe1\x41\x88\x39\x68\x7c\xa6\x0c\xdd\xe9\x74\x14\x04\x62\xf9\x61\x48\x29\x5d\xf1\xce\x43\xa9\x77\x35\x1c\x77\xf2\xf0\xb0\x9a\x6b\x26\xd6\xfe\x96\x5f\xce\xae\x17\xd7\xb8\x62\x03\x71\x40\x24\x28\x54\x4f\xdf\x91\x69\x0b\x44\xe9\xaf\xc2\xe9\x08\x8c\x83\xca\x48\xdc\x85\x76\xf6\x28\x72\x47\x98\xdc\x90\x32\x31\x74\xc4\x49\x96\x59\x65\x02\xa3\x5d\xf8\xb9\x82\xc5\x70\xa6\xcb\x51\xb9\xa1\x97\xd4\x31\xaf\x33\xf0\x2b\x80\x01\x15\x67\xfe\x50\xcf\x45\xac\x11\x1b\x3d\x55\x6f\x8c\x8c\xe5\xae\x8c\x99\x72\xf2\xa9\x93\x6b\x1a\x01\x2b\x9c\x33\x9e\x30\xc9\x73\x12\xb6\x5e\xa5\x9c\x10\x0f\x79\xd7\x95\xb8\xa2\x4b\x31\xa0\xa9\x7d\xc2\x5c\xce\xd6\xb8\xff\x5a\xe1\x45\x33\x9a\x04\x8c\xa1\x2a\x57\x90\x17\xfa\xe8\xd5\xcb\xcb\x61\xd5\x2e\x31\x4d\xd7\xc2\xe7\x20\x10\xc4\x72\x17\xb1\xd0\x68\x78\xbf\x28\x18\xca\x18\x8e\x8e\x30\x79\x60\xc1\x68\x9d\x7d\xfc\x02\x02\x97\x3c\xd2\x9f\x2f\x7b\xa7\x43\x46\x9e\x68\x5e\x0e\x70\x4b\x04\xba\xca\x4f\xab\x54\x88\x44\x8a\x92\x2e\xab\xf4\x0b\xe5\x81\xc1\x99\x4d\x74\xd1\x3a\x36\x6c\xe8\x57\xfb\x40\xa6\xe0\x5d\xa8\x55\x36\x94\x17\x2c\xc3\xfd\x28\x06\x2f\x53\x82\x50\xaa\x8c\x11\xf6\x81\x39\xe7\x9c\xd1\x19\x1b\xa3\x31\x4b\x5c\xea\x08\x64\x43\x7e\xd2\xe4\xb6\xfb\xd7\x5b\x9d\xed\x09\x87\xb4\x1c\x20\x2a\x58\xec\x02\x54\xd9\xd3\x71\xa7\x95\xf1\xdb\xec\xdd\xac\x11\x2b\xe8\xd0\x9e\x2d\x7b\x9c\xa5\x75\x2f\x40\x6c\xff\xb9\x11\xca\x36\x45\x0b\xc0\x5f\x1e\xc1\xca\x3c\xa8\xd3\x51\x24\xd1\x28\x6c\x55\xf1\x0f\x61\x33\x4e\x46\xec\xe4\x18\x3b\x92\x21\x9a\x9d\xcd\x0e\x5e\x78\xef\x2a\x76\xcf\xe9\xa9\xab\x37\x95\xdf\xdc\xb4\x4f\x63\xd4\x5f\x5f\x48\xff\xb4\x15\x61\x33\xad\x2e\x99\x50\x88\x4c\x5b\xbd\x2c\x1c\xb8\x72\x9e\x40\xa8\x78\x7f\x78\x49\x69\xfa\x88\x0c\x07\xff\xcc\x97\xd5\xc0\xd2\xd4\x88\x08\x5e\x91\x16\xd7\x10\x7c\xd5\xdb\x16\xce\xcc\xde\xad\x55\x02\x5e\xea\x2e\xde\xe9\x3c\x1b\x10\x64\x27\x61\x8e\xe0\x9d\xc3\xda\xd1\xe0\x56\x76\xa2\x36\x80\x69\xc8\x04\x5c\x3e\xbc\x6c\x67\xaf\xa5\x2d\x59\x39\x82\x48\xef\xcf\x15\xe9\x04\xc7\x14\x23\x04\xff\x61\x97\x1f\x4d\x9b\xf6\x46\x0c\x1d\x64\x17"}, +{{0x67,0x91,0xbd,0x74,0xd3,0xb4,0x62,0x0e,0xf5,0xf1,0xff,0x56,0x40,0x64,0x32,0xc2,0x6a,0xb6,0x46,0xf6,0xd5,0xe9,0xdd,0xa6,0x84,0x2e,0xd6,0x90,0x52,0x27,0x53,0x92,},{0xda,0x99,0x15,0xa7,0x55,0x2f,0x11,0x0f,0xae,0xa1,0x2d,0x47,0x92,0x0a,0x09,0x60,0x14,0x43,0xd4,0x00,0x0a,0x9c,0x7e,0x21,0x8d,0x5b,0xa7,0x2b,0x74,0x98,0x9f,0xa6,},{0xb1,0xe8,0xd4,0x81,0x06,0x5b,0xd5,0x12,0x1b,0xb3,0xbf,0x56,0x96,0x00,0xbc,0xc2,0x6d,0xf4,0x0c,0x49,0x9f,0xba,0xa9,0x54,0xb3,0x9a,0x61,0x9d,0xc4,0x0b,0x95,0x90,0xc3,0x17,0x56,0xb8,0xb6,0x3f,0x86,0x01,0x51,0x69,0x4b,0x95,0x76,0x5d,0x69,0x7b,0x2e,0x1a,0xde,0x08,0x06,0xe9,0x2a,0x06,0xc4,0xa5,0x59,0xe9,0x0f,0xcf,0xa5,0x06,},"\x36\xa2\x0e\x66\xbb\x29\x15\x51\x61\xad\x85\xee\xfe\x89\x3b\x53\xac\x5a\xde\x16\x5f\x08\x9a\x77\x19\x0b\x0c\x23\x9d\xec\x8a\x20\x16\x85\xb0\x76\xb4\xde\xd4\xa1\x0a\xa4\x59\xb9\x80\xa8\xcc\xa4\x7d\x5f\x8d\xe4\xd2\xa6\x62\xe4\x46\xd5\xf7\xfb\x70\xed\x9b\xe0\x5d\xb1\xcc\xea\xdd\x13\x0b\x33\x46\xd9\x40\x9f\x9d\x6e\xf5\x28\x24\xc7\x64\xac\x6f\xb1\xcd\x15\x6d\xbd\x6a\x47\x3a\xe7\x22\xd0\xeb\xb2\x56\x38\xc5\x12\x65\xa2\x2f\xeb\xbb\x14\x96\x7d\x6d\xd8\x25\x3c\x1d\x03\x88\x95\xc6\x73\x7f\x06\x7c\x8f\x73\xc3\xc1\xcb\xe6\xcd\xa4\x36\x96\x32\xd7\xf4\xc9\xac\xeb\xe8\x7d\x05\x71\xc8\x1a\x58\xcf\xd7\x2c\xce\x4a\x5c\xf5\x3a\x1e\x75\x25\x9f\x4c\x99\x3e\x67\xef\xc8\xd9\xc3\x57\x6c\x43\xaf\x04\xa5\xca\xf3\x3d\x85\x6f\x7f\x27\x55\xd3\xa9\x75\xab\x2b\x68\x5c\x6f\x65\x68\x0c\xba\x9a\xc8\x79\xf3\xa8\xc9\xa4\x76\x5b\x87\x9c\x0a\xde\x1e\x4b\xd0\xd4\xa7\x0b\xb6\xf9\x2b\x24\xd4\x29\xdc\x74\x6c\xc7\x8f\x84\x81\x1f\x07\x6f\x32\xc6\x1e\x35\x85\xcc\x8a\xad\xe9\xb0\xca\x15\x22\x4b\xfb\xfe\x18\xbe\x10\xa3\x36\x43\x60\x0f\x66\x12\xbf\x01\x3f\x0e\xfc\xca\x83\x72\x46\xa0\xee\x5b\x03\xc0\x2f\x15\x73\x62\x4c\x4a\x44\xa9\x0f\x9e\x42\x3d\x4e\x56\x06\x1a\x71\xd0\x14\x4f\x5a\x88\x7a\x8c\xd4\xa9\xd6\xf2\x47\x90\x4e\x26\x79\x59\x51\x95\x9d\xa1\x21\xc8\x3c\x6c\x94\x1e\x2b\x6b\x9a\xb7\x62\x09\xff\xe9\x17\x85\x91\xea\xd6\x82\x30\xb9\x4a\xe9\x7d\xf5\x8f\x9f\x17\x24\x28\xc9\x50\x67\x59\x8a\xc5\x82\xff\xb9\x50\x84\x0d\x82\x66\x30\xc4\x62\x5f\x5d\xea\xdd\xec\x13\x05\x20\x3b\x4d\xb6\xb9\x45\xf9\x91\xed\x7c\xd3\xd6\xfa\xbc\xa5\x1e\x21\x66\xad\xad\x0a\xad\x51\x17\x33\x6d\x52\xd5\x94\x22\xf0\x13\x5c\x8f\xa8\xcd\xd0\x88\x4b\xe7\x35\x86\xbf\x28\x4e\x5d\xdd\xdb\xcb\x95\xb4\x11\xf9\x85\x68\x52\x6f\xbe\x71\xa5\x59\x2b\x56\xad\x5a\x73\x45\xf2\x87\x4d\xb1\xd5\x7b\xea\xb4\x3e\x8c\xc6\x95\x47\x52\x06\x29\xf0\xee\x76\xdb\xf4\x32\xa3\x76\xfa\xd2\x8b\xfc\x77\xe1\x4d\x84\x0f\x0c\x02\xd4\x78\xf1\xe2\x33\x7c\x23\xb8\x9e\x73\xe5\x27\x91\x08\xb5\x60\x9b\x18\xe8\x0d\xb0\xde\x11\xcf\xa9\x4e\xcf\x72\x39\xbc\xff\x59\xc5\x41\x18\xe4\xed\xe4\xfb\xfc\x08\x23\xae\x54\x60\x16\xf7\x74\xc5\x21\x98\xa9\x63\xb5\x54\x5a\x34\x89\xb8\x9d\xf7\x62\x6f\xd1\x1e\xd4\x65\x8d\x71\x5a\x46\x57\x99\x40\x35\xd4\x03\xb3\x37\x0d\x14\xee\xd9\x71\x8d\x59\x8d\xb6\x75\xf0\x42\x59\x2f\xea\x89\x05\x65\x44\xb3\x2e\x5b\x9c\x80\x62\x82\x8a\xaa\x3c\xf5\x9c\xb4\x76\xad\x36\xdb\x1d\xaa\x24\x82\x22\x7a\x9b\x7a\xfb\xc1\x53\xce\x93\x25\x3d\x1b\x39\xda\x95\xeb\x96\xf8\x31\x28\xff\x25\x54\xa5\x47\xe3\x4e\xea\x4a\x00\x00"}, +{{0x23,0x4c,0xe4,0xd3,0x9b,0x5e,0xba,0xbe,0x9a,0x2c,0x1e,0x71,0x97,0x0d,0x71,0x81,0x38,0xdc,0xb5,0x30,0xcf,0xd2,0x96,0x02,0x34,0x27,0xd8,0x92,0xbf,0x88,0xf8,0xa4,},{0xcb,0x73,0x93,0x0d,0xb4,0x21,0xf6,0xd2,0x45,0x36,0x83,0x7b,0xd0,0xbf,0xf6,0xfa,0x75,0xbb,0xd1,0x41,0xc9,0x8a,0x40,0x5d,0x42,0x44,0xa3,0xc4,0x24,0x55,0x07,0x79,},{0xf6,0xd0,0x60,0xed,0x7d,0x18,0x27,0x3f,0x18,0xf7,0xa6,0x9c,0xd1,0xd8,0x12,0x6e,0x47,0x8e,0x88,0xa1,0xd7,0x29,0x4f,0xf6,0x04,0x08,0x46,0xd4,0x61,0x07,0xc3,0xe4,0x1a,0x42,0x3b,0xab,0xb2,0x41,0x71,0x39,0xfe,0x58,0x7d,0x29,0x10,0x27,0x1a,0x35,0x7f,0xe5,0xbf,0x57,0xc9,0x2e,0xe3,0xa7,0xb7,0x75,0x33,0x72,0x9d,0x0a,0xc2,0x0d,},"\x77\x73\x0c\xf8\xc8\xf9\x6b\x91\x87\x90\x2a\xcf\xf9\xff\x0b\x21\x74\x6c\xca\xf0\xa3\x82\xa7\xb3\x43\xd1\xc7\x20\x27\xae\x3c\x31\x68\xa7\x3a\x6b\x8f\x49\xbc\x87\x98\x14\x1e\x15\xc2\x73\x2b\x6a\x6b\x3f\x75\x7f\x8a\x8e\x86\xc7\xa4\xba\xcb\x39\x55\x1c\x54\x87\x4d\x6b\xf7\x16\x89\x7e\xe4\xaf\x13\x25\x3a\xa5\xbb\x79\xa1\x92\x10\x4f\x44\xdc\xb3\xde\x96\x07\x45\xa8\xe6\xaa\x98\x80\x52\x4a\x62\x9f\xb5\x10\xa4\xce\x4c\xbd\xa7\xe2\x95\x7d\xff\x1d\x62\xe7\x05\x60\x6a\x2c\xc8\x4f\x91\x85\x0b\xea\xac\x5e\x58\x46\xe1\x42\x0b\xc9\x1d\xcd\xd2\x42\x7b\x69\xcf\xa4\x6a\xe3\x8a\x4f\xef\x41\x46\xea\xe3\x5f\x9c\x22\xe9\x67\xcb\x14\xa1\xaf\x9c\xab\xf8\x3b\x18\x04\x65\xbe\xd6\xef\x2c\xda\x38\x2a\x84\xd9\x99\x4a\xad\x65\x5d\x89\x52\xe0\xfb\xb0\xf9\x6f\xc8\x08\x9f\x2e\x74\x89\x49\x7f\xac\xdc\xd6\x56\xa8\xa4\x51\xb9\x28\xc1\x1e\x7a\x40\x75\x07\x2a\xaf\xbf\x17\xd8\xf1\x05\x4c\x91\x96\x28\x8d\xed\x3a\xe2\x1f\x9a\xfd\x58\x10\xa1\x00\xd8\xe4\xd8\x4c\x4a\x35\xa9\x8b\x30\xd3\xe1\x85\x24\x43\x8d\xd4\x40\x2d\xfd\x8e\x76\x75\xf0\x9d\x08\x0c\xd9\x15\xf1\x4a\xf4\x37\x2f\x7c\xe5\x83\x84\x97\x2d\x5d\x11\x10\x79\x65\x1b\x2a\xcf\x39\xd2\xa1\x67\xc6\xa0\x0b\x2b\x17\xce\x0b\x26\x87\x91\xbd\x2b\xe5\x17\x8f\xe0\xf8\x2d\x64\xda\xcd\xde\x37\x7a\x1e\x8b\xe9\xe7\xd8\xdf\xc8\x2b\x08\x64\x45\x37\xbd\xc8\x70\xc5\x81\x92\x86\xfd\x51\xf6\x79\x2d\xc5\xf6\x7b\x54\xbe\x33\x6d\x44\xd5\x4f\xeb\xf8\x1b\x8d\xf8\xde\xc5\xd8\x68\x6d\xb1\x2f\x16\x4d\x0e\x8f\xf1\xaa\x2c\x16\xba\xcc\x98\x06\x01\x0e\xc8\xe9\x11\x96\x59\x7e\xf0\x6a\x4c\xf1\x70\x7d\xef\x50\x67\xa0\x48\x89\xd8\xe4\x8a\x9b\xc2\xc0\xbe\xf6\x64\xf5\xac\xd1\xb4\xf5\xbc\x2d\xa7\xda\x43\xdc\xb5\xf9\x63\x24\x5b\xa5\x52\xfd\x49\x30\x01\xd8\x70\xa9\x51\x7a\x17\x9c\x2f\x0d\xe8\x5b\xe0\xc6\x82\xd0\x57\x48\x8e\x35\xc7\x81\x6f\xf4\xba\x52\x9a\xef\xd7\xc6\x60\x91\xf2\x06\xf5\xf4\xd7\x5c\xac\x8b\xd2\x09\xec\x2f\xa5\x5b\xe7\x4a\xf2\x31\xe2\xf3\x89\xdc\xc2\xd6\x68\xbf\x69\x5e\xd2\x67\xc3\x59\x4b\xad\x9e\xfc\x00\x21\x7c\x7a\x0e\x9e\x7b\x6a\x56\xa3\x30\x79\xa3\x0e\x73\xc3\x73\x3f\x2d\x24\xef\xec\xdd\xe8\x7f\x72\xf9\x48\xd2\x77\xd6\xb6\xd5\xb0\x35\xb4\xc5\x31\x80\xd2\x3d\x66\xcc\x0f\xf1\x7c\x15\xdd\x46\x85\x85\xe3\x89\xd9\x1a\x4c\x97\xfd\x80\x11\x0b\x21\x8a\x0b\xf7\xa5\xe0\x35\x3f\x46\x09\xd2\xcf\x01\x8a\x06\x55\x71\x00\x1c\x78\x88\x55\x5e\xed\xbd\x36\x22\xc3\xb1\x76\x9c\xd1\x3f\x33\x37\x47\x72\xaa\x6c\x8a\x8f\x58\x81\x02\x01\x7d\x4e\xe4\xe5\x0d\xcb\xbd\xb1\xd6\x10\xc3\x26\x70\x93\x4a\x6d\x9e\x6d\x9b\x78\x4b\xbf\xe7\x18\x62\xbb\x38"}, +{{0x10,0x3d,0x11,0x8c,0x7d,0xd6,0x5d,0x07,0xe8,0xd5,0x58,0x2e,0x45,0x04,0x2a,0x75,0x79,0x24,0x17,0xc6,0x92,0x00,0x1e,0xe6,0xbd,0x9a,0x92,0x7b,0x2b,0x3d,0x90,0x16,},{0xb4,0x5c,0xc9,0x45,0x14,0xa6,0xad,0x67,0x24,0x96,0xcd,0x4e,0xb9,0xfd,0xaf,0xc1,0xd4,0xa1,0x67,0x07,0x2c,0x68,0x74,0xdc,0x8f,0xf1,0x6d,0x76,0x1f,0xb6,0x69,0x86,},{0x2f,0xaf,0xc1,0x3c,0x43,0xaf,0xe5,0x05,0x43,0x72,0xb9,0x23,0xd2,0x4f,0x29,0x2b,0x28,0x3a,0xfc,0xa3,0xac,0xa3,0xb3,0xe4,0x32,0x38,0x06,0x84,0x96,0x17,0x13,0xc8,0xd2,0x3e,0x86,0xb3,0x58,0x04,0x95,0xdf,0xba,0xe4,0x24,0xb7,0x67,0xe4,0x79,0x5a,0x0f,0x92,0x2f,0x71,0xb5,0x0f,0x5d,0x7a,0x36,0x9a,0xb8,0xc6,0xe8,0x80,0x42,0x0c,},"\x5a\x8e\xe0\x79\x18\x6b\x51\xcf\x46\x29\x83\x4d\xe0\xc6\xbd\x73\x34\x85\x50\x39\xa7\x63\x1d\x68\x87\x65\x2a\x77\x28\x99\x59\x72\xe3\x62\xc1\xc4\x09\xf0\x84\xf5\xaa\xf2\x98\x6a\xe3\xf5\x36\xbe\x00\x70\xc4\xba\xf4\x59\xef\x60\xa0\x15\xef\x9d\x70\xdf\xa3\xea\x96\x71\x1c\xbb\x18\xe9\x2a\xf5\x0c\x52\x7d\x7e\xd4\x57\x87\x7a\x07\xab\x83\x72\x15\x18\xc8\x9f\x7a\x86\x41\x91\xb1\xe9\x74\x33\xb7\xc6\xcd\x63\x4a\x83\x2e\x19\x89\x1e\x76\xc6\x21\x22\xa4\x9d\xbf\xfd\x83\x49\x8a\xa4\x16\xac\xcc\xb7\x73\x7f\xe7\x5f\x4f\xb2\xc3\x53\x28\xe6\xf6\xec\xec\xaa\xa4\x2e\x43\xdb\xa5\xbc\x96\x89\x67\x3d\xab\x96\xf0\xbe\xfa\x3c\x83\xeb\x41\xd4\xd8\x87\xb3\xa1\x17\xd0\x55\xe3\x0b\xb8\x7f\xbe\x7c\x71\x94\x72\xf6\xc7\xa4\xcc\x45\xf6\x28\xf5\xfa\xdd\xc4\x8c\xa3\x44\xf7\x7b\x73\x3c\x0e\x3b\x9f\x50\x79\xdb\xd0\x7a\xf3\xa3\x84\x7a\xf1\x41\x71\x9c\xca\x2f\x6a\x76\x65\x52\xb4\x5d\x0f\xdc\xdb\x98\x68\xf2\xc7\x62\xb6\xd4\x93\x3b\xa1\x08\x36\xf9\x5b\xff\x71\xcb\x88\x04\x00\x24\xc9\x05\x34\xc4\xd7\xa9\x5a\x23\x03\xb0\x4c\x29\x61\x01\x2a\xf5\x8b\xc7\x84\xa9\x63\x27\xbb\xfe\xd0\x39\xd0\x80\x2a\x05\x26\x2d\x8e\x66\x3b\x78\x50\x8e\x92\x50\x8b\xc1\xf2\xea\x2b\x9b\xe7\x58\x0b\xde\x10\xa4\xd6\x63\xd0\xd2\x5b\x0e\x97\x3b\x8c\x5d\xed\x59\xde\xbf\x19\xbb\x04\x4a\xff\x1c\x60\xc7\x0e\xa1\xae\xfe\x85\xf6\xd1\x5c\x2c\x1b\x84\x75\x3b\x59\x57\x6a\x49\x47\x3d\x65\xaf\x3e\xd9\x41\xa3\xd5\x14\xb5\xc4\x52\x2c\x14\x1b\xdb\xee\xd9\xcb\x33\x96\x95\xb2\xe0\x2d\xc0\x70\x00\x86\x7f\x1b\xf8\xed\x8c\xfd\x3b\x1a\xfe\x68\x8f\xbc\xa8\x0e\x2f\x9b\xa5\xc0\xb1\x88\xa1\x9a\xda\xff\x66\x86\xca\x0f\xf0\xed\xd4\x44\x66\x12\x91\xfa\x27\xca\x1f\xc5\x29\x42\x9a\x5d\x8f\xf7\x9e\xd2\x02\x7c\x60\xff\xe3\xb2\xc0\x3f\xb8\xa6\x6a\x39\x85\x41\x7b\xa4\xac\xe7\xd1\x4f\xd0\xe2\x37\x1e\xdf\x5d\x71\xbc\x02\xb9\x05\x27\x67\xc7\xf7\x2c\x4e\x6f\x3f\x30\xe0\x63\x82\x76\xb9\xc4\x20\xaa\x43\x33\x09\x5d\x31\x31\x30\x33\x09\x05\x82\xe3\xac\x4d\x9f\xd3\x20\x31\x20\xba\x25\x14\x97\x3a\xb9\xd1\xc7\xfc\x42\x29\x01\x16\xb5\x1d\xae\x9f\xd5\x79\x41\x0a\xe0\x78\xed\x32\x0a\x5a\x1b\x49\xaa\x7b\x5f\xef\xcd\x75\x63\x95\x21\x3a\xf8\x64\x1e\x29\xb0\xeb\xb5\xb8\x3e\x37\x80\xe5\xd1\x0e\x9d\x3d\x11\x99\x81\x48\xf6\xc6\xf8\x6c\x4d\x4e\xb2\x52\xe2\x8c\x70\xfa\x3a\x55\xc4\x3d\x4d\x7f\xaa\xfc\xbc\xdd\x45\xad\x26\x37\xf2\x15\xe8\x15\x49\xeb\x8a\x4c\xde\x47\x15\xb7\x10\x72\x07\x50\x3a\x79\x59\x50\x60\xb8\x3a\xce\x8f\xeb\x67\x3b\x99\x79\x68\x46\x9d\xd9\xb4\xad\x6a\x7e\xa8\x1c\x6e\x61\x81\x00\x33\xf3\xed\xfc\x13\x7d\x97\x42\x09\x57\x5c"}, +{{0x47,0xee,0xe2,0x02,0x4d,0xbe,0x09,0x95,0x3e,0x98,0x1f,0x69,0x86,0x52,0x0f,0x66,0x60,0x82,0xaa,0x9e,0xf4,0x89,0x2d,0xfd,0xfb,0xdb,0xd2,0x50,0xd2,0xa1,0xdf,0x28,},{0x9f,0x13,0xcd,0x8e,0xbf,0x50,0x80,0x34,0x79,0x75,0x15,0x9f,0x36,0x02,0x96,0xa7,0x16,0x40,0x14,0xd8,0xd0,0x69,0xe8,0x31,0xda,0xb0,0x33,0x26,0x07,0x99,0x7c,0xde,},{0x5d,0xef,0xae,0x0e,0x17,0x3e,0xcc,0x18,0xd5,0xf0,0x1e,0xc9,0x29,0x1b,0xe1,0x60,0xd5,0xea,0xbf,0xf6,0x3f,0xd5,0x42,0x3f,0x2b,0xc6,0x6e,0x3f,0x64,0x08,0xc1,0x96,0x35,0x35,0x02,0xdc,0xef,0x21,0xef,0xfa,0x4b,0x9c,0x14,0xbf,0x27,0xb6,0x87,0xd1,0xb6,0xe8,0x6b,0x2a,0x20,0x5a,0x89,0xeb,0x35,0xc3,0x76,0xa3,0xa3,0x25,0x69,0x0d,},"\xc1\x33\xf0\x33\xcf\x3b\xec\x6c\xd1\x92\x12\xea\x47\xdb\xec\xb1\x3f\x2c\x60\x18\xf9\xe0\x87\x8a\xc8\x84\xbf\xb5\x75\xc0\xf5\xd3\xfc\x5b\x49\x99\x58\x0e\xb8\xac\xbc\xaa\xc8\x3a\xe9\xac\x9b\x44\x3e\x6d\x1c\xff\x44\x9c\x36\x89\xb4\x33\xd5\x09\x00\xb2\xe8\xb7\x1d\x00\xe1\x19\xc8\xb8\x75\x09\x4b\xda\xb9\x16\xad\xaa\xb7\x5b\xcc\x85\x29\x59\xd8\xd7\x59\x79\x5b\xbd\x6b\x36\x0e\xe4\x84\xaf\xe4\x7b\x1a\xd2\x83\x91\xf2\x5a\xfb\x8d\x4e\x3a\xfe\x0c\x5b\x60\x04\x98\xa1\x28\x33\xfe\x2a\x1a\x54\x83\xdf\x94\x0b\x17\x3b\xa0\xd9\xd8\xc4\xd1\x32\x1f\xa4\xb7\x33\x33\x4b\x0f\x6d\x87\x8a\x0e\x5a\x76\xf4\xf1\x80\xac\x11\x9a\x82\x08\x2a\xcb\x14\x88\xe4\x9b\xbc\xa7\xa0\x36\x9c\x19\x1b\xd6\xd0\xc5\xd4\x45\x65\x68\x21\xa9\x9c\xcb\xc9\x45\x94\x9e\xca\x81\x36\xcc\x6e\x12\x7d\x9d\xe9\x2e\xf6\x4f\x17\x4a\x6c\x04\xc8\xb5\xe5\x24\x95\xf0\xdd\x67\x4b\xb5\xca\x12\x8a\x92\x09\x96\x8f\xd4\x50\xdc\xe3\x19\x91\x3f\xd6\xa3\x0c\x33\x82\x79\x81\x63\xe6\x58\x5f\x58\xef\x20\x8b\xe4\xd0\xc6\xa2\x51\x3a\x75\x23\x88\x39\x7a\x4a\xe4\x44\x83\x8c\x84\x66\xdb\xc3\x6f\xbc\x36\xae\x08\xbe\xc8\x8e\xed\xa1\x31\xc1\x4d\x06\x36\x6b\x67\x31\x51\x45\x41\x00\xde\xa1\x11\x81\x50\xfb\xe4\x41\xb1\xe7\x82\x6e\x54\x5d\x98\x68\x24\x2e\x89\x9f\x5e\xa5\x3e\x43\x4c\x37\x93\x6c\xe6\xfd\x06\x14\x62\x83\xe8\xfb\xd5\x36\x48\x0d\xe5\x5a\x16\x10\x2c\x44\x75\x4b\xc5\x54\xd5\xbc\x2d\xe2\xf2\x5e\x19\xe5\x67\xa0\x23\xdf\x46\x40\xe7\x4f\xf3\xa4\x9e\x4d\xd3\x0e\x0e\x25\x58\xb3\xdb\xc2\xaa\xb9\x2f\xdd\x5e\x79\x42\x5e\xcb\xc4\xc6\x99\xfe\x1f\x16\x19\x65\xf1\xd0\xb4\x5d\x8b\xda\xb5\x2e\xc9\xbf\x7a\x69\xd8\xaa\x0b\xd1\x71\xe7\x55\xce\x7b\x8d\x07\x18\xf7\x26\x7a\xfb\x73\x3e\xfc\xa5\x4b\x21\x3e\x6f\x5a\xda\xb4\xc9\xd7\x6c\x86\x7f\xcb\x69\xae\x05\xc7\x4b\xd2\x15\x16\xcf\x34\x2c\x61\x61\xf6\xfc\x9e\xcc\xac\xf9\x70\xeb\xce\x54\x0c\xd8\x92\xbc\x10\x6c\x6b\xd5\x63\x61\x02\x98\xb7\x09\x68\xf0\x91\xbc\xc6\xe1\xf7\xab\x4a\x5b\x2c\x63\x74\xa1\x90\x3f\x4d\x3a\xd5\xe1\xbd\x86\x43\xa9\xc2\xf8\x78\xc3\xd7\xa4\xdc\x49\xef\x31\x97\xed\xbc\xda\x7b\xb9\x1e\x7e\x06\x60\x60\x87\xd4\xe9\x81\xbf\xab\x93\xa6\x02\x49\x77\x96\x2e\x45\x26\x25\x17\xf3\x38\xb6\x85\x7e\xec\x21\x58\xa2\x97\xb2\xaa\x91\x52\x4b\x67\x7a\x21\xaa\xc5\x7b\xe0\xb6\x3a\x80\x74\xfe\x54\xe7\xa9\xdc\x70\xc5\xa5\xc3\xde\x72\x8b\x9c\x17\xec\x12\x12\xab\x11\x30\xeb\x17\x62\x2c\xd7\xb2\x2a\xb6\xeb\xa9\x18\x5e\x8d\x67\xbe\x6c\x47\xa2\xe5\xad\xc6\x63\xd4\x64\x2c\xc1\x20\x22\x2e\x29\x9f\xe1\x34\xfd\x7f\xcd\x00\xad\xab\xcf\xaa\x64\x2f\xe2\xe0\x8d\xd5\x2e\x2c\x3f\x32"}, +{{0xb6,0xc8,0x8b,0x4c,0x90,0xfd,0x19,0xa1,0x49,0xd3,0x81,0x67,0x19,0x53,0xb9,0xb1,0x6d,0x42,0x8f,0x63,0x61,0xcf,0x50,0x3a,0x11,0x04,0x77,0xe2,0x97,0xf8,0xd2,0xf8,},{0x8e,0xbf,0xb0,0x84,0xf9,0x97,0xb2,0xea,0x79,0x32,0xa2,0x35,0x3b,0x2c,0x8b,0x16,0xbd,0x82,0x5e,0x1a,0xf5,0x87,0xa8,0xeb,0xc5,0x1a,0x6c,0x45,0xae,0xa3,0x43,0xae,},{0x74,0x47,0xa2,0x01,0x81,0xb0,0x2c,0xf1,0xb6,0xad,0x52,0x95,0x69,0xce,0x43,0x7c,0x2a,0x05,0x08,0x11,0x6f,0x50,0x20,0x5c,0x41,0xe6,0x37,0x8b,0x74,0xfe,0x2f,0xc5,0x36,0x30,0xaa,0x0d,0xc4,0xb8,0x0c,0x31,0xcb,0x26,0xc8,0xf0,0x9b,0xf8,0xfa,0xb2,0x7e,0x3a,0xbc,0x8f,0x1f,0x60,0x4a,0x5e,0xc0,0x66,0x31,0xa8,0x4f,0x6f,0x2e,0x06,},"\x7f\x4b\xf4\xf5\x21\x73\xef\xf0\x72\xf8\x18\xd0\xaa\x97\xe6\x93\x5d\x8b\xac\xcf\x48\x39\x66\x32\x53\xb2\x41\x4f\xe6\xb1\xf3\x4c\xf4\x3a\xb1\x20\x15\x5a\x1a\x3a\xea\x7b\x48\x19\xdd\xd1\x03\x16\x73\xb8\xa7\xa6\xbd\x0b\x9d\xda\x4a\xde\xfe\x69\x2a\x56\x16\x2c\x64\x61\x80\x79\x42\x64\xc5\x12\x21\x15\xeb\x90\xa6\xd3\x05\x4f\x08\x43\x02\xdc\xe3\xd8\x36\xac\x3d\xe8\x20\x63\x8b\xd8\x9a\x86\xbf\x0a\x4c\x01\x54\x7c\xfd\xc5\x43\xd6\x76\xfe\x16\x39\xef\x72\xc5\xb8\x45\xc4\x94\xe0\x78\x14\xce\xc8\xa4\x7d\x03\xdf\x73\xbe\x4e\x33\xc0\x5a\xfe\x9a\x19\x0d\xda\x04\x33\x60\x49\x6b\xe4\xcf\x3a\x63\x19\xda\x9a\xb0\x64\x81\x67\x7f\x1a\x43\x74\xd6\x0d\x3d\x3b\x63\x94\xf8\x84\x3c\x86\x9b\x0f\x41\xa1\xe8\x1c\x2b\x1a\x54\xbf\x5a\xac\xbd\x98\x20\x7c\x8d\xba\xcb\x36\x42\x2a\x3a\xa0\x13\xd5\xe8\x49\xe0\x44\xaf\x92\x85\x45\xc0\x46\x09\x7c\xaf\x14\x9d\x97\x02\x15\x11\x5d\xea\x0b\x5a\x85\x40\x1f\xf6\x72\xe0\x2e\xd4\x0b\xd0\xf5\xa4\x40\xcd\x56\x49\x40\x53\xc8\x96\xc3\xbd\x32\x60\x63\x49\xf7\xcb\xe7\xec\xe2\xa2\x23\x0c\xf2\x36\xda\xc5\x9f\x78\x17\x96\x5f\x3f\xa8\x0f\xb4\x8a\xa3\x0b\x0b\x19\xef\xa9\xa9\x65\x91\x64\x6b\xd2\x5e\x67\xc1\x85\xf7\x7e\x21\xd6\x63\x0b\x28\x8d\x4e\x55\x14\x6b\x2a\xbc\x15\xe9\x50\x88\xd9\x36\x08\x07\x75\x61\x81\x54\xbb\xdd\xa1\x15\x70\x2a\x2a\xfd\x6f\xd5\xf5\x6b\x92\x3e\x18\x88\x33\xec\x44\x89\x44\xd3\x02\x83\xe3\x37\x25\x42\x42\xc5\x81\x2d\x72\x45\xa4\xe9\x26\x70\xbc\xe3\x54\x6e\xfa\xed\x22\xd2\x74\xe1\xe6\x04\x8b\x5a\x0f\x01\xef\xbf\x89\x5d\xc4\x24\x94\xba\xf1\x74\x71\x85\xcb\x1a\x4b\x88\xfd\xf1\xe6\x09\x9b\xaa\xbc\x6a\x5a\xb5\xa2\x72\x7b\x1e\x24\x87\x89\xd1\x70\xca\xa2\x44\x96\x71\xa8\xf6\xe0\x94\xc1\x13\x32\xea\x0a\xc2\xaf\xe8\x81\x32\xc6\x44\xff\x88\x3d\x0c\x49\x9a\xd7\x6a\x93\xdf\x47\x2f\xa0\x13\xea\xa2\x7a\xb4\xda\xd6\x79\xd2\x51\x1b\x50\x49\xc4\xe9\x8b\xaa\x2e\x7b\x00\xa5\x34\x89\x1e\x29\x02\x65\xed\xb0\x76\xf7\xdc\xa8\xe6\xfe\xf3\xf4\x33\x03\x4a\x16\x57\x5f\x0e\x53\xda\x45\x77\xe6\xb1\x3f\x0c\xb0\xd7\x85\x87\x0d\x0d\x09\x8d\x5d\x80\xf4\x13\xa2\x68\xba\x84\xe0\x43\x1a\x78\x69\x23\x77\x13\x78\xcd\x57\xb8\x19\x22\x58\xe2\x63\x3c\xdb\xe0\x3c\xc3\x16\xa0\x95\x09\x70\x52\x6f\xd3\xe0\x93\x76\xbc\xef\x0d\x03\xb7\x07\x4e\x59\xa5\xa8\x4f\xc6\x4e\x79\x5a\x81\x21\x56\xd9\x60\x56\x76\x50\xbb\x1e\x14\x24\xb3\xcc\x9a\x4d\x99\xd5\x7b\xa8\x58\xdd\x1a\x0c\xad\x35\x32\xe9\x98\x14\x6e\x79\x26\x40\x45\xe2\x8e\xbb\xfd\x75\xa4\x26\xb0\xbb\x85\x1a\x24\x4a\xd6\xbe\x7b\xd5\x76\x5a\xf4\x93\xdf\xc4\x4e\xe3\x78\xcd\x04\xda\xf3\x91\x7e\xef\x2a\x62\x06"}, +{{0x79,0x49,0xa9,0x47,0x2f,0x72,0x5c,0xe7,0xc6,0x8d,0x7e,0xa8,0xfc,0x16,0xe1,0x3d,0x9e,0x0e,0x0a,0x58,0xf5,0x8c,0x24,0xf9,0x22,0x8c,0x88,0xe8,0x02,0x64,0x09,0x0d,},{0xa3,0x70,0xf8,0x28,0x33,0xf8,0x8b,0x4f,0x5f,0x53,0x10,0xb9,0x18,0xe6,0xaf,0x93,0xbb,0x72,0x4b,0xfb,0xdf,0x3c,0x02,0xc5,0x03,0x78,0x0b,0x2c,0x83,0xab,0x6c,0xc6,},{0xe0,0x28,0x98,0xcc,0x7c,0x30,0xee,0x01,0x64,0x82,0x47,0x49,0x7b,0xe8,0xa9,0xc6,0x37,0x85,0x93,0xdc,0x88,0x20,0xbf,0x7c,0x17,0xff,0xcd,0x18,0x11,0x8a,0xf0,0x98,0x79,0xa7,0x69,0xf5,0x39,0xdd,0x92,0x37,0xe9,0x68,0x21,0x16,0x66,0x34,0x99,0x8f,0x94,0x6d,0xa6,0x5e,0x6d,0xba,0xd8,0x27,0x15,0x11,0x66,0x9e,0x2d,0x6c,0xad,0x02,},"\x95\x53\x86\xb9\x2d\xd6\xbf\x92\x60\x1b\xf8\x1e\x84\xd2\x51\x44\xb5\xfc\x0b\xcd\x7d\x23\xc7\x6e\x7d\xeb\x5f\x5b\xa6\x31\x6b\xb6\x1a\x5d\x8e\x74\x18\x5b\x01\x29\x67\xf0\xa4\x43\x8b\x53\x16\x96\xde\xb4\xb8\x10\x10\x89\xe0\xc0\x48\x2a\xdf\x13\xc0\x61\x31\x91\xb9\x77\xf7\x7b\x04\x19\x81\x41\x47\xf5\xda\x64\xa1\xd3\xbe\xb1\x27\x5b\x98\x49\xd1\x29\x7b\xa8\x53\x2a\xe0\xa6\x47\xa8\xac\xe3\x95\xae\x0e\xd0\x0f\x67\x34\x8c\x5e\xe5\xea\x19\xb5\xf1\xc5\xbd\x2e\x62\x28\x18\xe8\xad\xcb\xa3\xc1\x7c\x27\x98\x7e\x4e\x3d\x6d\x91\x0a\x56\xc7\xe5\x14\x9d\x3f\x55\x74\xfc\x06\x00\x9b\xf4\xdd\x3e\x37\xcf\xe3\xeb\xda\x2c\x21\x16\xd3\x66\xdd\x88\xce\x5e\xa7\x2a\xb3\x87\x49\x05\x85\x44\x3b\x08\x6e\x8a\xa3\x8d\x11\xd3\x82\x0b\x72\xc6\x58\xe4\x63\xcd\xb5\x9c\x53\x93\x01\x1d\x4a\x8f\x4c\xb6\xa1\x95\x22\x93\x04\xe7\x62\x39\xfa\x5e\x8c\x2c\xbe\x0f\x39\xdc\xad\x13\x8a\x0e\xcb\x3c\x51\x57\x9e\xc9\xa1\x20\xa5\x16\x07\xee\xfe\xbf\xa5\x9a\x44\x62\x0e\xa5\xb1\x91\x60\x87\xea\x33\x85\x33\xfc\x13\x2f\xf2\xe4\xa4\x3d\x05\x2f\xd0\x8b\x6b\x1b\x24\xfb\x67\x2f\x73\xc9\xb9\xba\x20\xb7\xc1\xc4\x1e\xa2\x4d\x91\x2d\xe9\xb5\x55\xb6\xe5\x68\x2b\x97\x06\x08\xff\x22\x9a\xd3\x08\x6f\x43\x1f\x9b\xe1\x90\xec\x39\x22\x4b\xa2\xed\x8a\xcb\x4c\x8e\xac\x85\x82\xe2\x3a\xaa\x79\x82\x7c\x44\xe2\x48\xc5\xba\x09\x2d\xda\xc0\xf2\xf7\x96\x84\xaa\x93\xfc\x06\x10\x73\xe1\x82\x1a\x56\xaf\xb9\xbf\xec\x95\x2d\xf2\x71\x9a\x9c\x7a\x40\x3e\x6a\x93\xf7\xa6\x56\xd7\x4b\x61\xc1\xd1\x90\x83\xf8\xd3\xf1\x9e\x65\x9f\xa2\xb7\x18\xe0\xbd\x04\xb6\x93\xd6\x3d\xaf\xb8\x6a\xdb\xee\x5d\x87\xc7\x5b\x7d\x12\x91\x22\xf1\x78\xa0\xe6\x69\xeb\x03\x5c\xa4\xd8\xeb\x45\x39\x7f\x18\x51\x26\x4e\x2c\xf0\xa0\xcd\xd3\x07\x20\xc5\xe1\x39\xcd\x6a\x57\x3f\x1f\xa2\x41\xca\xe9\x42\x58\x05\xac\x79\x60\x3e\x8d\xe3\x50\xef\xdb\x0b\x9b\xc9\x5b\xa7\xb0\x85\xc1\xed\x92\xc1\x2a\xcf\x53\xf5\xd4\xa1\x13\x75\x98\x00\x8f\x2a\x36\x72\xc8\x4e\x5f\x76\x9a\x25\xc7\xa4\xa1\x65\x79\xd8\x62\x88\x77\x49\x72\x60\x6e\x4e\x7d\x85\x26\x3a\xd2\x17\xe0\xdb\xcf\x34\x3f\xe5\x54\xc1\x09\xc5\xd9\x40\x9b\x79\x39\x07\x3a\xc5\x5a\x03\x42\x0f\xec\x28\x9b\x11\x4a\x5c\x54\xc2\x0b\x45\xea\x69\x93\x85\x33\xad\xe7\xb3\xae\x85\xe1\xa7\x83\xdd\x97\x89\x7c\x3a\xe8\x25\x41\x83\xcc\x54\x04\x5c\x2a\x18\xec\xbe\x52\x16\x91\xf2\x61\x9d\x9b\x8f\x1f\xb3\x47\xca\x05\x5a\x7b\x0b\x4c\x24\xf6\x4d\x17\x73\xe0\x14\x16\x44\x1e\xfe\x15\x99\x23\x21\x7a\x84\x87\x4b\x9c\x4e\xc2\x65\xcd\xaa\xb6\x43\x90\x80\x68\x49\x78\x12\xc1\xaf\x15\xc1\x88\x07\x1e\x78\xf5\x97\xfe\xdf\xce\x91\xc5\xd4\xc6"}, +{{0xd6,0x8a,0x5e,0x3c,0x47,0xee,0xdb,0x30,0x99,0xdf,0xfc,0x80,0x4c,0xf1,0x9c,0x5e,0x74,0xbf,0x7b,0xf5,0xf0,0x1f,0x54,0xd4,0xd9,0x1d,0x75,0x74,0xf3,0xd3,0xdc,0x7c,},{0x46,0x46,0x7f,0xe9,0xce,0x3a,0xcf,0xd0,0xd7,0x43,0x46,0xbe,0x21,0xc4,0x62,0x16,0xdb,0x81,0xae,0xce,0x6c,0xe0,0x30,0x8f,0xb8,0xdc,0x63,0x86,0xfc,0x34,0x46,0xcf,},{0x89,0x6f,0xc3,0xca,0xba,0x7f,0xd3,0xfc,0x28,0x5d,0x5e,0xdd,0xdd,0xc0,0x12,0x0c,0xd4,0x6d,0xa7,0xc6,0xef,0xab,0xe6,0x6b,0x15,0x0b,0x00,0x27,0x60,0xb8,0x41,0x4a,0x89,0xac,0x9e,0x7f,0x1f,0x7b,0x7c,0x7b,0x33,0x59,0x8f,0x61,0xf4,0x57,0x18,0xe4,0xff,0x4a,0xc3,0x68,0xff,0x12,0x96,0x14,0xb4,0xfe,0x92,0x19,0xf2,0x37,0xb0,0x09,},"\x59\x6c\x03\xd0\x87\x3f\x57\x2f\x45\xc3\xb1\x6f\x0e\xf4\xb5\x2a\xd2\xbf\x59\xec\x76\xd3\xc0\xe5\x34\xd6\x2c\x1f\x84\x16\x4d\xda\xa4\x25\xfb\x85\xc9\x54\x84\x85\xb7\x06\x46\x77\xe9\x9d\x04\xc3\x9b\x6e\xba\x04\xc9\x66\x39\x7b\xa6\xa5\xf4\xeb\xaa\x69\xa2\x41\xdf\x95\xa6\xe4\x45\x02\x50\x9d\x63\x50\x55\x7e\xbf\xea\x60\x26\x4b\x62\xad\x7f\x74\xd1\x6e\x5d\x25\xd4\x59\x70\xcf\xeb\xeb\x33\xe7\xb1\xba\xc3\x34\x8d\xd0\x3a\x8e\x99\x13\x3b\x26\xbb\xfd\x7a\xa7\x22\xc2\x58\x7f\x72\xd5\x52\x6e\x98\x0d\xa9\xee\xbd\xf1\x08\x21\x1d\xae\x50\xbb\xe8\xc6\x5f\x9a\xbe\xe6\x9a\x1b\xbf\x84\xc0\x3e\x40\x44\x8b\xab\xad\x03\xd3\xcf\x3b\x7d\xe4\x88\x7d\x2b\x47\x73\x77\x02\x79\x64\x82\xd2\x26\x5c\x56\x6b\x0f\x62\x3b\x53\xc8\x67\x1b\xd3\x71\x9e\xde\xc0\xff\xd5\xf4\x9b\x49\xb0\x72\xc1\x56\x4a\x57\xf9\xba\xb6\xb9\x2d\x1f\x06\x8d\x75\x66\x39\xa4\x33\x14\x52\xe6\x1a\xa7\xb2\x18\xa8\x8b\x9d\xb7\x7a\x19\xfb\x82\xf1\x3e\x98\x68\xed\xb7\x98\xd5\xbe\xec\xa5\x5d\x1a\xb0\x95\xb3\x16\x22\x5f\x3f\x63\x90\xf8\x95\x78\xf0\x16\x04\x28\x74\x7b\xcd\x21\xbe\x6a\xe1\xd8\x69\x91\xb4\x8e\xf8\x0d\x56\x92\x50\x85\x8f\xeb\xf3\x27\x6b\xd5\xde\x3d\xb6\x5a\x24\x5c\x8b\xdc\xf1\x48\x8c\x48\x25\x96\x89\x45\x78\x6b\xed\x63\xf3\xd1\x3f\x14\x09\x36\x3b\x94\x85\x60\x47\x68\x58\xb3\x96\xbc\xe5\x88\xe4\x0b\x31\x1d\xdf\xc2\x2a\xd6\x22\xca\x7d\x1e\x69\x56\x14\x64\xdd\xa5\x00\x9e\x63\x8a\xa5\xec\x9f\x4c\x03\x92\x93\xaa\xec\x75\x00\x1f\xfc\x68\xa7\xcb\x3a\xe0\x18\x74\xdc\x7f\x39\xd7\x50\x27\xf5\x9a\x28\x96\x5f\xc1\x95\x30\xc0\x75\x2f\xe9\x9b\x15\x3d\xa7\xc0\xe5\x42\xbd\xa7\x6c\xa1\xe1\x0b\x7e\xa1\x58\xef\xb4\xd8\x21\xfb\xc6\x5e\x72\x71\xad\x99\x41\x09\x53\x15\x44\x7a\xbc\xad\x08\x80\xa0\x07\x5d\xd0\x4b\x13\x25\xc7\x26\x33\xac\xbc\xb2\x61\xfc\xb4\x07\xc2\x64\xa3\x4d\x70\xbf\x1f\x04\x4f\xee\xad\x06\x9a\xf5\xa8\x7d\xd3\x52\xf4\xbd\x81\x10\xfa\x17\x8a\xdb\xd8\xdb\xf2\x3c\x6b\x57\x5c\xdd\x5d\xf2\x2c\xc9\xa5\xcd\xd3\x7d\x9c\x8f\xaa\xb8\x1a\x4c\xb3\xfb\x5c\x4f\xe7\xff\x62\x9d\xba\xa9\xfc\x06\xb8\x0c\x1f\xb6\x91\xc2\x86\x55\x95\x5c\xfe\x5c\xa4\x41\x49\xb1\x50\xb3\xcf\x14\x0d\x9a\xca\xcb\x14\x31\x3a\x72\xc8\x40\x98\xde\x72\xba\xcc\x02\x72\xd7\x9e\xd6\x61\x7f\x72\xde\xc8\x8e\x19\xb8\x44\x25\x49\x2a\x42\x9e\xc6\xd2\xec\x08\xb8\x63\x46\xdf\xbf\x20\xea\x2a\x36\x19\xe7\x7b\x6a\xc6\x42\x30\xeb\xe2\x5f\xa0\x06\x7a\xbb\x5f\x33\xee\x49\xad\xc7\xc4\x4b\xda\x70\x46\xd7\xf2\x24\xf2\xe7\xa4\x89\x56\x83\xfc\xa8\x68\x4e\xd6\xa0\x31\x84\x4f\x57\x86\xbc\xda\x48\xb5\x04\x23\x94\x48\x7b\x52\x40\x2a\x09\x90\x77\x88\xa1\xe1\x40"}, +{{0x31,0xe8,0x2b,0xc1,0xcc,0x5c,0xed,0x21,0xcd,0xc8,0xbf,0xc2,0xdb,0xbb,0x97,0x6b,0x08,0x78,0x0a,0xfc,0x69,0x44,0xaf,0x7e,0x88,0xe5,0x0e,0x67,0x87,0x4d,0x84,0xf1,},{0x8d,0xf9,0x77,0xe2,0xb0,0x40,0xac,0xeb,0xd3,0xda,0xfd,0x67,0xb8,0x7f,0x92,0x16,0xe8,0xc3,0x71,0xbe,0xce,0xd6,0x18,0xfe,0xf3,0xa4,0x96,0xd6,0x51,0xa5,0xd7,0xb5,},{0x24,0x07,0x02,0xac,0x6c,0x68,0xd5,0x97,0xd2,0x22,0xda,0x94,0x9d,0x0c,0x47,0xd1,0x6b,0x39,0x0a,0x47,0x7d,0x1f,0xb5,0x79,0xe9,0xd8,0x94,0x8a,0xdf,0x9b,0x3b,0x6a,0x7f,0xd4,0x45,0x8a,0xe6,0x38,0x5b,0x7e,0x2b,0x68,0x4a,0x05,0xb5,0x5c,0x63,0xfa,0x6c,0xd0,0x87,0xbb,0x90,0x11,0x3c,0xba,0xb8,0xe4,0xaf,0x14,0x2f,0xcf,0x81,0x0e,},"\x69\xd4\x61\xb6\xb7\xa8\x66\xe9\x4c\xd5\x9a\x5a\x23\xbb\xa4\xa1\x27\x66\x02\xf0\x42\xba\xa8\x50\xd5\xb2\x92\x49\xd6\x74\x3a\xda\x04\xd3\xd9\x38\x21\x9a\xbb\xc2\x2a\xda\x66\xa1\x77\x81\x97\xf7\x0b\xf8\x0b\x59\x7a\x8b\x4a\xe0\x0b\xdb\x87\x68\x12\xd3\xab\x4e\xc0\x11\xdf\x73\x34\x1c\x85\x05\x3e\xeb\xcc\x2d\xf0\xac\xfc\x21\x54\x82\x83\xb5\x53\xec\xde\x01\x54\x82\x8e\xd5\xaf\x47\x57\x19\x85\xf8\x97\x67\xb0\x05\xb6\x22\xc9\xe7\xc0\x79\xdd\xe6\x94\xe4\x9d\xc0\x55\x0c\x79\x18\xcc\x51\x5c\x27\x4d\xbd\x9c\x54\x69\xd2\xf1\x8e\xcd\x90\xde\x66\x4e\x03\xca\x41\xe5\x3b\xe2\x0b\x96\xe2\x5a\xf4\x0c\x54\xab\x0f\x7c\xbe\x9e\x05\xca\x3f\xa5\xa3\x7c\x1a\xa8\xeb\xfb\x64\x44\xa3\x2c\x49\x6e\xfc\x68\x15\x7c\x69\xf3\x58\xc1\x5f\x6a\xc0\x9d\x46\xef\xef\x9a\x68\x5d\xf7\xe8\xdd\x63\xb3\x04\xbd\x3c\x63\x8c\xcf\x53\x2f\xe9\x01\xf1\x1c\xf9\x7c\x5b\x1c\xbe\xd3\x3c\x70\x63\x7c\x72\x1b\x02\x89\xad\xf6\xbb\x6d\x87\xc3\x04\x79\xfa\x92\x6e\x04\x30\x74\x30\x2b\x76\xf1\x15\x7d\x0a\x81\xde\xc4\x93\xe8\x7a\x3c\x64\x3e\x7a\x20\xb7\xa4\x15\x25\xa3\x8d\xb0\x4e\x78\xda\xe5\xe7\x79\x70\x66\xbf\xae\x2c\xf4\x48\xa4\x47\xe9\x00\x4c\xce\x8e\x41\xf0\x98\x79\x91\xfa\xd3\x03\x11\xdd\xaa\x45\x9a\x26\x44\xf4\xb9\x41\xc0\x68\xc0\xd6\xc0\x77\x1a\xfc\xf4\x2b\xf9\x13\x9a\x68\x4d\xa2\x98\x48\x6e\xcf\x67\x52\x3b\xf8\x50\x9a\x45\xba\x5c\xb8\xb3\x86\x4a\xd2\x2c\x0c\x6a\x82\x8c\x6d\xb7\x2e\x37\x1d\xe4\x10\xb4\x7d\xac\x49\xae\x9d\x3b\x57\x02\xb1\x73\x9b\x8d\x76\x0c\xe9\x86\x11\xc0\x7d\x88\xdf\x5f\x04\x68\x38\x08\xa2\x1a\xfc\x2e\x61\x71\x3f\xc2\xc0\x25\xcb\x25\xfc\xc4\xee\x94\x18\x41\x08\x3b\x22\xf6\x1e\x26\x56\xfb\x3b\x8d\xad\x41\xc2\x62\xc8\x9d\x2f\x17\x61\x03\x09\xf2\xd5\xc2\x95\x89\xa2\xdf\x61\xe5\x51\x49\x89\x50\x32\xca\x98\x1e\x45\x57\xe1\x30\xa2\x37\xfc\x08\x26\xfc\x87\x25\x29\x86\x1b\xbb\x83\x28\xd6\x73\xf3\x9b\x58\xb7\x3d\x06\x0e\xc5\x96\xbf\x22\xe7\xee\x08\x1f\x44\xe9\x2c\x02\xa5\x67\x76\x79\x52\x0e\x2a\x2b\x4d\x22\xc7\x7f\x2b\x21\x2d\x5a\xaf\x05\x0b\xf2\xc1\x41\xe3\xe2\x8b\x85\x71\xd4\x32\x19\x37\x42\x62\x35\xc7\xa6\x46\xd6\x47\xe3\xef\xe1\x83\xc2\x7b\x74\x92\x56\x5e\xca\xcd\x7f\x43\xc6\x7a\x74\x45\x3f\x47\x80\xe8\x87\x11\xba\x2d\xd4\xa3\x94\x1b\x12\xdd\xd3\x90\x92\x70\xfb\x3d\xeb\xd4\x22\x43\x6a\xb6\x16\x6f\x08\xc9\x9c\x88\x6c\xc0\xe8\xe3\xce\xcd\x06\x42\xe4\x42\x85\xb8\x86\x4a\xa4\x16\x94\x3c\x5a\x18\x69\x74\xf4\x64\x53\x5a\x87\x0a\x01\x28\x61\xbc\x2e\x58\x71\x49\xca\xe9\x71\x62\x4e\x61\xc3\x1d\x8a\x50\x7e\x3a\xd8\x27\x73\xe7\x23\xbc\xb7\x5d\xf5\x4b\xef\x84\x7a\x40\x7b\xcb\x7b\x1d\x57"}, +{{0xcc,0x56,0xbc,0x7c,0xdf,0xa6,0x11,0x92,0x4e,0x72,0xb0,0x7f,0x68,0xab,0xc6,0xca,0x5b,0x85,0xff,0x8b,0xba,0xcd,0xff,0x40,0x6e,0x51,0xba,0x72,0x0d,0x09,0xa8,0x66,},{0x5f,0xfe,0xe2,0x21,0xab,0x4d,0x0f,0xe6,0xf4,0xc9,0x34,0x6c,0x5e,0x5a,0x4b,0x8a,0x63,0x6a,0x6a,0x0b,0xad,0xce,0x96,0x67,0xbe,0x73,0x9f,0x4c,0x9e,0x67,0x33,0xc1,},{0x9b,0x86,0xa1,0x92,0xb6,0x4f,0x4f,0x04,0x4f,0xfb,0xf8,0x7b,0x41,0xc7,0xee,0x52,0xf7,0xa7,0x21,0xaa,0x32,0x0e,0x7b,0xad,0x64,0x25,0x99,0x59,0x90,0x31,0x5c,0xdd,0x50,0x2b,0xe4,0xe1,0x11,0x60,0x19,0xd1,0x31,0xa9,0x21,0x8d,0x19,0x61,0x4a,0xd9,0x55,0x43,0xb1,0x88,0x9a,0xf0,0xa9,0x7e,0xd4,0xd2,0x56,0xdc,0x33,0xd7,0x6e,0x08,},"\x08\x83\x04\xf2\x2e\x1a\x28\x60\x62\xde\xfb\xeb\xb1\x82\x7a\x64\xb7\x6a\x14\xe8\x70\x15\xe7\xf6\x46\x17\x87\x77\xab\xa7\x97\x04\x68\x8d\x7b\xf3\x2e\x1e\xfa\xc9\x7a\x9f\xc3\x39\x81\x0e\xbd\x3d\xf9\x3e\x4e\xa0\x24\x68\x69\x53\xed\x91\xfa\x6d\x2a\xb6\xe0\x7e\xc7\x81\x1a\x6d\x91\xca\x91\xb0\x98\xdb\x47\x25\xdf\x65\x84\x6a\x95\xb8\x08\x63\x5a\x8d\x0c\x5f\xe5\xac\xe2\x5f\x07\x80\xe8\x96\x17\x7b\xc1\xbb\xa1\xcd\xb4\x44\x92\x51\xc0\x1b\x48\x2f\x02\x38\x62\xf8\x8e\x07\x2e\x79\xcd\xe5\xdb\xd6\xc1\xd9\xad\x9c\x07\xc6\x06\xf5\xdf\x85\xa6\xec\xa2\x96\x6c\xbf\xe0\xa1\x67\x39\x68\x11\x2f\x26\xa3\x17\x05\x3f\x16\x7f\x61\x1a\xf2\x97\xef\xa8\x02\xe0\xa9\x4b\x3e\x1f\x33\xa2\x7b\x73\xe5\x59\x7a\xbb\x22\x41\x15\xeb\xe7\x5e\x29\x4a\x1b\xcd\xcd\x97\x92\x55\xb0\xa8\x02\x65\xc0\x89\xaa\xa7\xd6\xbe\xd2\xe3\xd0\xc9\x18\xf5\x6f\x4a\x55\xf4\x48\xd8\x63\x36\x5c\x6c\x58\x46\xfb\x9b\x2b\x9b\xb5\x5f\x6b\x7c\x6d\xff\x58\x47\xb7\x1b\xfd\xd4\xbb\x5b\x9b\xb2\xe4\x24\x9b\xc0\x24\x3a\x02\xab\x4d\x22\xba\x78\xa4\x3d\x18\x21\x95\xae\xd7\x8f\xec\xe8\x4c\xb1\xdd\xae\xb9\xef\xf6\x81\x56\x04\x5b\x29\x32\xe6\x38\xd7\x73\x1d\x0e\x8b\x4c\x9c\x8c\x38\x3b\x0d\x6d\x39\x2d\x21\xfc\x64\x07\x62\xc8\x7d\x36\x92\xb1\x81\x0b\xcc\x4a\x42\x39\x2f\xf1\x3d\x45\x16\x9e\xcb\xf0\x13\x50\x55\x09\x31\x05\x09\x8c\x86\x9b\x68\x88\x7e\x93\x4e\x2b\x9d\xa5\x23\x2a\xc6\xc9\x37\x38\x00\xf7\x0b\x64\xec\x64\xa4\xaa\x0c\xa0\x44\xc0\x77\x7c\xa3\xa3\xac\xaa\x13\x8c\x14\x24\x96\x72\xa5\x5b\x24\xdd\xfe\x4d\xc3\x57\x57\x32\x41\xe1\x4a\xd0\xac\x16\x47\x5a\x8e\x38\x67\x88\x6d\x41\xee\xa3\x5f\xe7\x93\x2b\xa9\xae\xaa\x0c\x86\xc9\xeb\x6d\xb7\x80\x80\x49\xad\xe7\xb5\xcc\x1a\x40\x82\x2c\x66\xde\xa9\x3a\xd2\x2d\x44\xb9\xe4\x29\x04\xb5\xb8\x36\x84\xae\x29\x31\xfe\x36\xc6\x08\xff\x70\x96\xf1\xb0\x9f\x81\x1b\x02\x67\x28\x04\x40\x6e\x08\xed\x9e\x77\x45\x67\x6c\xe0\x47\xf0\xf7\xf6\x47\x08\xe4\x9b\xb7\x87\x54\x72\x0b\x8a\xa2\x26\xf5\x55\x6a\xbf\x05\xb5\x65\x84\x64\x52\x92\xda\xd0\x8e\x24\x73\x63\x9a\x8c\xe5\x47\x5e\x0c\xe9\x19\x2f\x8b\xa2\xdd\x32\xce\x14\xc9\x19\x75\xab\x60\x2f\x7c\x13\x53\x8c\x52\x95\x2d\x03\x96\x15\x8c\x7c\xc6\xb9\x42\xbe\x7d\x92\x3e\xeb\x52\x3a\x73\xb5\xb4\x11\x96\x6d\x14\xac\x96\xe5\xb0\x96\xa5\x29\x32\xa4\x16\x29\x2e\xcc\xdd\xb9\x10\x71\xc8\x85\x60\xe7\x0e\xcd\x4f\xe2\xfe\x24\xd5\x23\xfa\xfc\xb9\x8e\x40\x21\x50\x2f\x41\x90\xa0\x51\x5e\xdc\xb2\x40\x19\xea\xca\x09\xec\x26\x15\xa9\xbf\xde\xb6\x0e\xb3\x54\xc8\x4a\x1f\x3c\xec\x7f\xfd\x7e\x65\xa5\x51\x5d\x47\x95\x9a\x4c\x4e\xc4\x8d\x80\x21\xb1\x75\x4a\xe2\xbf\x84"}, +{{0x7a,0x57,0xf2,0xdd,0xa0,0xad,0x03,0x38,0xab,0x9a,0x13,0xc9,0xa3,0x49,0x7e,0x9c,0x75,0x23,0x8c,0x15,0x31,0x58,0x97,0x89,0x22,0x7c,0xd2,0x74,0x9b,0xc6,0xe9,0x50,},{0x6f,0x73,0x8d,0xc5,0xe7,0xd9,0xe2,0x40,0xc9,0xf4,0xd0,0xc0,0x6a,0x5e,0x02,0x17,0x47,0x56,0x8b,0x69,0xa7,0x5d,0x50,0x7a,0x2e,0x0b,0xe7,0xea,0x61,0x35,0x26,0xc5,},{0x98,0x91,0x23,0x76,0x1d,0x93,0x56,0x32,0x78,0xfd,0x0a,0x78,0xae,0xd6,0x4e,0x2d,0xe6,0xf4,0xa7,0x00,0xfc,0x9a,0x70,0xd2,0x18,0x77,0x48,0xac,0x06,0xd9,0xc2,0xc3,0x77,0xd1,0x99,0x5f,0x89,0xc7,0x72,0x7f,0xe2,0xf1,0x20,0x78,0x4e,0x41,0x71,0xc4,0x2d,0x63,0x53,0xac,0x3d,0x4e,0x3f,0x62,0x0c,0x63,0x9c,0x75,0x78,0x6c,0x46,0x0a,},"\x8c\x85\x75\xa1\x1d\x2f\xf2\xc2\x38\xe4\x19\xcc\xb0\x06\x33\xd0\x4e\x8b\x8b\xd7\x74\x29\x01\xd5\x88\xdd\x6a\x2f\x00\xaa\x12\xf0\x8a\xe4\x1d\xca\xa9\x33\x8f\x8c\x47\xe9\x53\x12\x19\x2c\xf6\xb2\x45\xa0\x0c\xe6\x88\xa0\x29\xda\x56\xdd\x1b\x1d\xeb\x0d\x34\xb5\x41\x4f\xe1\xc2\x1d\x6b\x63\xd0\x6b\x85\x34\xac\xe8\xe8\x66\xc9\x33\xfd\x7c\x5a\x65\xed\xa9\x5a\x17\x37\xa9\xec\xdb\x17\x85\x91\x49\xac\x69\x69\x51\xb8\x2c\x23\x0e\x82\x75\xe9\x6d\xd0\x2f\xd4\x55\xea\x67\x53\x79\xe6\x7b\xa6\x34\x84\xb6\x28\x38\x31\xfe\x3f\xfe\x52\xd6\xec\x49\xb7\x09\x10\x67\x05\xc9\xd1\x9b\x85\x9d\xe9\xfd\x20\x08\x87\xcb\x44\xd8\xfd\xfe\x69\x61\xfa\x4c\xa2\x34\x09\x44\xc7\x64\xc7\x04\x49\x12\x08\x25\x7e\x73\x54\x82\xaf\x8c\xb6\x90\x41\xdd\xe6\x85\x24\x1d\x3f\xbf\x46\xfd\xa0\x57\x24\x8b\x89\x87\xbe\x1f\x80\xb5\x4e\xb5\x40\x09\xf3\x24\xdc\x45\x0e\x88\x6e\x79\xf9\x12\x58\x5b\x91\xc9\xdf\xaf\xe9\x01\x22\x62\xc4\x71\x40\x3b\x1e\x8b\x5c\x31\xfc\x53\x75\xa1\xdd\xf9\x9b\x68\xed\xf9\xed\x70\xaf\x85\x94\xf7\xd8\x4b\x2c\xc4\x91\x1f\xe9\x05\x00\xc6\xee\xbf\xba\xc0\x85\x55\x35\x50\xe3\x5b\xd2\xe5\x25\x14\xe9\x79\xe7\x24\x1e\x9f\x8e\x34\xcd\xf8\x51\x3a\xbe\x72\x51\x0d\xff\x3c\xfe\xc7\xe2\xbc\x64\x88\x64\x1c\xfd\x0a\x65\xae\x0e\x09\xeb\xe9\x9b\x15\xb2\x9d\x45\xea\x67\xa5\x7a\xad\x55\x4d\x4f\x8b\xfc\xe1\x38\x6a\xce\x22\x88\x39\xe3\xa8\xa5\x34\x14\x0e\xec\x3d\x37\xd5\x1b\xe3\x61\xf5\xea\x18\x83\x73\x9f\x56\x61\x5f\x75\xb0\x55\xa0\x6a\x91\x47\x1b\xe9\x8b\xc9\x45\x37\x83\xc3\x58\x38\x2b\xd0\x55\x5a\xe9\xeb\x0b\xdc\xd6\x66\x29\xa6\x11\xfc\x1a\x11\xc6\x53\xc8\x22\x14\x58\x7d\xec\x12\xba\x12\x0e\x25\x13\x07\x0f\xe6\x9e\x98\x2f\x7a\x80\xad\x15\x9f\x6a\x32\x5d\x97\x7d\x01\xd0\x50\xd1\x16\xa6\x2a\x4f\x8a\xca\xb6\xc3\xd6\x9f\xf6\xc8\x78\x21\x3c\x60\xa9\x48\x45\xca\xe1\x06\xde\x6c\x5d\x6f\xe2\x50\x8d\x94\x56\x5b\x7b\xa7\x5d\x58\xd1\xad\x47\xd7\x6a\x20\xde\xfa\x75\x68\xcb\x7f\xd6\x6f\x57\xcf\x37\x74\xa2\x1d\x3f\xfa\x7d\x8a\xa6\xd8\x6d\xc2\x84\xb7\x0e\x0f\x17\xe7\x63\x0b\xfc\x10\xcd\x1f\xc9\xa8\xd9\xc5\x92\xd3\x9f\x24\xa7\xb5\xc8\xe8\xaf\xf3\x53\x57\x7e\x6a\xc9\x00\x86\x90\xc7\xa1\x59\xa7\xe8\x3b\xe5\xa6\xae\x8f\xca\x96\x44\xbd\xdf\xa3\x7a\x92\xb0\x70\x55\xf9\xfa\xc9\xfa\x97\xfb\x3e\x8f\x5f\x4d\x91\x7d\xda\x5c\x6d\xc6\xea\x34\xb6\x4d\x30\x24\x05\xbc\x38\x06\x2e\x07\xce\x93\xa1\xa8\x8a\xed\x5f\xba\xf9\x95\xa0\x9b\x45\xb2\x8a\xd4\xa6\xb2\x73\xde\xc1\x41\x3c\x54\x04\x52\x9d\x82\x5b\x5e\xdc\x2e\x27\xa3\x90\xeb\x7e\x8c\x2b\x43\x90\x5e\x11\x6d\x88\x7a\xb5\xfb\x99\x3d\xfe\x15\x0e\xbd\xcf\x81\x7a\xe6\x2e\x03"}, +{{0x32,0xef,0x6d,0x78,0x9a,0x1e,0xa3,0x93,0xf1,0xbf,0x9f,0x11,0xde,0x34,0xf5,0x7d,0x65,0x3c,0x4e,0x77,0xd5,0x1e,0x60,0x50,0xfe,0xf4,0xe8,0xd7,0xbf,0x18,0x3d,0xb5,},{0xc1,0xaa,0x18,0x1e,0x62,0x0f,0x60,0x52,0x5c,0x2b,0x17,0xda,0x8d,0x29,0x0b,0xae,0x5d,0x33,0x9e,0x17,0xea,0xbc,0xea,0xb5,0x8c,0xd7,0x6a,0xe0,0x66,0xf4,0x11,0x79,},{0x88,0xf3,0xa6,0xe0,0xbb,0xaa,0x3e,0x06,0x0b,0xc9,0xd9,0x1f,0xe2,0x96,0x8c,0x61,0x12,0x6b,0x20,0x31,0x7f,0x59,0x84,0x2e,0x4a,0xe4,0x87,0x11,0xcd,0xba,0xf6,0x2c,0x6c,0x02,0x07,0x40,0x5d,0x1c,0x48,0x49,0x95,0x02,0x71,0xf0,0xaa,0xa7,0x59,0x30,0x91,0x10,0x9e,0x47,0x8d,0x13,0xf3,0x56,0x96,0x4f,0x7d,0xba,0xb7,0x29,0xaf,0x00,},"\x11\xa9\xc3\xc1\xba\x7c\xfb\x61\xad\x10\x33\x05\xc2\x58\x86\xde\x9f\x88\x15\xc6\xc2\x1f\x17\xa8\x73\x3a\x02\x4f\x94\x97\xda\x05\x40\xdb\x36\x03\xa6\x71\xaa\xe8\x37\xdb\xbb\xa1\x9e\x19\xf8\x2d\xdf\xc8\xaf\x85\x59\x80\xa7\x01\x25\xfc\x61\xcd\x7f\xfd\x10\x77\x7e\x36\x6e\x5e\x95\x69\x92\x7a\xf0\xf2\x45\xd4\xf3\x9b\x3f\xd0\xf4\x58\x79\xc2\x53\x40\x14\x12\x85\x5e\x57\x61\x90\x5e\xd6\xef\x31\x8b\x6a\x06\xea\x6e\x9f\x90\x6f\x9b\xd0\x16\xbc\xb6\x94\xa0\xdf\x65\xa0\x16\xbd\xfe\x84\x5a\x09\xf2\x3e\x50\x86\xc5\xaa\xf3\x75\xef\xeb\x86\xda\x51\x23\x9d\xdc\x35\x0b\xac\x0c\xdb\x03\xb8\x74\xdb\x15\x07\xe6\xad\x4e\x2c\x9f\x46\x02\x8c\xa2\x38\x83\x63\x54\x14\x93\xb6\xcb\x92\xc1\xdf\xca\xa3\xef\xd6\x8c\x6b\x4e\x91\xef\xb4\x67\x51\xd2\x3f\x4c\x48\xa9\x73\xf0\xa5\xc7\xc6\xfe\x2a\x12\x69\xd2\xa6\x9e\x9f\xc4\xab\x8b\xa3\xb9\x2f\x79\x64\x49\xba\x3d\xc7\x02\x45\xed\x50\x5c\xc0\xee\xee\x16\x36\x64\x7a\x68\xc7\x67\x9d\x0b\x6d\x65\x1b\xba\x35\xc2\x9b\x81\x47\x8d\x17\xca\x36\x85\x70\x7a\xd6\x16\xe6\xe5\x60\x43\x81\xf8\x4e\xe5\x2b\x25\xad\x02\xfc\x0d\xfb\x85\x43\x2e\xfb\x1f\xec\xd0\x90\xc0\x2a\xd0\x02\xc1\x85\x7f\xce\xd8\x8f\xdf\xb2\xff\x26\xdd\x0f\x50\x18\xfb\x47\xd8\x13\x58\x1f\x65\x08\xca\x63\x7c\x73\x65\x17\x7c\x51\x3d\x1e\xe0\x58\x79\xa6\x5c\x5b\x67\x6b\x3a\xa8\x73\xa1\x93\x5c\x54\x37\xea\xdc\xb6\x6d\xfb\x05\x2a\x5e\x7c\x3e\x81\xd4\x4b\x3d\xaf\x69\x8f\x42\x24\x4e\xe2\xee\x4b\x6e\xd2\xb7\xe6\xe5\x6e\x61\xff\x9c\xb4\x5e\x71\x9f\xd7\x46\x19\x8b\xf2\xa7\xde\x6d\x25\xaf\x3b\xc6\xc7\xb0\xed\x8a\xbe\x3c\xb3\x89\xaf\xd8\x4f\xfa\x2a\x23\x0d\x93\xbc\x0c\x29\xd5\xa9\x41\x9c\xbf\xf1\x1b\x78\x83\x32\x99\x21\x48\x0b\x58\x44\x65\x5d\x99\x6c\x7c\xab\x29\xdf\xb2\xa3\x92\x7b\x82\xba\x7c\x30\x6c\x45\x77\xb6\xf8\xb5\xdb\xe2\xaf\xaf\x9b\xf1\x4a\x8f\x95\x54\xcd\x01\xa6\x9a\x99\x1b\xf2\x12\x82\x8d\xe1\xe6\x31\x72\xe8\x33\xde\x06\x69\x8c\xdb\x3b\x28\x71\x63\x80\x31\x45\x72\xbf\x5b\xcf\xd3\x4e\xf5\x2a\x6f\xad\xda\x87\xba\xbe\x6b\xac\xdb\x20\xce\x63\xc7\x25\xcb\x0f\xf6\x1f\xe3\x0c\x1b\x51\xdb\xda\x2c\x26\x25\xf9\x9d\xfe\xb0\x29\xa3\xe5\x8c\xba\x7d\x01\x90\x51\x11\xca\xf4\x2f\x27\x02\x5e\x72\x0e\x18\xee\xb0\x7d\xae\x91\x55\xc5\x5a\xa3\x00\xe2\x2e\xb5\xe9\x4d\xc7\xa0\xa8\x4e\xe6\x7d\x91\xa9\x60\xae\x08\xca\x63\x2d\xbb\x17\x37\xfc\x9a\x43\xdb\xcf\xb3\xa8\x79\xeb\x9f\xbf\xfd\x72\x99\x33\x8e\x26\x4b\xc1\x23\x7a\xb6\xa5\xbc\x2a\x26\x3c\xfa\x99\xe8\x54\x44\x39\xd9\x63\x31\x63\x9f\xe9\x40\x8e\x54\xa3\x50\x61\x0f\xf0\x1d\xe3\xf8\x57\x99\xad\xeb\x73\xd8\x2b\xe9\x38\x07\x4d\xea\x85\x8e\xa6\x36\xb6\x3a\xbd"}, +{{0x0a,0x55,0x25,0xa4,0x59,0x8f,0x60,0x99,0x2f,0x86,0xba,0x1a,0xb9,0xee,0xe6,0xe2,0x67,0x56,0x22,0xf9,0x43,0x28,0x4f,0xc0,0x55,0x3e,0x44,0x46,0xac,0x5a,0x4c,0x53,},{0xdb,0x60,0xd7,0xea,0x29,0xf8,0xd6,0x0d,0xad,0x33,0xd0,0x2e,0xc5,0xf4,0x22,0x32,0x05,0x7b,0xd1,0xc4,0xbd,0x61,0x80,0xa2,0x42,0xcb,0x7a,0xb6,0xf4,0x42,0x67,0x81,},{0x8f,0xa6,0xb0,0xae,0xac,0x71,0x13,0x2a,0xd8,0x82,0x97,0x58,0x68,0xf1,0xbd,0xb8,0xc1,0x1f,0x1a,0x6c,0x1b,0x9c,0x54,0x59,0x4e,0x0e,0x46,0x28,0x6e,0xa6,0xc9,0xa5,0xd6,0xd5,0xb0,0xea,0xea,0xca,0x9a,0xe3,0xaf,0x74,0xe7,0x23,0x26,0xb3,0xb6,0xf2,0xea,0xa8,0x93,0xc0,0xec,0x42,0xa4,0x9c,0x56,0xef,0x51,0x4f,0x75,0xc7,0x7f,0x01,},"\xf7\x87\x32\x1b\x42\xc0\x8d\x40\x52\x44\x9a\x48\x85\x93\xd8\x85\xb4\xe0\xc3\x4a\x5d\x64\x14\x9f\xa8\xb9\xc8\x5e\xe5\x4b\xcb\xec\xb5\x09\x09\xb2\xa8\x6b\x88\x25\x8a\x10\xe0\x7e\x8f\x8c\x2d\x06\x8a\x89\xfb\x16\x5a\x6a\xce\x7e\x64\x99\x8b\xa5\x7d\x89\xd9\xbf\x2b\x8b\x38\xa1\xf6\xd8\x36\x4a\xee\x05\xce\x33\x48\xbe\xd4\x8b\x88\xc2\x47\x3b\xf5\xf2\x66\x5f\x51\xca\x07\x3a\x53\x05\x35\x8e\xaa\xd4\x36\x5d\x58\xb8\x3b\xc9\x81\x4e\x25\xf5\x4c\x37\xcd\x9b\x68\xa8\x08\xa5\x7d\x6c\x2d\x7d\x7b\x6d\xeb\x5f\xe2\x0f\x4f\x96\xfe\x72\x5f\x8d\xe6\x5c\x29\xa4\xf1\xcc\xef\xd7\xc2\xc6\xf2\xfc\x01\x16\xd5\x86\x76\xac\xbc\x58\x69\x1c\x79\xc2\xb0\x06\x78\x5a\x09\x75\xa3\x1d\x8d\x3c\x94\x91\x61\x59\x6a\x06\x8a\xaf\x22\x26\xab\x84\x25\x50\xe9\xc0\xb2\x61\x0a\x29\x53\x1d\x1f\x3f\x7f\x00\x82\x6b\xb6\xc7\xdb\xe0\x4e\x28\xae\x1b\x9f\xf6\xf8\x88\xa4\x9d\x82\x81\x2f\x45\x2e\x1b\x32\x74\x0b\x23\x4d\xdd\x96\x42\xe1\x8f\x32\xad\x9a\x9a\xf7\xf8\x95\x25\x28\x67\x4a\x2c\xda\x25\xb4\xf7\xba\x86\x70\x07\xff\xa7\xf7\x8f\x16\x3d\xb8\xf3\x69\x14\x95\x6b\xfa\xec\xd5\x0f\x6d\x1a\xf4\xee\x13\x32\x75\xa8\xea\xab\x94\xbb\xc0\xae\x52\xb6\xd9\xb2\x83\x26\x34\x23\x2e\xc0\xe8\xb5\xf8\x02\x2d\x3e\xf1\xea\xd9\xb7\x9e\xf9\xa1\x65\x64\x27\x71\x94\xf2\x38\x0d\x90\x21\xe1\xf1\x7b\x18\x4b\x8d\x3a\x7a\x34\xd1\x51\x39\xa3\x9c\x77\x28\xc2\x2e\x1a\x3a\x67\xa2\x7a\x6c\xa4\xb8\xa8\xa0\x63\x6c\x60\x54\xd0\xf7\x41\xf0\x46\x67\x36\x19\xfc\x6b\x07\x0e\x62\xff\x48\x62\xf5\x9d\x26\x90\x07\xf3\x43\x13\x39\x63\x7a\x89\xf5\x64\xc0\xdb\x3d\x9b\xcf\xcd\x19\xfc\x25\x13\x8a\xc6\x6d\x47\x4d\x80\xf4\xad\x79\xf6\xd1\xe7\x84\x44\x08\xe8\x80\x34\xee\xaf\xf4\xa7\x90\x33\x8d\x54\x6b\xfc\xd7\x42\x4c\x11\x9e\x21\x1f\x36\x3c\xb8\x9c\x88\x87\x49\x34\x6a\x89\xd3\x2f\x02\x3b\xb6\xb0\x36\x6a\x1e\xde\x43\x25\x03\x2a\xa3\x5f\x52\xe9\xdf\x93\x8a\x50\x27\xeb\xee\x96\x88\xae\x48\x0d\xde\x1a\x9c\x9b\x42\xd1\xa9\xc0\x8f\x71\x92\x23\xdf\xae\x1c\xfc\xd4\x9d\xd1\x05\x3a\xaa\x38\x1c\x24\xcc\x9c\x7a\xbf\xcf\x8f\x6d\x86\xd6\xaf\x72\xee\xf0\x53\x04\x41\x2f\x3d\xb2\x58\x5a\xa9\xe0\xf3\xa4\xf1\xb6\xd7\x10\xd0\x2a\xb1\x1d\xb1\xfc\x90\xad\x4d\xe2\x5d\x04\x29\x9f\x31\x29\xc2\x12\xe9\xcb\x73\xc0\x04\x79\x53\x45\x5b\xf9\x8e\xc8\xfd\x26\x74\xe4\x7b\x94\x99\x57\xde\xed\xa0\x18\xba\xdc\x9f\x2f\x68\xa1\xb1\x8e\xf5\xc5\x83\xb0\x95\xe0\x8d\xd9\x06\xda\x5f\x22\x0d\xa0\x29\xb9\xc4\x00\xe3\xca\x91\xc7\xcb\xd8\x7f\x34\x30\xc7\x42\x33\x7f\x61\xcf\x54\x74\x5b\x06\x22\xbc\xb9\x07\x62\xc6\xba\xfe\xf8\x7e\x1e\xc8\x88\xc3\x64\xfa\xd6\x46\xc3\x3a\xcc\x22\xaf\x54\x38\xb8\x4c\xd5"}, +{{0x2d,0x5d,0xdf,0xfa,0x2e,0x58,0xc9,0x04,0x51,0xea,0x05,0xde,0x47,0xb8,0xc4,0x92,0x34,0xe2,0x6c,0xed,0x54,0x85,0x4e,0x3a,0xce,0xf1,0x1d,0x8e,0xe6,0x85,0x2d,0xa7,},{0x7b,0xfd,0x1c,0x8a,0x4a,0x0b,0xbb,0x46,0x06,0xd2,0xe5,0xbc,0x09,0x0f,0x56,0xb2,0x0d,0x58,0xf2,0x20,0x4b,0x6a,0xed,0x83,0x1d,0x3d,0xf4,0xd4,0x06,0xb4,0x76,0x05,},{0xce,0xd9,0xd6,0x10,0x10,0x33,0x9c,0x47,0x1d,0xdf,0x9f,0xef,0xca,0xa8,0x2d,0x1e,0xab,0x3a,0x2e,0x0e,0x60,0x27,0x85,0x53,0xb4,0xdd,0x9f,0x39,0x5b,0xe5,0x81,0x49,0xc9,0x15,0x94,0xe5,0x61,0x8b,0x0b,0x10,0xbf,0x3a,0xab,0x94,0xf1,0x59,0xb5,0x30,0xf6,0x44,0x63,0xee,0xd6,0x6f,0xa2,0xac,0xe5,0x4f,0xd9,0x25,0x72,0xa0,0x6a,0x0e,},"\x4f\x1c\x5b\x4e\x6f\xac\x3b\xaa\x3e\x90\x10\xf3\xbf\x29\x3c\x77\x9e\x61\xfd\x7b\xbe\x05\xa5\x86\xf5\xaa\xf0\x80\x26\x37\x16\x27\xa2\x09\xac\xd1\x88\xaf\xb2\xdb\xe0\x31\x15\x47\x94\x05\x59\x71\x16\x40\xf7\x8a\xea\x9a\x62\x81\x89\x62\xf4\x45\xa8\xe7\xed\x6f\xe6\xc5\xf4\x91\x62\xe7\x43\x5d\x1b\x62\x5b\x88\xba\x39\xda\xb0\xad\x56\xfd\x2c\x0a\xd6\x51\x26\x61\x36\x2b\xf7\x8a\xfe\x5a\x14\x16\xb6\x47\xf3\xb8\x8a\x05\x6c\x9e\x72\x89\xc9\xb0\xcc\x3a\xfb\x43\x40\x21\x98\x56\x34\x93\xe7\x37\xb1\xda\x05\x25\x06\xb6\xc9\x30\x6d\x75\xad\x66\x93\xdb\x6d\x15\x71\xf9\x6f\x6f\x52\x99\x0c\x4d\xf1\x96\x65\xa6\xbb\x63\x07\x3f\xdd\x9f\x55\x59\x68\x96\xa2\xe9\xc2\x62\x2f\x2b\x0c\x2c\xc9\x9d\xdd\x1b\x64\x9f\xb0\x31\x80\x58\xd7\x47\x94\xe3\x8e\xc6\x57\xeb\xc8\x2a\xbd\x5b\xed\xf8\xb3\xf4\xbb\xa3\xbb\x6c\x99\x35\xfd\xf6\x82\x65\x02\xb7\x69\x04\x6b\x36\xd9\x6d\xc6\x95\xd7\xc8\x54\x04\x28\x4d\x2a\x2a\xb7\xfc\xf3\xb0\x2f\x68\xa1\x49\x3d\xd3\x83\xca\x63\x39\xfa\xc1\xcd\xe4\x7f\x53\xc5\xe0\x26\xd0\x86\x9f\xaf\xfe\x40\xab\xdb\x98\x19\x52\x30\xf1\x7d\x0c\xfa\xa5\x33\x31\x5a\xfd\xbf\xe7\xd1\xaf\xc3\xa6\x15\xb4\xf7\x50\x90\x23\x3a\x50\x3f\x88\x61\xe3\x23\x74\xe1\xea\x95\x57\x67\x42\x31\xd9\xd7\x37\xd4\x77\xb3\x3f\xf8\x2a\xc0\xb2\xc0\xba\x93\xc1\x1f\xb5\x23\xe6\x13\x61\x8e\xd3\x70\x52\x4a\x60\xf4\xd4\xc8\x36\x94\xc0\x33\x60\x6d\x1d\x06\x9d\x54\x4d\xcc\xd3\x90\x0c\x37\xa3\xb3\x36\x3e\xfb\xcf\x66\x97\xf9\xf7\x62\xb3\x3b\x12\x94\x58\x39\x53\xfc\x53\x77\x3e\xf5\x67\x26\xee\xb4\x70\xeb\xe9\x21\x49\xb7\x36\x48\xa1\x61\x61\xd4\x94\x12\x0a\x31\x8b\xfb\x08\x0c\xc3\x8e\x49\x96\xf4\xb2\x63\xff\xe7\x8c\x78\x77\xfe\x13\xc2\xfc\x55\x21\x9f\x44\x26\x0e\x8f\x25\x3b\xdd\x37\x9d\x87\x0e\x6c\x91\x04\x8b\x1d\x8d\x4e\x88\xb8\x82\x18\xb2\xb0\x49\xfe\xf5\x3b\x2a\xe1\xf8\xc9\x21\xed\x2b\xcb\x43\x46\x69\xe3\x97\x5d\xcc\x3f\xe4\x52\x0c\xa8\x02\x48\x42\xf7\xff\x2b\xa1\xe2\x2c\xfe\xb5\xd4\xc9\xe4\x35\xea\xda\x60\x1f\xf1\x83\xb2\x63\x64\xee\xe1\xfa\xa5\x9d\x19\xe6\xaa\x4f\x09\x75\x23\x84\x96\xa7\x09\xe4\x6b\xf6\x83\x36\xb0\x68\xbd\x80\xb3\x46\xf1\x1f\xaa\x38\x17\xa0\x7d\x1c\xbd\x84\x38\x2b\x21\x02\x98\x6f\x29\x5a\x13\x98\x07\x7b\xa2\x91\xd6\xb5\xf5\xbd\x86\x0e\xc6\x17\x72\x73\x46\x8f\x0e\xe0\xf2\x59\x1b\x57\x5c\x43\x66\xe1\x89\xb2\x24\xe9\xff\xa3\x5b\xc7\x8a\x4a\xa8\xc0\x69\x54\xfe\x33\xd0\x80\xff\xc0\xb2\x3e\x20\x9f\xd0\xe7\x94\x21\xf1\xbd\xe8\x18\xa8\x68\x90\xcf\x17\x22\x36\xdb\x21\x16\x57\xd1\x00\x31\x19\xfe\x91\xd4\xe2\x7c\x52\x4c\xcc\x11\xfa\xde\x0a\x25\xf5\x7a\x7a\x1d\x67\x7e\x1d\xa0\xb9\xc0\x43\xd0\x2f\xca\x38"}, +{{0x4d,0xf5,0xe1,0x1d,0xec,0x80,0xec,0xd8,0x82,0x83,0x75,0x54,0xfa,0x31,0x35,0xb9,0xd5,0x02,0x9d,0xf4,0x20,0x27,0xaa,0x3b,0x3c,0x92,0x92,0x46,0x32,0x9f,0xee,0x96,},{0xef,0xd9,0x28,0x89,0x8f,0xa1,0x44,0xc2,0xd1,0xc8,0x33,0x4f,0xa2,0xe6,0xb5,0xb6,0xa3,0x25,0xa7,0x10,0x2a,0x2c,0x34,0x4a,0x14,0x55,0x41,0xee,0x9a,0x6c,0x04,0x6d,},{0x62,0x54,0x5e,0x6c,0x07,0x80,0x1f,0xde,0x95,0xb4,0x61,0xe2,0xe7,0x53,0xc4,0xb6,0xc8,0x4c,0x25,0x12,0x4e,0xb3,0x30,0xa2,0x72,0x59,0x89,0xd5,0xe3,0x40,0xdc,0xef,0x0c,0x74,0x56,0xd4,0xc7,0xc6,0xa1,0x78,0xa2,0x21,0xb6,0x32,0x83,0x48,0x25,0x3d,0xb7,0x87,0xa9,0xe5,0x51,0x0a,0xb9,0xcc,0x27,0x85,0x15,0xae,0x3e,0x58,0xfb,0x01,},"\xfb\xd6\xf3\x71\xb4\xc8\xb1\x52\xc9\xce\x0c\x63\x96\xa7\x7c\x0f\xe4\x80\xbc\x02\x00\x7f\x33\x6a\xc5\x8f\xd4\xad\xdd\xa9\xd6\x98\x55\xac\x9e\x93\xa4\x5d\x3e\x35\x0f\x41\xff\x50\x2a\xa1\xd8\xfe\x15\x9c\xe8\x9b\x06\x48\x02\xa0\xa1\x89\x0f\x6a\x40\xa7\xef\x57\xc6\xe5\xe5\xed\x04\x02\x80\xdf\x07\xe7\xf4\x8f\xe8\x19\xbe\x63\x17\x67\x10\x75\x7c\xb6\xe4\x40\xb4\xf7\x8b\x57\x59\xdc\xe0\x28\xbf\x58\x5b\x3c\x3f\xec\xa1\xcf\x59\x81\xda\xda\xdf\xd2\x7e\xa1\x24\xaf\x45\xef\x63\x85\x42\xa8\x61\x7f\xf4\x9f\x94\x70\xac\x22\x85\x94\x3c\x7c\x3b\x11\x63\xb9\x03\x95\x5a\xb9\x9b\x6e\xab\x17\xf4\xd4\x9f\xfa\x87\x20\x7a\xbb\xfc\x11\x1c\x4b\x91\xf5\x41\x3d\xfc\x9b\xea\x31\x84\x3d\x11\x5d\xde\xb1\xda\x40\xb4\x5f\x58\xf4\x7c\x41\x7b\x5e\x77\xd5\x81\x89\x34\xe7\x30\xeb\xa9\xc4\x55\x7b\xbf\x48\xcb\x7f\xd4\xe6\x64\x55\x8a\xf4\xfb\x44\xee\x3d\x94\xc1\x6e\x88\x36\x31\xf3\x84\x76\xf4\x83\x7d\xb9\x4d\x54\x12\x2f\xa1\x34\xca\x51\xa5\x25\xaa\xd5\xe2\x4b\x76\x01\x8f\xee\x9a\x2e\x8f\x60\xe2\xbb\x48\xd2\x4a\xb8\xb1\x46\xf8\x4f\xfa\x98\x20\x12\x0e\x7c\x50\xd4\x5c\x0c\xfb\xe3\x5c\x8c\x31\x41\x9b\x07\x8e\x90\x71\x2c\xfe\x93\x4c\x3b\xe3\xa9\x4f\xf2\x15\x88\x73\xae\xfe\x34\xdc\x6e\x36\x90\x2b\x16\x75\xe1\xa4\x7c\xb6\x08\xdf\xe9\x60\xfb\x4d\xa8\xd2\xa8\x49\x0c\xc3\x8e\xba\xdc\x73\xa1\x00\x3c\x49\x41\xfd\xa8\xfa\xe9\x44\xa1\xde\x8e\x3b\x10\xef\x6d\x9e\x67\xce\xec\x74\x59\x77\xd3\x33\xac\x9e\x71\x21\x41\x21\xed\xe8\x89\x22\x95\xe2\x77\x99\xf2\x06\x67\x5a\x9d\x54\xac\x12\x15\x9d\x3a\x1f\x95\x4f\xd0\xee\xff\xbd\x30\xa3\x19\x04\xfb\x2e\xee\x77\xa8\xaa\x9d\xc4\xcc\xbb\xe2\x85\x10\x96\x14\x6a\x4c\xe0\xe8\x1f\xb9\xc6\x24\x98\xdb\xd8\x3b\xf8\x3b\x55\x02\x9a\x5e\x90\x00\x86\xb9\x53\x1c\xe3\x24\x7a\x98\xf8\x65\x4e\xfd\x8f\xe7\xa8\x36\x43\x1f\x75\xda\xf0\x86\x8f\x01\x08\x32\x6e\x23\x02\x6d\x2d\xb4\xa7\x21\x24\xec\x4e\x39\xd4\xbb\xf3\xd8\x46\xc9\xf5\x1c\xa3\xcc\x31\xeb\x1d\x02\xc2\xba\x32\x1e\x46\x19\xf2\xb6\x59\xc0\xbf\x0f\xe5\xc1\x9b\x21\x3f\x3c\x79\x12\x4f\x36\x43\xf7\x4d\xd0\xff\x9c\xe5\xd2\x77\x27\xbe\x6c\x69\x58\x15\x9c\x16\x44\x04\xf4\x33\x01\xfe\x17\x42\xe2\x79\xde\x9e\xfd\x44\x1e\x73\xe4\xea\x7a\x84\x25\x87\xa7\x9d\x11\x5d\x36\xec\xa9\xc0\x3c\x90\xff\x0d\x14\x74\x74\x10\x9f\xc2\x0a\x91\xd7\xb3\xcc\x22\xeb\xcb\xb8\xc7\xf7\x1b\xd6\x1e\x8c\xae\x47\xc5\x05\x0c\xec\x1d\x48\x49\xa1\xd4\xa8\xe7\xa6\xf8\x45\x54\x84\x37\x70\x6c\x25\x33\x1c\x9e\x57\xc2\xcc\x6d\xa1\x17\xf2\xe5\xa0\xf4\xb3\x68\xc4\xcb\x20\x62\x65\xc4\x17\x8e\x06\x55\xff\x67\x5f\xfc\x1d\x4c\x58\xec\xeb\x9e\xdb\x4d\xa3\xad\x2c\x5f\x62\xcd\x13\xab\x48"}, +{{0x85,0xd3,0x23,0x30,0xe2,0xe0,0x73,0xa4,0x60,0x30,0xca,0x0e,0xe2,0xdf,0x2f,0x8e,0xb8,0x74,0xa9,0xfd,0xdf,0x56,0x24,0xc8,0x03,0x17,0x75,0x11,0x1f,0x11,0xee,0xa2,},{0x6e,0xa7,0xde,0x2e,0xd5,0xea,0x5c,0xdf,0x50,0xbf,0xff,0xee,0x77,0xf7,0xbd,0x2f,0xcc,0x21,0xd4,0x86,0x66,0xbb,0x1f,0x48,0x90,0xc7,0x6a,0x69,0xcc,0x7b,0xa4,0xe8,},{0x41,0x43,0x63,0xfe,0xad,0x6e,0x59,0xa3,0x43,0x8c,0xe5,0xa3,0xa2,0x77,0xd6,0x2b,0xdd,0x00,0xfa,0x2e,0xfa,0xc6,0x46,0x3d,0xd1,0x3f,0xcd,0xde,0xd9,0x3a,0x7f,0x10,0x8a,0xe1,0xf5,0x28,0xff,0xc8,0xff,0x4e,0xca,0x33,0x1d,0xab,0x91,0xae,0x5b,0x14,0x16,0xe2,0xdd,0xb7,0x3b,0x6d,0xaf,0x85,0x3b,0x03,0xc8,0x1e,0x99,0x36,0x56,0x0a,},"\xae\x61\x07\xf3\x8f\xf9\x4e\xd0\x32\x79\x03\xcb\xaf\x6c\x3e\x3a\x34\x98\xc4\x7a\xbb\x29\x89\xa8\xb3\x7b\x3a\x19\xdf\x88\xc6\xde\x79\x0a\xcc\xb4\xb7\x25\x81\x77\xb9\x15\x1d\x1f\xe0\x40\x63\x57\x7d\x3c\x3a\xcd\xb4\xc9\x29\x96\x8a\xfd\xad\x6f\x25\x2a\x67\xed\x4c\xa8\x9d\x06\x0f\x1a\x46\x53\x98\x3f\x7a\xb5\x8d\xdb\x93\xe2\x87\x8f\xba\xb0\x63\x7d\xbb\xeb\x95\xd2\x5c\x59\x86\x83\x9d\xe2\x74\x8d\x9f\x34\x02\x7a\xee\xbf\x1d\x9e\xb9\x36\xcb\x67\x70\xe0\x8d\x45\xb8\x09\x5b\xac\x9c\xbb\x71\xdb\x14\xe8\xa3\x42\x22\xb1\xf2\x23\x7b\x9f\x0b\xc9\x76\x6a\x23\x1a\x6d\x10\x27\x99\xf7\xc0\x81\xd5\x00\xfb\xea\xde\x60\x3c\xdc\xdd\x7d\x5b\x96\x5f\xba\xce\x4b\xe5\xc2\xcd\x93\x2d\xcf\x5f\x6e\xd3\x17\x22\xf4\x1d\x5a\x36\x3b\x34\xba\xbf\x3f\x63\x6f\xb3\x03\x82\x4a\xa7\x01\xdf\xe1\xd3\xe4\x12\x63\x07\x8c\x1e\xbb\xdc\xb1\xf7\x3f\x12\x45\xb8\x3e\x3f\xa7\x0a\xb8\xe3\xf1\x41\x3e\x6b\x06\xbd\xae\x02\x2b\x71\x4d\x60\xa4\x01\xd5\x74\x80\xdc\x64\xe7\xaa\xc6\xd3\xde\x85\xfc\x94\xd8\x53\xca\x13\xb7\xe6\x74\x15\x57\x9d\x5c\x67\x21\x23\xa5\xaf\x19\x4b\xee\x14\xae\x35\xdc\x27\x24\xff\x20\x9f\x11\x66\x63\x86\x61\xf8\x81\xb1\x19\x4a\xa4\xe3\x1b\x42\xa5\x27\x96\x47\x81\x59\x15\x04\xba\x76\x10\x3f\x97\xb7\xf5\x52\x03\x15\x47\x3e\xc9\x4b\xb0\x17\xa1\x66\x67\xb2\x2a\x85\x76\xa7\xcc\x2a\xc0\xb7\x75\x63\x03\xc7\x56\xf0\xdd\xaa\xe9\xd0\x18\x9e\x6c\x8d\xe3\x49\xf9\x19\x57\xc7\x2a\x52\x9e\x9f\x7e\x9b\x94\x56\x52\x48\x40\xba\x02\x34\x4f\x55\xad\x3c\x11\xa0\xb2\x59\x90\x14\x39\xf2\x65\x5a\xb9\xf8\xc6\xc8\xe8\xe9\x60\xc0\x57\xd9\xc7\xda\xfe\x42\x5c\x75\xd4\xa3\x3b\x80\x1d\x45\x47\xcd\x05\x51\xa6\x80\x2a\x80\x05\xdd\x72\x42\x47\x64\xdc\xf5\x7e\x4a\xa2\x22\x90\xea\x4f\x5b\xaa\xc5\x1d\x79\x39\xc0\x53\x42\x88\x2e\xe1\x43\x80\xef\x2d\x47\x04\xb4\x19\x49\xb2\x28\x2a\x1e\x1a\x3f\xa7\xdd\xea\x9f\xe8\x3b\x9f\xc5\x1d\x4e\xef\xa2\xeb\xac\x72\x2e\x4c\x0a\x7c\x59\x9b\x69\x25\xf0\x1b\x8a\x20\x66\xdc\x0c\x26\xf9\x21\x96\xf4\xf5\x03\xe8\x87\xc1\xe6\xef\xb0\x93\xf1\x53\x13\x87\xbd\x88\xc6\x91\x99\x7b\x9b\x89\xe3\xcd\xf7\xda\x12\xd3\x73\x41\x83\xa4\xb6\x12\x6b\xe9\xe0\x77\x47\x04\xb5\x29\x65\x9b\x55\x48\xf1\xb8\x75\x12\xcc\x18\x78\xca\x4e\xf5\x59\x90\xb4\x83\xc9\xaf\x6a\xa9\x76\x35\xf4\xf0\x79\x49\x72\x70\x65\xab\xf2\x1e\x21\xe3\x29\x90\xb1\xa7\xd0\x7d\x74\xe0\x2d\x9b\x07\xec\x63\x99\x31\xbf\x9e\x2c\xa3\x94\x1f\x2b\xa6\xb5\xef\x14\xdc\xc2\xa2\x47\xd2\x11\x7e\x9c\xb4\x1e\xfa\x3f\xcc\xa2\x47\x16\x64\x14\x52\xbe\xed\x2f\x92\x65\x7c\x2f\xb7\x31\xf0\xb9\x4e\x8c\x89\x2a\x81\xbb\xa9\x1f\x63\x9d\xf4\x37\x96\xac\xd3\x01\x3a\xc0\x44\xf6\x08"}, +{{0x66,0x59,0x0d,0x36,0x99,0x84,0xc6,0xf5,0xad,0x3a,0x89,0xc7,0x8d,0xdf,0xca,0x10,0xa0,0xa7,0x65,0x79,0x95,0xdc,0x01,0x88,0xb6,0xb5,0x7a,0xc3,0x16,0x47,0x31,0xa4,},{0x98,0x87,0x3a,0xb1,0x33,0x46,0xee,0x48,0x67,0x7c,0x4f,0x86,0x12,0xdb,0x31,0xeb,0xd1,0x3d,0xb5,0x8b,0x2b,0x03,0x4f,0xd1,0x55,0xaf,0xa8,0x72,0x0f,0x4e,0x93,0xe8,},{0xf0,0xdb,0x63,0xa1,0xbc,0x76,0x24,0x16,0x1c,0xa0,0x06,0x38,0x53,0xb2,0xde,0xe4,0x5f,0xcc,0xd2,0x24,0x71,0xe0,0x12,0x36,0x6f,0x86,0x8a,0x4a,0x9c,0x74,0x65,0x4e,0x13,0xf1,0xa3,0x15,0xad,0x83,0x91,0x6e,0xbf,0xb8,0xdc,0x31,0xa4,0x20,0xf8,0x3c,0xf6,0x45,0xc4,0xc9,0xd1,0x6b,0xb4,0xd5,0xd9,0x9d,0x23,0xc7,0xb4,0x3e,0x23,0x00,},"\x2e\xc1\xc6\xb0\x82\x97\x37\x83\x2c\x9c\x79\x8a\x92\xeb\x49\x0b\x23\xd3\x34\xc3\xbb\xe6\x27\xcb\x58\x2d\x17\xa9\xe4\x29\x60\xef\xcd\xc7\xd3\x47\x50\xe0\xb4\xaa\x86\x4c\x20\x4f\xb8\xd6\x2b\x47\x99\x2e\x91\xdb\xfc\xfd\x69\xf5\x1d\x93\x7d\xc0\x6c\x48\xc0\xad\x43\xe8\x59\x83\x71\xcd\x0e\x3b\xbc\xe4\x16\xbf\xd4\x4b\x09\x44\xb9\x93\xaa\x29\x93\xfd\xea\x48\x71\x34\xcd\xe4\x22\x77\x72\x3e\x06\x83\xec\x98\xe6\x95\x95\xe9\xb7\xb1\x4c\x8c\xf9\x61\x7a\x1e\x30\xdd\xb8\x06\x0e\xac\xba\x48\xd8\x82\x53\xb1\x65\x33\x61\x08\xde\x0c\xb0\x2f\xf2\x0f\x54\x24\xb5\x67\x83\x08\x69\xc9\xb4\x32\x9c\x99\x45\xf0\xbf\x2f\x3c\x7a\xcd\x1e\x77\x43\x58\x93\x0c\xd8\x90\xfd\x9c\xb8\x64\xd9\x50\x93\x5a\xd8\xa4\xa3\xbe\xcc\xae\x8f\x83\x3f\x63\x56\x19\x13\x71\xc3\x26\x33\xdc\xf8\x82\x70\x9b\x0d\x98\xbd\x80\x7b\x38\x3a\xed\x8d\x7b\xb0\x97\xb6\xe2\x62\xef\x70\x0c\x9d\x76\x8f\x4b\x56\x90\xe3\xa1\xa8\xf2\x17\x55\xd6\x58\xdb\x2d\x1b\xfd\x2f\x70\x71\xe0\xca\xec\x7c\x2c\x53\x81\xc5\xef\x5c\x2c\x22\x81\xc6\xbc\xed\xc8\x67\x39\x0b\x90\xf3\xb2\x7b\x0f\x0f\x64\xa3\x36\x58\x57\x8a\x5c\x0d\x66\xe2\x11\xe6\xff\xf6\xe8\x64\x88\xac\xf8\x2b\xc0\xf5\xe2\x66\x4b\x83\x69\x90\x46\x03\x7c\x0d\x33\xd3\x40\xff\x98\xed\x62\x63\x35\x4c\x24\x27\x31\x36\xff\x0e\x4f\x0f\x23\x3a\x6c\x82\x54\xfc\x0c\x90\x76\x43\x30\xe3\xb1\x05\x7b\x1e\x66\x6d\x5e\xcd\x5a\x2e\xfe\xaa\x6a\x10\x5b\xfc\x85\x84\x31\xb8\x8e\xd7\xfe\x55\x1e\xb3\x2a\xc0\xaf\x27\xc6\x6a\x98\x03\xa3\xbc\xf8\x76\x34\xc6\x6c\x70\x66\xdd\x01\x97\xa3\xcb\xd2\xd6\xf4\xe6\x5c\xfd\xb8\xf3\xda\xf9\xf3\xca\x5c\x4f\x4e\x0a\xdd\x45\xf5\x54\x1a\xa1\x8d\x04\x1f\x70\x6e\x4f\xa8\x7c\x34\xe9\xa2\x23\xd8\x85\x72\xeb\x50\x08\x3e\xe8\xc7\xc4\x75\xdf\x56\x8b\xc7\x3b\xd0\x8c\x0f\x0d\xea\xa3\x74\xaf\xb1\xc1\x78\xd0\xdd\xdb\x23\x6e\x15\xa8\xbc\x23\x85\xed\x3f\x52\xb8\x76\x1e\x63\x78\x87\x40\x7a\x20\xae\xc3\xe9\x9e\xc8\x30\xda\xe3\x16\x7e\xf0\xcd\xb3\xf3\xff\xd2\x00\xd8\x3b\x75\xb7\x49\x69\x0b\x9e\x25\xe2\x17\x1d\x07\x2c\xa5\x6f\x71\xba\xec\xd2\x1f\x7d\x45\xa1\x2c\x91\xb2\xc0\xfb\x3f\xea\x3b\x15\x8e\x54\x64\x82\x84\xbb\x00\x95\xb3\x62\x44\xb0\xb1\x21\xf9\xf1\x38\x4c\xe9\x00\x43\x65\xe7\x77\x2f\xa3\x08\x28\x25\x0f\x51\x98\x5f\x1b\x17\xb2\xd2\xf8\x0a\x33\xe8\xfc\x6d\x85\x65\xea\x15\xcd\xaa\xcd\x42\xa8\x7b\xd7\xc9\x40\x8b\x1f\xe1\xc7\x70\x66\x5b\xdd\xed\x75\x4b\xc2\xff\x2e\xf9\x1b\x97\x3a\x86\xb9\x9f\x10\x59\xc6\xf2\x27\x24\x6a\x69\x8b\x38\x54\x15\x09\xdd\x54\x49\xfc\xe6\x0d\x38\x62\x24\x18\x3b\x7d\xce\x1b\x38\x84\xf7\xba\xe1\xc2\xe4\xeb\x59\x45\x10\xb5\xca\x58\x52\x79\xd9\x04\x1d\xf8\x81\x7b\x06\x19"}, +{{0x41,0xcf,0x07,0x1f,0x48,0x42,0xec,0xd4,0x94,0x19,0x1b,0x8c,0xf2,0x8c,0xc0,0x92,0x31,0x85,0xef,0x1b,0x07,0x45,0x8a,0x79,0xa5,0x9a,0x29,0x6d,0x35,0x49,0x82,0x2e,},{0x6d,0xc8,0xe4,0x46,0xdb,0x1d,0xa3,0x53,0xb5,0x8d,0x0c,0x45,0xd8,0xb4,0xd8,0x16,0xba,0x59,0xe2,0x5b,0xb6,0x80,0x71,0x2d,0x62,0xd6,0xd3,0xdb,0xf7,0x8d,0x06,0x98,},{0x41,0x05,0x2b,0xc4,0x17,0xb2,0x4d,0xc4,0x83,0x83,0x96,0x6a,0xf0,0x14,0x3f,0x9c,0x0b,0xa8,0x5b,0xbe,0xfb,0xda,0xf7,0x91,0xb1,0x6a,0x4d,0xad,0x1f,0x57,0x0e,0xb8,0x07,0x03,0xc0,0xa2,0xcd,0xeb,0x2f,0x7a,0xd6,0xdc,0xd3,0xfa,0x7b,0xdb,0x5c,0x22,0x5e,0x86,0x9c,0xd8,0xfb,0x27,0x8d,0xff,0x06,0x67,0xd3,0x8a,0xcc,0xf3,0xdb,0x08,},"\xda\xeb\x5f\x0e\x84\xf1\x59\x0b\xca\x2b\x9d\x97\x19\xef\x5d\x1c\xfa\x79\xe0\x58\x34\x46\x33\x2f\x18\xe9\xe4\xfe\xb0\xb1\xf1\x53\x40\x29\x7a\xc9\xad\x67\x24\xc8\x5b\xb1\x65\x58\xea\x54\xeb\x5d\x70\x2a\x47\x24\x8b\xad\xc6\x25\x2a\x80\x43\x71\xb7\x4c\xfe\x10\x62\xd1\xdb\xa1\xec\x68\xfd\x1d\x4d\xd0\x29\xcb\x55\x03\x4b\xbf\x61\x06\x82\x51\xef\xf3\x98\x36\x36\xf6\xde\xbd\x57\x27\xbe\x91\x99\x3b\x3e\x4d\x0a\xbc\x96\xec\x19\x64\x21\xa4\x7b\x78\x93\xf8\x39\x86\xd6\xc0\x32\x3f\x0d\x19\xaa\xf2\xcd\xe9\xd3\x56\x5c\x10\x4c\x9d\x31\x76\xec\xb5\xed\x5e\x17\x3f\xee\x52\xb5\xa0\xc4\x2b\x6a\xb2\xfc\xb1\xcc\xba\x96\x49\xc2\xc6\x7c\x52\x0e\x9b\x96\xce\xa6\x93\xdf\x3e\x58\x60\x9a\xd6\xa0\xbd\x52\x2e\xfa\xaf\x03\x85\x8d\x24\x5d\xd0\xa3\x8f\x84\xa2\xfb\x10\x20\xf4\xdd\x97\xc3\xae\xef\x0e\x24\x47\x7d\x30\xd2\x56\x70\x1e\x90\x0b\xef\x26\xa8\xa6\x26\x9a\xb6\x60\xd7\x42\x93\xa2\xbf\x1d\x20\xc2\xcf\xae\xbb\x7c\x28\x20\xf5\xf5\xb0\x74\x53\xbb\x69\xee\x76\x9b\x52\x39\x15\x39\xf0\xc6\x06\xd2\x2e\xb3\x92\x3e\xe6\xf5\xa1\xd4\x60\x50\xaf\x90\xf0\x11\xf8\x51\xac\xe7\x63\x27\xd3\xd1\x8c\x48\x17\x0a\x9a\x25\xb0\x4b\x77\x0f\xd9\x38\xef\x8a\x30\xb7\xbd\x03\x39\x1d\xd3\x6c\x51\x6b\x62\xf0\xcb\x78\x67\x07\x40\xe0\x0e\x69\x59\x5c\x41\x8d\x96\x72\x53\x82\x0b\x75\x4c\x4f\xd6\x66\xe3\xcc\xe1\x6e\xe0\xc9\x41\x83\xbb\xea\x70\x6f\xe2\x98\xe1\xc9\x9d\xdb\x82\x12\x17\xed\x90\x08\xcc\x8e\x8b\x83\xbc\x8b\x81\x99\x15\xb0\x7b\x14\x6f\xe7\x45\x02\x4a\xc3\xc4\x61\x16\xcb\x4c\xce\x5e\x32\xec\x5d\x75\x24\xa2\x38\x8d\x9f\xe2\x97\xeb\x02\x81\x1a\xf4\x54\x6f\xcd\x58\x60\xe1\x4c\x0d\x13\xf0\x3d\xd7\x5a\x42\x49\x61\x59\x00\x07\x8a\x3c\x35\x8c\x53\x42\x96\x2b\xc1\xbe\xac\xf6\x8c\x24\x68\x21\xa4\x59\xab\x53\x21\xec\x9f\x57\x4f\x49\xd1\x03\x89\xf4\x0f\x14\xdd\xfc\x85\x13\xff\xe3\xde\xaa\x73\x36\x03\x5a\x67\x5f\xa5\x85\x8b\x49\x0c\x5d\x24\x77\x80\x06\x4a\xdb\xaf\x75\xa7\x63\x35\xee\xc9\xab\x91\x87\x71\xb0\xb1\xdf\x51\x47\x64\x2a\xef\x4a\x16\x6a\xb1\x72\xed\x60\x1f\xed\x21\x0f\x6c\x0c\xff\xd9\x18\x69\xf7\x49\x0b\x57\xe7\xc6\x52\x41\x86\x3e\x7e\x8c\x0a\x26\xeb\xa6\x3b\x53\x42\xd0\xfd\x82\x14\xac\x73\x1e\x1c\x43\x8d\x01\x77\x11\x5f\x6a\x19\xe0\x93\x5c\x7a\xf6\xbc\x7d\xbe\xb7\x55\x11\xd9\xbd\x8e\x63\xe3\xe2\xf4\x7a\xb0\xdd\x1c\xed\xd7\xb1\x80\xd7\x4a\x4b\x44\xd4\x61\x19\x7a\xef\xdd\x36\x20\x46\x51\x66\xa3\x9b\x45\x39\x50\x43\xce\x88\x74\xcd\xd7\x2c\x60\x2b\xd3\xd2\xee\xcb\xad\x34\x66\xb5\xcb\x1a\xa4\x1a\xe9\x2a\x8a\xfe\xf2\xd7\x64\xce\xc0\xc4\x49\xd2\x7e\xfa\xc4\x37\x93\x8f\x28\x0b\xea\x9c\x50\xa5\x82\xe5\x7c\x27\xf9\xb3\xde\x87\x2f\x0c"}, +{{0xa2,0xc8,0xe1,0x61,0xa8,0xd9,0xd6,0xe8,0x88,0xc3,0xd0,0x9b,0x0b,0x97,0x27,0x37,0x30,0x7a,0x2c,0xbd,0x2a,0xcd,0x7c,0xcd,0x80,0x4d,0x24,0x31,0xac,0x6c,0x58,0xd2,},{0x3a,0x32,0x57,0x75,0x88,0x67,0x32,0xde,0xca,0x40,0x68,0x57,0xa8,0x05,0x60,0x10,0xaa,0xea,0x28,0x75,0x54,0x5b,0xa6,0xf3,0xdf,0x30,0x75,0x45,0x71,0x38,0x69,0x92,},{0x56,0x0d,0x01,0xb9,0x4d,0xf1,0x1d,0x83,0x34,0x77,0x52,0xff,0x51,0xb3,0x54,0x5e,0xf5,0x5c,0x56,0x32,0xae,0x7c,0x8e,0xfb,0x11,0xaa,0xdd,0x83,0x12,0xde,0xf7,0x25,0x62,0xe8,0xf5,0xd7,0x5e,0xce,0x10,0xad,0x46,0xbc,0x96,0xc8,0x60,0xde,0xec,0xe3,0x9e,0x63,0x4a,0x5f,0x50,0x65,0x4d,0x4c,0xdb,0xa8,0x4a,0x8e,0x6f,0x70,0x24,0x0a,},"\x83\xa3\xbe\xbc\xac\x5f\x28\xc5\x43\x3e\x3c\x4f\x1e\x7b\xf5\xd2\xe4\xdc\xd2\xf5\xe5\x9d\xbe\xe0\xa8\x3b\x07\x02\x57\x15\x35\x07\x46\xf8\x56\x75\xf1\xdf\xea\x37\x4a\xa7\xd7\x94\x28\x7b\x89\x2e\xf9\x09\x7f\xf6\xd2\xe1\x22\xf0\xa6\x56\xfb\xa0\x79\x8c\xdc\xfc\xb3\x64\x5d\xfc\xfd\x78\x8c\x74\x0c\x0f\xd0\x45\x20\xe7\xa0\x6a\x02\xa0\x58\x29\x63\x0a\x2b\xf0\xcd\xfe\x2e\xcc\xa0\x09\xec\x44\x04\x99\x46\xbb\x1d\x23\x26\xdd\xd6\x1d\x7e\xc6\x40\xbf\x69\xeb\x44\xfb\x23\xcc\x1f\xf4\x78\xc5\x70\xc7\x5d\xb7\xe7\x66\xe3\x5b\x7c\x43\xdb\x73\x68\x0d\x14\x07\xa9\x43\x99\xfb\x62\x1b\xaf\x38\x45\x74\x5c\x1c\x4e\xd0\xb9\xf0\xb4\x85\xbe\x2d\x53\xc5\x68\x54\x5d\xdf\x18\x77\x5a\x83\x7a\x05\xd9\xc9\x15\x7b\x08\x4e\x8c\xd0\x1f\xc3\x24\xf0\x7f\x11\x68\x77\xe4\x07\x5d\xba\x24\x32\xc8\xa7\x75\x2e\x9e\x93\x95\x86\xad\x93\xf0\xc0\xaa\x5e\xda\xc9\x4b\x8d\x82\xe5\x44\x99\x97\xb1\x5b\x8c\x89\x61\x58\x9c\x44\x28\x21\xaa\x83\xb6\x02\x39\xec\x5f\x15\x8c\x3f\x5e\x9e\xc5\xbe\xa5\x11\x5d\x5f\xed\x61\x91\x8e\x8f\xcd\x5b\xce\x61\xc7\x77\xf2\x0b\x6b\xfe\x80\x3a\x69\xc6\xfc\x79\x4a\xb8\xc5\x7d\xf2\x71\xda\x86\x38\x72\xa6\x13\x35\xb1\xfa\x29\xf4\x60\x8f\xf0\x37\xf7\x12\x06\x98\x09\xca\x64\x2a\x03\x07\xc7\x9a\xa9\x2e\x10\xcb\x89\x3a\x29\xd1\x72\x01\xa0\xb6\xd1\xb4\x6a\x72\x12\xb3\xba\xec\x97\x03\xc0\xb0\x39\x2b\xa6\xb7\x6e\x5c\x9c\x10\xf8\x35\x99\xb8\x1e\xa2\x22\x83\xf9\x54\x7a\xac\xda\xa7\xf3\x08\x96\xd1\xff\x73\x1e\x11\xfb\x9e\x56\xad\x06\x03\x04\x17\x11\x98\x05\xba\xb6\x35\x21\x49\x6c\x3b\xb9\x2a\x12\xf5\xe5\x5a\xfc\xf6\x0e\xd4\x21\x77\x37\xf3\x04\x6b\x16\xca\x50\x66\x57\xa6\xd6\x96\xd7\x5a\x6d\x8e\x18\xe9\xef\xe2\xb0\x8c\x8b\x1f\xa0\x72\x82\x38\xe2\x7c\xfb\x32\x21\x66\xee\xe4\xee\x76\x96\x8b\x77\x7b\x50\xee\x6a\x2b\x80\x4e\x1e\x9b\x46\x01\x66\x20\x13\x2b\x65\x88\x71\x8d\x97\x8c\xa2\xc0\x02\x69\x79\xc4\x00\xd3\xc5\x33\x67\x51\x21\x0f\x0b\x00\xd2\x69\xec\x8f\x4e\x2f\x95\x59\xe1\x80\x33\x2d\xd2\x70\xe5\x0c\xc9\x46\x5c\x55\x58\x93\x63\x55\x52\x1b\xc3\xc9\x56\x0f\xc1\x9e\xc1\x42\x42\x12\x1e\x6b\xb2\xff\xf8\xf5\x03\x37\xfc\x26\x4a\xcf\x1a\xc1\x70\x43\x28\x33\x4b\x3b\x52\xcb\xa9\x6d\x93\x03\xb1\xb5\xdb\x85\x9d\xae\x31\xd8\x0f\x17\x11\xfb\xa2\x51\xe1\x0b\x4d\x12\x21\x28\xf9\xfa\xff\x68\x72\xd0\xc0\xb8\x1e\xef\x59\x54\x1f\x83\x2b\x0a\x9d\xf3\xa4\xcd\xd5\x91\xc8\x77\x36\xb1\xae\xcf\x24\x2c\x27\x5a\x10\xc3\xfd\x67\x83\x9d\xad\x4e\xf3\x99\xb9\x49\x4e\xcd\x77\xf7\xba\x5b\x5d\x4f\x2c\xa3\x04\xe5\xb2\x29\x21\x30\x7c\xb1\x8f\xa6\x4a\xa3\xd0\x1c\x44\x11\xc8\x36\x9c\xce\xde\x46\x5e\xe3\x69\xee\x63\x7d\x43\xd2\x88\x26\xbf\x60\xdd\xde"}, +{{0xd3,0xd1,0x88,0xb3,0x90,0xba,0xcc,0xd9,0x50,0x24,0x52,0x61,0x46,0xb8,0x2b,0x91,0x84,0xe1,0x97,0xe4,0x6a,0x93,0x40,0xa0,0xe6,0xec,0x18,0xbf,0x75,0xbe,0x7f,0xc5,},{0xd8,0xf7,0x94,0x94,0x8a,0xa6,0x98,0x61,0x00,0x21,0x4e,0x9b,0x7b,0x90,0x24,0x42,0x08,0x06,0xb4,0xc6,0x78,0x46,0xd5,0xbd,0x50,0x61,0x13,0xb3,0x53,0xa2,0xea,0x3d,},{0x16,0x97,0x6b,0x26,0x7d,0xe9,0x6e,0x38,0xdd,0xdc,0x84,0x78,0x07,0x5f,0x6b,0xdd,0x71,0x59,0xe5,0x63,0x34,0xb2,0xd2,0xd1,0x92,0x09,0x46,0x29,0x4f,0x33,0xcd,0x6b,0x7f,0x9c,0x50,0xf8,0x05,0x7f,0x49,0x6c,0xab,0x5d,0x94,0xbb,0x4d,0xca,0x26,0x2f,0x9f,0x0f,0xdf,0x9b,0x1b,0x64,0x74,0x1f,0x4b,0x72,0x2d,0x32,0xef,0xa8,0x22,0x03,},"\x5e\x65\x65\x8e\x42\x03\x75\x43\x3f\xd7\xc1\xf6\xbe\x67\x88\x41\xe5\x81\x04\xf1\x0b\x4c\x67\x63\x59\xd8\x4f\xce\x79\x92\xf5\xc5\x75\x57\xd7\x38\xf8\x30\xb5\x05\xfa\x0c\x2b\x9e\xab\xf8\xd1\xa9\xf8\x1f\xe8\xf3\x15\xd6\x62\xe2\xb8\x4c\xe9\x52\x99\xeb\xf4\xe5\x03\xb5\xe1\xf7\xf8\xcd\xb6\x68\xae\x73\x3f\x3d\x0c\xdd\x4c\x74\x2a\xb5\xf2\x72\xbe\xa4\xf1\x8d\x18\x3e\x89\x23\x84\x76\x62\xf9\xa3\x9c\xd4\xb1\x4e\xc7\x6d\x11\x03\x2f\xe5\x73\xc2\x62\x01\xae\xf6\x66\x01\xce\xc6\x83\xe3\x4b\x89\xaf\xd9\x64\xe9\x87\x80\x1c\x70\x6a\x85\xe2\x7b\xab\x33\x70\x1c\xd1\x09\xbc\xf0\x7b\x27\xca\x67\xf0\x22\xc4\x94\xa0\x4c\xbe\x5a\x9c\x6d\x63\xaa\xd9\x36\xcd\xf1\xa1\x80\xfd\x05\x86\x51\x98\xb9\x6f\x06\xa7\x8d\xa9\x57\x99\xd3\xaa\x4d\xf3\xb1\x70\x03\x3c\x69\xe8\xfb\x04\x28\x8c\x35\x46\x55\x3b\x57\x9c\x0a\xe3\x93\x80\x62\xd3\xd8\x42\x1c\xfa\x66\x26\x85\x29\xbe\xc0\x27\x1e\x53\xb4\xee\x7d\x09\x9e\x71\x48\xa8\x02\xdf\x80\xfe\x5e\xed\xee\x1c\x90\x3a\xe8\xed\x4d\x64\x0e\xad\x76\x12\x62\xdd\x40\x14\xf2\x5f\x93\x97\xba\x3f\x1c\x08\xd8\x3a\x3c\x48\x5c\xfb\x55\xf8\x99\x19\xaa\x97\x2d\x6b\x7e\x77\x11\xbe\x9e\x30\xc1\xeb\x96\xa0\xc3\x84\x53\x09\xfb\x23\xdb\xc7\x5b\x69\x91\xdd\x6e\x48\xcd\xde\x90\xe0\x4f\x22\x8e\x8c\xcf\x3b\xa2\x3f\x27\x47\xcf\xb9\xd3\x38\x1a\x93\x05\xf8\x16\xf2\x6c\xdd\xe4\x1c\x02\x20\xfa\xd2\x28\xff\x6a\x8b\x09\x5c\x77\xb6\xba\xe8\xfa\x33\x68\x14\x27\x24\xbf\x1f\x5e\x0f\x6f\xbc\xa5\x32\x0c\x21\x5b\x6b\xa8\x6b\x91\xe3\xa8\xac\xf7\x50\xe9\x3f\xa7\xea\xa6\x5c\x4f\x78\x5e\xf8\x42\x1a\x19\xc1\xe2\x7b\xc2\x4b\x42\x8e\x08\xa9\x02\x42\xab\xac\x9b\xd4\xaa\x03\xc6\x56\xf8\xf4\x6d\xc4\x0b\x36\x15\x2c\x1b\xd0\xde\xf1\xac\xfc\x0d\xa1\x0a\x2f\xa1\xdc\x3d\xa7\xac\xe5\xa8\xfd\x76\x22\x7b\xb1\xa6\x02\x39\x0f\xe5\x7a\xfd\x32\xef\xe2\x81\xf2\xea\x6b\x2e\x4d\x25\x45\xcb\x88\xd2\x30\x8d\x72\x69\x1c\x9a\x52\xb4\xca\x25\x23\x1a\x01\x07\xf2\x5d\x11\x7c\xc9\x35\x39\x76\x21\xc6\x83\xbd\xc8\xf2\x2e\x81\x03\x40\xf2\xcb\xac\x4c\xea\xa3\x46\x86\x65\x26\x18\x79\xf0\x07\x42\x00\x74\x3e\x0d\xe5\xf3\xe5\x83\x08\xb9\x8b\x04\xb8\xc7\x14\x8a\x4e\x00\x4e\x66\x7e\x83\x2b\x00\x84\xb5\xf2\xbd\xc6\xfd\xc9\x59\xf2\xfc\x28\xa8\xd3\x1d\x9a\x9e\x78\xe5\xd5\xf9\xc0\xb1\x19\xe5\xff\x1f\x68\xf7\xc0\xda\xf0\xc0\xf1\x69\x47\xcc\xa5\xb7\xce\xd0\x96\x01\xe2\xeb\xed\x28\x2e\xf2\xbf\x8f\xe9\xa2\x7e\xd2\x7f\xc5\xbc\xda\x8a\xed\x6c\x71\xbe\xe3\xe7\x75\x10\x04\x47\x26\x89\xbb\xf6\xd9\xd0\x79\x52\xa2\x42\xff\x87\x0d\x7c\x3f\x5e\x1f\xfc\x2c\x1f\x40\xfc\x9a\xb7\x57\x9b\x39\x2b\x55\x4f\x3d\xc5\x88\xc0\x3a\xb9\x57\x43\x1f\xe5\xd0\x2c\xbc\x71\x1a\xd4\x89\xfe"}, +{{0x61,0x91,0x7a,0x97,0x5c,0xb7,0xec,0x56,0x4c,0x70,0x8a,0x56,0x53,0x88,0xc5,0x72,0x36,0xa6,0x6b,0x69,0x7d,0xcd,0x5a,0x7f,0x10,0xba,0xe6,0x71,0x57,0x2a,0xc7,0xf0,},{0xec,0xc0,0xf0,0xb9,0x92,0x76,0xe5,0x28,0xf8,0x2b,0x42,0xf2,0xef,0xce,0x85,0x79,0xf8,0x3e,0x63,0x8c,0x6a,0xce,0xfd,0x07,0x28,0x28,0xc0,0x4e,0x43,0x4f,0x55,0xaf,},{0x6a,0xbb,0x3e,0x37,0x7b,0x5c,0x80,0xb7,0x4f,0x77,0x21,0x9c,0x1a,0x9e,0x09,0x6f,0xba,0x0e,0xb6,0x89,0x90,0x81,0x7a,0xcf,0xf1,0x2d,0xba,0x7f,0x61,0xc7,0x7c,0xcf,0x59,0x5f,0xb6,0x60,0x85,0x52,0x00,0x3c,0xea,0xd0,0x6c,0xa1,0x31,0x7c,0x9c,0xd5,0x1a,0xc4,0x72,0x4b,0x29,0xf4,0x09,0x21,0xfb,0x92,0x84,0x33,0x76,0x87,0x64,0x01,},"\x6e\x97\x0e\x0b\x1c\x92\xa7\xf4\x96\xa8\x2d\x8a\xe8\x0c\xfd\x0c\xce\xf1\xd2\xc7\x99\xd4\x17\x28\xf3\x5d\xdc\xd6\x03\xb4\x21\xc2\xa5\xab\x3b\x48\x9e\x78\xf4\xb6\x22\x97\xde\x43\x7c\x5a\xd1\xa9\x68\x3f\xf8\x7f\xa2\x8e\xb3\xcc\x38\xce\x24\x2a\xf5\x94\x19\xf9\xfd\x43\xfc\xaa\x54\xfc\x39\x89\x92\xf8\xc8\xe3\x1f\x2b\x33\xdc\xcc\xd0\xee\x11\xba\x7b\x38\x8e\x8d\x2a\x36\xea\xd0\x67\xc6\xbe\xce\xd5\x89\x0a\xb7\xd4\xa9\x4f\x55\xda\xb9\x21\x28\xa0\xf8\x14\xc0\xe6\x89\x71\xdf\x57\xbd\x50\x78\xa7\x40\x31\x75\xc7\xc2\xfd\xd4\xa5\x24\x47\x15\x3a\xb3\x74\x56\x72\x9a\xee\x33\xe5\xfc\x93\xdb\x8e\x7f\x48\x03\x09\x87\x5e\xcf\x6d\xb0\x7c\xe7\xf3\xca\xc5\xde\x49\xe3\x61\x27\x5c\xa5\x0b\x6b\x71\x9f\x4b\x71\x5b\x3e\x30\x86\x3c\xbb\x3b\x71\x64\xba\x9e\xb9\x6e\xf3\x30\x4b\x19\xad\x4d\x74\xdc\xe4\xbd\x25\xe7\x7b\xbb\xbe\xff\x1e\xe7\xd1\xfb\x55\xb9\xc4\xf7\xfc\x4c\xd9\xbd\x55\x10\x8a\xfc\xf9\x9c\x1a\x41\xcd\x6f\x6b\x1a\xdb\x29\x7b\x10\x6c\x8b\xa2\x4e\x31\x34\xf8\x7d\xd8\xef\xe5\xcf\x85\x49\x22\x91\xb9\x4d\x66\x00\x95\x8c\x28\xb9\x12\x2f\xe6\xe0\x1b\xd3\xe3\x29\xe4\x2d\x19\x26\xb8\x9f\x7a\x8c\x40\xa4\x98\x67\xe5\xaa\x3a\xd7\x49\xbd\x98\xda\xe7\xd0\x06\xb4\x53\x60\x9e\x7d\xae\x26\x36\x4d\x91\x72\xbe\x72\x83\x33\x01\x21\xed\x2b\x40\x27\xe0\x88\x51\x18\x74\x3a\x6e\xa0\xcb\x7d\xc2\x74\x09\xa9\xb2\x82\x0b\xcc\x24\x2e\xa1\x0a\x00\x93\x7b\xf8\x49\x20\x1e\x0f\xb6\x19\x94\x21\xf1\x63\xe9\x79\x4f\x2d\xd4\xb3\x32\x01\x4a\x09\xd3\xee\x80\x71\xda\x78\x77\x47\xf9\x90\xf5\x17\x99\x19\x02\x7d\xdf\xf7\xca\xb0\xf5\x5e\x9a\xfa\x8e\xcc\xb1\x6c\xc2\xdd\x3c\xbb\xea\xd7\xff\x7e\xc8\x18\xc2\x53\x39\x3f\x74\x87\x41\xf5\x54\x07\xf7\x40\x8e\xe3\x3a\x42\xae\x2d\x6e\xcb\x3f\xb6\x00\xa7\x1f\x30\xab\x63\x06\x06\xe5\x53\xb4\x36\x78\xe5\x98\x54\xf3\xa2\x94\x7b\xcf\x4e\xa0\xfc\xfe\xdc\x31\x4d\x83\x70\xd1\x26\x63\x95\xfd\xa3\xc9\x10\x5e\x97\x59\x52\xf6\x0e\x30\x86\xbb\x82\x48\x15\x13\xd6\xfe\x8a\xdb\x4f\x95\xef\xb9\xa9\x5b\x66\xd4\x80\xd2\xbb\x17\x10\x78\xcf\x40\x68\x4a\xc6\x9a\x78\x9c\x7f\xb7\xfa\x42\x53\x33\xd7\x05\xdb\x00\x06\x67\x55\xdf\x72\x8d\xe0\x2d\xf2\x5b\xae\x34\xf1\xd7\xd4\x9c\xaf\xfc\x51\xe9\xba\x2b\x10\xb9\x8f\xe4\xcd\x9d\x22\xb7\x76\x4e\xd9\x31\xed\xb5\xf0\xb5\x54\x49\x6e\x99\x53\x91\xe0\xaf\x0b\x8d\x1c\x7a\x82\x95\xa8\xd1\x5a\x7c\x65\x56\xd2\x9c\xb1\x9e\x08\x55\xca\x50\x5a\xd0\x1d\x2a\xa3\x09\x28\xa8\x4b\xc4\x89\x59\x57\x6d\x81\x2d\x9b\x27\xb8\xe8\x88\x79\xfa\xa2\x80\x6c\x08\x41\x36\x0e\xcd\x0f\xe8\x3f\x5b\x84\x8f\xc1\x2f\x65\x8f\x1e\x7f\x40\xe5\x61\xc2\xe7\x8d\x3b\x01\x25\x21\x0a\x92\x06\x1c\x2d\xb2\x1b\xa6\x60\xe8\x60\x8f\xf5"}, +{{0x7b,0xa2,0x5f,0x27,0x97,0xa2,0x83,0x6f,0x37,0x9d,0x6b,0xbc,0xbe,0x9a,0xbf,0x4f,0x2d,0xef,0x5e,0x52,0xf7,0x2b,0xd9,0xe0,0xb0,0x06,0x57,0x10,0x22,0xfa,0xc2,0xf3,},{0x6c,0x2e,0xd4,0xe8,0xc0,0x12,0x4d,0x5d,0x05,0x40,0x79,0x6d,0x39,0x45,0xd1,0xde,0x71,0xaa,0x69,0x69,0xe6,0xab,0xea,0x0f,0x1b,0x0e,0x6f,0xc4,0x29,0xc7,0x04,0x6f,},{0xf1,0xf5,0x90,0xa9,0x07,0xba,0x98,0x0e,0xb0,0xd6,0x48,0xab,0x4d,0xed,0x5f,0x92,0xfa,0xf7,0xcb,0x85,0x1d,0x81,0xd8,0x58,0xa7,0x8f,0xa6,0xb7,0x7c,0xbb,0xe1,0x2f,0x64,0xd2,0x0d,0xf5,0x27,0x71,0xa7,0xd5,0xe5,0x39,0xa1,0x52,0xd7,0x31,0xe1,0x90,0x3d,0x42,0x11,0xfd,0xcf,0xef,0x9a,0x48,0xb4,0x6c,0x8f,0xd5,0x39,0x4c,0xa0,0x09,},"\x17\x1a\x34\x09\x87\x80\x97\xb3\xb2\x2b\x2c\x00\x66\x0b\x46\xe5\x42\xc2\x16\x4c\x00\xbb\xee\x54\x55\x48\x37\x94\x0e\x70\xf0\x3d\xa9\x91\x6a\x40\xf9\xbd\xe8\x28\x8f\x45\xe4\x7b\xef\x7f\xfe\x4e\x55\x7c\xd4\x47\x40\x45\xe7\x40\xfd\x95\x9d\x98\x4f\x4e\xc8\x1d\xa8\x8d\x44\xa3\x73\xc1\xed\xa0\xcf\xc6\xb0\x8e\x35\x13\x73\xd3\xb8\x2a\xb0\x90\x2d\xf8\x06\x3f\xd9\x08\xe7\x03\xe0\xcb\xec\x41\x0a\xb5\xcd\xfe\xaa\xe0\x01\x88\xce\x2a\xd4\x2b\x8b\xf0\x4f\x7d\xaa\x5f\x0e\xe3\x33\xa6\xf9\x31\x1b\x4a\xd9\x81\x09\x52\xd5\xd5\xa6\x4b\x20\xf3\x7e\x84\x54\x15\xfc\x3c\xdd\x61\x6f\xeb\xec\x50\xdb\x29\x6f\xb3\xf3\xbb\x7f\x6b\x36\x6b\xbe\x52\xe4\x89\x7a\x05\x61\x7b\xf7\xc9\x81\xa6\x2e\xdc\xbb\xbe\x5d\xa4\xc3\x9c\xaf\xa8\x69\xaa\x2b\x27\x34\xe6\xcf\xed\x90\xed\x8b\xe7\x59\x49\x39\x0e\xe4\x45\x66\x89\x24\x55\xb8\x90\xcf\x56\x8b\x94\x5a\xab\xb7\x58\xd3\x85\x4b\xe6\x53\x9f\x3b\x86\xbf\x01\xd1\x88\xe4\x8c\xf2\x62\x6a\x0d\x7d\x38\x17\x03\xbe\x6e\xd1\x29\x0d\xfb\x94\x7b\xc2\xe0\xf8\x3d\xbc\x58\x70\x30\x80\xd7\xf5\xb9\xef\x19\xae\xf9\x30\x90\x8f\x68\xf0\xc8\x00\x10\xa9\x40\x1b\x30\x3a\x9f\x6d\xa8\x05\xbb\x8a\x0e\xd0\xf3\x94\x13\xee\xfe\xdf\x91\x9f\xfd\x8e\xa6\x39\x1b\xf9\x5d\x42\x29\x60\x4e\x49\x45\x7b\x8e\x23\xbe\xc6\x11\x48\x4c\xc7\xf9\x83\x2d\xd9\x5b\xdc\x3a\xd1\x77\xc0\x50\xf4\xab\x63\x3d\xcd\xb3\xe6\x91\xf5\x90\x28\x73\xb3\x8c\xb0\x72\x0b\x91\x13\x35\x7f\xe0\xcf\xb9\x8a\x68\xcc\xcb\x5d\x5f\x08\x09\xd5\x9a\x37\x5c\xf7\xb5\xa2\x75\xd4\x3c\x4c\x34\xff\x68\xe4\x48\x52\x6e\x8e\x1a\xad\x44\xe2\x00\x08\xa2\x32\xaf\xbc\xf5\x32\xa4\x2b\x50\xa0\x25\xa1\xb2\xee\x4e\x07\x7e\xb0\x12\x5a\x59\x3d\x51\xa2\x00\xec\x20\xd8\x72\xc0\x58\x38\xad\x36\xaa\xae\xec\xcc\x3e\xd9\xef\x41\xf6\xd1\x22\x67\x02\x17\xd5\xc0\x8f\x6e\x13\xc1\x72\x19\x45\x89\xac\xc3\xc5\x9f\x7e\xf7\x90\xc7\xc8\x5a\xa6\xd5\xeb\x69\xd4\xc8\x9a\x72\xf5\xe7\xc9\x24\x69\x85\xc1\xac\x0c\x5d\x19\x7f\x76\xa7\x3e\x37\x74\x83\x9d\x4a\xa2\x09\x6a\xca\x19\x0a\x30\xf4\xaa\xc5\x40\x57\xb6\x4f\x35\x8e\x0e\x06\x40\x0c\x0d\xf2\xf8\x76\x41\x2d\x34\x48\x4c\x43\x44\xf4\xd7\xc8\x66\x51\x7d\x3e\xfb\xa4\xa9\x0f\xa7\x14\x4c\x9b\xa5\xdb\x33\x61\xdb\x57\x69\x40\x3e\xc8\x16\x26\xa5\x11\xf9\x3e\x30\xf8\x58\x6e\xad\xfc\xaf\xd9\xa3\x6e\xcf\xf8\xd2\x4b\x42\x07\x9a\xda\x8e\x57\x9a\xc3\x08\x51\x17\x7b\xce\x90\x38\xb0\xe1\x30\x00\x72\xd6\x8e\xfd\xd7\x23\xf6\x35\x50\x64\x84\x32\x75\x81\x5a\x66\xb9\xd7\x3a\x12\x99\xaa\x59\xa1\x81\x2f\x64\x52\xfb\x41\x15\xea\x2b\x1f\x9f\xf4\xa9\x96\x90\x59\x6e\x3f\x20\x22\xd8\x1e\xd8\x74\xdd\x67\xe6\x18\x9c\xa0\xe6\x8b\x93\x04\xe9\x93\xa9\x5b\x66\x66\x5e\x0d\x07\x4c"}, +{{0xd1,0xe1,0xb2,0x2d,0xe5,0xe0,0x4c,0x9b,0xe4,0x65,0x1d,0xd7,0x39,0x95,0xa3,0x66,0x6c,0xb5,0x35,0x2c,0x65,0xac,0x7b,0x70,0x51,0xb3,0x66,0xfe,0x1a,0xc0,0xc3,0x10,},{0x12,0xfe,0x56,0xf1,0x01,0x2d,0x5c,0x12,0xf1,0x35,0xed,0x59,0x82,0xf3,0x82,0xae,0x5f,0x11,0x43,0xbc,0x90,0xe8,0xcb,0x8c,0x93,0x05,0x17,0x54,0x55,0x1e,0xe9,0x0a,},{0xab,0xaa,0xb4,0xfa,0x6a,0xeb,0x0a,0x0b,0x34,0xee,0x0d,0x61,0x3a,0x0a,0xf0,0x49,0xed,0xb4,0xce,0xdb,0xfe,0x9d,0x3b,0xeb,0xe9,0xc0,0x06,0x18,0xb1,0x15,0xb9,0xd1,0xfa,0x52,0x4e,0xc3,0x49,0x5e,0x13,0x30,0xb0,0x93,0x61,0x81,0xea,0xbb,0x14,0x29,0x9f,0xac,0xcc,0x40,0xea,0xa8,0xcc,0xa5,0x7e,0xd3,0x24,0xb7,0xa6,0x42,0x0c,0x0e,},"\xc7\xf2\x18\xb5\xaa\x7a\xae\x17\x99\x62\x5a\x56\xc4\xd7\xd7\xb0\x26\x37\xe5\x72\xf1\x41\x1a\x61\x22\xf1\x13\x79\x1a\xa3\xc6\x28\xe8\x19\x60\x2f\xb4\xf0\x33\x5a\x61\x23\x01\x3f\xa6\x4e\x9f\xdc\x4e\x4a\xe4\x97\xbd\x16\x9c\x2f\xa7\x7b\xc2\x36\x12\x97\x17\xf4\x62\x88\x6b\x41\x08\x93\xfa\x78\x09\xcb\xfd\xc8\x92\x22\x3b\x40\xee\x04\x1e\xbd\x4e\xc7\xdd\xab\x55\xbe\x60\x81\xa1\x64\x66\x43\xa9\x12\x0b\xaa\x46\x28\x9a\xcb\xa1\x5b\x3b\x48\xaf\x3b\x7a\xde\xcd\x69\xf4\x3e\xed\xe7\x9d\x9b\x19\x57\xe1\xd8\xc3\x12\x9e\x0f\xa0\x57\x9d\x3d\x39\x53\x70\x46\x1b\x0e\x12\x55\xc9\xca\xa9\x4e\x47\x25\x60\x1c\xb9\xd0\xe2\xd6\x02\x44\xd1\x5b\x64\xe1\xf7\xbc\x90\x15\x59\x0a\xd0\x99\x1f\x12\xf8\x26\x73\x11\x20\x6e\x9e\xb5\xd1\x6a\xdd\x0b\xa5\x21\x8f\xce\x5f\xff\xe1\xc9\xce\x5f\xfe\x1f\x73\x11\x32\xf4\xb1\x2c\xac\xb0\x2f\x97\x45\x17\x10\x84\x6b\x7f\x82\x4f\x4f\xa9\xe0\x89\x19\x26\x64\x69\x78\x9c\x00\xce\x0d\x94\xd3\x8f\xa8\xfe\xc3\xf5\x1f\x2f\x88\x6e\x9d\xb0\x9b\x80\x44\x70\xb1\x9e\xc9\xe8\x06\x63\xf1\x55\xb4\x98\x4d\x2b\xbd\x0b\x2c\xe9\x93\x02\xe0\x6c\x64\x44\x4b\x69\x6e\x31\x29\xfc\xef\x34\xc3\xdd\x00\xf7\xab\x5b\xed\xa7\x47\xa3\xfc\x63\x39\x19\x2b\x74\x0f\x35\x69\xb6\x7d\xbd\x6f\xfa\x39\xe2\x71\xfa\xa4\x00\xd9\x61\x6b\xff\x86\xec\x49\xa6\x59\xde\xf2\xe7\xf5\xd4\x51\xf2\xa2\xb3\x5e\x66\x2a\x6e\x7c\xc2\x2f\x1e\x5c\xdc\xde\x8a\x59\x98\x81\x35\xb7\xe7\x65\x62\x74\x3c\x1e\x6a\x09\x99\x01\xb3\xef\x97\xcb\xff\x23\xf2\x09\xbd\x70\x88\xc2\xf0\x32\x45\x27\x9a\x1d\xc7\x8d\xdd\xc1\xbb\x0c\x1d\x35\x10\x03\x57\x88\x21\x26\xb3\x28\xd3\xd9\x4e\x08\x71\xb6\x0b\xe2\x53\xfd\x1b\x6e\xcf\x03\xc1\xdb\x73\x1d\x9e\xed\x0e\xdf\x2b\x26\x43\x23\x07\x80\xa4\xd6\x6e\x99\x17\x9a\xad\x1b\x82\x40\x2e\x55\xf6\xd7\x85\xeb\xc8\x0f\x8d\xd2\xfd\x2b\xeb\x09\xf3\x10\x35\xdf\x62\xc1\x7f\x42\x8e\xd0\xb2\xd5\x65\x08\xdb\x31\xe6\xd2\xdd\x5f\xb6\x9e\xbe\xee\xa3\x25\x70\x70\xcf\x2f\xe6\x7d\x42\xd2\x88\x16\xa5\x5d\xba\xe0\xb1\x85\xdb\x44\x21\xbb\xfd\xae\xfc\x79\xc0\x8c\xdc\x1a\xcc\xf7\x16\x42\x56\x2e\xc7\x00\x36\xda\x2b\xba\xfa\x4a\x89\x19\x54\xc4\xee\x40\x49\xb5\x5c\x64\x0e\x91\x93\x0e\x39\xe3\xef\x10\x18\xdc\x16\x47\xf2\x69\x42\xc6\xdb\xdf\x4d\x56\xe4\x1e\xb2\xc8\x98\xc8\x21\xfa\xc1\x7c\xc2\x73\xe8\xe4\xaa\x56\x08\xa8\x12\xcf\x4b\x82\xf9\x60\x19\xc2\x52\xd5\x6e\x78\x05\x29\x8c\xcb\xe8\xce\x40\xb0\xbd\x0f\x93\x3b\x88\x4c\x0f\xaf\x97\xa9\x58\xb2\x04\x08\xb8\xa5\x29\x7c\xce\x55\x27\xb2\xca\x21\x28\x06\xe7\x2a\x32\x64\x45\x7a\x7f\xac\x86\x62\xb8\x2c\xa2\x33\xe1\xc7\x75\x8d\xc6\xe4\xf1\xb9\x99\x58\x63\xf2\x5f\x74\x7b\xce\xe4\x3b\x63\x9b\x1f\x8f\x20\x26\xd2\xd2"}, +{{0xdf,0x29,0x4e,0x47,0x7b,0x1b,0x91,0xc5,0xac,0x5b,0x98,0xc3,0x30,0xd2,0x22,0xd7,0xcd,0x2d,0x53,0xe7,0xd0,0xbc,0x0c,0xa4,0x03,0xdf,0x4e,0xc7,0x53,0x27,0xa2,0x74,},{0x5f,0x0b,0xd2,0x2f,0x2f,0x18,0x96,0xd1,0x56,0x3b,0x4f,0x69,0x40,0xc7,0xdf,0x89,0xef,0xc2,0x58,0xc0,0xff,0x6c,0x2f,0xcd,0x67,0x4d,0xaf,0x4f,0x59,0xfc,0xdb,0x60,},{0x99,0x45,0xab,0x73,0xb5,0x85,0x62,0xb3,0x55,0xda,0xbc,0x4e,0x2b,0x6b,0xe7,0xe0,0x5f,0x37,0xf8,0x95,0x71,0x44,0x0c,0xcc,0x32,0xc1,0xa9,0x47,0x37,0x09,0x5b,0x78,0x66,0x74,0x7d,0x21,0x00,0x70,0x00,0xa0,0xf0,0xe3,0x51,0x11,0x4b,0x88,0xe0,0x13,0x8b,0x55,0xdf,0x44,0xfe,0x72,0xeb,0xe9,0x59,0x14,0x10,0xe7,0x07,0xfa,0x9d,0x02,},"\x3e\x42\xd6\x68\x40\x96\x30\xcb\xb8\x48\x12\xac\x7f\xf1\x15\x4f\x70\xfc\xa8\xbd\xff\x3f\x1a\x04\x0f\xa3\xaf\x86\x8a\xa1\xc4\xe9\x15\x08\xb1\xae\xfd\xf5\xc3\xa8\xb4\xb0\x77\xa4\xd1\x62\xd2\xc0\x5b\xd3\x64\xfb\xbe\x8c\x5a\x08\x31\x4c\x2e\x07\xdf\xfb\xd6\xe8\xdd\x2e\x08\xa0\xdc\xc9\x6e\xa9\x2d\xdd\x4c\x97\xf7\x9d\xb9\x42\x5a\x6c\x6b\x34\xc4\x60\x43\xd0\x9a\x68\xb7\x68\x72\x36\xa9\x18\xd2\x1a\x56\x16\x10\xa1\x3a\xc5\xe4\x46\xe0\x88\x1b\xb2\x6c\xc8\xe2\x8a\xad\x16\x54\xf8\x67\xad\x82\xae\x33\xf8\xf7\xa7\x8a\x65\xbe\x57\x69\x94\x75\x51\x6a\x1a\x87\x46\x84\x3e\x93\xa1\xa2\x94\x35\x46\x24\xfa\xc0\x4d\x45\x2c\xcf\xbe\x4f\xdd\x92\xa9\x51\xaa\xa0\x7d\x26\x67\x6d\x5c\xb0\x77\xa5\x00\x0d\x43\x9c\x12\x42\x76\xc0\xdb\xcf\x86\xe7\xaa\x15\x3c\xc2\x4b\x5a\xff\x67\x7c\x6b\xad\xc2\x61\xc2\x89\xf4\xa4\xae\x51\x9b\x2e\x2f\xff\x31\x2f\xbf\x0f\x5b\x4c\x46\x98\xf6\xae\xdd\x8f\xcb\x1d\x23\x48\x94\x2d\xe3\xfb\x73\xba\x27\xf6\xdb\x14\xc2\xf0\x91\x80\x35\x6e\x5f\xca\xe1\xad\xf6\x5e\x22\x42\x5f\x8c\x27\xf1\x9e\x98\x94\x83\x50\x6e\x5d\xf5\x7a\x1b\x61\x3a\x22\xe3\x45\x03\x8b\x3e\xa9\x1c\x0f\x78\xff\xff\x46\x38\x3f\x38\xc7\x22\x25\x35\x8a\x34\x57\x0d\x6f\x66\x4a\x17\x45\x4a\x15\x16\x13\xf0\x1c\xba\x77\x7f\x62\xec\x83\x18\x75\xec\x5e\x27\xd2\x57\xf1\x80\xb6\x36\x6c\xb1\x83\x10\x7c\x40\xf5\x0b\x01\xb2\xb9\xbf\x91\xb3\xb5\x54\x9e\xd9\x31\xa3\x53\x7a\xa4\x16\x89\xf7\x2b\x25\x7a\x6a\xa3\x9c\xdc\x6f\xce\xdf\x14\x39\x83\xbe\x5b\xff\xe3\xae\x2b\x29\xf8\x2f\x88\x21\x22\xd6\x6a\x79\x25\xf5\xa7\x10\x82\x6c\x0d\xad\xb7\xe4\xfa\x4e\xc0\x79\xba\x2e\x76\xda\xda\x43\x3f\x30\x77\xcb\x1e\xf7\x46\x13\xfc\x5d\xbf\x82\x58\xb6\xda\x7c\x73\xc8\x66\x37\x24\x57\xed\x50\x0f\x97\xf9\x90\x7e\x1f\xc2\x63\x53\xc7\x0b\xa3\xbd\x9c\x36\x15\x1d\x46\x86\x5d\x2c\x65\x98\x65\x62\x48\x5c\xf8\x42\x1f\xeb\xbe\x77\x7c\x73\xe6\xcd\x00\x26\xd6\x6d\x35\x12\x8b\x9f\x8f\x33\x26\x4a\xeb\x56\xbd\x3e\x4b\x8d\x1f\x52\x66\x41\x1e\xf3\xb2\x3b\x76\xb3\x6d\x4c\x9d\xf3\xc5\x12\xfd\x56\x0c\x2b\xe5\x2a\xc5\x23\xc1\x93\x77\xad\x2a\xdc\x0e\x8c\x30\x9c\xf5\xbb\xf7\x2d\x9e\xb8\x5d\x65\xa9\x48\x47\xd4\x97\xd8\xd1\x02\x42\x4f\xb8\x43\x81\x66\x6e\xcb\x1c\x35\xa3\x72\x5d\x7d\x9e\x92\x84\xfd\xeb\xb6\xb3\x62\xaa\x6a\x9c\x6f\xb3\x7a\xba\x87\x35\x7f\x57\x4c\x0e\x63\xb4\x49\x7d\x49\x8f\xfb\xb7\xd0\x69\x2d\x78\x4b\x4b\x18\xce\x9f\x91\x50\xc1\x46\xd3\xd1\x8c\x38\x2e\xda\x04\x93\x8c\x69\xd0\x77\x8f\x29\x02\xd5\x23\x5a\x56\x52\xb9\x7c\xef\x6d\x5f\x60\xda\x6b\xd7\xed\x4f\xf9\x7c\xd9\x4d\x49\x39\xca\xca\x3b\x6b\xaa\x3c\xfd\xac\x04\xcd\xa9\x55\x96\xf4\x67\xcb\xc6\xcb\xcd\x92\x64\x16\x77\x43\xea\xc1"}, +{{0x70,0xc6,0x85,0x9f,0x08,0xcf,0x42,0xb4,0xbd,0xa9,0xeb,0x62,0x97,0x9d,0xff,0xb7,0xcb,0x08,0xeb,0x3d,0xab,0xe9,0x3f,0xe9,0x4b,0x01,0x38,0x46,0x17,0xcf,0x67,0x30,},{0x40,0x1c,0x9e,0x20,0x33,0xe2,0x25,0x9f,0xb6,0x38,0x3b,0x3e,0x8b,0x9e,0x17,0xb3,0xf2,0x06,0x27,0x46,0xbb,0xe6,0x48,0xcf,0x48,0x45,0x16,0xdb,0x0f,0x2f,0x1b,0x06,},{0x0f,0x03,0xa4,0xf1,0x5c,0x33,0x9b,0x4f,0x7b,0x88,0xb4,0xe2,0x1a,0xd9,0xe3,0xd6,0xbb,0xf3,0xef,0xfb,0x7b,0x67,0x8f,0xfa,0x50,0x0d,0x47,0x38,0x3b,0x71,0xa7,0x45,0x4f,0x62,0x90,0x7b,0x56,0xf5,0x9f,0x9b,0x9a,0xf6,0xd5,0xb2,0xa0,0xfc,0x1c,0x73,0x7a,0x64,0x10,0x51,0x95,0x08,0x98,0x99,0xf5,0x7a,0x2c,0x9d,0xba,0x50,0x9e,0x0a,},"\xdd\x06\x09\xea\x15\x99\x21\x39\x5d\x11\xfb\x2d\xa8\xea\x4f\x74\x7d\x7f\x74\xb5\x80\x52\xe0\x1c\xad\x40\xa2\x71\xfa\x0b\xbe\xed\x91\x02\x0f\x4f\x0c\x08\x46\xc4\xf0\x77\x78\xa6\xaa\x76\x8e\xb5\x17\x12\x29\x4e\x9e\x1f\x32\xa6\x02\xb1\x52\x51\x4f\x5e\x6d\x39\xf9\xe0\x8f\x7a\x78\x12\xbd\x90\x0c\x10\xa9\x14\x69\xe4\x7e\x8a\x78\xe5\x4c\xd4\xbd\x7c\xfe\xde\xde\xc1\x71\xef\x37\x3f\x1c\x4f\x9b\xbc\x2c\x81\x40\x2f\xb1\x4e\xd0\xbf\xac\x8d\x04\x3f\x11\x7d\x61\x24\x52\x1a\xfa\xe0\x91\x6a\x51\x0d\x56\x8a\xcf\xa3\xaa\x33\x01\xbc\x97\x9a\xc2\x8d\x55\x1d\xbb\xea\x6c\xea\xc4\xc2\x12\xaa\x8c\x84\x92\xb3\x61\x3a\xe7\x39\x5d\xd4\x12\x5f\xc4\xc2\x5d\x5b\x4d\x99\x23\x08\x21\xd4\xb1\x7e\xc2\xee\x6b\xe7\xd6\x04\x19\x5a\x21\x54\x33\x3b\x97\x35\x26\x58\x0c\xa7\xef\x9e\x30\xc6\xc1\xdd\x42\xef\x2a\xfe\x42\xb1\x1b\x1a\xa4\x9b\x9c\xca\xba\xca\x17\x09\x1e\xeb\x38\x0e\xc5\xe3\x4a\xd1\xe3\x82\x7c\xc6\x0d\xac\xf1\x44\x28\x6c\x78\x92\x59\x0b\xd2\x67\x1a\x8d\xc5\xf3\xa7\x02\xc1\xde\x7c\xd3\xb4\x2c\x1b\x15\x0b\x09\xc3\xe5\x8e\xf6\x94\x3b\x45\xd8\x9d\x41\xdf\x36\x1f\x1d\x5c\x25\x56\x55\x91\xb6\xac\x8d\xea\xa7\x36\x76\x53\x1f\x6e\x5a\xbe\x58\x04\xb0\x09\x7f\x8d\x45\xea\x29\x39\x17\x73\x33\xca\xce\xf1\x2e\x4b\x71\xfe\x49\x36\xba\xfe\x00\x74\x7a\x89\x30\xbc\xea\x55\xb8\xfd\x84\xa0\x1f\x6d\xf8\x4e\x7a\xcb\x93\x1f\xc7\xc0\x1d\xdf\xd6\x3d\xee\xc3\xad\x3e\x69\xdf\xa2\xb7\x35\x50\x58\x3d\x57\x47\xee\xe9\x6c\x55\x36\x36\x87\x97\xe2\x47\xf2\x3f\x53\x7d\x79\x07\x9a\xb6\xda\x31\x41\x02\xc7\x44\x3d\x41\x96\x0e\x3a\x3d\x8c\x35\x9c\x4a\x4e\xc6\x26\xfc\xc4\x4e\x11\x0e\xa7\x44\xd4\x17\xaa\x85\x0d\xb8\xec\xdb\xfe\x34\x0a\x96\x2d\xb0\xd8\xc5\x7d\xc5\x17\xbe\x8b\x40\xd1\x4d\xe9\x7b\x1e\x9e\x04\x26\x44\x7f\xde\x0a\x04\xe5\x06\x79\xc5\x3b\xa1\xaa\x3c\xdc\x38\xc7\xed\xe6\xdb\x6c\x05\x4b\x1e\x9c\xe7\xde\xad\xaf\x93\xeb\xdd\x47\x07\x91\x53\x5f\x3e\xcf\xab\xf3\x41\x63\x55\xf7\xa1\x8a\x38\xaf\xe6\xbf\xe5\x07\xef\x08\xc4\x37\x3a\x4a\x69\xde\xe1\xfc\xb6\x5b\x16\x31\xa0\xde\x14\x88\x64\x9d\x0b\xb2\x67\x9a\x9a\x45\xf6\x78\x20\xb2\xa4\xa1\xe5\xa5\x48\x07\x2d\xa7\x03\x2d\x17\x25\x55\xe7\x88\xcc\x98\x60\xeb\xb3\xc0\xc3\x59\x49\x37\x51\xb0\xc2\xc9\x50\xa7\xfc\xf4\x80\x3c\x14\x7f\x93\x40\xfc\x93\xd8\x5f\x1e\xfa\x57\xb3\x90\x81\xb9\x2d\x93\x47\x3f\xd2\x35\x16\xc4\x95\x0e\xd4\xb2\x9a\x2e\xd3\xa0\x42\xae\x3d\x92\xa1\xe5\x2c\xb7\x09\x63\x6f\xc7\x27\x2f\xd7\x47\x20\x8b\xee\x2b\x16\xd1\x91\xe4\xc6\xde\xb2\x76\x72\xaa\x34\xe4\x39\x14\xcf\xf2\x05\x5c\xa4\xee\x8b\xa3\xe1\xdc\x58\xa6\x79\xc7\xf7\xde\xe2\xc1\xd5\x3e\x28\x75\x09\x70\xf5\x7d\x85\xea\xb1\xc2\x6b\x89\xbb\x73\xe0\xb1"}, +{{0xc5,0x96,0x29,0x61,0x81,0x5b,0x57,0xcd,0x16,0x24,0x03,0xce,0x08,0xe4,0x10,0x5d,0xdb,0x8a,0xae,0x2d,0x3f,0x53,0x3f,0xb4,0x9c,0xc2,0x36,0xb5,0xff,0x50,0x4d,0x6e,},{0xdb,0xad,0xe7,0x22,0x36,0xba,0x12,0xd4,0x97,0x7b,0xa4,0x6c,0x36,0x4b,0xb6,0x9a,0x88,0x7f,0xf4,0x02,0xde,0x91,0xd4,0x7a,0xfa,0x9b,0x93,0xc9,0x5b,0xe7,0x1e,0x7e,},{0x81,0x01,0xba,0xef,0x00,0x4e,0xb6,0xf5,0xad,0x4d,0xe0,0x97,0x9f,0xf3,0x6d,0x34,0x39,0xb8,0x21,0x2b,0xdc,0x92,0x89,0x42,0xe4,0x31,0x91,0x5b,0x3f,0xd1,0x8b,0xc2,0xad,0x67,0xb2,0x6f,0x18,0x94,0x1d,0xcb,0x16,0xd2,0xc2,0x91,0x91,0x42,0x1e,0x77,0x9f,0xed,0x62,0x2f,0xd9,0xf5,0x82,0x64,0x4e,0xaa,0xdb,0x3f,0xe5,0xc0,0x98,0x03,},"\x4a\xe4\x14\x8d\x79\xca\x94\x25\x59\x2a\xa2\x40\xbd\x15\x34\x24\xa3\xbf\x4a\xe2\x73\x95\x87\x2c\xe5\x72\x8a\xc7\x61\x35\x96\xa7\x7d\x5c\xe8\x56\x5d\x8d\x6e\x1b\x59\x35\xb3\x90\x6c\xaf\xe1\xff\x88\x8e\xbc\x98\x15\xe0\x4a\x62\x4d\xfc\x4c\x69\x07\xb8\x5f\x6f\x1a\x0d\xbd\xdf\xf6\x2e\x91\x51\x22\x0d\x47\x44\x62\xcb\x9f\x13\xd8\x9d\x3a\x93\xa0\x0b\xa2\xb6\x0f\x7e\x7c\xa6\x3d\xa1\x7a\x63\x79\xd6\x73\x55\x1e\x79\x0b\x59\x11\x72\x7c\x90\x6d\xc9\x4f\x86\xd8\x27\x75\x46\xc1\x56\x4a\x45\x57\x3a\x77\x43\xbb\x8a\x13\x8c\xde\x87\xb3\xb2\xf2\x8e\x5e\x24\x59\x40\xa5\x1e\x7c\x45\x8c\xf8\xc5\xf0\xa7\x02\x75\x96\x25\x53\xe0\xd2\x39\x0d\x17\x1d\xb4\x4c\x2f\x7a\x5c\x9e\x9f\x93\xb9\x0f\x7a\x5f\x54\xf1\x91\xb0\xd8\x75\xba\xd7\xe0\xbe\xb9\x80\xc2\xa3\x36\x5c\xd7\xb9\x20\x87\x24\xf4\x65\x44\x18\x11\x7e\x16\xef\x71\x34\xe3\xe2\x79\x4b\x6f\x9e\x80\xec\xab\xec\xa3\x25\x4e\x70\x4c\x21\xb7\xad\x30\xc5\xde\xe0\x17\xea\x25\x33\xfc\xd9\x42\x51\xe5\x5a\xe7\x5a\x8c\xc6\xdb\x66\x74\xb3\x9c\x88\xca\x42\x00\x60\x43\xd6\xbd\x9b\x00\xec\xf6\x4c\xea\xfe\xeb\x40\x2b\x1f\x22\xfd\x89\x1f\x2d\x11\xc5\x15\xc1\xab\xa6\xa2\xd4\xc0\xbd\x21\x81\xa4\x8e\x43\xfd\x1c\x0a\xf9\x1f\x9b\x7b\x7d\x37\xf3\xdc\xd9\xe4\xc0\xa7\x59\x74\x84\x67\xd3\x48\xa8\xb1\x16\xdf\x6a\x4e\xac\xf1\x78\xae\xcc\xcd\x30\x66\xe9\x2d\xca\x45\xda\x7a\x3e\x31\x9f\x37\x71\xeb\x34\x90\x02\x21\x93\xc5\xb6\x52\xf0\x45\x68\x7e\x17\x05\xf2\xe5\x69\x1c\x13\x4b\xe4\x00\x63\x53\xd7\xec\xd0\xe9\x18\xd5\xde\x0f\x3b\x87\x80\x9f\xca\x4a\xcf\xab\x94\xe1\x14\x8f\xf7\xcf\x07\xf7\xcf\xd0\xc7\x45\xdd\x2b\xe0\x1a\x24\xa5\xe0\x69\x28\x06\x98\xbc\x3f\x54\x00\xa6\xdc\xd0\x8e\x44\x59\x5c\x03\x88\xe4\x48\x33\x76\x8f\xc4\x91\x04\xee\x11\x5b\xdc\xb0\x2b\xfb\xda\x17\x9d\x16\x4c\xe9\x69\x93\x66\x29\xf2\x33\x56\x01\xb5\x6f\xe8\xf7\x85\xcc\xa3\x80\x5f\x04\x03\x87\x2c\x62\xf7\x3c\x3c\xe8\x05\x63\xd0\x70\xe9\x76\xd8\xec\xc5\x11\x24\xe2\xca\xce\x7e\xe1\x86\x99\x04\x7c\xb0\xf8\xfb\x8d\x9c\x59\xb8\xa6\x0d\x12\xc0\x8a\x09\xfc\xe5\x8f\xd9\x2c\xd3\x6d\xb6\xa8\xe8\x9d\x11\x8c\xf8\x8a\x92\xdc\x8a\x26\x00\xbd\x95\xf5\xa8\xe8\x5d\xb5\xcd\xbb\x24\x9c\xa8\x12\xca\x20\x9c\x76\x18\x05\x1c\x45\x64\xa3\xa0\xe1\x92\xb7\xe4\x59\x92\x45\x6c\x87\xd1\x74\x12\xc1\x1a\xde\xad\x52\x6a\xb8\xdb\x21\x45\x2f\x74\x71\xd1\x7f\x2e\xbc\x90\x01\x54\x50\xed\xf4\xf0\xa4\x4f\xb2\xf4\x90\x5f\x74\xd7\x02\x75\xcc\xd8\x9b\x93\xa6\x50\x47\x3c\x02\xa7\xda\x0c\xbc\x67\x91\x5c\xeb\x7a\x1e\xa5\x9f\xa8\x88\x44\x72\xdc\x91\x7e\xe9\xd2\x46\x33\x9c\x59\x26\x84\x3e\xcf\x53\xfa\xfd\xc5\x6a\x69\x56\x01\xa2\x76\xc2\x3a\x84\x3e\x4d\x30\xf8\x9c\x97\xc9\xee\xe6\xdf\xc7"}, +{{0xde,0xe6,0x86,0x6c,0x78,0x74,0xc1,0x27,0x02,0x9e,0x96,0xe0,0x25,0xbf,0xfd,0x35,0xfc,0xfd,0xf4,0xdc,0x36,0x96,0x6c,0x15,0xee,0x62,0x93,0x36,0x80,0x13,0xd3,0x79,},{0x08,0xc9,0x4d,0xa3,0x51,0xbb,0x2b,0xee,0x72,0xe6,0xe1,0x96,0xbe,0x74,0x88,0x07,0x58,0x37,0x62,0xc5,0x29,0x6e,0x05,0xb1,0xe5,0x29,0xc4,0x7c,0x6b,0xba,0xce,0xc6,},{0xb7,0x8e,0xbd,0x6d,0x65,0xb1,0x75,0xd4,0xbb,0xd3,0xd9,0xa2,0x08,0x2a,0x0e,0xfe,0x6e,0x99,0x1c,0xb2,0xe4,0x03,0x52,0x1e,0xec,0xe0,0x0f,0x41,0x8f,0x2e,0x95,0x6b,0x66,0x90,0x78,0x80,0x65,0x8b,0x9e,0x8e,0x47,0x69,0x96,0x53,0xd1,0x59,0x13,0x23,0x80,0xd9,0xce,0x11,0x09,0xaf,0x9c,0x27,0x57,0xda,0xf4,0xcd,0xf1,0x8c,0x9c,0x0a,},"\xf1\xaa\x19\x77\xf5\x31\x1b\x53\x8b\x94\x0a\xe4\x42\xa3\xab\xc8\x9a\xac\xcd\xcd\x0a\x79\x38\x0a\x24\x25\x8d\x4a\x9f\x1c\xe6\x38\xfc\x2f\x5b\xa2\xe5\x3f\x8e\x1f\xa6\x17\x6f\x17\x8d\x90\x24\xa7\x78\x94\xc2\x8c\xad\x42\xd6\x29\xc7\x93\xd6\x8a\x02\xbe\x94\x11\xb5\x27\xac\xad\xae\x7e\x5c\x38\x51\xba\xbb\x45\xb5\xfe\xce\x32\x9e\x29\x03\x4c\xd4\x25\x71\x08\x37\x27\xf3\x5a\xec\xad\x7c\x9b\xe5\x95\x4e\xc6\x4e\x8f\x6e\xca\xb7\xcc\x05\x90\xe5\x41\x56\xa4\xe1\xa4\x53\x03\x84\x9f\x78\x97\xe7\x2c\xf2\xfb\xcd\x84\xf5\x6c\x72\xf9\x41\xdb\xb0\xb0\x9a\x32\xe6\x38\x6f\xbe\x18\xa4\x3b\xb9\xbd\x8b\x79\x3e\x4b\x9e\xdd\x53\x21\x03\xea\xb5\x4d\x62\x71\x17\xd2\x81\x39\xb6\x4e\x60\xfb\x0b\x81\xd0\x90\x01\xbb\x24\x04\xd9\x25\xe2\x65\xba\xbd\xc6\x9f\x96\xb1\x35\xe9\xe6\xab\x7f\xeb\xb1\xed\x30\x75\xd6\xaa\x2a\xbd\x2b\xbf\x9b\x65\xfa\x9b\x3b\x71\x91\xef\x37\xb6\x33\x60\x59\x10\xee\x88\xf6\x6e\xad\xa7\x9f\x00\xf5\x36\xd3\x80\xb8\x2f\x2f\x4b\x59\x85\x11\x2d\xe0\x04\xa5\x66\x03\xf4\x43\x6d\x8f\xf3\x00\xf4\x2b\xf5\xac\xdc\x7a\x4b\xf1\xea\x9d\x41\x96\xc4\x80\x49\x5b\xac\xb0\x06\x76\x30\xfc\xc0\x00\xb4\xf2\x79\xdd\x3f\x30\xf3\x53\x27\x60\x92\xd1\x52\xc3\xf4\x3e\xfd\xc0\x41\xde\xaa\x0b\xc5\xaa\xab\xa7\xf8\xbb\xd8\x5e\x69\xc1\x37\x42\xd6\x78\xdb\xb6\x53\x60\xaa\xf7\xb5\x48\xa0\x44\xc0\xec\x60\xa5\x7a\xf6\x50\xbc\x31\x97\x3f\x83\x2f\x96\x12\x65\xbc\x23\x18\xf8\x07\x75\xaf\xd5\x1f\x55\x19\x4c\x42\x42\x3f\x7b\xf4\xe0\x05\x2f\x98\xcb\x20\x69\x13\xff\xea\x48\x86\xec\xd2\x7a\x41\x79\xb1\x37\x73\xf9\x47\x50\x2e\x18\x1b\xf1\xa1\xf2\xc6\x2c\x6f\x08\xc2\x03\x59\xf0\x6d\xf2\xb1\x81\x27\x04\x3b\x10\x70\xd0\x19\x4e\xf5\xe5\xbf\xd3\x7d\x22\x79\x84\xcf\xb1\x09\x89\xf2\x1c\x71\xad\x0f\xe3\xb8\x12\x27\xd3\xa7\x17\x89\x45\x5e\xda\x38\x3c\x22\xf4\xd2\xfc\xc7\x25\x79\xf4\x65\xe0\x66\xf3\xd3\x8b\xef\xc0\x24\xef\xef\x6c\x2e\x32\x96\x49\xce\x43\x4d\x62\x73\x67\xa9\x00\xd0\x7f\xe6\x23\x42\x35\xc8\x46\x56\xea\xc5\xdd\x0d\x78\x8c\xf4\xcb\x31\x87\x18\x24\xd6\x6a\xe4\xbc\x89\xed\xeb\xa1\xb3\x67\x01\x29\x84\x53\xe8\xda\x1e\x69\xcf\xb8\x68\x09\x5c\x3b\xe6\xed\x21\x82\xda\x1c\xff\x49\x05\xaf\xd2\x07\x31\xac\x1e\xd9\x84\x16\x47\x37\x90\x3c\x7d\x8b\xb0\xad\x16\xae\xcf\x2f\xae\x33\x74\x04\xfe\x35\x66\x45\x15\xd9\x3b\x70\x1e\x2f\x87\x86\x64\x45\x4c\x0d\xec\xd1\xc6\x55\x8a\xda\xce\x3c\xdb\x22\x75\x07\xa5\x16\x06\xf0\xa5\x4d\xf8\xdf\xaa\x42\x02\x05\xdd\x57\xc6\x52\x42\xff\x24\xa4\x05\xef\x85\xc9\x2d\x60\x28\x86\x93\x2b\x35\xfa\xbe\x9c\x3b\xce\xbf\xc6\x23\x56\x39\xe8\x73\xfc\x2d\xd0\x84\xc5\x2c\xd6\xa7\x41\x3b\x83\x1d\x1c\xc9\x99\x31\x37\x3a\xab\xd8\x47\x62\x0e\xb6\x9b\xb0\xfa"}, +{{0x52,0x36,0x23,0x55,0x59,0x95,0xba,0xaf,0x2a,0x27,0xad,0xcb,0x1e,0xba,0xfa,0xa8,0x02,0xd2,0x3e,0xf7,0xab,0xfa,0x97,0x75,0xf2,0xc9,0xbf,0xa0,0x7d,0x64,0xe0,0xac,},{0xd3,0x4d,0xea,0xe6,0x52,0x3e,0x61,0x9d,0xd1,0xbf,0xc8,0xf3,0xc4,0xca,0x4b,0x78,0xb3,0x68,0xc0,0xf7,0x20,0x03,0x5e,0x14,0x4c,0x3f,0x2f,0xc1,0x05,0xd4,0xce,0x21,},{0xb1,0x87,0x17,0x29,0xfe,0xc8,0x3a,0xea,0x0a,0xaa,0x47,0x2b,0x70,0x0a,0xcd,0x09,0x48,0x13,0xfb,0x7d,0x57,0xb9,0x09,0xe0,0xea,0xaf,0x21,0xee,0x93,0x18,0x47,0xad,0xde,0xdd,0x2b,0xe8,0x53,0x3d,0x0c,0x30,0x5c,0xb9,0xcf,0xe5,0x08,0x0e,0x76,0xc2,0x80,0x8b,0x6e,0x51,0xc9,0x82,0x62,0x90,0xdd,0xb7,0xb9,0x4b,0x6f,0x7d,0x58,0x0b,},"\x05\x53\xe6\x9e\xf2\x11\x65\x2d\x62\xbf\x28\x1b\xfb\xdd\x37\xbe\x22\x76\x9d\x81\x97\x46\x36\x1c\x7d\x65\xdd\xd0\xfa\xd6\x77\xcc\x04\x38\xb3\x01\xd1\x51\x45\x78\xe0\xda\x58\xe5\x5f\x72\x9f\xa8\xe6\x6d\xde\xb7\xf9\x73\xa8\x18\xd2\x4e\xd8\xfe\x02\x7b\x84\x91\x17\x9d\x07\x77\x3f\xb5\xd2\xbb\x96\xaa\x85\xd6\xb3\x75\x04\x54\xe5\x0d\xe9\x1f\x9b\x88\xae\xe8\xaa\x68\xe6\xbb\x53\xed\xc6\x66\x77\xb4\x1e\x60\x1a\x46\xab\x4b\xb1\xe6\x56\xe7\xfa\x5f\x01\x79\x93\x36\x80\xa6\xec\x95\x04\x27\x5e\x7a\xdf\x7a\x32\x48\xe6\x3a\x0f\xc9\xc1\xea\x5a\xe9\x6c\xd0\xc6\x5a\x89\xa7\x7c\xec\x2b\x1f\xd8\xf4\x53\x7e\x82\xc1\xc4\x88\xa6\x9a\x0e\xf6\x4f\x58\x73\x4d\x9e\x73\x47\x8e\x1d\x1f\x12\x31\x14\xef\x66\x08\x5e\x0b\xa3\x19\xcb\x81\x0b\x66\xaf\x96\xd1\x30\x8b\x1a\x2b\xd9\x2b\xa2\xc2\x65\xaa\x30\x9e\xcd\x55\x57\xd4\x02\xc3\x80\x2c\xae\x8d\x7e\x95\x00\x7f\xe6\x10\xc2\xaa\x75\xfc\x66\x19\x6c\x3f\xad\xfe\x99\x7d\x6d\x59\x98\xe1\x8d\x26\x0e\x9d\xa3\x1d\xa9\x21\x8c\xba\xd1\x03\xcb\xfc\x2c\x75\x47\x76\x5d\x67\xe8\x1f\x24\xac\x83\x02\x2e\xf5\x1c\x6c\xc5\x08\x64\x36\x6a\x35\xf6\xb9\xb9\xaf\x94\xe8\x4c\xaa\x9f\xd3\xd7\x67\xc8\x31\xf0\x96\x7a\x61\x46\x2f\xbc\xfc\xc8\x03\xf1\x2e\x37\x39\x03\x9a\xcd\x5d\xbe\x93\x66\xf0\x5a\x33\xdb\xea\xf3\x60\xe2\xdd\xcb\xe5\xc4\x43\xf8\x0e\xf2\xad\x62\xe0\x3c\x1d\x5b\x70\xcd\xea\xb4\xa7\xdd\x41\x55\x30\x64\xc8\xd1\x52\x70\x9d\xef\xf8\x20\x76\xb9\x07\x11\x92\x37\x6f\x51\xd4\xc2\xc7\x1a\x84\xe8\x9f\x2d\x94\x01\x32\x0c\x2e\x45\x9b\x3e\x24\x3c\xca\x7c\x26\xfd\x09\x8c\x26\x4a\xc8\x8e\xf6\x38\x92\x1d\x98\x0b\x0a\xe9\xe5\x12\xd3\x72\x03\x7d\x81\xad\xc4\x81\x26\xd7\xc9\xe4\xb5\xaf\xa5\x7e\xc2\x65\xd4\x01\xb9\x65\x3e\x92\x8a\xfb\x7d\xff\x9b\x48\xe2\x95\xe4\x70\xd6\xb5\x2e\x88\xb3\x9d\x0a\x40\xcb\x8e\xba\x24\x9f\x8b\x13\xd8\x11\x13\xdb\x1d\x3e\x01\xef\x75\xc7\x22\xf2\x69\x48\x8e\x96\x3c\xc8\x18\x27\x04\xf8\xca\x01\x8e\x73\xdc\x07\x14\xe9\xa9\xfc\x79\xbc\x43\x63\xc2\x8c\xb3\x98\x43\x74\xf7\x3b\x2a\xa8\x78\x6e\x74\xe0\x15\x95\x07\xa2\x98\x83\xfe\x0e\xd1\xc6\x00\xf5\x25\x88\x5f\x2f\x10\xea\x00\x6c\x39\xe5\x9b\x92\x5b\x76\x5b\x1e\xde\x53\x42\x57\xa1\xf4\x0f\x28\x46\x58\x4f\x06\x97\x46\xb5\x2f\x56\x00\x43\x0a\x28\x63\xd7\x93\x60\x95\xfb\xc2\x2a\x6a\xda\x67\x4d\x41\xb3\x74\xe2\xb8\xb9\xa1\x9f\xa7\x12\xb5\x94\x45\x33\xbb\x6d\x6e\xc4\x3b\x89\xd4\x97\x1b\x70\x20\x5a\x6a\xcd\x72\xa8\x99\xda\x12\x61\x82\x04\xdb\x0c\x3e\x82\x67\xb8\x45\x79\x16\x93\xe0\xae\x6a\x35\xf1\x4d\xa1\xf8\xf4\xdd\x17\x4b\xce\x03\x18\xfb\x5a\x00\xf6\x72\xed\xe4\x23\x04\xcf\x04\xa6\x27\x60\x57\x75\x90\xf2\x7e\x2d\xfa\x6e\x5e\x27\x95\xd6\x60\x53\xb3\x0a\xf7\xf1\xbf"}, +{{0x57,0x5f,0x8f,0xb6,0xc7,0x46,0x5e,0x92,0xc2,0x50,0xca,0xee,0xc1,0x78,0x62,0x24,0xbc,0x3e,0xed,0x72,0x9e,0x46,0x39,0x53,0xa3,0x94,0xc9,0x84,0x9c,0xba,0x90,0x8f,},{0x71,0xbf,0xa9,0x8f,0x5b,0xea,0x79,0x0f,0xf1,0x83,0xd9,0x24,0xe6,0x65,0x5c,0xea,0x08,0xd0,0xaa,0xfb,0x61,0x7f,0x46,0xd2,0x3a,0x17,0xa6,0x57,0xf0,0xa9,0xb8,0xb2,},{0x90,0x3b,0x48,0x4c,0xb2,0x4b,0xc5,0x03,0xcd,0xce,0xd8,0x44,0x61,0x40,0x73,0x25,0x6c,0x6d,0x5a,0xa4,0x5f,0x1f,0x9f,0x62,0xc7,0xf2,0x2e,0x56,0x49,0x21,0x2b,0xc1,0xd6,0xef,0x9e,0xaa,0x61,0x7b,0x6b,0x83,0x5a,0x6d,0xe2,0xbe,0xff,0x2f,0xaa,0xc8,0x3d,0x37,0xa4,0xa5,0xfc,0x5c,0xc3,0xb5,0x56,0xf5,0x6e,0xdd,0xe2,0x65,0x1f,0x02,},"\x2c\xc3\x72\xe2\x5e\x53\xa1\x38\x79\x30\x64\x61\x0e\x7e\xf2\x5d\x9d\x74\x22\xe1\x8e\x24\x96\x75\xa7\x2e\x79\x16\x7f\x43\xba\xf4\x52\xcb\xac\xb5\x01\x82\xfa\xf8\x07\x98\xcc\x38\x59\x7a\x44\xb3\x07\xa5\x36\x36\x0b\x0b\xc1\x03\x0f\x83\x97\xb9\x4c\xbf\x14\x73\x53\xdd\x2d\x67\x1c\xb8\xca\xb2\x19\xa2\xd7\xb9\xeb\x82\x8e\x96\x35\xd2\xea\xb6\xeb\x08\x18\x2c\xb0\x35\x57\x78\x3f\xd2\x82\xaa\xf7\xb4\x71\x74\x7c\x84\xac\xf7\x2d\xeb\xe4\x51\x45\x24\xf8\x44\x7b\xaf\xcc\xcc\xec\x0a\x84\x0f\xec\xa9\x75\x5f\xf9\xad\xb6\x03\x01\xc2\xf2\x5d\x4e\x3b\xa6\x21\xdf\x5a\xd7\x21\x00\xc4\x5d\x7a\x4b\x91\x55\x9c\x72\x5a\xb5\x6b\xb2\x98\x30\xe3\x5f\x5a\x6f\xaf\x87\xdb\x23\x00\x1f\x11\xff\xba\x9c\x0c\x15\x44\x03\x02\x06\x58\x27\xa7\xd7\xaa\xae\xab\x7b\x44\x6a\xbc\xe3\x33\xc0\xd3\x0c\x3e\xae\x9c\x9d\xa6\x3e\xb1\xc0\x39\x1d\x42\x69\xb1\x2c\x45\xb6\x60\x29\x06\x11\xac\x29\xc9\x1d\xbd\x80\xdc\x6e\xd3\x02\xa4\xd1\x91\xf2\x92\x39\x22\xf0\x32\xab\x1a\xc1\x0c\xa7\x32\x3b\x52\x41\xc5\x75\x1c\x3c\x00\x4a\xc3\x9e\xb1\x26\x7a\xa1\x00\x17\xed\x2d\xac\x6c\x93\x4a\x25\x0d\xda\x8c\xb0\x6d\x5b\xe9\xf5\x63\xb8\x27\xbf\x3c\x8d\x95\xfd\x7d\x2a\x7e\x7c\xc3\xac\xbe\xe9\x25\x38\xbd\x7d\xdf\xba\x3a\xb2\xdc\x9f\x79\x1f\xac\x76\xcd\xf9\xcd\x6a\x69\x23\x53\x4c\xf3\xe0\x67\x10\x8f\x6a\xa0\x3e\x32\x0d\x95\x40\x85\xc2\x18\x03\x8a\x70\xcc\x76\x8b\x97\x2e\x49\x95\x2b\x9f\xe1\x71\xee\x1b\xe2\xa5\x2c\xd4\x69\xb8\xd3\x6b\x84\xee\x90\x2c\xd9\x41\x0d\xb2\x77\x71\x92\xe9\x00\x70\xd2\xe7\xc5\x6c\xb6\xa4\x5f\x0a\x83\x9c\x78\xc2\x19\x20\x3b\x6f\x1b\x33\xcb\x45\x04\xc6\xa7\x99\x64\x27\x74\x1e\x68\x74\xcf\x45\xc5\xfa\x5a\x38\x76\x5a\x1e\xbf\x17\x96\xce\x16\xe6\x3e\xe5\x09\x61\x2c\x40\xf0\x88\xcb\xce\xff\xa3\xaf\xfb\xc1\x3b\x75\xa1\xb9\xc0\x2c\x61\xa1\x80\xa7\xe8\x3b\x17\x88\x4f\xe0\xec\x0f\x2f\xe5\x7c\x47\xe7\x3a\x22\xf7\x53\xea\xf5\x0f\xca\x65\x5e\xbb\x19\x89\x6b\x82\x7a\x34\x74\x91\x1c\x67\x85\x3c\x58\xb4\xa7\x8f\xd0\x85\xa2\x32\x39\xb9\x73\x7e\xf8\xa7\xba\xff\x11\xdd\xce\x5f\x2c\xae\x05\x43\xf8\xb4\x5d\x14\x4a\xe6\x91\x8b\x9a\x75\x29\x3e\xc7\x8e\xa6\x18\xcd\x2c\xd0\x8c\x97\x13\x01\xcd\xfa\x0a\x92\x75\xc1\xbf\x44\x1d\x4c\x1f\x87\x8a\x2e\x73\x3c\xe0\xa3\x3b\x6e\xcd\xac\xbb\xf0\xbd\xb5\xc3\x64\x3f\xa4\x5a\x01\x39\x79\xcd\x01\x39\x69\x62\x89\x74\x21\x12\x9a\x88\x75\x7c\x0d\x88\xb5\xac\x7e\x44\xfd\xbd\x93\x8b\xa4\xbc\x37\xde\x49\x29\xd5\x37\x51\xfb\xb4\x3d\x4e\x09\xa8\x0e\x73\x52\x44\xac\xad\xa8\xe6\x74\x9f\x77\x78\x7f\x33\x76\x3c\x74\x72\xdf\x52\x93\x45\x91\x59\x1f\xb2\x26\xc5\x03\xc8\xbe\x61\xa9\x20\xa7\xd3\x7e\xb1\x68\x6b\x62\x21\x69\x57\x84\x4c\x43\xc4\x84\xe5\x87\x45\x77\x55\x53"}, +{{0x03,0x74,0x9c,0xa2,0x04,0x58,0xa3,0x5a,0x37,0xa8,0xd7,0xa2,0x6f,0x95,0x9f,0x0d,0x59,0xf6,0xdc,0x99,0x73,0xfa,0x36,0x3c,0x1f,0xf8,0xca,0x4e,0x63,0x8c,0x2c,0xd3,},{0xea,0xeb,0x94,0xf4,0x06,0xbd,0xe6,0xa7,0xcf,0x8b,0xde,0x2a,0xdf,0x30,0x81,0xf8,0x37,0x5b,0x87,0xd9,0x33,0x5d,0x49,0x6c,0x71,0xd0,0x42,0xcd,0x2e,0xaa,0x16,0x6c,},{0x78,0xa3,0x87,0x7e,0x02,0xbd,0xfd,0x01,0x5e,0x7f,0x86,0xa3,0x27,0xa4,0x8c,0xc3,0xa5,0x23,0x0b,0xbd,0xb1,0x24,0x3f,0x1a,0x8c,0xf2,0x27,0xf7,0x8a,0xb5,0xe7,0x68,0x0d,0xe3,0x01,0xa9,0x15,0xdc,0x11,0xb3,0x36,0xfb,0x5f,0x65,0x66,0x84,0x8b,0x42,0x50,0x0a,0xdb,0x5d,0x67,0x39,0x69,0x12,0x2b,0xa8,0xf0,0x05,0x3c,0xd3,0x06,0x0b,},"\xee\xf5\xce\xeb\xd0\x44\x5e\x9c\x91\x81\xaf\xf9\xc6\xf2\x66\x01\x28\xfc\xfb\x63\x69\x1a\x42\xcf\xa4\x43\xd6\xa6\x49\xef\xc5\xfa\xd8\xc2\x08\x03\x76\x3e\xe9\x7d\x1d\xba\x08\xe6\x3e\x08\xa2\x61\x6d\xa0\x50\x77\x48\x9f\x2f\xa2\xc5\x6b\x75\x34\xf9\x40\x26\x19\x25\x1f\xdf\x9c\x32\x0d\xe7\xaf\x10\x9e\x2f\xd8\xb2\x56\x5c\xe8\xa7\x52\x4c\x94\x05\xec\x0f\x8f\xca\xa7\x14\x9a\x6d\x21\x0e\xfd\xe8\x3b\x11\x1c\xf8\x2d\xc0\x83\x5c\xf9\x4f\x20\xcd\xb0\x21\xb7\x3b\xd2\x62\x66\x65\x55\xe6\xd6\x27\x07\xb4\x6e\xe4\x2f\xa9\x00\xb4\xf4\xf7\x05\xde\x33\xd3\xdb\xdc\x68\xa8\x8d\x1a\x4d\x0a\xe9\x33\x56\x6d\xb6\xc6\x23\x7e\xc8\xab\xe1\x02\x4d\xac\x4b\x7f\x46\xd4\x07\xbe\x16\x59\x4d\x90\x46\xc7\x31\x2d\xda\x66\x14\xd9\xbc\xdb\x01\xfb\x83\x24\xfc\x62\xb8\xee\xaf\x0a\xbc\x23\xcd\x57\x0e\x30\x4f\xca\x08\xe8\x8c\x73\x5e\x5d\x31\x59\x24\x09\xce\xb5\x83\x86\x2e\x6b\x0a\x76\x77\x29\xf7\x55\x6f\xa2\xc0\x53\x64\x4d\x36\xc8\x33\x7c\x02\x74\xe7\x49\x20\x29\x82\xfb\x4a\x17\x1a\xca\xc1\x96\xc0\x2b\x7f\x16\xa8\xda\x49\x07\x1c\x8a\xb8\x07\x6d\xd5\xd3\xab\xad\xfe\x3a\xf8\x2c\xa8\x5d\xa0\x2d\xcc\x1c\x4a\x6f\x2e\x19\x30\xbe\xe2\x00\x9e\xee\x0d\x97\x1e\x40\xdd\x12\x17\x5c\x8d\x00\x69\x4f\x03\x25\xa3\xb3\x13\x3c\x0d\x0b\xd3\x82\xa5\x19\x4f\xb2\x14\x22\xce\x67\xc7\x8a\x5a\x6e\x15\x37\xe3\xb9\x7d\x5e\x20\x4e\x5d\x19\x56\x96\x39\x0f\x77\xd1\x90\x24\xc1\xbf\x6b\x51\x25\xa0\xcd\xbf\x7b\x98\x80\x03\x61\x81\xc9\x8e\x1a\xc2\xe5\x16\x5b\xd4\x96\xcf\x99\x74\x51\xa1\xc1\x21\x02\xe6\x69\x46\xb1\x67\x6a\xbd\x4c\xbd\xd2\xc1\x16\x73\xf4\xf2\xcd\x5f\x3c\x9a\x43\x4d\x74\x7f\xa0\x5b\x40\xfb\xc7\x22\x68\xb4\xeb\x28\x42\xe4\x74\x1f\x51\xb7\x70\x9b\x6a\xcc\xc4\x7f\xca\xf7\x0d\x9c\x1c\x4c\x35\x86\x71\x19\xd8\x1c\xb3\xff\x1f\x16\x08\x11\x33\xf1\x65\x9a\xed\x85\xf6\x3b\xc9\x01\x98\x9e\x26\x17\xfc\xce\x15\x3c\x29\x78\xd7\x08\xfd\x02\x44\x9a\xe4\xd5\x38\xd1\x22\xdd\xb8\x52\x7c\x0a\x76\xa1\x02\xee\xff\x6e\xdb\x65\xdb\xa2\x98\xd3\xc2\x17\xf6\x55\x18\x14\xed\xde\xec\xe1\xae\xf5\xf3\x71\xa5\x4f\x12\xbf\xfd\x6b\x49\x61\x81\x9a\x0f\x24\x4f\xf0\xd7\xd8\x69\x4c\x14\x42\x2d\xe9\x82\x2c\x13\x17\x9e\x4e\xeb\x81\x59\x50\x79\xb9\xdd\x2a\xd1\xe7\xc3\x9b\xd3\x03\xcc\x44\xae\x3f\x36\x34\x88\x15\x77\xa2\x66\xfd\x6b\xb7\x91\x78\x12\xb9\x99\xdc\x80\x9d\xc0\x9c\x3d\x70\x19\xda\xcd\x28\xe4\x30\x13\xa2\xf9\xe4\xf9\x4b\xb0\xbf\x71\x24\xef\x09\x17\x83\xf7\x96\x39\x7f\x64\x63\xbf\x1e\xfb\x39\xcd\x46\xf3\x79\x0a\x1d\x9b\x6a\x7c\x30\xf1\x49\xb5\xe6\x6c\x29\x37\xe3\x9c\xb9\x74\x4d\xdc\x66\xab\x56\x1b\xad\x4e\x6f\xa8\x53\x4d\x69\x88\x38\x22\x64\x3d\x63\xd8\xbd\x7b\x18\x16\x21\xa2\x67\xe9\x55\xe7\x58\xd1\x79\x2b\x44"}, +{{0x53,0xcb,0xd6,0xf6,0x8c,0xee,0x27,0xb9,0xf7,0xbc,0x05,0x9b,0x80,0x3b,0x44,0x79,0x49,0xbb,0xc9,0xc5,0xd5,0xa3,0x86,0x52,0xd7,0x78,0x9c,0xa1,0x54,0x20,0xde,0xa1,},{0x61,0x16,0x99,0x0b,0x53,0x31,0xe2,0x16,0x5f,0x82,0x74,0x3f,0x01,0xd8,0xe7,0xbd,0x5d,0x70,0x88,0xb3,0x01,0x59,0x83,0x3f,0xa7,0xb9,0x39,0xcf,0xb1,0xcc,0x04,0xd7,},{0xd8,0x25,0x04,0x40,0x5f,0xf1,0x6b,0xa6,0x44,0x3d,0xc4,0x82,0x36,0x72,0x63,0xa8,0xe2,0x00,0x36,0x0a,0xca,0xaa,0x83,0xfc,0x4e,0x4b,0x72,0xbd,0x24,0x9f,0x16,0x10,0x3e,0xc7,0xe5,0xa7,0xe9,0xca,0x17,0x19,0x8f,0x88,0x8e,0xac,0xa1,0x6b,0x74,0x0c,0xc3,0xf5,0xc3,0xb7,0xb6,0x17,0xa3,0x4b,0x94,0x91,0xc3,0xed,0x76,0xaa,0xb3,0x0d,},"\x30\x6f\x8e\x1d\xf0\xa4\xca\x78\xbd\x77\xe8\xe1\x19\x1c\x94\xde\xaa\x82\x64\x83\x55\xc2\xae\xcb\x7e\x82\xfc\x56\xd6\x4c\x50\x46\x19\x24\x7e\x7c\xf8\x94\x33\x28\xd1\x1f\x3d\xb4\xb1\xdc\x14\x8e\x8e\xf6\xf6\xc3\xbc\x35\x59\x69\x66\x2a\x28\x1a\x65\x57\x63\x91\x24\x2b\x7b\xd5\xa6\x2f\x8f\xa7\xac\xb6\x04\xe3\xa3\x44\xae\x1a\x9d\x73\x2a\x25\x43\x15\xf3\x1a\x04\x64\xc1\xe6\x58\x74\x62\xd2\x92\x12\xc4\x0e\x5e\xcf\x06\x1e\x26\x9a\xa0\xb9\x03\x90\xba\x41\x04\x07\x21\x68\x4b\xf2\xaa\x95\x82\xd8\x30\x66\x22\x1d\xb6\x0d\x0f\x7a\xe2\xf1\x49\xa3\x6e\x16\x95\x27\x04\xfb\x1f\x3a\x98\x2e\xac\x6b\x45\x83\x66\x5c\x63\xe5\xa8\x99\x6f\x24\xa5\x66\xdd\x50\x6a\x33\xd4\xec\x8a\x02\xb2\xbd\x34\xb7\x14\xc7\x45\x00\x0c\x01\x28\xa3\xc8\x9d\x94\x25\x06\xd1\x2f\x4b\xeb\x90\x0e\x29\x03\xcd\xb3\x4b\x35\xca\x9b\x6d\x3a\xd9\xb3\x50\xac\x99\xf4\x1d\xb3\xac\xfe\x7f\xe5\x5a\x28\xc0\xf0\x06\xb8\x44\xc9\xdc\x48\x53\xfd\x98\x53\x5a\xda\x79\x41\x6d\xca\x5f\xee\x58\x03\xa2\xd9\xf5\xd6\x8e\x6b\x80\x53\x9f\xf3\x02\xe9\x73\xf2\x4e\x9b\xc8\x8b\x7c\x41\x94\x11\x7d\xdb\x9f\x93\x2b\x32\xd5\xec\x74\x86\x8a\x13\x63\x1e\xce\x68\x81\x4b\x93\x14\x21\xdc\x89\x02\x49\x57\x03\x41\xf4\xb4\x23\xe8\x6e\x8e\xe0\x81\xb2\x27\x02\xf6\x49\xa6\xc7\xa0\xb7\xbd\xf5\xfb\x75\x62\x02\xbd\x10\xb0\xbb\x22\x15\xc7\xd6\x59\x7e\xff\xd8\x52\xf0\xb8\x9a\xbe\xc1\x5e\xa8\x22\x57\x68\x9d\xf8\x1e\x33\x82\x54\xf9\x3e\x81\xcb\xf0\x61\x72\x9d\x48\x3e\xb5\xcf\x64\x98\x05\xd7\x8e\xd8\x92\xdd\x0b\xd2\x48\xca\x1e\x25\x2b\xea\x51\x84\x7e\x1e\x82\xd3\x9a\xf5\x80\x50\xdc\x4a\xfb\xf9\x11\x5a\x3a\x60\x49\x3e\x8c\x0b\xa2\xe8\x6e\x08\x98\xcd\x0d\x43\x08\x91\xb9\xeb\x0a\x40\xf8\x74\x31\xe2\x5f\x41\x53\x8a\x03\x0f\x88\x4f\xab\x36\xad\x11\x16\x5d\x26\x7e\x8d\xd9\x4d\xcb\x05\xb9\x3a\x5a\xe7\x79\x69\x43\x0e\x18\x10\x13\x4e\x15\x72\x51\xb9\x82\xdf\x34\x3d\xff\xae\x61\x23\xa9\x9a\xa0\x56\x2d\x5d\xf7\x24\x08\xf1\xa6\xe2\x9c\x40\x59\xa5\xa8\xaa\xa4\xe6\x21\x52\x8f\xc6\x3a\x9c\xbe\x1f\x4c\x0f\xef\x25\xfe\x3f\x8e\x18\x15\x77\x74\x09\x7a\x9d\x91\x02\x0a\x90\x06\xb6\xc8\x60\xec\x1e\xe1\x0d\x52\x1d\x20\x3a\x1f\x8b\xb8\x25\x61\x29\x6f\xaa\xd4\xb2\x20\x3d\xa5\x3b\x20\x7a\x45\x9b\x29\xc1\x8b\xc0\x64\x93\x32\xb1\x80\x7c\x13\xca\x61\xac\xfa\xf9\x07\x79\xfe\xbb\xc7\xf3\x24\x21\x64\x79\x7e\x6f\x57\x2c\xb1\x5a\x9b\xe5\x88\x73\x43\x45\x5e\x26\xb9\x10\xc8\xbe\xfe\xe4\x2a\xeb\x04\x7f\x9a\xbe\x6b\x37\x50\xdb\xd7\xde\x99\x20\x2a\x0b\xb5\x76\xce\x14\x89\xe6\x1c\x1f\x5d\x27\xc6\x79\x2e\x63\x21\x8e\xdb\xfd\xb9\xb3\xdc\x51\x5b\x42\x54\xd8\x2c\x85\x9e\x52\xce\x6b\xd7\xad\x29\x6d\xd0\xe3\x70\x9d\x4c\x46\x63\x62\xf9\x02\x65\xe9\x9d\xa7\xd0\xb7\x01"}, +{{0x8b,0x65,0x74,0xf6,0xd7,0x39,0x69,0x81,0xe2,0x23,0xa4,0x83,0x7b,0xc3,0x39,0xc3,0xfd,0x65,0x94,0x19,0x84,0x5a,0x21,0x21,0xbf,0x85,0xbe,0x2e,0x69,0x5d,0x86,0x0d,},{0xe3,0x81,0x1a,0xca,0x70,0x63,0x4f,0x5a,0x9c,0xe4,0xb5,0x92,0xa1,0x7b,0xb5,0xcf,0xda,0x53,0x44,0x24,0x22,0xe2,0x03,0xcd,0xa9,0x50,0x4c,0x9d,0x65,0xb2,0x63,0xe8,},{0x2f,0xd0,0x90,0x54,0x75,0xa2,0xce,0xc3,0xe7,0x6f,0x99,0x09,0xb8,0xaf,0xd8,0x3b,0xeb,0x8d,0xae,0xfa,0x77,0xaf,0xcd,0xa3,0x4c,0xb4,0xf1,0x17,0x28,0xef,0x15,0xfc,0x9c,0x1d,0x7f,0x6f,0x6a,0xff,0xfc,0x28,0xf3,0x87,0x4f,0x91,0x3e,0x17,0x98,0x0f,0x0e,0x8e,0x3d,0x5a,0xd2,0x39,0x51,0xdf,0x2b,0x32,0xef,0xaf,0x62,0x19,0xce,0x0d,},"\xa4\x8a\xac\xc0\x49\x5f\xa0\xf1\x25\x9b\x27\x86\x5d\x3d\x75\xdc\x52\xc2\xc8\x28\xea\x8c\x4c\x2a\xd7\x85\x77\x07\x2f\xef\x72\x70\xf6\xa4\xd5\x82\xbb\x7b\x96\x2f\x4c\x3f\xd1\x49\xa6\x0a\x06\xbc\x8e\xfd\x29\x70\xef\x03\x14\x8d\xdf\x61\x98\xb9\xb6\x95\xa6\x9f\xad\xb5\x34\x09\x51\xcb\x75\x39\x8a\xc5\x1a\x4f\xd5\x54\x30\x37\x8c\xd5\xda\x88\x85\x21\x0b\xfd\x21\x46\xf9\x5c\x62\x76\x32\xfe\x8b\xe0\x6d\xe0\x1a\x7c\x27\xb8\x9d\xee\xfd\x67\xef\xc6\x9c\x9b\x5c\x62\xb3\x81\x08\xf7\x76\x22\x91\x43\xda\xe6\x60\xc1\x0c\xbe\xa3\xcd\x4f\x7e\xe5\x3d\xc3\x69\x2e\xd0\x11\x77\xe4\xa6\xf7\xe4\x24\xb5\x66\x6f\x7f\x49\x5f\x2a\x65\x60\x2c\x7d\x08\xc5\xd5\x72\x23\x4a\x56\x7c\xb6\xc3\x8a\xfd\x79\xca\xb5\xc4\x03\x6d\x62\x63\x7a\xef\xab\x55\x88\x76\x9a\x44\x8a\xb4\xc6\x5e\x24\x55\x4b\xd4\x15\x80\x50\xe0\x9e\xb5\x8f\x99\xab\x40\x77\x7b\x03\x56\x70\x9b\x7c\x02\x5a\xe5\xae\x54\x22\xac\xf8\x74\x44\x93\x1a\xe4\xd9\xa8\xb3\xd9\x44\x76\x88\x11\x28\xba\x1e\xb7\x32\x8f\xaf\xc7\x5f\x6b\x9d\xac\xc9\x6d\x3b\x64\x87\xdd\xef\x7c\x59\x26\x2d\xca\xda\x42\x6a\xac\xb1\x39\x22\x93\x54\x11\x56\x62\x35\xe0\x58\x37\x26\x22\xd8\x85\xbd\x0c\xc0\x49\x58\xdc\xfb\x17\xe0\x8f\xcd\x7f\x14\x7e\x20\x15\x6c\x8e\x26\xaf\x85\x53\x0f\x55\x11\xa6\x8d\xb4\x3d\xaf\xc4\xe6\xa2\x3f\x66\x7d\xf3\x74\x3e\xed\xd7\x1a\x3f\x07\xf7\x6f\x94\xd1\x68\x8a\xfc\x84\x63\xbf\xa5\xa4\x39\xae\x31\x14\x69\x94\x8e\x74\x47\x06\x4f\x0b\x05\x06\xf3\x67\x19\xc1\x34\x66\xa1\xb9\x87\x76\xd9\x67\xec\x58\x20\x8b\xa6\x74\x03\x73\x03\xdf\xc6\x19\x0d\xa7\x83\xff\x27\x30\x3b\x86\xb5\xfc\x32\x11\xf0\x1c\x91\x5e\x83\xa6\xad\x01\x21\x44\x79\x11\xcb\xe1\xcf\x69\x6f\x61\x8f\x60\x23\x66\x43\xf2\xe9\x4e\x15\x5d\xb6\x57\x18\x29\x44\xc1\xa4\x3b\xdc\x7b\xd5\xea\xf3\x48\x1f\xe1\x28\x40\x92\xcb\x37\x89\xa8\x92\xbd\x79\xa1\x11\xfd\x41\x01\x43\xcf\x91\xae\x33\x28\x60\xb1\xd2\x9a\xa0\x41\xd1\x77\xb5\x0d\x6c\xc2\xb9\x66\x0d\x32\x8c\x0f\x23\x0a\x35\x15\xe6\xa0\xd6\x88\x70\x9c\x0c\xd3\x47\xad\x2f\xf3\x2d\x61\xd1\xe1\xe9\xba\x76\xf8\x1e\x87\x3a\x6c\x42\x0f\x17\x07\xf3\x84\x1d\xb5\x19\x6c\xb5\x3f\x50\x6f\x00\x06\x35\x2c\x7c\x44\xc0\x80\xf3\x09\x68\x01\xa5\x7a\x49\xcf\xe8\x42\x05\xbd\xd7\xa9\x80\x1f\x84\x3c\xf2\x6b\x95\x58\xa2\xdb\x78\x8e\xf1\xb2\x37\x91\x5d\x58\x7b\x9b\xa9\x77\x98\x90\xf6\x1f\xdc\x91\xe0\x3e\x4f\x4c\xdb\xef\xe4\x17\xcc\x22\xd5\x22\xa8\x6a\xdd\xdb\x53\xf3\x74\x74\x50\xab\x62\xb5\x76\x56\x5d\xb3\x2e\x0c\xd4\x42\x76\x54\x7d\x9a\x16\x65\x3c\x27\x96\x59\xdd\x4d\x17\xec\x04\x82\x7c\x53\x3e\x33\x39\x0f\xe9\x4f\x79\x35\x09\x25\x6d\xb6\x75\x31\x73\x6a\xb3\xfc\xee\x2a\x30\x1a\xc3\xf0\xa2\x4d\x3b\x10\x8d\x7e\x75\xc3\x2a\x5a\xba\x36\xd6"}, +{{0x29,0xb2,0x88,0x1b,0x8c,0xaa,0xdb,0x33,0x6e,0x78,0x80,0xc5,0x10,0xb8,0x00,0x85,0xf4,0xb1,0x22,0x18,0x60,0xb3,0x01,0xeb,0x45,0x25,0x65,0x07,0x52,0xa6,0xd2,0x89,},{0x0c,0x5c,0x44,0xed,0x29,0xd2,0x1b,0xca,0xde,0xe2,0x1c,0xbd,0xe6,0x1a,0x9c,0xdb,0x6d,0x59,0x36,0x00,0x9b,0xa2,0xf5,0xb2,0xe7,0x77,0xc9,0x24,0xdd,0xfb,0x67,0x51,},{0x99,0xe9,0x96,0xe8,0x5a,0x49,0x4f,0x19,0x80,0xcb,0x07,0xde,0x9c,0xa6,0x16,0x5e,0x7d,0xe1,0x04,0xd3,0x9f,0xe3,0xc3,0x22,0x67,0x35,0xc5,0xda,0xa5,0x69,0x51,0x6f,0xca,0xf1,0xb6,0xe4,0xdf,0xad,0x0d,0x38,0x9b,0x6d,0xb0,0xec,0x8a,0x8f,0x20,0xdd,0x2c,0x60,0x26,0x56,0xb5,0xe7,0x61,0xc8,0xf3,0xa6,0x55,0x83,0x82,0x15,0x19,0x09,},"\x19\x74\xa2\xe2\xb4\x79\x49\xf4\x67\xa9\x31\xd1\xd9\xdd\x5c\xe1\x16\xe9\xf5\x03\x0a\xd0\x9a\x8c\xc7\x28\xd1\xae\xb1\x48\xbb\xf9\xac\xf5\x98\x74\xda\x80\xe7\x08\xd5\x3c\x66\x8f\x2f\x14\xd7\x52\x20\x71\xe9\x09\x80\x84\x27\xb2\xab\x5a\x05\xf8\xb9\x4f\x21\x50\x5c\xd2\x6a\xbc\x53\x45\x89\x78\xc7\x84\xd4\x79\xea\x6d\xab\x10\x5c\x4f\x79\x84\xa0\xfb\x97\x90\xe5\x06\x24\xf4\x73\x4b\x55\x19\x05\xaa\x5f\xfa\x60\x18\x4c\xd2\x01\xcf\x2b\x26\xc9\x79\x5d\xa6\xe7\xe0\x8d\x6a\x0b\xc7\x72\x24\x00\xfe\xf9\x4f\xc2\x10\x38\xbe\x89\xd3\x4b\xcd\x14\xc4\x27\xb8\x5b\x68\x66\x73\x71\x96\x15\x2d\x4e\xeb\x66\xd0\x5b\x24\x5a\xe8\x4b\xdc\x77\x87\xc1\x4a\x8b\xec\x2e\xea\x53\x60\xf0\x42\x43\x3d\x70\x79\x44\x67\xd4\x73\x93\xb9\x37\x57\xf3\x31\xcf\x2b\x53\xc6\x60\xd7\x1c\x29\x58\x2a\xee\xa7\x9b\x12\x52\x7a\x28\xb0\xc5\xe1\x10\xdf\x6f\x85\x4e\xea\xd9\xa2\xb0\x0d\x42\x54\x2c\xa8\x27\x6b\xb8\xbf\x98\x8b\xaa\xb8\x56\x59\x96\xfe\xe5\x0c\xf3\x1b\x24\x59\xc4\xc5\x0a\xb4\x75\x26\x5e\x83\xe2\x28\x5d\x43\xfe\x1f\x75\x2a\x55\xb2\xdb\xc4\x9f\xca\x04\xa8\x10\xf0\x41\x3b\xf6\xbd\x81\xb7\x9a\xc6\x4e\xe1\xf8\x9b\x97\xbd\x7d\x26\xd6\x25\x12\x27\x3e\x24\xa6\xba\xb2\xd5\xf7\xd2\x22\x6b\xaa\xab\x7b\x11\x12\x09\xbb\x03\x73\x3d\x8a\x60\xdf\xa3\x1a\x51\x6f\x4a\x8c\x76\x99\xd8\x28\x5c\x10\x65\x15\x9a\x6c\x73\x31\xc1\xde\xfb\x47\xa3\x0e\xf5\x85\x8c\x50\xb7\xd0\x45\x12\x4a\x09\x81\x3d\x1c\xfd\xa5\xc9\xcc\x3b\xb5\xbf\xae\x73\xc9\x84\x19\x7f\x8f\x85\x7f\x18\x6c\x41\xab\x87\xfb\x79\x62\xb6\x31\xf4\xd0\x07\xcf\xbe\xe2\x21\xfc\x65\x72\x78\x4a\x55\x11\x94\xc1\x97\x77\xb0\x8e\x6b\x59\x67\x57\xe7\xcb\xa7\xa0\xe2\x7f\xe4\x53\xf9\x0d\xc5\x9c\xc0\x8c\x64\x72\x43\x1c\x02\x0e\x8d\xd0\x91\x75\x90\xe7\x9c\x1f\x20\x73\x83\xaf\xb3\x90\x76\xad\x24\xda\x8e\xe5\x24\x86\x73\x94\x53\xa2\x59\x0e\x51\xbf\xc8\x9b\x13\xc2\x03\x3c\xfa\x5f\x89\x03\xcb\xe9\x96\x1a\x85\x98\xba\x55\x62\x32\x86\x9d\xfa\xb4\xd5\x6e\xdf\x4f\x05\xe8\xb7\x7d\x05\x87\x18\x95\xe6\x3b\x53\x51\xf7\x6c\xb2\xd2\xc8\x38\x5c\x10\x9d\x73\x06\x19\x2a\x25\x44\x6e\x4d\x62\xdc\x7d\x62\x4f\x0c\x66\x73\x98\x6b\xe0\x62\x8b\x2c\x2d\x73\xeb\x94\x1d\x35\xa3\x43\x30\x90\xf5\x9b\x28\xa5\x97\x9d\x56\xdb\xc9\xfd\x69\x73\xf6\x36\x47\x64\x2c\xd9\x03\xb0\xcf\x7a\x6a\xcd\x33\x0d\x87\xe2\x29\x27\x10\xde\x99\xe0\xc1\x79\xca\x78\x92\x9c\xca\xec\xfa\xed\xbf\x27\x42\x41\x4f\x17\x6b\x60\x90\xc0\xd5\x9a\x9d\xb7\x81\xc9\x96\x7e\x28\xfa\x4e\x77\xd2\xa0\x82\xe4\x2f\x52\x16\x91\x67\xe9\x2d\x4f\xdd\x82\xe2\xcc\x05\xdd\x91\x84\xc7\xdf\xee\x49\x0a\x23\x7f\xda\xd4\xdf\xeb\xc0\x18\x68\xe0\xa4\x35\x3a\x29\x54\xd0\x90\x92\x84\x61\x82\x1a\x7a\x84\x8d\x1b\x60\x81\x7f\xc3\xbd\xef\xa1"}, +{{0x42,0xaf,0xe8,0x9d,0xac,0x83,0xe7,0xd3,0x89,0x96,0xc0,0xdb,0xce,0x0c,0x98,0x74,0xc0,0x09,0x27,0xba,0xbd,0x77,0xca,0x8c,0xea,0xc3,0x4e,0x56,0x44,0x74,0x28,0x2b,},{0xa4,0xc5,0xf5,0xe3,0x80,0x3f,0x0a,0x03,0xd5,0xc1,0xc9,0x06,0xca,0xec,0x9c,0xc6,0xd2,0x85,0x14,0x07,0xf1,0xca,0x29,0xf7,0x2a,0x45,0xf2,0x33,0xe6,0x65,0x62,0x44,},{0x4f,0xba,0x2d,0x6c,0xc1,0xb7,0x19,0x3d,0x35,0x62,0xf8,0xc8,0xbf,0xe6,0x90,0x5c,0x82,0x9d,0xb2,0x65,0xa5,0x42,0x7c,0x5c,0x26,0x57,0x14,0x78,0x5b,0x83,0xf6,0x95,0x14,0xc5,0xe3,0x0e,0x28,0xb5,0x66,0x84,0xc8,0x2d,0xae,0x26,0x37,0x58,0x1b,0xf3,0xf4,0xef,0x27,0x14,0x20,0xbc,0x7e,0x60,0x10,0x61,0x3a,0x38,0xfa,0x10,0x1a,0x0d,},"\xe7\x10\xa1\x63\xad\x28\x85\xae\xb7\x65\x8e\xb3\x74\xf1\x18\xb7\x68\x42\xec\x36\xef\x3b\x01\x0c\x3c\x6b\x95\x59\xe8\xb1\x60\xc2\x62\x8d\xed\x0b\x85\x11\xeb\x49\x07\x18\x0d\xa4\xb6\x21\xe9\xaa\x4a\x32\x22\x88\x88\x8a\x1c\x09\x13\x0f\x69\xf8\x90\x59\x7a\x92\x93\xe7\x4f\x92\x89\xbd\xaa\x5c\x91\xb6\xfd\x24\xaa\x04\x4a\xb9\xfc\xb3\x40\x2f\x7a\xbc\x48\xd2\xab\x7b\x38\x80\xa0\x48\xda\xa4\x48\x64\x5a\xd2\xec\xb5\x5b\x3c\xae\xe2\xd6\x8a\x8b\xed\xb5\xd1\x86\x5d\x5e\x21\x1d\xe3\x9b\x0e\xaf\x22\xe5\xda\xf1\x0f\x71\x68\x20\x3a\xa1\x5b\x85\xaa\x47\xbb\xd3\xcc\x41\x69\xcb\xc1\xfe\x80\xb4\x70\x0b\x62\x58\x71\xed\xab\xcd\x4f\xe7\x4a\x3e\x96\x55\x69\xce\x24\x5c\xfc\xde\x42\x09\xcc\x8a\xbc\xd6\x79\x7d\x44\x18\x5b\x4f\x96\xc0\x18\x1b\xbd\x27\x00\x87\x83\xe9\x35\x8a\x53\x94\xfe\x3a\x34\xa0\x68\x71\xd3\x79\xda\x35\xb2\x0b\xb5\x7e\xef\x9e\x55\x24\xee\x79\x12\xa6\xf4\x1b\x4a\x1f\x68\x4c\x39\x19\xcf\xcd\xc0\x0f\x45\x80\xba\xf9\xe0\x9d\x31\x6c\xef\xa0\xf4\x65\xdc\xa5\xd8\xee\xc5\x14\xe9\x5e\x5a\x57\xbb\xcd\x27\xe4\x1f\x81\x19\xb2\x64\xae\x14\xa3\x19\xd8\xc3\x85\x9b\xab\xf1\xf4\xa6\xb6\xb7\x7e\x44\x2c\x86\x1d\x6e\xe2\x8a\xd1\x2b\x82\x36\x2e\x90\xdb\x0c\x36\x72\xb0\xe0\xd9\xff\x58\x14\x6f\xd1\x59\xaa\x8f\xa9\x9d\xc7\x55\xfc\x85\xb9\x0c\xf9\x41\x92\x79\xc0\x62\x4b\x93\xe7\x5e\xda\x0e\xf7\xc0\x96\x95\xae\x93\xbd\x72\x82\x41\x93\x77\xb7\x6c\xa8\xbd\xc0\x52\x1c\xfe\xe6\xf6\xd7\x29\xc3\xad\xff\x89\x46\x87\xb1\x77\xef\x19\x52\x9a\x6b\xda\xce\x70\xb6\x85\xc6\xd7\xa5\xd7\x4a\x08\xe2\xa9\xe7\x24\x03\x59\x75\xc8\x0d\x18\xcb\x36\x94\x70\xde\x72\x99\xcb\xd6\xb0\xa2\x7c\x92\x32\xc7\xea\xba\xc8\x6d\x50\x93\xa6\x5f\xfe\x0b\x40\xd4\x0b\xef\xe8\x0b\x68\xcd\x9d\xce\x1e\xa1\xe6\x57\xe4\x5e\x9c\x49\x9d\x0b\x69\x0f\x74\x45\x5f\xb4\x70\x96\xed\x8c\x18\xd1\x51\x7f\x90\x44\x29\x01\xa6\xc4\x10\xb7\xf6\x41\x5f\x20\xae\x48\xc5\x8a\xde\x8d\x67\x5b\x6c\x05\x8d\xf1\x6a\xe7\x69\x8f\xce\xae\x95\xaa\x77\x1b\x4c\xd8\x8a\x0b\x3f\x22\xc5\x1f\x98\xc7\x1c\x1e\xb4\x6b\x26\x4b\xf9\x7a\x30\x0e\xcb\x1f\xd2\x62\x26\xad\x8e\x87\xa0\x58\xcf\x3e\x70\x8e\x26\x0f\x56\x6b\x68\x53\x14\x04\x51\x33\xf4\xa5\xe8\xfb\xc3\x45\x61\xb9\xa0\xf1\xff\x93\x39\xf5\x52\x31\x07\x6b\x73\x6b\x6e\x11\x52\x43\x19\xa2\x72\xbd\x44\x53\xa0\xaf\x14\x93\xda\xa0\x91\x67\xe8\x46\x43\xd2\x07\xa0\x2f\xee\x98\xfb\x22\x3b\x01\xa9\x9a\xa5\xce\xf2\xb7\x00\x1e\x47\x0f\x6f\x94\xa5\xdc\x20\x8e\xdf\xc0\xcb\x8c\xf3\x11\x4a\x91\x96\x00\xf0\x61\x17\x2f\x0e\xfe\x03\x90\x36\xbf\x4d\xdd\xbf\xd0\xd4\x5f\x91\x44\x3b\xf2\x6f\x8e\x15\xed\x7d\xb8\xe5\x5f\x08\x6a\x4a\x45\x83\xf4\xbd\xa0\xf5\x56\x28\x4d\xcf\x71\x29\x2f\xe7\x0f\xca\xa8\x25\x9b\x9f\xaf\xf3"}, +{{0x10,0xf0,0x09,0xaa,0x88,0x7d,0x91,0xce,0xd8,0x09,0xaf,0xe1,0x92,0xd7,0x8e,0x47,0x99,0xd9,0x03,0x77,0x62,0xf4,0xa9,0xd3,0xa4,0x29,0xfd,0xe0,0xf3,0x9f,0x7b,0x7a,},{0xcf,0x51,0x16,0xb9,0x21,0x21,0x2e,0x9b,0x78,0x82,0x9a,0x02,0x63,0x46,0x36,0x91,0xc6,0xfb,0xcc,0xdc,0x0c,0x11,0x8b,0xe1,0x41,0xc9,0x6f,0x8c,0x88,0x05,0x3d,0xd3,},{0xc3,0x7b,0xb7,0xb7,0x3b,0x11,0x05,0xbe,0x08,0x6f,0xf3,0x07,0x69,0x72,0x07,0x72,0x62,0xdf,0x4d,0x73,0x32,0xf6,0x08,0xc7,0xb2,0xb9,0xd9,0x78,0xd4,0x74,0xcb,0xbc,0x27,0x10,0x46,0x08,0x00,0x35,0xf3,0x96,0xee,0x36,0x47,0x9b,0x7a,0x67,0x11,0xc6,0x8e,0x25,0x61,0xc7,0x41,0xc0,0xec,0x5f,0xc9,0xec,0xa1,0x73,0x4e,0x81,0x1f,0x04,},"\x2e\xdf\x14\xd6\xcd\x56\x89\x6e\xea\xa7\x70\x21\x1c\x49\x84\xbe\xd8\x0e\xca\x8d\x65\x34\xd5\xd5\x10\x88\x4f\x55\xf1\x1f\x99\xff\xa9\xf8\x9b\x58\x6f\xfe\x7b\x1e\xc7\xea\xab\x6a\x9d\xc1\xa2\x4a\x3e\xe3\xc7\xa6\xab\x44\xad\xe9\x91\x78\x83\x26\x4e\xde\x2f\x13\x61\xbe\x7d\x7a\x38\x17\xf2\x9d\xec\x95\x81\xc3\x19\xf1\x8f\x95\xd5\xbe\x26\xd9\x11\x8b\xe6\x78\x34\x00\x37\xa6\x8a\xbf\xc5\xef\xbb\x9a\x3f\x3f\x38\x78\xaa\xe3\x72\x1f\xfe\xf5\xbb\x6a\x26\xc7\xb1\xa3\xa5\x6d\x2b\xda\x6c\x6e\x86\x0e\xb4\x1f\xd8\xd8\x37\x11\x74\xd9\x1c\x74\xc5\xeb\x67\xc3\x85\x5c\x63\x0d\x64\x1d\x2e\x57\x1a\x9a\x51\xc6\x40\x2c\xfe\x18\x42\xce\xf3\x89\x80\xcb\x8d\x0a\x64\xbc\xc8\x9b\xe3\x18\x9e\x68\x11\xf4\x7e\x8f\x4d\x00\x63\xa5\xb1\x60\x1f\x44\xfd\xa2\x0c\x1c\x4c\x2f\xc4\x9c\xbe\x27\xa4\x13\x7d\xc4\x63\x8c\x2a\xd2\xd0\xa5\x47\x47\x47\x22\x9c\x56\x8e\x38\x05\x43\x1f\xa3\x6e\xeb\xa7\x85\xf7\xb9\x78\x44\xb5\xe3\x19\xfa\x6a\x09\xcc\x5a\xe8\x40\x34\x74\xbb\x91\xdd\x89\x6c\x1e\xc2\xba\xc7\x3d\x2e\x50\x5e\xfc\x62\xbd\x50\x2b\x5c\xeb\x08\xd1\x6e\x83\x2e\xc5\xdc\x4f\x98\xb5\x1b\x9d\x07\x38\xb9\xfb\x28\xf3\xab\xe8\x96\x6b\xf2\x23\x75\xa0\xb2\x2c\x47\x1a\x9e\x58\xe3\xfd\x70\x0d\xe1\x5c\x52\x96\x37\x3c\x1b\xc9\xd4\x64\x0e\xb7\x81\x6e\x1d\xc9\xc8\xce\x86\x19\xa8\x11\x83\x00\x9e\xc9\x74\x87\x1e\x8f\x0a\x97\x72\xed\xe0\xa6\x38\xb3\x57\x4b\xf7\x5d\x8f\x55\x98\x7f\x3c\xfa\x6f\xec\x68\x97\x0b\xfe\x00\xb2\x3b\x59\xfb\x5b\xf4\x99\x6e\xa5\xd7\x70\x4f\xcf\x2e\xff\xcc\x0f\xd7\xf3\xd8\xe6\x05\x60\x08\x09\x7f\x26\xca\xff\xd5\x41\x5a\x28\x2a\x27\x6a\x9b\x26\x45\xe5\xca\xb1\x29\x68\x87\x2e\xb0\x52\xf4\xd7\xc1\x0c\xc7\xc2\x1d\x51\x61\x81\x8b\xb4\x4c\xc8\x56\xb0\xde\x76\x9d\x55\x9c\x55\xdf\x64\xad\x9a\xdc\x16\xc0\xac\x65\x83\x8f\x66\x0d\xa8\x13\x86\xb7\x0b\x93\x52\x5e\xc2\xf4\x0f\x6f\x63\xf8\xea\x5d\x48\x30\xb9\x64\x6c\x46\x18\x3b\xb4\xe6\xf2\x70\x47\xbd\xa2\xa5\x46\xbd\x34\xbd\x4d\xb5\xfb\x88\xfd\x8a\xb7\xc7\x5f\x65\x2e\x15\xd5\xaa\xa6\xb4\x6a\x8a\xcf\x6e\x44\x8b\xf2\xdd\x64\xde\xe3\xc1\x05\x64\x7c\x7f\x83\xad\x20\x0d\x80\x97\xc4\x44\xa1\x58\xd8\x5a\x54\xf0\xe5\xdb\xb1\x2b\x43\xde\x94\x3a\xf1\xa8\x18\x56\xac\x96\x9f\x52\xa0\xbd\x45\x43\x81\xbd\x26\x50\x41\xa2\x69\x1d\x1a\x4a\x0d\x81\x9f\xa7\x90\x92\xc8\x80\x35\x21\xfa\x53\x68\x9a\xb8\x52\xf1\xfb\xab\xe0\x0c\x94\xb7\xf6\x82\xd1\x21\xcf\xf5\x43\x91\x32\x25\x29\xc8\xd5\xad\x7b\xbb\x98\xea\xfe\x30\x0a\xb9\x22\xf1\xc8\x92\x40\xa1\xe6\x33\xcf\x56\xa7\xb0\x2f\x74\xa2\x92\x14\xe5\x69\xa0\x57\xbd\x58\x5e\x40\x4d\x7c\xd5\x35\x20\x41\x45\x6e\x6c\xf9\x0c\x15\x34\x2e\x02\x56\x70\xf4\xfc\xcd\xf9\x87\x83\xb6\x85\x32\x14\xca\xc3\xfa\x80\x8a\x66\xc2\x7b\x65\x3c"}, +{{0x45,0x78,0xc6,0x5a,0x7c,0xa4,0x8f,0x27,0x74,0x05,0x0a,0x7b,0x0c,0xe7,0xa4,0xfd,0x5a,0xd4,0xe6,0x96,0xb2,0xb8,0xaf,0x23,0x96,0x16,0x4a,0x1c,0x7e,0x1b,0x7b,0xd7,},{0x15,0xbf,0x9d,0xbd,0x3b,0x81,0x73,0xe6,0xf0,0x3d,0xcf,0xd5,0x75,0xd9,0x09,0x84,0x5f,0x03,0x8e,0xaa,0x09,0xc5,0xd9,0x08,0xfe,0xf9,0x08,0xa9,0x74,0x58,0xb3,0xef,},{0xa1,0xc2,0x42,0xb4,0x5e,0x94,0xfd,0x18,0x0f,0x05,0x4c,0x71,0x01,0xe5,0x5b,0x39,0x65,0x68,0xf4,0x83,0xdb,0x6f,0x0d,0xfc,0x41,0x68,0xb6,0x9b,0x59,0xd3,0x85,0x81,0x4c,0x19,0xeb,0x30,0x75,0x23,0x7d,0x1f,0xbb,0x1f,0xee,0xbb,0xfe,0xa5,0x0c,0x56,0x81,0x3c,0x8c,0x39,0xc2,0x27,0x52,0xe0,0x2d,0xb7,0xe5,0x7f,0x3e,0x3f,0xbf,0x0d,},"\x50\x6f\x32\xb9\x68\x14\x24\x3e\x4d\xd8\x87\x0a\x8f\xd6\x0d\xde\xf0\x9b\xb8\xc5\x63\x15\x10\x70\xd9\xbc\xb2\xb1\x60\xa3\xea\xbd\x71\xa0\x44\xd7\x1e\xc9\x3f\xba\x95\x28\x8e\xd6\xfe\x1a\x7b\x92\x16\x51\x60\x43\x07\xd6\x5a\x45\xec\x5d\x3f\x26\x31\xac\xe4\x0e\x58\xd5\x3c\x72\xe5\x26\x88\x6e\x16\x97\x2f\x6e\x0d\xb9\x4d\x57\xb5\x56\x34\xfd\x39\xd5\x5e\x9b\xb7\xf2\x12\xaf\xab\x00\xf7\x74\x64\x09\x26\x7e\x8d\x56\x5f\xf5\xc2\x25\x73\x33\xc3\xd0\x41\x52\x17\x4f\xe1\x2d\xe6\xa5\x7b\xea\x05\x7d\xc2\x19\xe2\xfb\xa5\xf1\x91\xed\x81\x41\xc0\x18\x96\x9d\xe1\x94\x72\xd6\xaa\xf7\x63\xf1\x9e\xc5\x54\x70\x2b\xb3\xdc\xbe\x13\xca\x9b\x23\xb2\x41\x8c\x99\xe7\x18\x38\xa8\x8c\xf4\x54\x72\x8c\xf9\x20\x8a\x16\xc8\x4e\xa3\x98\x29\xb4\xba\x9b\x4c\x77\xe1\x76\x11\x2b\xfe\x1b\xf3\x5f\x95\xc4\x02\x8c\x7d\xb8\x0b\x36\xfa\xa2\x9d\x2b\x89\xe9\xe8\x62\xf3\x10\x00\x06\x5f\x13\x9b\x3d\xa7\x7d\x9d\x86\x85\x30\x57\x4b\x7e\x39\x1e\xd9\x7b\x34\xf8\x78\x16\x4f\x6b\x8d\x87\xb4\x06\xc7\xdc\x78\x60\xa5\x17\x5f\x92\x0e\x5a\x62\xdc\x1f\xc8\x2e\xd8\x45\x25\x43\xb1\x07\x36\x0d\x35\xd2\xb4\xc4\x23\x9e\xab\x46\x6d\x32\xbf\xda\x34\xf5\x10\x37\xa6\xfa\xe7\x6f\x6d\x8b\x83\xe8\xf7\xf4\x89\xdd\x4c\x1b\x49\xc3\x8f\x53\x57\x6e\x62\x17\x2c\x17\xde\xe3\x66\x5f\xde\x8c\xbf\x01\x5a\xf9\x66\x5b\x0f\x1d\xa2\xfb\x77\xb1\x34\xf0\x4b\xe2\x71\xe4\x02\xf3\x15\x37\xc2\xfc\x05\xc2\xf9\xb6\xfc\x3f\xfe\x47\xde\x33\x69\x13\x38\x67\xc6\x9d\x10\xe7\xf5\x37\xba\xe4\x56\x7d\x46\x8e\x0f\x2e\xd8\x06\xfe\x33\x5f\x93\x9c\x75\x99\x4f\x36\x3c\xe3\xb7\x0d\xaa\x7d\x5b\xd2\x31\x7c\x83\x38\x51\xfd\x8c\xc9\x72\x51\xec\x41\x90\x23\xd9\xd0\x17\x4d\x84\xd5\x60\x9a\x69\x18\xa1\x74\x0e\xb1\xe3\x09\xbd\x12\x73\x66\xde\xb9\xc5\xab\x12\x99\x2e\x99\x02\xe0\x15\xfe\x58\xd6\xad\xbf\x52\xd2\x2a\x76\x0a\xcd\x63\xe1\xed\xd8\xf1\x38\xe9\xfb\x01\x37\x18\x86\x01\xe1\x97\x8e\x7d\x04\xfb\x2a\xda\x2b\x2a\xee\x12\xf4\x9f\x28\x36\xc6\x84\x2d\x88\xcf\x48\xc8\x66\xe3\xd3\x3f\xcd\x26\x9c\x27\x5c\x89\xc2\x5e\x36\x69\xca\x90\xde\x7b\x67\xa7\xe7\xa3\x82\xcb\x7e\xfa\x47\xe9\xc2\xbf\x76\x57\x1c\x79\xa2\x50\x85\xef\x02\x04\x87\x15\x2f\x06\xbf\xa1\x33\x01\x5a\x1b\x8f\x1c\x0f\x6a\x9f\x0e\xae\x1b\xa6\x2b\xf1\x04\xf1\xc1\x6a\xc1\x4e\x1e\x96\xc4\xeb\xdf\x06\x1e\x0c\xc7\x10\x1d\x38\xda\x7e\x9e\x09\x94\xda\xf0\xf3\x22\xaa\x3c\xfe\xf9\x1b\x61\x6c\x2d\x00\x06\x89\xab\x18\xed\x45\x26\x8d\xcd\x27\x50\x94\xf6\x56\xba\x3c\xf5\x15\x26\x10\x24\x74\x1f\x74\x44\xab\x7f\xc4\xde\xcc\xe1\x67\x56\x03\x2a\x1b\xe2\x70\xff\x0b\x03\x17\x54\x2b\xa0\x26\x62\x26\x0a\x37\x6f\xc9\x12\xcb\xb0\x29\xca\xc5\x45\x15\xf5\xa5\x51\x36\x4f\x6a\x99\xff\xad\x0b\x9c\xbc\xd0\xe6\x93\xb7\xa5\x21\xcb"}, +{{0xc2,0x1e,0x70,0xc4,0x6e,0xde,0x66,0xe6,0x8a,0x88,0x73,0xbb,0xc6,0x4b,0xa5,0x12,0x09,0x30,0x3a,0x0a,0xc4,0xfc,0x49,0xb1,0xd8,0x3e,0x81,0x93,0xad,0x46,0xc0,0x37,},{0x9f,0xbf,0x80,0xa4,0x25,0x05,0xd2,0xc9,0x52,0xf8,0x9f,0x45,0x58,0xc3,0xe6,0xd1,0x87,0xa7,0xbc,0x1e,0xf4,0x46,0xb2,0xe3,0x73,0x23,0x43,0xc1,0x3b,0x33,0xd2,0x00,},{0x0a,0xe3,0x43,0xbb,0x84,0xe3,0xa2,0x99,0x07,0x8e,0x24,0x34,0xba,0x22,0x00,0x22,0xf3,0x16,0x0f,0x96,0x8a,0xc0,0x44,0x82,0xbf,0x8c,0xad,0x13,0xb4,0x23,0xf2,0x67,0x0f,0x01,0xfb,0x5f,0x7b,0x32,0xc5,0x97,0x52,0x0f,0x84,0x60,0x7e,0x0f,0x79,0xc0,0x75,0xfa,0x70,0x78,0xe6,0xe6,0x9d,0x3c,0xec,0x31,0x92,0x65,0xd4,0x66,0x08,0x0b,},"\xf5\x5a\xa5\x70\xce\x4f\xc9\x5f\x73\xf5\x17\x20\xd2\x54\xe4\x69\x5f\xcd\xc8\x1a\xaa\x04\x01\x30\xc7\x68\x7f\x03\x9b\x8b\xa5\x9e\xd8\x57\xce\xb2\x9c\x12\x10\x25\xa8\x57\xfe\xac\xb4\xa0\x1f\x38\xe0\x11\x78\x31\x0a\xe6\xe3\x5c\x99\x8e\xbf\x89\xdd\x79\x05\x7b\x4a\xfc\x6d\xb3\x40\x60\x1c\x81\x70\x3c\x87\xa8\xc4\x0e\x5c\xeb\xb0\x44\x1d\xf7\x8a\x6d\xe1\x3a\x44\x7c\xb0\x16\xc6\x5e\x74\x1b\xb7\xdf\x30\x4d\x83\x05\x6b\x72\xc6\x82\xc7\x31\xfa\xc0\xa0\xc7\x0b\x78\x11\xca\x14\xa5\x01\x54\x61\x30\x99\xc2\xc4\x37\x52\x1c\x40\x4b\x63\x61\xde\x36\x21\xf8\xea\x56\xb0\x8e\xbf\xdb\x07\xb4\xf2\xbb\x8b\xa2\xec\xc1\x64\x33\x6d\xa8\xef\xc9\x42\x76\x6e\xf0\xc7\x4d\xfd\x3b\x49\xe0\x87\xe9\xa2\x7a\xe5\x4a\x7a\x2b\x98\x28\x1b\x9a\xf9\x3d\xc1\x1a\xa2\xf0\x92\x24\xab\x5a\x73\x0f\x02\x18\xf4\xa6\xe1\xea\x48\x85\xa7\x7f\xbd\x93\xa1\xc5\x82\x77\xd9\xe0\x1b\xe7\x3a\x25\xcd\xa9\x18\xfc\x27\xdd\xdb\x45\x3a\x5d\xa6\x90\x2a\xd0\x2b\xa0\x57\x75\xc6\x7e\x07\xbe\xa4\xdf\x86\x91\x34\x66\x74\x43\x65\xc1\x32\x6e\x0a\xb5\xe1\x25\x4c\x17\x96\x74\x47\xd5\x91\xba\x5e\xd1\xb6\x3a\x42\x54\x3b\x87\xfe\xd4\x14\x59\xa0\x89\xbc\xea\xff\x21\x98\x02\xa8\x7a\x87\x2a\x76\x3e\x69\x23\x33\xce\x1c\xc7\x39\x78\x25\x08\x4b\x2b\x83\x1e\x93\xd8\x0d\x67\x37\xf3\x29\x80\xf2\xf3\xae\x82\xc6\x21\x90\xfe\x3f\xa7\x00\xc5\xb7\x32\x9d\x6d\x50\x04\x2b\xdf\x83\x1f\x37\x54\x8f\xcc\x80\xb1\x1f\x57\xcf\x20\xf6\x7a\x3b\xb6\x51\xa7\xbe\xff\xcc\x48\xb7\x0d\x17\xeb\x60\xf7\x25\x9c\xc5\x3b\xf7\xff\x60\x80\xeb\x2b\xd0\x92\x3b\x04\x83\xaa\x30\x65\xa8\x95\x5f\x01\xd2\x3b\xa8\x09\x51\xe0\xae\xfd\x2a\x93\x72\x19\x15\x72\xbc\x52\x91\x6a\xa2\x2a\x2a\xec\x39\x37\x67\xfa\xfd\x08\x68\x39\xe2\x36\xfe\x04\x60\xce\x6d\x63\x9c\x7c\xe6\x9f\xe7\xf9\xd3\xaa\xd2\x13\x05\x73\x44\x35\x70\x44\x3b\xe6\xba\xb9\x3a\x06\xa5\x4b\x8a\xc2\x9b\xf3\x3f\xf9\x94\x9b\xc9\x21\x58\xe6\x92\x4b\x6b\x68\xec\xda\x5f\x6f\x3a\xaf\x42\xb3\xd2\x2d\xf6\xd5\xe6\x7d\x5c\xb3\xab\x71\xeb\x8e\xe0\xb0\xe6\x67\x32\xe1\xda\xca\x6c\xd6\x0d\x9a\xa7\x43\x05\xfc\xd5\x70\x07\x6d\x22\x8d\x44\x6d\x5e\xe5\x42\xb1\x04\x88\xbf\x8a\xa9\x88\xf4\x51\xfa\xeb\xe7\x4a\xb6\x69\xd6\x04\xd9\xdd\xb1\x51\x06\x62\x0e\xa0\x2e\x8d\xb3\x8c\xe6\x39\xb5\x74\x78\x12\xbb\x90\x48\xee\x8b\xf7\x2b\x1a\x95\x1a\x05\xdf\xfa\xc9\x54\x17\xcb\x43\xb0\x6d\xce\x61\xee\x3d\xa6\xf2\x83\x2e\xe8\x3b\x2e\x72\x88\xdd\xd6\x2e\xeb\x58\x93\xf7\xf2\xf6\xc8\x09\x0d\x99\xe3\x36\xc9\xf9\x06\x9e\x18\x15\x98\x58\x41\xbd\xd5\x05\xb5\xf8\x3d\x89\x5e\x87\x95\x93\xda\xde\xe7\x2c\xeb\x97\x65\x69\x9b\xf8\x0b\xd0\x6a\x5c\x55\x33\x1b\x25\x45\x52\x7d\x0c\x7c\xae\xce\x96\x58\x4c\xe3\xec\x7f\xe0\x22\x60\xf2\x0b\x8a\x1c\x06\x35\x76\x3f\xf4"}, +{{0xf2,0xc1,0x05,0x77,0xf7,0xdf,0x77,0xf0,0xc1,0x15,0x7a,0x8c,0x33,0x1a,0x7b,0xd2,0xae,0x63,0x86,0x67,0x0e,0xb6,0x5f,0x0f,0xae,0x12,0x23,0x31,0x69,0x0f,0x82,0x8a,},{0x0d,0x4c,0x34,0x0f,0xc2,0x31,0xaa,0xfb,0x3b,0x6f,0x74,0xb8,0x9b,0xce,0xf7,0xee,0xaa,0x0b,0x04,0xf2,0x93,0xec,0x85,0x44,0x24,0x7b,0xfc,0x3f,0x2d,0x57,0xc1,0xe0,},{0x60,0xb7,0x03,0x11,0x5a,0x32,0x2a,0xb8,0x92,0xc2,0x76,0xbf,0xd1,0x8f,0x70,0xa9,0xeb,0x0c,0x73,0x23,0xe2,0xc0,0xa6,0xeb,0x5f,0xc7,0xe3,0x30,0xb0,0xbc,0x3b,0x07,0xa5,0x78,0xa0,0x82,0x84,0x62,0x64,0xf0,0x32,0xc6,0x19,0x1d,0x04,0x0b,0xd9,0x8e,0x5d,0x5a,0x4d,0x4f,0x07,0x6f,0xb9,0x06,0x2a,0xcd,0x36,0xbe,0xa4,0x0c,0x91,0x02,},"\x38\xea\x1e\x02\x8a\x49\x3d\x1c\x60\xec\x70\x74\x9f\x14\xd4\x36\xeb\x3a\x2b\x2d\xe5\x4f\x21\x3d\x01\xa6\x45\xb5\x80\x43\x0e\xcd\x8e\xce\x6b\x55\x69\xcc\x01\x7a\x49\x43\xe5\x59\x5c\x5e\xd6\xe4\x8c\x94\x43\xf2\xfa\x5e\xb2\x22\x7f\xfe\x56\xd2\x11\xf2\x69\xbc\x8f\x6f\xa9\xee\x8c\xd5\x6f\x6b\x84\x70\x53\x92\x08\xaf\xe2\x9a\xb0\xa1\x95\x04\x4d\x95\x7b\x31\xf9\x3e\x18\x4a\x9c\xbe\xf1\xa1\x4e\x14\xf8\x08\xbb\xf5\x89\xac\x77\x70\x08\x4f\x99\x8e\x1b\x25\x4d\xa5\x9c\xa6\xd3\xe6\x2e\x7b\xe1\x79\x07\x16\xd2\x56\x0f\x01\x5f\x39\x9c\xbb\xce\x48\xcf\xd0\x39\x1e\xad\x19\x93\x44\x6f\x6b\x24\x93\x97\x7d\x93\xd7\xb0\x9a\x07\xa7\x9a\x59\xce\x15\xdc\xe7\xa1\xda\x9c\x64\x6f\x45\xaf\x2c\xca\xd5\x5b\xa1\x58\xe6\x38\xc4\xa3\x0c\x5d\x30\xe9\xac\x6e\x3a\x33\x39\xc2\x43\x42\x6d\x86\x49\x1b\x2d\x92\xda\xc1\x47\x8e\x8d\x74\xff\x0b\xf1\x49\xbd\xb5\xe0\x9e\x3f\xb6\xb8\x26\x2e\xb0\x68\x79\x81\x55\x4a\xe2\xcb\x47\x19\x63\x39\x07\x9d\xa0\xa1\xa5\x72\x39\xc1\x9b\xf7\x81\xf6\x2f\xda\xf4\xe3\x15\x60\xa8\x43\x17\xef\x03\x04\x92\xcf\x1b\xb1\x30\x5b\xa8\x51\x8e\xba\xf2\xb4\x34\xd3\x64\x16\x72\xc8\xf6\xea\x2d\xef\xa6\x96\xdc\x7e\x4f\x39\xef\xc0\x8d\x28\x8d\x1c\x96\x6a\x6c\x71\x48\xc0\x12\xee\xc4\x39\xf7\xe1\x2d\xba\xb5\xb8\x7c\xfa\x44\xc9\xae\x19\x00\xf8\x38\x6f\x24\x44\x4e\x10\x92\xb2\x3a\x27\x4c\x13\x8e\x95\xc6\x61\xe9\x37\x7e\x8a\xd2\xd1\xfc\xaf\x19\x39\xec\x9a\x63\x2a\x87\x3f\x7e\xad\xbe\x68\x7b\x4a\x03\x3b\x92\xa4\x77\xf2\xe0\x2e\x9e\xd9\x2c\xe4\xf9\x5c\xf1\x70\xb3\x90\x15\x18\xa0\x62\x14\x3e\x56\xdb\x05\x4d\xf4\xe4\x43\x15\x44\x78\x5a\x6d\xfa\x24\xee\xc0\xf0\xde\x7a\x69\x9c\xcf\x28\x6d\xad\xfa\xd8\x59\x03\x61\x22\x50\x76\x4f\x25\xcd\xea\x81\x27\xd0\x07\x8d\x55\x48\x25\xea\x6e\x73\x71\xc4\x38\xbc\x46\xf2\x9f\xb8\x93\x7f\x8d\x9a\x39\xcf\x88\x49\x05\x2d\x43\xec\xbf\xf6\xc4\xa3\x76\x2a\x5f\x40\x0c\x15\x14\xe8\x5e\x91\x38\x4f\xef\x9b\x40\xf4\x31\x4e\x22\x3a\x9d\x68\xc5\x26\xac\xc7\x02\x27\xd6\x2b\x8b\x63\x7a\x34\x2d\xf1\x13\xd3\x18\x20\x2c\x51\xed\xd3\xc1\xef\xd1\xff\x20\xb1\xff\x07\x8b\x32\x06\x8e\x79\x4d\x92\x81\x33\x03\x7f\x1e\x3a\x34\x68\x9e\x62\x9e\x43\xfd\x2b\x8e\x88\xea\xb5\x0d\x7e\x7a\xb0\x64\x70\x14\xab\x5e\x4a\xd5\x82\x00\x65\x67\xef\xf7\x2b\x5a\xf2\xda\xc5\x36\x89\x2c\xcc\x87\x1f\x8a\x80\xb5\xcb\x79\xd9\x0b\xcc\x6b\x77\xd4\xcd\x08\xf8\x76\x18\x4e\xf5\x8c\x06\x4a\xe4\x30\xbb\x79\xa6\xb9\xe9\x6b\x0a\xd8\x73\x68\xaa\x83\x8a\x8d\xcc\xff\xac\x0c\xd8\xce\x9e\xa0\xd0\xec\x4c\x4b\x0f\x42\x67\x34\x16\x65\x9c\x98\x49\x92\xcf\x53\xb1\xe4\x45\x43\x10\x07\x64\x0d\x47\xec\xe2\x6d\xee\x4a\x29\x43\xaa\x70\x97\xdd\x35\x6c\xff\x47\x54\xf2\x1a\xc0\x7f\x6b\x3f\x73\xc4\x69\x05\x55\x12\xf3\x7a\xba"}, +{{0x04,0x1a,0x97,0x90,0x6b,0x59,0x56,0xb9,0xd3,0x40,0xf2,0xe0,0xd7,0xa1,0xdc,0xbf,0xef,0xe6,0x63,0xe9,0xbb,0x40,0x26,0xf8,0xcc,0x1a,0xe7,0xe2,0xa1,0x4d,0xe2,0x7e,},{0xf3,0x82,0xd3,0x2e,0x88,0xc3,0xa7,0x2c,0x7c,0xad,0xda,0xfc,0xf8,0xaa,0x69,0x9e,0x21,0xdb,0x7a,0x6b,0xf4,0xed,0xd6,0xe4,0x9a,0x00,0x5a,0xad,0x70,0x2e,0x6a,0x79,},{0xa2,0x3f,0x03,0x2e,0x66,0x92,0xa0,0xe8,0xbf,0xee,0x5b,0x2d,0x30,0xb4,0x14,0xcb,0x16,0xc3,0x5a,0xd0,0x8d,0xa3,0x1f,0x69,0x6d,0x46,0x1a,0x02,0x85,0x78,0x22,0xc4,0xef,0x35,0x7f,0x0c,0xcf,0x31,0x02,0x5a,0x4d,0xc9,0x5c,0xed,0x30,0xa9,0x94,0xf4,0x1e,0xdd,0x1d,0x08,0x7a,0xfc,0xaa,0xf3,0xe8,0xe8,0x75,0x70,0x83,0x20,0xf8,0x0c,},"\x71\xa7\x59\x57\x41\x15\x44\x97\x5a\x48\xcf\x10\x3a\xa1\xf8\xe2\xad\x15\x24\x44\x59\xcd\xc0\xe3\x36\x96\x6e\xb8\xb2\x6c\x97\xf2\x16\x9e\x5d\x78\x53\x70\x37\xef\xc0\x77\xe8\x6f\x06\xe0\x5e\x9c\x1d\xc3\x41\x82\x88\xc0\xa2\xbe\x6b\xa3\x4b\x3a\x04\xab\x20\xba\xe7\xf3\x62\x10\x94\xb8\x7d\x78\xa7\xea\xcb\x86\x4d\x40\x78\xcb\x4e\xfc\xba\xc5\xad\xd9\x37\xa2\xc6\x01\x2e\xe1\xa8\xb2\x56\xcc\x27\x6b\x65\xd5\xe9\x2b\x4d\x00\xb9\xb1\x1f\xad\x88\x49\x91\xde\xc4\xc1\xcb\x9d\xce\x18\x63\xc8\xb0\xa2\x10\x16\x1a\xe6\xb3\xf8\xbf\x9c\xc4\xdc\xe4\xad\xfd\xc8\xed\x57\xd8\x3e\x95\xab\x9d\xd2\xd9\x26\x58\xdf\xbd\x3a\xfa\x99\xe3\xf8\x95\x1e\x2a\xd7\x4a\x14\x8f\x6f\x59\x7e\xb2\xc9\x45\xc1\xf1\xb9\x44\x61\xae\x07\x45\x48\x1f\xd0\xed\xf8\x38\xc6\x28\x60\x35\xe3\x6f\x01\x12\x38\x87\x5d\xbb\xa2\x28\x9d\x3d\x6a\x39\x42\xa7\xf9\x55\x4c\x64\x43\x05\x24\x4d\xdb\x77\xc1\x17\xcb\x4b\x56\x23\x77\x29\xdd\xe4\x28\xb8\xbb\x42\xdf\x9c\xe2\x9e\x14\x4d\xfc\x96\xcf\x6c\x67\x67\xb1\xee\x6d\x05\x3c\xe4\xf8\xbb\x20\x56\xab\x78\x10\xaa\x13\x68\xa8\x91\x0f\x2f\x69\xe0\x61\xc1\x9d\x88\x47\x18\x4f\xed\x53\x4f\x98\x75\x8d\x70\x3a\x76\x88\x5f\x91\xeb\x75\x2a\x21\x95\x4a\x10\xc6\xf6\xb4\xda\x10\x46\x4d\xed\x36\xb0\x00\x89\xf6\x62\x91\x54\x21\xbf\xda\xd4\x96\x75\x36\x89\xcc\xd0\x3b\x62\x40\x21\x08\x07\x61\xe6\x81\x76\xb1\x06\x97\xda\xc8\x78\xe4\xc3\xdb\x2f\xd0\xb2\x8c\x65\x53\x35\xd9\x80\x16\xf1\x9f\x26\x5b\xb0\xb2\x43\x4c\xb4\x63\x78\x44\xd9\x1e\xd0\xce\x05\xed\x25\x91\xfd\x99\x89\x65\xf8\x3f\x31\x97\xd1\x0e\xef\x44\x88\x50\xe7\x92\x03\x27\x24\x70\x1d\xa3\x05\xcb\x6d\x79\x46\x69\x48\x3f\xc3\xdc\x6f\x68\x6b\x18\x3e\x29\x99\x13\x0c\x8f\xc0\x05\x8d\xca\xbb\xc9\x18\x8f\x26\xb2\xd6\x3e\xbd\x6c\xb1\xe1\x8a\x09\x7c\x77\x04\xa5\x9b\x5e\x18\x7e\x01\x42\x59\x3b\x70\x83\xf7\x40\x0a\xfa\x9b\x1b\xf0\xc1\xcc\x6c\x35\x6b\xc4\x33\x4a\xf7\x72\xe6\x71\x53\xb4\x5b\x33\x1b\x99\x09\x20\xc2\x4e\xed\xe2\xc6\xe3\x23\x70\x3f\x52\xec\xd6\x07\x35\xb2\x3b\xf2\x2b\x81\xee\x77\x59\x27\xc3\x7e\x53\xda\xd7\x59\x6e\xa6\x5a\x73\xbb\x96\x77\x5f\x3b\x87\xc8\xb3\xc0\x88\xec\x69\x5b\xc3\xa7\x50\x2c\x0c\x51\x0f\x02\x0b\xf9\xac\xa3\xcb\xb7\xa2\xc0\x11\xc6\x7f\xf2\x7d\x63\x4c\xaf\x1d\xcf\xc5\x8e\x5e\x39\x7e\x66\x58\x25\x22\x72\x01\x1c\x8f\xfd\xd6\x42\x30\xa9\x32\x41\xff\xf6\x83\x72\xc4\xba\x85\x38\x2b\xbb\x22\x93\x09\x65\x29\x22\xdb\x68\x83\x66\x31\xe5\x5b\xe6\x9a\xb6\xad\xb8\xe4\x33\x53\x57\xfc\x92\x3e\xfe\x15\x4a\xfc\xc2\x22\xd6\x0d\x07\xf5\x69\x90\xa3\xe5\xa2\x14\xb2\x27\xae\xcf\xf2\xcd\x1b\xb6\xf0\xc7\x9f\xf5\x45\xf7\x0a\x61\x61\x41\xa9\xd5\x3f\x92\x2a\x02\x44\x3f\x7d\x2a\x46\x89\xc3\x5b\x09\x5d\xd3\x94\xd5\x0b\xf4\x9f\x96\x80\xa5\xf7\xd9"}, +{{0x4b,0xc5,0xe0,0x5a,0xa0,0x03,0xa4,0x49,0x2f,0x4b,0xad,0x10,0x2a,0x53,0x90,0xf7,0xce,0xba,0xb3,0xd3,0xec,0xa9,0x15,0x21,0x42,0xad,0x5e,0xf7,0xd8,0x40,0x30,0xae,},{0x67,0x51,0xd3,0xad,0x8b,0xb6,0xc6,0x4d,0x6a,0x17,0xd7,0xe4,0x47,0xa2,0x7d,0xa2,0x2f,0x5f,0x04,0x03,0xf4,0x37,0xba,0xc9,0x44,0x9f,0x13,0xcc,0x85,0x3d,0xd8,0x40,},{0xa2,0x4f,0xee,0x11,0xf7,0xec,0x6d,0xa3,0xe9,0xdf,0xaf,0x6c,0x85,0x8a,0xc0,0x04,0xb4,0x53,0x1a,0xbd,0x1c,0x9d,0x3b,0xb6,0x4f,0x40,0xdd,0x24,0x7f,0x00,0x35,0x93,0x50,0xe4,0x3b,0x2d,0x4b,0x8f,0xbe,0xc5,0xf6,0xb2,0x41,0xec,0xf9,0xf1,0x10,0x14,0x85,0xcf,0x41,0x87,0x35,0xb0,0x5f,0x71,0x20,0x18,0x33,0x5b,0x20,0x06,0x83,0x08,},"\xa8\xf7\x94\xdb\x17\x95\x66\x7d\x28\xd2\x4b\x70\xac\x22\x00\xa6\x23\x9a\x34\xe2\x43\x8c\xed\x1d\x03\xf9\x7e\xd4\x8b\xeb\x4d\x6b\xea\x67\xc1\x43\x38\xf7\x73\x64\x19\xdc\xd2\xa2\xa7\x97\x37\x26\x57\x2e\x6a\xfe\x7e\xdf\xef\x22\xc9\x9b\xe8\xb0\x69\xf0\x4f\x6d\xc6\x1a\x13\xb3\x43\xc6\xe5\x85\xab\xad\x22\x14\xd8\x5c\x36\xf0\x29\x96\xfa\xbb\x46\xbb\x91\xb5\x17\x6a\xc7\x08\xe4\x9a\x0b\x05\x30\x17\x04\x8f\xbb\x55\x45\x3f\x2b\x82\x08\xd6\x67\x8d\x1a\x8c\xf6\xa1\xee\x9a\xd7\xa9\x1e\x38\x03\x25\x63\x5d\x1e\x23\x6a\x6c\xa1\xd6\xcc\x7f\x6b\x59\xf2\xa2\xbf\x18\x4f\x5e\xe4\x51\xd6\x79\x9f\x69\xba\x11\xa0\xcd\x6b\xc0\x4b\xe8\xa3\x51\xa8\x0e\x72\x5b\x5f\xc4\x56\x3e\x45\xbd\x47\x49\xec\xbc\x45\x20\x52\x29\x10\x5b\x9d\xe7\x32\x61\x49\x85\x27\xf3\xd4\xec\xfb\xb5\x83\xff\x53\x27\x53\xd0\x7c\x38\x52\x6b\xb4\x82\xd1\x71\xa2\x61\xb9\xcf\x89\x90\x6a\x7d\xea\x8c\xbd\x7e\x72\x6b\xa3\x1e\xa6\x88\x03\xa6\xb0\x04\xf6\xdc\xd1\x9e\x67\x19\x50\x46\x37\x38\xcc\xa7\x8b\xb0\xdf\xfa\x3d\x64\x57\xe4\xae\xca\x65\x7e\xc6\x49\xb9\x7e\xe3\x0e\x97\xc8\xcb\xe6\xce\x43\xc2\xaa\x9a\x69\x95\x8e\x9d\xc8\x81\xe4\xaa\x7b\x32\x78\x07\x4e\x78\x7a\xce\x5f\xb6\x01\xd7\xfa\xf7\xca\x51\x03\xec\xbb\xd3\xbd\x55\x4e\xb1\xb0\x66\xf8\x29\x6d\x2c\xc5\x7e\x8c\x8a\x32\xe9\xc0\xe6\xa9\x26\x96\x4d\x6d\xf2\xd8\x64\x58\x64\xb3\x22\xc3\x22\xf1\xca\x80\x73\xce\xdf\x2b\x55\x67\x11\xa7\xa2\x0b\x77\xc0\xa1\xed\x27\x7a\x9a\x6c\xa2\xc0\x71\x54\xe8\x63\xfe\xf5\xa4\x04\xe3\xe8\x9f\x0d\x7f\x30\xf2\x18\xec\x4d\xe7\xa5\x3a\xeb\x9c\x41\xee\xaa\xf6\xce\x74\x96\x49\xc9\x99\x8f\xd6\x2b\xcb\xa2\x87\x23\x38\xe1\x9c\x94\xe5\x9d\xd5\xe2\xdd\x77\x6f\x53\x71\x9d\x21\x74\x69\x76\x93\x2e\xf1\x1a\xbf\x7a\x32\xae\x6b\x07\x44\x66\x5d\x0e\x0c\xe5\x13\x95\x5a\x9e\x68\x53\x1d\x8e\xe4\xde\x9a\x8d\x35\xdd\xfb\x88\xeb\x5a\x48\x6a\xd6\x31\x37\xe8\x89\x2f\xd7\xc6\x89\xd4\xf9\xe7\x02\x1b\x11\x73\xbb\x37\x52\xa5\xee\xcf\x29\x92\xe3\xfd\x46\x42\x26\x3c\x7b\x3d\x81\x5c\x29\xb4\x66\xab\x69\x28\x5f\xfe\x4b\x8d\xaf\xcb\xf3\xd0\x1d\x63\x55\x53\xab\x75\x75\xa7\xa3\x47\x1e\xdc\x7b\xe4\x12\xd3\xd0\x1e\x6f\xe8\xe3\xcd\xc3\xfa\x04\xd2\xa7\x59\x93\x81\xe2\x2b\xba\x49\xc5\x53\x9d\x79\xc6\x2b\x52\xbb\x0e\xca\x33\xf7\x42\x55\xe4\x1a\x95\x26\xa8\x92\x89\xb1\x5f\x18\x50\xd9\xaf\xa8\x7e\x6b\x6f\xa1\x27\x10\x1c\x1a\x6d\x88\xd4\x33\xe0\xc8\x6a\xa6\x0b\xba\x8f\xe7\x10\x0e\xd6\x1d\x5a\x9d\x00\xa0\x07\x64\x51\x3e\xb1\xc7\xf5\xf5\xc3\xb3\xef\xc4\x53\x2a\x36\xb4\x07\xfe\x2d\x17\xcf\xb4\xe6\xfc\xd6\x04\x9c\xff\x3a\x35\x56\x23\xa3\xa4\x13\x90\xea\x48\xf4\x21\x20\xd8\x97\x94\x91\x11\xbe\x3d\x16\x9b\x2d\x2e\xf4\x5b\xdb\x89\x4f\xe2\x0b\x1a\x95\xef\x66\x14\x94\x27\xa9\xd8\xf8\x0a\x9b\x2e"}, +{{0xa3,0xbe,0xd9,0xfe,0x23,0x54,0xbd,0x28,0x60,0x14,0x9a,0x3d,0xb7,0x5a,0x85,0xb1,0x29,0xcf,0x83,0xe9,0xd7,0x3e,0x63,0x17,0xba,0x70,0x54,0x52,0x19,0x33,0xf8,0x96,},{0x5a,0xc0,0x3b,0x4f,0x13,0xd9,0x1d,0x06,0x6b,0x2c,0xe3,0x59,0xe9,0xbb,0x1d,0xfb,0x6b,0xfa,0x5a,0xfa,0x38,0x2f,0xd1,0xcc,0xd7,0x2a,0xef,0x11,0x76,0x07,0x9f,0x89,},{0x33,0xbc,0x1e,0x0b,0xf1,0xb4,0x93,0xe0,0xcf,0xb7,0xea,0x40,0x48,0x0a,0x14,0x23,0xe0,0x91,0xf7,0x14,0x57,0x45,0x01,0x31,0x73,0x78,0x7d,0xf4,0x7a,0x10,0xdb,0x24,0xc1,0x65,0xd0,0x05,0x96,0xfa,0xb7,0x0e,0x68,0xc9,0x4c,0x10,0x4e,0x8a,0x74,0x07,0xcf,0x69,0x5c,0xd3,0xfb,0xe5,0x85,0xb5,0xb1,0x76,0xb8,0x5c,0xcc,0xa4,0xfd,0x08,},"\xdb\x85\x38\x08\x68\x6d\x6d\x21\xf4\xc5\x7b\x54\x1e\x5a\xd6\x33\x94\xd4\x65\xe6\x00\x78\x64\x3c\xab\x1e\x06\x5c\x9f\x30\x6c\x50\x00\x78\xf0\xcc\x41\xef\x0f\x95\x42\xb5\xfe\x35\x6a\xec\x47\x77\xef\x8a\x95\x55\x4c\x97\xb6\xa4\x40\x99\xe9\xbd\x64\x04\xfb\x0b\x2e\x41\xf9\x19\x14\xb0\x74\xd1\x22\x37\xcd\x44\x2e\xbd\x40\xb5\x1b\x8b\xc8\xbb\xe4\x37\xa2\xc5\x33\x32\xd2\xbe\xb2\x28\x1b\xf7\x32\x4a\x0c\xf5\xb7\x41\xbb\xf9\x8d\x1e\xb9\x85\x8b\xe9\x26\xe9\x15\xa7\x8e\x8d\x31\x4b\x41\x44\xf3\xd2\x0d\xfc\x6c\xb7\xf4\x8c\x23\xaf\x90\xf8\x71\xc6\xcd\xa9\x08\x45\xa4\x1a\xff\x17\x07\xa8\x7b\x4e\x55\x16\xf1\x8e\x8b\xd7\x68\x3c\xfd\x74\x07\x08\x03\xe8\x88\x33\x8c\x9a\x18\xf7\x92\xc8\xd3\xa7\x04\x17\x0f\xf9\x82\xbf\xfc\x9e\x8e\xc9\xea\x5d\x1a\x62\x59\x2f\x16\x88\xd4\xf2\xb0\x1e\x11\xf9\xf8\x87\x74\xc4\x7a\xc1\xd5\x8f\x69\x0b\xcf\x28\x8c\xf8\xa4\x73\xd3\x50\xa8\x23\x9d\xf9\xd3\xa6\x28\x81\xda\xdd\x33\x85\x31\xfd\xce\x76\x15\x80\x7c\xe9\x65\x49\x6d\x6f\x35\xd6\xc0\x42\xf0\xce\x7f\x21\xef\xe5\xce\x64\x25\x18\x59\x41\xed\x56\x36\xb8\xae\x91\x3a\x75\xd2\x1a\xb9\xdb\xdb\x3c\x3b\x66\x87\xa4\x5e\x04\x49\x38\xa9\xf1\xc1\x3a\x33\x0e\xa9\x76\x1e\x28\x3e\x61\xd4\xa3\x20\xe1\xf5\x59\x88\x2f\x34\xb6\x07\xfe\xfe\x32\xc3\x43\x17\x4a\xbc\xdc\x77\xb0\x65\xa9\x29\x04\xb4\x2d\x96\x1d\xb8\xed\x91\x6c\x01\x46\x4f\xfd\x43\xf9\x3c\x10\x77\xf1\xdf\x7e\xe6\x50\x31\xcf\xe0\x5d\x78\x0d\x01\xd0\x8e\xe0\x36\xf2\x2a\x2b\x05\x12\x19\x3b\x0c\x0f\x38\x01\xe0\xa0\x20\x8e\xef\x24\x5c\x9e\x51\x93\x52\xd2\xb0\x09\x63\x82\xf2\xcb\xa0\x6e\xb2\xa0\x1d\xac\xf6\x19\xea\xbb\xc8\x83\xc5\xd4\xf2\xfd\x7c\x34\x23\x17\x9c\x0f\x5f\xfd\xaf\x8c\xaf\xff\x5c\x46\xb3\x4a\x09\xc3\xc5\x0e\x29\x49\xc0\x60\x00\x20\x7d\x70\xd3\x7d\x65\xa7\x43\x07\x5f\xdc\x2b\xe6\x2d\x41\x2a\xa6\x3e\x36\x37\x06\xca\x90\xe6\xef\x44\xe1\x52\xea\x4d\xc5\xc2\x89\x3e\xcd\x08\xd7\x96\xd4\x1f\x17\x22\x54\xc3\xd1\xd1\x4b\xb0\x67\xb5\x3a\x08\x97\xbb\xd7\x3c\x99\x54\xd9\x64\x8b\x2a\xf1\x0d\x9c\x27\x03\xe3\x8b\x6c\x62\x46\x9f\x6f\x95\x8a\x1c\xa0\xa3\x20\xc1\x23\x39\xe9\x0c\xf7\x68\xc8\x7b\x47\x38\xc2\x19\xf8\x09\x3b\xff\x4c\x2c\xfd\x29\x45\x9f\x6d\x32\x81\x34\x93\x78\xe9\x15\xa3\xb0\xe7\x24\xc7\x4d\x2b\xd7\xa8\x51\xac\x7c\x6b\x48\xe8\xaf\xc7\x12\x4f\xdc\xbc\xab\x5f\xf8\x0d\x1d\xee\x30\xa6\xc0\x24\xcb\x43\x31\x97\x23\x66\xeb\xab\x26\xbb\xb9\xf6\x08\xca\xac\x7e\x51\x91\x4d\xf0\x58\xb9\xb3\x74\x5d\x98\xc5\xd2\x7e\x97\x10\x54\x75\xec\x01\x73\x77\xe6\x31\x61\x98\xec\xe4\xec\x59\x09\xf0\x4f\xc2\x7e\x7b\x38\x2e\x66\xad\xb6\x2a\xc8\xa9\x77\xf3\x76\xfd\x5d\xae\x43\x4f\xb5\x51\x75\x24\x9c\xa1\xab\x6b\xb0\x2d\xec\x06\x96\xf0\x89\xbe\x34\x54\x88\x7a\x0c\x32\x36\x1d\x17\x2b\xd2"}, +{{0x88,0xa2,0x4f,0x0d,0xf3,0xae,0x29,0x14,0xdf,0x79,0xda,0x50,0xec,0xf8,0xec,0xb4,0x2f,0x68,0xc7,0xba,0xad,0x3b,0x6c,0x3a,0x2e,0x0c,0xc9,0xc2,0x5d,0x09,0xd1,0x42,},{0x12,0xe6,0x60,0x3f,0x71,0x3b,0x23,0x05,0x35,0x85,0x68,0x71,0x00,0x18,0x68,0x5e,0x14,0x15,0x53,0xc4,0x75,0x91,0x39,0x6f,0xb4,0x25,0x9e,0x42,0xdc,0x53,0xb9,0xc9,},{0x17,0x07,0xcc,0x00,0x91,0x86,0xbf,0x3f,0x03,0xf7,0xbb,0x9e,0x3c,0xd4,0xcf,0x6b,0x73,0x7b,0x7a,0x6b,0xaa,0xde,0x7f,0xc6,0xc3,0xff,0x5c,0x12,0x25,0xdb,0xb2,0xba,0xf5,0x4f,0x47,0xc8,0x5e,0xaf,0xa1,0x32,0xc3,0x1e,0xac,0xa0,0x3e,0x6a,0xec,0x14,0x47,0x73,0x3f,0xac,0xd3,0x71,0x49,0xb7,0xc6,0xcf,0x0c,0xd4,0x1f,0x61,0x14,0x04,},"\x65\x4e\x9e\xdc\x69\xfe\x63\x4c\x23\x08\xba\x8c\x46\xa9\x55\xe8\x82\x45\x62\x86\xea\xe3\x59\x3c\xae\x73\x9c\x44\x86\x6c\x0d\xe9\xed\xcb\xbf\x0d\xb1\xc4\x41\x49\x66\x84\x67\x70\x9d\xc9\x70\x62\x98\xdd\x2e\xac\x33\x01\xda\xba\xd5\xbd\x8e\x93\xc5\xe8\xa9\x3f\x19\x4e\x0f\xc1\xd9\xf3\x76\xc1\x44\xc2\x93\xae\xfd\xa0\x86\xb2\x21\x8f\x2e\x9d\xfd\x7c\x2d\xc5\x2b\xa3\x3e\xb2\x29\xdc\xf7\xbb\x68\xce\x0f\x87\x6c\x5f\xd4\xe8\x1a\xfd\x80\x16\x9f\x73\xcf\x26\x4e\x5d\xc0\xce\x16\xe1\xb8\x76\xcd\x11\xc7\xad\x89\x05\x8e\xe0\x82\x0c\x40\x00\x5d\x01\xf1\x19\xf8\xbe\x6f\x1a\xfb\xe2\x4c\xa4\xae\xdc\x18\xe9\x78\x96\x82\x7c\x3e\xd6\x7f\xc4\x56\x30\xe7\x90\x3b\x7f\xee\x9c\x99\x0e\x36\x19\x37\xbf\x4e\xa0\xa4\xd8\xd1\x6c\xf6\xd9\xcf\x03\x81\xe9\x06\x5e\x36\x25\x14\x8f\x8a\xe0\x49\x1a\x03\x41\xd0\xff\x9f\x72\x7b\xe1\xf3\x10\xca\x1e\xc3\xf0\x10\x4a\xa0\x54\x32\x17\x84\xdd\x24\xd5\x3c\x98\x5b\x28\xd4\x40\x82\xf8\xe1\xc1\x08\xa4\x41\x09\x63\x8f\xf5\x11\x6e\xdd\x85\xae\xb8\x6b\x6e\xa5\x12\xa1\x9b\x60\x2e\xdd\x9d\x21\x10\x70\xd0\x44\xaf\x5b\xed\xb6\xc8\x52\x7b\xa3\x49\x1e\x34\x5b\xac\xc1\x30\xb3\x69\x60\x28\x2a\xe7\x37\xb8\x5c\x76\x92\x74\xf0\xf7\xc5\x88\xf4\x0e\x66\x25\xb2\x36\xbd\xc1\xa3\xb8\x73\x20\x46\x0e\xee\xad\xa2\x78\x12\x4b\x56\x68\x87\x4f\x39\xf5\x9c\x2e\x6a\xa2\x08\xc3\xb6\xa9\xb8\x45\xc4\xd0\xa2\x7a\x05\x46\x78\x6f\xa1\x3e\x51\xcc\x98\xb7\x3f\xd7\xee\x32\x7b\x62\x15\xec\x6b\x62\x9f\x4c\xc7\xe4\xbd\x3c\x0a\x3d\xb7\x8a\x21\xff\xfe\x24\xc7\x04\x38\x71\x6b\xc3\x7b\x8d\xa7\xc5\xff\x7c\x36\x88\xa9\x03\x39\xc2\x2e\xb5\x0b\x7c\x2c\xd3\x6b\x68\x83\x1f\xd5\x93\x91\x75\x68\x9b\xd3\xe2\x2c\x38\x81\xaf\x33\x7e\xe1\x44\x35\x70\x9e\x35\x10\x40\xef\x3d\xa9\x55\x72\x4e\x51\xc2\x4a\x5e\x2c\x09\xf8\x91\x80\x83\x93\xfb\xf8\xef\x7f\x1f\x5f\x02\x98\xde\xeb\xdc\xd8\xd6\x66\xcb\xcf\x3e\x86\x6c\x71\x89\x99\xab\x6b\x1f\xee\xc9\xc4\x7e\x02\xe7\xd6\x35\x40\xf8\x99\x63\xd5\x42\xc5\xd0\x1f\xb6\xfc\x30\x76\x89\x68\xae\x81\xb2\x0c\x35\x4b\x40\x00\xc1\x32\x77\x47\x64\xd6\xd4\x43\xad\xd6\x4f\x6d\xd7\x48\xf5\xfb\x5b\x7f\x6e\xba\x40\x1d\xb4\x31\x8b\xe9\x93\x98\x9f\xcc\x25\x77\x96\x1f\xa5\xad\x31\xf6\xa2\xa9\xd6\xa7\x55\x28\x58\x65\xcd\x5d\xc3\xa8\x8c\xfb\x5a\xba\x7d\x92\x3b\xaf\x78\xb5\xd1\x31\xb4\xc2\x14\xdf\x55\xb6\x17\x1f\x45\x20\x9e\x21\xca\x66\x45\x49\x0d\x3a\x36\x44\xdd\xa6\xdc\x92\x9c\x7c\x40\x95\x76\xd3\x71\x64\x75\x5e\xf8\xaa\xf3\xdc\xd4\xd2\x27\x75\xee\x7d\xea\x0e\x56\x5b\xd5\x47\x27\x92\x1c\x64\x9b\xc5\x1f\x20\xc1\xf6\x8c\x1f\xde\xac\x45\x5c\x67\xd7\x1a\x1c\xb8\x83\x7f\x46\x91\x44\x8b\xf0\xbf\x04\x4a\x46\xf1\x68\x5f\xbe\x22\xb1\xe0\x18\x77\xf7\x47\x7d\x34\x99\x40\x8c\x4c\x31\x65\x10\xce\x2e\x55\xb9\x80\x05"}, +{{0x18,0x4d,0x0c,0xe2,0xe9,0xdb,0x7f,0x25,0x7a,0x8b,0xf4,0x64,0x6d,0x16,0xd2,0xc5,0xef,0xc2,0x70,0x2c,0xed,0x02,0x6b,0x69,0x06,0xd3,0xc8,0xc0,0x11,0x8f,0x22,0x61,},{0xe9,0xda,0xb8,0xfd,0x9d,0x94,0xdc,0x9b,0x24,0xcc,0x79,0xc6,0x35,0xcc,0x57,0xce,0x66,0x51,0x89,0x82,0xba,0x3e,0x24,0x47,0x24,0x07,0x41,0xba,0xc0,0x73,0x0e,0xc5,},{0xb1,0xe3,0xbf,0x5f,0xa7,0x4d,0x7e,0x44,0x2c,0xed,0x9a,0x98,0xd9,0x27,0xd8,0xc4,0x5e,0x0e,0x64,0xd8,0x74,0xf8,0xea,0x59,0x20,0xa3,0x60,0xa4,0xbf,0x42,0xd8,0x3c,0xe1,0x8a,0x92,0x4a,0xc7,0x96,0xe1,0xa7,0x7d,0x1b,0x02,0x08,0x29,0x4b,0x50,0xf8,0x22,0x17,0x7f,0xdb,0xdd,0x45,0x8c,0x74,0x35,0x6f,0xcf,0x6b,0xd7,0x94,0x51,0x06,},"\x6a\x9b\x87\x6b\x0b\xf4\x18\x9b\x3c\xc1\x5f\x9e\xb4\xfb\xe7\x93\x2b\x55\x77\x89\x2a\x22\x20\x0c\xe1\x07\x15\x68\x53\xd6\xd3\xca\x36\x3f\x02\x5a\xd7\xa2\xd8\x62\xaa\xdc\x74\x2d\x94\x15\xbd\x8d\x1f\xca\x13\xc9\xdc\xa3\x58\x60\x44\xe5\x5a\x8c\xf5\xde\xe1\xce\x56\x45\x76\xe3\xe8\xe3\x65\x54\x05\x46\x50\x1b\x34\xca\x67\x5c\xf2\x00\xe0\x77\x1a\x81\x8c\x73\xd3\x7f\xcd\xa8\xcb\x15\xe4\x8d\x5a\x0b\x9e\xa3\xbe\xec\x0f\xf6\x61\x0b\x2a\x8a\x21\x4c\xa4\xf7\xef\xac\x0e\x71\x38\x10\x52\xd9\xbf\x3c\x00\xc3\x29\x59\x34\x74\xeb\xd0\xa6\x87\xa0\xb4\x1d\x14\x4b\x5e\x7a\xb1\x41\x2b\x97\x0a\x74\xba\xba\x4d\x27\x4b\xb0\xdb\xfd\xb0\x2b\x11\xf7\xf6\x39\x64\xba\x6f\x3b\xa0\xad\x23\x34\x1d\x08\x3b\x91\xa4\x30\x82\x39\xe3\x3d\x50\x82\x43\x96\x12\x65\x88\xde\x72\xa2\x39\x0c\x1c\x0f\xc0\x67\x47\xc2\x87\x72\xf6\x30\xbf\x4d\x14\x3f\x7a\x11\x59\xf0\x28\xc0\x93\x40\x48\x94\xe6\xd1\x6f\x63\x46\x35\xd4\xfc\x33\x0f\x3d\x7a\x73\x13\xef\x75\x6f\x5d\x49\xd8\xf6\x20\x5e\xb1\xc7\x92\xa9\x49\x5d\xa1\x31\xb4\x33\x45\xa0\x09\x0c\x12\xca\x56\xe6\xad\xac\x5b\xe0\xcb\xca\xc3\x60\x9d\x69\xf7\x24\x15\xf6\xc3\x7f\x3c\xfb\x2c\xf7\x6b\x3e\x65\xf3\xc9\x3a\xc9\x2b\x63\xf2\xba\xa4\x66\x24\x90\x75\xbc\xa6\x9d\x4c\x1d\x1f\x3a\xde\x24\xab\x31\xef\xfc\xb9\x04\x69\xc2\x4b\xb4\x10\xab\x47\x23\xe1\xb7\xe1\xc8\x8b\x3a\x36\x43\x35\x63\xf7\x1a\x99\xaa\xd5\x8f\xe8\x05\x68\xf9\xc1\x02\xda\x89\xba\xd9\x79\x63\xe7\x7d\x66\x22\x48\x31\x66\xf3\xae\x26\x1f\x32\xa5\x2a\x86\x10\x1e\xbd\x64\x5f\x61\x42\xc9\x82\xe2\xcd\x36\x25\xcf\x8b\x46\xb9\xb2\x89\x12\x46\x92\x0f\x69\x7f\xca\xed\x39\x7c\xb9\x22\xc2\x74\x94\x51\x67\xa0\xe6\x19\xb0\xb5\x06\x37\x76\x06\xdb\x04\x57\x83\xb0\xb8\x8e\xa0\x4e\x93\x2d\x21\xff\xc0\x64\xa1\x2a\x40\xeb\xe9\xb4\x80\xf1\xa2\xc7\xdd\xd3\x95\xa9\xb1\x5e\xfd\xc4\x95\xc9\x71\x4f\x36\xfa\x99\x6f\x79\xf8\xeb\x8e\xfa\x52\xd9\x9a\x24\xab\xfe\xf4\x3b\x32\xa2\x37\xc5\xbc\x00\x18\xda\x3b\x16\x2f\x59\xb8\xd3\xd4\x74\xe2\xce\x08\xfa\x80\x24\xc5\x8a\xcc\x0a\x99\xff\x61\x4e\x6c\xd7\xfd\xd9\xca\x4e\x8f\x41\xa1\x44\x9a\xa6\x18\xd0\x33\x37\xe8\xa3\x74\xd5\x60\x55\xb2\x07\xa9\xdb\xe6\x9f\x59\x48\xf9\x01\xca\x7d\xb0\x41\x0f\x01\xaa\x37\x3d\x9e\x02\x27\x62\x35\x99\xbc\x21\x28\x45\xb0\x06\xe9\x42\xfa\xbc\x58\x2c\xd7\x26\xdb\x5c\x44\x3e\xb2\xdf\xfb\xc9\xe3\xe7\xf0\xe5\xcb\x67\x44\xf7\xad\x71\x60\x50\xfd\xf2\xc6\x0c\x7c\x77\xc2\x53\xab\x74\x5d\xb9\xc8\x55\x26\x55\x68\x3e\xa7\xea\x68\x0a\xa4\xaf\x34\xdf\x13\x25\xc2\x9b\x88\x74\xb6\x1b\xe2\x3d\xe4\xff\xba\x25\x42\x4f\x46\x19\xec\x68\x2c\x26\xb3\xa6\x7b\xda\x9b\xc4\xc9\x4b\x79\xa9\xfc\x4d\x82\xd3\x40\x49\x5b\x43\x7a\x1c\xbd\x6b\x60\x30\x7c\xfc\xb1\x00\x26\xf9\x64\xa0\x17\x62\x3e\x33\xdb\xf2\x33"}, +{{0xd0,0x2b,0xbf,0x70,0xd5,0x13,0x51,0xe3,0xb4,0x7a,0xd8,0xe5,0xed,0x26,0x3d,0xbf,0x55,0x6d,0x14,0x98,0xfa,0x9b,0xd5,0xdb,0xd9,0x9f,0xb4,0x26,0x90,0x09,0xdc,0xed,},{0x8c,0xe4,0xb5,0x9f,0x94,0xce,0xd6,0xec,0x96,0x14,0xd6,0x7d,0x30,0x66,0xd9,0xd3,0xa0,0xdf,0x7a,0x46,0xb3,0x7b,0x4c,0x17,0x25,0xef,0x1e,0x57,0xbc,0x68,0xa0,0xd1,},{0x6e,0x7c,0x66,0xac,0xc9,0x54,0xff,0xd9,0xdd,0x4c,0x1c,0x63,0x35,0xab,0x4f,0xe7,0x9d,0xbb,0xed,0x78,0x2c,0x4a,0x47,0xec,0x30,0xd8,0x48,0xd8,0xbb,0x2b,0x4f,0x10,0x69,0xdc,0x62,0xe5,0x22,0xa1,0xe8,0x01,0x7f,0x54,0xa6,0x34,0x5e,0x17,0x28,0xc0,0x73,0xaf,0x64,0x47,0x85,0x6d,0x8c,0x1e,0xd3,0x58,0x78,0xb5,0x71,0xe5,0x23,0x0d,},"\x55\x45\x60\xf7\xa7\xfd\x1a\xe7\x75\x8a\x2f\xce\x7d\x78\x0f\x6b\x3f\x04\x3d\x3a\xf8\x9d\x4f\x19\xef\x57\x3c\x34\x99\x75\x54\xdf\x24\x3f\xaf\x2a\xaa\xb6\x5b\x2a\xfd\xd2\x86\x10\xd4\xa5\x1e\x9a\x4b\x46\x4d\xb6\xdb\x09\xeb\xf7\x3b\x7d\x24\x05\x4c\xc9\xb1\x28\x14\xbb\x29\xee\x99\xe1\xa7\x3b\xd6\x03\x89\x83\x60\xf9\xdc\xf0\x1e\x67\x08\x36\x28\x6f\x82\x36\xed\x8c\xef\x07\x5f\x3d\x56\x33\x12\xc1\x6c\x73\xfc\x37\xee\xdf\x25\x2f\x8f\x42\xd3\x0a\x13\xe7\xfb\xa3\xb1\x65\x23\x8c\x7f\x81\xea\xae\xb5\x31\x90\xf3\xec\x3b\x5d\x63\xf0\xee\x03\xe3\x98\x7e\x39\x0d\x1d\x81\xe8\x27\x7e\x9f\x6c\x1e\xe6\xec\x4e\xc3\xfa\x0d\x72\x0e\x9f\x53\xf9\xc2\x6f\x04\xaa\x2e\xd2\xb5\xef\x31\x60\x89\x59\x99\xea\xce\x29\xcf\x5d\xc2\x54\xad\x71\x10\x6b\xb7\xe8\xbc\x29\xa5\xb1\xd2\x41\x25\x93\xd0\x81\x94\xe8\x8e\x16\x59\xa7\x31\x59\xa2\xa2\x20\x33\xab\x06\x6e\x8d\x3d\x8c\x3b\xc8\x6b\x7b\x01\xde\x81\xa8\xc6\x60\x47\xb0\x7f\xe2\x4e\xd2\x40\x31\x8b\xa3\x7b\xa3\xef\xb6\xcf\x63\x26\x04\xca\x4f\x44\x6a\x75\xfd\x8e\x70\xc4\x53\xf0\xc6\x0e\xe1\x6e\xca\xf5\x24\xe7\x03\xf4\x7d\xf5\xc2\x82\xca\x32\x89\xb3\xaf\x61\xde\xe4\x70\x9e\xe0\x85\x32\x3b\x1e\x5c\x8a\x6b\xc0\x76\x62\x01\xc6\x35\x03\x14\x46\x89\x1f\x34\x94\xe9\xdb\x20\xdd\x4e\x9e\x08\x38\x24\x9a\x67\xe1\x38\xd1\x3e\xe2\xc9\x6f\x61\xe7\x71\x06\x15\x42\xaa\x16\xef\x20\xd8\x1e\x3a\x0f\x4e\x45\x21\xa6\xcd\x6c\x92\xfc\x26\xfe\xef\x03\xb6\x6c\x70\xe0\x35\xca\xfc\xc1\x9c\x96\xfb\x9d\x82\x91\x8f\xe1\x97\x78\x0e\xff\x0e\xda\x6e\x25\x12\xc5\x6e\x2a\x73\xd7\x70\x32\xb7\x68\x91\x9b\xea\x97\x72\xf5\x98\x9c\x8b\x6c\x65\xc3\xd1\xe9\x7a\x21\x80\xcc\x3a\x37\x57\x9d\xa7\x0c\xe9\x80\x6a\xc1\x28\x5a\x3e\xab\x41\x5c\x06\x07\xd8\x8c\xb8\x65\x42\xea\xb9\x0b\x9d\x2d\x67\xfa\xff\xfc\xad\x23\xa7\x14\x00\x0e\xe5\x9e\xd6\x8c\x95\x6e\x81\xc4\x45\x42\x88\x82\xf9\x7a\xf7\x4d\xb3\x62\xe4\x5c\x0d\x1b\xd8\x85\x6e\xed\x16\x6e\x4a\xec\x4b\xfd\xf9\x5e\xad\xb2\x51\xe2\xa1\xef\x80\x48\x52\xa9\xea\x77\xd3\x45\x77\xfe\x70\x83\x1a\x92\x8b\x10\x1b\x60\xac\x61\x3e\x7b\xa2\xe6\xba\x0a\x94\x01\x3a\x64\xc2\xf8\x21\x9f\xd3\x0b\xff\x40\x90\x99\x66\x7a\x78\x6f\x99\x32\x7b\xb0\x3e\x2f\x21\x87\xf4\x45\xb4\x6b\xee\xda\xb6\xd3\x25\xaf\xd9\x04\xe3\x95\x43\xe9\x3f\x4b\x6c\x54\x43\x24\x9d\x74\x4b\x2d\x1a\x43\xe1\x41\xe4\x76\x8b\xd4\x0a\xab\xe4\x05\x72\x44\xe1\xea\xdd\x9d\xae\xc1\x75\x71\x9e\x51\xa0\x93\xac\xe3\x2f\xe8\x2b\x2e\xac\xb5\xec\xb0\xda\x6c\x1f\xfe\x98\xc8\xce\xe7\x88\x6e\x30\x16\x70\xdf\xf8\x71\x13\xef\xed\x42\x82\x47\x1a\xfb\x6b\x8a\x0f\xdb\x50\x5e\x2e\x8e\x7d\xbc\x1a\x08\xa2\x2e\x96\x80\xbd\x09\x8b\xf1\x27\x58\x02\xbd\xb4\x59\x41\x3a\x3b\x23\x7d\x77\x13\xa1\xbb\xf5\x97\xe6\xad\xf2\xb6\x0e\xaf\x82\x37\x91\xb3"}, +{{0xaa,0x0f,0xda,0xe2,0xa5,0xa4,0xc9,0xc0,0x45,0x21,0x91,0x30,0x04,0xcd,0x89,0xef,0xbc,0x88,0xb2,0xda,0xdf,0x5a,0xbb,0x24,0x6f,0x3c,0xa7,0xf6,0x92,0x35,0x44,0xaf,},{0xbf,0xfc,0xb1,0x7c,0x35,0xc1,0x30,0x4c,0xdd,0x9d,0x62,0x4f,0xf6,0x9b,0xee,0x60,0xec,0x7c,0x9e,0xc3,0x27,0xd1,0x23,0x50,0xd7,0x0f,0xac,0x12,0xb4,0x7c,0xc2,0x5c,},{0xf9,0x37,0x29,0x89,0x69,0xca,0x34,0xd9,0x75,0x84,0x44,0x89,0x07,0x35,0x8b,0x0f,0x47,0x84,0x1f,0x30,0x23,0xaf,0xc7,0xef,0x76,0x81,0x52,0x1c,0x5b,0xe0,0xf5,0xe5,0x62,0x8a,0x8f,0x60,0x7e,0x2f,0x31,0x63,0x6e,0xf6,0x36,0x46,0xb0,0xe9,0x89,0x8a,0x72,0xad,0x35,0x57,0x06,0xd2,0xc8,0x06,0x0f,0xbc,0x64,0x0e,0xfb,0x3d,0x66,0x05,},"\xb1\x41\x84\xcf\xdc\x4a\x5f\x0c\x7f\x83\xf9\x4a\x83\x2f\x58\x85\x07\xe2\xd7\x2a\x89\x32\x98\x70\x07\x85\x71\xd2\x08\xa0\xc4\x96\x0c\x2f\xdc\x4c\x23\x6c\xf8\x82\x29\x98\x1d\x12\xb1\x0a\x1b\x68\x84\xc8\x65\x0d\xda\xf1\xd4\xb2\xeb\x98\x15\x75\xb1\xe0\x19\xfe\x3f\x60\x42\x36\x76\xf8\x85\x6a\x99\x2c\xce\x36\xd6\xd0\xa3\xd0\x26\x63\x1c\x8c\x1e\x1f\xfe\x34\x13\x4b\x29\x6f\x40\x84\x2b\x6d\xf4\xf8\x6f\x83\x3e\x01\x75\xba\xe5\x0e\x86\xbf\x85\x6d\x1e\xe7\x99\x25\xf4\x34\xb8\xbf\x2c\x84\x51\x9f\x1f\x5d\x25\x38\x60\x49\xce\x3c\xa6\x17\x77\xe3\x0b\x70\x0a\x60\x2d\x39\x52\x50\xb6\x0f\xc6\x4a\xc6\xf8\xdb\x02\x7e\x8d\xa8\xb9\x55\x0f\x24\xed\x11\xa1\x1d\x9f\x9f\x9c\x5e\x0a\xf1\x45\xb8\x65\x97\x51\xac\x6b\x55\x86\x1f\x63\x88\xa6\x43\x36\xb3\x1e\xfe\x45\xc0\x80\x2d\x76\xa5\x34\x86\xa8\x1e\xba\x07\x31\x4b\x4d\x96\x1c\x14\x1a\xb3\x4e\x2f\x76\xed\xac\x0e\x6d\xe3\x14\x22\xdf\x79\x2a\xf0\x81\xe7\x69\xc7\xed\x05\xda\x9a\x5a\xf2\xfd\xf3\x6f\x14\x17\x69\x90\x8b\x70\x09\x37\xf0\xe1\x06\x8c\x13\x1f\x17\x6e\xb9\x6c\x67\xaf\xdb\xe7\x8f\x40\xd8\x60\x07\xfb\xcd\x47\xe4\x9e\x2e\x4c\x4c\xe0\x49\x93\x6a\xdf\xf1\xce\x3e\xac\x42\xb9\x6b\x34\x29\xb5\x62\x6b\x1a\xa6\x2a\xcd\xe0\x7f\x45\xa1\x3c\xe1\xbd\x21\x1f\x32\xbd\x7e\xfe\x47\x90\xc8\x37\x1e\xbf\x87\xc1\x64\x47\x7a\x5c\x9f\xa3\xe7\x8c\x2f\x88\x07\x7b\x09\x73\x44\xcf\xfa\x03\x1c\x44\x29\xc7\xf4\x2d\xca\x07\x73\x78\x50\xee\x7a\x76\x9b\x36\xd0\xf0\x62\x5a\xdf\x12\x0e\xa2\x3f\xf4\xe3\x93\xa4\xfd\xcb\x65\x58\xdb\xf9\xb2\x66\xa0\x32\xe3\xb0\x59\x9b\x9d\x66\x92\xfc\xeb\xd8\x15\xa3\x89\x76\x07\x85\x63\x25\xfc\xd0\x11\x5d\xc3\x10\xdb\x3a\x87\x92\xfb\xeb\xd3\x99\x49\x4c\x83\x71\xe5\x85\x72\x7b\x3d\x63\x24\x14\x49\x68\x93\xd0\x38\x13\xba\x1f\x99\x66\x1b\xce\xb9\xdc\x18\xec\x5d\xc2\x7f\x52\x67\x03\x18\x68\x77\x69\xfc\x67\x8d\xdc\x7e\x40\x22\x7c\x20\x05\x22\x01\x3f\x5c\x0e\xec\x0e\x47\x81\xe6\xfc\x15\x3a\x0c\x2f\x4f\x3f\x95\xe5\x17\xc8\x41\x99\x24\xab\x39\x99\x2a\xf8\xc1\x94\x65\x05\x7f\x13\x44\x86\x69\x6b\xa7\xfd\x46\x51\x76\x8b\x4e\x74\x9e\xf3\x6f\x02\x44\x46\x17\xcf\x97\xf0\xa4\x23\xe4\xc1\x3b\x7b\x66\xba\x2b\x6c\x45\x68\x78\xb0\xb5\x0c\xe2\xee\x5e\xc5\x64\xed\x88\x54\xf7\x82\xaa\x1d\x1c\x6a\xa7\x60\xf2\x52\x2c\x7d\x97\xb9\xb1\xab\xe0\xba\x81\x09\x59\xd7\xaa\x40\x3a\x99\x37\x5a\xa3\xe3\x9a\x11\x5d\x1f\xc6\xfe\xdd\x00\x2f\x38\x30\xa5\x0a\x83\x7d\xc7\x20\x32\x9e\xc0\xc7\x3d\x5b\xfd\x50\x03\x85\xc7\x36\x83\x82\x87\xe1\x92\x01\x52\x5d\x18\x9c\x3a\x08\x4c\xd5\xa3\xf3\x59\x87\x5e\x3b\x83\x25\x28\x9c\xed\x18\xb6\x3b\x00\xff\x9c\xd0\x70\xc3\xe6\x74\x44\xbd\x3d\x83\x46\x17\x40\x85\xcc\x45\x13\x5c\xaa\x0c\x67\xb3\x22\x6e\x4a\x52\xe9\xa1\xc5\x5a\xed\x7e\xc5\xfa\xde\x6b\xf1\x6c\x19"}, +{{0x71,0x62,0xfe,0xf0,0xac,0xa4,0x97,0x4b,0x09,0x4a,0x6a,0x08,0x05,0x43,0x95,0xf8,0x77,0xff,0x94,0x33,0xf1,0xe3,0x3e,0x20,0xe8,0x8e,0xaa,0x90,0xf9,0x38,0x99,0x7d,},{0xa2,0x80,0x64,0x0f,0x13,0x9f,0x45,0xc3,0x5a,0x48,0x71,0x53,0x7e,0xef,0xe6,0xef,0x9d,0xb0,0x2d,0xe7,0x85,0xee,0x9f,0xd5,0x4f,0x80,0x5f,0xb5,0x7d,0x37,0x46,0xef,},{0xae,0x16,0x1c,0xce,0x95,0x40,0x33,0x84,0xb6,0x5c,0x6b,0xc9,0xb3,0x93,0xeb,0x07,0x25,0x64,0xc3,0x5f,0x3a,0x6c,0x04,0xfa,0x51,0x7a,0xb0,0x68,0xbc,0xd2,0x37,0x67,0xcc,0x0c,0x8e,0xdd,0x92,0xb1,0xa1,0x3a,0xe9,0xa9,0xce,0x48,0x64,0x13,0x7f,0xb8,0x9c,0x1f,0x37,0xb7,0x48,0xcf,0xc9,0x13,0x4b,0x67,0x41,0xba,0x1b,0x22,0x28,0x0d,},"\xc9\x0f\x45\x0b\xda\x1c\x6e\xfd\x8d\x12\x78\xde\xbd\x7a\xe0\x3e\x2e\xac\x27\x40\xa5\xa9\x63\xfc\xf9\x6c\x50\x4e\x31\xd4\xd6\xfc\xc5\xe2\xb5\x2a\x25\x18\xd2\x74\x1c\x55\xe9\x59\x18\x67\xb2\x42\x32\x28\xf9\xc1\x9f\x33\xc6\xf3\x87\x05\xc6\x20\x36\xd4\x80\xff\x53\xdf\x12\x07\x7e\x38\xfd\xb0\x73\xc6\x73\x10\x5d\xa1\xe1\x16\x19\xba\x53\x21\xa7\x1b\x5f\x49\x93\x23\x4a\x11\x94\x8e\xa1\x10\xcf\xa2\x42\xbc\x23\xfa\xc9\xaa\xe4\x62\x60\x6e\x39\x64\x1c\xa7\x14\x7e\xeb\xba\x1e\xec\x55\x3f\xce\x94\xe5\x3e\x4e\x01\xb0\x73\xdd\x78\x0a\x2f\xf6\x78\xb3\x15\x72\xca\x11\xee\x08\x77\xe7\x56\xbc\xdb\x66\x53\xe5\xe1\xb4\xcb\xfb\x56\x9a\x9d\x60\xe3\xee\x33\x61\x82\xdc\xb9\xb2\x5d\x1b\xe6\xdb\xf9\xb5\xc7\x14\x6d\x77\x55\x85\x83\x4c\xab\xde\x02\x78\xae\xe5\xd5\x7c\x85\xe9\x83\xf8\x4d\x88\x33\xa9\xe1\x5b\xcc\x11\x19\x8e\x1c\x1d\xa6\xba\x59\x28\x21\x29\xf1\xdb\x96\x6f\x54\x60\xc8\xfb\x65\x30\xfb\xc3\xa9\x8a\x31\xfc\x0f\x4e\x9b\x33\x73\x66\xee\xc1\xdc\xe1\x08\xc8\x26\xd4\x90\x45\xab\xfa\x12\xee\x88\x79\x7f\x08\xf0\x68\x3f\xef\x77\xed\xaa\x35\x43\xb9\x1c\xb1\x18\xe4\x24\xd9\xc4\x08\xda\x54\x74\x31\x12\x51\x07\xd9\xb0\x74\x4c\x24\x43\xce\x99\x17\xe1\xe3\x28\xd8\x18\x50\xba\xbb\xc9\x4d\x92\x0a\x1d\x06\xe5\x24\xdb\xb6\xc2\x3d\xd8\x2e\x17\x87\x82\x2d\x71\xc4\xcd\xc4\x09\xae\x85\xba\x4d\xeb\x58\x1f\x93\x47\x48\xf7\x5e\x7a\x76\x9b\x9d\x68\xc4\x58\x9e\x59\x4e\x65\xcb\x6c\x8f\x49\x03\xff\xba\xbd\x5a\x32\x6e\x89\x44\x1a\x54\x2f\x8a\xc2\x64\xcc\xc6\x4e\x95\xa8\x98\x2a\x71\x0b\x6c\x56\xff\x7d\x10\x91\x6a\xfc\x40\x9e\xa8\xa4\x1b\x74\x67\x9d\xd6\xa7\x66\xf5\x9c\x52\xb9\x30\x5b\xa7\x33\xb1\x3c\x9e\x81\x1e\xe1\x30\x83\x92\x5f\x42\x00\x68\x2b\xd0\x5d\xea\x33\x95\x32\x52\x29\x70\xaa\x14\x9d\x00\x4a\x2e\xa2\x0f\xf4\x61\xe9\xec\x0f\x3b\x62\x56\x5c\x1a\x10\x62\x59\xc8\x36\x60\x5c\xc2\x7c\xad\xc9\x51\x5c\xb9\x97\x9e\x89\xaf\x28\x7c\x02\x7d\x75\xed\xbf\x87\xd5\xcf\xf6\x3a\x7f\xec\x9b\xd1\x0e\x78\x77\xab\x9b\xf8\x68\xd7\x34\xbd\x3a\x23\x74\xce\xf7\x02\x5c\xc4\xda\xb7\x10\xe2\x54\x80\x66\x85\xa1\x36\xec\xd0\x3e\x36\x77\x03\x46\x51\x3a\x15\x14\x5b\x89\x0e\xee\xf4\x7b\x80\xea\x08\xe4\x6c\x81\xd2\x02\xe5\x33\xe9\xa0\x6a\x38\xa6\xf7\x6e\xf5\x7a\x9c\x73\x6e\xc7\x8d\x00\xb8\x08\xe3\xff\xd9\xc7\x9b\x9d\xc7\xa2\xe5\x89\x90\x76\x56\xc9\x32\xab\x8a\x8b\x57\xda\x1a\x49\x5b\xa7\x45\x20\x15\xe7\x92\x4b\x52\x69\xab\x1f\x67\xbd\xb4\x3a\x35\x83\x14\x87\xab\x90\x02\xf5\x2d\x78\xb1\x34\xcd\x37\x51\x92\x5a\xaa\xb0\xb4\x5c\x8e\x6b\x0f\x2b\xf0\xcc\x9a\x46\x59\x31\x71\x08\xfb\xa9\x13\x6a\xab\xb0\x92\x1a\x58\xfb\xb9\xb5\x0e\x51\x24\x3f\x9b\x53\x18\x47\xdc\x96\x57\xe9\x6f\xba\xf7\xaa\x69\x8f\xe6\xfe\x44\xf9\x05\x90\x14\x4c\x70\x33\x72\x50\xc5\x8b\xc5\xdd"}, +{{0xde,0xa1,0x80,0xc9,0x1b,0x53,0x3a,0xaf,0x73,0x6b,0xc5,0xd3,0xc8,0xe4,0x74,0xd5,0xe5,0xd4,0x75,0xb7,0x5b,0x92,0xcd,0xe6,0xbd,0x1d,0x10,0xf3,0xb8,0xf5,0x5a,0xd4,},{0x30,0xb2,0x0f,0xb3,0x20,0xb0,0x0e,0x77,0xc4,0xe0,0xa8,0xeb,0x37,0x30,0xaf,0x3c,0x0b,0x1c,0x5f,0x5e,0xd9,0xee,0x2b,0x05,0x62,0x70,0x7e,0x4f,0x55,0xc4,0x93,0x8b,},{0xd0,0x83,0x33,0x3f,0xb8,0x4e,0x79,0xc9,0xb3,0x3e,0x55,0xe8,0x19,0x2d,0x57,0x1f,0xfc,0x8d,0xc5,0x07,0x45,0xb6,0xb5,0xfd,0xd8,0xc4,0x4d,0x92,0xa6,0x3f,0xd1,0x78,0xc4,0xe5,0x7c,0x2a,0xb3,0xa1,0x21,0x1c,0x0b,0xa2,0xd3,0x9d,0xa3,0x0b,0x06,0x62,0x9d,0x8d,0x1c,0xc1,0xd9,0xf2,0x59,0x32,0x63,0xd5,0x24,0xfa,0x5a,0x2e,0xbc,0x03,},"\x60\x61\x44\xb7\xd4\xf9\x6b\xef\x7f\x11\x2b\x6d\x41\xbc\xb5\x00\xd2\x13\x6c\x13\x4c\xed\xa2\x20\xe2\x4d\x0f\x15\x24\xec\xa1\x2c\x30\xf2\xb1\x02\xc7\xf3\x78\xd6\xbb\xa2\x59\xc5\xb4\xa5\xef\x8e\xc9\x30\x9d\x5c\x8d\xa7\xe8\xd2\xde\xd3\x79\x2a\xee\xea\x21\x08\xf7\x7d\x66\xb2\x30\x45\x93\x8e\xd6\x47\x51\xf2\x0d\x48\x32\x6b\xe2\xfb\x99\x62\x8c\xfb\x18\x73\xd7\xdd\x27\x58\x1c\x10\x5e\xc1\x32\x49\xa9\x52\xa5\x07\x84\xb8\xb3\x4c\xb3\xb2\xc1\xa0\x04\xfa\x8b\x62\x8a\x07\x67\xfa\x9a\xbf\x05\x8d\x95\x5d\xf8\x5d\x13\x4a\x0f\xc7\xf4\xb7\xd7\xfb\x0c\x8d\x31\xbc\xe3\x45\xdd\x0a\x42\x82\x14\x5a\xfb\x2f\xf1\x97\x51\xf2\xcc\x3a\x1c\xae\xa2\x42\xba\xaf\x53\x87\x49\xbf\x38\x80\x00\xe3\xdc\x1d\x73\x93\x59\xdf\xeb\xae\x64\xae\x1e\x10\xfb\x6f\xc1\x7c\xc9\xfb\x95\x05\x35\xc2\xde\x12\x95\x87\xa8\x68\x59\xb7\xbe\x36\xdf\xe9\xb6\xc1\x14\x1b\x25\xe0\x91\x5c\x8d\x4a\xa1\xcc\xea\xe7\x04\x6b\x3d\x7c\xfa\x94\x0b\xc9\x8d\x4d\x69\xfc\x5a\x30\xdd\xe1\xde\xe4\x2f\xb5\x27\x22\x81\xbf\x8f\x8e\x7f\x3e\x1a\x04\x39\x7f\xb4\xf3\xad\xef\xc5\x75\x32\xdd\xbd\xe3\x68\x33\xa6\x76\xe6\xf3\x9c\x82\xaf\xf6\xbf\x48\x32\xec\x97\x1e\x03\xbe\x38\x29\xc0\x2a\x20\x3c\x82\xd9\xeb\x8c\x16\x30\xee\x96\x93\xf4\x5d\x26\xf5\xf5\x1a\x31\x03\xca\x64\xd4\x68\xec\xea\xc1\xb2\x9a\xf4\xc4\x2e\xb2\x16\xd7\x6e\xc8\x99\x48\x36\xb4\xbe\xc7\x64\x89\xca\x50\x70\x68\x0c\x2c\x2e\xb4\x57\x21\x0a\x77\xc4\x7f\xdc\xbf\x60\x01\x72\x07\x3a\x53\xf1\x45\x3b\xb5\xc8\x04\x39\xc8\x82\xf0\x73\x6d\xe4\x06\x37\xb4\xf5\xab\x1f\x76\x1f\xf3\x55\xc6\xe9\xbd\x4a\xbd\xe7\x56\x0d\x5f\xc1\x13\xc8\x30\x15\x9a\x1b\x77\xc4\xe8\x7b\xc2\xc6\x98\x80\xa4\x0c\x58\x05\xec\xc8\xaa\xaf\x57\x57\x5b\xcc\xd8\x17\x7f\xc6\xb8\x35\x69\x23\x3c\x0f\x5c\xa2\x23\xac\x40\x13\xca\x10\x6c\xac\x28\x54\x70\x6a\xea\xd7\x14\xfa\x29\xf2\x86\x0a\x5f\x97\x53\x26\x8a\x36\x71\xd9\xf5\x9c\xde\x60\x48\xcf\x0b\x89\x86\x05\x0f\x7f\x54\x9e\x4f\xd7\x55\x7f\x2f\xc3\xfc\xdc\xcd\xdc\xef\xda\x58\x6a\x64\xb3\x00\x6e\x58\x25\xf2\x7c\xa3\x16\x87\xca\xf6\x63\xbd\x90\xa0\x5b\x11\x52\xd7\xc8\x8d\x7f\x10\x51\xa9\xd7\x91\x74\x86\x51\xd8\x88\xa6\xa1\x2f\x22\xd6\xc8\xc3\xf7\x8c\x2b\x86\xea\xf5\x39\x4b\x4e\xf7\xee\xfb\x89\x79\x7b\x25\xe5\x42\xdc\x93\x10\x2d\x02\x1a\x1d\x0b\xed\x6a\x7d\xcd\xd8\x10\x2b\x8f\x04\x30\xa0\xbc\x21\xd9\x04\xa3\xc9\x34\x6c\x01\x83\x43\xdd\x99\x37\xcb\x35\x25\x00\x07\xa2\x84\x82\x5d\xb0\x8e\x9a\x11\xfe\xe3\x1c\xff\x7a\x31\x4c\x48\xc4\x2d\x8b\x31\x4a\xcc\x27\x82\x2a\xf0\x3d\x19\x54\xc7\xcc\x8b\xf9\xad\x4e\x9e\x98\xf4\xad\x4e\xfb\x35\x52\x88\xda\xa8\xc9\x0d\xe9\x03\x7e\x64\xa7\x86\x1f\x5e\xe4\x3a\xda\x9f\x0f\xcc\xde\x34\xd0\xbc\xf5\x02\x88\x55\x0f\x70\x0f\x21\x5a\x79\x44\xa5\x38\x0e\x2a\x8e\x3f\x04\xf2\xb4\xf5"}, +{{0x9d,0xaf,0x6d,0xbb,0x7f,0x76,0x29,0x66,0xe7,0xa5,0x7c,0x2e,0xc1,0x99,0x6e,0x9f,0x5b,0x55,0x5b,0x98,0x66,0xb8,0xe3,0x1d,0xea,0xab,0x43,0x56,0xeb,0x13,0x81,0x6e,},{0xf0,0x21,0xb5,0x5a,0x36,0xd9,0xfb,0xfb,0xf2,0x97,0x8b,0xc0,0xdf,0x73,0x6b,0x28,0x9c,0x82,0x41,0xd6,0x43,0x53,0x09,0x84,0x1a,0x13,0x4b,0x07,0xd4,0x7c,0xe4,0xed,},{0x49,0xb6,0xbc,0x46,0xb7,0xab,0xb5,0x69,0x4d,0xa9,0x42,0x15,0xef,0xc4,0xb3,0x0e,0xea,0x04,0xae,0x2e,0x73,0xeb,0x2d,0xa8,0xe8,0xc9,0xef,0x9b,0xe2,0x22,0x24,0x98,0xb1,0x7e,0x13,0x93,0x96,0x46,0xc2,0x9e,0x32,0xd6,0x45,0x58,0x46,0x40,0x64,0x15,0x90,0xb1,0xbb,0xdb,0xfe,0x24,0xf3,0x6c,0x6f,0x69,0x4b,0xf8,0x72,0x38,0xee,0x04,},"\x54\x45\x23\x90\x0d\xaa\x67\x78\xc0\x39\x1a\xe4\x04\x4a\x51\xc0\xc4\xa5\xe4\x44\x13\x3f\xbd\x77\x47\xd5\x39\xa7\x44\xfa\x60\xab\x5d\xc5\x4e\x18\x19\xdc\x8e\x56\x89\x9c\x56\xef\xd7\xef\x3d\xa3\x41\x79\x0e\xcc\x49\x64\x5e\xf3\x25\xc6\x56\x8a\xe9\x71\xd3\x0d\x21\xbb\x7f\x23\x46\x4f\x46\xa2\x4b\x80\xd4\x9b\xb9\x3c\x6e\x91\xde\x79\xb2\x43\x31\xd0\x70\x7f\x43\xd0\x66\x5d\x01\x97\x74\x3a\xdf\xf6\x90\xd6\x15\xa1\xc9\x25\x87\x77\xfc\x47\xd0\x21\x71\x42\x42\x6a\x47\x34\x89\x2e\xb6\x22\xab\x8e\x50\xbb\x12\x8e\xc3\xa8\x95\x26\x6a\x38\x61\xa3\x97\x68\xbc\x76\x09\x6f\x58\x1f\xd0\x82\xdf\x9b\x72\x23\xe8\x5a\x8a\xfb\xdb\x5c\xaa\x49\x22\xaf\x2a\x01\x4b\xf8\xa5\xcd\x11\xe5\xc5\xea\x93\xe9\x1c\xd4\x6d\x5a\x1b\x99\xb8\x5a\x26\x70\xe3\x21\xde\x2e\x32\x25\x5a\xfd\x67\xfe\x2c\x37\xfd\x93\x2c\xac\xa2\x2d\x24\x1f\xaf\x4c\xce\xfe\xff\x58\xd6\xbd\x04\xcf\xaf\x11\xde\xdd\x29\xc8\x71\x9f\xfc\xb0\x2e\xf6\x5c\x5d\x3e\xb7\x8b\x4f\xc0\xd1\x70\xa2\xe3\x43\x2c\xc8\x12\xf0\xd0\x41\xd9\x76\x0c\x13\xc1\x2f\x7c\x7f\x2f\x84\xfe\x5e\x0f\x70\x0c\x10\xb1\xa6\x9c\xa4\x66\xa7\x0b\xde\xff\x8d\xbe\xc7\xd3\x18\xfb\x09\xdd\xd8\x27\xef\x61\xca\xa6\x91\x0b\xbc\x06\x1c\xbd\xa2\xb5\x27\xef\x2e\x59\xed\x4c\x17\x22\x99\x72\xf8\x95\x67\xd7\x05\xde\x92\x31\x92\x4b\x41\xbb\x6e\x7c\x01\xfe\x85\x42\x64\x47\x4f\xa7\x6b\x1f\x88\xcd\x57\xea\xc3\x11\x17\x1a\xf1\x03\xd2\x30\x78\x42\x4a\x12\x67\x5f\x2f\xa3\x6c\x2d\xe0\xbf\x53\xc2\x95\xfe\xeb\x31\x57\xde\x95\x89\x22\x98\x6e\x32\x51\x3d\xfa\x33\xb3\x5e\x15\xc3\x94\xa1\x1c\x0f\xcc\x55\xb8\x2d\x6d\xd0\x59\x7c\xdd\xd2\x7e\xde\x7d\xe1\x29\x85\xa6\x16\xe6\x40\x26\xbe\xfb\x5d\x69\x04\x82\xb3\xff\x22\xc0\xdd\x21\xf2\x7a\x08\x6d\x37\xa0\x49\x9e\xa3\x6f\xe2\xc4\xb5\xa9\x59\xd1\x0e\x9a\x61\x0c\xab\x1f\xe0\xd2\x8c\xf1\x01\x3d\xca\xe6\x3d\x8f\xde\xe0\xec\xbd\x8b\x4e\x19\xd5\xd0\x40\xe2\xfa\xd7\xd0\x41\x3a\x38\xe8\xc4\xe7\x35\x52\xad\x46\x04\x7b\x5b\xbd\xd1\x5c\x09\xcc\x0d\x34\xe4\x8b\x91\xfd\xba\xe2\xa9\xd1\x62\xd4\xb2\x1e\xe2\x0a\x1e\xf5\x35\xea\x88\x35\x95\xbc\x49\x51\x69\x2a\x67\x16\x34\x54\xc7\x36\x7f\x13\x4b\xf6\x45\xd4\x8f\x99\x69\xe3\xd4\xf0\xf9\xea\xf4\x14\x4c\xe9\x80\xa0\xa2\xe3\x34\x2c\x74\x6c\x2b\xdc\x3c\xcd\xc2\xf8\xa7\xda\x57\xa0\xe8\x02\x87\x82\xd3\x0a\xf5\x85\x7d\x9e\xfb\x37\x66\x6d\xf6\x5d\x7c\xc3\x84\x71\x66\x61\xe6\x1f\xf5\xc0\x97\x52\x59\x5e\x94\x11\x2c\xa1\xa8\x40\xd6\xe4\xf6\xec\x0e\x55\x49\x4c\x5b\x44\xf7\xc0\xf0\xd4\xa9\x9c\xd7\x09\x05\xbf\x84\x85\x56\x17\x48\xf4\xdc\x0f\xd7\xa4\x4a\x1b\x13\x91\x13\xc3\x8a\x1e\x8e\xb5\xc7\xa2\x0f\x3e\x95\x2e\xae\xa8\xce\x38\xb2\x07\xc2\x8e\xd9\x72\x71\x8f\x03\x1f\x47\x7c\x62\x07\xce\x43\x3c\x51\x5f\x5a\xc2\x84\x0f\x49\x74\xf1\xf1\x69\x89\x62\x6c\x76\xbc\x98"}, +{{0x71,0x86,0xf8,0xd1,0x68,0xd9,0xdd,0xf1,0x7e,0xdb,0xaf,0x0e,0x7b,0x1a,0xbc,0xb2,0x6d,0xa3,0xe4,0xc0,0x27,0x2d,0x98,0x79,0xc7,0xfd,0xff,0x64,0x21,0xc4,0xea,0x50,},{0x96,0xb4,0xa6,0x56,0x23,0x20,0x29,0xfc,0x1b,0x83,0x64,0x70,0x3c,0xbe,0xa7,0xa5,0xd7,0x38,0x75,0x18,0xa8,0x8c,0xed,0x1a,0x91,0x5e,0xc8,0xd8,0x86,0x84,0x81,0x32,},{0xa9,0xc0,0x49,0x9f,0xc2,0x16,0xa1,0x45,0x32,0xd7,0x36,0x36,0x5c,0x63,0x55,0xf9,0x38,0xf8,0xd8,0x19,0x4f,0xa1,0x13,0x28,0x48,0xf8,0x3e,0x49,0x04,0x54,0xd4,0xbb,0xf6,0x92,0x69,0xf1,0x22,0x59,0xfc,0x6c,0x07,0x4c,0x10,0x15,0xe4,0x25,0xe4,0xf4,0xf2,0x7c,0x02,0x9c,0x93,0x33,0x49,0x51,0x36,0x1a,0x35,0xad,0x11,0x76,0x54,0x0e,},"\xa3\xe6\xcb\x6b\x84\xcc\x5c\xf1\xfb\x1a\x84\x8b\x4b\x8e\xa7\xcb\x7c\x87\xe0\x44\x57\x50\xc6\x1f\x9a\xa5\xd7\x7d\xed\xdf\x94\x94\x63\xec\xd3\x9b\xfc\x71\xf2\x61\x0c\x2a\x94\x24\x84\x7f\xb7\x6f\x84\xc5\xda\x1f\xa1\x0e\xf7\x18\xa3\x45\x66\xce\xc1\xb3\xe8\x99\xe7\x25\x2e\x8d\x4d\x34\x60\x16\x49\x8f\xf1\x19\x97\x27\x50\x06\x16\x60\xba\xed\x31\x28\x27\x58\x31\x81\x07\x3d\x1d\xc7\x4b\x76\xc4\x30\xca\x30\xd4\x09\xe4\xe8\x43\x9c\x0f\xc4\x8c\x00\x68\x06\x29\xd4\x3a\xe2\xa7\x7d\x69\x22\x8f\x7f\x8a\x12\x53\xaf\x15\xbd\x2c\xb6\xbb\x1c\x16\x96\x55\x0c\x4c\x79\x0f\x44\x98\x69\x63\x0a\xb9\x2b\x9c\x11\xcd\xe1\xf9\x61\xaa\x21\x03\xec\x23\xf7\xd9\xf0\xfe\x9c\x3c\x41\x32\x58\x2e\xfa\x79\xa6\x6a\xe3\x42\x6e\x51\x05\xb8\x0b\xfe\x5e\x04\xdc\x8b\xb1\xe3\x8a\x31\x10\xcd\x72\x98\x4b\x3e\xf0\x2a\x0c\xa6\x2a\xb6\x38\xcb\xcf\xbc\x8a\x6b\x59\x3d\x26\x13\xdc\x06\xec\x86\xfe\xe3\x4f\x65\x18\xd4\xa3\xfb\xdc\x15\x72\x37\x17\x45\x64\xda\xeb\x66\x74\xcd\xc3\x4f\x4d\x65\x37\xcf\x81\xd8\xaa\x9b\xdd\xbf\x3a\xed\xa3\x12\xda\xae\xee\x33\x6f\x9e\xd8\xbf\xf8\x1e\x29\x4b\xc7\xd4\x4d\x25\xcd\x78\x70\x72\xe6\xcb\x41\x4b\x65\xfb\x7a\x84\x6f\xc0\x65\x36\x7b\xa8\xe3\x7b\xef\xfd\xf0\xb7\xba\x8f\x98\xcd\xf1\xeb\x87\x0f\x4e\x8b\x71\x30\xfa\x34\x29\xd2\xe2\x4b\xce\x59\x94\xda\xf1\xaa\x65\xe5\xf6\x03\xb6\x31\x05\x3d\xc5\x10\xb2\xf0\x97\xe8\x6e\x9b\x9b\x55\x23\x02\x75\x79\x68\xd0\x13\x6e\xe6\x75\x4c\x42\xa3\x2c\x99\x0a\xdd\x9c\xb5\x29\xbc\x89\x75\x1d\xfa\x4e\x5e\x3a\x0b\xad\xaf\x4c\xc4\x0b\x6a\x09\x50\x7f\x9f\xcd\x24\xc3\xca\x72\x25\x95\x99\xc6\xee\x58\xd8\x57\xb3\xa1\x89\xe0\x48\x90\x2e\x88\x5a\x36\x07\x42\x60\x93\xcb\x0f\xab\x43\x7c\x0f\xb0\xed\x2f\x1e\x96\xe9\x44\x1a\x7e\x95\x4f\xe3\xef\x76\x46\xe2\x6a\x39\xa0\x70\x33\xd0\xa1\x55\x5d\xfe\xed\x9a\x6f\x57\x79\x4a\xf3\xa2\xab\xf0\x05\x7e\x9f\x85\x3a\xe5\xc3\x01\x38\xfd\x80\xe2\xf2\x9c\x2f\x4a\x93\xad\x31\x45\xda\x10\xa3\xe3\x1c\xe9\xff\x97\x86\xac\x65\xd8\x60\x37\xd9\x8b\x7a\xa6\xd1\x1d\xe8\x80\x00\x10\xe1\x33\x86\x9e\xb6\x7a\x50\x39\xb9\xb8\xfe\xb6\xef\x90\x3d\x0c\xc7\x46\x41\x26\x07\xda\x72\x5c\xe2\xdc\x6a\x35\x21\x09\xdb\xc6\xa5\xe4\x0b\x17\x0c\x23\x05\x0b\xc4\xfb\x1e\xfa\x0c\x34\xfe\xc0\x0e\xae\x32\x19\xc2\x90\x40\xe8\xf5\x97\x8c\x93\x84\xee\x91\x5d\x8c\x93\x98\xdd\x12\x0d\x5c\x3c\xba\x38\xf8\x52\x6b\x06\x19\x7c\xb2\xc2\x61\xde\xc7\xd7\x26\xae\x13\x0f\x9b\xee\x17\x26\x17\x00\xe9\x99\x31\xfa\xc4\xb4\xdc\xa0\xf7\x58\x70\x1a\xcb\xf3\x70\x7d\x47\xdf\x53\x21\x13\x0e\xc1\x0b\xb3\xb1\x30\x78\xc4\xdc\x5d\xe3\x47\x0f\x15\x8b\x57\xdb\xeb\x87\x8b\x3a\x85\x24\xe0\xed\x2c\x95\x47\x54\x5f\x0f\xdd\xf1\x31\x25\xe4\x5b\xb2\x3d\x6a\x7b\x38\x3a\x18\x7f\x4c\x5d\x54\xa7\xb4\xc8\x3d\x59\x57\xf2\xcd\x7e\x6f\xbc"}, +{{0xe8,0x6e,0x8c,0x62,0x56,0x6e,0x15,0x75,0x3b,0xd5,0x57,0x7e,0xaa,0xe7,0xf2,0x41,0x05,0xb7,0x40,0x55,0xa2,0x56,0x29,0x58,0x07,0x08,0xbf,0xc8,0x3a,0xeb,0xf0,0x6c,},{0x8c,0x8c,0xe8,0x82,0xd5,0xf7,0x65,0x86,0xd8,0xdd,0xcc,0xc5,0x57,0x9b,0xcc,0x1c,0xdf,0x4c,0xfd,0x71,0x62,0x30,0x4c,0xb1,0x0e,0x76,0x96,0x02,0x6e,0x70,0x7f,0x17,},{0x54,0xd2,0xfd,0x44,0xac,0xf9,0xe2,0x09,0xbc,0x7e,0x43,0x33,0x72,0xbd,0x73,0x07,0x4d,0x07,0x80,0x6a,0x77,0xc6,0xce,0x22,0x8e,0x9b,0xe9,0x94,0x41,0x8b,0x00,0xc7,0xec,0xbc,0xb7,0xac,0x00,0x6c,0x29,0x4a,0xec,0x9d,0xe6,0x68,0x57,0x2a,0xdd,0x51,0x7c,0x06,0xb4,0xeb,0x4f,0xe2,0xff,0x35,0x23,0xbf,0x04,0x3d,0xf4,0x4d,0x3d,0x0d,},"\x12\xfa\x63\x1b\x0e\x48\x2e\x9b\x9d\x63\x3e\x94\xb8\x2d\x8a\xb4\x36\xfe\x54\x8e\x5b\x95\xda\x92\x62\x46\x23\xd1\x3f\x2c\x70\xda\x77\x5b\xa1\x36\xc5\x22\x9c\x16\xa0\xc7\xa6\xfa\x91\x4b\x2f\xed\xa5\x64\xe1\x72\x19\xe4\x73\x70\xf9\x51\x5b\xb1\xd5\x9d\xe6\xe9\x58\x62\x04\xd9\x43\xdc\x56\x0d\x73\xe2\xe7\x57\xf7\xeb\x39\xbb\xc7\x11\x1b\xb4\x6b\xc6\x43\xc1\x3f\x60\x21\x12\x73\x9b\xec\x77\x8d\x7d\x4f\x49\xd0\x92\x56\x3d\x68\xf5\x77\x6e\x43\x0e\x3b\x0b\xf2\xdc\x1b\x01\xbe\xb3\x04\x01\x96\xda\x63\x02\x90\x8b\xfe\x91\xe0\xfc\x38\xe0\x4c\x15\x0e\xf9\x07\xdc\x73\x6c\x44\x5f\xf2\x1f\xdb\xd2\xdc\x1e\xac\x0a\x0f\x5d\x00\xa3\x0a\xf0\x28\xaf\xe2\xff\x61\x16\x2b\x75\x8c\x7d\xa9\xa7\x76\x66\x6a\x11\x23\x59\x43\x1c\x48\x85\x6a\x87\xca\x82\xd3\xdd\x1c\x8a\xf3\x76\x59\x86\x35\x43\x2b\xf8\x91\xbe\xcb\xc3\x3a\x8f\xda\x44\xce\x88\x3e\xa8\xaf\x4a\xd8\xb9\x1a\x92\x61\xce\x76\xb9\xe9\x39\xc4\x61\xfa\xc5\x3a\xe0\xf0\x76\xe8\x2d\x87\x9a\xac\xe8\xf3\x8f\x12\x0b\xc9\xb0\x4d\x81\x25\xed\x24\xbc\xd7\x79\xd9\xd2\x43\x86\xb1\xdd\x20\x17\xeb\xee\x81\x97\x37\x6e\x8c\x36\xfa\x3a\xef\x8c\x1e\x71\x3e\x2b\x8b\xce\x49\x66\xd8\x48\x88\x68\x1b\xa7\x84\x95\xfb\xd1\xd6\xcc\xa5\x86\x26\xe6\x85\x4c\xda\x60\x6b\x83\xd6\x29\x3d\x01\xe8\xe3\xe1\x3b\xbf\x4a\xac\x85\x1d\x9a\x1e\x00\xd0\x02\x4e\x26\x99\x3b\x0b\x30\x91\xbe\x7e\x80\x61\xbc\xbb\x3c\xbb\x23\x02\xce\xab\x96\x89\x7a\x8e\x1f\xf3\x67\xec\x86\x25\x69\x3c\xf3\x15\x34\x12\x4a\x9d\x5d\x72\x5b\xca\xe0\x01\xd6\x7b\xc2\x11\x1d\x0a\xb8\x11\x1f\xa1\xd2\x4e\x4e\xd0\x6d\x63\x58\x3c\xe6\x90\xf2\xa0\x46\x26\xd7\x91\xd2\x9e\x3e\x31\x5a\x41\x5b\xf2\xe8\x53\xa5\xf2\x97\x4c\x83\x3a\x3f\xe2\xe2\x90\x9c\xf6\x69\xc7\x3c\x1f\x59\x39\x2d\x30\xc3\x7f\x3b\x9c\x5a\x3d\xdc\xfd\x75\x62\x1f\xda\x36\xe4\xba\x2f\x16\x14\x78\x58\xf6\xf2\x06\xb9\xa1\x40\xf1\xdd\xc1\x46\x6c\x9a\x53\xed\x73\xf8\x24\x90\xbc\x95\x32\x2c\x95\x5f\x61\xd1\x1c\xb5\x1d\x5e\x8a\x58\xc6\xb3\xcb\x0f\xdf\x04\x19\x76\x32\x01\xbe\xea\x93\xa8\x51\x2b\x14\x05\x24\x5b\xfc\x38\x41\x55\xad\xc5\xce\x77\x8a\xa7\x4d\x00\xa3\x22\x72\x64\x65\x11\x9a\xf7\x95\x01\xf0\x40\xdd\x0a\x7a\x84\x06\x00\x01\xca\x89\xd2\xfe\x5e\x9c\xf9\x77\x9a\x54\x7e\x3e\xbd\x3b\xf8\x64\x29\x90\xa3\x69\x0e\x2b\x2c\x3e\x54\xcb\x7e\xee\xea\xbc\x24\x2b\x4d\xd9\x92\x74\xc4\x25\xa8\x67\x93\x1c\x92\x9c\xa7\x08\x08\x60\x1c\x39\x08\xcf\xd7\x88\x86\x7d\x68\x7d\xc3\x66\xe9\x76\x35\x0c\x9e\x70\x58\x4b\xd3\x90\xd6\x7e\xeb\x7c\xfe\xa2\x6c\x42\x68\x6d\x3d\x96\x20\xf6\x2f\x64\x10\x4e\xf4\x1e\xd1\xd1\x30\xd7\x9e\x32\x59\x38\x48\x62\x96\xb7\xab\x2d\x2a\xdb\x78\x52\x67\x43\xe4\x00\xac\xb2\xb7\xaf\x09\x62\x8d\x68\xcf\x94\x75\x10\x16\x25\xc2\x0e\x1d\xc0\x51\xd7\x3c\x99\x7c\x95\x2e\x12\x81\x2c\x80\x5b\x68\xff"}, +{{0xa5,0xca,0xb2,0x72,0x7e,0x2f,0x13,0x1a,0x4d,0x63,0xfa,0xce,0xe7,0x99,0x33,0x66,0x63,0x93,0x0a,0xa0,0x7a,0xfd,0xa6,0xbd,0x5a,0x8e,0x98,0x5a,0x02,0xde,0xb1,0xea,},{0xac,0x35,0x5f,0x95,0x26,0x0f,0xbf,0xea,0x77,0x8c,0x55,0xb5,0xaf,0x8b,0x3f,0xd1,0xf2,0x4d,0x26,0x93,0xda,0x35,0xde,0x4e,0xe5,0x08,0xa2,0x7e,0xd3,0x50,0x39,0x1f,},{0x13,0x8c,0x7a,0x8e,0xca,0x5b,0x5c,0x37,0x15,0x88,0x13,0x84,0x3c,0x9a,0x90,0x4e,0x5f,0x53,0x0a,0xd9,0x71,0xee,0x43,0x2a,0x44,0xf3,0x44,0xf8,0xc6,0x4b,0xbf,0xaf,0x10,0x2f,0xf4,0x1d,0xaa,0x5c,0xf7,0x22,0xa4,0xbc,0x66,0x40,0x58,0x87,0x59,0xb8,0xf3,0x6f,0x9c,0x05,0x9e,0xab,0x93,0x6c,0xc4,0x5e,0xd4,0x79,0x63,0x94,0xa0,0x02,},"\x48\x34\x39\x15\x4d\xd5\xe5\xd1\x09\x85\x7c\x24\xd1\xc4\xe7\xfb\xbe\xfd\x2f\x38\x65\x1d\xa8\x12\x89\xf2\xad\x3d\x61\x54\x30\x65\x38\xb8\x2a\xc7\xdb\xa9\x21\x0e\x74\x07\x76\xed\xe4\xcc\xf5\x1d\x4f\x63\x09\x4b\x03\xe4\x6a\xd3\xaa\x3c\x31\x94\x7d\x8c\x36\xce\x6f\x94\xe8\x52\x96\xbd\xed\xcc\x1e\xad\x62\xea\xa1\x44\x1e\xcd\xe0\xa2\x25\xd0\xbf\x02\xed\xca\xcf\x86\x50\x14\x89\x9a\xf6\x6d\x98\x08\x04\x0c\x2d\x02\x00\x0a\x0f\x5c\xe4\xf1\x68\x3c\x1a\x49\x52\x76\xd9\xc4\xd7\x28\xc9\xec\xd6\xf0\x78\xdb\x8a\x0c\xfc\x26\x71\x87\x23\x85\x62\xab\x1a\x1e\xa2\x81\x3f\xb4\xf1\x2e\x87\x8e\x1b\xa1\x43\xf4\xd0\x6a\x3b\xc8\x10\x0c\x35\x50\x11\x8d\x69\xda\xe6\x7b\x55\xed\x69\x2a\xcf\x94\x44\xda\xa5\xc3\xe3\xc0\xa9\x8e\xe2\x8c\xf1\x72\xde\x0c\x58\x4c\x9f\x2e\xc9\xbb\x6e\x9b\x57\xf5\x72\xa8\x6f\xf8\x72\x9f\x65\xf4\xc6\x5b\x7f\xea\xcc\xaa\x21\x72\x0e\xd7\x9e\x90\x61\x8b\xca\xfb\xfd\x95\x33\xda\x85\x23\x2b\x45\x08\x83\xaa\x91\x9f\x82\x7f\x04\xc4\xa9\x7b\xf5\x13\x90\xd4\xf8\x56\x9c\x19\x17\x26\xf4\x4f\x7e\x39\xfb\x3d\xb7\x3b\xfc\x41\x5b\x6f\xfc\xa8\xb9\x1a\xca\xad\x69\x23\x85\x72\xf1\x4b\x49\x98\x5e\xa0\x3c\x98\xd7\xb1\xd4\x4b\x3a\x65\x54\x76\x5b\x19\xab\xf9\xb2\x52\x74\xe9\x7e\x46\x34\xe4\xb0\xf9\xe8\x02\xeb\x6f\x74\x3f\xff\x95\x07\x57\xee\x01\x3a\x69\x88\x22\x18\x81\xa7\x44\x3f\x1f\x32\xbc\xcb\x00\x7e\x99\x37\x9c\x7c\xa4\xf9\x06\xd5\xfe\x11\xcb\x12\xf6\x6b\x53\xa3\xd2\x1a\xc9\x47\xbe\x0c\x81\x50\xbc\xd0\x4f\x1c\x81\x6b\x3f\x0c\x07\xc5\xfb\xc0\x90\x5a\x71\x36\x95\x68\x49\xda\x03\x83\x6d\xae\xc2\x5c\x3e\x1a\x06\xec\x3a\xeb\x20\x56\x48\x17\x6f\x89\xf4\xa2\x91\xfa\xc4\xf1\xd3\x89\x9f\x56\xc9\x06\x5e\xeb\xb8\x76\x8b\x84\xb3\x1b\x7c\xc0\x31\x08\xbd\x08\x88\x33\x8d\x17\x74\x99\x49\x70\x29\x2d\x93\x50\x31\xfe\xa3\x35\xd9\xe7\x90\x8f\xe0\x25\x48\x89\xc0\xb1\x71\xcf\xe0\xaf\x2e\x6f\xde\x7a\x5e\xa3\xde\x1f\xdc\xda\xe5\x37\xb6\x31\x31\x19\xc2\x7f\x77\x20\x24\xef\x36\xe4\x5c\x8b\x89\xf2\x6c\x93\xd9\xee\xa1\x37\x25\xe1\x2d\x81\x0c\xf9\x82\x4a\xea\x04\xcb\x80\x2d\xa7\xe4\x58\xe8\x42\xca\x37\x5e\x36\x71\x34\x6e\x00\x89\xde\xc5\x71\xbe\x16\x9b\x0d\x90\x96\x6b\xf3\x68\xfe\x36\x98\xfd\x3e\x72\xbf\x16\x24\x9d\xd9\x00\xaf\x6d\x29\xff\xa4\x83\x51\x36\x0f\x12\x24\x17\x14\x58\x5f\x7a\x9b\x4c\x7b\xaf\xc9\x52\x22\x67\x35\xde\x14\x62\x74\x3d\x78\xab\xad\x0f\x67\x11\xf2\x49\x5f\x33\x13\xad\x4e\x0b\xa2\x16\xb0\xde\xa5\xdc\x15\x16\xa9\x54\x9f\x7d\xfc\xfe\xb9\x3e\x59\x1a\xbe\xda\x5e\xa3\xc7\x04\x59\x06\x52\x3b\x40\x86\x8c\xa5\x73\x5d\x6a\x33\x71\xc3\xc2\x94\xc1\x11\x26\xd0\x97\xf4\xc7\x08\xe9\x04\x64\xc1\xad\x91\x42\xfa\x0b\xed\xf0\x7d\xfc\x5f\x4c\xb6\x7d\x6e\xd8\x0f\x1b\xfe\x72\x68\x3c\xfb\x2a\xd6\x65\x30\xdc\x43\xd7\x02\x3f\x37\x90\xff\x42\xd9\x5b\xd8"}, +{{0xcb,0x63,0x19,0x61,0x37,0x79,0xa4,0xef,0x66,0xbe,0x14,0x14,0x4b,0x28,0x40,0xad,0x01,0x67,0xc0,0x3f,0x3b,0x8d,0x04,0xff,0x59,0x2c,0xd1,0xd2,0xd7,0x22,0xe3,0x30,},{0x18,0xeb,0x03,0xf0,0xa3,0x34,0xb0,0x80,0xe1,0xaf,0x43,0x99,0xd8,0x37,0x6d,0x83,0xc5,0x33,0x31,0x6d,0xc6,0x87,0xcf,0x34,0x1f,0x0a,0xfa,0xb4,0x50,0x96,0x52,0x99,},{0xc1,0xb3,0x99,0xcd,0xc1,0x98,0xe9,0xa1,0x59,0xe6,0x84,0xfc,0x26,0x68,0x6d,0xe6,0x60,0xda,0x54,0xcf,0xe3,0x12,0xca,0x73,0x45,0xdf,0x0c,0x7d,0x15,0xa3,0x57,0x43,0x01,0x44,0x10,0xbd,0x2f,0x6c,0xd1,0x1e,0xef,0x33,0xa8,0x9b,0x3d,0x15,0xcb,0xc1,0x7c,0x7a,0x35,0x89,0x37,0xfd,0x99,0x72,0x05,0x05,0x1f,0x92,0x57,0xc2,0x56,0x09,},"\x87\x4a\x6c\x81\xd6\xdb\x71\x33\xa7\x91\x69\x76\x0c\x84\xd3\x6e\xea\x3d\x42\xea\x08\x92\xb7\xc8\xdd\xe8\x44\xa3\xa6\xb6\x0a\xa9\xf2\x66\x07\x26\xc9\xc4\xdd\x26\xa0\x1f\x4e\xd0\xdc\x1c\x53\xba\x60\x05\x46\x3f\x7e\xa6\x4a\x1e\xc6\x39\x53\xbc\x3d\x81\x05\x2a\x2f\x10\x84\x38\x9a\x77\x06\xdf\x74\xed\x41\x36\x08\x2a\xb5\xc6\xe8\xc7\xf4\x11\xdf\x9d\x3a\x0f\x3c\x40\xf5\xa6\x0e\x2d\x21\xa8\x54\x8e\x7a\x25\xde\xe3\x40\x30\xb3\xc3\xe7\x5c\xaa\x93\xdd\xaa\x9c\x19\x0c\xb6\xde\xda\x24\x13\xd5\x4e\x37\x3d\x43\x53\xdb\xa4\x3d\x39\x49\x1a\x2f\x56\xc8\xb3\x6d\x45\x01\x6f\x77\xd7\x47\x16\x91\x63\x45\x39\xe7\x6c\x4f\xb4\x19\x13\x47\x2b\x0a\x23\x05\x4f\x54\x8f\x54\xb1\xe7\x10\x9c\x8b\x65\x21\xb5\x7a\xe9\x81\xd0\x50\x31\x6a\x33\xc4\x9c\x71\x16\x26\x8d\xcc\x4b\x78\xc2\xba\xe5\x3a\x3a\xe4\xdd\x17\x8b\xb8\xb7\x6b\xb3\xbe\xfe\x19\xe4\x1a\x2c\xf1\x2c\xeb\xb7\x11\x68\xf9\x71\xf2\x02\x46\x1c\x63\xf7\xd6\xee\xf1\x07\xf5\xb1\x03\x0e\xdd\x4e\x75\x00\x9e\x91\x16\xc3\xcd\x0e\x8b\xdd\xc2\x99\xb4\x1f\x1a\x45\xe7\x84\xef\xa6\x46\xda\xda\x64\x06\x8e\x92\x48\xec\x98\x8f\x23\x26\x34\xad\x3d\x5a\xab\x19\x56\x0e\x83\x0a\x5b\xd6\x65\x45\x7c\x94\x29\x5e\x1a\xf0\x16\x0f\xbc\xe2\x72\xef\x48\x45\xdd\xf0\xc4\xf2\x4d\x97\x6f\x51\x86\x90\xea\x1f\x82\xff\x4d\xfa\x48\x13\x64\x1a\x67\x59\x8e\xa9\x84\x01\xe0\xff\x10\xa0\xe5\x82\xe2\xb9\x08\x67\xb4\xe6\x23\x2c\x34\xea\x49\x9c\x16\x99\x09\xa4\x41\x26\xf3\x77\xd8\xcc\x1c\x11\x90\x58\x66\x34\x0e\xfd\x1e\x7b\x07\x7d\xc7\x45\x6d\x59\xc9\xb9\x6a\x12\x4a\xac\x3b\x33\xbb\x22\x74\x41\xbb\x7a\x52\xe6\xc3\x14\x0d\x7a\x4f\x67\xca\x05\xbb\xc9\x3c\x93\x77\x5b\x92\x91\x19\xa2\x24\xed\x8f\x39\x00\x58\x20\xf4\x20\xcc\x6c\x53\x0e\x61\xe2\x0a\xdc\xa0\x1e\x93\x9c\xc0\x31\xdf\x49\xcd\xb1\xec\x8f\xf4\x93\xc9\xef\xbc\xad\x34\xc5\x71\x08\xef\xd7\x64\x55\x89\x66\xfb\x14\x70\xb0\x74\x5e\x69\x66\x19\x1a\x9a\x9e\x44\x58\x1b\x09\xfa\xf4\x69\xf9\x51\x53\x72\x03\xd9\x26\xbc\x8a\x55\xd0\x80\xa8\x05\x18\x1d\xd7\x29\x6e\xd2\x0a\x81\x82\x68\xf7\x55\xea\xa6\x6b\x08\x22\x42\xf4\xd0\x20\xf7\xcd\x67\x20\x89\x04\x84\xc0\x1c\x75\x7f\xe3\x5d\x87\xb5\xbc\x90\x6d\xea\xcc\x2e\x30\x71\xde\x46\x01\xbc\xf0\xdd\x6b\x83\x7c\x43\x31\x06\x04\x7f\xd8\xec\x9b\xd0\xe9\x8c\x9e\xe8\x06\xf7\xec\x8c\x5a\x10\xea\x21\x36\xf1\xf9\x0f\x90\x0b\x85\x3f\x95\x3f\x00\xb0\x76\xbd\x1e\xbd\x92\x9d\x08\xa3\x8b\xec\x68\xd8\x66\x43\x50\x47\xbc\xb6\x72\x1e\x06\xb6\x40\x85\xdc\x05\x58\xc1\xfa\x85\xa2\xc8\x3b\x0c\xaf\x4c\x81\x60\x84\xf1\x0a\x4c\x58\x85\x29\x5b\xca\x15\xff\x7c\x18\xe5\x96\xc6\x2c\x92\xee\x99\x21\xa2\x7c\x29\xd1\x95\xbd\x28\x22\x13\xff\x36\x60\xb6\xe7\x54\x6b\x4e\xaa\x77\x7c\xe3\x9f\xc5\xd2\x04\x84\xc7\x1e\xd6\xca\x06\xf9\xb7\x7a\xb1\xd8\x72\x39\x3a\xb2\xd1\x02\x55"}, +{{0xb2,0x98,0xad,0xf3,0x8a,0x67,0x08,0xf8,0xd1,0x8f,0xf1,0xed,0x96,0xbf,0xba,0xb4,0x21,0x54,0x0d,0x09,0x6c,0x4e,0x43,0x51,0xb9,0x22,0x09,0xb5,0xe6,0xaa,0xab,0x65,},{0x77,0x0e,0xdf,0x42,0xb8,0xa0,0x39,0xc6,0xca,0xb9,0xba,0x65,0xeb,0xfb,0x13,0x5a,0xbc,0x2d,0xa3,0x14,0xa4,0xc3,0x09,0xf4,0x6a,0x8f,0x32,0x5b,0x52,0xd0,0x65,0x93,},{0xe5,0x5f,0x8d,0x30,0x41,0x22,0xdc,0x17,0x5c,0xf0,0x27,0x46,0x74,0xfc,0x9d,0xed,0xfe,0xc2,0xb5,0xf8,0xa2,0xee,0xb1,0xe3,0xe7,0xf8,0xe0,0xdf,0xba,0x0d,0xac,0x2d,0x32,0xf4,0xe7,0x04,0xce,0x91,0xcd,0x59,0x91,0x84,0x13,0x3c,0x3b,0xf1,0x06,0x3d,0x2f,0xae,0x63,0xd7,0x3a,0xcc,0x57,0x72,0xd7,0x18,0xd8,0x11,0x83,0x31,0x86,0x02,},"\x9d\xf4\xd5\xd7\x56\x5d\x2c\x05\x22\x62\xdd\x34\xd6\x00\x7d\x86\xd9\xc0\xf0\x7c\x70\x89\xaf\x61\x19\xe3\x04\xf4\xd8\x01\x1d\x7e\xaa\xd7\x7b\x3e\xf7\x0c\xc2\x80\x84\x7d\x59\xf2\x97\x20\x2b\x7e\x18\x61\xae\xf3\x34\xbf\x38\xde\x14\x74\x0e\x80\x73\xc9\x55\xa8\x51\xd2\xcf\x3d\xad\xc3\xed\xce\x15\xbe\x49\x0e\xaa\x84\x5b\xa5\x53\xfc\x6e\x87\x46\xe5\x29\x15\xe6\x55\xaf\x4b\x86\xc6\x29\xd4\xc5\x22\x78\x36\x35\xd4\x64\xa2\x82\x57\x77\xd8\x9d\x70\x97\x67\x7e\xf0\xe5\xee\xae\x38\x53\x7e\xcb\x65\x6e\x3b\x28\xdd\x07\x35\x8f\xd9\xfb\x2c\xd4\x62\x51\x72\x86\x65\x9a\xef\xc7\x9d\x37\x4d\x1d\x13\xed\x93\x96\x7c\x53\x0c\xde\xa4\xf3\x14\xa0\xf9\x1d\x62\x89\xb4\xc7\xa4\x27\x9b\x6f\x4c\x4a\xbc\xa3\x33\x57\xf6\x9e\xd8\x4b\x91\x19\x63\x7a\xdb\x7c\x18\xe6\x94\xcb\x3c\x56\xe7\x36\x37\xda\x91\x07\x35\xd4\x3c\x38\xaa\x80\x86\x67\x5a\x06\xad\x37\x0e\x57\x26\x88\x1d\xa5\xe1\xa1\xdc\x61\x44\xd6\xa6\x2a\xff\x7f\xb0\xc3\x52\xd8\x8d\xc9\x71\xa3\xd7\x2d\x30\x71\xe1\x4b\x47\x42\x53\x56\xaf\x1b\x01\x92\x33\x53\x82\x61\x45\x1a\x99\xa6\xcf\x4a\x07\xce\x9a\xb1\xc3\x99\x0d\xe6\xab\x8d\xe2\x11\x6c\x75\x61\x05\xc5\x12\xb7\xa3\xee\xb3\x15\x7b\x15\x8b\x32\x1e\x44\x4e\x80\x6d\x89\x0b\x38\x90\xed\x9d\xdc\x86\x9f\x17\x11\x72\x3b\xb9\x9a\x72\xbd\xb9\x23\xd1\x31\xba\x4e\xdb\xfb\xb6\xda\xe9\x9a\x5c\x7b\x32\x8d\x31\x0d\xf9\xa6\xd1\xdc\xd8\x59\x18\x96\x28\x33\xe8\x9e\x20\xf5\xc5\xe6\x33\x3a\xc8\x61\x09\x4a\xe9\xe7\x99\xc8\x64\x1b\x9b\xae\xa1\x1a\x2e\x0e\xc2\x34\xbe\x59\x30\xe0\x28\x80\x85\x9c\xde\xc0\xd9\x78\x23\x7c\xbe\xa5\xc7\xc3\x2c\x11\x1b\xaf\xdd\x4b\xfb\xff\xe4\xfb\x34\x85\xef\xfe\xcd\x51\xbd\x19\x5a\x71\x40\x4c\xa5\xb5\x9a\xfa\x25\x2d\x7b\x5f\xf9\xd0\x30\xf4\x8c\x6f\xaa\xdb\xdb\xa9\x18\xf2\x1a\x0c\xd3\x9a\xf5\x69\x66\xdc\xcf\xa2\x5f\xb5\xa5\xcf\x9a\x4b\x26\xa7\xf5\x44\x1d\xf6\xe3\x20\xe3\x4b\x27\x39\x3d\xe2\xec\xfb\xd6\x9a\x15\x94\x90\x9a\x6c\x68\x5e\xc6\x45\xfc\xf3\x04\x8d\x01\x48\xfa\x38\xd3\xe8\xa6\x4d\xc3\xc2\x1a\xe4\x4d\xa7\xe4\x6a\x5e\xa7\x93\x6c\x2b\xa0\x83\x68\x9a\x78\xca\x3a\xc6\x0b\x87\xbe\x6d\x23\xea\x40\xf5\x96\x15\x83\x74\x28\x42\xe3\x75\x25\xa4\x9c\x5f\xe8\xfd\x15\xd7\xb0\xc9\xe8\xfc\xcd\x07\x93\x6d\x19\x53\x82\x12\xf7\x37\x3d\xbb\xf3\xdf\x7d\x46\xad\xf9\xd9\xf5\xdb\x09\x52\x4c\x65\xb8\x83\xae\x6f\x6c\xef\xa2\x4b\x19\xec\x48\xce\x28\xcf\xa7\x34\xd9\xbd\x6e\x77\x83\x7d\x1a\x14\xd6\xa1\x9d\x34\x5b\xfb\xea\x55\x9e\x7e\x6b\xfb\x71\xdd\xad\x83\xcd\x8d\xee\xab\x68\x7f\xe7\x3c\x05\x74\x88\xf8\xf2\xb3\xe2\xe2\x6d\x13\x00\x9f\x4d\x23\xe6\x61\x9a\x23\xc0\x69\x2a\xf7\x66\x69\x21\x7d\x5e\xbd\x46\x08\x5b\x39\x88\x90\xe5\xc9\x1f\xdb\x4d\xb5\xba\x40\xe7\x77\x3d\x51\x8d\x3c\xf0\x0c\x0a\x5b\x5a\x4b\x0f\x1b\x85\xd6\x29\x16\xa5\x9e\x56\x07\xb7\xb1\xeb\x80"}, +{{0xe9,0xcf,0x16,0xd6,0x96,0xf6,0x3b,0x59,0xe5,0xe2,0x5c,0x9e,0xe2,0xd7,0x5b,0xb0,0x5e,0xd2,0xba,0xa5,0x91,0xa7,0x55,0x7f,0x9f,0xb1,0x29,0xcf,0x98,0x3d,0xe0,0xba,},{0x6d,0x1a,0xe3,0x85,0xe8,0x0a,0x39,0x55,0xe8,0xd0,0xc5,0x93,0xa8,0x1f,0x43,0x1c,0xd4,0x32,0x67,0x1e,0x78,0xcd,0xba,0xfe,0x83,0xfe,0x58,0xdb,0xcd,0xb9,0x85,0x60,},{0x81,0x12,0xac,0x37,0xea,0xfb,0x74,0x9d,0x3f,0x4a,0x1e,0xa1,0x48,0x43,0x79,0xdf,0x3e,0x38,0x3b,0x01,0x9c,0x12,0xde,0x85,0x15,0xe3,0x49,0xe4,0xf6,0xf9,0x98,0x63,0x2e,0x30,0x96,0x83,0x47,0xa1,0xd1,0x5b,0x09,0xda,0x2e,0xb8,0x00,0xb0,0x3d,0x81,0x9d,0x20,0x2b,0xd1,0x0a,0x6a,0x46,0x3b,0xb0,0x2b,0x36,0x6d,0x68,0x55,0xfe,0x0e,},"\xa1\x0f\xea\x8f\xc9\x3e\xcc\xfe\x2a\x6b\x78\x26\x07\x95\x63\xad\xf8\xaa\x9a\x66\x64\x44\x93\x22\x00\xcc\xa9\x44\x7d\xd0\x27\xc5\xc7\x20\x4e\xa6\x2b\xf8\xf5\xe2\xe3\x91\x45\xac\x39\x48\xab\x3f\x31\x86\x88\x7b\x30\xbc\x60\x23\x30\x24\xb4\x83\xf3\xf5\x19\x03\x6a\x3e\x94\xc8\xd7\x51\x0a\x85\x3a\xc6\xe2\x0c\x6e\x52\x6e\xe3\xcd\xb7\x6d\xe6\x63\xf6\x73\x05\xad\x80\xdf\x23\x42\xc8\x50\x1b\x4f\x4a\x8e\xe3\x66\x5a\x79\x8f\xc4\x37\xdd\x81\x4e\x4e\x47\xe7\xa4\x66\x89\x0e\x0f\xfa\x8f\x51\x0f\x3e\x6e\x19\xc9\xc9\x69\xf7\x0a\x76\xe5\xcf\x30\x54\xd1\x7d\xe4\x59\xac\x8e\xe9\x95\x50\xbd\x38\x31\x9f\x36\xe4\x33\x43\x4a\x92\x6a\xd6\x8b\x96\x1e\x0c\xa1\x0a\xdd\x4b\xa9\x92\xb3\x65\x06\x60\xa2\xc3\xc2\x6f\x5d\x74\x0a\x31\xaf\xb7\x76\x3f\x54\x2f\x72\x3b\x8a\x3c\x92\xd8\xae\x92\xa5\x67\x76\x4e\xfc\x70\x53\x03\x12\xba\xab\xdd\x3f\xbb\xd5\x27\xfe\x0f\xcb\xca\x3f\x6a\x70\x64\xcd\xde\x18\x56\xe9\x7a\xb7\x86\xaf\x7d\x70\x22\xa9\xd4\x6a\x33\x8e\x8e\x17\x54\xaf\xd9\xad\xac\x85\x6a\x38\xde\x2a\x4c\x97\x66\xde\xe8\xdb\xc7\x09\xb0\x67\x1a\x6a\x6e\x6e\x1e\x5d\x12\x07\x4d\x22\x24\x5c\xd7\x3b\xee\xeb\x1b\xd8\xec\xfc\x1e\x85\xa2\x1b\xde\x25\x3f\x7c\x46\x5a\xbc\x1f\xea\xa9\x61\xc0\xff\x5c\xff\x2d\x89\x64\x72\xae\x17\xab\x84\x88\xe3\x3f\xfe\xfd\xb7\x2c\x10\x5e\x20\x4f\x94\x4a\xda\x51\xee\x13\x98\x1a\x13\x6c\x0f\x38\x42\x6e\x3e\x49\xb0\xe9\x18\x41\xc3\x27\x94\xd5\x2f\x13\x35\xdf\xa6\x37\xf1\x51\xc7\xe4\x0f\x9b\x83\x0a\xed\x53\x9a\xc5\x73\x1b\x81\xcd\xe3\x26\x4d\x22\xbe\xad\x31\xa6\xcc\x68\xd1\xa7\x31\x43\xb5\xba\x48\x16\x13\x92\x32\xf3\xf7\xf9\x79\x83\xf4\xec\xba\x64\xc4\x95\x53\xbe\x9d\x6d\x94\x3f\x91\xdf\xe0\x3d\x1e\xe8\x61\x8c\xd4\x0d\x2f\xb7\x23\x8a\x31\xd1\xbc\x38\xe7\x6a\x55\x1f\x9e\xee\x22\xe7\x3a\x27\xd7\xa4\x8b\x40\x87\x72\xea\x72\xc3\xed\x63\x7b\xb4\xb1\x68\xf9\xd7\xae\xad\x94\xea\x03\xbc\x11\x10\x99\x01\xc8\x89\x92\x7d\x51\xcd\xac\xf9\x62\x12\x59\x62\x55\x99\x79\xd3\xe4\xc8\xe3\xb5\xae\x58\x2f\x2d\xba\xd4\x99\x88\x02\x85\x6c\x4d\xf6\x9e\x8f\xb5\x49\x17\xe2\xf3\x6b\xb6\x7a\x19\xa2\x6e\x9a\x9a\x94\x85\xbc\xe9\x8d\xbf\xff\x0d\x2b\x02\xb9\x37\x7a\x91\x37\xa7\x34\xe5\x7b\x5c\xe6\x65\x05\x30\x17\xe9\x92\x67\x7a\x1a\xa0\x79\x24\x0d\x2c\xf9\x63\xcd\xf9\xbf\xea\x8d\x46\x00\x91\x23\x2d\xaf\x89\x80\x1f\xd7\x51\x71\xa6\x19\x5a\x5c\x04\x68\x15\x91\x4b\xe1\xf6\x28\x68\x78\x3d\x6f\x2c\xf2\x8a\xf9\x37\x8d\x6c\x68\x93\xe7\x5d\xe6\x41\x11\x1c\x68\x47\x27\xef\xfa\x31\xb8\xbc\x9b\x0a\x01\xdb\x9c\x9e\x81\xcc\xd8\xf4\xd4\xe8\x75\xd4\xbd\x90\xd2\x53\xf5\x89\x89\xa8\xa5\x2a\x20\x3a\x77\xa4\x96\xd6\x97\x98\x6b\x03\x1e\x9f\x69\x9b\xc6\xa1\x6c\xd5\xf9\xc3\x60\x18\xeb\xda\xa3\x6b\xad\x0e\x01\x4f\x4c\xf3\xb4\xb7\x46\x17\x1b\xf8\x93\x14\xe8\xb7\x2c\xbd\x47\xcc\x61\x6a"}, +{{0x23,0x8a,0x6d,0x49,0x79,0x32,0x1a,0x14,0xa9,0x97,0x23,0x6f,0x45,0x85,0x04,0x6c,0xf7,0xa0,0x5c,0x0a,0xdc,0x6b,0xa1,0xfd,0xb1,0x9e,0xc2,0xa3,0x2f,0x62,0xbe,0xeb,},{0x0b,0x4b,0xa6,0x74,0xe4,0x01,0x66,0x5b,0x67,0x90,0xcf,0xda,0x08,0x07,0x04,0xcd,0x90,0xe2,0xf3,0xd3,0xef,0xab,0x25,0x3e,0xd8,0xdc,0xfb,0xd1,0x8e,0x40,0x67,0x89,},{0x29,0x42,0xf7,0x08,0xc0,0xed,0xe4,0xcb,0x0d,0xde,0xf1,0x3b,0x85,0xd7,0x1d,0x72,0x13,0xe0,0x38,0x3d,0xd2,0x94,0xf5,0x34,0x13,0x5f,0xd6,0x9c,0xaf,0xbc,0xfc,0x0e,0x33,0x09,0x0a,0x2a,0x0c,0xa3,0xfa,0x57,0x2c,0x72,0xcd,0xf5,0x59,0x2d,0xe9,0x03,0xb1,0x58,0x44,0x95,0xab,0x63,0x99,0x81,0x50,0xf2,0xb3,0x93,0xa3,0xb3,0x40,0x0c,},"\x97\xcd\x61\x9a\x22\x51\xed\xa9\x16\x64\x64\x31\xd4\xcd\x15\x98\xc2\xd4\x4d\x06\xaf\x3e\x48\xbd\x18\xe3\xde\x7f\xb4\xbd\x4f\x78\xe0\x0a\x69\xee\xab\xde\x3f\x82\x06\x5c\xfe\xe6\xcd\x71\x1f\x07\xd2\x26\x37\x16\x1f\xf6\x85\xf6\x5a\x7d\xdf\x54\x55\x31\x97\xfd\x31\xc5\xc6\xb7\x1d\x9e\x36\x5a\x94\x1d\xce\x4c\x3e\x22\x5d\x19\xcc\x63\x3a\x7e\x12\x86\x2c\xd2\x3e\xbb\x7c\x74\xa7\x04\x85\x0f\x76\x1a\xc0\x24\x1b\xe5\x17\xce\x7c\x36\x09\x36\xce\x07\x25\x0d\x9f\x2e\xb2\x78\x71\x15\xee\xc3\x77\xe1\x13\x4d\xc0\x8f\x44\xeb\x0a\x2a\x2a\x27\x16\xf0\x01\x44\xa4\x9f\x01\x2a\x57\xb3\xcd\x06\xef\xeb\x3f\xae\x92\x0f\x28\x5c\xff\xd9\xa4\x01\xa0\xb9\x86\x59\x4e\x17\xb2\xc9\xc8\xfd\xab\x83\x5d\x9f\x3f\x5d\x47\x4b\xe7\x33\xc1\x92\x5e\xe6\xf0\x93\x86\x71\x10\x66\xc3\xfc\xd6\x45\xee\xb0\xfb\xe7\x05\x41\x69\xeb\x70\x9d\x4a\x3f\x0d\x16\xf2\x8a\x1f\xf5\x06\x6c\x84\x2b\xc6\x3e\x35\x9e\x92\x48\x5b\x38\x75\x7f\xf4\x6c\x27\xf7\x9d\x0c\xdc\xf0\xe1\x6e\x97\xe3\xc7\xb7\xe2\x17\x8d\xff\xd2\x70\x28\x2d\xd6\x12\x05\xd5\x85\x4d\x84\x1f\x0e\x3f\xc0\xe4\x82\xcc\x1e\xe4\x85\x52\xcf\xe6\x58\x93\x5b\x54\x27\xc3\x66\x23\x0a\xef\x79\xae\xf4\x02\x1d\x6f\xab\x5f\x18\x75\xcc\x84\x9e\x32\x1a\x75\x50\x0e\x9e\x1b\xa5\xdd\x59\x6b\x43\x8c\xf8\x8b\x23\x5b\x01\xa6\x76\x25\xc4\xbf\x84\xd0\x72\x4a\xe6\x88\x0a\x37\x85\xe3\x3b\xd9\x23\x5f\xd0\xf5\x98\x18\x04\xd2\x1c\xbd\x63\x3c\xb1\x80\xf3\x44\x56\x46\x02\x07\xa2\x90\xa2\x54\xd9\xfe\x61\x06\x3d\x40\x63\x4c\xa3\x87\x2f\x09\x35\xfa\x28\x32\x87\x95\xca\x41\xb0\x06\xa2\x11\x1f\xc5\x93\x2b\x1e\x77\x9c\xe9\x66\xcc\x47\xad\xb7\xc0\xdd\x98\x73\x33\xba\x75\x29\xa1\xa4\x99\x6c\xe9\xf5\x6e\x05\x19\x81\xfe\x1f\x55\x3e\x57\x8f\x43\xc3\xba\x94\xbe\xac\xc9\x3c\x3e\x73\x96\x67\xc7\xa7\xc6\xfa\x27\xe1\xe0\x81\x69\x5d\x20\xba\x70\x5c\x3f\x10\xb2\x0d\xf5\x30\xcb\xb0\xec\xb8\x74\x56\x50\x11\x09\x68\x70\x19\x31\x84\x52\x78\x5d\x38\xe7\x66\xb3\xcd\x35\xb0\x07\xd7\xe3\xcf\xe0\xb2\xcc\xa8\xaa\x6e\xf7\x39\x55\x99\xdc\xb9\xc4\xd2\x8b\xcc\x35\xc7\x6d\xfc\x35\x34\x3c\xb1\x34\x8b\xa3\xe9\x62\xf1\x0e\xe8\x6f\x86\xf5\xb6\xd4\xca\xe2\xe8\xc2\xb1\x85\xe3\xea\xa1\xae\xb8\x7b\xcf\xcf\x2f\xb7\x6c\xc7\xfc\xc6\x89\x50\x71\xb1\x68\xe8\xb7\xf6\xca\xa0\xfd\x63\x98\xe7\x78\xcc\x07\x91\x2f\xf5\xd6\xe6\x10\x21\xa8\xa5\x9a\xe0\x35\x21\x60\xf5\x6d\x54\x88\xfe\x2f\x2a\xcc\x94\x03\xda\x9a\x9f\xfc\x66\x1c\x1e\x9d\xc5\xbe\x88\xc4\x20\xdb\x0f\xd7\x7d\x84\x5d\xc8\xdd\x9d\x8e\x58\xf9\x96\x1b\x79\xaf\xc6\x86\x24\xba\xa8\x6a\xa6\x43\xa8\xa3\xc7\xed\xf7\x1d\x55\x3c\xc0\xd3\x22\x4a\x60\x69\xec\x67\x4f\x52\xda\x29\xa1\xcb\x60\xc4\x19\x23\x01\xa2\x43\x47\xa8\xaa\x83\x26\x26\x9e\x0a\x14\x78\x0c\x95\x83\xcd\xff\x51\x59\x27\xfd\x5b\xef\x52\x8f\x9d\x23\x78\x7a\xeb\x80\x3d\x70\xeb\x91\x6b"}, +{{0x59,0xd5,0x01,0x39,0x3d,0xc5,0x99,0x97,0x23,0x81,0x07,0x06,0xfa,0xd7,0xd6,0xef,0xd1,0x63,0xc4,0x47,0x10,0xc7,0x41,0xc1,0x85,0xc2,0x7e,0x04,0x25,0xe3,0xc0,0x5b,},{0x82,0x65,0xd4,0x3c,0xfb,0x07,0x35,0xb5,0xd7,0x25,0x0f,0xcf,0x0f,0xcb,0xd1,0x54,0xbf,0xc0,0xee,0xcb,0x13,0xb7,0xad,0x93,0xb6,0xb0,0x29,0x40,0x58,0x8b,0x84,0x3b,},{0xe6,0x46,0xf1,0x64,0xcf,0xed,0x8c,0x2e,0x06,0x07,0x10,0xdc,0xfb,0xc3,0xe9,0xfa,0x5e,0xb3,0x96,0x37,0x68,0x13,0x19,0x01,0x84,0xe3,0x46,0xf5,0x2b,0xb0,0xba,0x57,0x46,0xcc,0xb6,0xb5,0x95,0x22,0xb1,0xaf,0xf9,0x83,0x0f,0x2f,0x98,0xb9,0xe5,0xda,0xfc,0xd8,0x32,0x07,0x78,0x83,0xc4,0x4e,0x8a,0x35,0x38,0x8f,0x71,0x8b,0xf4,0x0c,},"\x56\x4e\xd2\x2c\x17\x2f\x5c\x3a\xfb\xb0\xb9\x5a\xd2\xfc\x64\xe4\xbe\x6d\x4d\xb1\xeb\xb8\xd3\x99\xc4\x3a\x5e\x16\x04\x8e\x7f\x87\x32\x18\x1e\x5d\x0e\xed\x8e\x63\x8e\xf2\xa5\x5a\xa0\xd7\xb6\x81\xfe\x02\xbb\x54\x23\xaf\x94\xbd\x35\x2d\x3c\x2d\xde\xc0\xf8\x47\x60\xa4\x11\x2b\x4f\xe0\x17\xcf\xbc\x50\x2f\x95\x43\xcf\xa4\x1f\xb2\xaa\xe7\x5a\x3a\x08\x1f\x8c\x49\x90\x33\xd1\xfa\xe5\xd9\xc5\x0c\xb4\x4d\xbc\x63\x60\x5a\x54\x39\x8f\xbf\x07\x98\x52\xeb\xa8\x6f\x2f\xdf\xc2\x72\xd0\xc4\x17\x9d\x7c\x13\xcb\xc1\xc2\xa3\xda\x0b\x82\x84\x5c\xf1\xa4\x6e\xbb\xe3\x1e\x79\xb6\x00\x97\x33\xc7\xbf\xe7\xaa\x4f\x9f\xfd\x71\x9c\x77\xdc\x7d\x74\x8e\x49\x2e\x14\xee\x5e\x41\x79\xbf\xa9\xe6\x49\xcf\x0d\x89\x53\x41\x86\x38\x5e\xe9\x94\x10\x05\x1d\x66\x56\xe6\x23\x43\x8c\xc7\xb2\xe7\x07\xe4\x8c\x84\x91\x55\x49\xae\x8d\x67\xa3\x06\xc6\x7b\x10\x6b\x7a\x25\xf4\x5f\x8e\x10\xdd\x7d\xd3\xea\xac\x31\xf1\x05\x22\x57\xeb\x6a\x75\x76\xb6\x85\xcb\x9e\x6c\x1c\xd0\xd7\x3c\x7a\x3c\xed\x5a\x8d\xd2\x73\x08\xae\x00\xf9\x5e\xab\xda\xe9\xd1\xc4\xaa\x89\x34\xe2\x42\x4c\x93\x28\xa5\x22\x8f\x4f\x82\xdd\x4a\x66\x55\x6d\x82\x17\xc5\xa2\x2b\x2b\xeb\x86\xa2\xa4\x34\x13\xee\x5e\x10\xf8\x83\xf2\xcd\x6c\x2e\x87\x49\xb5\x50\x88\x42\xec\xae\x5f\xfc\xcb\x79\x6d\x96\x33\xe8\x7e\xf4\xa9\x6c\x0d\xf7\xef\x47\xb2\x83\xd0\x96\x72\x3b\xa3\x13\x5b\xad\x75\xb2\xe1\x9e\xc0\x4f\x70\xa4\x78\x42\x8a\xd5\xd0\xaa\xc0\xdd\x2a\xb9\x90\x59\x13\xe7\xe5\xad\xe4\x08\x80\x1d\x5d\x3c\x54\xd9\xcf\x7b\x8f\x0f\x0c\x5e\xb0\x54\xc1\x47\x5c\xc2\x10\xa2\xc7\x98\xd8\xbd\x89\x93\x2f\xf9\xf3\x60\x42\x18\x58\x05\x3a\x70\x7b\x8b\xbd\x32\x05\x5c\x44\xb2\x07\x12\xa2\x67\x8a\x9a\x6a\xf9\xe3\x6d\x04\xdc\xff\x44\xf4\x31\xcf\x19\x30\xcd\x18\xfc\x93\x5d\x22\x67\x77\x5c\x69\x09\x67\x25\xed\x89\xa2\x91\xdd\x60\xe2\x1a\xc0\xb0\x12\x87\x34\x07\x29\x92\x82\x3e\xf8\x7b\x5e\xfa\x6c\xc5\xb0\x50\x17\x7f\x55\xf4\xce\xc9\x2a\x08\xa6\x5b\xca\xdc\xab\x9a\x41\xc3\x60\x86\x37\x0b\x7b\x9d\xd6\x29\x8a\xc7\xb0\xae\x6a\x09\xc9\x71\x0a\xbb\x46\x76\xa8\xfc\x87\xa3\x65\x12\x90\x14\x4b\x6b\x30\xef\x4f\x6f\xbe\x5b\x9a\xd2\x52\x37\xfe\x06\x05\xe3\xb9\xf1\x8a\x77\x18\xac\x9f\xca\x6f\x32\x5e\xa5\x5f\x49\xa8\x07\xfb\x80\xa2\x40\x2a\xe1\x34\x23\x08\x0d\x32\x77\x58\x64\x90\x23\x79\x8d\x57\x28\xe0\xdc\x64\xac\x88\xa6\xe2\x94\x5d\xbb\x3e\x3f\xfa\x9f\xdb\x4c\x7b\x58\xfb\xa3\xf5\xfb\xd6\x7c\x68\x6b\x29\x71\xbb\xd8\xba\x4d\x27\x5d\x57\x3e\xb7\x96\xeb\x91\x46\x77\x5d\x8c\xdc\xd5\xfd\x3e\xb5\xa8\x8e\xa5\xa9\x30\xec\x32\x44\xe6\xa3\x7c\x81\xf6\xa2\x55\x4e\x5b\xa7\x87\xf0\xe4\x53\x19\xfe\x4b\x8a\x2f\xfb\xfe\xd5\x07\x70\xe7\x82\x7b\x3e\x7b\xc2\xb4\x4c\xe5\x12\xae\x60\x51\xb6\xf9\xf1\x39\x31\xea\x6a\xcc\x09\x6b\x8d\xcb\x01\x96\xbe\x42\x24\x84\xdb\x5f\xcb\x29\x9d"}, +{{0x83,0x9f,0xb1,0x32,0xe6,0x92,0x50,0xca,0x1a,0xd9,0x45,0x10,0x08,0x7f,0x92,0xce,0x06,0x87,0x69,0x21,0x3a,0x19,0xb2,0xa6,0xc8,0x94,0x90,0xf1,0xf5,0x78,0x80,0x7a,},{0xeb,0x58,0x66,0x19,0xb4,0x4a,0x15,0x37,0x9a,0xcc,0x46,0x21,0xa2,0xac,0x71,0xea,0x58,0x97,0x00,0x26,0xc2,0x8e,0x24,0x09,0xfc,0x1b,0xa2,0xbd,0x8b,0x23,0x6d,0x1d,},{0x66,0x43,0x7b,0x6b,0xc0,0x5e,0x75,0xdd,0x16,0x26,0xc3,0xc4,0xff,0x1f,0x72,0xe6,0xdb,0x38,0x1b,0xa1,0x59,0x09,0x48,0xf8,0xf1,0x6a,0xd4,0xd6,0x6e,0x59,0x91,0x65,0x9a,0xa8,0x44,0x05,0x56,0x8c,0xfb,0xc0,0xa7,0x7c,0x02,0x5e,0x59,0xe4,0x3f,0xd5,0x3a,0xb9,0xff,0xab,0xba,0x7b,0x25,0x8f,0x78,0x79,0x62,0x39,0xf9,0x0d,0x45,0x01,},"\xc5\x72\x32\xfe\x32\xf1\x1e\x89\x4b\x43\x7d\x40\x45\x62\x07\xcc\x30\x6d\xb4\x81\x69\xb2\x0e\x07\x81\x10\x3a\xff\xe8\x02\xf5\xaa\xbe\x85\x82\x95\x2c\xa8\xe9\x57\x45\xe9\x94\x0d\x53\x5e\x00\xff\x65\xab\x3c\x64\xbe\xd3\xd1\x17\x3a\x0f\x3d\x70\xce\x4e\xbe\x2b\x50\xd0\x48\xbb\x47\x16\x4d\x2a\x2c\xd9\xd9\x5a\x10\xcf\x0d\x07\x3e\xd1\xc4\x1b\x3d\xe3\x33\x52\x8e\xe3\x29\x68\x22\x3a\x0d\x84\x7c\xad\xbb\x5b\x69\xf3\x82\x16\x4e\x9a\x28\xd2\x3e\xc9\xbd\xe9\xa8\x28\xe8\x77\x1c\x9e\xb4\x92\x20\xaf\x54\x18\x55\x08\xaa\x07\x3a\x83\x91\x95\xf1\x03\xbc\x2f\x32\xfe\x04\xf9\x51\xca\x45\xbf\xbf\x30\xd2\xfb\x81\x14\x05\x6a\x73\x6a\xdd\xf2\x7e\xcd\x9a\xf0\xf6\xe5\xe9\x7e\x57\x73\xc4\xfa\x90\x22\x68\xc3\x2a\x15\x14\x10\x95\x5f\x3c\x76\xaa\xe2\x55\x54\x9e\x0f\x03\x3f\x89\xe1\xa7\x8f\x26\x5c\xba\xb6\xbe\xb7\x51\x6d\x4b\xad\xc4\x9c\xda\x45\x88\x31\x62\x25\xb4\xc8\x5e\xa9\xfa\x99\xc7\xd6\x76\x6e\x94\x90\xc4\x9d\xe5\x9d\xa7\x17\xf6\x67\x65\x35\x30\x07\x1d\xd2\xf0\xc5\x3e\x31\xd8\x76\x81\x56\xfe\xb0\x8f\xaf\x00\xdb\x0a\x04\x53\x3d\xf9\x79\x57\xa8\x4a\xa4\x6a\xeb\x7e\x36\xc0\xb0\xbe\x69\x01\x89\x46\xf1\x53\x8a\x6a\xea\x71\xdf\x53\x6f\x14\x42\xc2\x44\x4a\x43\xa0\x43\xd0\x46\xab\xde\x1a\x78\x2b\x0f\x4f\x5c\x6a\xa7\x20\xaa\x60\xaf\xed\x94\x7c\x0c\xee\x47\x7d\xbe\xc0\x05\x57\xb3\x72\x12\xd9\x33\x57\xca\x2b\x6b\x6f\x82\x71\x5b\xa0\xe4\x84\xf6\xda\xf2\xd0\xb7\xa9\x8c\x03\x35\x19\xce\x38\x26\x35\x86\x79\x6d\x5d\x31\xcb\x2b\xc3\xd1\x12\x5b\xc0\xcc\xd3\x29\xa5\xc2\x1f\xd2\x7a\x21\x8d\xed\x60\x7a\x0e\x75\x15\xb5\x71\xf1\x92\xc3\x3f\x5f\xba\x51\x4a\xfe\x4d\x45\x81\x00\xf3\xcc\xba\x3f\x38\xeb\x43\x0b\x4f\xc8\x8f\xae\xf9\x99\xfa\x71\xee\xe4\x88\x22\x89\x03\xbe\x29\xf2\x4d\xf8\x1d\xc9\x11\x04\x4e\x92\x4c\xda\xa0\x17\xcc\x7d\x87\xe5\x6a\x6c\xba\x87\x60\x85\x9b\xd6\x3d\xd2\xd4\xf5\x81\xb9\x55\xec\x92\x4a\x49\xaf\xb4\x7c\xa0\xd6\x3e\x78\x26\xfd\xc7\x12\xb4\x94\x3b\x73\x9e\x18\x57\x75\x5a\x33\xc6\x50\x36\x75\xfd\xde\xae\x06\x27\x06\xe3\x4f\x74\x4f\xd9\x32\x64\x8a\x56\x08\xce\x60\x8a\x61\x99\x57\x83\xf3\x33\x9c\xa3\xfe\x10\x7e\x19\x72\x74\x4b\xf6\xd4\xed\xaf\xbf\x47\xce\x02\x1e\x05\x82\x1f\xb1\x24\xc7\x08\x39\x30\xe6\x8e\x6f\x5c\x32\xd2\xd9\xfc\x4a\x88\x4c\x0b\xc8\x84\x04\xe4\xcf\xe3\xc1\xa2\x42\x0d\x41\x82\x3a\x38\x5f\xb3\x28\x8d\xb6\x5c\x89\x54\x5f\x6e\x73\xf0\xd8\x00\x4b\x2b\xa1\x2a\x4e\x07\x72\x75\x23\xef\x08\x56\x70\xda\xff\xaf\x41\xc2\x8a\x4c\x11\x57\xbd\xd2\x45\xe6\x87\x50\xdd\x20\x0e\x02\x3a\xf9\x0c\x67\x56\x1e\x0f\xe4\xba\x34\x0c\x43\x3f\x75\x5e\xef\xab\xd4\xb0\x39\xbf\xc3\x23\xdc\x11\xad\xb7\x5a\xec\xc4\x48\xa8\x69\xc7\xf2\xa5\x8b\x9d\x86\x17\xc6\x4b\x8f\x89\xfc\x58\x3f\x8c\x94\x8e\x2d\xf0\x25\x1a\x6c\x7d\x8c\x73\x8c\x3b\x5a\x42\xb7\x49\xad\x5e\x8e\x98\x6b\xd8"}, +{{0xad,0xc1,0xe5,0x6c,0x3a,0xc9,0x4e,0x6c,0xda,0x04,0x11,0xcb,0xc3,0xce,0x2a,0xf1,0x28,0xd1,0x85,0xa2,0xa2,0x73,0xbd,0xb2,0xaf,0x8d,0x7e,0x50,0xfb,0x96,0xb5,0x26,},{0x5d,0xcf,0xec,0x1f,0x91,0x12,0x75,0x15,0x64,0xec,0xb6,0x07,0x15,0xeb,0xb2,0xc5,0x17,0xb5,0xec,0x37,0xb2,0x53,0x4f,0xd6,0x32,0x99,0x24,0x42,0x9b,0x7f,0xd5,0xc5,},{0xf0,0x2e,0x5d,0xbc,0xb6,0x87,0x04,0xaf,0xad,0x03,0xac,0xa8,0x10,0x61,0xdb,0xdb,0x99,0x85,0x70,0x04,0x9f,0x10,0xce,0x65,0x0e,0xc7,0xa2,0xef,0xf1,0x5c,0x79,0x3d,0xdf,0x5a,0x27,0x2c,0xb6,0x83,0xc2,0x2c,0x87,0x25,0x7c,0x59,0xbd,0xef,0x39,0xef,0xea,0x79,0xbd,0x67,0x95,0x56,0xea,0x15,0x05,0xed,0x00,0x36,0xcb,0x46,0x04,0x0c,},"\xd4\xf9\x59\x47\x4e\x0b\x89\xe2\xdc\xd0\x20\x66\x98\x4f\x88\xd7\x39\xdd\x11\x34\xa3\x33\x09\xf0\xa8\xb7\x80\x2e\xaf\x01\x33\x03\xc1\x35\x15\xdf\xeb\x46\x1e\xa3\xd2\x48\xe9\x98\xb9\xa4\xe5\x4d\xae\x5b\x00\x19\x0a\x45\xe7\x0d\xc6\x7e\x98\xf3\xd4\xcf\x90\x6c\x21\x4d\x4f\x63\x6d\x29\x52\x92\x5e\x22\xb1\xa8\x6a\x1a\xab\xb3\xa8\x92\xa9\xf8\xed\x45\x4f\x39\xc6\x3d\x35\xb7\x1e\x87\xa2\xda\x55\xa8\xe1\x67\xac\x83\xa8\x66\xad\x16\x7a\x17\xae\xd1\x83\xc0\x85\x18\xc1\x5e\x6b\xe3\x48\x58\xb4\xce\xe2\xb8\x42\x73\x14\x76\x0f\xff\xdd\xd5\x92\x38\x54\xb1\x74\x7f\x79\x6e\x1a\x52\x49\xfb\x30\x44\x89\x4e\xd6\x46\x82\x9f\x65\x43\x16\xee\x52\xf4\x01\x0c\x8d\xd3\x21\xfa\x1d\xec\x39\x7e\x50\x14\x5e\xd9\xe3\x16\x86\xfd\x52\x03\xf7\x23\x3b\x8d\xa7\x80\xac\xaa\x91\xee\x0b\x5b\x47\x20\x78\x66\xaa\xd8\x5f\x83\x7e\x03\xb4\xe6\xf6\xde\x8c\x04\xac\xaf\xd7\x07\xbd\xc1\xdd\x45\x50\x0a\xb5\x64\x80\x1b\xee\x9a\x58\xec\xe3\x60\xd0\x04\x82\x8b\xaa\xf5\x23\xe2\xf5\xab\x69\x32\x6a\x03\xaa\xbe\x01\x08\x78\xfd\x43\xff\xaa\x56\x87\x22\x44\xd7\x68\x1f\x16\x18\xe6\x23\xe3\xd4\x74\xc7\x3a\xf8\xb0\x80\xa6\x18\x21\xa5\x74\xef\x2f\xd7\x52\xd2\x3b\x60\x5e\xc5\x21\xc1\x9c\x15\x50\xde\x98\x0c\x09\x4d\x05\xe0\x23\x8f\x3e\x00\x8e\x6b\x19\x5a\xbf\xdd\x40\x28\xee\x1e\xe1\xd6\xc6\x6a\x76\xf1\x78\xf0\xb4\x31\xe4\xaf\x44\xdd\xcc\xfc\x52\x90\xed\xff\x36\xec\xe6\x3e\x83\x85\x56\x70\x13\xf4\x3a\x2a\xeb\xb6\x7e\x3e\xf4\x06\x30\x8c\x20\x48\x8a\x76\xd5\x8a\x21\x4f\x31\x39\xd9\x83\xb1\x9a\xfb\x12\xe3\x28\x36\x07\xfd\x75\x10\x7b\xd3\x1f\xeb\x62\x56\x17\x4b\x7a\x18\xae\xca\xc9\xf8\x56\x25\x82\x01\x8b\x0e\x6d\xe4\x05\x35\xe3\x5b\xef\x2b\x56\x25\x53\x88\x51\x29\x39\x75\x62\x90\x0d\x34\x17\xf9\x8c\xdd\x1e\x29\xd7\x31\xff\x48\x93\x3f\x29\x52\x95\x81\x63\xba\x67\xd5\x95\x61\x81\x1b\x83\x77\x2b\xd0\x57\x10\xb6\xe3\xcc\x04\x34\x60\x99\x37\x50\x72\x23\xab\xb7\x1a\x6a\x8c\x83\x8f\xec\xdb\x1d\x2d\x37\xc9\x5d\xc8\x06\xf6\x5f\x3f\x96\x63\xd9\x9f\x06\xe6\xc0\xf3\xc3\x2e\x95\xaf\x1d\xd7\x08\xe8\x11\x08\x63\x6a\x26\xb9\x68\xe9\x83\x39\xc7\x41\x28\xb6\xcf\x67\x13\x35\x88\x4a\xc7\x2f\x75\xb6\x37\x19\x5e\xa9\xec\xa0\x53\x60\x89\x96\xc3\x2e\xd4\x45\x41\x0f\x67\xfa\x10\x4b\x39\xf0\xfd\xf3\xc9\xb5\xc6\x15\x7b\x76\x80\x37\x56\xb2\x7f\x4c\x3b\xa1\xb4\x7f\x32\x85\x76\x24\x8e\x9b\xc5\x3e\x7b\x8a\xb0\xb2\xed\x97\xc2\xf9\x99\x8b\xcc\x7d\xfe\x39\xe2\x64\xaa\xd3\x0c\x6c\xfe\xf2\xb5\x55\x3f\xfb\x5a\x69\x9a\xa4\xbd\x0e\xab\xe4\x38\xce\x05\x22\xcc\x91\xfe\x4e\x72\xbf\x7e\xac\xba\x47\x71\xcc\xf6\x3a\x37\xaa\xfc\xad\xbf\xbf\x99\xdd\x76\xb8\x5b\x80\xee\x07\x5d\x3a\x7d\x1a\x90\xa5\x5b\x77\x29\xa5\x41\x6e\x5b\xe6\x96\xbf\x9f\xb7\xf3\x15\x8c\xfd\xb5\xcf\xda\xcd\xde\x81\x72\xee\x1a\xb9\x48\x6e\x24\xcc\xea\xd2\x9b\x45\x7a\xcf\x43"}, +{{0xdb,0x89,0xdf,0x6a,0x23,0xd8,0x90,0xb7,0xf0,0x02,0x60,0xe8,0x1f,0x4a,0xd9,0x8f,0xd0,0x94,0x40,0x36,0x51,0x31,0xe8,0x5e,0x22,0xc7,0x95,0x1a,0x18,0x7b,0x02,0x18,},{0xc9,0x67,0x63,0x67,0x2e,0xe4,0xa2,0xcc,0x5a,0x93,0xb6,0xa6,0x83,0xdf,0x9b,0x5d,0xe4,0xd9,0x38,0x6a,0x79,0x08,0x35,0x68,0x1d,0x12,0x17,0xd1,0x92,0x96,0xbd,0xc8,},{0x80,0xb7,0xfc,0x8b,0x6a,0xe6,0xee,0xce,0x81,0x66,0xb7,0xea,0x53,0x4c,0xb5,0xb2,0x14,0xc9,0xea,0x99,0x73,0x92,0x1e,0xd0,0x5d,0xe4,0x0c,0x78,0xe1,0x4f,0x16,0x2b,0x09,0xe9,0x78,0xca,0x6d,0x86,0xee,0x43,0x4d,0x98,0x4b,0x8b,0x00,0x70,0x40,0x9d,0xd2,0xad,0x11,0xb5,0x31,0x78,0xe2,0x39,0xda,0xb5,0xbc,0x39,0xc7,0xba,0x46,0x0d,},"\x54\xc1\xc5\x11\x1e\x08\xc9\x82\x45\xba\x4f\x13\x18\xba\x1d\xb1\xdc\xc7\x4d\x14\xa5\xc9\x8a\xb9\x68\x9c\xba\x1c\x80\x2c\x68\xbc\xfc\x81\xfd\x87\xff\xc6\x1c\xaa\x94\x2f\x66\xd7\xe5\x15\x7f\x65\x53\x8c\x7e\x7b\x33\x17\x04\x84\xb4\xb6\x54\x3f\x36\x20\xff\x29\x63\x8b\x64\xd4\xda\xe7\xb0\x22\x21\xcf\x77\x83\xf1\x87\xec\x42\x31\xe6\xb6\x94\x6d\x82\x76\x20\x74\xf0\x9c\x32\x78\x1c\x2f\x38\x46\xde\x3e\x82\x17\xf6\xe1\xb6\xe0\xd2\xb5\x59\x5d\x74\x2e\x2c\x4e\x32\x5a\x28\x41\x92\x40\x44\xdf\xcf\x12\xb4\x79\xeb\x69\xf1\xbb\xd4\x0e\xab\xdd\xd1\xff\x54\xa9\x18\x4d\x36\x6d\xff\x9d\x8f\x2d\x86\x3e\x37\x8a\x41\xf1\x0c\xd1\xda\xe9\x22\xcd\x7f\xbb\x2a\x54\x4e\x47\xea\xbf\x47\xca\x0a\x38\xab\xba\x34\x45\x49\x19\xbb\x9a\x4e\xf0\x44\xbf\xb9\x7b\x70\x8c\x2f\x74\x28\xd6\x8f\x9c\x57\xc0\xee\x7e\x79\x25\xf7\xa2\xb5\xc6\xe7\xdf\x82\xbb\x26\x80\xc8\x62\xdc\x7c\xc6\x8b\x0f\x54\x53\x0e\x64\xaf\xe2\x76\x3d\x9c\x7b\xaf\x45\xcc\x6f\xe6\x12\xd1\xf7\x82\x77\x39\xc4\x41\x13\x98\x88\x8f\x73\x67\xc3\xd4\x37\x79\x07\xac\xc0\x6a\x06\xf9\x3f\x88\x72\x26\x79\x8f\x48\xaa\x54\x64\xf6\x01\xc2\xc1\xed\xda\x77\xed\xfe\xb9\xb9\xb5\xd5\xf9\xcb\x6f\xed\x37\x90\x05\x47\x47\x7f\xca\x1d\x09\xab\x52\xd6\x3e\x49\x1f\xeb\x12\xfd\x6d\xc8\x05\xa7\x8c\xee\x3b\xaa\xde\x43\x52\x98\x20\x61\xde\xa5\xa2\x65\x3d\xb8\xe7\x60\x77\x72\xe8\x34\xb3\xa5\x05\xc1\x6d\xd6\xe7\xc7\x1b\x91\x1e\x84\x2e\xba\x92\x5d\x77\xa3\x3c\x5c\x57\xce\x11\x84\x09\x80\x78\xca\x2e\x6a\x3f\x69\xaa\x6a\x14\x63\x9d\xc9\x7b\x4b\x30\xc9\x9d\xc4\xfa\x3e\x2c\xf6\x3c\x70\x1c\x30\x6c\x5e\x25\x3c\x51\x13\x85\x4c\x18\x5e\xbc\x8b\x47\x98\xf6\x8d\x1f\xd7\x80\x05\x4d\x3e\xed\x2f\x39\x4c\x45\x43\x04\x96\x6b\xdd\xbd\x12\x28\x08\x34\xec\x9b\x40\xc1\xe9\x8b\xc2\xd9\x8f\x48\x45\xf6\xeb\x44\xf2\x53\x15\xee\xdb\x3b\x79\xff\xca\x41\x80\xc1\xbd\xdd\x97\xd0\xc9\xaf\xfb\xac\x58\x81\x49\x37\x68\x26\x80\x07\x6f\xe5\xa3\xba\xbb\x65\xd2\x8f\x25\x17\x03\x6c\x0c\xfb\x42\xf0\x29\x3e\xb2\xac\xb1\x39\x49\xfe\x91\xe0\xad\x06\x78\xaa\x24\x3d\x77\x34\xa8\x9d\x99\x78\x70\xbf\x9a\x6a\x58\x4e\xd6\xe6\x28\x16\x3e\x39\xd8\xaa\x61\x0d\x46\xb9\x28\x5b\x9e\x1d\xd7\xe8\xf8\x07\xfd\xf5\xca\x2b\xbf\x6d\xe5\xe5\xe6\x8a\xf7\xcb\x7e\xbd\x43\xec\xce\x22\x7c\xd7\x0c\x7b\xf4\xee\x14\x33\xed\xfc\xfe\x88\x66\x14\x67\x0c\xdd\x19\x63\x43\xfb\x91\xe1\x54\x16\xd2\xf6\xac\xba\xe3\xea\xdc\x03\x02\x31\xee\x9d\x2e\xcc\x52\xa8\x8c\xe8\xdc\x7d\x09\x8e\x7f\xac\x77\x68\x5b\x4e\xb5\x40\xe3\x01\x93\x07\x14\x32\x21\xb8\xef\x77\xf3\x63\x2c\x89\x3d\x55\x6e\x0b\xb7\x43\xa1\x96\x3e\xc1\x58\x86\xc8\x54\x5e\x87\xc9\x5c\xc8\x25\xf2\x00\xd0\xf3\xcf\x4f\x55\xa3\xd6\x60\xa5\x36\xa2\x3a\xef\xcc\x42\x8a\x43\x20\x34\x85\xee\x84\x34\x2f\x5c\x00\x1e\xe8\x40\x4e\x75\x90\x17\x00\x62\x82\xab\x8b\xa8\x90\x3e"}, +{{0x00,0xe6,0xbb,0x17,0xaf,0x3c,0x2d,0xf6,0x52,0xb3,0x4f,0x9a,0xbe,0x19,0xf9,0x90,0x19,0x07,0x42,0x33,0x68,0x6c,0x71,0x14,0xe3,0xa0,0xed,0xf0,0x83,0x09,0x93,0x4f,},{0x7b,0x82,0x32,0xa6,0x6c,0xec,0x2f,0x91,0x5a,0xaa,0x79,0x51,0xd2,0x9d,0x2b,0x9e,0xe9,0x3d,0x32,0x1d,0x15,0xb2,0x03,0xc5,0x1e,0x61,0xe8,0xce,0x83,0xd1,0x87,0xf8,},{0x04,0xb3,0xb8,0x50,0x1e,0x39,0x6c,0x4a,0x78,0x8e,0x14,0xac,0x49,0xf6,0x17,0x4c,0xdb,0x5c,0x85,0x5e,0x65,0x12,0x03,0xcf,0x68,0xd1,0xef,0xa8,0x9a,0xa5,0x86,0x78,0xd4,0xd1,0xf3,0x03,0xa9,0x87,0x7a,0x37,0x86,0xd2,0x03,0xc3,0x55,0xb0,0x9d,0x52,0x86,0xc1,0xca,0x0d,0xf0,0x4a,0x89,0xaa,0x06,0xcc,0x3f,0x9d,0x0f,0xd3,0x05,0x04,},"\x06\x32\x81\xe4\x1e\x8b\xa9\x70\x3e\xd0\x9e\xf3\xbf\x0e\xa4\x6e\x4c\xab\xdd\x6e\xbd\x76\x9d\x05\xdc\x04\x5d\x4f\x99\x0d\x69\xfc\x55\x41\x30\xa4\xe6\x1a\xa2\x1e\x2d\xe4\xc9\x2d\xb4\x8a\x20\xa3\x7b\x17\x47\xa7\xea\xc5\xeb\xb2\x73\x5a\x89\x38\x19\x7f\x13\x9f\xad\x14\x97\xb3\x51\xad\x06\x4c\x0f\x18\xf8\xfa\xf1\xfe\x11\xf6\x39\x79\xa6\x99\x68\xe2\x4c\xf9\x1e\x58\xa3\xab\x03\x26\x69\xe4\xef\xee\x27\x4f\x96\xb5\x8b\xe7\xd9\xe3\x91\xf3\x6f\xcf\x07\x09\xb2\xcb\x2d\x22\x69\x4a\x6c\xeb\x17\x24\x69\x45\xeb\xb3\xbc\x7f\x0f\x03\xbf\x0b\x08\xdc\x96\x26\xe3\xe7\x15\xc9\x91\x67\x1d\x53\xeb\xb9\xae\x83\xa7\xd0\x8d\x44\xf6\x36\x35\xc4\x0f\x8d\x48\x17\xf5\x8d\xe9\xeb\x77\xcb\x25\xb2\xac\xd6\xde\xf9\x69\xab\x56\x9e\x97\x4a\x8a\xda\xc1\x1a\x86\xb5\x8f\xe6\xc1\x00\x67\x49\x9f\xc9\x14\xdf\xf5\x69\x02\xcb\xc3\x93\xa7\x1c\xc2\x5e\x8f\x05\xc0\x3c\x94\xf1\x3b\x84\xa2\xb0\x1a\x58\xc1\x0d\xbc\xbb\x60\xeb\xce\xe4\x87\xf5\x29\x17\x74\x66\x29\x99\x25\xda\x50\xe2\xda\x5b\x55\x57\xf0\xae\xee\x3f\xd7\xf4\x7b\x5c\x2e\x3f\x84\xce\xfa\xb4\x67\x96\x91\x39\x4d\xd1\x22\x30\x3b\xb7\x69\xaf\xb3\xad\xfe\x83\x58\xb0\x2b\x67\x92\x73\xb3\x5a\xbd\xc6\x40\x25\x76\xcc\xce\x5e\x10\x44\x2a\x13\x7e\xf9\x45\x69\x39\xb2\x89\xef\x4e\x41\x7b\x1c\xc6\x23\x9f\x7c\xee\xdd\x68\xf1\xa8\x26\x41\x80\xe0\x68\xb4\x96\x6f\xd6\x7f\x2b\xad\x6e\xdd\x8b\x4a\x1e\x8d\x2b\x54\x2d\xaf\x26\xdb\x83\x1f\x1f\xb5\x1e\xb8\x6f\xfa\xde\xcc\xd9\xac\x3d\x66\x4f\x34\x6e\x7d\x04\x6c\x33\xa5\x72\x84\x1e\xa8\x33\x4e\x7f\x2f\x41\x7a\x05\x71\x2a\x9e\x33\x4e\x48\x7f\xd3\xae\x17\x54\x55\x16\x2f\xe8\xf4\x9c\xc0\x26\xa6\x40\xc6\xcf\x93\xcf\x58\x87\x50\x52\xf4\x1c\xc9\x82\x06\x15\x65\x3e\xa2\xd0\x84\xc8\x96\xea\xfe\x5a\xd4\x72\x55\x79\x65\x30\x84\x99\x4f\x95\x6d\x5c\x94\x59\x0a\x24\x09\x58\x1b\x6f\xc8\x6e\x40\xaa\x58\xbf\x6e\x60\x57\xa6\xf9\x0a\xf3\xb8\x7a\xea\xf3\x29\x94\xa5\x5a\x54\xf7\x9b\xdf\x3d\xbb\xf5\xce\x0f\xf8\x12\xe4\x86\xb0\x54\x5d\x9e\x9c\x2b\x0b\xce\x0d\x4c\x36\x47\xb1\x82\x72\x62\x49\x88\x34\xe1\x98\xa3\xec\x70\xf3\xb0\x3d\x6a\xad\x2c\x49\xeb\x80\xb5\xe2\x05\x14\x39\x22\x5f\xd9\xce\x94\x68\xd6\x9a\xf7\x0a\x26\x2e\xe3\xb8\xb6\x2a\x8e\x5b\x41\x34\x6d\xa3\x01\x2f\xfb\x45\x81\x6b\x7b\xec\xb0\xe7\x9a\x60\xbf\xf7\x16\x36\xa3\xe4\xbb\x1b\x35\xca\xf1\x95\xf5\x51\x17\x28\x0f\x78\x72\x17\xb3\xca\xa2\xe7\x93\x72\x6f\xc5\xa7\x4d\x11\x60\xdc\xad\x86\x89\x04\xc1\x97\x38\x11\x34\xed\x8c\x3d\xb3\x75\x0b\x75\x56\xf6\x9c\xcc\xe1\x8b\x77\x38\x8b\x58\xc5\xb8\x11\x3e\x59\x0a\xd6\xea\xc5\xb9\x1e\xce\x5a\x67\x05\x02\x5c\x80\x35\x3c\xeb\x1e\xd8\x4a\xaa\x1c\xc4\x8a\x41\x6b\xc0\x16\xae\xf1\x73\xbb\x80\xb2\xba\x28\xc5\x79\x60\xc6\xb0\x11\xb6\xb4\x95\xa3\xf3\x31\x1e\x79\xfe\x46\xbd\xb6\xa4\xc3\x81\xfb\x9d\xc4\x62\x8b\x0a\x83\x02\x35\x58\xf1"}, +{{0xfb,0xdd,0xf6,0xe6,0x1e,0x20,0xd8,0x06,0xe5,0x59,0x17,0x75,0x6d,0xe6,0x0d,0x0c,0x9a,0x99,0x97,0x6f,0x64,0x67,0x16,0xff,0x2f,0xf1,0x31,0x2c,0x54,0xdd,0x97,0x1d,},{0xac,0x53,0x8f,0xab,0xad,0x43,0x80,0xe6,0x0e,0x97,0x71,0x26,0xe7,0x69,0x5e,0xed,0xa5,0x41,0x7d,0x85,0xf7,0xd2,0x3d,0xb2,0x1b,0xd0,0xad,0x11,0x11,0x16,0xf0,0x5d,},{0x8c,0x9b,0x77,0xaa,0x0f,0x1c,0xf5,0x2e,0x8f,0x7a,0x91,0x8b,0x21,0xb4,0x68,0xe6,0x23,0x35,0x91,0x1b,0xc5,0x93,0x06,0xb3,0x0c,0xe7,0x7b,0xf6,0x92,0xc1,0x10,0x59,0xb0,0xee,0x9c,0x5d,0xaa,0xf6,0x83,0x9b,0xb8,0x13,0x73,0xc6,0x1d,0x28,0xd0,0x72,0x70,0x2b,0x59,0x5e,0x4d,0xce,0x28,0xcb,0x99,0x38,0x22,0xb2,0x48,0x13,0x04,0x0b,},"\x3e\x99\x53\xca\x55\xd0\xcd\x23\x3b\x98\x83\x3e\xb1\xbc\x79\xd3\xb5\x5f\x18\xc8\xfa\x1c\x42\x02\x7b\xca\x25\x57\x91\x53\xb5\x5d\xa0\xc5\xa1\x78\xb8\x38\x69\x56\xd9\xa5\x41\x83\xb2\x4c\x91\xdc\x4b\xe9\x94\x84\x72\x37\xd3\x66\x6a\x0a\x01\x30\xfe\x19\x92\x4b\xc0\xee\x50\x89\x6c\x35\xa2\xe1\x6a\x29\xe2\xe2\xac\xf1\x80\xbd\xd9\x37\x93\x54\x68\x7f\x0e\xce\x68\x82\xd2\x6e\x98\x0e\x68\x66\x98\x04\x3b\xb1\xb0\x12\x13\xaa\x64\x4a\x4f\x8d\x61\xf9\xb6\x13\xe6\x2e\xaa\x35\x76\xce\xa0\xb0\xb8\x3f\x05\xce\x25\x58\xff\x63\x56\x49\x5c\x45\xed\xe4\xa8\xf6\x5b\x81\x4a\xb8\xa7\x30\x94\x03\xdf\xd4\x3c\xbe\xa9\x08\x93\x93\x9b\x78\x00\xaa\x00\x23\x2b\x5f\x6b\x77\x14\xeb\xdc\xd8\xbc\xf3\x4a\x5a\x7e\x82\x2a\xc7\xb1\xb0\x99\xac\x61\x5f\x13\x5f\x8c\x35\x1d\xc4\x1a\xe5\xf6\x6d\x5f\x9c\x26\x00\x45\x4c\xa0\x1c\x00\x9b\xa6\xde\x04\x16\x2a\xe5\xf1\xf2\x70\x89\x3c\xa3\x90\x7a\xff\x7f\x78\xe0\x33\x96\xe3\x2b\x62\x2f\xf3\x40\x53\x7b\xf1\x23\xe5\x59\x95\xe9\x20\x96\x09\x33\x0b\x2e\xee\x51\x12\x74\x84\xa4\x0e\x25\x07\x00\x82\x3f\xeb\x0b\xc9\x7b\xb5\x09\xff\x73\x26\x75\xde\xc3\x2e\xcb\x63\x5e\xd9\x2c\x7d\x78\xfe\x30\x50\x20\x0c\xf1\xd9\x41\xd6\xb3\x88\x80\x0a\x84\x19\xd9\x6a\x59\x5e\xce\xd5\xec\x4e\xfd\xcb\x6f\x98\x7f\x54\x72\xa5\xc4\x30\x58\xd3\xa3\xa7\xbb\x56\xd7\x98\x03\x65\xed\x43\xdb\xc2\xbe\x48\xf1\xd1\x8c\xe7\x6a\x89\x18\x54\x26\xfd\x5c\x69\xdf\x7e\x92\x91\xab\x78\x23\xc2\x3a\x76\x94\x1e\xd3\x83\x6a\xac\x7b\x58\xc0\xd5\xfb\x6b\x63\x6c\x42\x47\x1a\x4d\x17\x03\x51\x6f\x03\xe9\x35\xf3\x1f\x19\x54\x50\xe5\x37\xb2\xa0\x7d\x54\x5b\xa4\xb6\x8a\xfb\x06\x38\xc6\x5b\xb0\xff\xaa\x0c\xfd\x69\xd7\x10\x48\x19\x79\x66\x19\xd4\x83\xa0\x24\x5b\x4f\xd9\x01\x7f\x62\xa7\xd3\xa5\xfc\x3b\x72\x89\xd7\x57\x35\xf2\x87\xca\x0a\x95\x1a\xd5\x83\x44\xb2\xab\x7d\x7d\xf8\xdb\xd7\x92\x2a\x5a\xbb\x8d\x7c\x2e\x79\x14\x7e\x6d\x36\xee\x31\xf9\x30\x47\x3b\x07\x27\xdc\xfd\x58\xd6\x44\xd7\xd7\x0a\x0e\xd3\x1c\xa6\xa1\x3e\xd9\xdb\xd2\x24\x49\x2e\xfd\xa1\x9e\x4f\x8e\xed\x46\x18\x0f\xe7\x50\xf0\x7b\xbe\x8e\x99\x85\x4d\x13\xf5\x8b\xa9\x68\xce\x38\x59\xd6\x11\x89\xcd\x2b\x66\x7f\x3b\x2d\x06\x65\xb5\x74\xc4\xba\xc1\x9d\x9e\x37\xe5\xb7\xa8\x0e\xb3\x34\xe3\x68\x10\x53\x0a\xa5\xd1\x76\x63\x93\xf8\x11\x5a\x52\x09\x0c\x91\x82\x34\x28\xc8\x97\xa5\xf3\x5e\x12\xa8\xaf\x2c\xd4\xfb\x13\x90\x7c\xa6\x60\x3a\x4f\x76\xf5\xc2\xe0\x23\x74\xa8\xdc\x3a\x47\xc1\xbe\x6f\x1d\x1c\x8e\xbc\x59\xb3\x6d\x1c\xfa\x0a\xb2\x3e\x9b\x0a\xe9\xb0\xe6\x37\xee\xed\xb9\xc6\x6b\xea\x62\xdc\x63\x0c\xde\xfa\x71\x82\x39\x61\x7e\x31\x18\xe5\xb6\xde\xb7\xc2\x94\x47\x52\x82\xe8\xab\xe2\x4f\xd5\xa5\x4b\x78\x6f\xff\x90\x28\xc5\xa0\x33\x38\x4e\x4b\xc8\x01\x4d\xec\x8d\xa1\x00\xa9\x4b\x17\x8e\xf8\x8e\xc3\x57\xb6\x6d\x2b\x90\x98\xab\x64\x79\x16\x96\xb1\xa6\x6b"}, +{{0x8a,0x55,0xe7,0x7b,0xb0,0xc8,0x74,0x0b,0x8c,0x2e,0x8d,0xdf,0xdf,0xdb,0x40,0xf2,0x7e,0x45,0xfe,0x81,0xfe,0x45,0x71,0x11,0xbf,0x1c,0x87,0x30,0xea,0xb6,0x16,0xb4,},{0x9f,0xf1,0xfd,0x0c,0x50,0xeb,0x24,0xf9,0x9f,0xe2,0xf7,0x71,0x1d,0x52,0x87,0x2d,0xfc,0x90,0x03,0x80,0xdd,0xdc,0xdb,0x86,0xfe,0x6f,0x4a,0x5f,0x35,0x0a,0x87,0x43,},{0x8a,0xae,0xba,0x53,0x5c,0x51,0x1c,0x31,0xd3,0xf8,0xe9,0x5c,0xb0,0x77,0xa9,0xa7,0xec,0x7d,0x08,0x44,0x1e,0x53,0x42,0xa6,0xab,0xe0,0xbf,0x2a,0x5d,0x7f,0xc9,0x30,0xb4,0x3d,0xac,0x3d,0x1e,0x8e,0xf2,0xcb,0x03,0x45,0x52,0xeb,0x4d,0x08,0x39,0xbc,0x8b,0xf2,0x94,0x55,0x1d,0xd2,0xd8,0x0c,0x53,0xfd,0x62,0x79,0x35,0x1a,0xc2,0x0c,},"\x20\xfb\x41\x4e\x26\x4a\x95\x47\x84\xf1\x12\xba\xce\x7e\x04\x74\xb3\x9c\xb3\xc9\xe5\x3d\xee\x0a\x21\xf4\xcf\x6d\x4a\x99\xb9\x34\x7d\xdf\xfb\xe2\x81\xa6\xc2\x30\xa7\x5d\x63\xa7\x2f\xd0\x5f\x6d\xb5\x3e\xa7\x01\x4e\xf7\x70\x9d\x18\xff\x97\x0f\x48\x5f\xe8\x3b\xa1\xd3\x71\x47\x33\x8a\xde\xd6\xda\x4c\xfd\xac\xc1\xe6\x9d\x2f\x3e\x0e\xf3\x62\xf4\x7b\x5b\xcf\xb7\x8a\x1e\x17\x9e\xb5\xc5\xb1\x06\xc8\xd8\x2a\x0a\x0b\x29\x0d\xf0\x75\xab\x27\x43\x69\x29\xcd\xe6\x56\xf0\x23\x09\xf9\x57\x50\xeb\x67\x65\x83\x26\x2e\x5f\x2f\x69\xf0\xff\x72\xa8\xe0\x57\x26\x63\x82\x26\x92\x05\x31\x87\x40\xbf\xe0\x6b\xf5\xc2\xcb\x45\x33\x90\x8e\xf9\xf9\xf2\x86\x9a\x75\xb9\x53\x35\x79\x82\x0e\x3b\xc0\xca\xff\xd6\x46\x17\x1c\x82\x86\xc3\xa4\xab\xa1\xff\x09\x15\xd9\x36\x11\x20\x5e\x23\x0f\x39\xff\x4c\x4c\xaf\x3f\x33\x3e\x75\x3f\xce\x2b\x71\x21\x3e\x53\xd6\x08\x41\x5e\xe1\x7f\xd4\x82\x12\xee\xdd\x88\x40\xf3\x37\x10\x1e\xf0\xd0\xb6\xf7\xbe\x4b\xff\xc0\x6e\xee\xfe\x80\x66\xdd\x27\xa0\x54\x1a\x46\x88\x31\xac\xdd\xc4\x90\x2e\x2f\xef\xef\xbe\xd1\x9c\x30\x8e\x56\x21\xe0\xbf\x46\xbc\xd5\x38\xaa\x13\xfa\xf0\x4d\x38\x07\x59\xc0\xe1\x07\xe9\x12\x00\x18\x39\xdf\xd0\xb6\x35\x44\x0e\x96\x38\xf5\x37\x7c\xa8\x45\x0f\x35\x0c\x01\x12\x9e\xe3\x37\x64\x41\x5c\x53\xcb\x2f\xfb\xf9\x68\xdf\x78\xb7\x42\xfd\x06\x65\xe7\x8a\x34\xab\xf4\xde\xcd\x1f\xd3\x86\x28\x9a\x13\x64\xe6\x45\x55\xee\xc5\x8b\x0a\xf9\xa4\xcd\x6b\x36\xd1\xd5\xc6\x11\xa2\x84\x6d\xfb\x55\x89\x34\x4b\xbb\xb0\x25\x60\x24\x1b\x74\xb9\x93\xa2\x5b\xef\x50\xfb\x1e\x73\x19\x08\x6e\x6a\x23\x98\x63\x00\x83\x4e\xd2\xdb\xa9\x8a\x16\x87\x21\xc2\xf7\x84\xdf\xb8\xd3\x80\x0d\x06\xa0\x54\xae\xf1\x4d\x17\x72\xb6\xc5\x74\xaf\x25\x63\xd1\x93\xef\x2e\x51\xbd\xc6\x2d\x2a\xbc\xe2\xee\xbe\xad\xa7\x92\x03\x49\x8e\x66\x86\xc2\x87\xf3\x7b\xd8\x8a\xeb\x16\x6f\x7d\xff\xc3\xe6\xad\x02\x94\x11\x7e\xf6\xee\x9d\xa8\x47\x9e\xd8\xa1\x6f\xe9\xbe\x24\x6d\x26\x68\x04\xf2\x96\x58\xdb\x75\xe7\xa0\x87\x3b\xe7\x1d\xc7\xd4\x07\xe3\x9f\xab\xd6\x6f\x98\x8b\x45\x74\x77\x42\x7f\xad\x81\x30\xf0\x9a\xb6\x65\xf1\x59\x7c\x90\x46\xe7\x37\x3a\xf9\xa8\x35\x2a\x86\x83\x0c\xb9\x2a\x80\x44\x88\x70\x0f\xe6\x89\x19\x24\xfe\x2a\x72\x01\x73\x3d\x95\xe5\x91\xee\x0a\x1f\xef\x1c\x26\x36\x07\x8d\x37\x0e\x7a\xd3\xb6\xa9\x44\xfe\xd2\xcf\x2b\x30\xab\xa2\xd5\x6f\x34\x95\xb2\x84\x9c\x03\xbb\x61\x4f\x48\xbc\x4e\x50\x7c\x39\x5a\x6c\x35\xd3\xee\xd4\xc7\xbe\x8e\x68\x0f\x2d\x45\xa3\x10\xb1\x87\xeb\x88\xcf\x0e\x8e\xd4\xde\x7d\x37\x24\x6a\x50\xa6\x36\x7b\x97\xee\x37\x84\x32\x2c\x0b\x71\x13\x1a\x28\x31\x98\xda\x48\x04\xde\x75\x1d\xcf\x70\xc4\xba\xd0\x0d\xd9\x8d\x87\x3a\x69\xdd\x1a\x09\xcf\x69\xdd\xfa\xd7\xae\x60\x35\x00\xb6\xa4\x62\x25\x80\x98\xd8\xb6\x6b\x85\x29\x35\x94\xe2\x08\x82\x9b\x52\x28\xfa\xe2\xfa\xfc\x39"}, +{{0x16,0x3b,0x0c,0xb6,0xa1,0x2e,0x8f,0x07,0xb0,0xc2,0x9d,0x6a,0x63,0xf6,0xa6,0x52,0xce,0x49,0x72,0x70,0xb5,0xe4,0x6f,0xcf,0x83,0x3c,0x99,0xbd,0x84,0x3f,0x8c,0x64,},{0x68,0xa3,0x5d,0xe4,0xba,0x6f,0x0f,0x82,0xec,0xf4,0xb1,0xe0,0xdf,0x8e,0x24,0xcb,0x4f,0x18,0xf2,0x10,0x3f,0xf0,0x4d,0xc1,0xb5,0x33,0x39,0x91,0xb6,0xd3,0x14,0xba,},{0x17,0x73,0x8f,0x57,0x26,0x55,0x07,0x80,0x65,0x1d,0x60,0x19,0x9f,0xda,0x39,0xd9,0xc4,0x76,0x8d,0xb5,0x91,0x7e,0x32,0x39,0x36,0x31,0xc5,0x4a,0x41,0x9d,0x59,0xf1,0x8e,0xf9,0x60,0xdd,0xd4,0x39,0x38,0x0d,0xab,0xc3,0x14,0x76,0x1b,0xd0,0xcd,0xb5,0x7c,0xce,0x48,0x1e,0x61,0x09,0xfe,0xd0,0x95,0xde,0xa6,0xe8,0x65,0xaa,0x67,0x0b,},"\x56\xa1\x60\x3f\x72\x5b\xe0\x76\x13\x05\x8c\xdb\x3a\xcd\xc5\x23\x54\xe3\xbb\x1f\xf2\xbe\xd1\x3f\x89\x51\x75\xb1\x5c\x8c\x5a\x90\xff\xbe\x46\xb1\x1a\x06\xcf\xe3\x62\xda\xdf\x73\x23\xc9\x40\x41\x72\x55\xaa\x7a\xa5\x43\x12\x10\x3e\x71\x46\x3d\xaa\x0b\x5c\xda\xeb\xd0\xbe\x72\x3c\x73\x22\x73\xe3\xc3\xf5\xbf\x7a\xa3\x51\x9d\x69\xdf\x6f\x47\x70\xda\xa1\xdf\x82\x80\xbb\x3c\xd2\xc7\x14\xac\x03\x02\x00\x54\x65\x79\xf5\x6c\x60\xb9\x1a\xe1\x1f\x4c\xf8\x74\xa3\x5f\xc5\x9b\x35\x4b\xed\x80\xf5\x6e\x11\xa6\xcd\x62\xa8\x8c\xe6\xb4\xf6\xbf\x39\xd6\x4c\xe3\xd8\x04\x09\x82\x5f\x90\x16\x2c\x3d\x96\xd1\x0e\x47\x86\x07\x36\x5f\x7a\x24\x1e\x71\xaf\x98\x00\x42\xfe\xc2\xd6\x88\x91\xe0\xc8\xa3\x7c\x58\xec\x4e\x60\x0f\xd5\x81\xe7\x90\xb0\xaa\xe8\xe0\x9f\x35\xd4\xcc\x18\x76\xdf\x43\x4b\x80\xee\xe0\x53\x69\xf8\x48\xfc\x49\x30\x57\x7d\x16\x84\x27\x58\x88\xf3\x25\x9c\xb4\x73\x76\xc5\x16\x9c\x99\x37\xf8\x55\xa9\x6a\x9e\x74\x8a\xd0\xa6\x9a\xe4\xab\x2f\x2f\x17\x44\xa3\x92\xf9\xac\xc6\x20\x99\x75\xb7\x84\x98\x4c\xb1\x2f\x98\x29\x2c\x36\xa5\x32\x21\x99\x4a\xbc\x56\xf9\xa6\x6d\xae\x45\x60\xb7\x93\x56\xff\x47\xe1\x28\xc0\x79\x6a\x7f\xb0\xe0\xbb\xc9\x60\x0a\xf4\x8e\x49\xea\xa9\x42\x7c\xf6\xeb\x66\x20\xb1\x0c\xd2\xc0\x85\xb0\xb3\x42\x00\x4d\x5b\x0d\x3e\xdc\x11\xd2\x92\x42\xa4\x63\x87\x80\x76\x2c\x9d\xc6\x06\x9b\x66\xbd\x84\x97\x3b\x50\x11\x96\x1c\xe5\x6d\xb5\x8b\xda\xf4\x8e\x6b\xe1\x2a\xb9\xad\x24\x41\x62\x97\x00\x4d\x02\x91\x4b\x95\x9f\x54\xe0\x92\xf8\xcd\x43\x65\xfa\x6a\xb7\x8d\xdb\xff\x4c\xe8\xda\xd4\xe2\xf5\x3a\x05\xc0\xcc\x49\x9b\xfb\x47\x81\x4a\x27\x13\x55\x1d\xcd\x19\xd4\x47\xf6\x27\x57\x6e\xa4\xea\x4b\xbd\xa8\xba\xe1\x8a\x64\x65\xce\xd7\x47\xea\x17\x18\x0b\x00\x9f\x01\x21\x21\x60\x48\x2b\x04\x33\xaa\xc6\x8e\x67\x64\x4d\x00\xf4\x1f\xdf\x99\x90\xb9\xe1\x11\x17\x63\x4d\xeb\x13\x9b\x1a\x40\xad\x3f\xce\x42\x99\xa1\x7f\xe1\xdd\x22\x53\x01\xc7\xf8\xd8\x01\x0a\x79\x6d\xc7\x9c\x13\x30\x7d\x3f\xf9\x92\xa8\x8b\xe6\x64\xd4\xc8\x86\xd6\x8c\xa9\xe4\x47\x0c\xfb\xe6\x3e\xbf\xfc\x42\x40\x10\xe3\x72\xb6\x92\x2a\xa9\x5c\x80\x1d\x1e\x94\x06\xda\x4b\xc1\x88\xca\x82\x06\x64\x05\xbc\xdb\x3e\xaf\xc9\x37\x62\x9b\x32\x63\xdc\x7d\x50\xee\x52\x78\xcc\xec\x6f\x11\xd5\x51\x7f\x56\xbc\x26\x9c\x87\x36\x91\xe7\xeb\x53\xfa\xef\xf0\x75\x64\xab\x46\xb4\x03\xf1\x5d\x9e\x0e\x69\x24\x86\xee\x09\x8e\x7b\x51\xb4\x28\x13\x46\x9b\x82\x35\x04\x22\x33\xca\x3f\x9c\x4f\x8f\xf2\x4a\x57\x1f\x47\xe0\xad\xf9\x14\x4a\xea\x48\x8a\x2d\x2d\xd0\x01\xe3\x1f\xc9\x61\xe0\x5c\x3e\x85\xf0\xd9\x81\x40\x7c\x87\x31\x58\xbb\x0d\x35\xba\xfe\x4b\x60\x42\x2e\x67\x55\x1e\x97\x01\x65\xce\x3f\xc5\x99\xd0\xfc\xc9\x2b\x16\xac\x36\xa9\x2b\x2c\x1d\xc6\xb3\xf0\x33\xfe\x31\x0c\xd1\x96\xda\x04\xa4\xe6\x39\x03\x11\x77\xcd\x27\xd7\xc2\xfb\xec\x65\xa0\x0b"}, +{{0x8c,0x83,0x93,0x81,0xb6,0xa7,0xce,0x26,0x49,0xc1,0xea,0x46,0x4a,0xe3,0xc2,0xd3,0xfd,0xb1,0xec,0x66,0x6d,0x7b,0x4b,0xe4,0xe2,0xa9,0x41,0xab,0x6d,0x65,0x57,0xa7,},{0x5c,0x72,0x4a,0x30,0xc6,0xfb,0x32,0x81,0x53,0x43,0xa8,0x0d,0xde,0xe6,0xee,0xe5,0x44,0x51,0x64,0x18,0xea,0x95,0xe1,0xba,0xc8,0x0a,0xfc,0x80,0x40,0xd6,0x3f,0xc6,},{0x5d,0x21,0x10,0xd1,0xd2,0xf3,0xed,0xd6,0x83,0xbd,0xfd,0xbe,0xa3,0xff,0xa7,0xcf,0x55,0x28,0xa4,0x0b,0x8b,0x3d,0x8d,0x8c,0x9b,0xfd,0x22,0xae,0xac,0x28,0xba,0xd4,0x71,0x66,0x6e,0x06,0x2f,0x7d,0x38,0xce,0xda,0x8b,0xb3,0x73,0x97,0xa1,0xc5,0xc3,0xf7,0x33,0xb5,0x37,0x96,0x70,0x45,0x70,0x64,0x78,0x43,0x7d,0x4d,0x18,0x7a,0x0a,},"\xcb\xcf\x89\xc3\x54\x89\x64\xc3\x8d\x70\xfd\x8f\x68\xe8\xec\xe3\x6c\xc3\x97\x55\xc9\x71\xd1\x4d\x7e\x05\x6f\x39\xb0\x23\xef\x16\x6d\x17\xf2\x43\x85\x22\xf0\x10\xd6\xd8\x35\xd8\x86\xe7\x1f\x47\x4c\x67\x27\xa4\x22\x1f\xd0\x3a\x75\x74\x57\x82\x89\xed\x54\x93\xac\x4c\x09\x47\xe3\xf4\x28\xd8\xfe\x06\x40\x06\xa2\x56\xce\xf2\x18\x11\xd7\x26\x78\xf5\xdf\xc6\xba\x66\xac\x29\xec\xd1\xb3\x2f\xf5\x55\x7c\xb0\x8c\x5f\x13\x05\x59\x21\x7a\x04\x13\xb7\x59\xc2\x4d\x83\x38\x8a\x2b\xb9\xb2\x9b\x6b\x91\xd1\xf3\x10\x1e\xd6\x25\x21\x1e\x4d\x73\x80\x51\x93\x47\x8c\xf9\x95\x39\x6c\x10\xb1\xc5\xaf\xfa\xcb\x00\x89\x9d\xa0\x4e\x3c\xce\x19\x3b\x49\x4e\x2a\x93\x3c\x4e\xeb\xe0\xa3\x7b\xfb\x8f\x1b\x83\x71\xbd\xe5\xfd\xa0\x9e\x80\x4e\x94\x0f\x34\x48\x96\xa5\x29\x46\x7a\xde\xe4\x5a\x8f\xeb\xf8\x5a\xb0\x36\xca\xb8\x80\x14\x3b\xe4\xf5\x9b\x77\x41\xd8\xe4\x50\x27\x8b\x06\x36\x55\x78\xd4\x0b\x19\xdc\xec\xc6\xe1\xee\x3d\xa3\x4a\xb2\x90\x13\xfa\x3a\xf7\x72\x92\x72\x96\x21\x10\xe3\x85\xab\x9a\x02\x2f\xae\x41\x46\xf8\x97\x16\xf7\xba\xb9\xd3\xdc\x68\x2f\x4f\xac\x77\x36\xd3\xe0\x89\x73\xc6\x85\xbb\xb2\x75\xbb\xf8\xf2\x17\x41\x9e\x5c\xae\x02\x19\xeb\xa5\x16\x6a\x5d\xe1\xb1\x1e\x3f\x9a\x90\x8b\x8a\xc7\xe6\x5b\xcd\x62\x3f\x8c\x18\xbb\x02\x4f\x60\x5d\xcb\xac\xda\x79\x0d\x83\x62\x95\x74\x44\xa9\x5c\x13\x0a\x37\xee\x9d\x56\x3d\x0c\xbb\x4c\xb2\xb0\xff\x71\x59\x1d\x93\x90\xb6\xc8\xfc\x28\x75\x3a\x0e\x40\x2d\x64\x87\xcf\xac\x60\x71\x35\x92\x7d\x89\x26\x75\x12\xb3\x4f\x87\x70\x57\xd9\x27\x1b\xcc\xc0\x24\xdf\xed\xcc\xc6\xc3\x2e\xdf\x75\xc8\xb7\x55\x1c\xdf\x80\x15\x4e\xe8\xe0\x8a\x0c\xc4\x30\x44\xe1\x03\x6b\xae\x01\x7e\xb4\x8b\x65\x02\xc7\xa9\xd6\x0c\x8b\x37\x0c\xf3\x79\x9c\x46\x4f\x96\x4a\x69\xee\x65\x95\x01\x22\x3e\x78\x9a\x64\x97\xb6\x34\x96\xdf\x1a\xda\x2e\x80\x8d\x24\x34\xfc\x8b\xb9\x79\x4e\x5e\x2a\x20\xbb\xf4\xd6\x92\x5c\xb3\xc5\xbb\x14\x84\x2f\x19\x20\x09\x05\xba\x93\x54\xe0\x0d\xc3\x3c\xff\x5b\x42\xd4\xe9\xd9\x66\x8b\x34\xe6\x61\xd4\x4b\xef\x76\xfe\xfe\x2e\xd5\x1f\x94\x42\x3a\x93\x3a\xc9\x4f\x15\x23\xbf\x37\x82\x3a\x23\x8d\x61\x6c\x6b\x17\x97\x34\x41\xe3\x5f\x94\x05\xa0\x4d\x99\xea\xa8\xf5\x04\x53\x4c\x8b\x5f\xa5\xe8\xe3\x35\xc7\x43\xbc\xf2\x1f\x5d\x49\x2b\x71\x12\xe0\x0f\xd8\x64\x2c\xb1\x2b\xfe\xc8\x49\xdf\x62\x12\x0d\xbb\x06\xbf\xc2\x94\x6a\x56\x01\xe2\x5b\xe7\x50\x11\xc6\xf0\x0c\x65\xd3\x5f\x44\xa4\x6a\xf9\xe4\xf7\x80\x9e\x57\x89\xa3\xa6\x1b\xa0\xa3\xb2\x13\x89\x04\x97\x29\x6c\x81\xe4\x2e\x88\xf0\xec\x0f\x5d\xef\xc1\xf5\xd3\x9f\xf2\xa4\x8b\x7e\x30\x26\xc9\xe5\x47\x20\x2e\xdc\x7e\xb7\x38\xc3\x4a\xd3\xa1\x5d\x37\x3e\xf8\x2a\x4c\x1d\x18\x1f\x28\x5a\x98\xbd\x33\x14\xc2\xc1\x94\x7c\x9e\x2c\x60\xac\xa5\x17\x50\xee\x7f\x94\x3c\xaf\x0c\x4e\x1e\x5c\x7d\xf7\x29\x1e\x97\x3b\x1f\x93\x6b\x73\x70\x76\x19"}, +{{0xaa,0xbb,0xb2,0xef,0xed,0xb5,0x99,0x42,0x4a,0x5f,0x3e,0x08,0xf9,0x0f,0xa8,0x82,0x6c,0x5c,0x92,0x17,0x0b,0xe5,0x01,0xa1,0x18,0x1f,0xe8,0xe8,0xdf,0x97,0x4e,0x0e,},{0xce,0x73,0x19,0xef,0x88,0xb2,0x42,0x42,0x06,0x66,0xca,0x69,0x7b,0xa8,0x50,0x1d,0x27,0x4e,0xc4,0xa5,0xdc,0xf8,0x44,0x59,0x66,0x08,0xb9,0xdd,0x5a,0x8a,0x3a,0xcd,},{0xa0,0xb1,0x9c,0xfa,0x6c,0x80,0xde,0x77,0xbf,0xcd,0x32,0x10,0x30,0xbf,0x8c,0x03,0x89,0x3e,0x2b,0x21,0xac,0xe6,0xc6,0xba,0x1f,0xf7,0x40,0x8e,0x6f,0xf0,0x7d,0x84,0x7e,0x6b,0x2b,0x68,0x8d,0x4f,0xd5,0x1a,0xa9,0x32,0x70,0x1d,0xb6,0x40,0x2e,0xf2,0x23,0x22,0xe6,0xe9,0xfc,0x7e,0x32,0x0a,0xbb,0x4d,0x24,0xe1,0xac,0xc6,0xcf,0x06,},"\xfc\xc1\x5c\xc5\x79\x70\x56\x9e\x9c\xcf\xa5\xa7\x78\xfc\x7a\xed\x71\x97\x8a\x3f\x56\x24\x57\x7b\x6f\x57\xfa\x3f\x16\x7e\xa2\x23\xef\x31\x76\x4c\x48\x8d\x05\x9d\x06\x53\x1d\x01\x6b\xcb\x17\xd5\x44\xd4\x69\x77\xaa\x24\x1f\x8e\x07\xaf\x47\x87\xa0\x81\x0f\x98\xd7\x66\x46\x0c\x08\x41\xad\x81\xb8\x8f\x4d\x5d\x81\x64\x48\x5a\x12\x58\xa9\x46\x22\xc5\x49\x24\x28\xd6\xd5\x75\x94\x37\x15\x76\x6c\x2b\x0a\x86\x5b\xed\xba\x16\x7d\x5d\x34\x0e\xdb\x57\x9c\x47\xaa\x32\x45\x9b\x8f\xc9\x8a\x79\xbb\x0b\xed\x1c\x96\x0b\x4c\xcb\x7f\x2d\x4b\x56\x81\xa2\xa7\x0d\x50\x5b\x85\xb8\x1e\x3d\x99\x67\x27\x14\xe4\xea\xb4\x1f\x3a\xb0\xca\x87\x4f\x41\x71\x86\xfe\xb6\x9e\xd1\x3f\xb9\x11\xf4\x9d\x15\x84\x75\x8b\x2d\x18\xb4\x67\x3e\xdf\xae\x49\x5e\x68\xda\xd5\x13\xa7\xac\x0d\x47\xb2\x75\x3c\xb4\xed\xa7\x8f\xb4\x31\xf0\x4d\xda\x8f\xe8\x03\x0d\x7b\xb4\xe8\xdb\xcc\xb9\x69\xd7\xf5\x80\xd9\xc1\xef\x93\x5d\x07\x4d\x7a\x41\xd1\xf8\xb9\xdc\x45\xc9\xa2\xe4\x10\x6a\x55\x29\xa9\x8b\x95\x52\x9a\xb0\xed\xea\x0b\x57\x22\xdd\x68\x6f\x5a\x7f\x3c\xd8\xfb\x26\x24\xab\x26\xc4\x2d\xf1\x1f\x51\x0a\x10\x3d\x8a\x92\x98\x30\xad\x85\xf5\x21\x24\xe3\xd5\x82\x7b\xa6\x0b\xfb\xcd\x73\x6c\xb6\xc5\x90\xee\x77\x7e\xad\x7a\xa2\x22\x4d\x7a\xe4\x6d\x25\x7a\x90\x40\x72\x47\x96\x0c\x9c\xb0\x38\x60\xae\xaa\x7f\x54\xc1\xa8\xe1\x11\x60\xd1\x1b\xb4\x73\x06\x5e\x19\xb7\x07\x21\xc8\xf0\x72\xe1\x90\x9d\x53\x9e\x9a\xc9\x41\x85\x90\x4b\xbb\xfe\x54\x87\x37\x54\xae\x1c\xa7\xbc\xed\x6f\x40\x56\x1a\xf4\xb5\x05\xf0\x3a\xc9\x72\xa6\xf0\xbf\xa7\x3b\x5f\x83\x2f\xe2\x3b\x89\x8b\x2b\xbb\x05\x74\xa6\x66\x2e\xe9\x3b\x3b\x36\x0d\xa1\xec\x7e\x83\x8e\xb2\xc7\x7c\x7c\xb7\xfc\x16\x4f\x7c\x46\x27\x01\x04\x89\xc8\x58\x90\x07\x52\xc9\x2d\x9d\x75\xad\x54\x71\x67\xe4\xbd\xd1\x1a\x07\xd2\x8b\x65\x1a\xa3\x0f\x16\xa8\x50\xe0\x60\xdd\x28\x82\xfb\x82\x09\x19\xa3\x98\xe8\x05\xeb\x63\x69\x9f\x4f\xf5\x95\xf9\x91\x52\x47\x31\x64\x1e\xce\x25\xfb\x3f\x8e\x89\xad\xa5\x01\x19\x2b\x1e\xdd\xae\xcb\xac\xc8\xb8\x98\x52\x8f\x2d\x5b\x33\x12\x69\x4f\x5e\xc2\xdc\x91\x42\xe1\x51\x3f\x77\x7a\x5c\x83\x34\x09\xc1\x71\x63\x3f\xf9\xfa\x26\x09\xd0\x49\x7f\x5d\xf4\xfb\xf4\x8e\xf2\xb7\x7d\x55\xe2\x55\x19\xd2\xee\x79\xb5\xfe\x9d\x8f\xa4\x60\x00\xde\xcd\xb4\xf2\x5d\xfb\x3f\x2b\xaf\xb1\x9f\xbe\x2c\xbd\xac\x00\x2a\x35\x9a\x95\x4b\xc6\x9b\xdf\xe2\xfb\x36\xad\xfd\x9a\x15\x09\xf3\xe3\xa4\xc6\xb1\xf3\xf3\x6e\x7c\xf8\x0d\x58\x3d\x44\x0f\xf2\xa1\x44\x64\x30\x98\x97\x4d\x71\x49\x3e\xcb\x64\x17\xc0\xb8\x06\x5b\xd2\xc2\x1c\x1e\x34\xaf\x09\x24\x3f\xb4\x9e\x9d\x35\x29\x7e\xb0\xa5\x2d\x56\xdd\x27\x0f\xea\x6d\xc5\xc0\x80\xa0\x55\x99\xf7\x85\x81\xe9\x0f\xd8\xcc\x4c\xd1\x1a\x50\x5e\xdd\xe8\x4b\x89\x2d\x89\x53\xbd\xbb\x23\x79\xd3\x3a\xad\x64\x65\x8a\xe2\x06\x07\xdd\x35\xb0\xbf\x3a\x26\x37\xd2\x0c\x3f\x86"}, +{{0xc2,0xe0,0x74,0xfa,0xa2,0x34,0xe9,0x9a,0xb2,0x0a,0xdb,0xbe,0xae,0x11,0xb8,0x10,0x97,0x23,0xb7,0x08,0xc5,0x45,0x86,0xdf,0x65,0x2b,0x40,0x2c,0x35,0xcd,0xd1,0x27,},{0x5e,0x52,0x4e,0xce,0x1c,0x69,0x6e,0x70,0x5a,0x35,0x14,0xdd,0x00,0x82,0xb8,0x40,0x79,0x5a,0x59,0xc3,0x6a,0x96,0xcb,0xc4,0x82,0xbf,0xf5,0xab,0x4e,0xf5,0x15,0xd1,},{0x65,0x7c,0x38,0x26,0xb3,0x48,0x3f,0xd4,0x2a,0xb6,0xdf,0x86,0x9d,0x1b,0x77,0xa8,0xc4,0xdf,0x67,0xa6,0xa5,0x90,0xc7,0xc6,0x77,0x29,0x69,0xe3,0xdf,0x33,0x12,0xae,0x06,0x54,0xfb,0x83,0x84,0x7a,0xf2,0x21,0x93,0x5a,0x05,0x12,0x29,0x16,0x36,0xec,0x05,0x95,0x70,0x08,0x79,0xeb,0xdb,0xa8,0xa1,0x46,0x7c,0x53,0xd4,0x0c,0x23,0x06,},"\x31\x29\x03\x38\xe4\x6d\x1c\xc2\x5c\xe9\x9c\xba\xcc\x40\x16\x03\x41\xb7\x85\x82\x3c\x82\x3c\x4a\xb9\xba\xee\x3b\x61\x25\x79\xf1\xc0\x11\x71\x67\x96\xe5\x6e\x26\x93\xf6\xdd\xad\x43\x92\x2a\xa7\x84\x7c\xbb\x41\x48\x10\x16\x51\xbb\xe6\x2d\x50\xbe\x90\x82\x5e\x8e\xab\x77\x7a\xa4\xb8\x02\x6d\xc5\x38\x5a\x97\xd3\xdf\x76\x16\x01\x91\xf9\x22\xcd\xd2\xf0\x7b\xa5\xf8\x5e\x95\xf4\x5d\xb2\x29\x28\xf9\x07\x34\xff\x52\x0c\x44\xdc\x8f\xe3\x90\x3b\x4c\x51\xcd\x23\xe0\x64\xf0\x1c\x82\x9e\xc7\x4f\xbf\xfe\x25\xfd\x0d\x36\x9d\x27\x65\x74\x0f\x43\x85\x6b\xd7\x39\x8a\x19\x11\xad\x74\x98\x36\x16\x0f\xd9\x8d\x04\xb2\x8e\xe8\x7e\x11\x1d\x40\x71\x8b\x5a\x16\x6f\x05\xc9\xa4\x71\xa4\x15\x66\x55\x70\x69\xf7\xa1\x4d\xe9\x88\xbb\xbf\x67\x77\x52\x1f\xcb\xa6\xdd\x65\xde\x4c\x06\x67\x4a\x11\x85\x3a\xf8\x3a\xcc\xb7\x0f\xb3\x28\xdd\x8f\xd6\x10\x5a\x7d\xf5\x26\x9c\x9f\xae\xc8\xd9\x00\x14\x7e\x92\x8d\x97\x0c\x36\xcd\x83\x4b\xd6\x05\x4f\x70\x65\x0d\xfa\xce\x94\xb7\x62\x9d\x16\xe3\x70\x3d\x76\x6c\xe7\x63\x8d\x0a\xd1\xe1\x7b\x77\x46\x9b\x95\x8d\x2b\xa2\xa1\xe6\x31\xa1\x63\x5e\xfd\xcb\x00\x6e\xbc\x6e\x5d\x8b\x9f\xaf\x7e\x5f\xb9\x89\xdc\x08\x96\xc5\x61\xa2\x6f\x3c\x25\xf0\x55\x71\x6b\x36\x71\x38\xea\x5d\xa1\xf8\x1d\xc7\x2c\xff\x7a\x55\xaf\xae\xe5\x83\x9e\xf5\xaa\x82\x2b\x29\x70\xaa\x18\xa8\x98\x21\x63\xbf\x5e\xed\x1b\x67\x7c\xca\xac\x12\x24\xff\x6c\x6c\xf2\x56\x37\x47\x80\xae\x65\x80\x3b\xf5\xc6\xe2\x3c\x80\xba\xcd\x76\xec\x3e\x2d\xdd\x3a\xb7\x19\x97\x50\x64\x48\xe1\x9d\xb1\x98\xef\xad\xc9\xf7\x57\x49\x1f\x1b\x09\x72\xc8\x2d\xb2\x94\x10\xe1\xe8\xbb\x67\xbb\xb2\x3d\x53\x56\x3b\x88\x07\xe5\xe0\xc2\xe3\x2e\xe5\x96\xb5\xb4\x40\x23\x28\xf9\xe1\x79\xe9\xce\x85\x6d\x3b\xd1\x99\xd5\x8d\xe6\xc5\xc2\x52\xe7\xa6\x12\x4d\x81\xfc\x9e\xea\xf2\x3d\x34\x7d\x2a\xb8\x89\x17\xaa\x68\x44\x50\xdd\x58\x30\x35\x16\xc1\xa4\xd2\xbd\xcd\xde\x22\x0c\x9a\xe3\x79\x0f\x29\x8d\x7d\x38\x4b\x70\xc2\xfe\x25\x88\x07\x84\x8f\xc3\x53\x20\xb5\x78\xb3\x35\x03\xb7\x5f\x38\xa1\xdf\x63\x0b\xd3\x3e\x6a\x85\xa4\xdd\x4d\xf9\xf6\xe5\x5a\x6e\x68\x67\xc7\x38\x01\xe5\x93\xe1\xd5\x91\xdb\x89\xba\x9a\x9a\xf0\xfc\x29\x2e\x06\xfb\x51\x5a\xc8\xa5\xe8\xe3\x43\xa8\x21\x33\x55\x75\xba\x48\xfb\xaa\xe3\xfb\x12\xde\xea\xae\xe6\x0f\x4b\x3d\x31\x7e\xc0\xa5\x54\xdd\xd4\x25\xc8\x49\x32\xc2\x7a\x7a\x12\xf2\x9d\x63\x71\x51\x07\x83\xbd\x75\xe6\x0e\x2f\x6d\xa2\x00\x52\x06\x9e\xd7\x1e\x69\x5a\x94\x31\x82\x19\x3c\xb6\x85\x1a\x7d\x2f\xa3\xc6\x66\xc1\x93\x02\x80\x15\xac\x8b\x7e\x7d\xaa\x6c\x52\x04\xf7\x7a\x62\x32\xb8\x8b\x4a\xbf\xfc\x53\x62\xfd\xe7\xde\xc3\x6b\x9d\x45\x48\x80\x84\x92\x83\xb1\x15\x63\x39\xea\x2e\x8c\x3b\x10\xe5\x1b\xfa\xbd\xf7\x25\x78\xc7\x26\x41\x9a\x38\x54\x2c\xf8\x64\x9d\xf9\xa0\x90\x9f\x58\x2d\xeb\xad\x5f\xd8\x9d\x8c\x81\xf8\x3d\x9e\x42\x3e\x75\x03"}, +{{0xb9,0xda,0x4e,0x6a,0xf0,0x7e,0x39,0x8a,0xb4,0xd2,0x17,0x52,0xa3,0x2c,0x8f,0xfa,0x9b,0xe0,0xc3,0x10,0xd3,0x50,0x59,0xfb,0x66,0x1b,0xd7,0x3a,0xfa,0x97,0xe2,0xa8,},{0xf8,0x62,0x80,0x3c,0x96,0xcc,0x42,0xad,0xc8,0x25,0x28,0x84,0x54,0x72,0x30,0xb9,0x70,0x04,0x7b,0x7e,0x5d,0xa9,0x96,0x26,0x0c,0xcc,0x02,0x40,0xab,0x71,0xa6,0xec,},{0x62,0x5e,0x1f,0x42,0xc8,0x74,0x34,0xa2,0x5d,0x62,0x2d,0x80,0xd1,0x25,0x32,0x80,0x6a,0xfb,0x25,0x09,0x33,0x24,0x49,0xe6,0x96,0xb6,0x5e,0x1e,0x58,0x88,0x50,0x8f,0x11,0xc4,0xac,0x25,0xf5,0x9b,0x8d,0x94,0xd0,0xbf,0x27,0xe4,0xc8,0xd1,0x86,0x70,0x07,0xc4,0x08,0xda,0x57,0x30,0x82,0xdc,0xf1,0x9d,0x15,0xa9,0xd5,0xcc,0xcb,0x0c,},"\x6b\x95\xaf\x0e\xeb\xb6\xa0\x8a\xfa\xda\xa1\x96\x21\xf7\x6a\x83\x9b\xe8\x08\x51\xc6\xdd\x31\x5e\x82\x76\xf5\x01\x99\x5d\x4c\xe6\xd1\x34\xdf\x5e\x79\x8e\xd5\x17\xa2\xf0\xe6\x2a\xa1\xd6\xc9\x8c\x36\xef\x14\xbb\x1e\x5d\xdf\xc9\x8d\x5a\x7f\xcc\x81\x14\x0a\x13\xc2\x0d\x2c\xa0\xc4\xb4\x0e\x6e\x6a\x03\xee\xd8\xc8\x99\xf9\xd1\xf7\x92\x46\x81\x52\x19\x9f\x4b\x95\xa4\x32\x66\x89\x47\xa5\x1d\x7b\x8e\x10\x4d\x8d\x1f\x12\xaa\xcd\x96\x7e\x08\xb0\x8c\x41\xc3\xc8\xca\x3f\xee\xda\xa5\xb8\xb6\x3b\xce\xc0\x61\x38\x64\xd9\x53\xd8\x11\x43\xec\x81\x42\x5b\xde\x29\x16\x4a\x08\x76\xf2\x3f\x37\xac\x9a\xc9\x47\x36\x72\xce\x11\xa0\x8b\xd5\x47\x6f\x6f\x66\xd6\x65\xe9\xad\x61\x7e\x34\xeb\x32\xee\x56\xff\xa4\x59\xf2\x0d\x1b\x93\x53\xd7\x82\x12\x98\x54\x57\x50\xc6\xef\xf3\xe7\xd4\x07\x3d\xc3\x18\x5e\xde\x03\x91\xcc\xe0\x57\x5f\x8b\xa6\x37\xd8\x00\x06\x8d\x9d\x7e\x54\x03\xba\x70\x38\xd2\xdb\x77\xda\x14\x47\x84\xf2\xe8\xea\x76\xae\xdf\xe5\x21\xe7\xdc\x6a\x67\x4e\xde\x35\x57\x95\x95\x99\x3f\xb2\x0d\x44\xb4\x05\x27\x83\xf5\x6c\x8c\x0b\xbd\x04\x40\xb6\x9e\xab\xde\x84\x46\x8d\xd1\x3c\x67\x1f\xb1\xbb\xd5\xcb\x02\x2c\x2a\x4f\xcf\x35\x42\xd8\xb3\xbb\x51\x8e\x5a\xde\xbd\xdc\x84\xe7\x14\xb1\x3b\xe5\x2c\x56\xb2\x82\xb4\x2a\xc0\x89\x2a\x54\x59\x28\x1b\xe7\x16\x07\x29\xf4\x11\x2c\x7d\x99\xdf\x9b\xe5\x43\x4f\x82\x3a\x9c\xe0\x50\x17\x89\xde\x1d\x55\x0a\xd5\x0b\xb1\x8c\x8d\x89\xa3\x36\x68\x27\x0b\xff\x7b\x91\xff\x11\x8f\x5c\xd9\x90\x9a\xdd\xde\x90\xc0\x24\xa3\xad\x71\x39\x15\x17\x46\x74\xf2\x8a\xaa\x9f\x94\xa3\x22\xba\xa5\x43\x73\x8e\xda\xb4\x97\x33\x12\xb5\xbf\xa1\x21\x55\xde\xbc\xee\x16\x3c\xfe\x2b\x04\xac\x9c\x12\x2a\xc8\xa4\xe1\xbc\x41\x8c\x14\x95\x5d\x96\x10\x45\x5b\xd9\x45\xe9\x79\x3b\x91\x62\x67\xc9\xc5\xf9\xe5\x3a\xc0\x45\x18\x92\x6e\xc9\x8e\xcb\x84\xa4\xf0\x44\x5d\xcb\x12\x36\xc7\x6c\x3a\x67\x8c\x69\xab\xe4\xe9\x2c\x22\x97\x1d\x62\x21\x72\x01\xa1\xbd\xf0\x5c\x04\xdf\x84\x20\xa3\xde\x6a\x91\x7a\x85\xe7\x1e\x2b\x97\x25\xe7\x7b\x52\x29\x15\xd4\xc9\x94\x60\x77\x63\x7c\x2d\x88\x13\xf0\x10\xb9\x49\x1c\xf0\xed\xdc\x3d\x46\x68\xcc\x0f\x8b\xc8\xa6\x83\x57\x9b\xe5\x43\x93\x4d\xa2\x85\x3a\x16\xf5\x71\x57\x24\xf7\x79\x81\x9f\x44\x43\x9e\x1d\xeb\xca\xa4\x27\x0d\x9b\x85\x94\xba\x4c\x86\xe1\x06\x3b\x3c\xe4\x79\xd7\x1a\x54\x09\xbe\xf2\x7e\xf4\xe5\xc1\xd1\xc9\x6e\x8b\xe1\x38\x65\xaf\x7b\xb4\x3f\x09\x16\x2c\xcb\xc8\x3a\x2c\xa9\xe9\xb8\xa2\x32\x4e\x6d\x99\x65\x75\xee\xfe\xd3\x7e\xf4\x99\x08\x18\x57\x38\xb8\xea\xe4\x3f\x8a\xdc\xa3\x30\xc9\x9b\xc6\x6c\xc1\xfd\x52\xc5\x30\xd7\x37\x1c\x60\x86\x9c\xe4\x2c\x19\x7d\xca\x0a\xd1\x28\xb8\x5f\x61\xc8\x75\x8f\x0d\x54\x2f\x3d\x32\x98\xb6\x5e\x93\xc6\xe8\xa6\x8f\xa0\xe9\xa1\xd5\xe8\xc5\xfe\xc8\x05\xb8\x3a\xff\x43\x90\xe1\x15\xeb\x64\xf3\xf0\x78\xa0\xb9\xb6\x6c\x27\x38\x43\xfc\x6c"}, +{{0x14,0x3f,0x7b,0x42,0x47,0xd5,0x49,0xf6,0xb7,0xc0,0x91,0x72,0x66,0xc5,0x0f,0x96,0x2c,0x28,0xa2,0xea,0x24,0x76,0x2f,0x53,0x7a,0xa0,0x6a,0xd1,0x5e,0x40,0xb3,0x5a,},{0xc9,0x95,0x9f,0x90,0xa2,0xd5,0xfe,0xac,0xba,0xe2,0xc4,0xc8,0x03,0xde,0xd5,0xde,0xab,0x86,0x98,0x76,0x37,0x06,0x43,0x37,0xaa,0x2a,0x0b,0x0d,0xde,0xf2,0xfd,0x86,},{0xc1,0xcf,0xae,0x58,0x51,0x57,0x13,0xea,0x72,0x8c,0xfa,0x09,0x09,0x0e,0x89,0x42,0xf8,0xdf,0x18,0x62,0x1b,0xa7,0x09,0x0e,0x3a,0x33,0x76,0xc3,0x80,0x27,0x75,0xa1,0xec,0xaf,0x43,0x6b,0x18,0x49,0x78,0x04,0x1e,0xbb,0x75,0x22,0x6f,0x97,0x0d,0xf7,0x1d,0x6a,0xd3,0x53,0xc0,0xfb,0x46,0x50,0x23,0xf9,0xe2,0x98,0xf6,0x4a,0x70,0x02,},"\xe2\x74\x20\x23\x47\xa0\xd0\x57\xa4\x8b\xf2\xa1\xf6\xe9\xf6\xcb\x42\x56\x07\x9d\x80\x03\x74\x09\x3c\x02\x0c\xbf\x52\x0e\x5f\xa2\x7f\xe9\x96\xff\x07\xf3\x3a\xd3\xb2\x1f\x74\xab\x0c\xd9\x3c\x86\x47\x5f\xf3\x7c\xf6\x22\xd3\xf9\xfa\x4d\x13\xbc\x99\xf0\x13\xe8\x50\x2b\x24\xe4\x6c\xc8\x7c\x47\xe6\xb2\xc3\x66\x2b\x50\xe9\x79\xa0\xf3\x45\xb7\x84\xff\x21\xa8\xa4\xd9\x2a\xdc\x65\xe8\x6e\x33\xb4\xdb\xe1\x7f\x52\x8c\xcd\xf5\xb4\x86\x46\x64\xba\x94\xff\xdb\x7c\x7d\x24\x12\xb4\x38\xe6\xe4\x3f\xa9\x66\x81\x47\xee\x33\x28\x22\x4d\x1f\x52\xa3\xf5\xb5\x43\x59\xb4\xf7\xfe\xf6\x9a\xf8\xf8\x67\xb4\x78\xf1\x30\xa1\x47\xbe\xa4\x2e\xd3\x98\x03\xbc\xbc\x25\x57\xbc\xa8\xc3\x99\x9f\x1d\x24\xf0\xa6\xb0\x3c\x98\x84\x60\x11\xf9\xec\x74\xf6\x66\x41\x7b\x95\x02\x0e\xb1\xfb\x2f\xb8\x8b\x63\x12\xe5\x00\x8c\xff\x03\xe2\xd7\x7a\x26\xaa\x53\x2d\x17\x80\xb5\x07\x7f\x9e\x8b\x82\x86\x74\x45\x5d\x6b\xc9\x57\x97\x5f\x7b\x2a\x50\xe7\xfd\x7c\x16\x12\xce\x02\x36\x2e\xfa\x4c\x55\x5a\x1e\xef\x68\xec\x34\xa5\xc0\x06\xa6\xda\x00\x8a\x31\xd4\x19\x3d\xc2\xcc\x64\x76\x85\xad\x3c\xfa\x3b\xd7\xc5\x60\xb7\xae\xd4\x5f\x0f\x1a\x3d\x1b\x5b\x36\x22\x68\xde\x53\x28\x57\x05\x5a\xb9\xd1\xd5\xd8\x58\xd9\xae\x9a\x75\x9a\x51\xbb\x94\x78\xe8\xf0\xee\x93\xc9\x84\xb5\x76\xb8\xb4\xab\x46\x02\x80\xbe\x3d\xe2\x05\xa3\x2f\x1d\xc3\xd5\x72\x92\x3f\xb2\x13\xac\x15\x12\xd8\x0e\xb5\xad\x5c\x18\x94\x4b\xe7\x7f\xc1\x7d\xef\x13\xa6\x1b\xbd\x31\xbc\x71\xac\xc2\x3d\x25\x0e\xc5\x89\x4e\xbc\x21\x4c\xfe\xc0\xc1\xb9\x06\x51\x6d\x32\xd8\x36\xad\xc8\x38\x80\x2e\x8d\xe3\x0d\xd7\x6d\xf6\xe6\x1c\x1b\xc4\x38\xb6\x8d\x2b\x02\x5a\x84\xf2\x11\xfa\xcf\x3f\x13\x84\xd2\x61\x2d\x0f\xae\xf5\xd1\x71\x31\xcf\xe0\xcf\xe8\x33\xfe\x95\x0e\x47\x9b\xc2\x9c\xbe\x7f\xd6\xda\x0c\xce\x30\x7c\xf0\xb1\xbd\x92\xc8\x0e\x87\x8e\x43\x2f\x63\x6e\xa0\xcd\x42\x48\x0c\x07\xe8\xb8\xe5\x7e\x69\xb2\xf9\x38\xb7\x81\x20\xf6\xaf\x4a\xbe\xbf\x7d\x4b\x05\xca\xcd\x6e\xed\x85\x44\x91\xc0\x29\x75\x5c\x4e\x66\x33\x89\x93\xed\x2a\xc2\x5d\x19\xa0\xc5\xb4\x0f\x5e\x32\xc8\xa8\xb1\xbc\xe3\x69\x71\x81\x86\xc9\x1d\x60\xed\xff\x24\xa8\x37\x7a\x99\x69\x75\x75\x99\x06\x7d\xd3\x12\x63\xa0\x6d\x6a\x61\x15\x47\x81\xf2\x96\x11\xab\x81\x2f\xf8\x2e\x81\x37\x39\x64\x62\x63\x70\x4c\xd6\x04\x63\x57\xa2\x3c\x04\x5e\x24\x07\xb7\xa8\x95\x08\x25\x93\x91\x31\x4f\x2f\xbe\xe4\x9a\xef\x08\x55\xc6\xe5\xe6\x3d\x91\x2a\x19\xdf\x15\xb1\x1e\xce\x34\xe2\x76\xdc\xb8\x8b\xf2\xf2\xe4\x75\x63\x58\xf3\x4a\x0e\xe3\x95\x2b\x68\x6f\xcd\x17\x57\x8a\x88\x41\x76\xd3\x4e\xa2\x91\x6c\x5d\x9f\xcd\x00\xeb\x9e\x0a\xa9\xf2\xcf\x0f\x16\xe2\x56\x4b\xfd\x28\xb6\xab\x59\x68\xb8\x44\x8f\x06\x83\x20\xe4\x18\x71\x60\xf8\x66\x57\x81\xb1\xe2\xed\x9d\x04\x9e\x1b\x54\xa7\xd7\x27\x20\xff\x9d\x4f\x07\x30\x51\x99\x6a\x9d\xb6\xf0\xc6\x82\x1c\x42\x4f\xa5\x1d"}, +{{0x0d,0x1f,0xe9,0xd8,0xb9,0xa2,0xf0,0x4c,0x22,0xbb,0xb0,0xed,0xea,0x38,0x33,0xa0,0xce,0x43,0x33,0x93,0x47,0x53,0x1f,0xdb,0x67,0xed,0x51,0x3a,0x13,0xd3,0x6b,0x39,},{0x67,0xc4,0x9f,0x41,0x0f,0x48,0x53,0x29,0x3d,0x0c,0x4d,0x39,0xf4,0xc1,0xb3,0xd6,0xc6,0x10,0x3c,0x5c,0xfe,0x20,0xa9,0xa5,0x9b,0x53,0x93,0x20,0x43,0x51,0x73,0x69,},{0xb0,0x57,0x25,0xe7,0x37,0x1e,0xd0,0xa9,0x1e,0xbc,0x89,0xf3,0xc3,0x0b,0xaa,0x99,0x18,0x37,0x63,0xed,0xb4,0xce,0x34,0xfe,0x90,0x1a,0xf3,0x73,0x1e,0x00,0x1c,0xc5,0x4f,0x28,0x71,0x18,0x91,0x5e,0x90,0x36,0x5d,0x91,0xac,0xa8,0xfe,0xb1,0x70,0x87,0x69,0xf9,0xf1,0xd6,0xee,0xf5,0xaa,0x11,0x3b,0xee,0x00,0xb5,0xef,0xab,0x27,0x04,},"\x64\x21\x7a\xc8\x41\xfd\x4d\x64\x59\xbf\xc4\xa4\x9b\x88\x01\xd6\x92\x9b\xf1\x9b\x40\x8e\x8a\x53\x79\x0c\xeb\x51\xec\x34\x1f\x9b\x46\xa3\x51\xe8\xc2\xe5\x9d\x88\x7e\x1e\xac\xcb\x91\x42\x31\xcd\xca\x1d\x3e\x5c\x47\xd1\x66\xb4\xcd\xb9\xb5\x8c\x01\x3c\x59\xa3\xbd\x28\x3a\xd1\x0f\x6b\xd6\x2c\x0f\x15\xf7\x64\xce\x14\xf3\xb2\x65\xf5\x37\xc6\x3e\x73\xb6\xc4\xfa\x65\xe0\x6c\xe1\xe1\xf4\xae\x0d\x11\x48\x9d\xd2\x60\x2f\x95\xfc\x40\x2b\x77\x12\x05\x2a\xbc\x84\xbd\xc7\x78\xc1\x9f\x10\x00\x1b\x4e\x0d\x5f\xbe\x46\x30\x90\xe8\x3e\xf4\x38\xfe\x06\x8f\x3b\xb6\xfb\xc2\xc1\x39\xaf\x06\x78\xed\x2a\x11\xfa\xa1\xb9\xe4\x9a\xaa\x46\x20\xab\xfc\x08\x43\x9f\xbf\xe2\xc6\x18\x40\x76\x9e\x5f\xda\x26\x77\xf8\xe2\xf0\xa1\x45\x64\xf9\xf5\x04\x23\x2a\x9f\xc0\xd9\xda\x47\x1e\x67\xfb\xc5\x74\xc3\xd5\x6d\x2a\xeb\x93\x7a\x58\x6e\xd5\x58\x35\x56\x30\x8a\x99\x8e\xb1\xdc\x47\x6a\x01\x4f\x5a\x08\x22\x8d\xbe\xd9\x5a\x12\x08\xbc\x1d\x1f\x5d\x76\xb4\xe8\xd0\xb2\x43\x4b\x99\x5a\xd4\x58\xe4\x29\xee\x61\x42\xa0\xc9\x71\x76\x8c\xc4\x0c\x40\xbc\xb0\x8e\x96\x03\xf0\x96\x11\x47\x44\x71\xb3\x85\x9d\x7f\xd5\x84\x21\x9f\x02\x65\x7b\x43\x0e\x9e\x56\x95\x5b\x34\x67\xac\x56\xff\x2e\xab\x22\xcc\x49\x84\x89\x03\x6a\x57\x41\x20\xe2\xdb\x76\x9a\x3b\x21\x50\x03\x89\x14\x2c\x78\xa8\x7d\x06\x9f\x0e\x25\x76\xca\xfd\xa8\xcd\xdd\x79\x15\xa9\x22\x87\x73\xd2\xac\x9a\x07\x5c\xb3\x87\xf2\xa8\x98\x61\x72\x13\xb2\xcc\x50\x59\xd1\x19\x41\xbc\x4f\xe5\x86\x41\xe7\xc1\x75\x02\x67\xe5\x3e\x99\xc4\x21\xcb\x4c\xf2\x1d\x09\x8c\xa2\xd1\xf4\x16\x44\xf7\x90\x89\x83\xeb\x17\x4a\x23\xa7\x81\xcf\x15\xef\x38\xeb\x91\x16\xed\xa4\x12\x3a\x15\x22\xf5\x3b\x81\xfb\x73\x68\xe8\x07\x5f\xb8\x38\x59\xd2\xcf\x98\xd9\x21\x53\x5a\x70\x9f\xaf\xa9\x87\x3c\x4a\x03\x9a\xae\x68\x2f\x7e\x62\x86\xb8\x99\x25\x7c\x09\x24\x01\x6c\xa5\xbf\x6d\x31\x69\x09\x92\x11\xa9\xa4\xa6\x74\x5c\xdd\x31\x98\xf1\x33\x7f\x60\x92\x82\x27\xce\x3c\x7d\x60\x96\x0b\x53\xde\xdf\x01\x1a\x89\x40\xf5\xc4\x68\x20\x7a\x38\x94\xbb\x08\x72\xb3\x33\xcc\xde\xc9\xd5\xec\xd9\x11\xec\xbb\xb9\x6c\x9b\xc4\xbd\x48\x75\x32\x0e\x4d\x3e\x9c\x02\xd9\xdc\x76\x10\x9e\xc4\x5e\x61\xd1\xcf\x5a\xc7\x29\xf2\xe3\x4a\x96\x47\xb9\x5b\xce\x70\xb0\xc6\x33\x17\x1a\xda\xf0\xdf\xdb\x5a\xfb\xa4\x03\x5b\x3c\xce\x8c\xb7\x14\x1a\xd1\x42\xbb\x7a\xdd\x4f\xc3\xf9\x61\xd4\x2d\x72\x03\x75\x4a\x4e\x31\x32\x21\xd4\x87\x83\x1e\x32\x94\x7d\xa9\x11\x38\xab\x64\x8b\x59\x52\xef\x69\x56\xe2\x7a\xa5\xd2\xc1\x75\x79\x4b\xf8\x1e\xf2\x77\xfa\xa6\xb9\x05\xe1\x45\x02\x86\x68\x87\xd8\x78\x80\x60\x6e\x81\xb2\x7a\xf0\x1b\xb2\x63\xec\xf2\xc5\x82\x05\x85\xea\x6c\xe8\xd8\xb3\x91\xd8\x6f\xce\xda\xdc\xd1\x1f\xdb\xb5\x66\xfd\xf1\x47\xf4\x02\x01\x0f\xc3\x5f\x51\x57\xe0\x36\x14\x6b\x37\x36\xc8\xa4\x33\x59\x12\x7c\x26\x1f\x6b\xf0\xca\xd3\xbd\x8a\x34\xcb\x15\x09\xf7"}, +{{0xc1,0x0b,0x5a,0xc6,0x05,0x5a,0x1d,0xdb,0xca,0x28,0x55,0x2e,0x5c,0x72,0xeb,0xd0,0x52,0x78,0xc9,0x22,0x39,0xb2,0xfc,0xd0,0xc1,0x35,0x36,0x51,0xa8,0xe5,0x59,0xa0,},{0xb2,0x18,0x3e,0x1b,0x00,0x81,0x6d,0x29,0x30,0x5f,0x74,0x68,0xe7,0xe4,0x5e,0xed,0x3f,0xd8,0xf2,0x3c,0x15,0xb3,0x05,0xf9,0xfd,0xa9,0x3e,0x81,0x2d,0x65,0xbc,0x27,},{0x8a,0x9a,0x32,0x17,0xfd,0xf0,0x64,0x3a,0xaa,0xa5,0xc8,0xfb,0x2a,0x88,0xa5,0x56,0x39,0x88,0x59,0xb8,0xfe,0xef,0xbc,0xb4,0x8c,0xcd,0x88,0xe5,0x85,0xa1,0x67,0xc9,0x4d,0xbb,0x5c,0x0c,0xad,0x24,0xd1,0x5b,0xca,0xbb,0xc1,0xed,0xb2,0x1f,0x02,0xa8,0xc4,0x57,0xc5,0x61,0x20,0xa3,0x23,0x4a,0xc3,0x35,0x77,0xb9,0xaf,0x2d,0xdc,0x01,},"\x35\x94\x90\x5f\x9e\xa4\x64\x61\x5f\x41\xb8\x7a\xbb\x9d\x16\x73\x37\xf2\x9d\x45\xd9\x7f\x7a\x14\x64\xec\x9f\x2e\xe5\x0f\x90\xf2\xe6\x73\x39\x87\x4d\x3f\x20\x93\xbe\x92\x26\x10\x77\x01\xec\x1a\xab\x94\x1c\x4e\x05\x9f\x1b\xb2\x6c\xe8\x6e\x14\x8d\x1d\x9f\x0d\xa2\xa2\xa0\xf9\x82\x9a\x36\x4f\xb4\xf1\x3f\x58\xb9\x60\xd0\xf8\xd7\x23\x23\x28\x3c\x44\x90\xef\xdf\x57\x87\x86\x45\x89\x0f\xf7\xbc\x50\x65\xda\xd6\xe5\x1d\xd1\xe5\xb9\xa5\x07\x51\x50\x97\x8b\x33\x67\xf1\xba\x84\xe4\x5f\xf1\xf1\x27\x6c\x57\x6e\x4b\xc7\x2b\xe8\xaa\x8e\x40\x5f\xc2\xb2\x7f\x81\x46\xb9\x99\x84\x5f\xaa\xa0\x59\x5d\x3c\xb7\x0e\x5d\x37\x12\xed\x54\xa0\xfb\x3e\x32\x2d\x45\x38\x0b\x5d\xe3\x60\x9b\x96\x7b\x95\x9b\xca\x5a\x58\x3c\xc5\x20\xcd\xcb\x7b\xcb\xb8\x29\xaa\x25\xd7\x93\x20\x95\xec\xb3\x03\x92\x3c\x25\x60\xaf\xc3\xfd\x73\x24\xb7\xb7\xac\xd0\x89\xa9\xf0\x0c\x03\xa7\x3d\x04\x3d\xc0\xcf\x0b\xa0\xd8\x41\x1e\x2b\x1b\x18\xd2\x1d\x2a\x32\xa7\x26\xa5\x30\x59\x14\x0f\x78\x4f\x7c\xed\xf2\xf3\x3c\xec\x66\xfe\x4a\xd5\xcc\x9e\xac\xcb\xe4\xae\x10\x03\x6a\xc3\x52\x3b\xac\x70\x0a\x11\x3a\x98\xb5\x98\xe6\xdf\x03\x04\xc6\xfa\x32\x12\xac\xc0\x4c\x4e\x3c\x7f\x66\x87\x36\x2e\xf8\x6d\x61\x7c\x6d\xd4\x83\xf8\xd8\x0c\xea\x66\xd1\x95\x11\x27\x42\x8a\x61\xc1\xe1\x55\xa6\x85\x0b\xb2\xaf\xb7\xf9\x1c\x82\xd7\x3e\xb2\xb0\x54\x3e\xe8\xfc\x1f\x38\xe1\xdc\xdb\x3c\x50\x3d\xdc\x9b\xa0\x81\x24\x56\xa5\xce\x2e\x11\xd5\x56\x48\x7a\x64\x69\x74\xa7\xbb\xf8\x6e\x80\x6c\x58\xc6\x8c\x42\x69\xa7\xc9\xbb\xca\xc0\xff\xef\x98\x35\xb3\x3d\xc4\x49\xa7\x54\x79\xec\xd2\x3f\x6d\x14\x9c\x1e\x5e\xa8\xb6\x92\x08\xff\x36\xe5\xfb\xd6\x82\x95\x55\x03\x18\xbf\xa0\xd3\xb1\xd6\xc1\xad\x42\x70\xbc\xab\x09\x04\xae\x53\x49\x1f\x9b\x1c\xa5\x02\xe0\x12\xee\xd7\x7c\x42\x7d\x49\xa0\x96\x2f\x10\x55\x12\x5d\xd7\xb5\x37\x33\xd8\x52\x89\x34\xb5\x58\x0d\xd5\xfd\x5b\xbe\x85\x49\x78\xba\xe3\xd2\x5b\xb4\xae\x94\x4e\x90\x65\xe8\xe2\xe0\x79\x46\x51\x8a\x6f\x54\x8e\x36\xe0\x56\xbe\x82\x4d\x9e\x02\xa7\xa3\xea\xad\xd3\x79\x29\xf5\x81\x01\xcb\x18\x53\xbe\x3d\x75\x47\xf5\x8f\x49\xe3\x8b\x01\x8a\x74\x8d\x3f\x19\xc4\x85\x82\xab\xbd\xbe\x95\x3a\x8a\x25\xba\x9d\x36\x5d\xea\x83\x59\x35\x89\x9c\x19\xfb\x0b\x51\x90\x6a\xa9\x72\xc5\xac\x45\xe9\x9c\x40\xb3\xb7\x6e\x35\xd3\x27\xe3\x21\xe8\xae\x23\x06\xa6\xeb\x3d\x8c\xb6\xec\x2f\xa5\x39\x9a\xdd\x19\xea\x00\x28\xa0\x17\x92\xc0\x8e\x27\xc1\x6c\xf4\xf8\x5a\xaa\xae\x72\xf9\x86\xb0\x99\xf9\xeb\xe4\xad\x0b\x25\xd0\x6d\x3d\xe4\x4a\x8b\xfa\x52\x84\x4b\xe4\xa9\x39\x44\x83\x3c\xe2\xad\xd5\x1b\xb5\x54\xb3\x56\xa7\xdc\x49\x74\x8d\xd4\x5a\xe7\xec\x9e\x8d\xb4\x26\xc9\x7a\x25\xda\x5e\xdd\x3b\x62\x1e\x4a\xdb\xde\x48\x19\x7a\x33\x14\xde\x1c\x50\xf4\xd6\x00\x20\x27\xdd\x75\x19\xdd\xe3\xe1\x57\x29\xe4\x86\x95\x5a\xc4\x0d\x9d\x66\x87\x6f\x90\x66\x8c\x68\x9d\x8a\xb5\x98"}, +{{0x06,0x1b,0xdd,0xab,0x28,0x0b,0x0f,0xdc,0xb2,0x6b,0xfd,0x9a,0x0f,0xc7,0x21,0xf6,0x8f,0x88,0x34,0x3b,0x5d,0x39,0x83,0xa1,0x6b,0x6d,0xfa,0xa5,0xe7,0x69,0x69,0xf3,},{0x81,0x55,0x78,0xbb,0xa6,0xe7,0x07,0x0e,0xbd,0xec,0xa1,0x17,0x56,0x8b,0xd7,0x7e,0xbf,0xf9,0xe1,0x4c,0xb8,0xbc,0x20,0x0c,0x32,0xbd,0x87,0xdb,0x1f,0xb3,0x7d,0x6c,},{0xb8,0x32,0x97,0xcc,0xdd,0x6d,0x00,0x98,0xeb,0xf5,0xd1,0x32,0xd1,0x74,0xde,0x19,0x58,0x31,0x1a,0x76,0x6b,0xcc,0x4d,0xa1,0x5f,0x86,0x4d,0x80,0x1f,0x38,0xe0,0x9d,0x61,0x3e,0x7a,0xa8,0xc3,0x36,0x30,0x27,0x35,0xd7,0x5b,0xe4,0x16,0x6d,0x73,0xb0,0x18,0x4b,0x0e,0x0b,0xc5,0xef,0x39,0xed,0xbc,0xcb,0x6e,0x0e,0x61,0xaf,0xeb,0x0c,},"\xee\x76\xb4\x0c\xd4\x29\xea\xc7\xbc\x12\x83\x9c\xa2\xf7\xcd\x31\xf1\xe0\x09\x8a\x39\xc5\xfc\x19\x80\x5b\xe0\x33\x1f\x44\x79\x9e\x31\x8d\x12\x57\x1f\x06\xe2\x99\x37\x53\xa3\x68\x5c\xd2\xa9\x6b\x23\x01\xe2\x00\x24\x20\x9a\xdc\x5a\xdf\x74\x79\xff\x90\xc4\x77\xc3\x69\x5a\xbb\x99\xbd\x28\x57\x9d\xbc\x78\x31\xa1\x92\xbe\xed\x0c\xe1\x7b\x03\x8b\x20\x76\x48\x00\x65\x3a\xf7\xaf\x02\x4e\x2a\x10\x4e\xd0\xf3\xe5\x2d\x4b\xbd\x3e\x10\x9c\xf1\x26\x29\x1f\x49\xb0\xa2\x1b\xe4\x33\xc1\xc5\xa2\x58\x9e\xa5\x72\x99\x7f\x63\xd2\xbb\x39\x72\xd5\x32\xbe\x35\xa0\x47\x1e\xf0\x57\x3d\x79\x5c\x07\x2b\x6a\x86\x85\xb9\x5e\x47\xb0\x9e\xa9\xf4\x75\xd9\x3b\xf1\x2b\xbd\x77\xb7\xd2\xbf\x5d\x5b\xdd\xf0\xae\x02\x37\x53\x71\xd1\xd7\x99\xea\x92\x04\xbe\x38\x9e\x6a\x8e\x5d\xee\xdc\xd4\x92\x02\xe9\x2d\xf7\xc3\xe7\x61\xf9\x2e\xf8\xd7\x9f\xa7\x38\xd2\xc5\xbc\x28\x0e\xd3\x28\x79\x83\x2f\xf2\xb0\x26\x42\x45\x89\xcd\xbd\x52\xd1\x5b\x60\xf2\xaa\x35\x26\xb8\x98\x84\x9a\x34\xa8\x5f\xf1\xc4\x7d\xc6\x55\x4b\x85\xac\x76\xaa\x79\x35\xcb\xf3\xf7\xbc\x80\xad\x00\x91\x92\xa8\x75\xca\x20\x9b\x40\xfe\xb0\x47\xcc\x44\x69\x68\xf9\x70\xda\x47\xb8\xcd\x67\xda\x7e\xb4\xe5\x4a\x0e\x5a\xb2\x0c\xb3\x5b\xc6\xfb\x7f\x13\x30\x7c\xe6\x7e\xb6\x20\x4a\x67\xce\x9b\xb1\xd1\x39\xc1\xb4\xbd\x5d\xbe\xd5\x80\x10\xc8\x7b\xf8\x31\xe6\x52\x2e\xe1\x82\xda\xd9\x45\x80\x4b\x76\x7c\x4d\xf2\x55\x4f\x15\xb9\xe9\xaf\xd2\x59\x9e\xf2\x58\xc6\x7a\x22\xca\xeb\x92\xa5\x79\x88\x00\x6b\xbc\x72\xc1\x04\xfa\xc7\xe5\x41\x3c\xd3\xd3\xb8\x02\xc8\x3e\x63\x9e\xaf\xe2\x12\xa3\x8b\xb7\xef\x77\x9a\xf1\xa9\x4e\xe1\x37\xf6\xc6\x06\x67\xbc\x48\xf2\x7b\xf4\xa2\x22\x41\xbc\x44\xbb\x60\x33\x83\x62\x39\xbd\x6e\xaf\x3e\x2e\x22\x31\x87\x84\x1e\x46\x41\xb0\xf4\xe9\xff\x8d\x5a\x41\xdd\xbe\xab\xb4\x13\x8f\x6b\x58\x5a\xce\x0f\xb6\xb5\x3d\xc3\xc9\xed\xc0\x37\x3b\x60\x47\xf2\x7d\x83\x5e\x8e\x24\x66\x44\xfd\x83\x2c\xcf\xe0\xdf\x25\xc3\xd7\xda\x18\x7c\x9f\xa0\x54\x20\xd4\x34\x55\xf2\xd0\x8b\x57\x19\x29\x38\x6b\x59\xc6\xe0\xe1\x0a\x35\x60\x1d\xa8\x99\xb1\xb4\xdc\x3d\x95\xb6\x7d\xd9\xa8\x38\x18\xb0\xa3\x18\xbf\xdd\xa0\x64\x64\xb4\xa4\x2d\x3c\xb9\x85\xf3\x0e\xc9\x7d\x6a\x2a\xf1\x32\x91\x15\x5d\x60\xce\xc5\x7c\xbd\x58\xd5\xcf\xcb\x35\xc1\x85\x35\xe8\xd2\x99\xb5\xb0\x07\x59\x08\x92\xea\x94\x9d\x1b\x13\x7a\x62\xb3\x9a\x43\x6c\xd7\xe5\xb9\xf8\xd1\xb6\x93\x8d\xba\xa6\x2c\x22\x68\xd4\x59\xc6\x22\x0a\x3e\x6f\xcb\xf8\x0b\xa0\x11\x8a\xcd\x23\x42\x56\x3f\xbd\xbc\x1f\x7c\x9d\xba\x7e\xa2\xc0\x72\xaf\xc8\xae\x21\x28\xe3\xeb\xca\x06\x44\xff\xd8\x16\x3e\x80\xa1\xa5\x57\xd9\xd3\x90\x34\xcc\xd9\xdb\xd1\x2c\x88\x55\xa6\xf9\x16\x5b\x08\x01\x83\x9c\xf6\xe0\x7a\x9f\xba\x4c\x64\xd9\xc0\x99\xe1\x54\x10\xe2\x90\xe6\x77\x03\x1b\x65\xcf\x7d\xeb\x00\x79\xbd\xad\xc5\x73\xcc\x05\x6d\x76\x66\xd9\x5d\x03\x3a\x0b\x6b\xdb\xa7\xec"}, +{{0x2c,0xab,0x5b,0xf5,0x5f,0xfa,0x91,0x4e,0x9a,0xd0,0x76,0x22,0x19,0x0d,0x34,0x3e,0xc5,0x5c,0x13,0xcd,0x91,0xb3,0x88,0xcb,0x75,0x00,0xff,0xe0,0x6d,0xf7,0xc1,0x80,},{0xb6,0x1e,0x43,0x2b,0xb9,0x7c,0xba,0xe3,0x88,0xa2,0x57,0x8a,0x74,0x84,0x99,0x8e,0x00,0xe9,0xad,0x3d,0xdf,0xd6,0xca,0xb8,0xd3,0xa5,0xfc,0x5b,0xa0,0x43,0x07,0xc8,},{0x4c,0xf0,0x8f,0x4f,0xab,0xbd,0x06,0xdc,0xcb,0xcc,0xe2,0xa7,0xa5,0x94,0x1f,0xe9,0xaf,0xdd,0xc4,0xd2,0xd0,0xbc,0x80,0x80,0x2e,0x93,0xb1,0x2c,0xb1,0x35,0xd3,0xac,0xf6,0x51,0x1e,0x0f,0xe4,0x11,0x3c,0x5e,0x3c,0x55,0x41,0xb2,0x7d,0x3a,0x21,0x50,0xa7,0x57,0x74,0x2a,0xc6,0x5f,0x95,0xa9,0xce,0x66,0x73,0xff,0x0c,0xd2,0x1c,0x0f,},"\x2c\x2d\x04\xdc\x3a\xd1\x98\x23\x59\xec\xd5\xbc\x3e\xe0\x35\xf3\x49\x8e\xed\xff\x61\x04\xa9\x3c\x60\x2a\xf2\x17\x9a\xeb\x2c\xb1\xf4\x1c\x5c\xdb\x0a\x77\xb1\x24\xf9\x46\xaa\x8a\x82\x4a\xa3\x07\x6c\x2e\x1a\xcf\xd4\x8f\x68\x07\x0b\x26\x27\x6a\x65\x6b\x4a\x47\x58\xab\x15\x1a\x6a\x9c\x41\xbd\x74\xe0\x9b\xbd\x9a\xdc\xce\x1e\x87\xa0\xa8\x0d\x17\xfd\x92\xe8\x5e\x4b\xda\x47\x2c\x98\x8b\x6b\xb1\x18\x3b\x7e\xe5\x9a\x09\xd8\x05\x70\x46\x6d\xb9\x0d\xd3\x74\x95\x79\xc4\xeb\x19\xab\x75\xfc\x15\x2e\xcd\xcd\x68\xcd\x10\x78\xef\x06\xe5\x93\xc7\x35\x16\xfa\x82\x91\x48\x1a\x66\x7d\x3f\x95\xbf\xeb\x14\x4b\xab\x59\xd6\xdd\xc7\x3a\x27\x95\xc1\x01\x7e\x09\x53\x6b\x31\x62\xe4\xbc\x58\xf8\xea\xd3\x89\x57\x01\x8c\xfe\xc7\x2b\xad\xbf\x22\x81\x9a\xb0\xb4\x06\xc6\x47\x30\xfc\x73\xfd\x9e\xe6\x1f\x74\x18\x7e\xda\x91\xed\x4e\x79\x93\xe6\x68\x84\xaf\x43\xef\x4c\x6b\xf7\xf7\xc3\x79\xe8\xf0\xf6\x3d\xcb\x80\x41\xe2\x6b\x8b\x82\x92\xb6\xb6\xd1\x90\xe4\xad\xf4\x30\xfa\x82\xdd\x74\xc5\x73\x85\xb9\x19\xc4\x46\xdb\x37\xb5\xe8\x76\x7e\x4a\x0c\x95\x01\x3b\xe8\x9b\x2b\xc4\xe9\xfd\x62\x75\x4a\x84\x44\x18\x40\x09\x68\xae\xd2\xdd\x32\x8d\x7b\x1d\xc9\x1e\x1a\x2b\x30\x09\xdc\x7a\xd1\x40\xa0\x68\x6f\x67\x31\x68\xa6\x0e\x88\xd8\x0c\x52\x0f\xc2\xdc\xfc\x56\xca\x9d\x4b\x0c\x88\x85\x90\x99\x23\x07\x14\xde\xc8\x3d\x26\xb4\x63\x05\x54\xdc\xb9\xc4\x90\x18\x95\xf7\x8f\x38\x34\xb0\x97\x66\xb6\x7a\x46\x5d\xe8\xc9\x49\x00\x65\xbf\x56\x83\x39\x24\x33\x99\xfd\xc9\xd5\x10\x03\x24\x66\x7c\x5a\xb2\x8f\x35\xc0\x0f\x61\x25\x63\x8e\x61\xda\xb7\x0d\x1e\xec\x48\x95\x1d\xe0\xfb\x3f\x7b\x23\xd3\xcd\x98\x24\x37\xc6\x34\x73\x41\x5b\xef\x37\x4a\x66\x32\x96\xf2\x98\x6b\x1a\xe9\x57\x9b\x9f\xfc\xe7\x1e\xc3\x5e\xec\xa1\x16\xd1\x94\xf8\xfb\xa9\xa4\x5a\x91\xba\xe2\x7a\xc4\x55\xdb\x71\xa6\xb0\x1a\x72\x9d\x0c\x13\x5f\xcd\xcb\xc2\x3e\x50\x4a\x29\x43\xc0\x0a\xa4\x20\x70\x51\x9d\x9c\xd7\x7a\xe6\x75\x4f\x31\xeb\x46\xa3\xe5\xbe\x9e\xeb\x3f\xc8\xd3\x1f\xf1\x82\xda\x9b\x08\x7b\xe3\x46\x2c\x84\x59\x12\x6e\x86\x29\x09\x23\x2f\xd5\xf2\xd8\x9c\x01\x81\x59\x57\x61\x1e\x6a\xe7\xca\xa9\x8b\x60\x53\x77\x6a\x77\x15\xc2\xf9\x3c\xcf\x03\x08\x87\x03\x0c\x56\xc2\xb8\x22\x6d\xae\x29\x77\x99\x5a\x6d\x3f\x1e\x9d\x79\x11\xa9\xc9\xd2\xa3\x03\xf0\xe0\x1f\x32\x33\x8e\xfd\xaf\x8e\xe6\x3f\xc4\x1b\x25\x39\x9c\xff\xd0\xb3\x5f\x7e\xe5\x67\x6b\xd8\xfd\x3d\xa2\xcb\xee\x4a\xe2\xea\x98\x08\xd7\xe7\x35\x83\xd9\x94\x33\x99\x31\x46\x67\x4a\x40\x40\xf4\x2f\x63\xd1\xb3\x13\x5c\xc7\x97\xa8\xd8\xf0\xb8\x85\x73\xa3\x28\x90\x69\x6c\xac\x94\x39\xd1\xe1\x5d\x19\x6d\x90\x90\xb6\x2b\x6d\xb7\xe6\x3c\x96\x47\x2d\x94\x6e\x66\x8c\xbd\xa1\xf4\xdb\x88\x93\x00\xcd\xcc\x25\xe8\x4c\x9f\x38\x57\xd1\xd9\xe5\x32\x41\xcf\x62\x5f\x39\x09\xaf\x1c\x8a\xaf\xf4\x30\x9f\x68\xf6\x54\xb7\xa1\x5b\x67\x71\x1c\x5b\x7f\x9d\xe7\x67\x75"}, +{{0xdd,0x7b,0x59,0xa3,0x3d,0x97,0x0b,0xef,0x62,0xe0,0xe2,0x1a,0x7b,0x6e,0x4c,0x30,0x96,0x06,0x86,0xf1,0x7f,0x49,0xaf,0xdb,0x4a,0x9f,0x4e,0x80,0x8e,0x35,0x5c,0x7f,},{0x53,0xa0,0xe5,0x72,0x77,0xd9,0xbb,0xee,0xcf,0x99,0xc4,0xd1,0x38,0xfd,0x66,0xfa,0xfc,0xae,0xc7,0xbc,0x5f,0x56,0x7f,0x83,0x20,0x80,0x0c,0x4e,0x58,0x4f,0xf8,0x2e,},{0x87,0x29,0x4d,0x22,0xd4,0xad,0x0d,0x08,0x14,0xe2,0xd6,0xd5,0xfa,0xf5,0x57,0x49,0xe9,0xb3,0x98,0x03,0xb4,0xd4,0xb7,0x87,0x9e,0x60,0xb7,0x77,0xc1,0xfc,0x41,0x58,0x4f,0xe1,0x51,0x35,0xba,0x11,0x23,0xff,0x5f,0x20,0x0d,0xb3,0x5a,0x34,0x68,0xdd,0x4d,0x58,0xda,0xd7,0x7b,0xd9,0x6e,0xe2,0xb8,0x88,0xa5,0xa8,0xb1,0x8c,0x32,0x04,},"\x75\x58\x03\x67\x93\x05\x18\x16\x8b\x0a\x76\x4d\x09\x58\xbe\xc4\xfc\x46\xcf\x59\x19\x99\xeb\x37\x37\xe4\x2a\x02\xea\x72\xd2\x10\xda\xad\x53\xe5\x4a\x7c\x2c\x13\x4a\x6d\x47\x83\x37\xd2\x63\x33\x68\x54\x81\x70\xed\xef\x0d\x85\x17\x9f\x30\x23\xe1\x50\x38\x68\xa6\xe5\xe2\x77\x5e\x41\x2a\xc0\x5f\x05\x89\xd4\x2a\x37\x7e\x75\xaa\x6b\x8f\x52\x20\xa7\x69\x9a\xe8\xaf\xf0\x10\x94\xec\x46\x9d\x63\x61\xd3\xe8\xf3\x86\x15\xed\xcd\xa4\xd2\xd5\x28\x9a\xcf\x73\xdb\x64\x56\x98\x57\x80\xc9\x2e\x07\xf6\x2c\x77\xa9\x09\xfb\x6e\xf5\x98\x82\x20\x62\xbd\x57\x2b\xf7\x05\x8d\xcb\x83\x5e\xf3\x44\x3d\x3e\x47\xb5\xc6\x03\xd9\x27\x36\xdd\x1d\xf2\x6b\xe4\xb9\x28\x3b\x76\xe3\x21\xd5\x5c\xe2\xb6\x38\xcd\xe2\x25\x77\xca\x59\xc9\x63\xc2\x47\x95\x56\xc5\x75\xcc\xb0\xd6\xd1\x8c\x80\x4e\x2e\xb0\x1f\xf5\x35\x81\xeb\x04\x0f\xfd\x2c\xc4\x67\x60\x73\x7a\x74\x67\x2e\xa6\xbf\x78\x05\x8a\x6a\x0a\x1f\x5e\xbf\x56\xde\xcb\xf9\x4b\x54\xaf\xb2\x3c\x11\xd3\x41\x79\xbf\x09\x76\xb4\x15\x80\x17\xd4\x07\xc9\x5a\x40\x1f\xa6\xf9\x62\x4d\x77\x13\x5e\xae\x81\x41\xeb\xea\x9f\x35\xd5\xf5\x1b\x3d\xed\x99\x5c\x7f\x70\xc0\x25\xb0\x94\xad\xef\x2b\x07\x1f\x97\x11\x55\xd7\x79\x6d\x61\x3a\x55\x0d\x09\xe7\xf4\xdf\xc3\x45\x17\xb3\xf8\xfa\x43\x93\x28\x6a\x2b\x22\x80\x17\xda\xf2\xe0\x15\x38\x7e\x13\x52\x7f\x63\x66\x1d\x3c\x13\xe7\x8e\x90\xfb\x29\x55\xee\xe3\x45\x73\x91\x19\xb7\x91\xf0\x5b\x07\xc8\xf4\x2a\x43\x6e\xfc\xad\x1e\xc5\xea\x10\xf3\x08\xf8\xe2\x3c\xa9\x8b\xc6\x5a\x5f\xd9\x39\x3e\xfa\xaf\xe5\xcd\xef\xba\x81\x05\x81\x70\xcc\x54\x93\xc0\x0c\xed\xf2\x54\x09\x74\x35\xd2\xe2\xfd\xe5\x5f\x86\x6b\xb8\x2d\xbd\xfb\x91\x54\x34\x49\x74\x86\x63\x59\x16\x7b\x46\x6c\xaa\x90\x9b\x91\x53\x0c\x9c\x7e\xe8\xc5\x3f\xa9\x01\x64\xbb\xd0\xb1\xfa\xdb\xdc\xd0\x81\x27\xf1\x9b\xe5\x03\x30\x71\x51\x8d\x3c\xf1\x0a\xe6\xbd\x6f\x98\x27\xe1\x20\x6f\x5e\xc0\x95\xc1\x98\x61\x70\xe8\xd5\xd8\xe7\x2e\x57\xd4\x22\x87\x01\xdf\x2a\x48\xc9\x54\x87\x30\x56\xcf\xdf\xba\xaf\xb1\x0e\x46\xa0\xc1\xf1\x44\xb1\xa0\xea\xcd\xd2\xcb\x66\xbb\x91\x2a\xc4\x71\x78\x7d\xab\xe4\x83\x53\x85\x91\x20\xb0\x34\x03\x56\x7c\x41\x5d\xdb\x88\xfc\x0d\x7f\xba\x40\x69\xbb\xfe\xf4\x06\xee\xd7\x24\xa1\x1a\xbc\x04\x1e\x8e\x7b\xeb\x66\x3d\x0d\xc9\x9d\xce\xf3\xac\x6a\x14\x90\x07\xb4\x2d\xd1\xf2\x2a\x77\xdd\x52\x90\x18\x14\x32\x51\x72\x22\x4a\x27\x78\xf3\x66\xfb\x9e\xb0\x2c\x81\x2b\x84\x2a\x42\x84\x25\x61\xc6\x8f\x2a\xc2\x31\xc2\x6c\xe9\xe8\xb1\x9a\xe9\x1e\xbf\xad\x3c\x0e\x9f\x66\x36\x3a\x13\xec\xd8\xb8\x97\xa3\xd0\x0a\x26\xd2\x57\x64\x8d\x56\xc6\x74\x74\x41\xca\x1c\x6e\xe9\x9f\x08\xdd\xad\x25\xd1\x16\xdf\xad\xab\x03\x83\x00\x0d\x3d\x72\x25\xcf\x2e\xff\x70\x76\xb2\xad\xab\x95\x22\x29\x25\x55\xf3\x19\x32\x06\x78\x60\x00\xd4\x2c\xa3\x4d\x70\x8d\xc0\x42\x84\xa9\x4d\x17\x4c\xc9\x2f\x10\x2e\xfd\xdf\x31\x48\xc2\x99\x69\x16\xd4"}, +{{0xd8,0x80,0xd2,0xfb,0x06,0x26,0x2f,0x57,0xab,0x87,0x78,0xe3,0x3d,0x16,0xb4,0x73,0x06,0x09,0x78,0xa6,0x54,0x9c,0xdb,0xcd,0x55,0x86,0xba,0x81,0x05,0xf5,0xac,0xa8,},{0x0d,0xe4,0x86,0xd2,0x11,0x5f,0xaf,0x2d,0x54,0x72,0x66,0x77,0x2e,0x43,0x0f,0xd9,0x72,0x7b,0xdc,0xac,0xe6,0xec,0xbf,0x2f,0xe2,0x3a,0xb6,0x0f,0x7b,0x52,0x54,0xb1,},{0x4c,0x00,0xa7,0x16,0x68,0xd3,0x21,0x3c,0x29,0xc7,0x04,0x1c,0x5a,0x03,0x7e,0xdf,0x13,0xc6,0x51,0x4b,0xd0,0xeb,0xc8,0x80,0xc9,0x09,0xca,0xff,0x15,0x06,0xa4,0x5d,0x27,0x80,0x9f,0xb7,0x4e,0x66,0x02,0xea,0x2a,0xad,0x0f,0x84,0x28,0x31,0xb7,0x4f,0xb3,0xd6,0x90,0x0c,0xcc,0x52,0x06,0x52,0xda,0x28,0x36,0x8f,0xd9,0x0c,0xa3,0x0e,},"\x11\x47\x43\xe8\x2a\x09\x93\xce\xc9\x70\x50\x67\xab\xd7\x7c\x16\x8b\x53\x67\x7e\xde\x5c\x15\x9f\xad\x36\xf0\x6f\xc1\xa1\x4a\xcd\x77\xf8\x83\x79\x9e\xd9\x88\x3f\x99\x15\xae\xa6\x38\xec\x17\x41\xf3\xf4\x21\x58\x55\xfb\x5b\x07\xdf\x37\x93\xbb\xe5\xb5\x68\xeb\x35\x94\x39\x1a\x9e\xf5\x72\x7f\xab\x93\xe5\x74\x69\xb3\x7d\xe1\x25\xb1\xe9\xf2\xe6\xfe\x2c\x3d\x1a\x10\xec\xf8\x7b\x6c\x0a\x66\x5c\x6d\x46\x0a\x17\x0e\xef\xb9\xbf\x71\x6c\xd8\xfa\xea\x97\x64\xf5\x79\xff\x34\xeb\xfa\x9c\x4c\xfb\x34\x70\x6d\x8d\xd7\xc9\xeb\x1d\x10\xb2\xdf\x46\x0a\x46\xbb\x57\x89\x43\x0b\xf4\x49\x15\x8b\x58\x24\xf2\xa3\xa7\xb9\x18\xb3\x3a\xcf\x2d\x9e\xbe\x90\x21\x6d\x1b\x7c\xbf\x4a\xf7\x70\xc5\xdb\x95\xfc\x62\xff\x3a\x3c\x38\x5c\x3a\x82\x17\x85\x3b\x73\x46\x63\x4a\xaf\x30\x60\x72\x88\xdb\x0c\x48\x3b\xd4\xc2\x22\xeb\x33\x2c\xb8\x9d\xc4\xa2\x17\xe6\x33\x4a\x26\x84\x13\xa3\x90\xbb\x37\x1a\xec\x35\x5f\xbe\x4c\x73\x6f\x7d\xa7\x5f\x9c\x88\x75\x41\xa2\xb7\xd0\xda\xc0\x18\xb6\x13\x8f\x02\x1e\x77\x26\x6d\xde\xce\x84\x68\x45\x2a\xda\x39\xf5\xe6\x3d\x02\x09\xb9\xd6\xda\xbf\x97\x54\x13\x25\x6d\xca\xa1\x5a\xc1\x4b\x60\x68\xe1\x77\x05\x6c\x7b\xf0\xf0\xf7\xc8\x84\xa3\x40\x20\x32\x29\x8c\xd5\x59\xa6\x31\x20\x39\x40\x06\x32\x32\x7f\x9c\x0e\x76\x3e\x52\x79\x8c\xb1\x77\xda\x44\x75\xe4\xb2\x40\x5c\x15\x7c\xa4\x27\x74\x11\x08\xd3\x3e\xd0\xb7\xa3\xf5\x34\x38\xce\x6b\x72\x5c\x6d\xd5\x81\x4a\xf5\x1c\xfa\x45\xdb\xce\xd5\x57\xf7\x26\xdb\x13\x0d\x55\xcd\xe7\x53\x3b\xc2\x09\x2d\x6b\x69\x9c\x2c\x87\x0a\xf2\x82\x73\x1e\x18\xd6\x51\xae\x85\xb3\xdb\x4b\xa0\x28\x53\xf8\xc8\x7f\xd5\xe3\xab\x69\xbc\x57\xb0\x8b\x81\xf8\x3c\x23\x9c\xcf\x22\xe8\x17\xe2\xad\xa4\xd0\xad\x14\x48\x7e\xd1\x46\x12\xc8\xb0\x97\x3e\xc0\x65\x0a\x55\xf6\xbf\x9a\xf4\xae\x92\x56\xad\x35\x46\xa3\xf6\x7d\xd3\x5d\x98\x7e\xf2\x19\x09\xa9\x4c\x50\xf0\xef\x06\x40\xe7\x55\xb1\xc4\xe1\xa0\x12\xaf\x0d\x31\x76\x6e\xeb\x5d\xf3\x1c\xd1\x04\xc6\x4e\xb6\x2e\xb4\xef\xb1\x39\xcf\x30\x57\x69\x40\x1d\x21\x3f\x96\xa4\x88\xd5\xee\x7e\x3c\xe3\x2b\x01\x92\xee\x8f\x08\x31\xbf\xbe\x8f\xe9\x5d\xe9\x56\x88\x6b\x52\x4d\x33\x19\xb7\x3f\xd5\x6d\xc6\x0e\x9f\x1c\x72\xd7\x81\x55\xa9\x7c\x6f\x43\x69\x7b\x20\x46\x6b\x3e\x7a\xeb\xd3\x57\xb9\x16\x96\xe7\x34\x8f\x45\x99\xb3\x4f\x35\x91\xed\xdf\xce\x2a\x7b\xd8\x49\xab\x16\xf7\xb4\x3e\xbb\x16\xe2\x3d\x6f\x52\x10\xef\xa3\x0a\xb3\xba\x8d\x32\xc4\x06\x62\xb8\x66\x2f\xd9\x11\x54\x4b\xc2\x45\x8c\x65\x69\xef\x75\xa9\xb9\xdf\x6a\x0f\x6d\x80\xd6\x58\xba\x86\xb2\x41\xca\x19\xce\x9a\x6f\xcf\x01\xd3\xda\xa9\x5a\xfb\x59\xc3\xd8\x9a\x18\xb9\x48\x62\x13\x94\x32\x7f\xc5\xe9\x20\xa7\x5f\x98\xf5\xe2\xb3\xd6\xc9\x5f\xd8\x52\xad\xf5\x67\xb6\xd3\x7c\x54\xd2\x97\x08\x56\xa5\x99\xf7\x49\xe2\xc5\x5d\xac\x7c\x23\xe3\xfb\x1a\x63\xbb\x4c\xc4\x7b\x8b\x94\xf3\xd5\x89\xac\x4b\xee\xf0\xaa\xd4\xe6\x29\x2f"}, +{{0x58,0x58,0x71,0x94,0x1c,0xc2,0x82,0xe3,0x33,0xd5,0x7b,0xbf,0xc3,0xd4,0xae,0xda,0x86,0x2c,0xfa,0x0a,0x37,0x50,0x30,0xcd,0x59,0x4b,0x36,0x92,0x84,0x8c,0x5f,0x00,},{0x4f,0x34,0x38,0x16,0xcd,0x48,0x05,0x0b,0x67,0x8d,0x3a,0xdf,0x70,0x00,0x88,0x77,0xc9,0xfc,0xf5,0xcb,0x66,0x2c,0xc4,0xad,0x2b,0x93,0x86,0x4c,0x02,0x09,0x07,0x07,},{0x29,0x88,0x56,0xe5,0x70,0x18,0x8a,0xef,0xca,0xd8,0x1b,0xb9,0x70,0xf0,0x76,0x96,0x57,0x70,0xc2,0x67,0x62,0xfe,0x29,0xe6,0x55,0x4d,0xc7,0xaf,0xcd,0xb8,0x01,0x72,0x3b,0xf6,0xc7,0x63,0xb4,0xcc,0xd6,0x5f,0x4e,0x15,0xd7,0xd8,0xea,0x38,0xfc,0xf6,0x7e,0xa9,0xd2,0x85,0x90,0xc7,0x92,0x55,0xc1,0xcf,0xeb,0xa7,0xb5,0xe4,0x5a,0x00,},"\x65\x1c\x10\x1b\x3e\x2d\xfe\xf0\x78\x3c\xe9\xf6\x1b\xd0\xa8\xbd\xc9\x30\x7a\xc0\x48\x8b\x9d\xd7\x0c\xd9\x0a\x7e\xd8\xf1\x79\xa7\x89\x35\x55\x62\x95\xb9\x1c\xc2\xb9\x72\x11\xe3\xb9\x81\xb8\xda\xfc\xb3\xd0\x6b\x76\xd0\xb6\xed\xa7\xfc\x61\x94\x5c\x0e\xe2\x65\x2c\x5a\xc4\x54\x25\x64\x96\xcb\x82\xf9\x8c\xc1\xcc\x92\xd8\x18\x93\xb1\x08\x2b\x31\xb4\x7e\x6d\x22\xa2\xde\x60\x9d\xe4\xce\x8d\x7c\xc4\xf4\xa1\x52\xc4\x7f\x41\x0d\x7f\xc3\x7d\x38\xcc\xd6\x29\xa4\xb3\x3e\x62\x21\x89\x60\x81\x79\x7d\x07\x53\xdd\x4f\xaa\x8a\x8b\x44\xd6\xc4\x67\x71\x66\xdf\xb4\xd5\x21\x54\x46\x36\x0a\x3c\x28\xd8\xf6\x8e\x38\xab\x54\x60\x8b\x98\x82\x1b\x83\xc1\x87\xb5\x39\x3a\xd8\x74\xa7\x6f\x4f\x5d\x72\x94\x93\xa1\xfd\x74\xcc\x77\x19\xca\xea\x99\x1d\x22\x9c\x5d\x0c\x8c\x4c\x5f\x89\xd8\xe4\x34\x5f\x4f\x52\x21\x43\x13\x41\x0b\x8c\x06\xb3\x31\x5f\x45\xed\x0c\x2f\x91\x38\xab\x96\x6a\xec\x0a\x64\x5b\x6d\xba\x76\x38\x0a\x53\x91\x23\xe0\xf3\x3b\x97\xf3\xd0\x60\x39\x4a\x30\x53\x58\x1f\xfd\xef\x3e\x6d\x36\x53\x11\x66\xb5\x53\xa9\xdd\xe0\x31\x05\xc0\x4a\xf6\x97\xd9\x5e\x95\x21\x7f\xd6\xdc\x96\x8b\xf3\xb4\x48\xd5\xf3\xa8\xe4\xf5\xae\x7e\xdc\x30\xec\x78\xb1\xae\xa4\xf0\xdb\x18\x9a\x94\x9a\x12\x21\x38\xcd\xfb\x5f\x96\x93\xdb\x00\x4b\xae\xd1\xa4\x21\xdc\x44\x12\x2f\x32\x72\x87\xf7\x27\xcf\x98\x9f\xca\xe3\xcf\x3b\xe3\xe3\xdd\x9b\x9f\x53\x50\x2c\xf5\xd9\xfb\x18\x6d\xe7\x91\xd3\x10\xd1\x22\x86\x9c\x9f\xc3\xb6\x95\xde\xc1\x60\x74\x77\xf3\xe1\x49\xe5\x2b\x63\xcf\xdf\xb0\xd9\x83\xe8\x9a\xf2\xf7\x5a\x8f\x48\x98\x43\xec\x05\xc5\xea\x5f\x0e\x72\x1a\xca\xb3\x87\xc6\x80\x25\xf2\x0a\xbe\x0d\x27\xb4\xce\x29\xf4\xa6\x4f\xb7\xf8\xe8\xa3\x32\x87\x3d\x3e\xd1\x21\xfb\x49\x34\x14\xb8\xcb\x0c\x00\xad\x3a\xb6\x16\xc5\xbe\x52\x41\x47\x1a\xde\xe9\xf8\xf4\x69\x74\xea\xe8\x4a\x4a\x8c\xe6\xfa\xbb\x7f\x5d\x9a\x6b\x75\xa7\xe6\x70\x45\x6f\xcd\xcd\x1d\x98\x2e\x8f\x82\x7a\x4b\xbb\x69\xde\xc7\xe3\x05\x3d\xfe\x83\x5b\x70\x30\x1b\x7b\x76\x3f\x00\x04\xbc\x90\x6e\x14\x55\x42\xf4\x87\xb4\xdb\xa2\xed\x56\x1b\xd1\xa2\x03\x06\x23\x6a\xf4\xb3\x6e\x40\x68\xe8\xc0\x07\xb9\x45\x4f\x87\x41\xa5\xf8\xf0\x79\xec\x1d\xb8\x83\x5e\xb6\x54\x42\x90\xd6\xad\xb5\x2a\x70\xd7\x67\x5d\x85\xdf\x4a\x9a\x12\x55\xbf\xd9\x36\xc3\x31\xfe\x51\xc0\x97\x7d\x12\x4b\x5a\x50\x6d\x29\xc6\xee\xc3\x3c\xaa\x25\xd8\xeb\x28\x95\x2d\x6f\xfb\x9d\x6e\x3d\xa8\x90\x38\x2d\x88\x87\x96\xd3\x74\x60\x7f\x66\x43\xb8\x9e\x73\x26\xd9\xed\xc4\x9a\x0f\x53\xbd\xcb\x8c\xc7\x6f\xfd\x39\x3a\x77\x06\x52\x2d\x04\x17\x00\x36\xcc\xb6\x63\x30\xdb\xac\x9d\xa7\xe6\x16\x8c\xaa\x88\xcb\x62\x18\x1e\x55\xa7\xb6\xd5\x21\xa2\x11\x5e\x23\xe2\x02\xee\x24\x80\xb5\x87\xbe\x45\x01\x44\x79\x79\xa8\xd7\x36\xf9\x01\x2e\xcf\x00\xe6\x7b\x31\xe8\x10\x4f\x6e\x7d\xf0\x8a\x96\x83\xcd\xc8\x9c\x03\xa4\xe3\x7e\xe2\x29\x28\xd4\x5f\xa1\x90\x94\xe0\xd6\xe7\xb4\x0b"}, +{{0x05,0x88,0xac,0xd4,0xe0,0x9b,0xa9,0x02,0x74,0xc8,0xf3,0xd1,0x57,0x5b,0x2b,0xf3,0x64,0xa7,0x76,0x88,0x4a,0x9a,0xeb,0x41,0x03,0x41,0x5e,0x16,0x3b,0xa0,0xbf,0x81,},{0x3e,0xca,0xe6,0x97,0xb4,0x25,0xd8,0x7e,0x34,0xa1,0xd9,0x44,0x09,0x8e,0x3d,0x32,0xe2,0xc1,0xec,0x56,0xc3,0x62,0x7d,0xf8,0x0b,0xa2,0xb8,0xa4,0x3d,0xdc,0x19,0x03,},{0xa1,0x11,0xb9,0x70,0x6d,0x24,0x2c,0xd3,0x6d,0x6e,0x87,0x41,0xcb,0xb0,0x97,0xb9,0xe2,0xff,0xfa,0x40,0xf4,0x3f,0xd6,0xf2,0xd3,0xd9,0x16,0x93,0x66,0x73,0x32,0xb5,0xf2,0xdb,0x5e,0xe3,0xea,0x20,0xb8,0x32,0x91,0xb8,0x40,0x57,0x95,0xb7,0x4d,0x63,0x3d,0x46,0xf4,0x75,0xab,0x7c,0x47,0x61,0x71,0x18,0x53,0x5b,0x80,0x51,0xd9,0x07,},"\xf8\x28\xf8\xc9\xda\xd2\x98\xc5\xb7\x19\xda\xa8\x52\xb1\x7e\x76\x25\x98\xa7\x0f\x4e\xcd\x16\xa2\xfc\x59\x6e\xb0\x26\x38\x99\xe9\x83\xd4\x4e\xdc\xc7\xbd\x24\x0c\xb0\x76\x10\x60\x0a\xe9\x6a\xac\x0d\xfc\x3b\xe3\x87\xb6\x16\x85\x08\x99\xb5\xcf\x44\xe1\x76\x7f\xfa\xca\x3d\xf3\x81\x58\x59\x84\x24\xf8\x07\x14\x14\xc7\x04\xe6\x0b\x42\x2a\xd7\x73\x77\xfa\x7f\x6a\x8c\x5d\x0e\xbc\x02\x35\xe2\xd4\x3a\x98\x4f\x3a\xdf\x75\x9e\xb1\x04\x47\xf3\xc2\xf6\xb8\x0d\x5a\x11\xef\x41\xd3\xa0\x98\x52\xc0\x93\x2a\x1b\x9a\xc2\x3e\x6f\x40\xa1\x67\xde\x21\x04\x1b\xec\x88\x85\xf9\x43\x3e\xb8\x0b\x95\xc9\x78\x59\x58\x04\x6c\xdb\x7b\xf1\x47\xa7\x99\x47\x82\x3b\x41\x49\xae\x05\x21\xd7\xe5\xaa\xbc\x15\x64\xfa\x40\x44\x10\x6e\x2e\x39\x2e\x9c\x34\x44\x57\xe9\x92\x93\x76\xea\x9b\x42\x29\xc6\xe7\x73\x8f\xe7\x90\x08\xd5\x54\xc4\x29\x39\x69\x14\xc3\x63\x87\xf5\x79\xb4\x6b\xab\x14\x6f\x6a\x95\x10\xeb\x6f\x8c\x85\x55\x1c\xbd\x84\xc7\xdc\x0d\x0b\x1c\x01\x0c\xcb\xa5\x96\x3a\x7f\x39\xf1\x81\xe4\x4d\xbc\x98\xe4\x95\xaa\x63\xc0\x10\x59\xcb\xe6\xa9\x9b\x07\xb4\x49\xe7\x75\x9c\x9a\xf9\xe0\xf8\xd9\x05\x4a\x67\xa3\x48\xfa\x19\xd7\xf9\x1e\xc0\xa4\xd4\xf2\xc7\x02\x6c\x3b\x84\x92\x59\xa3\x50\x41\x7f\xd8\x6c\xab\x21\x42\xe4\xcf\xe3\xc0\xaf\xbf\x25\x18\x2a\x2d\x52\xbd\x2e\x0b\xc9\x20\xe8\x50\x80\x83\x2b\x91\xb9\x27\xb6\x29\x48\xa6\x7c\x31\x7e\xb0\x90\x91\x46\x1d\x49\x3e\xea\x5f\xfc\x47\xbf\x08\x55\x82\x96\x82\x58\xa3\xc8\xdd\x81\xa8\x58\x27\x0b\xdd\xaf\xe7\x92\x56\x84\xa1\x5f\xfb\x51\xbc\xfa\xab\x93\x1a\xfa\x46\x5e\x30\x90\xe8\x6b\xe4\x1e\x35\x47\xcb\xa2\x34\xb8\x5f\xe7\xdb\x70\x04\x96\xa5\x05\x00\x2d\xf3\xca\x4e\xae\xc7\xb9\x62\x78\xc7\xd1\xa7\x7d\xb8\x34\xa9\x17\x97\xbb\xb8\x26\xd0\x92\xaa\x28\xb4\x95\x45\xed\x3b\x1e\xda\x23\xbe\x11\xa3\xf5\x28\xb9\x55\xcb\x0c\x4f\xa6\x6e\x16\xe9\x57\xe5\x70\x4c\xf3\x19\xe5\xf7\x9c\xc0\x9f\x2d\x05\x4e\x6d\xaf\x19\xe2\x92\x6b\x11\xe1\xe4\x13\xff\x82\x2c\xa1\x41\xf7\xc3\xd3\x85\xae\x95\xdd\x20\xb3\x46\xe5\x83\xcf\xb0\xc2\x29\xec\x39\xcf\x88\x9a\x54\x19\xcd\x37\xbc\x18\x4e\xf5\xfb\x14\x46\x22\x08\x0a\x30\x2d\x9d\x77\x45\xc4\x51\xf7\xd8\x82\x42\xcc\x26\xb9\x16\xa3\x56\x9a\xbc\x7d\x1f\x21\x6d\x57\x79\x7a\x47\x2b\xc6\x21\x76\x17\x58\xe8\x40\xeb\x8e\x29\xbc\x8e\xfc\xb7\xaa\xfc\x7c\xf8\xf4\xe5\x93\x30\xd3\x5e\xe1\x07\x49\x6d\xec\x6e\x71\x4b\x1f\xa4\x30\x98\x37\xbb\x47\xeb\x3a\x06\xb4\x60\x4d\xd2\x07\x33\xcc\x0e\xaa\xc2\x64\x9e\x18\xc0\x73\x42\xef\x55\xd1\x9b\x8d\x03\x95\x91\xac\x28\x69\xac\xc3\x4b\x6c\x3c\x1c\xa3\xcf\x26\x3f\xf8\x4c\xa4\x3a\x5f\x64\x65\xba\x34\x88\x8c\x10\x90\x13\xb3\x2b\xfc\x0d\x0d\x15\xf5\xa7\x6c\xec\x27\x0a\xb3\xac\x9a\x10\x63\x31\x31\x2f\x5a\x0a\x84\x28\x2c\x3a\x3d\x4a\xea\x1e\x7c\xf5\x3d\xbf\x8b\x24\x0b\xdd\x11\x1c\x34\xd2\xa9\x3d\xfd\x12\x58\xfe\x92\x67\x13\x3f\x75\x54\xdc\xc2\x1a\x8f\x43\x9c\x16\x5d"}, +{{0x7d,0x14,0x02,0x3e,0xb4,0x8b,0xbd,0x43,0x76,0x49,0xa2,0x41,0x87,0x79,0x05,0xa3,0xc9,0x32,0xf1,0x46,0x40,0xf2,0x9a,0x0f,0xb1,0x34,0x11,0x4e,0x8f,0x33,0xf5,0x82,},{0xea,0x5c,0x11,0xb4,0xb2,0xc5,0xef,0x4a,0xb7,0x06,0xcc,0xa3,0x47,0x50,0x43,0xc9,0x58,0x18,0xeb,0x56,0x5a,0x79,0x7e,0x33,0x68,0x8a,0xfe,0xac,0xd6,0x8a,0xdc,0xca,},{0x31,0x33,0x9d,0xce,0x23,0x33,0x6d,0xf5,0xb2,0xb1,0x93,0x52,0x2a,0xa3,0xdd,0x2d,0x41,0x14,0xa6,0x6a,0xf1,0x65,0x62,0x89,0xc9,0x52,0xbc,0x11,0xc9,0xb2,0x10,0xf7,0x7a,0x54,0xd4,0x61,0x61,0xf4,0xe0,0xc5,0x2b,0x30,0x13,0xe4,0x0b,0x9e,0x9e,0x84,0x27,0xd8,0x51,0x32,0x5b,0xd7,0x1c,0x4d,0x99,0x35,0x3e,0xee,0xd7,0x51,0x08,0x0d,},"\x90\x01\xdb\x31\xf2\x79\xbe\x50\x53\x19\xb8\xe7\x2b\xde\x11\x99\x51\x29\x80\xdf\x65\xf0\xd8\xa9\xb4\x93\x04\x67\x41\x3a\x99\x7b\x97\xa3\x62\xb5\x72\xa4\xb4\x4b\xc9\x40\x48\x7f\x18\xb2\x08\xce\x6a\xc5\xc6\x87\x16\xd3\xaf\x1b\xce\xf1\x70\x38\x3b\x5c\x4b\x5c\x47\xe4\x47\x37\x72\x6f\x93\x83\xbc\x4f\x14\x47\x68\xbf\x5c\xaf\xb4\xe9\xdf\xe3\x97\x61\xe6\xed\x47\x89\x71\xd1\xc7\x0e\x6d\xab\x2f\xd0\x49\x9d\xff\x92\x93\xb2\x39\xd1\x6c\x96\x02\x61\xc6\x82\x18\xb9\xf5\xb1\xbe\xe6\x90\xf0\xd2\x40\xc1\xb3\xdb\x71\x1f\x9e\x82\x1f\x08\x09\xbb\xeb\x9a\xaf\x24\x9c\xcb\x16\x8c\x67\xd9\x65\x56\x2d\x24\xf8\x48\x51\x61\x40\xbf\xd9\xfc\x05\x0d\x4f\x20\xda\x5a\x17\x94\x46\x8a\x9c\x07\x25\xea\x5c\x66\x9d\x5c\x63\x0d\x93\x10\xe5\x74\x51\x07\xda\xd3\x72\x61\xb5\xd9\x1e\x38\xe0\x85\x12\xe6\xf3\x73\xec\x5d\xca\xd5\xca\x09\x07\x29\x07\xc8\xfb\x7b\xf3\xb9\x26\xc3\x33\x94\x90\xb3\xf5\x1f\x76\x44\xe7\x3a\xe2\xec\x01\xd6\x1b\xe7\xc6\x52\x65\x36\xb4\xff\xd1\xab\x68\x49\xfe\x0c\x2f\x40\xd3\xbd\xa2\xa4\x9e\x55\x50\xb8\xdf\x97\x90\x81\xda\x85\x16\x8d\x0f\x71\x58\x2b\x90\x36\x77\x52\x6d\x1f\x1b\x15\x11\xe1\x38\xb6\x84\xfc\x46\xaa\xc8\xbd\x80\xc3\xde\xf7\xee\x81\x38\x19\x04\x61\x80\x7c\x55\x36\x12\x5c\xb0\xe2\xc3\xd0\x83\xa1\x87\xc7\x26\x9c\xb5\x31\xec\x36\x78\x78\x7b\x32\x55\x5c\xf0\x4a\xb0\x93\xc9\x00\x2e\x7d\x79\x2b\x4d\x93\x3f\x2e\x30\x70\xf3\x9a\xc8\xcc\xf8\xd5\xf5\x45\x5f\x12\x10\x9d\x8a\x8a\xeb\x4e\x21\x2f\xad\x4a\x70\xb1\x47\xc0\x4a\x7b\x91\x84\x60\xb1\x31\x63\x76\xe6\x40\x20\x85\x95\x17\xeb\x7e\xe3\x0c\x29\x0b\xe8\xb8\xd6\xf9\x67\x39\x15\x25\x6c\x3b\x04\xb9\xd9\x05\x4b\x52\x33\x8e\x0d\x36\x07\x85\xe4\x6a\x18\x28\x44\xc5\xc3\x76\x6a\xea\x8e\xd3\x11\xb2\xd4\x81\xc0\xb7\xb2\x11\x4e\x41\x8e\xd1\x7f\x8d\xeb\xf0\x1a\x83\xff\x37\x51\x70\x24\xee\x9e\x28\xe0\xc9\x0d\xce\x6d\x05\x9f\xfe\xe4\x13\xd2\x7c\xd6\x27\x83\xa8\xb8\xb5\x01\x6a\xd2\x76\xe3\x9d\xfd\x8f\x8f\x3d\xdf\xc4\x28\x10\x18\x18\xce\x50\x7f\x00\x3e\xb5\x8c\x9a\x5c\xc8\xb1\xaf\xf0\x5a\xab\x8f\x0d\x7f\x1d\x1f\x6d\x4b\x87\x1d\xbc\xed\x1f\x3d\x28\x66\x23\x97\x52\xfb\x13\xf6\xe1\x80\x34\xbb\x2b\x5a\x66\x35\xca\xa6\xec\xc4\x62\xe0\x58\xeb\xe2\xfa\x65\x1d\x3d\x0f\x36\xe2\x0a\x31\xf7\x65\xe4\xb9\x58\x27\x0b\xd8\x25\xc6\x81\x8a\xac\x1a\xd7\x56\x31\x35\xae\xed\xf1\x4a\x2b\x6d\x39\x8b\x6e\x34\x00\x84\x01\xb2\x18\x46\x18\x20\x07\x1c\x5a\xf7\x78\x46\xcb\x9c\x32\x81\x90\xc0\x61\xd5\xaa\x6e\x0e\xcd\xe7\xef\x58\x56\xb0\xe6\x81\x4f\x83\x3f\x70\x40\x96\xdf\x08\x25\xfa\x4b\x46\xdc\xda\xcf\xa2\x7c\xd8\x7b\xd7\xbf\xef\xf7\xf8\xca\xe1\x66\xa3\xa0\x4d\x43\x7c\x7b\xe7\x16\xc4\x90\x45\xc7\xbd\x3d\x13\x49\x62\x7c\x9c\xbd\x04\xc1\x5f\x00\xa6\x96\xe3\xcf\xfb\xb4\x5a\xf2\x91\x22\x62\x7e\x7e\xd3\x3b\x42\x49\x91\x3b\xec\x00\xf0\xe2\x8a\xa1\x12\x98\xcc\xe8\xb6\x49\x08\x1f\xe3\xb1\x69\xb4\xaa\xea\xca\x48\x5b\xda"}, +{{0xe8,0x30,0x6b,0xad,0xa6,0xd5,0x5e,0xb1,0x88,0xd9,0xf7,0x5c,0x81,0x5c,0xc9,0x14,0xe9,0x3c,0x9c,0x72,0x22,0x39,0x1c,0x15,0xbb,0xae,0xaf,0x93,0x54,0x43,0x79,0x35,},{0xbf,0x27,0x98,0xb8,0xe5,0x54,0xf5,0x1e,0x22,0x86,0xc3,0x03,0x4a,0x88,0xe5,0x77,0xff,0x23,0xfa,0x32,0xa6,0x72,0x44,0xea,0x82,0x45,0x91,0x2e,0x8b,0xf4,0x6d,0xa4,},{0xcc,0x66,0x27,0x30,0x8e,0x2f,0x42,0x43,0x83,0xfa,0x70,0x59,0x4f,0x57,0x57,0x91,0x60,0x05,0x40,0x02,0x7a,0x27,0x51,0x61,0x9b,0x28,0x3a,0xff,0xea,0xeb,0xc9,0xc9,0xd2,0x9a,0xc6,0xdb,0x28,0x6d,0xd2,0xc1,0xb5,0x96,0x58,0x7b,0x87,0x8d,0x1d,0xf4,0x78,0x1d,0x43,0x6b,0xb5,0x70,0xc1,0xc0,0xf0,0xd3,0x33,0x68,0xdc,0x66,0x52,0x0b,},"\xd7\x04\x38\x09\xc3\xe3\xdc\x00\xb1\x7e\xfd\x52\xc9\x13\x0b\x11\xb7\x86\xf1\xe2\x57\xb5\xe2\x2f\x81\xa7\xfa\xae\x60\x0b\xbc\xdf\xd5\x18\x53\x7f\xe8\x52\xc6\x42\x35\x97\x62\xfb\x75\xe8\xad\x85\x92\x49\xe6\xab\x49\xce\x1b\xb0\x4f\x24\x92\xf2\xaa\xc3\x54\x46\xba\x6e\xb0\x3e\x76\xde\x3a\xbd\x2d\x5f\xc7\xe6\x14\x68\x43\xad\xd0\x42\x86\x0a\x4a\x16\xb5\x9b\xdd\x7d\x03\x83\x78\xa3\x5e\x1a\x04\xb1\x21\x7a\x55\x71\x0d\x93\x7e\x2c\x90\x32\x23\x2e\xa2\xcd\xd1\xd2\x5a\x0b\xff\x71\xef\x5d\x3e\x0c\x05\x6b\x29\xcb\x92\xf6\xdf\x69\x2b\xde\x14\xdf\xa5\x0e\x13\x2b\xeb\xd8\x9e\x9f\x18\x33\x88\x0b\x65\x7a\x78\x1e\x94\xec\xb6\x03\x04\x17\x56\xe5\x51\x7d\x44\x23\xc5\x6f\xad\xc1\x3e\x2b\x31\x80\x88\xfe\xdd\xf3\xb5\xc8\x3c\x20\xb4\x6f\xdd\xbb\xa9\x23\x05\xe4\x86\x06\xda\xb7\x48\xce\x38\x48\xb8\x43\xf4\x71\x1f\x37\x0c\x3e\xc7\xd5\xe1\x9a\xb4\xc0\xac\x1a\xe1\x5a\xaa\xf2\x3d\x65\xfe\xce\xda\xbc\x08\x04\x9b\x9e\x29\x11\x3e\x57\x61\xed\x9d\x1c\x62\xeb\x07\x5c\xab\xb2\x67\x4c\xdb\xe1\xe3\xa8\x89\xba\xe4\xb1\xdd\x31\xb6\xa5\xb2\xea\x1b\x8d\xed\xcc\x3c\x51\x5e\xdc\x44\x67\xc3\x02\x31\x17\x6c\xd4\x4b\xec\x8a\x05\x79\x51\xab\x5c\xd3\x9a\x96\x23\xf8\xaf\x84\x73\xcd\x27\xd9\x33\x02\xbf\x8a\xa6\x24\xc9\xc3\xc5\x79\x9d\xa1\xdc\x49\x44\x94\xef\x8f\xf1\xdb\xe0\x18\x7e\xa5\x16\x26\x70\xb8\xd0\x98\xc3\xa9\x49\x19\x39\x8d\xad\xf7\x9e\x6c\x24\x91\xc4\x44\x39\x2c\x29\xcd\x50\xd5\x74\x35\x06\x32\x90\x84\x2b\xfa\x0e\x85\x30\xfa\xeb\xc0\x06\xd6\xea\x78\x01\x11\x7e\x0a\x3f\x01\x9e\xe2\x8f\xb3\x79\x22\x35\x40\x2e\x2f\x69\xb8\x7a\x43\xdc\x22\x7f\x9d\xe3\x16\x02\x97\x56\xc3\x16\x7d\x64\xa3\xa3\xf6\xd7\x31\x60\x33\x1d\x5a\x18\xee\xe5\xb0\xe6\xe2\x2a\x66\x3e\xfd\xcc\x8d\x67\xaf\x3b\xce\xd0\x41\xea\x84\x3a\x56\x41\x60\x3e\xc7\x2e\xfd\x64\x4e\x17\x3d\x19\x9a\x8c\x83\x0b\x2e\xa5\xfe\xc0\x37\x80\x27\xc3\x72\x25\xaf\xcb\x60\x4c\x4c\xdc\xf4\x09\xbe\x1c\x50\x9c\x9a\x37\x7b\xe0\xd0\x52\x41\x07\xc6\xd9\x2b\x5f\x09\xa2\x9e\xfb\x71\x09\x29\x56\x70\xbb\x1a\x1d\xd3\xea\x00\x8b\xb7\x91\x85\xf0\x9b\x98\xf0\x20\xc4\x3f\x14\x39\x68\x5b\x96\xf6\x19\x93\x11\xa0\x90\x87\x0f\x0d\x9b\x10\xd4\x95\xcd\x41\x0a\xa9\x5b\x7e\x53\x74\x9b\xe3\xa6\xc0\xfb\xc7\x29\xf9\x6c\xf8\x56\x43\x97\xb0\x9c\x13\x51\x40\x16\x82\x5f\x72\xf1\x4e\xb9\x32\x94\xd7\x01\x0a\xcc\xfd\x11\xf1\x7a\x6a\xc8\xf5\x44\x26\x3d\x60\x38\xd5\xc7\xdb\x29\x48\x62\x91\xb3\x0e\xa4\x9b\x6b\x54\xcf\x88\x82\x6d\xd2\x52\xcd\x9d\xbb\x57\xd8\x41\xb5\xa4\xcf\x70\x2a\x32\x64\xfa\xa4\xdc\xcc\x86\xab\x14\xda\xf1\x24\xef\x3d\x53\x35\xa6\x87\x8d\x06\x5c\x6b\xa2\x99\x91\x04\x57\x65\xee\x55\x42\xcc\x9f\x5d\x9f\x35\x4d\xcd\x2c\x6e\x0c\xf7\xff\x3a\x30\xf6\x49\xb5\x91\x2d\x97\x1d\x63\x35\x78\xf1\xe9\xf2\x63\x87\x4d\x05\x65\xc2\x47\x30\x1d\xcb\xd1\x5d\x76\x21\x1a\xe2\xd3\xd5\x06\xfc\x64\xde\xb7\xe0\x42\x56\x5d\x43\x8e\x2b\xfb\x24\x92\x43\xb7"}, +{{0x36,0x3c,0x1e,0xa7,0xc3,0x2e,0xa3,0x28,0xa0,0x55,0xaf,0x7b,0xd8,0xb3,0xbf,0xd2,0x04,0xfb,0x0b,0xbd,0x4b,0xf4,0x2f,0xfe,0x26,0x2f,0x3a,0x5e,0xbd,0x54,0xda,0x55,},{0x7a,0x83,0xec,0xca,0x51,0xef,0x6e,0x5a,0xa0,0x43,0xa5,0xce,0x04,0xd9,0x28,0x8a,0xdd,0x49,0xa2,0x77,0x54,0x8b,0xd3,0x01,0x6b,0x69,0x3f,0xfa,0x79,0xa2,0x2e,0xdc,},{0x5f,0xd1,0xe5,0xf9,0x92,0x2a,0x12,0xf6,0x36,0xb7,0x2a,0x7d,0x62,0x17,0x09,0x1f,0x94,0x8a,0x55,0xbc,0xb1,0x82,0x6b,0x8f,0xca,0xf9,0x9d,0x26,0x41,0x6c,0x7a,0xb1,0x35,0x1c,0x10,0xf4,0x09,0x3f,0xfd,0x8a,0x2a,0xf8,0x69,0x14,0xa0,0xa9,0x81,0x84,0xec,0x7e,0x06,0xd2,0xde,0xe8,0x7f,0xdc,0x0f,0x4a,0x47,0xf8,0xc6,0x3c,0xf5,0x01,},"\xc4\x1c\x1e\x1f\xb7\x59\x54\xa0\xae\x0e\xbc\x29\x09\x0b\x9f\xc5\x33\xe6\x93\xe7\xc7\x10\x5c\xfe\x40\xef\x52\x6e\x4e\x12\xa7\x40\x52\x21\xf2\x18\xc7\xac\x01\x9e\x1d\x4c\x92\xda\x28\x53\xf2\xd7\x26\xaa\x62\x27\x79\x24\xdf\x0c\x34\x3f\xc3\xd4\x7c\xd5\xa9\x9a\x3e\x27\x9b\x26\xa1\xb1\x3b\x1f\x2a\xa3\x6f\x7c\xcb\x4b\x54\xfb\xef\x18\xbd\x87\xa5\x5f\x1b\xc4\x0c\xe7\xb2\x02\x91\x45\xee\x7a\xab\x39\x17\x95\xac\x68\xde\x61\x99\xf5\x05\x94\xfc\x79\x61\x1b\x85\x13\x1c\x14\x30\x21\xf2\x6f\xa3\x58\xda\x0c\x7c\x6a\x65\xdd\xe0\x76\xda\xb4\x88\x67\x5b\x72\x23\x09\xe5\xed\x97\x46\xd1\x8a\x89\x30\x99\x06\xa7\xa9\xdf\x23\x7d\xd2\x7b\xd5\x90\xcc\xc7\x7c\x40\x2e\xf6\xe1\x9c\xa6\x3c\xc8\x6b\x85\x16\x03\x30\xee\x6e\x1f\x1f\x47\xa2\xff\x80\x7e\xef\xad\xc0\x09\x63\x52\x0a\x1c\x60\x0a\x3e\x45\xaa\x7f\xb2\x55\x4f\x47\xd8\x97\xbd\x86\xd8\x1c\x3b\x08\x77\x10\x12\x22\xfa\x78\x50\xb8\x0c\xe3\xbc\x06\xc9\xe5\x8c\x0c\x96\xe3\x2f\xec\x85\x30\xc9\xfa\x1e\x41\x63\xf0\xef\x84\x56\x95\x2b\xf6\xdd\x58\x04\x5a\x36\x3d\x61\x88\x0e\x9a\xc9\x76\xa3\x60\x3e\xf7\x7a\x4c\x39\x5e\x6a\x07\xe3\x42\xf6\x02\x3b\x8a\xf1\x02\x25\xcf\xf2\x40\xef\xc0\x36\x6a\x79\x9f\xd8\x6e\x9d\x06\x20\x60\xd8\x72\x40\x33\xbd\xf6\x75\x88\xcd\x73\xac\x28\x4d\xe4\xc6\x94\x3c\xf4\x5e\xe4\xf7\x5f\x59\x37\xd9\x7d\x78\x10\x5f\x0b\xbe\xce\x04\xd3\xdc\xb5\xe4\x24\xef\xf8\x9b\x77\x3e\x5d\x6b\x4f\x37\xef\xa9\xa0\x65\x4c\xb3\xef\x34\x52\x78\xa6\x2d\x87\x6c\xfe\xf9\xa3\xdc\xdc\xeb\x70\x81\x44\x18\x77\xeb\xd5\xfa\x30\xc9\xd9\x54\xe3\x68\x4f\xa4\x76\xa4\xf4\x85\xd4\x26\xfd\x3c\x8c\x32\xbe\xa0\xf9\xcc\x20\xb1\x5e\x8f\xdf\xc3\xca\x4b\x30\x2c\x07\x4f\x50\x81\x32\xd1\x5d\xe6\x25\xc1\x0a\xe0\x73\x78\x11\x46\x3d\xcc\x55\xfc\xc4\x01\x4b\x20\x20\x8f\xff\xce\xfa\x9d\xd4\x52\x11\x9b\x16\x52\xde\x41\x34\x8f\x69\xf2\xc4\x88\xf5\xcc\x18\x56\xd6\xe7\x8a\x5c\xbe\x3e\x37\x3d\xd4\x59\x8e\x2d\x39\xf8\x76\xeb\x94\xe0\xb0\x1b\x21\xfa\x91\x29\xef\x41\xb6\x39\xf4\xe0\x5e\x69\xde\xb1\x83\x5e\xd4\x4b\x91\x12\xa6\x86\x2a\x5b\xce\xa0\x72\xc6\xe1\xb8\xf0\xf0\x58\xf4\x6b\xac\x2a\x84\x5a\x58\x2d\x14\x8f\x17\x76\x0b\x9e\x0a\x2b\xa6\x0b\xbb\xf3\x88\x4a\xf9\x4d\xd4\xc7\xec\x9d\xb0\x8e\x9a\x5b\xcc\x6d\xde\x13\x46\x44\x2e\xe1\xf4\x70\x7d\x1f\x79\xb6\x9b\xa8\x67\xf4\x18\xdc\x27\x91\x73\xf7\x7a\xdb\xc5\x8a\xb8\x5e\xa3\x93\xb9\xdc\x68\x26\x19\x00\xc1\xca\xa8\x2d\x2f\x50\x47\x4c\x42\xae\xc9\x11\x31\x42\x78\xc0\xaf\xfa\x2a\x6b\x6c\x36\xd1\xff\x88\xf3\xb4\x9f\xb2\xb7\xc3\x39\xd2\xa7\xc2\xb3\x04\x9f\x8c\x0a\x08\xd1\x6a\x9e\x8d\xf9\x3d\x13\x0d\xa4\x84\xbd\xba\x6d\xbe\xc5\x34\xcd\x51\x09\x7a\x04\x82\x21\x10\x6b\xab\x48\xd6\x7f\x95\x1b\x75\x05\xa1\x48\x48\x92\xb8\x57\x79\xc5\xa3\x11\x17\x02\x12\x4d\x95\x7a\xcf\x2d\xc3\x52\xef\x9b\xa2\x47\xbc\x80\xe2\xce\x96\x26\x9c\xe8\x5e\x78\xb9\xeb\xda\x98\x90\x76\xdd\x5f\xf7\x3e\x1e\xb2\x75\xe5\xd7"}, +{{0xdb,0x22,0x28,0xff,0xff,0xa9,0xd2,0x53,0x4a,0xef,0x91,0x8f,0xb8,0x5b,0x82,0x1a,0xd3,0x60,0xe2,0xd3,0x9d,0xec,0x5a,0xeb,0x2d,0xb0,0xdf,0x02,0x49,0x7f,0x94,0x16,},{0x6d,0x01,0x95,0x77,0x7f,0x81,0x05,0xff,0x52,0x3b,0x79,0xc5,0x9e,0x3c,0x30,0x81,0xfe,0x89,0xdb,0x6f,0x87,0x03,0x3f,0x09,0x4f,0xa5,0xa9,0x40,0xce,0xf8,0x4b,0xb4,},{0x82,0x18,0x9d,0x34,0x0b,0xc1,0x1c,0xea,0xa4,0x00,0x41,0x0e,0x08,0xba,0xe9,0xd9,0x01,0xaf,0x05,0x91,0x25,0xe9,0x53,0x78,0x6f,0x8a,0x04,0x3d,0xdf,0x11,0xf7,0xb2,0xf8,0xe3,0xb6,0x17,0xac,0xcd,0x78,0xe2,0x93,0x9a,0xdf,0xab,0xf2,0xd2,0x47,0x1f,0xaf,0xd6,0xf5,0xbc,0x45,0xb1,0x40,0x75,0xb3,0x28,0xe3,0x4d,0x80,0x75,0xb2,0x07,},"\xfc\x07\xcd\x99\x04\x0f\x13\xe5\xa8\x4f\x94\x74\x6d\x6b\xb8\x68\xf7\x52\xb4\x48\xb6\x2d\x99\x59\x3e\xf2\x9e\x43\xcc\x82\x45\xf0\x47\x0f\x65\x55\x2d\x64\x32\x20\xf6\x71\x92\x85\xe1\x5c\x37\xa6\xd1\x74\xae\xf7\x60\x88\xcc\xda\x5f\x88\x68\x5b\x52\xda\xe2\x84\xc6\x5b\x38\x0d\xa3\x45\xa2\xe1\xaf\x2e\xd7\x64\x80\xd2\x69\xcb\x93\x4b\x43\x17\x62\x0b\x79\x2e\xbb\x39\xb2\xa6\x78\x24\x7d\x6d\x81\x5f\x2a\x5c\xb9\xaa\x56\x0e\x4b\xf6\xde\xba\x4c\x0a\x0d\xdc\x82\xd0\xe5\xa5\xa6\x5a\xcb\xc4\x78\xe1\xec\x6b\x06\x4d\x7b\xb7\x38\x8a\x73\xf6\xed\xa3\x0b\x0b\x6b\x73\xdd\x8f\x87\x92\x63\xad\x1a\x03\x48\x67\x1d\xcf\x21\x1c\xb9\x6e\xd0\x8e\xd5\x2f\x33\x17\xda\x68\x18\x5d\x6b\xb2\x58\x9d\xc1\x1d\x75\x5d\x47\xa3\xb6\xf6\xa0\x38\x6a\x85\x94\xd9\x57\x0b\x2e\x9b\x0d\x4b\x5e\x13\xdc\xcd\x9b\xb7\xac\xbe\xf0\xab\x27\x6a\x7a\xeb\xe1\x29\x31\xbe\x67\xf1\x0d\xe2\x67\xa0\x29\x89\x53\x01\xf5\x66\x25\x30\xad\x8a\xb3\xd2\x30\xb3\xb6\xd7\x09\x3a\xcd\xfb\xf2\x74\x75\x7a\x90\x78\xe2\x0c\x23\xbc\x82\x2d\xef\xfa\x61\x00\x54\x86\x10\x2c\x01\xab\x82\xbd\xc8\xcd\xcf\x1b\xb3\x7f\x9b\x56\xd3\x9e\x50\xfd\x5a\x68\x95\x41\x6e\x76\x7f\x4e\x36\xc1\xa4\x17\x78\x90\x81\x25\xb5\xca\x3f\x92\xa9\x0d\xa9\xad\xdf\xf1\x55\xfb\x1f\xd7\x76\x88\x08\xa8\x0f\x20\x3e\xd7\x37\xef\x00\x77\x63\xbd\x2f\xea\x9f\xf2\x8c\x84\xb4\x35\x51\xc9\xfc\x43\x8f\xfc\x47\xfc\xfc\xf6\x4d\xc7\x70\x06\x13\xaa\x8b\x3a\xf8\x63\x3a\xe8\xb6\x98\x74\x37\xc0\xaa\x47\x81\xbe\x1e\x82\x13\x96\xc5\x36\xcb\x30\x05\xd0\x55\x49\xb1\xcb\xa7\x01\x35\xaf\xb7\xfe\x30\x68\x96\x1c\xad\x3a\x14\x63\xcc\x0b\x55\x60\x68\x4e\x27\xbb\xa7\x7a\xef\x41\x9d\x82\x38\x68\xe0\xce\xba\xd1\xf1\xce\x0a\xe9\x02\x74\x4a\x15\x2d\xd2\x94\x51\xa1\x7e\x28\xa8\x9a\x71\x58\xa1\x83\x6e\xfc\xe4\xa3\xe5\xc7\xd1\xfa\xa4\xc3\x87\x5b\xc4\x6c\x4d\x9b\xe2\x2d\x66\xd3\x66\xac\x6f\x59\x53\x8a\x00\xb2\x75\xb0\x2f\xac\x6d\xa7\x55\xa8\x54\x08\x19\x97\xd5\xd1\xd0\xe6\xe5\x68\xa5\x95\x8c\xf3\x34\xc5\x18\xcd\x51\x7a\xb9\xd7\x3c\x48\xd6\xcb\xc4\xae\x4e\xea\x43\x53\x11\x3e\x7e\x4a\x7c\x05\x92\x0e\x68\x6b\xf0\x7a\xfb\xfb\x8d\xd2\xec\x4f\x18\xfa\x71\x38\xe5\x7d\x33\x2c\xd7\xa4\x22\x8f\xea\x73\xbc\x09\x25\x2f\x24\x42\x72\x94\xeb\xd3\x64\x5e\xe0\x99\x6c\x2e\x85\x1a\x8a\xa5\x1a\x7c\xd9\xfc\x2e\xab\x47\xc0\xab\x21\x3f\x4f\x51\xd2\x16\x09\x1e\xd0\x89\xe4\x59\x2e\x9b\xb0\x82\x8b\x85\x8f\x84\xf6\x0b\x93\xad\x84\xa0\xa2\x28\x27\xcb\xd2\x74\x14\xb7\x81\x32\x2a\x04\xd3\x96\x08\x28\xf6\x38\xdf\x28\x34\xc7\xf7\x83\x9d\x70\xdb\x12\x6b\xee\x5a\xf2\xee\x75\x59\xa8\xac\x4c\x01\xa6\xc3\x91\x39\x6a\xf9\x3f\xa0\x60\x89\x40\x29\x7d\xdf\x89\x00\xc5\xdd\xb4\x66\x34\x0a\xe5\x1c\x60\xc7\xea\xd7\x62\x44\x7e\x76\xd8\xbc\xcb\x57\x39\x97\xcf\x66\x14\xd1\x88\xa0\xb9\xa2\xf5\x6e\xed\x9b\x0f\x9d\x46\x3a\x19\x78\x7f\x40\x92\x58\x1a\x65\xc6\xbf\x78\x1b\x93\xc5\x60\x87\xe5\x4e\xe1\x34\x3a\xab"}, +{{0x66,0xb5,0x0f,0x69,0x2e,0x39,0x5e,0xb8,0x33,0x86,0xe0,0x27,0xc8,0x2c,0xe3,0xfd,0xee,0x3b,0xd8,0x99,0xb0,0xd3,0x17,0x9d,0xb0,0x86,0xfb,0xf5,0x24,0xf5,0x74,0x59,},{0x44,0x85,0x36,0xe9,0x82,0x40,0x84,0x37,0xce,0x89,0x67,0x40,0x53,0xe3,0xc5,0x89,0xc9,0x8c,0x09,0x5c,0x60,0x02,0x1a,0x11,0x81,0x78,0xc6,0x26,0x1d,0x88,0x10,0xfe,},{0xbd,0x13,0xf6,0x36,0x2c,0x07,0x07,0x89,0x22,0xf3,0x0c,0x63,0x30,0x75,0x1b,0xf6,0xe7,0xcf,0x42,0xa7,0x69,0x16,0xee,0x65,0x3e,0xb1,0x7a,0xcc,0xff,0x1f,0xbb,0xca,0x35,0x25,0x8c,0x4c,0xbc,0x58,0x2a,0x5e,0x8c,0xc9,0x4f,0xd2,0xc7,0xed,0xeb,0x53,0x76,0x2f,0x1f,0xc2,0x31,0x23,0xd7,0xf4,0xf1,0x45,0x40,0x9b,0x31,0xcd,0x38,0x02,},"\x74\x28\xa9\x64\x21\x2b\xcb\xe8\xdf\x7d\x59\xe4\x8e\x92\x34\x80\xaa\x0e\xe0\x9b\x91\x0d\x04\xef\xb6\x90\x36\x62\xef\xc3\x10\x7a\xc8\xfd\xc0\xc5\xf3\x92\x72\x74\x0c\xd8\x77\xe1\x6c\xd7\x1c\x54\x92\x38\xc3\x37\x22\x0c\xe2\xf6\xb5\xa1\xfc\x6f\x7b\x0a\x1c\xd4\xed\x21\xd9\x38\x89\x08\x1e\x34\xfb\x7f\xde\xcf\x41\x78\xbb\xd4\x31\xe6\x11\xe5\x39\xd9\x00\xc3\xd0\xac\x3d\xc7\x10\x7b\x36\xb4\x1d\x6d\x0d\x5d\x32\xc1\x97\x27\xf9\x08\xb6\xeb\x36\x7f\xeb\xb3\x52\xa4\x93\x58\x1f\xf1\x28\xb5\x6c\x4c\xaf\x6f\xb8\xe0\x99\x81\xf0\xd3\x79\x57\xd1\x28\x20\x17\xfb\xb8\x07\x61\x4c\x20\xf4\x65\xdc\x02\xb0\xcd\x96\x99\x83\xbd\x5a\xe1\xeb\xf6\x57\x8d\x7f\xf3\xce\xff\x32\x0e\x25\x56\x21\x99\xde\xe9\x34\x75\x7c\xc1\xf5\x8d\x55\x40\xc4\x1a\xac\x1c\xe4\xf2\x11\xf0\xb8\xec\x41\x07\x17\x40\x30\xe7\x02\xbc\x6a\x8a\x9c\x85\xc5\x05\xc9\x31\x6a\xef\xea\x3e\x43\x72\x24\x2d\xe0\x19\xb3\x5e\x2b\xd3\xc5\xa9\x56\x52\x19\x71\xc1\x06\xa3\xad\xbb\xc1\x3c\xdc\x4f\x7f\x9d\x3c\x58\xb9\x6a\x34\x4b\x4a\xc3\xef\x6b\xd8\xac\xa6\xed\x98\x76\xb4\x3e\x64\x97\xfa\xf7\xfa\x4c\xf2\x7f\xbc\xb6\x65\x73\x0c\x09\x1e\x13\xaa\xf7\xe9\xef\xe7\xdd\x10\xe1\x4e\xb1\x9a\x92\x00\x42\x42\x10\xec\x8b\x8f\xba\x7e\x69\x44\x4c\xe1\xa9\xe3\xa7\xb2\x6c\x11\xf6\xb7\x14\x5b\x69\x83\xa7\x80\x57\x76\x48\x40\x31\xbf\xf5\x2e\x81\xae\x76\x9b\x70\xa2\x82\xb0\x94\xff\xb5\xfb\x55\x25\xdc\x1a\x87\x2e\x20\x7e\x82\x7a\x2e\x11\xf4\xec\xf7\xb5\x30\x8c\x74\x8a\x92\x78\xea\x7b\xd6\x61\x88\x19\x44\x00\x43\x0c\x8c\xd5\x96\xeb\xb8\x72\x21\xe5\x36\xf6\xaf\xe1\xf1\x50\x5d\x6a\x59\xf4\x1d\x16\xa2\xf0\x14\xe1\xcf\xa5\x13\xf7\xa6\x97\x31\xd7\xbf\xdb\x2a\xff\xce\xfe\x05\x37\xd4\x2c\x79\x6e\x3f\xd2\x7e\x41\xb7\xca\x72\x05\x1b\xef\x28\xbb\x7b\xde\x70\x10\xdc\xfe\xd8\xaa\x16\xef\x67\x6d\xb6\xe5\x20\xc3\xce\xf8\xd6\xf5\x8a\x9a\x28\x13\xcf\xf0\xf7\x04\x1f\x87\xfb\xfb\x84\x31\xe0\x20\xed\xe1\xd4\xea\xf1\x9e\x23\xb9\x83\x44\x5c\x59\x15\xb5\x4a\xdf\xb5\x57\xfc\x20\xd0\x05\x8f\x40\xf5\xe0\x98\x25\xdb\xa8\xd8\xf2\x0c\x00\xf4\x3b\x3a\xee\xbb\x61\x57\xbe\x32\xec\x54\x62\x7d\x5d\x42\xab\x81\x3c\xf9\x7f\x09\x5d\x26\xdb\x80\x36\xc1\x2e\x82\xcb\x96\x3e\x80\x01\x16\x7e\x61\xab\x39\x3b\x4c\xca\x75\x5e\xce\xa8\x69\x95\x4e\x32\x3f\xa5\x26\x2c\x5f\xda\x3e\x0b\xe9\xa5\x1e\x5a\xf5\x1f\xa6\x44\x48\x24\xfb\x83\x7c\xc6\x7b\xe5\x37\xa8\x75\x69\xc3\x0c\xf0\x11\x4d\x39\xa0\x39\x42\xde\x4e\x1c\xd5\x23\x35\x5d\xab\x1a\xf3\x60\x80\xa9\xa9\xa5\x48\xbe\x1c\x2a\x7f\xbe\x54\x33\x77\x23\x15\xd2\x83\xe5\x15\x6d\xf6\x48\xbe\xe4\xb7\xdc\xda\x74\xf1\x59\x05\xd5\x42\xbe\x54\x87\x3c\x15\xc5\x3f\xf4\x2a\xca\xbf\x8c\x56\xf2\x57\xd7\x64\x72\x2d\xb4\xe9\xc7\x18\xe1\x20\x98\xa3\x45\x74\x86\xa6\xc9\x47\xac\x2d\xe0\xaf\x53\xe8\x2c\xf9\x50\xbb\x37\xca\x29\xc8\xda\xdf\xa3\x64\x6d\xb4\x98\x2a\xf5\x72\xd3\x9b\x26\x8c\x7f\x96\xb0\x3e\xf6\xb6\x53\xc8\x79\x45\xf2\x9b\xc5"}, +{{0x55,0x32,0x8b,0xe4,0xb3,0x70,0x82,0x27,0x33,0xff,0x39,0x89,0xa6,0xa3,0x28,0x2d,0x65,0xfe,0x8f,0x20,0x7a,0xb7,0x27,0x0d,0x7c,0x2e,0x72,0x7c,0xa3,0xcf,0xaa,0xc4,},{0x51,0x8e,0x02,0xee,0xf5,0x2f,0x5a,0xae,0xbd,0xe3,0xd1,0x08,0xea,0x79,0xec,0xad,0xfc,0x4d,0x99,0x4c,0xe1,0x95,0x36,0x21,0xe5,0x4b,0x7b,0x3b,0x12,0x1f,0xf8,0xff,},{0xf5,0x8d,0xb1,0x9f,0xd8,0x34,0xe1,0x51,0x94,0xc3,0xc0,0xf8,0xa6,0xa5,0x0e,0xbc,0x4c,0xf0,0x74,0xe8,0x0e,0xa2,0xe7,0x0c,0xda,0xf1,0xe1,0x69,0xbd,0x51,0xeb,0xd0,0x99,0x0b,0xad,0x77,0xc4,0xfa,0x20,0x8b,0x8d,0xd1,0xe2,0xc8,0x57,0x4c,0x01,0xb5,0xf5,0x96,0xc8,0xdf,0xa6,0xbb,0x8e,0x6a,0xe3,0xa4,0x7f,0xf4,0x12,0xe7,0xe2,0x09,},"\x6c\x24\xc9\xaf\xbb\xf1\x2d\xca\xee\x6f\x10\xe4\x08\x92\x52\xf2\xc6\x0b\x2a\xb9\x3a\x02\xc1\x60\x2f\xb5\xde\x4c\xe3\xbd\x92\x3e\xb0\x2f\xe1\x03\x9f\xdc\x15\x99\x6a\x44\x69\x15\xe7\x67\xde\xe0\x17\x6d\xdd\xb7\x8e\x9d\x6b\xbf\x06\x96\x75\x77\x5a\x82\x9d\xd8\x08\xd3\x76\xb0\xcf\x79\x20\xbf\x1a\x66\xe1\x30\x3b\xa5\x24\x19\x78\x5f\x25\xf2\x8b\xb3\x38\x99\xeb\xde\x84\x0c\x0a\xb1\x4b\x91\x9a\x65\x80\xcb\xaa\xc3\xa8\x05\x62\x7b\x9c\x4a\x77\xba\xa1\x6f\x82\x5a\x9e\xac\x2d\x6d\x36\x41\x65\x14\x93\x37\x0e\x50\xee\xe9\x4c\x74\x04\x97\x64\x36\x56\x05\xab\x4d\xac\x1a\x03\x02\x27\xa3\x30\xaa\x17\x8f\x2f\x8d\xa3\x77\xaf\x73\xf0\xbb\x04\x0b\xac\x12\x36\x6e\x65\xe0\x59\x10\x55\xf9\xf2\x3e\xac\xa3\x5e\x96\x88\xd8\x37\xa3\xc0\xd9\x9c\x16\x8f\xd8\x86\xac\xc9\x22\xcf\x37\xa7\x11\x8e\xf8\xa4\x4b\xb0\xa4\xfa\x42\x88\x04\x93\x09\xa7\xdc\x1b\xed\x80\x62\x1e\x10\x63\xe3\xe5\x92\xc0\xfb\xa4\x2d\x73\x98\xeb\x15\xf7\x40\x28\xac\x15\xd7\xed\x65\xa6\x36\x8a\x13\xb7\xf9\x56\xd1\x95\x47\xeb\x50\x6c\xe7\xec\x90\x73\x4e\xb9\x49\xcf\xf1\xd9\x8c\xe4\x14\xf1\x0a\xdc\xba\x8c\x00\x73\x20\x01\x87\x50\xa7\x1b\xd3\x6d\x3b\x6b\xfd\x61\x27\x05\x45\x08\xe3\xef\x65\xd9\x98\x48\x51\x4d\x33\xd6\x8b\x58\xe3\xa4\xb2\x24\xf7\x9b\x6e\x34\xdd\x48\x03\x40\x46\x7f\xe7\xf0\x25\xcc\x88\x21\x3d\x80\x8f\xbb\x5b\x91\xe2\xe4\x3c\xf9\xd9\x50\x64\x07\x98\x65\x92\x73\xd4\x7a\x25\xf1\xf0\x13\x2f\x68\x82\xfa\xad\xba\xfb\xa2\x8f\xee\x5f\xa1\x72\x72\xc1\xa9\x00\x11\x72\xb3\xab\x6f\xf2\xc3\x15\xf2\x6c\x07\x73\x44\x05\xb5\xee\x8b\x5e\x4f\x08\xe1\xe3\xb8\xae\xa0\x19\x46\x7f\xb0\x71\x88\x7f\x19\x19\x01\xa2\x1c\x59\x76\xc1\xca\x8a\xaf\x0a\x1d\x4a\x2e\x69\x8e\x76\x23\xe9\xbb\xe9\xca\x2a\x67\xa1\x53\xa1\x6f\x89\x5e\x6d\xd9\xea\x92\x44\x41\xb4\xbd\x0b\x67\x45\x52\xe3\x98\xb8\xd9\x70\x34\x3a\x9b\xc7\x76\xa3\xa3\xfc\x1a\x86\x60\xc5\x62\x5d\x60\x81\xb5\xd8\x7f\x0f\x8a\xc9\xf0\x7a\xb5\xab\xe7\x7c\xdb\x8e\x30\xd2\xfd\x1f\x6f\x46\x52\x5c\x75\xdd\x0d\xd1\xca\x32\x81\xcc\x89\x34\x6f\xb3\xe6\xd7\x38\x8e\xbe\xe1\x54\xcb\x59\xbd\x9e\x95\xed\x6a\x41\xd5\xdf\x66\x8b\x59\xea\x13\x78\x68\xeb\x12\x0b\x8a\x2c\xfd\xf4\x67\x44\x14\xfd\x27\x96\x99\xf2\x8b\x5a\x5c\xcc\x2e\x2f\xc8\x02\xa4\xc9\xe0\xb8\x5b\x76\xf2\x0f\x6b\xce\x2a\x49\x54\x88\x6f\xc4\x02\x67\x0a\x71\xef\xd2\x61\xf5\xdd\x7b\xca\x16\x88\x4a\x28\x7c\x62\x2f\xd4\x45\xf6\x8d\x44\x15\x1c\xc0\x13\x4b\x22\x9d\xa3\x8d\xaa\xab\x81\xb5\xc9\x60\xd5\x77\x00\xca\x92\xb2\x6d\x0b\x14\x21\x34\xce\x94\xb7\xbe\x6c\x18\x61\x0e\xa2\x13\x6f\x8b\xa8\x32\x9a\x2e\x8c\x00\x0b\x8f\x02\xfe\x05\xbc\xf7\x2c\xb7\x1f\x8c\x72\x53\x5f\xfc\xd8\x18\xe3\x8e\x79\x92\xa8\xf0\xc3\x2a\xc6\x21\x77\xd1\x52\x2a\xe5\x52\xc6\x0c\x1e\xe6\x16\xb7\x5e\x4b\x34\x42\xe7\x96\x57\xe4\xa3\x33\xc0\xb3\xd7\x44\xea\xf2\x60\xd0\xc3\x36\x93\x16\x86\xa6\xd6\x68\xc6\x4f\xef\x44\x00\x52\x35\x2c\x2b\x25\x8c\xfb\x65"}, +{{0x7d,0xa0,0x5f,0x04,0xe5,0xd3,0x8b,0x98,0x9b,0x83,0xf7,0x2f,0x7a,0xb2,0x6c,0x13,0x87,0x76,0x75,0x8f,0x4f,0x57,0x7e,0x49,0xdc,0x73,0xd6,0x01,0x3f,0xf4,0x37,0x59,},{0xb1,0xde,0x51,0x67,0xf4,0xd3,0x30,0x80,0x4e,0xec,0x9e,0xb5,0x65,0xef,0x40,0x55,0xf1,0xb6,0x4d,0xd9,0x5e,0x1c,0x9b,0x27,0xc6,0x7f,0xfe,0xf9,0x14,0x82,0xcc,0xa8,},{0x05,0xf1,0x17,0xf9,0xbc,0x3e,0xa5,0x5d,0x45,0x5e,0x9e,0xf1,0x35,0xe9,0x2e,0x76,0x65,0xd1,0x80,0x70,0xd8,0xf5,0xe3,0x75,0xdf,0x67,0xbe,0x18,0x17,0xce,0x14,0x35,0x7a,0x55,0xe7,0x01,0x66,0xf3,0x26,0xb7,0x7d,0x85,0x24,0x32,0x27,0xcf,0x67,0xd8,0xf2,0xe0,0xbf,0x84,0x40,0xca,0xbf,0xb0,0x52,0x75,0xb3,0x73,0xf1,0xe1,0x19,0x0e,},"\xa6\xa8\x61\xd8\x94\x7c\x5c\xd6\xad\x08\x19\x60\x2e\x32\xea\x76\x81\xc8\xf7\x30\x10\xee\xe5\x53\xe5\xde\xfb\xf7\x98\x20\x98\xb5\xf7\xb3\x99\x24\xbb\x79\x59\xad\x64\xc3\x03\x26\xbe\xd5\x60\xbf\x51\xe9\x98\x3c\xda\x5d\xff\x4f\x31\x1e\xea\x24\xcb\xe6\x8c\x61\x06\xce\xac\x9b\x84\x3a\xa4\xe2\xad\x1b\x6f\x8a\xe1\xe4\xf9\x68\x71\xfc\x02\x5b\xe4\xa6\x16\x38\x5f\xf2\xd4\xb7\xf5\x68\x29\xab\xef\xaf\x6a\xac\xbb\x78\x0d\x6c\xbb\xc9\x51\xb6\xe0\x5a\x78\x7f\x88\x5e\x33\x25\x61\x16\x65\xec\xc9\x24\x27\x4a\xa5\x31\xbc\x13\x3f\x62\xc7\x6c\xb3\xad\x14\x8f\x3c\x95\x79\xa8\x15\xa1\x42\x00\xb7\x64\x8d\xae\x0b\x07\xb3\x27\xd3\xbf\xcc\xdb\x6f\xe3\xb6\xcb\xd7\x0e\xa6\x5e\x6c\x0c\xc2\x51\x6a\x89\x66\x96\xd0\x7b\x2e\x77\x71\x3b\x0b\xee\x3b\x92\xfb\x1b\x6f\x75\xb0\x82\x0a\x5c\xb6\x2c\x5f\xe6\x20\x40\x03\x94\x3e\x24\x85\x71\x66\xfb\xdf\x57\x1f\x11\x5d\x45\xf4\x2e\x75\x90\x1d\xf8\xb1\x2c\x32\x61\x8a\xac\xb0\xd2\x42\x86\xc8\xd3\x03\x96\x05\x1f\xc2\x72\xaa\x17\xf4\xd2\xd4\x74\x61\x15\x2a\xac\xd3\xfa\xa2\xb7\xb2\x08\x31\x22\x78\xe8\x09\x24\x05\x92\xd1\xd1\xaa\x58\x5c\x56\x28\x0e\x66\xff\xd9\x2b\x57\x17\xd0\xcd\x1e\xb9\xfb\x74\x01\xde\xf8\x79\x48\x7c\x37\x4e\x5c\x53\x0b\x6f\xeb\xf9\x11\x12\x25\x74\xd2\x4f\xe1\x04\xb4\xf4\x5c\x7c\x60\x1e\x6c\x91\x7d\x3c\x18\x82\xc1\xad\x3c\x55\x5d\x8f\x2c\xe9\x55\xb5\xa1\x0d\xb0\xd5\xa8\xb8\xac\x7a\x62\x66\xb2\xe6\xb2\x7a\xd0\xee\x34\xf4\x7a\xd8\x57\x36\x7d\x52\xf7\x09\x6d\x4b\xac\xef\x0e\x46\x72\x54\x88\x42\x4b\x93\xb8\x9a\xcd\x42\x9f\xfb\x5e\xf3\x3a\x0b\x08\x1d\xd0\x94\x79\x67\x91\x96\x02\x3c\x39\x67\xf4\x4a\xd4\x1e\xb1\xa2\x39\x55\x27\xfd\x3b\x79\x76\x8f\x1b\x88\x5f\x04\x29\xb4\x95\xab\x60\x52\x56\x91\xbe\x84\x65\x06\x32\xa2\xf6\x6c\xb6\x3a\xd5\xbf\x2f\x6a\xe7\x0b\x66\x8c\x5a\x19\x3f\x74\x99\xfc\x4f\xc4\x2c\xf8\xcb\x30\x8c\xe5\x02\x9a\x50\x27\xba\xbe\xf5\x5d\x19\x25\xec\xfb\xa9\xf2\x7e\xb6\x08\x16\x19\xed\x0d\xf8\x56\x9f\xd8\x0e\x9d\xa1\x04\xdb\x39\xb5\xb8\x14\x0b\xfe\xbe\xbd\x29\x08\x54\x40\x06\x58\x19\xde\xba\x8d\x46\x9a\xe8\xb3\xea\x6d\x3b\xac\x58\x91\xf9\xa4\xdd\xfb\x7f\x1f\x06\xd1\x3c\x31\xa0\x7e\xe5\x3f\xb5\x4b\xc9\x7b\xd0\x86\x96\x39\x4c\x38\xe7\xf3\x68\x0c\x0f\x02\xf9\x75\xf4\x69\x92\x11\x47\xa4\x09\x85\x90\x97\x81\x3b\x4c\x3f\xa4\x3d\x17\x4a\xc4\x02\xf1\xa5\x28\xcb\x5f\xc4\xb8\x07\x51\x84\x32\xef\xf3\x34\x07\xa1\x11\xca\x3a\x3d\x7e\x9e\x84\x13\x5a\xba\xc8\xa8\xf5\x2e\xa6\x31\xc8\x6d\x74\xa1\xc6\xe5\x74\x9e\xdd\x14\x91\xc0\x02\x4e\x7d\xe7\xfe\x52\x85\x68\x29\xb7\x2f\xd1\x3d\xa6\x3a\x1a\x23\x43\x34\x9d\xf6\x62\xab\x31\x63\x53\x60\x32\x34\x6e\x53\x47\xf0\x43\xff\xf5\x28\xbf\x67\x15\x09\x22\xff\xf2\x02\x6b\xab\x74\x2d\xb9\xca\xe7\xcb\x2e\x3c\x74\x58\x07\x19\x65\x2c\x28\x44\x7c\x5e\x20\x98\x23\x17\x97\xee\x6e\xf1\x23\x1f\x57\x92\x05\x4b\xc3\x35\x9a\x32\xc8\x6d\x2f\x94\xf8\x5f\xa7\xd4\xa7\x41\x9d\xd2\x41\xff\x66\x2a"}, +{{0x1b,0x8e,0xc6,0x58,0x80,0xed,0xbf,0x03,0x9a,0x13,0xe9,0x70,0xb1,0x5a,0xa6,0x7e,0x19,0x2a,0xa0,0x2c,0xa6,0x5c,0xff,0x9a,0xda,0x17,0xd4,0x55,0x8f,0x40,0x13,0x7d,},{0x12,0xc1,0x19,0x1e,0x4d,0xe3,0xbd,0x44,0xd0,0x39,0x07,0x01,0x53,0xad,0xb7,0xb5,0x81,0xf6,0x00,0xe9,0xa1,0xdd,0x69,0xaa,0x89,0xf2,0x77,0xc7,0x06,0x9e,0x76,0xf8,},{0xbf,0xf2,0x69,0xa3,0x5d,0x6c,0x8e,0x55,0x2c,0xe7,0x16,0xd1,0x63,0x81,0x81,0xce,0x85,0x83,0xb4,0x5c,0x0e,0xc5,0x93,0xb4,0xe5,0x8c,0x40,0xac,0x76,0xe7,0xf8,0x5c,0xa1,0xda,0xff,0xfd,0x68,0x54,0x1e,0x62,0x3a,0x1e,0x35,0xa7,0xc0,0x97,0x26,0x88,0xb2,0x5e,0xed,0x72,0xf4,0xda,0x57,0xec,0xa1,0x68,0x57,0xa8,0x26,0x3c,0xaa,0x0b,},"\x37\xf1\x8b\x7f\x64\xc5\x13\x34\x79\xd6\xda\xe3\xbe\xf6\x79\xcd\xc2\x1e\xce\x3f\x5b\x57\x9a\x6a\x9c\x3f\xa2\xe5\x9e\x9b\xe8\x7d\x20\x09\xf7\x4e\x1c\xfd\xac\xcb\x1c\xe3\x7d\x00\x70\x23\x69\xbd\x16\x9d\x94\xfd\xcf\x85\xaf\x9f\xa3\x21\x7d\x27\xe6\xed\x6d\x1d\x8e\x5d\xf7\x61\x5e\x8e\x37\xea\x55\xde\x1f\xd0\xb0\x6d\x77\xb4\xc8\x3b\x92\x9d\x80\x58\x6f\xa0\x69\x4b\xe7\x2e\xc8\xb3\x65\xad\x2c\xbc\xdd\x2b\x1a\xd8\xcf\x7f\x03\x6d\xfa\x4d\xaa\x1a\x90\x36\xcd\xb1\x20\x43\x22\x27\xb1\xf0\x7b\x88\x66\xb1\x22\x12\x03\x09\xeb\x91\x4a\xb8\x4c\xdd\xeb\xa1\xde\xc4\x8a\xb9\x26\x36\x72\x85\x88\xfe\xdb\x3a\xaa\xd7\xe7\xdb\xb2\xac\x30\xe6\x3c\x6f\x5f\x90\xfc\x6c\xe6\x2d\x6d\x3b\xd8\x8b\x0d\x5a\xac\xfa\x61\xde\x9f\x32\x67\xb3\x00\x91\x7b\x57\xa4\x80\x36\xab\x20\xc9\xa0\x54\x46\xb8\x76\x74\x94\xaf\x24\x9e\x7d\xe7\xbc\x50\x7a\x22\x07\xcc\x95\x6f\x71\x84\x55\x5a\x7d\x5d\x88\x83\xbb\x4b\x3e\x93\xf2\xdc\xfc\x57\xb0\xda\x86\x38\x65\x8d\xcd\xce\x88\x5d\x44\xd9\xcc\x68\xb1\xd8\x17\x0a\x36\x77\xcc\x5e\x50\xcb\xf3\x3d\x54\x3e\xba\xe4\x47\x7d\x92\x39\xcf\x83\x38\x4e\xc5\x9b\x42\x33\xe8\xff\x33\x43\xf0\x6f\x30\x18\x77\x72\x9a\x53\xd4\x20\xbf\x01\xc6\x2e\x66\xab\x7f\xe5\x5d\xd8\x7e\xe8\x23\xa5\x8f\xcb\x87\x87\x0e\x1f\x52\xe8\x79\x17\x7c\xd4\x39\xc5\x33\xf5\xa2\x23\xe5\xa3\x43\x6f\xe9\xd6\x42\x65\x48\xda\xcf\xc8\x6a\x08\x46\xd3\xed\x23\xac\x04\x25\x63\xe8\x87\xff\x46\xaa\xd0\x05\xf4\xe1\xde\xe3\xee\x0e\xe4\xc2\x7a\x72\x51\x70\x9a\xe4\x0a\xbc\x5e\x25\x68\x64\xe4\x78\x5a\x4e\xdd\x8b\x2a\xdf\x1b\xc5\xb4\x01\x8e\x28\xd0\xb1\x75\x86\x7b\x02\xd0\x52\xa6\xe1\x7e\x41\x1a\x3d\x8b\xeb\x2a\x42\x08\xb7\x6c\xc6\x21\xfd\x18\xbe\x14\x8e\x23\x5d\x55\xaa\x71\x27\x70\x65\x57\xde\xc0\x53\xa1\x3f\x1a\x47\xdf\xda\x40\x5b\x3f\xe5\xbd\x28\xef\x5d\x34\x86\x19\xf5\x1e\x59\x5e\xf5\x05\x5f\x83\x9e\xfa\xf1\x10\xe4\x90\x16\x31\xac\x31\xa0\x2f\x4f\x7e\xe4\x24\xa3\xa2\xc3\xe0\x0d\x26\x02\xd2\xcc\x1e\x49\x29\x06\xee\xa4\x20\xa9\x26\x82\x38\xac\x66\x22\xa0\x89\x74\xe5\x73\x02\x92\xe6\xed\x51\x02\x56\xef\xde\x66\x7e\x0d\x9a\x0f\xf2\x21\x3f\x54\x12\x0c\xcd\x81\xff\xaa\x6b\x7c\xc4\x81\x41\xa2\xb7\x29\x85\x2a\xf5\x83\xd2\x6a\xa5\x1f\xbd\xe6\x7b\xe4\xdf\x14\xe5\x20\xc2\x25\x7a\x73\xc5\xc2\xe3\xc3\xd8\x7d\xfb\x25\x36\x11\x75\xfd\x18\xab\xd7\xe9\x9a\xa0\x9b\x85\xf8\x8f\x19\xc8\xd8\x2d\x45\x85\x8f\x31\x44\xc5\xdf\xb7\xa4\x9e\xde\x45\xb4\xef\xd8\x71\x05\x92\xa3\x72\x06\x36\xe7\xe8\x89\xc7\xe2\x2a\xd1\x3b\x2d\x44\xbb\x7e\x2b\x47\xb2\x96\x3a\x5f\xa3\xf2\x55\x7b\x85\xbc\x0c\x69\x3d\xe3\xd2\x2e\xf9\x46\x4f\x7b\x81\x4a\x20\xa4\x67\x6a\xd2\x6f\xca\xa0\x35\x44\xc6\xaa\xd4\x12\x83\x09\x5f\xcd\x12\x10\xaa\x8c\xc0\x29\xff\x5a\x26\x00\x5a\x89\x12\x26\xc2\x98\xe9\x4a\x52\xaa\x71\x33\x91\x3e\xc9\xd2\x2a\x5b\x2a\xc0\xbc\x6f\x15\xb2\x51\xd0\xb9\x38\x89\x21\x3c\xd1\xb1\xe5\xc6\xfd\x08\xf1\xa8\xf5\xcb\xd4\x21\x53\x29\xa3"}, +{{0xe7,0x53,0x88,0x02,0x6a,0x6a,0x6d,0x6c,0x6d,0x19,0x9e,0x36,0x29,0x93,0xa5,0xb1,0x04,0x49,0x01,0xe1,0x8a,0x76,0xc2,0xfa,0xc7,0x26,0x1a,0x6d,0x1c,0x19,0xa4,0xf3,},{0xb9,0xce,0x14,0x25,0x1c,0x0c,0xdf,0x3b,0xdd,0xb2,0x06,0xdc,0x6b,0x8b,0x2b,0x7f,0x5b,0x7e,0x4d,0xd1,0xbe,0x2c,0xe1,0x86,0x3f,0xf1,0x88,0x06,0xae,0x00,0xf1,0xee,},{0x6d,0x0f,0x83,0xd9,0xc5,0x5d,0x84,0xbc,0xf9,0xa8,0x61,0x47,0xd9,0xb6,0xba,0x9a,0xd5,0x37,0x83,0x2f,0xd0,0xf9,0x9d,0xae,0x7e,0x72,0xc8,0x13,0x9a,0xfc,0xb3,0x0c,0x7b,0x24,0xf6,0xb2,0x92,0xe3,0x2f,0x98,0x47,0x09,0x75,0x51,0xb7,0xfb,0xfd,0x51,0x0c,0x84,0xe8,0x9b,0xe9,0x82,0x54,0x44,0x14,0x57,0xbd,0x08,0xe5,0xf0,0x53,0x02,},"\xb9\x9c\xdc\x84\x72\x11\xc0\x66\x42\xdd\x11\x1b\xc5\xe0\xbe\xca\x53\xa7\x4f\xfb\xa2\xe3\xac\x93\xaf\xb4\xb0\x94\x75\x18\xe8\x32\x35\x27\x33\x0a\x4e\xfe\xfb\xe4\xba\xfa\x00\xba\xfe\xcb\x43\x4a\xb1\xe5\xb7\xce\x65\x65\x6f\x7a\x4f\xd8\x56\xaa\x6c\x38\x5e\xd8\xd7\xbd\x62\x85\x58\x0d\x7d\xd6\x08\x82\xe6\x9c\x19\xda\x07\x69\x09\xd6\x47\xde\x09\x5a\x80\xe9\x8a\xd8\x9b\x81\x4a\xad\xcb\xbf\x6f\x03\x3c\x49\x20\x2f\x65\x6c\x09\x10\x50\x39\x59\xcf\x97\xcd\x0f\xa8\x2d\x5f\x6d\x22\xfb\xa3\x38\x99\x51\x29\x4c\x4f\x7c\xdc\x21\xeb\x82\x44\xbd\x65\x60\x63\x7a\x5e\xca\x62\xa8\xeb\xa1\xf4\xa9\x33\xd1\x87\xa7\x5f\x86\x71\x16\x43\xaf\x35\x88\x31\xc8\xc1\x6a\x9a\x0f\x09\xe2\x53\xb2\x39\x5e\x9c\xb3\x71\x61\x1e\xec\xdd\x66\xb4\xab\x52\x1a\xa9\x4b\x3f\x20\x23\x7e\xae\x41\xcd\x10\xc5\xe2\x1a\x45\x2d\x48\xe7\x48\x18\x7f\x35\x4a\x67\xad\xf6\x81\xb0\xfe\x61\xcd\xae\xc9\x4a\x5e\xaf\x01\x26\x9f\xce\xb5\x70\xd5\x14\xff\x3c\x55\xff\x1d\xba\x2f\xd2\xdf\x17\xf8\x6a\x8a\xeb\x74\x78\x38\x11\x3d\xee\x94\xa4\x3b\x13\x84\xcb\xe1\x33\xcd\xf6\x42\x7e\x8d\x12\x2e\x4e\x93\x37\x04\xda\x6e\x26\xcf\xce\xe9\x7f\xe3\xf6\x29\xb6\x0b\x91\xb2\xdd\x86\x38\x67\xfa\x79\x80\x1e\x2b\x91\x6e\xc4\xc0\xfb\x62\xe0\x71\x59\x42\x1e\x65\x79\x74\x30\x7a\x1d\x02\xf7\xf2\xed\x47\x24\xa8\xb5\x21\xa8\x61\xf5\x5f\x35\x52\x1e\x8b\x2e\x1a\x84\x90\x4c\x42\x8c\xfc\x5b\x60\x14\xbb\x0f\x8b\xa8\x43\x4c\x22\x09\xbd\x40\xac\xa3\x11\x30\xdb\x97\x74\x33\x33\x59\x7d\x23\x51\xd5\xf6\x81\x17\x41\xf6\x26\x88\x97\x3b\xd7\x73\xd3\x02\x66\xfd\x1e\xfb\xd8\x9d\x47\xa9\x64\xf9\xd0\x19\x97\x15\x3d\x08\x7d\x92\x69\x66\x16\xdd\x10\x3a\x93\x4c\xcb\xac\x4c\x1d\x14\x2f\x20\x75\xd4\xe2\x2c\x3d\xa4\xa0\xe9\x73\xb2\x38\x63\x19\x62\x87\xb7\x91\x74\xfa\x29\x75\x5f\xc6\xd9\xb5\xe1\x00\xac\xe0\xa4\x59\x75\xe5\x03\xb2\x54\xd3\xf1\x95\xc2\x61\x71\x09\x10\xfe\xf1\x06\x89\x2c\x08\xbb\x29\x6d\x23\x0c\xde\xa9\xf5\xa1\x1f\x91\xac\xaa\x6e\x7c\x05\xe9\x2c\x28\x1d\x2b\x31\x55\xfe\x44\x80\xb0\xaa\x5e\x0d\xb4\x1d\x10\xe0\x5c\xfd\xef\xa4\x36\x40\x51\xcb\x75\x5d\xc7\x2f\xfa\x97\x8c\x00\xb9\x4a\x5f\x21\x2d\xc6\x91\xf8\x39\xb4\x9d\xe9\x7e\x01\x39\xd6\x5e\x8d\x73\xb2\xb2\x89\xb2\x6a\x12\xc6\xcc\xd8\xed\xc0\x4a\xdb\x45\x2a\xf7\xff\x09\x4a\xa9\x01\xea\xf5\x76\x51\xeb\x1b\x87\xb8\x33\xd0\xa0\x9b\x4a\x4a\x64\x62\xf4\x06\x64\x62\x37\x69\xe9\x50\x79\xf3\xc9\x62\x85\x0c\xc3\xb4\x01\xbb\x00\x58\xb8\x47\x5b\x10\xc8\x62\xf3\x2f\x30\x0a\x2b\x14\x3b\x3d\xea\x26\x9d\xdc\xbe\xa7\xbe\x7d\xd2\x42\x6d\x0d\x42\x04\xeb\x66\xa3\x9f\x13\x18\x82\x2d\xcb\x9c\x56\x13\x98\x63\x7f\x4a\xb8\xde\x19\x67\x68\xac\xe7\x4f\x34\x8c\x01\x2d\xd1\xba\xbe\xc1\x7f\x53\x00\xff\xe0\xd7\xaa\xae\xaf\xef\x7d\xb6\x50\xa8\xf2\xf3\x09\xa9\x79\x3f\x52\xc6\x85\xc7\xe1\xd5\x13\x32\x74\x91\x57\x84\x89\x9c\x48\x1d\x48\x5c\x9b\xd3\x0e\x99\xfc\xdc\x97\xd9\x6e\xf0\x74\x87\xda\x66\x3b\xef\xe6\x82\x99\xdf"}, +{{0x5b,0x32,0x3f,0xc0,0x1a,0x16,0xc4,0x5d,0x10,0x64,0x66,0x7d,0x2e,0xa4,0xa7,0xea,0x59,0xd2,0x03,0x42,0x56,0x2d,0x12,0xfb,0xc5,0x98,0xd5,0xaa,0x73,0x00,0x68,0x8e,},{0xd4,0x14,0x1b,0x45,0x5d,0x30,0x16,0x42,0xba,0xda,0x28,0x14,0xaf,0xcb,0x16,0x20,0xd5,0xeb,0x56,0xd9,0x2b,0x11,0x85,0xfe,0x5d,0xad,0xef,0x55,0x96,0x25,0xfa,0x71,},{0xe2,0xef,0xf6,0x07,0xf0,0x22,0x7a,0x29,0xd5,0x82,0xd6,0x9f,0x34,0x58,0xac,0xad,0xd3,0x22,0x6f,0xce,0xaa,0xc0,0xab,0xbd,0xae,0xd5,0x26,0x75,0xc5,0x16,0x30,0x07,0x3c,0xd3,0xa9,0x01,0x70,0x7e,0xcf,0x05,0xe8,0x93,0xf2,0xc3,0x6d,0xaa,0xf0,0xcc,0x49,0x01,0x11,0x69,0x46,0xb5,0x77,0x0d,0xc0,0x38,0x12,0x5f,0x6d,0x13,0x1b,0x09,},"\xad\x24\x66\x9e\xf5\x5c\x54\x0a\x8e\xd1\x62\xce\x1d\x28\xf0\x17\x60\xa6\x07\x19\xa0\x37\x73\x36\xeb\x00\xb1\xec\xbe\x6f\x61\x60\x1c\xd5\x64\xf9\x2c\x95\x68\x04\xf9\xbe\xd4\xe1\x47\x6b\x94\xe5\xea\x8c\xca\x80\xcb\x49\xa3\x04\xef\x85\x1f\x7f\x67\x5a\xbe\x58\xe6\x68\x1d\xc0\x12\xad\x55\xe5\x1b\x02\x1d\x98\x28\x56\x9d\x0b\xcc\x9e\x05\x27\xa3\xfc\x03\xc8\x91\xd1\x7a\x90\xe6\x33\x7a\x1e\xa6\x7f\x2f\x08\x81\x05\x87\x69\x38\x37\x08\x1e\x4c\x08\xa3\xd7\x2c\x53\x6c\x21\x40\xda\x20\x0b\xa4\x56\xc3\x76\xf6\x1d\x05\x65\x1f\x0c\x5f\x39\x57\x11\xf4\x1c\x0d\x6e\xae\x98\xc9\x06\x76\x4d\x1e\xbe\xf3\xf9\x04\x6c\xb7\xc8\x62\x26\x40\xfc\xaf\xaf\xbf\xb8\xf6\x2e\x1c\xd3\x2c\x66\xee\x1c\x55\x50\x94\x89\xa5\x38\xab\x61\x29\x99\xe7\x99\x7b\x77\x9c\x64\x22\xef\xf1\x09\xda\x4d\xf8\x29\x20\x93\x0d\x8d\x36\x3d\x78\x30\x90\x87\x95\xa3\x88\x8f\x25\xd6\x67\xe1\x4d\x15\x5e\xd4\x45\x81\xbe\x43\x0f\x79\x73\xb5\x74\xe2\xbc\x0b\x13\x4c\xf1\x39\xfb\x4b\xb0\x1d\xbd\xa4\x1b\x67\xb9\x81\x47\xd8\x01\x2f\x40\x67\x7f\x4b\x80\xce\x4a\x53\x4c\x90\xad\xea\xbf\x48\x4b\x21\xfa\x99\x4b\x7a\x17\x5f\x8a\x8b\x8a\x40\x75\x56\x44\x78\xdd\xb0\x50\x24\x58\x0b\xab\x03\x8c\xd9\xea\xa1\xdf\xda\x55\x2f\xb3\x12\x29\x42\x9b\x61\x4f\xa1\xd8\x0c\x52\x61\x4e\x84\xfa\xa2\x21\x7f\x26\x0f\xf7\xcc\xea\x8c\x7b\x06\xe3\xd7\x7f\xf8\x74\xeb\x81\xfc\x85\x97\xe5\xfc\xdc\xec\x95\x1b\x5f\xe6\x4a\x1a\xf8\x6e\x73\x19\x3a\x88\x24\x69\xeb\x3b\xa3\xc3\x82\x73\x4b\x28\x87\xb4\x19\x31\x6e\xa4\x48\xaf\xc2\x82\x47\x8c\x25\xf7\xbc\xa1\x84\x29\xcb\xbf\xfd\x88\x71\x17\x7c\x5e\xcc\x7d\x8a\xa9\xa1\xb9\xec\x87\x19\x2d\x29\xa5\x25\x39\xc0\x81\xc3\x59\x33\x32\x44\x4c\xbe\x66\x87\x2c\xf3\xd0\xe1\x97\x29\x2b\x82\xb0\xbe\x5f\xcd\x85\x8c\xd6\xca\x48\xb5\x3e\xe5\xb6\x16\x41\xbc\xaa\xf3\x1d\x81\x9c\x7e\x1c\xed\xaf\x9e\xe6\xb0\x7e\x09\xca\xed\xfb\x30\xb9\x20\x4a\x1d\x4d\xdb\x70\x56\x0c\xbe\x1e\xb0\xc0\xec\x43\xf1\xd1\x78\x20\x1b\x29\x08\x19\xfc\xdc\x92\xc6\x3e\x0d\xb6\x0f\xb8\x7d\xff\x00\xe5\x12\x64\x8c\x89\x58\xa8\x47\xef\xc3\x63\x46\x07\x3f\x1a\x4f\x1f\x23\x17\x06\x0f\x1c\x54\x3e\x6f\x01\xb4\x24\x85\xbe\xeb\x56\xca\xb3\xba\xb2\x6e\x6a\x0c\xa6\x93\x58\x02\xc7\x62\xb7\x99\x15\x9e\x32\x0f\x36\xb5\xe8\x3d\x4a\xca\x89\x62\xaa\x2c\x3c\x2b\x7a\x38\x70\xe9\xe0\x47\x31\xf3\x94\x8c\xf9\x41\xe2\x1d\x50\x96\x4e\x5d\x63\x5a\x35\xa5\x3e\x29\x98\x11\xb8\xca\xdf\xcb\x44\x16\xc5\x75\x98\xa3\xfd\x05\x41\x09\x10\xdb\xc0\xea\x2c\x78\xfd\xb9\x25\x74\x99\x7d\x58\x79\x62\x79\xea\xaa\x78\xb3\x6d\xce\xf1\xc9\xa1\x29\xee\xff\x82\x39\x9a\x26\xd0\x08\xff\xa3\xbf\x04\x18\xff\x7d\x39\xb6\x42\x7f\x34\x18\x95\x02\x4d\x16\xe2\x2a\x0c\x62\xa8\x2b\xeb\xa2\xe2\xba\xc2\x3d\xee\x18\xcf\xcd\x5d\xb2\x39\x7f\x37\x8c\x53\x67\x30\x90\x82\xc4\x4e\xb4\x3c\xed\xc1\x52\x20\x25\x3a\x62\x32\x03\x99\x66\x5f\x71\x34\x9c\xc1\xb9\x44\xf5\x8c\x73\xa1\x0a\x0b\xbf\xd4\xca\xf1\x28\x91\xe3"}, +{{0xbe,0x1c,0x11,0x2f,0x78,0xcf,0x13,0xae,0xfc,0x5c,0xe7,0xe3,0x37,0x64,0xac,0xa4,0x48,0x1f,0x9f,0x88,0xb0,0x18,0xe1,0x22,0xdb,0x9f,0x8d,0xac,0x14,0x62,0x46,0x05,},{0xae,0x38,0x99,0x36,0xbb,0xf6,0xd1,0x6e,0x3c,0x1e,0xeb,0x64,0x74,0x29,0x89,0x70,0x86,0x6e,0x12,0xec,0x9c,0x1d,0x6a,0xea,0x2f,0xd9,0xdb,0x6b,0x56,0xaa,0x59,0xc4,},{0xf5,0xfc,0x5a,0xcb,0x17,0xe9,0x95,0x7e,0xa3,0x04,0xf1,0x23,0xb6,0x50,0xe1,0x44,0xc9,0xe4,0x37,0x72,0x83,0x50,0x9d,0x43,0x1d,0xa6,0xa2,0xbb,0xd5,0x27,0xbe,0xb3,0x82,0xc9,0xf5,0x87,0x45,0xa3,0xe5,0x6d,0xcc,0x65,0x5b,0xd2,0xeb,0xb7,0xae,0xef,0xc9,0x3e,0xdc,0x3f,0x20,0xd8,0xd3,0xc3,0x79,0x23,0x03,0x1e,0xec,0x0c,0xb4,0x07,},"\xd7\x7f\x9a\xee\xa0\xfe\x98\xed\x7f\xb7\x4d\x58\x2a\x40\x2b\xcb\x79\x31\x47\x4b\x4a\x95\xd5\x23\xf3\xfb\x76\x9f\xb7\x09\x7d\x2b\xe4\xc6\xec\x10\x52\x14\x01\x63\x22\x25\x53\xaa\x8f\x4f\x89\xe4\x21\x73\x00\x14\xec\x73\x46\x97\x20\xce\xa9\x67\xf8\x8b\x6a\x48\xd0\x2a\x2d\xdc\x1a\x12\x1f\xdf\xfb\x8a\xe1\x27\x73\x8e\x29\x3c\x4d\x6b\x1b\x74\xad\x03\x84\x4d\xe6\xbf\xe8\x21\x50\x6b\x3a\x7a\x81\xd1\x9c\x37\xa7\xf0\x1c\xa4\x81\x47\x12\x19\xef\xe2\xa7\xb9\x2c\x4b\xd2\xac\x07\x74\x3b\x49\x75\x69\x64\x41\x71\x4b\x84\xd6\x3c\x54\x9d\x7a\x6f\xb6\x1f\x16\xfb\xcd\xb7\x2b\x91\x4d\x78\x82\xd0\x91\xf9\x70\x6d\xa3\x8c\x1a\x81\xa1\xc6\xa4\x0f\xbe\xc0\xd8\xe2\x38\xb5\xd5\x6d\x46\x0e\x90\x9f\x85\x47\x9f\x7a\xd8\xb1\x19\xf3\x54\x55\xe3\x40\x10\xca\xa7\xe5\xd0\x1f\x38\xe3\x01\xad\x37\xe8\x00\x5f\x6e\xd2\x9e\x4a\x10\x2d\xb3\xf6\x1d\x84\x09\x3f\x78\xc4\x9a\x96\x48\xc9\x77\xbf\x4d\x5b\x68\x9f\x71\xf4\x06\xf8\xad\x7b\x9a\xeb\x1a\xe2\x21\x33\xa8\x4c\xe1\xb2\x78\xb2\xcd\xde\x46\x59\x01\xb2\x3a\x17\x9d\x07\x2a\x80\x87\x9d\x0a\x24\xd2\xaf\x19\x7b\x32\x2a\x07\xbf\x5d\x40\xee\xab\x3a\xf1\x21\x17\xf1\x30\x21\xdf\xc1\x68\x1a\xba\x5c\x08\x3f\x25\x96\xe3\x7f\x11\x23\x42\x2b\xbd\xca\x3b\x2c\x32\xcb\x59\x4f\x56\xc3\x25\xe0\xc5\x64\xa1\x73\x32\x88\x05\x34\x59\xc6\x24\x88\x92\x5c\xd8\x0e\x7c\x94\x4d\xb9\x98\xc3\xc7\xbe\x54\x6b\xf8\x9d\x7a\x51\x1c\xcd\xba\x4b\x80\x9e\xee\x0f\xc2\x87\x3d\xad\x72\xb4\xcf\x3b\xa0\x51\x28\x9b\xb3\xf4\xe9\x92\x57\x32\xe4\x5a\xe7\x74\x10\x58\xc8\xfd\x11\x59\x9d\xd8\x43\x92\x7e\x3d\x14\x59\x8b\xb8\x30\x52\xd3\x35\x69\xcf\xb0\x2a\xf0\xc8\x8f\xa7\xae\xa4\xbb\x46\x84\x1c\xd2\xdd\xbd\xf5\x98\x8f\xcf\x32\x5f\xf1\x04\xa5\xdf\xc4\xa3\x0d\x26\x9d\x2a\x94\x97\x30\xc3\x61\x3b\xdd\xd3\x67\x3b\x42\xf6\x09\x0e\x6a\x60\xe4\xa2\x53\x06\x24\x63\xa6\x5d\x7e\x7f\xc0\x03\x0b\xba\x76\x9c\xa3\x44\xbf\xa9\xac\x82\x3f\x58\xcb\x5c\xee\x8a\x5f\xc0\xca\x37\x22\x8d\xe5\xa4\xd9\x3e\x0e\xcf\x7f\x10\x82\x16\x59\xa2\x26\x1f\x7e\xf1\x59\x6e\xda\x4e\x41\x1c\xf3\xc9\x66\x9d\x81\xde\x74\x54\x7c\xe4\xbf\x83\x3e\xb4\x32\xf3\x85\xce\x90\x38\xfe\x84\x8a\x8c\x96\xda\x7f\x01\xfd\x95\xbe\xa0\x6d\x1d\x74\x7c\x8a\xe7\x36\x49\x5b\xba\x22\x85\xbe\x5c\x32\xaf\xea\x44\x95\x20\xcf\xe8\xe1\xce\x25\xf9\x07\x7e\xd0\xec\x0f\x65\x98\xa9\xb8\xf7\x38\x6f\x15\x35\x81\x70\xcc\xef\xc3\xd5\xff\xb0\x09\x28\x81\x54\xde\x87\x7c\x24\x09\xae\x5f\xd8\xfe\xf0\x09\x3f\x1c\x36\xb3\xa8\xf5\x47\x43\x2c\xd0\xf6\x2c\x40\x33\x24\x2a\xd9\x92\x1a\x8f\x11\xc0\x0f\x36\x6d\xa9\x39\x69\x30\xa8\x0c\x99\x7d\xf4\x29\xa4\xf5\xf4\xe4\x5c\x7a\x6d\x7e\x02\xaf\x03\x31\x86\x75\x7c\x73\xcb\xe6\x4d\x2d\x4e\x78\xea\xaf\xe2\x75\x39\x52\x80\x35\xf2\xcf\xcf\x8e\xaf\x0a\x42\xbd\x25\xf8\x8b\x2f\xc6\x9e\x42\x66\x8f\xae\x66\x77\xc9\xac\x90\x91\xd9\xd1\x5a\x41\xf3\xac\xe6\x5d\x90\xa0\x22\x98\x73\xdc\xf2\x54\x25\x6c\xca\x44\x9e\xd4\xc1\x7d\x54\x35\xba\xe4"}, +{{0xbd,0x85,0x23,0xed,0xa8,0x99,0xb9,0x84,0x23,0x0e,0x32,0x88,0x75,0xb9,0x67,0x2e,0xdc,0x9f,0xcd,0x24,0xea,0x5c,0xc1,0x2d,0x7b,0x57,0x2d,0xa4,0xbe,0x01,0xfb,0x7b,},{0x02,0xb7,0x34,0xeb,0xbe,0x88,0xc1,0x3b,0xfa,0x95,0xa5,0xd9,0x64,0xfc,0x7e,0xf9,0xd3,0x95,0xbd,0x63,0x03,0xf0,0x65,0xdc,0x4e,0xe1,0x7b,0x3a,0xc1,0x54,0x8b,0x7b,},{0xfc,0xfc,0xdb,0x08,0x8d,0xcb,0xd0,0xa5,0x1b,0xd3,0x01,0xe3,0xe1,0x56,0x16,0x71,0x93,0x5d,0x8b,0x6f,0x71,0x9c,0x5d,0x92,0x69,0x06,0x40,0xd3,0xc9,0x1e,0x77,0x5b,0xf4,0x05,0x41,0x32,0xef,0xc0,0x5a,0x21,0x22,0xfc,0x20,0x9d,0xb3,0xc3,0x34,0x32,0x33,0xff,0x8a,0xec,0xeb,0xd5,0x2d,0xaa,0x2b,0x3b,0x21,0xee,0xb1,0x5f,0xd1,0x02,},"\x16\xc2\x16\xc9\xbe\x9f\x0d\x4b\x11\x54\x10\xbd\xfd\x15\x93\xc8\xe2\x62\x22\x1a\xb9\x7a\x2a\x39\x5a\x12\x19\x8f\x95\xc3\x02\x05\xb0\x89\x62\xd4\x89\x31\x18\xba\x9f\xf9\x9a\xb1\xc7\xa6\xe1\xf2\xf1\x75\x19\x10\x70\xac\x94\x53\x27\xad\x6c\x47\x0b\xab\xf7\x92\x8b\x07\xdd\x78\x8c\x85\xb6\x4b\x71\x2e\x0a\xae\x6c\x0e\xa2\x02\x81\xe4\x2f\xd5\x61\xe8\x3e\x3f\xba\xc6\x7f\x14\x00\x0e\xe5\x6d\x98\x1d\x2a\x2f\x0b\x9c\xa0\x0a\x9e\xa4\x7c\xa2\xf6\xfc\x8d\xca\x10\x35\xfc\xeb\x14\x2c\x3f\x26\xf2\x0e\x3c\x73\x22\x07\xff\xff\x11\xb7\x96\x95\xbd\xaf\xa4\x15\x21\x4a\x44\x99\x30\x23\x26\x60\x5c\xf0\xb8\xc8\x2f\x2b\x11\x39\x2e\xcc\x90\xcd\x74\xa7\xb4\x11\xb6\xd9\x07\xa3\xd5\xc1\x30\xc8\x79\xb7\xcf\x88\x0f\x22\xbb\xd7\xf0\xe9\x59\x33\x71\x8e\x96\xd7\xd1\x6c\xae\xa9\xf2\xc3\x9e\x89\xb1\x3c\xd5\x22\x66\x27\x36\x04\xa9\x6b\x51\xd6\xe3\x4f\x70\x67\x35\xdd\xd9\xfc\xa4\x4d\x09\xcd\x86\xbb\x72\x17\x60\x0e\x0d\x34\xd4\x16\xac\x24\x9f\x2e\x41\xbd\x0f\x4a\xbc\xbd\x25\x80\xad\xae\x21\xd7\xeb\xa5\xfa\x44\xf3\x9d\x78\x0f\x17\xeb\x85\xcc\xbe\xf5\x8f\xef\x90\x3a\x28\x0d\x95\xf8\xf3\x21\x07\x89\xfa\x12\xe1\x20\xe2\x1b\x6e\x8c\xad\x91\x78\x35\xbb\xdc\xc3\xb0\x7e\x84\x69\x39\x54\xe2\x3a\x94\xf9\x9f\x93\x7d\xdb\x0d\x4a\x18\xd4\x2c\x3e\xa8\xfc\xa7\xd1\xea\x6e\xd5\x3a\x00\x24\x6f\x99\xea\x52\x0e\x64\x05\xbd\x2a\xa5\x49\xb0\x6e\x7d\xa7\x22\xc1\xba\x74\xaa\x1c\x13\x6e\x8e\xa5\x8b\xaa\xf8\xd3\x76\x58\x69\x3f\x3e\x0b\x44\xf6\x31\xdd\x6d\x08\xff\xdf\x4f\x09\x18\x9d\x30\x35\xa3\xf0\x34\x68\xe2\x96\x96\xef\x05\xe0\x2c\xc1\xaa\xbf\xec\xbd\xa2\x30\x1b\x54\x0c\xb0\xeb\x0a\x75\xbc\xce\x73\xdb\x92\x73\xa9\x16\x1a\x98\xad\x89\x8f\xcd\x65\x79\xfb\x7e\x4b\x32\x79\x54\x4f\x2e\x0b\xd7\x74\xdd\x1a\x81\x57\xda\xa8\x8a\x70\x32\x11\x67\x70\x3c\x60\xa6\x08\xa4\xb5\x42\x16\x59\x03\x75\xe5\x97\xfe\x21\xae\xa9\x7b\x52\x18\x5d\x0e\x37\xa5\x3b\x63\x88\xa7\x07\xa2\xbc\x24\xac\xf9\x44\x25\xf8\x4f\x3d\x56\xbc\x9f\x7e\xe7\x41\x2a\x9e\x18\x33\xad\x55\xb7\xea\xe6\xda\x58\x16\x98\x16\x63\x83\xa2\xeb\xa8\xb6\xf5\x39\x20\xf5\x17\xa5\xc8\x0b\xd3\xe0\x3f\xaa\xd4\x08\x7e\x3e\xe8\xfe\xc9\xa7\x9a\x01\xc7\x79\x51\x21\x33\xd7\xb6\xe5\xf1\xde\xc7\x66\x30\x0d\xc4\x05\xcc\x21\xa8\xc5\x83\xfb\x73\xbc\x90\xcf\x24\x38\x5b\x08\x60\x49\xd3\xbf\x20\xc3\x00\x98\x3c\x0b\x35\x15\x38\xdc\xcb\x22\x7a\x14\xfa\xfd\x23\xac\x4b\x26\xbe\x81\xa2\xb1\x20\xcf\x21\x6f\xc5\x83\x54\xf9\xdc\xbf\x05\xf6\x63\x39\xad\x6d\xdc\x2c\xac\x14\x67\x7b\x90\xe2\x47\xeb\xb6\xc5\xc2\x29\x00\x7d\xc6\x0f\x37\x4a\x06\xd4\x04\xeb\x23\xeb\x1e\xc4\x99\x07\xc6\xe8\x81\x62\x9e\x18\x67\x26\x8c\xa6\xff\xfa\x59\xaa\x3c\xa8\xf6\xc2\x95\x16\x2b\x95\x36\xc2\xbe\x22\xbb\xe3\xb7\x23\x80\xef\x11\xb6\x1b\x35\x7a\x62\x53\x10\x0e\x30\xa5\x86\x81\x8b\xa0\x03\xfa\x3f\xfd\x1f\xc9\x19\x88\x1c\x05\x02\x2f\x94\x84\x85\x98\xf2\x17\xfe\xa2\x22\x50\x72\x20\xd1\x08\xa2\x8f\xc7\xbc\x39\xa8\xa1\x1c"}, +{{0x33,0xa8,0x5a,0xe1,0x50,0xbb,0xf5,0x52,0xf4,0x16,0x63,0xb2,0x15,0x21,0xc2,0x96,0xd2,0x46,0xdd,0x6c,0xf8,0x19,0x5d,0xf8,0x51,0xc6,0x95,0xbd,0x15,0xf4,0xa5,0x02,},{0xc8,0xc9,0xc4,0x25,0x21,0x00,0x8d,0x5e,0xff,0xf5,0x76,0xc7,0xe4,0xa5,0x60,0x83,0xce,0xd9,0xa9,0x28,0xda,0x6f,0xd5,0xcf,0x93,0xfd,0xa5,0x72,0xa5,0xa2,0xd0,0xc0,},{0xbb,0xe4,0xcd,0x63,0x67,0x6e,0x26,0xd6,0x75,0xa1,0x91,0x15,0x1d,0x30,0xdb,0x72,0xb5,0xb8,0x4d,0x46,0x1e,0xec,0x65,0x64,0xaf,0x86,0x7a,0xb4,0x1b,0xae,0x99,0x31,0x14,0x78,0x85,0x51,0x9e,0xc9,0xd7,0xe6,0xc8,0x18,0x74,0x3c,0x8e,0xf6,0xd5,0x16,0x7b,0x35,0xb4,0x21,0x36,0x3c,0x09,0xb3,0x57,0x36,0x7f,0xe8,0xde,0x44,0x3a,0x06,},"\x93\x7e\x05\xf2\xf1\xfd\xbd\x41\x73\x15\x53\xe7\x7c\xf1\x81\xb5\x07\x97\x58\x94\x0a\xee\x8e\x92\x62\x3f\xb1\xd5\xf0\x71\x28\xb7\xd7\xf1\x7e\x48\x42\x70\x7a\x56\x2c\x45\xba\x69\x26\x4c\x0f\x73\x0a\x82\x1c\x7d\xb6\xbf\x82\x99\x0d\xc6\x51\x26\x9b\x29\x6c\x33\x51\x79\x11\x30\x53\xd6\xf8\x5b\xb0\x96\xb2\x91\x11\x65\xfa\x39\x00\xcb\x10\x24\x16\x48\x7b\xa8\x07\x86\x79\xc6\xb3\x36\xdf\xf3\x87\x63\xc0\x8d\xcd\x20\xfa\x66\xdd\xa4\x5c\x57\x5d\xf1\x50\xd8\x51\x16\x5a\x48\x04\x97\x38\x30\xf4\x36\xdf\x60\xb8\x13\x19\xf9\xcf\xb5\x64\xc0\x65\x28\x96\xed\x5f\x18\x49\xcb\x33\x54\xf5\x0f\x00\x12\xf2\x86\xe8\xa3\x0c\x21\x35\x28\x69\x34\x74\x00\x4e\x85\x04\x01\x2b\x94\x55\x60\xc0\x74\xa6\xa1\x63\x43\x2c\xf4\xac\x4b\xa7\x17\x5c\xf2\x60\x05\xdb\x71\x99\xee\x96\xd8\x93\xcd\x1a\xad\x3f\xdf\x5d\x57\x46\x0e\xf0\x2d\xda\x6d\x3a\x14\x08\x25\x19\x6f\x3f\x8e\x2f\x37\xda\x36\xb6\xfd\xad\x18\x4f\x27\x40\xf1\x16\xde\x75\x8a\x92\x91\x70\x30\xc5\xfb\x80\xf0\x26\x24\x96\xd2\xdf\x93\xc7\xe2\x76\xf2\x5d\xa7\xdb\xed\x8e\xb8\xdd\x4c\x56\x3a\xba\x55\xb8\x2a\xf6\xba\x3a\x70\xca\x5f\x85\x8b\x44\xa0\x33\xcf\xb7\x95\x60\x4d\xde\xe7\x46\xe7\xc8\xae\x79\xd2\x72\xfb\x9a\x23\x41\xa2\xa2\x02\xdf\x5e\xac\x08\xde\x75\xad\x80\xc6\x58\x0d\x92\xb1\x69\xf2\xe1\x31\x88\x57\xb1\xb1\x42\x1c\x30\xf3\xdd\x46\x10\x93\xde\x2d\x34\x5e\xde\x74\x04\xb7\x2a\x45\x0d\xe0\x7b\x16\xee\xe6\x8c\xe6\x28\x87\xb6\xea\xa4\x36\xee\xe6\x84\xbe\x75\xce\x0e\x1f\x96\x26\x3e\x8d\x87\x36\xf9\xba\x00\x0d\x88\xe9\xe5\x86\x0f\x32\x8a\xe1\xe2\xdc\x73\x09\x9d\x32\xfc\xeb\x1b\xd2\xc0\x12\x36\x98\xa4\x9b\xea\xd1\x90\xa0\x0e\xc9\xa6\xf8\x71\x33\xed\xdd\x45\x31\x6f\x65\xeb\x0d\x32\x9b\x07\xb9\xa6\x6b\xb9\xfe\x42\x58\x8b\xf7\xb8\xd0\x6e\xfe\xc1\x98\x6b\x82\xa0\x81\xed\x3f\x68\x02\xe9\xbe\x73\x46\x47\x84\x55\x9a\x4f\x2c\x09\x7b\xa1\x4b\x0b\xfd\x5d\x7e\x0a\xff\x65\xcb\x69\xab\xd0\x3f\x86\x16\xcd\x7e\xdf\x7e\xc3\x68\x21\x9e\xdc\xf8\x93\xe9\xee\x71\xda\xd9\xf1\x8d\x79\xe5\x68\x26\x5d\xdc\x67\x16\x22\x32\x13\x23\x5b\xb9\x28\xe9\x08\xde\xa8\x27\x78\x4c\xd1\xaf\x39\x6d\x59\x0c\x81\xf4\xea\xcd\xfc\xf8\x9c\x5c\xac\x96\xfa\x05\x00\x64\xa2\x28\x41\xea\x71\x5f\x8c\x89\xd6\xd5\xaf\xbf\x59\x7a\x4d\x00\x5d\xbc\x6b\x13\x85\x6d\x33\x5b\x42\xa9\xa8\x2e\xdc\xb9\x49\x83\x5c\xca\x20\xb0\xa2\x3d\xe5\x1c\xc3\xae\xc3\x55\x66\xef\xf0\xc5\xae\x1a\xb3\x75\x13\x20\xd2\xc3\x10\x49\x52\x38\xed\xa3\x83\xc3\x8a\x41\x63\x15\x2b\x88\x15\x69\x0b\x8f\xf0\x15\x03\x5d\x1d\x00\xea\x4a\x0d\x6c\xaf\x32\x4b\xb7\x1a\x66\x4a\x1b\xed\x31\x48\x07\x84\xa6\x8f\x43\x8c\xaa\x35\x9e\x8d\x26\x73\xc8\x57\xd4\xb8\xc0\xb6\xc6\x95\x84\x7b\x86\x80\x0e\xa3\xd7\x34\xb5\xec\xc4\xd5\x2b\x50\x7a\xc6\x9b\x3a\x67\x78\x91\x60\x16\xeb\xc2\x31\x5f\x44\xc9\x0b\xf0\xc3\xe7\xda\xe0\x1d\x49\xcb\xc3\x03\x40\x2b\xbc\x63\x4a\xe1\x19\x1f\x3f\x6f\xd6\x3d\x30\x3b\x0c\x0b\xe0\x33\xa4\x7b\x90\xf8\xd3\xa7\x7f\x0a\x44"}, +{{0xba,0x9e,0x68,0x62,0x04,0x97,0x5c,0x3b,0xde,0xd4,0xc1,0xe9,0xf7,0x4c,0x7e,0x4c,0x7a,0x7e,0x3c,0x99,0x81,0xd0,0x1b,0xfc,0xa0,0xad,0x01,0x15,0xc3,0xf0,0xf5,0xc3,},{0x49,0x90,0xfc,0xe6,0x95,0x2e,0x8b,0x7d,0x0a,0xfc,0xf4,0xbf,0x9d,0xba,0x9b,0xce,0x1b,0xc4,0x81,0x5e,0x37,0x51,0x1d,0xa7,0xc2,0xad,0x48,0x92,0x58,0x1d,0xe0,0x3a,},{0xc7,0xd2,0x3a,0x58,0xe2,0xfb,0x2a,0x8d,0x4b,0x8e,0xd1,0xe9,0xea,0xe9,0x1e,0x11,0x29,0xc2,0xaf,0x8b,0xd0,0x5f,0x0b,0xd5,0x72,0xab,0xeb,0xbe,0x0f,0x30,0x82,0x59,0x25,0xf0,0xdf,0x71,0xcf,0xb7,0x21,0x8c,0x68,0x6e,0x55,0x48,0xd9,0x42,0x77,0x10,0xa6,0x90,0x36,0x6b,0xa8,0x55,0x41,0xc7,0x91,0x01,0xa5,0x8a,0x10,0xe8,0xaf,0x0a,},"\x46\xbb\x48\x95\x2a\xe5\x8f\x2b\xf5\x8f\x5b\xe8\xdf\x4f\x31\x6b\x50\xf3\x63\xec\x84\xee\xd8\xf8\x2f\xf4\xc0\x4b\x06\x92\xd0\x3a\xef\x26\xe8\xe1\xe6\xc9\x54\x9a\x22\x47\xd5\x40\xa6\xe2\x2f\xeb\x11\xe5\x7f\x4b\x80\x8a\x20\x97\xe8\xa7\xb6\xb3\xb7\xaf\x37\x69\xe6\xd8\x1d\x64\x88\x6e\x69\x62\x37\x2f\x4f\x39\xe4\x9c\xd4\x6c\x1b\x5f\x73\x5f\x38\x0f\x7c\x27\x7d\x09\x97\x76\xed\x1a\xea\xa5\x7a\x35\x9c\x0a\xa8\xc7\x2f\x40\xeb\x91\xa1\xbf\x07\xea\x15\x7f\x5d\xdb\x30\x40\x9d\x6e\x3a\xf9\x89\x90\xce\x7f\x30\xaf\xfd\xac\x5e\x22\x01\x06\x46\xdc\xa9\x6a\x54\x00\x60\xfc\x90\x8a\x31\x25\xb0\x00\xad\x1e\xd3\xa0\xf2\x55\xcd\x34\xf1\x5d\x7d\xd1\xfd\x68\x1c\x3c\x35\xa1\xcd\x65\x20\x56\xec\xc5\x26\x4d\x39\xaa\xf7\x2a\x9b\xb8\x3a\x55\x1c\xc9\x34\x88\x7a\xe1\x07\xaf\xdf\xef\x06\x32\x17\x27\x0d\x95\x96\x89\x14\x18\xbd\x46\x1b\xba\x63\xde\x65\xbe\x06\x7b\x1b\x78\x64\xfe\x46\x48\x4c\x7c\x9e\x96\x34\x9a\x7c\x03\xa8\x0f\xa0\x55\x05\x0a\xa1\x8a\xce\x2a\x44\xb4\xa0\x3c\x94\x78\x24\x17\x2b\x30\xe2\x10\x11\x15\x94\x43\xca\x3c\xef\xaf\x69\x6a\x7a\xa8\xf9\x80\x11\x26\x0c\x94\x36\xbf\x48\x99\x1f\x41\xd4\xd5\x07\xb9\x6c\xe7\x32\x3e\x53\x1a\xdc\xf6\x63\x47\xc5\x5c\x88\x55\x67\x3a\x9f\x2e\xc8\x9b\x5c\x80\x24\x46\x06\x17\xec\x72\x71\x77\x3b\x36\xd6\x4f\xc1\x4e\xb5\xd8\x26\x52\xc5\x3a\x30\x31\x45\x72\x27\x09\x3d\x11\x8f\xd8\xeb\x93\x84\xe8\x02\x29\x04\x1a\x96\xa6\x49\x34\x50\xf9\x7e\x67\x36\x26\x3a\xbf\x1e\xcd\x9e\x9f\xb9\xa4\xf0\xf6\xd6\x67\xfa\x82\x41\x51\x48\x5e\xdc\x37\xb3\x4a\xcf\x3d\x8c\x35\xf9\xc1\xbe\x48\xb5\xe9\x6a\x12\xaf\x8e\x2d\x35\xc2\x3a\x03\x58\x0f\x21\x1d\xa6\x31\x6b\x34\xc5\x6b\xee\x87\x2d\x47\x64\x1b\xca\x77\xda\x64\x0f\xdb\xba\xd5\xa9\xad\x8a\xb9\xdc\x79\x57\x91\x3d\xa7\x34\xad\x37\x49\x2b\xa4\xde\x8c\xf1\x36\xcc\xcd\xeb\x6b\xa3\xf1\xbd\x3f\x00\x3b\xe7\x26\x3c\x4f\x2a\x40\xc3\x3f\x24\xca\x33\x39\x59\x6e\x6c\x34\x28\x33\x81\x00\xeb\xcc\x07\x22\xd4\xf5\x0d\x30\xb3\x3b\x91\x2d\x4e\x7c\x1a\x9f\xe6\x5f\x66\x58\xa6\xf2\x39\x14\x0a\x62\xc3\x26\x1e\x10\x39\x2e\xd1\x93\x0a\xa9\x17\x65\x2d\x3b\xd2\xbe\x4e\x8a\x08\xab\x97\xe1\x45\xb9\x20\xab\xb3\x1e\xe4\xbc\xd5\xa0\xd7\x1f\x63\x81\x80\xf6\x1c\x24\x58\x23\xa3\x99\xa7\x34\xa4\xdc\xde\x09\x97\x88\x02\x45\xed\x71\xeb\x9b\xc6\x5e\x3c\x6f\xc9\x5a\xb9\x20\xb8\x02\x4c\x17\xd4\x4c\xed\x00\x37\xd0\x4a\x13\x3c\x26\x41\x78\x2f\x1d\x62\x2d\xf4\x52\x69\xb4\x91\xd3\xfa\x2a\x12\x27\x57\x9e\xaa\x38\x6d\xe3\xe7\xde\x7b\xc4\x55\xc6\xa1\x54\xee\xe5\x72\x7f\xff\x04\x37\xa2\x00\x76\xc5\xc3\xb0\x57\x7c\xac\x5b\x4b\x69\x34\xe2\x69\x38\x02\x22\x46\x1a\x60\xf9\x54\xe4\x89\x79\xc0\x67\x12\x17\xf1\x6f\x70\x27\x98\x30\x34\x12\x10\x93\x18\x6c\x78\x70\x5f\xc2\x7d\xc9\x2e\x2e\xda\x41\x16\xa6\xbf\x7d\x23\xe0\x54\x8d\x62\xb6\x7b\x25\xc4\x1e\xd0\x61\x92\xbc\x26\xef\x13\x97\xbf\x16\x01\xf3\xa6\xe2\xa0\xe7\xf6\x61\xfb\x05\x05\xee\x38\x2f\x27\xae\xc2\x80\x5a\x3e\x21\x17"}, +{{0x59,0x07,0xa8,0xc0,0x84,0x04,0x38,0x75,0x23,0x8e,0xdb,0xdc,0xb7,0x83,0x2f,0xbb,0xa4,0xc0,0x5e,0xa3,0xc5,0xf8,0x8a,0x96,0xf1,0xfb,0xf9,0x50,0x40,0x1e,0xc1,0x64,},{0xe2,0xf4,0x95,0x09,0xd1,0x00,0x7f,0x61,0x8e,0xfe,0x4f,0x1f,0xd6,0x7e,0xaa,0x6e,0x2a,0xb1,0x8a,0xfb,0x2d,0xec,0xce,0xd5,0xa0,0xb2,0xba,0x83,0x63,0x78,0x92,0x60,},{0x8c,0x49,0x12,0xc0,0xf8,0x85,0xd7,0x6c,0x91,0x40,0x59,0x50,0x53,0x73,0xa6,0x4b,0xdd,0xd6,0x7d,0xd4,0x68,0x36,0x9a,0xb9,0x18,0xf2,0x3e,0xa2,0x8e,0x04,0xc1,0x91,0x77,0xa8,0xd4,0x61,0x14,0x4f,0x0a,0x8b,0x51,0xd2,0x15,0x17,0x6c,0xb0,0x8b,0xd6,0x53,0x01,0xc3,0xc4,0x62,0x37,0xb6,0x1b,0xb1,0x49,0x8c,0xa7,0x9d,0x4b,0xe7,0x0e,},"\x43\x3b\x24\x78\xe1\x8f\xad\x5c\xb8\x10\x67\x06\x1d\x22\x55\x28\x22\x97\x78\x30\x78\x85\x47\x54\x60\xfb\xe3\x13\x7a\x5b\x44\x02\x48\x94\xdd\xbe\x56\xfa\x6e\xd0\x21\x49\x6f\x07\x86\xe4\x2b\xc6\xc2\xd2\x79\x7e\xa0\xa6\xbf\x35\x5e\x88\x11\x5f\xaa\x55\xcd\x92\xed\x42\x13\x3d\x9d\xcd\xa6\xb9\xeb\xf6\x3c\xe4\xa9\x94\xd1\xa8\x2d\x2a\x49\x26\x75\x58\xbe\x54\x18\x2a\x6f\x85\x11\x2b\xd1\x2b\x24\x7a\xda\xcf\x14\x05\xfc\x7e\xc7\xa0\x15\xd4\x3a\xb4\x0b\x82\xc6\x77\xf7\xf8\x5a\x0e\x48\x19\x7c\x5b\x96\x57\x61\x99\xf4\xc3\x34\x3f\xf7\x65\x4d\x52\x3a\x30\xc4\x3a\x05\x4c\x3e\x46\x44\x51\x27\x80\x34\xb7\xf1\x96\xc3\x66\x76\x8c\x62\x8a\xf9\x4f\xc0\xcc\xfc\x9a\x29\x55\xf9\xd3\x23\x38\xb9\x44\x78\x0f\x8e\x32\x70\x85\xb1\x03\x78\x18\x68\xe4\xfb\x79\xd5\x61\x22\xd7\xf3\xf5\xab\x30\x9e\x5d\x63\x4a\xdd\x15\xda\x38\x2c\x0d\x23\x58\xe6\x47\x18\x2b\xe4\xde\x6e\x9a\x9e\x43\xe6\xa3\xa3\xb8\x21\x5b\x20\x4d\x95\x07\x61\x0d\x46\x16\x21\x00\x0f\xb1\x89\x37\x07\xaf\x7d\x25\x95\xbf\xef\x8a\x8c\x5c\x5c\xd0\x8f\x30\x9a\x5f\xb5\x5e\x45\x51\x9a\xea\x9b\x84\x74\x8c\xa5\xc6\x72\xbf\xec\xd3\x0d\x25\x65\x12\x34\xa3\xcc\x31\x9b\x43\xdf\xce\xfc\x1a\x07\xb5\x5b\x4a\xca\x71\x4c\x2e\x7e\xf9\x63\x8f\xe7\x88\x4a\x77\xb2\x22\x53\xa0\x1a\x22\x29\x50\x0e\x9c\xe1\x0f\xda\x73\xa8\x43\xc1\x9c\xc0\x96\x26\xd2\x45\x6c\x22\xa9\xc9\x01\x88\x1d\x52\x1f\x4b\x15\xd2\xf6\x13\xcb\x46\x9d\x30\x4d\x57\x92\x23\xbc\x5f\xf7\x38\x04\xdf\x63\x71\x51\x7e\xba\xa5\xb6\x77\xea\x91\x0f\xf1\xa0\x2a\x26\xfa\xfe\x48\xfe\xf4\x69\xed\x79\x9b\xed\x6d\x56\xce\x96\x18\x34\xa2\xed\xc2\xe2\x3c\x0d\x94\x26\xec\xcd\xcc\x93\x4f\x4c\x22\x0e\x37\x81\x5f\x7c\x33\x4b\x73\x83\x60\x7d\x43\x05\x20\x94\x6a\x88\x1a\x08\x32\x5b\x41\x64\x97\x9d\x5e\x82\xcd\x81\x34\xd7\x8c\xec\x48\x61\xc0\x19\xf6\xde\x30\x1c\x1b\x9a\xec\x52\xbb\x98\x20\x33\xfb\x79\xb2\xe9\x73\x1b\xab\x29\x68\xbc\x3f\x93\xfa\x56\x04\xb8\x93\xc6\x02\x8c\x20\x4c\x36\xbb\x8c\x6b\x07\x4b\xe2\x8c\x96\x4d\x28\x49\xb5\xbb\x19\xd7\xe0\xba\x24\xe2\x2a\x20\x4d\x4f\xda\x83\xb1\x01\x31\xd3\x83\xf1\x0b\x13\x6b\xd0\xdb\xa3\x9e\xc2\x6a\xf3\x0e\x3f\xfb\x4d\xbc\x0c\x92\x1f\x0c\xc9\x91\x07\x15\xd5\x1c\x81\xfe\x4c\x62\x95\x0e\x85\x55\x49\xa1\x7c\xd7\x3a\x09\xac\x91\xe0\x6d\x46\x15\x18\x37\x6d\x0f\xcf\xa1\x23\xdf\x0a\x83\x71\x03\x45\x8d\x9c\xe2\x21\x80\x8d\x1f\x9e\xf2\xed\xc5\xcd\x2e\x68\x23\x14\x5b\x52\x48\x94\xea\x48\x52\x6d\x98\x5e\xef\xd3\xf6\x06\x79\x39\x95\x48\xe1\xed\xea\xdb\x53\x95\xb4\x3d\x87\x04\x4b\x2b\xfe\x7c\x60\x37\x02\x9b\x34\x6a\x40\x22\x27\xea\xb8\x1f\x33\x3e\x10\xe7\x7f\x1d\xbc\x06\xa2\x11\xd4\x3b\x82\x55\x86\x76\xc2\xdc\xff\x90\x82\xb1\xdd\x53\x36\x8d\xf0\x02\xde\x13\x29\xaf\x30\x00\xb1\x71\xa6\x91\x43\x89\xbb\x80\xec\x0c\x9f\x3e\x41\x2a\x44\x1b\x80\x0a\xfc\xeb\x04\x86\x70\x9a\xda\xc6\x6c\xaf\xee\xf2\x48\x83\x93\x31\xf5\xd8\x92\x19\x7e\x25\x42\x0f\x1e\x37\xd7\xc0\x24\x7f\x66\x9f\x5f\xcb\xf0"}, +{{0x60,0x20,0xae,0x27,0x3e,0x0e,0x05,0x37,0xba,0xc8,0x81,0xd7,0x54,0x9d,0x92,0x3e,0xb1,0xcc,0x20,0x0d,0x49,0xca,0x65,0xd4,0xbe,0x63,0x5e,0x39,0x17,0x3d,0xf9,0xda,},{0xda,0xaf,0x0e,0x69,0x9a,0x12,0xa9,0x2c,0x16,0xe0,0xde,0xd3,0xeb,0x34,0x50,0xa3,0x63,0x11,0x82,0x45,0x77,0xe3,0x61,0xf0,0x56,0x96,0x60,0x33,0x00,0x16,0x62,0x97,},{0xb1,0xba,0x88,0xfe,0xd7,0xe5,0xf4,0xb7,0x57,0xf3,0xfa,0x4d,0x1e,0xd9,0xb1,0x9e,0x49,0x8e,0x5d,0x2f,0x5e,0x6c,0xd4,0x6e,0x42,0x6f,0xe8,0xf0,0x39,0x88,0x2f,0x1b,0xe7,0x7a,0xc9,0xe5,0xa9,0x26,0x5c,0xbf,0x7e,0x3c,0xd2,0xa9,0xe9,0x92,0x6c,0x18,0x19,0x91,0x43,0x79,0x8d,0xa5,0xbe,0x47,0xa4,0x08,0x64,0x40,0x49,0x6b,0xa0,0x0f,},"\x6a\x80\x11\xde\x09\xaa\xc0\x0d\xb1\x6f\xf7\xe5\x5c\x2d\xe6\x7d\x8c\x98\x83\xfc\xb2\x04\x0d\xed\xbc\x1e\x32\x1c\xab\xa7\xbb\x03\x69\x71\x53\x01\x76\xd1\xdb\xba\xa9\x27\x52\x0b\xdf\xcc\xbe\xd8\x84\x01\x26\x04\x3e\xdc\x44\xcb\xb7\xfa\x35\x28\x68\x0e\x5f\x1b\x56\x64\x95\x1d\xc9\x01\x09\xae\xa4\xb9\xc3\x36\xca\x04\x3d\x82\x21\xa4\xc8\xd2\x01\x16\x56\xbf\x94\x4e\xfd\x36\xba\x0a\x10\xa4\xb3\x89\x19\x60\x55\x75\x0b\x0e\x38\x8f\xb5\x28\x70\xbb\xec\x8c\x55\x19\x81\x31\x44\x39\x45\xc0\x9f\x3a\xac\xe3\xe6\x91\x50\x14\x37\x40\x73\x26\x6f\x34\x88\x74\x42\xd7\x4f\x46\x8f\x8d\x70\x78\xbb\xa0\xbd\x81\x4c\xd6\xdd\x42\x3c\x97\xb5\x69\x05\x58\x7b\x15\x2d\x1f\xcf\xba\x0e\xb9\xfd\xe2\x11\x26\x91\xda\xfa\xf4\xf9\x21\x56\x2f\x24\x1b\x62\x84\x10\x01\x83\x4f\x6c\xe3\x66\x85\xf8\x2a\x8f\xaa\x3b\x7a\xfa\xd7\x3a\x5e\x59\xbf\x5f\x9e\x71\x3e\x59\x16\x3f\x31\xdb\xe6\x96\x11\x8a\xf3\x35\x06\xd2\xff\xea\x3d\x9c\x15\x56\xfb\x15\x2f\xd2\xb3\x21\xc3\x17\x57\xd0\xc3\xc0\xf6\x0e\xe1\x13\xed\xac\x02\xd6\x7e\xfb\xb3\x03\xdc\xe6\xfa\x88\xf7\xb9\x74\x6c\xa1\x10\xe6\xa0\xcd\x09\x9c\x08\x31\xf5\x3c\x55\xc2\x8b\x6c\x82\xaf\x44\x64\x56\xb8\x42\xb2\xc9\x50\xa5\x53\xee\x2c\x76\x5e\x97\x29\xe6\xb0\xc5\x46\xbf\xc2\x6b\xd6\xd4\x2d\x06\xb2\xed\x5d\x4c\x8c\xbb\xc7\x5f\x2a\x3a\xd8\x12\x93\x95\x79\x3d\x97\x9c\x03\x1f\xce\x7e\x20\xb3\x8b\xd8\x9c\x9b\x62\x47\x48\xb2\x01\x34\x23\xce\xba\xda\x02\xcd\xe2\x05\x2d\xa5\x66\x4c\x6c\x64\x26\xcb\xfc\x88\xf8\x4f\xf6\x02\xe2\xe2\x0d\xf9\x67\x8f\xbb\xa5\x77\xa4\xc1\x34\x51\x7e\xe0\x50\x68\x11\x51\x58\x0f\x7c\x5c\x97\x87\xb9\x6e\x55\xc4\x07\x5a\x26\xf4\xf8\xcc\xff\xbb\xb6\xea\x18\xde\x1b\x2c\xc8\xc4\x49\x6b\x16\x04\x27\x70\xb7\xec\x6e\xb5\x42\x9e\x7a\xc1\x89\x12\x32\xaa\x4e\x47\x46\x7f\x4e\x9a\x98\x5d\x80\x54\x7e\xcc\x4c\x6f\xd9\xf5\x97\x63\xed\xe9\x16\x71\xf2\xaa\x57\x36\xa5\xd1\x48\xe3\xa8\xff\xc8\x8e\x61\x25\x3a\x85\xb0\x95\x36\x54\x95\x8e\xb2\xd6\x94\x01\xcb\xea\xe7\x75\xf8\xcb\x8c\x3c\xa4\x2d\x21\x69\x3e\xbe\x29\x88\x38\xdf\x94\xc1\xd7\x7b\x12\x6a\x12\x05\xcc\x47\xd5\x0d\x53\x67\xb6\xf2\x76\xec\x8d\xb6\xb9\x53\x24\xa3\x1e\x8f\xd2\xed\x2e\x43\x42\x0c\x4a\xd0\x2e\xa2\x77\xdd\x94\x8a\x55\x19\x3d\x0f\x0b\x4d\x1c\xf2\x83\x86\xc7\x25\x97\x5c\xe5\xc1\x2d\x2a\x6f\x35\x67\x3c\xc2\x2a\x06\x94\xcc\xa4\xda\xf6\xaf\xbf\xd3\x26\xd8\x8c\x18\x50\xf8\x34\xc4\x2f\xf0\xe2\x92\xba\x4f\x13\xe5\xef\x07\x74\xa5\x96\xd3\x39\x04\xc0\x26\x2d\x31\xdf\x2c\x58\x4a\x0a\x4f\x45\x3f\x6a\xe4\xa8\x8a\x27\x5f\x7d\xe7\x9c\x13\xae\x1a\x73\x11\x5b\xe0\x2f\x42\x5c\x6f\x17\x7a\x1e\xc4\x63\x9c\x42\xa7\x92\x80\x9a\x2b\x09\x19\xeb\xd3\x21\xe3\x16\x00\x1d\x5b\x2f\x84\x89\x4f\xce\xbd\x50\xa1\xdc\xf4\x4d\x70\x2b\x92\x45\x32\xfc\x0e\x4d\x3f\x9f\xf8\x48\x6c\x0e\xd1\x80\xee\xcc\x3e\x09\xe2\x27\x2a\x94\xdc\x7d\x24\xa4\xe8\x7a\x93\x1f\xe2\x49\x5c\xbf\x99\x2c\x0a\xae\x92\x01\xe0\x79\x62\x98\xf9\x36\x3d\xba\xc4\x75\xe8\xed"}, +{{0x93,0x2a,0x20,0x0e,0xce,0xe7,0x22,0x3f,0x24,0x14,0x62,0x83,0xa4,0x04,0x8c,0x67,0xa6,0xa2,0xd2,0xfc,0x4b,0xa0,0xf9,0x24,0x8b,0xdf,0xfd,0x82,0xc6,0xcc,0xe3,0xcb,},{0xec,0x9b,0xfb,0x7a,0x6d,0x04,0xe7,0x26,0xfc,0x1e,0xa0,0xc4,0x24,0x61,0x0d,0xcb,0x79,0x67,0xbf,0x15,0xd6,0xd6,0x62,0x68,0x58,0xd4,0x11,0x19,0x8d,0x40,0xe2,0x39,},{0xcd,0x1e,0x4b,0xdf,0x4a,0x3e,0x4a,0x31,0xd6,0x52,0x54,0x33,0x3c,0x8c,0xc4,0x08,0x7e,0x4c,0xc4,0x0b,0x02,0xe2,0xa3,0x47,0xd0,0x9a,0x3d,0xde,0x69,0x84,0x90,0xc0,0x87,0xd7,0x10,0x9a,0xd0,0x20,0x9c,0x53,0xe9,0x87,0x58,0x9c,0xbf,0x3c,0xe2,0x64,0x12,0xa2,0xb0,0x2c,0xb8,0xa3,0xbc,0x93,0xfe,0xc7,0x5a,0xb5,0xd2,0xc3,0x87,0x03,},"\xdf\x95\x32\x07\x04\x82\x13\xaf\xb8\xe2\xaf\x45\x2c\x88\x9a\x21\xca\x13\x6a\x68\xc9\x29\xbd\xc8\x24\xf9\xa8\x9a\xc5\x96\xdc\xb9\x00\x19\xa4\x6f\xb6\x82\xbc\xfd\x96\x2f\xcc\xb2\x7d\x00\xba\xf8\xec\xca\xf9\xd9\xa7\xd8\x18\x3c\xab\xd7\xdf\xa5\x06\xf7\xba\xfb\x49\x35\xab\x04\x59\x31\xff\x8f\xae\xb7\x16\x31\xf9\xed\x6b\xb8\xf8\x47\x3a\xd6\x29\x0d\x7c\xf5\x19\xdb\x31\x0a\x44\x42\xc4\x61\x11\x8f\x67\xd1\xa6\xd1\x03\xba\xe6\xf2\x69\x7c\x94\xb7\x42\x6d\x9e\x02\xe3\xcb\x95\x22\xfd\x0b\x44\xae\xf6\x00\xc9\x62\xfe\xff\x58\x73\xd9\x8c\x27\x90\x88\x7b\x8e\x88\xd1\x60\x82\x4f\x1b\xba\x22\x01\x76\x39\xf8\xdc\xe6\x8f\x74\x34\x80\xde\xea\x1f\x92\xaa\x1f\xd4\x13\x5d\xd0\x64\x57\xa6\x0f\x36\xb7\xd7\xf5\x17\xd4\x0c\x94\xc0\xdd\xdc\x2e\x46\x58\x47\xd9\x09\xb9\xf6\x82\x45\xff\x2b\x42\x1d\x59\x19\x00\x1a\xae\x5a\xef\x24\xe0\x2c\x00\x2d\xa9\x07\xe8\x60\x5f\x16\x0e\xa6\x09\x6b\x58\x0b\x75\xce\xa0\x22\xd4\x02\xf7\xf5\xfd\xc4\x64\xf8\x7f\x78\xc7\x90\x6a\x01\xe8\xe4\x8f\xb5\xb3\x51\x74\x61\x2b\x48\xac\x8b\xc7\x50\xe0\xf3\xae\xb0\xa1\x2f\x7d\xfc\x09\xb0\x84\x2c\x17\x80\xa5\xfd\x9c\x54\xaf\xb9\x39\x9b\x94\x08\xba\xac\xcd\xa2\x0a\xfb\xe3\xd6\x82\x24\x8d\x7b\xf1\xef\xde\xf4\x90\x5a\x31\x9b\x0f\xfb\x10\x8b\x75\x3b\x71\xcc\x97\xe9\xe2\x1e\xc9\xb3\xdd\x28\xce\xe0\x39\xd9\x41\x8a\x11\x35\xf0\xad\xd0\x92\xaa\x66\x31\x2e\xa2\x91\x33\x00\xd1\xcc\x89\x16\x52\x43\x02\xbd\x3d\x1b\x09\xe6\xb2\x9c\x68\x57\xcb\xdc\x56\xef\x4b\x3f\x35\xd8\xee\x67\x72\x08\xef\xfa\x84\x6f\xdb\x06\x6b\x05\xeb\x71\x7b\x4d\x45\x12\x0c\xab\x72\xa7\xdb\x7a\x7c\xa8\x46\xe8\x7b\x16\xb6\x90\x47\xeb\x76\xd8\xf1\x8d\xa8\xe1\x39\x9e\xc0\xa8\xc9\xc3\x28\xcb\xe6\x0e\x0b\xf4\x20\x44\xd2\xeb\xf2\x81\x8b\x3c\x04\x75\x88\x45\x2f\xcd\x2b\x3e\xfc\x1e\x10\x09\xae\x07\x68\x87\x27\xdb\x8f\xb6\xdf\x2a\x2f\xe7\x5d\x1c\xf2\x2f\x32\xba\xc0\x9c\x82\xa6\xa3\xd7\xee\xd7\xd0\x05\x08\xcb\xe5\xb7\x24\x60\xec\xfc\xdd\x3e\xe9\x11\xef\xe5\x89\x8d\xbd\x8e\x4c\xe8\x59\x13\x26\xdd\x15\x22\xf9\xd2\x55\xda\x86\x1b\xf9\xeb\x2a\x1d\x57\x25\xd7\xd5\xd4\x27\x34\x03\x41\x94\x5e\x7b\xca\x8c\xf2\xff\x8a\x99\x74\x50\x95\x3e\x77\xd2\x03\x68\x3e\x4b\x0d\xaf\xc3\x30\xe0\x56\x72\xd2\xec\xd1\x3a\x3f\x44\x2d\xf1\x37\x04\x4e\x0f\x55\x6f\xfb\xce\xff\xea\x26\xcb\xae\x26\xcb\xa6\xf2\x56\x8c\xf3\x9f\x90\x84\x89\xe1\xa9\x2e\x76\xaf\xbf\x29\x79\x95\xda\x4b\x2c\xb1\xab\xc9\xee\x1f\xe4\xdc\xa5\xaa\x83\x8b\x2f\xbd\xc1\x09\xe8\x9b\xef\x3c\xe5\xa3\x6e\x5b\x2f\x71\x2a\xc4\xc8\x89\x43\x82\x48\xfa\x5a\x21\x50\xca\xc6\xc9\x77\xb5\xe0\x54\x3f\x40\x10\xb7\x31\x47\x32\xfd\x18\xe7\xfd\x59\x82\xe8\x32\x76\x51\x9e\x78\x72\x5e\x5a\x5e\xeb\x86\xf4\x89\x20\x84\xae\x52\xda\x38\x49\xc2\x28\xc8\x09\xed\xbf\x69\xa2\xcc\x47\xc4\x78\xd1\x87\x19\xf1\x11\xd7\x37\x88\x7c\x7a\x2e\xb3\x25\x08\x98\xdb\x34\xe5\xe5\x07\x6f\xab\x9f\x4a\x9e\x6e\x19\x29\xa3\x48\x08\x36\xde\xa0\x7b\xa4\xd6\x3f\xce\xfc\xe5\x54\x34\x30\xa8"}, +{{0x5c,0x48,0x3e,0x83,0x7e,0xb0,0x1e,0xd5,0xa4,0xad,0x5d,0xb3,0x79,0x26,0x99,0x82,0x4d,0xf1,0x3e,0x57,0x6b,0xe9,0x67,0xd1,0x21,0x15,0xc8,0x5e,0x02,0x86,0xe6,0x28,},{0xfe,0x1a,0xa8,0xb0,0x69,0xda,0x56,0xe6,0x76,0xef,0x3a,0x57,0xd9,0xbb,0xa8,0x83,0x05,0xea,0x03,0x28,0x08,0xee,0x63,0x52,0x73,0xb3,0x7c,0x5c,0x63,0x5d,0xef,0x4e,},{0xc1,0x7c,0x2f,0xbf,0x8c,0x00,0xbc,0xea,0x30,0x35,0xbf,0x0a,0x62,0xd3,0x02,0x29,0xdb,0x74,0x2c,0xab,0x11,0x99,0x67,0x7c,0x7e,0xb4,0xeb,0x0e,0xf5,0xc7,0xb5,0x1a,0xd4,0x87,0xa4,0x97,0x1b,0x63,0x1e,0x79,0x4a,0x58,0xbb,0x08,0x23,0xcc,0x0f,0xe6,0x26,0x10,0xfd,0xa6,0xa9,0xe0,0x3f,0x8c,0x4c,0x33,0x81,0xcb,0x15,0x4c,0xef,0x0b,},"\x58\xd5\xe2\xcd\x89\x9b\xa9\x85\x37\x8b\x3e\xc3\x3e\x9a\x86\x98\x22\xb2\x3d\x5d\x89\x6a\x28\xf4\x24\xfc\xd6\xe4\xcc\x28\xb8\x0d\x4a\xaf\x2d\xe8\x04\x36\x7e\xfd\xf5\xe4\x23\xb1\x23\x4d\x82\x1d\x63\xac\x05\xea\xed\x12\xc7\x3e\x8e\x36\x08\xaf\x0d\xdc\xcc\x83\x86\xb7\xd8\x42\xb1\x2e\x60\xd3\x0c\xed\xe3\x25\x53\x94\x5e\x78\x29\xe9\xb2\x3f\x5c\xcc\x2e\x71\x03\xa0\x8f\x2c\xdd\x9e\x75\xa7\xb3\x6f\x5e\x63\x72\x0e\xf0\xd4\x9b\x25\x92\xbe\xf3\x74\x02\x68\xc8\x9c\x86\xa6\xcb\xdf\xe2\x01\xde\x0d\xb9\x98\x5c\xeb\x19\x39\x9c\x9a\x1d\x5b\xb0\x58\x6a\xf3\xc8\xcd\xf2\x71\x32\x99\xeb\x04\x43\xa5\x41\xa4\x73\x84\x60\x72\x43\xc5\x4a\x05\x91\x50\x58\x36\x7d\x3f\x2d\xb3\x80\xed\x31\x7a\x8c\x12\xc7\xa6\x3e\x80\x9c\x2e\x84\xd4\xac\xb9\xd9\xee\xf5\x4c\x6f\x5a\xf7\xab\x59\xcb\x91\x68\xb1\x06\x8f\x9d\x2c\xcd\x97\x8f\xe7\x21\xba\xd6\x8a\x66\x9f\xfe\xde\xa3\xe9\x2c\x76\xb3\x2e\x31\x66\x65\x8e\xe3\xbd\x0d\xeb\x1b\x08\x41\x94\xce\x35\xd9\xa7\x41\xc5\x7f\xc2\x24\x1e\x68\xef\xaa\x65\x32\x0b\x23\xa1\xdd\x19\xea\x8b\x7e\xc8\x1e\x76\xf1\xe9\x16\x3f\x95\x92\xee\xee\x5a\xf8\xec\xed\x02\x72\xf3\x35\x12\xd0\xd4\xca\x06\x7f\x05\x55\x1b\x26\x53\x96\xe1\x00\x14\x78\x3c\xac\xac\x79\x43\x7b\x19\x84\x2d\xe6\xab\x91\xb9\xd9\x23\xbb\xeb\x50\x33\x25\xbc\x54\x86\x9f\x66\x3e\x6e\xa4\xae\x68\x97\x70\x1b\xe7\xe1\x1d\x16\xcd\xfa\xe0\xee\xe8\x61\x86\x20\x00\xe7\xa4\x16\x07\x81\x54\x7e\x42\x52\x6a\xf5\x1b\xa9\x69\x8d\x23\x4a\xaf\x51\x0d\xa8\x1a\x0d\xbf\x26\x43\x66\x15\x3d\x7a\x6d\x5e\xb3\xfb\x08\xb9\xbb\x5e\xa0\x65\xc2\xf5\xe5\xb6\xbb\x67\x9d\x2e\x21\x0b\x5b\x40\xe2\xbc\x82\xf7\x8d\xc9\xab\x58\x24\xb7\x4a\xad\xad\xd8\x9b\xf8\xa8\xb7\x3a\x0a\x2f\x43\xac\x74\x83\x78\x92\x1a\x73\xa2\x52\x70\x4a\x4a\xdb\xf7\x40\xcb\x99\xc1\xe1\x59\x4c\x37\xac\x9a\xcc\x19\xf5\x23\x15\xc6\xa8\x46\xa5\x7b\x36\x12\x8c\x64\xd7\x67\xaf\x44\xe9\xc8\x63\x05\xbf\x18\xba\x7c\xd5\x26\x80\x52\x3a\x3b\x10\x2f\xba\x6f\xe5\x55\x67\x06\x9d\x20\x47\xcb\xdd\x96\x05\xea\x12\xc8\x87\x7d\x39\x9c\x1e\x66\xe3\x38\x17\x73\x1f\x50\xb8\x4f\x81\x7d\x1f\x07\x60\xa4\x0f\x97\x46\x86\x18\x93\x41\x05\xeb\x00\xec\x50\xc7\x6d\xb3\xc5\x3f\xcf\x43\xfe\x17\x02\x90\x7d\x9a\x75\x6b\xcf\x43\x9f\x88\x31\xd0\xbf\xac\x92\xe7\x05\x8f\xb1\x57\xbe\x3e\x59\x1d\x37\xeb\x34\x16\x5e\x3c\x6f\xc6\x0e\x72\x29\x4c\x08\x3e\x47\x76\x26\xf9\x00\x1c\x1d\x73\x7c\x29\x03\x77\xdf\xa5\x8e\xa4\xea\xd3\x02\x8f\xc7\x62\xce\x8a\x3a\xfe\xc2\xe6\xe1\x32\xc6\x62\xdf\x60\x34\xab\x55\x4f\x93\xef\xac\x65\x7a\xd3\x4f\x61\x07\xd3\x47\xfc\x5c\x5e\x53\xf3\x73\x3e\x17\x8b\x76\x01\x4d\x2f\x9b\xbd\x06\xef\x2d\xfe\x60\xe2\x08\x3d\x88\x65\xf7\xf5\xb2\xac\xc0\x25\xd9\x12\xe5\xcf\x6c\xda\x6e\x79\x81\x43\xe9\xdb\xbc\x70\xa0\x21\x1d\x8e\x40\x03\xd7\x8b\x38\x3d\x66\xa6\xad\x29\x71\x7c\xa2\x4e\xdd\xef\x7d\xf7\xcd\x3a\x7e\xf6\x52\xab\xa5\x48\x7a\xfe\x5d\x02\x6c\x9b\x10\x28\x07\x29\x4e\xb2\x7d\x98\x24\xee\xb6\xb4\x0f\x08\x3d\xe7"}, +{{0xb0,0xd0,0xab,0xdd,0x84,0x44,0xe1,0x0f,0x29,0x37,0x54,0xac,0x9f,0x16,0xe3,0x1b,0xdc,0xdd,0x97,0xb7,0x06,0x71,0x28,0xaa,0xe8,0xe4,0xd7,0xf1,0x12,0x89,0xe2,0xcd,},{0x1c,0x78,0xcc,0x01,0xbe,0xa1,0x53,0x52,0xb6,0x3c,0x56,0x97,0xf1,0xcf,0xe1,0x2f,0xfd,0xd1,0x6d,0xdc,0x1d,0x59,0xe7,0x79,0x51,0xb6,0xe9,0x40,0x8e,0xe2,0x28,0xad,},{0x64,0x40,0x8b,0xdd,0x2d,0x0f,0xc8,0x92,0xa5,0xb6,0x2b,0x5a,0xcf,0x8e,0x3b,0x3c,0x73,0xc0,0xb5,0xc4,0xfa,0x2a,0x72,0xe3,0x9d,0xd6,0x08,0xd4,0x93,0x7f,0x93,0x32,0xf7,0x3e,0x14,0xd0,0x8b,0xad,0xc6,0x27,0x01,0x14,0xd1,0xf1,0xa5,0x56,0xcc,0x6e,0xe8,0x48,0x8a,0xbb,0x90,0x7f,0x79,0xae,0x17,0x5c,0x35,0x2e,0x9f,0x11,0xee,0x05,},"\xaa\x27\x6c\xc5\x43\xfc\xc6\x2d\x70\xa7\x04\x60\x8d\x98\xce\x51\xb6\x45\xb5\xc2\x4a\x64\x0a\x5d\xf1\x0a\x55\x91\x41\x7d\x10\x89\x26\xdf\x3f\x0c\xe1\xb9\x21\x03\x33\x09\xeb\x8d\x86\x59\xf4\x89\xfd\x6f\x79\xaa\x1b\xf4\x88\x2d\x72\xac\x69\xcc\x58\xd3\xbc\xe0\xfa\x89\xb1\x64\x11\xe9\x75\x3e\xb4\x0c\x6c\x4d\x59\x8d\xc8\xf4\xab\xb0\xbc\x48\xf1\x37\x03\x71\x32\x6c\x9a\x86\xbb\xc2\xac\x62\x14\x47\x8e\x78\xa3\x84\x08\xbd\xda\xfa\xa9\x59\x26\x00\xc4\x9a\x12\x9c\x05\x39\x2f\x8a\x7d\x64\x2b\x49\x13\x7a\x20\xf3\xfe\x9f\x11\xee\x17\xcf\xa3\xaf\xd2\xaf\x71\x56\x5e\x9c\x40\x08\x0b\x60\xcd\x0d\xbc\x37\x8e\xda\x06\x2c\x7c\xbc\x7f\xe9\x72\xbd\xe4\x50\x9a\x1d\xe9\x5f\x14\xdf\x48\x2f\x48\xaa\xcc\x46\x3c\xd5\x94\xf6\x6d\x64\x8d\x37\x94\x73\x8a\xd6\xab\x49\x6e\x2d\xa5\x0b\x0d\xb2\xba\x7b\x65\x91\x85\xe4\x58\x7f\x18\x2e\x83\x3d\xe7\x50\xfa\xac\xdd\xf2\x1a\xf5\xe0\xcf\x4c\x9a\xf3\x85\xb0\x4f\x7b\xe2\x31\x49\x8a\xd0\xb7\x42\xd5\xa8\x7c\x06\x11\x5d\xb2\x30\x97\x3a\x51\x42\x7f\x20\x2f\xa3\x9a\xfb\x98\x28\xb5\xf0\x3f\xa3\x27\xcb\xd5\x2d\xfe\xc6\x6d\x71\xea\x31\x98\x65\xdc\xf6\x81\x0f\x18\x58\x47\x2d\x8b\xea\x3e\x44\x7a\xdf\xb4\xb6\x07\x58\xe8\x6b\x48\x13\x37\x09\x73\x2d\x2b\xcf\x51\xc7\x6c\xaa\x84\x7b\x65\x37\xfc\xb0\x5b\xb8\xc8\x7d\xc5\xe9\xfb\x02\x2b\x32\x60\xc1\xd7\x1b\x14\x98\x59\xc9\x66\x3d\xbd\xae\x6a\x7b\xbf\xd6\xde\xb9\xd1\x23\x80\x9c\x24\x14\x01\xaf\x10\x71\x9c\xf9\x1a\x6b\xed\x16\x08\x4c\x44\x46\x07\x35\x9e\xd8\xf0\x18\xdb\x11\x15\x11\x89\x2b\x46\xbd\xac\x6c\x9c\x61\x38\x41\xde\xd8\x86\xb9\xde\xc0\x6c\x01\xe8\x04\x87\xe4\x8f\xbe\x77\x8e\x9e\x97\x50\x8f\xfd\xa0\x57\x78\x53\xaa\xbd\xca\xca\x8b\x0b\xab\x6c\xe4\x15\x57\xaa\xb9\x63\x1c\x96\xd6\x09\x77\xe3\x57\x18\xb6\x05\x95\x27\x3f\xdb\xa1\x40\xf5\x50\x0a\x8d\x35\x76\xf5\xa9\xfc\x8f\x3c\xa4\xc0\x2c\x16\x7a\xf2\xe0\x3d\x25\x75\x0b\x42\xad\xb0\x3b\x14\x17\xf2\xb6\xd2\x19\xbe\x5f\x84\x29\x33\x1a\x26\xa4\x49\xb5\xd4\xdb\x2b\x1a\x09\x15\x2e\xea\x2b\x25\xd2\xdf\x7e\xf6\xfe\x0a\x32\xe2\x5f\xae\x79\x36\x0a\x9a\xee\x15\x11\xfd\xa8\x06\x45\x50\x93\x7a\x71\x30\x97\x19\x30\xc6\x73\xbb\x35\x8e\x5f\x55\x95\x1f\x50\xb1\x46\xd8\x5d\x38\x3f\x3e\x01\xc1\x51\xec\xe6\xc0\x6d\x83\x67\x01\x25\x32\x80\xfd\xcf\xf4\xe1\x39\xd3\x31\x9a\xb2\xe2\xca\x71\xbc\xc3\xfa\x0f\xaf\x7c\x70\x2c\x9c\x60\x4e\x56\x51\xde\x4a\xf5\x70\x0e\x9e\xde\x72\x58\xb9\xbc\x14\x8d\x55\x95\xcd\x34\x17\x0e\x3e\x5c\xf2\x92\x82\x83\x90\x90\x8f\xda\x96\x1f\x22\x30\xac\x0b\x8c\xac\x64\x73\x97\x32\x70\x6c\xe2\xd5\xe5\x9a\xbd\x6d\x5e\x20\x7b\xda\xfe\xa7\x4d\x28\xd7\xa7\x58\xf2\x20\x0e\x4e\x00\xa0\xbc\xf0\x30\x6a\x3c\xab\xda\x47\x02\x4f\xab\xea\xe4\x88\xab\x5c\x32\x37\x15\xcf\x3c\xa7\x72\x0a\xf9\xeb\xbf\x85\x82\xe1\x15\x8a\x09\x9d\x73\x6b\x56\x9b\x9d\x40\x29\x58\x17\xea\x25\x54\x06\x8b\xef\x32\x44\x2c\x11\x1e\xc8\x14\xc6\xed\x41\x59\x19\xba\x73\x52\x63\x34\xdf\x30\xba\xc6\x66\x08\x4e\x56\x01\xc2\x28\x1c"}, +{{0x49,0x84,0x97,0xfd,0xcc,0x6a,0x10,0x58,0x91,0xe0,0x23,0xff,0x32,0xd7,0x5f,0x7c,0x37,0x48,0xd8,0xc5,0x2d,0x87,0xdd,0x3b,0x27,0x75,0xae,0xfd,0x81,0x60,0xa1,0x43,},{0x2d,0x79,0xae,0x9c,0xee,0x4a,0xc6,0x27,0x5b,0x05,0x74,0x9c,0x43,0x8e,0xbe,0x55,0x2b,0x41,0x3d,0x87,0x3c,0xc0,0x7f,0x14,0xf5,0xfa,0x13,0x01,0x77,0x21,0x4c,0x54,},{0xb0,0xa3,0x6a,0x2c,0x93,0x47,0x56,0x34,0x8e,0xb4,0x7c,0x25,0xa3,0x2c,0x3f,0x2a,0x5d,0xdb,0xd5,0x8f,0xcc,0x72,0xa0,0x8c,0x3c,0xea,0xd1,0xa2,0xd9,0x00,0x33,0x5c,0x30,0x01,0xe3,0x5b,0xfe,0x1f,0x3f,0xb5,0xa5,0x55,0x00,0x9b,0xa8,0xe9,0x68,0x74,0x49,0x4b,0x97,0xe8,0xb0,0x97,0x00,0xed,0xcb,0x1f,0x25,0x84,0xb9,0xd0,0xfe,0x03,},"\xbe\x38\xbc\x8c\xdf\x46\x19\x0e\x30\x4a\xb5\x3d\xd2\x9c\x2b\xc4\x09\x54\xfd\x4c\x6d\x2b\xb9\x90\xf9\x3b\x2b\x5c\x69\x1f\xdf\x05\x27\xc2\x60\xf5\x06\x61\x87\xf2\xd0\xf3\x1f\x43\xa0\x8b\x36\x0e\xa1\xed\x82\x00\x65\x17\x64\xb8\xfa\x49\x59\x5a\x15\x94\x10\x9e\x49\x67\x59\xab\x66\x23\xfa\x33\x37\x8d\x80\x0e\x61\x17\xe0\x79\xe1\x3f\xe8\x5c\x81\xb6\x3e\xbe\x24\x7b\x3d\xf6\xc1\x58\x4b\xc7\xcf\xfb\xdf\xa4\x5f\x2a\x2c\xe7\xc2\x37\xaa\xaf\xef\x8c\xbc\xa7\x0b\xca\xbc\xe0\xb8\x47\xd5\x51\xf4\x6a\x7d\x15\xce\x2a\x0d\x3d\x54\x5a\xba\xcc\x59\x30\x01\x0c\x53\x64\x88\x87\xd4\x76\xe0\xd1\x3a\x34\xfc\x1c\x54\xdf\x09\xd1\x06\xed\x75\x8d\xee\xdc\x76\x1d\x55\x7a\x73\xb2\xbc\xdd\xde\xfb\xa4\xed\x00\x59\x97\xb1\x92\x79\xb9\xd2\xde\x37\xd0\x41\xfe\x01\x3e\xef\x05\xa2\xe1\x1c\x9a\x23\x4e\x87\xcc\x0e\x16\xc0\xc6\xda\x42\xaa\xa5\xbf\x99\x64\x17\xbf\x64\xe5\xb7\x85\xd6\x7d\xc3\x25\x47\xc1\xf0\x52\x17\x8d\x69\x4c\xf2\x0f\x16\x98\x58\x9e\x7e\xd4\x9b\xe2\x9d\xd5\x9f\xd5\xc0\x1b\xa1\xd9\xf5\xfb\x06\xa7\x58\x95\xb7\xb1\xe1\x58\x95\x09\x7e\xbd\xe8\x4c\xad\x63\x03\xaa\x0a\x86\xdb\xc3\x24\x74\x7d\x97\x24\x5d\x70\xc5\x20\x3b\xe0\x1b\x06\xcb\xde\x06\xae\x03\x72\x04\xd2\x37\x30\xcd\x69\x61\x89\xf7\xac\x26\x7c\xf2\x02\x17\x99\x29\xce\x54\x10\xe0\xe3\xad\xe5\x13\xd2\x20\x1b\xfd\x20\xfe\xfa\x40\xb4\x47\x6f\x27\xbf\x90\x7c\x76\x2e\xb7\x26\x2a\x5b\xe1\x3c\xfc\x04\x7a\x84\x6d\x20\xa9\xf2\x31\x1b\x64\x69\xb0\x6a\xb5\x45\xf0\xec\x9f\xc4\x46\xea\x25\x0c\xd3\xb7\x3a\x7b\x6b\x96\x0c\x10\xca\x4c\x2d\x6c\x64\xa1\x56\xa1\x8c\x9f\xb8\x10\xe4\x9a\xfd\x0c\x36\xda\xab\x8b\x8b\x85\x66\x43\xa4\xcc\xaf\xa9\xad\x88\x6e\x91\xe5\x44\x53\x5b\x8e\xdd\xa2\x7c\x90\xc0\x6a\xb6\xbc\xc5\x36\x28\xbe\x18\xd7\xd6\x36\x9c\xa1\x80\x1f\x91\xc2\xe0\xb9\x5f\x36\xd7\x02\xf7\x72\x34\xb4\x10\x07\x19\xc0\x59\x95\x1e\x45\xb1\xf9\x16\x98\x39\x34\xe3\x2b\x4d\x4d\x8f\x29\xc0\xa3\x73\xf8\xd8\xf0\x91\x8b\x96\x78\x65\xcd\x0e\x4b\xec\xa0\x13\x27\xc9\x9d\x5f\xde\xd4\xc1\xa6\x9a\xc2\xd4\xd9\xb7\x8f\xfb\x83\x05\x67\x00\x21\x04\x02\x50\xcc\x27\x73\x7e\x75\xdf\x75\x76\x0f\xec\x8b\x8d\x30\xb2\x45\x65\x4f\x3c\x12\xf1\xf7\xce\xa0\xbc\xe7\x8a\xb3\x69\x35\x78\xaf\x3e\xa6\x1f\xfc\xcd\xf9\xba\xf7\xc3\xea\x65\xb8\x8f\xc8\x54\x12\x81\x26\x47\x67\x96\x89\x2c\x66\x3b\xd1\x45\x18\xc9\x91\x86\x29\xa1\x09\x5f\x61\x4e\x04\x92\x44\x6c\x3d\x84\xb1\x6e\xc9\x4f\x7e\xca\xda\xeb\x6b\x65\x9b\xbb\x48\x67\xb5\x79\x06\x17\x14\xfd\x5b\xb0\xfa\xa4\xad\x6b\xe0\xff\xb3\x88\x8b\xea\x44\x7e\x4e\x34\x38\xc8\xf0\xea\xe6\x44\xfb\xd4\x5a\x38\x02\xdc\x40\xec\x45\x1b\x21\x2b\xd5\x92\xda\xcd\x4d\xa9\x66\x86\xdc\x8b\x20\x24\x25\x7f\x25\xe9\xc8\x30\xbf\xf7\x95\xee\xe8\x5d\x87\xa0\x90\xc1\xa4\x23\x21\xe7\x10\x55\x57\x64\xed\x82\x57\xc9\x41\x5c\x7f\x22\x4b\x53\x75\x58\xce\xfd\xc6\x15\x12\x9f\x28\x35\x02\x67\xc0\x1b\xa0\x40\x3e\x07\xf5\xc6\x06\x7f\x91\xc8\x5a\x2c\x50\xc8\x66\xdc\x43\x88\xaf\x38\xd2\x16\x02\x03"}, +{{0xd9,0x62,0xa6,0x71,0x9e,0x5c,0xc7,0x72,0x4c,0xa4,0xa1,0xd5,0x59,0x53,0x68,0x12,0xb4,0xe2,0x2a,0xa7,0xbc,0xb1,0x3e,0x4f,0xb1,0x72,0x2d,0x28,0xe0,0x45,0x21,0x7c,},{0xa9,0x44,0x59,0x2d,0xbc,0x7d,0x77,0x03,0x9d,0x72,0x02,0x56,0xc3,0xfd,0x34,0x0d,0x34,0xdb,0x89,0x2a,0xb1,0x3e,0x48,0x12,0xd6,0x62,0xe2,0x84,0x0c,0x28,0xb6,0xd0,},{0xdf,0xb9,0xb6,0x35,0xac,0x0e,0xdf,0x83,0xb7,0xb5,0x9d,0x0b,0x84,0x09,0xaf,0x47,0x5f,0x66,0xfc,0x99,0x46,0xaf,0x0b,0x7c,0x63,0xab,0x8c,0xf5,0x92,0x9d,0x47,0x01,0xa1,0xbf,0x66,0x95,0x9c,0xde,0x62,0xfb,0xcf,0x59,0xa4,0x8a,0xb3,0xbb,0xaf,0x0b,0x9a,0x61,0xb6,0xe0,0x0b,0x21,0x81,0xeb,0x93,0x42,0x82,0x07,0x0a,0x5d,0x53,0x00,},"\xa6\xaa\x7a\x19\x0d\x00\x3a\xb1\x75\x33\x2b\x8f\x58\xe7\xca\xeb\x69\x08\x54\xd9\xdb\x56\xdb\xb6\x95\x7b\x3f\xb6\x54\xe2\xe0\xda\x99\x1f\x31\x54\x21\x42\x04\x13\x5d\xf1\xe1\x10\x43\x17\xc9\xe3\xc5\x8e\xed\xff\x1f\xc6\x1a\xba\x57\x74\x4c\x0c\x7e\xf4\x86\x00\x0a\x70\xb2\xc1\x42\xeb\xad\xdc\x07\xab\x06\x5e\x2a\x85\x5d\xaf\x19\x8a\x68\x03\xac\x24\xef\x37\x24\x48\x7c\x13\x51\xdd\xed\xa0\x51\x39\x13\x45\x7d\x76\x86\x0d\x78\xa9\xb6\xbc\x3d\xba\x66\xc4\x0e\x5f\xc3\x49\xa8\x73\xad\x60\x65\xce\x7d\x7f\xdc\x2c\xc4\x83\xb3\xae\xfb\xf2\xf0\x3d\xd6\x69\xbd\x9c\xb8\xf6\x3c\xee\x47\x78\x5c\xac\xb0\x9d\x87\x2c\x9a\xeb\x83\xe9\x86\x84\x05\x25\x43\x24\x03\x79\x82\xe0\x86\x13\x45\x5d\x95\x21\xd8\x8e\xa2\xfd\xa0\x20\xbe\x73\x0c\xfc\x8c\x07\xcb\x0b\x37\x61\x4c\xcb\xa2\xfa\x3e\xc4\x98\xb8\x15\xbb\x5a\xdb\x99\x6e\x84\x8b\x38\xc0\x15\xa6\xa5\xc7\x52\xeb\xda\xc7\xb9\xee\xd8\xb6\x96\x19\xd8\xc8\x46\xb6\x6f\x78\x16\xd1\xdf\x1e\xbc\x21\x07\x1c\xef\x0b\x25\x1e\x2e\xab\x59\x82\x7f\x6d\x60\x55\x08\x43\x70\xfd\x27\xc2\x03\xe8\x6a\x18\x9f\x1e\xe1\x1e\x84\x03\xab\xdc\xbd\x1f\x45\x34\x1a\x82\x05\x25\xd8\x63\x7d\xc4\x84\xa5\x18\x5d\x65\x51\xcb\x88\x2a\x96\xb9\x98\x1a\x5f\x1a\x82\x1f\x27\xb6\x56\xff\xf9\x0e\x7f\x69\xbf\x28\x6f\x75\x2f\x97\x0f\xfc\xa5\xc5\x3e\x08\x50\xb2\x0b\x94\xf9\x43\x16\x27\x09\x4a\xce\xa9\x12\xa8\x80\xb7\x49\xa6\xf8\x0b\xb2\x06\xcc\xaa\x74\x6f\xa7\x0c\x83\x3c\x9f\x32\x30\x89\xce\x05\x58\xc9\xdc\x20\x0d\x57\x39\xd1\xe4\x99\x63\x4f\x2c\x16\xe5\x4b\x7f\x6d\x78\x19\xc4\x70\x71\xb6\x0b\xd5\x4d\xd0\xf2\x73\xa3\x19\x75\x0f\xd3\xc5\x10\xa4\x9a\xb5\x6f\x63\x0c\x7c\xe6\xd8\x02\x3d\x97\x86\x23\x46\x85\x9b\xc0\xb4\xd6\x05\x22\x49\x69\x70\x89\x03\x76\x03\x01\x40\x9c\x60\xab\x25\x17\x56\x11\xf0\xbe\x98\xb2\x3a\x8c\xd8\xac\x53\x5e\x35\x13\xbc\x77\xe1\x45\x21\x93\xda\xdf\x44\x35\xe6\x3c\x36\x29\xb6\x66\xa5\xea\x4c\x4b\xad\x36\xea\xca\xd2\x60\x14\x04\xea\xbd\x8d\x9a\x07\x95\x6e\xc2\xb4\xb7\xbb\x63\x36\xed\x75\xb8\xdf\x8f\x16\xde\x42\xc0\xfc\xae\x93\x65\x2e\x3c\x40\x7c\xbd\x45\xe8\xd4\x13\xef\x51\xe8\x54\x2d\xf6\x25\x12\xee\x79\x3e\x41\x35\x8a\x1d\xe1\x92\x46\xc6\x58\x6b\x3c\x14\x07\x41\x04\x21\xf6\xe8\x65\xc7\x5a\x9f\x4a\x6a\x47\x88\xf8\x4a\x9c\x78\x1d\x8f\x80\x24\xbf\xdb\xe2\x5b\xdc\x7d\x4b\x69\xcb\xaa\x77\x19\x62\x8c\x0b\x07\xec\x2c\x4a\x23\x4f\xff\x4a\xc3\xd4\x93\x5b\x9c\xe4\xc8\xa1\x69\x47\xab\xe7\x95\x1f\xf8\xd9\xac\x92\x15\xe3\x38\xfa\x0f\xe9\x12\x41\x76\xd1\x7b\xac\x1e\x05\x59\x2c\x43\x98\x68\xae\x5a\x4f\x75\xfd\x1e\xa8\x2a\xa4\x54\xc2\x0a\x93\x9d\xed\xa7\x29\xa0\xe1\x96\x46\xce\xbd\x82\x20\x49\xc8\x25\xc7\xe3\x1c\x6e\xfa\xd4\x5e\x30\x6f\x2d\x9f\x05\x69\xe0\x71\x73\x31\xf4\x80\x04\xc2\x6e\xbf\xe6\x8f\x38\x43\xe9\x0f\x80\x67\x03\x2d\x21\xe7\x86\xc8\x53\x9e\x01\xbe\x3c\xea\xc5\x95\x4a\x05\x46\xc8\x4b\x73\x4d\x99\x94\x56\xa7\xc4\x5f\x8c\xeb\xaa\x47\x8e\x54\x80\x07\xf9\xd3\xaf\x83\x6f\x75\x4d\xe4\x12\x3f\x2f"}, +{{0xe1,0xd1,0x41,0x65,0x18,0x92,0x1d,0x07,0xc8,0xc3,0x9e,0x29,0x73,0xd8,0xea,0x12,0x49,0xca,0xa8,0xbf,0x65,0x9c,0xc3,0x6c,0x79,0x37,0xf8,0x4e,0xce,0x7a,0xd4,0xfc,},{0x48,0xbd,0xcc,0x3f,0x1a,0x5b,0x80,0x58,0xed,0x9a,0x32,0xef,0x1c,0xc4,0x8c,0xf7,0xa8,0xab,0x76,0xa6,0xe4,0x51,0x9e,0x5a,0x82,0x85,0x52,0x41,0xad,0x6f,0xff,0x8a,},{0x42,0x32,0xd2,0xa4,0x81,0x08,0x4d,0x11,0x96,0xdb,0x62,0xf2,0x2d,0xc7,0x4c,0xf2,0xea,0xf2,0xdb,0x0d,0xf0,0x5a,0xd7,0xcd,0xde,0x67,0xbf,0xc2,0x9b,0xff,0x56,0xcd,0xe0,0x19,0xac,0x9f,0x03,0xd8,0x1f,0x18,0x27,0xeb,0x1e,0x3b,0x0a,0xbe,0x02,0x04,0xca,0x7f,0x77,0xfa,0x87,0x4a,0xb5,0x26,0x83,0x54,0xff,0x08,0xbb,0x7f,0x48,0x00,},"\x3d\x26\x3d\xe1\xab\x91\xe8\xdd\x7b\x31\x7f\x7a\x27\xfb\x60\xa6\xe1\x83\x8c\x0c\x79\x3b\x03\xab\xbe\x70\x82\xb6\xbd\xa0\xc7\xc4\x60\x62\x26\x21\x92\xc8\x8b\x65\xc0\x26\xc1\x74\x58\x4d\x29\x64\x97\x10\x42\x9a\xe4\x4a\x46\x14\x0b\x4c\x82\xc8\xa0\xb7\x4d\x56\xa0\x04\xf8\xe2\xf5\xc1\x8f\x84\xf0\x46\x41\x53\x77\x2f\x83\x12\x63\x3f\xc6\xad\x28\xa7\xd9\xfb\x55\xf7\xd7\x8c\xd6\x48\x8c\xa5\x81\x17\xea\xf9\x23\xfa\x28\x87\x5e\x2b\x31\x89\x89\x31\x85\xaa\x3c\xcd\x04\x4d\x3f\x11\x0e\x2e\x7c\xab\xdf\x6f\x81\x4b\x9f\xdd\x67\x33\xbd\x5f\x30\x7a\x87\xbc\x73\xb6\x25\x0d\x58\x83\x93\x6d\xeb\x1d\xb0\xe0\xaf\x1b\xe7\xab\x32\x9b\x5c\x6b\xd9\x35\xbd\x8f\x8d\xc8\x88\xf0\xd1\xc4\x64\xed\xbc\x02\x3c\xbc\x08\x07\x53\xee\x8f\x79\x9f\x10\x72\xba\xd1\x14\x4d\xfa\xa6\x15\xa5\x9e\x2a\xed\xc6\x62\xe8\x3c\xb1\xf8\xe5\x20\x96\xa7\xee\x48\x3b\xf8\x73\xb2\x5a\x0c\x04\xc1\x85\x1a\x0e\x87\x37\x50\x63\xaa\x1a\x94\xfa\x83\x5c\x05\x26\x40\x36\x6b\x79\xf7\x35\xd3\x28\x61\x97\xab\x32\xeb\xdb\x51\x23\xf6\xb4\x7a\xd3\xf4\x42\xc4\x4c\x53\x0a\x68\xf8\x51\x27\x59\xe9\xcf\x38\x6f\xba\x07\xb8\x06\x4b\xc8\xfe\x83\xe2\x45\x49\x5e\xc4\x5f\x89\x38\xf8\x25\x9d\xc8\x01\x62\x05\xf7\x8d\x39\x54\x44\x2e\xc1\xb4\x45\xd8\x3d\x95\xad\x18\x05\xa5\xe0\xe8\xb3\xd5\x6b\x87\x0a\x20\xda\x18\xd7\x4f\x26\xf5\x50\xa9\xc7\x53\x4a\x41\x44\xdc\xbc\x1c\x3c\xdb\xbe\x47\x0c\xc1\x53\x90\x50\x43\x08\x8f\xac\xf1\xd3\x03\x55\x9d\xe4\x1e\x96\xc0\xab\x40\x9b\xb3\x6d\xcf\x38\xcc\x90\x38\xa6\xa4\x90\x8d\xea\x82\xa6\x53\x19\x5c\x16\xf2\x90\xa7\xc3\xac\x48\x76\x36\xcc\x5b\xcb\x18\xd1\x5a\x14\xac\x62\x4c\x70\xb6\xf6\x46\x2b\xf2\x49\xe0\x00\xce\xe9\x24\x01\x8b\xdf\x7d\xde\x39\x11\x4c\xb4\xf6\x52\xe1\x22\xe8\x74\x4d\xa2\x8b\x05\x89\xe1\x28\x4d\x70\xd9\xf1\x06\xde\x16\xd0\x73\x64\x80\x80\xe6\x43\x7f\xf3\x84\xe6\x81\x77\xd5\xcb\x71\x8e\x2c\xe3\xf1\x7b\xa1\xe9\x90\xae\x3c\xe9\x40\x66\x01\x30\xe9\x37\x50\xb8\x2e\x2f\xb4\x1a\xa3\x69\x77\x45\x68\xd7\xcf\x28\x67\x25\xe3\xc5\x8f\x63\xe7\x3f\x86\x97\xae\xec\xc7\x17\xc5\xcf\x1a\xf7\xad\x74\xf4\x46\x29\x2c\x90\x5d\x84\xe2\x2b\x23\xd4\xe0\xd2\x60\x4b\xff\x48\xfe\xfc\x40\xc6\x20\x4b\x5e\x34\xc0\x42\x29\x2e\x53\xbe\xc9\x36\x01\x59\xa5\xcd\x97\xb2\xdf\x57\x86\xb8\xf5\xa2\x92\xc0\xb3\x9d\x14\xa8\x70\xa4\x58\x8e\x67\xbd\x12\xb2\xc2\xf7\xa4\x40\x84\x62\x85\x1d\x2a\xa7\x87\x97\x1d\x93\x15\x19\x0f\x42\xcc\x58\x8a\xf0\xd2\xdc\xd9\x1f\x31\xbb\x71\x5e\x92\x50\xf1\x19\x28\x14\xf7\xb8\xa2\x1f\xef\x45\x17\xb0\xcf\x8b\xb8\xa1\xa1\xa5\xf5\x00\xee\x21\x9d\xfb\x46\x13\x2e\xfe\x8e\x90\xbc\x49\x09\x3a\x55\x59\xf9\x68\x1b\x4f\xb5\x9e\x5b\xa9\xef\x3f\x05\xd3\x4e\xed\x03\x4c\x14\xd7\x7e\xe9\x5e\xbd\x76\xff\xa5\xaf\x0b\xef\xcb\xa1\x8f\xdf\x93\x2a\xf4\x85\x45\x10\xb7\x5d\xb0\x0a\x72\x57\xb2\x34\x88\x7d\x49\x60\x7d\xfd\x16\x18\x0d\xb5\x16\xc7\xa2\x0c\xcf\xca\xed\xa6\xae\xdf\xb6\xa2\x37\x7f\xbf\x31\xe6\x7b\x51\x76\x55\xdb\x73\xca\x29\xe1\x18\x62\x4d\x60\x80"}, +{{0x2b,0xf7,0x4f,0x00,0x4d,0x7d,0x0a,0xf7,0x3a,0x83,0xea,0x20,0x8c,0xc2,0x06,0x72,0x3d,0x18,0x8f,0x4c,0xf6,0x07,0xbc,0xad,0x4b,0x69,0x80,0x26,0x8f,0xf2,0x1f,0xa7,},{0x8f,0xdc,0xd9,0x93,0x52,0x43,0x8b,0xeb,0x52,0xf0,0xd1,0x74,0x2b,0xae,0x71,0x84,0x45,0x12,0xdd,0x06,0x85,0xaa,0xf1,0xc9,0x09,0xe3,0x8f,0xc4,0xb5,0xaa,0xb6,0xcc,},{0x3e,0xb5,0xb3,0x39,0xe1,0x91,0xa3,0xb6,0x16,0x85,0x45,0xda,0x5f,0xb0,0xca,0x9b,0xe2,0x09,0x04,0x39,0x19,0xb9,0xc7,0x0a,0x07,0xb4,0xa7,0xa3,0xbf,0x64,0xb1,0x02,0xf6,0xff,0xd6,0xd2,0xb0,0x25,0x59,0xdc,0x68,0x1e,0xd3,0xb9,0xc8,0x22,0x97,0xb2,0x01,0xdc,0x25,0xc4,0x97,0x38,0x80,0xe1,0x55,0xe1,0x3a,0x29,0x42,0x6e,0xb4,0x0d,},"\x89\x8e\x43\x03\xea\x5b\xeb\xd2\x00\xa5\xf7\x56\x2b\xe5\xf5\x03\x26\x40\xa3\xf5\xcc\xfa\x76\x42\x92\x04\x5a\x1a\x36\x8d\x02\xaa\x59\x10\x77\xd8\xf3\x04\xf7\x4d\xbd\xfc\x28\x07\x34\x45\x4e\xd8\xc2\x72\x7a\xff\x39\x2c\x10\x8c\x52\x6e\x52\x7e\x67\x2c\x53\x97\xb2\xd7\x7c\x01\xf7\x74\x1e\xf8\xdc\xc2\x51\x0e\xe8\x41\xb5\x9d\xd1\x0f\x4e\x1d\x3a\xc5\x01\xaf\x7c\xbd\xb8\x5b\xa3\x11\x29\xc2\x62\xfd\xe1\xa0\xc8\xbc\x83\xd6\xff\x94\x4b\x6b\xae\x3f\xa7\xfb\x62\x58\x7c\x68\x1d\x8e\x34\x29\x65\xc5\x70\x5f\xd1\xa6\xab\x39\xe5\xa0\x77\x0e\xe7\x79\x8d\x9f\xb6\xc0\x01\x8a\x51\x4d\x53\xaf\x84\x8d\xb6\x04\x7c\xd0\x2d\xb3\x52\xd5\x56\x3b\x53\x66\x23\x73\xb9\x71\x93\x5a\x1a\xc2\xb7\xb6\x36\x1d\xac\x67\x48\x77\x18\x13\xf7\x74\x93\x16\x69\x49\x61\xb9\x40\xff\x38\x05\x81\x1a\x49\xfa\x27\xa9\xba\x45\x7a\xd2\x88\x48\xc6\x97\x05\x0e\x01\x88\xd0\x77\x3e\x17\xfb\x52\x19\x4e\x19\x0a\x78\x72\xa3\x98\xf3\x1c\x0f\x0a\xe0\x65\x37\xa2\x73\xff\xb5\x0c\x2c\x81\x64\x45\xab\x88\x28\x11\x92\x2c\x06\x21\x55\x6c\x46\xa3\xa0\xec\x40\xbf\xed\xb4\x11\xe9\x0b\x6d\xb1\xdd\xd4\xbb\xeb\xb5\x7d\x10\xdf\x56\x6a\x63\xd7\x26\xa3\x33\x08\x51\x4c\xe3\xb4\x99\xd5\xe5\x26\xc2\x2b\x95\x6d\x8b\x99\x91\x3d\xcb\x13\xe4\x37\xe9\x47\xb6\x66\xc4\x1c\x54\xd8\xb3\xae\x23\x56\x64\x7e\x80\x17\xab\x67\x83\x86\xc9\x27\x21\x9a\xe7\xbd\xdc\x0d\x82\x12\x65\xf9\xdc\x4f\xf3\xf8\xce\x5b\xe6\x0f\x8e\x9d\xef\xc5\xca\x33\x50\x68\xee\x29\xfe\x83\x04\x91\x7b\x78\x87\x84\xa2\x38\x8a\x32\x01\x92\xf9\x32\x5d\x0e\x6c\xff\xfe\xa2\x1e\x6e\xaa\x29\xe7\x70\x7f\x63\xa9\xea\x4f\xbb\x25\x58\xe3\xd0\x83\x5b\xab\x1f\x52\x36\x10\x37\xae\x59\xe5\x03\xee\x96\xb9\xd7\x08\xa4\x7a\x3a\xe4\xba\xd1\x13\xe2\xa4\x60\xa2\x69\xcc\xf2\x5a\x00\x03\xcb\x3e\x68\xa5\x51\x86\x4e\x59\x84\x09\x14\x79\x11\x26\xf9\x54\x78\x8b\x25\xb5\xaf\x5a\xaf\x58\x6e\xbb\x87\xfa\x5f\x37\x7b\x4d\x7d\x7f\x84\xc0\x00\xdd\x2c\xb4\x40\xe2\x14\xd3\x8d\x5e\xcf\x70\xf2\x0e\x98\x81\x82\x8e\xda\xa1\xdb\xec\x37\x09\x3d\xb9\x60\x68\x6c\xa1\x23\xf1\xec\xba\x63\x36\xb3\x7f\x46\xcf\x76\x5b\xe2\x81\x4b\x9e\x67\x05\xbc\x9d\x6a\x49\x31\x81\x18\xc7\x52\x9b\x37\xc8\x4e\xc8\x8d\x58\xa8\x45\x3d\xcb\x69\x2c\x9a\x36\x01\x6b\x94\x8e\xbe\x6f\xb2\xc1\xd0\xad\xf5\xf1\x98\xee\x30\x97\xa6\xff\x0b\x8e\xeb\xba\xd8\xb0\x76\x93\x30\xb1\x86\x89\x51\x6b\xc0\xfe\x66\x8b\x0d\x05\xe3\xa5\x84\xfc\xf8\x9c\x49\xdb\x50\x1d\x61\xc2\xde\xf7\xed\x37\x22\x07\x01\x93\xa5\xb6\x83\xc5\x08\x7e\xf2\x74\xce\x6a\x19\x3d\xd4\xa3\x03\x53\x6c\x67\x93\x4b\x46\x60\xa8\x41\xee\x1b\x44\x6a\x68\x92\xb1\x4d\x0b\x0a\xa3\xe9\x8f\xdf\xfd\x43\xc7\x97\xad\xd3\x65\x83\xf7\x4c\x94\xd0\xe2\xd6\x8e\x2d\xe8\x18\xd9\xaf\x20\x05\x98\xf0\xb2\xbe\xae\x16\x9c\x8d\xfb\xc4\xd3\x97\xe6\xd1\xce\xb6\xda\xa6\xc9\xf6\xbb\xf4\xf8\x31\x1b\xa2\x6f\xfb\x19\x4d\x44\x21\x6c\x51\x30\x52\x67\x07\x4e\x85\x6a\x1d\x6e\x92\x27\x80\xf4\x79\x8e\x2f\x22\x02\x23\xff\xf1\xdc\x37\x0c\x8e\x34\x51\x4a\xba\x42\xdf\x51"}, +{{0xf5,0xf7,0xd5,0xb7,0x3c,0x5a,0x65,0x30,0x1b,0x5b,0x4c,0x67,0x10,0xed,0x12,0xc1,0x6e,0x79,0x03,0x17,0x7d,0xb7,0x92,0xca,0x71,0x5e,0x23,0x38,0x9d,0x05,0xd8,0x3e,},{0x7c,0x47,0x62,0xe9,0x79,0xf0,0xc7,0xe2,0x07,0xbe,0x18,0x43,0xe2,0x66,0x6a,0xca,0x27,0xea,0x89,0xbf,0xf5,0xb6,0x1d,0x57,0x3c,0x98,0x5f,0xc7,0x02,0x5e,0x1e,0x28,},{0x58,0xfb,0x39,0x2f,0x82,0xd5,0xe5,0x2f,0xf0,0x72,0xcc,0x77,0xef,0xe0,0x48,0xf2,0x23,0x52,0x50,0xc7,0x11,0x25,0xee,0x82,0x1c,0x5f,0x3b,0x39,0x3b,0xcf,0x2f,0xa4,0x6b,0xe4,0xc5,0xd8,0xca,0xf1,0x3c,0xb5,0x19,0xef,0xe0,0xc2,0xfa,0xd9,0xee,0x23,0x1a,0xe9,0xb6,0xfd,0x1f,0xd5,0x09,0xc9,0x8c,0x69,0xc2,0xd3,0x6c,0x75,0x3e,0x0e,},"\x7c\x93\x18\xd5\x6e\x63\xf1\x65\x35\x43\x6f\xa4\x5a\xfe\x27\x8e\x74\xe6\x18\x81\xbb\x46\x89\x97\xd0\x41\x8b\xc7\x20\xb6\x30\xda\xdb\x81\x28\xb4\xb6\x5c\xa6\xe9\x21\xe5\x01\x81\x3d\xf9\xfe\x03\xb4\xef\x0a\xae\x80\x35\xdd\x08\xc5\xf8\x20\xce\x5d\xf1\x2e\xe1\x18\xd9\xc3\x6d\x3b\x15\x1a\x52\xc3\xf9\x6a\xe1\xca\x4c\x82\xfd\x19\xda\x66\x9d\xdb\xa9\x4f\xeb\xf8\xea\xc8\xc4\x2b\x44\x7b\xab\xc8\xa6\x0b\x36\xe8\x03\x62\x4f\x7d\x20\x47\xbd\x8d\x8a\x15\x36\x87\xf1\x0d\xc1\xca\x82\x10\x0b\x7c\x87\xd3\x23\x70\xec\x8f\x26\x71\xed\x7d\x06\x7c\xc8\x05\x87\xca\xb8\xdb\x3a\x71\xce\x5e\x40\x63\x27\xf7\x63\xec\x1b\x3c\x16\x67\x70\xa7\x55\x36\x63\x0c\x81\x5f\xd8\x26\x75\x82\xd1\xb5\x05\x1f\x0f\x82\x1c\x02\x15\x0b\x2e\xef\x34\x9b\x50\x59\x03\x14\xaa\x25\x70\x79\x3f\xa6\x4a\x76\xed\x2e\xd8\x3d\x2b\xa1\xf9\xb9\xf1\x16\x31\x54\x61\x2b\x49\xa6\x4a\xd8\xd5\x57\x3c\x25\xb1\xcd\x37\xc4\x1a\x44\xe3\xdf\x78\xf1\x05\x3d\x90\xb0\x68\xf0\xd3\x7a\xe0\x0c\x4a\x32\xb1\xa3\xff\x87\x4c\x41\xda\x4a\x70\x43\x39\x2f\x18\xef\xe5\x51\x8d\x76\xe8\x8b\x41\xce\xd6\x9e\x6f\x4c\x01\x4f\x06\xeb\xc5\x14\x6e\x61\xe8\x2f\xae\x1c\x49\xc3\x7c\x39\x4f\xea\x34\x19\x9a\xb8\x6c\x11\xa4\x46\x7a\x37\x4e\x40\x25\x5a\x05\xd4\x26\x97\x14\x30\xd5\x6c\xdb\xa2\x5a\x21\xad\x77\x9c\xc7\xf6\x2d\x22\xcd\x87\xb6\x0f\x08\x91\xbd\x85\x6a\x51\x7e\x14\xb7\x2a\x9a\xc7\x67\x2e\x4e\x8f\xb3\x74\xa9\x75\x8a\xb0\xc4\xe5\x96\x4a\xae\x03\x22\x89\x73\xf1\x73\xa5\xd4\x2a\xef\x9d\xb3\x37\x36\xc3\xe1\x8d\x8e\xec\x20\x4a\x1a\x17\xb9\xd0\x45\x93\xde\xa4\xd8\x04\xcb\xc8\x1b\x9a\xc5\x45\x80\x50\x49\x55\x39\x99\x9a\x99\x85\x48\x7e\x7c\xa1\x1c\x37\x58\x2e\xf8\x5c\x84\x1e\x8f\x06\x5e\xa9\x8f\xdd\x6b\x1c\x60\xde\xa1\xec\x28\x83\x52\x15\x68\x85\x6a\x6e\xbb\x27\x49\xf2\x07\x2e\xb4\x34\x48\xbe\x07\x05\xed\x47\x7c\xf4\xb2\x00\x48\x65\x21\x7d\xe5\xfa\xdb\xe2\xa0\xf9\xd6\xb8\x4b\x3f\xe7\xf7\xbf\x6c\x77\x53\x74\x96\x24\x6e\xc7\x96\xb8\xef\x2c\x04\xf6\x8a\xb5\xb1\x4f\xce\x0c\x6d\x28\x7b\x83\x62\x27\xd9\xf0\x8f\xa0\xee\x19\x72\x2f\x67\x98\xa5\xd8\x28\x0d\x10\x7c\xfc\x1b\xd5\x92\xd9\xdd\xc7\x24\xea\x86\xfc\x39\xdc\x94\xa3\x94\x01\x9e\x3a\x3d\xe9\xe0\xd1\xc7\x35\xe8\x62\xde\x2b\xb9\x52\x5b\x5f\xb4\xbd\x12\x12\x12\xbf\xaf\xf9\xff\x58\x6a\xc3\xc7\x5c\x5a\xce\x74\x6d\x9c\xa3\x07\xf7\x95\xff\x26\x97\xf2\xb4\x1a\x63\x46\xed\x23\x39\x7e\xb3\x88\x98\x69\x1e\x6f\x66\x84\x16\x37\xd0\xab\x0d\x96\x83\x09\xe0\x19\x40\x02\x30\x90\x15\x41\x6e\x74\x47\x2f\xe3\x24\x25\xd4\x5f\x07\xc7\x71\x19\x18\xb1\xe5\x79\x0f\x57\x2c\xe4\x44\x10\x42\xd4\x26\x03\x37\x92\x29\x7b\x5f\x81\xe0\x80\x9b\xd9\x69\x1f\x0a\x50\x5e\x32\x59\xfc\x03\xc9\xff\x10\x7e\xb9\xb4\x87\x95\xf4\x9f\xb0\x9c\x1b\xab\x56\x59\xd3\x9f\xfe\xcb\xdc\xc4\x03\xe3\x80\x3d\xc0\x12\x43\x8c\x2f\xb3\x6f\x68\x30\x15\xc5\xdf\x04\x82\xcb\x7d\x7f\xc5\x75\x73\x64\xa0\xa3\xc1\x0d\x0e\x12\x59\xc0\x1f\xcc\x4d\xd5\x49\x4b\x52\x90\xa6\x94\xae\xa3\xf6\xfa\xe5\x47\xac\x57\x6f"}, +{{0x43,0xd4,0xbe,0x6d,0xe9,0xcb,0x00,0x89,0x8e,0x99,0xdd,0xcc,0x2e,0x15,0x30,0x11,0x0f,0xa2,0xcb,0xc4,0x37,0x6c,0x48,0x5e,0x9c,0xa5,0x7f,0xd6,0x55,0x86,0xd8,0xa3,},{0x36,0x32,0xad,0x38,0x9b,0xe2,0xfa,0xb3,0xfb,0xa0,0xd8,0x04,0xbf,0x63,0x45,0xcd,0x32,0x2e,0xdd,0xd6,0xa7,0x5d,0x8c,0x37,0xfd,0x4b,0x5b,0xa1,0xc9,0xc2,0x5e,0x8f,},{0x86,0xae,0x93,0x25,0xf8,0x0b,0x98,0x86,0xc8,0x38,0x1f,0x96,0xa1,0x8c,0x21,0x20,0xe6,0xdb,0x01,0x6a,0x0d,0x6c,0xa2,0x82,0xed,0x93,0xba,0x9b,0x61,0xca,0xec,0x02,0xde,0x88,0xef,0xca,0x8b,0x8e,0x91,0x6a,0x4b,0x16,0xa5,0x85,0x25,0xa2,0xf6,0x8d,0x21,0xe5,0xfb,0xe6,0x7d,0xb4,0xc4,0xd6,0x20,0x95,0x95,0xc4,0xab,0xc3,0x2b,0x09,},"\xd9\xd5\x5d\xab\x0f\xa6\xda\x76\xb6\x8e\x84\x1c\x24\xd9\x71\xba\xc1\xf7\x9a\xf5\x13\xd8\x34\xe4\x26\xa5\xd0\x81\x14\xce\x8b\x54\xce\x8b\x7a\xfe\x01\x6b\x0f\xad\x03\xee\x74\x50\xc6\xc3\x09\x71\x73\x68\x1a\x4b\x2e\xb9\xf9\xc1\x79\xa8\x8e\x7c\xc3\x68\x13\xf2\xf5\xd1\x5f\x79\x98\xaf\xa9\xfd\x4e\x54\x6c\x73\xbb\x42\xe7\xf9\x52\x2b\xe6\xaf\xab\xca\x8c\x7b\x64\xfe\xd0\xe2\x92\xe4\x37\x5f\x3e\x1e\x5f\xd9\xfc\xb5\x39\xf4\xe5\xe5\x43\xfb\x6a\x11\xa0\xdf\x32\x1e\x70\x08\x4a\xaa\xbb\x70\xa9\x95\x0c\xee\xe3\xd8\x79\xc3\x86\xef\xca\x1e\x59\xc3\xcb\x7c\x45\xb5\x60\x09\x5e\x7a\xf0\x0f\xf5\x2f\x8a\x1a\xaa\x9c\xcf\x09\x2f\x0b\xb8\x06\xd9\x76\x10\x74\x2a\xc5\x82\xa3\xab\xbe\xdd\xf3\x9f\x49\xd2\x29\xd3\x2a\x11\x86\xd0\x21\x51\x8d\x74\x72\x8d\x13\xd9\x62\x63\x5d\x63\xba\xa6\x74\x3b\x12\x6b\xf4\x58\xfa\x2a\xc7\x56\xfb\xf8\x80\x96\xc8\xd3\x34\x0c\x62\x23\x90\x53\x4a\x74\x3f\x18\x64\xd5\x4d\xea\xb5\xe5\x53\x63\x72\xce\x5a\xc9\x37\x62\x28\x74\x14\xea\xe1\x58\xa7\x6b\xf8\x1d\xf5\x41\x7c\xf4\xc0\x47\xbe\x3a\xc1\x47\x5c\x51\x7e\xbd\x3a\xc1\xd1\xd1\xbd\xda\x11\xb3\xf9\x9c\x18\x17\x3e\x03\x0a\xcd\x51\xd2\xb5\xcf\x79\x51\x65\x09\x41\x54\x05\x07\x75\x11\xbd\xd9\xcb\xe1\x7d\x04\xf4\x78\x05\xe9\x8d\x0d\x14\x5e\x60\xa5\xd0\xe0\xf4\x53\xcd\x9b\x5c\x1a\x24\xf1\x2b\x75\xe8\xcc\x34\xd5\xe0\x06\x91\xff\xac\xbf\xf7\x88\xfe\xa8\x34\xd9\xd7\x79\xc1\xe6\x10\x29\x4d\xce\x19\x17\x0d\x28\x16\x0c\xff\x90\x9b\xea\x5a\x0a\xa7\x49\x40\x17\x40\xea\x3a\xf5\x1e\x48\xb2\x7c\x2b\x09\xf0\x25\x44\x42\x76\xc1\x88\xc0\x67\x1a\x6d\xa9\x4b\x43\xd1\xe5\x25\xe6\xa4\xa8\xa1\xa7\x3d\xfe\xdf\x12\x40\x18\x46\xba\x43\x06\x8a\x04\x09\x2b\x12\x91\x22\x70\xd2\xb6\x0d\xf6\x09\x97\x79\x75\x6b\x8b\xbb\x49\xec\xe8\x2d\x55\xf0\xf8\xdb\x1b\x80\xfb\x4b\x59\xbb\xa8\x60\xbd\x18\xc7\x5d\x6c\x83\x4d\x69\x44\x2a\xe0\x31\x4c\xf2\x39\x9f\x53\x92\xa3\xc6\x72\x8c\x63\xe5\xc5\x16\xc4\x22\x2a\xac\x60\xf9\x16\xdd\x63\xd1\xd0\x51\x7e\x8e\xb1\x0b\xd0\xe1\x5e\xb9\x06\x14\xde\xb2\x96\x40\x3a\xd1\x5b\x8c\x12\xb9\xe9\x71\xef\x2f\x01\xe5\x9f\xc3\x5d\x90\xc5\x5a\x8e\x20\xe9\x43\x7d\xd4\x34\xb2\x6d\x5c\x2c\x6e\xc2\xd5\x3a\xce\xc1\x7e\x81\xe4\x78\x31\xdc\x2d\xe8\x21\x83\xd7\x13\xb5\x9a\x4d\x1f\x46\x96\x9d\xdc\xdd\xaf\x27\xf4\x4e\x5a\x31\x1a\xaa\xc3\x9c\x3d\x5a\x97\xbc\x90\xca\xd7\x12\xf4\x6f\x85\xe6\xc8\xfb\xf5\xd5\x8d\x8b\xc3\xec\x27\xd3\x10\xa9\xea\xf2\xc3\x69\xcb\x00\x64\x97\x70\x39\x0a\x3f\x98\x8f\x36\x2e\xfc\x15\x5f\x56\xa1\x46\xa6\x26\x50\x54\x7e\x91\x53\x25\x07\x01\xee\xad\x1b\xd0\x1c\x89\x46\x22\x72\xdf\xaf\x0a\x43\x1a\xf4\xbd\x7c\x3d\xb4\x51\xad\xa6\x03\x23\x3f\xda\xd3\xaa\x89\x99\xaa\x21\xe2\xd3\xa4\x3b\x0b\x56\xfc\x6a\x91\x24\xd3\x35\x98\xb3\x73\x7f\x4e\x5c\xb2\x58\xbe\xda\x75\x6a\xd2\xe1\x7d\x06\x91\xd1\x5d\x41\x6b\xb7\xcb\x07\xec\x8d\x8c\x7a\xf5\xde\x80\xe5\xb9\x39\x4e\x32\x0c\x4c\x6e\x43\xef\xaa\xe6\x84\xad\x00\xf6\xdd\x20\xa8\x75\x0e\x95\x9c\x2f\x04\x20\x6f\xc0\x23\xaa\x19\x0c"}, +{{0x7d,0x01,0x0d,0x76,0x0f,0x24,0xe5,0xa2,0xde,0x34,0x08,0x9c,0x9f,0xdb,0x19,0xc3,0x3b,0x15,0x5b,0x0a,0x37,0xca,0x45,0x5a,0x5e,0x5b,0x1d,0xae,0x7a,0x07,0x31,0x76,},{0x4c,0x87,0x7b,0x3c,0x49,0x71,0xfb,0xb5,0x51,0x16,0x6e,0x21,0x4d,0x1c,0x76,0x24,0xc5,0x22,0x77,0x90,0x3c,0x59,0xa5,0x62,0xa8,0x0b,0x91,0xa8,0x54,0x83,0xfb,0x47,},{0x55,0x70,0x61,0x38,0x79,0xae,0x22,0x77,0x8b,0xd5,0x4f,0x14,0xfb,0x6e,0x8c,0x02,0x56,0xa7,0x1f,0x3d,0x79,0xc3,0xe5,0xcd,0x8e,0x41,0xae,0xa8,0xcf,0x77,0x3e,0x24,0xd2,0x9f,0x1f,0x1b,0x24,0xf8,0xc8,0x0d,0x29,0x49,0xe8,0x20,0x14,0x65,0xdb,0xde,0x89,0x40,0xb1,0xfa,0xb6,0x48,0x3b,0x08,0x5d,0x41,0x8e,0x25,0x10,0x14,0x20,0x0c,},"\x86\xe2\x11\x55\x72\xbf\x4c\x01\x3e\x6b\x4b\x04\xd0\xb0\x3e\x60\x6e\xe7\x0d\x92\x9c\xb8\xec\x36\xf4\xe2\xf3\x55\xdb\x3b\x5e\x15\x73\xd6\x58\xd1\x7b\xb1\xa3\x10\xc1\x69\x89\xa1\x6b\x95\x58\x92\x2e\xe4\x93\xf3\x59\x04\x21\x03\xc4\xdc\x1b\x40\xdf\xf7\x70\x99\x01\xfd\x58\x30\x13\x3f\x42\xc4\x65\x1e\xca\x00\x8b\x49\x9e\xe4\xf8\x4c\xd4\xec\x1e\xda\xa7\x82\x56\xed\xb6\x2f\x24\x02\x1a\x00\x76\x25\x69\x19\xe4\xe2\xce\x0a\x5a\x20\xf9\x21\xc2\x78\xcc\x29\x91\x59\x64\x4b\x5e\x3a\x3b\xbd\x08\x9d\xcb\xbe\xba\xd3\x76\x6a\xea\x77\xe9\xf0\x8e\xe5\xf7\xd4\xc1\x9d\x81\x70\xbc\x3d\xe1\xba\x77\x9a\x76\x99\x14\xf9\x65\xdb\xde\x2b\x61\xba\xd2\x14\xc5\x08\x18\x60\x41\xf7\x6c\x25\xbe\x95\x76\x56\xf5\xcf\xb7\x33\x4e\xb8\x38\xa3\xcf\xbc\x55\xcf\xba\xb6\x7a\xdf\x15\x52\x61\x99\x41\xb8\x35\xcd\x3e\x34\x10\x3b\x18\xb4\x91\x31\xe8\x20\x96\xf0\x5f\x57\x0b\x89\x98\x04\xba\xb8\xb6\xcb\xad\xdb\xbc\x02\xf9\xf3\xb5\x59\x73\x6d\x99\xca\x7b\x02\xd3\x26\x8f\xa2\x73\x99\x6f\xcf\x05\x71\x97\x7d\x1c\xc3\x00\x8c\x4e\xf8\x48\x97\x0e\xe3\x50\xb1\x58\xc4\x7e\xc2\x77\xad\xd4\x74\x2f\xa2\xbc\xbe\xa9\xbd\x55\x49\xc7\xbc\xa0\x38\x02\x0e\xce\x68\xf1\x88\xc1\xea\x3a\x62\xdd\x9a\x07\x3d\x4c\x13\x8c\xa8\xa9\xac\x04\x08\xdc\xfd\x46\xe3\x6b\xdf\xf7\x39\x88\xa5\x8b\x96\x17\xca\xa0\x8b\xd4\x1b\xf3\xe8\x12\xe7\x82\x4f\x0f\x7e\x81\x46\xa4\x44\xf3\x6b\xf5\x3a\x1c\xd8\x92\x03\x9c\xcd\x33\x5f\x5a\x2e\x79\x74\x5e\xac\x96\x14\x8c\x2a\x29\x99\x47\xf1\xb2\xe3\x28\xa3\x78\x9b\xf1\x3c\x6d\x73\x50\x6f\x3b\xdc\x68\xea\x48\xab\xf0\x02\x27\x0f\xe4\xee\x9e\xf9\xed\x6b\x10\xc2\xfb\xb4\xff\x12\x75\xb9\xd7\xdd\x35\xd8\xa5\x2e\x37\x17\x58\x57\x4c\xb4\x66\xc5\x7b\x5a\xbc\x24\x29\x76\xbe\xfc\x8d\x98\xa0\x13\x1b\x9b\xb8\x46\xb2\x19\xe4\x66\x91\x86\xa8\x3c\x05\x6c\xd8\x08\x06\x61\xde\x16\xb5\x1c\xe5\x76\x7b\x22\xe9\xa9\x32\x42\xbf\x8d\x32\x05\xc6\x6a\x67\x3c\xe7\x83\xd1\xc0\xd3\x7b\x63\x00\xfb\xf0\xd6\x12\x79\x40\xf8\x8f\x18\x19\xc4\x50\xdc\xc9\x05\x43\xed\x79\x4f\x1f\xd4\x4e\x65\x39\xfe\xba\xf1\x9a\x4c\xc9\x88\x70\x01\x4d\x7c\xca\xd7\x4d\x18\x76\xa1\x23\xec\xd1\x45\x51\x6c\x74\x3b\x4b\xba\x62\xd8\x21\xca\x9a\x79\x51\xe0\xdf\xb2\x3f\x38\xd9\xe3\xa3\x65\xfd\x83\x22\xf2\xee\x47\x99\xe9\xff\x11\xe1\xc5\xc3\x0b\x55\xa3\x55\xc8\xa5\xde\xea\x81\xa5\x45\xe3\x47\x05\xab\x56\xd1\x7b\x1f\xa0\x6e\xd7\x64\x15\x55\x67\x02\xf3\x64\x80\x82\x46\xf8\x63\xc3\x19\xf7\x5c\xdf\x6b\xd7\x48\x43\x8d\x1a\x2e\xaf\x42\x06\xc5\x60\xbf\xaf\xc2\x35\x67\x9a\xd6\x04\x9c\x1a\x01\x52\x6f\xcb\x9a\x3c\xe1\xb1\xd3\x9b\xe4\xdf\x18\xb1\x5f\xa0\xea\x55\x27\x2b\x17\xeb\xde\xdf\x6c\x30\x49\x8a\x8a\x14\xf2\x04\x2b\xe1\xc2\xcd\xb0\x9e\x9e\xf3\x84\x6d\x66\x59\xa9\xf6\xd6\x73\xdf\x9a\xfb\x7e\xde\xd0\x4b\x79\x3d\x97\x31\xf0\xac\xcc\x41\x46\x8d\xc1\xf3\x23\x6c\x99\xac\xad\xee\x62\x39\xc3\x61\xb8\xbd\x7e\x2d\x0c\xfe\x8b\xb7\xc0\x66\x87\xe0\x8e\x76\xb7\x1a\xd5\x7a\x03\x61\x79\xf2\x91\xd0\x96\xae\x2f\xa0\x81\x8e\xf4\xbf\x48\x66"}, +{{0xaa,0xaa,0xbb,0x7c,0xe4,0xff,0xfe,0x4d,0xc3,0x57,0x47,0xba,0xea,0x2b,0xc5,0xf0,0x50,0xbe,0xf0,0x6e,0xe0,0xc1,0xfd,0x63,0x2a,0x06,0x7f,0xec,0xe1,0xef,0x4f,0xb5,},{0x82,0x0a,0x24,0x42,0xd5,0xf4,0x5f,0x3c,0x79,0x14,0x78,0xe0,0x98,0xfb,0x3b,0x06,0x8d,0xa5,0x2e,0xc4,0xe8,0xda,0xde,0xc8,0x50,0x65,0xc3,0x56,0x59,0xf4,0x37,0xe0,},{0x05,0x0a,0xe8,0xae,0xce,0xec,0x96,0x27,0xb8,0x01,0x37,0x35,0x7a,0x22,0x96,0x2a,0xc8,0xb4,0x50,0x48,0x66,0x17,0x08,0xd3,0x94,0xd0,0xa5,0x1a,0xad,0xc3,0x81,0xfe,0x85,0x35,0x02,0x3d,0x6e,0x1b,0xda,0x0e,0x72,0xb3,0x49,0xb5,0x0b,0x26,0xda,0x7c,0x3a,0x30,0x85,0xe8,0x1e,0x9d,0xd6,0xcf,0x12,0x78,0x68,0xfc,0x5b,0xae,0xab,0x01,},"\xf9\xd2\x85\x97\xa3\xe2\xb6\x4b\xa3\x27\xac\x5c\xd2\x9f\x08\x1e\x74\xbf\x46\x1b\x2e\xb2\xd3\xcf\xd9\xd5\xe9\x21\x58\xd2\x1d\x1d\x2a\x47\xab\x50\x98\x1c\xb1\x9f\xe3\xf8\xc6\xfe\x48\x82\x49\xb1\xc4\x9f\xb8\x97\xa0\xfe\x21\xab\x54\x04\x41\x4f\xd9\x14\x87\x5c\x22\x0f\x1c\xbc\x12\xf5\xc3\x8c\xfb\xa7\x9f\x7a\xc3\x03\xa5\x23\x1a\x37\x2b\x02\xfa\xd6\xc8\x46\x2f\x8c\xc4\x9f\x0f\x64\x96\x5b\x65\x1d\xcc\xef\x0b\xb9\x60\x82\x15\x09\x08\x49\x17\x7b\xe4\x7b\x2d\x30\x72\x94\x4d\x36\xe8\x56\xda\x18\x5c\x7b\x3a\x68\x9f\x7e\xde\xf9\x88\x33\x8e\x09\x63\xed\x31\xa6\xb0\xa8\x0d\x5c\xb0\xb1\xcc\xcf\x6f\x39\x48\x37\xaa\x6f\x8b\x2f\x3d\xa5\xef\xbd\xf4\xd3\x60\xd4\xbf\x4d\xd7\x08\xce\x64\x45\x58\x7d\x94\x2b\x79\x76\x1c\xe9\x51\xb1\xbb\x4d\x90\x50\x70\x36\x18\xa6\xd9\x30\xa8\x0c\x69\x57\x6f\xc4\xaf\x30\x6a\x2a\x56\xdb\xd8\x84\xa0\x5a\x1e\x4e\x9f\x31\x36\xcd\x0b\x55\xae\x47\x4b\xb5\xd3\xd0\xfb\xc9\xb0\x33\x9c\xec\x34\x4f\xdd\x08\x5c\x19\x28\x10\x14\x81\xc6\x87\x94\xf5\xc8\x90\x13\x71\x08\xce\xa7\x91\xd2\x1f\x81\x68\x3d\x3e\x1a\x9e\xec\x66\xac\xe5\xc0\x14\xd8\x9e\x69\x80\x8e\x5f\xa8\x3d\x38\x12\xee\x68\x0f\x5a\x99\x71\x68\x1b\x8a\xdc\xd4\xa1\x6e\x9a\x4c\x16\x5b\x5e\xf9\x93\x2c\x5e\xd8\x25\x23\x7f\xd5\x03\x7b\xcb\xef\xe4\xcb\x11\x56\x4f\xa7\x07\xc8\xa9\x32\x90\x75\x14\x14\x89\x1b\x1e\xdd\x33\x13\xc6\x5f\x8b\x91\xc2\xe9\x25\xa3\xc1\x2a\x9d\x3a\xa4\x5f\xd5\xa6\x67\xb7\x83\x93\xc3\xe3\x9d\xf8\x8a\x8f\x0d\x11\x48\xb5\x31\x1e\x3d\x87\xc4\xa9\x2e\x0a\x3f\xb9\x15\xbc\x90\xd5\x55\x8d\x05\xb4\x75\xa8\x83\x47\x78\xaa\x94\x3e\xa3\x9b\x8e\xaa\x95\xad\x18\x32\xe5\x91\x6e\xa3\x10\x2d\x7d\xe0\xb8\x36\xcd\xe8\xf3\x75\x9d\xbb\x3b\x9d\x56\xea\x81\x7b\x3e\x49\xc9\x83\x21\x02\x77\xc2\xc7\xc5\xb0\xdb\x18\x74\x22\x53\x2f\xca\x98\xa2\x8b\x3b\x65\x9c\x6b\x81\x5a\xc1\x26\xfa\xdb\xe2\xf4\x00\xc7\x3e\x9d\x2d\xed\xcb\xbd\x2d\x3a\x36\x5f\xfa\xd7\xe6\x66\xc8\x96\xe3\x1e\x61\xb3\x84\xed\x3a\x9f\xcf\x12\x90\x53\x8d\xf1\x1b\x94\x74\xc6\x28\x1c\xc5\x92\xc7\x1c\x88\x08\x86\x8b\x42\x92\xc1\x7e\xce\x6b\x3e\xdf\x5e\x35\x42\xa7\x0b\x91\x15\x93\xe9\x3f\x35\xec\xd9\x72\x9b\xd8\x88\x0a\x24\xea\xf4\x1f\xbc\x65\x74\xdf\xe1\x67\xec\x2d\x0e\x7a\xb3\xdf\x5e\xc3\x4b\x8b\x55\xd5\x48\xab\x93\x73\x8a\x2e\xea\xf2\x1c\x88\x4c\x5c\x85\x51\xdb\x2e\xdf\x2b\x04\x9f\x1a\x2a\x84\xfa\x72\xac\x89\x78\xa4\xc2\x78\x09\xf2\x09\xc1\xb2\x19\x5a\xff\x50\x4f\x69\x98\x56\xcc\x4f\x22\xd4\x4e\xbd\xd0\xfe\x50\x37\x44\x68\xd0\xb1\x79\x2e\x57\x4b\x51\x10\xa1\xf4\xcd\x0e\x22\x1e\x82\x4a\x78\xdd\xc4\x84\x5f\xeb\x46\xd6\x6d\x63\x3d\x23\xcd\x23\xf4\xb6\xfb\xe4\xc8\xce\x16\xcd\x1a\xf6\x15\x36\xda\x5f\xa6\x7b\x10\xac\x75\x55\xa6\x8c\x0e\x0b\xdb\xf2\xf8\xd7\x23\x09\xd9\x95\x51\x6b\x81\x18\xbf\x43\x83\x5d\x0a\x01\xc0\x8f\xfe\xba\x3e\xa3\xed\x05\xcd\x2d\x54\xf0\xea\xbc\xda\x05\xd0\x03\x7d\x52\xca\xed\x3b\x19\x37\x4f\xaf\x73\x99\x90\x94\xf7\x90\x55\x92\x4b\xea\x9a\xec\x44\x70\x13\x5f\x5e\x8b\xf1\x83\xc9\xd1\xc9"}, +{{0xe9,0x5c,0xc2,0xa4,0xd1,0x19,0x3b,0x75,0x39,0xfc,0xbb,0xea,0xae,0xed,0x98,0x5b,0x6f,0xb9,0x02,0xdd,0x0e,0xfb,0xd6,0x38,0x74,0x57,0x55,0x0d,0x0d,0x6a,0x2f,0xea,},{0x72,0xa1,0xff,0x1e,0x9b,0xb1,0x1c,0x8d,0x88,0x96,0x8a,0x7b,0x16,0x96,0x37,0xad,0xee,0x43,0x8e,0x22,0x63,0xf0,0x06,0xdc,0xa4,0xfe,0x02,0xfe,0x06,0x6c,0xba,0xd3,},{0x1b,0x8d,0x7c,0xc2,0xad,0xf3,0x6c,0xae,0x16,0x31,0x25,0x0c,0x82,0x43,0x1b,0xd8,0x84,0x37,0x16,0x3a,0x63,0x49,0xad,0x96,0xe7,0xa8,0x64,0x44,0x7e,0x9f,0xee,0x75,0x3a,0xc3,0x65,0x5c,0x98,0x35,0xb4,0xd1,0xec,0xbb,0x30,0x6c,0x63,0x8b,0xa5,0x40,0x2a,0xd0,0x2b,0xa6,0xd2,0x25,0xd9,0x68,0x82,0x88,0x9f,0xe8,0xd2,0x04,0xa6,0x04,},"\x84\x26\x74\x39\x20\x1b\x05\x91\xdb\x60\xc0\xf1\x7a\x9c\x15\xe4\x54\x09\x29\x56\x52\xd5\xf5\x5b\x87\xfb\x35\x19\x67\xc8\x46\xa5\x67\xf5\xce\xba\xae\xd1\x76\x2b\xff\x54\x85\xf0\x48\x53\xca\x92\x69\xf4\x64\x09\x4e\x51\x2d\xf1\xf0\x2e\x13\xe5\x17\xb1\xda\xa5\x8d\x34\xca\xa2\xd5\xff\x9f\x9e\x79\xbc\xaf\xb4\xce\x96\xe8\xa0\x89\x25\x8a\xd6\x13\x43\xb4\x46\x62\x8e\xbc\x4f\x5b\x2a\x84\xd0\x3b\x72\xef\x3f\x73\x85\x89\xfa\x13\xc4\x25\x19\xa8\x28\x29\x9a\x3f\xae\xc0\x35\x03\x7b\xc1\x0b\x44\xe3\xbd\xfe\xd9\xe0\x87\x07\x17\xcb\xaf\x31\xbe\xf8\xb2\x2c\x4e\xa1\x6e\x81\x57\xfc\xbc\x63\xee\xfa\x39\xed\x82\x2e\xfd\x42\x15\xc2\x47\xdd\xa4\x87\x86\x27\x7e\xc0\x30\xa8\x6c\x0e\xf4\x85\x1d\x67\x3c\xfe\x75\x2d\x06\x77\x88\x3c\x2c\x45\x20\x38\x97\x0c\x09\xbd\x48\x17\x14\xbc\x3f\xbe\xcf\xa4\xff\x2a\x3c\x24\x56\x95\xd7\xec\xc2\xf4\xde\xc7\xf5\xed\xe0\x4f\xf6\xdb\x43\xe2\xbb\x91\xc0\x66\xb6\x49\xef\x73\xfd\x3b\xe8\x60\xcb\x83\xfa\x80\xb0\x74\x14\x9f\x43\x1e\xeb\xb9\x17\xec\x84\x78\xda\x87\x0c\x11\xe3\x17\x70\x38\x59\xf9\xf2\xf4\x00\x8a\x6c\x7c\x75\x4b\x06\xe1\xf7\xd2\x47\x96\x89\xda\x84\xe8\x89\x22\xf3\x82\x74\x98\x5e\x11\xce\x13\xcd\xbd\xb0\xf2\xec\xe6\x8f\xb6\x02\xad\xe0\x3d\xd5\x49\xa3\x62\x49\x1f\x4a\x20\x3f\xf8\x07\x44\xf6\x63\xc5\x23\xa0\x26\xb4\x31\xaa\xd4\x5c\x58\x29\xe0\x29\xad\x62\x56\xd1\x27\x6f\xd7\xb7\xa1\x2d\xdb\xf1\x72\x7d\x9e\x23\x3f\xb5\x34\x45\x73\x70\xa4\x26\xe5\x6f\xb3\x9c\xf4\x04\xa3\xec\xbf\x0c\x4b\x50\xbb\x52\x2d\xce\x98\x1e\x08\x30\xfd\x84\x06\xe6\xd9\x72\x5c\xeb\x1d\xdd\x3a\x19\x47\x93\x7d\x90\xe0\x4d\x76\x8a\xe1\xd1\x26\xe2\xae\xac\x21\xb8\xc9\xef\xc5\x4c\x40\x96\x1b\x7f\x4e\x9e\x88\x02\x5f\x7e\x0b\x9d\xe9\x01\xeb\xf0\x04\x9e\x74\x1b\x79\x79\x97\xd8\xdb\x78\xe9\x28\x3b\xbb\x5f\x90\xf3\x5a\x2c\x4d\xee\x27\x31\x42\xec\x25\x8c\x02\xad\x0e\xcc\x61\xcc\x5c\x9f\x12\x13\x2d\xb2\x8a\xf4\x1c\x1f\xb7\x8e\x52\x4b\xe5\x32\x7b\x5f\xfc\x35\x96\x27\x79\xfb\x11\xff\x0c\x5d\x3e\xe0\xa3\x1f\xf4\x7e\x73\xb1\x72\x9d\xfa\x46\xe8\x98\x6b\x1b\x89\xab\xc8\x8a\xd0\x6a\xbd\x5b\x6f\x76\x6d\x23\xab\xf6\x42\x25\x78\x94\xeb\xdf\xa7\x9e\x63\x09\xf1\x27\x23\x74\xee\x94\x33\x67\x7b\xa1\x3e\x45\x1b\xaa\x95\x33\x0e\x66\x0c\x80\x52\xae\x87\x2e\x0e\x32\xe2\xb2\xd1\x28\x6d\x01\xa0\xab\x58\x10\x42\x4e\xd8\xb9\x40\x54\x65\xbd\xeb\xa0\x3b\x69\x83\x84\x67\x6f\xe5\xea\x46\x4a\x03\x44\x6c\x4f\x7c\xd7\xb4\x33\x12\xec\xf1\x51\x36\x04\x64\x57\x1a\xd2\x86\x10\x58\x1f\xba\xdb\x94\x5a\x1d\x68\x18\x1d\xeb\x40\x3a\xa5\x6e\xba\x0b\xb8\x40\x32\x8e\xee\x36\x10\x3c\x7d\xe0\x73\xa6\x87\x9c\x94\x1c\x75\x54\xc6\xf6\xf2\xa0\x80\x80\x9e\xb0\xe5\xbd\x0e\x13\x0f\x29\xa2\x29\xe9\x30\xdb\x01\xfe\xca\xc2\xe0\x36\xbd\xf0\xe0\x01\xe2\xa8\xea\x32\x64\xf8\x64\x9d\x5b\x60\xc2\x91\x03\xf0\xb4\x9c\x24\xc9\x7f\xac\xaf\x7e\x81\x06\x9a\x2b\x26\xab\x3f\x93\x3f\x42\x7d\x81\x27\x2c\x6c\x8b\x7c\xd0\xdf\xb7\xc6\xbb\xe9\xc0\xea\xab\x32\xbb\xda\x22\x18\xb9\x62\x3a\x21\x19\xaa\xb1\xf3\xeb"}, +{{0x77,0xad,0x0f,0x94,0x2c,0x37,0xf0,0x31,0x3e,0x6b,0x04,0x56,0xda,0xba,0xec,0x81,0xb2,0xd6,0x1f,0x6c,0x11,0x8d,0xdb,0x29,0xea,0xf3,0xac,0x5b,0xf1,0x95,0x04,0xd4,},{0x69,0x2d,0x2d,0xa5,0xa9,0x5f,0x48,0x61,0x1a,0x6d,0xa8,0x9c,0xfb,0x3b,0x35,0x40,0xf6,0xaa,0x0c,0x85,0x0d,0x6d,0x98,0xde,0xea,0x87,0x0e,0x39,0x7f,0xed,0xe3,0x28,},{0x69,0x6b,0xd5,0x52,0xdd,0x01,0xdb,0x80,0xb3,0xd6,0x7d,0x61,0xee,0xb7,0xec,0xc5,0x68,0x78,0x40,0x4a,0xb1,0x19,0x44,0x2a,0x1c,0x74,0x22,0x99,0x2c,0xfa,0x35,0xae,0xa9,0x20,0x82,0x5d,0x2d,0xaf,0xd8,0x92,0xad,0x7e,0xb6,0x82,0x5a,0xd9,0x99,0xae,0xe5,0xc8,0x3b,0x7b,0x50,0x79,0x06,0x53,0x4f,0x91,0xac,0xe7,0x59,0xc5,0x51,0x0c,},"\x87\xe6\xde\xad\x2c\x85\x54\x9e\x3d\x8d\x25\x88\xa0\xa3\x36\x06\x03\xa6\x24\xfb\x65\xae\xbb\xc1\x01\xbf\x7f\x1f\xec\x18\xd0\xb2\x8f\xbd\x5d\xba\xee\xd3\x87\x52\xcd\xf6\x35\x5c\xe8\xdc\x84\xe1\x8a\xc1\xa4\x39\x3d\x2a\xb8\x88\x88\x2c\x4f\xf1\xc9\xc8\x13\x7f\x83\xbe\xe3\x63\x36\xbc\xbf\xbb\x72\xd5\x04\x9e\x0a\x40\x08\x74\x51\x4f\xdc\x36\x33\x04\x6e\x89\x38\x3d\xde\xd9\x3c\xa3\x1f\xde\x0d\x89\x8e\x11\xe9\x26\x8d\x3d\x5c\x24\x06\x66\xed\x55\x27\x61\x3d\xa7\x9f\xb7\xe4\x96\x25\xb4\x4c\xde\x78\xb4\x1c\x67\x90\x2e\xb0\x21\x6b\x3a\x7a\x3e\x56\x0e\x26\x1d\x71\xd7\x64\xaa\xcf\x15\x95\x9c\x17\xfc\xd6\x17\x6f\xb2\x5e\x24\x9e\xe6\xbb\x1b\x3b\xd7\xbd\x90\xf6\x0b\x0b\x0f\xfa\x03\x15\xa0\x65\xa2\x4b\xba\xe8\xf2\x55\xbf\x29\x8d\x7e\x4d\x44\xf0\xb4\x30\xc4\x15\xb4\xfb\x36\xcf\xa6\x62\x6a\x83\xf4\x9a\x25\x67\xf6\x24\x4f\x40\xe9\x23\xad\xd1\xd4\x9a\x72\xf5\x7b\x15\x30\xf5\xb3\x79\xde\x3a\x91\xc2\xe9\xa1\xac\x79\xab\x37\xbc\x3b\x9b\xa7\x3d\x88\x28\x13\x6b\xcc\x87\xd2\xc0\x11\x90\xde\x54\x57\xfa\xcd\x90\xf3\x69\x55\x3f\x7a\xc5\x21\xc5\x67\x2b\x08\x67\xdf\xa8\xda\x3b\x95\x2a\xd9\x5b\x67\xda\xb9\x9b\x48\x20\x57\x2f\x2d\x4a\x29\x8e\x95\x18\x63\x77\x79\x28\x9c\x03\x1b\x79\x3d\xee\x85\x9c\xde\x7b\x24\xad\xd6\x49\xff\xf8\x71\x24\x8a\x66\x02\xd2\x51\x62\x79\xda\x60\x58\xcb\xb6\x96\xfa\x8b\x1d\x89\xa2\x0d\x20\x99\xe6\x46\x44\x32\x10\x48\x3e\x5d\x41\x34\xe9\x28\xfa\xeb\x38\xa3\xb5\x08\x19\x9e\x0d\x69\xbb\x55\xee\x34\x77\x42\x05\xc0\xa6\x12\x05\xb5\x0b\x08\xfe\xbe\xaa\x40\x1e\x6e\x3a\x51\xa2\xbf\x98\xef\xac\x78\xb7\xae\x2b\x85\x2c\x53\x95\xa1\x2c\x40\xe2\xc7\xdd\x1b\x20\x25\x04\xb5\xa7\xd2\xf7\xe4\xfd\x4f\x86\x10\x93\x0d\x28\x68\xcb\xa8\x86\x43\x39\xe0\x41\xda\x21\xc0\x71\x5f\x41\xb2\xb2\x3d\x14\xd0\xb5\x45\x48\x0b\xc3\xbd\x7d\x72\x15\xcf\x2f\x81\x6a\x33\x32\x08\x1e\xca\xa0\x8c\x0f\x8b\x99\x52\x52\x51\xf5\x72\x31\xb6\x75\x0c\x2d\xbd\x11\x09\xac\x41\x60\x48\x6b\x76\x83\x24\xb6\xba\xc8\x7e\xf5\xa2\x26\x44\x8c\x43\x12\x40\x32\x8f\x42\xcc\xa5\x86\xbe\x7a\xff\x3c\xbe\x76\x05\xfa\x34\x15\x14\xfc\xcf\xb9\x66\xaf\x3d\x45\x30\xe8\xcd\x90\x37\xa1\x1c\xe5\x93\xc2\xd3\x83\xe1\x03\x5a\x0c\x2e\xda\x09\x8d\xe9\x0d\x50\xc5\x18\x4a\x9c\x01\xb5\x7f\x26\xb9\x4d\xed\xd1\x45\x4c\x34\x06\x37\xec\xcc\xee\x70\x62\x57\x54\xa3\x28\xc6\x5f\x42\x64\x5b\x5e\x1a\x56\x55\xee\xf9\x7d\xfb\x1c\x63\x08\xed\xf4\x9f\xa3\x68\xd1\x7d\x17\xe0\x6a\xdc\x51\x2b\x39\x73\xea\x65\x2a\xc4\x0a\x99\x78\xe1\xbb\x1b\x2f\x86\xc5\xa9\xff\xbf\x60\xdc\xc4\xf6\xbb\xc9\x8a\x64\xf4\xde\x65\xe7\xec\x61\x72\x1e\xde\xb0\xe5\x23\x84\x56\xf7\x61\xd2\xd1\x29\x3a\xf0\xde\x9f\x79\x3b\x11\xd8\xca\xdf\x01\xa9\x43\x19\xa0\x2a\x42\x73\xff\xc4\xd3\xff\xa7\xb3\x4d\x74\xfd\x2e\x0b\x10\x0f\xca\x58\xb5\x32\x5f\x90\x7a\x74\x91\x93\xe7\x51\xd6\xc1\x16\x68\x7a\xee\x37\x47\xb5\x94\x60\xd4\xef\x15\x6e\x72\x47\x6e\xae\x1b\x84\x55\xd7\x6e\x71\xb3\x06\xb9\x81\x29\xb7\x2f\xe1\xcb\x5e\xb4\x05\xa7\xc2\xf4\x32\x7f\x38\x62\xd4"}, +{{0x29,0x32,0x14,0x69,0xee,0x9f,0x2b,0xb1,0x65,0xa0,0x69,0x64,0x03,0x32,0xb4,0x89,0xbf,0x5c,0x3f,0xab,0x68,0x2e,0x93,0xda,0xe9,0xd8,0x63,0x17,0xbf,0x50,0xc5,0x2c,},{0x96,0xf7,0x30,0xf8,0xef,0x89,0x70,0x26,0x8d,0xba,0x0f,0x75,0x70,0x41,0x0b,0x61,0x88,0xa1,0xa3,0xc8,0x63,0x97,0x74,0x09,0x13,0xd5,0x3a,0xda,0x26,0x2a,0xb8,0x7e,},{0x4e,0x1a,0xff,0x84,0x63,0xbc,0xa1,0xb7,0xde,0xb1,0xd3,0x77,0x3d,0xf2,0xe7,0xa0,0x68,0x64,0x11,0x1b,0x6d,0xc4,0x2a,0x62,0xae,0x98,0xde,0xb2,0x31,0x39,0x43,0xb3,0x15,0x3e,0xe4,0x66,0x96,0xb1,0x5c,0x24,0xef,0xc2,0xa8,0x08,0xaa,0xba,0x81,0xc7,0x8e,0x3d,0xfa,0x4d,0xfb,0x50,0xca,0x9f,0xe8,0x44,0x45,0xea,0x68,0xbc,0x8e,0x0a,},"\x9c\x71\x2c\x83\xd5\x4f\x2e\x99\x3c\xa6\x8a\x96\x32\x84\x60\x04\x49\x9c\x51\x95\x44\x8d\xdc\x49\x1c\x3a\x0d\x2e\x3a\x66\x6d\x6b\x33\x09\x8e\x48\x64\xfd\xf8\x6e\x61\x9d\x50\xf1\x0b\x7c\xc6\xc3\x9b\x3f\xf2\x80\x1a\x94\x91\xf6\xfa\x97\xc5\xf1\xc4\xaf\xa7\xae\xff\x31\xd7\x38\xf9\xa7\x68\xa7\x9c\x73\xb2\x55\x77\x31\x0f\xb0\xad\x4f\xaf\x85\x43\xa0\x98\xf8\x59\x57\x1b\x61\x48\xe8\xb5\x29\x26\x44\x57\x57\xd5\x54\x9f\xd2\x5a\x26\x51\x85\x31\x56\x63\x79\xd1\xc2\x74\xe6\xc6\xa9\xd6\x41\x32\xe4\xac\x25\xac\x9a\xf9\x38\x1b\xcb\x88\x53\x32\x11\x3f\x43\x01\x4a\x13\x9a\x81\xf8\xd4\x3c\x8a\x6a\xb5\x4c\x11\xa5\xc9\x2e\x06\x19\x1c\x1e\x51\xb7\x57\xac\x9f\x11\xe3\xdc\x15\xdb\x44\x86\xd1\x67\xff\x9f\x2d\x65\xe2\x3e\x6c\x96\x22\x3d\x9a\xff\x8d\x10\xd1\x50\x2c\xf3\xdb\xce\x5e\x35\x7e\x6b\x12\xdb\xe9\xb7\xe9\x97\xc3\xd0\xa5\x07\xd3\xba\xe3\xcf\xef\x1f\xfc\x8d\x05\x6e\xf7\xdc\x72\xdd\xc1\xc8\x1e\x31\x0a\xd2\x05\xbe\x16\xe7\x7f\x27\x38\x35\x4b\x10\xb4\x84\xd3\x07\x6c\x27\xe6\xb4\xf1\x66\x38\x85\x81\xf3\x50\xbe\xfe\x22\xfb\xb0\x82\xb5\x41\x21\xee\x59\xec\xc7\xae\x5d\xec\xe8\x98\x82\xac\xf2\x6c\xb7\x47\xff\xaa\x3e\x2d\x05\xa6\x96\xf6\x0f\xd9\xe8\x29\xc7\x09\xd8\xf0\x2d\xaf\x53\x7b\x23\x69\xb8\x91\xfe\x6c\xcb\xf8\xdf\xcd\xd7\xf4\xa3\x64\xb1\x99\x85\xbe\x7e\xde\xc6\x7d\xdc\x1d\xb7\x13\xc0\xa9\x0f\xaf\xa4\x88\x37\x77\x25\x62\xde\xac\xc2\xd2\xa0\xe7\x89\xe1\x8a\x8b\x5b\x3b\xd9\xe0\x83\xea\x92\xff\xfc\x31\x83\xd5\xd4\x14\x15\x32\x59\xb3\x3a\x43\x29\xcf\xc8\x08\x24\xeb\xcb\xe0\x44\xa7\xe3\x3a\xb8\xa2\x4f\xde\x54\xbd\x95\x20\xae\xa2\x84\xb0\xc4\xc4\xfa\x94\x27\xd2\x51\xc0\xdd\xd0\x13\xec\xdd\x82\x90\xef\x55\x65\xf6\x08\x50\x8e\x36\x35\x89\xe5\x29\xd8\x4f\xf0\xf2\x6f\x9e\xcb\x03\x05\x2d\x58\x97\xfa\xbc\x91\x7e\x56\xe6\x01\xb6\x4a\xbf\xe5\xa1\x7c\x39\x50\x28\x9d\x0c\xdc\xaf\x1f\x60\x05\xa9\xf8\x10\x6f\x43\xe1\x7a\xdc\xaa\x2d\x1e\x26\x91\x66\x76\x2f\x80\x54\xde\x05\x13\x5d\x5d\x13\x93\xd7\x00\x0a\x15\xb8\x7b\xd6\x88\x46\xa8\x9d\x5b\xc2\x28\x63\x32\x51\x51\xaa\xc8\x43\xf7\x22\x78\xae\x6f\x4a\xf7\x2a\x4e\x44\x9a\xdb\x7e\xae\x6d\x43\x6a\x1e\xc7\xe5\x8e\x59\xb7\xb8\xbb\x9e\xf0\xdd\xaa\xa0\x01\x82\x6f\x8d\xcb\x44\x64\x79\xde\xaf\xd8\xb8\xd5\x42\x04\x1c\x19\xa0\x5b\x1e\x0e\xe4\x7b\x46\x40\x91\x0c\x31\x93\x0c\xa4\xe2\x0b\x10\x57\x58\xec\x75\xf1\x95\x03\x56\x94\x7f\x62\x61\xd0\x03\x7f\xe3\x07\x73\xa3\xec\xe6\xa9\x6c\x8d\x54\x33\x33\x3d\x82\x2c\x27\x77\xef\x7f\xf8\xbe\x60\x33\x34\x5b\x50\x55\xd5\x8f\x5e\xb3\x72\x9a\xf5\xae\x88\x24\xf3\x31\xee\x07\x31\xc8\x9b\x20\xac\x11\x8f\x55\x04\x27\xcd\x95\x8a\x55\xf6\xb1\xa2\x88\x8a\x08\x7b\xb7\xdb\x55\xbf\xc7\x3b\x29\x42\x9b\x44\x48\xdb\xe9\x11\x9c\x45\xa8\x73\x39\xb4\x49\x7a\x69\xa4\xcf\x83\x3e\x8f\x37\x70\xcc\xe5\xe0\x1f\xaf\x5e\x73\xbb\xaf\x62\x76\x83\xc0\xa2\x8c\x73\x05\x2f\xbe\xce\x20\x30\x43\x38\x9d\xfb\xfd\x45\x49\x5e\x51\xda\xb8\x6a\x25\x2e\x5b\xc1\xb4\xb7\xfe\x28\x07\xe3\xd0\xe2\x36\x3b\xea\xb5\x1c\x67\xfb\x31"}, +{{0x04,0x65,0x77,0x50,0x49,0x7e,0x68,0x15,0x2c,0x43,0xce,0x34,0xa5,0x8d,0x21,0x06,0xe6,0x4c,0x55,0x7c,0xd7,0xa8,0x4e,0xf0,0x5d,0x9e,0xb8,0x2e,0x6b,0xcb,0x05,0xf5,},{0x3b,0x3a,0x19,0x47,0xb4,0xcb,0xf6,0x0b,0x82,0x6d,0x60,0x9f,0x19,0x2d,0xc2,0x30,0xaa,0x9b,0x9b,0xaf,0x4c,0xd6,0xa6,0x09,0x2e,0x49,0x5f,0x1d,0x2e,0x47,0xad,0x62,},{0x7e,0x2e,0xae,0x5a,0x29,0x3f,0x41,0x83,0x91,0xf6,0xd8,0x5a,0x79,0x94,0xb0,0x7c,0x45,0x22,0x80,0x01,0x7e,0xe6,0x53,0xbf,0x61,0x7a,0x8d,0x5b,0xe2,0x4c,0xbb,0x5d,0x0e,0xfd,0xfb,0x7f,0x7f,0x00,0x13,0x12,0x26,0x0f,0x34,0x4e,0x6f,0xb9,0x15,0xad,0x8d,0x7d,0xe9,0xc0,0x51,0x98,0x27,0xc0,0x57,0x26,0xf9,0xce,0x25,0x45,0xdd,0x0b,},"\x29\x48\x22\x7a\x89\x0f\x6f\x84\x5b\x77\x5e\x62\xc5\x3a\xf3\x80\x50\x64\xa1\x57\x64\x46\xf0\x85\xd9\x0f\x8b\x9a\x5e\xd6\x8d\xf1\xea\x39\x3c\xe4\x79\xc4\x41\x41\x49\xa9\xec\x5a\x17\x10\x36\x42\x4d\xff\x03\x44\xb4\x95\x8f\x61\x32\x29\x8d\x0e\x24\xc9\x26\xd2\x8a\xd9\xd7\x9f\x98\xc6\xe6\xbc\xf1\xc5\x76\x76\x06\xec\xd2\x91\xc6\xad\x47\xb4\xf9\xfb\x2b\x02\x01\x15\x5a\xda\x62\x7b\x7a\x1f\xd5\xb0\x74\x19\x87\x40\x83\x05\x9e\xb5\x2b\x2f\x6e\xc2\x28\x18\xb7\x82\x46\x22\x8f\x3f\xe6\x35\x5d\xfd\xa7\x0e\xbb\x9b\xbe\x73\x22\x93\x78\x73\x63\x99\x55\x7c\xe2\x4b\x30\xbf\x64\x5a\x14\xe2\x25\x6f\x70\x01\x9b\x33\x36\xb2\x03\xfb\x77\xc6\xec\x94\xa7\xa2\x63\x48\x88\xfe\xea\xd4\xd7\x2c\x23\x91\xe9\x9e\x8c\x8d\x53\x3f\xd8\xa4\x2b\x08\xc1\x1f\x88\x7a\xb2\xde\xb6\xeb\xbf\xe3\xd2\x51\xde\x63\x53\x6c\x36\xcd\x53\x42\x23\x98\xe5\x44\xcf\xf8\x7b\x07\xa6\x33\x49\xfc\x50\x85\xdd\xe9\x3a\x1b\xfd\x71\x71\x13\x3a\x20\x43\x98\x1f\x60\x75\x22\xc8\x13\x3c\x63\x42\x8d\x1b\x92\x62\x6c\x79\xb7\x35\x8e\x70\x21\xcf\x1f\x41\x2a\x78\xaf\xa7\xcb\x3f\x59\xff\xef\x92\x79\x88\x5a\x5b\xdb\x24\x66\xac\xd3\x4c\xd5\x15\x80\x83\x0b\x83\x51\xeb\xd4\x40\xa9\x66\x23\x90\x7a\xd1\xf4\xb5\x62\x03\xf5\xe1\x59\xa4\x29\xe3\x54\x6e\xad\x0c\x01\x1d\xbe\xd0\x90\x28\x71\x7e\x3c\x3d\xfe\xd3\x91\x97\x76\x4d\x4d\x24\x5e\xf2\x28\xb9\x80\x44\x71\x8e\xf4\xd8\x82\x2f\x21\xb2\xc5\x68\x50\x38\x47\x3b\xf9\x3d\xc0\x93\x74\x51\xeb\x02\xd3\x1a\x46\xc8\xdc\x7e\x94\xc3\xe8\x67\x8c\x83\xb9\x8a\x43\x81\x8f\x12\x5b\x52\x8b\x47\x6a\xad\x31\xd1\x58\x4f\xfd\x48\xf1\x49\xe5\x73\x6e\x58\xf9\x42\x05\xd3\x88\x9e\x56\x7e\x4d\xd1\xea\xc2\xfa\xc1\xf8\xf4\xdc\x54\x0e\x53\x22\x46\x0f\xb9\x40\xe1\x2e\x93\xc4\xc9\x8d\xed\x19\x41\xc1\x90\x4f\x96\x7f\xb4\x64\x36\x84\xc1\x9a\x4d\x5c\x44\x1d\x60\xb0\xe9\xf4\x08\x55\xe5\x23\xfe\x7f\x99\x10\x76\x57\xa6\x80\x76\x27\x5b\xf8\x4b\x7c\x69\xa3\xf2\xb3\x85\x5b\xc8\x02\x6b\xa9\xb0\x0b\xc6\xfe\x34\xb9\x9d\xa0\x63\x17\x00\xa6\x7f\x52\xb3\x4e\x17\x96\x33\x98\x87\xa4\x83\x05\x12\x1d\x53\xab\x44\x40\xfc\x4b\x5c\x9b\xf7\x23\x94\xd5\xed\x37\x2f\xf1\x8c\xa3\xf0\x07\xbd\x02\xdf\x65\x1d\xc3\xac\x43\x82\x75\xf1\xa3\xe5\x24\x22\xb8\x6c\x45\x86\x76\x6a\x21\xcd\x89\xf8\x05\x80\x5d\xbb\x44\xfd\x89\xfe\x24\xfb\x2c\x0b\x40\xd1\xb7\x54\xc3\x35\xdb\xaf\xfc\x3b\x3b\xb8\xbb\x46\xc7\x4c\x36\x37\x45\x04\x04\x2d\x86\x78\x92\x27\x59\x98\x62\x31\x2e\x99\xca\x89\xeb\x50\x4c\xc3\xd7\x5d\x19\x49\x5a\xa8\x6b\x20\xb2\x73\x6b\x12\x1b\xb2\x07\x5c\x88\xed\x4a\x3f\xbd\xaa\x6b\x2c\x3f\x76\xd1\xff\x55\x25\xd3\xa2\x86\x3e\x4d\x83\xc7\x2b\xfe\x01\xe1\x02\x78\x80\x94\x74\xe1\x82\x2d\xe2\xd9\x62\x83\x48\x93\x20\x02\x96\x11\xaa\x9d\xff\xc4\x82\x9d\x66\x86\x9e\x63\x49\x4f\x9a\xad\xe7\x0b\x77\xa7\xb8\x0f\xbc\x93\xe3\xde\x4d\x93\x59\x13\x75\x2d\x04\x5e\x13\xb3\x12\xc5\xd0\x82\xf6\x24\x2d\x49\x85\xb0\x53\xb3\x78\x3e\xb0\x2c\x66\x14\x96\x3d\xc0\xd5\x5d\x4c\xbe\x88\x7b\xae\x29\xcc\x18\x97\x9e\x5e\x2e\xa9\x45\xbc\xd4\x0d\x89"}, +{{0x8b,0xd9,0x90,0x70,0xc5,0x0a,0x9f,0xa4,0x18,0xef,0x7f,0x75,0xc0,0x01,0x29,0x91,0x6a,0x41,0xc8,0x60,0x70,0x96,0x1c,0xcb,0x2b,0x20,0x2b,0xe1,0x8c,0x2d,0x10,0xd7,},{0xdd,0xd7,0x33,0x08,0xfc,0xe8,0xca,0x65,0x52,0xd0,0x39,0x42,0x8c,0x7a,0x1a,0x94,0x92,0x33,0x20,0xa3,0x1c,0x0f,0x58,0x0d,0x3c,0x23,0x52,0x80,0xf0,0x3c,0x18,0x30,},{0xb1,0x4a,0x7b,0x26,0x20,0x12,0xc5,0x90,0x9e,0x21,0xd5,0x87,0xfb,0x4f,0x29,0xa9,0x09,0x3c,0x8e,0x1c,0x29,0x99,0x81,0x6a,0x82,0x11,0x8f,0xef,0xbf,0x10,0xe6,0x8e,0xa8,0x98,0xbf,0x0d,0xa1,0x8e,0xbf,0xd0,0x34,0x1e,0xa8,0xf8,0x2a,0x18,0x44,0xc8,0xe0,0xdd,0x53,0x06,0xe5,0x09,0xb9,0xd0,0xc3,0x5b,0x47,0x3a,0x7d,0x20,0x95,0x07,},"\x48\x5f\x8d\x68\x0f\x79\xee\x2d\x82\x8b\xe7\xd0\x18\xa6\x5e\x0b\x64\xb0\xf0\x18\x48\x19\x86\x3e\x71\x10\xee\xa8\xf2\x99\xa7\x2c\x4d\xc8\x7f\x8e\xe8\xa8\xae\xaa\x81\xaf\x91\xdc\x71\xad\xea\x79\xfc\x97\x97\x42\x1c\xcc\x64\x6e\x6c\xd5\xdd\x48\xb4\xde\xc1\xde\x96\x86\x93\xfb\xce\x0d\x00\x21\xa3\xd9\x8d\x38\xa8\xbb\xc5\x81\x95\xe6\xdf\xc3\xb5\xe1\x46\x1b\x2a\x59\x41\x03\xe8\x0a\x29\x44\x1d\x5a\xaa\xf8\x89\xe3\x1c\xc8\x65\x14\x1f\x0c\x6b\x2c\x8c\x81\xf7\x21\x67\x9e\xa2\x39\x4e\xc6\xe4\x08\x1e\xc2\x03\xc2\xea\x39\x7d\x94\x84\x75\x7a\x7a\x0e\xcd\x53\xe6\x52\xdb\x9d\xf1\x7b\xea\x0e\x32\xfe\x8b\x2c\xbc\xe0\xd1\xd9\x7b\x96\x1e\xd7\x4e\x8e\x62\x2b\xcd\xd3\x55\x8b\x7c\x48\x69\x5a\xdf\x18\xaa\xe6\x11\x0e\xa9\xa3\x39\xb9\xda\x40\x7a\x9e\xda\xf2\xab\x08\x1a\x68\x1e\x18\x32\xcc\x21\x5b\x1f\x08\xa6\x7d\x55\x9a\x47\x44\xaf\x7c\xd5\x03\x18\xc2\x06\xee\x91\x15\x75\x82\xf8\x2e\xb6\xc0\xfc\x29\x02\x7b\x44\x61\xc3\x07\x33\xb8\x16\x9d\x14\x81\x32\x2c\x48\x60\x50\x9b\xa0\x96\xba\xcb\x71\xa5\x79\x24\x67\x51\xd5\x67\x54\x0e\x41\x43\x1e\x14\xf1\xb4\x6e\xf1\x6e\xba\x27\x61\x04\xbc\x01\x65\x0d\x5c\x49\x26\xe4\x7c\x9c\x60\x40\x78\x4b\x04\x3c\xd0\xaa\x48\x54\xef\xe8\x79\x7f\xd0\x46\x2d\x45\x39\xf3\x80\x35\xae\xf0\x8b\x45\x77\xc1\xa9\x11\x8d\x00\x4b\x6d\x01\x86\x2f\x52\x76\x77\x6d\xfe\xf1\x37\x18\x64\xf1\x55\xac\x0f\x07\x83\x89\xc2\x05\xcf\x05\x38\xd8\x5f\xa3\x48\x24\x4d\x7a\x42\x29\x11\x31\x0f\xf6\xc1\x01\x32\xb1\x59\x8b\xb4\x45\xc7\xe2\x07\x7b\x76\x3c\x47\x3d\x1e\x7a\x61\xa3\x8b\x64\x92\x9a\x64\x8b\x60\xb2\xe5\x43\x54\x37\x39\x22\x4b\x40\xfb\xf6\xd8\x7f\x10\x79\xc3\x0b\xc8\x73\xac\x38\x99\x1d\x51\xb8\x9e\x9d\x26\x1c\x4b\xcc\xb3\x75\x35\x5c\x07\x2c\x1e\xa2\x0e\x4f\xf9\x1d\x55\xd9\xf7\x54\x4e\x90\xd1\xc6\x64\x6c\x59\xaf\x72\x42\x4d\x8a\xaa\x8e\x0a\xed\x07\xb3\x88\x9d\x4e\x45\x0c\x12\x09\x68\x4c\xe1\x38\xd0\xc9\xda\x07\x95\x25\xf5\xaa\x02\x05\x0a\xf5\x70\xe4\x31\x5c\x2f\xa8\xb0\x99\xb7\x76\x5b\xfb\xb8\x94\xfa\xd3\x59\xb8\xe2\x48\x04\xec\xe0\x52\xac\x22\xa1\x91\x70\x53\x35\xe9\x88\x40\xa6\x24\xe4\xcb\xf3\xa1\xa1\xa3\x27\x81\x27\x85\xb2\xc0\xf5\xd6\x38\x14\x57\xb7\x2f\xdb\x63\x3e\x81\x93\x8b\xbb\x54\xb8\xc3\x7c\xcc\xb5\xd5\x9c\x58\x27\xc7\x68\x3a\x52\x47\x54\x49\x77\xe9\x84\x44\x21\x78\xd0\x85\x29\x06\xca\x6f\x94\x5c\x42\x29\xeb\x08\xad\x27\xe6\xc2\x75\xd7\xb4\xec\x8d\xc2\x5f\xb2\x81\x93\x37\xe5\x3e\xad\x6c\x7a\xa7\x87\xf9\x1a\x7d\xc6\xdd\xaf\xd5\x36\xee\xfc\xbd\xec\x2c\x50\x16\x7b\xe3\x43\x06\xa8\x2e\x16\xd5\xd5\x2b\x3b\x1b\xe0\x08\xa7\xa6\x11\x27\x4c\xe2\xcf\x8d\x62\xe3\xb9\x00\xc0\x99\x43\xbe\x70\xcc\xc7\x7b\x07\x06\x37\xc2\x50\x61\xd6\x1b\xe9\x10\xee\xf5\x0d\xf1\x87\x44\xc3\x3e\x76\xf6\x70\x1e\x0a\x8f\xf6\x29\x7f\xa6\x7e\x4b\x41\x08\xc1\x37\x56\x72\x7a\x9d\x74\xbc\x9e\x17\x98\x3e\xec\x08\xf8\x66\xb7\xc7\xff\xb3\x7f\x3c\xcb\x01\x41\xa8\x0f\xef\xf6\x32\x2b\x2a\xc6\x2b\x84\xce\x27\x97\xfd\x98\xd6\xff\x26\x9a\x41\xa0\xc3\x84\x82\xdb\x67\x98\x62\xa3\x8c\xd2"}, +{{0x1a,0xf4,0xcf,0x6d,0x24,0xab,0x37,0x82,0x86,0x7d,0x96,0xa1,0xc2,0x75,0xce,0xeb,0x02,0x2c,0x69,0x1a,0x30,0x8e,0x62,0x45,0x66,0x5d,0x61,0x6b,0xf6,0x7c,0x2c,0x32,},{0x19,0xd3,0x17,0xea,0x98,0xd3,0x5b,0xa5,0xfa,0x67,0xc1,0x2e,0xcf,0xb3,0x27,0x50,0xdf,0x27,0x5d,0x7a,0x45,0xb8,0xe2,0x11,0xa7,0xac,0x47,0xed,0xe7,0x71,0x2d,0x9f,},{0x7e,0xb4,0x6c,0xd0,0xde,0x31,0x55,0xb4,0x37,0x47,0xd7,0x32,0xf1,0x04,0x5d,0x8e,0xf7,0x44,0x92,0xad,0x82,0x7a,0x22,0x45,0xbd,0x17,0x10,0x28,0x28,0x44,0x2e,0x43,0xa0,0xce,0x7e,0x8b,0x26,0x8e,0xd7,0xfd,0x8d,0x3e,0x7b,0x28,0xf0,0x72,0x79,0x5d,0xa3,0xe0,0x70,0xf1,0x2b,0xc4,0xe2,0x3e,0xae,0xf5,0x7b,0x85,0x3c,0xee,0x88,0x0a,},"\xf4\x45\xfd\xcf\xe2\x8c\x17\xbd\x44\x27\xae\xa5\x67\x6c\x0e\x12\x80\x84\x15\x97\xe9\xd6\x6d\xe7\xd7\xa7\x17\x23\x11\x09\x39\xbe\xd0\x0f\x4e\xba\xf9\x60\x3d\x53\xc9\xcb\xf6\x27\x1b\xe5\x47\xaf\x29\xb2\xa0\x45\xec\x41\x28\x8a\x7b\xb7\x9d\x66\x2d\xc2\x10\xe2\x15\x95\x7f\xa8\x46\x88\xc9\x16\x54\x3e\x56\x17\xf5\x60\xe4\xd3\x8f\x73\xba\xef\xc3\x7e\x11\x91\x4e\x47\xc5\x15\x06\x78\x51\xe8\xed\x21\x39\x3e\x13\xdd\x19\xed\x9b\x73\xd9\x89\x45\xfc\x82\x6a\x25\x8e\x95\x7d\xc0\x83\xdd\x8e\x53\x5c\x30\xa5\x4b\x42\x66\xdd\x71\xd1\x13\xce\x85\x6b\x46\x28\x2a\x18\x03\x36\x27\xa9\x8e\x64\x72\xcc\xb4\x63\xed\x3d\x96\xfa\x7b\x35\x5d\x3b\x2c\x2a\x2b\x60\x10\xdd\x14\xf4\xea\x39\x65\xdd\x87\xbe\x1c\x42\x9b\xde\xa8\x30\x0b\x4b\x0b\x44\x45\x86\x35\xb4\x97\x9f\x5e\x3e\x8e\xb5\xc6\x18\xd4\xe1\x3e\x1d\x68\x8b\xf8\x8c\x7e\x4a\x3d\x93\x8e\x84\x33\x6d\x67\xbe\x68\xdf\x34\x35\xc5\xc9\x90\x86\x32\x1c\x02\xe1\x3b\x4a\x12\x52\x4b\x34\xe4\x6a\x0b\x4d\x27\xf3\x0d\x7e\xd4\xf5\xce\xcb\x36\xde\xad\xf0\x9e\x7e\xfc\xc7\x55\xca\x66\x75\x68\x29\x79\x14\xc6\xbc\x24\x06\x27\xd9\xd0\x9a\xac\xf8\x54\x15\x41\x2c\x06\x35\x62\x34\x53\x27\x8d\x9b\xf0\xe1\x0e\xec\x65\xfc\x72\xaf\xff\xfa\x93\x92\xdc\x78\x81\xd1\xe5\xc7\x60\xa4\x02\x80\xf1\x6b\x14\x75\x12\x7b\x91\xb6\x9c\xcb\x65\xdc\x4b\x35\xde\x10\xf9\x43\x25\xc0\xcb\xe1\xc4\x70\x19\xa2\xea\xf2\xb4\xba\x92\xd7\x85\x22\x9a\xac\xfa\xd1\x82\x6e\xbb\xde\xbe\xfb\x7d\xad\x4b\x05\xf8\x82\x43\xe1\x5f\x27\x97\x66\xe3\x32\x1d\xd8\xdb\xa6\x50\x44\x4d\x81\xfb\x08\x78\x76\x7a\x9c\x63\x53\x4b\xb4\xba\x21\x28\x5a\x24\x16\xcb\x8f\x85\x6d\x11\xa9\x6e\x0a\x8c\x8d\xe1\xe1\xa7\x51\x32\xf1\x56\x4c\xd9\x94\x99\x56\x90\xbb\xed\x2e\xe1\x54\x53\x7f\xb6\xf2\x79\xfb\x09\xc8\xde\xa6\xf6\xaf\xab\xc6\x28\x56\xe3\xd1\x28\xfd\xfa\x79\xfc\x49\x76\x19\x3b\xb9\xb3\x36\x86\x1e\x47\xb5\x6d\xc2\x58\x23\x93\xd2\xe5\x44\x65\x1a\xc8\x5b\xc5\x8e\x9e\x6a\x94\xdc\x4c\x39\xc4\xef\x72\x53\x8a\x14\xf8\x56\xcd\x95\xc3\xe2\x79\x0a\xde\xe0\x3a\xb2\xe5\x2c\xa0\xae\x47\x1d\xe5\x02\xcb\x19\xe6\x76\xaf\x35\xf5\xf9\x3d\x84\x0f\xef\x96\x06\xcb\xe9\x2d\x8b\xc2\x50\x06\x10\x5d\x92\x34\x45\x88\x83\x88\x42\xc3\xbe\x50\x5c\x73\x50\xe3\x51\xb7\x35\xe6\xcc\x6f\xb7\x92\x75\xb2\x7b\xd9\xeb\xd3\x6b\xa4\xd0\x60\xac\xee\x73\xb5\xa3\x15\xce\xff\xab\x86\xd0\x6f\x21\x68\xa6\x70\x65\x57\x81\x96\xa0\xed\x04\xa4\xdd\x71\xd6\x73\x48\x37\xdb\x08\x38\x57\xab\x1e\xb5\xe0\xee\xc4\xff\xba\xc9\x54\x4f\x4e\xc1\x9b\xde\x19\x4d\xf8\x4b\x1c\x84\x83\x41\x57\x4b\xf1\x0d\xae\xe8\x5b\x81\x78\x19\x6f\xb6\x08\x12\x3a\x80\x81\x71\xd7\x3c\xe4\x20\x6a\xd6\x52\x16\xad\x1a\x5c\xbd\xe4\x0b\x19\xd6\xae\x7f\x40\xdf\x97\xab\x84\x32\xe2\xc5\x3a\x50\x4e\xd1\x22\xe2\x5f\xb7\xa5\x1c\x14\x35\x4a\xb3\x92\x8e\xde\xb3\x9c\x29\xeb\x24\x6b\x74\xa0\x76\xf8\x9d\x03\x50\x4f\x40\x1b\xd1\x76\xb5\xcf\xfe\xe4\xb9\xdb\x09\x7c\x45\x76\x4f\x51\xaa\x37\x67\x04\xb5\xa7\xf2\x10\xb3\xf1\xa9\x05\xe2\x5d\x67\x00\x2f\x65\x57\xeb\xb7\x49\x73\x7c\xda\x31"}, +{{0x2a,0xac,0xc8,0x19,0x7f,0xf8,0xfa,0xe1,0xc1,0xcf,0x38,0x62,0xe3,0xc0,0x4a,0x21,0x78,0x29,0x51,0xf8,0xe4,0x8e,0x40,0xb5,0x88,0xf8,0xbc,0x74,0x60,0xc3,0x0a,0x03,},{0x9a,0x1b,0x01,0xe2,0x15,0x4f,0x1c,0x36,0xa8,0xe1,0x6b,0x79,0xee,0x7d,0x2d,0x05,0xb8,0x71,0x2e,0x0d,0x27,0xa0,0x61,0xa6,0xd4,0x1d,0x47,0x57,0x78,0xb0,0xdf,0x8c,},{0x64,0x7c,0xdd,0x6c,0x1a,0x67,0x29,0x0e,0x57,0x67,0x6a,0x78,0x11,0x3a,0xaa,0xdc,0xa6,0x9a,0xc5,0x7b,0x99,0x77,0x15,0xc5,0x09,0x89,0x5b,0x8c,0x5c,0x94,0xe8,0x2c,0x0b,0x6a,0xce,0xcc,0xf3,0xba,0x8b,0xd7,0xcf,0x61,0x75,0x2b,0x1b,0x19,0xd1,0x3b,0x49,0xf1,0x5f,0x8b,0xfa,0x04,0x6e,0xb4,0x42,0xa5,0x5c,0xd5,0xba,0xb1,0x42,0x02,},"\x5d\x82\x75\x2c\xe5\xda\x31\x80\xfa\xf4\x78\x7a\xed\xfb\x19\x29\x4b\x43\x48\xa1\xd9\x20\x2c\x85\x39\x83\x31\x32\x3e\x0f\x42\xb0\x83\x52\x27\xe6\x8e\x11\x56\xf2\xd4\xba\x2f\xe4\x50\xe6\xd6\xef\x2b\x92\xd8\x9b\xbb\xe4\x09\x6e\x12\xca\x83\x97\xeb\x2f\x45\xe6\x76\xf1\x67\x3a\xa4\x1c\x95\x9f\xcd\x30\xd5\x57\x88\x53\xb5\xdb\xd1\xc0\xd5\xb3\xa0\xf0\xd8\x70\xec\xa7\x1e\xa1\x33\x90\x11\x1b\x25\x8f\x65\x48\xb3\x2f\x37\xa0\x5e\x97\x44\xa6\x56\xfd\x77\x8d\x65\x72\x19\x65\xc6\xd9\xb3\x28\x60\x0b\x45\x70\x47\x70\xe0\x4b\x09\x97\x90\xaa\x78\x84\xf0\x0d\x7b\xb7\x65\x9e\x33\x72\x10\xbd\xc2\x3e\xaa\x71\xd7\xb0\x16\x03\x0a\xca\x62\x23\xb5\x56\x9b\xdf\xc2\x90\x81\x1a\xac\x40\x95\x24\xdc\xcb\xf9\xba\xbc\xbe\x4b\xf2\x09\x46\xb5\x44\x31\x7c\xa6\xf2\xf9\x18\x31\xc7\x9f\xb2\x73\xb6\x40\x4e\xb4\xe6\x1e\x1f\x7b\x10\x6e\xbd\x0d\xb9\xf2\xb1\x97\x4d\x2f\x03\x1b\xce\x25\x80\x36\x06\x55\x2c\x34\x41\x65\x5e\xfc\xf2\xc7\xea\x52\xad\xcb\x30\x99\x3d\x85\xf2\xdd\xa7\x96\x03\xe9\x41\x5a\x02\x32\x45\xa6\x6c\x07\xa9\x56\x93\x31\x46\xf5\x3c\x99\x3c\x08\x89\x18\x08\xb8\x16\x6b\x30\x72\x1f\xbd\x1f\x8a\x1b\x93\x7d\x14\x07\x0d\x78\x6e\x9e\xb4\x51\xf2\xab\x51\x42\xf8\x3a\x60\xf3\x5d\x76\xad\x8b\x81\xd6\xa5\x7c\xf3\x68\xfc\x6f\xca\xcc\x0c\x47\x58\x44\x0d\x9c\xd5\x95\xb1\xb0\x94\x2a\x36\x55\xe2\x50\xda\x98\x3b\x72\x41\x54\x6d\xcf\xbe\x0a\xe8\x10\x77\x65\x02\x95\x40\x9f\xf9\xe9\x09\x77\xfb\x99\x60\xcb\xf4\x0a\x2a\xf5\x17\x74\x02\xba\x2f\xaf\x50\xdb\x6f\x1a\x73\x65\xcf\x99\xe9\x92\x42\x9e\x38\xdb\x43\xea\x83\xfd\xdc\x95\xa6\x48\x67\x6c\x0b\x16\xbc\x95\x2b\x15\xde\x99\xd5\x2f\x6b\x52\x33\xda\x4e\xae\x19\x78\xe8\xba\x25\xe6\x23\x5a\xfb\xc5\x11\xc7\x6c\x4c\x87\x4c\x92\x37\x92\x2b\x1c\xef\x08\x47\xd0\x7a\x80\x20\x0c\xba\xe3\xc7\xc8\x1f\xcb\xd0\xd1\x72\x52\xed\x8c\x61\xad\x19\x54\xfc\x86\x2e\x1e\x04\x44\x4c\x32\x08\x6f\xee\x38\x0d\x1c\x17\x54\x13\x22\xb9\xa6\x0d\xa6\x62\x35\x2e\x21\x0e\x9a\xe2\x15\xe3\x53\x29\x6d\xb9\x22\x33\x9a\xa1\x7d\x21\x73\xec\x31\xf1\xc5\x30\xa2\x4b\x1f\x34\x8a\x31\x57\x2e\x14\x69\xca\xac\x80\x8f\x9c\x76\xec\x27\x31\x87\x3b\x80\x3e\xad\x3e\x54\xea\x24\xbc\x24\x49\x9b\x97\x04\xb3\xbd\xce\x81\x38\x9b\x9d\x14\xd4\x95\x27\xc0\x4b\x3b\xb9\xe3\xba\x6d\x94\x6c\xea\x58\xcf\x78\x6d\x4d\x28\xb8\x9b\x41\xc5\x82\x74\x03\x5a\x86\x90\x5a\xd9\x57\x58\xc3\x16\x13\x66\xab\x93\xda\x81\xe6\xb4\xc8\x08\x36\x4e\x08\x7d\xae\xea\x4c\x4c\x5c\x2a\xa6\x87\x19\x37\xc5\xfe\xab\xa2\x14\x9f\x01\xf7\x38\xf4\x53\x96\xe6\x6e\xa8\x06\x32\x21\xe1\xc8\x1c\x05\x25\x5b\xa5\x64\xad\x44\x0c\xb5\xd0\x7c\xbd\x4b\xab\x94\x1e\xa5\x93\x24\x49\x30\xbc\x5c\x28\x9b\x31\x65\xd3\xec\x88\x47\xeb\xc4\xb6\x74\xc0\xa4\x9f\x91\x69\xad\xef\x78\x6d\x77\x67\xbc\x8f\x21\x3d\xb7\xd9\x5c\x06\xe9\x9b\xc1\x1e\x20\x00\x55\xb6\x5e\xb7\x9a\xda\xa0\x1b\xcd\x2c\x85\xda\x43\xce\x63\x70\xe1\x2e\x34\x9b\xf6\xd4\x75\x48\x7a\xff\xdf\x92\xe2\x0a\x3a\xcd\xed\x1d\x76\xf9\xe8\x3e\x91\x9e\x98\xde\xf1\x95\x07\x2a\x50\xd0\xc5\x71\xdd\x25"}, +{{0xff,0x86,0x21,0x56,0xc7,0xea,0xb6,0x81,0xc9,0x5e,0xff,0xf8,0x00,0x3e,0x00,0xa1,0x4f,0x1f,0x0d,0x50,0x5d,0x55,0x07,0xe6,0xe5,0xb3,0x91,0x79,0xdf,0x9b,0x1c,0xda,},{0xe1,0xb8,0x9f,0xb3,0x11,0x14,0xea,0x46,0x10,0x7f,0xfd,0x03,0x29,0xf1,0x06,0x64,0x28,0xde,0x54,0x70,0x8e,0xdb,0xec,0xf3,0xed,0x9d,0x47,0x08,0xcd,0x14,0x3f,0xe2,},{0x4b,0x81,0x37,0x04,0x2d,0x67,0x84,0x75,0x7d,0x4a,0x9c,0x06,0xbc,0x74,0x32,0xf4,0x80,0x9b,0x1c,0x6a,0x90,0x35,0x42,0x73,0x6d,0x9a,0x57,0x66,0x8c,0x20,0x84,0x5c,0x17,0xd4,0x68,0x55,0x70,0x85,0xc5,0x7f,0xb6,0x32,0x13,0xda,0xd3,0xbe,0x0f,0xa3,0x6a,0x11,0x8f,0x7c,0x1a,0xef,0xf2,0x56,0x2f,0xf4,0xb8,0x88,0x8c,0x26,0x90,0x0e,},"\xb3\xd1\xdb\x72\xa6\xa9\x85\xec\xd7\x0a\x2c\xff\x6c\x18\xc1\x79\xe2\x17\xd4\xf4\x10\xfd\x39\x34\x96\x96\x85\x90\x1b\xd0\x71\xbc\xe6\xc2\xfb\x67\x63\xe1\x0c\x6f\xa1\x6e\x75\xa1\x17\x60\x66\xb8\xec\x81\xae\x3a\x80\x39\xe7\x1d\xc2\xcd\xc6\x4a\x40\xfd\x62\xb7\xce\xe7\xbe\x4b\xa0\x33\x2f\xe4\x5d\x0b\x60\x15\x86\x52\xe3\x3f\x8d\x3a\xff\x3c\xb4\xd6\xb0\x21\x74\x4d\x0d\xd1\x78\xb1\xbf\x0a\x1c\xc1\xd3\xfe\x93\x21\xbe\x28\x42\x1e\xb8\x82\x63\xa1\x24\xf4\x97\x92\xd0\x79\x47\x5a\x8c\x55\x5f\xf5\x69\x08\x73\x51\x4b\x5d\x48\x3e\x53\x21\x7e\x0c\xbb\x12\x86\x2b\x85\x0f\xe3\x90\xc8\xf8\x30\x08\x08\x6e\x64\x9a\xc9\x04\xb0\x18\x35\x0a\xb4\x91\x57\xee\x9b\xca\xe6\xc0\x7a\x4b\x87\x8b\x48\xe2\x5e\x98\x4f\xbb\x4d\x36\xb6\x1d\x68\x9b\x13\x46\x8a\x28\xd1\xe3\x87\xe0\xe8\x86\x57\xf8\xc8\xac\x95\x86\xa6\xe2\x6c\xf9\x4d\xff\x6f\x82\x64\xe3\xff\x62\x58\x86\x5c\x6d\xcf\x85\x7b\x00\x14\x78\x86\xe1\x75\xdf\x04\x32\xe3\x2f\x04\x40\x0e\x29\x9f\x21\x18\x83\x12\xb3\x2d\xfc\x05\x0e\x7b\x7e\x87\xee\xaa\x0c\xba\xac\x6b\xe9\x93\x7a\x5e\x0c\xc3\x11\x13\xde\x7c\x8b\x23\x3e\x1c\xe8\xe5\xd9\xc5\x64\xfb\xe9\xf3\x7b\xbd\x41\x1d\xf7\xa5\xe4\x4e\x6c\x7e\xbb\x67\x6d\x85\x89\x4d\xcc\xf4\x86\x5e\x4d\xda\x0c\xad\xef\x2b\xbc\x55\x00\x0b\x3a\x29\xf1\xf7\x1e\xf4\x46\x1d\xdc\x3b\x33\x1d\x91\x56\x65\x34\xc5\xd6\xd8\x4c\x73\x13\x76\x29\x53\x20\xf8\x0a\xdc\x90\x28\x8f\x99\x53\x55\x4f\xcd\xf9\x21\x3d\xe6\xa9\x05\x21\x0d\x4c\x80\x64\xaf\x91\xcd\x98\x32\x5e\xf9\x18\x98\xd3\x3d\x70\x03\x82\x02\xe3\x2f\xb6\x70\x9c\xa3\xd7\x88\xfe\xcb\xd1\xb8\x41\xfa\x4e\x5e\x90\x62\xd6\x42\x67\xc3\x5c\xfd\x44\x4f\xb6\x9e\x2f\x60\x47\xf5\x8b\x1c\x2a\xf4\xcc\x7e\x4c\xac\x2f\x89\x08\x88\x36\x05\x92\x11\x3e\x96\xad\x3a\x85\x7e\xd0\x5e\xaa\xba\x6f\x91\x53\xef\x89\xb9\x3e\x00\xe8\x74\x37\x33\xec\x47\x2d\x9b\x0e\xec\x1c\xd8\xfa\x52\x42\x5c\x4a\x26\xbd\x7d\xf7\x3a\x27\x12\xbe\xbe\x51\xae\x3b\x25\xeb\x78\xdb\x82\x14\x90\x31\xfe\x7b\x28\x1a\xf6\xcb\x77\x14\xed\xf8\x9d\xe9\x15\xf3\x47\x0f\x15\x3e\xed\x7f\x45\x62\x43\xbb\x90\x34\x2e\x19\x0e\x64\x7f\x39\xe0\x46\x88\x3c\xe2\x8a\x89\x20\x03\x31\x5e\xa3\x79\x42\x9e\x95\x82\xa9\x35\xeb\x78\x96\x33\x96\xd1\x36\x84\x5f\x86\xc4\x66\xe8\xfa\xf2\x27\x2f\x43\xff\xef\xc2\xad\xa5\x60\x1f\x8a\x6b\x2a\xc4\xcc\x6b\x92\x82\x09\x17\xf2\xe0\x39\x3c\x8f\xaf\x98\x2d\x6c\x5f\x4f\x23\x0e\x27\xce\x22\x78\xa7\x23\x77\x47\xfa\x85\xa9\xc8\x57\xbf\x18\x02\xc3\xea\xe0\xd2\x35\xb5\xad\x58\x49\x7d\x66\xa0\xd3\xa9\xba\xeb\xcc\x41\x7f\x18\x33\xe9\xcc\x44\x60\xf9\x75\xd7\x28\x58\xcd\x11\x8d\x7a\xaf\xaf\x1c\x87\x82\x97\xca\xcf\x71\xac\x75\x67\x6d\xc1\xb4\xfb\x51\xc1\x77\x58\x10\xd0\x35\x37\xf2\xd7\x66\x27\x8b\x99\x71\xbb\x97\xd3\xc4\x9b\x51\xfe\xb2\x6d\x37\x5e\x0c\xb9\x10\x95\x74\xa8\x16\xf8\x4e\x76\xfc\x7e\xf0\x72\xd5\x79\x3c\x2f\x65\xab\x2e\xfd\x90\x52\xe6\xb8\x56\x9f\x28\x05\x86\x1c\x31\xa7\x34\x4a\x3c\x44\x06\x9a\x94\x32\x0d\x27\x4e\x27\x12\x71\xea\xfa\x3b\xfe\x64\xde\x75\x37\x84\x6a\x01\xe5\x1f\xda\xe0"}, +{{0x58,0x26,0x19,0xab,0x3c,0xf5,0xa3,0xae,0x77,0x66,0x88,0xbf,0x6d,0xba,0xcb,0x36,0x33,0x0a,0x35,0xad,0x75,0x24,0xe4,0x9e,0xf6,0x63,0x68,0x77,0x64,0xcf,0x6e,0xc7,},{0x20,0x02,0xea,0x0a,0x38,0xa3,0x27,0xe0,0x38,0x4a,0xea,0xe4,0x68,0xdb,0x0f,0x6c,0x85,0x16,0xa6,0x96,0x09,0xaf,0x9e,0xee,0x93,0xe9,0xec,0xb9,0x4b,0x44,0x9c,0x66,},{0xfe,0x97,0x01,0xda,0x1a,0xa8,0x1c,0x55,0xba,0xc3,0x36,0x38,0xf7,0x75,0x54,0x2b,0x80,0x44,0x80,0xf3,0x4b,0x7b,0xfc,0x78,0xda,0x99,0x16,0xe5,0x24,0x6a,0x60,0x4d,0x39,0x0b,0xf9,0x20,0xc8,0x72,0xa7,0x79,0x24,0x24,0x6e,0xe8,0xd0,0x39,0x3b,0x20,0x2e,0x7b,0x25,0xb2,0x48,0x4f,0x65,0x4a,0xc3,0x67,0xcb,0x09,0x25,0xec,0xe3,0x05,},"\xca\x74\x28\x4f\x11\xc5\x6e\x25\x98\xd7\x8a\x4e\xcd\x03\xb4\x0e\x01\x7a\x55\x81\x76\x01\x2b\x26\xfd\xf6\x95\xc3\xde\x98\xa7\x4f\x8f\x40\xa4\x7d\x79\x78\xed\xc2\x4e\xe8\x09\x2b\xfe\x5e\x61\x59\x68\x34\xde\xed\x1d\x9d\x34\xa0\xf5\xcd\xae\xbe\x34\x21\xaa\x19\xe0\x12\xde\x86\x5b\x9e\xe1\xb7\x34\x79\xb2\xbd\x1a\xc9\x82\xf9\x7e\xd9\xc7\xcd\x20\x45\x9c\x60\xfb\xb1\x1e\x1e\x2b\x4e\xac\x5d\xb6\x84\x4c\x71\xd7\x29\x49\x50\x2b\xba\x50\x3a\xce\xc9\x05\xad\xba\x25\xf6\xb1\x19\xea\xf9\x63\x9f\xa8\xab\xb3\x02\xdf\xf9\x93\x2d\x85\x0c\xc4\x4c\x57\xcf\x90\xb2\xe5\x8a\x8b\x52\x51\xc1\x26\xa9\xe2\x8f\x5c\x76\x1b\x62\x80\xe2\xcd\xdd\x79\xcb\xd6\x8e\x53\xff\x4a\x62\x26\xd3\xbd\x4c\x96\x1b\x9b\x9e\x43\x45\xa2\x54\x58\x62\xc7\x97\x38\x66\xf0\x42\x0b\x89\x8e\x7b\xae\xa9\x0e\xa4\xee\x00\x40\x42\xef\x38\xa1\xfd\x95\x6a\x72\xfd\xf6\xfd\x43\x25\x7d\xa9\xfd\xb9\x66\x80\xef\x4f\xdf\x9e\x94\x3d\x26\x5c\xdc\xf2\xe5\x2e\x32\x01\xd5\x40\x8b\xc6\xce\x10\xe5\x70\x0a\xdf\x12\xb5\x5b\xa1\x4a\xa8\x29\xd8\x69\x1c\x31\xf2\x4f\xc4\xa5\x1c\xe6\xfa\xa1\xf3\xef\x2e\xad\x78\xe5\xe7\x53\x44\x6a\xd3\xfa\x4a\x84\xc1\x93\x97\x9a\xeb\xc8\x30\x9b\xad\x60\x81\x4f\x48\x59\xb9\x31\xd7\x04\x14\x76\x44\x91\xc6\xc9\xed\x8d\xb6\x73\xc5\x43\xd3\x51\x85\xcd\x28\x88\xaa\x21\xc1\xa9\x20\x34\x27\xe0\xac\x0b\x1f\xe3\x4c\x0e\x4a\x40\x01\xe0\x95\x6c\x13\xcb\x59\xa3\xba\xf8\x7c\x21\x09\xa8\x88\xa4\xc9\xe7\xaa\x48\x17\x67\xd8\x02\x0f\xf3\x5d\xd7\xc5\xcc\xec\x7c\x08\xe9\x71\xa7\xe2\x18\x13\x8c\x90\x54\x6a\x7d\xdf\x36\xad\x11\x4b\xe5\x85\x57\x43\x2c\x2d\xdf\x34\xce\xd3\x37\x9f\x70\xd4\x40\x7e\x58\x79\xf9\x84\x2f\x38\x17\x17\x05\x1b\x16\x85\xaa\x7a\xb0\xad\x38\x54\x1e\xc1\x68\xf5\x1c\xb6\x88\xf3\xcd\x1a\x01\x9a\x33\x6c\x9f\x4f\x3f\x82\xde\x78\x5c\x07\x48\x67\xfd\xc8\x80\x0f\xc7\x6f\xba\x04\xc8\xad\x8d\xe1\x0d\x2e\x9b\x43\x05\x81\xbe\x44\xc4\x1e\xcc\x8f\xc8\xa6\x16\x31\x43\x99\xd1\x8c\x64\x79\xf5\x7e\x57\x3b\x22\xa6\xee\x5c\xe2\xdc\xc0\x89\x48\xa0\xde\x1f\x0d\xd2\x5b\x65\x71\x5a\xb1\x8c\x70\xc7\x62\xfc\x3d\x7d\x60\x0c\xad\x63\x22\x60\x38\x50\x9c\x19\xab\x35\xb5\x49\x3e\xee\x73\xa7\x03\x73\x1e\xc5\x35\xc9\x0c\x6f\x06\xd9\x4d\x3e\x5f\x7e\x51\xa0\x9f\x9f\x8f\x42\xc5\x01\xb8\x50\x46\x86\x36\x5c\xee\xe9\xe0\xfe\x00\x13\x29\xf3\x03\x52\x21\x46\x71\x7c\x6a\x12\x58\xd0\xf1\x57\xcb\xea\x4b\x5a\x5e\x3d\x13\xbc\x90\x7e\x95\xfd\x6e\x8a\x71\x89\x6a\x02\xc3\x10\x6b\xd2\x6a\x51\x00\x51\xf1\xb3\x02\x58\xab\x27\xf8\x75\x67\x3b\x13\x37\xee\x36\xb7\x1a\x37\x6e\x0f\x9e\x78\x09\xa6\x7c\x67\xd9\xac\xc1\x6c\x25\x1d\xcb\x8c\x92\x6c\x8e\x93\x25\x16\xd3\x8b\x72\x33\xea\xc6\x15\x9c\x59\xca\xd0\x30\x7c\x59\x0e\x71\x31\xb6\x22\x19\x14\x5a\xaa\x35\x5b\xfb\x4a\xcb\x6a\xf0\xa5\x50\x00\x06\xcd\xd8\xb8\x13\xfe\x19\x08\x60\x2e\x08\x74\xc9\x62\x2b\xb3\x76\x73\xba\x1a\xcb\xa4\x14\x23\x16\x67\xbc\xc4\x90\x7a\xc8\x71\xf8\x7e\x6c\xe3\xf5\x91\xc1\x91\x71\x05\x7a\x9f\x45\x7f\x53\x62\xae\xda\x10\x5d\x18\xfb\x84\xf7\xd0\xf0\xa7\xda\x7e\xf8\xda\x91\x14"}, +{{0x2b,0xbd,0x83,0x0c,0xe7,0xde,0xf3,0xfe,0xce,0xa1,0xec,0xd6,0xea,0x0a,0xe9,0xc9,0xf4,0xfa,0x8f,0xfc,0x3b,0x1f,0x19,0x38,0xc5,0x05,0x05,0x1b,0xab,0x40,0xcf,0x7a,},{0x0f,0xdf,0xed,0x8d,0xe3,0xc1,0xea,0xf8,0x91,0xce,0x37,0xe3,0x4c,0xb4,0xa2,0x44,0x1c,0xbb,0xae,0x08,0x83,0x38,0x3d,0x70,0xde,0x24,0x64,0x85,0x0b,0x4a,0x64,0x2a,},{0x13,0xeb,0xc9,0x79,0xa8,0x87,0x10,0xe3,0xc5,0xf3,0x45,0xcf,0xbb,0x82,0x48,0x13,0xb3,0x08,0xa9,0xd5,0xc6,0xde,0xe3,0x28,0xbf,0xd2,0x35,0xa9,0x7d,0xe7,0xb3,0x26,0xde,0x6c,0x73,0x8f,0x96,0xf6,0x98,0x31,0x94,0x92,0x09,0x99,0x68,0x52,0xdd,0x9c,0x09,0x8d,0x58,0x08,0x41,0x87,0x09,0xf2,0xbf,0x51,0x0d,0x46,0xb7,0xf0,0x36,0x06,},"\x5f\x1e\xde\xaa\x3c\x0b\x2a\x63\x31\x1d\x97\xf1\xc5\x4e\x7e\x2f\x68\x71\x70\xe6\xb4\x6e\x21\x69\xcb\xf5\x6c\x66\xf2\x31\xbf\xc4\xa5\x76\xbd\x2b\x84\x20\xbf\x35\x7d\x3a\x90\xf8\xf3\x2e\xa1\xad\x99\x39\xb4\x67\x25\x4b\x66\xa1\xdf\x1f\x5b\x4c\xba\xc6\x3a\x5c\x27\x24\x26\x0d\x24\xd8\xdf\x8e\xdb\x58\xae\x24\x7a\x25\x91\xe9\x20\xb1\xa4\x20\xcf\x8d\x85\x39\xea\x57\xdb\x0d\xad\xff\x1a\xd3\xe9\x8c\x31\x72\xd0\x33\x16\x3c\xb4\x34\xa7\x66\xb0\xc1\x18\xa5\x6a\xbd\xcc\xe7\x9c\x82\xaf\x7b\xac\x74\xed\x0e\xa0\x24\xac\x4c\xe0\x22\x2d\x0a\xa9\x14\xf4\x32\x09\x2b\x1b\x51\x78\x04\xdb\x59\x18\xa8\x45\xe9\xcc\xa5\x5a\x87\xdb\x7c\x28\x52\xf7\xdd\x2e\x48\x36\x01\x85\xcc\x44\x2c\x79\x30\xaf\xe1\x5d\xd6\x22\xcc\x02\xbc\xd1\xee\x77\x8b\x59\x70\x5f\x14\x33\x32\x41\x58\x8a\x52\x2d\xe2\x44\x07\xe8\xe6\xe1\x0d\x5e\xf3\xa8\x8e\x3a\x3c\x44\x38\xc1\x7f\x75\x04\x67\x4f\xd7\xe4\x18\xcb\x2f\x77\xad\x0a\x56\xd2\x38\x67\x03\x15\x5e\x9a\x40\x1c\x43\xdd\xb5\x1e\xad\x55\x20\xaa\x7b\xa0\x38\xe7\xde\x53\x31\x41\x8a\xd5\x52\xbd\xcd\x18\x5f\x50\x3a\x85\x48\xf5\x5b\x63\x86\xe4\x68\x7c\xa5\x15\xf7\xc0\xee\xa5\x70\x98\x3b\xfb\x24\xbe\x16\xf7\xb3\x00\x3f\xb7\x56\xe3\x26\x56\x2f\x2a\x32\xfe\x65\xff\x84\x4c\x39\x84\xc7\x2e\x40\xdd\x49\xe4\xf3\xae\x8c\x0f\x81\x9a\x79\x39\xb2\xe7\x36\xe3\x81\xf5\x82\x3c\xbc\x61\xb2\xed\x01\xd9\xb0\x5c\xf8\xb1\x46\x48\xa4\x8b\x0d\x7c\xbe\x88\x2a\xc1\x6c\xad\xd8\xc4\x2a\xa2\xc7\x02\x46\x34\x7b\x4d\x84\x95\x36\xa7\xac\x22\xc7\x20\xda\x3c\xf1\x78\x72\x5e\xe5\x57\xa9\x2c\x25\xb1\x2b\x8b\x95\x6d\x3b\xf4\x80\x2e\x9e\x8a\x15\xb5\xab\x75\x42\x35\xcc\xa0\xe5\xb7\xe5\x5e\x4a\xec\xe4\x5a\x47\xe0\x84\xce\x14\x47\x44\x05\x98\xef\x5d\x4f\x5f\xdc\x2c\x98\xa5\xad\x13\x6c\xff\xbf\x87\xd3\xcf\x52\xf6\x73\x8c\xca\x79\x48\x35\x60\x92\x07\x8f\xdf\x25\x45\x77\xf5\x59\x69\xa0\xc6\x52\x46\xda\xc8\x09\xa2\xfc\xa1\xf6\x0a\x1d\x92\x98\x77\xb9\xa6\x54\x0e\x88\xa9\xe6\xe9\x15\x59\x38\xd2\x2c\x68\x7e\x63\xb3\x87\x53\x4d\x38\x5e\x89\x61\xe5\x88\x67\x43\xf9\x5f\x4a\x70\x80\xd9\x16\x62\x45\x17\xb1\x53\x36\x03\x0a\x46\x71\x4b\x16\x8b\x83\xd6\xf9\xcc\xe0\x60\x66\x49\xc0\x1f\x0a\x1d\x0a\x2a\x53\xf5\xe3\x78\xf6\xaa\x98\xc3\x84\xaa\xfb\x3e\xef\xdb\x34\x21\xfa\x3a\xc9\x8a\x0d\x3a\x9c\x02\x9c\x23\x00\xae\x02\x41\x06\x7d\x1a\x4f\xc9\x2e\x43\x86\x88\xea\x88\x9f\xcb\x1a\x1a\x9e\x86\x34\xb9\x16\xc6\x0b\xaa\x0c\x18\xbf\xcd\x13\x9b\xfe\x30\x17\xbf\xbe\x16\x29\x13\x43\xce\x86\x05\xbb\x78\x72\x55\x8c\x6b\x5f\xd5\x6d\xfd\x22\x15\x77\xed\xcf\xfa\xa8\xbd\xa3\x4d\x7a\x11\xab\x8c\xb2\x78\x28\x8e\x58\x34\x84\x26\x76\xfc\xcf\xfa\xa9\x11\x1b\xce\xd2\xb3\x57\x5f\xdd\x49\x62\x1b\x76\xe8\xd1\x29\xb6\x17\x00\xee\xab\x03\x14\xef\x94\xd5\x50\x50\x6a\x4b\x8d\x1e\xe6\x55\x08\xd8\x9d\x0e\x99\xe9\x33\x6b\x41\xd9\xf7\x4a\xa4\xd7\x22\x11\x4d\xe0\xf3\x1e\xcf\x00\xb0\x97\xf5\x3c\x9a\xca\x9c\x7a\x28\x5b\x58\xa3\x5d\x70\x29\x8c\x5c\x34\xf7\x4b\x4a\x70\x53\x08\x03\x31\x00\x34\x9f\x0c\x62\xf9\xc2\xeb\xf7\xde\xad\x0a\x77\xb2\x98\xeb"}, +{{0x1a,0x7a,0x3c,0x2f,0x54,0x81,0x13,0x1b,0xe5,0xf8,0x68,0x45,0x6a,0xa2,0xfa,0x90,0xe5,0x6d,0x52,0xcb,0x72,0x1c,0x71,0x84,0xeb,0xff,0x06,0xfe,0xd2,0xfe,0x68,0x5d,},{0x7c,0x2a,0xd0,0xf2,0xa5,0x70,0x55,0x03,0x26,0xfb,0x50,0xa8,0x50,0x83,0x58,0x21,0x67,0x6d,0xe1,0xde,0x12,0x7f,0x6d,0xe1,0x67,0x02,0x99,0xd8,0x14,0xf6,0xe3,0xce,},{0x97,0x61,0x60,0xfb,0x5b,0xbd,0xab,0xe5,0xc8,0x96,0x2f,0x23,0xba,0xba,0xcf,0x0b,0x0a,0xb4,0x1c,0x2b,0xb1,0x3e,0x9c,0x0d,0x44,0x90,0x67,0xb7,0xde,0xcc,0x7d,0xb4,0xe9,0x4e,0x76,0xa7,0x1b,0x9c,0x0a,0xc4,0xd6,0xaf,0x38,0x7a,0x72,0xa8,0xcd,0x73,0xe3,0xbc,0x63,0xb7,0xed,0x65,0x0b,0xee,0xbf,0x17,0x42,0x4c,0x49,0x0b,0xd6,0x0d,},"\xc6\x28\x34\xd9\xd5\x5d\x1a\x44\x03\xe9\x25\xd0\xa5\xb5\x52\xda\x17\x4c\x02\xf4\xe9\x45\xde\xc3\x38\xc1\xbb\xb2\xae\xb4\xff\x40\x02\x0e\xf7\x0f\xf5\x05\x20\x5c\xf8\x81\xb6\x29\x96\x0a\xbd\x62\x76\x4e\x5a\x54\xf2\xb5\x10\x56\x67\xb1\x1c\x7d\x5b\x7a\x4c\xcc\x3f\x48\x8b\xdd\xdb\x95\x8a\x7b\xe9\x54\x62\x07\xe6\xc4\x67\x18\x97\xc0\x53\x50\x8e\x1f\xd8\x32\x22\x13\x0a\x79\x33\x97\x6d\x2b\xec\x61\x4e\xd8\xf9\xb6\xa6\xb9\xf4\xef\xb2\xa5\x8b\x9d\x00\x5b\x94\x3e\x42\xf1\x71\xb7\x09\xa7\x31\x30\x70\xcb\x2e\x06\x8d\xa3\x9c\xf9\x99\x22\xb6\x9e\x28\x5c\x82\xad\x97\xf2\xd6\xc7\x79\x22\xca\xe2\xb5\xe3\x20\xe8\x35\x77\xc0\xd0\x88\x76\x1e\xc8\x81\x52\xc2\x97\x49\x29\x78\xa9\xd7\xa3\xff\x67\xed\xe4\x4c\x2a\x70\x7c\xf3\xe2\x35\x2e\x23\x2f\x53\xc8\x78\x2b\xa4\x89\x28\xa9\x7f\x8a\x36\xb2\x0a\x41\x68\x16\xe9\x45\x79\xb9\xd7\x25\x0a\x29\xdc\x84\x70\xf6\x3a\x70\x58\xe2\xd2\xa9\x9d\x6f\x0c\xcb\x53\x0d\xf5\x96\x95\x05\xef\x5c\x78\x44\xeb\x16\x7d\x20\xf4\x12\xa5\x08\xfa\xb1\xf8\xcd\x9c\x20\xc5\xeb\x9a\x41\x7a\x54\x12\xb5\xda\x6a\x57\x13\x57\x59\xfa\xb1\x7f\x63\x14\xf6\x8d\xf3\x5b\x17\x72\x42\x14\x43\x67\x6f\x31\x25\x79\xaf\x6b\x14\x11\x53\x5a\xda\x8f\x76\x01\x2b\x69\xbb\xeb\x60\xb2\x89\x7e\xe6\x60\x7c\xb3\x69\xcd\xf5\x2f\x4f\x6d\xdf\x88\xcd\xb2\x63\x0d\x78\x89\x6f\x13\x61\xfe\xa2\x2a\xe6\x34\x21\x76\x96\xff\x11\x4f\xb4\x2d\xbe\x4f\x43\x46\xf1\xbe\x5b\x57\xad\xb3\x84\xae\x7e\x49\xb4\x1f\x74\xb3\x1b\x9a\x62\xbc\x69\xdc\xa1\x65\x89\xc6\x34\xeb\x9d\x7c\x6c\x94\xf8\xec\xe4\x4b\x60\x62\x8f\x98\xe1\x02\x4c\xf3\x2e\x3e\x3d\xd6\xdc\xe5\x5a\x12\x22\x53\x2f\x49\x0d\x63\xe6\xa2\x75\x28\x1c\x0f\x3a\x6c\x10\x18\x91\xb8\xd5\x7a\x45\xde\x11\xde\x35\xeb\xb1\x51\xc0\xdc\xd7\x5e\x6c\x05\x0b\x3c\xd8\xba\xba\xe8\x45\xc3\x9f\x66\xc3\x6c\x77\xcd\xe0\x5b\x68\x3e\x4f\xb0\x10\x3d\x93\xe7\x65\x93\x35\xc8\x7f\xc0\xe3\x23\x5b\x2e\x82\x48\x8c\xda\xbe\xb5\xc5\xc8\x75\x80\x87\x45\xee\xa9\x2d\xe8\x6b\x8e\xfc\xb6\x3e\x16\xd0\x82\x91\x9a\xee\x2e\x92\x89\x9c\xb0\xbc\xf1\xc1\x42\x15\x77\xa4\xa0\xd9\xdb\x09\xee\x1f\x9f\xeb\x92\xa5\x38\x21\x03\xcf\x7c\x32\xcf\xe4\x63\x72\x5a\xe4\x86\x6d\xaa\xfe\xda\x05\x34\xc1\x69\xf8\xf9\xbe\x40\x4f\x3b\xaa\xe1\x23\xfa\x76\x8a\xce\x46\x17\x8d\x4b\x9b\xbc\x5b\xd7\xae\xec\x79\x03\xb0\xa5\xbc\x57\x53\x89\x86\xee\x09\xe0\x7e\x32\x07\x7b\x3b\x9d\xe5\x0d\xd1\x96\x7a\x37\x2c\x38\x5a\xc8\x86\x28\x7c\x18\x45\x1a\x64\xef\xb3\x7d\x05\x6f\x9f\x41\x94\xc0\x8b\x1e\x3e\xc9\x70\x22\x26\x7b\xf0\x04\x3c\x13\xd2\x6b\x9c\xe1\xf5\x39\x05\xf6\xe4\x1b\x3d\x99\xdc\x81\xb3\x31\x90\x9b\x72\x26\x66\xef\x24\x32\xe6\xaf\x8a\x45\x31\x07\x53\x12\x30\xce\x4a\x1a\xf8\xee\xd6\x26\xda\x22\x3d\xa7\x6b\x46\x50\x7e\x33\xd7\xcd\xbd\xe0\x2d\x41\x10\x40\xc8\x9a\x11\xd9\x51\x56\xed\x4a\xc2\x60\x5b\x82\x69\x39\xc6\xcf\x87\x7b\x4e\xe7\x36\xc5\xda\x77\xcf\x46\x50\xa9\x99\x7a\x3b\x9c\xf4\x6a\x82\xba\x2b\xc0\x13\x33\xc0\x44\x78\xb5\xc9\x2e\x24\x98\xbd\x00\x2f\x01\x31\x40\xae\xdb\x30\x1b\x95\x99\x3d\x1d\x75\x08\x70\xd9\x88"}, +{{0x19,0x1a,0x1d,0x90,0x32,0x1c,0x7f,0x4e,0x74,0x94,0xbb,0x98,0x29,0x09,0xa9,0xeb,0x40,0xc3,0x34,0x1d,0xd3,0x2a,0xe4,0xd9,0x67,0x50,0xb7,0xd0,0x29,0x66,0xb4,0x0f,},{0x95,0x62,0xd9,0xe2,0x13,0xf1,0x45,0xc4,0x56,0x93,0x5b,0x70,0x31,0xc6,0x80,0x66,0x9f,0x8b,0xbd,0x31,0xa4,0xc2,0xed,0x3c,0x91,0xc4,0x00,0x2a,0x56,0x29,0xe9,0x7b,},{0x74,0xcb,0x02,0x8d,0xc6,0xb7,0x5b,0x37,0xa1,0xda,0xea,0x1c,0xf8,0x84,0x65,0xdb,0x83,0xa0,0x09,0x3f,0xec,0xb2,0x2d,0x99,0xba,0x85,0x5e,0x9a,0xb5,0x9d,0x05,0xcb,0x22,0xc8,0x7d,0x0b,0x09,0xdf,0x7c,0x11,0x62,0x13,0xba,0xa8,0xf1,0x89,0xb2,0x70,0x3f,0xf9,0x53,0xcd,0x20,0x2e,0xb9,0xde,0xa3,0x97,0x6e,0xe8,0x8f,0x5f,0xa7,0x03,},"\x85\x89\x0d\xb4\xe2\xfb\xce\x09\x3d\xde\x5a\x80\xbf\x8f\xe0\x9a\x98\x4b\x83\xa4\x9b\x7c\xcb\x5d\x4b\x06\xcd\xaf\xdd\xd3\x82\xe4\xb8\xa8\xa5\x05\x30\xe8\x2c\x20\x06\x12\xc9\xd7\xd8\xa0\x89\xbc\x8a\xa8\x45\xc3\xcf\xcc\x38\xa6\x19\x5d\x21\xc2\x61\x8c\x3d\xba\x2b\x57\x09\x20\xec\xcf\xcd\x23\x6f\x17\xf0\x8d\x81\x42\x68\xf8\x82\x24\x2d\xdf\x07\x02\xda\x87\x85\xf4\x07\xaa\x8f\x86\xfe\xcf\xa9\x03\xc4\x8d\xa8\x3f\x83\x97\x77\xeb\x6b\x4a\x2b\xbf\x5d\xf7\xa4\xda\x53\x47\x5a\xf1\xff\xe4\x4b\x5f\xe0\x07\x2b\x8f\xbf\x3d\x26\xe6\xd8\x9e\xa6\x7d\x8a\xc8\x45\x94\x92\x89\x0a\xda\x65\x7e\xb3\xdc\x24\x92\xb8\x8d\xe1\x75\xb4\xbb\xa1\xa5\x08\x06\x4d\x61\x96\x74\xaa\xae\x2a\xf0\x9d\x31\xa5\xc2\x7c\x8d\x5d\x5a\x29\xb0\x37\x79\xf4\x28\x6b\x89\x66\xce\x40\x7e\x6f\xf6\x92\xfb\x94\x25\x20\xa9\x93\x8d\x69\xcc\x70\xac\xb0\x6b\x01\x4b\x6d\xfc\x19\x83\x42\x06\xcf\x1a\xc6\xc4\x48\xae\x6f\x07\x80\x25\xb5\x5f\x3d\x82\x72\x01\x26\x8a\x92\xad\xd9\xad\x17\x8e\xf7\x6a\x29\x89\xfe\xdc\x6e\x39\xf4\xeb\xb9\xf9\x6c\x9b\x83\x52\x69\x4f\xa5\x4f\xa0\x22\x01\x9c\x0e\xc0\x01\x2d\x0d\x76\x9e\x23\x67\x80\x3f\x92\x5f\x17\x5f\x9f\xb9\xcb\xec\x4a\x0c\x9c\x1e\x2c\x83\xea\x57\xe6\xa9\x2a\x17\xf5\x55\xca\xb9\x34\x27\x1e\x72\xc8\xcc\x32\x15\xfc\xb8\x7c\x20\x53\x9b\xf1\x42\x77\xb1\xbf\xbd\x6e\x58\x80\xef\x95\x3f\xc7\x5f\x23\xc0\xdd\x4f\xcc\x1e\x0b\xe3\x40\xaf\x94\x7d\xe0\x2e\x87\x7f\xd5\xc7\x7d\xd1\xdf\x7b\x41\x4b\x5c\x0b\x40\xc7\x49\x56\xa5\x45\xa1\x15\xb0\xc6\x99\x3a\xb2\x33\xb7\xe7\x2c\x82\x2b\x6b\x33\x81\xbb\x1f\xc1\x08\x75\xbf\xfe\x3e\x2e\xd1\x19\x0f\xa3\x3f\xc1\x5d\xa0\x83\x79\x4f\xcc\x2c\x5b\xf5\xa0\x79\x09\x06\x3c\xb2\x89\xa0\x8a\x2c\x8a\x33\xd3\x43\x84\x2c\x2d\x6a\x3c\xfa\x2a\x16\xca\x2e\xaf\xca\xb7\xea\x10\x0d\x1c\x71\x4b\xaa\xbb\x71\x49\xf0\x7e\x25\xde\xe3\x23\xe7\x80\x75\x7d\xfa\x80\x16\xfa\xa7\xc0\x62\x62\x22\xc3\x65\xf8\xf2\xf6\x68\x7d\x1d\xed\x23\x4f\x79\x9c\xc5\x0d\x1c\xd2\x6b\x4c\xfa\x40\x45\x91\x70\x56\xfc\x79\xc3\xb8\x8b\x2b\x19\x08\xe3\x72\xdf\x66\xda\xc8\x73\x46\x31\x64\x83\x49\xbc\x37\xfa\x34\xb2\x5f\xff\x3b\x07\x47\xb6\xbc\x16\xb9\x4e\x3e\x58\x95\xe4\xbb\xd9\x3d\x47\x8a\x6c\x1f\x75\xe4\xfa\x30\xfa\xa9\x22\x04\x9e\xd4\xc5\x0f\x12\xf4\xb3\x12\xa8\x97\x4d\x0f\xed\x8d\x44\x25\x5d\xcb\x2b\xf0\xfe\xbe\x47\xfb\x3f\xb8\xed\x99\x03\xb5\xba\x4c\xa1\x8e\x3c\xc6\x76\x2c\xfa\x1e\xaf\x04\xdf\xa9\x44\xd4\x96\xe0\xfe\x8b\xb7\xdc\x04\x54\x51\x39\x6b\xfa\xba\x54\x85\xd9\xd5\xf3\x91\xa9\x54\xc3\x71\x42\x53\xcc\xd9\xb1\x99\x64\xd4\x28\x06\x80\x72\x07\x83\x03\x6b\x3a\xbf\xaf\x28\x84\x58\x3e\xa5\xbd\xbc\xf6\x9d\x08\x89\x7a\xb2\x88\x31\x46\x35\xab\xb4\xc2\x96\x4b\x71\xad\x92\x91\xfe\xb5\xb6\x1f\x80\xe9\xb0\xcc\x07\xf9\x12\xa8\xe5\x59\x8d\x55\x48\xde\xfe\x0e\xea\x1c\x44\x85\x73\x71\x0a\xac\xdd\xb1\x52\xf9\x3c\x7c\x6f\xd3\xf7\xe4\xed\x9f\x74\x42\xa6\xb9\x00\xf2\x3c\x3c\x54\x4c\xe5\xc9\xba\x5f\x5e\x92\xaa\xfd\x11\xc9\xff\x5f\x79\xc0\x8b\x9d\x04\x5f\xef\x07\x97\x06\x25\xf6\x2e\x2f\x43\x34\xa4\xd6\x64\xca\xf7"}, +{{0x62,0x85,0x63,0xaa,0x3e,0xe2,0xfc,0x61,0x1b,0xcf,0xf7,0x8b,0xfb,0x2a,0x75,0xe9,0xfd,0x87,0x80,0xe8,0x7a,0x93,0x94,0x99,0xa6,0x1b,0xea,0xa6,0xa4,0xb7,0x19,0x13,},{0xda,0x20,0x61,0x6e,0xe4,0xa4,0x1c,0x2e,0xbf,0xdc,0x50,0xab,0x54,0x95,0x3b,0x6d,0x38,0x7b,0x06,0xc6,0xde,0xf7,0x57,0x96,0xb0,0x88,0x09,0x56,0x5c,0x6c,0xf8,0x05,},{0xc9,0xa6,0xaa,0xa9,0xb4,0xe1,0xcc,0xe1,0xb5,0x84,0x45,0x72,0x5f,0x61,0xf5,0x52,0xc8,0xfb,0x45,0x83,0x1f,0x03,0x48,0x27,0x98,0xf0,0x1f,0x66,0x3e,0x99,0x83,0xdb,0x1a,0x82,0xfd,0x33,0xab,0xa3,0xec,0xcb,0x96,0x22,0x64,0x26,0xd5,0x0a,0xe1,0x7c,0xc5,0x12,0x74,0xce,0x18,0xa3,0x88,0x60,0xf4,0x0b,0x2f,0x82,0x36,0x1b,0x5c,0x03,},"\x05\x6f\xb9\x54\xfb\xe6\xa6\x01\x4f\xad\xac\x1e\x1a\x9f\x56\xcc\x08\xaf\x37\x34\x8e\xba\xf6\x92\x06\x83\x38\x4e\xfa\x47\x62\x6c\xcd\xdf\xea\xd2\xd5\xe9\xe8\xcf\xff\x45\xf7\xac\x63\xde\x63\xf6\x9d\x12\x84\x8c\xe3\xc0\xef\x1f\x53\x0a\xde\x43\x0f\x0a\xfd\x5d\x8e\xcf\xd9\xff\xd6\x0a\x79\x74\x6a\x2c\x5b\xee\xdd\x3e\x67\x24\x99\x82\xf8\xb6\x09\x2e\xe2\xd3\x40\x47\xaf\x88\xa8\x1f\xea\xb5\xd5\x2b\x47\xd5\xb3\xf7\x6c\x20\x41\x72\x5f\x6f\x81\x32\x93\x05\x0a\xaa\x83\x4b\x01\xa3\xa5\x8f\x69\xaa\x4a\x8c\xa6\x1f\x5b\x74\x6f\x60\x0f\x3d\x45\x2c\x62\x82\xff\xdc\xa4\x42\x9b\x93\x38\x96\x7b\xa3\xa7\x26\x66\x90\xae\xc7\x5e\xbf\xbf\x7b\xe9\x8d\x99\x9b\x03\xed\xdc\x72\x92\x58\x1b\x0d\x69\xe3\x0a\x03\x51\xa1\x51\xdb\x70\x41\x2b\x0b\xfd\x43\xd3\xba\xa9\xd4\x56\xcb\x3e\x0b\x4f\xc1\x9c\xb0\x9e\x6c\xad\xcb\x6d\x3f\x3b\xe5\x13\x7c\xc7\xa8\xd3\x21\x9e\xc2\x03\x6e\xc6\x70\xed\x7e\xc5\x23\xb1\xb1\xc6\x87\xb5\x46\x53\x07\x88\x2f\xe3\x8d\x74\x72\xd0\xba\x87\xa4\x71\x86\x83\x09\xd2\xf7\x73\xff\x24\xc8\x7d\x39\xc1\x6b\x70\x8a\x4e\xd9\xaf\x43\xf7\x4c\x8d\x85\xcf\xe8\xab\x54\x06\x90\x7e\x94\x1a\x14\x97\x0e\x20\x9c\x29\xff\x7e\xd8\xa2\xf9\x35\xae\x41\x70\x9f\x27\x0d\x0d\x08\x55\x5e\xf7\xaf\x2e\xdf\xe4\x0d\xf3\x99\x22\x3c\x78\x5a\x43\xe7\xf3\x69\x15\x89\xe2\xea\x4c\x03\x6f\x11\xd0\x3d\x7d\x1e\xea\x14\xf6\x20\x03\x53\x25\xcf\x2b\x33\xba\xf3\x86\x39\x3e\x8a\x97\x2a\x7a\xf6\xcd\x9b\x85\x43\xb3\x2e\x25\x33\xd1\xfc\xc3\x17\x7f\xd9\x6d\x1e\x13\xbf\x8b\x68\xde\xb2\x22\xf9\x44\x97\x26\x5d\x3c\xcb\x34\x57\x51\xbd\x5b\x66\x90\x78\x08\x19\x98\xd6\x08\xca\x5f\xdc\x13\x48\x39\xd4\xed\x2b\xeb\xb2\x95\x2f\xea\x5a\x39\xc6\xf0\x33\xc1\x55\x8f\x69\x8c\xe4\x94\x6e\x4f\x6c\x08\xaf\x87\x4f\x27\x35\x7f\x87\x0e\xbe\xeb\x21\x99\x97\x6f\xfa\xef\xac\x95\x1f\x8e\x17\xfe\x7d\x08\x21\xe1\xb9\x2a\x90\xaa\x4e\x9d\xef\xd3\xfa\xfd\xa0\x52\xa4\x44\x47\x6d\xb1\xce\x38\xa9\xe1\x76\xe8\x41\x18\x9a\xbd\x8f\xec\xde\x0f\xbc\x5c\xb5\x5f\x51\x1f\x5f\xde\x07\xea\x97\xde\xb3\x9b\x7a\xa8\xdc\x84\xa3\x94\x6a\x6c\xf9\x26\xd3\x9b\x95\xc1\x1a\xf9\xd6\x4d\x98\xb8\x07\xf4\x70\x4d\x0a\x2b\xda\x97\xda\xd9\x88\x1a\xda\x1b\xf6\x63\x63\x66\xe6\x0a\x52\x2b\x48\x21\x04\x78\x61\xc7\xaa\xe2\x14\x6a\x02\xee\xf6\xb2\x5d\x51\x37\x1a\x0f\x17\xd2\x4b\xc1\x87\xdc\xdd\x05\xd5\x41\xc2\xf7\x22\x01\x42\x79\x15\xa3\x92\x8c\xd3\x78\x68\x91\x03\xac\x50\xb3\x3f\x87\xa4\x7e\x8c\xdf\xa6\x87\xa5\xf0\xaf\x8a\x56\x73\x1d\xab\xe6\x62\xf4\xf2\x83\x6d\xe0\xba\x8f\xaf\xd8\x6a\x38\x54\xbc\xa0\x12\xd7\x08\x8a\x00\xb9\x85\x4c\x2d\x3c\x70\x8d\xdf\x58\xfa\xa3\x55\xa8\x9a\xfc\x2c\x80\xf3\xf5\x33\x6d\xa0\x1d\x72\xa2\x77\x1a\x05\x58\x13\xfb\x35\x33\x0f\x7d\x2e\x01\xb1\xd1\x2d\xaa\x95\xed\x55\xd3\xbd\xc5\xdf\x77\x39\xcb\xc3\xca\x09\x7a\x41\xb6\xb2\xbd\x7f\x0f\xf9\xdd\x1d\x86\x58\x98\x3b\xa3\xff\x79\x20\xc1\x5f\x29\x2a\x1e\xf9\xfc\xad\xa1\xc6\x07\xec\xb4\x5d\x3a\x73\xc9\xff\xd4\x2f\x3e\x16\x02\x2f\xdf\xe1\x27\x44\x92\x63\x95\xf7\x4f\xb3\x11\x17\x93\xfa\x92\x81\x82\x1a\x66\xa0\x1d"}, +{{0x91,0x41,0xf7,0x9e,0xd3,0x0b,0xf6,0x00,0x61,0x1a,0x13,0xf3,0x67,0xb4,0x03,0x96,0xf2,0xec,0x83,0x9c,0x56,0x12,0xbb,0xf1,0xe6,0xe4,0x97,0xf8,0x39,0x54,0xbc,0x88,},{0xf1,0x4e,0xda,0x96,0x26,0x40,0xbe,0xcb,0x66,0xc4,0xd1,0xf1,0xa0,0x21,0x11,0x02,0x51,0x91,0x7b,0x8b,0x1d,0x34,0x82,0x82,0x98,0xd3,0x21,0x45,0xba,0xf6,0xe5,0xd9,},{0xcf,0x20,0x2d,0x7f,0x2f,0x9e,0xd1,0x17,0xf4,0x29,0x50,0x2b,0x2a,0x5a,0xff,0x54,0xa7,0xf7,0x51,0xd2,0x17,0x15,0x15,0xa4,0xd2,0x03,0x75,0x34,0x46,0xdf,0x0e,0xba,0xc8,0x69,0x84,0xc8,0x8b,0xd4,0x2b,0xd1,0xfb,0x8d,0xcb,0x40,0x87,0x76,0x72,0x2a,0x38,0xf3,0x2c,0xce,0xb2,0x5f,0x32,0xa2,0x5d,0x73,0x93,0xf1,0x38,0xee,0xdf,0x0a,},"\x8f\xec\xaa\x7a\xe9\xa3\xd4\xa4\x85\x1a\x66\x36\x2b\x36\x6e\x16\x7b\x9f\x43\x00\xfd\xab\x20\x56\x54\x75\x19\x87\xf0\x85\xde\x61\xbe\xc9\x34\x4a\xa8\x6f\x5e\x5c\x64\x77\x51\x4c\x28\x04\xce\xd7\xac\x0c\xd0\x62\x85\x29\xa3\xa1\x59\x92\x36\xed\x67\xbe\xbe\x1f\x2e\x95\xaa\x15\x1f\xe0\xf3\xb3\x01\x1a\x1d\x4b\xe9\x90\x1c\xaf\xab\x2f\x18\x91\x90\x4d\x4b\xff\x01\x28\xc1\xd3\x5e\xce\xcb\x32\x2b\x3c\xc0\x1d\xac\xc5\xae\x3d\xca\x69\x14\xa7\xd3\x4d\xa8\xc9\x65\x7b\x95\x0f\x89\xd1\xd6\xae\xc3\x29\x9b\xb6\x90\x11\x10\x71\xfa\x87\x28\x27\x74\x94\x3d\x96\xa4\xab\x7c\x3d\x6d\xe7\xd1\xbf\x11\x93\x63\x06\x8c\xc8\x2d\x45\xe4\xb7\x64\x54\xc6\x08\xbc\x35\x66\xb7\xf9\xb3\x85\xcc\x7e\xb3\x8e\xe4\x29\xaf\xc2\xda\x99\x66\x9f\xc5\xc1\xbe\x82\x16\x1a\x1b\x0c\x33\xf7\xba\x9a\xd4\x41\x9d\x20\x62\x97\x19\x01\xdb\x00\x3b\xfa\x23\xc4\x47\x14\x99\x5c\xb0\x6b\xfa\x96\x6e\x50\x23\xaa\x93\x46\xfd\x37\x5a\xe2\xa1\xe8\x40\x84\x31\x4d\xf3\xf0\x8c\xe2\x08\x00\xc2\xc2\xad\xfb\xb8\x13\x66\xf6\xb1\x04\x24\x3d\x62\xd5\x04\x1e\x72\x73\x43\x3f\x17\x58\x1b\xf9\x3f\x4c\x61\x46\xfa\x96\x6f\x63\x8a\xb0\x7e\xa1\x66\x94\xa7\xce\x30\x5c\xc6\x09\xa6\xe1\x06\x23\xff\x7f\x6c\x79\x16\xb6\xe4\xdb\xde\xbb\x7b\x52\xec\xa7\xf0\xd5\x18\x7f\xf6\x64\xd7\xc3\x70\xed\x22\x88\x6a\xa2\x67\x13\x29\xd9\x28\xe0\xa3\xbe\xa3\xb4\x71\x1a\x12\x8b\x9a\xab\x90\x26\x6f\x86\x51\xd2\x20\xb9\xcc\x1c\xbf\x5b\x1c\xe7\x26\x59\x31\x80\x36\x90\xd3\x29\x1c\x01\xea\xd4\xdb\xc3\x32\x9a\x97\xe8\x5c\x4f\xe1\xd3\x56\x60\x8c\xc9\xe6\x0b\x05\xbc\x14\x83\x8a\x86\x08\x27\x9a\x00\x61\xde\x28\xff\x7b\x8e\x81\xf5\x9c\x8a\x8c\x55\x23\x92\x4c\x4c\x48\x5e\x6e\xa8\x0a\xc8\x17\x50\xbb\x0e\x41\x9e\xfc\x78\x58\xcd\x4a\xf5\x0c\x8b\x8c\x80\x65\x0f\xac\xab\x4d\x82\x58\xf9\xca\xfa\x03\x10\xa0\x07\xcc\xcb\xc4\x18\x5c\x82\xfd\x14\x6d\xf1\xd8\x11\x87\x9d\xa3\x65\x0d\x57\x16\xf1\x00\x4b\x71\xd2\xc7\xf2\xbd\x65\x03\xc3\x54\x58\x9f\x86\x02\xc9\x50\xa1\xf5\x13\x9f\x81\x14\x60\x75\x28\x80\xa3\x41\x11\x66\x30\xe4\xff\x84\x94\x8e\x74\xa9\xeb\x35\x0d\x64\xd8\x29\x30\x02\x20\x02\x33\xf2\x09\xb1\x7d\x78\x89\x7c\x7c\xe6\xce\x29\xe2\x9f\x82\xd4\xad\x6c\x61\xeb\x79\xf5\x73\x9c\xb6\x68\xb2\x1a\x74\x55\x55\xc9\x6e\x19\x52\x68\x45\xe8\x2c\x6e\xd2\xb1\xc6\xbd\xd6\x36\x4b\x8f\xc7\x9b\xa9\xa3\x2d\xbd\x3f\x8b\x97\x5e\xb9\x23\x62\x39\x58\xae\x0d\xaa\x4f\xfa\x13\x92\x17\xc0\x0e\x02\x1f\x93\x7e\x9b\x79\x1c\x37\x99\x1a\x35\xe5\x23\x1a\x19\x14\xc0\x45\xa7\x87\x43\x2f\x97\xb8\xe2\x06\x3d\xb1\x05\xe1\x4d\xa9\x79\xc1\xc4\xcb\xa7\x85\x21\x0e\xb0\x20\x11\x33\x4b\x23\x0c\xfb\x68\x31\x99\x8c\xcc\xe2\x53\x86\xf4\xf3\xba\x0d\xce\x20\x06\xe9\xc3\x94\x0b\x4d\x5a\x56\xaa\xcc\xdc\xab\x02\x71\x86\x89\x81\x63\x60\xf1\x88\x52\xfd\x19\x98\xa9\x9f\xce\x9a\x04\xda\x3f\x5e\x23\xaf\x94\xc6\xe8\xa5\xba\xdf\xd3\x93\x04\xb9\xe2\xa3\x76\xa1\xf9\xba\xc0\x9a\x85\xbd\x04\x24\x76\xe2\x6b\x58\xec\x73\xf1\x23\x6d\x41\xab\x4b\x4e\x7a\x54\xde\xf9\xd6\x6a\x38\xf8\xe5\x46\xde\x7b\x38\x8e\x1e\x7d\x66\x81\xe5\xe2\xa0\x96\xf1\x60"}, +{{0x69,0x5c,0x96,0x0b,0xbb,0x0d,0xd5,0x7f,0xfa,0x36,0x15,0x1c,0x85,0xde,0x73,0x51,0x54,0xfe,0x5a,0xd5,0xf5,0xfc,0x77,0xd0,0x05,0xa0,0xa3,0x20,0x11,0xde,0xb3,0x0c,},{0x34,0x12,0x5e,0x4e,0x21,0xf7,0x89,0xed,0x0e,0x11,0x80,0xc1,0xf6,0x36,0x9c,0x72,0x1d,0xca,0xe9,0x85,0x9b,0x6f,0x7b,0x04,0xf9,0x57,0xe5,0x10,0x01,0xee,0xde,0x8a,},{0x4a,0xf4,0x1c,0x55,0x4d,0x99,0x08,0x12,0x68,0x6c,0x32,0x9a,0x87,0x5c,0x41,0xee,0x24,0xb4,0xa7,0xfd,0x7b,0x3d,0x4f,0x8c,0x8d,0x52,0x75,0xf2,0xe7,0xcb,0x24,0x2b,0x25,0x8b,0x58,0x58,0xa4,0x66,0xde,0x59,0x5c,0xe2,0xa2,0x17,0x7e,0x35,0x1c,0x7f,0x08,0xc7,0xfc,0x4e,0x0b,0xf9,0x7e,0xc5,0xfb,0x2d,0xcb,0x82,0x52,0xd2,0xc9,0x0a,},"\x37\x06\x69\x6c\x7a\x90\x66\x90\xd0\xd3\xb7\x1e\x7e\x21\x1c\x7b\x06\x71\x68\xf3\xa8\xf1\xed\x98\x4a\x0a\x5e\x60\x78\x59\x76\x62\xe4\xe7\x88\x9d\x52\xdb\x0f\x78\xe0\xd5\xef\x0e\x5f\x7a\x0a\x0f\x42\x63\xb6\x84\x8b\x07\x25\xca\xa4\xb1\xce\xa6\x98\x74\x09\x51\x1c\x8e\x5e\x98\x2d\x3f\x5b\x82\xbb\x56\xa4\xa7\x94\x71\x21\x93\x7f\x8e\x10\x5c\x5a\x14\xb5\x3e\x6c\x37\xcc\x71\x6b\x1e\xba\x92\x24\x21\x82\x8b\x04\x6f\x68\x56\xc4\x4f\xab\xf1\x3a\x75\x16\xc6\x2a\x5f\xf9\x85\x68\x45\x0c\xee\x78\xb1\x40\x33\x50\x47\xbf\x1c\xa7\x7e\x15\x49\xa8\x94\xfe\xeb\x07\x80\x45\xe4\x64\x18\x32\x25\x3b\xf6\x95\x48\x54\x52\xec\x36\x90\x65\xa6\x00\x29\xa6\xc9\x07\x7a\x37\x9d\xb2\x04\x85\xea\x2e\xdb\x6c\x96\x95\x47\xbb\x26\x53\x28\x9b\xc6\xe8\x1f\xfc\xb8\x4b\xdb\xf7\x73\xdd\xea\x4b\x37\x50\xe9\xa7\x23\x95\xd1\x17\xf6\x44\xb0\xe2\x20\x61\xd4\xf3\xbb\x7c\x5b\x61\x2e\x4b\x70\x39\x5e\x07\x79\x51\x6b\x46\x65\x91\x16\x90\x2f\xd0\xfb\xcd\x23\x40\xee\xa4\x5e\x9c\x23\xdb\x25\x64\xa5\xe1\x1d\xc7\x9e\x8f\x4b\x33\x2a\x44\x3e\xc3\x5a\xad\x96\x04\xfe\x79\x12\x52\x08\x82\x95\xe8\x4f\x65\xa3\x07\x31\x25\x50\xd9\xeb\xf6\x1f\x36\x7e\x4a\x0f\x2b\x56\x23\xe5\x3e\xf6\xbc\x13\x28\x25\xfc\x24\xeb\xee\x4e\xbf\x33\x8c\xbf\xb5\xdf\x69\xb3\x2d\x03\x0d\x44\x7c\x44\xf3\x13\xba\x96\xfe\x07\xbb\xfe\x5b\x01\x66\xea\xec\xbc\x61\x9b\xb6\xb2\xe5\x92\x40\x10\xba\x3e\xc1\x50\xff\x6a\x69\xfe\xc4\xde\xd9\xc4\x42\xf9\x8c\x15\xe7\x7f\x31\x9b\x48\x43\xb3\xb7\x48\xb5\xd2\x60\x89\xa7\x6c\x2b\x83\x4f\xf9\x3c\x41\x3e\x04\xca\x95\x50\xcd\x21\x1c\xe2\xd6\xa5\x83\xd7\x82\x57\x50\x66\xdb\x6d\xd3\x3e\x8d\x5e\x83\x74\x35\x5d\x06\x8a\x5e\xb9\x6f\x8b\x3d\xa8\xdd\xdf\xb5\xba\xf5\xc5\x96\xda\xaf\x55\x6a\x8f\x2c\xb5\x78\x1e\x50\x42\x32\x7f\x92\xae\x06\x21\xea\xe0\x88\xb5\xf0\x13\x59\x2e\x77\x87\x3a\x81\xd7\xe0\x68\xd7\xb8\x33\x7d\xb9\xf1\x09\xa8\x35\xb4\x75\xe5\xca\xf7\xce\xa5\xaf\x3b\x4a\xd6\xd9\x0b\xaa\xf1\xc7\x36\x55\xec\x67\x67\x47\xfc\xdd\x41\x77\x5b\x4f\xbe\x39\x24\xc3\xf4\x1d\x8a\x73\x75\x28\xd1\x2d\x61\x56\x65\x3a\x22\x35\x8c\x68\x21\x42\x6b\x2c\x0a\x33\xe1\x63\x4c\x62\xc7\xc8\x38\x56\x49\xbc\x23\x3e\x7d\xaf\x94\x39\xf0\x9d\xb9\xbd\x11\xea\x01\xe2\x8b\x77\xec\xbb\xc4\x59\x0e\x29\xfd\xcf\x0f\xdd\xe1\x52\xf6\x47\x81\x32\xfe\x4c\x3a\x5b\x45\xa7\x30\x5a\xf6\xe3\x81\xca\xdd\x72\x49\x6e\x66\xbb\xb8\x66\xce\xa4\x7f\x7e\x7d\x7e\x63\x34\x16\x00\xaf\x3f\x49\xce\x9c\x9e\x4e\x37\x39\x4d\xf5\xdf\x71\xdc\x10\xcd\x39\x1f\xdc\xb8\xa1\x93\xdc\x98\xfc\x19\x05\x9f\xa3\xac\x23\x0e\xc5\x47\x6b\xf9\x4d\x85\x55\x6a\xce\x6e\x1b\xa3\x24\x21\xbf\x59\xdc\xbe\x05\xc5\xe1\x5d\x34\xc6\x64\x4e\x27\xd0\xa0\x2b\xe9\x7f\xa8\x38\x7e\xe0\x37\x06\xf2\x2a\x8f\x4b\x3b\x40\x40\xad\x7d\x3f\x8a\x86\x97\x1a\x20\xa0\x9e\xc8\x1b\x76\x96\xd8\x34\xc5\x26\xb8\xe5\x1c\xb9\x7d\x27\x64\x3f\x9a\xbf\x5e\x29\xff\xd0\x33\x3f\x95\xde\x15\xd1\x10\xc2\x06\x4c\xa4\x94\x67\xc1\x4e\xf2\x27\xf4\xba\xbf\x1a\x55\xe7\xb1\xcd\xa0\x42\x9c\xff\x25\x6b\xe3\x1c\xf1\x16\x71\x9a\x81\xb9\xc5\xfb\x75\xfd\xf6\x4e"}, +{{0x25,0xcb,0x17,0xfc,0x33,0xd2,0xbf,0x83,0x84,0xae,0x4d,0xf2,0x0c,0x1f,0xad,0x5c,0x35,0xfd,0x76,0x5a,0xff,0xde,0x04,0xb5,0x25,0x6d,0x4d,0xe0,0x1c,0xa8,0xde,0x14,},{0xb8,0x6c,0xa3,0x12,0xfe,0x59,0x85,0x20,0xc6,0x4b,0xe5,0xc7,0x2f,0x5b,0x23,0x81,0x65,0x07,0xf6,0x9e,0x07,0x0f,0x82,0x8e,0x02,0xd2,0xaf,0xcf,0xe1,0x1b,0xfa,0x01,},{0x8c,0xcb,0x0d,0xbc,0xf7,0xcc,0x03,0xe8,0x3e,0x21,0xc5,0x74,0x74,0xaf,0xd3,0xad,0x88,0x98,0x09,0x7b,0x97,0x2e,0xde,0x17,0x5a,0xca,0xae,0x48,0xe3,0xec,0x17,0xb2,0xdb,0x06,0xfc,0x82,0x77,0x6b,0x07,0x51,0xc0,0xf9,0x56,0xfd,0x71,0x96,0xf3,0xd1,0xc9,0x63,0x21,0xa6,0xcf,0x3d,0x89,0x24,0x15,0xd8,0xf8,0xee,0xb4,0xa1,0x41,0x08,},"\x4b\x4a\x71\xcb\xf8\xcb\xaf\x57\xa7\x7d\x4e\xa1\x88\xa6\xf9\x64\x84\x0f\x0d\x71\x4a\x5f\x38\xa0\x95\xa1\x3b\x4e\x57\x12\x97\xa8\x8b\x79\x24\x17\xd1\x61\x84\x42\x7f\x90\xe0\x43\xdd\x8a\x55\xb7\xf1\xc1\x3e\x00\xdf\xa6\x05\x16\x44\x5c\xbe\x77\x06\x8c\x79\xc8\xc3\x5e\xbe\xac\x33\x0c\x33\xf1\x12\x1d\x05\x73\x1a\x8f\x51\x32\xd6\x48\x00\x73\x27\x46\x41\x19\x5a\x75\x20\x21\x16\xff\xf1\xc3\x18\x81\x71\x78\xfd\xd7\x68\xbb\xdf\x10\x5f\xa0\x69\xc7\xa3\xd1\x43\xfd\xf5\xd1\x7b\xfa\xd7\xc0\x62\x4e\x52\x92\x06\x8f\xd7\xbb\x6d\x30\x3b\x4a\x27\xcb\x20\xa4\xe6\x18\x75\x07\x67\x87\xd1\x9f\xa6\xf7\x29\xc9\x4d\xc0\xba\x9b\x8c\x0b\xfd\x98\x66\xda\x5c\xb2\xe7\xa2\xcd\x2e\xdb\xdc\x95\xac\x34\x9e\x5e\x5c\x21\x72\xe5\xa4\xcf\x7b\xd9\x0c\xab\xe2\xc6\xe2\x24\x59\x80\xbd\x72\xd0\xf6\xf5\x47\x98\x81\xe8\xc4\xc3\x54\xf6\x8a\xa7\x28\x41\xd0\xc7\x3b\x98\x6b\xa5\x10\x21\x20\x31\x61\x02\x6e\xe3\xd7\x29\xdd\xf1\xa0\x49\xff\xe9\xeb\x25\x43\x98\x02\xf0\x30\x11\xd1\x44\xe5\x0b\x02\xbd\x4a\xca\x5e\x55\x06\xd3\x2f\xcf\x69\xe3\x2f\x54\x25\x44\x79\x8f\x4e\x87\xf7\x2b\xdf\x24\x33\xb1\xff\x32\x59\x29\x2e\x1d\x90\x81\x2c\xff\xd7\x9f\x6a\x54\x32\x70\xba\xf2\x4a\x3c\x39\xdd\x35\x98\xe1\xc6\x61\x61\x29\x22\x52\x2f\x38\x7d\x51\x59\x76\x92\xf3\x14\xc4\xd5\xac\x4b\xf1\x88\x3a\x61\x46\x36\x33\x6a\x55\x44\xd5\x9f\xf4\x1d\x1e\x0d\xbc\xf8\xe6\x62\x7e\x7c\x80\x85\x64\x63\x22\xdf\xc2\x0c\x33\x2c\xbd\xf3\x53\x70\xd4\x7d\xca\xbb\x80\x2e\x17\xca\x84\x78\x0e\xec\x66\x1c\x90\x4d\x5b\xfb\xc2\x40\xad\x6a\x14\xa7\x53\x3f\x71\xa2\x75\x00\xc6\x1d\xd3\xe4\x73\x98\x38\x87\xa8\x68\x35\x18\x7a\xbb\x0d\xf0\x8f\xa6\x2c\xda\x69\xdc\xe8\x6e\x21\xfa\x5a\xe9\x54\xc2\x2e\xdd\xb6\x0e\xe3\x13\x15\x04\xa6\x9b\x50\x48\x6a\x17\x76\x70\x91\x88\x37\x60\x63\x8a\x29\xc3\x80\x30\xe1\xe0\x5f\xdb\x28\xe1\x58\x63\x30\x10\x38\x5a\x62\x06\x13\xcc\x10\xd5\xa5\xf3\x50\x95\x5f\x4a\x34\x7c\x65\xed\xdd\xb7\xe2\x51\x59\xda\x8d\xcc\x26\x55\x92\x8a\xd6\xf6\xd8\xc4\xc1\xab\xb8\x17\xd7\xfe\xf3\xba\xe5\xde\x04\x02\xed\xde\xe7\xb5\x15\x21\xce\x28\x0a\x66\xb7\x96\x14\x0f\x56\xaf\x9b\xc2\x0e\x46\x58\x75\xce\x26\x28\xa8\xa1\x04\x77\xce\x9b\x2e\xac\xc7\xd8\x6f\x88\x27\x24\x57\xbf\xd4\x43\xe7\x12\x52\x69\x96\x25\x43\x80\xf0\x13\x52\x27\xe9\xfc\x15\x1c\x86\x95\xe9\xcc\x64\xd2\x72\xb2\x56\xab\x95\xc9\xa9\xf5\x68\xe9\x37\x16\xe0\xe5\x3d\x29\x88\x2e\x3c\xe7\x42\x61\x25\x7a\x02\xcd\x49\x7c\x37\xd7\x64\xd9\x0f\x7f\xd4\x78\xa1\x7a\x89\x0a\x8b\x2e\xa6\x1a\xb8\x1f\x68\x69\xb1\x20\xa2\xf6\x48\x4a\x88\xc1\x51\x95\x33\x91\xec\xa4\x45\x01\x53\x77\xb3\xa5\xdf\xfe\x4c\xfb\xac\xfb\x5b\xab\x2c\x47\xf6\x54\xf7\x2a\x9d\x19\xcb\xc4\xd2\x95\x37\x19\x84\x05\xe3\xa0\x4b\x4b\xfe\x11\xbc\xdb\x5c\x1f\x30\xd9\xac\x02\xf5\x48\x49\xc5\x7a\xa9\x6f\x7b\x56\x63\x61\x16\xf2\xbb\x6f\x25\x83\xd9\xaf\x94\xc8\x6a\xff\x5c\x13\x7f\x63\xce\x54\xe8\xf0\xc2\x1b\x6c\x25\xc1\xf0\x47\x2a\x22\x9c\x90\x81\x7e\x61\x62\xea\xc7\x1c\xcd\xa3\x09\xa1\x64\x3b\xd6\x31\x2a\x52\x63\xa2\xef\xe6\x46\xdf\xfe\x79\xeb\xd8\x15\x7a\x28"}, +{{0x49,0xe2,0x4d,0x16,0x99,0x83,0x37,0x26,0xb1,0x8c,0x78,0xea,0x65,0x68,0x40,0x1a,0x97,0x1e,0x1c,0xa3,0x9d,0xd0,0x6d,0x75,0x63,0xac,0x8b,0x42,0x50,0xd4,0xa9,0xf5,},{0x71,0xcf,0x05,0xe9,0x0d,0x30,0x1a,0x6d,0x9f,0xad,0x7f,0x0b,0x38,0xec,0x8b,0xb0,0x44,0xfc,0xfd,0x97,0xc8,0x49,0xb0,0x4c,0x00,0x36,0x25,0xde,0x29,0xbe,0x86,0xbb,},{0xa0,0xb6,0xa2,0xaf,0x15,0xb6,0xbe,0x9e,0x95,0x1e,0xf3,0xf3,0x2c,0xbd,0x1c,0x67,0x02,0xe8,0xe0,0x17,0xfb,0xd3,0x15,0xa3,0xf2,0x59,0x9c,0x3f,0x1a,0x11,0x86,0x5d,0x46,0xe7,0x84,0x59,0xa0,0xd7,0xf7,0xbe,0x04,0x6a,0xae,0x29,0x3c,0xad,0x09,0x13,0x7e,0xc8,0x47,0xe2,0x69,0x28,0x10,0x6d,0x9a,0xa3,0x5e,0x09,0x82,0xb9,0x92,0x02,},"\x6d\x26\x05\xf6\x1e\x1a\x04\xb6\xae\x18\xc2\xc2\x5a\xe1\x00\xdd\x42\xa6\x1e\x66\x4e\x2d\xb5\xc3\x4d\x7a\xd1\xf8\x4a\xc5\x07\x55\x2b\x74\x1c\x20\x86\xc1\x7c\x85\x2b\xab\xe0\x7a\x91\xe1\x29\xa5\x06\xee\x59\xed\xb9\xce\x73\xbe\x1b\x1d\x06\xd1\x20\xec\x36\xa1\xe9\x4c\x62\x81\x05\x4e\x78\xce\xb1\xbd\xef\xfb\xcb\xf4\xf0\x10\x51\xed\x38\x1b\xfc\x8a\xd1\x76\x9f\x41\xe2\x40\xbf\x60\x59\xd9\x70\x4c\xac\xec\x66\x66\x11\xf4\x1e\x4d\xd4\x38\xb7\xf5\x02\x42\xea\x86\x75\x6b\xb1\xf8\x1e\x59\x42\xc0\x92\x12\x9f\xbc\x6d\xe4\x95\x5d\x28\xdf\xf3\x52\x37\xdb\x30\xe4\xa5\x03\x6a\x99\x14\xc9\xf8\x4d\xbd\x8c\xcf\x82\xba\x2b\x1b\x3b\x55\x54\xa2\xb7\xa7\x4c\xb0\xb2\xa1\xe1\x96\x33\x45\x28\x6e\x25\x8d\xc8\xe7\xd5\x67\x18\x03\x5f\x95\xf3\x13\x81\x1c\xfb\xd8\x52\xa0\xf8\xf4\x9a\x29\xef\x93\x3e\x7c\xda\x7e\xd9\xc7\xe8\xb1\x62\xcd\xba\x1a\x82\x26\x2c\xd4\xdf\x7c\xf8\xea\x4b\x58\x6d\xb4\x3d\xcc\x1e\x37\x64\x59\x8e\x9c\xa4\x66\x73\x82\x2b\xaa\x2a\xd8\x7f\xb1\x4b\x6f\xdb\x9e\x20\x32\xd0\xca\x51\xc2\x6c\x5e\xf3\xd9\xf7\x97\x85\xfa\xc2\x49\x1c\xdb\xf7\xc3\x99\xf3\xcd\x17\x74\xc1\xa6\xb1\xe4\xa6\x7f\x54\x36\xd8\x0d\xb0\x25\xf8\xfb\x64\x09\xe2\x75\xbd\x0e\xd5\x08\xb5\xe0\x39\xed\x2e\x4e\xec\x8b\x0f\x4d\x5b\xe9\x9d\xca\xfa\x6a\x14\x01\x25\x27\x32\xa6\x5b\x37\xc9\x43\xc0\x7e\xf3\xac\xbc\xfb\xb3\xdc\x06\xda\xd0\xa8\x8f\x2f\x5e\xb5\x51\xa3\x99\x7a\xd6\xc6\xee\xd9\x5e\xdd\x9a\x0a\xf4\xa2\x88\xd5\xe4\x32\x86\xb2\xac\x07\x29\x77\xc4\x36\xb7\xc5\xff\x7a\xb6\x1c\x94\x84\xf2\x57\xf5\x8e\x01\x0c\x9b\x6a\xd4\x15\x81\xd7\x42\xcd\x19\x75\x2c\xde\x54\xd2\xb4\x20\xd6\x43\x65\x4e\x90\x96\xa8\x1e\xb9\xdc\xf8\x04\xc7\xc2\xed\x0e\x38\xd1\x3a\x5c\xe3\x99\x78\xcd\xd0\x2b\x25\x35\x09\x45\xde\x78\xfe\xec\xc0\xc2\xc2\x2f\xfd\x70\x5c\x3b\xa8\x11\x32\x65\xc7\xb9\xa7\xc8\xdd\xb5\x91\x78\xbd\x21\xd7\xf6\xc3\x1c\x6b\xe2\xc3\x67\x49\xee\x0f\x9a\xb8\xbc\x1d\xcf\x5d\xa5\xcb\x2d\x2d\x59\x62\x35\x8f\x71\xf9\x6a\xb3\x79\x2a\x25\x2a\x51\x9e\x41\x53\x51\xf4\x3e\x7e\x12\x03\x5b\x03\x28\xf2\x82\x08\xcf\x4b\xe5\x29\xd2\x99\xaa\x5c\x12\x8c\x9d\x5e\xd5\x75\xbf\x90\xc5\x35\x05\x69\xea\xa6\xf2\xd5\x52\x1d\xe1\x18\x03\x09\xf6\x86\xc9\x7e\x9a\xd6\xfa\x1e\xc1\xdd\x86\x27\xae\x89\x51\x58\x1c\xf6\x04\xb8\xb9\x17\xc5\xba\x43\x4a\x63\x7b\xe1\xbc\x8b\x79\xf4\xac\xaf\x77\x95\xf4\xe5\x1a\xab\xdb\x88\x50\x77\xbc\x4f\x3c\x68\xfc\x33\x18\xde\x58\x23\xd7\xe0\x80\x4e\xe9\x95\xb7\x03\x87\x95\x0f\x79\x93\x53\x68\x23\x00\xd4\xe7\x97\xf3\xca\xd6\x11\xb4\xc5\x62\xc8\x64\x0f\xf2\xb3\xfe\x29\x29\x16\xa9\x70\xfb\x98\xc1\x47\x5c\x1f\x4e\x27\xb9\xb3\x3c\xfe\x0d\x3a\xd9\x32\xa1\xeb\xe6\xa2\x7f\xc3\xb4\x46\x62\x29\x54\xae\xe1\x68\x36\x68\xc8\xbd\x4a\x3f\x90\x3b\xe5\xc7\x7d\xfd\xb8\xe8\x91\x4c\xed\xc5\x1f\x65\xfe\xd2\xd9\xc4\xd0\x3e\x13\xa6\x68\xd4\xc7\xea\x5e\x31\x88\x3e\x1b\x3d\xb6\x43\x63\xe2\xac\x5c\xc5\x4b\x54\xce\x69\xc6\xad\x52\xf8\x74\x99\x9b\x5d\xd2\xc5\x78\x2f\x03\xc3\xd5\x15\x05\xdf\x53\x6a\x1f\xe0\xd8\x60\xd3\x3e\xab\xed\x64\x1a\x94\x00\x89\xf1\x29\x7d\xd0\xf5\x7f"}, +{{0xf8,0xff,0x97,0x03,0x2a,0x34,0xcf,0x99,0x99,0x08,0x80,0x58,0xaf,0x56,0xff,0x70,0xb6,0xac,0xb2,0xed,0xf7,0x59,0xe1,0x31,0xfa,0xec,0x84,0x40,0xfd,0xec,0xf6,0xc4,},{0x54,0x38,0xb4,0xe3,0x3f,0x1c,0x5e,0xa1,0x12,0xfb,0x1b,0xaf,0xef,0x40,0x59,0xbf,0x09,0x5a,0x11,0x40,0x9b,0x64,0xd4,0x6b,0xfb,0x4d,0x25,0x47,0x3c,0x1c,0x08,0x74,},{0x50,0x9e,0x9e,0xad,0xfe,0x8d,0xde,0x79,0x14,0xac,0x20,0xca,0xfc,0x0b,0x0a,0xf2,0x2b,0x84,0xdd,0x8a,0x21,0x0a,0x48,0x12,0xcd,0x8c,0xae,0x39,0xb0,0xa2,0x72,0xe5,0x3e,0x02,0x24,0x6d,0xc8,0x93,0x9e,0x92,0x26,0x92,0x03,0x36,0xe1,0x40,0xb3,0x15,0x32,0xd0,0x68,0x13,0x7a,0x34,0x16,0x1e,0x59,0x9a,0x86,0x94,0xa9,0x5d,0xdf,0x01,},"\xdf\xb4\x1f\xb9\xd5\x37\x02\xcb\x2b\x9e\x3f\xfc\xad\x4e\xa6\x02\x71\x6f\x71\x8a\x7e\xa3\x3e\x21\x84\x3e\x2a\x6c\x05\x2c\x70\xc6\xc5\x14\x85\xd7\x2b\x53\xa5\xbb\x4e\x34\xe0\x3e\x3e\x1d\x1a\x52\x51\x8e\xb3\xe7\xf1\x8f\x2a\x1e\x1c\xaf\x78\xac\xb2\x11\x60\x89\xbe\xd4\xc6\x17\x13\x8e\x71\x6a\x91\x43\x1f\x2c\xf6\x44\xa1\x21\x0f\x6d\x19\x20\xd2\x85\x99\x42\x64\xd6\x46\x6b\x0d\x8d\x2c\x62\x63\x80\x44\x61\x6f\x57\x6e\xdc\x7d\x0d\x93\xcb\x66\x01\x31\xd4\xbb\x50\x87\x5e\x15\x36\x40\x12\x3a\x96\xf1\x5b\x75\xa5\xbc\xee\x46\xd5\xcc\x5e\xb1\xa4\x31\xc5\x9d\x2e\xad\xdf\xd5\x53\x15\x02\xfe\xb1\x55\x1b\xf7\x79\x1c\xd5\x98\x9d\x17\xd1\x02\x96\xd0\x1b\xa3\xae\x3e\x38\x4c\x67\x45\x26\xca\xb6\x2a\x7c\x24\xc0\xff\x67\x7d\xe7\x1c\xa1\x72\x62\x1a\x28\xa8\x5e\x01\xee\xfe\x07\xf6\xee\xf9\xc3\xec\xfd\x7f\x94\x98\xac\x42\xf4\x6a\x43\x71\x6f\x61\x53\x18\xa3\xb2\x87\x57\xc3\xa1\x5f\x4f\x1c\x38\x22\xae\x7a\x75\xc2\x03\xa2\x98\x25\x8d\x75\x36\x38\xcf\x42\x5e\x15\xbb\xc4\x62\x02\xb0\x93\xb8\xe4\xf3\xe6\x70\xfb\xb6\x63\xdb\x2b\x69\xc8\xfb\x0f\x62\x50\x74\xd8\x5a\x44\xd3\x50\xe0\x42\xbb\x1b\x74\x02\x1d\x19\x29\x97\xa2\xc2\x7d\xd6\xc8\x63\x48\x41\xd1\x00\xa0\x34\x4b\xae\xd7\x50\xa3\x9f\xf5\xdc\xd9\x84\x8d\xfc\xf0\x9e\x5c\x8c\x47\x96\x7b\x96\x55\x6e\x23\x32\xca\x17\xd8\xe4\x2d\xd8\xf3\x93\xa5\x44\x5a\x37\x22\x44\x60\x0b\x30\x01\xb8\xfe\x86\xc4\x5e\xaf\xc6\xe7\x38\xaa\x7e\x11\x7b\x4a\x79\xfa\x2e\x6b\x00\xf4\x64\x92\x8d\x18\x56\xc8\x3e\xcf\xe8\x7d\xd3\x4d\x15\x8f\x5c\xb4\xe4\xf4\xd6\x10\xf5\x97\x17\xec\x79\x0b\xd3\xff\x87\x20\x40\xb6\x7e\x8d\x39\x39\xe8\x04\xe3\xb5\xdb\x98\x5a\x09\x56\x21\xcb\xcc\xd6\x86\xc0\x93\x4e\xce\x3e\x27\xab\x2c\x6c\xe3\x3f\xb5\x2b\x11\x1f\x48\xe4\xf2\x74\xbd\xf3\x20\xd0\xb0\x23\x84\xc8\x3c\x49\xe1\xa0\x41\xbd\x23\x19\x10\x9c\x85\xa0\x6d\x80\x48\xa9\x93\x35\x7a\xbf\xd8\x11\xac\x2f\x38\x05\x9d\x07\x7a\xcb\xc3\x6a\xa9\x66\xc0\x28\x90\x37\x48\x62\x5f\x92\xe8\xf7\x9d\x51\xbd\xa1\x0f\x78\x52\x29\x77\xf7\x6e\xc4\xe8\x85\xe4\x9a\x46\xc6\x8d\xe0\x9f\x3d\xa8\xf8\x6b\x71\xae\x64\x23\xbd\x29\xde\xef\x1c\xc6\xa1\x13\xea\xc1\x15\xa6\xcd\xe2\xcc\xd0\x11\xfc\x1c\x0f\x0e\x34\x27\xf4\x3c\x3e\x96\xfc\x41\x56\xed\xf6\x2d\xdf\xb7\xb0\x83\x6b\x88\x8b\xab\x3c\x43\x45\x05\x5a\x6c\x41\x78\xe9\xe2\x28\x29\xfd\x8c\xfc\xe3\x9b\x0b\x84\x44\xeb\x26\x48\x7c\xc9\xdc\x82\x60\x6f\xea\xad\xaf\x49\x78\x69\x4e\x65\x64\xf2\x72\x9c\x1b\x13\xab\x37\xc9\x07\x2d\xb4\xe9\xde\x94\x0e\xe5\xf1\xd0\x58\x84\xae\x7f\xd9\xd9\xec\x9c\xb7\xde\x56\x34\x76\x00\xa8\x8d\xea\x92\x08\xa6\x34\x19\xfc\xe2\x9e\xe5\x00\x55\xa3\x74\xa8\xf2\x2f\x9a\xe2\xbe\x98\x05\xa9\xf4\x76\x15\xaa\x59\x57\x6b\x44\x04\x2f\xf1\x26\xa8\x98\x24\xe3\x6a\xd6\xbc\x58\xe0\x6b\xb9\x0f\xbe\xef\xba\xe5\xd6\xd7\xd6\x24\x30\xf3\x73\xb6\x29\x6f\xbf\xcd\x4d\x66\x20\x16\x83\x53\x58\x3f\xbd\x3d\x5a\x29\x2b\x95\x72\x51\x75\x34\xe2\xfb\x0b\xee\xf2\xfa\x98\xa4\x64\xe5\x91\x03\xe7\xa0\x42\x87\xf1\x5d\xad\x0f\xac\x54\x97\x0e\x77\x15\x07\x8d\x63\xec\x26\x36\x2f\x6f\xba\xbc\xdd\xea\xf7"}, +{{0x2e,0x4c,0x39,0x21,0x9f,0xc9,0x2a,0x53,0x8e,0x48,0xe9,0x5f,0xbf,0xcf,0xef,0x30,0xf5,0xa2,0x1b,0x78,0x94,0x0b,0x81,0x05,0x3b,0xda,0xd4,0x60,0x2b,0x4c,0x96,0x90,},{0xf8,0xee,0xd8,0x92,0x17,0x66,0x20,0x43,0x4c,0x7f,0x0e,0xc5,0x3d,0xcf,0xf3,0x98,0x63,0x10,0x9e,0x7c,0xa4,0xd0,0xb3,0xc6,0xc4,0xb5,0x64,0x10,0xbe,0x01,0xe5,0x37,},{0x39,0x45,0x20,0x12,0x2b,0xb0,0xa5,0x64,0x64,0x8a,0x7a,0x8b,0xc8,0xdc,0x73,0x63,0x6c,0x51,0x77,0x46,0xa3,0xc8,0xa0,0x5b,0x90,0x1e,0x72,0x52,0xfe,0xf0,0xe5,0x02,0x3d,0x90,0x99,0x1e,0x31,0x1b,0x53,0x82,0xd4,0x91,0x00,0xe5,0x26,0x33,0xc7,0x0f,0xe9,0xc2,0x6c,0x14,0x50,0xe0,0x60,0x3e,0x6d,0x45,0x22,0x99,0xaf,0x4d,0xae,0x07,},"\xc8\x7d\x1f\xba\x9d\x94\xa6\xa5\x40\x89\x80\xfc\x80\x83\x98\x0f\xd2\xd2\x52\xfa\xe5\x40\xf6\xee\xc1\x9e\xd6\x74\x6c\x29\xe3\x39\xa1\xc2\x9f\x6f\x53\xbc\x23\xfd\x6b\xfa\x43\x85\x07\xef\xf5\xda\xf9\x03\x40\x3c\xda\x70\x7b\x4d\xc5\xe8\x44\x80\x5d\x6b\x1c\xeb\x4a\xff\xf4\xb2\x32\xe8\xe6\x9d\x7d\x27\x1f\x3c\x06\x7c\x48\x54\xf3\xd9\x4f\x27\xfe\x32\x55\x81\xfa\xca\x79\xd1\xf0\x2a\x26\x29\x0a\xd2\x3a\xf7\x11\x00\xc1\x2c\x09\x15\x76\x47\xca\x9d\xa4\x3d\x76\x90\xdd\xcd\x94\xdb\x65\xe0\x00\x98\x9c\x87\x8b\x75\xa0\xff\x22\xd2\xc7\x09\x62\x59\x4c\x9b\x08\x08\xf2\x78\x46\xcc\xac\x85\x67\xbc\xe5\xd2\xe3\xb7\x60\x28\x09\xf2\x3b\x59\xcd\x71\x8a\x08\x05\xd1\x08\xf3\x1a\x63\x2a\x05\xb8\xdf\xa5\x03\x5a\xb9\x46\x1a\xeb\xa4\x16\x00\x9d\x74\xfd\xf9\xe0\x07\x20\x28\x56\x89\x0d\x2c\xff\x80\xfa\x24\x0b\x97\x8a\x48\x27\x0f\xcb\x2f\x47\x36\x97\xbc\xba\x8e\x73\x0a\x55\xc2\x87\x61\x91\x9a\x23\xbe\x41\xda\x27\xff\xea\x09\xe3\x55\x9c\xaa\xab\xf9\x51\x9e\xc0\x8e\x1f\xfa\x86\x81\x7a\xa3\xe8\x87\x4f\xa8\x16\xe7\x71\x8c\x5b\x2f\x34\x49\x67\xba\x1b\xc2\x81\x9c\x4f\x04\x5a\x97\xb4\x05\x44\xea\x61\xd7\x17\x08\x3c\xca\xf1\x1e\x9d\xdc\x04\xa3\x59\x8e\xf1\x81\xe7\xbe\xf4\xac\xef\x45\xb6\x55\x1b\x47\x8a\x0d\x77\x31\xc4\xf0\x8c\xe5\x80\x2f\x78\x25\x8d\x41\x90\x17\x66\x10\x76\xd7\xd6\xd2\xef\x39\xe5\x7c\xf9\xcd\x93\x97\xdc\xc5\xde\xbf\x64\xab\x82\xb6\x61\x59\xf5\x78\x31\x6e\x74\xcd\x49\xf5\xad\x2c\x6f\xef\x83\xcf\x08\x68\x3b\x95\x70\xa9\x46\xad\x49\x03\xdf\x4e\x96\xec\x00\x8e\x14\xa5\x01\xfa\x93\x86\xbd\xaf\x2a\x63\x99\x3c\x6c\x9b\xdf\x23\x1f\xd0\x9e\xa6\xf9\x6e\xf4\xd4\xe2\x9a\x3a\x33\x27\xcb\xf7\x4e\xa8\x31\x05\x4e\x66\xca\x86\x68\x0c\x6c\xe5\x3b\x66\xf9\x46\x5d\x06\xb3\xfa\x07\x98\xbb\x69\x05\xae\x38\x45\x59\x34\xf2\xfb\x7e\x0b\xa4\x72\x32\x89\x89\xf0\x01\x30\x86\x71\xcc\xcb\x56\x6d\x22\x2c\x72\x16\x5b\xb3\xa7\x44\xfb\x98\xe2\x21\x0f\x96\x20\x68\x0d\xf3\xe3\xcd\x14\xa8\xbd\x94\xb5\x74\x5c\x00\x16\xdd\xa7\x7f\x05\x9f\x26\x05\x3b\x64\xcf\x45\x23\xc3\xd4\x29\x11\x2f\xb6\xb3\x28\x39\x8b\xc6\x30\xa2\xe9\x06\xb9\x5a\x6c\x57\x80\xcf\xdc\x06\x41\xbe\x47\x51\xbe\xbd\xdf\x77\x24\xdc\x9c\x27\xe7\x8d\x60\xed\x0f\xd7\x36\xd5\xab\xd8\x89\x29\xc1\x79\x5d\x47\x3a\xbd\x2b\x03\x20\xc5\x40\x47\x57\x28\x82\x18\x67\xa4\x09\xa2\xff\x13\xcc\x44\xce\x35\xe5\x98\x1e\x9f\x6b\x87\xa2\x8d\x4f\xa8\xb8\x67\x5e\x50\x3f\xae\xfc\xa7\xc1\xd7\x98\x47\x37\x87\x1f\xe9\x19\xac\x41\x4e\xea\x26\x5e\xe3\x1f\x9f\x78\xf5\x21\xf3\xf4\xf8\xd0\x0c\x3f\xb7\x91\x71\xf3\xc6\xa5\xdb\xf5\xe1\xac\x8b\xf6\x3b\x4c\x3d\x8d\x8b\xc1\x21\x03\x6e\x9e\x55\xbb\x70\x2e\xa6\xc8\x6e\x92\x5e\xc0\xb9\x84\xde\xd2\xc7\x1f\x3b\xfd\x49\x32\xe6\xc4\x1b\x58\x2f\xd0\x2c\xa5\x9f\x53\xce\x29\x74\x45\x78\x5c\xc4\xca\xc2\x47\xb0\xb8\x4e\x7f\xa0\xbc\xdc\xf7\x9b\x3e\x4a\x15\x5f\x98\x78\xc1\xf6\x43\xbe\x9c\x42\xf7\xa4\xf2\x72\x60\x44\x45\x05\xc1\x84\x5b\xd5\x3b\x55\x0a\x31\xd7\x95\x3c\xc7\x38\x86\x1f\x46\xbd\xf4\x87\x0f\x3a\x77\xac\xe1\x91\xab\xd6\x3c\x45\xad\xb1\x53\x90\x9f\xb5\x9a\xb5\xdb\x9b"}, +{{0xf0,0x92,0xe6,0xbe,0x8d,0x2d,0x9a,0xd0,0x69,0xa3,0xe2,0xb9,0x76,0xd2,0x44,0xe3,0x4c,0x15,0xc2,0x8c,0x48,0xd3,0x2f,0x55,0x60,0xa5,0x41,0x85,0xd1,0x50,0x15,0x02,},{0xcf,0xeb,0x3e,0x74,0xe4,0xb5,0xc8,0x35,0x6a,0x81,0x75,0x7b,0x8f,0x1b,0xe4,0xb4,0x29,0xfc,0x18,0xfc,0xaf,0x49,0x7c,0xbf,0x8d,0x8b,0xc0,0x48,0x0f,0xf9,0x78,0xf9,},{0x63,0xcd,0x4c,0x0b,0xa3,0xbe,0x93,0x97,0xcc,0x0f,0x3c,0x1a,0xf3,0x48,0xec,0x4b,0x8a,0x91,0xe4,0x2f,0xee,0x67,0x5d,0xa1,0xd0,0x59,0x00,0xb9,0xa8,0x6c,0x13,0x8f,0x91,0x74,0xeb,0x99,0x6b,0xbd,0xf3,0x1c,0x42,0x95,0xe0,0xc5,0x78,0xac,0x0f,0x9d,0x53,0x76,0x41,0xa2,0xaf,0xd5,0xdf,0xf9,0x3a,0x39,0xc5,0xcd,0x9d,0x3c,0x48,0x0b,},"\x2c\x25\x5f\xb2\x5d\x45\xb0\x86\xc0\x71\xe0\x3e\x52\x5b\x4d\x72\x85\x78\xfb\xb6\xb0\xc6\x0d\xa9\x41\xe6\xbf\x2a\x48\x98\xb2\xd5\xb6\x98\x8c\x53\x30\x27\x85\xab\x7a\x3b\xc4\xbb\x2c\x20\x5a\xcd\x27\xd6\xa4\xcb\xdd\x1a\x0c\x08\x89\xde\xd7\x84\x26\x4c\xb7\xc0\x28\x89\xc5\xc7\x11\x3f\xc9\x0b\xbb\xcd\x31\xff\x00\x14\x32\xc0\x53\xf9\x71\x07\x3c\xf6\x71\x2f\x66\x7f\xce\x46\x98\x77\x6b\x98\xcc\x54\x44\xc6\x92\xab\xd1\x28\x81\x98\xbe\x5a\xd5\x67\x46\x09\xf7\xe1\x39\xad\x1b\x9c\xcb\x94\x3f\x8d\xfd\x9d\x12\xc5\x4e\xce\xe2\x78\x34\x1b\x2e\xe1\x27\x79\x91\xca\x62\xcd\x3b\xfe\x12\x8d\x13\x92\x96\x4e\x95\x88\xe2\xf9\x7c\x32\x17\x04\xa3\xde\x10\x61\x88\xc5\xeb\x33\x5a\xa5\xa1\x9a\xcc\x90\x67\xb4\xa9\x41\x29\xb9\xd1\xa6\x16\x7c\x4b\xbf\xb5\x6f\xb9\x76\x84\xcb\xbd\x72\x0c\x86\x86\x9e\x00\x20\xab\x07\x76\xcd\xc9\x95\x4f\xeb\xa8\x62\x12\x4b\x07\x3f\xba\x8d\xe9\xea\x9a\x38\xea\xcf\xa0\x03\xae\x4f\x1c\xdc\xbf\x15\xc3\x2f\xb6\xb9\x70\xc7\x31\x15\xdd\xff\xcd\x4f\xa3\xb7\x18\x46\x11\x0e\xde\xc2\x57\xfc\xae\xd6\x11\x36\x04\xf7\x19\x25\x72\x57\x72\x64\xb9\x90\x5c\xa6\xae\xd8\xda\xec\x13\x84\x03\xca\x41\xaa\x95\x42\x78\xa5\x72\x0b\x26\x7b\x90\xca\x16\x3a\x9b\xdf\x44\x7e\xad\xe8\xde\xb7\x69\xa3\xb4\x92\x37\xa7\x35\x16\x97\x7c\x28\x73\x45\x55\xdd\x23\x4c\xa7\xde\x49\x99\x26\x1b\xc7\x96\x0f\x53\x6b\xa8\xa3\x5a\xd3\xd0\x2c\x75\xf1\xc2\xbe\xa0\xa0\x61\x2e\x7d\x49\xc4\x03\x97\xdd\x6a\xf5\xff\x58\xba\xe6\xa6\x4b\x6a\x77\xe9\x81\xf9\x2d\x15\x9e\x0b\x2b\xd2\x05\xab\x15\x70\x52\xf4\x70\x17\xa3\xe1\x8a\xec\x94\x4d\x04\x65\xee\x00\x17\xe9\x61\x48\xa6\x12\x9f\x74\xd3\xcc\xb4\x89\xfe\xa1\x3a\x15\xa9\xb9\xac\xed\x58\xc6\xee\x0e\x6e\x84\xe0\x5f\xda\xdf\xae\x07\xb3\x34\xa9\x8f\xc3\x7f\x7e\x51\x1c\xd5\xa4\x4e\x9c\x74\xe4\x78\xd3\x49\xe3\x0e\x29\xae\xb4\x6a\x4d\xf0\x1e\x43\x07\xfe\x65\xe1\x39\x4a\x75\x8f\x6a\xda\x2f\xb1\x20\x22\x5c\xcd\x50\xa4\x90\x13\xe6\xc9\xf1\x75\xaf\x90\xf3\xfc\x8c\x57\xe7\xa6\xa9\x69\xa9\x16\xc3\xf1\xaa\xcc\x22\xf3\xe0\x1a\x07\x0c\xc4\x8e\x6f\xd8\x78\xe2\xbd\x07\x3d\xf9\xee\x6f\x05\x9b\x98\x56\x84\x04\xfc\x7e\xae\x7d\x4b\xf6\xfa\x16\xc0\xc8\x03\xc6\xbe\x84\xe8\xb7\x9c\x67\xaf\xfc\x8c\x88\xca\xbd\xee\xbc\x11\x34\xbb\x23\x86\xe2\x2b\xa4\xd2\xe9\xe0\xf3\xe1\xab\x3a\x0d\xac\x7c\x80\xdd\xee\xd7\x73\xcd\xa0\xc4\x1d\xc9\xde\xfa\x67\xfe\xa3\x77\x69\xcb\x4a\x1e\x15\x22\xd7\xe0\xb3\xd7\xc4\x63\x8b\xcd\x98\x31\x53\xd4\x78\xbe\x5e\xcf\x2b\x6a\xb1\xb4\x01\x24\xe4\x22\x2b\x8c\xaa\x46\x47\xbd\x50\xd7\x4d\x20\x39\x43\xab\x20\x93\x8d\x5f\x27\xd9\x08\xa6\x73\x67\x40\x46\xce\x2e\xf1\x8e\x85\x8b\x0a\x01\xa7\xe7\x53\x0d\xed\x0f\x8c\xc8\x9e\xf0\x9b\x73\xca\x59\x7c\xf7\x3a\xfb\xc9\xa2\x71\xa4\xd2\x3c\x92\xfe\x59\x18\x83\xc4\x40\x10\x9c\x4e\xf4\x16\x67\x0b\x7f\x2c\x59\x05\xb7\x7f\x65\xf5\x6d\x09\xd4\x02\x50\x35\x6f\x9b\x1d\xbc\xaf\x1e\xe2\xc0\xb6\x36\x96\xf8\x4d\x68\xdd\xbe\xa1\x60\x08\x51\x51\xa9\x52\x62\x74\xd7\xb8\x46\xcc\xeb\x6c\x43\x48\x09\x84\x84\xde\x3b\xb7\x23\xae\x5e\x85\x27\x6d\xf4\x9f\x56\x34\x13\x0f\xf9\x05\x75\x4f"}, +{{0x01,0xa2,0x47,0x94,0x3a,0xfe,0x83,0xf0,0x36,0xb6,0xb6,0x0f,0x23,0xd9,0x77,0x74,0xfd,0x23,0x20,0x8e,0xdc,0x31,0xcf,0x3d,0x88,0x20,0xe9,0xdc,0x63,0x66,0x11,0x03,},{0x8c,0x97,0xa5,0x8b,0xe0,0xe8,0x47,0xc4,0x8a,0x6a,0x39,0x87,0xcf,0xe2,0x50,0xa8,0xd7,0xb0,0x7d,0x97,0xf9,0x61,0xf6,0xb7,0xb7,0x9e,0x7d,0x80,0x42,0xb8,0xbd,0x7b,},{0xed,0x2c,0xed,0x1a,0x4f,0xdd,0xb3,0x44,0x2a,0x63,0x73,0x48,0x17,0x9a,0x6a,0x5b,0xee,0xdc,0xb4,0x4c,0x8e,0x98,0x8c,0xa2,0x6f,0x78,0x93,0x6d,0x2c,0x8d,0xb5,0xc5,0x16,0xd5,0x4b,0x8c,0x4f,0x08,0xd9,0x1d,0xd7,0x04,0x2a,0xb6,0xab,0x26,0xd8,0x7f,0x23,0x0e,0xb2,0xb2,0x15,0x6f,0x3c,0xe2,0x99,0x4f,0xce,0x7c,0x2b,0x0f,0x10,0x0e,},"\x08\xd8\x14\x95\xda\x77\xf4\x07\x25\x5c\xc4\x1a\x81\x8e\xef\xa7\x27\xe2\xc4\x7a\xe4\x11\xf4\xb5\x41\xf0\x1f\x81\x1d\x90\x6d\x55\xfb\x1e\x3c\x9c\x48\x4d\xf3\x05\x65\x36\x4d\xe9\xdc\xb9\xfe\xa0\xaf\x66\x11\x2f\xe7\x5f\xd1\x1a\xe8\x1d\x26\x41\xb5\x47\x58\x9f\x8b\x97\x4a\x97\xe7\x97\x6e\xd6\x92\xaa\xd6\x40\xed\xd2\x88\xbd\x86\x3d\x11\xc4\xca\x98\x36\xf9\xd7\xc1\x15\xc3\xd9\x88\x30\xd6\x42\x47\xcb\x6f\x8f\xb6\x03\xc6\x98\x11\x33\x55\x2a\x32\x04\x04\x19\x61\xbd\xd8\x3e\x2f\x9d\xeb\xa7\x70\xc0\x39\x4f\x9b\x60\x2a\x45\x35\x51\x07\x49\x21\xa3\xde\x28\x32\x13\x69\xd7\xf8\xca\x64\x0c\x45\x10\x9e\x8f\x52\x2c\x97\xed\x9f\x35\xb9\x27\x7a\x35\x0e\x29\x59\x31\xb4\x2e\x01\x35\xe9\x4a\x92\xfe\xd3\x63\xd6\xca\xe3\x92\xf7\xc4\x51\x99\x32\x7e\x24\xb4\xcf\xa5\x89\x8a\xb5\x99\xae\x7b\xd5\x0b\xd3\xa0\x0c\x0d\x00\x7e\x95\xfa\xf8\xf2\xae\x10\x38\x02\xca\x7e\x53\xb2\x79\x18\x4d\x06\x90\x5f\x57\x48\xca\x8b\xe1\xf7\x2e\x66\x8c\xb8\x32\x83\xdd\x00\x40\x64\x91\xf8\xb9\xb4\xe5\xa9\xd4\xa5\x43\x8b\x2f\xa4\x37\x1e\x0b\x05\x68\x6f\x87\x57\x5b\xaa\x79\x6e\x30\x2f\x08\xff\xc4\x25\x66\x27\x50\xa3\x3a\x0c\x9c\xfa\xa4\xb4\xd7\x04\x1f\x92\x64\xfe\xd7\xbe\x4f\x9f\xde\x2c\xac\x68\xa2\x15\x82\x36\xf6\xac\x43\x04\x7e\x91\x1f\x4c\x4e\x8b\xc6\x63\xfd\xd5\x05\x17\xdf\xaa\x8f\xbc\xd2\x19\xdd\x7a\x0e\x93\x69\xf4\x3d\x0d\xd2\x5b\x4f\x0c\xf9\x30\xf2\x0b\x7b\x7c\x6d\xb9\xd5\xbe\x0c\x6e\x19\x60\x94\x1a\x3e\x04\xd1\x41\xc0\x3e\x59\x61\xaa\x33\xe9\x02\x44\x77\xd5\x33\xc9\x95\x37\x87\x96\xbf\x22\x92\xad\xe9\x22\x69\x5b\x14\x56\x9f\xc3\x39\xb3\xd9\x08\x5c\x63\xfc\x6e\x5b\xef\x4d\x99\x0c\x80\x33\x3a\x6b\x57\xaf\x47\x8f\x93\x8e\x3e\xe7\x38\xb1\xd1\x29\xbd\x97\x6a\xfe\x68\x61\x28\xbc\xac\x08\xcc\xbe\xb0\x34\x9b\x9b\x53\x73\x13\xbc\x7b\xf5\x91\xc6\x5d\x4a\x71\x23\xad\x30\xbd\xbe\x14\x86\xb4\x28\x08\x47\x48\xb6\x50\x7f\x6f\x5e\xf6\x7c\x26\xca\x86\x2c\xf7\x26\xaa\xc1\x40\xb8\x61\xae\x0d\xc7\x4b\xb3\xc0\xb4\x89\x78\x9f\x17\x14\x5e\x9a\x85\x5a\x3e\x2b\x5d\xaa\xc4\x18\xd8\x35\x37\x33\x23\x9e\xf6\x9c\x7b\x56\x5b\x53\x03\xeb\x87\xbd\x7f\x64\x9a\xbf\x40\xa2\xf1\x35\xa2\x9e\xd2\x7e\x3b\xe4\xc1\x2c\xd6\xdd\xd2\xe5\x41\x8a\x99\x97\x43\x83\x66\x3f\x58\x49\xbf\x3c\xe5\x53\x2b\xf6\x4a\x80\xaa\x52\x11\x91\xd2\x53\x90\xbc\x19\xa4\x5e\xed\x1d\x3f\xec\xa1\xd9\xfc\xc0\xdb\x03\x1b\xfb\x48\xe4\x50\xbe\x3d\x45\x93\x35\x6d\x5b\xa0\xf3\x10\x47\xb4\x57\x74\x5f\x21\xe3\x2e\xbe\xa3\xca\x6c\x35\xf0\x5d\x78\xd8\xc3\x16\x40\xb0\xfe\xcb\x94\x01\x16\x56\x75\xc7\xf9\xcb\xb1\x9b\xc4\xb5\x67\x7c\x2c\xce\xdc\x4e\x7a\xaf\xb8\x41\x84\xc1\x91\x99\xac\xa0\xdb\x21\xcf\x50\x67\xdc\x3a\xf7\x69\xbc\xc6\x29\x35\x5f\xf7\x25\x7a\x9e\xfd\x71\xa6\xa9\x2d\x13\x0d\x35\xab\xee\x6e\x70\x60\x5b\x5c\xab\x93\xc0\x28\xfa\xc3\xaa\x23\x44\xba\x86\x1a\xc1\xe8\xce\x9a\x4b\x07\x0c\x3d\xf7\x40\xd2\x8c\x5e\xce\x0f\x1b\xc3\x1c\x2d\x7d\x1e\x5e\xcc\x76\x10\x44\x80\x93\x91\x33\xa1\x86\x60\xe4\xa3\xe4\x84\x6b\x25\x17\xbe\x3b\x8e\x7a\xfa\xfe\x07\x83\x91\xd8\xaa\x8e\x5c\x30\x13\x7e\x85\xd9\x4d\x64\xa2\x79\xfb\xee"}, +{{0x91,0xfd,0xef,0xcd,0xbc,0x99,0x0d,0x3e,0x8e,0xeb,0x60,0x17,0x04,0x34,0xda,0x10,0x83,0x1b,0x03,0x08,0x1f,0x6a,0xfd,0x0d,0x7e,0x12,0xb1,0x00,0x11,0xe0,0x2a,0xef,},{0xc5,0x8d,0x3e,0x20,0xb8,0xd4,0x7b,0xa4,0x55,0xb9,0x12,0x57,0x2d,0xc8,0x40,0x81,0x5e,0x3d,0x88,0x5f,0xa5,0x91,0x7d,0x1d,0xa4,0x84,0x08,0xb9,0xa9,0x56,0x40,0x98,},{0x51,0x01,0x12,0x22,0x3b,0x33,0xa5,0xab,0x15,0x64,0xf7,0x53,0x71,0x91,0xcd,0x29,0x2a,0x9d,0xbd,0x5a,0x32,0x3d,0x7a,0xdd,0x05,0x84,0xc1,0xb0,0xad,0x00,0xd0,0xac,0x71,0x99,0xc3,0xfb,0x75,0x8e,0x91,0x3f,0xf3,0xd7,0x16,0xc2,0xe9,0x0d,0xd9,0x0d,0x4e,0x8f,0x59,0x95,0x1e,0x87,0xef,0x8b,0x78,0x21,0x4a,0x51,0x75,0xc4,0xe6,0x08,},"\x5b\x0c\x1a\x3a\x95\xe0\xba\x74\x74\x76\x6c\x9b\xad\xfa\xe3\x4a\xb8\x60\xe0\xa6\xc0\x33\xa2\x2f\xba\x72\x11\x27\xf5\xbb\xee\xe8\xe2\xcb\xde\x1a\x1d\xfe\xb1\x8d\x55\x1c\x95\x99\x4d\x21\xe3\xeb\xc6\x8a\xfa\xe6\x85\x44\x4a\x3a\x41\x95\xbc\x75\x55\x38\x90\x3a\xcf\xa6\x71\x55\x92\xdd\xe2\x56\xe7\xa1\xb4\xc3\x63\xec\xa7\x1e\xf0\xf3\xa4\x8a\xe3\x44\x2d\x50\xd5\x66\x1b\x39\x40\x96\xb7\xec\x27\xbb\xf5\x29\x53\xf3\x04\x0c\xd2\x5b\x78\xce\x47\x55\x27\xe0\xcc\x59\xf1\xef\x9a\xe2\xe0\x59\x04\x31\x58\x2b\x2d\xf8\x14\x14\x99\x82\x9a\x2c\x5f\x7b\xbe\x35\x98\xe4\xc9\x6c\xc0\x1e\xde\x2f\x43\xb6\x56\x05\xb4\x88\x59\x37\x09\xc0\x94\xb5\xa0\x42\xb2\x85\x55\xfb\x52\x27\xa6\xd1\x56\x37\x6f\x3f\xf0\x7b\xd5\xc8\xbc\x68\x04\xd3\x9a\x32\x82\xac\x59\x70\xba\x08\xae\xbf\x75\x42\xb8\x45\xf6\xb5\xc2\x38\xc2\xce\x20\x44\x3f\x7f\x77\x55\xd7\x5f\xe4\xfa\x16\xb9\x64\x4c\xa3\xe2\x1d\x91\xa9\xa8\x7c\x68\x61\x15\x74\x8a\x16\xc0\xae\x4a\xe4\xe1\x6d\x1c\x71\xae\x60\x0b\x39\xcd\x25\xe5\x63\x3b\x39\x9f\xee\x7f\xf2\xe3\x62\xbe\xd2\x51\x25\xc6\xfd\x5c\x7f\x5f\xfa\x2d\xa2\x35\x3f\xd3\x5b\x78\x4a\x1b\x1b\x03\x19\x77\x47\x58\xb7\x39\x0c\x44\xdc\xc9\x2f\xca\x42\x01\xdf\xe1\xa3\x75\x69\xde\x05\xf0\x66\x4d\x08\xb9\x0d\x6e\x2b\xad\xc2\x1b\x92\xf9\xce\x87\x21\x42\x35\x7b\x96\x15\x08\x0a\xb7\x65\x9a\x24\x6f\xf0\x85\x2a\xdb\x17\xdf\xda\x70\xcf\x17\x54\x15\x7b\x13\xbc\x03\x2b\x4c\x5d\xeb\x8e\x10\x68\xb4\x69\x2b\x93\x16\x5d\xa3\x5e\xfc\x9d\xa8\x6a\xcb\xe6\xf8\x0f\x01\xbb\xc2\x6f\x57\x5e\xc5\xaf\x5b\x05\x0e\x98\x28\xaf\xde\x6c\x3b\x78\xe7\x33\xeb\x5a\x91\x24\x92\xf7\x65\xbc\xad\x73\x1b\x95\xe3\xab\x88\x96\xb6\x17\x58\xbf\x91\x3b\x9a\x15\x68\xf9\xc5\xb4\x60\x33\xcf\x45\xdc\xc1\x75\x0d\xa2\x06\x6c\x60\x8d\xc3\xd3\x43\x73\x8e\x84\x8d\xc3\x90\xcd\x47\x44\x32\xe9\x91\xd7\xaa\x2c\x5b\x27\x81\x42\x1e\xfe\x55\xe3\x6b\x0b\x42\xc1\xf4\x9a\xe2\x77\x48\x0b\x0f\xc5\xff\x68\x5b\xb5\xa3\x1b\xe3\xa0\xfa\x44\x82\x38\x16\x07\x70\x37\x54\x8a\x5c\x9b\x0e\x1c\xc6\xc6\x35\x04\xa4\x07\x57\x9a\x36\x32\xb3\xc9\x6f\xcd\x0d\xe5\xea\x1e\x4d\x6e\x87\xc0\xca\xf7\xb6\xca\xe3\x12\x0d\xb8\xb1\xf4\x61\x5c\xe6\xa7\x5a\x81\x65\x4f\x39\x04\x28\xb6\x4c\x21\x3e\x72\x7e\xec\x3a\xe7\xf9\xf4\x2d\xb9\x06\xf4\xde\x1f\xda\xdd\x34\xa3\xda\x2a\xeb\x12\xb4\xd9\xa1\x85\xf4\xa6\x0c\xb0\xc2\x67\x45\xf5\x30\xb4\x81\xfc\x97\x6a\x09\x3c\xe2\x4a\x30\x91\x6a\xf6\x05\xee\x94\xb0\x87\x85\x19\x3a\x94\x9d\x56\x9c\x4b\x7e\xf5\x96\x03\xbb\x62\x43\x60\xe7\xb4\x08\xd9\x8c\xa5\x09\xda\xf5\xa9\x2a\x6d\x40\x15\xbd\xb6\xf9\x7a\xd4\xff\x0c\xf0\x5c\x8f\x0c\xd5\x47\x6a\x93\x44\x26\xa0\x59\xf2\x44\x44\x46\xe5\x86\x4f\x08\x9e\x0f\x06\x75\x61\x59\x10\x66\x2d\x7c\x1e\x79\xa6\xc7\x5f\xa3\x14\xb7\xba\x2c\x64\x3b\x0d\x37\x65\x3e\xef\xe5\x93\x17\x2d\x1d\x33\x2c\x8d\xd6\x44\x92\xea\xf1\x04\xfb\x19\x57\xba\xa5\x20\x49\x44\x2d\x10\xb5\x6a\xf8\xea\xe8\xff\x82\xcd\x8f\x46\xa0\x49\x4b\xec\x2f\xcb\x9f\xad\xf1\x0c\xf7\x1a\x6e\xec\xd0\x54\x7d\xaf\xdc\x7a\xdb\xaa\x45\x03\x78\x3f\x94\x3a\x46\xb4\xad\x0e\x6d\xd7\xf2\xca\xb5\x56\x17"}, +{{0xef,0x00,0xb3,0xc1,0x81,0xf6,0x32,0x7d,0x02,0x25,0x67,0x51,0xcb,0x51,0xc2,0xc3,0x6c,0x0c,0x0a,0x78,0x07,0x63,0x40,0x54,0x8f,0x5b,0xc0,0x70,0xd8,0x6d,0x9e,0x26,},{0xdb,0x14,0xcd,0x32,0x58,0x8f,0xd7,0x41,0xe8,0xf4,0x2e,0x51,0x21,0xcc,0x81,0x1a,0xd4,0x50,0x63,0xf2,0x81,0x41,0xe8,0x3c,0x66,0x8f,0x07,0xd9,0x12,0x28,0xf0,0x49,},{0x13,0x9f,0x9c,0xb9,0x9b,0x99,0x5b,0xe6,0x58,0x8c,0xdd,0xb5,0x05,0x16,0x94,0x83,0x8f,0x9d,0x82,0xa6,0x07,0x61,0xfd,0xe3,0x04,0xb0,0x02,0x7f,0xf8,0x65,0x84,0xbf,0x65,0xc7,0x3c,0xc6,0xd2,0x53,0xe5,0x60,0xf6,0x55,0x25,0xdf,0x04,0xbf,0xe1,0x46,0xc8,0x3b,0x42,0x26,0x9c,0xf3,0x78,0x0f,0x8b,0xc3,0x92,0x43,0x78,0x94,0xae,0x01,},"\x7d\x6a\xbe\xc7\xa1\x1a\xf6\x73\x24\xce\x17\xb1\xd2\x0b\xb4\x0c\x66\x8a\x21\x9b\xc9\x5d\xf0\x5e\x32\x5d\x86\xf8\x87\x95\xe2\x64\xd4\x54\xfc\x5f\xa7\xd9\xc8\xaa\xfe\x77\xe9\x0a\x6a\xf6\xb5\x74\x53\xd8\x5b\x97\x0b\x55\x2a\x85\x6b\xa6\x59\xab\x31\xbd\x8a\x66\x0e\xb7\xd3\x58\x7b\x45\x3e\x5c\x5f\xc6\xb7\x94\x72\xb2\x6e\x8f\xf7\xdd\x6d\xb6\xbe\x35\x72\x54\x8b\x0d\x75\x4e\xd4\xd9\x85\xb8\xd9\x96\x5f\x88\xb9\x52\xfc\x4f\xa3\xb7\x61\xcc\xff\xc3\x53\x54\xdb\x0e\xb9\xc5\xa1\x71\x71\x8a\x8a\x55\x92\x87\x02\x13\x82\x7d\x36\x91\xba\xe7\xfd\x9c\x63\xf2\x05\x03\xe0\x43\x19\xb5\xe9\x53\x57\x9d\xe4\x7e\x3e\xf8\xe1\x62\x85\x49\x50\x3c\xb4\xf6\x87\x1b\xa2\x5d\xb8\x73\x47\x08\x0e\x53\x1a\x51\x7a\x8b\x72\x21\xe6\xad\x84\xdf\xf8\x32\x56\xd9\xab\x9a\x43\x3d\xe8\x71\xb9\xcb\x9c\x50\x44\x58\x9e\x67\x20\x6b\x31\x7a\x52\x06\xae\xba\x96\xc9\x2f\xd6\x09\x40\x71\xc6\x44\xfe\x52\x65\x8d\xed\x92\x20\xcf\x6a\xbd\x50\xe2\x30\x5a\x1c\x90\xfd\x66\xaa\xcf\xb3\x8e\xb0\x5e\xaf\xf6\xca\x5f\x85\xf4\x29\xcd\x57\x71\x6e\xb8\x77\x39\xa0\x2b\x64\xcf\xfa\x08\xc4\xf6\x85\xb0\x03\x10\xb5\xb4\x84\x49\x20\xdf\x21\x5a\x9f\x24\xa1\x76\x13\xae\xf8\x5f\xec\x94\xf5\x11\xdc\x8a\x42\x94\xed\xdc\xea\x11\xc0\x8c\x0b\x39\x9a\x23\xd9\x16\x38\x3e\x29\xad\xeb\x98\xc6\x5d\x41\xc7\x05\xa5\x7f\x84\x05\x20\xfa\x80\x8d\x7f\xd2\x5f\xdc\xe1\x59\xf7\xa0\x84\xd0\x62\x97\x4b\x30\x13\x2a\x57\x12\x42\xba\xff\x41\x96\x24\x6d\x6d\x75\x7b\x31\x2e\x9d\x60\x85\x53\xd2\xdc\x53\xb6\x23\xb2\xe9\x5c\x75\x38\xfb\xc5\xde\xb6\x2b\xa7\x37\x76\xd8\x5e\x51\x18\xfa\x1a\x30\x2d\x4d\x07\x6d\x99\xe1\x00\xf0\xdf\x11\x9c\x33\xfc\x66\xcd\xfe\x6f\xd4\x4d\x71\x99\x7b\x78\xc8\xf7\x89\x0c\x70\x73\x46\x05\x62\x20\xd1\xe9\xde\x88\xbc\x17\x3c\xf0\xb7\x6c\xb3\x02\x87\x7e\xc1\x6a\xf4\x6e\x4c\x31\x63\x9f\x54\xee\xdc\x16\xda\x9d\x9e\xb0\xad\x95\xbd\xa5\x45\xdf\xc4\xa7\x32\xb6\xda\x98\x14\x13\x6a\xb1\xb9\x39\x2a\x07\x1b\x02\x24\x73\xb3\x49\x05\x57\x69\x8b\x77\xe7\x44\x7a\xc8\x59\x0d\xca\xf4\xf2\x42\xad\x3d\xfb\xc0\xdf\x71\x6c\xc0\xea\x75\x36\x26\x97\x3d\xf0\x8d\x93\x5d\x17\x8e\x33\x12\xfb\xe2\xa7\xba\x9c\x50\x93\xc5\x3b\x92\x55\xea\xca\x29\xb7\x25\x78\xe3\xba\x1b\xdf\xaf\x0c\x9e\xce\x21\xa5\xdf\xf6\xea\x42\x15\x24\xf7\x0f\xc1\x90\x4e\x9a\x2c\xf7\xc5\x18\xbf\xcc\x7e\x36\x73\xee\x87\xff\x27\xe1\xca\x2a\xc3\x2b\xcb\x40\x91\xcb\x34\xa8\x2a\x71\x56\x3f\xf6\xa6\xa1\x5d\xa0\xeb\xd5\xbd\x10\x25\x6c\xe9\x60\xf4\xea\xa7\xfe\x35\xe1\x28\x88\x60\x50\xd0\x49\xfe\xc3\xa4\xab\x16\xd5\xb0\xc1\x07\x26\x7e\xae\x1a\xb8\x01\xea\x5b\x91\x98\x38\x39\xda\x1c\x48\x8c\x12\xf8\x64\xd7\xc3\xa7\x7f\x2b\x6a\xe2\x7d\x54\x01\x09\xf6\x8d\x78\x36\x4b\xb6\x27\x18\x3b\xd5\x03\x91\x75\x47\xaa\xf3\xb3\xa1\x80\x9d\xa0\x25\x77\xb3\xf0\x3a\x9a\x3f\x5a\xf4\x8c\x88\x02\xe2\x97\xc8\xbb\x63\xdb\x6a\x86\xd3\xea\x72\x7a\x6d\x71\x48\xb3\xaa\x44\x4b\x8d\x16\x8f\x38\xc6\xc8\xf2\x40\x88\xa4\x9a\xf3\x31\x77\xa3\x44\xad\xab\x2c\xf6\xe0\x8e\x0c\xb0\x37\x1e\xd5\x2b\xde\xad\x13\x2f\x77\xe7\xae\x3e\xe5\xd8\xfb\x17\xaf\xc0\xa0\xbb\x73\x11\xb9\x56\x0b\x67"}, +{{0xd0,0x71,0xd8,0xc5,0x57,0x8d,0x02,0x59,0x49,0x93,0x2a,0xa6,0xbf,0x6a,0x80,0xb1,0xcc,0x41,0x2f,0x10,0x6f,0x91,0x57,0x4e,0xe2,0x46,0x54,0xb4,0x45,0xee,0x9a,0x97,},{0x9b,0xcb,0xf7,0xd2,0x21,0x2f,0xb6,0x2c,0xcc,0xf8,0xb6,0xc7,0x68,0x03,0xa5,0xea,0x24,0x40,0x9d,0xa6,0x28,0x7e,0xfb,0xb8,0xb1,0xf0,0xc7,0xb3,0x0e,0xbd,0xd9,0x3e,},{0x0c,0x29,0x7a,0xbe,0x0f,0xd8,0xeb,0xcc,0x6b,0x77,0x19,0x98,0x75,0x5e,0x2c,0x6b,0xe0,0x7c,0x81,0x2b,0x5a,0x80,0x54,0x49,0x57,0x06,0x31,0x70,0xca,0x69,0x43,0x2e,0x72,0xb6,0x0d,0xaa,0xe3,0x22,0x95,0x8a,0x22,0x38,0xcd,0x6a,0x46,0x28,0x94,0xa3,0x87,0xee,0xf6,0x5b,0xf9,0x6f,0x63,0xf5,0x4c,0x08,0x56,0x87,0xa5,0x02,0x75,0x0e,},"\x3e\x8e\xe7\x0e\x51\xe5\x6e\xf5\x7f\x6e\x66\xb3\xa8\x84\xaa\x04\xa7\xb4\xd4\x59\x9f\xb9\xb4\x39\x96\xb3\x93\xa8\x68\x09\x35\x12\xea\x74\x1a\x0c\x6a\x94\xf4\x0c\xe4\x98\x62\xd2\xfd\x1f\x75\x51\xf4\x64\x7a\xbd\x80\x75\xbc\x1b\x74\x2a\xd4\x0e\x29\xa6\x04\x61\x30\x12\x24\xfe\x8f\x76\x92\xb1\x47\x72\x78\x2b\x4e\x89\x6b\x63\xfe\x05\xab\xd5\xff\x53\x14\xf9\xec\x80\x75\xf2\x8d\x90\x8c\xca\xaa\xce\x5e\x90\x5e\xa7\xf5\x7a\x49\x1b\x99\xb3\x59\x1e\xea\x54\xa6\xb7\x81\x91\x67\x74\x9d\x38\xa0\x47\x62\x06\x76\xa1\xa7\xaf\x11\xf4\x85\xa5\x5b\x7c\x87\x9e\x68\x50\x38\x08\x58\xc8\xf4\x5c\x0c\x1c\xcb\xd7\x40\x6e\xd0\x99\xd8\x4a\x74\x71\xb9\x35\x0c\x4d\xdb\x28\x47\x0b\xf5\xbf\x32\x7d\x5b\x3c\x22\xd8\x99\xb4\xc6\x60\x83\x9e\x10\x4a\x06\x22\xae\x85\xc8\x4a\xa9\xfc\x7f\x0a\x2c\x7c\xeb\x6e\x69\x1c\x49\xc0\x64\xb5\x31\x34\x99\x68\x3e\x8e\x03\xb2\x11\x5e\xda\x7d\xda\xd5\x5a\x49\xf9\xfb\xe6\x25\x44\xf9\x14\x51\x1c\xfb\xec\x6b\x84\xdb\xde\x7e\x80\x90\x9b\x45\xfb\x10\x50\x2e\x2c\xaa\xa7\x21\x24\xfd\x94\x56\xa3\x87\x2f\x95\x92\x70\x7e\x9a\x4c\x50\x12\xda\xa9\x72\xea\xf6\x5f\xab\xe5\x53\xde\xbe\x82\x57\x01\xef\xef\x5c\x75\x6b\xb4\x65\xe9\x66\xab\x68\xdd\x52\xf3\xdd\x00\xa4\x5c\xf6\xdc\x3f\x19\xb8\x6b\xb0\xdb\x4a\x86\xe4\x66\x98\x85\xa0\x74\x69\x6a\x67\xd8\xea\x21\x18\xc7\x66\xef\x62\x5f\x8a\x98\x02\x6f\x9f\x4a\x3c\x5c\xcc\xf9\x84\x6f\xdc\x90\xed\x93\xec\x7c\x1f\x3c\x70\x86\x95\x4f\xa2\xf0\xa4\xca\x96\xd4\x01\x84\xaa\x57\x54\x55\x27\xa1\xf9\x65\xc1\x1d\x84\x3c\x90\xc5\xa5\xe0\x8d\x7c\x11\xf2\xd5\x61\x00\x4e\x90\x57\x48\x52\xeb\x50\x46\xaa\x1e\xa7\xb6\x10\x09\xfd\x5d\xd7\xd6\x24\x2a\x8d\xf5\x8a\x9e\x8e\x55\x5c\x7f\x4c\xdc\x13\x0d\x69\x01\xbf\xe6\x79\x7f\xdc\x6c\x39\xbe\xec\xfb\xba\xb6\x62\x5b\x2e\x4f\xb9\xd8\x00\x02\x76\xd4\xa9\x4f\xc6\xfc\x10\x51\xfe\xff\xf5\xad\xeb\x72\x4b\x87\x09\x0d\xb0\xa2\xc6\x97\xd0\x56\x66\x4d\x99\x1f\xad\x80\xdc\x80\xfa\xb7\x00\xb1\xf1\xf2\xee\x27\x73\x4e\xbc\x26\xb2\xa6\x41\xc3\x2a\x0c\x91\x1b\x27\x0a\xc7\x6b\x0d\xa5\xc0\x89\x14\x97\x1c\x91\x12\x46\x3a\x70\x70\x9c\x0d\xda\xc7\x91\x00\x16\xf9\x13\xf6\x21\x00\x86\xd7\x25\x5c\xef\x11\x95\x57\x10\xf6\x51\x88\x9c\x83\x62\x1d\xd8\xa4\xfc\xd5\x36\x63\x02\xd6\xc9\xb5\x6e\xef\xcf\xac\x85\xc1\x4a\x94\x78\xb6\xd7\x18\x07\x54\x28\x80\x07\x60\x51\x5c\xab\x5f\x3d\x44\x55\xe2\xb9\x70\xdf\x9f\xe4\xbe\x83\x83\xd7\x04\x83\xbb\xdd\x75\x60\x71\xf5\x3b\x2f\x9c\x27\x5c\x7c\x85\x12\xd1\x63\x51\x8f\xe5\x55\x83\x75\x14\xc8\x67\x76\xc9\x47\xf2\x9a\x77\x57\x02\x87\x44\x6b\x69\xbe\x40\xc8\xd4\xab\xbd\x65\xef\x25\x07\x24\x9b\x5a\xec\x33\xac\xb7\xb8\xbd\x3f\x35\xbc\x85\x9b\xa4\xe3\x7b\xdb\x49\xcf\x91\x3d\x93\x98\x9c\x44\x38\xd2\xab\xcf\xa3\x88\xcc\x89\xd7\x8a\xc0\x62\x70\x65\x64\x92\xe7\x52\x8f\x29\xbd\xfe\x8c\xbb\x9b\xfa\x9e\x73\xc1\xda\x01\x3f\xc3\xce\x21\x05\x65\x76\x13\xff\x62\xbb\x0c\x3b\xf4\xde\xe3\xb0\xd2\x65\x9c\x72\x6e\x7b\xcd\x9e\x97\xec\xce\x92\x47\xd4\x60\x0d\xfe\xaf\x60\x44\x4e\xd8\x62\xb0\x0b\xa1\x1e\x70\xea\x88\xd4\xf0\xb6\xb5\x39\xfc\x9f\x36\xbb\x2a\x1a\x9e\xd2\xb3"}, +{{0xe9,0xd4,0x86,0xc2,0x9a,0xe8,0x11,0xb9,0x42,0xe1,0x0d,0x81,0xf0,0xa6,0x71,0x63,0x17,0xb8,0x42,0xc2,0xc5,0xbf,0xde,0xf5,0x5c,0xc4,0x32,0xb7,0xfc,0xae,0xb8,0x18,},{0x43,0xa5,0x2d,0x15,0xb9,0xf7,0x31,0xd7,0x37,0xb1,0xc4,0xdb,0xc3,0x22,0x27,0xa4,0x80,0x96,0x30,0x91,0xd2,0xc6,0x28,0x6f,0x48,0x2e,0xf1,0xe8,0x36,0x70,0x54,0xe5,},{0x65,0x19,0x1a,0xa8,0x85,0xdd,0xab,0x9f,0x67,0x27,0x18,0x79,0x95,0x2f,0xc6,0xaf,0xfe,0x41,0xca,0x20,0xeb,0x3b,0xcd,0x86,0x67,0x31,0x61,0xb0,0x3b,0x53,0x26,0x94,0xd6,0xdd,0x88,0x90,0x8e,0xb1,0xb1,0xee,0xc0,0x03,0xcf,0xcb,0xe6,0x14,0x6b,0x45,0x38,0xe2,0x1d,0xf5,0x59,0x69,0x91,0x2a,0x0d,0x7d,0x88,0x18,0xad,0x79,0x59,0x0d,},"\x14\xfe\x1e\xd5\xbb\xbd\x76\xcc\x73\xdc\x56\x50\xbd\xa9\x2d\xe8\x63\x26\xe2\x4d\x2f\x1f\x62\x24\xba\x85\x68\x94\x4d\x6f\xe3\x44\x26\x75\xdb\x96\xf1\xd8\x49\x8f\x16\x34\xff\x9b\x6e\x50\xcb\xa9\xdb\x4e\xb0\xb0\xb0\x21\xb2\xbe\xcf\xce\x4b\xef\x33\xc4\xce\x0e\x32\xc8\xa9\x83\x89\xec\xa9\xe0\x59\xa6\x62\xd6\xf0\x37\xc5\x4a\xa4\x0c\x76\xcd\xee\xe8\x56\x50\xf0\x89\xea\x56\xe1\x38\x3a\xb0\xf5\xc3\x6f\x6d\x66\x45\xff\x7e\x87\x66\x73\x01\xf9\x44\xfd\xc2\xed\x35\xb0\xd2\xc3\x5c\xb2\xe4\xb4\x56\x36\xe7\x49\x8e\x92\x7f\x58\x46\xb3\xe1\xed\xfb\xd1\x60\xa4\xae\xf3\x32\x0c\x34\x28\x49\x6b\xda\xaf\x7d\x3e\xd5\x6e\xf0\xb7\x25\x4a\xc5\x97\xbe\x58\x9a\x70\x58\x44\x16\x30\x0c\x1a\xdc\xfb\xa4\xf2\x2c\xfd\x4c\xd6\x61\xe1\xf5\x0f\x15\x5d\x17\x2f\xa5\x74\x8d\x29\x6b\x29\xcd\xd7\xeb\x81\x21\x48\x3f\xf1\xd9\xfe\x95\x3f\x94\x51\xc7\xc7\xa5\x42\x00\x72\x85\xee\x72\x46\xbc\x0f\xde\xa9\x38\x81\x40\x29\xab\xce\x05\x7a\x0e\xcb\x97\x4b\x12\xd3\x60\xea\xb6\xaf\xd3\x07\x97\xd6\x14\x45\xad\x2b\xac\x7e\x52\xbc\xe4\x34\x63\x15\xf7\x8e\xb8\x75\x42\xd5\x95\x28\xb2\xf6\xc5\x6d\x66\x24\x1c\xb4\x42\x03\x3f\x64\x3d\x3d\x2a\x67\xcb\x63\x7d\x8d\xa9\x5d\x4f\xd1\x23\x4b\x03\x1a\x3e\x51\x72\x3a\x1d\x26\xe6\xf5\xca\x07\x98\x73\x21\xad\x11\xa9\x0f\xcc\x1d\x4e\x2b\x0b\x89\x66\x50\xc3\xa7\x51\x8d\x56\x55\x29\xbe\xa8\x06\xa0\x5d\x44\x7e\x08\xd2\xa6\xa3\xdb\xf1\xa3\x69\x15\xb2\x95\x7c\xa5\xb4\x0e\x58\xb9\x7a\xd0\x36\x97\x35\xc4\x28\xbd\x6d\x69\xbd\x21\x00\x44\xb6\x51\x41\x8d\x98\xb0\x59\xd9\x0c\x83\xe4\x60\x11\xf4\x1c\x03\x2c\x56\x55\xa5\xef\x21\xac\x2c\x8c\x2b\xc9\x4b\xe0\x7e\x45\x42\x6a\x7a\xe5\xd4\x7b\x45\xf2\x7c\xf4\x28\x9c\xa4\xdd\xab\xe0\x8a\x12\xb9\x10\x20\x7d\xab\xb3\x4a\x46\xab\x75\xce\x69\xb5\x8e\x7e\x17\x66\x4b\xf3\x35\x9a\x8f\xb6\x8e\xb0\x32\xc9\xea\xa6\xdf\x87\x38\x29\xf0\xe0\x84\x85\x53\xf7\x32\xe1\xc3\xc0\x84\xb3\x2b\x7a\xf7\x50\x74\xe7\xbb\xaa\x4e\xb5\xd7\xea\xd7\xaf\xf9\x75\x80\x10\x9b\x60\xf4\xc7\x92\xf9\xe2\xa6\x51\x37\xb0\xaa\x48\x17\x5b\x81\x15\xd9\x13\x05\xf4\xc7\x7e\x2d\x08\xe7\xe8\xd7\xe7\x78\x5c\x96\x68\x42\xc2\xe3\x50\xfe\xd4\xf9\xe3\x3b\xf6\xe1\x84\xc5\x50\xb4\xb0\x6e\x95\x74\x14\xed\xf5\x2f\xa0\x79\xe8\x19\x73\x45\x84\x61\xfb\xb9\xb7\xd7\xd3\x4b\xef\x15\x03\x57\xf4\x32\xca\xac\x3a\xe9\xf3\xdc\x96\xeb\x5a\x2d\x12\x3e\x09\xed\xa1\x70\x2e\x1d\x10\x70\x17\x7b\xb2\x20\xc4\x23\xc0\x96\xec\x24\x42\x43\x85\xc6\x79\xbe\x02\xef\x84\xd0\x9e\xd1\x02\xf4\x9c\xad\x3b\x1f\xd6\x70\x67\x9a\x39\x71\x4f\xf1\xd6\xe4\x22\x8d\x8d\x7d\x0e\x19\xed\x0e\xba\x13\x2f\x21\x28\xd4\x7b\xaa\x56\x9a\x8e\xcb\x7b\xd4\x8a\x82\x62\x82\xf9\xcf\xcb\xf6\x0d\xde\xce\xaf\x1d\x02\x13\x2c\x8a\xff\xed\x3a\x03\xd2\x34\x0d\xeb\x78\x7c\xd6\x49\xc5\x1c\x6e\xcb\x9f\xf7\x5d\x7a\x7b\x4e\xf9\xb1\x51\x39\xcf\xea\x27\x62\xab\x18\x61\x51\x97\xa6\xb5\x1f\x6e\x75\xdb\xd0\x45\x73\xa2\x44\x80\x94\xd0\xcd\xeb\x0f\xe4\x58\x58\x83\xff\x9b\x68\x82\x4a\x04\xb8\x3e\xc9\x1c\xf8\x4a\xcd\x6a\x74\x46\xcb\x1f\x5e\xe3\x7d\x5d\xf8\x0f\x17\xcb\x2b\xdc\x3f\x31\x22\xa8\xfa\xf7\x6e\xbd\x06\xcf\xe8\x17"}, +{{0xe6,0xfa,0x10,0xdb,0xb4,0x78,0xe1,0xe3,0x6b,0x35,0xdf,0xeb,0x02,0x50,0xf6,0x3c,0x08,0x51,0x50,0x70,0xae,0x79,0xb2,0x2f,0x04,0x7e,0x27,0x17,0x08,0xd6,0x4f,0x5c,},{0xe0,0x2e,0x1f,0x2b,0xd8,0x79,0x2e,0xf4,0x83,0x48,0x1c,0x6d,0x11,0xf7,0xc7,0xc9,0xdb,0xde,0xec,0xc9,0x85,0x94,0x32,0xe7,0xf2,0x79,0xe9,0xd1,0x73,0xd3,0x11,0x64,},{0xc0,0x3c,0x47,0x03,0x59,0x12,0x7e,0x9d,0xe3,0xaf,0x0e,0x0e,0xd7,0xd3,0xb1,0x9f,0xae,0xe0,0xec,0x14,0x0b,0x79,0xc2,0x99,0xe2,0xcb,0x6d,0xac,0x0a,0x3e,0x7e,0x31,0x41,0x41,0xcc,0x85,0x4b,0x45,0x96,0xce,0x4c,0x51,0xc7,0xb0,0xde,0xc8,0xa5,0xc8,0xcf,0x09,0x36,0x20,0x53,0x61,0xd5,0x36,0x5f,0x4b,0xcc,0x07,0xc4,0x28,0x7c,0x07,},"\xad\x31\x60\x75\x8d\x8c\x08\xa6\x61\x52\x5c\x95\x28\x0a\x37\x18\x87\x49\x69\x85\x9f\x1c\xc9\x18\xe3\x4f\xec\x00\x8a\xcf\x23\xb8\x89\x6e\x8d\x50\xc3\xc0\x51\x23\x31\xdc\x89\x78\x0f\x8b\x10\xfc\x34\x9c\x67\x5c\x4c\xd8\x2a\x5d\xf8\x58\x6b\x43\xc8\x64\x44\x8f\xac\x00\xb8\x47\xb9\xc9\x80\x54\xab\x79\x3f\x63\xc7\x1a\xa5\xe5\x24\x8e\x22\xd0\x69\xbd\x3f\x85\x2a\x3b\x8c\x6e\x2a\xc8\xef\x86\x1d\x90\xbc\xd9\x84\xbf\xca\x87\x58\x3e\x59\xe9\xa7\x46\x8f\x29\xb8\x08\xdc\x2f\xe5\x30\x2a\x98\x9d\x6f\x2e\xcd\xe7\x58\x5c\xd9\xbe\x4e\x4c\x76\x1c\x4d\x4b\x3e\xea\xf4\x69\x9f\x65\x56\xef\x03\x9a\xf2\xb8\x0f\x94\x07\x60\x5a\xc3\x97\x35\x1d\xd8\x55\x95\x58\x44\x95\xba\xa1\x77\xb0\x8c\x88\xd2\xec\x1f\xc4\xe3\x2d\x1c\x0b\x8d\x7e\x7a\xc5\x83\x9d\xfb\x92\x3f\x09\xb3\x23\xe7\x8e\xce\xb7\xe9\x6c\x06\x04\xb0\x1a\x19\xe4\x9c\x9b\xea\xf4\xf2\x5e\xc4\xa8\x4c\x1a\x08\xf2\x38\x0e\xdd\xc3\xa7\xf0\x12\x18\x49\x59\xcc\xd1\x9e\xcb\xba\xc6\x5e\xac\xa1\x55\xce\xe9\xec\xfe\xc1\x1e\x7f\xee\x05\x8e\x17\x4f\xc4\xed\x7c\x67\x9f\x2c\x15\x63\x1d\x4e\x15\x27\xbc\xdb\x0e\x3b\xb0\x81\x5f\xfd\xff\xc0\xc8\x56\xbe\xf0\xdc\x0f\x5c\x82\x37\xf7\x09\x8e\x26\xbd\xb6\x9e\x87\x82\xd1\xca\x51\x11\xec\x3c\x7e\xdb\x42\x5d\xff\x80\x32\x02\x6c\xba\x3d\x2e\x08\x1b\x71\x31\x0d\xb9\xba\xda\xd1\xad\x02\xf1\xec\xcc\x53\x7d\x87\x4c\xd1\x8c\x6b\xb0\x12\x21\xf7\x1e\xe6\x62\x50\xd9\x4c\xf8\xec\xce\xaa\x96\xd3\xc5\x7e\xea\x2b\x0a\x8e\xc7\x24\x29\xd7\x60\x64\x88\xbd\xf1\x9e\xc3\xbb\x16\xe5\x08\x67\xc7\x93\x7d\xef\x09\xfc\x78\x3f\x20\xa2\xa5\xec\x99\x25\x3d\x6b\x24\x0d\xf4\x67\x7d\xd2\xd5\x27\x7b\x01\xc5\xb8\xe5\xbd\x6c\x7d\xf0\x87\x42\x05\xbc\x8c\x2f\xff\xdb\xa1\x31\x46\x74\xd3\x1c\x9b\x2c\x91\x99\x22\x8e\x19\xe0\x42\x18\x34\xc1\x65\x7d\x06\x98\x28\x69\x16\xc7\xe3\x92\xf0\xab\xd5\x54\x5b\x96\x3a\xc1\xff\xa9\x97\x21\x61\x6c\x23\x79\x6f\x85\xc3\x4a\x5c\x66\x4a\xe8\x1d\x16\xb2\x16\xa5\xb0\xcf\x5b\xc6\xb5\xa9\x08\x29\x72\x85\xd6\x16\x44\x12\x8f\x88\x6f\x38\xaf\x9e\xdd\x25\x19\x3d\x7e\xcc\x77\xa7\x99\x94\x27\x8d\xa0\x71\xf5\x44\x95\x93\x7f\xee\xf5\xa5\x19\x57\x52\x7c\x3e\xec\x7c\xb0\xb4\xe8\xaa\x7a\x4e\x85\x6d\xef\xd5\x7d\xd9\x23\x34\x15\x1b\x98\x6a\xa6\x9c\xa6\x92\x60\xd1\xe2\xd7\xb5\x3c\x05\x67\x7e\xe0\xd2\x16\xb2\x8d\x03\x62\x52\xdd\x30\x06\xde\xbe\x1b\x65\x74\xa2\x5e\x6b\x19\xdf\xb4\x8f\xa6\x43\x16\xaf\x8f\xd6\x8d\x78\x93\xb3\x97\xe7\xdb\x57\x80\xab\x27\xbf\x87\x26\xff\xf6\x05\xd3\xb4\x6d\x80\x05\x95\xb4\x62\x4b\xee\x30\x2c\x96\x43\x26\x03\x4b\x52\x34\xd1\x75\xdf\xdc\xc2\xce\x88\x2e\x65\xb3\xd9\x3a\x04\x38\xf6\x92\xe9\x69\x5d\xe1\xf2\x4c\x70\xa7\x9b\xee\xd2\x54\x15\xec\x5a\xae\xcf\x33\x91\x95\x3b\x2f\xfd\x45\x3a\x8f\x04\x67\x56\x1a\x4a\x47\xee\x14\x4a\x43\xfd\xff\x83\xdf\x2b\xea\x5f\x66\xa7\x22\xb5\x2a\xbe\x86\x13\xf2\x0c\x59\x4a\xf0\x98\x2e\xb3\xf0\x45\x05\xa5\x24\x61\xdd\x03\x4d\xa8\x6c\x36\xca\x16\x21\x77\x05\xc0\x48\x23\x91\x1d\x72\xa2\x47\x69\x51\x76\x33\x56\x28\x86\xf2\x50\xf2\xcf\x78\x8b\x8f\x32\x86\x4a\x94\x74\xf5\x7e\x62\xe5\x7d\xe8\xfd\xaf\x95\x9a\x6b\x72\x28\x74\x40\xa8"}, +{{0x05,0x8e,0x36,0x80,0xb8,0xfc,0xc0,0xaa,0x14,0x90,0x08,0x9c,0x11,0x24,0x67,0x7f,0x98,0xd7,0x4b,0x1b,0xfb,0x71,0xee,0x86,0x63,0xf0,0x25,0xf0,0xd9,0x46,0xcd,0x20,},{0xec,0x72,0xce,0x0e,0x82,0xc6,0xa3,0xb2,0x12,0x43,0xd2,0xf0,0x0e,0x9e,0x88,0x3a,0xdb,0xc5,0xcb,0x63,0xb3,0xd9,0x36,0xef,0xa5,0x0c,0x07,0xcb,0x92,0x91,0x48,0xe2,},{0x57,0x34,0xec,0x50,0xa7,0xf8,0x2e,0x48,0x53,0x6b,0xdc,0x43,0x70,0xcf,0xef,0x2e,0x15,0x0a,0x63,0x1d,0xab,0xaf,0x89,0xed,0xcf,0x0f,0xda,0xbe,0x4f,0x58,0x39,0xf4,0xf5,0xfb,0xd8,0xdf,0x8e,0xc4,0xa3,0xac,0xd4,0x0a,0x8b,0xfb,0x96,0x3d,0x18,0x55,0xff,0x92,0x74,0xdb,0xc3,0x31,0x65,0xb5,0xe6,0xd3,0x7a,0x23,0x9d,0xac,0xe9,0x03,},"\xe6\x3d\x14\xf5\xbe\xa7\xa1\xab\xb8\xfe\xe6\x97\x74\x6c\x22\x80\xdf\xd0\x62\x2d\xe7\x35\x72\x26\xcc\x07\x42\x72\x2a\x32\x29\xbe\x12\x6b\x08\x3e\x86\x8a\xea\xf0\x7d\x2f\xc9\x7a\xdc\x33\x42\x70\x96\x74\x19\x3c\xa2\x81\x74\x4e\x85\x0e\xa1\x54\x40\x05\x0a\xec\x93\x0e\x45\xd7\xa8\x7b\x8a\xc8\x01\x5c\x89\x67\xc2\x00\x33\xa5\x32\xd2\x95\x91\xb1\x35\x58\x6c\xe0\xfd\xd2\xe6\x68\xb5\xc8\x64\xb3\xbd\xe7\x0c\x7e\x71\x9a\xd2\x41\x93\x12\x51\x86\x19\x33\xff\xbf\xa9\x64\x83\xff\x82\x85\x67\x48\xc5\x6d\xc2\x6e\x25\x7d\x69\x2e\x51\x34\xd8\x2f\xc7\x19\x1c\x11\x0d\x95\x90\xd3\xfc\x75\x1c\xd6\x36\xb0\xc4\x6f\x44\xf8\x80\x3e\x59\xe2\xf9\x3f\xa0\xcb\xe2\x47\xa1\xa6\x25\xb4\xbc\x2c\x7b\x1f\xdc\xeb\x5a\x2b\x22\x59\x1f\xa6\x13\x7c\x54\x04\xdf\xec\x6a\x69\x63\x9e\x3f\x63\x2b\x59\x76\xab\x9f\xe1\xc6\x3a\xa3\xda\x9d\x52\xb0\x44\x00\x8f\x3a\xe4\x4b\x7c\x36\x4f\x08\x56\x64\x32\x3a\x88\xeb\x45\x83\xe8\x71\x40\xf7\x63\x78\x2b\xff\x88\x19\xcf\x74\x1a\x87\x5d\x50\x6c\x92\x9d\x34\xbb\xd4\x30\x07\xde\x4b\x18\xf6\x87\xa7\x58\x11\x11\x28\xb1\xdb\x86\xfc\x5a\xd2\xfb\x9f\xca\xd1\x2c\x9d\xd2\x8f\xee\x5a\xd1\x0d\xe0\x73\x9f\x8e\xfd\x9b\xff\x66\xf8\x40\xb1\x1b\x3f\x91\xc5\xe0\x7c\x21\x45\x2c\xab\x24\x24\x2b\x6e\x32\x16\x5c\xd1\xe6\x95\x72\xbf\x21\x6e\x86\x04\x53\xda\xd2\xfd\x12\x9c\x33\x37\x58\x58\x0b\xb7\xd0\xf1\x95\x09\x74\x5e\x85\x14\x63\xd1\x27\xa5\xf9\xbe\x21\xfe\x54\x9c\xae\x55\xd5\x6b\x8b\xea\x80\xbf\xaf\xda\xc1\x0a\xcd\x83\x8e\xa8\xaf\x31\xc0\x07\xdc\x32\xbf\xd7\x40\x82\xd9\x11\x0a\x3e\x91\xe6\x1e\x03\x57\x58\x7e\x4e\xd3\x28\x27\xad\xe9\xb6\x91\x0a\x98\x8c\x1d\x3b\x2d\xd2\x2c\x0e\xe7\x6e\xf3\x5f\xe1\x5e\x09\x94\x04\xa4\x5d\x4b\x2a\xca\xb9\x12\x3e\xcc\x45\x55\x0a\x40\xfa\xf8\x33\x6b\x46\xc6\x30\xa9\x08\x03\x58\xff\x8b\x8e\x58\xaf\x0b\xcc\xbd\x35\x01\x0c\x1e\xcc\x12\x81\x66\x55\xa5\xec\xeb\xa9\x5a\xd3\xf5\x03\xa1\x8e\xc5\xbe\xce\x3a\x33\xf4\x69\xdf\xe9\x17\xe1\xc5\x5e\xf1\xd8\x1e\x5a\x75\x56\x1e\x6b\xbd\x99\xc6\x53\xa6\xd0\x95\xb9\xf3\x87\x91\x1e\x40\x33\x2f\x62\x16\xf9\x56\xa3\x5c\xf7\xd9\x9a\x9f\xdd\x0c\x44\xc5\x1e\x90\xa5\x64\xf1\xc3\x6b\xf3\xd4\x0a\x7f\xaf\x4b\xa2\x8b\x1a\x12\x0b\x32\x05\xfb\xac\x1a\x98\x56\x92\x90\xbe\x37\xc5\x8b\xbd\x74\x5c\xe0\xfb\x74\x83\x52\x70\xab\xa2\x25\x2a\xda\xec\x15\x7d\xc4\x24\x61\x22\x1a\x2c\xff\x68\x7b\x9e\x65\xce\xb5\x7c\x2d\x77\x70\x0a\xea\x63\x20\x48\x6c\x5b\x1b\xec\x9c\xc5\x3e\x7e\xf9\xe4\x8f\xcd\x1b\x77\x83\xac\xbe\x75\xa6\xbe\x02\x67\x27\x88\x12\xdb\xf3\xd2\x57\x6c\xf7\xad\x39\x11\x27\x1a\xce\xbe\x0f\x2c\x04\x60\x2a\x08\x0c\x8b\x96\xc1\x20\xfd\x86\xfd\xa2\x82\xaa\x4e\x1c\x13\x1f\xe9\x7c\x90\x7c\x15\x85\x5f\x87\x75\x5f\x51\x1c\x03\x7b\xef\xad\x0f\x56\xb3\x9f\x32\xa2\x13\x3a\x22\xf3\xd5\xa9\xbe\xc3\x44\x3f\x29\xa6\x94\xe9\x7f\xe0\x5e\x10\xfb\x8e\xf9\x99\x13\x02\xb9\xe0\xd8\x4d\x92\x9a\x19\xeb\x03\x47\x1f\x3a\x86\x13\xd3\x93\x68\xe1\x58\x83\xa7\xe4\x97\x0b\x53\xcb\xaf\x29\x29\xd8\xde\x43\x1b\x48\xb4\x35\xd7\x53\x3c\xaa\x2e\x36\xce\xab\x6c\xdd\xb3\x46\xe5\x35\xe5\x15\xc4\xb3\xdb\x76\xde\x07\xd9\x85\x54\x14"}, +{{0x51,0xba,0x3a,0x4f,0x3d,0x85,0xd1,0x54,0x8c,0x2f,0x24,0x94,0xa3,0x51,0x1f,0x3b,0x95,0x15,0x66,0x3d,0x7e,0x85,0x37,0x0f,0xb6,0x15,0x02,0x37,0xe9,0xbc,0x98,0x0b,},{0x77,0x49,0xde,0x02,0x10,0xbc,0xe0,0x6d,0x48,0xf5,0x9b,0x95,0xae,0xb1,0x52,0x8f,0xd9,0xb4,0xe5,0x2c,0xdd,0xe2,0x2f,0xb8,0x19,0x3b,0xed,0xd5,0xdf,0x12,0x81,0x7c,},{0x16,0xfb,0x29,0x0c,0x91,0x3b,0x20,0xeb,0x1c,0x3d,0x7b,0x79,0x82,0x49,0xeb,0x84,0x59,0xd4,0xbe,0xe8,0x12,0x5d,0xb2,0xb3,0xf1,0xda,0xab,0x8a,0xf9,0xd9,0xa7,0x00,0xed,0x79,0x8a,0xdd,0xd8,0x02,0xdf,0xcd,0x29,0x7a,0x41,0x25,0x93,0xcd,0xa7,0xbe,0x99,0x79,0xa1,0xf0,0x93,0x50,0xe8,0x6f,0x69,0x8a,0xc3,0x38,0x0e,0x34,0x1d,0x07,},"\xd1\x8d\x0c\xbf\xc1\x6d\x0f\x9b\x67\xf2\x53\x9a\xd6\x20\x7c\xd9\x21\x7a\xd5\xed\x03\x33\xcd\xdb\x10\x41\xe0\xac\x2b\xdd\x92\x02\x76\x62\x96\x52\xb4\x9c\xbc\x98\x02\x59\x3e\xc3\x64\xea\x79\x5a\xbc\xd1\x58\x20\x85\xf5\x5b\xc6\x6c\x48\xfd\x3e\xed\xe6\x18\xd6\x36\x96\x17\x10\x0e\xae\xcc\xc1\x5f\x24\x9d\x6e\xee\x5b\xb2\xc4\x3c\x01\xb0\x62\x3f\xe6\x03\xce\xee\xe4\x9b\x40\xfb\x7c\x53\xfc\x68\x47\x36\x73\xc0\x9b\x1a\xc7\x7e\xa9\xbe\xb7\xe8\x53\x03\x79\xa8\x6d\x69\xec\xd1\xff\x11\x81\x3f\xbb\x88\xf6\x92\xf0\x5e\xf1\x32\x07\x42\xb4\xfe\x7e\x06\xd5\xba\x71\x65\x66\x46\xcd\x75\x00\xde\x19\xbb\x93\xd8\x44\x53\x66\x03\xf4\x0b\xd4\xae\xea\xf0\xc4\xdb\xc0\xac\xfd\x20\x2b\x28\x6b\x64\xaf\xb8\x3d\x4a\x37\x8d\xd4\x5e\xe3\xc1\xdf\x6b\x3e\xf1\x6b\x8b\x1a\xcc\xbc\x04\x06\x32\x50\xec\x47\xb8\x6a\xe5\xa7\x1d\x1d\xab\x38\xb5\xeb\x80\xd6\x63\xfa\xa7\x88\xf8\xb5\x9a\x75\x4c\x0f\x9c\x9f\x6d\x90\x62\x52\xaf\x46\xab\x1f\xff\xed\x27\x6d\x23\x88\xdb\xe7\x0d\x96\xba\x67\x47\xd1\xfe\xd4\xfc\x0b\x55\x29\x3d\x5f\x78\x7b\xda\x0c\x0d\xf4\x6a\x73\xf4\xaa\x7d\x29\xe1\xc9\xcc\x85\xcd\x04\x3e\x3d\xff\xe0\x57\x46\x2c\xa5\xfe\x5c\x64\x70\xe7\x39\x27\x6f\x8b\x53\x4c\x01\x72\xe4\x60\xf3\x40\x48\x7a\x56\x94\x68\xaa\x58\x90\xcc\x14\xf2\x0d\x67\xd7\x9c\x66\x1e\x87\xfe\xba\xc6\x27\x59\x71\xc3\x73\x08\x07\xeb\xf1\x75\xe0\xde\x10\x49\xbe\xe6\x7c\x89\x5e\x57\xb7\x1a\xb8\xa2\xf3\xcf\x36\x41\xfd\x54\x8d\x09\x41\x4f\x5f\xc3\x02\x6a\x0a\x35\xf6\xba\x95\x16\x73\x94\x49\x41\xcb\x23\x6f\x3d\x19\x76\xdc\x69\x07\x7d\x95\x14\x50\xe7\x66\x03\x16\x98\x8f\x6f\x2a\x6f\xbb\xff\x3b\x37\xce\xaa\x02\xfd\x6f\x02\x73\xbd\x80\x31\x85\xa1\x09\x03\x9c\x63\xf2\x51\x9b\x98\x3d\xaf\x65\x54\x25\x3b\xed\x54\x97\xc0\xb0\xbd\xaa\x0b\xd4\xa1\xfa\xc9\x00\x26\xad\xe3\xe4\x0c\x55\x4c\xff\x2c\xcb\x36\x99\x0e\x71\x55\x67\x08\xc5\xc4\x03\x92\x56\xff\xc7\x33\x7e\x5f\xea\x11\xf5\xe9\x0d\x3e\x4d\x93\x35\x91\x79\x11\x6a\x85\xc2\x41\x36\xca\x34\x83\x5c\xd3\x40\x12\xe4\xd7\xdd\xc7\xb7\x21\xc2\x46\xc7\x37\x00\xe2\x76\xdc\x2f\xf9\xf2\x77\x0b\x43\xc8\xe8\x0a\x17\xf0\x1d\x32\x68\x0b\xae\x22\x8e\x64\x23\xa8\x80\xc3\xfb\x99\x6a\xb8\xd2\x21\xbc\x62\x74\xac\x5f\xa7\x70\xd2\x05\xfc\x87\x8f\xba\x9b\xbd\x77\x6a\x3d\x79\xed\x77\x04\x89\x50\xf3\x6d\xc0\xaa\x3c\xcd\x28\xe4\x75\x6a\x99\x19\x04\xae\x05\x1b\x8a\x4b\x7d\xe3\xa1\xf2\xad\x0f\xb4\x5a\x33\xd0\xc6\x82\x25\x84\x1f\x8e\xb6\x5b\x6a\x16\xe9\x5f\x89\x35\x91\xe1\xaa\x73\xa6\x4f\x0d\x2e\xe9\x38\xab\x69\xad\xcc\x8c\x59\x51\x8b\xec\x50\x1c\x39\xf1\x39\x17\x4b\xbb\x00\x69\x9e\x1a\x0f\x0e\x0d\x88\x9a\xae\x54\x3a\x55\xe6\xac\x56\xd5\x20\x4c\x1a\xde\x1f\x27\xd8\x2a\x6a\x95\xe1\x4b\x2d\x69\x09\xdd\xa7\xbf\xaa\x7f\x48\x7f\xb6\x19\x59\x01\x4b\x78\x79\x5c\xb4\x63\x9f\x09\xf0\xd3\x29\xfe\xb3\x5c\xcf\x52\xed\xc2\xdb\x72\x19\x14\xe4\x23\x30\x68\x89\xa4\x83\xfe\xe8\x76\x36\x0e\xe3\x26\x33\x53\x19\x07\x0c\x56\x4f\x3a\x8b\x95\x3f\x52\xf4\x15\x13\xa2\x26\x08\x83\xc3\x8d\xd9\x78\xa2\x48\x60\x4a\x41\xbd\x4b\xfc\x9e\x84\x18\x4d\xc9\xe8\x4d\x25\x89\xf4\xaf\xff\x84\x17\x82\x4c\xe5\xad\xba"}, +{{0x7d,0xde,0xc5,0x26,0xa4,0x97,0x1d,0x89,0x12,0xa6,0xbd,0x43,0xc6,0x9f,0x92,0xed,0x86,0x44,0x2b,0x15,0xf4,0x2f,0xba,0xbb,0xf2,0xd1,0x7e,0xff,0x98,0x99,0x31,0x61,},{0x0d,0xfe,0xff,0xb2,0x76,0x23,0x09,0xb4,0x73,0x4e,0x4c,0xe2,0x52,0x3c,0xf1,0x86,0x31,0x49,0xf7,0xe1,0x9a,0x7c,0x14,0x7e,0xc0,0x89,0x9e,0x11,0x0c,0xa9,0xd8,0x7d,},{0x9e,0x60,0x3b,0x01,0x5f,0x42,0x87,0x1b,0x78,0xeb,0x27,0x52,0x3f,0xbb,0x7c,0xe9,0x62,0xfc,0xa3,0x2a,0xe2,0x70,0xe8,0xe1,0x2d,0xca,0xdd,0x25,0xaa,0x85,0x2b,0x89,0x1f,0x6f,0xef,0x77,0xb5,0x9a,0x54,0x6c,0x9a,0x7a,0x7c,0xac,0xb5,0x5e,0x1d,0x32,0xad,0xc8,0x05,0xae,0x5f,0x61,0xa6,0x9e,0x67,0x64,0xc7,0xc0,0x82,0x92,0xeb,0x03,},"\xe8\x77\x4a\x45\xd4\xd8\xf8\x6d\xda\x5c\x08\x80\x2b\xa2\x47\x2e\xf3\xc8\xd3\x6c\x7f\x38\x3a\xc0\x46\x12\xa4\x64\x38\x2e\x9d\x6c\x07\xd8\xd3\x58\x22\xc5\x3f\x43\x88\xf5\x15\x36\x14\xfe\xfa\xf4\x63\x74\x74\x7b\x9d\x4f\xd4\x46\xa8\x64\x76\x9a\x4c\xad\xe8\x43\xc1\xea\xb8\x57\x43\x19\x11\x2f\x01\x79\xd2\xea\x9e\x3c\x19\x5d\xc0\x68\xf0\x69\x74\x62\xb9\xe0\x7c\x87\x94\x87\x0f\x8f\xb8\xff\xc0\x81\xe4\x58\x6a\xfb\xcd\xba\x7a\x4f\x59\x25\xe9\xfd\x9e\xc9\x42\xd8\x43\x47\x33\xc2\xdd\xd5\xe2\x9b\xbd\xfc\x73\x42\xb9\x28\x68\x71\x9b\x54\x40\x88\xa4\x8e\xba\x4c\x82\xf1\x87\xdd\xca\x8f\x47\x46\x25\xa7\x1c\xf6\xb7\xaa\x5f\x08\x1c\x74\xf7\x40\x8f\x53\xb7\x81\x63\x6e\x7e\x9d\x29\xb0\x7f\xdb\x6d\x9c\x35\xe5\xeb\x38\x2d\xb7\xa3\x1a\x8b\xa5\x16\x91\x5d\xf8\xde\xe9\xe1\xad\x3f\x18\x28\x43\x68\x3e\x8d\x1d\xc5\xd8\x66\x9d\xbf\xcf\x09\x54\x1a\x43\xc0\xa0\x46\x13\x38\x1a\x5b\x5e\x4e\x71\xb2\x3c\x5a\xd0\x9b\x8e\xaa\x51\xcb\x93\x8d\x0c\x75\x2c\xc3\xd3\xa1\x0f\x10\xb4\x2b\xe8\xee\x7f\x6b\xda\xc8\x07\x85\x68\x43\x49\x46\xbb\xf5\x6d\xa7\x0e\x7d\x54\x15\x7a\x6e\xfd\x48\x46\xeb\x15\x52\x78\xc9\x4c\x38\x88\x65\x8a\x7a\x2f\x8e\xa3\xba\xc1\x47\xaa\x89\x16\x92\xae\x8b\x23\xf1\xaf\xe7\x1e\xcf\xde\xca\xa6\xc1\x13\xb5\xca\xaa\xa1\x93\x98\xc7\xdf\xe7\x3f\xac\xb4\x15\x5f\xd6\xba\xc1\x8d\x5d\xf2\x12\x9e\x8b\x29\x07\xec\xee\x15\x1b\xdd\x14\x7a\x7c\x3e\x46\xea\x72\x75\x4d\xe3\x2c\xeb\x06\x6d\x9d\xb1\xc2\x6e\x80\xdf\x36\x31\x29\x2b\x16\x17\x4c\xfa\x6f\x1d\x9c\x08\x28\xb8\x49\xc2\x2d\x29\x65\x1a\x73\xe9\x10\xd9\x27\x58\x77\xf4\x64\xce\x93\x26\xc6\xe4\xed\x6b\x07\xdc\xb3\xa3\x53\x63\xc1\xaa\x64\x72\xe0\x2c\x5c\xd8\x55\xe3\x8a\xab\xe9\x65\xac\xe9\xf3\xf5\xa4\xf5\xde\x03\x00\x86\x94\xcb\x90\xaf\xe4\x16\xc9\xd4\x86\x88\xde\x7f\x75\xcf\xe2\x43\xff\x7f\x41\xe0\x59\x31\x09\x34\x90\x3d\xb5\x68\x84\x45\x08\x26\x2c\x89\x9d\xfa\x75\x0c\xd6\xa2\x82\x98\x24\xba\x02\x7a\xea\x1b\x6d\x01\x77\x72\x6a\x34\x3a\xdd\x4e\xcd\xc5\xf7\xe6\xe9\x09\xab\x7d\xe6\x15\xef\x28\x07\xf9\xe7\xd7\x1c\xe2\xf7\x8a\xcf\xf5\x7e\xba\x79\xc3\xf5\xe0\x7c\x8b\x66\x1c\x1e\x30\x27\xf8\x17\x6d\x28\xbf\xef\x76\x7d\xd6\x8d\x4e\x5d\x62\x8f\xec\x0b\xfe\x88\x79\x93\x41\xf3\x06\x12\x87\x34\xfa\xd2\x02\xaa\xfc\x9f\x11\x12\x3f\xb3\xe3\x63\xd1\x0a\xee\x0d\xb5\xe2\x7a\x15\x70\xdf\xae\xe4\x7e\x24\xda\x47\x3b\x07\xfe\xe5\x9a\x6c\x93\xf0\x98\x1d\xbe\x32\x5c\xd8\xcc\x2d\x2e\xd7\xdc\x17\x16\x6b\x26\x7c\x1b\x11\x05\x36\xf2\x63\x6b\xba\x34\x75\x1a\x78\xf7\xf6\x29\x81\x82\x44\x2d\x83\xc1\x23\xbb\xee\x4f\x50\xc5\xb0\xfa\xcf\xf0\x3e\x7c\x55\x6e\xd9\xe6\x4c\xa2\x7c\x4b\xca\x5a\xb0\xde\x0d\x5f\x9c\x2c\xbb\x54\xcc\x2d\x94\x73\xa3\x2d\xf9\x99\x39\x0a\xc2\xff\xee\xd3\xd4\xcb\xa3\x49\x73\xdc\xec\x3f\xba\xba\xfc\x4d\x54\xca\xe4\xe7\xe8\x5d\x4a\x6e\x8a\xfe\x45\xca\xcd\x71\xe0\xf2\xe6\xd0\x4b\x4f\x9d\x3b\xcf\x43\xd3\xfa\x41\xe9\x98\xcc\xbe\xd0\xf1\x50\xd5\xca\x1d\x52\x72\x93\x2d\x93\xec\xa1\x04\x95\xc6\x83\x34\xfa\x32\x68\xf3\x1d\xe5\x22\xcb\x12\xa7\x44\x9f\xfb\x5c\xb5\xe8\xf1\x46\x2c\xd9\xb5\x17\x70\xcc\xaf\x58\xb1\xe0\xd8\x2e\xf9\x29"}, +{{0x0b,0x65,0x90,0xdd,0x7c,0x2f,0x15,0xf9,0x4a,0x56,0xe2,0x40,0x16,0x93,0x63,0xc2,0x67,0x32,0x30,0x2b,0x9d,0x44,0x0b,0x53,0x27,0x23,0x00,0x2e,0x15,0x5d,0x02,0xd9,},{0xcd,0x18,0xe0,0x32,0x57,0x7c,0x55,0x76,0xf2,0x23,0xf3,0xe3,0xd8,0xa1,0xfa,0x8e,0x9a,0x87,0x0f,0xef,0x09,0xe9,0x40,0x9f,0xaf,0x40,0xd7,0x14,0x3e,0x52,0xfc,0x44,},{0x64,0x2d,0x81,0xac,0xf3,0x8c,0xf0,0x99,0xa8,0x33,0xa7,0x4f,0x2d,0x80,0xb8,0x54,0x48,0xec,0x2b,0x1a,0x5d,0xdc,0x64,0x47,0x0b,0x21,0x3d,0x54,0xb7,0xbe,0x61,0x33,0x68,0x9a,0x71,0x94,0xf5,0xd8,0x97,0x92,0xe1,0x6e,0x5d,0xf7,0x55,0xa4,0xfd,0x9e,0xf4,0x68,0x9e,0xa9,0x52,0x92,0x6e,0x0e,0x4e,0xcb,0x3b,0xd4,0x81,0xfd,0x91,0x02,},"\x71\xfe\x0f\xd5\x5d\x5e\xd1\x20\x6f\x28\xee\x16\xe4\x19\xfa\xb6\xfa\x66\xa2\x51\xfa\x6b\x06\x01\xda\x26\x1e\x42\x9f\x55\xb8\xd5\xae\x3f\x3c\x52\xa1\x7f\xe1\xec\x73\x4b\x81\x0a\xb6\x3a\xad\xe4\x44\x70\x39\xca\x0a\xe4\x68\x7c\x24\x35\xf5\x61\xe4\x6c\x5b\x30\x97\x17\xab\x31\xe0\xf6\x40\x76\xb2\x16\x92\x11\x57\x2b\x74\xe1\x8a\x1f\x45\x25\xa6\x4f\xa7\x17\xa5\xed\xf1\x49\x75\x81\x29\xcb\x04\x03\x5e\x7e\x20\xba\x40\x05\xb7\x48\x09\xde\xc6\x44\x50\x4c\x24\x54\xa7\x7f\x99\xb2\x0c\x53\x74\xf3\xce\xe7\xd8\xc6\xb6\x8b\x24\x3c\xaf\xb3\x00\x98\xdc\xe9\x04\x90\xfd\xc3\xb9\x2f\x54\x94\x8f\x42\x46\x39\xe1\x9f\x8f\x20\x20\xd1\x55\x13\xda\xef\xad\xd9\xe9\xb1\x2a\x84\x76\x1e\x5e\xce\xa0\x88\xad\x56\x1f\x06\x20\x9f\xd4\x42\x3f\xcd\x00\x3f\xbc\xd1\x87\x3e\xa5\x49\x63\xa2\xfa\x07\xc7\x47\x6b\x13\x88\xf9\x01\x5d\x9e\xac\x30\x5b\xea\x5a\x3d\xe1\x94\xf5\x5a\x17\xb4\x2d\x59\x9e\x5c\xe6\x2c\x8b\x7c\x19\xe7\xe7\x09\x61\x37\xb9\xd0\xa6\x5e\x63\xc1\xa3\xb8\x45\x38\xca\x65\x36\x9a\x20\xe8\x82\x2f\xff\x5e\xcb\x57\xfc\x09\xb4\xe6\x84\x5b\x4f\x24\xd4\x88\x69\x71\xac\x1a\xc2\x8c\x77\x58\x0e\xa5\x67\x2a\xd1\x4c\xe4\x44\x17\x19\xc2\x14\x54\x6d\x07\x36\xcb\x7a\xd0\xbd\x9f\xb5\xb2\x6c\x6d\x9c\x53\x6b\xf8\xc8\x57\xae\x42\x57\x7b\x36\x34\x1d\x39\x2b\x43\x32\x3b\xda\xe7\xdf\xaa\x49\x19\x86\x87\x2a\x23\xd8\x27\xc6\xef\x8b\x57\xe7\xd0\x0f\xea\xe3\x83\x4c\x46\x64\x00\xaa\xd1\xd3\x67\x82\x39\x84\xaa\x02\xd2\xef\x49\x29\x14\xae\x11\x27\xe7\x55\x1b\x81\x25\x59\x37\x83\x05\xe4\xfd\x52\xd8\xbc\x7e\x41\x57\xec\xca\x45\x1f\x43\xee\x9f\x54\xc8\x21\x53\xc7\xdb\xfa\xf7\xec\x35\x23\x87\x73\x05\x1b\x4e\x58\x7d\xb1\x36\x95\x7e\xc5\x71\x38\x2b\x90\x59\x0b\x5d\x10\x26\x02\x45\x80\x96\x6b\x72\x52\xd2\xcd\x3f\x4f\x16\x25\xc4\x85\xba\x90\x6b\xff\x17\x59\x92\x18\x89\x78\xf2\xd6\x27\x4f\x3a\x03\x17\x49\xba\x7e\x70\x2f\x56\x54\x7e\xdc\x96\xec\x26\x7b\x84\x89\x28\x80\xd7\x50\xd7\x31\x0e\xbf\x6d\xb2\x41\x25\x3c\xab\xe4\xb2\x5a\x97\x74\x58\xc6\xff\xc9\xe3\x53\xe6\x2a\xdf\x05\xe6\xef\xc0\xfc\x1e\xbe\x89\xf5\x27\x70\x5b\xcc\x26\xb7\x01\x28\x56\x10\xd9\x8a\xa3\xbf\x23\x87\x2b\x69\x96\xd3\xde\x48\x0e\x8d\x09\xd7\x83\xc4\xa0\x8c\xd3\x83\xc9\x01\x26\x35\xaa\x68\x97\x8b\x50\x06\x81\x8b\xbd\xe4\x4f\x29\x87\x47\x9b\xcb\x2b\x71\x1c\x1b\xee\xed\x27\xcf\x09\x97\x0a\x16\x4e\x45\x4f\x71\x08\x22\xee\xf5\x55\xc1\xc7\xbf\x9f\x76\xd5\x25\x4c\xe2\x20\xc9\xaa\xa7\x16\x84\x7a\x24\x94\x88\xf9\xcd\xb4\x4c\x48\xf4\x52\xab\x52\xc4\x0f\x6d\x03\xad\xc8\xbf\x3f\x19\x7b\x25\xe3\xd1\x27\x83\x0e\x74\xfd\x81\xeb\x14\xf7\x54\x20\x5b\x3a\x48\x44\xc5\x96\xb6\xe3\xa9\x93\x6a\xd6\xfd\x9e\x80\xa1\x63\x20\xb3\x81\xc3\xff\xc7\xb6\x9e\xab\x54\x53\x6f\x55\xab\xe2\x2c\x91\xd8\x98\x40\x8e\x88\x0c\x6d\xbf\x0f\xa5\x64\x8d\x51\x77\x72\xca\xa5\x35\x3b\x25\xdb\x60\x50\xd7\x53\xfa\xf1\x98\xec\x1d\x37\x5d\xe0\xfa\x72\x18\x0a\x93\xba\xb0\x3d\xed\x77\x16\xcb\x87\x50\x5b\x68\xac\x6a\x35\xe7\x3d\x0f\xcf\x34\x45\x7e\xff\x82\x17\x89\x52\x14\x2c\x7b\xac\x9d\xfd\x87\x2a\x9a\x82\xf8\x5b\x24\xb8\x8f\xa4\x2d\x4b\xe0\xa0\xca\x0b\x2c\x70\xf4\xc6\x22"}, +{{0xc6,0xd9,0xac,0xc5,0x17,0x5f,0xa2,0xb8,0x96,0x5c,0x15,0x8c,0x56,0xba,0x0a,0x5a,0x66,0x6a,0xd2,0xc7,0x40,0xcd,0x5b,0xb6,0x79,0xbb,0xa9,0xb1,0xdc,0x50,0x92,0x84,},{0xf5,0xcf,0xca,0x21,0x1b,0x02,0xfb,0xa7,0x72,0x03,0x47,0x70,0x3b,0xf1,0x63,0x1c,0xb3,0x08,0xfa,0xbc,0xda,0xa6,0x74,0x29,0x52,0x7c,0x5b,0x7b,0x67,0x6d,0xba,0xef,},{0x4d,0x2c,0xe7,0x07,0x09,0x0b,0x0f,0x3f,0x41,0x46,0x2f,0xd7,0x5b,0xd6,0x09,0xa2,0x72,0x4f,0xad,0xfe,0x5c,0xa3,0x90,0xe3,0x13,0xa4,0x2c,0xab,0x42,0x86,0x8e,0xd6,0xe9,0xa8,0x91,0x4d,0xc1,0x39,0x09,0xc0,0xd6,0xf6,0x1e,0x63,0x71,0x29,0x57,0xc7,0x6f,0x3b,0xd8,0xb7,0xf5,0x53,0x49,0x71,0x5a,0x3a,0x31,0x75,0x15,0xc0,0x71,0x08,},"\xf2\x45\x10\x0c\xd2\xd3\x16\x48\xf5\xf3\x51\xbd\xa5\x64\xc9\xdb\x4a\x35\x82\x0c\xc3\x0e\xf6\x51\x33\x7c\x4c\xd8\x88\x07\x05\x69\xd1\x17\xa9\x34\xb9\xc9\x18\xe5\xdf\x8b\x37\x44\xdd\x66\x20\xcc\xbc\x49\xf6\xb3\xe5\x78\x2a\x30\x33\x9d\xbb\x9c\xbe\xd0\x5d\xd2\xb3\xb8\xc5\xbf\x15\x46\xe7\x0a\xf6\x36\xe6\x61\x5c\x48\xb2\xc3\xc2\xd1\x9f\xe3\x54\x20\xdf\x53\x14\xf6\x3c\x48\x12\xb5\x8e\x82\xa2\xa6\x0b\x18\x02\xf3\x8e\x50\x5c\xe7\x48\x01\x7a\xfa\x97\x7d\x3f\x9b\x1b\x6b\xea\x21\x92\xac\xec\x73\xbd\xce\x12\xd6\x5e\x68\x4d\xa4\xd8\xb4\x1f\xa9\xa8\x6f\x11\x08\x6e\xdc\x2d\x52\x96\xf6\x7e\xfc\x53\xac\x84\x07\x0f\xde\x13\x69\x3e\xb2\x31\x8f\x5a\x8c\x3b\x11\x7c\x23\x34\x22\xad\xcd\xd3\x52\xf3\x28\xf0\xec\x69\x9a\x46\x50\xc9\x3f\x9b\x4a\x7d\x79\x5d\x7f\xc2\x62\x2a\x03\xd9\x9b\x64\xf7\xb3\xdc\x31\x94\xf6\xc3\xb1\xb6\x9d\x99\x07\xce\x09\x24\x01\x07\x3f\x47\xa2\x8f\x47\x99\xd2\x29\x09\x2a\x1b\x07\x41\x29\x95\x4b\xe8\x0c\xa4\xa3\xe6\x58\x2e\xe0\x5c\x30\x2c\xac\xb7\x43\x1d\x1c\xa6\xa4\x51\xaa\xed\x72\x78\xab\xc7\xf7\x85\x75\x24\x1c\x2a\x2e\xea\x2e\x84\xcb\xf9\xa3\x34\xdf\x40\x21\x09\xc0\x28\xe3\x45\x47\x3a\x13\xaf\x9b\x00\x8e\x20\xbc\x8c\xf0\xbc\xef\xbb\x7a\xa7\x27\xec\x85\x6e\x99\x25\xb4\xdd\xd9\x9d\xeb\xa8\xf2\x52\x91\x1a\x59\x01\x54\xb5\x79\xa8\xaa\xa3\x1f\x07\xdd\x50\x25\xdf\x5c\xd8\xa0\x9f\x74\x29\x64\xcc\x8c\x36\x5d\x8a\xff\x4e\xb1\xd7\x9f\x6e\x5a\x07\xda\xc5\xf4\xed\xe9\x2b\x4e\x2e\x61\xd3\x4c\xc2\xd4\xf0\xaa\xaa\xb0\x37\xad\x5f\xdb\x95\xde\x6c\xd5\x98\x4e\xba\xf7\xcc\xe7\xf0\x8d\x0c\xa0\xdb\xbe\x48\x3c\xe3\xcb\x35\xcd\x79\x0c\xa0\x42\x70\x65\xa3\x4d\xf7\xf4\xc2\xaf\x86\xef\xe9\xb7\x65\x71\x3a\xff\x25\x7f\x5c\x1d\x54\x70\x95\x27\xad\x18\xac\x33\xab\xcd\xee\xdb\x20\x80\x64\xeb\xae\xa4\x83\x5b\xe4\x94\x2b\x8f\xc6\x66\xad\x1b\x79\xb6\x65\x13\x09\xe5\xea\x1d\xa3\x02\xd7\xfb\xa2\xe9\x9f\x0e\x63\x19\xe8\x2b\x99\x05\xa1\xea\x48\x2b\xa0\x43\xb6\x80\x0b\x33\x0d\xc4\x8b\x33\x13\xf5\x9b\xb2\xf9\xe8\xa7\xf0\x7e\xb1\x80\x0a\x70\x27\x45\xdb\x14\xc6\x29\x9a\x98\x2d\xad\x89\x79\x54\x44\x5b\x7d\x98\xeb\x58\x37\xfd\x70\xbf\x19\x0c\x64\x95\x52\xc8\xe8\x6f\xeb\x7f\xf5\xb3\xed\x8e\x0a\x06\x70\x4d\x45\x53\xa3\xc2\xdd\x74\xf1\x8e\xa8\x23\x3a\xe0\xa5\x0d\x91\x4f\xe0\x8f\xbc\xd3\xa1\x43\x5f\xed\x56\xa9\xf3\xa7\xef\xfa\x14\x0f\xb5\x52\xdd\xd2\x1d\xff\xff\x7f\xa4\x73\x32\xdd\xfc\x1e\x53\x17\xf4\x17\x7d\x5e\x2f\x11\xa0\x6e\xc8\x4c\xcf\xb8\x9b\x65\x4e\xa8\x1b\xd4\x2d\x7e\x07\xa3\x87\x30\x1d\x0f\x40\x26\x4a\xbb\xf9\xf9\x10\x7b\x30\xed\xe8\x64\xcc\x76\x90\xc0\x6d\x2e\x24\x7a\x06\x0b\xb2\x24\x4a\xd7\x8e\xd5\xc5\x51\x5a\x1a\x2a\x61\x2d\x61\xe3\xd9\x31\xe2\x8b\xc9\x39\xb4\xd3\x43\x5e\xee\x4f\x73\x31\xb1\xf0\xf8\x53\x75\xd8\x2a\xc9\xa7\x7c\x43\x74\x00\x32\x05\x17\x46\xdc\x92\x69\x45\x8c\x14\x7d\x18\x8d\x84\x40\x19\x54\xa4\x89\xcb\x4f\xbf\x9b\xf8\x4b\xa7\xd8\xf1\x00\x90\x3c\xe6\x78\x31\xb4\x05\x4d\x0f\x58\xcd\x88\x3d\x54\x2c\x49\x33\x10\x3f\xf0\x70\xcd\xfc\x9d\xbb\x0f\xcc\x31\xef\xca\x46\x6e\x77\xa3\x3f\x1a\x81\x3d\xa6\xdc\x0c\x7c\x31\x58\x5e\x8f\x4f\xef\x1e\xbf\x42\xfb\xd1"}, +{{0x7d,0xfa,0xe4,0x16,0x41,0x9d,0x7b,0x0d,0x4f,0xc1,0xf8,0x23,0x84,0x0c,0x3e,0x4b,0xd4,0xad,0xcd,0x4d,0xc2,0xdc,0x17,0xb3,0x86,0x37,0xac,0xed,0xac,0xbd,0xbb,0x45,},{0xbc,0x51,0xd7,0x74,0x59,0x31,0x31,0x7e,0x1e,0x34,0x6e,0x2e,0x7c,0x92,0x03,0x91,0x81,0xb6,0xbf,0x38,0xee,0x2f,0x5a,0x44,0xfb,0xe2,0x33,0x9c,0x4f,0x95,0x2a,0xb9,},{0xda,0x34,0xb1,0x98,0x3e,0x8c,0x55,0xe4,0x1f,0xda,0x8e,0xc8,0xab,0xf2,0x3b,0x36,0x7a,0x0d,0xa6,0x06,0xc8,0xcd,0xbb,0x1e,0x8b,0x57,0xe0,0x34,0x3c,0x05,0x57,0xa5,0xf0,0xe8,0x15,0xe7,0xf2,0x2f,0x86,0x05,0xae,0x93,0xb2,0x7d,0x03,0x77,0x6a,0xc1,0xf7,0xde,0x3d,0x79,0x2e,0xa2,0x93,0x3a,0xc2,0x2d,0x2d,0xc2,0x3b,0x32,0x3d,0x0c,},"\xec\x84\x3d\xc4\xdd\xa6\xe9\x02\xe9\xbe\x31\xb7\x0f\x11\x76\x3b\x75\x7a\xb6\xce\x73\x34\xdc\x00\x76\x4b\x2d\x08\x4e\x9d\xaf\x24\x84\x48\x59\x84\xee\x28\xa2\x83\x0f\xcb\x94\xc5\x41\xcb\x46\x94\x40\x03\x67\x31\xde\x80\xff\x56\x0f\x53\x0c\x9d\x9e\x6e\x1f\x7d\x9c\x4c\x5b\xdf\x50\xb0\x4f\x54\x03\xc2\x9f\x76\xd7\xe3\x6e\x00\xbb\xea\x35\xdb\x1c\xc6\x0d\xa8\xd7\x76\x52\x62\x66\xc3\x32\x4c\xe7\xef\xec\x64\x50\x85\x96\x09\x26\x68\x56\xd7\x01\xa4\x7a\x48\xde\xe8\xbf\x37\x40\x95\x65\xc7\xfb\xfa\x99\xa2\x04\xe5\x53\x0c\x97\x1c\x60\x5b\x44\x30\x5d\x5c\x74\x67\x89\x41\x14\x25\x3c\xf4\x3c\xdd\xf1\x8b\x62\x96\xdd\x25\x4a\x4d\x96\xac\x70\x00\x91\x81\x86\xdf\xd4\xbf\x45\x4e\xd3\x09\x74\xc5\x53\xd0\xae\x15\x1a\xd4\xcf\x54\x0c\xec\xaa\xa0\xb5\x94\x8b\x09\x85\xa9\xc7\xb6\xe7\x81\x59\x32\xba\xc1\x17\x32\xfc\x7d\x10\x26\x7f\x6b\xf8\xf1\xe7\xc0\x8d\x65\x0e\x56\x7b\x4e\xdd\x15\xae\x79\x58\x41\x0e\x42\xf1\xf5\x37\xfa\x73\x2f\x72\x7a\x26\x83\x88\x32\x1d\x53\x44\xc4\xe7\x8b\xb9\xa7\x4e\xab\x9d\x6a\xbf\x96\x89\x65\xc6\x66\x93\xd5\xf1\x12\xdd\x4c\x14\xfd\xfd\xd9\x60\x05\xea\xa6\x75\x7f\xa2\xcc\x10\x13\xfe\x43\x27\xab\x09\x99\xd1\x17\xf3\xdb\xf3\x25\xb0\x7c\xd4\x54\xd4\xb1\x41\x99\x1e\xf7\xe2\x3d\xb5\xee\x24\xbe\xda\x35\x88\x4a\xa3\x70\x48\x08\x64\x8a\xa4\x3c\xd6\x25\x62\x59\xf7\xd3\xdb\x5e\x05\x53\x11\xf2\x53\xe8\xb5\x7a\x4c\xda\x5a\xfe\x0b\x0a\xdf\xc3\x64\xe1\x60\xca\x37\xe8\xde\xc6\xb9\x5a\xa6\x15\x2e\x5d\x5d\xa6\xeb\x91\xbe\x0e\x44\xff\xe8\xe4\x95\x33\x26\x7b\x7e\xb7\x95\xf5\xf8\xe0\xb2\xc3\x5b\x29\xdf\xbc\x87\x58\x5f\x22\xbd\x5b\x90\x9d\xfd\x6a\x5e\xdc\x0e\x3a\x9d\x97\xb0\xc4\xf3\xad\xc5\x1e\x96\x99\x37\xc0\x8f\xd6\x5f\x53\x7a\xac\xda\x8f\x11\x27\x5a\xf0\x2c\x33\x54\x54\x26\x30\xf3\x92\x0c\x39\x3f\x5c\x42\xb9\xfc\x63\x3d\xe9\xd9\x4c\x72\xe3\xf2\x00\x02\x34\x9a\xd0\x41\x80\x35\xb3\xf2\x5f\x02\xca\x92\x8e\x5b\x2d\x40\xa7\x7a\x1c\x3e\x56\x22\x1f\x4b\x9d\xb0\xc2\x5b\x09\x6d\x6e\x5d\x0f\xe7\x58\xda\x2c\x69\x05\x3e\x8d\x08\x6d\xef\x4e\xdc\x6e\x34\x53\x78\x3f\xfc\x63\xa4\x96\x01\x22\xd9\x23\x67\x1a\x90\x60\x08\xba\xc1\x05\x61\xae\x62\x19\xd2\xb5\x1d\x53\x67\xbf\x13\xcc\xab\xf5\x93\x1b\x9f\x18\x6e\xb1\x09\xba\xcd\xe4\x0e\x1a\xf2\xb5\x64\x81\xe0\xc6\xdc\x6f\x5c\x54\x73\xf8\x00\x1c\xf3\x71\x91\x9a\xcb\x40\xce\xc5\xb9\x62\xeb\xba\x80\xe3\x2d\x6e\xba\xc4\x80\x6d\x04\xd2\x47\x68\xc2\xad\x2e\x3f\x92\xa8\xcb\xe4\x77\x54\xf9\xbf\x61\x59\x53\x52\x2b\x26\x3d\xc2\x49\x37\xfb\xd9\x32\xc8\xc4\x59\xeb\x8b\x10\x94\x43\xaf\x6c\x19\x5a\x59\xfd\x27\x21\xb0\x12\x56\x28\xf2\xb8\x14\x3c\xf3\xc1\x28\xbc\xec\x13\x92\xef\xd1\x6b\x73\x4c\x10\x71\x6d\x96\xba\x7d\x1f\x41\x39\x17\xcc\xaf\xa5\xbf\x5f\x83\xf5\x24\xfe\x84\x06\xa1\x52\x11\x5e\xa7\x70\xe1\x74\x5e\x82\xe8\xb5\x1d\x75\x2b\x8b\xd7\x85\xdf\x48\xbf\xc1\x20\x41\xbf\x87\x4f\xc7\x3a\xfb\x42\xca\x5d\x69\xc6\x41\x64\x79\xce\xb4\xaa\xa0\x49\x2b\x6f\xf2\x1e\xe1\x2d\xb2\x21\x3a\x42\x86\xfd\x56\x05\xc9\x3a\x7b\xb8\xa3\xb0\x71\xb0\xb2\x5f\xb0\x1d\x77\xab\xbc\x87\x71\x48\x94\x70\xa1\x07\xaa\xda\xe9\xf6\x40\xc2\x4d\xfd\x53\x28\xf6\x0f\x4b\x7d"}, +{{0x70,0x94,0x16,0x07,0x49,0x97,0xb9,0xc9,0xaf,0x4d,0x37,0xa0,0x11,0x39,0xe8,0xa3,0xf9,0xf2,0xce,0x5d,0x72,0xa5,0x7d,0x80,0x5e,0x82,0x2a,0x81,0x18,0x6d,0x01,0x7e,},{0xae,0xe1,0x10,0xf1,0xf4,0xd4,0x6e,0xa6,0x06,0x49,0xd7,0x86,0xb1,0x50,0x05,0x2e,0x28,0x7a,0x9d,0xa6,0x01,0x22,0xc4,0x7b,0x09,0x08,0xfa,0x8b,0x2c,0xa2,0x8a,0x80,},{0x8e,0x4b,0x41,0xf0,0x97,0xd8,0x36,0x14,0x18,0x4b,0xa7,0xf5,0x2b,0xa2,0xfd,0x9f,0x05,0x65,0xf8,0xa6,0x37,0x21,0xef,0x55,0xf9,0x31,0x62,0x82,0x6b,0x9f,0x0a,0xc0,0x70,0xc0,0xe2,0x86,0x4b,0x5f,0xfd,0x8e,0xcc,0xc1,0x8e,0xfa,0xd1,0x8b,0x2c,0xe8,0x4b,0xe5,0x7c,0x0b,0x4a,0x41,0xc5,0x2e,0x20,0xef,0x37,0x72,0x23,0x77,0xc6,0x0f,},"\xed\xda\xa3\x69\xc0\xe3\x1a\x1f\xcc\x1d\xa4\x6f\x65\x36\x24\x42\xa0\xcc\x21\xc7\xdc\xdd\x5c\xd9\x0e\x0a\x2e\xe9\xf2\x51\x10\x81\x2b\xa1\x14\x93\x1c\x86\x8a\x70\x86\x07\xac\x16\x08\x4d\x79\x71\x5d\x13\xb3\x38\xc0\x5c\x6a\xef\x73\x43\xe7\xda\xd2\x82\xf9\x6f\xe2\x81\x93\x18\x8f\x0c\xc8\x93\xc7\xdc\xe8\x05\xfd\x3a\x7c\xd2\x68\xb7\x28\x94\x16\x0b\x52\x45\xfe\xd9\xfa\x99\x43\xb7\xc8\x0a\xdb\x3c\x2d\x1a\x35\x3d\x8f\x12\xdf\x25\xa3\x1d\xde\x7f\xa3\x85\xbb\xec\x35\x1d\xa6\x6f\x15\x30\x32\xe1\x77\x56\x27\x3f\x8d\x54\xe9\xa3\xb9\xea\x25\xae\x67\xd1\xe9\xc1\x8c\xc6\x8b\xe6\x01\xe3\xd6\x82\x82\x81\x8c\xe0\xe7\xcf\x88\xa4\xd1\x33\x64\x53\x02\x17\x32\xf0\x8d\x9e\x76\xcd\x23\x63\x79\x29\xb0\x91\x1d\x5f\x86\x14\xf4\x84\x2e\x67\x0c\x14\x28\x60\xaf\xc2\x65\xc5\x01\x72\xb1\x3b\xfd\x35\xad\x8f\xc5\x4b\x28\x65\x7d\xa3\x2b\xac\x15\x3b\xa9\xaf\xfc\x89\x7a\xfb\x3c\x72\x1f\x48\xca\xa4\x62\x40\x58\x57\x10\xb0\xf2\xd2\x4d\x5f\xf4\x96\x5d\x1d\x10\xf1\xa0\x7b\x06\xab\xea\x6a\x08\xe1\xd6\xf1\x50\x0d\xa1\x2c\x43\x4a\x6d\x77\x8c\x94\x10\x67\x10\x80\x00\x47\x5c\xe8\x31\xbc\xfe\x2d\x0a\xfe\x40\xb7\x41\x9d\x07\x05\x9b\xc0\xcd\x8d\xce\x4b\xe9\x58\x7f\xf2\x9a\xd8\xbf\x0b\x26\x8a\xe2\x3c\xe0\xda\x5b\xb5\xbf\x74\xff\x0b\x2b\x31\xb8\x21\x12\xa9\xfd\x5a\xbd\x9b\xfd\x0a\x90\xe6\xf4\x72\x35\x48\xc6\xbb\x2f\x99\xdc\x06\x1b\xa3\x2e\xba\x2d\x53\xe6\xbc\x79\xbf\x44\x1b\x23\xfb\x74\x60\xde\x04\xe8\xe8\xef\xbc\xd4\xd4\xcc\x73\x55\xde\x9e\x3b\x08\x61\xa6\x81\xb9\x83\x83\x9d\x44\x88\xe5\x51\x75\x1f\x23\xe9\xa6\xe2\xe4\xd4\x43\x27\x3b\x9e\x0f\xe6\x4d\x8a\xcd\x1c\x74\x8b\x55\x59\x43\x82\x23\xdd\x21\xb5\x18\x31\x89\xe0\xf3\xc0\xe8\xed\x41\x4c\x03\x56\xba\xb7\x7a\x65\x4d\xe1\xa5\x77\x14\x62\xef\x14\x34\x49\x70\xa4\x91\x51\x1a\x72\x29\x14\xf4\xa8\x9f\x4f\x1a\x82\x7e\x18\xcd\x84\x47\x9c\xc9\x25\x92\xea\xdf\x8d\xe2\xdf\x82\x4b\x97\x6d\xcb\xd2\x84\xa3\xba\x64\xbc\xdb\x0d\xf1\x5e\x8f\x41\xc0\xb2\x47\x15\x86\xb2\x6a\x06\x35\x3d\x90\x50\x28\x23\x5c\x1c\x6e\x5c\x45\x87\x22\x27\x25\xaf\x08\x3e\x11\xe7\x9c\x94\x3a\xa4\x44\xd4\xaa\x41\x21\x8d\x3e\x97\x43\x36\xe3\x72\x81\x3e\x99\xe2\xb0\xc5\xf0\xae\x81\x0f\xfe\xd9\xa7\xa3\xd6\xcb\x74\xc5\x47\x3d\x99\x0a\x59\x11\x32\x9b\x8e\x82\xec\x6b\xf2\xbd\x43\x21\xbb\x48\x73\x70\xf8\x73\x9e\x7a\x2a\x4a\x53\x43\x08\x33\xd4\x5b\x9f\xe3\xde\xb9\x3f\x79\xfc\x6a\x51\xd5\x63\x69\x5e\xcd\xb9\x78\x58\xd2\x13\xda\x58\x44\x34\xb7\xc7\x15\x46\xaa\xe8\xd9\x67\xe1\xc6\xd0\x08\x2b\x10\xd4\xa7\x2d\xe1\x74\x2e\x53\xc4\xb2\xf9\x2e\xb8\xb5\xc8\xc3\x5a\xb6\x53\x5e\xa8\x10\x0b\x37\x92\x4a\x0a\x91\xd2\xa7\x28\xd0\xf5\x64\x24\x37\xaa\x66\xc8\x2a\xb7\x4b\x5d\x07\x45\xec\x08\xf7\x70\x5c\xb8\x1f\xa0\x79\xd8\x9e\xcd\xc9\xaa\x1f\x8d\x7d\x82\xdc\x77\x46\xd3\x46\x15\x34\x3a\x69\x25\xdc\x31\x8f\x35\x2a\x2b\x45\x01\x24\x38\x42\x4f\x90\x98\xfd\xdf\x6e\x61\xfd\x1f\x8f\xb4\x9d\xa4\x0b\x3e\xec\xe8\x9a\x1a\xf1\x99\x6d\xe7\x0c\xd1\x69\x6c\xbf\xd9\xe3\x01\xea\x5f\x44\x37\xc7\x1a\xc2\xa0\x32\x25\x4c\x14\x0a\x90\xe8\x5f\xb8\xff\xc4\x66\x7f\xa1\x39\xc1\xee\x9b\xbf\x12\xee\xd9\x06\xa9\x67\xbc\x09\x21"}, +{{0x3d,0xcb,0x7a,0xe7,0xd9,0xf0,0xf1,0x41,0xf1,0xd9,0xf0,0x78,0x83,0x63,0x5b,0x91,0x3e,0xd2,0x9f,0xb6,0x1d,0x0f,0x74,0x1c,0x9a,0xfd,0x05,0xa2,0x7b,0x04,0x5b,0x06,},{0xae,0x62,0xb7,0xee,0x1b,0x8d,0xb5,0x76,0x4d,0xaf,0xdd,0xd9,0x72,0x4a,0xcc,0x10,0x6d,0x6c,0x0a,0x4d,0x1e,0x85,0xd8,0x90,0x6f,0x75,0x84,0xb5,0x58,0xf5,0x77,0xdf,},{0x09,0xa1,0xe6,0xfe,0xdf,0x97,0x1b,0x3e,0xdb,0xfa,0xef,0xbe,0xb8,0x9a,0xa5,0x39,0xca,0x0b,0x02,0xb3,0x7e,0x7a,0xc4,0xea,0x89,0x20,0xd6,0xd4,0x34,0x8e,0xe0,0xcf,0x9a,0x2d,0x5e,0x96,0xfc,0xe5,0x17,0xc6,0x65,0xe7,0xc3,0x83,0x68,0xba,0xf2,0x49,0x79,0x24,0x9a,0x95,0xb7,0x0e,0xa7,0x43,0x6c,0x00,0x78,0x5f,0x16,0xa3,0xae,0x09,},"\x38\x11\x6a\x57\x26\x69\x07\x0d\xd5\x86\x32\x18\xc9\x1a\x77\xa4\xab\x47\x55\x36\x88\x48\x8c\x79\x28\x38\x50\x9e\x9a\xba\x25\x06\x7a\xdb\x7e\xa4\x24\x98\x48\x00\x9d\x91\x4a\xe9\x87\xa6\x03\x23\x48\xc1\xc0\x68\x1c\xf9\x77\xa9\x55\x2d\xd6\xbb\xf4\xe6\xff\x32\xac\xc9\xfa\x61\xcb\xee\x25\xa3\x93\x07\x65\x0f\x8b\xa6\xa7\xce\x42\x1e\xf2\xf7\x1b\xcc\xc0\x95\x81\x38\xf9\x32\x4c\x86\xbf\x2e\x52\x8f\xa3\xe4\xd1\xb1\x9f\x9f\x2c\xa5\x26\x84\x09\xb8\xcc\x19\xc6\x2d\xd9\x79\xb8\x96\x97\xe4\x57\xed\x2d\x98\xbd\x20\x96\xf6\x2d\x3d\x9e\x24\x73\x88\x79\x59\x27\x80\x3e\x79\xab\x71\xd4\xf7\x2f\x56\x8e\x94\x5a\x8a\x16\x21\x59\xd9\xb8\x48\x36\xe4\x58\x56\x44\xd4\x97\x9f\x61\x4a\xad\xa7\x3a\xd4\x13\xa8\x33\x91\xe9\xcf\x88\x0c\x42\xac\x2a\x98\x34\x3b\x6a\x82\xcd\x2b\x61\x58\x14\x56\xf6\xde\x5c\xeb\x24\xfe\x46\xb7\x62\x5d\x52\xab\x2c\x2c\x32\x4a\xc7\x47\x03\xd1\x5e\x15\xf1\xae\xff\x80\x55\xd2\xf7\x39\xf7\x36\x3e\x16\xec\x1d\x78\xbe\x2c\x62\x99\x43\x6c\x8c\x8d\x33\x6b\xd2\x92\x71\xa8\x97\xa6\xec\x93\x2e\xd0\x87\x25\xbe\x21\xb2\x8f\x9a\xa1\x4e\xaf\x4f\x71\x85\x31\x54\xdb\x14\x58\x7c\x93\x0a\xb3\xeb\x02\x27\xad\x7f\xfb\x45\xb3\xba\xa6\xa9\x99\x49\x9c\xc8\xa6\xe4\x5b\x1a\xb4\xd0\xb3\x39\x78\x2b\xcd\x9c\xfb\xcf\x88\xcf\x7e\xae\x89\x1c\xc8\x41\xe9\xc8\x8a\x1f\x6a\x69\x1f\x39\x48\xa6\xbc\x85\xba\x7f\x46\x11\x64\x2e\x84\x22\x3c\x3b\x17\x89\x46\xdd\xbe\xdd\xcf\xcd\xef\x4a\xe4\xc4\xe1\xa8\x14\xb9\xb1\xf0\x2b\x1e\xaa\x82\x4d\xb9\x3f\x44\xb2\x7d\x14\x20\x6b\x34\x04\x65\xa1\xce\xfc\xf5\x35\xc6\x3e\x55\xc4\x28\x72\x24\x26\x27\x33\xd9\x8a\xaa\xa1\x54\xf3\xad\x42\xcd\x85\x46\xa4\x61\xce\x0d\x46\xd8\x86\xd3\x46\x1a\x21\x50\xcb\x45\xdb\xe5\x64\x73\xff\x63\xd3\xdc\x7a\x2b\x95\x7b\x82\x39\x69\xf1\x9b\x59\x68\xe8\xb4\x24\xc8\x79\x74\x19\x26\xd8\x2c\x63\x86\x75\x3b\x0f\xa1\xf0\x80\x28\x4e\x55\x78\x94\x23\x63\xaa\xde\xb2\x1f\x8e\x1e\x89\x09\xfa\x6c\x38\x07\x64\x14\x9b\xc9\x15\xb2\x28\x60\x4e\xfc\x56\xd9\x2e\x4b\xeb\x72\x0e\xdc\x74\xc4\xd7\x8f\x92\x5d\x6c\xfd\xf7\xba\x2f\x14\xb5\x62\x37\x75\x81\x0d\x2d\x07\xbd\x38\x8c\x57\x3e\x36\x52\x3f\x21\x57\x38\xe6\x91\x14\xdc\xf8\xd8\x0f\x17\x0b\xfa\x67\x6e\x31\xfb\x62\x6a\x7d\x44\x9e\xd9\x66\x47\x36\x34\x75\x97\x0c\x8c\x47\x80\x97\x09\xbc\xb5\xe7\x20\x0f\x2a\x22\x7c\x7c\x8e\x7b\x00\x0f\x30\xc0\xbd\xe6\x1d\x67\xbd\x68\x95\x36\x16\x29\xa3\x6c\x8f\xdd\x5a\x56\xb8\x1e\xfb\xac\xf1\x5c\x1b\x35\x30\xa0\x8c\xde\xd5\xb1\xfd\x45\x7f\xbd\x2f\x03\x04\x2f\x56\xf1\xb3\x7e\xd1\x5c\xdb\x91\x2f\xa0\x29\x8c\x27\x67\x25\x08\x7e\xe2\x7d\x3c\xf2\x55\x0f\xe6\xe8\xa0\x33\x0a\xf4\x17\xf4\xf5\xba\xf0\x36\x27\xed\x67\xc5\xf8\x32\x33\x63\xab\xac\x5a\x1f\xe3\x48\x23\x18\x0e\x3e\x0e\x20\x80\xf7\x5b\xfd\x91\xc2\x07\xcf\x6b\xaa\x9a\x22\x9c\xf4\x43\xdd\x44\x2c\x59\x02\xe0\x67\x3f\x32\x52\xb8\x52\x63\x46\x58\x58\x72\xf6\xcd\x36\x60\x25\xa5\x69\x92\xb7\x0e\xde\x39\xbc\x8d\x32\x2f\x9c\x22\xa1\xdc\x59\x9e\x9f\x0d\x52\x4c\xb6\xd2\xea\x5a\xe2\x87\x8e\xf6\xbe\xd4\xb7\x02\x80\x7f\x1e\x1e\x73\xeb\xf2\x90\xeb\x6c\x0e\xeb\x85\xc1\x37\x16\xf6\x26\xaa\x90\xd3\x64\xb4\x90\x48\x37\xce\x05"}, +{{0x29,0x73,0x11,0xdd,0xef,0xfe,0xc9,0xd2,0xbe,0x68,0xef,0x7b,0x2a,0x20,0xfe,0x2d,0x27,0x7e,0x1d,0x8e,0x51,0x64,0x8b,0x03,0x57,0x2a,0xda,0x27,0xec,0x1f,0x9f,0x43,},{0x6a,0x6c,0x28,0xe7,0x61,0x64,0x0c,0x40,0x08,0x33,0x3a,0xae,0x5a,0x33,0x66,0x30,0x2e,0x2f,0x46,0x77,0xa9,0x53,0xba,0x48,0x2a,0xb6,0xfb,0x4a,0x1d,0x70,0xb4,0x47,},{0x4b,0xf0,0xb9,0x2c,0x6e,0xe4,0xea,0xce,0x5e,0x8e,0xb1,0x03,0x70,0xff,0x9d,0x9c,0x68,0xa5,0x74,0x9d,0x59,0x89,0x9d,0x04,0x32,0x7a,0xaa,0x38,0xf8,0xf8,0x25,0xe0,0x32,0xe5,0x97,0x42,0xb3,0x7d,0xe2,0x31,0x07,0xa3,0xec,0xdd,0x3f,0x7a,0x0d,0x08,0x12,0x26,0x14,0xb7,0x8f,0xdd,0x37,0x29,0x3c,0x8d,0x05,0xe2,0x8f,0x5f,0x71,0x08,},"\x26\x52\xac\xfc\x3b\xdf\x09\xa5\x99\xec\x67\x86\xbb\xd9\x4f\xe5\x77\xcf\x57\x8e\x02\x63\xcc\x68\xd9\xf5\x7a\x6c\x83\x45\x8f\x80\xac\xd8\xa7\x5e\xf0\x30\x40\xa6\x35\x67\x2b\x96\x8f\xf2\xaf\xdb\x28\x8d\x28\xb9\x99\x6f\x64\x15\xb2\xf3\x17\x5e\x9e\xa3\x7a\xeb\x05\xdf\x81\x81\x2e\x38\xa4\xc9\x76\xeb\x92\x85\x6c\xed\xb9\x1a\x26\x9a\x46\xfc\xa5\xdf\x9b\xd7\x30\xfd\x84\x45\x2b\x4b\xd9\x35\x77\xc6\x1f\x42\xc1\x41\x13\x97\x98\x82\xa8\x6a\x9f\xe6\x32\xe4\x75\x6a\xfd\x89\x81\x6f\xc4\x67\x0a\x31\x05\x03\xfd\xaa\xd2\xdb\x76\x4c\x37\x21\x21\x3c\x3e\x60\xf2\x9c\x26\x68\xd4\xde\x8f\x42\xb0\x87\xf2\x5c\xd5\x6c\x69\xa4\xe4\x8f\x13\x4f\x55\x98\xcf\x14\x5b\xe6\x38\xa5\xc2\x31\x88\x63\x32\x90\x61\x72\x9a\xac\x91\xda\x6a\x19\x1f\xd7\x74\x88\x0c\xf9\xcb\x55\x5e\xec\x15\xb0\x04\x4f\x10\xe5\x43\x3f\xb4\x6a\x9b\x88\x92\xda\x8f\x6d\x24\xf1\x42\x58\x8b\x70\xff\x0b\x49\x20\x0c\x50\x6b\x88\xbe\xd4\x49\xad\x10\xd3\xf9\x2c\x2b\xae\xda\x6b\xbf\x58\x67\x6c\x5b\xbc\x67\xd3\x1f\x64\xfb\x12\xe8\xd5\xe7\x88\x76\xd5\xc8\x49\xfc\x31\x4b\x2c\xf8\x01\x0c\x51\x02\x04\xc8\x63\x3d\x0c\xc3\x18\x56\xec\x6a\x11\x4e\xa8\xa8\x9c\x48\x92\x7b\x07\xa3\x1a\xb8\x42\xc9\xb8\x35\x2d\x93\x67\x34\x51\x41\xa9\x9b\x40\x04\x9d\x5c\x48\xe7\xd2\x7c\xab\x42\x7a\xde\xfd\x1f\x0f\xc1\x13\x6b\x35\x3c\xb0\x1c\x3d\xef\x91\xff\xfe\xe8\xad\x91\xe8\x8f\x4b\xb7\xd2\x61\x5c\x0d\xcc\x95\x34\x4c\xd0\x19\x50\x93\x8e\xcb\x14\xb8\x44\x6b\x56\xa0\x6b\xf2\xf2\xf6\x5f\xb8\x73\x5e\x8a\x7b\xc9\x6b\xb4\x6c\xe9\xca\xc7\x1a\x88\xeb\x8f\xda\x5e\x69\xd6\x9e\xb2\x9a\xa4\x2a\x01\x6b\x85\x83\x89\x3e\x9d\x72\x77\xcb\x13\x59\xc5\x68\x7e\xed\xcd\x59\x9d\x8a\x46\xe6\xc1\x49\x63\x63\x7d\xb0\x4a\x92\x9f\x4b\xc7\x93\x04\xac\x2d\xae\x73\x3b\x3a\x83\x9e\xb7\x4f\xbe\x3d\xe5\x04\x2f\xd6\x55\xea\xec\xb1\x5f\x39\xb2\xfe\x16\xda\xd8\xa6\xff\x8d\xbc\x05\x4f\xed\x51\x28\x2a\x85\x6e\x9d\xa6\x31\x6f\xac\x6d\xb5\xd5\x6f\x77\xf1\x8d\xa8\x41\x2e\xb3\x77\xe5\xb1\xb8\xf4\xcb\x13\x54\xec\xfe\x8f\xe8\xfd\x54\xe6\x2d\x76\x7a\x80\xde\x04\xcb\x76\x20\x22\x9a\x88\x31\xdb\xc9\xec\xd4\x57\x8f\xfa\x2f\xf0\x6b\x54\x45\xe4\x40\xd6\x9a\xab\xc9\x4c\x47\xbd\x17\xf2\x2b\x69\xf5\x2e\xea\xe5\xcf\xcd\x01\xa5\xca\xfe\x05\x80\x07\x2a\xe9\x16\x6b\x95\x74\x3d\x68\xc3\x56\x4c\x5a\x7e\x46\xf2\x4b\xc4\x8a\x89\x8a\x1a\xb2\xeb\xe6\x3f\x36\x85\x1d\x2a\xac\xfa\x0c\x4f\x32\xd9\x93\x77\x1d\x31\x4e\x72\x5a\x43\xd9\x80\x5d\x13\x71\xcf\x72\x3e\xf1\x61\xd4\x2e\x63\xff\xca\x68\x8d\x7f\x0e\x21\xef\x5b\x3f\x9a\x56\x1a\x62\x10\x70\x2b\x85\xfb\xd1\xf8\xca\x75\x38\x9c\xc7\xa2\x27\x39\xba\xe4\xde\xd9\x37\x57\xf1\x52\x0d\xc3\x88\x44\xa1\xa8\x8b\xe8\xe0\x96\x45\x05\x91\x48\x80\x7b\x93\x37\x70\x87\x8c\xb8\xa9\xad\x92\x11\x31\x71\x31\xe6\x93\x24\x53\x2f\xd0\x27\x9b\x83\x18\x5b\x62\x8f\xc2\xf9\xe2\x15\x00\x38\x46\x93\xfa\x29\xf2\x6b\xd1\xb9\xc3\x01\x60\x13\x67\x66\x5f\x05\xf3\x72\xda\xb4\xe3\x10\x77\x26\xcd\x3f\x63\x9c\xa6\x2b\xf6\x3a\x75\xf7\x7e\xaa\x75\xf7\x13\x61\x57\xad\xa2\x37\x4e\x65\xfb\x4f\xd3\x49\xb4\x5e\x25\x44\x1f\xd2\x1b\x13\xe6\x91\x13\x66\xb9\x7c\xfb\x4d\x6a\xd5\x22\xb8\x50\xad\xf4\x0c"}, +{{0x4d,0xb2,0xb5,0x81,0x44,0xa8,0xd2,0xd0,0xec,0x03,0xbb,0x9b,0xc2,0x9b,0x4c,0xa8,0x93,0x85,0x4c,0x80,0xb6,0x4a,0xfa,0x4a,0xf7,0xa9,0xc9,0x36,0x93,0x5e,0xcb,0x04,},{0xfc,0x5c,0xd7,0x50,0xe1,0x74,0xed,0x71,0x8b,0xd9,0x38,0xfa,0x8e,0xd9,0x9a,0x1b,0x9d,0x55,0x6b,0xa7,0x67,0x0f,0x2a,0x77,0xda,0xf1,0xc7,0x20,0x11,0x37,0x32,0xa5,},{0x42,0x45,0x17,0xaa,0xdd,0x85,0x3c,0xe3,0x98,0x57,0x59,0xa3,0x27,0xe7,0x76,0x0d,0x91,0x56,0xd3,0xb2,0x73,0x45,0x38,0x3f,0x0e,0x4a,0xd6,0x66,0x1e,0xe4,0xa3,0x72,0x4d,0x18,0xd8,0x20,0xf6,0xc5,0x57,0xf8,0x27,0x97,0xbe,0xb6,0x2d,0x2f,0x08,0x54,0x33,0x74,0x4f,0x89,0xa2,0xd8,0x52,0x93,0x79,0x64,0x81,0x86,0x2e,0xf8,0xa4,0x0f,},"\xc8\xd1\xdb\xc9\x36\x91\x1e\x12\x2c\xee\x18\xf9\x2b\x16\xa3\x9a\x2e\xef\x08\x23\xb2\x27\xf8\x98\xcd\xf5\x84\x2b\x93\xd5\x9f\xc0\x02\xed\xb5\x49\x8a\x20\x87\x2e\x19\x55\x4e\xf7\x39\x99\xeb\x3a\x7b\x3e\x2f\xdd\x90\x70\xe1\xef\xa9\x22\x8e\x9e\x93\xb2\x9a\x86\x8a\xe3\x79\x9e\x4e\x57\x23\x24\x83\x6b\x1a\xd5\xaa\x81\x2b\xf0\x0f\x84\x5b\xc2\x17\xeb\xbc\x3f\xab\xdc\x4e\x1b\x6e\x51\xef\x9e\xfa\xc2\x77\x0a\xa0\xa4\xa1\x1e\xe5\x2a\xb9\x56\xac\x64\x48\xaa\x26\x29\xcb\x61\xdb\xb1\xf1\xed\xb3\xbd\xe9\x9b\x48\x76\xda\x39\x2a\x6e\x0b\x9a\x0c\x31\x84\x9a\x58\x90\xae\xa9\x52\x2f\x56\xd0\x15\xa1\x93\x50\x15\xb9\x1b\xf4\xc6\xa0\x01\x1d\x23\x77\xd6\x71\xc3\xd0\xd7\x53\xc2\x7f\x8c\x76\xe4\x05\xd0\x23\x0f\x1f\x4b\x9b\x88\xfc\xeb\xba\x1e\xaf\x13\x77\x72\x35\xe5\x53\x24\xb7\xd3\xf8\x1e\x68\x61\x09\xd9\x1c\xe6\x89\x53\x0b\x90\xd2\xc5\xc7\x1d\xd1\x87\x72\xb3\x85\xd6\x2c\xcb\xfd\x2e\x08\x9a\x1b\x67\x09\x83\xf6\x0c\x21\xc4\x45\x5c\xb9\xd1\xa0\xdc\xaa\x74\xc8\x74\xe3\x52\x11\xf8\x22\x7f\xf7\xc2\x34\xdf\xf8\x5e\xc0\xb0\x7e\x36\x8c\xfa\x50\xa3\x43\x57\x83\x95\xa1\x4c\x68\xf1\xf8\x9b\xd4\xec\xbc\x17\x2e\xf8\x05\xe5\x83\x1e\xc8\x94\x75\xfc\xc8\xd6\x85\xca\x92\x55\xa7\x7e\x3b\xa3\xc1\x47\x50\x8e\xc9\x2d\x7b\xcc\xe8\x79\xaf\x0a\xbd\xd2\x41\x6b\x67\xb5\xf5\x05\x07\x33\x79\x14\xf3\x90\xbb\xe0\xb4\x50\xb6\xa2\xf1\x15\x93\x72\xc4\xbc\xce\xa3\x82\xce\x3d\x6d\x9f\xb2\x51\x5e\xcf\x79\x30\x05\x9a\x05\x52\xb7\x5f\x97\x88\x62\xbf\x97\xe8\x32\x5a\xf2\x4d\x1b\x8c\xe9\x51\x2b\xfc\x7c\xef\x88\x42\x32\x04\x23\x41\xd8\x2f\x9b\x5d\xad\x2e\x50\x2a\xc6\xac\x79\x5f\x99\xda\xc7\xfc\x60\xe3\xb8\x63\x9d\x0e\x15\x00\xde\xad\x4e\x78\xac\xa1\x09\x95\x7d\x57\x7a\x13\xc1\x92\x5d\x74\x03\xc1\xac\xf9\x89\xa9\xde\x67\x11\xe2\x3c\x67\xbf\x87\x22\xf5\x51\xb7\x74\xca\xda\x93\x1b\x5f\xd9\x73\x43\x4e\x3b\x71\x72\x81\x98\x83\xe7\x0c\x52\x78\x5e\x3b\x49\xd3\x23\xd0\x56\x36\x64\x11\x58\x64\x0d\xcf\x6a\x4c\x20\x0e\xb2\xc1\x3b\x1b\xee\xb2\xdc\x36\x03\x52\x47\x0d\x15\x38\x6e\x59\xe6\xfa\x60\x36\x7e\x5e\x7f\x17\x2b\x21\x15\x9d\x5e\xe7\xca\xb0\xd7\xf5\x86\x82\x39\x85\x8e\x2a\x93\x55\x04\x80\xfe\x8f\xb4\xdc\xaf\x4f\x22\x4c\x4b\x2a\xd5\x44\x87\x91\x63\x2d\xf3\x0e\x8e\x5f\xb9\x98\xb3\x5e\xa9\xae\xc8\xc9\x34\xa4\x40\x3a\xef\x82\x18\x7c\xa1\xab\xf8\x2a\x34\x4d\x00\xff\xb9\x93\xd9\xff\x34\x61\xd6\xfe\xcd\xaf\x5d\x3b\x48\x1e\x0d\x31\x15\x3d\xbf\x6a\xed\x28\x8c\x8a\xdd\x06\x4e\x83\x31\x55\x01\x41\xbd\x5f\x7a\x7e\x04\x7b\x86\x07\xd8\x46\xa6\xbf\xb7\x2d\x68\x34\x46\xa4\x45\x11\x46\x06\x25\x0d\x8d\x2d\x3a\x8b\x95\x08\xbb\x07\xd4\x62\x3c\xdf\x17\x88\xb5\x49\x9e\x9c\xb9\xa1\x37\x98\x49\xbf\xa1\x9c\x9a\x9f\x4c\xd3\xd9\x25\x3a\xdf\xfd\xa2\x5f\x47\xc8\x11\xbe\x83\x3b\x02\xf3\x32\x7e\xbb\xa8\x37\x30\x19\x5d\x61\x4b\xae\x6f\xe4\xe7\xa3\x83\x08\x15\xd2\xaf\x40\x0d\x20\xa9\x41\x7a\x09\x5e\x7e\x8e\xea\x10\x44\x91\x7c\xbe\x51\x2c\x40\x18\xd6\x56\xe2\xdb\x67\xbb\x98\x9c\x00\xe1\xe5\x07\x62\x3e\x82\x78\xd7\x29\x92\x5b\x84\xfb\x5c\x18\x6a\x7b\xac\x18\x9e\x6d\x6a\xb1\x4f\xd7\xb6\x2f\xdc\x63\x2b\xeb\xb5\xf7\x7c\xb5\xcc\x2f\x70\x7d\xf4\x05\x30\x99"}, +{{0xc8,0x20,0x41,0x3c,0x24,0x56,0x74,0x71,0x04,0x66,0x2e,0xf4,0xdf,0xf3,0xac,0x23,0x3a,0xc4,0xb9,0x1a,0x76,0xd3,0xc4,0xea,0x75,0x44,0x90,0xbc,0x9b,0x1e,0x29,0x1f,},{0x89,0x93,0xce,0xa2,0xf7,0xf2,0x80,0x6c,0x77,0xb3,0x98,0x1b,0x54,0xbf,0xa9,0xbf,0x17,0x62,0x15,0x1b,0x41,0x8e,0x5e,0x72,0x53,0x71,0xca,0x2c,0x04,0xd2,0x23,0xee,},{0x7e,0xf7,0x0e,0x4a,0x14,0x95,0x4d,0x50,0x9f,0x11,0x7f,0x4b,0xd0,0x1b,0x22,0x0b,0xcc,0x19,0x2d,0x3b,0x5f,0xdf,0xc3,0x48,0x2f,0xbb,0xc3,0xb6,0x9d,0xc0,0x68,0xa7,0xc4,0x76,0x1d,0x1b,0xeb,0xc2,0x31,0x7d,0x6d,0xb7,0x4f,0x90,0x6a,0x15,0x56,0x42,0xb0,0xa3,0xc6,0x59,0x2b,0xdc,0x72,0xe6,0x4e,0xac,0x6f,0x20,0x3f,0xb7,0x4e,0x02,},"\xd2\x99\x2f\x83\x92\x4a\x59\x48\x87\xe6\xef\x13\xf2\xae\x80\x8f\xc8\x63\x9c\x7b\x2c\x99\x4f\xaf\x0f\x79\x5e\x36\x01\x6d\xab\x77\x00\xa0\xee\x53\x01\x70\xf0\xb9\xfe\x98\xab\x75\x88\xce\x03\xbc\x50\xc2\xba\xe6\x5e\x05\x26\x47\xe7\x56\x73\x5b\x35\xd0\xb5\x9c\x96\x4e\x91\x7d\x8c\x83\xe2\xf9\xfe\xcc\x4c\xb0\x55\x64\x28\x7f\x0e\x34\xc9\x49\x40\x05\xe2\x5b\x1a\x8b\x1b\x94\x2b\x54\xd8\x90\x35\xf1\xb1\xc3\xc9\x45\xfc\xc8\x4e\x4a\x39\xef\xa2\xca\x50\x95\x9b\x45\x9a\xf7\x4d\x21\xb6\x24\x2e\x2f\x56\x51\x8f\x70\xe8\x67\x92\x57\xc0\x89\xd2\x6c\x3b\xb7\x92\x68\x7c\x92\x33\x55\xb2\xc1\x8e\xe2\x13\x6d\x40\xcb\xa4\x5a\xcb\x64\x24\x0d\x96\x67\xf3\x9d\xba\x36\x39\xb6\x51\x6d\x4c\x49\x47\x57\x3e\xf4\xce\xd8\x76\xb5\xb2\xea\x34\x89\xea\xea\x53\x9f\x55\x7f\x58\xda\x20\x46\x91\xa7\x6e\x29\xc9\x4b\x8b\x05\x38\x23\x2c\x5f\x7d\x0b\xb0\xfd\xd0\x16\x91\x04\x31\x35\x4b\x3e\x1e\x7c\xe6\x2a\xd4\x36\x91\x7c\xd5\xc3\x15\xa5\xbe\x9b\x97\x1c\x80\xf9\x7b\xc9\xd5\xc1\x56\xff\xd6\x4f\xd4\xe3\x1d\xa5\x60\x83\xe0\x2a\x0c\x8f\xce\x55\x4d\xb6\x86\x74\xcb\x62\x70\x0b\xa9\x51\x75\x2b\x82\x9b\x03\xc5\x42\x32\x74\x12\xee\xc9\xcc\xc6\xa5\x0a\xdf\x47\xbb\xee\x15\x44\x66\x82\xda\x2f\xea\x42\x04\x89\x36\xd7\x63\x06\x0c\xd8\xf5\x39\x65\x26\x16\xdf\xa8\x08\xd6\x23\xff\x77\x7b\x41\x13\x65\x2e\x78\x9e\xc0\x25\xb8\x5e\x04\xef\xe8\xad\x4c\x96\x0b\x19\x0b\xf4\xa5\xa6\x32\x4d\x6f\x57\xc1\xad\x22\x01\x8c\x83\xcd\x7e\x7e\x09\x7f\xc6\x7b\x80\x26\x9c\x13\xb4\xdd\x97\x01\xca\x98\xf9\x87\x69\x58\xba\x76\x89\xc6\xf6\xf1\x0a\x73\x2a\x64\xbe\xf2\x2e\x8b\x98\xbd\x30\x4d\x5d\xbf\x4f\xb1\xf9\xe4\xca\x53\x9a\x5c\x4a\xa6\x19\xc4\x4d\x6f\x58\xf8\x24\xb2\xdb\xae\x77\xb7\xe8\x3b\x56\xdb\x5e\x5a\xa7\xb0\xae\x9c\xe1\xcd\x10\xa6\x9f\x04\xa8\x0f\x13\x79\xeb\x0c\x47\x4e\x47\x82\xdf\x0e\x3b\xa6\xa1\x48\x22\x6b\xd1\xa6\x62\xd9\x5e\xe2\xd6\x7c\x52\x07\x33\x3c\xb1\xd5\x41\x76\xd9\xe5\x06\x45\x94\x79\x02\x9f\x31\xdc\xac\xe2\x69\x93\x8f\x6b\xc5\x62\x78\x78\x41\xdc\xfe\x10\x1f\x4d\xb6\x0b\xd6\x60\x16\xe1\xee\xbb\x6b\xfb\xd9\xcd\x83\x04\x2d\xd1\x37\x9a\x46\x4f\x40\x5a\xaa\xe3\xc1\x18\x07\x84\x8c\xc4\xf9\x5c\x3c\xc6\xfa\x92\xab\x4e\xa5\x30\x58\x34\xeb\x86\xb8\x73\xfa\x30\xed\x1f\x7f\x47\x0b\xf6\x63\xf1\xa7\x0c\xf9\xe6\x0a\xb6\x80\xcd\x1d\xbb\xd0\x3a\xc0\x43\x3b\x3d\x4b\xb4\x82\xf8\xb3\x44\xd4\x6b\x3a\xa9\x34\xb8\x63\x3f\x57\x09\x0b\xea\x5f\xcc\xca\x64\x88\x79\x98\x35\xf1\x33\xf8\xbc\xf6\xe8\x87\xca\x59\xd1\x90\x76\xd6\xca\x19\xd4\xe2\x83\x49\x05\x1e\x01\x6b\x03\xe9\xa9\x20\xf4\x12\x0f\xb5\x23\xd1\x37\x1d\x0e\x38\x46\x73\x19\x54\x3f\x12\x7e\xd9\x14\xb4\x3a\xd0\x62\x22\x6a\x53\x65\x82\xdb\x72\x8c\xcd\x76\xe9\x83\xf1\x17\x66\xa8\x86\x3c\x2f\x42\x4f\x65\x50\x8d\xcb\x26\xfe\x0c\x5a\x80\x0c\x35\x09\x39\x60\xa1\x21\x97\x6e\x30\x51\xe2\xef\x1a\x2a\x99\xc1\x2f\xb7\xbd\x8b\xc0\x37\xa4\x39\x68\x68\x06\xeb\x72\x01\x7a\x07\x1a\x91\xb3\xe3\x9c\x90\xe8\x6b\xc3\x35\xf9\xbb\x54\x3b\x12\x7c\x98\x86\x73\x8c\xb5\x38\x06\xb9\xcb\x3c\x25\x94\xc7\xef\xfc\x2a\x59\x20\xaa\x83\x4b\xe6\x5c\x49\xf4\x79\x64\xe8\x9e\xec\x74\x72\x8d\xe7\x71\xf3\xd6\x75\xde\x9d\x1e"}, +{{0x67,0x69,0xcc,0x8e,0x12,0x56,0x17,0xc2,0x2c,0xe5,0x72,0x37,0xa4,0xfc,0xa1,0x50,0x7f,0x94,0x12,0x34,0x66,0x1d,0xf7,0x43,0x28,0xd0,0x4a,0xb6,0x2e,0xf8,0x6c,0x47,},{0x05,0x11,0x2c,0xa6,0x0b,0xaf,0xf7,0x9b,0x49,0x16,0xc1,0xbe,0xe2,0xb9,0x39,0x0c,0x04,0x7a,0xf0,0x8c,0x35,0xeb,0xb3,0xc3,0x81,0xb9,0x74,0x8d,0x1d,0xd4,0xc4,0xfd,},{0xd3,0x9d,0x85,0x3d,0x2c,0x2c,0x5d,0x21,0xb5,0x87,0x1e,0xa5,0xa7,0x5c,0x04,0x10,0x48,0xd9,0x3a,0x47,0xdc,0x59,0x9a,0x5f,0xdd,0xc0,0x85,0x62,0x85,0xce,0x63,0x6f,0xcd,0xfd,0x85,0x64,0x08,0x3d,0x06,0xff,0x28,0x4a,0x52,0x4b,0xc6,0x33,0xcf,0xdf,0xc3,0xb0,0x37,0x16,0x3d,0x67,0x4c,0xb9,0xbb,0x5b,0xa3,0xbc,0x25,0xbe,0xd0,0x0e,},"\x68\x54\x89\x73\x9b\x98\x56\x47\x49\x58\x7f\xf1\xac\x96\xba\x68\x2d\xa3\x0b\x40\xa4\xde\x24\xf5\x4e\xc8\xb0\x83\xdd\xa4\x53\x33\x16\x21\x67\xcb\x3f\x97\xb2\xc7\x31\x4c\xe7\xa3\xf3\xf3\xd3\x19\xcc\xc3\x5b\xb6\xa9\xf0\x07\x7d\x56\x31\x61\xe2\x81\x46\x9c\xf0\x89\x68\xd9\xdc\xf7\xae\x5f\xff\x83\x0a\x5d\xb0\x0b\xc3\x80\x10\xe6\x66\x2d\x49\x4f\x3c\x86\x47\xc4\xf7\x0c\xe2\xd2\x9a\x9d\xa8\x46\x10\xa0\x80\xb5\x75\x9a\x3b\x58\x20\x52\xdf\xde\x66\xe4\xa7\xfa\x5f\xb2\x7f\x06\x50\x73\xfe\x72\x3d\x83\x70\x1d\x5b\xac\x06\xca\x43\xb4\x6d\x1e\x58\x09\x76\x70\xc1\x94\xa1\x3a\xf8\xb5\x73\xa3\x79\x1a\x96\x61\x55\x7c\xbc\x04\x27\x57\xab\x8a\xdd\x0e\xf7\xcf\x4f\x35\x43\x5a\x42\x12\x35\x3f\xcb\x3c\x20\x3c\x73\xdb\xc9\xd2\x68\x52\xd0\xe9\x17\x32\xe3\x62\x1c\xe8\x28\x92\x9c\xdc\xa4\xd9\x19\x20\x48\x75\x19\x22\xed\x22\x5e\xab\x29\x00\xcf\xf9\x71\xa2\xa2\xd3\x42\x46\x36\x48\xbb\xb1\x94\x43\x19\xa8\xef\x6d\x43\xdb\x62\x48\x0f\xbf\x1d\x72\x57\xd2\x26\x94\x53\x97\x93\xf2\x5c\x92\x79\x17\xca\xab\x25\xc1\x19\x3a\x2d\x2b\x23\xbb\x5c\xb8\x56\x9a\xef\xff\x4f\x0c\xa4\x23\xd1\x9b\xbd\x46\xfc\x5e\xf7\x52\x4f\xf8\xcb\x70\x6f\xfc\x47\x07\x65\x09\xc0\x5a\x81\x58\xaf\x77\xf9\x8d\xf6\xa9\xb5\xcb\x32\x44\xab\xa4\xb5\xc5\xf9\xce\x59\x7e\x7d\x29\xba\x07\x01\x3d\xca\xc1\x91\x1b\x6d\xe7\x11\x3c\x73\x6a\x40\x05\xc4\x59\x99\x29\x79\x01\x9a\x45\xb2\xdd\x80\x2a\x07\x66\x09\x09\xeb\x4c\xe2\x05\x40\x81\x70\xd8\x25\x45\xda\xcb\xa8\x68\x6d\xbd\xe9\x27\xdb\xc9\xc7\xd9\x62\x05\x8e\x9a\x95\xea\x66\xb8\xdf\xd3\xea\x43\x53\x57\xa9\x3c\x73\x94\x8c\xd3\x55\xf6\xac\x65\x52\x32\x3f\x17\xc2\xa6\x78\x66\x2b\xc0\xe9\x72\x6a\xd5\xa5\x25\x1d\xd2\x76\x47\x40\x4c\xbf\xe6\x1c\xea\xaf\xdc\xfc\x08\xa4\x75\xff\xd8\x7c\xb7\xf5\x97\xe5\x6a\xc1\x67\x04\x09\xdd\x94\x08\xae\x47\x70\x42\x0c\x6e\x5e\x6d\xd8\xe7\x48\xfe\x03\xa7\x2d\xc1\x28\x03\xd0\x27\x71\xd9\x2f\x47\xe6\xe7\x17\xcc\xc1\x44\xfc\x03\x72\x75\xb6\xf7\x45\xdd\x30\xda\x1a\x45\xd2\x9d\xb6\xd9\x07\x3e\xee\x50\x09\xcf\xd5\x46\x27\x33\x41\x4a\x49\x5f\x34\x9d\xb0\xb6\xdb\xf2\xce\xa9\xcc\xd5\x72\x38\xed\x5e\xe9\x1a\xd8\xbc\x86\x17\x9a\xd5\x69\x5a\x85\xa5\x04\x84\xe6\x17\x75\x1d\xe5\xef\x7a\x7d\x8a\x8d\xb9\x50\xa9\x8a\x6b\x7f\x7d\xee\x9d\x42\xa5\xdf\x69\x2f\xcc\xf5\x55\xc9\x40\xdc\x39\xcf\x2e\xac\x48\xcb\x9d\x15\xcd\xa1\x4d\xd2\xa7\xec\xc0\xb7\x6e\xbe\xc6\x8a\xd4\x17\x7d\x11\x17\xe0\x77\x66\xc4\x85\x90\xd4\x3c\xa7\x66\x28\x68\xeb\x97\x90\xac\x29\xf4\xf2\x39\x2b\x9a\x93\xf8\x97\x59\xe7\xba\x54\x6b\x92\x5b\xd8\x6f\x80\x7d\x8d\x16\xc7\xe6\x37\xdc\xc6\x66\xe9\x05\x90\xbf\x43\x0d\x98\x6a\x67\xf1\xb0\xc7\xc2\xc9\x49\x30\x84\x58\x69\xed\x8d\x8a\xdd\xe1\x8f\xc1\x88\x74\x56\x88\x1b\x4b\x26\xb5\x3d\xcb\xa7\xa5\x26\xf0\xec\xa1\x4e\x8b\xb6\x89\xd6\x6f\x0a\xa1\xb2\x53\xc3\xdc\xfc\xf5\x95\x40\xd5\xd2\xf5\xad\x61\x7f\x52\xc3\x09\x38\xa5\xa9\x2e\xa3\x85\x07\x7d\x75\xaa\x4a\xc0\x7a\xfc\x2b\x35\xfb\x8c\x1d\x5e\x78\xeb\x29\x5f\xc2\x0f\xe3\x7c\x41\xac\x06\x95\x9d\x3a\x17\x97\x84\x3a\xd7\x05\x6c\x1b\x41\x2d\xd0\xb4\x80\xaa\x3b\x39\xbc\xc2\x05\x87\xd9\xa0\xfe\xf9\x2c\x6c\x95\x0e\xbc\x5b\xb8\xe1\x42"}, +{{0x1d,0xf7,0xac,0xfb,0x96,0x33,0x04,0xe5,0x1e,0xc4,0x71,0xca,0xf1,0x81,0x10,0x25,0x56,0x78,0x3c,0xb7,0xd9,0x1e,0xad,0x30,0xbd,0xc2,0x53,0x4d,0x07,0x8a,0x14,0x88,},{0x05,0xa3,0x1f,0xfc,0x70,0xe4,0xe3,0x56,0x9f,0xc2,0xbe,0x11,0x0c,0x64,0x3a,0xd5,0xf0,0x87,0x91,0x3c,0x7a,0xa4,0x76,0xdc,0xd8,0xd6,0xe4,0xbc,0x7e,0xc2,0x2d,0x24,},{0xb1,0x81,0x93,0x8d,0xe1,0x01,0x42,0xf3,0x24,0x07,0xb4,0xe7,0x86,0xcd,0xdd,0xe9,0x32,0xeb,0x11,0xdb,0xc0,0xbf,0x0e,0x5a,0xc5,0x09,0xfa,0xe7,0xa5,0xbc,0xc3,0x29,0x61,0xfe,0x34,0x48,0xf9,0x12,0xc8,0x50,0x0f,0xc6,0xdb,0x4e,0x1d,0x32,0x62,0xa8,0x3c,0x9d,0xbe,0x76,0x9b,0xb8,0xc3,0xa7,0x61,0x00,0x0f,0xe3,0x6c,0x0d,0x71,0x04,},"\xb0\xc3\xee\xb5\x7f\x14\x60\x6a\xb7\xab\xea\xb2\xee\x05\x73\x84\x3c\xa2\x2e\x6d\xb2\xfd\xf2\xc9\x06\x4c\xea\x51\x98\xdc\x58\x30\xeb\x15\x8d\xa8\xe2\xda\xa8\x88\x57\xaf\x8b\x8e\xef\xcc\xf0\xc2\x6c\x3e\xc0\xf3\x30\xe9\x2c\xff\x06\xbc\x05\xa2\x9b\xfc\x99\xf9\x40\xb6\x1f\x3c\xfb\x29\x64\xb3\x37\x09\x7a\x65\x50\xa3\xe9\xa3\x28\xc8\x5b\xe6\xf1\x60\xd2\xc0\xa5\x7f\xf6\xf1\xb3\xc5\xff\xcc\xa8\x90\x89\x42\x5a\xb6\xbe\x01\x72\xe1\x75\xba\xf4\x0c\xf1\x2b\x24\xa8\x15\xf7\x0f\x29\xa3\xa4\xcd\x0a\x6a\x13\x2f\x12\x00\x97\x75\x2f\x4b\xc7\x43\xed\xe0\x8f\x5f\x21\xd4\x2f\x28\x2f\x76\x71\xf7\x78\x3e\x27\xb2\xa8\xe2\xc1\x46\x92\xf1\xe0\xe5\xde\x82\x85\x5d\xab\xf9\x8a\x1a\x63\x97\x60\x06\xff\xbf\xe5\xf5\xa5\x79\xb4\x60\xe2\x6d\x06\xbd\x54\x28\x42\xa5\xf9\x26\x1b\xbf\x26\x04\x51\xd2\x32\x1c\x50\x89\x32\x01\x3c\xc6\xe9\x04\xf7\x9b\x5e\x46\x86\xd0\x33\xe1\x2c\x7b\xbd\x7e\xb1\xc9\x23\x79\xc5\xec\x34\x1b\xf6\x45\x7a\x3f\x17\x26\x4a\x7c\x27\x8b\x27\x50\x1e\xca\xed\xc3\x61\xeb\xa8\x44\x44\x23\x42\xb4\xb1\x0f\xa9\x4d\x26\x58\x65\x11\x6a\xcf\x43\xfc\xbe\xc9\x65\xd2\xab\x4b\xbb\xe6\x14\xc4\xf9\x0a\xb6\xb3\xe0\xd5\x38\x3f\xa0\x49\x88\xbf\xbb\x26\x03\x07\xdd\xe2\x2d\x84\x09\x8b\x63\x31\xd1\x55\x14\x1a\x92\x7b\xb7\x8d\x66\x4b\x34\x1d\x2f\x2a\x93\xe2\x91\xcf\x79\xba\xae\xcd\x26\x12\xf6\xb1\x04\xf3\xfc\x81\x37\x3a\x7c\x6a\x04\x5b\x59\x24\xbf\x95\x0c\xd5\x42\xf7\xb7\xac\xce\xf3\xaa\x7d\x72\x5d\xe0\x53\x05\x5d\x95\x1b\xd7\x68\x11\x13\x92\x59\x66\x38\xae\x09\x71\x70\xf4\x49\x2b\xa5\x0a\x46\x8f\x8e\x34\x77\x63\xdb\x61\x2d\x3c\x7d\xe7\xe5\x64\x59\xb2\x6e\xe0\x29\xc6\x30\x82\x7a\x35\x3a\xee\x73\xde\x68\xd6\xd7\x2b\x27\xaf\xd7\x5d\x22\x16\x45\x27\x94\x5c\x72\x26\x84\x4f\xab\x15\xb8\xdc\xc9\x14\x34\x9e\x31\x41\xc6\x13\x16\xad\xc8\x94\xde\xdc\xdc\x84\x39\x84\xd9\xc7\xfe\xae\x39\xdb\x33\x2d\xc3\x93\xe9\xe8\x96\x1b\xbd\xe0\x71\xc3\xd2\x85\x8b\x3c\xb5\xf3\x3b\x16\x4a\x15\x61\x6c\x6f\xe1\xbb\xc2\x4a\x35\xf2\x13\x36\xd2\x61\xc5\xd8\xcf\x75\x9e\x27\xe2\x2c\x91\x01\xc4\xae\xbd\xe3\xe1\x26\xcf\x64\x6c\xa7\xb2\xe0\x31\x28\x09\x5c\x59\x76\xbf\x3f\x6e\x49\x1a\xf0\xf0\xb6\x40\xc7\x31\x09\x66\xac\x59\xc5\x9f\xbc\x5b\xfe\x05\x48\xf8\x8e\xe6\x1a\xd9\xec\x40\xc1\xc0\x6d\xd2\x9d\x79\x4c\x44\xa3\xea\x22\xc3\xd4\x76\x26\x22\xec\x1e\x8b\x33\x3e\x45\x07\x4d\xb9\x37\x41\xfd\xa1\x93\xc9\x11\xf6\xdb\x58\x79\xe5\x5e\xe3\x6e\xf6\x02\x61\x4a\xe6\x4a\x5c\xde\x9d\x83\x06\xd2\x2f\xbc\x4a\xe9\xc8\x81\xa5\x94\xbd\xe6\x79\x61\x25\xfc\xb6\x28\xb9\xf3\xb6\xfb\x3f\xfd\x51\x1b\x35\x3f\x14\x6a\x27\x27\x2a\xfd\x3e\x5d\x28\xb7\x7f\x58\xa6\x7f\x1f\xd2\x72\x85\xc2\x5e\xcc\x1c\xcf\x64\xe3\x8d\x21\xf3\xb9\xff\x22\xe0\x0e\xe9\x00\x62\x9e\xf1\xa6\x3e\x71\x3f\x25\x88\x83\xdd\x91\x1f\x30\xc0\xd3\x98\xb7\x4b\xd7\x97\x14\x9b\xe5\xe2\x69\x67\x22\xda\x09\xd5\x2d\x4e\xbf\x3c\x67\x39\x29\xd2\x98\xaa\xc3\x4c\xe0\x5b\xea\x08\xea\x9a\x42\x4e\x93\x45\x9c\x2e\xb8\xfc\x22\x22\xc3\x1c\xc1\x3d\x80\x3b\x90\xa8\xa7\x0b\xcd\x0a\x30\xc2\x09\x21\x1d\xc2\xcc\xc8\x5b\x0b\xcd\x45\x82\xc6\x95\xf5\x8d\x80\xbf\x6e\xc4\x71\xa2\x50\x5f\x68\x84\x7a\x75\xf6\xe9\x11\xfd\x87"}, +{{0x7e,0xd8,0x7c,0x36,0xdf,0xdb,0xae,0x60,0xc9,0x40,0xa3,0xb3,0x25,0xc1,0x9f,0xde,0xd8,0x14,0xd7,0x6a,0x54,0x48,0x20,0xa3,0x2f,0x28,0x6a,0x5c,0x0a,0xd7,0x1d,0x72,},{0x3c,0x4a,0xc5,0x10,0xb3,0x62,0x22,0xc2,0x52,0xa2,0xdc,0x1a,0xfc,0xb4,0x0f,0xb0,0xeb,0x85,0xbc,0xa9,0x03,0x91,0x19,0x6a,0x58,0x83,0xaa,0x2c,0xc9,0x12,0xb2,0xdf,},{0x57,0x9b,0x38,0x12,0x4b,0xd0,0x59,0x1a,0x59,0x7c,0xc9,0xa3,0x89,0x12,0x7c,0xea,0xf5,0x51,0x56,0x07,0x73,0x63,0xed,0xb8,0x11,0xd0,0xb6,0x55,0x52,0xac,0xfc,0xc6,0x77,0xb2,0x72,0x94,0x21,0x99,0xca,0x25,0xab,0x79,0x0d,0xe6,0xe0,0x84,0x60,0x3a,0xd1,0x05,0x2e,0xc2,0x10,0xcf,0x6f,0xcb,0x14,0x17,0x28,0x90,0x67,0xce,0x3c,0x08,},"\x62\xd3\x13\x91\x2a\xbb\xb0\x06\xb7\x77\x4a\x67\x37\x71\x4a\x34\x99\x70\xce\x04\x21\x11\x2f\x40\x04\x63\xd3\xdb\x0e\x2f\x7f\x12\x8d\x7b\x96\x93\x9f\x43\xc1\xe7\x10\x7b\x51\x18\xa7\x7c\x11\x96\x83\xd8\x66\xb7\xe3\xd7\x2a\xc2\x1f\x6b\x42\x72\xb4\xbe\x92\x89\xb6\x55\x6f\xe3\x1b\x60\x51\xa0\xb4\x2e\xd5\xea\x0c\xf3\x47\x69\x6d\x30\xfb\x8b\xff\x6b\x8b\x57\x27\x19\xde\x19\xa2\x31\xcc\x85\x45\x9a\x99\x0c\x37\x80\x1f\x08\x37\x18\x6c\xef\xbb\x55\x21\x56\x96\x66\x96\x7c\xd4\x24\x3d\x73\x07\xf1\xb0\xb2\x4c\x8e\x2b\x9b\x69\x23\x17\x30\x4f\xbe\x3d\xd0\xa2\x63\x65\x01\x91\xb3\x52\x16\xf5\x29\x16\x57\x3a\xf9\x05\x24\xf9\x1d\xb1\xa9\x24\x71\xd7\x58\xc9\x2d\xc6\xd1\x4d\x1a\x4b\x26\xf4\x1b\x40\x40\x3c\xa8\x7d\xcf\xab\xdc\xa4\x7b\x9f\xc2\x53\x35\x78\xf1\x61\xf3\xb0\x19\x9b\x5c\x69\x8e\x08\x07\x04\xb2\x1c\x9e\x61\x52\x69\xfc\xd0\xd4\x04\x39\xed\x8b\xc3\xbd\xfb\xc9\xaf\xb4\x4c\x11\xfa\x89\x27\x5f\x0e\xaa\xa5\xd0\x8f\xa9\x59\xd6\x37\x8d\x0d\xb8\x99\x10\xd4\x8f\x2d\x86\xa1\xeb\xfc\x5c\xbf\x10\xeb\x2d\x5a\xad\xf5\x1b\xbd\x83\x44\xff\x8b\xbb\x5b\x8a\xfe\x05\xa4\x50\x11\xb5\xe4\xb7\x2e\xb8\x64\xad\x26\x3e\x8a\x03\xa6\xc7\xf9\x8a\xee\xb3\x54\xf7\x30\xa3\x18\xaa\x30\xfb\x56\xd3\x3d\x80\x74\x8c\x98\xeb\xec\x15\x87\x8c\xcf\x3c\xe8\x22\xf6\x9d\x34\x56\x84\x3c\x40\x0d\xc5\x6b\x48\x1a\x95\xe6\x88\xb8\xa4\x73\x5b\xf3\x84\x3f\x58\x33\xdd\xa0\xef\xe0\x9e\x71\x75\xb5\x67\xc6\x61\x38\x7a\xfd\x2e\xbc\x07\x9a\x48\xe3\x49\x67\xec\x97\xb9\x27\xdf\xa5\x81\x88\x8f\x23\x1a\x98\xa7\xed\x33\x10\x3b\xfa\x8e\x8f\x9b\xa6\x51\x35\x27\x90\x0b\x39\xb8\x62\x31\xda\x79\x11\xa2\xfc\x93\x58\x88\xa7\x5f\x11\x29\x58\x4a\xff\xf2\x02\x52\x49\xc4\x18\x8f\x09\x05\x2f\x85\x68\x77\x06\xd0\x5e\x29\x91\x44\xd4\x0d\xe8\x89\x8b\x7c\x8b\x2d\xfe\xf0\xc3\x70\x85\x73\xd8\xb0\x56\x3a\x6b\xd0\xa5\x04\xc0\xb6\x74\x57\x02\xb1\xb5\x71\x21\xc6\xf0\x40\xaf\xf2\x71\x98\x94\x8b\xa6\x9c\x21\x25\x3a\x28\xd3\x9e\xba\x72\x62\x19\xbe\xda\x1f\x82\x09\xfb\x83\xe9\xad\xb0\x7a\xd4\x09\xfb\xd6\xd2\x55\x65\x88\x9a\xb4\x51\x23\xf9\xd9\x45\xec\xd7\xd9\xca\x70\x28\xec\xe0\x92\xe3\x5f\xbb\x7c\xb3\xf3\x28\x12\x6e\xfd\xda\xc5\xd8\x59\xf2\xb2\xc6\xeb\x09\x01\x33\x69\x0e\x20\xc1\x7d\xea\xf3\x88\x26\x85\xf0\x7e\x9e\xd2\x65\x3b\x80\x3b\x9b\x38\x3b\x70\x74\x8a\x1f\xa9\x2c\x86\xf8\x6d\x6c\x47\xea\x87\xb1\x0b\x12\xe3\x63\xba\x50\x80\x60\xf4\x7c\xe2\xa2\xf3\xb6\xa3\xee\xfc\xd4\xda\xcf\xc7\x1c\x41\xf4\x36\xfe\x0c\x2b\xc3\x4d\x4b\xaa\xd4\x95\x74\xe7\x44\x3c\x12\x6a\x58\x9f\x6e\xf7\xbc\xa4\x49\x54\xf0\xbb\x28\xec\x71\x51\xb0\x51\x1c\x23\xc6\xbc\x42\xd5\xe8\x59\x83\xec\x16\xbb\x5f\x50\xa3\x82\xd6\x88\x15\x0a\x49\x60\x9c\xbd\xe5\x69\x8e\x86\xdc\xbf\x02\x12\xc2\x29\x22\x99\xdc\x4d\xcf\x87\x42\x9f\x6c\xd2\xee\xc8\x09\x48\xce\x86\x7e\x25\xc9\x45\x84\xcd\xc6\x4b\x09\x90\x29\xeb\x85\x4e\xdc\x26\xea\x21\x42\x1e\xff\x48\xcf\x4e\x41\xf4\x9e\x2d\x89\x47\x8d\xef\x06\xc4\x2b\xea\x22\x0a\x13\x3e\x50\xf5\xc7\x44\x64\xc7\xe7\x3f\xb1\xc1\xa7\x7c\x50\x7c\xf6\xcd\xa8\x5b\xe4\x02\xb7\xe6\xd6\xd2\x1e\x81\x0d\x6d\x0b\x59\x72\xb9\xfe\x77\xe5\x4e\x74\xae\xe1\xf3\xbb\xfd\x6e\x7d\xe6\xb5\xc0"}, +{{0x6a,0x29,0xf8,0x1b,0x8d,0x9a,0xa4,0x8a,0x1b,0x23,0x36,0x4e,0xac,0x8f,0x6a,0x4b,0xdd,0x60,0x7a,0x84,0xcf,0xe8,0xe8,0x8d,0x90,0x17,0x5d,0x80,0x64,0x3a,0x58,0xa8,},{0x4c,0x3b,0xe3,0xa2,0xa8,0x42,0x5f,0xf3,0x1c,0x3a,0x0d,0xb4,0xa5,0x2a,0x0c,0xb1,0x41,0x6c,0xeb,0x48,0xcc,0x3e,0x4c,0x28,0xa4,0xf2,0x28,0x4a,0xb3,0x46,0x07,0x15,},{0xdf,0x09,0xcb,0x9b,0x87,0x8d,0x3d,0xc9,0xe5,0x42,0xdb,0xac,0x28,0x94,0x3e,0x28,0xe4,0x1d,0xce,0xcb,0x92,0xcb,0x7e,0xa4,0x40,0x09,0x88,0x5e,0x46,0x49,0x97,0x43,0x33,0x05,0x61,0xba,0x1d,0x36,0xae,0xdd,0x46,0x76,0x75,0xfd,0xca,0x2b,0xaa,0xa4,0x70,0x1b,0x6f,0xad,0x97,0x9f,0xd8,0x39,0xc4,0x70,0xd1,0x3c,0x82,0xda,0xa9,0x05,},"\x78\x76\xa3\xf4\xeb\x69\xbb\x7e\x54\xe9\xff\x95\x4e\xbd\x3b\x10\xb9\x3a\x4c\x1a\xfe\xae\x92\xfa\x03\xc1\x03\xcb\x63\x13\xa2\x01\xc5\xb3\x3a\x9a\x72\x23\x75\x5c\xb5\x10\xe2\x5e\xc5\x82\xb5\x4e\x81\xb8\x49\x56\xf6\xc5\x3f\x1f\x08\xa6\x3b\xf0\xc4\xa2\x61\xaf\x45\x0e\x52\x3f\xe8\xf6\x1d\xdb\x3c\x0e\xea\xb8\x75\x10\x72\x68\x88\x01\xb2\xa4\x73\xb7\x1a\x2e\x38\x70\x8d\xa6\x8c\x2f\x37\x92\x5c\xb0\x5a\x20\xc4\x28\x3b\x3a\xf9\x7b\x6f\x0b\xa6\x5a\x54\x03\x55\x43\x75\xe2\x15\xd9\xe3\xaa\x1b\x0f\x9f\xdb\x0f\x84\x99\x23\xed\xbd\xaa\x0a\xb4\x81\xc5\x45\xa5\xdf\x8f\x51\xd1\xf6\x8b\x22\x35\x07\xea\x0e\xcc\xfa\xeb\xb5\xfc\xcf\x5e\x3d\xfa\x65\xa4\x4e\xea\x50\x45\x68\xa8\x81\x80\xa0\x60\xbb\x06\xc5\x15\x57\xb8\x1e\x66\x7b\x4b\x04\xe3\x21\x0f\xa4\xc3\x79\x87\x6c\x49\xf3\xe5\x6b\xf2\xbe\x1c\xf5\x19\xa7\x41\x83\x93\xd2\x40\xdc\x8a\x22\x4c\x6c\x38\xac\x2a\xb9\xd8\xfa\xdf\xc5\x36\x20\x30\xc7\x93\x0c\x3c\xe7\x79\x5b\x14\x7c\x26\xc8\xa2\x8c\x65\x34\x29\xd9\x0a\x17\x3a\x86\xa8\xb1\x8a\x00\x9e\x62\xae\xf6\xec\xa9\x5d\x39\xbd\xbe\x45\x64\x77\x78\xa2\x53\x2a\x41\x5a\xe1\x9b\xad\x23\x11\x29\x12\x78\x42\xfe\x1d\x0f\x11\xfa\xb4\xa1\xcf\x0b\x17\xe4\x98\xcd\x59\x52\xc9\x39\xe0\x90\x09\x02\x87\xb1\x44\x89\x5d\xff\x00\xce\xc8\xd6\xae\xda\xf6\x24\x81\xa4\x17\x83\xe0\x21\x08\x2c\xe3\x52\x06\x3e\x62\x81\x1f\xd9\x99\x90\x10\x4d\x8a\x46\xcd\xca\xee\x2b\xab\x45\x8e\x52\x47\xfb\x02\x3e\x92\x33\x30\xa4\x28\xc7\xbc\xfd\x20\xb0\x8f\x52\x0e\x89\x46\xdd\x65\x83\x47\x35\x2a\xe0\xc4\xbe\x73\xc3\xd5\xec\xcd\x11\x14\x9f\x3a\xb7\xb8\x05\x2c\xfd\x95\xc3\x5d\x41\x64\x54\x6f\x5d\x8f\x37\x75\x17\xa7\xf4\x32\xc0\xd5\x56\x3a\x7b\xcc\x7b\xd1\x19\xd3\x42\x1d\xfe\xba\xae\x84\x45\x99\xb2\x9b\x38\x3b\xb8\xd5\xdb\xf1\x40\xd9\xbd\x47\xa0\x78\xb7\xae\x7c\x6a\xa8\x7b\x1e\x29\x23\x6c\x9f\xcf\xd6\x54\xb7\xf8\x09\x79\x4c\xcc\xb2\x61\x58\x8e\x18\xde\xc6\xc4\x04\x6a\x93\x40\x67\xd0\xdf\xa0\x37\x91\xd0\x3d\x83\xb7\x18\xac\x4d\x24\xdc\xe7\x85\xa3\x02\x8d\xe0\xc9\x59\x2d\xba\x7c\x5c\x58\x45\x18\x4a\xfc\x9c\x0d\xfc\xf9\x40\x95\x86\x0f\x0e\xb8\x02\xeb\xea\x20\x17\x8e\x78\xb5\x64\x2e\x5d\xd6\x1c\x33\xb3\x97\x69\x05\x2d\x9d\x85\x4d\xce\x90\x2f\x47\x6e\x21\xf9\x6c\x65\x0b\x46\x3b\x7b\xc3\xd0\xff\x29\x96\xb6\x5c\x57\x83\x1f\x8b\x7c\x0f\xb9\x15\xf4\xdd\x72\x26\xac\x95\x5c\xbc\x7d\xfb\x03\xf9\xb7\x58\xdd\x3e\x0d\xfc\xe2\xe0\xe5\x80\xc9\x1a\x30\xc7\x83\xff\x56\x7b\x17\xf1\x2d\xfd\x5d\x31\x37\x64\x6e\x20\x01\x1c\xdc\xaa\xe1\x11\x02\xdc\x71\x68\x86\xcb\xf1\x23\xc0\x94\x88\xb1\x73\x63\x6a\xbd\x54\xe9\x62\xca\xee\xc9\x7d\x5e\xb9\x40\x68\x2e\x70\x3b\x73\x0f\x61\x56\x2c\xd1\x4b\x9e\x65\x61\xb5\xe9\x3f\x60\xcd\x0e\x1e\x86\xd1\xa1\xb4\x71\x9c\x5b\x50\x82\x42\xbd\x6b\x2d\x9a\x54\x8f\x59\xbb\xb8\x75\x07\x59\x69\xef\x20\x32\xf3\x19\x6b\x8a\xec\xcc\x45\xa4\x4d\x9d\xbd\xaf\x87\x8e\xd1\x6f\x1d\x85\x5e\x89\x18\xed\x65\xa4\x5e\xe5\xc7\xfa\x32\xa1\xec\x69\x32\xa1\x59\xcf\xb5\x0f\xfc\x87\xbe\x06\xdf\xcf\x72\x28\xae\x88\x70\xcc\xd3\x57\xfc\x65\x6e\x33\xfa\x4b\x6b\x8b\x7d\x1a\x72\x15\x55\x3c\xab\xac\xc7\x0a\x39\xc9\x80\xb9\x71\xe5\x1a\x17\xed\x63\x18\xb4\x3b\x29\xbb"}, +{{0xef,0x12,0xdf,0x47,0x9d,0x98,0x3a,0xd9,0x6e,0x8b,0xa6,0x53,0x30,0xb3,0x6d,0x49,0xaa,0xdb,0x98,0x31,0x64,0xe1,0xc0,0xb4,0x52,0xb5,0x60,0xde,0xd1,0xd0,0x8d,0x60,},{0xf7,0x61,0xcf,0x28,0x26,0x92,0x7a,0x7c,0xda,0x8c,0xb0,0x4f,0xaa,0x2c,0x59,0xf8,0x42,0x5a,0x8f,0x7d,0x39,0x8f,0x76,0xe8,0x67,0x02,0x1c,0x95,0x1f,0x07,0x38,0x09,},{0x4c,0x80,0x10,0x86,0x6d,0x91,0x15,0xf0,0x52,0x93,0xb9,0x34,0xca,0xc6,0x81,0x04,0xcc,0x2c,0x34,0x37,0x56,0x8c,0xb9,0xd5,0xc5,0x70,0xb1,0xa8,0xbe,0xe7,0x06,0x60,0x30,0x75,0x53,0x70,0x33,0xbd,0x70,0x8a,0x9c,0x9f,0x3d,0x1e,0x25,0x19,0xa9,0x15,0xb1,0xc4,0xae,0x4c,0xcd,0xdf,0xcf,0x0e,0xd0,0xc0,0x49,0xd3,0x42,0xa0,0x2e,0x02,},"\xe5\x8f\x34\xda\xea\x75\x5a\xc4\xe4\x13\x33\xd6\xf0\xed\x01\x35\xf7\xdb\xce\x50\x30\x9b\xb1\x95\x6b\xc7\x1a\xcb\x12\xc7\x70\x67\xa6\x47\xff\xd8\x6a\xa5\x87\x0c\x0c\x00\x07\xe8\xf9\x95\xa2\x2b\x88\xc4\x67\xde\x22\x54\x44\x54\x42\x01\xc5\x57\x49\x5e\x25\x3e\x33\x19\xcc\x5c\xa3\x76\xd3\xe7\xcc\x1e\xb4\x67\x34\x6e\x52\xad\x95\x6a\x6f\xa7\x33\x72\x0b\x17\x11\x7b\x5b\x75\x85\xe4\xd5\x59\x40\x9a\xae\xfa\x95\x58\x0f\x91\xe5\x02\x01\x5f\x49\x7c\x5c\xdc\xb7\xd4\xd5\x61\xf5\x44\xef\xa3\x5c\x1e\x2a\x53\xb7\x2b\xdd\xec\xee\xc2\xd1\x05\x0f\x17\x7d\x48\x0f\x68\x74\x05\x66\x4d\xfd\xde\xc0\x6e\xee\x4b\xd1\x47\xa9\x12\xfd\xbf\x74\xf2\xa9\x5d\x1f\xd1\xe1\x12\x68\x69\x4c\xe4\xd4\xec\x4f\xff\xd6\xdd\xb3\x25\x4d\x36\x0f\x23\x6f\xab\x4d\x1a\x17\xf8\xd0\xd1\xa5\x11\xf9\x44\x69\x2f\x23\x96\x39\xae\x03\xd6\x4f\xac\xec\x65\x38\x42\x7a\xb7\x1f\x71\x27\xf4\xa2\x76\xf9\xbc\x45\xbb\xa6\x11\xdf\xcc\xe6\x44\x6c\xc1\x39\x68\x97\x6c\x8b\xb6\xd6\xfe\x21\x06\xd7\x05\x92\x2d\xca\xc9\x56\x96\x6a\x76\xd4\x8f\x2a\xff\x4b\x86\x51\x4e\x39\xa6\x7e\x16\x43\xfc\xc3\x21\x85\x80\x24\xe6\x93\x18\x98\x33\xc8\xad\x59\xb4\xb6\x25\x29\x8e\xba\xfe\x64\x62\x6b\x48\x0f\x32\x6f\x13\x40\x72\x3c\xb3\xd3\x83\xf4\xfc\xcb\xfc\x23\x7a\x3f\x4c\x4f\x7e\xcf\x0b\xa4\x36\xb3\x2c\x2f\xe3\x51\x79\xda\x93\x11\x1b\x48\xcc\x9e\xa2\x42\x02\xbd\xc1\xb2\xfb\x60\xa4\x31\x9d\xfd\x98\x64\x47\x0f\x73\xf5\x41\x37\x20\x6e\x0b\xf0\x07\xf5\xae\x88\xa8\x87\x47\x00\x8a\x60\xf4\x78\x9a\xd1\x67\x72\x4f\x17\x9c\x02\xb6\x3a\xed\x00\x25\x73\xd2\x8a\x6b\xcf\x88\xe0\x7c\xe8\xda\xea\x5d\x5f\x1a\xcf\x48\x7b\x4c\x5c\x16\xc2\xbf\xe1\x12\x31\xea\x5e\xa7\x63\xe8\xf3\x32\xcc\x73\xda\x1b\x2f\x8c\x19\x8e\xa8\x17\x3f\xd3\x3d\x4b\x2a\xe6\x9e\x5d\x4d\x1a\xad\xdd\xf2\xfd\x82\x1b\x85\xbe\x45\x15\x19\x62\xd1\xf9\x9d\xf8\x13\x08\x61\x88\x52\xad\x7c\xf4\x1d\x72\xda\x08\xa1\xb3\x9d\xf7\xd8\xb9\x94\xb4\xdd\xff\x37\xf9\xdf\xe8\xf3\x8c\xe3\x0e\x91\x06\x1d\x95\xd5\x8f\x7a\xe8\x26\xb0\x23\x85\x27\x2e\xc0\x9f\x01\xa7\xb3\xe4\xb3\x91\xd0\x9b\xce\xd6\x65\xda\xd6\x95\x05\xb4\x19\xda\x84\x81\xbc\x37\x92\xbf\x8b\x8e\x7a\xd6\x4b\x63\xf2\x45\x66\x6c\x8c\x32\xfd\x5c\x1b\x1b\x48\xc9\x95\x1e\x1c\x21\xa1\xeb\x5f\x50\x7c\xff\x13\x7c\xfb\x86\x2c\x2c\xc9\x87\x66\xe8\x78\xc9\x30\xa0\x83\x82\x8c\x9d\x8d\xb1\x8b\xf1\x67\x16\x68\x5f\x39\xd6\x57\x2a\x8c\xa8\xb2\xa5\x14\xf7\x70\x03\xd4\xe7\x5b\xc1\x54\xae\xbf\x14\x10\x37\x78\xf3\x65\xb1\xc3\xf0\x35\x41\xdd\xbd\x07\xd6\xe2\x3e\x56\x76\x2d\x97\x1e\xb0\x29\x83\xe9\x3c\x4e\x01\xba\x4b\x8a\x21\x78\x92\x8c\x43\x37\xd3\x02\xf3\x1c\x9c\xcb\x75\xb2\x49\xa8\x2d\xc9\x68\x21\xe9\x5a\x03\xab\x6b\x77\x0d\xf2\xc3\xdf\xdb\xf1\xfe\x97\x73\xf8\xbc\x1b\xc5\xb3\xaf\xa0\x44\x0b\x10\x25\x78\xf3\xd2\x13\xc8\xd0\x19\xcf\xf1\x24\xf7\x5c\xe4\xac\xcc\x8c\x66\x7f\xeb\x27\xc7\x51\xa6\x12\x00\x74\x81\x31\x04\xe0\xcd\x07\x0c\x9f\x5e\x45\x1d\xcc\xff\x4c\x80\xd7\x11\x07\xc9\x75\xab\xfa\xc0\x7d\x4d\x27\x0c\x72\x7d\x8a\x2f\xec\x34\x9b\x53\x39\x68\xe2\x71\x89\x2d\x2b\x62\xc1\x25\xfb\x79\x74\x60\x3c\x30\x5e\xa3\xbf\xa3\x0f\xb6\x10\xfc\x5a\x23\xeb\x68\xa8\x40\x64\x44\x39\x1a\x52\x13\x37"}, +{{0xf7,0x31,0x31,0x7c,0xf5,0xaf,0xfe,0x58,0x70,0x4c,0x4d,0x94,0x97,0xae,0x86,0x0b,0xbf,0x73,0x9d,0x0f,0xd9,0x6b,0x7c,0x02,0xef,0xb6,0x77,0x7b,0x3c,0x85,0x8a,0x19,},{0xd7,0xd6,0x38,0xae,0xcc,0xe1,0x46,0x1e,0x31,0x42,0x55,0xaa,0x29,0xd9,0xa6,0xb4,0x88,0xae,0xa1,0x39,0x6e,0x96,0x82,0x69,0x5a,0x47,0x0e,0xff,0x23,0xf3,0xed,0x84,},{0x2a,0x4f,0xea,0x98,0xf9,0x24,0x01,0x71,0xa1,0x82,0x3f,0x2f,0x69,0x35,0x20,0x62,0x67,0x2e,0x6c,0x6e,0x66,0x52,0xd3,0x88,0xa8,0x77,0x14,0xd6,0x47,0x99,0x5d,0xf7,0x5b,0x6e,0x1e,0xd1,0x74,0x6a,0xf2,0xad,0xf4,0xe8,0x06,0x13,0x5d,0x60,0x75,0x4e,0x60,0xfe,0xa0,0x32,0x12,0x8e,0x35,0xab,0xc1,0xf1,0x61,0x51,0x81,0x12,0x5f,0x0b,},"\x16\xf5\x1c\x59\xe9\xae\xfc\x26\xb0\xda\x5e\x00\x85\xeb\x2e\x2f\x1f\x85\x6d\xef\x97\x25\x76\x9e\x3a\xf1\x2f\x86\x09\x05\xae\x13\x3f\x65\x07\x4d\xa7\x6d\xbf\x25\xc6\x7f\x62\x57\xd2\xdc\x66\xc0\x5f\x9b\x31\xae\x17\x7b\x69\x92\x9f\xc1\x83\xb5\x88\xc5\x19\xbc\xa1\x47\x96\xa0\x89\x6d\x29\x05\xfd\x94\x2d\x7a\xb4\xa3\xfd\x95\x41\xa5\x52\x9f\x72\x9c\x58\x51\x41\x9b\x5f\xbe\xf7\xb1\x34\xd6\x76\x2e\xb9\x7e\x8a\x95\x1a\x8f\xf5\x2a\xa0\xd7\xe6\x74\x44\xd0\x6b\x07\xaa\x55\xe4\xeb\x9a\xb8\x92\xf4\x7b\xfd\x11\x1d\xf5\xb6\x2f\x6f\x3f\xd1\xa5\xed\x84\x12\x5f\xee\xbb\x77\xda\x63\x7c\x05\xd5\x26\x5c\xed\x11\x3d\xfe\x87\x82\xdb\xd1\xce\xcd\x2c\x6c\x03\x2b\x8f\xa8\x85\x5b\x3a\xe7\x8d\xe7\x4f\xaa\x5a\xa2\x0a\x76\x14\x63\xc2\xa3\x0b\xe6\x6b\xd3\x8c\xde\xc7\x5f\x89\x57\xcb\x94\xc1\x13\xa4\x5d\x54\x6d\xaf\x47\x5d\x89\xaa\x14\x82\xf8\xd2\x80\x3a\x23\xc9\x39\x20\x20\x15\xa0\x8e\x94\xb1\x32\x72\x8f\xbe\x8f\x60\x19\xd7\x16\x8a\x08\xa5\x93\x01\x70\xe5\x63\x9d\x11\x0e\x47\x39\xdb\x85\xe6\x1e\x64\x49\x59\x44\xb5\x42\x3a\x74\xad\x5a\x8a\x0a\x51\x06\x12\xec\xe6\x55\xce\x18\x86\x40\x51\x52\x5b\x90\x8e\x0b\x19\x29\x0a\xbe\x8b\x11\x82\xc4\x8c\x70\x0d\x35\x05\x15\xfd\x34\x99\x56\xe8\x08\x73\x27\xf3\x0b\x6f\xc3\xf1\x31\xc2\x14\x4a\xbb\x3f\x0e\x9c\xa3\x31\x17\x2b\x35\x06\x4a\x82\x81\x1a\x68\xe2\xcf\x36\xb4\x3e\x3a\xd2\xe8\xdf\xa5\xb1\xce\xf5\x0e\x2a\x60\x29\x3f\xc5\xf6\x35\xc9\xa9\x99\x8d\x8c\x1a\xd2\x96\xe7\xc7\x8f\xc0\x58\x20\x22\xd6\x30\x67\x18\x6b\x65\xe7\x64\x82\x8c\xc0\xf5\xf7\x63\x2d\x5e\xef\x86\x3e\x6c\x6d\x90\xe3\x8c\xcc\x87\xd7\xb7\x47\xfa\xc8\x49\x1d\x63\x2c\xf7\xf5\x4b\x9a\x9e\xed\x16\xee\xbe\xc0\x1b\x6c\xc3\x3d\x24\x63\xf7\xf9\x50\xd8\x28\xb5\x5e\xe3\xf7\x7c\xbe\x97\x4f\x48\x94\x8e\xb7\x57\xae\xd4\xe0\xdb\xb0\x0a\xd9\x5e\xe0\x13\x23\x48\x6e\xba\x3c\x8d\xa8\x86\xed\x7f\x57\xbb\x40\x0d\x63\xa1\xb2\xeb\xea\xa2\xe7\x0a\xdf\x03\x79\xe3\x39\x30\x01\xba\x62\x6c\x0d\xd5\x4b\x7f\x0c\x9a\x25\xaa\xe6\xc9\x87\x5d\x4e\x76\x22\xf3\xed\x42\x8f\xb3\x12\x4b\x29\xc5\xdb\x9a\x7e\xf1\x6e\xbd\xdd\x68\x05\xf0\x95\xf5\xe7\x69\x82\x3c\x43\xf2\x62\x86\x8f\xf4\x3e\x3e\x05\x25\x74\x6d\x94\x97\xaf\x12\x4a\x01\xdf\xf6\x1e\xc7\x18\xaf\x3b\x5b\xb7\x46\xfc\xc0\x8a\xeb\xd1\x66\x84\xd4\x56\xae\x79\x32\xff\x5e\xd7\xd6\xb0\xf1\xb2\x5c\x7a\xde\xef\x59\x8b\x5d\x58\x87\x75\x90\xac\x1d\xc0\x59\x75\x15\x67\x96\x99\x87\x74\x08\x1e\x5b\x66\x82\x2a\x94\xa6\xa8\x02\xc3\xa2\xcd\x9f\x48\x9e\x16\x28\xaa\xf4\x65\x2b\xe1\x18\x4b\x0f\xc7\xc5\xee\x7f\x97\xce\x08\xb9\x23\x3b\x4b\x83\xd9\x36\x7b\xe5\xf4\xaa\xe9\x78\x25\x93\xa3\x52\x65\x15\x4d\xea\x4c\x37\x5c\x16\xf0\xca\xf6\xdc\x45\x94\xd2\xbd\xbf\xc3\x37\x5b\xb2\xa0\x43\x2c\x48\x2f\x13\x94\x1c\xe2\xaa\xab\x4d\x83\xe7\x4d\x11\x6f\x5d\xe4\xab\x28\xf8\xdc\x3d\x1c\xd1\x9d\x27\x1e\x56\xe1\x03\x98\xbd\x1d\xf5\xc8\x70\xfc\xbf\x93\xa7\xd1\xdf\x39\x39\x54\x7c\x10\x7b\xfd\x90\x64\x3f\x6f\x50\x01\xae\x7e\x06\x39\x7a\xe1\xa2\x71\xbb\x82\xa1\xf3\x8e\x09\x7b\xec\x66\x74\x66\xb8\x0e\xe3\xe5\x0d\xd4\xfc\x9d\x5d\x54\xf1\x8f\xaf\x7a\x5b\x55\xa8\x83\x45\x94\xef\x0c\xb7\xe5\x08\xbb\xd2\x8f\x71\xfd\x34\x23\x5b\xbf\xd3"}, +{{0x49,0x8e,0x5a,0x21,0xa9,0xb0,0xc3,0x47,0xba,0x83,0xa4,0x7a,0xc1,0x00,0x69,0x45,0x7f,0x57,0x83,0xc2,0xe1,0xe6,0xe4,0x64,0x00,0x45,0xe5,0x94,0xb1,0xc6,0x93,0x32,},{0xfb,0x39,0x48,0xc8,0x11,0x99,0x56,0x91,0x05,0xcc,0x1b,0x7d,0x9c,0xeb,0x3b,0x41,0xa3,0x43,0xbb,0x00,0x57,0x55,0x38,0x59,0x2e,0x09,0x84,0xf4,0xf4,0x71,0x0a,0xbe,},{0x28,0x60,0x83,0x0c,0xcd,0x1d,0x41,0xd9,0x50,0x76,0x81,0x6a,0x39,0x84,0x24,0xf7,0xb7,0x39,0xc4,0x9f,0xda,0xcf,0x56,0x54,0x52,0x9d,0xa8,0x5f,0xe3,0x56,0x55,0x84,0xf6,0xaa,0xc2,0x61,0x4c,0x63,0xf7,0x74,0xb6,0x1d,0xb9,0x08,0x1f,0x14,0x10,0xfb,0xa8,0xe5,0x0a,0xb3,0xb4,0xc3,0x9d,0xc0,0x63,0x14,0x24,0x3f,0x3f,0x0d,0x8e,0x0f,},"\xe4\xfb\xea\x86\x4a\xa5\x11\x90\x82\x66\x45\xd2\xf7\x72\xcb\x0f\x9e\xdd\xd3\x03\x44\x73\xfa\x31\x77\xc7\xaf\x9a\x5d\x41\xe1\xa7\x3a\xd5\x78\x4c\x70\x96\x55\x9f\xcd\xdb\x7b\x7c\x85\x89\x1c\xf2\x4e\x82\xc5\x88\xd7\x47\x74\xff\xca\xc0\xc6\xb4\xee\xbc\x2f\x3f\xa4\x3e\x9d\x45\xf2\x59\xd6\x75\x64\x03\x0c\xfe\xea\xb9\x23\x6c\x66\x5b\x65\x0a\xf0\xc9\x2c\x87\x51\x89\xf5\xf9\x38\x35\x04\xb1\x53\x60\xa0\xb9\xa5\xa0\x0d\xa3\x1f\x63\x5b\x96\xf6\xc7\x3e\xf4\x7b\x6b\x06\xf0\x28\x11\xd1\xd1\x9c\x2e\x8e\x53\x55\x0c\xe2\x2e\x42\xec\x50\xa1\xeb\x2e\xa2\xf4\xcd\x03\xc4\x42\xd4\xaa\x43\x68\x94\x23\x8c\xeb\x18\x35\xfe\x99\xb2\x40\x35\x8a\xa0\x56\x2c\x24\x96\x98\xa3\xf1\x23\xc2\xc1\x7e\x59\x10\x10\xbd\x6f\xdf\xcb\xd7\xdb\xe7\x0b\x04\x52\x05\x02\xec\xe3\x7a\x9a\x1d\xfa\x1a\xe3\x37\x04\x17\xb0\x04\x21\x7a\x5b\x8f\xe9\x90\x3c\x9a\x3b\x9f\x4b\x6d\x5c\x46\xc0\xed\x0c\x53\x8c\xec\x22\xf2\xdf\xcb\x2a\x28\x0a\x42\xad\xc4\x89\xcf\x2e\x06\x29\x12\xbe\x99\x28\xf0\xc0\x60\x89\x1e\x43\x20\x91\x17\x75\x26\xf1\xb3\xa9\x68\x06\x9d\x4a\x57\xad\xe8\x28\x55\x98\x10\xae\x03\x60\x68\x1f\xf9\x93\x29\xfa\x0f\x59\xe7\xe5\x9c\xdf\x87\xf9\xf3\x3c\x40\xe9\x70\x31\xb9\xf8\x1d\x48\xfc\x12\x28\x6e\xfb\xb3\xd4\xe5\xa6\x2e\xf5\x7b\xc0\xd5\x2d\x53\x3b\x99\xc5\x10\x6a\xa7\x9c\xfe\x17\x93\xa9\x08\x51\x85\x96\xc3\x83\x48\x3e\xc4\x9f\xf9\x8e\xc5\x57\xbf\xff\x74\x90\xa4\x6d\xaf\x67\x14\xf2\xc2\xc3\x2f\x57\x93\x2c\xa0\xd7\x30\xf0\x3f\x38\x1d\x69\xde\xcd\xbd\x9a\x7a\x6d\x4a\xfc\x62\x40\x65\x43\xc8\xeb\xe9\x0a\xc7\x6e\x6a\xfa\xbd\xb8\x24\x92\xa2\x06\xa3\x69\xe0\x42\x86\xd3\x13\xe1\x11\x07\xd8\xcd\x9b\x4b\xf6\x8f\x81\x5d\xba\x4e\x99\x0b\x04\x9d\x79\x21\x6d\x36\x53\x13\x83\x42\xcd\x11\x8b\x13\x0f\x66\xb0\x06\xf3\xd8\x9a\xc3\xcf\x89\x83\x70\x48\xb0\xf8\xa6\x2d\x94\x05\x1d\x2e\xab\x89\x1a\xc5\xf4\x78\x88\x87\x9d\x88\xe5\x46\x67\x6d\x1d\xae\xeb\x4d\x17\x5d\x3f\x04\xa9\xd7\x4f\xfc\xdd\x47\x74\x60\x16\xf8\x4a\xd0\xd1\x12\xaf\xb5\x9a\xd1\x21\x87\xe9\x4f\x22\x53\x5d\x77\xe9\xe0\x51\x6f\xa4\x21\x85\xc1\x97\xba\x77\x4b\x39\x32\x27\xf7\x41\xfe\x68\x27\x3f\x42\x3f\xb0\xe0\xe0\x47\x4b\xfd\xaf\x2d\xa7\x8a\xeb\x1c\xd5\xb9\x8c\x1d\xc0\x83\x21\x24\x74\x2a\x47\x54\x12\x5f\xc7\x8b\x19\xc5\x59\xa5\xb3\xf7\x71\x1e\x06\x8c\x44\x0c\xc0\x46\x9a\x1c\xfa\x5c\x18\x64\xbe\x18\x73\x5a\xa8\xbc\xd4\x06\xc4\x37\x1e\xb8\x57\x75\x4d\x90\x8b\xf3\x79\xb9\x1f\xcb\x24\xe3\x43\x96\xbf\x87\xc1\x9a\x04\xa8\x3d\x59\xda\xe7\x1f\x3f\x38\x39\x82\x9d\x06\x22\x13\x01\xef\x59\x56\x96\xe7\x19\xd5\x6b\x79\x52\x0a\x0e\x50\x99\x29\x83\x3b\x1d\x80\x4a\x6a\x0e\xa4\x04\x00\xbb\x45\x02\x8c\xe5\xd3\x69\x33\x88\x3e\x17\x40\x6e\x27\xa8\x10\x90\x57\xb1\xa1\xa5\xe5\xda\x21\x0a\x69\x21\x99\x4f\x46\x7a\xb4\x1a\xa8\xf0\xd8\x87\x75\xa8\xa8\xeb\xb4\xec\x77\xd7\xc8\x0e\x45\xa7\xbb\x42\x2a\x4c\x00\xc9\x05\x83\x91\x14\x65\xe6\xb5\xf0\xfd\xcd\xea\xb7\x28\x71\xca\x54\x2e\x1d\x1a\x2c\xa9\x4d\xf4\xed\x2e\xab\xf9\x0d\xed\x00\x45\x29\x03\x24\xa9\xff\xfb\x30\x14\x54\x70\x20\x9f\x38\x26\x58\x09\x89\x34\x91\x99\xdc\x5a\xb8\xd4\xa2\x5d\xf7\xa0\x52\x9c\xf9\x14\x71\xe3\x08\x42\xab\xfa\xcd\x44\xab\x78\x1d\xfc\x13\x95"}, +{{0xc2,0x4c,0xbf,0x40,0x1a,0xd0,0x3b,0xd8,0x8d,0xcc,0x7b,0x51,0x9e,0xcf,0x62,0x4d,0xb2,0x22,0x3e,0x99,0x02,0x89,0x30,0x9e,0x1e,0x9f,0x1f,0x8f,0x61,0x27,0xc6,0xc9,},{0xa7,0x46,0x66,0xf3,0x57,0x20,0x9f,0x71,0x89,0x90,0x37,0x88,0xf1,0x07,0x56,0x3e,0x50,0xc0,0x51,0xc3,0xd4,0x0c,0x3f,0x3d,0xad,0x10,0xd3,0xc3,0xcf,0xf1,0xe6,0x78,},{0x58,0x1e,0x6c,0x85,0xae,0xc6,0x23,0xb6,0x2b,0x3d,0x4c,0x9b,0xc9,0xc7,0x77,0x59,0xd5,0x49,0x27,0x22,0xe2,0x52,0xd4,0x4c,0x1f,0x8a,0xda,0x9d,0xa2,0xec,0xc6,0x7c,0x17,0x08,0x32,0x73,0xaa,0x09,0x1b,0xba,0xc0,0x46,0xae,0x63,0xc7,0x88,0x93,0x15,0x2e,0x14,0xd9,0x26,0xc4,0x1a,0xe3,0x5f,0x0e,0x6e,0x39,0x59,0x49,0x6b,0x13,0x06,},"\xe7\xfa\x35\x9e\x6a\x09\xb2\xc5\x4a\xab\xed\x3b\xba\xbf\xb7\x28\x53\xa8\x05\xaa\xbc\xf4\xd1\x8d\xda\xd3\x9f\x03\xf3\x46\x01\xe5\x5b\x6c\xe2\x63\xc9\xa3\xca\x6a\x3e\x5f\x14\x25\xc8\x21\x92\x8c\x61\xe7\xf7\x50\x91\x9b\xd3\xaf\x32\xbc\xb7\xb9\x4d\x45\x9a\x7a\x9a\x35\xf6\x1c\x94\x17\x92\xe2\xcc\x2e\x43\x27\xbe\xb3\x44\xa8\x41\xa0\x7f\x32\x06\x8a\xf1\x02\xb3\xde\x61\xea\xb6\x4e\xf6\xd5\xe6\x90\x62\xe3\x93\xab\x5e\xdf\x6a\xc9\xef\x7b\x38\xd4\x9a\x01\xbe\xf0\x00\x3f\x42\x11\x74\xc8\x88\x59\x75\xc0\x18\x32\x89\x9c\x31\x35\xe7\xa8\x6e\x5b\x55\xd9\xb1\x32\x8b\xb4\x28\x9b\x5c\x40\x20\x0f\x49\xe5\x52\x3b\x3c\x46\x1d\xc7\x17\x5e\x14\x65\x02\x22\x97\xc3\xd3\x80\xf2\xb1\xfe\xf3\x9c\xb8\x2c\x00\xfd\x16\x0f\x44\x7e\xb5\x12\x63\xfa\x25\xb4\xdf\x0f\xca\x41\xec\x0c\xa2\xec\xe7\x47\x22\x01\xaf\x86\xc3\x03\x8c\x49\xdf\x09\x9a\x9a\xef\xa1\xf8\x8d\x0e\xdf\xd1\x7c\x0b\x3c\x86\x04\x66\x29\xc0\x94\x54\x05\x4a\xa0\xfb\x2c\x69\x49\xdd\x9c\x13\x01\x85\xdf\xa5\xd9\x03\x89\x1e\x08\x74\x2c\xd0\x42\x94\x03\xf5\x7f\x40\x52\x15\x8b\x2f\x40\x1d\xa4\x75\x68\x54\xe4\xaa\xf0\x24\x22\x1e\x37\x51\x3c\xf6\x77\xee\x6a\x0b\x15\x9f\x50\x1d\x37\x7e\xa3\x2e\xb7\x1e\x77\x80\x04\xf2\x72\x03\xcd\x6d\x55\x3f\xda\x5d\x65\xe1\x87\x94\x77\x04\x6f\x3e\xa3\xd1\xd7\x5c\x9d\x0d\x30\x31\x14\x56\x70\x9c\xc7\xf6\xab\x68\xc7\xb0\xd5\x2b\xe4\x0f\x04\xcf\x65\x56\x55\x32\x32\x85\x31\x83\x29\xe8\x4c\x6a\x5b\x07\xe0\xce\xed\x5f\x78\xf7\xf1\xfa\x62\x29\xbe\xf8\x78\x79\x3c\x58\x47\x28\xab\xf4\x51\x0b\x7f\x27\x79\x4b\x59\x42\x91\x62\x54\xc5\x89\xa0\x9c\x8e\x91\x1f\x0b\x95\x42\x11\xa6\x36\x99\xa7\x52\x14\x7f\x2a\x4e\x1a\x18\x95\x66\x44\xbe\xa2\xca\x26\x92\xba\x18\x22\x80\xe0\x4a\x72\xdd\x89\xb0\xd1\x26\x85\x00\x93\x8f\x34\x7b\xf4\x3f\x2a\x24\x2e\xe9\xb9\xa6\xba\xac\x9b\x35\x0d\x65\x6f\xb1\x9e\xc8\x34\xab\xe3\x16\x44\x40\xf2\xd2\x07\x1f\xe5\xe3\x2c\x8e\x4c\xf9\x05\x53\x9b\x83\x9c\xee\xca\x26\x20\xfc\xb2\xa0\x87\xf7\x80\xe6\xc7\xf5\xe0\x5c\x50\x68\x88\x25\x0e\xa7\xc8\x56\xfb\x30\x98\x32\x00\xaa\x8f\x78\xfc\x17\x71\x05\x4a\xda\x0f\x3f\xac\x38\xae\x2f\x33\xdc\x4a\x4f\x85\x1b\x76\xed\x74\x0c\x09\x62\xa7\x6a\x4d\xe4\x40\x80\xdc\x62\x0a\x44\xad\x8f\x23\xd3\x46\x2b\x79\x2a\xb3\xaf\xb1\x9c\xb8\xa9\xf4\xd9\xe5\x9a\xd7\x65\xa7\x71\x89\x9d\xa8\xcb\xec\x89\xe5\x07\x7e\x85\xc0\xc9\x31\x26\x37\x6c\x94\x1b\xef\x1f\x8b\xb9\x92\xd3\xa3\x5f\x27\x07\x25\x84\x6f\xb2\x52\xf8\xb5\xfb\xb7\x56\x7e\x40\x6a\x1b\x53\xb6\x19\x76\x9e\x63\x2b\x2b\x40\x87\xcd\x4c\x27\x6e\x5d\x58\xff\x2b\x56\xe8\x9e\xde\xc4\x8c\xe5\x3a\x52\xe3\x29\xca\x15\x59\x53\x8f\x10\x90\x2c\x01\xa8\x5f\xbb\x3c\xd7\x2e\x6b\x82\x91\xe5\xfe\x63\x9b\xee\x9d\x47\xd3\x4c\x24\x9a\x7a\x07\xd7\xa1\x42\x7a\x01\xf6\x3d\x60\x98\x4c\x45\x0b\xef\x81\x9b\x19\xf6\x5e\x26\x14\xfd\x9c\x2f\xae\x7b\x92\x31\xa0\xbc\xa4\x14\xed\x94\xa5\xee\x7e\x66\x32\x7d\x2a\x99\xc8\x48\x78\xb7\xbe\xe0\x87\xe8\x91\xf2\x53\xfa\x1f\xec\xe3\x13\x64\x8c\x06\xc4\x5d\xb2\xd9\xf3\xbc\x85\x99\x93\x7b\x75\x2d\x38\xce\x50\x63\xd0\xed\x9a\x43\xec\x9d\x40\x15\x89\x3d\x43\xbf\x5b\x2d\x1c\x60\x47\x85\x10\x46\x89\x68\xb7\x96\xf0\x15\x37\x89\x59\x54\x41\x72\x2a"}, +{{0x8b,0x3d,0xcd,0xe4,0xab,0xbf,0x4e,0x62,0x11,0xc4,0xa5,0x1c,0x4b,0x02,0x68,0x00,0xa8,0xa2,0xa0,0x61,0xcb,0x38,0xa2,0xec,0xc7,0xc9,0xcf,0x11,0x3f,0x92,0x70,0xbf,},{0x51,0x45,0x35,0x58,0x0f,0x0d,0xe3,0x59,0xbb,0x0d,0x41,0xf2,0xef,0xdd,0xaa,0x04,0xc2,0xec,0x95,0x01,0x19,0xf3,0x16,0x34,0xb2,0xc1,0xa3,0x2f,0x19,0x5f,0x69,0x68,},{0x4f,0x3d,0x4d,0x22,0x85,0x03,0x01,0x7e,0x74,0xa6,0xbb,0x58,0xaa,0xfa,0xe3,0x5c,0x3f,0x37,0xbd,0xee,0x4f,0xf6,0xbe,0x2e,0x62,0x40,0xb5,0x08,0x2f,0xed,0xdb,0x22,0x27,0x35,0xe1,0x2f,0x31,0xe0,0x56,0xfa,0x68,0x54,0x47,0xe5,0x38,0x48,0x03,0x00,0x7e,0xa7,0x91,0x0e,0x60,0x5c,0x1b,0x78,0x11,0x8c,0xd5,0xac,0xc5,0x87,0xa6,0x06,},"\x48\x14\x25\x02\x7d\xa6\x72\xb6\xf2\x6c\x91\xb8\x0e\x55\x58\x2c\xae\xf4\x7b\xb1\x5a\x2d\xe8\xfc\xa8\x52\x22\x17\x85\x18\x0b\x20\xa7\xfd\x6d\x49\x07\xb5\x88\x1c\xc1\xd6\xe3\x9a\xb9\x61\x2c\xc7\x4d\x69\x77\xe9\x14\x1f\x70\x87\xbb\x27\xab\x30\x84\xa2\x62\x85\x58\x6f\x84\x11\xdb\x1f\x50\x3a\xdf\x52\xdc\xb2\x5a\xb8\xff\xfd\x2e\xc1\x50\x4c\x17\x77\xb9\xd6\xdd\x4a\x29\xe2\x01\x9e\x5c\xba\xe1\xb7\xeb\x26\xf9\x5b\xbe\x07\xd9\x0c\x2f\x6f\xb0\x88\x4a\x59\xa8\xd5\x8d\xde\x51\x16\xed\xc3\xbc\x34\x9d\x37\xc1\x60\xb2\x7b\xef\xbe\x5a\x5c\x18\x1c\xe7\x25\x63\x92\x35\x4d\x22\x1b\x58\xc4\x7e\xb0\xbb\x10\x92\x9e\x74\x21\x79\x5f\x4b\x7a\x7c\x27\x5e\xdd\x08\xc0\x88\x56\x87\x72\xe9\x93\x21\x8d\xd6\xf3\xc2\xcb\x4a\xc6\x57\xa0\xa3\xf9\x1f\x31\x26\xb9\x91\xad\xf6\xcb\xe7\xd1\xb1\x9b\x8c\xd8\x3b\xe3\x60\x2e\xd1\x8f\x03\x96\x33\xfb\xd2\x38\x7b\xda\x69\xe2\xcf\x03\x87\xd8\x64\x4d\x97\xb3\x03\xfb\x00\x63\x9a\xee\xe7\xae\x46\x3f\x6f\xe1\xa2\xc4\xb8\x9a\xeb\xa3\xe9\x09\x4c\x11\xfc\x29\x11\x4b\x20\x28\x3f\x28\x7c\x6d\xd2\x8c\xb0\x98\xda\xe8\xda\xbc\x48\xe8\x5b\xb5\x9c\x0d\xc6\xe7\x8c\x95\x66\x05\xcb\x7c\xf0\x69\x42\x35\x3e\x7a\x22\xe9\x6f\x80\xa3\x7a\x66\xf7\x18\xd9\xe4\xdb\x8c\x52\x45\x2a\xa0\xa3\x57\x72\xe8\x1b\xa2\xb3\x03\x20\x5b\x41\x2d\xd2\xbf\xc1\x5c\xe9\xb4\x36\xf9\x9f\xbb\x32\x12\x6b\x63\xce\x9c\xb4\x31\x99\xf1\x57\xd8\x17\x51\xa7\xc4\x93\x7d\x13\xaf\x4c\x58\x29\x52\xb5\xd6\x06\xb5\x55\xb0\x46\xbf\x1d\xe0\x6c\xf3\x9b\x63\xa8\x02\x87\x37\x18\x03\x60\x9a\x38\x7e\xe8\x0f\x3a\x5d\x88\xb9\xd6\x21\x96\x50\xed\x17\xd3\xcc\x18\x3b\x2c\x70\xd5\xeb\x94\xe3\xbc\x52\xae\xa7\xaa\x7f\x53\xbe\x0e\x20\xb8\x97\x2f\x14\x3d\x8e\x20\x16\x2e\x80\x3e\xdb\x4a\xa8\x3d\x55\x53\xfd\xd5\x53\x39\x8b\x0f\xa1\x76\xb9\x59\xcb\xa1\x40\xd6\xe9\x80\xc9\x25\x1b\x0f\xa0\xb6\x5e\x90\x84\x17\xf8\x2f\x45\x1f\xf9\xf2\xde\x6b\x9c\xa5\xe3\xb5\xf4\x1b\xa4\x0d\x05\xa5\x4f\x3d\xab\x48\x86\xaa\xcc\xa0\x5c\x9c\x27\x98\x13\x9a\x4c\xb3\x3e\x96\xa9\x14\x94\x74\x99\x10\xa1\x7c\xe8\xb3\x92\xfc\x0f\xc7\x76\x29\x74\xd7\x9d\x33\xdb\x92\x4b\xfe\xf8\x65\x5a\x72\x37\x76\xff\x87\xf9\x50\xfd\xc5\x68\xb1\xe5\x26\x53\x45\x41\xf5\x72\x72\x3b\x84\x06\x63\xc1\x91\x88\xc4\x24\xf7\xc4\x89\x23\x5a\x42\x4b\x09\xfe\x25\xc3\x07\x27\xea\x1c\xb0\x49\x53\xd7\x06\xd6\x8b\xfe\x12\x10\x0e\xf6\xf6\x4c\x35\xc6\xb8\xde\x67\xed\xf0\xe3\xad\x01\x4a\x40\x0e\x82\x1e\xa3\x40\x24\x32\x19\x99\x86\x7b\x43\xc8\x2c\x45\x01\x84\xb7\x8f\x74\x25\xce\xbd\x73\x19\xdc\x6f\x65\xd3\x60\x66\x5d\xfb\xe7\xc3\x66\x74\xda\xc3\xa5\x4e\x96\xda\x91\x0c\x02\xd3\x64\x07\x80\xb2\x2d\x51\x2c\xa0\xe3\xca\x35\x87\xb9\x4e\xa9\xfc\xd7\xa3\x1b\x4a\xf6\x9f\xd6\x20\x7c\x68\xfe\xd2\x5f\x89\x92\x1c\x1c\xdc\xde\xfd\x1c\x09\x02\x04\x49\x2b\xff\x9b\xbb\x52\xe0\x88\x85\x82\x9d\x01\x2b\xc2\xdf\xb4\xfe\x8c\x35\xe5\x9c\xd1\x3b\xcb\x8e\xad\x34\x19\x3c\x40\xb0\x3e\xe4\xd8\x25\xee\x13\x22\xff\x4e\xf0\x71\x27\x95\x74\xcb\xae\xe7\xc0\x7f\x14\xbe\x60\x6b\x9c\xd0\xe2\x61\x11\x1e\xf2\x0d\x96\x81\xd7\x6c\xf7\x8c\x89\xa8\xc3\x97\xd6\xb8\xdc\x77\x8f\x49\x84\x16\x6a\xd5\xdf\x3a\x81\xaa\xf2\xe6\xde\x09\xf7\x00\x19\x5a\xe2\xc1\xd4\x60\x96\x47"}, +{{0xd4,0xa7,0xa9,0x52,0x4d,0x30,0xa6,0x33,0x7c,0x0a,0x0b,0xe9,0x5c,0xa9,0x05,0x91,0xde,0x98,0x88,0x03,0x8e,0x3e,0x59,0xe1,0xb2,0x5a,0x41,0x81,0xef,0x94,0x66,0x29,},{0x9f,0xc3,0xeb,0xd1,0x39,0xcc,0x5b,0x7c,0x0e,0x05,0xaf,0x47,0xbf,0xf6,0x61,0x9b,0x81,0x28,0x15,0xbb,0x01,0xce,0xec,0x39,0x2a,0x3f,0xf0,0xae,0xc3,0x81,0x1d,0x2c,},{0xd1,0x57,0x88,0xbc,0xd8,0x8d,0x1d,0x81,0xb9,0xe6,0x1d,0x4f,0xe2,0x6e,0xa4,0x9e,0x66,0x81,0x9a,0x59,0xd2,0xae,0x48,0x32,0x32,0x1b,0x81,0x4d,0x50,0x62,0xfa,0xdb,0x87,0x80,0x7d,0xb6,0x85,0x2e,0x1d,0x82,0x95,0xe3,0x1a,0x29,0x1b,0x1e,0x78,0x5d,0x01,0xd8,0x34,0x89,0x5f,0x88,0xf4,0x00,0xdf,0x88,0x32,0xc1,0x60,0x7b,0x5b,0x0c,},"\x17\x19\x80\xc0\x3f\xdf\x7a\x72\x7b\xd5\xba\xb3\xba\x09\x45\xe6\xad\x5f\xaf\x0a\x7f\x50\x6a\x56\xd1\xd0\xed\xd9\xa3\x06\xb3\x15\x8d\x84\x32\x66\xd3\x09\x1f\xc1\xe4\x22\x81\xdf\x97\x55\x9a\x22\x01\xf5\xbd\xdd\xfe\x68\x3d\x0e\x10\x28\xd1\xd9\x5b\x2f\x31\x3b\x48\x4c\x39\x2f\xfd\xb1\xcd\xf8\x85\x08\xaf\xde\x3d\x6f\xd2\xa1\x28\x88\xba\xce\xde\xb7\x9f\xf3\xdb\x40\xc9\xac\x0e\xc3\xfb\x90\x1b\x22\x86\x98\xad\xf8\xd8\x45\xff\x4f\xce\x10\xde\x55\xd4\x24\x36\xdc\xe9\x30\x97\x3a\x34\xbe\x05\xd1\x40\x1f\x33\x4d\x4c\xe8\xe3\xa7\x93\x79\x9e\xaf\xdb\x94\xd0\xf2\xab\x09\x50\xb0\x79\xe6\x65\x3e\xeb\x49\x9f\xc7\x44\x7c\xcb\xee\xed\x8d\xbd\x54\x56\x80\x8c\xd7\xa3\x8f\x9a\x15\xa2\xa9\xc7\x38\xd6\x13\x34\xca\xb8\xce\xeb\xbb\xf4\xa4\x81\x4d\x94\xc6\x18\x59\x17\x87\x84\x60\x4e\x0c\x21\x54\x59\x7e\x72\xcf\x58\x7c\xd1\xf5\xda\xfe\x59\x22\x05\x18\x90\xe7\x6d\x61\x6d\x8c\xd5\xb0\x5d\x64\x78\xd0\x62\x6e\xa8\x3c\xe8\x08\xc4\x61\x43\xe6\xfb\x06\xb4\x18\x2d\x22\x8d\xa8\xf6\xd4\x13\x9e\xca\x5b\x8f\x3b\x1b\x98\xaf\x68\xc5\x9b\x4b\x5a\x53\xc1\x36\xee\x90\x43\x2a\xca\x2b\xb9\x15\x52\x9d\x26\x36\x79\x49\x82\x62\x33\xb4\x3e\x55\x80\x4b\x55\xfc\x9f\x21\x5e\xb0\xb0\xb7\x92\x91\x46\x5b\xb3\x4e\xda\xea\xdf\xfa\xbf\xe6\xcf\x41\xbc\x07\xb5\xdd\x4d\x01\x42\xf0\x36\x1f\x05\x8e\xe1\xb3\xb9\xfc\xc1\x96\xeb\x9b\x35\xb1\x34\xbe\x3d\x1d\x23\x20\x04\x48\x9e\x8f\x69\x93\xf6\x25\xa6\x30\x15\xbc\xd3\xf1\xe8\x75\x88\x32\x48\x58\xcc\xfb\x77\x0d\xdd\xd8\x94\xbf\x29\x7b\xd7\x63\xef\x58\x28\xe2\x1f\x5c\x89\xaa\x98\xcf\xbc\x1c\x08\x2d\xd7\xfb\xaa\x43\x07\xbd\xa4\x0b\x4a\x75\x8c\xa8\xf3\x9f\x4e\x4a\xae\xd3\x09\x04\x12\x68\xdb\xcf\x0a\xf3\x2d\xe0\xd7\xfa\x90\xa5\x23\x96\x3b\x78\x0b\x6a\x93\x2c\xf8\x94\x99\x02\x5f\x0e\x0d\x04\x74\xc7\x43\x48\x94\x75\x10\xe6\xc5\xec\x7c\x9e\x05\x06\x6e\xeb\x4a\x73\x52\x0c\x3d\x92\x7c\x39\xac\x26\xad\x75\x96\x32\x5b\x2c\xc4\x7c\x5e\x82\xa7\x75\x45\x5b\x7a\xf0\x31\x20\xb1\xcf\xbf\xd6\xec\x3f\xc0\xc3\xbe\x60\x78\xb0\x0c\xfd\xf8\x34\x2a\xe8\xbf\x14\x71\x59\xf5\x0e\x9d\x56\x4e\x2f\x68\x30\x6d\xae\x3c\xae\xdd\x10\x19\xf3\x23\xc4\x78\xa1\xe1\xf6\x75\x98\xdd\x83\x4b\xd1\xd1\xa8\x73\x3f\xd7\xfd\xd8\xa8\x76\x52\x6c\x53\x15\x18\x93\x6e\xdb\x72\xd0\x16\x56\xb3\x44\xc7\xd6\x5a\xc1\xce\xe3\x7c\xe5\x99\x7b\xa4\x8d\x3f\x4d\x06\x4d\x88\x05\x7e\xfe\x9a\x48\x2d\x9e\x00\xab\x5c\xae\xb5\xac\xa2\xd6\x60\xe3\x37\xbd\x15\x48\x73\x65\x69\x79\x56\xa5\xe4\x7b\x02\xab\xdc\x30\xd8\xe3\x53\xfe\xd4\xe1\xac\x41\xd2\xbc\x21\x20\x02\x11\x43\x63\x59\x35\xc6\x20\x18\x6a\x52\x2b\xde\x54\xbe\x04\x46\xfb\xd2\xdc\x88\xb5\x63\x04\xb3\xa6\x42\x27\xd0\xac\xd5\xf8\x5a\x6b\x67\x87\xa3\xad\xcf\x2d\x7c\xfc\x86\xc6\x34\xb4\xd7\xab\x43\x15\xb9\x7d\xe9\xe6\x66\xcf\xf3\xff\x1b\x88\xf3\x29\x5e\x7b\xab\x9e\x9f\xd4\x6f\xaf\xdd\xb4\xf5\xfa\xc5\x1c\xc0\x17\x01\x29\xc6\x51\xb4\xef\x4d\x39\x50\xd6\x94\x2f\xf0\x20\xd1\x66\x8a\x52\x8b\xde\x1d\xa9\x36\xc0\xec\x1a\xe0\x9e\x84\xf8\x20\x58\x61\xff\xf4\x91\x50\x2a\x87\x2c\x81\x54\xa9\x6e\x7e\xa2\x5e\xda\x95\x5a\x7f\xd2\xe4\xb4\xc7\xa8\xd2\x73\xf6\x0b\xc7\x4f\xab\x7b\x49\x68\xca\x6f\x75\xda\xea\x50\x40\xf8\x39\xfd\x56\xc2\xa9\x80"}, +{{0xd0,0x8f,0x4b,0xab,0xba,0x3b,0x53,0x65,0xfa,0xf7,0x38,0x79,0x5c,0x9d,0xa4,0x5d,0xb1,0x86,0x2c,0xb2,0x8b,0x93,0xeb,0x66,0x35,0xd1,0x32,0x0d,0xa0,0xf4,0xd9,0x37,},{0xef,0x31,0xb4,0x54,0xf7,0x34,0xe5,0x2b,0x34,0x38,0xee,0x2f,0x1c,0xbc,0x35,0x63,0x1b,0x19,0x69,0xde,0x54,0xac,0x98,0xfe,0x46,0x33,0xf2,0xf5,0x00,0xac,0x87,0x12,},{0xac,0xeb,0xe4,0xc8,0x6f,0xa9,0xfe,0x2c,0x1a,0x5c,0x57,0x6a,0xc0,0x50,0x1e,0x8a,0xb0,0xf6,0x40,0xfa,0x40,0x38,0x05,0x36,0xfc,0xf9,0x50,0x59,0xd5,0x3d,0x4a,0x35,0x55,0xd2,0x20,0xac,0x36,0x35,0x87,0x17,0x5e,0x4b,0xde,0x16,0x3c,0x0d,0x00,0x65,0x0a,0x12,0x96,0x3d,0x46,0x76,0x6c,0x99,0xbb,0x62,0xbf,0x75,0x73,0xe2,0x87,0x0c,},"\xa3\x94\xd8\x85\x4c\xeb\x5c\x43\xaf\xee\x1a\x48\x92\x6b\xbd\x66\x85\xaa\x8a\xec\xfd\xcf\x85\x41\x33\x33\x39\x74\xd6\x24\xbf\x2f\x1f\x9c\x30\xf0\x05\xbb\xf3\x4c\xee\x3a\xfe\x2b\x29\x06\x00\xee\xae\x6f\x1d\xd1\x2a\x0c\x34\x6f\xbb\x2a\xb9\xc9\x16\xc5\xd5\xd8\x0d\xcd\x87\x88\x78\x75\xa0\xac\x84\x76\x78\x03\x9f\xdc\xd3\xa9\x79\x35\x41\xf5\xd6\x75\x14\x3a\x6a\xba\xdc\x3b\x18\xf0\xfe\xf5\x10\x8c\x19\xc2\xdb\xfb\x59\x71\x0e\xef\x98\x66\xa4\xf3\xf2\x97\xa0\x9e\xe4\x8c\x68\x03\x00\x7d\xd6\xba\x8f\xd4\xbe\x84\x1c\xfb\x10\xff\x05\x14\xc3\x0f\xc4\xdd\x49\xa3\xcd\x43\xbb\xd1\x6e\x46\x04\x43\xa1\x1a\xfe\x64\x9e\x90\x1d\x63\xd8\x9a\xf5\x98\xaa\x68\x6b\x2f\x60\x7e\xc1\x1f\x35\xe1\x7a\x79\x8a\x42\x13\xb7\x5a\x38\x78\x8d\xa4\xf2\x7c\xf2\xb0\x2c\xad\xdf\xe6\x1c\x37\x29\xa8\x7e\xc6\xe6\xb0\x98\xf6\x8e\x7a\xed\x28\xa8\x00\xc4\x84\xdf\xa0\x13\x04\x01\x20\x8f\x98\x6d\x79\x2f\x54\x63\x5a\xdd\x28\x48\xe1\x51\x26\x2a\x36\x5e\xb2\x1e\x27\x27\x19\x1e\x1f\x70\x0f\x3b\xf5\xc7\x3b\x0f\xb4\xc5\x46\xd0\x04\x8a\x15\x5c\x18\x71\x79\x20\xfc\x04\x25\xc8\xc8\xfa\x8f\x16\x7c\x43\xa2\x77\xbb\x36\x6e\x0a\xd7\x02\xc8\x9b\xc5\xaa\x06\xfd\x47\x09\x43\xbe\x05\xcb\x9e\x32\x59\x78\x72\x29\x71\x4c\x30\xa4\xe8\x7b\x00\xa6\x33\xaa\xf7\xbe\x6b\x58\x75\x01\x0d\x12\xe1\x07\xc9\xa5\x26\x1c\xa5\x62\xd6\x70\x25\xbe\xa0\xfe\x22\x34\x63\xed\xb9\x2e\xa0\x1c\xca\x92\xc4\x4f\xf2\x4d\xa9\xd8\xa8\x0a\x64\x21\xf3\xd4\x13\x5d\x64\x7d\x1b\xb0\xfd\x98\x8c\x46\xc8\xa1\x70\xce\xb4\xf3\x3f\xff\x9c\x0f\xfb\x6a\xba\xd1\x09\x2c\x84\xdf\xad\x82\x90\x89\x8b\x24\x95\x16\xa2\x92\xe8\xda\x96\xfd\x51\xa8\x10\x05\xee\xcf\xde\xbb\x05\x93\x30\x99\x27\x7d\x07\x3a\x48\x0c\x3f\x9e\xb8\xaa\x11\x96\x8c\x4d\x8d\xc0\x78\x7a\x9a\xec\x3e\x05\x27\xb7\xfe\x4c\x06\x35\x41\x13\x35\xa1\x81\x16\x89\xe8\x8f\x6d\x5c\xed\x0d\x40\xd6\xb4\x8b\x7f\x2d\x99\x29\x52\x93\x48\x94\x15\x30\x76\xa8\xd3\x73\x72\xfa\x00\xd9\xce\xfc\x5c\xf8\xc2\x6a\xdb\x5a\xcf\x32\x5a\x01\xcd\x00\x5a\xb8\xd4\x74\xa5\x2d\x67\x11\x40\x78\xc6\x51\x6a\xef\x80\x4b\xba\x19\xb8\x87\xa2\x8e\xd5\xe4\x6e\xe9\x99\x5e\x5a\xd3\xa8\x2f\xb9\xcd\x93\x28\x34\x33\x68\x09\x21\x11\x4b\x4d\x9a\xf8\xfc\xb6\xb2\xb5\x35\x83\x9c\x36\xde\x8d\xf1\x2b\x17\xea\x6d\xdc\xfc\xb3\x33\x4f\xf4\x0e\x6c\xf0\x4c\xcd\x5c\xa6\x40\x3b\xa0\xb6\x2b\x4c\xb7\x1b\xbd\xe9\x1d\x8b\xab\xda\x69\x15\x2c\x9c\x93\xae\x76\x9b\x55\x29\xc8\xd5\x2f\xd9\xa6\x90\x9a\x15\xe1\xa0\x60\x1a\x71\x46\x49\xc9\x6e\xc9\x96\xc1\x70\x6d\x10\x21\xb9\x74\x87\x98\x0d\x7b\x2c\x2a\x39\xbb\xb0\xe4\x70\xd8\xe4\x6a\xc4\xaa\x60\x9a\x09\x22\xc9\xbd\xc0\x16\x12\xea\xde\xac\xcd\x5f\xa5\x23\xb2\xa8\xd0\xe6\x2f\xfe\x56\x28\x16\x47\xd6\x1f\xff\xbb\xc8\x40\x53\x57\x45\xd1\x44\x25\x9c\xc8\x13\x00\xfe\x99\xdf\xbf\xfe\xa6\xb0\xb9\xbc\xd2\x84\x73\x98\x2d\x32\xe9\x3e\xd4\x66\x34\xa9\x98\x79\x06\xd6\xf4\x89\x39\xd8\xdf\xbf\xb3\x7d\x33\xb8\x88\xdb\x60\x8c\xb2\xff\xe3\x9a\x8c\xf6\x7b\x72\x64\x46\x11\xc7\xd3\x2a\x4a\x8d\xf6\x12\x46\x8c\xd5\xe5\xd7\x5f\xbb\xa7\x9e\x63\x8a\xa1\xda\xa2\x8c\x4e\x0e\xeb\x9a\x63\x7f\xf8\xa0\x8b\x65\xf7\xa7\x61\x24\x14\xdf\x76\xbc\x7b\x0b\x56\xb5\x53\x7d\x66\x6f\xac\xfd\xda\xf6\x5a\xf1"}, +{{0x8f,0x47,0x4f,0x88,0xcf,0x86,0x3c,0x48,0x54,0x56,0xa5,0xa2,0x15,0x52,0x81,0xff,0x27,0xb2,0x84,0x59,0xf6,0x3b,0xc4,0xf1,0xdb,0x00,0xe0,0x03,0x10,0x64,0xf6,0x49,},{0x43,0x14,0x4a,0x32,0x9d,0x75,0x1d,0x04,0xe0,0x71,0x69,0xb7,0x79,0xee,0x92,0x0d,0xd0,0x29,0xcb,0x44,0x5b,0xf3,0x76,0xba,0x3a,0x66,0x85,0x72,0x18,0x23,0x44,0xa3,},{0xf6,0x1f,0x78,0x07,0xc3,0x3e,0x19,0x6d,0x0f,0xe1,0x82,0xef,0xa4,0xd4,0x51,0x6a,0x98,0x15,0xdd,0xd4,0x49,0x53,0x8b,0xba,0xa6,0xb8,0x6b,0x69,0x01,0xa0,0x5f,0x5d,0xdd,0xa0,0x60,0x1e,0xc9,0x0f,0x39,0xf1,0x55,0x47,0x79,0xdb,0x7a,0x09,0xa6,0x05,0x72,0xef,0xfd,0x4d,0x12,0x8d,0x0d,0x3c,0x2d,0xd4,0xe8,0x83,0x57,0x4b,0xc6,0x0b,},"\x84\x08\x91\xd9\x48\xec\x19\xc8\xc7\xf7\xc9\xd3\xc4\x77\x53\x62\xa5\x44\xa0\xec\x97\x45\x7a\xb5\xd1\x4e\x12\x5d\xc5\x4b\x59\xc8\xdc\x9a\x63\x5e\x7b\xad\xb6\xbe\x73\xc3\xa5\x8d\xc0\xe9\x92\x9f\x2b\x42\x0d\x83\x56\xd6\x17\xc3\xd4\x1b\xfe\x69\xb4\xe1\x58\xd4\xbf\x08\xfb\x17\xe6\x88\xd3\xcf\x3c\x94\x8b\x69\xb3\x5f\x0b\x6d\xb6\x62\x72\xa8\xeb\x2b\xd4\x10\xd6\x50\x9f\x6c\x82\x8b\x6a\x20\xd6\x58\x6e\xaf\x85\x76\x01\xed\x9d\x60\x54\x79\x9c\x25\x32\x0e\xba\x80\x77\xfe\x1a\xe2\x26\x71\xb3\x3a\x15\x88\xff\x2b\x23\x5d\x3c\x71\xa2\x7c\xe5\xc6\xc6\x6e\x18\x88\x91\x98\xd1\x16\x93\x36\x76\xbc\x4f\xb0\x71\x0d\xb7\xff\x1a\xc2\xf2\x0c\xe3\x69\xbe\xf5\x6b\x43\xcd\x1d\x40\x6c\xef\xda\xcf\x00\xf1\xf3\x48\xb8\xca\x7a\xa6\x14\xdb\x11\xa3\xa6\x40\xfd\xb5\x93\x89\xd1\xa6\xa3\x94\x75\x5c\x13\x3f\x1b\x01\x9c\x83\x08\xca\x5a\x95\x1e\x73\xb8\x10\xa1\x80\xf6\xff\x25\xb2\x9d\xbb\xcc\xef\x4c\x13\xa9\x75\x03\x39\x39\x07\xa2\xdb\xa0\x96\xa8\xce\x5c\x86\xc0\xee\x6f\x97\xc1\x44\x1b\x8d\x63\x31\xcb\xa5\x3b\x19\x60\x6b\x42\x1a\xf5\x2f\x65\xf9\xc6\x63\xe6\x3d\x39\x82\x71\x8f\x94\x8c\x6b\xae\x96\x1b\x8e\x4b\xf8\xcd\x9e\x31\xcd\x09\x92\x8e\x4e\x80\x61\x65\x97\xcc\xfa\xdc\xb8\xa6\x14\x15\x49\x33\xbc\x37\x58\x9c\x85\xc7\x76\xe3\x4e\x5a\x90\x66\x0f\x59\xa6\x5b\x5e\x93\xad\x43\x88\x42\xf9\x82\xd0\x2b\x04\x1e\x6d\xbd\xdf\x17\x10\x99\xf8\xdb\x70\x99\x57\x31\xa0\xdb\x8c\x46\x25\xc9\xbc\xa7\x10\x80\x59\x61\xfb\x17\x6d\xae\x81\x97\x68\xfc\xad\x7f\xf9\xbf\xce\x36\x40\x3c\xa7\xf7\x83\xe7\x61\x37\x26\xd7\xdc\x59\xf2\x4e\x24\x7c\xf1\x50\x68\xff\x3b\x19\xc7\x25\xfa\xd6\x5e\xa8\xe8\xa7\xf7\x22\xd5\x28\xc9\x5f\xce\xf1\xc0\xcc\x79\xd1\x8e\xf0\x7c\xee\x8b\x01\x1e\xea\xbd\x99\x21\x63\x4d\x76\xa6\x1a\x8a\x3c\x89\x31\xb8\x27\xe8\x18\x98\x81\xf8\x1f\x7a\x17\x5f\x21\xfb\x03\x78\xb8\x18\x8e\x58\xbd\xb2\x01\x7b\xef\x39\x0f\x18\x00\xd9\xd7\x4f\x26\x3a\x81\xdf\x8e\x67\x52\x2d\x09\x2e\x77\x5d\x01\xe0\x04\xe7\xf8\xd8\x28\x1a\xe2\xc2\xfd\xf8\xc3\xa4\x45\xf9\xef\xf7\xfd\xf1\x3f\x26\x1a\x77\x3d\xdf\x2d\xd9\xcc\x6b\xa5\x58\x5d\x99\x0c\x99\x5e\x6e\xb8\x9d\xff\xd9\xff\x0a\x9d\xbb\x76\xce\x5e\x10\xdd\x02\x72\xd5\x00\x14\x97\x88\x13\x66\xf5\xd6\x36\xa9\xcc\xea\xa2\x83\x22\x8d\x3a\xc6\x14\xdb\x21\x7a\xb8\x91\xd6\x68\x9d\xbe\xb9\x50\xe1\x20\x0c\x3d\xe5\x3b\xc5\xda\x07\xf1\xd3\x63\xda\xe9\xbe\x6e\xc3\x6e\xda\x6e\x68\x7d\x26\x29\x0f\x7a\xbc\xa2\x68\xa7\xfa\x03\xd9\x31\x88\x64\xed\xa9\xa1\x1e\x3b\x26\x14\x06\x05\x92\x0a\xc1\x3a\xde\xc1\xb5\x54\x8c\x9a\x7a\x32\x15\xa5\x87\x6b\x7e\x94\x1a\xfa\x1c\xb5\xd7\xf7\xf0\xc1\x16\x30\xcd\x42\x9f\x3b\x2b\x37\xdc\x76\xc6\xcb\xea\x4f\x3b\x72\x6a\xa8\xa5\xf8\xb9\xf7\x05\xb0\x5d\x7e\x94\x51\x95\x6f\x8a\xf1\x3c\xe0\xa8\x59\x55\xc7\x13\x5d\x64\xad\xe5\x49\x6e\xa5\x42\xe7\x0f\x8d\xa5\xb5\x73\xaa\xf1\x37\x08\x5d\xc9\x6c\x69\x27\x09\x96\x95\x67\x26\x68\xb3\xc7\xc6\xf9\x3c\x97\x7a\x4e\x8e\x9e\x77\x02\x95\xf2\x0d\x52\xdf\xf1\x87\xf8\xdb\xb2\x5e\xe7\xe7\x74\x02\x4e\xb9\xbe\x08\x12\x1e\xd7\x4b\x6d\x54\x62\xf4\xbb\x7d\xc2\x00\x38\x74\xca\xa3\x1b\xb7\x59\x5c\xd9\x3a\x99\xeb\xe1\xef\xf9\x28\xbb\x5f\xcb\x9e\x9c\x89\xdd\x31\xd4\x87\xfc\x0e\x20\xbb\xe1\x50"}, +{{0xe4,0x2b,0x30,0xd4,0x9c,0x43,0xc4,0xfa,0xd8,0x3d,0xd5,0x1f,0xdc,0x2a,0x4a,0xc5,0x90,0x13,0x27,0xad,0xd8,0x00,0xb6,0x69,0x72,0xc8,0xc7,0x0b,0xde,0x18,0x0a,0xdc,},{0xf7,0x34,0xaa,0xfa,0xa4,0xdb,0xaf,0x31,0x5c,0x25,0x8c,0xca,0x8b,0xbc,0x1d,0x4f,0x34,0xe8,0x36,0x01,0x10,0x98,0x74,0x22,0x2a,0xa0,0x55,0x89,0xf3,0xa6,0x63,0x5f,},{0xff,0x8e,0x07,0x6e,0x34,0x3c,0x8b,0x73,0xaa,0x45,0x3b,0xfe,0xe9,0xb2,0xba,0xb6,0xd5,0xc2,0xf7,0x4c,0x35,0xe1,0xba,0xd1,0xe5,0x2a,0xe7,0x77,0xd6,0x9f,0x79,0x76,0x40,0x83,0xf9,0x94,0x36,0x8a,0x1a,0xc8,0x51,0xa6,0x41,0xcd,0x24,0x70,0x08,0xa3,0x4f,0x3b,0x60,0x89,0x62,0xf4,0xdd,0x51,0x09,0xac,0x71,0xcc,0xe9,0x78,0xec,0x02,},"\x0d\x49\x70\x51\x86\x1e\x22\xd8\xa9\xc6\x0e\x5f\x7d\xe6\xc8\x95\xcb\xa3\x35\xb2\xe8\x2e\x60\x21\x18\xad\x83\x42\xb4\xd4\xed\xaa\x80\xf9\x5e\xfb\xb5\x9c\xfd\xa1\xfc\xc0\x29\x17\x25\x70\x0e\x8a\x81\xbb\x12\xa0\xb8\x62\x3b\x1f\xe2\x89\x1b\x8d\x98\xf7\xa8\x4c\x59\xfd\x92\xf8\xa7\xad\xfc\x06\x50\x42\xf7\xf4\xfd\x7e\x1a\x79\xf5\x5a\x1d\x4d\x5e\x54\xe0\x4e\x67\x2f\x1c\x9e\x4c\x4c\xd8\xd0\x00\x3f\x3c\xd5\x4b\x76\xe2\x16\x3d\xd7\x37\xac\xb2\xde\x5c\x26\x3a\xc1\x02\xa4\x8f\x69\x6b\x60\xca\xf9\xbe\x39\xc6\x65\xcc\xe1\xe0\xf3\xd4\x98\x55\x3f\x57\x90\x61\x88\x9a\x5e\xc5\x60\x3e\x4d\x14\x1c\xfd\xed\xe8\xe7\x31\x75\x72\xcf\xe7\x6a\x0f\x48\xe4\xae\x06\x06\x2c\x91\x57\xb5\xea\xac\x34\x68\x93\x81\x92\xdb\x4b\x16\x10\x5c\x73\x64\xa9\x44\x32\xb2\x15\xa7\x17\x97\xfe\xe1\x4c\x3c\x9c\xe2\xf7\x46\xed\x79\x03\x02\xfc\x41\xdc\x49\x2d\x37\xd9\xef\x02\x4a\xb5\x1d\xa3\xbd\xaf\x0f\x81\xd9\xa9\x30\xaa\x0e\x02\x5c\x04\xfd\x71\x02\x6b\x6a\xfe\xb7\xed\x01\xa9\x1a\x1e\xfd\x6c\x39\xf5\xe4\x47\xc6\x6d\xd3\x8a\x76\x56\xc6\x13\xd0\x21\x26\xf3\x58\x5d\xfa\xa0\x2d\xf9\x30\x25\x3f\x83\xbd\x42\x19\x64\x63\xeb\xc5\x0f\x8c\xfc\x94\x9e\xd3\x50\x39\x2e\x61\xce\xec\x13\x09\xda\x15\xa4\x32\xf8\x0d\xfe\x94\x8e\x26\x1c\xe6\xd8\x42\x1c\x54\x59\xcd\x21\xf3\xff\xa2\xed\xb5\x00\x98\x2b\x2a\xbf\xa5\x2e\x82\x43\x7c\xa2\x30\xf6\x09\x11\x63\x20\xd9\x89\x3e\xb8\x2a\x14\xdf\x72\xb7\x73\x66\x67\x51\x6f\xc0\x12\xb2\x8a\x03\xc9\xdd\x88\xea\x43\x08\xd8\xce\xea\x44\xcc\x60\x44\x54\xcd\xfa\x2c\x79\x76\x15\xbc\x0a\x6b\x3e\x00\x89\xaf\x0a\x81\xbe\x54\xd1\xb1\x10\xa1\x3a\xb9\x11\xb4\x52\xc3\x42\x80\x0c\xee\x2a\xd2\x39\xa2\xb1\x88\xa7\xfa\x87\x5e\x94\x1d\xaa\xeb\xcf\xc8\x8b\x70\xae\x4b\x1c\x57\x5c\xdb\x6e\x6d\x89\x44\x81\x36\xf6\x0e\xe8\x1c\x70\x3c\x47\x82\x2d\x2c\x0e\x50\xc7\xf1\xe8\xb7\xfc\x7e\xbd\x80\x78\x9f\xcd\x7e\x06\xc7\xe5\x0b\x5f\xc8\xb7\x76\xe8\xb9\xa4\xcd\x59\x05\xa2\x90\x69\xbc\x3a\x55\x8d\x7c\xab\xce\x2a\xf4\xf3\x10\x76\x7d\x5b\x11\x7e\x30\x76\xb3\xa0\xd5\x27\x17\x55\x43\xb2\xcc\xea\x28\xd5\xf7\x16\xfa\xc3\x2e\xfe\xd3\xd2\xe0\x27\x6b\xe4\x4a\x89\x56\xfc\x82\x40\xf2\xdb\x33\x97\x61\x4f\x2f\x2d\xa0\x21\x66\x69\x4e\xc6\xa7\xfe\xec\x6e\xce\x39\xd7\x2b\x64\xbb\xc6\xb4\x76\xa4\xf8\x4f\x8d\x87\x93\x80\xa3\x84\x88\xe4\xd6\xe5\x8c\xac\x03\x90\xae\x25\xa5\xfc\xb7\x3d\x47\x41\x4b\x4c\x26\xbb\xb9\xb4\xcc\x66\xe4\x25\x94\xbd\x56\xd8\x41\xa3\x60\x92\x34\x91\xd1\x17\xbe\x2c\x6e\xb2\x32\x0f\x3c\x61\x75\xe4\x4e\x27\xb6\x65\x3c\x5d\xac\x6f\xae\x73\x60\x0b\x67\x96\x0d\xca\x50\xaa\x85\x5a\x89\xe0\xff\x51\x1e\xa0\x4f\x14\x3e\x89\xf1\xda\x02\x84\x76\xbe\x4b\xf6\xd9\x4c\x80\xff\x72\x63\x39\xe8\xbc\xfb\x7d\xd9\xf8\xcf\x20\x22\x59\xc0\xac\xb6\x27\x6c\x28\x1e\x38\x47\xc2\xcc\x8d\x2f\xba\x84\x43\x8d\x2d\x3c\x60\x31\xf2\xa7\xb9\x5c\x1d\x8f\x9f\x3c\xc8\x6a\x5e\xff\x65\xcc\x01\x1d\xe9\x5a\xd8\x96\x85\x8e\x1f\x7f\x6d\x6b\x94\xbf\x49\xdf\xff\x5d\xe2\xd7\xfd\x71\xef\x10\x81\x34\x28\x5f\x61\xae\x47\x54\x83\x44\x2d\xc9\x0b\xf0\x13\xfa\xed\xf3\x77\x1c\x47\xc5\xb9\x6d\xc3\xcf\x8e\x48\x51\x00\x60\xad\x8d\x45\xfd\x54\x61\x62\x27\x80\xd8\x69\xd4\x61\x7b\x57\xfe\x3c\xb5\xcc\x02\x03\x15\x3a\xae"}, +{{0x5c,0xb5,0x14,0x21,0x74,0x82,0xbf,0x42,0xf6,0x11,0xfc,0xec,0x36,0xa5,0x28,0x68,0x07,0xc2,0xbd,0xbb,0x56,0x96,0x76,0x91,0x35,0x3f,0x54,0x31,0x0e,0x1a,0xd5,0x53,},{0x28,0x06,0x99,0x00,0x3d,0x5d,0x3e,0x1c,0x05,0xad,0x10,0xfb,0x10,0x95,0x9b,0xbc,0x59,0x5c,0xfe,0x21,0x30,0x69,0x96,0x5c,0xd8,0xcf,0x39,0xdd,0x42,0x6a,0x05,0x68,},{0xd5,0x3e,0xe2,0xe0,0xf0,0xfd,0x65,0x7b,0x20,0x52,0x47,0x8f,0xd1,0x5d,0xf1,0xd3,0x8f,0xe0,0xe9,0x3a,0x54,0x83,0xeb,0x4a,0x6e,0x7d,0xe9,0x3d,0x02,0xa4,0xcd,0x54,0x4d,0x8f,0xdd,0xdc,0xea,0x82,0x2b,0x71,0x57,0x6e,0xd0,0x28,0x53,0xd9,0xa6,0xb1,0x4e,0x1a,0x54,0x8a,0xef,0xe9,0x0d,0x92,0xf8,0x83,0x79,0x2b,0x7f,0x1d,0x86,0x09,},"\x2f\x57\x25\x8c\xca\x79\x32\xe5\x8b\xed\x54\x6c\xb0\x04\x11\x15\xbb\xad\x23\xd1\x83\x46\xef\x7a\xb5\xe3\x11\x00\x82\xb3\xa9\x71\x2f\x6c\xbe\x12\x70\xe6\xdc\x0c\xea\x33\x64\xa0\x6a\x5f\x2f\x28\x3e\xc3\x9b\x63\x05\x8d\x34\xd5\x99\x79\x07\x2f\xcb\xbd\x7a\x5d\x0f\x44\x2b\xbd\xf0\x82\xd5\xbf\xe2\x99\x8a\xeb\x51\xbd\x26\x12\x78\x03\xe5\xc7\x96\xc3\x88\x43\x20\x0a\xe2\xf6\xe6\x05\xaf\x31\x2f\x54\xfd\xff\x17\xed\x1d\xfa\xa8\x9d\x28\xfa\x67\xdc\xe4\x62\xde\x4f\xe2\x52\x68\x21\x2b\x28\x2e\x22\x2a\x44\x3e\x2f\x31\xe2\x69\x05\x41\x71\xaa\x73\xc7\x19\xa8\x96\xcd\xb7\xa5\x39\xdf\xd1\xd4\x29\x91\x97\x81\x97\xd7\xc4\xf2\xd3\x0a\x64\x1b\xe3\x4b\xf1\x38\x0a\x4f\x4d\xc6\xd9\xb1\x01\x63\x66\x36\xa4\x96\xbe\xb3\x57\xe3\x47\xc1\x66\x65\x16\xdf\x8e\xb5\x60\xa0\xe0\xd1\xe1\x52\x9c\xe3\x6a\x60\xe0\x0e\xd2\x78\xda\x38\x02\xbe\x19\x23\x42\x98\x9b\xb6\x11\xb4\xe3\xcb\xd9\xc3\x7e\x8c\xce\x07\xef\xc1\x2d\x29\xbe\xfd\x7e\x2f\x3a\xdb\x13\xd2\x8f\x70\x8d\x97\xb6\x3e\x10\x74\x82\xc8\x62\x95\x6d\x7c\xe8\xdf\xc2\xaf\x5c\xac\x8d\x51\x65\x92\x67\xb0\xbb\xed\xdd\x5e\xfa\x41\x4d\xde\xab\xd1\x7b\x23\xca\x6e\x84\x3f\xf4\x9e\xff\xc8\x2a\x5d\x07\xe3\x6a\x83\xb6\x7c\x2a\xd7\xe4\x8e\xb9\x99\x0b\x42\x1c\x55\x58\x00\x9b\xd6\x93\x4e\x86\xd5\x4a\x8a\x6a\xc4\x07\x87\x96\xe3\x05\xc7\xcc\x81\x0d\x3f\x66\xea\x6b\x95\x04\xfe\x0a\xe6\x75\x7c\x50\x4c\x55\x52\x53\x0a\x6f\x8b\xbb\x52\x40\x9b\xe0\x79\xd8\xe4\xa2\x8a\x6f\xd7\xdc\x89\x35\xf8\xeb\x94\x98\xad\xc0\xf2\x3d\x08\x07\xec\x86\x29\x5f\x48\x98\xf5\xd0\x5e\x15\x0b\xdc\x43\xaa\x8b\x7b\xdc\x89\x3a\x0a\x68\x4c\x30\x63\x89\x8b\x6c\x95\xe7\xd5\x6a\x4c\x10\x26\x90\x43\x8e\x9d\xf9\x97\x58\xa9\x0f\x47\xc6\x08\xda\xcc\x4c\xa2\x40\x26\x6f\xab\xa3\x5f\xa1\xeb\x2e\xaa\xbe\x28\x8d\x2c\x2a\xd5\x0b\x6c\xbf\x10\x7c\x00\x25\x75\xe9\x1f\xf4\x72\xa4\x41\x79\x40\x66\x7b\xe8\x18\x01\x73\x85\x4c\x93\xdf\x84\x46\x4b\xcd\x31\x2b\x7a\x7a\xe4\xdc\x2b\x90\x59\xfb\xe6\xf8\x3f\x53\x80\x64\x25\xbd\xff\x03\x1c\x6a\xed\x6e\xfa\xfd\x9d\xe8\xdc\xd0\xdf\xab\xea\x8e\x6f\xa6\x81\xe9\x91\x93\xfb\x3c\x64\x7e\x44\x21\x12\xc9\xa2\x3f\x59\x6e\x65\x41\x1d\x8d\x6b\xfc\x39\x23\x00\x4e\xce\x91\xea\x6d\xeb\x88\x11\x11\xb1\xdc\x29\x94\x3f\x57\x89\x81\xee\x8c\x3b\xce\x85\x25\xf7\x85\x65\xf3\x4b\x85\xff\x20\x01\x5f\xea\xe8\x46\xf9\x5b\x18\x70\x0b\xc5\xcd\xf1\x4b\x2d\xb6\xca\xc6\x98\x14\xd6\x3d\x74\xbf\x20\x32\x93\x03\xe5\xca\x9f\x04\x73\x1f\x68\x81\xce\xc6\xd3\xab\xf8\x7f\x5e\xac\x08\x73\x4f\xaa\x34\xcf\xf4\xd3\xcd\x9a\x4a\x11\xd7\xb1\x2f\x73\x25\x3b\x4d\xd0\xa4\x31\x78\xf0\xd3\xc1\x9c\x0c\x40\xd9\xed\x91\x8d\xd1\x76\x46\xf6\x16\xaf\x79\xfd\xf6\x19\x42\x62\xf0\xfa\x4f\x71\xb3\x18\x7d\xed\xca\x48\xd9\xcb\xcc\x19\x93\x1a\x15\x19\x67\x74\x56\x25\x6e\xd3\x83\x54\x56\x7c\x3a\x67\x57\x1c\xdf\x82\x17\x0a\x2c\x85\xbd\x2c\x5e\x68\xe0\x5a\x0f\x3b\x93\x90\x3f\x19\x1b\x89\x4f\x84\x94\x6f\x89\x00\x05\x68\x05\x4c\x1c\xea\x9f\xd0\xb8\xbb\x55\x01\x95\x06\xc5\x43\x41\xc2\x49\x31\x98\x45\x48\xba\x45\x8a\x4d\x81\x30\x89\x89\x6e\x86\xa2\xdc\x33\xd9\x46\x04\x00\x3f\x35\x4a\x7c\xc9\x41\xc7\x54\xaa\xea\x24\x25\x3c\xbe\x4c\xf2\x14\x7f\xfe\xc5\xe7\xb9\x50\xcb\xf2\x8e\x28\x44\x81"}, +{{0x87,0xd3,0xba,0x95,0xc4,0x0d,0xf8,0x00,0x69,0xb1,0x79,0x7d,0xdf,0x68,0xe8,0x66,0xe6,0x6d,0x46,0xc5,0x1f,0xde,0x60,0xe7,0x68,0xa9,0xdb,0xc5,0xc9,0x2f,0x57,0xa9,},{0x2b,0x81,0x2b,0x2c,0x9b,0x60,0xff,0x31,0x97,0x5c,0x42,0x9a,0x86,0x73,0x6d,0xcc,0x17,0xa5,0x8d,0x3d,0xc1,0xda,0xa3,0x46,0x23,0xa4,0xbb,0xcb,0xe2,0xcc,0x05,0x81,},{0xfa,0x0d,0x12,0xcd,0x53,0x23,0x6c,0x41,0x08,0x6b,0xea,0x8c,0x0c,0xc6,0x0b,0x77,0x64,0xa3,0xed,0x72,0xbd,0xeb,0x9d,0x1a,0xe5,0xee,0xac,0xb4,0x88,0x11,0xfe,0x52,0x97,0x62,0xa2,0xc6,0xf2,0xbb,0x06,0xd9,0xb3,0x18,0x21,0x8d,0x96,0x8f,0x64,0x44,0x35,0x49,0x7a,0x1b,0xd0,0xd0,0xd8,0xc1,0x61,0x2a,0xb8,0x99,0x6d,0x98,0xd7,0x07,},"\xe1\x12\x56\xf8\x2a\xd7\x6f\x3f\x4a\x49\xd7\xba\xd3\xce\xd8\x71\x8d\x36\xd2\xf2\xbb\x3d\x31\xbb\x61\xed\xd1\xec\xbc\xee\x66\x21\xfd\x2e\xee\xd3\xe3\xde\xb5\x97\xb1\x49\xff\x71\xb8\x51\xf6\x1c\x8c\x68\x19\xe1\x31\xf9\xa2\xaf\x76\x73\xc3\xf2\x07\x02\xac\xfd\xc8\xb8\xf9\x06\x4b\x41\x5c\x9a\x3e\x35\x56\x8e\x37\x1d\x74\x0a\x38\x12\x7c\x1f\x27\xb3\x91\xb4\x5d\x07\x04\x5a\xea\xf0\x0a\x54\xe5\xb7\xfa\x54\x8a\xfb\x5f\x96\xfe\xb5\xf5\xb4\x4f\x60\xcd\x17\x07\xe8\xfa\x95\x67\xf7\x80\x6e\x15\xf6\xa0\x1a\xa0\x20\x77\x73\x3f\xe7\x38\xb0\x8f\x21\xef\xbc\xf9\x8c\x19\xd5\xb9\x70\xe6\x16\x3e\x5f\xe8\xf4\x80\x0e\xf9\xed\x22\xa0\xf9\xb5\x12\x6f\xf1\xeb\x1c\x7d\x65\x01\x9c\x8b\x44\x03\x91\x92\x70\x29\xb8\x13\xda\xb7\xc7\xe8\x63\xd4\x82\x29\xf8\xdf\x85\x39\x43\x45\xfc\xc8\x8a\x30\x0f\x60\xa8\xd5\x16\xd8\x77\xa5\xa3\xa7\xe3\xc4\x9a\x9e\xb0\x6c\xd9\xf2\x66\x5c\xe2\xa8\x90\x22\x96\x2b\x1d\x49\x59\x2b\x09\xc7\x54\x3d\xa8\x35\xce\x63\xbc\x9a\xbb\x82\x21\x45\x76\x2b\x71\xcb\xe1\x50\x29\x2c\xe5\xc8\x70\x4e\x5a\xd3\x4f\xb4\x59\x2f\x97\x20\x44\xe4\x3e\x69\xf0\xe1\x67\x2d\x6c\x83\xcf\x25\xaa\xc6\x8e\xfe\x3d\x27\xaf\x2a\xd3\x42\x74\xb9\xd2\xb7\x77\x42\xd9\xc6\xdf\xbd\x57\xf9\x2f\xf6\x4d\x3e\x4c\x67\xc5\x41\xd8\x50\x2a\x7d\x03\x18\x95\xaf\x85\x31\x9a\x4e\xae\x2d\x25\x43\x35\x83\x5e\xff\x11\xe7\xa3\x67\x1a\x6a\x0d\x21\xb7\x2c\xe1\xfc\x2a\xcb\xa1\xa9\x20\x18\x38\x34\xbc\x0a\x4b\x73\xf6\x39\xff\xcb\x0f\x6b\x81\xcd\x92\x0f\x2e\x94\x20\xd6\x12\x16\x6d\x56\x82\xa0\x60\x60\xea\x0b\x6f\xa6\x95\xfe\xcc\x77\x04\xbb\xe4\xb0\x52\xaa\x3e\xc8\xf7\x20\xf7\xd4\xf3\x2e\x8a\xff\x86\xb8\x0b\x8c\x1c\xc1\x27\x64\xa0\x48\x74\x03\x7c\x31\x03\xe9\xdf\xec\xb8\xf7\xab\xcb\x0e\x07\x3b\x23\xe6\x7c\xa0\xa9\xb1\xfc\x72\x99\x3a\xbf\x31\xdb\xc2\x4a\x8f\xee\x09\x5b\x32\x51\xc2\x26\x26\xaf\x5d\xd1\xb6\xd3\x4b\xe5\xea\x06\xa0\x2a\xe1\x76\xc7\xb8\xcb\x9d\x06\x35\x01\xbe\x6f\x61\x20\x82\x88\x9f\xdb\xdc\xbf\xad\xc3\x3a\x0d\x31\x1b\x08\x0b\x8d\x64\xe4\x9f\x16\xb1\x6d\xd8\xed\xd3\xb2\xed\x11\x93\xa7\x4e\x5b\xe5\x07\x60\x9b\x04\x27\x27\xcc\xf0\x8a\xfb\x05\xcc\x6c\x50\x52\x4e\xf0\xe2\x66\x46\x21\xdc\x8b\x05\xb1\x5f\xfa\x81\xab\x6f\x7e\x3c\x8a\x5b\xb3\xea\xb1\xf6\x8e\x36\x56\xc1\x19\xd9\x69\xe4\x14\x4c\xf3\x28\x5a\xf2\x3c\x04\xdb\xec\xc0\x38\xae\xfd\x91\x83\xc4\xe7\x24\x47\xb2\xaa\xa8\x31\x5f\x46\x96\xce\x6d\x1e\xf4\x29\xba\x0e\x5c\x3d\x5f\xfa\x7f\x05\x0b\xe3\x9c\x7f\x61\x2f\x4e\x10\xf8\xef\x07\x0d\xf7\x2f\x8a\xdd\xbe\xaf\x33\x39\xc1\xad\x8b\x5f\xc3\x9a\x2e\xcf\x29\xa8\x7f\x82\xe2\x9a\x01\x17\xba\xac\x66\x25\xad\x5c\x80\xcf\xe7\x59\xfa\x1d\xbc\xfa\xa1\x2b\x37\x44\x77\xd8\x0b\xfc\xf0\x67\x96\xc3\x0f\x2c\x39\xcf\x03\x03\xd0\x0d\xc5\x6a\x32\xd1\xd0\x39\x59\x2d\xdb\x06\xc2\x2a\xa0\x68\x84\x1c\x0b\x46\xfd\x48\xdf\x8f\xbb\x74\x92\xcc\xbc\x59\x0c\x56\x3c\x8f\xec\xce\x42\x63\xc8\xc7\x53\x92\x18\xbb\x97\xb3\x57\x11\x53\x7e\x98\x81\x95\xdb\xf5\xbc\xd5\xcc\xaf\x06\xfa\xf5\x08\x47\x09\x77\xa5\x35\x8e\x6f\x02\x60\x83\x49\xfb\xb9\x9a\x23\xfb\xe3\x6b\x8c\x97\x15\x5a\xdc\x24\x6a\xd7\xd9\x3a\x8c\x20\x3f\x75\x44\x6c\x83\xc4\x34\x2c\x35\xba\x10\x4e\xcc\x67\xe6\x69\xdb\x4a\x95\x46\x6e\xe6\x8f\x45\x8a"}, +{{0x7c,0x27,0xae,0x47,0x07,0x2b,0x0c,0x9b,0x9c,0x2c,0x35,0x1f,0x13,0x27,0x89,0x98,0x95,0xef,0xa5,0x36,0xc9,0xc0,0x67,0xd0,0xe0,0xce,0x8e,0x82,0xe6,0x29,0x27,0x93,},{0xf9,0xfe,0xbd,0x12,0x1e,0x17,0xdb,0x72,0x29,0xb5,0x67,0x09,0x02,0x18,0x49,0xc3,0x5d,0x69,0xfa,0x08,0xb5,0x06,0x20,0xe6,0x67,0xf8,0x42,0xec,0x7a,0xc7,0x82,0xdc,},{0x32,0x71,0x96,0xdd,0xd4,0x3b,0xb6,0x02,0xd0,0x4d,0x19,0x64,0xcc,0xc0,0x59,0xed,0x62,0x7c,0xef,0x0a,0x88,0xd8,0xad,0x91,0xbe,0x49,0x31,0xf1,0x7c,0x25,0x0d,0x55,0x29,0xf5,0x52,0x79,0x4a,0x3e,0x26,0x9d,0x17,0xa6,0x3b,0xd3,0x29,0x33,0xeb,0x5e,0x51,0x9c,0x1d,0x50,0x65,0x74,0x77,0x0a,0xe4,0xa7,0x29,0x64,0xe0,0x6f,0x7d,0x00,},"\x15\x47\x87\x6a\x98\x8d\x1b\xe7\x14\xa4\x2f\xb9\x1c\xb0\x37\x63\xf1\x91\x3a\x89\x2e\xcb\xd4\xde\x2c\xcf\x83\x44\xd2\x07\x58\xb7\xb6\xd0\x02\x59\x10\x1f\xe9\x72\x25\xb2\x97\xf8\x7b\xfe\x22\x20\x04\x32\x5d\xb7\xf6\x32\xce\xaf\xfb\xd1\x34\xc9\x6c\xbd\x57\xe9\x85\xbe\xc8\x43\x4f\x81\xa4\xee\x6a\xf8\x5c\x3f\xad\xe5\x0e\x4c\x4e\xf2\x0c\xb0\x39\x35\x45\xe4\xd4\xa8\x6e\x1f\xa3\x9a\xaf\x33\x3f\xe4\xde\xd0\x54\xbf\xc0\x50\xa8\x98\x3a\x03\xdd\x1e\xcf\x2b\x5e\x95\x17\xba\xf9\xe1\x15\x21\x29\xa8\xa7\x59\x35\x71\x1e\xdb\x20\xaf\x5c\x8c\xf9\xc6\x94\xa3\x3c\xee\x45\x1c\xd9\x50\xb2\xff\xf0\x8e\x31\x58\xc5\xcf\xb7\xb1\x5c\xb3\xe9\x0d\x46\xf4\x94\xb6\xa1\x08\xd8\x88\x8d\x5e\xc2\x9a\x33\xc0\x66\x02\x3b\x49\x77\x09\xb2\xd9\x40\x1f\xea\xf2\xe7\x4f\xf2\x6c\x16\xd3\x6c\x39\xe6\x51\x7f\xf9\x54\xbd\x98\xbc\xe7\x70\x06\x71\x98\x8f\x66\xe8\x51\x07\x64\x4b\xa2\xea\x00\x7a\x13\x01\x8c\x1c\x14\x4e\x3c\x5b\xb8\x0d\xb9\x51\x1f\xcc\xa4\x10\x1b\xf4\x9f\x8c\x80\xff\x3c\xa7\xd2\x98\x25\x7c\xbf\xea\x62\x9f\x83\xd5\xe0\x66\x39\xd3\x1f\x63\x9d\xb4\xb8\x72\x6c\xbe\x22\x4d\x75\x88\x29\xba\xb1\x09\x05\x17\x1c\x9c\x0e\xc3\x70\xd5\x80\x31\xef\xe4\xcc\x5a\xe7\x2a\x49\x5a\xcf\xf6\xcb\x2e\xd9\xee\xc6\x58\xba\x11\x70\x88\xdd\x3c\x6e\xd1\xdf\x8f\x9c\xb1\x0b\xd4\xfe\x0e\x5e\x8a\xd9\xf5\x03\x4e\x34\x65\x2d\x98\x66\x8d\xb1\x5c\x85\x33\x39\x3a\x6e\x9e\xc0\x87\x0c\x35\x66\x6c\xe5\x4e\xfe\x2b\xcb\x45\xc3\x4a\x72\x30\xe6\xa7\x00\x67\x63\x49\xc7\xb3\xab\xf3\x1d\xe7\xb7\xb0\x52\x1f\x89\xb3\x0a\xc4\x03\x4c\x2a\x4b\xa8\x21\x8e\xef\xdf\x8d\x2a\x5c\x1f\x8e\xd9\xb7\x01\x57\x9e\x47\xaf\x8a\x52\x9a\x95\xa1\xff\x64\xd8\xfd\xb8\x85\xc3\x68\x39\xb4\xc5\xf6\xd7\x2a\x99\x25\x7e\x86\x78\xdc\xcf\x31\x27\x54\xb9\xd4\x61\x9b\xee\xce\xb8\x25\x52\x6d\xe6\x22\xbd\x96\x76\xfd\x5f\x35\x76\x93\xab\xab\x07\x8b\x9e\x03\xae\x21\xe8\x7c\xa1\x61\xe7\x78\xaf\x77\x09\x6e\xaa\xc2\xd2\xd3\x2b\xfe\xc8\xec\x94\xaf\x79\x65\xf6\x1d\x68\xef\x66\xa4\x52\x3c\x1c\xc7\x0c\x95\x19\xb0\x75\x0b\x3c\x9e\xed\x5a\xeb\xa9\xf0\xa9\xb7\xef\x52\xcd\x4a\x2d\xe2\x9b\x39\x5b\x70\x5f\xa5\x3f\x02\x8f\xa7\x66\x15\x9f\x20\xe7\x5f\x4d\x38\x4e\xc4\xfd\x66\xdf\x06\xe7\x44\xc9\x9a\xc8\x8c\xb8\x49\xc2\x85\x75\x7c\xc5\x57\xe2\xee\xdd\x86\x95\x9d\xa2\xc1\xb8\x1f\x5b\x27\x15\xa6\x51\x98\x48\x90\x1a\xe4\xf8\x9d\x09\x13\xc8\xde\x57\xc5\x3d\xad\xf2\xe5\xe1\xaa\x2a\x9c\x5f\x46\x4f\xc7\x61\x0e\x8e\xf5\xf5\xcd\xd8\x20\x3a\x67\xa9\x3c\x33\xa0\x6d\xab\x35\x8d\xc5\xae\x23\xed\xfe\xe6\x33\x42\x62\xf4\x7b\x19\xb1\x13\xd6\xca\xfe\xda\xc1\xb4\x39\x02\x53\x9d\x74\xfb\xa2\x9a\xaa\x7b\xce\x68\x88\x4b\x72\x61\x6a\x05\x42\xc9\xfc\x69\x54\x7c\xd1\x9a\xe1\xdf\x01\x72\x3a\xbd\xda\x65\xe9\xbf\xac\x5d\xa0\xd0\x42\x40\xc6\xa2\x17\x5c\x00\x62\xe4\xe1\xed\x8a\x5b\x39\x7a\xfc\xd4\xde\x38\xe8\x62\x09\x27\x2c\x7a\x42\x4b\x5a\xe8\xd5\xa4\x0b\x48\x4c\xe1\xb4\x70\x4a\xf2\x83\x16\x09\xad\x0f\x36\xe9\x0e\x07\xb2\xaf\xed\x01\xdc\x05\x57\x4a\xd3\x97\x17\x23\xc5\xb5\xc1\xdd\xd4\xfc\x8b\xd2\x63\xbc\xdf\x56\x8a\xf7\x5e\x73\xd8\xab\xd1\x00\x8c\x9e\xc7\x12\xf8\x0f\xfc\x65\xac\x34\xe2\xa7\x93\x04\xea\xde\x1d\x2a\x1d\xff\xec\x0e\x4c\x98\xc3\x58\x24\x68\xf3\x20\xbf\x8f\x66"}, +{{0x08,0xed,0xdc,0xb5,0x62,0x5a,0xe1,0x9f,0xfe,0x7b,0x49,0xa7,0xdc,0x82,0x9c,0x89,0x3c,0x75,0x38,0xb0,0x88,0x5e,0x18,0xf9,0x8d,0xb7,0x8c,0x8b,0xeb,0x56,0x9c,0x26,},{0x83,0x47,0x8b,0x1c,0x58,0x57,0x6a,0x0d,0x18,0x34,0xb2,0x8d,0x46,0xfb,0x80,0x51,0x6d,0x6f,0xb6,0xf9,0xf5,0x91,0x69,0x4b,0x44,0x35,0x2e,0xec,0xd1,0xe7,0xe8,0x9a,},{0xec,0xe7,0x53,0x22,0x99,0x51,0x54,0xb2,0x92,0x43,0x7e,0x47,0xd3,0x8a,0x6a,0x70,0xaf,0x37,0xe2,0x02,0x07,0x16,0xfd,0xe4,0x6b,0xfd,0x39,0x3b,0x3d,0x36,0x9b,0xdd,0xb5,0x32,0x53,0xb5,0x56,0x62,0x1c,0xfb,0x34,0xc8,0xa9,0x02,0x54,0xe1,0x32,0xfd,0x28,0xec,0xd0,0x98,0x43,0x34,0x13,0xa2,0x1b,0xd3,0xa9,0x79,0x8c,0xa1,0xf3,0x09,},"\x01\x5b\x1d\x3e\xeb\x00\x92\x9e\xa8\x0b\xd8\x68\x7d\x18\x28\x6f\x0a\xdf\xe6\x45\xcc\xf2\x5a\x22\xb5\x06\x19\x21\xe2\xa0\x30\xfc\x76\xd0\x33\xfb\x53\xd0\x93\x7c\x69\xb3\x1c\x5b\xe4\x99\x13\xca\x1f\x2c\x3d\xca\x12\x1b\x2b\x87\xc5\x9b\x3c\x84\xc7\xae\x52\xaf\x19\xc6\xb9\xfa\x1b\xd6\x75\xfb\x6d\xd8\xb3\x29\xd5\x66\x87\x86\xdc\x78\x83\xe2\xd2\xe8\x58\x6f\xf4\x12\x8b\x90\xde\xe8\x4b\xe0\xab\x54\xd6\x81\x3f\x7a\x8c\x61\x34\x75\x71\x73\x98\x17\x75\xde\x84\xc4\xdd\x39\xe3\x36\xf8\xa4\xef\x8d\xca\xde\xc9\x43\xe9\x0d\x42\x1b\x22\x9c\x11\x78\x5f\xcd\x3f\xe9\x63\x03\x74\x58\xe7\x6c\x82\x0b\x3b\xc2\xc9\x47\x60\x01\x26\x2b\x26\x1d\x28\xb6\x5b\x48\x9d\x76\xb4\xbe\x23\x65\xe4\xa8\x0f\xa8\x71\xb0\xa5\x3b\x6a\x5f\xb2\x43\x68\x82\x35\xac\xc5\xf4\x77\x4d\xb1\x5d\x47\xb4\x2d\xd6\xc8\xd9\xe1\x2d\xcb\x0b\x5d\x98\x0d\xab\x0f\x3a\xd8\xa4\x96\xf7\x6e\x50\x06\xc2\xca\x82\x67\x5f\xf1\x94\xca\xf8\x07\x0d\x04\xbd\x38\x4f\x97\xe5\x83\xe7\x3c\xbc\x4f\x7f\x25\x73\x10\xa6\x1b\x1c\x80\x62\x32\x2d\xce\x81\x15\xf6\xdd\x93\xee\xe8\xa9\x3f\xfa\x5c\xab\x66\x34\x11\x6e\x1a\xb7\x05\xfa\x86\xc4\xa8\xea\xa5\x56\xc6\xc8\x9d\xbc\xad\x01\x04\x36\xbf\xfe\x45\x18\x22\x49\x1f\x1e\xa8\x6c\x20\x20\x7e\x4d\x12\xdf\xa3\x62\x61\x6c\x58\x9f\x97\x10\x7e\xa5\xd8\xbd\x8a\x72\x15\xc6\x00\xff\xc7\x0b\x80\xe2\xab\xb1\x5a\xcb\xe4\xbe\xcc\xa2\x0d\x72\x15\x5a\xbc\x3d\xbe\x8e\x37\xcf\xd7\x3f\x74\x20\xf2\x1c\x9b\xcd\x0c\x32\x73\x51\x3b\x50\x49\x67\x08\x74\xd5\x51\x9b\x3b\xc1\xdb\x52\x3c\x1d\x7e\x90\xc1\x65\x96\x7c\x4c\xb2\x84\x5a\x2e\x8b\x47\xb5\x88\x92\x54\xf5\x8a\x9b\xbb\x82\x6f\x94\x52\x1c\xdb\xd0\x41\x6f\x5f\x18\xff\x78\xa3\xfd\x0d\x7a\xb8\x97\x90\x62\x64\x48\x3c\xde\x64\x2d\x8e\x70\x3f\xd8\x2e\x5a\xe7\x0a\x9f\x97\x8f\x64\xee\x80\x52\x05\x54\x85\x05\x28\x58\x1c\xa9\xa0\xb3\x8c\x19\x6f\xd1\x66\xda\xe5\x87\x9b\x3f\x72\xf5\x9c\xde\x91\xcc\xa2\xc8\xbf\xaa\x47\x8b\x98\xd6\x24\xcd\x34\x72\x44\x02\xde\x57\x8e\x57\x54\x82\x5c\xe2\x27\xd2\x87\x1b\x45\xa5\x11\x71\x49\x51\x5b\xff\x81\xa9\x23\x24\x6f\x3b\x72\xd0\x7b\xd4\x58\x12\x5c\x70\xa1\x4d\x87\xc3\xfd\x13\x39\x2a\x3b\xda\x65\x53\x01\x6e\x8b\x2d\x07\xbd\xe9\x03\xcf\x68\x7b\x44\x5c\xfd\x6f\x76\x14\x92\xeb\xa4\x65\x22\xad\xa8\x4a\x96\x15\xd8\xda\x34\x98\xb2\x58\x06\x72\x69\xb7\x88\xe5\x59\xb6\x59\xd4\xb4\x8a\x87\xd8\x80\xd6\x37\x8b\xe6\xa8\x87\x46\xf3\x5b\x32\x2b\x04\x78\x45\xaa\xdc\x52\x3b\xea\xff\x30\x70\xf7\x21\xc3\xc0\x71\xea\xa3\x19\xb7\xa4\x7c\x1b\x20\xd3\x00\xdc\x03\x21\x90\x9b\x66\x9e\x57\xd3\x9a\x1c\xe2\xfd\xbe\xaa\xfa\xc2\x13\x50\xec\x2d\x6e\x6d\x5b\x88\x01\x86\xc0\x28\xa8\x61\x47\x4d\x50\x76\xa4\xad\xc5\x03\x2f\xec\x91\x40\x78\x7c\x36\x80\x6e\xf7\x9c\x72\xe3\xa1\x9d\x8c\x8b\x70\xbd\xaf\x20\x72\x95\x54\x2d\x96\x82\x5a\x5d\xe7\xdf\xe1\x08\xef\x57\x45\x99\xb8\xf1\x84\xc6\x3a\x5a\x13\x1d\xb1\x9b\x3b\xe5\x3f\x69\x9c\x10\xfc\x4c\xa7\xc6\x3f\x35\x00\x21\x1b\x35\x6a\x0a\xc6\x64\xdd\xfc\x1a\x92\x52\x59\x00\x26\x39\x5b\x47\x9b\xe9\xa5\xe4\x75\x84\x23\x56\x0b\x65\xbb\xce\x5b\xba\xde\x49\x3b\x13\xd0\x0c\xf8\xc1\xd3\xb7\xe9\x22\x13\x67\xe8\xf0\xea\xda\xb6\xe6\xd1\xb5\xff\xfd\xe7\xb2\xd7\x41\xfc\x2c\x83\x02\x24\xff\xf7\xff\x14\xae\x5c\x07"}, +{{0x22,0x73,0x94,0x2d,0xb3,0xe5,0xd3,0x22,0x1e,0x80,0xd9,0x94,0xfd,0x5e,0x11,0x63,0xaf,0x55,0xf5,0x45,0x5a,0x8e,0x52,0xbe,0x85,0x2d,0xd3,0xad,0xf7,0x62,0xb4,0x40,},{0xbc,0x58,0x67,0x4e,0x99,0x6b,0x6f,0x3e,0x32,0x20,0xb3,0xe9,0x4f,0x00,0x67,0xbb,0x0e,0x9b,0x0d,0x97,0xd9,0xe1,0x05,0x9c,0xf1,0x39,0x97,0xa1,0x93,0xac,0x03,0x2a,},{0x87,0x4d,0xde,0xce,0x08,0xf3,0x0b,0x30,0xf0,0xd4,0xc8,0xb3,0xed,0x7c,0x61,0x51,0x49,0xb8,0xaa,0x74,0x0d,0xaa,0x34,0x7b,0x55,0x95,0x8f,0x1e,0x21,0x19,0x04,0x4f,0x69,0x5a,0x21,0x06,0x96,0x90,0x50,0x64,0x48,0xd8,0xe7,0x35,0x2b,0x90,0x46,0x51,0x1d,0x7f,0x39,0xa5,0x41,0x5b,0xb9,0xc5,0x70,0x50,0xfc,0x17,0x05,0x5c,0x38,0x08,},"\x8a\xa0\x50\x9e\x4b\x91\x41\x86\xff\xff\x07\xae\xb9\x7a\x04\xb5\x46\x27\x2d\xa2\xf9\xea\x7b\xfa\x65\x9a\x24\xcb\x50\x96\x6c\x23\xeb\x65\x42\xe4\xf2\x2d\xeb\xe3\x3b\x65\x76\x92\x45\xc4\xd1\xb5\xdc\xf3\xe6\x99\xc7\x0c\x5c\x2b\xaa\xd9\x73\x4e\x9d\x1e\xfe\x54\x48\xab\x71\xc8\x94\x6a\xec\xce\x52\x68\xd2\x6f\x19\xcf\x60\x5e\xb3\xbf\x38\xb0\xb3\x32\x26\x94\xac\x0d\xcb\x76\xb0\xf9\x46\x84\x2f\x6c\x5c\x68\xd7\x63\xfc\xe7\x47\x01\xbd\x6b\x78\xe7\x1c\x8c\x31\x42\xad\xd4\xed\x46\xe0\x96\x9b\xb9\x55\x5b\xe0\x36\x02\xd5\x62\xe4\xc8\x9f\x3a\x91\x99\x40\xe8\x83\xa9\x69\x40\x54\x2f\x27\x79\xfb\xf9\xec\x0a\x28\x5d\x9d\x8a\x72\x36\x01\x46\xe3\xff\xbd\xb7\x8d\x21\x03\x16\x03\x8d\x95\xd6\xab\x75\x71\x65\xaa\x94\x3c\x03\x3e\xeb\xb3\x21\xc0\x5a\x39\x95\x69\xbc\xf6\x6b\x4d\xdb\x0b\x2e\x0e\x33\xc4\x79\x3d\x81\x7c\xcf\xf5\x7f\x99\xb3\x18\x9c\x60\xd5\xd7\xb9\x41\x9d\x1e\xbc\x94\x3a\x79\xd4\xd8\xc3\x94\x56\x61\x80\x59\x4f\x55\x9a\x80\x52\x9c\xc1\xba\x28\x87\x7a\xf8\xf5\xc0\x50\x3e\x94\x3c\xd3\xaa\xd9\x98\x11\x64\x52\x72\xda\xfb\x49\xb9\xb3\xe6\x10\x7e\xb5\xe5\x18\x6e\x16\x08\x75\x71\x26\x05\x3d\xeb\xce\xc7\x5d\xd9\x56\x5c\xee\xa0\x6a\x13\x91\xa8\x22\x6d\x1f\x45\x93\x79\x22\x40\xcc\xd9\x7c\x67\xa6\xc2\xb1\x34\x4c\x22\xc9\x1f\x42\x03\x3a\xde\xf5\x28\x61\xf3\x2a\x4e\x07\x12\xa9\x17\x87\x9a\x0b\x05\x18\xb5\x42\x4b\xcd\xc0\x54\xb4\x4e\x97\x2e\xd2\x4d\x01\x68\x9f\x4f\x27\xf5\xf1\x76\xf0\xa5\x78\xab\x2d\x3c\x08\x78\x27\x2e\x8c\x08\xc2\x15\x82\x11\x86\x54\x12\x4d\xca\x39\x58\x53\x37\xc1\x3c\x18\x65\x81\x4c\xaf\x09\x96\xca\xdf\xa6\x5b\xe5\x80\xde\xe3\x22\xeb\xcc\xda\x70\x4b\x22\x80\x58\x26\x04\x06\x7d\xc3\xc6\xb1\xf7\xd8\xa2\x69\x78\xa6\x5c\xff\xd1\xed\x31\x96\xa2\xb0\x65\xfb\x3c\xaa\x79\xe6\xb5\xb6\x6c\x13\xd7\xbd\x7d\x0e\xc1\x4a\x3a\x4d\x58\x41\x3f\x21\x2f\x47\x1e\xca\xad\x3a\x84\xaf\x35\xe5\x98\xa8\x9f\xb3\x44\x7d\x33\x24\xf0\x20\xfb\xf1\xb7\x3e\x2a\x98\x6e\x0d\xa1\x6c\x01\x83\xbf\x92\xa3\x98\xc4\x19\xa0\xf9\xf3\x05\x37\xbe\xa0\xdf\x8d\xf2\xdc\x53\xc1\x54\xe8\xea\x16\x06\x89\xe7\xbb\x4d\x72\x9d\xd8\xab\x90\x03\x14\x27\xaa\x39\x45\x86\x3a\x85\xe8\x96\x52\xb9\x35\x38\x05\x16\x6f\x7c\x0a\x18\xc9\x39\x95\x4b\x27\x87\xc3\x70\x94\xf9\x25\x12\x72\x2e\x52\xb0\xc9\x76\xb9\xe4\x2a\xf4\x03\x9d\x2c\x05\x78\xff\x14\xfa\xe1\xd8\xc2\xd1\x39\x6b\xeb\x2d\x6a\xa6\xeb\xd5\x54\x74\xa9\x34\x98\x67\xa0\x3f\x3a\x99\xd7\x87\x80\x63\x4a\xb4\xb3\x5c\xfe\x1b\x87\xa9\x13\x32\x52\xa6\x98\xbc\x40\x7d\x63\x84\x28\x70\xe2\x2c\xcf\x39\x33\x62\x0a\xc0\x42\x3c\x3d\x1f\x68\x1d\xd7\x3c\x01\xd0\x6c\x3b\x94\x15\x06\xc9\x8e\xed\x9b\x78\x68\xe0\x17\xb7\xf9\x97\x16\xb0\xb7\x7f\x11\x32\x1e\x5a\xb2\x3d\xbf\xcf\xca\x93\x50\x84\x5e\xe1\x80\x44\x4c\x50\xff\x0a\x9c\x96\x5f\xcb\xf7\x77\x70\x8e\x4f\x34\xcc\xc6\x37\xc6\xa0\x8d\x85\x43\x84\xf8\xd3\xe2\x51\x69\x56\xc1\x51\xd0\x31\xbb\x1c\xbe\x71\x2a\x5e\xf9\xee\x16\x61\x92\x28\xbd\x29\x6f\x2a\xfe\x58\x2d\x99\x53\xd5\x90\xd1\x8b\xb2\x05\xf7\x0f\x84\x4c\x16\xc0\xa2\xd8\x31\x80\x37\xd4\x3d\xd8\x0f\x65\xc6\xa7\x53\xf2\xa8\xe2\x7c\x89\xc8\x3e\x7e\xd7\x0c\x52\xf7\x06\x2d\xfb\xb1\xf5\x44\xaa\x23\x6b\x5c\x70\x4e\x7b\x39\xce\x0a\x55\xfd\x46\x52\x80\x83\xca\x61"}, +{{0xdb,0xfa,0x45,0xab,0xaa,0x55,0x41,0x52,0x38,0xb1,0x28,0x76,0x34,0xd5,0xee,0xc4,0x02,0xda,0xdf,0x62,0x2e,0x27,0x0c,0x04,0xa8,0x91,0x4c,0xed,0x27,0x0a,0x72,0xbe,},{0xc0,0xfe,0x32,0x35,0x81,0xea,0x29,0x67,0x50,0x79,0x7e,0xb5,0x50,0x8c,0xa1,0x9a,0x58,0x3b,0x53,0x7f,0xa7,0xdf,0x45,0x29,0xf0,0x80,0x4a,0x33,0xc1,0xa4,0xbe,0xf4,},{0xa4,0x62,0xa9,0xba,0xa5,0x6d,0xc0,0xf7,0xa7,0x1b,0xf8,0x7b,0x95,0xf4,0x8d,0x64,0x20,0x22,0xd9,0xd1,0x73,0x3e,0xe3,0x68,0x37,0x77,0xa3,0x78,0x22,0x28,0xac,0x85,0xfc,0xd8,0x30,0x26,0xbe,0x4c,0xa9,0x7a,0x34,0x5b,0x08,0x4f,0x50,0x87,0x4e,0x91,0x24,0xe1,0x6b,0xa1,0x7d,0xea,0xd4,0xad,0x85,0xc0,0xe5,0x6f,0x16,0xef,0x18,0x04,},"\xe2\x6e\x8d\xcb\x44\xe6\x41\xfc\x20\x08\x0e\x95\x47\x4b\xd3\x9d\x71\x6c\x5a\xfe\x5a\x1f\xfb\x05\x6d\x1e\xaa\xb0\xc4\x9f\x85\x70\x71\x7d\xb6\x43\x7a\x03\x22\x8a\x9a\xd9\xf4\xbb\x0b\x34\x3b\x95\xe1\x60\x23\xc0\x80\x7e\xb2\xa1\x51\x06\xa6\xeb\x12\xdc\x76\x68\x3e\x69\xdd\xa3\x36\x31\x48\xc5\xd7\xdd\x97\x13\xaf\x6f\x87\xa0\x94\x10\xea\x8f\x76\xb6\xb7\x8a\x11\x44\x29\xbc\x85\xf7\x84\x81\x2f\xca\x31\xac\xb0\x30\x95\x52\xcc\x18\x8c\x6e\x96\x97\x09\x3c\xf4\x04\xc6\xf0\xf4\xab\xe8\xa1\x60\x86\x73\xfd\xfa\x5e\xb7\x8f\x65\xfc\x1d\x49\xcd\xec\x40\x94\xb1\xbd\x23\x4a\x46\xe0\xec\x62\xa4\xb6\xd3\x1b\x82\x96\x11\x54\x01\x27\x87\x6b\xff\x4c\x17\x3d\xe0\x58\xcf\x61\x00\x4b\x01\x4a\x7b\xdf\x79\x3d\xfd\x6b\x63\xc5\x07\xd2\xb2\x3e\x0f\x56\xbc\x2f\xe6\xba\xf6\x37\xce\xe4\x0d\x18\x99\x22\x95\xd8\x48\xef\x49\x8f\x8a\x16\x1b\xd8\x7e\x60\xc9\x1f\x97\xa9\x1e\x9e\xf3\xf6\xd9\x7f\x2b\x2d\x21\x04\xba\x6f\xdd\xd6\xc6\x80\x70\x62\x73\xda\xe8\x7e\x6e\xec\x1a\xf2\xa4\x59\x84\x98\x50\x69\xe8\x09\xe8\xde\x32\xc1\x28\x89\x29\x9a\x32\xd4\x0f\x38\x77\x45\x99\xac\x33\x24\xb7\xcb\x0a\x4e\xa6\x32\xc5\xf9\x10\xad\x87\xf5\xad\xbf\xa5\xc3\xbb\x20\x49\x82\x79\xfd\x53\xc1\xc2\x67\xfe\x0a\x84\x77\x30\x85\xda\x26\x6b\x25\x3c\xd8\x53\xdf\x7e\x96\x35\x58\xcb\x06\x88\x07\x80\x97\x34\x23\xc5\x64\xcd\x0b\xcd\x6b\x93\x33\x4c\x19\x59\x53\xd7\xcd\x89\x9f\x8a\x54\x7d\x1a\x1a\x0a\x8d\xef\xf1\x38\x1b\x43\x21\x57\x47\x28\xcf\x71\xb9\x6f\xf2\x09\xe8\x99\xda\xa8\xf1\x3f\x41\xb2\x30\xe1\x7b\xff\xdf\xdd\x2a\x89\x43\xaa\x5d\x21\xe5\xf3\x6e\x1d\xa0\x7e\xdd\x6c\xee\x92\xdc\x48\xb5\xb2\xa7\x58\x01\x46\xa9\xba\xf7\x13\x95\x0c\xe6\x76\x25\x5a\x89\xe3\x4f\x87\x87\x54\x7d\x62\x86\x8d\xb1\x4b\xa4\x65\x94\xda\x31\x0d\x7e\x2d\x9e\x7c\x7d\xbe\x17\xdb\xd7\x1e\xb4\x7c\x56\xc5\x72\x1d\xc9\x6d\x69\x64\x70\x57\x37\x94\x80\x94\x11\xcd\xfa\x27\x6b\x05\x9d\x00\x07\xc2\x5d\x74\xb2\xa6\x7d\x38\x24\x6d\xe1\x1e\xf4\x6d\xfe\x26\x70\x92\x6f\xe4\xb6\x36\x56\x23\x1b\xc7\x26\x8b\xba\x23\xf3\x78\xe8\x4a\x42\x8c\x3c\xbf\x45\xcc\x53\x96\x78\xfd\x46\x7c\xd3\x3d\xd0\x75\x7c\xfa\x02\x4e\x54\xda\x1f\xf5\x4c\xe8\x20\x22\x9b\x77\x8b\x18\x4b\xe1\xfa\x2e\x84\x68\xcc\x19\x95\x59\x40\x73\x5e\xaa\xa8\x84\x02\x2f\x64\x18\xb0\xb1\xf2\x6b\xcc\xf1\x69\xf1\xbc\xac\x7d\x82\xa3\x5a\xb6\xef\x84\x7e\x1d\xba\x53\x7d\xca\xff\x57\x25\x0a\x8d\x1c\x71\xfa\xcb\x13\x4c\xd0\x6b\x01\xc4\x53\x19\x13\x27\x45\xdc\x48\x88\x88\xa1\xd7\x76\x1b\x84\x86\xa3\x7e\x69\x88\xa1\x12\x0b\xcc\x16\x82\xdb\xfc\x89\x14\x3f\xc3\x5b\x46\x93\x5d\x8a\xcf\x6e\xf3\xc4\x2f\x0f\x4b\xf6\x79\xdf\xd6\xff\x44\xb6\xad\xa2\x6b\x01\xa9\xf8\x9f\x37\x4c\x7d\x2e\xe4\x8d\xfe\x1a\x41\x0e\x89\x7c\xdf\xd9\x7f\x62\x6d\x26\x68\x50\x28\x14\x40\x07\x93\xb3\xb0\x7c\x87\x20\xbb\xdd\xc5\x9c\xb0\xf9\xde\x96\x4a\xe0\x75\xb4\xaf\x3d\xd4\xba\xf6\xd0\xe4\xf9\x4f\x29\x4e\x81\x09\xd6\x57\x7c\x4f\x8a\x9c\x7a\x5f\x7d\x69\x4b\xf8\x8f\x1a\x5e\xa7\xeb\xa0\xa6\x6d\xa6\xc7\x70\xc0\x8b\x3a\xbf\xfc\x53\x4d\xf2\x19\xdc\x3e\x33\x23\xb0\x22\xe9\x6c\xc8\x60\x02\xb1\x89\x18\x1a\x1d\x2b\x52\x7d\x27\x95\x0b\x7f\x42\x5a\x47\xda\x40\x13\x77\x8b\xd0\x0b\x71\x10\x59\x22\x20\x49\x21\xe9\xdc\x69\x2c\x23\x3f\x7b\xaa\x04"}, +{{0xef,0x64,0xe1,0x7a,0x53,0xf7,0xfb,0xca,0xfe,0x3e,0xa4,0x68,0x76,0x84,0xa0,0xda,0xdb,0x18,0xd0,0x37,0x35,0xa4,0x0a,0x53,0xb3,0xed,0xb0,0x49,0x07,0xee,0x61,0x62,},{0x91,0x86,0xe6,0xbc,0x14,0x29,0x61,0xc4,0xd3,0xeb,0x36,0x9e,0x9e,0x11,0x57,0x82,0x92,0xde,0x5b,0x6a,0xf5,0x34,0xd4,0x23,0xff,0x24,0x0f,0xa2,0x6e,0x21,0xa7,0x81,},{0xf5,0x8f,0x39,0x6b,0xa2,0x7e,0x06,0x7a,0x5f,0xe0,0x03,0xe3,0x85,0x58,0x2a,0xe3,0x49,0x0e,0x05,0x95,0x77,0x15,0xd7,0x04,0xda,0x0d,0xa6,0x3a,0x64,0x19,0xd2,0xe4,0xf6,0xdc,0x66,0xb7,0xe8,0x8e,0x42,0x8a,0x6f,0x21,0xb9,0xea,0x20,0x22,0x99,0xa3,0xc3,0x6b,0x24,0x2b,0x0e,0xa0,0x64,0x76,0xff,0x12,0xd0,0xb6,0x58,0x0c,0x04,0x03,},"\x68\x82\x45\x6c\xc3\xd1\xad\x0d\xaa\x9b\x88\xef\xf0\x96\x9f\x15\xe9\x7b\x48\xd0\x51\x96\x7e\x13\x90\x84\x72\x25\xf2\x6a\xc2\x55\x59\xf0\x24\x6b\xf7\xd6\x83\xfa\x28\xec\xed\xad\x21\x49\x1d\x77\xbd\x26\x96\xfa\x83\x5d\x0f\xd1\x19\x88\x4f\xec\xe9\xd8\x03\x69\x1b\x2f\xd3\xde\x17\xee\x08\x7c\x74\x00\x7a\x7d\xe9\xbc\x65\x34\xbb\xfe\x95\xfd\x32\xe9\x7c\x37\x5f\x4c\xb6\x57\x31\xaa\x1e\x83\x46\xbe\xa2\x1b\xe9\xf2\xc3\xdc\x87\x4a\xf0\x43\x19\x06\xcc\xbc\x2c\x60\x01\x27\xf4\xd3\xb0\x69\xeb\x09\x1d\x16\x5e\xc4\x53\xe6\x72\xe9\x3c\xae\x8b\x72\xf0\x33\x71\xd8\xb8\xa8\x24\x4e\xc4\xec\x2e\x09\xf3\x1d\xf4\x02\x06\xa2\xb1\xc8\x4c\xaa\x1b\x99\x3c\xc6\x75\xfd\xe1\xc7\x9b\xd4\xa7\xd1\x59\x74\xfa\x29\xce\x2e\x89\x2c\x28\x99\xcf\x48\x2c\x3d\x96\x63\xf6\xd2\xa7\x97\x84\xf4\x1c\x1f\x58\x66\xd3\x7c\x85\x46\xf3\x57\xd5\x64\xd3\xc4\x21\x8d\xfa\x6d\x20\xb6\xc2\x82\xb4\x00\xfe\xdd\xe5\x24\x39\xd4\x72\x21\x2c\x57\x67\xa3\x5d\xa5\x20\x10\x32\xda\x87\x30\x96\x8b\x07\x20\xe8\xa6\x04\xde\x6c\x1b\xaa\x3f\x4e\x89\x6a\xc2\x61\x4f\xb1\xab\x6e\x3f\x6c\xf3\x87\xa8\xeb\x2f\xf8\xa9\x21\x47\xab\x34\x92\x38\x43\x2e\x50\x9d\x82\x9c\xb7\x5b\x2c\x17\x65\xc5\x12\x21\x84\x8e\x25\xaf\xff\x5f\x16\xe4\xdd\x0c\xd5\xc9\xf7\x13\xc4\xaa\xab\x2c\xe8\x36\xf8\x49\x45\x06\xb5\x30\x9d\xc2\xb0\xae\x74\x5b\xb9\xc4\x79\x80\x98\xfb\x86\x41\xd5\x20\xa0\x8b\x02\xf7\x5a\xd8\x0d\xbc\x2c\xe2\x9e\x89\x0b\x4d\x72\xa3\xff\xb2\xa1\xcb\xd5\x38\xe1\x22\x9f\x57\x9c\x29\xae\x66\xbc\xa8\x5e\x0f\xa0\x8c\x86\x47\xa1\xab\xcf\xe8\xa4\x9f\x5e\x50\x8d\x4d\x24\x95\x55\x66\x23\xd9\x26\xce\x49\xef\xa4\x35\x0a\xaa\xab\x5c\xec\x2c\xd8\x85\xbe\x1d\x63\x47\x5e\x3b\xab\x7c\x7c\xdc\x8d\x65\x61\x73\xb8\xd4\x56\x02\xf4\xb3\xd2\x81\x24\x1d\x17\x19\x03\x27\xb2\x4c\x38\x36\xb1\x93\x11\xa1\x93\xaf\x86\xa6\x76\x8f\x04\x85\x2a\xb0\x6e\x67\xc8\xea\xd5\x91\xcd\xcb\xf3\x78\x9c\x61\x32\x09\xcf\xe0\x3f\x58\xc0\x30\x5f\x63\x20\x3b\x48\x7f\x7c\x5f\xc0\x98\x87\x7e\xc9\x8a\x68\x9c\x9d\x35\xaf\x81\xe8\x40\x78\xd6\x6f\xe9\xe4\xec\xcb\xb1\xcc\x6c\x71\x99\x1c\x03\x01\x7b\xb8\x11\xf4\x1f\x07\xde\x68\xfa\xd1\x94\x14\x60\x61\x32\x4f\x3d\x0e\xf2\x17\xa5\x4c\xf3\x8f\x7a\x62\x5a\x38\x86\x9f\x67\xd0\xb7\x43\x1d\xf9\x37\xcd\xe3\x49\xc1\x75\xce\x8b\x26\xac\x88\xd3\x9a\x43\xe2\x79\xb0\x18\x76\x4e\xfa\x4d\xd6\x27\xcb\xf5\x91\xf6\x20\x9c\x4a\x5b\xb1\x9e\xbf\xa7\xc7\x13\x55\x92\xd0\x2e\x50\x1c\xae\x5e\x6b\x31\xc9\x0e\x72\xfa\xab\x47\xf7\xdc\xed\x2c\x48\xad\xf8\x84\x43\xb3\xed\xe6\x0c\xef\xb0\xd6\x37\x9d\x69\x22\xec\x43\x7f\x08\x6b\xad\x62\x17\xd4\xd4\xff\xef\x18\xe2\x25\x23\x66\x4b\xf4\xe9\xca\x1e\x65\xa2\x8c\x2a\x7a\x60\xc5\xf6\xbc\x90\x6b\x73\x7c\x29\x93\x5f\x90\x97\x46\x30\x48\x57\x5b\xef\xd1\xa2\x54\x9d\xc4\x74\xb1\x3e\x68\xae\xec\xf1\x66\x04\x3e\x07\x5a\xac\x51\x55\x40\xf8\x31\xb4\x30\x66\xce\xf9\x32\xe6\x3d\xcd\x5b\x37\xb6\x15\x78\xc3\x5b\x09\xe4\x5c\xc2\xa8\xde\xf5\x71\x03\xed\xfc\x5f\x64\x98\x31\xa8\x96\x1f\xe4\xa4\xb3\x72\x1f\x1d\x6d\xf4\xea\x9f\x03\x38\x81\xb4\x74\x30\x0e\x0f\x12\xcb\x9c\xd3\xba\xbd\xcf\xfb\xb9\x18\xdd\x9b\xb0\xe2\xf5\xb2\x10\x33\xe4\x30\x23\xa0\xd2\xe6\x6d\xa3\xab\x0f\x07\xee\x98\x8b\x16\x88\x9c\xa5\xd5\x1a\xbd\xc0\x5f\xde"}, +{{0x33,0x47,0xdc,0x47,0xbb,0x3d,0x2e,0x5d,0x02,0x86,0xac,0x06,0xa5,0x4f,0xd9,0x21,0xc9,0xe9,0x6b,0x68,0x99,0x86,0x2a,0x54,0xe5,0xcc,0x81,0x15,0xd3,0xd0,0xba,0x99,},{0xd0,0x0b,0x64,0x5d,0x86,0xdb,0xb7,0xe5,0x24,0x75,0x7e,0xc7,0x78,0xc6,0x2b,0x7e,0x60,0xd0,0xb6,0x57,0x68,0x83,0x33,0x8c,0x9b,0x67,0xc2,0xc7,0xe4,0x50,0x92,0x68,},{0x9a,0xb4,0x29,0x9b,0x17,0x72,0x93,0x44,0x75,0x0b,0x69,0xdc,0x60,0x37,0x36,0x8c,0x98,0xf4,0x7b,0xe6,0x27,0xfb,0xd9,0xad,0xfd,0x8d,0xb3,0x9f,0x99,0x64,0xdd,0xb7,0xbc,0x92,0xd6,0x74,0xc7,0xbe,0x74,0x07,0x56,0x39,0x6b,0xaa,0xee,0xac,0xbf,0x74,0x94,0x7b,0x61,0x91,0xc6,0xed,0x1f,0x5d,0x32,0xa6,0x3d,0xf3,0x6d,0x54,0x26,0x01,},"\xe2\xf4\x8e\xdf\x9d\x64\x33\x20\xab\x99\x1c\x8f\xf9\xf6\xaa\x75\xfe\x06\x6e\x7d\x88\xff\x1e\x47\x2a\x5a\xc9\xc5\x18\xde\x1f\xb6\x29\x83\xb1\x00\x7f\x64\x22\x80\x91\x17\xbd\xbe\x8a\x0e\x57\x87\xf6\x6b\xb0\x57\xd2\x7f\x12\x9a\x20\x0b\x40\x57\x6e\x17\x19\xcf\x9e\x98\xfc\xb7\x2a\xf9\x4b\xb8\x2e\xe7\x0f\x37\x19\xa2\xe2\xcd\x9b\x64\x77\x7c\xea\x5e\x44\x64\x59\x87\x4b\x74\xbf\xbf\x56\xb2\xd2\x52\x64\x00\x59\x2a\x9b\x45\xa5\xcb\x79\x80\x92\xb6\x0a\x81\xb7\x1d\x82\xf0\x68\x5f\xae\x7f\x81\x0b\x52\xd2\x26\xad\xac\x7a\xd8\xa9\x18\x3f\x09\xfe\xbe\xe9\xd2\x50\x46\xc0\xfe\x30\x66\x81\xac\xe2\xbf\xf9\x1b\x34\x82\xb0\xbc\x30\xb2\x02\x1c\x43\x41\x64\x5d\x67\x51\x34\xfe\x30\x81\xc5\x1e\x5c\x59\xe4\x0b\x37\x5a\x14\x34\xf6\x3b\x42\x6e\x30\x53\x0d\xa9\x35\x3b\xb2\xa9\x42\x32\x20\x43\x4a\xe5\x9d\x7b\x6f\xdc\x14\x3f\x49\x82\xeb\x8c\xfa\x77\x51\xb7\x5b\xf3\xe9\xc9\x13\xc7\x3b\x76\x0b\x07\xd3\x95\x31\x0c\x59\xf3\xb7\x7e\xbf\x12\xed\x2d\x7b\x03\x59\x0d\x33\x17\xaf\x17\xdf\x42\x1e\x78\xb0\x84\x9f\xd5\x6d\x94\x5c\x56\x96\xa0\x40\xfc\xaa\x78\xa9\x3e\xcc\x16\xd5\xac\x34\x45\x06\x36\x11\xf3\x01\x3e\x9a\x3a\xe2\xe1\xc2\x70\xdd\x01\xa8\xff\xe3\xe6\x12\x6b\xc1\xe4\xc9\x5f\x65\x47\xa8\x65\x1f\x26\xb6\x40\x4e\x39\xee\x4c\xe7\x61\x89\x18\xf3\xf9\x37\xa5\x25\x73\xec\x27\x7b\x77\x1e\x91\xad\x09\x6f\xa1\x5c\x7a\x34\x0a\x80\x9b\x47\x03\x18\xa4\x63\x64\x23\xeb\x48\x88\xa1\x21\x60\xc4\x66\x3f\xce\x29\x96\xd6\x38\x89\x6c\x83\x9b\x2c\x7a\xd4\xb3\xa9\xb2\xe6\xcb\x71\xe9\x12\xfe\x39\xb8\x43\xc6\xe0\x83\x2e\xca\x22\xde\x93\x8b\x50\xae\x86\x3e\x48\x58\x2c\x10\x85\x12\x32\xf7\x5e\x52\x25\xb8\x89\x6b\x5a\x47\x0f\x81\x8b\x6f\xa3\x9e\xb7\xbb\x59\x03\x57\x67\x86\x12\xd2\x5f\xe1\xa4\x0e\xa1\xb9\xd7\x1d\x88\x09\x09\xc1\xbd\x4a\xd1\x76\xcc\x0c\xef\xfd\xce\xe7\x09\x9e\x78\x82\xa7\xc9\x07\xe4\xbe\xc7\x98\x30\xc6\x77\x1a\xcb\x89\x94\x4b\xd5\x4a\x51\x65\xb3\x18\x70\x91\x69\x21\xb1\x98\xac\xd4\x43\x2e\x7e\xed\x8c\xe1\xde\xb3\x45\xb1\x07\xed\xa7\x60\x26\x6f\xcb\xda\x3b\xa5\x22\x94\x00\xa3\x03\x60\xa4\x64\x5c\xa8\xdb\x38\xc3\xd5\xf4\xa8\xde\xf1\x57\xbb\xdb\xbf\x2c\x1f\xa1\xdc\x6b\x05\x14\xa4\xf5\xa0\x36\x4f\x92\x83\x81\xb4\x0f\x95\x57\x9a\x26\x46\x7f\x22\x82\xa8\xa2\x55\x75\x84\x02\xac\x9c\xa8\x0e\x89\xb9\xcc\x68\x60\xa3\x4b\xb3\xf9\x0c\x32\x37\x65\x7c\x21\x29\xea\x48\xc8\x52\xb9\x25\x69\xe8\x11\x06\xbc\xe4\x61\xe2\x02\x44\x54\x82\x1a\x91\x75\x92\xd1\x99\x1b\x5b\x69\xf2\x7b\xbe\x01\x99\x77\x52\x8a\x2f\xc0\x11\x92\xc5\x6b\x4a\xea\x87\x3c\xf8\xc5\x8d\xfd\x7c\xb4\xb0\xe9\x17\xe8\x7a\x87\x04\xc9\x92\x82\x0f\x98\xd7\x74\x04\xd3\xf1\xd2\x05\x0c\x67\x43\xf6\xe9\x3c\xdb\x51\xa6\x1a\xa6\xf4\x5b\x35\x1b\x26\x46\x1d\x13\x29\xf3\x15\x12\x72\xac\x39\x62\x34\xd0\xd6\x7c\x17\x8a\xcf\x91\xfc\x51\x0d\x86\x42\x9c\x69\xa8\x7f\xdf\x10\x11\x55\xda\x8d\x94\xde\x67\x22\x23\x8a\x6f\xb1\x70\x16\x86\x2b\x11\xd5\x02\xc6\x67\xee\x9c\xa0\xaa\xbe\x1c\x20\xb9\x77\x89\xf1\x86\x7a\xdd\x78\xb8\xb8\x7e\x9a\xb5\x19\x34\xc0\xb4\xa1\x6c\x2c\xbc\x4d\x2e\xfe\xdb\x79\xc0\x5b\x23\xe0\xcf\x78\x92\x01\xac\x75\xfe\x07\x6d\x31\x5f\xcb\xac\x20\xba\x0d\x31\xe4\xdc\x61\x69\x27\xd6\xea\xb1\xb1\xc8\x7a\x1c\x9c\x77\x8e\x4b\xd2\x85\x29\x58\x74"}, +{{0xff,0x15,0xd6,0xe7,0x4e,0x28,0xe4,0x1d,0x05,0xa8,0x66,0x3a,0x70,0x2f,0x03,0x8d,0x5b,0x85,0x78,0xc4,0x27,0x5e,0x77,0x2b,0x73,0xba,0x44,0x0b,0xc5,0xf5,0x5a,0x06,},{0x47,0x47,0xe2,0xe9,0xb8,0x26,0x37,0xb3,0x84,0x4b,0x85,0xf7,0x5b,0x59,0xf7,0x13,0x6b,0x7f,0xdb,0x1a,0x62,0xe7,0xb7,0x0d,0x6a,0xac,0x17,0xb3,0xc5,0x75,0x2f,0x2f,},{0x42,0xc1,0x29,0x5f,0xaf,0xe2,0x6d,0xe3,0xea,0x34,0x92,0x6b,0xf1,0xef,0x80,0xbc,0xaf,0xe4,0x7b,0x21,0xb9,0x0e,0xae,0xd1,0x96,0x35,0xed,0x75,0x38,0xd7,0x67,0xcb,0xf3,0xa1,0xe5,0xde,0xda,0xab,0x82,0xad,0xf7,0x51,0x20,0x37,0x3e,0x92,0x32,0x02,0xf7,0xfd,0xa0,0x82,0x67,0x84,0x29,0x2e,0xba,0x8b,0x23,0x8b,0x6c,0xb8,0x83,0x04,},"\xce\x7b\xf9\x72\x84\x4f\x51\x84\xae\x8e\xac\x87\xb1\x2b\xe9\x20\x2c\x72\x39\x96\x1d\xc2\x3c\xd4\x1f\xf5\x5b\x9b\xfa\xac\x0c\xc0\x6f\x3f\x1d\xec\xfa\x95\x71\x09\x5c\x8e\x82\xb4\xeb\x6f\x8a\x1c\x52\xc8\xd3\xde\xaa\x61\xa9\xaa\x94\xe2\xec\xd9\xab\x5b\x80\x63\xf2\xda\x6d\x80\x15\xdf\x0a\x51\x44\xfa\x3a\x48\xe3\x05\xad\x9f\x41\xea\xa1\x1c\x4d\x74\x85\x43\x74\xec\xbf\x38\x2e\x30\x02\x57\x9a\x9a\x24\x9e\xfa\x1e\x1c\xa0\x4d\x33\x84\x47\xd7\xf2\x20\x67\x03\xe6\xca\xbf\x5b\xbd\x33\x2b\x42\x57\x3b\xcb\xd3\xb6\xf7\x1b\x7c\x3b\xf7\x3d\x4c\x77\x4a\xa0\x1e\x86\x68\x41\x43\x28\x29\xd0\x7f\x96\xe1\xf6\x1a\x20\x21\x6d\x96\x8c\x90\xe3\xed\x11\xf6\x63\xf7\xd6\x27\x16\x22\xfe\xfc\xf3\xab\x68\xf3\x44\x32\x85\x15\xd5\xcc\xe2\xce\x85\xe8\xbf\x3d\x1d\x09\x04\x36\x92\xe1\xfb\x8b\xbd\xdc\x07\xa4\xab\x0a\x3e\xef\x8c\xa6\xa4\x20\xe7\x4b\xff\x8d\x3d\x71\x55\x96\xaa\x82\x16\x82\x95\x4f\xe8\x96\x29\xae\x27\xc1\xbb\x03\xb6\xaa\x09\xf3\x6a\x39\xa3\xe3\x7b\xa9\x81\x32\xf4\xe2\x38\x88\xf9\xf3\x35\xe7\xbe\xaa\x2c\xb2\x72\x7a\xcc\x3d\x27\x77\x30\x9b\x85\x29\x52\x32\xe5\x4d\xa8\x8e\xbb\x6f\x10\x53\xd6\xde\x79\xac\x66\x09\x85\x2e\xb9\x3a\x0a\x35\xbc\x1a\x7b\xdc\x22\xd6\x28\xbc\x86\x12\x4d\x69\x6c\x3f\x98\x28\xb6\xf8\xb9\xaa\xde\x1a\x65\x21\x61\x77\x48\x6c\x25\x2a\x4b\x42\xd9\x0a\x4e\x0f\xea\x20\x93\x48\x9e\x24\x4d\x80\x8e\xf7\x02\x1a\x97\xd5\x60\x8c\x0a\xe1\xd6\x63\xc7\x75\xe8\xbb\x9e\x9a\x73\x15\xf1\xfe\xb6\xd1\x29\xb5\xa5\x41\xea\x59\x29\xa2\xc6\x33\xb6\xd8\xc3\xc4\x54\x41\x71\x79\x46\xcf\x87\x3e\x9b\x4c\x51\x21\x80\x13\x5d\x54\xf0\x53\xab\xe4\x4c\x6d\xf3\x9b\x7b\x06\x2e\xf7\x24\x01\x62\xcb\xd0\xb8\x51\xaf\xe5\xf9\x15\x36\xa9\x49\x94\x18\xe8\xbf\xf4\x99\x64\x73\xd8\x05\xeb\xc1\xae\x48\xda\x2d\x0b\x12\x9e\x8e\x82\x52\xf1\xd5\x3c\x32\x8f\x32\xdb\x25\x2d\xe3\xbe\xfb\xe5\xf3\x12\x80\x12\x11\x43\xa8\x00\x4a\x4c\xae\x63\x1c\x82\x74\x09\xe5\x20\xe3\x94\xcd\x0f\x89\x50\xcd\x4c\x3c\xf3\xf3\xdb\xd4\x95\x2a\x4d\xfe\x69\x87\x5f\x56\x53\x89\x06\x1a\xd0\xa0\xce\xe6\xb6\xaf\xf0\x9c\xec\xa2\x6d\x99\x0e\x89\x6a\x2a\xba\x9f\x3b\x26\x01\x5b\x63\x42\x37\x68\x68\x4c\x03\xed\x0d\xe6\xce\xe7\xac\x5b\xbd\xf9\xf4\x85\xc2\x27\x5c\xd1\x2a\xef\xa8\xf9\x07\xb8\x51\xa0\x2d\x51\xc3\x4f\x12\x1b\x77\xf3\xa5\x6a\x9e\xbd\x1d\x65\xff\xe8\x9b\xee\x38\x1f\xf2\xa7\x48\x0e\x89\x68\xcf\xf2\x5a\xc8\xd0\x4e\x14\x9a\x9d\x50\x27\xd1\x4b\x88\xf8\xae\x26\x04\xd2\xac\x22\xac\x67\xd1\x3e\x90\xad\xa6\x20\xc2\x04\x6d\x28\x29\x93\x84\xd0\x95\x9f\xb7\x6e\x22\x58\x87\x96\xce\x42\x7a\xae\xaf\x4e\x2a\x8a\xae\xc3\xe8\x7f\x84\xcc\xd0\x82\x52\x4c\x96\xd7\x66\xee\xc6\x6f\x0b\xec\x3e\x79\x95\x58\x14\x5f\x09\xd3\x30\x13\x4f\x1c\x63\xf3\x70\x53\xcd\x4b\xdc\x1c\x37\xfd\xe9\x72\x91\x85\x75\x51\xf5\x0a\xc8\xe1\x5f\x06\xac\x1c\x73\xda\xa1\xe8\xc5\xbc\x92\x77\xe3\xd6\x9c\xb4\x4a\x32\x37\xec\x57\xdb\xbc\xcf\xdf\x66\x85\xad\xa2\x0b\x74\xa1\xbc\x6b\x74\xab\x05\x69\x0e\xaf\x9b\xd0\xc4\xbe\x17\x04\x2f\x5c\xd3\x20\xcd\xd6\x13\xdc\x08\xd2\x9a\xf3\x46\xaa\x41\x91\xce\x0b\x4f\x85\xbb\x2a\xd7\xf3\xba\xc7\x38\xa9\x37\x7e\xc6\xb8\x40\x62\xcc\x70\xfc\xa9\xec\xfb\xe1\xf5\x7f\xe5\xb2\xce\x7a\x4f\x73\x9c\x81\xca\xbc\xde\x04\x64\x51\xdd\x61\xce\x1d\xbc"}, +{{0x1e,0xd3,0x7b,0x61,0x0b,0x8b,0x35,0x41,0x7d,0x04,0xe5,0x9a,0xaa,0xda,0xc6,0x88,0xff,0x81,0xf1,0xe5,0x07,0xc8,0x9b,0x4f,0x40,0x01,0x60,0x94,0x19,0x08,0xcb,0x8c,},{0x48,0xe8,0xcb,0xeb,0x12,0x40,0xbd,0xeb,0xf0,0xa2,0xd9,0x29,0x53,0xaa,0x89,0xb2,0x82,0xc4,0x9a,0xab,0x2c,0x38,0xae,0x69,0x04,0x4c,0x51,0x51,0x5c,0x33,0x00,0xd5,},{0x86,0x08,0x81,0x5e,0x10,0x59,0x0d,0x55,0x04,0x87,0x4d,0x89,0x99,0xfd,0x6f,0x09,0x62,0x6f,0x95,0x0b,0xe2,0x0c,0x91,0x2c,0x27,0xc9,0xde,0x6e,0x79,0xb0,0xfa,0xf7,0x77,0xa5,0x33,0xbd,0x5b,0xb6,0x67,0xab,0x51,0x3a,0x49,0x45,0x8e,0xcd,0x67,0x87,0xa0,0x9e,0xc0,0xdf,0x6c,0x9c,0x9d,0x63,0x33,0xc5,0xe3,0xae,0x61,0xea,0x37,0x0a,},"\x1e\x67\x67\xdf\x97\xdb\x1c\xfb\x40\x88\xda\x7b\x20\x0d\x9f\x59\xec\x8d\xd4\x53\x3b\x83\xbe\x30\x9f\x37\x65\x00\x31\x06\x57\x27\xcd\x52\x02\xce\xf4\x84\x26\xa5\xf3\xa1\x1d\x50\xb3\x81\xf8\xbc\x22\xff\x10\x18\x27\x35\x9f\x2d\x0a\x61\x0a\x4f\x75\x54\x64\xa0\xc8\x91\xcb\xd9\x8d\x2d\xcb\x41\xd9\x77\x9d\x28\x8f\xcf\x1f\xea\x62\xe5\x21\x63\xae\x67\xe9\x04\x28\xb8\x63\x98\xef\xa2\x18\xf1\xb9\x82\x08\x1f\xc5\x13\x30\x5f\xd3\xe8\xec\xe7\xf9\xac\xb0\xe1\x0e\x00\x1d\x2e\xd2\x99\xa4\x8a\x80\x87\x0b\x3d\x5d\x8a\xb9\x00\x63\x09\xb3\x15\x91\xca\xf0\x58\x33\x80\x07\x3a\x2d\xb6\x1f\x45\x25\x4a\xb9\x65\xb5\xe4\x67\x2c\x4b\xfa\xa8\x6e\x33\x6c\x49\x27\x85\x52\x72\x9f\xb2\xda\x76\xff\xe5\x02\xec\x61\xe1\x69\x6c\x7f\xc9\xef\x19\xf7\xcc\x2a\x27\x75\xb2\x97\x00\xcb\x38\x42\x94\x06\x3a\x17\xfe\xd4\xfc\x63\x5b\xc1\x32\x82\xa9\x0d\xad\x0c\x00\xaa\xdb\xcd\x56\x9f\x15\x6a\x85\x4f\x8b\xa9\xe7\xd6\x07\xd2\x0f\x2e\x9e\x53\x37\x98\x11\x61\xd8\x04\x64\x46\x68\xd0\x64\xfa\x63\xdc\xeb\x9f\x58\x01\x35\x3d\x0a\xb9\xf4\x1d\x1d\x8b\xdc\x76\xc1\x3a\xb2\xf0\x23\xea\x01\xad\xbc\x4c\x81\x68\xd9\x39\xe9\x8f\x64\xfd\x89\x19\x38\x4a\xbe\x76\x70\x92\x63\xc0\xcd\x7c\x3e\xfa\xdc\x28\x01\xcc\x4a\xbd\x80\xa0\x9b\xb3\xed\x6b\xb7\x8c\xd6\x20\x96\x9c\xd3\x5c\x6a\x3a\x5d\x01\x48\x5e\xad\x4c\x45\xeb\xb6\xac\x6a\x83\x21\x2a\x7c\x76\x67\x54\x27\xb2\x1d\xa8\xa7\xa5\x04\x7b\x30\xa6\x10\x0c\xda\x02\x47\x6c\x18\x6e\x6c\xe4\x0d\x27\x68\xa9\x42\xc9\xf8\x73\x05\xe9\xd3\x63\xb5\x24\xc0\x09\x4a\x9e\x2e\x29\xf5\x85\x89\x4c\x0a\xdb\xfc\xd6\x06\x90\xfc\x7f\xb0\xa9\xc7\x17\xcf\x43\xb4\x84\xfd\x45\x15\x1b\x13\x04\x16\x9c\x26\x92\x1d\xb2\x27\x6e\xc0\x5a\xd2\x2a\xd1\x66\x85\x4f\xd2\xf9\x40\x85\x77\x8c\x47\x0d\xc4\x52\xe5\xcf\xa4\xae\xe0\x4f\xac\xb7\x70\x52\x6e\x1f\x24\x8d\x3d\x15\xc2\x72\x80\xfd\xfa\x1f\xd2\xc1\x04\x4b\xcb\xc8\x81\xc3\xd9\x98\x15\xc9\x7f\xbe\xa4\x61\x10\xbe\x02\xda\xb7\x74\xf3\xa6\x10\xe5\x80\x2a\xbf\x36\xa4\x98\x75\xc6\x82\x63\x8e\x0a\xe4\xcc\x82\x77\xc5\xe9\xaa\x73\x07\x44\x5e\x6b\xbc\xbe\x54\x9e\xec\x2a\x45\xb1\x59\x7f\x74\x47\x10\x7b\x62\xe2\xce\xe0\xa5\xfc\x51\xbe\xae\x3e\x1f\xe9\xbe\xfb\x18\x85\xd9\xb3\x0f\x9b\x4f\x1f\x56\x20\x6d\xee\x0d\x67\x77\x9c\x57\xf4\x84\xc8\xc3\xc8\x99\xa5\x15\xa9\xd1\xc1\x0f\x60\x59\x84\x0c\x1c\x73\xd3\xf0\x5b\xcb\x88\x59\x0c\x52\xf7\xda\x39\x18\x38\xdc\x2e\x73\x22\x8f\x09\x81\xc2\x89\xa4\xc2\x7f\x0c\x75\x7f\xaf\x7b\x3b\x89\x14\x6e\x33\xda\xfa\x49\x0d\x9e\x0f\x92\x75\xb0\xcf\xa6\xa7\x71\x0a\x73\x83\x14\x59\x59\x5b\xf7\x32\x11\x2b\x62\xfc\x86\x4c\xa4\xc8\x29\x78\x4a\x3f\x16\xee\xc4\xe1\x8f\x93\x69\x18\xa7\xb9\x89\x16\x69\xe9\x33\x22\x3f\x74\x5f\xda\x56\x2b\xc0\xa4\xe6\x1e\x3d\x14\xea\x45\xdf\xc3\x27\xe2\xfc\x0c\xdf\xe6\xf2\xf9\x75\x46\xc9\x0f\xce\x82\xf5\x22\x29\x14\x80\x11\x1a\x1e\x6b\x93\x88\x27\x2c\x0b\xe2\x8d\x20\xed\x84\xbb\x84\xd4\x9b\xc1\x99\xcd\x59\x99\x48\xb8\xf2\x03\x9d\x07\x82\x7a\x3f\x40\x75\xd3\xa6\x7e\xe5\x72\xa0\x13\x79\xa3\x62\x13\xfe\x11\x6e\x76\x8b\x41\x14\xe8\xa4\xb3\x13\x4c\x38\x18\x96\x07\x72\xd7\x27\xb0\xca\x6f\x7c\x99\x7c\xa9\x98\x43\xb7\xeb\x02\xff\xc0\x13\x97\x1c\xbe\x0e\x6e\x60\xd4\x97\x73\xf1\xe8\xc0\xb3\x06\x06\x13\x1c\xb1\x0c\x3e\x04"}, +{{0x84,0x36,0x44,0x78,0xec,0x94,0xbd,0x25,0xc4,0xbd,0xb8,0x2d,0x29,0x62,0x29,0xe6,0xda,0xce,0x2b,0x13,0x59,0xd6,0xd2,0x1b,0xe2,0xb3,0xaf,0xcd,0x7b,0xda,0x19,0xc7,},{0xa1,0x81,0x4f,0x8c,0xe0,0xfc,0x3b,0x23,0x60,0x93,0xa5,0x0f,0x46,0x8c,0x13,0x16,0x21,0x1f,0xe6,0xc5,0x2e,0x23,0x45,0xd9,0xf0,0x76,0x6b,0x36,0x88,0xa0,0x3c,0xad,},{0xb4,0xc2,0x32,0x1a,0xde,0x3c,0x19,0xed,0x4e,0xd4,0xc6,0x39,0xd5,0xa4,0xd6,0xf2,0xbe,0x8e,0x2f,0xb1,0x3b,0xb7,0xbd,0x62,0x5a,0xd6,0xdc,0x87,0xe2,0xc2,0x0f,0x93,0xad,0x6b,0xe7,0xb7,0xe4,0x27,0x11,0xa8,0x78,0xdb,0x9d,0x76,0x05,0x4b,0xfd,0x7b,0xc2,0x5e,0x37,0x74,0xa9,0x3d,0xa1,0x54,0x3c,0x9b,0x4f,0x66,0x33,0xb0,0xbe,0x09,},"\x7b\xb7\x29\x3d\xe5\x5f\x05\x8f\xb2\xec\x22\xb6\x87\x26\x05\x43\xdc\xaa\x90\xf1\x40\xb9\xf4\x5e\xdd\xd4\xbc\x22\xe4\x09\x77\xe0\x0e\xd3\x3c\xd1\xef\x1b\xba\x13\xc1\xd0\x99\x08\x59\x00\x55\x69\xa8\x07\x67\xe4\x86\x4a\x2c\xd2\x88\xc8\x13\x93\xe0\x4a\xd9\x71\x78\x2e\x2b\xc4\x93\x10\x8c\xbe\x80\xda\xcf\x0b\x7b\x9c\xd5\x34\x98\x84\x07\xa4\xf9\x32\x7e\xc8\xe9\xc4\x04\x32\x84\xef\x6e\xe5\xa2\x6a\x5b\x41\x77\x65\xd3\xea\xbb\x48\xa0\x07\xe7\xc7\xf3\x29\x87\xd7\x0a\x13\x9a\xc4\x16\x78\xcd\xf7\xa5\x5c\xb8\x0c\xf9\xdb\x5e\xaa\x45\xf3\xde\x0f\xbf\xba\xdf\xfc\x40\x99\x63\x70\xe4\x8b\x1f\xf5\xed\xd9\x79\x40\xe7\x50\x79\x21\x64\x83\x6a\x4a\x5a\xc2\xe3\xff\x53\xe4\x8a\x1e\x55\x6d\xb9\xad\x0c\x5c\x0b\x94\x4f\x4a\xee\x51\x9a\x2b\x0a\x88\xbb\x1c\x1f\xc7\x45\x45\x24\xcd\x57\xaa\x53\x50\x98\x62\x43\xd3\x4f\xc5\x8e\x24\xe8\x19\xec\x0b\x85\x45\xd8\xdf\xcf\x6b\x20\x31\x14\x41\xd3\xa3\x5d\x3e\x71\xb3\xe3\xec\xd7\x88\x4d\xda\x84\x33\xa4\x05\xe3\xd9\x96\x90\x00\xc8\x20\xa8\x9b\x95\xd1\x97\x84\x1d\x98\xae\x73\x4a\x2e\x81\xda\xf6\xa7\xdc\xf5\x6c\xb2\xfc\x26\xf2\x16\x5a\x5f\x42\xb8\x6c\x7e\x9e\x5b\x11\x16\x17\x00\xa1\xab\x98\x31\xf3\xfa\xe5\x8e\x14\x20\x8b\xe1\xbf\x33\xb5\x8e\xcc\xe8\x1b\x0c\x6b\x7e\x02\xf8\x8a\xdf\x9a\xb0\x30\x26\x3e\x2c\xc9\xb6\xe3\x3e\xbc\xa3\xf4\x95\x49\x2e\x32\xbf\xe3\x72\x53\x7d\xe6\xc6\xb8\x76\x44\x82\x8f\x74\x94\x2a\x02\xb0\x07\xf1\x4c\x3f\xc5\xdb\xde\x76\x33\x3d\x36\xd0\x76\x31\xb7\xa9\x92\x4f\x71\x75\x50\x04\x06\x97\x92\x3f\xa7\xb9\x54\x6b\xfb\x02\x17\x02\x4e\xa3\xf2\x52\xb5\x15\xb5\xd6\x4a\x62\xc4\x8e\x02\x7c\xef\x67\x50\xbe\xda\x49\xa0\x24\x47\x03\x9b\x25\x0a\x0b\xda\x07\xdc\x06\x24\x91\xa6\x62\xe2\x68\x74\xc8\xd0\x0f\x80\xe6\xcf\xc8\xb3\x0f\x2c\x3b\xf7\x72\x0b\x57\xf2\x61\x5f\xc4\x78\xfe\xfa\xa6\xd3\x17\x05\xb4\x3c\x5a\x54\xf7\x58\x66\x6b\x30\x2a\x8d\x34\x95\x31\x31\x94\x1b\x79\x57\x73\x04\x76\x79\x4d\x0b\xd9\xd2\xdf\xa7\x2f\xd2\x03\xf2\x2d\xf5\xec\x6b\xba\xac\xe8\xb9\x39\x4b\xeb\xda\xea\xa5\x61\x46\x10\x11\xb4\xfc\xa6\x18\x5c\x9a\x38\x28\x3f\x54\x03\xfd\xac\x32\x6d\x1f\x73\x4c\x6a\x5d\xed\x67\x24\xd9\xf3\x84\xae\xbd\x6c\xab\xfc\xbe\xc1\x2a\xba\xb9\x82\x0d\x08\x07\x32\x51\x5e\x05\x00\xcf\x5d\x3e\x2f\x9e\xf8\x0a\x4d\x76\x46\xa7\xda\x9e\xff\x41\x0f\x50\x7c\x69\x87\x3b\x32\xd5\x40\xec\x32\xb2\x83\xef\x31\x79\xa4\xc6\x32\xb3\x66\x57\x6d\xff\x05\x8f\xaf\x8c\x8c\x70\xbc\x69\xbe\x80\x89\x82\xec\x14\x97\xae\x89\x11\xb0\x01\x65\xa6\x66\x95\xf4\xd3\xb9\x87\xe7\x39\x0b\x5c\xf8\x78\xe3\x5e\x67\x65\x41\x28\x5e\x4e\x13\xdf\xae\xb2\xf3\x68\xcb\x51\x1b\x77\x8b\x10\x6a\x42\x87\x78\xa1\xb8\xf2\xa7\xd2\xe0\x93\x51\x9b\xc9\xb5\x18\x8e\x38\xc6\x79\x3e\x96\xbd\x0d\x30\xe2\xa3\xdb\x9e\xe1\x46\x8c\x3d\xc8\x7c\xc3\x65\xc8\x10\xf9\xdb\xdf\x01\xa4\xb5\x14\x21\xf6\xfc\x8d\xfd\xa3\xa1\x6e\x2d\xa7\xca\x71\x59\xb6\x86\xa5\xe1\x67\x33\x89\x37\x88\x2f\xf7\x15\xd3\xe7\x50\xd9\x58\xfc\x9e\x4b\x1f\x05\x53\x12\x92\x99\xaa\x84\x30\x18\x3e\x50\x6c\xd7\xf2\xb2\x79\x07\x6e\x0e\x1c\xca\x97\x49\xcf\x12\x3c\xe5\x07\xfe\x07\xdd\xbb\xc4\xdc\xca\x6c\xdb\x9e\xf1\xb8\x33\xf6\x1d\x4b\xff\x00\xbe\xc0\x12\x15\x8f\x43\x2c\xeb\x75\xb4\xf2\xed\xb1\xbb\x84\xe5\xeb\xb9\x25\x9e\x09\xf9\x62\x5c\xe3"}, +{{0x00,0xdb,0x37,0xad,0x2a,0x19,0x5f,0x08,0xa0,0x84,0x40,0xd0,0x59,0x25,0x9e,0x53,0x9f,0xeb,0x40,0xb4,0x74,0x92,0x82,0x55,0xe7,0xc9,0x4e,0xbc,0x3b,0x05,0x03,0x8c,},{0x04,0xf8,0x8b,0xf6,0x39,0xe0,0xf7,0x1a,0x57,0xd0,0xd0,0xaf,0xff,0x5f,0xe9,0x7d,0xde,0x38,0x09,0xff,0x28,0xec,0x68,0xeb,0x6f,0xc4,0x23,0xf4,0xfa,0xff,0x43,0x90,},{0xf4,0xd1,0xc8,0x0f,0x5e,0x7b,0x91,0xc5,0xc7,0xa8,0x2a,0x68,0x2d,0x49,0xba,0x6f,0xb1,0x9d,0x40,0x0a,0x29,0x97,0x48,0xa0,0xc9,0x69,0xbb,0x99,0x81,0x69,0x98,0xbe,0x63,0x4e,0x84,0xda,0x78,0x58,0x1b,0x06,0xe3,0x47,0x0e,0xfe,0xc3,0x98,0x04,0xfe,0xd9,0x3d,0x29,0x73,0x9f,0x04,0x39,0xa8,0x09,0x5a,0xc4,0x0d,0x9d,0x38,0x5e,0x04,},"\x5a\x94\xf7\x29\xd3\x0d\xd8\xaa\xe2\xa5\xc8\xc2\x85\x47\xbf\x45\x06\x29\x5d\xc6\x1b\xfe\xad\x97\x27\x74\x60\x82\xd4\x3b\x0f\x81\x14\xc8\xc1\x8c\x5e\xda\xf2\xfe\xc7\xca\xe8\x19\x35\x63\x38\xf0\xbf\x11\x5a\x17\xb0\x38\xac\xfd\x7c\x96\xba\x62\x62\xca\xbd\x57\x10\xfc\x0e\xfb\x43\xd1\x3d\xf4\x06\x5b\xec\xbf\x1b\x9e\x27\x9c\x03\xec\x9b\xbf\xed\x54\xd9\xa1\x3f\xe0\x6a\x55\xa3\xbd\x05\xc8\x07\x85\x8b\x41\xe1\x8d\xbd\xe1\x3b\x09\x07\xd4\x03\x41\x32\x26\x2d\x9c\x2f\x4d\x2d\x37\x6e\x16\x09\xad\x28\x0d\xe2\x0b\xa7\x09\x84\x4d\xbd\x12\x95\x02\x57\xf1\xb0\x7e\xf8\xcc\x33\x37\xc0\x1a\x70\x26\x93\xfb\x4d\x92\xd0\x47\xe6\x98\xc3\xa6\xdd\x46\xc4\xa9\x2a\x10\xd4\xc7\x80\xe5\x2e\x50\x25\xe0\x9d\x56\x53\x5d\x7e\xeb\x9f\xe7\xf0\x33\xe6\xe9\x26\x0a\x68\xf9\xd5\x4b\x6f\x37\xcc\x06\x96\x56\xe3\xbc\xee\x06\x92\x2b\x34\x96\x81\xa8\xe7\x75\x1c\xde\xcb\xe1\xec\xb6\x63\xfb\xc6\xf7\xc8\x61\xf8\x53\xdc\x31\x0f\x33\xde\xfa\x98\xee\x34\x3a\x68\x63\x2e\xc2\x2c\xaf\xec\xb7\xf3\x21\x2f\x81\xe7\x0b\x71\x84\x3b\x9f\xe8\xc8\x6a\x68\xb5\xc8\x6f\x03\x22\xd3\x48\xa7\x6d\xa7\xf1\xba\x0c\xa3\xcd\x7b\x6f\xd1\x5f\xf8\x92\x92\xb3\xf6\x36\xcd\x08\xcf\x62\x5c\x74\xd5\x10\x2c\xab\xb5\x71\xa3\xdb\xa8\x6a\x1c\x92\xf4\x1c\x72\x03\xb4\x49\x42\xf5\xa2\x46\x25\xac\x37\xd7\x7e\x49\xa5\x7f\x11\x82\x38\x69\x9d\x80\x7c\x25\x0d\x5b\xf4\x6f\x7a\x3c\xec\x57\x79\xa6\xe5\xae\x1a\x6c\xa1\x60\xcf\xf3\x7f\xb3\xb7\x83\x88\xfe\x9c\x03\x0c\x40\xe7\x15\x46\x01\x08\x1a\x51\x7f\xc0\xaa\x18\x02\xcd\x3b\x84\x5b\x94\x6e\xfe\x94\xaa\x8b\x9e\x03\xf6\x8a\x80\xde\xd0\xdf\xbf\xad\x4d\xae\xe4\x0f\xa8\x38\xc1\x33\x84\x1a\xe8\xa3\xce\x0d\x79\xfa\x8a\x2b\x94\x34\xba\xc5\xe1\xda\x6e\x0c\x71\x93\xe8\xde\xa4\x35\xa0\x3a\x85\xf7\x61\x84\xf7\xeb\xe2\xaa\x74\x9b\xe9\x41\x31\x04\xa1\x78\x68\x9b\xa6\xd2\x7e\x94\xfc\xcf\x61\xeb\x3a\xba\x0e\x6a\x5a\x63\xaf\x0c\xa8\xf0\x5a\x35\xcb\x63\x70\x51\x94\xe4\x4d\x92\x93\xde\x39\x29\xb0\xd9\x2b\xe6\xf8\xe6\x27\xc3\x50\xa8\x3f\xc9\x00\x0a\xa9\x5b\x93\x82\x0b\xe9\x79\x5c\x80\xb5\x66\x2c\xd7\xb3\x48\x22\x32\x80\x61\x35\x6d\xc5\x80\x57\x8d\x1a\x35\xb1\x01\x40\xdc\xd2\x48\xe4\x85\x31\x04\xd2\xc5\xb2\xc1\x3f\xf6\x83\xdd\x5c\x30\x79\x4b\xe4\xa7\x68\x58\xaf\x1c\x0d\x9a\xf3\x47\xce\x1d\xcd\x97\x2e\xe4\x9a\xac\x12\xbb\xcd\x89\x9c\x93\x29\x87\x1d\x3e\x7a\x06\x83\xd1\x75\x77\x9a\xfe\x35\xf2\x6a\x2d\x24\x8f\xd7\x80\xea\x85\x1d\xc4\xba\x6d\x21\xf8\xa1\x71\xaa\x6c\xb8\x69\x7d\x9d\x11\x21\x61\x54\x03\x07\xcd\x54\xf9\x31\x77\x5d\x70\xb3\x3d\x3b\x6d\xe1\x09\x1f\xc1\x75\x05\x31\xc0\x8f\xa7\x0f\x7b\xe3\x8a\xa1\x10\xd6\x74\x6b\xb5\x65\xdb\x7b\x47\x0f\x90\x08\x50\xfb\xbf\x1c\x66\x2f\xd6\x13\xe4\xf3\xa5\x68\x95\x49\xe3\x10\x7e\x9b\x0f\x17\xde\xf7\xa5\xbd\x7f\xd7\x59\x6c\x4d\x04\xc7\xf4\x8c\x77\x9f\xc3\x5e\x09\x33\x5e\x1d\xf7\x84\x08\x4e\x55\xd8\x55\x1d\x1f\xf4\x9d\xe5\xb3\x11\xcd\x35\x0f\x34\x7a\x0b\xd2\x86\x3a\x2a\x30\xe6\xea\x18\x3a\xd2\xe3\xee\xde\xbc\x18\xdd\x28\xc6\xa5\x96\xe6\x93\xdc\x33\x89\xf7\xd9\x0b\x71\x3e\x3a\x85\xa6\x25\x16\x30\x5a\x70\x66\x7f\xc1\xfb\x3c\xb1\x0e\x8a\x95\x57\x50\x27\x39\x43\xc5\x68\xe1\x07\x69\xce\xf7\x81\x99\xdf\x44\x50\xdb\xc4\x90\xfe\xf1\xb3\x04\xb0\x52\x22\x1b\x2d\xb9\xc4\x4f\xe0\x03\x45"}, +{{0x6c,0xa1,0xa1,0x48,0x2a,0x07,0xf2,0xa6,0xc5,0x7f,0x04,0x11,0x97,0xb3,0x4a,0x51,0x19,0xe6,0x89,0x03,0xcf,0x6d,0xfb,0x51,0x71,0x1d,0x95,0x50,0x97,0x31,0x63,0xc0,},{0x80,0x34,0xa5,0x5e,0x3b,0x6e,0xd7,0x99,0xf4,0x9e,0x2e,0x70,0x3a,0x81,0xf4,0xac,0x02,0x57,0x3c,0x44,0x5d,0x76,0x5e,0x30,0x69,0xbe,0x42,0xf0,0x9c,0xbd,0x18,0xad,},{0xdd,0x9b,0xdb,0xad,0xd9,0xfd,0xc8,0x1c,0xe2,0x30,0x28,0x8c,0x4a,0x06,0x8d,0xf0,0x7e,0x18,0xb4,0xc7,0xcc,0x51,0xc0,0xca,0x48,0x11,0xdf,0xbd,0x04,0x76,0x5c,0x56,0xbc,0x88,0x32,0x40,0xe4,0x6e,0x3a,0x42,0xc0,0x1d,0x8d,0x24,0x24,0xfb,0xc3,0x32,0xb7,0xc5,0xa1,0x7b,0xce,0xb1,0xf6,0xe8,0xda,0xd0,0xbf,0xe5,0x62,0xca,0xd3,0x02,},"\x08\xfd\x84\x87\x50\x3c\x3f\x32\x96\xb6\xf1\xb6\x4d\x6e\x85\x90\x6f\xd5\x98\x6c\xf9\xc5\xd9\xfa\x8a\x59\xd9\x2f\x44\xe6\x47\x0a\xf3\x4b\xcd\xef\x33\x6f\xfd\xc8\x64\x56\xec\x7a\x7b\x57\x61\xf1\xad\xea\x02\x73\x26\x63\x0e\x68\xab\xc6\xb8\xcd\x5d\xdf\x40\xb6\x41\xa2\x59\xad\x02\x43\x21\xbf\x3e\xf9\x8e\x76\x32\x79\x71\x49\xc4\x92\xd5\x35\x94\x75\x2c\x55\x0d\xfb\xc4\xfa\x6b\xf4\x71\x76\xf4\x23\xa2\x70\x56\x93\x94\x7a\xa9\x0d\x68\xdd\xc8\xef\xb6\xcb\x9d\xbe\xca\xfd\x28\x30\xd0\x4f\xd9\x3b\x1e\x9e\x7c\x12\xb9\x3e\x0d\x0f\x3e\x26\x34\x90\x0f\x25\x86\x0d\xda\xdb\xae\xce\x17\x80\xff\x2d\x3f\x3d\x9f\xb8\x38\xfd\x0d\x5d\x66\xf8\xaf\xb3\x05\xff\x1a\x1a\xed\xca\x2b\x97\x4b\x63\xe4\x3f\x5b\x3c\xc9\xdf\xed\x1b\xcf\x11\x99\x91\x76\xed\x95\x85\xac\x82\x9b\xc6\x79\x4e\xf3\xac\xd8\x72\xe8\xd2\xe9\x26\x08\xb3\x20\xf8\x94\x99\x6a\x56\x2e\x1e\xb1\x77\xe2\x1b\xe5\x7c\x22\xc4\x1e\xc2\x59\xa3\xdf\xf9\xc7\xc9\x49\x1d\xb8\x38\xd7\x6c\xf9\xb0\x38\x31\x11\x59\x8e\x35\x7f\x44\xba\xbe\xbf\x12\x1b\xdb\x24\xee\x9d\x55\x7b\x7d\x5a\xf4\x91\xa0\xa0\x36\x5c\x90\x36\x1f\xe4\xf7\xe3\xd1\x3a\x17\xda\x3a\x39\xfd\x43\xf6\x90\xdf\xb0\xb2\xd8\x60\xca\xb4\x19\xf7\x75\xab\x71\x52\xcd\xc8\xf2\xaf\xdc\x50\xe8\xd5\xda\x5d\xa0\x17\x06\xee\xa2\xa2\xff\xad\x4b\xab\xee\x8b\x03\xda\x33\x6a\x4d\x84\x3d\x9d\x7e\x0a\x93\xf3\x6a\x92\xe6\x61\x0a\x36\x8b\x63\x13\x3f\x05\xa3\xfd\xc5\x5e\x3e\x1a\x44\x0b\x0f\x87\xa5\x33\x64\xc1\xd3\x72\x42\xc5\x7a\x10\x9e\x6d\xf6\x93\x45\xb0\x1c\x21\xc1\x08\x9e\x79\x0a\x66\xf4\xf3\x38\x0d\x3b\x76\xff\xb4\x20\xdf\xe1\xe6\x20\x0e\xac\xe5\x79\x26\x5a\x42\x7f\xbd\x35\x55\x14\xef\x95\x3e\x1a\x6e\x96\x8e\x37\x02\x1b\x3c\x6a\x29\x0d\xcd\x02\x93\xda\x67\x68\xda\xd7\xc6\x63\x11\x63\x30\x51\xc0\xac\xcb\x0b\x91\x65\x46\x4d\xfd\xdf\xde\xd2\x3b\xd1\x3e\xf9\x08\x74\x4f\x9c\x21\x11\xdc\x15\x31\x42\xd2\xf1\x05\x34\xd8\x93\xfe\x0b\x54\x5f\xec\x53\xfd\xb3\xb3\x5b\x51\x83\x98\xb0\x2a\xb2\x17\x91\xfa\x97\x7e\x30\xcf\x4b\x40\x4e\x7a\x29\x9d\x37\x87\x10\x8b\x83\x6a\xa0\xd5\x9c\x11\x4f\x1f\x36\x71\x9a\x7a\xcf\x85\xac\x99\x4d\x9c\xb7\x23\x06\xf2\x58\xf7\x8a\xc0\xa3\xb6\xc0\x53\x43\xe0\xb7\xa9\xaa\x72\x6e\x52\x26\x7e\xdf\x97\xf4\x97\x2f\x76\x64\xf4\x37\x20\xad\x33\xce\x6e\x61\x54\x40\xe3\x65\x37\xcb\xc5\x69\xbd\x6f\xf9\x4f\xfd\xae\xa5\x1e\x06\x02\x9d\xae\x78\xc5\xb9\x15\xc5\x37\xca\xea\x6f\x15\x04\x14\x79\x79\xb8\xaa\xae\x0b\xcd\x96\x18\x43\x7e\xbe\xd0\xb5\x5e\xfa\xec\x32\x0e\x84\xc7\x59\x59\xa3\x7a\x26\x0a\x02\xd4\xef\x1b\xb6\x26\x41\x52\x0f\x1a\x03\xdd\xea\x8c\x4c\x1d\xe8\xd7\xfa\xc5\x8d\xa4\x08\xb0\xab\x47\x57\xa1\x35\xf1\xd0\x75\xc9\xf7\xc9\x9f\xb9\x9d\xb9\x42\x7c\xe9\xb0\xd6\x26\xcb\x1a\xc1\x89\xad\x86\x63\xd7\xa7\x14\xfb\x5c\xd1\x58\x5c\x3b\xf9\x9a\x0a\xa4\x6d\x76\x39\x78\xd0\xb1\x2d\x65\xc4\x38\xbb\xb7\x3f\xea\xa5\x1b\xa2\x6a\x45\x9e\x7b\xea\x25\x43\x94\x66\xc0\x86\x13\xe4\x25\x40\xc8\xc6\xd5\x43\x67\xf2\x21\xfc\xce\x0c\x5e\xb6\xaf\x2f\xaa\x18\x1e\xa2\x15\x21\x80\x9b\xe7\x56\x49\xcf\x8d\xee\x76\x71\xdb\x7f\x94\x8f\x34\x6c\xbd\x03\x02\xbf\x9a\x06\xea\xbc\x72\xe2\xe5\x12\xb3\xdf\x88\x5f\x6d\xaa\x39\x8f\x93\xe3\x6d\xae\x2d\x6a\x04\x47\x81\x21\xf9\x77\x87\xd4\xce\xdf\xf6\xdb\x09\xaa\xf1\x0f\x27\xb1"}, +{{0x27,0x84,0xdf,0x91,0xfe,0xa1,0xb2,0xd2,0x1d,0x71,0x3d,0xe2,0xed,0xc6,0x65,0x24,0x51,0xa0,0xc1,0x59,0x54,0xb8,0x65,0x60,0x62,0xea,0x1d,0xed,0xc2,0x44,0x5b,0x2a,},{0x95,0x56,0xdb,0x53,0x70,0xf8,0xfb,0x3c,0x74,0x78,0xde,0x03,0xd2,0x3d,0xf1,0xcd,0xa9,0x6f,0x27,0x40,0x11,0x8e,0xfd,0xd3,0xd1,0xa9,0xfa,0x4c,0x3b,0xfe,0x88,0x49,},{0x17,0xd1,0x71,0xd9,0x46,0xde,0x35,0x16,0x15,0x84,0x07,0xe1,0x32,0xcc,0x1a,0xce,0xca,0xef,0xd6,0xd0,0x92,0x11,0x2b,0xe6,0x53,0x99,0x95,0x23,0xe2,0x0b,0xd4,0x95,0xf7,0xb7,0xf6,0x00,0xe8,0xd5,0xa6,0x71,0x33,0x0d,0x32,0x69,0x3d,0x60,0x19,0xc0,0x8d,0x2d,0x00,0x3b,0x17,0x6e,0x63,0x19,0xc3,0x53,0x94,0x20,0x0e,0x02,0x7d,0x0e,},"\x2e\x3b\xc5\x4d\xf4\x16\x74\x1d\xbe\x79\x16\xad\x25\xf0\x4e\x48\xd5\xa9\xd7\x7a\x62\x3e\x57\xf9\xcd\x61\xec\xb4\x4f\x09\xf7\x68\x33\xeb\x2a\x3e\x9a\xb7\xaa\x89\xff\x5d\x2d\x56\x0c\x07\x17\x7d\x85\x4d\x7c\x49\xcb\xef\x49\x2b\x7f\x4f\x7e\x56\x7d\xe1\x27\x51\x24\xe1\x6c\xa4\xa7\x98\x01\x62\xfa\x0f\xd1\x62\xa8\xe5\xfd\x6f\x35\x61\x70\x07\x03\x4b\xce\xec\x57\xc8\xfa\xf7\x66\x4f\x4b\x3b\xaf\xfd\xea\x8d\x8f\xc2\xba\x22\xd5\x85\xe9\xe2\xd7\x39\xf5\xff\xc9\x9b\x4e\x0d\xbe\x9c\x36\x86\x54\x7e\xa0\x48\x15\xa5\x9c\x4a\x25\xb5\xf2\x39\x06\x68\xe4\x18\xba\x0f\xcb\xdf\x4c\x4a\x51\xf3\x39\x05\xc7\x4f\xbb\x83\x0a\x19\xf9\xbc\x86\x36\xdb\xaa\xff\x20\x99\x95\x44\x79\x96\xd2\xe5\xb1\xc3\x77\xb4\xcb\x87\xa4\xe1\xef\xe1\x2d\xe3\x4d\x33\x59\x9f\xf3\x97\xb7\x40\x17\xd7\x11\xed\xd3\xe7\x72\x15\x5b\xe5\xa4\x40\x6e\x74\xcb\xe2\x93\x1e\xf5\x13\x59\xaf\xd5\x1b\x5b\x1a\x7b\x3e\xa2\x2e\xe8\xed\xa8\x14\x76\xbc\xc1\x7e\xa7\x68\x0f\x6f\x31\x04\x70\x3b\x9f\x2a\x35\xcf\x26\x27\xeb\x74\x1d\x1a\x30\xaa\x4b\xee\xf6\x57\x9e\xc7\xd0\xb0\x7a\x4e\xf3\x2a\xbc\xb4\xd7\x56\x97\x0f\x70\xa3\x67\x8e\x17\xe6\xe5\x73\x18\x90\xae\xbc\x8c\x92\xb9\x56\xd4\xb3\xb5\xfe\x2a\xdf\xd7\x9b\x21\x1a\x18\x83\xdf\xc8\xc9\xa4\xb1\xb9\xc8\xc1\xbb\x26\x5e\x1f\x3d\xd3\x92\x44\x5e\xa5\x9b\x59\x0a\x01\x95\x51\xf8\x12\x18\x49\xf4\x35\xb3\xac\x1b\x29\x90\x2f\xc8\x39\x25\x54\x05\x6b\x93\x90\x3d\x5f\x26\x3b\x3d\x54\x08\x43\xd6\xaf\xa7\x5a\x2a\xd8\x30\x4b\x76\x90\xde\x99\xa7\x34\xc3\xd1\x30\xb6\x95\x47\xb1\x8b\x09\xe9\x8c\xbf\x25\x27\x30\xe4\xae\xdb\x6d\xc4\xb5\x8b\x22\x43\xfe\x55\xe8\x09\x39\xd3\x7b\x0a\x59\xd7\x22\x26\xd8\xa2\xcc\x51\x53\x09\x5e\x15\x99\x4a\xd6\x21\x95\xaa\x31\x0f\x2a\x64\x26\x67\x6b\x66\x1e\x47\xb9\xfc\xff\xfa\x04\xd6\xdc\x62\x5f\x29\xf4\x4c\x7c\xf6\x20\xb3\x78\xa6\x5d\x23\x83\x44\xb3\x80\x44\x8c\xd1\x19\xcc\x7f\x37\x3f\x62\xcd\xfa\xd6\x41\x49\x90\x63\x53\xf3\xa5\x41\x07\xc5\xdb\xa6\x5e\x3c\xc4\x94\xb0\x53\x1f\x4d\x64\x74\x93\x63\xf2\x30\x73\x8b\x2c\xfe\xed\x98\x35\x20\x22\x7d\xd5\xbc\x43\xbe\x59\xb3\x26\x8e\x28\x32\x16\xf6\xe9\xc7\x5e\x0c\x1c\x71\x27\x2e\x54\xfd\xb2\x9c\x78\x58\xd2\x87\xd1\xef\xa1\x91\x7b\xe3\x7c\x8e\xea\xb5\xe4\x4c\x3a\xd7\xb3\x6e\x8a\xc9\xf6\x69\x91\xeb\x82\xa5\x14\x8e\x59\x72\x03\x4a\xd0\x1c\x62\x61\x5a\x45\x15\x45\x79\xfa\x50\x86\x9e\x7b\xe9\x87\x6b\x56\x56\xea\xad\x2e\x43\x02\x5a\x62\xdd\x13\x4b\x61\x2d\x8f\x4d\x5e\xbc\xf8\x05\x6e\x19\x8b\x71\x34\x38\xe8\xe0\xe3\x47\xca\xfb\xfc\xb8\x9e\x39\x4a\xa3\x30\xd4\xc7\x88\xd4\x9c\x65\x8f\xcf\xc8\x0b\x3e\x00\x78\xf0\xe8\xe1\x9a\xa9\xb8\xfe\x8e\xb0\xba\xb9\x3d\xe7\x85\xd0\x43\xe0\xf4\x75\xae\xb6\x0d\x62\xe3\x8f\xb1\xf8\x38\x4a\x00\xb7\xa9\x02\xda\xee\x13\xd2\x13\x62\x69\xe5\x08\x01\xb8\x0a\x65\xb2\xf9\x13\xcf\xe3\xff\xb3\x65\xd9\xaa\x2f\xd1\x93\x72\xa0\xb0\x22\x56\x95\x44\x4e\x4b\xc5\x48\x71\xd1\x08\xe0\x9c\x7e\x1c\x2b\x42\xdc\xbb\xac\xce\x24\xea\x5b\xd5\xbf\x1f\xcf\x4a\xc6\x97\xa3\xfe\x09\xa5\x46\x77\xb7\xa8\xdc\x8d\x5e\xec\xb8\x6c\xc7\x92\xee\x9b\x6f\xea\x2d\xe1\x6a\x47\x32\x69\xfd\xc6\x5d\xbb\x73\xc2\x58\xc8\x21\x44\x04\x07\xc6\x42\xf7\xd3\xd3\xf5\xc7\x08\xd5\x53\x32\xda\x83\x43\x10\x6c\x19\xb2\x30\xa5\x14\x27\xf3\xb7\x71\x91\x6a\xe3\x68\x8b"}, +{{0x4b,0xb7,0x92,0x36,0xfa,0xda,0x31,0x44,0xb6,0x82,0x96,0x49,0x9b,0xa4,0x4a,0xe5,0x34,0x07,0x4c,0xa9,0x4d,0x4b,0x58,0x1e,0x5e,0xdc,0xff,0xfe,0x13,0xb3,0xad,0x19,},{0x0a,0x83,0x99,0xf1,0xe5,0xa4,0x23,0xdc,0xf7,0xb2,0x5b,0x2f,0xb0,0xac,0x9e,0x1e,0x95,0x48,0x14,0x8b,0xea,0x84,0xd0,0x21,0xe0,0x42,0x87,0x60,0xe0,0x5d,0x58,0xbf,},{0x69,0x8f,0xab,0x68,0x51,0x0d,0xb8,0x12,0x1a,0x46,0x5d,0xb7,0x7e,0x4f,0x8b,0x58,0x6a,0xee,0x89,0x58,0x16,0xe6,0x3b,0xbf,0x0b,0xeb,0x24,0x2d,0xb4,0xe8,0x4c,0x15,0x7f,0x4b,0xe2,0x01,0xae,0x65,0x64,0x51,0x7a,0x87,0x0d,0x17,0xf6,0x0c,0x85,0x83,0x70,0xc0,0x1c,0xca,0x17,0x18,0x9c,0xb4,0x18,0x9e,0x81,0x43,0x91,0xd1,0x50,0x0d,},"\xad\x81\xab\xf6\x93\x7a\x7a\xcd\x7f\x18\x37\xf0\x4d\x3f\x10\xe7\x08\xc6\x1a\x5f\xbe\xde\xee\x4d\xb7\x6e\x15\x98\x57\x03\x84\xe6\xef\xec\xe9\x7c\x92\x5d\x2e\x5c\x34\x88\xca\xb1\x0b\x5b\x52\xb8\xa5\x48\x6e\x99\xd8\xff\xe8\x6c\x19\x81\xa1\xf1\xd5\x32\xdc\xd4\xd4\x89\xe5\x54\x6d\x86\x65\x32\x98\xe7\xa5\xf9\x6e\x81\x44\x55\x2d\xda\x8a\x18\xe7\x5b\x5f\x73\x55\xb1\x35\x41\x62\x11\x06\xe4\x97\xe5\x1a\x56\xd8\x65\x9d\x19\x8f\xe1\x00\x37\xe2\x21\x28\xaf\xc2\x71\x4a\x2c\xb5\xa1\x2c\xc5\xdb\x09\x68\xa3\x43\xef\x91\x8e\x87\x69\xdd\x6a\x3e\x5b\x9e\x32\xaa\xb6\x6c\xb0\x23\x9e\xbe\x4c\x17\xf1\x82\x18\xe2\x52\xeb\xa6\x16\x2e\x97\x70\x49\xeb\xac\x0b\x38\x04\x8b\x3a\xaf\xb7\xd4\xd7\x22\x63\xe9\x21\x28\x99\xa3\xbf\xe0\xa6\x9c\x99\xe2\x2a\xc6\x1c\x5e\x96\x12\x45\x63\x03\xd9\x24\x58\xb5\xc5\x02\x91\x6c\x34\xa8\xee\x5c\xd9\xa5\x82\xa5\x25\x76\xb6\xdc\x9d\x7d\x4c\x64\x2f\x21\x29\x98\xbf\x33\x58\xd4\xa8\xc2\xea\x67\x68\x6e\x55\xd4\x89\xf6\xa7\x6e\x6b\x07\x0e\x6e\x99\x5a\x74\x53\x26\xc9\xaa\x63\x63\x0a\x00\x33\xad\x30\x72\x1a\xa6\x5f\xac\x60\x4a\x6e\x58\xc7\x50\x72\x1a\x56\xca\x67\x60\xc9\x41\x34\xd6\x11\xfa\xb4\xd3\x54\xe4\xf6\x6a\x29\x67\x7b\x1a\x66\x66\x01\xe9\xda\x79\xf2\x13\xf5\x82\x03\x74\x33\xc0\x7f\x94\xd5\xf0\xde\x6a\xa9\xfa\xa0\xb3\x2f\x7b\x02\x3f\xb9\xfc\x13\x5a\x26\xf9\x70\x52\xac\x80\xb3\x9b\x30\x6a\xed\x13\x92\x6c\x28\x54\x19\xa2\x9b\x20\xe2\x37\x0d\x8a\x09\x5b\x32\x25\x8f\xa9\x89\x34\x89\xee\x21\x08\x9c\x75\x2e\xc0\x62\xe1\x20\x35\x9e\x2f\x35\x15\x12\x82\x54\xc8\x09\x8c\xca\x65\xa9\x1a\x02\x2d\xd0\x57\xa2\xc2\xa1\xb6\xb8\x5d\x13\x7c\x3c\x96\x7d\xcb\x70\xaa\x17\xa2\xff\x4b\x37\x67\x8b\x38\x29\x02\xf0\xf9\x31\xee\x74\x3f\xc3\x98\xac\x1b\x8c\x10\x46\x98\x67\x30\x84\x79\xe4\x0d\x7f\x2f\x04\xa4\xb0\x4c\x44\x89\x15\x84\x88\xdd\xb7\xbe\xc5\xa4\x7f\x20\xff\x35\x6d\x99\xa1\xb3\xe9\xd0\xb7\xfe\x9b\x0a\xd9\x49\xf2\x98\x96\x0e\xfa\x4d\x97\x28\xf8\x10\x1c\xf5\x3d\xa3\xbf\xfd\xd9\x52\x4b\xf4\x40\xa5\x8b\x32\x73\x8d\x0b\x62\x93\xe8\x53\xf4\x66\xff\xd4\x2c\x56\x07\xac\x9e\x35\x3b\xa0\x3e\xfb\x57\x8c\xc9\x96\x3d\x8a\xaa\x9d\x2e\x26\x6d\x1d\x2a\xe9\x29\x6f\x30\xc9\xef\x44\xec\x69\x10\x30\xd5\x96\xa4\x01\xb6\xce\xe7\x2a\x54\x0e\xf3\xc4\x2e\xc0\x17\x42\x66\xba\x54\x01\xf3\x54\xad\xc8\xe2\x54\x04\x43\x7e\x88\x8b\x08\x28\x69\x39\xbe\xde\x30\x8a\xcd\x30\x32\x7e\xbf\xf0\x62\x70\x09\x7c\xc2\x94\xf0\xa0\xf3\x9f\x9a\xa3\xc6\x65\x85\xca\x47\xe6\x0c\x4b\x8e\xa3\x60\x89\xeb\x8a\x90\x88\xbb\x18\xb0\x34\x31\x35\xbb\x6a\x45\x6d\x2f\x6a\x3b\xf3\x90\x72\x3e\x78\xb4\x2c\x03\x7c\x2d\xe2\xe1\x43\x2c\xaa\xd3\xa5\x94\x02\x12\x94\xd4\x3f\x5b\x15\xa2\xe8\x19\xdc\x74\x8e\x45\x1d\xe4\x00\x68\xc8\xf0\x32\xf1\x3b\x47\x11\x37\x70\x12\xed\xcd\x4f\x11\xde\xc1\x11\x1b\x12\xeb\x6e\x1b\x00\x63\x38\x18\x70\x6d\x71\x32\xd9\x91\xce\x20\xdf\x3b\x92\x1d\xb2\x18\x5e\xe2\x5b\xb6\xf5\x82\x75\x76\xec\x01\xad\x89\x0f\x79\x79\x3b\xaa\x35\x8c\x2b\xbf\xb6\xfa\xad\x11\xd8\xcb\x0d\x0d\x2d\x2b\x29\x81\xfb\xf4\xe3\x72\x34\x9f\xc6\xa0\x1c\x36\x07\x7b\x59\x32\x5f\x70\x2b\x38\x00\x59\xa6\x5c\xf2\xf5\xea\x98\xd6\xbd\xc8\x15\x20\x53\xb8\x5b\x28\xc8\x1e\x41\x3c\x4c\xac\x7e\x22\x6c\x13\xdb\x32\x67\xd2\x18\x30\xf0\xe5\x43\x11\x02\x91\x70\x05"}, +{{0xaf,0xd7,0x65,0xe6,0xaa,0xc0,0x14,0x6d,0x48,0x11,0xef,0x95,0x97,0xbc,0x3f,0x44,0x76,0x3f,0x03,0x37,0x8b,0x7b,0xe0,0x33,0xd6,0xe6,0x4c,0xa2,0x9d,0xec,0xae,0xf9,},{0x6b,0xb7,0x61,0x23,0xd9,0x25,0x89,0x22,0x68,0x6c,0x53,0xfb,0x69,0x17,0xb9,0xa4,0x59,0xca,0xbd,0x30,0xbe,0x8c,0x43,0x97,0x0d,0x80,0xf5,0x35,0x0c,0x2d,0x98,0xef,},{0x3d,0xc9,0x19,0x4d,0x50,0x81,0x14,0x19,0x04,0x9e,0xaa,0x07,0xb6,0x55,0xb7,0xd4,0x06,0x4b,0xcb,0x0e,0x7f,0xb5,0xf9,0xe5,0x32,0x6b,0x5f,0xc8,0x56,0xfc,0x0a,0xb8,0x70,0x59,0x73,0xae,0x10,0x01,0xdf,0x55,0x37,0x39,0x77,0xdd,0xe2,0xd9,0xb8,0x10,0x79,0x55,0x14,0x14,0xad,0xc7,0x1c,0xc8,0x52,0xd4,0x99,0xb0,0xcf,0x82,0x4f,0x07,},"\x18\x3b\x10\x92\xc7\x90\x4e\x47\xa1\x42\x03\x17\xa2\x5d\x0f\x59\x11\x0a\xa8\x4d\x6b\x34\x19\xad\x45\x68\x65\xc4\x3b\x29\xe9\xd1\xda\xcf\x75\x5d\x9e\x5c\xf9\x4c\x55\x91\xd5\xd9\x12\xd0\x5c\xa9\xa5\x2d\x01\x5d\x6e\x8f\x5d\xc9\x4e\xfd\xce\x0d\x7c\xf5\x65\x12\x03\xb1\x1e\x54\x27\xa9\xf6\x79\x42\x9e\x00\x41\x4a\x48\xea\xb1\x3f\xd8\xe5\x8b\x87\xeb\xa3\x9d\x10\x25\xd6\xa1\x8b\x2c\xdc\xbe\x14\x74\x36\xdb\xf3\x8a\x1c\xe8\x64\x13\xae\x31\x87\x65\xe1\xbb\x1d\xf7\xe2\xb3\xbe\x97\xe9\x04\x08\xb1\x17\x17\xcf\x45\x9b\xcd\x0f\x3c\xac\x58\xb4\xa0\xd3\x5b\xff\xb5\x33\xe2\x0d\xf3\x74\x51\xc1\x14\x01\xce\x1d\xab\x02\x05\x5c\x7e\x08\xc5\xec\x46\x39\x0c\xd6\x17\xa6\xb5\xf2\x2f\x65\x18\x30\xa1\x11\x2a\x06\xed\xe4\xc4\x0a\xb7\x95\x78\x51\xd6\xc6\x6f\x17\x1c\xd1\x62\x41\x59\x09\x00\xb8\x52\xa3\xd0\x19\x95\x7b\xe1\xb7\xbb\x7a\xcb\x89\x23\xf2\xa3\x57\xc3\x26\x44\x56\xcf\xca\x9b\x42\x9d\x71\xfe\xcb\x7e\xda\xe3\x9b\x25\x2b\x4e\xb6\x10\xe8\xc7\x18\x83\x56\x99\x75\x4b\x8d\x41\x24\xb4\x92\x48\x8e\xde\x62\x61\x0c\xce\x44\xb5\x92\x18\x66\x3b\x6c\x96\x46\xa1\x4a\x84\x17\xed\xdb\xb6\xf4\xfb\xe5\xa4\xbb\xbb\x48\x2b\x37\xa4\x45\xe3\xc1\x6b\x65\xa1\x41\xcd\x3e\x12\xa5\xb2\xc0\x48\x1d\x61\x4d\x6d\x20\x84\x79\xb9\xb2\x09\xb8\x28\x85\x4d\xae\x0e\xa1\xed\xed\x50\x65\x55\xfe\x18\xe1\x85\x40\x05\xcf\x00\x1a\x80\x77\x08\x34\x98\xd2\x7f\xad\xf1\x18\x28\x6b\x53\xb8\x97\x4d\x69\xfa\x28\x25\xbe\x8c\xa3\xd6\x03\x6a\x92\xca\x52\xf9\x1d\xde\x6d\x5b\x1f\xfe\x28\x88\xf4\xd6\x07\x79\xfa\xd1\xfb\x41\xd8\xc0\x71\x40\x49\xaf\x68\x1b\x75\x5f\x2d\x42\x04\xee\xcd\x09\xe0\x77\x21\x0a\x48\xa1\x95\xe7\x2c\x80\xe1\x27\xc3\xd4\x87\x50\x95\xc6\x57\x0a\x1f\x78\x09\x59\x07\x52\x8c\xf7\x74\x6f\x31\xd9\x71\x11\xc6\xf4\xcb\x25\xb3\x74\x12\x99\xa7\x57\x48\x22\xd4\x6b\x6e\x79\xed\x23\xc2\xfe\x05\x7b\x3a\xc7\x29\x0b\x46\x0b\x16\x6e\xe9\x0a\x45\x56\x2e\xff\xed\xcc\x6b\xa8\xf4\x79\x5f\x73\x95\x81\x8d\xb5\x6b\x6e\xdd\x59\xca\x2c\xc4\xae\xa1\x84\x1f\xd9\x56\x5b\xec\xd6\xc0\x81\x04\xcd\xee\x26\xba\x9d\xe2\x00\x77\x3d\x09\x1b\xc7\x7a\x57\xc5\x47\xf1\xa6\xba\x0a\x2c\xd7\x17\xab\x32\x56\x1d\x74\x22\xea\x72\x35\xad\xb0\xcb\x36\xbf\x5c\xbd\xf8\x8f\xca\xe0\x66\x30\xa1\x56\x47\xd9\xa3\x57\xb4\xe0\xe5\x02\xd2\x73\xf3\x79\x6a\x51\xe0\xbc\x3f\xed\xbf\x7a\x1e\x64\xaa\xd7\x22\xaa\xc5\xfd\x02\x2f\xa7\x9d\x60\xfc\x70\x73\x25\xf1\x27\xeb\x1f\x03\x86\x87\x95\xcc\xdc\x0b\x4c\xb2\x6f\x20\x23\xd1\x52\x15\x3a\x97\xa2\x60\xbf\xf1\x17\x45\xd2\xe2\xcc\x0b\xf8\x60\xd4\xa6\xe3\x58\xa6\xd8\x17\x6d\x2a\xc1\x78\xa9\xae\x1a\x2d\xc7\x5e\x8b\x49\x04\x08\xff\x7c\xdf\x99\x13\x29\xf3\x3c\xb0\xc0\x5e\x1e\x35\x69\x25\x08\x7e\x0b\x8d\x96\xa5\x23\x51\xd1\xd1\x77\x68\xeb\x13\x4c\xdb\x21\xa1\x54\x6a\xae\xdc\xc6\x87\xdf\xa1\xb2\x2e\x92\xfb\x52\x41\xa8\x36\x77\xa1\x53\x44\x5b\x77\xd5\xe7\x03\x50\x8e\x2a\xbc\x58\x8a\x9f\x42\xe5\xbc\x71\x06\x73\xe4\xdd\x8a\xd7\x03\xfa\xb2\xd7\xdb\x1e\xb8\x42\x26\xc8\x9d\x87\x62\xa7\x09\xe3\xe9\x13\x8a\x1f\xa7\x90\xf2\x92\x9b\xff\x61\xbc\x1e\xa6\xe8\xaa\x1a\xd0\xe3\x88\x7d\x70\xa5\x6d\x4e\x65\x47\xfc\x60\x6a\x50\xd3\xbe\x3b\xd6\xdb\x03\x66\x3e\x00\xca\x9e\x4f\x24\xfe\x8c\xbf\xd7\xd8\xc9\x73\x8d\x63\x67\x55\x4b\x7b\x60\x1f\x74\x19\x0b\x59\x70\xa3\x98"}, +{{0xeb,0x34,0x71,0x45,0xf3,0x39,0xed,0xd8,0x02,0x78,0x5b,0x6f,0xbe,0xcd,0x5c,0xb8,0x08,0x89,0xac,0x7c,0xe4,0xeb,0xad,0x2f,0x67,0x07,0x67,0x65,0xdb,0x93,0x9b,0xca,},{0x99,0x4a,0x45,0x6e,0xad,0xa0,0x30,0x20,0x92,0x1c,0x3d,0x10,0x9c,0x13,0x5e,0xb9,0x61,0xfc,0xd4,0xa0,0xa4,0x00,0xba,0xfd,0x32,0xca,0x06,0x1b,0xbc,0x86,0x25,0x43,},{0xfd,0xbd,0x15,0xe1,0xe6,0x46,0x9d,0xf7,0x20,0xd9,0x55,0x2c,0xb5,0xdd,0x17,0x7b,0xcb,0xd2,0x92,0xfc,0xda,0x83,0xcd,0x93,0xc8,0x8d,0x01,0x14,0x91,0x2d,0xc8,0x70,0x31,0x09,0xba,0xc0,0xd4,0x59,0xac,0xe9,0x95,0x7d,0xf2,0x29,0x3a,0xc1,0x6d,0x40,0xd5,0x14,0x89,0x35,0x56,0x85,0x32,0x99,0xb9,0x7b,0x4f,0xd4,0x13,0x7a,0x3d,0x00,},"\x5b\x8b\x31\xba\xf8\x84\x83\xf0\x95\xb5\xd0\x2e\x17\xd8\xb7\xb4\x6c\xf4\x64\x60\xe6\x4c\x6b\x02\xc5\x6d\x8d\xaf\xe3\x48\x23\x70\x6c\xb5\xc1\x5f\x33\x8a\xd9\xb5\x65\x86\xa9\x49\x71\x1a\xa7\x31\x2c\xc9\x34\x50\xd2\xfb\x9a\xf4\x61\x3f\xc3\x07\x93\xa6\x31\xa5\x5c\x14\xe5\x3c\x0c\xb1\x5f\x06\x11\x63\x99\x39\x8c\x8d\xd6\x18\x76\xc6\x29\x15\xf9\xf9\xe4\xcd\xf8\xf7\xd8\x9a\xde\x12\x9e\x6d\xde\x7d\x63\x67\x1a\x18\x63\xf5\xda\x8f\x42\xea\x64\xc0\x79\xec\xb9\xa2\xc1\xb1\xdd\x9a\xda\xe6\x0e\x96\xb9\xcb\xbc\x76\x24\x53\x2a\xa1\x79\x75\xeb\xa1\x7a\x7a\xf0\x2b\xfb\x21\x9a\xac\x02\xb3\xd4\x30\x6c\xd3\x89\x33\xa8\x50\x60\xcd\x62\xab\x51\x3a\x39\x65\xb0\x91\x50\xa4\x88\xc9\x2b\xf7\xca\xb0\x48\x2e\xee\x56\x46\x3f\x01\x39\x00\x9b\x9f\xbb\x3f\xf4\xec\xae\x21\x1f\x42\x8b\x5b\xfb\x88\x76\xf0\x04\x98\x3b\x90\xc4\x47\x84\x6c\xa4\xb7\x45\x66\xe9\x79\xbc\x30\xc9\x5e\x99\xfa\xab\x69\xa3\xeb\xbf\xe4\xda\x60\x34\xc8\x2d\x63\xe9\xc5\xcc\xaf\x84\x86\xaf\x3b\x5e\x0d\x38\x14\x22\x93\x8b\x0c\x22\xf5\x16\x95\x5b\xdc\x36\x94\x31\x73\xf5\x83\x27\x08\xa3\x3c\xf5\x2d\x88\x75\xd9\x7f\xde\x58\x5b\x49\x17\xe4\xad\xec\xdd\x1e\x79\x85\x67\x62\x03\x3a\xf2\x2f\x25\x4b\x50\xce\x9d\x0c\x70\x0e\x77\xa7\x31\x55\x4f\xa0\x11\x3a\x0c\x66\x66\x83\xf3\xfd\xb1\x9e\x3a\x42\x63\x02\x23\x0b\x63\xe3\x3a\x78\x5e\xf2\x4a\x92\x89\x45\x5b\x3b\x8f\xc6\x18\xff\xfe\xf4\x9c\x2c\x6e\x48\xfd\x4b\xb4\x22\xf5\x04\x14\x9d\xe2\xb4\xc0\x35\x5c\x36\x34\x08\xe6\x6d\xa8\x1c\xbb\x58\x15\x52\xa4\x11\xe3\x64\xfe\x3e\x4c\xa9\x6d\x70\x72\xab\x07\x2e\x75\x68\xc1\x3d\x35\xe4\x1c\x78\x25\xa1\x3a\x5c\x68\xfb\x9f\xb5\x98\x8b\xbb\xfb\x9a\x0b\x51\x16\x57\x64\x66\x0c\xdf\xa2\x41\x1f\x3d\x42\x16\x5d\xa1\x87\xc5\x8e\xde\xf0\x10\x5a\x6d\xb1\x77\x42\x05\x43\xe9\x58\xd5\xd5\xe8\xa3\x71\xf7\x98\x70\x51\xc4\xe1\x78\x6d\x01\x8e\xb3\xd7\x32\xc2\x10\xa8\x61\xac\xaf\x67\x1b\xe9\x5b\xb6\x3f\xbc\x88\xbf\x8b\xe7\xbe\x53\x90\x93\x9c\xd9\xfb\x2a\xcf\x39\x81\xdd\xa6\x1b\x78\x7a\x7b\xbd\x78\x46\x8e\x1d\x32\xca\x46\xaf\x8f\xb3\x2a\x18\x46\x3c\x18\x0f\x52\x4b\xe1\xda\x91\x0d\xa5\x50\x8d\x42\xa0\x05\x17\x41\x22\x7c\x9b\x62\xde\x6d\x19\xb3\x3c\x0b\xd4\x80\x67\xb0\x35\x85\x9a\xd9\xbd\xc2\xdd\xd9\x7b\xef\xca\x31\xe6\x5a\x88\x6c\xfc\x75\x3a\xfc\x4f\xf2\xa7\x21\x2a\x89\xd3\x7c\x04\x6c\xdf\x39\x99\xc0\x51\xff\x13\x96\xbd\x99\xcb\x54\x94\x56\x39\xeb\x64\x62\xdb\x9e\xce\x84\x07\x7b\x0b\x3d\x6b\x3d\xf3\x95\x2d\xd3\x67\x56\xc6\xda\xb2\xab\xc2\x5a\x51\xbf\x32\xc1\xe9\xcd\xd0\xa7\x28\xa7\x98\x5f\x7b\x7e\x0d\x9c\x1a\x6f\x66\xce\x12\x16\x37\x3d\x25\x2d\xaf\x59\x58\xf2\xe8\x97\x3f\xd2\x68\xfa\xd0\xef\xe2\x51\xce\x76\xfe\x47\xbd\x0a\x4d\x0c\x4f\x10\x17\x94\x9d\x4c\x2b\x16\x71\x72\x18\xe1\x49\x15\x4e\xd6\xfb\xe5\x6f\x86\xd8\x2e\x19\xef\x0a\x91\x63\x19\x12\xf2\xa8\xf3\xde\xbb\x00\x76\x6b\x61\x77\x80\x2f\x4b\x2e\x79\xf6\xe7\xbf\xa9\xc6\x2c\xfa\x2f\x75\xcd\xb6\x04\x92\x63\x0a\x85\xc9\xb4\x31\x77\xd2\xdd\x9b\xa8\xd0\x54\x8a\xbe\x24\x92\x3a\xe8\x44\x3e\xea\xdc\xd0\xf5\x8a\x7b\x82\xdf\xf5\x0d\x88\x40\x03\x88\x9c\xb5\x60\xf7\xac\x53\xe7\x10\xa7\x55\x75\x36\x24\x64\xb1\xaa\x43\xd2\xa9\xb2\x2f\x2b\xd2\x16\x2d\x30\x2f\xaa\x74\x52\x34\x4c\xe7\xad\xe9\x98\x36\x87\xb6\xc6\x8e\xca\x47\xdd\xdb\x28\x9b\x15"}, +{{0x32,0x08,0x83,0x7d,0x15,0x54,0xb6,0x51,0x1a,0xdd,0xa0,0x9c,0xba,0xe5,0x65,0xda,0x78,0x43,0x9a,0x47,0x2a,0x5d,0x1b,0x10,0x7c,0xe0,0xa9,0xb1,0xd7,0x75,0x7d,0xb7,},{0x9b,0x52,0x5e,0x35,0x36,0x8a,0x92,0x1e,0x3a,0x2e,0x9a,0x35,0xa4,0xde,0x9e,0xa4,0xc4,0x36,0xca,0xba,0x27,0x12,0x3e,0x5c,0x36,0x9e,0x2a,0x6c,0xf5,0xc9,0x0a,0xb6,},{0x70,0x9d,0x1c,0xa9,0xca,0x2f,0x74,0x2a,0xb9,0xdd,0x0b,0x04,0x93,0x35,0xf5,0x44,0xcf,0xfb,0x2f,0x1a,0x36,0x93,0xd5,0xf5,0x3f,0x8b,0xa0,0x83,0xb9,0xb0,0xd8,0x6e,0x52,0x08,0xfa,0x8e,0x1e,0x81,0x56,0xc9,0xcc,0x22,0x42,0x77,0x5a,0xbb,0x7e,0x15,0xaf,0x30,0x85,0x86,0x8e,0xf4,0x57,0x63,0x4e,0x99,0x26,0xc4,0x04,0xec,0xf3,0x0f,},"\x43\x6a\x3c\x31\x76\x3f\x93\xd4\xd5\x46\xc6\xd1\xec\xfb\x7a\xe4\x59\x16\xaf\x75\x4f\x83\x9d\xcf\xe9\x6d\x6b\x69\xc6\x12\x14\xd0\x16\xfc\x84\x2f\x56\x46\x2a\x3f\x07\xf6\x61\xb2\xe2\x50\x5a\xcf\xaf\x48\x2a\x0b\x0f\x4f\x55\x01\xee\xc4\xb2\xd2\xd7\xd4\x44\x54\x4d\xe0\x00\xb9\x90\xf4\x36\x3d\x3f\x98\x3f\x5d\x4e\x09\x30\x97\x52\xff\x57\x9c\x73\x20\xc9\x15\x95\x1c\xc3\xa1\xe3\x23\x8c\x1b\xa7\xa1\x91\x30\xea\xbf\x6a\x37\xf5\xf0\xbc\x56\xe2\x52\x42\xf7\x52\x06\x1f\x3c\x63\xac\xad\x99\x2a\x75\x01\xe9\x67\xde\xb9\x25\xb3\x0e\xd1\x05\x43\x1e\x58\x21\x02\xfa\x4f\x30\x8c\x2f\x06\x83\x61\x2b\x56\x68\x6d\x52\xda\xed\x69\x43\xa7\x21\x9f\x3b\xee\xa2\xe0\xa2\x92\x42\xe8\x6d\x55\x62\xff\xab\x83\xb5\x6b\x26\x33\x26\x66\x4e\x02\x9e\x96\x1e\x70\x17\xd8\xe8\x9f\x5e\x3e\x1d\x10\xf5\x93\x28\x54\x55\x0c\xe6\xe5\xcd\x76\x97\x1f\xd2\x35\xcf\x9c\x00\x27\xd0\xcf\xed\x33\x15\xc2\xcb\xf1\x85\x08\x62\x4d\x8a\xcf\x04\x7f\x9b\x96\x8f\x90\x7d\x9e\x6f\x4c\xfa\x5e\x45\xc8\x0a\x27\x2c\x2d\xbb\x62\xc5\xd4\x19\x45\x80\xdf\xab\xed\xd8\x2c\xb4\xd7\x64\x92\x34\x4b\xe9\x6c\xcf\x5d\xaa\xf6\x1e\x6b\x2b\x55\xef\xdb\x3f\x65\x21\x0a\x3d\x6e\x1f\x36\x98\x87\xca\x0e\xa0\xd5\x8c\x3d\x14\x6a\xe3\xcf\x9b\x00\x00\x76\x88\x41\x15\xfa\x51\xb5\xfd\x66\xbe\xc0\xcc\xbf\x0d\x29\x20\x19\x6a\x7d\x7a\x38\x44\x5f\xbe\xd2\x2d\xfc\x75\x64\xdc\x56\xf6\x0d\x6e\x29\xe5\x92\x48\x53\x74\xc6\xbd\x1e\x5b\x15\x93\x1b\x69\xca\x6e\xe6\xb3\xaa\x25\x25\xc2\x35\x85\xf0\x92\x9f\x31\xcb\xd1\x1f\xb1\xa5\x33\x02\x16\xb9\x0a\xe5\xa6\x56\xdf\x7a\x07\x4c\xec\x64\xe5\x98\x18\x4f\x50\x3f\xb2\x3c\xc0\x5e\x65\xda\x9a\xe7\xe8\x44\x1f\x40\xe2\xdc\x26\xb8\xb5\x6d\x2c\xb5\x23\xa7\xc6\x35\xdc\x08\x47\xd1\xcd\x49\x8a\xbf\x75\x6f\x5a\x13\xea\x14\xf8\xfa\xb2\xc4\x10\xb1\xa4\x70\xf4\x9a\xa8\xdc\xa4\xac\x02\x56\xb1\x18\x00\xde\x0d\xd0\xec\x42\xb1\x42\xc5\x61\x12\x8d\x35\x7e\x78\x3b\x12\xf6\x1c\x66\x8f\x5e\x6e\x06\xb7\xb4\x8b\x7b\x22\x54\xde\x5b\xdc\x18\x04\xb7\x23\xd5\xfd\x6a\x0f\x4b\xc7\xc5\x9e\x7c\x50\x54\x18\x26\x13\xbb\xd2\xfa\x92\xb4\xc1\xda\x16\xbc\x8c\x97\xe1\x6b\xcb\x0d\xbf\x8c\x92\xb7\x48\x99\xb3\x7f\x31\x87\x57\x14\x0b\x6c\x4f\xd5\x35\xe2\xe1\xe0\x57\x0a\x50\x81\x8c\xf7\x8f\xb9\x88\xe1\xf4\xce\x40\xe7\x6e\x8f\xe3\xd6\x97\xd7\xa4\x58\x50\xf2\x93\xce\x17\x0f\xd8\xab\x07\xcf\x15\x34\xea\x5f\xfa\xd3\x4f\x6f\xcf\xa4\x2d\x0d\x21\xa9\x1d\xfb\xfe\x05\x97\xc7\x3f\xd9\xb9\x76\x76\x14\xeb\xdf\xd0\x2c\x3a\xc0\xc4\x9a\xd1\x0c\x94\xbe\x59\x69\xee\x08\x08\xc0\xa3\x0b\x2a\x1e\xaa\x90\xea\x43\xb8\x57\x5c\x30\x56\xf4\x23\xcd\x4b\x6f\x34\xae\x51\xc2\x22\x37\x65\xa9\xea\x21\xf6\x45\x73\xc1\xa1\x39\x61\x32\x12\x46\xe3\xb5\x34\x9e\xe0\x48\xfb\x62\xd5\xfb\x61\xb1\x71\x43\x91\x18\x25\x62\xb9\x15\x98\x36\x0e\x5f\x9b\xf4\xac\x80\xdb\x24\x64\x32\xaf\xb3\xa4\x3d\x34\x96\x50\xde\x03\xd3\x43\xc2\xe9\x7a\x8e\xef\xd1\xbf\x30\xc1\x0c\x25\x86\x7f\x53\x26\x6b\xd1\xf0\xdc\x14\xae\x1a\x6b\xe9\xef\xde\xcf\xf6\x7e\x7d\x29\x2c\x6c\xdf\xc9\x0d\x80\xb8\x86\x66\x8f\x04\xc2\xa0\xf5\xad\x7f\xa1\x7c\x17\x8b\x6e\x9b\x45\xa1\x1f\x4d\xdf\xe2\xd6\x69\x60\xa3\xf7\x51\x35\xad\x5e\xd1\x54\xe5\x13\xe1\xa5\xd1\x38\xe7\x37\x1e\x84\xd7\xc9\x24\x53\xe6\xc6\x2d\xc5\x9b\x8e\x1f\xa9\x3d\x77\x3a\x25\x40\xd9\x1c\x25\x7c"}, +{{0x4e,0xc6,0x82,0x9b,0x43,0x99,0x70,0x56,0xd9,0x96,0x85,0x38,0x9b,0xd5,0x3c,0x52,0x8d,0xe7,0xe5,0xff,0x27,0x15,0xd6,0x5c,0x95,0x66,0x19,0x82,0x6e,0x3f,0xb5,0xb5,},{0x7d,0x92,0x2d,0x57,0xfd,0xb1,0x27,0x92,0x87,0x9a,0xec,0x4e,0x8c,0x65,0x14,0x63,0xec,0xe0,0x64,0x49,0x2c,0x72,0x17,0x53,0xd2,0x2e,0x11,0x55,0x09,0xfe,0xd7,0x06,},{0x15,0x9c,0xa4,0x04,0xf7,0xf7,0x41,0x17,0xc5,0x16,0x3c,0xf4,0x04,0x11,0x09,0x49,0xeb,0x57,0xae,0x2d,0x76,0x62,0xb1,0xff,0x41,0x78,0xcc,0x67,0x56,0xe9,0x0a,0xda,0xea,0xb7,0x1b,0x06,0x4c,0xe1,0xdf,0xf4,0x57,0xb2,0xdb,0xa7,0xe2,0xdc,0x13,0xc2,0x17,0xbc,0xae,0x8a,0x61,0xfc,0xf8,0xce,0x14,0x87,0xa6,0x49,0xc2,0x57,0xff,0x07,},"\xed\x26\xb4\x13\x0d\x4e\xbf\x3f\x38\x61\x49\x1a\xa3\xdd\x96\xa4\xeb\x69\x75\x21\x73\xfa\x6c\x84\xca\x65\xdf\xc9\x91\xc7\xfe\x44\xe0\x2b\xd6\x16\x50\x25\x2a\x1d\x23\x78\x66\x82\xec\x38\xc1\xfe\xe8\x2c\xc3\x50\xdb\x7c\x3c\x39\x49\xa1\xc9\x35\xff\xeb\xd7\xba\xa2\x4f\x35\xa3\x93\xfb\xd2\x7e\x7c\x34\xc2\xf9\xff\xda\x60\xa1\x8d\xf6\x6c\x3e\x46\x5d\x90\xed\x48\xfb\xba\xd3\xfa\x79\x47\xde\xe7\xe6\x59\xa3\xee\xad\xb8\x87\xf0\x96\x3f\x6b\xdd\x76\xc3\x6c\x11\xae\x46\xd0\x88\xee\x50\xbc\xa8\x18\x7a\x0a\x88\x32\xdb\x79\x84\xb7\xe2\x7c\xbe\x6a\xbf\x12\xd2\xc9\x4f\x33\x7e\xc7\x8c\xb3\x8b\x26\x24\x1b\xd1\xa3\xd2\xf5\xfa\x44\x07\xfd\xd8\x02\x27\xd2\xb1\x70\x14\x4b\x41\x59\x78\xe3\x72\x01\xd0\xfc\xf4\x31\x74\xb9\xd7\xb2\x11\x5d\x5e\xb8\xbc\xec\x27\x6a\x77\x5a\xea\x93\xf2\x34\x0d\x44\x25\xd3\x4d\x20\x47\x49\x4d\x91\x7e\x0d\xbe\x37\x85\x7e\x6c\x99\x85\x9b\x71\xc9\x14\xaa\xd5\xe5\x4f\x7b\x2b\x03\x3e\x59\x4e\x27\x2c\xc5\xcf\xe9\x19\xf8\x88\xe5\x5c\xb6\x15\x7a\xff\xcf\x35\x72\x46\xd0\x0b\x53\x2c\xc4\x71\xb9\x2e\xae\x0e\xf7\xf1\xe9\x15\x94\x4c\x65\x27\x93\x15\x72\x98\x53\xda\x57\x2c\x80\x9a\xa0\x9d\x40\x36\x5f\x90\x87\x5a\x50\xd3\x1c\xa3\x90\x0d\xa7\x70\x47\xc9\x57\xc8\xf8\xbf\x20\xec\x86\xbd\x56\xf9\xa9\x54\xd9\x98\x8e\x20\x6b\x44\x4c\xa5\xa4\x43\x45\x21\xbf\xc9\xc5\xf3\xa8\xa0\x61\x47\xeb\x07\xd1\x1d\xfe\x11\x71\xec\x31\xff\x55\x77\x15\x88\xb3\x33\xee\xe6\x21\x5d\x21\x6c\x47\xa8\x56\x6f\xbb\x2b\x18\x97\x46\x46\xac\x5a\x92\xc6\x99\xd7\x75\x84\xc0\xde\xfe\xfd\x2d\xfa\x58\xfc\xa2\x71\x99\xe4\x1e\xc5\x8a\x24\x63\x20\xb3\x5f\xaa\xb7\x5b\x97\x95\x19\x24\x22\x6d\xa4\xab\x28\xf0\x1b\x47\x07\x8e\x71\x2e\x4f\xd9\xf7\x7b\x25\x1c\x96\x67\x85\x8c\x28\xe3\x2e\xf1\xcd\x01\xfc\xbe\x43\x5c\x54\x2d\xba\xd0\xa8\x4a\x13\xcd\xbb\x57\x75\xe6\x2d\x81\x1d\xc6\x90\xd9\x55\x5c\x37\xf1\x5f\x91\x76\x7a\x56\x13\x57\xdf\x10\x6e\xef\xe0\x56\xe7\x36\x06\x70\x65\x0f\xb8\x18\xfc\x6a\xdc\x59\x97\x3e\x9a\xd5\xcd\xcd\x80\x98\x07\xab\x56\x39\x7f\x3c\x13\x94\x87\x32\xd9\x8d\x67\x6f\x4a\x44\x70\xa9\x5d\x8b\x51\x82\x37\xe2\x26\xf0\xcc\x5f\x47\x65\x16\x4a\x5c\x3e\xf0\x50\x71\x4b\xe0\x2a\x12\x6b\xe8\xf6\x65\x46\x48\x15\x81\xb9\xe9\x4a\x26\xaa\xd2\x4c\x69\x3b\x7f\xdb\xc1\x8a\xcd\x3e\xd7\xcf\xc4\x7d\x8a\xb2\x67\x45\xd7\x8e\x70\x1d\x0c\xf0\x5d\xd8\x44\xb5\xb3\x45\xa2\x9d\xab\x68\x4c\xbc\x50\x92\xba\x02\x2e\x3c\x58\x2d\xfc\x04\x4c\x31\x00\xad\x02\x75\x66\x97\xa8\x49\x82\x29\x15\xa1\x6e\x2a\x2b\x81\x0e\x68\x15\xf5\x44\x21\xd2\xf3\xa6\xff\xf5\x88\xc0\xd9\x01\x3c\x76\xf3\x3e\x09\xbe\xae\xef\x60\xd8\x77\x42\x30\xe8\xce\x71\x31\x28\x9a\xef\x2a\x40\x68\x6c\x81\x9f\xb2\x04\x0b\x06\x12\x4d\x3d\x9a\xa4\x19\xd5\x67\x88\xf1\x7f\xa7\xed\x9b\x9b\x57\xce\xaa\xd1\x33\x7a\x01\x01\xbe\xa0\x44\x0c\xff\x74\x5d\xdd\x97\x22\x05\x5d\x1f\x9b\xcf\xb0\x09\xce\x2c\x2f\x41\xa9\xe7\xe8\x68\x06\xb8\x72\xcd\xc2\x05\x9b\xc8\xec\x68\xf5\xee\x56\xc4\xba\xcf\x4b\xbd\x30\xea\x4c\x71\x55\x86\x4d\x60\x0c\x0e\x2e\xee\x73\xb3\x19\xbd\xa4\x37\x2e\x9c\x60\x3c\x77\x2c\x25\x89\x0c\x76\x10\x48\x99\x89\x47\x5d\x37\xa7\x7a\x45\x74\xa2\xba\x55\xbf\xd9\xc9\xcf\xd1\x46\xfb\x97\xe6\x16\x5d\xcc\x19\x55\x9f\x4f\x85\xdf\xca\x2f\x97\xf3\x70\x2e\xd8\xfa\x6b\x3c\x2a\x97\x41\x97\x4a\xa0\x7a\xb6"}, +{{0xb1,0x50,0xa7,0x89,0x29,0xed,0x1e,0xb9,0x32,0x69,0x21,0x3e,0x1e,0xbc,0x22,0xe2,0xe4,0x0a,0x60,0x1b,0xdb,0x00,0x54,0x99,0xb7,0xbe,0xb0,0x58,0x91,0x7c,0x53,0x40,},{0x28,0x86,0x6b,0x6d,0x1c,0x39,0x3c,0xb0,0x8e,0x46,0x4c,0xf5,0x57,0x14,0x40,0xa6,0x49,0xe5,0x06,0x42,0x38,0x0d,0xdf,0x4f,0xfb,0x7a,0xd1,0x50,0x48,0x5c,0x10,0x8e,},{0x27,0x6d,0xd0,0x96,0x2e,0x6e,0xe6,0x4f,0x05,0x92,0x44,0x1a,0x8a,0xf0,0xe5,0xef,0x8f,0x93,0xbf,0x0b,0xae,0xba,0x20,0x50,0x4b,0x9d,0xb4,0xf9,0x5a,0x00,0xb9,0x39,0xea,0x38,0xde,0xf1,0xc7,0x97,0x86,0x28,0x98,0xca,0xbe,0x9d,0xc4,0x64,0x4f,0x0e,0x67,0x7e,0x87,0xc0,0xa3,0x3b,0x87,0xb6,0xa4,0xd2,0x2a,0x80,0x7d,0x0e,0x1e,0x02,},"\x1b\xf5\x5d\x27\xf9\xdd\xe6\xc4\xf1\xc0\xdd\xd3\x60\xa2\x5d\x94\x93\xc0\xff\xdc\xa7\x4a\x7e\xd5\xe5\xa5\x14\xe9\x55\x15\xcd\xa4\xaa\xd8\xf4\x5c\xd6\xed\x79\x01\xf8\xf2\x24\xa6\x3b\x38\x12\x1c\xbe\xac\x2f\x56\xda\xe2\x10\xdd\x05\x37\x50\xcb\x20\x75\x14\xa8\x89\x1e\x24\x5a\x5d\x07\xe7\xde\x78\xa2\xe3\x81\x44\x63\xf1\x48\xd2\xac\xb7\xdc\x71\xf9\x95\xc9\x29\x9a\xd0\xd6\x26\x6c\xfe\xfc\x94\x26\x96\x57\xfd\x47\xcf\x53\x12\xb9\x2a\xf2\x75\x06\x51\xc4\x79\x63\x6c\x9d\x36\xae\xf0\x8f\x7d\x11\x95\xe7\xfa\x1b\xa3\xab\xb5\xdc\xb9\x01\x36\xb0\xfb\x9a\x37\x66\x8b\x87\xa2\xdb\x88\xd1\xe2\xb6\x44\x0d\x3e\x6e\x60\x1e\x6d\x4b\xc1\x0c\xf1\xcb\xdf\x1d\x61\x69\xc0\xdc\x2c\x4a\xec\xde\xb6\xcd\xd4\x56\x7d\x42\x50\xb2\xaf\xa7\x15\xb1\x66\xc9\x46\x7f\x90\x7d\x3f\xa5\xa6\xda\xf2\x00\xb3\x09\xc1\x09\x37\x68\x30\x49\x9c\xaf\x31\x49\x00\x1c\xf3\x33\x94\x48\xca\x3d\x76\x52\x25\xd6\xb3\xc1\xcd\x26\x7c\xba\x93\x6e\x7a\xa4\x83\x25\x39\x46\x6f\xd2\x0c\xbb\x38\x32\x3c\xbb\x22\x28\xa2\x71\xf2\xd2\x82\x56\x1c\x73\xed\x79\xa1\xad\x04\x69\x8e\x27\xef\xe3\x93\x23\x5f\x34\x56\xc2\x95\x40\x7d\xa0\x96\x0f\x00\x34\xd8\xde\xef\xd1\xc1\x85\x73\x6f\xd3\xea\xf1\xf9\xa1\xe3\x2f\x09\x17\x4c\x1f\xe1\x27\x20\xb7\xc9\x6f\xeb\xdb\x33\xe0\x1b\x1b\x6a\x1c\x63\x71\x50\x19\x4b\xe4\xff\xab\x15\x9e\x45\xb2\x45\x85\x57\x68\x46\xbb\x64\x27\x4e\xca\x7b\x39\xa3\xed\x93\x57\xde\x7b\x08\x42\x13\x02\x4a\x9e\x85\x89\x26\x36\x00\xa2\x86\x7c\x2a\x7c\xf8\xb9\x90\x76\xa1\x2a\x07\xbd\x7d\xf8\xd5\x27\x7b\xb0\x4a\xd7\x2e\x63\x9b\x77\xea\xca\x1e\xc5\x8e\xf9\x63\x7e\x9a\x23\x76\xba\x87\x8a\x45\x72\x35\xa0\x6f\x78\xfd\xf0\xe0\xd9\x25\xcb\x2f\xd2\xa3\x8c\x77\x18\x8f\x60\x37\x2e\xf6\x00\x97\x92\x42\x43\x99\xc9\xb6\x79\x28\xda\x2e\x3b\xa9\x1c\xbd\xe4\x07\xe7\xe8\x76\xba\x98\x13\x9e\xd2\x2c\xa3\xb9\x83\xbe\xde\x00\x00\x52\x87\x96\x44\x8e\x4a\x10\x55\xac\xb2\xde\xaa\x56\xbc\x30\x82\x54\xc5\xbd\x49\x8c\x27\x5e\xce\xdc\x13\x57\xef\xe1\xfd\xa0\x1d\x34\xd9\x16\xdd\x4d\x86\x47\xe5\x77\x19\x95\xa6\x53\xe0\xf8\xa5\x28\x4c\xc7\xbf\x73\x15\x7b\x33\x49\xd5\x9e\x6f\x92\x0c\xad\x6c\xdd\x17\x19\xf0\x38\x02\x5c\x43\x00\xe0\x21\x0c\xe2\x49\xfa\xf3\xc8\x2d\xe1\xfd\x1c\xda\xbe\x61\xc1\x4e\xcb\x1d\xf0\x0c\x5c\x46\x6a\xa6\xa0\x12\xa9\xc1\x0d\xcf\xe5\x9b\x7e\x9d\x3b\x15\x5d\xab\x6c\x7b\x7c\x16\x08\xc1\xed\xd5\x1d\xbd\xad\xf6\xba\x58\x76\xb5\xe6\x0f\xdf\x7f\x19\xe6\xef\x71\x2c\xd1\xa7\xdd\x3a\x06\x2a\x65\x74\xa7\x43\x6b\x31\x9e\xfb\x94\x4e\x42\x23\xf5\x42\xb2\x50\x2c\x1b\xa9\x76\xbe\x91\xe0\x5b\x0f\x85\xa0\x9f\xd7\x93\xbe\xca\x88\x33\x75\xfb\x67\xcd\x13\x3f\x52\x84\xd8\x99\x84\xff\x3c\xaf\xa7\xe1\x1a\x9d\x85\xe7\x89\x32\x32\xa5\x24\xec\x54\xb2\x0f\x97\x5d\x3c\x0a\x11\x43\xa0\xef\x41\x17\x6b\x70\x51\xea\x91\xd4\x0c\x5f\x44\xfd\x9e\x10\x05\x58\xbf\x12\x12\xa7\xb8\x91\xe6\x8b\x55\xca\x61\xf4\xbe\x94\x52\x66\xd9\xa1\x00\x7a\x14\xaa\xeb\x68\xc4\x8e\x25\x7f\x0f\x46\x31\x0a\xd1\x64\x81\x46\x7e\xc1\x77\x35\x35\xd5\xfc\x08\x49\x15\xf5\xd0\x04\xba\x0d\xc7\x59\x1d\x21\x23\xc6\x22\x07\x90\x9d\x84\xf2\xb3\x82\xf5\xef\x12\x75\x9a\x95\xcd\x3f\x51\x89\x80\x6e\x27\x39\x60\xae\xe1\x62\xc0\x0f\x73\xe7\xfa\x59\x36\x39\x57\x65\x4b\xb1\x91\x6b\x57\x09\xbb\x0a\x9d\x04\x05\x14\xae\x52\x84\x95\x1e\x6b"}, +{{0x9f,0xc7,0xc4,0x9c,0xb8,0xc4,0xf0,0x97,0x2d,0x6e,0xd9,0x70,0xae,0x2c,0x6a,0xc3,0x37,0xe6,0x75,0x42,0x5c,0xc8,0xdc,0xe7,0x30,0xfc,0x41,0x44,0x43,0x02,0x93,0x5d,},{0x47,0x82,0x52,0x0b,0x06,0xf9,0x33,0x44,0xaa,0x76,0x67,0x80,0xe5,0x44,0x01,0x36,0x3d,0xfd,0x7d,0x96,0x7c,0xc3,0xbf,0x06,0x48,0x8a,0xf9,0x09,0x20,0xa3,0x0f,0x85,},{0x5c,0x78,0x3a,0x86,0x0a,0xa6,0x68,0x18,0x4d,0xd2,0x2c,0x4f,0x9a,0x54,0x6b,0x5e,0xc9,0x6e,0xba,0xd2,0xe4,0xaf,0x00,0xf9,0x68,0xc6,0x88,0x67,0x13,0x54,0xe0,0xcc,0x9b,0x57,0x2c,0x73,0xbc,0x6f,0x19,0x93,0x7a,0x05,0xf1,0xba,0xf3,0x43,0x47,0x63,0x96,0x5c,0x96,0xe1,0x03,0x40,0x7f,0x0e,0xb6,0x42,0xc5,0x64,0x41,0x54,0x29,0x0b,},"\x82\xbc\x2c\x70\x0d\xb2\x22\xa4\xac\x91\x4a\xa2\xbe\x8f\xa2\x8e\x42\x20\x67\xf9\x4f\x33\x44\xf5\x36\x2b\xeb\xaa\xbe\xd7\x61\x2b\x0e\x46\x4a\x73\xa6\xc4\x56\x90\x35\x64\xb1\x53\x93\x48\x51\x40\xdd\x0f\x3a\xff\x90\xaa\x6e\x16\x61\xdd\xf6\x82\x85\x0d\x04\x90\xaf\xc3\xd7\x35\xde\xa0\x5b\xa4\x7c\x85\xd9\x7e\x83\x35\x33\x51\x4c\x19\x8b\x4c\xf6\xe6\x6d\x36\x0e\xe5\xbf\x00\xe1\x4a\x3a\xab\x1a\xd0\xe7\xb8\xab\x2a\xac\xc9\x64\xd4\x28\x30\xc7\x84\x53\xdf\x19\x55\xbb\xed\x1c\xd6\x8a\xda\x3d\xb0\xec\xdb\x60\x1a\xd7\x66\x7d\x5c\x5e\x2f\xd4\x9e\x36\xf7\x32\x8e\xaa\x33\x7d\xbd\x6f\xf7\x0e\x78\x98\xa3\xf9\x8c\x15\x9d\x04\x5a\x24\x27\xad\xe5\x33\x3c\x88\xfc\x4a\xfd\x38\x19\xdc\x82\xf4\xda\xa3\xc5\x23\xcb\x57\xe3\x5a\x2a\x5a\x72\x5d\x63\xd4\x02\xba\xef\x51\xe5\x1f\x1e\xf4\xf8\xf9\xa5\x95\xc9\x37\x9c\x9a\xba\x87\x3f\xb4\xe7\x65\xa9\x31\xda\x09\x14\x8a\xba\x6e\xc5\xb4\x48\x59\xb0\xe8\x1f\xf9\xfc\x22\x95\x98\xac\x9f\xbd\xb0\xbd\xbd\xdb\x56\x92\xa5\x22\x22\xdf\x52\xea\x38\x7b\xbb\xf3\x6a\xd6\x4d\x19\x46\xbd\x28\x2e\x32\x3f\xf4\x82\x2a\xd9\xda\x89\x7f\xf7\x3f\x01\xb3\x90\xcf\xe2\xe6\x4d\xe4\x92\xd5\x5d\xe7\x7f\x5d\x7d\x00\x60\xa6\x87\x2a\x01\x83\xcc\xba\x61\x0f\x53\x27\x4c\xcb\x29\xce\x6d\xce\x6a\x03\x6c\x53\x17\xa1\xed\x2a\x7c\x10\x68\xc1\xb2\x46\xfc\x1d\x58\x81\xd0\x0d\xe0\x6e\xb4\x01\xcf\xf9\x5e\x6b\x69\x14\x86\x99\xdb\x13\xe9\x4b\xb5\xb2\x80\x21\x2d\xff\x54\xc7\x0e\x56\xde\x23\x5a\x5f\x14\x00\xb5\xbe\xa5\x67\x72\xd0\x60\x17\x0f\x1d\x06\x57\x32\x15\x61\xe4\xb4\x91\x07\xeb\x96\xd9\xb3\xbc\x5a\xdf\x45\x1c\x2a\x52\x4e\xba\x4d\xb0\x03\xb7\x7b\x63\x2a\x5d\x89\x82\x7a\x62\x24\xcc\x79\x8e\x09\x6b\xa2\x7f\xb3\x3b\xf6\x1e\x3b\x8e\xaf\x18\xd0\x01\xae\x8e\xb5\x2f\x85\xc9\x0d\x9e\x12\x54\x48\x03\xe6\x7f\xf0\x20\x47\xe0\xd2\x3c\x22\xe7\xf8\xb9\x80\xc0\x1c\x3d\x48\x24\xb2\xa9\xa1\x4a\x2e\x8f\x67\x2a\x7b\x0c\xe0\x3b\xdb\xb3\xbd\x56\xd7\x54\xa0\x96\x4d\xb0\x1c\xa8\x99\xd4\x88\x00\x15\x08\x65\x7b\x7b\x02\x2c\xcf\x04\x2c\x38\xfc\x19\x49\xd0\xe0\x0a\xf4\xd3\x01\xd4\xf0\x0c\x3d\xea\x20\xe3\x08\xa0\xf9\xdc\xac\xb4\x32\x22\xb3\x82\x41\x44\xaf\x77\xbe\x18\xa5\x04\xaa\x8d\x26\x8b\x8a\x56\x00\x72\x5e\x7c\xc5\xf3\xa2\xe6\x25\x6a\x80\x74\xd1\xae\xbc\xa1\x23\xea\x53\xa0\x76\x7a\x92\xe1\x78\x3a\x49\x83\xc5\xef\x3d\x7d\xd7\xf0\x2a\xa9\xd1\xf4\xf9\xaa\xc6\xce\x25\x45\x93\xf0\x87\x92\x01\x4f\xb8\x67\xea\xf8\x79\xb8\x8a\x4e\xfb\x18\xe8\x9b\xa1\x10\x06\xad\x09\xd8\x54\x31\xcc\x26\x57\x5b\x53\x8d\x8e\x78\x90\x64\x6c\x59\x88\x64\x7c\xc1\x05\xd5\x82\x90\x7a\xe6\x25\xe0\x9c\xd0\x89\xf4\x72\x49\xe8\x18\x14\xda\x14\x04\x4c\x70\x14\xe8\x0e\x7a\x8e\x61\x9c\x7b\x73\x5f\x70\x16\x16\xb6\xa3\xc6\xf4\x92\xcd\xc6\xed\x46\x3e\x71\xa3\xd2\x22\x91\x48\x2d\x90\xa1\xde\x6f\x09\x7c\x4a\xe2\x54\x87\x61\x84\xc5\x62\xb1\x65\x75\xb9\xd0\xd1\x93\x13\xed\x98\x86\x4f\x49\xfe\x2e\x1d\x07\x4a\x21\x21\x1b\x2b\x2a\x6d\x27\xdd\xb2\x86\x11\x52\x0d\x5f\x71\x23\x05\x8f\xd0\x07\xbb\x01\x00\x1d\xef\x07\xb7\x92\xbb\x05\xbb\x74\x1c\x12\x9c\x6a\x36\x37\x6c\x38\x53\xb8\xbb\x4f\x66\xb5\x76\x0c\x8e\xb4\xec\xc7\x30\x6b\xa3\xa9\x0c\x70\xda\x47\xc9\x65\xf6\xdc\xcb\xdb\x61\xa7\xfd\xa1\x8e\xe9\x67\xcf\x8c\x5f\x05\x03\x11\x09\x2d\x0f\xde\xea\xed\xd1\x26\x5d\xef\xdd\x66\x0a\xbe\x70"}, +{{0x08,0xbf,0x05,0x9b,0x4d,0xa9,0xaa,0x7f,0xfc,0x70,0x2f,0x5b,0x23,0x04,0xc4,0xf9,0x6c,0xa4,0x9b,0x7d,0xab,0xb6,0xaf,0xb4,0x1d,0xc9,0x1c,0x0f,0x00,0xc6,0x5b,0x78,},{0xa6,0x28,0x9b,0xa2,0x8e,0x80,0xe8,0xd1,0xa3,0x19,0x22,0x3e,0x41,0x65,0xdc,0x0b,0xce,0x73,0x52,0xaa,0xf2,0x42,0xf7,0x0c,0xc9,0x68,0xd2,0x1d,0x77,0x75,0x28,0x32,},{0xe2,0x47,0x65,0x86,0x01,0x37,0x68,0x9a,0xad,0x50,0xeb,0xee,0xfc,0x8d,0x6d,0xb8,0xe9,0x36,0xa4,0xcb,0xa6,0x2c,0xe8,0x7a,0x7f,0x58,0x02,0x09,0x38,0x4a,0x9d,0x7e,0xec,0x90,0x70,0x90,0x5f,0x60,0xad,0x63,0xa7,0xbe,0xfd,0x7c,0x70,0xf0,0xae,0x7c,0x81,0x09,0x16,0x9a,0xee,0x4e,0x51,0x8f,0xce,0xbf,0xac,0xa7,0x23,0xc5,0xb2,0x07,},"\xbd\x4f\xb2\x8a\x1d\xd0\x8b\x07\xba\x66\xe1\x7f\x0c\x4f\x21\x85\x3f\xef\xef\x1c\x9d\x20\xba\x79\x77\xf1\x54\x64\x1e\xa1\xa1\x8b\xec\xf6\xbb\xb8\x03\x88\x88\x62\x94\xe0\x75\x6a\x3c\x50\x8f\xfd\xfe\x90\xb5\x1e\x13\x56\xd1\x12\xd8\xcd\xe5\xee\x2c\xc6\x33\x2e\x61\xd1\x69\xcc\xc8\xcc\x93\x49\x94\xf1\xbb\x56\x0f\xa4\x66\x0c\x0b\x0f\xd4\xe8\x14\x9a\x22\x5e\xd4\x88\x3e\x68\xfb\xb6\x9d\xa7\xaf\x8a\x52\x4b\x17\x14\x1c\xcb\x76\xb5\x0c\xd8\xe1\xb6\x7d\x3c\xe0\x37\xde\xd7\xdf\xa5\x9b\xc7\xc2\x67\x42\x26\xec\x7e\x07\xb7\x8e\xa3\xf7\x82\xfd\xa3\xe5\xf1\xe9\xca\xea\xb6\x08\xca\x38\x7c\x30\x46\x54\xf8\x01\xd0\x0e\x10\xa7\xc2\x9f\x4b\x0d\xa3\xe5\xf8\x95\x13\xa9\x80\x37\x71\x9a\x1a\xef\x4c\x25\x06\xc1\x77\xaf\x54\x51\xa0\x07\x57\xa5\x9f\x16\x22\x9c\x4f\x44\x14\xdf\x51\x58\x0d\x48\x21\x0d\xab\xc9\x37\x73\x70\xb6\x06\x8a\x88\xe8\x1d\x3a\xd1\xbe\xd4\x98\x51\x55\xc3\x60\x0f\xf4\x87\x68\xb9\x03\x02\x2f\xe0\x2a\xe4\x80\xf2\xe6\x32\x9f\x0b\xcc\x91\xd7\x5f\x5c\x6a\x09\xfd\xf7\x7b\xde\x90\x49\x9f\x3c\xa3\x95\xcb\x20\x06\x2a\x09\x84\xad\x6a\x01\x41\xfd\x01\xc2\xd5\x4d\xfb\xb1\xee\x58\x46\x10\x64\x07\x73\x43\x9a\x16\x58\xd2\xc9\xf8\x62\xf1\x83\xbf\xef\xb0\x33\xa3\xbe\x27\x18\x12\xf1\x3c\x78\x70\x46\x57\xe7\xfb\x4f\x85\x01\x75\xfc\xd6\x3d\x3e\x44\x05\xd1\x92\x24\x2c\x21\xf2\x7c\x51\x47\x7f\x32\x11\xa9\xce\x24\x8e\x89\x2b\x42\xfb\x6d\x85\x82\x0f\x41\xb8\x97\x83\x6f\x20\xf8\x5a\x13\x11\x53\x4b\x5c\x40\x4f\x8b\x7a\x4a\x03\x19\xbc\x6c\xec\xaa\x57\xfe\x4d\x4f\x20\x60\x7c\x99\xc2\xdf\x22\xfa\x06\x76\xf9\x9d\x1b\xd8\x78\x86\xc9\x28\xc4\x98\x8c\x6e\x78\xc5\x7d\x75\x83\x30\xe6\x92\x2c\xbe\x03\xc1\x03\x40\x25\x3d\x0d\xd4\x83\x79\x2c\xe7\x5e\x6c\xd0\x9d\x12\xfb\xbb\x04\x1f\x02\x05\xe6\x5a\xd2\x5c\xe7\xc1\xb2\x4e\x77\xee\x8d\x6f\x91\x5e\x3b\xc3\xe1\x0d\x09\xfb\xd3\x87\xa8\x4b\xda\xab\xfd\x1c\xed\xb5\x2c\x0b\x17\x33\xb5\xf4\x70\x88\xc0\xd3\x5e\x0e\xf4\x58\xc8\x54\x14\xc2\xb0\x4c\x2d\x29\xf6\x3f\x77\x58\x61\x31\xee\x65\x53\x0f\x20\x9b\x51\x8a\x0f\x25\x7a\x07\x46\xbb\xd5\xfe\x0a\x2e\x0c\x38\x8a\x6c\x48\x0e\x1b\x60\x71\x4f\xee\x1c\x59\x41\xbb\x4e\x13\xf7\x07\xea\xc4\x87\xa9\x66\x6a\x72\x3b\x57\x93\x13\x4a\x26\x8b\x77\x59\x77\x86\xc3\xa3\x19\x3b\x46\xd3\x55\xdd\x08\x95\xfc\x62\x16\xc5\x36\xa5\x42\xff\xd7\xd7\xb0\x80\x10\xc8\x6f\x54\x7a\x5d\xaa\x38\x33\x5a\x8b\xfa\x26\x55\xd5\xf7\x1b\x4d\x88\x07\xf5\x0c\x85\x45\xc5\x83\xdd\x0b\x69\x00\x22\xee\x65\x87\x3a\xea\x3e\x8f\x1a\x56\x5f\x3b\x0e\x4e\x02\x95\xfb\x0d\x32\x1f\x5c\x0b\x39\x7f\x2f\xd0\x52\x8f\x86\xa0\xd1\xb7\x07\xf7\x37\xb1\x75\xc6\x9e\x9e\x7a\xe3\xc8\x4d\x4b\x2c\xf3\xa3\x8a\x63\x1a\xa8\x03\x2b\x3e\x65\xbb\x45\x28\xf6\x6d\x0b\xfd\x34\x47\x3e\xd0\x10\x1d\x2a\x61\x25\x5b\x21\x5b\xc1\xcb\xab\x9a\x26\xd2\xb9\x69\x32\x4b\x77\xc8\xa5\x46\x4e\x5b\x23\xdf\x6c\x51\x12\xf9\xd1\x7c\x58\x7d\x95\x55\x9d\xe2\x12\xad\x24\x1d\x8b\x12\x60\x50\xe5\xfd\xdf\xcc\x83\x9a\x7e\x5a\xa2\xfd\xa1\xca\x20\xc0\x91\x0d\x86\x34\x18\xf1\x95\xb3\x8a\xdf\xcc\x36\xe9\x2f\x23\x96\xac\x31\x44\xb5\x37\xb3\x0f\xbe\x4d\xde\x61\x49\x02\xf8\x99\x78\xb7\xfb\x42\xcd\x99\xf1\x3d\x99\xc4\x5c\x73\x4f\xb8\x2c\x32\x59\xf9\x0b\x88\xfd\x52\xbd\xcb\x88\xf7\xee\xec\xdd\xe4\xc2\x43\xd8\x80\xba\xc7\x61\x4e\x15\xcf\x8d\xb5\x99\x3f\xfa"}, +{{0xdb,0xbd,0x0f,0x7e,0xcb,0x64,0x82,0xcb,0x01,0xc4,0xdb,0xdc,0x38,0x93,0xc0,0xdb,0x81,0xe8,0x31,0x35,0x3a,0x5b,0x01,0xcc,0x75,0xd3,0xb1,0x1f,0x2f,0xf3,0xc5,0x9c,},{0x2d,0x4e,0x58,0x8d,0x31,0xa3,0x84,0xb1,0x78,0x58,0xc0,0xd7,0x84,0xf6,0x71,0x2b,0xaf,0xd0,0xb4,0x12,0x04,0xcf,0x8f,0x0d,0x57,0x97,0x3e,0x59,0xc7,0x70,0xd3,0xda,},{0x96,0xc0,0x03,0x61,0xfb,0x71,0xc5,0x23,0x05,0xe1,0xab,0x77,0x07,0xe0,0x46,0x52,0x03,0xeb,0x13,0xdf,0x3e,0x06,0x55,0xf0,0x95,0xfb,0x33,0x19,0x42,0xa4,0x0b,0x15,0x58,0x41,0x43,0xb3,0x70,0xa7,0xdd,0x57,0x61,0xfb,0x03,0xc0,0x75,0xd0,0x4a,0x83,0x48,0x66,0x1c,0xce,0xa9,0xad,0xa5,0x33,0x65,0xb5,0x00,0x08,0x7d,0x57,0xec,0x0c,},"\xe0\xff\xf3\x59\x75\xeb\xa7\x8d\xa2\xb0\xff\xcc\x5c\x1b\x66\x36\x00\x88\x8e\x82\x55\xcd\x20\x8f\x6d\xce\x7e\x88\x95\x3b\x71\x42\x93\x73\x89\xa3\x37\xae\x82\xf4\xcf\xe3\x2f\xcb\x34\xf5\x52\xa4\x8f\xa8\x89\x9e\x1a\x65\x9e\x3e\xd3\xd3\xd2\x90\xef\xc9\xa0\xf7\xde\xdf\x33\xe2\x1d\x04\x8d\x8d\x91\x07\x57\x03\x7b\x76\xe8\xa7\xee\x9e\x4e\xca\x30\xf5\x29\xdd\xc0\x2c\xef\xfc\x26\xd6\x4f\xda\x73\x03\xcc\x0d\x89\x40\xe9\xef\x59\xdc\x98\x3c\x12\xcc\xd1\xd2\x71\x7e\x64\xd3\x00\x6a\xf8\x2a\xb1\x5b\xb8\x78\xbb\x89\xd1\x75\x8b\xe4\x43\x10\x42\x06\x38\xb9\x6a\x0b\x5e\x1e\x65\x00\x9d\x69\x39\x5d\x02\x7a\x5d\xa4\xa8\x5e\x90\x1b\xe9\xaa\x2c\x0b\x3a\xcc\x50\x8e\xe1\x85\x74\xc1\xb2\xfa\x9b\xd5\xd7\xae\x7c\x7d\x83\x07\x12\xda\x5c\xbf\x26\xbe\x09\xa3\x12\x84\x70\xa1\x2a\x14\x90\x9a\x80\xa2\x66\x65\x9b\xef\xda\x54\x8f\xd2\xb2\x2f\x24\xc5\xfd\xc2\x06\xed\x3a\x4e\x75\xf5\x32\x06\x82\xed\x0e\x4c\xe8\x17\xd6\x3d\x5c\x7f\x1e\xe2\xb4\x40\x64\x33\x55\xbe\x65\x42\xf5\x9d\xc6\xc4\x5a\xb1\x57\x72\xf2\x21\x9a\x81\x2e\xf7\x52\x76\x42\x01\x5b\xc7\x5f\xe4\x5b\xa9\x69\xe8\x10\x0c\x26\x8e\x24\xce\xef\x92\x05\xa8\x3a\x3f\x7b\x5a\xe8\x00\xad\x06\xe0\x95\xb9\xb1\x39\x21\x94\x89\x79\x3a\x7b\xce\x84\xeb\xeb\x65\x4a\xb6\x66\x9e\x28\x55\xcc\xbe\xb6\x94\xdd\x48\x65\x15\x05\xb9\x59\xd3\x2a\x77\x02\x0b\x86\x95\x33\xe3\x25\x6d\x40\x68\x5a\x61\x20\xba\xb7\x94\x48\x5b\x32\xe1\x16\x92\x56\xfb\x18\x8f\xe7\x6e\x04\xe9\xef\xa6\xd1\x0d\x28\x6a\xe8\x6d\x6f\x1c\x87\xe8\xfc\x73\xad\x9b\x59\xfe\x0c\x27\xee\x92\xa4\x64\x15\xb3\x9d\x78\x6d\x66\x32\x5d\x7f\xa6\xfd\xa7\x12\xf1\x99\xda\x55\x4f\xc1\xc8\x99\x44\xa4\xe8\x4c\x19\x6e\x97\x9a\x80\x75\x53\x71\x8c\xb8\x1c\x07\x6e\x51\x1e\x60\x9d\x5c\xac\x23\xd8\xf4\x5b\x38\xb9\x4b\xcf\xcf\x15\x8d\x0d\x61\x60\x22\x38\xd5\x2e\x3a\xe8\x4c\x81\x53\x22\xf5\x34\xf2\x54\xe6\x33\x89\xae\x15\x5d\xee\x2f\xa9\x33\x96\xf0\xea\x49\x9d\x5d\x08\xc2\x47\x59\x08\xc6\x48\xbd\xdc\xee\x59\x1e\x13\x37\xe9\x42\x1d\xc5\xa2\x57\xce\x89\xcc\xce\x4c\xee\xa8\x09\xd7\xe8\x71\x34\xe0\x39\xdb\x1b\xe5\x98\x19\x6d\x30\x89\xfd\xcf\xa8\x97\x8e\x02\xc1\x55\x58\x32\xda\x0a\x72\xb0\x8a\xd0\x7c\xdd\x07\x26\x27\x40\x9c\x87\x39\x37\xb0\xe8\x35\x71\x5b\xaa\xf2\x60\x8b\x23\x95\x32\x74\x67\xcf\x69\xa1\xcd\xcc\xe6\x37\x24\x18\x38\x3e\x7b\x89\xc8\xdf\x4d\x53\x1f\x58\x51\x49\x50\x9e\xad\x1e\x41\xb6\x62\x7f\xea\x81\xc7\x95\x8c\xb4\x9d\x2d\x3c\x3e\x2f\xc6\x91\xe0\xb8\xcf\x72\x67\x9c\x08\xb8\x90\x46\x54\x53\x1b\xc4\x36\x8f\xb6\x17\xac\x75\x57\xd9\xdb\x8d\x32\x9d\x77\xe4\x8d\x8f\xb4\xde\x73\xab\xe7\xcb\x93\x88\x27\x4a\xf5\x85\xf8\x75\xc0\xda\xb7\x93\xe4\x35\x35\x18\xbb\x24\x69\x53\x42\xaf\x0f\x5d\xf5\xbe\x4e\x9c\x7a\xd2\x15\xbe\x90\xe2\x55\x40\xda\x34\x89\x71\x7d\xd3\xd2\x92\x54\x58\x5a\x45\xc1\x3e\x6d\xcc\x7e\x9c\x8a\x3a\x79\xff\x75\x5c\xbe\x46\x5b\x25\xe2\x3a\x1d\xa6\x08\xe1\x08\x4f\xec\x83\xbf\xf8\x0c\xfb\x74\x42\xb1\x46\x01\x87\x30\x7a\xcd\x75\xe3\xf2\xd1\x28\x43\xa7\x70\x94\xac\xc3\x28\x88\xfb\xe5\xf1\xfc\x24\xc6\x15\xd1\x9a\x06\x53\x91\xd4\x17\x64\x74\x64\x42\x46\xb5\x34\x3d\xa7\x76\x26\xa2\xd4\x83\xfe\x20\x4f\x83\x93\x28\x77\x5b\x71\xa4\xcb\x56\x72\x73\xe1\x69\x64\x0a\xf9\x3d\xde\x3e\xca\x91\x16\xf4\x00\xe2\x3a\x7a\xd3\xd8\xfc\x3a\x28\xe5\x65\xf1\x25\xd6"}, +{{0x74,0x8b,0xb3,0xcd,0x47,0x71,0x37,0xbc,0x88,0x0e,0xa7,0xc6,0x1d,0xf2,0x5c,0x1d,0xac,0x6e,0xbe,0xc9,0xe6,0xc3,0x19,0x3d,0x81,0xff,0xa6,0xf7,0xa8,0x1e,0xc6,0x67,},{0x10,0x6f,0x28,0xcf,0xed,0xf0,0x96,0x45,0x42,0x26,0xb3,0xb0,0x1f,0xc2,0x4a,0xb1,0xc9,0xbb,0xd7,0xf2,0xb0,0x97,0x3e,0x56,0xfe,0x2f,0x4c,0x56,0xa0,0xb1,0x47,0x5b,},{0xe1,0x3c,0xa8,0xe5,0xce,0x7c,0x26,0x80,0x90,0x90,0x8d,0x61,0xcf,0x2f,0x0a,0x3e,0x45,0x72,0x41,0x2b,0xf5,0xad,0xfc,0x5a,0xdd,0xfe,0x88,0x55,0x6f,0x14,0x8b,0x5f,0xcb,0xe3,0xe1,0xbc,0x65,0xff,0x16,0x11,0x7d,0x35,0xc9,0xd5,0xdc,0x3b,0x11,0x71,0x98,0xf8,0x84,0x92,0x5b,0x40,0x35,0xb2,0xc0,0xde,0x6c,0x40,0x2e,0xd4,0x7a,0x01,},"\x00\xde\x6d\x99\x0c\x84\x33\x8a\x39\x8f\xda\x5f\x4a\x2c\xca\x73\x3c\x56\xb2\xa2\xea\x39\x6c\x2f\xe6\x67\xc2\x68\xe3\x81\x45\x87\x85\x39\xbd\x41\xbc\x14\x0a\x2c\xdf\xe7\xe1\x83\x60\x41\x10\x48\xcc\xa6\x0f\x35\xce\x51\x09\x91\xdf\x26\x1c\xbf\x66\x90\x39\xd9\xd2\x56\x87\xa0\x7f\xc0\x47\x6a\x41\xf5\x0e\xcc\xf3\x81\x53\xee\x6a\xe9\xff\xd3\x92\xb2\xbe\xc0\xcc\x67\x10\x1e\xc3\x69\x6d\x7a\x2e\xc8\xcb\xd4\x47\xb6\xa6\xea\x06\x3d\x33\xec\x12\x8a\xe8\xb5\x75\x77\xde\xe1\x7b\x97\x16\x25\x63\xf1\x5e\x42\xb5\x5c\xa4\xbe\xdb\xdf\xb6\x31\xa9\xf6\x26\x2f\x94\xae\x35\xbb\x35\xf7\x95\xc3\x5a\x01\xde\xdb\x46\x45\xa7\x3c\xfa\x6e\xd9\xee\x52\x1e\x46\x31\xfb\x17\xbb\xc0\x6e\xe5\x73\x16\xbe\x52\x74\x27\xc8\xaa\x55\xc6\x31\x18\x74\x62\xd4\xb2\xc8\x82\x2c\xa4\xe1\x8b\x7a\x5d\x4c\x11\x4c\x11\xdc\x22\x06\x9b\xc8\x32\x65\x6d\x5f\x4d\x39\x54\x87\x18\xc5\x1f\x5e\x4f\xc8\x28\xf6\x0e\x37\xf0\x13\x07\x50\x52\x65\xac\xb2\x2d\x5e\x8d\x76\x7b\x9a\xa7\xb8\x66\xa1\x57\xc6\x43\x87\x3e\x09\x08\x4a\x1a\x40\x4a\x7b\xb5\x8c\xcc\x4b\x5a\x39\x0f\xd3\x06\x01\xc8\x96\x93\x5e\x35\x56\xf6\x0d\x2d\xc6\xbd\xff\xe4\x7d\xa0\xa6\x87\xc8\xec\xe1\x24\x1f\xf6\xc0\x7d\x77\x61\x11\xca\x65\x98\xfc\xa9\x68\xcb\x6a\xfa\x0a\x14\xa3\x4a\xb8\xf5\x4b\x95\xd3\xd8\x47\x3a\x17\x4b\xc7\x25\x52\x3f\x86\x74\xdf\xb2\xb1\x0f\x87\x42\x07\xfe\xe1\xb0\x8b\x42\xda\x1f\x58\x65\x53\x05\xa3\x59\x75\x7a\xa0\x25\x1f\x14\x13\x8e\xed\xbc\x28\x0c\xbd\x38\x5b\xf4\xbb\xf5\x53\x01\x14\xcc\x43\xb0\x47\x47\x79\xe2\x04\x96\x2f\x85\x60\xd4\xaa\x42\x3e\x17\xe6\xae\xca\xce\x66\xc8\x13\x78\x4f\x6c\x89\x8b\x5b\x9c\xb7\x46\xa9\xe0\x1f\xbc\x6b\xb5\xc6\x60\xf3\xe1\x38\x57\x4f\x59\xb9\x74\x54\x45\x48\x6c\x42\x2b\xc0\x6a\x10\xcc\x8c\xc9\xbc\x56\x45\x8e\xf8\x5e\x0e\x8a\x02\x7c\xb0\x61\x7d\x03\x37\xdd\xda\x50\x22\x0b\x22\xc5\xc3\x98\xf5\xce\x05\xec\x32\xf0\x9b\x09\x0f\x7c\xf6\xc6\x0f\x81\x8c\x6b\x4c\x68\x30\x98\x3e\x91\xc6\xea\xdf\x1e\xae\x4d\x54\xbd\xe7\x54\xf7\x5d\x45\x0a\xe7\x31\x29\xf6\xc4\xff\x5c\x4c\x60\x6f\x7c\xad\xbf\x4f\x78\xa1\x8d\xb2\x96\x1c\xc8\xc8\xdd\xab\x05\x78\xcf\xed\xfc\xf9\x5e\xf0\x88\x8a\xfd\x38\x55\x37\xd1\xd0\xa0\x76\x48\xa5\xce\x25\x22\xd0\x63\x35\x07\xd7\x75\x93\xe1\xa0\x36\x6d\x1e\xce\x84\x3d\xe6\x98\x67\xd7\xac\x44\x2b\xa7\xda\xd2\xa9\x0b\x59\xd8\x98\x4e\x4a\x94\x6b\xbe\x5f\x17\x2d\xa4\x27\x63\x8b\x2b\x61\x20\x90\x41\xff\xf5\x0e\x60\xec\x02\xec\x2c\x0b\x1d\xc4\xbe\x2e\xdd\x13\xe8\x7b\x64\xd1\xd1\x66\x31\x14\x57\x3c\xf5\x8a\x17\x73\x9f\x46\x3a\x1c\x3d\x6b\x21\x23\x39\x01\x83\xb5\x05\xc8\xee\xff\xb2\x05\x39\xbd\xfe\xeb\x40\x77\x6d\x20\xc4\x59\xba\xc4\x56\x99\x68\xfc\xaf\xe4\x4e\xa4\xcd\x62\x4a\x84\xbf\xcc\xd7\x87\x6d\xd7\xbf\x55\xf8\x3a\xc7\x04\x0e\x30\xf3\x26\xdc\xe3\x25\x58\x8e\x1b\xa5\xbc\x07\x90\x26\x5d\xfd\xba\x09\x83\x9e\xef\x57\x16\x41\xe8\xa1\x23\x4b\x6c\xfc\x3a\x36\xa8\x66\xbd\x6b\x92\xcd\x71\xec\x74\xe0\xd4\xde\xb9\xe7\x4d\x15\x82\x01\xaa\x50\x2f\x07\xc8\xba\x34\x8a\xc2\x6a\xaf\x9b\x3d\x07\x0c\x9a\x40\xb5\x2a\x44\xe9\x32\x55\x2b\x67\xa2\xdf\x05\xa7\xf0\xf0\x3c\x61\x7b\x48\xdc\x27\x82\x36\x6a\x23\x1e\x0c\x4e\x39\x38\xa4\x27\x4b\x36\xaa\x94\x50\xff\x93\x6b\xe1\x32\xdc\xb6\x92\x83\x8d\x65\x4c\x94\x54\x2c\x6e\x04\x7a\x7f\x78\xba\x71\x19\x19\xf9\x08\xa1\x5b\x30\xb9"}, +{{0x39,0x3d,0x44,0xdd,0x0d,0xed,0x71,0xfc,0x08,0x47,0x7b,0xd2,0x5e,0xd0,0xe6,0x62,0x9f,0xa7,0xf8,0x8f,0x08,0x2e,0xbc,0xef,0x09,0x18,0x98,0xe5,0xc9,0xe3,0xd5,0xb8,},{0xc5,0x2a,0x99,0x3b,0x80,0x2d,0x84,0x54,0x0d,0x27,0x54,0x79,0xa1,0xaf,0x5e,0x28,0x7d,0x19,0xea,0x13,0xb3,0x80,0xfa,0x30,0x68,0xd2,0xf2,0xc6,0x8e,0xb9,0x7a,0x09,},{0x84,0xc7,0x16,0xe6,0x0d,0xe6,0x7b,0x02,0x0c,0xc1,0xa6,0xa2,0x4e,0x65,0x49,0xfe,0x56,0xc6,0xd9,0x41,0xa8,0xed,0xea,0xe4,0x07,0x62,0x66,0x66,0xc3,0x1c,0xb6,0x0d,0xee,0x6b,0xe5,0xa7,0x1e,0xbd,0x76,0xba,0xf7,0x1b,0x75,0x11,0x4b,0xcc,0xfd,0x37,0xd1,0x63,0xa9,0x68,0xbb,0xee,0xc1,0xf7,0x69,0x72,0x15,0x12,0x96,0xc4,0x7e,0x07,},"\x14\x2b\x6e\x82\x50\x13\x62\xd5\x5a\x04\xb8\x9d\x54\x1a\x79\x68\x63\xd7\x78\x38\x40\xd3\x4c\xbd\xfc\x51\x6a\x3c\x84\x77\x2f\x92\x44\x6f\x5f\x0d\xf4\xc4\x5c\x6e\x0d\xc8\xec\x1e\x9b\xb0\xff\x7e\xc1\x69\x6a\x09\xcd\x7a\xe3\x4c\x10\xf8\xe6\x1a\x9a\xca\xbd\x43\x03\xf0\xa9\x24\x72\x37\x62\x1c\x49\x0e\x8d\x9d\x0f\xe4\x44\x82\xc5\x60\xd0\x51\xb8\x2b\x07\x4a\xc3\xd8\xe4\x9b\xb2\xac\x71\x5a\xc4\xcd\xe3\xd4\x70\x9d\x0e\xa3\xaf\xc5\x1b\xfd\xef\x4b\x65\x67\x71\xfb\xd5\x5f\x89\xda\x9f\xa6\xdc\xaa\x62\xcb\xae\x56\x12\x08\xd9\x8c\xfa\x24\xcb\x81\x25\x2b\x89\x5f\x6a\x4a\x92\xc8\xe4\x07\xaf\x6c\x1f\x1e\xf4\x9d\x8d\xde\x15\x4f\xbc\xb1\xca\x45\x7a\x20\x4b\x5e\xa5\x43\x2e\x4d\x71\xfb\x7e\xb2\x4d\x43\xf6\xfe\x25\xe7\xb4\xc6\x59\xb0\xee\xbc\x4c\xbc\xc8\xb3\xcf\xde\x07\xc8\xf0\x7b\x18\xa5\x15\x70\xe7\x16\x3e\x33\xb3\x17\xb6\x13\x60\xf9\xce\x08\xd9\x5d\xe2\xc3\x15\x6a\xf1\xcc\xc9\xb5\x5b\xcf\x81\xea\xbf\x3c\x40\x43\x40\x46\xbb\xe8\x2e\x02\x99\x2a\x2a\xc8\xb3\xb4\x25\x68\x0a\x23\xd9\x34\x72\x6c\xb1\xb7\xbf\x26\xce\xb5\x2a\x39\x02\x2c\x00\xac\xf4\x25\x25\x71\x67\xb8\x21\x18\x5f\x68\xe3\xed\x17\x90\x3d\x8d\x22\x27\x54\x98\xc3\x9a\x9e\x8d\xf8\x84\xec\x00\x55\x8d\xcf\xa4\x3b\x8a\x11\x9c\x2e\x85\x3b\x9a\x03\x18\xbb\xea\x08\x7f\x9c\xec\x17\xca\x49\xb7\x08\x17\xb8\xd7\xc1\x70\xa8\x90\x6f\x3e\xe9\xe8\xf8\xcb\x27\xa1\xd0\xf5\x75\xab\xfa\x62\x7e\x88\xf0\x8c\xa4\xb9\x3c\x32\x97\xc4\xf3\x17\x07\x2f\x42\x1c\x5e\x60\x2e\x2f\x83\x1d\xfb\x82\x55\x1b\xdc\xe8\xd7\x12\x16\xf0\x5c\xf9\xa2\x77\x3b\x90\xfc\x93\xb9\xd8\x55\xa9\x1e\x35\xad\xe3\x32\xa5\x06\x1f\xdb\x82\xb3\x09\xba\xb4\xf5\x6e\x2d\x58\x6a\x84\xc6\x74\x81\xd1\x90\x2c\x26\x1b\x3f\x97\xdc\x30\xb1\x84\x61\x9d\xf9\xfd\xfc\x7a\x32\x9d\x06\x1a\x41\xdf\x33\x22\x02\x13\x3d\x8e\xae\xed\xdb\x4c\xfc\xee\x53\x53\x6e\x07\xaa\xd1\x15\x53\xdc\xf5\xed\x1e\x94\x9d\x45\x35\x5f\x9e\xf4\x2c\x78\x32\xb0\xde\x7c\x2f\x15\x26\xfb\xef\x86\xb6\x36\x49\xb6\xb8\x5a\xe5\xca\x86\xf0\xce\xa6\xdf\x9c\x12\x6c\x1d\x79\x48\x9c\xc3\xbf\xc6\xe8\xbf\x03\x46\xeb\x30\xd0\x16\x43\xc0\x10\x15\x0c\x5c\x8d\x0e\xb5\x01\x0a\x46\x11\x22\x15\x13\x79\x91\x08\x5e\x57\x49\x3b\x22\xe8\x35\x26\xb7\xb1\x72\xc6\xc7\x34\x1c\x40\x32\x1e\x9c\xeb\x7c\x82\xbf\xba\xa4\x8f\x3b\xd8\xf5\x13\x72\xd9\x6d\x47\x44\x4f\xf0\xd8\xbb\x2e\x5f\xd2\x65\x14\xeb\x63\x91\x05\xe3\x38\x95\xfd\xc4\x1f\x6d\xf1\xfb\xfd\xcb\x08\x46\x6e\xc2\xd2\x17\xfc\x99\xfb\x01\x2f\xe6\x54\x0c\x0c\x5a\x59\x66\xed\x3e\x66\xfa\xb1\x20\x2a\xb9\xda\xff\xe8\xe2\x7e\x8f\x74\x62\x82\x8d\x66\x26\x59\xea\x3b\x2c\x60\x8c\xf6\x8e\x30\xdb\xac\x62\xff\xd8\x22\x9f\x4a\x53\xf5\x9a\xe1\x68\x33\xb8\x1a\x15\x91\x61\xf1\x93\x69\xf6\x0f\x51\xc4\x3a\x21\x7e\xfc\x5e\xfd\x6a\xb7\xa9\x1f\xe2\x49\xc7\xb8\xa0\xc1\x4e\x9f\xae\xa5\x33\xde\x13\x38\x49\xa9\x24\x47\x67\x6f\x6c\xc1\x8b\xef\x4f\xec\x7f\x37\x31\x97\x59\xce\x80\xea\x3e\xac\x18\xfa\x2d\x9f\xa0\x23\x09\xe1\xce\x93\xac\x6c\xf4\xcd\x2c\xb2\xc9\x5f\x1e\x2a\xff\x7b\x2a\x88\x56\x40\x5a\x7b\x8e\xba\xbe\xb4\x90\x6d\x9b\x97\x34\xda\x9f\xb5\xe5\xd3\xf3\x22\xbb\x5b\x55\x9f\xa6\x1e\xc8\xf5\x15\xdb\x90\x65\xab\x4b\x91\xa7\xa3\x1d\x5c\x62\x50\x61\xc2\xfd\x2b\xcf\xe1\x7f\x94\xbb\xde\x47\x76\x30\x2b\x8a\xef\x3d\x5b\x52\xdb\x3b\xc7\x3a\xe4\xa3\x0c\xc4\x41\x7a\xcb"}, +{{0x71,0x19,0x36,0x40,0xa0,0xa2,0xb2,0x2f,0xb2,0x2d,0x00,0xa8,0x0b,0x33,0xa5,0x51,0x4f,0x3d,0x10,0x00,0x03,0x4f,0xcc,0xd8,0x85,0xd8,0xea,0x86,0x38,0xf0,0xb0,0xf8,},{0xb1,0xd3,0x6f,0x72,0x3b,0x70,0x86,0xd9,0x23,0x11,0x9f,0x46,0x75,0x9b,0x39,0xfa,0x1e,0x40,0x38,0xc6,0x41,0x8c,0x37,0x9b,0xa9,0x8b,0x58,0x40,0xc7,0xea,0x50,0x68,},{0xa9,0x70,0x2a,0x33,0x95,0xac,0xd2,0x0d,0x75,0x43,0x73,0x09,0x5d,0xc6,0x14,0x45,0x58,0x4d,0x8e,0x57,0x10,0x80,0xe1,0x79,0xad,0xcb,0xa3,0x10,0x6b,0xb0,0x6a,0x7c,0xe4,0xd4,0x60,0xf1,0x26,0x1a,0xef,0x86,0x43,0xab,0x16,0x34,0xf4,0x7c,0x94,0x14,0xa3,0x2e,0x18,0x3a,0x32,0x76,0x91,0xe6,0x58,0x43,0xdd,0x6c,0x05,0x50,0x72,0x07,},"\xe0\x28\x79\x48\xbb\x85\xa3\x98\xe6\xaf\xfa\x2d\x25\xfc\xff\x8b\xdb\x93\x26\xf5\xd1\x4f\xde\xb6\x05\x49\xf5\xfb\xf0\xc1\x81\x6f\x11\xcb\xdd\x4e\x90\xfe\xa0\x39\xdc\xa6\x0f\xaa\xd1\x69\x60\x03\xf9\x15\x15\xc9\xb2\x72\x88\x2c\x95\xc9\xa4\xab\x6e\x27\x77\xbd\x92\x7e\x7d\x84\x42\xae\xa6\xce\xa6\x19\xc9\xb1\x52\x55\xfe\xd6\x12\xb5\xcc\x31\x58\xfc\x70\x5b\xb7\xa5\x06\xf4\xaf\xec\xf4\xe3\x4e\xd5\x17\xb2\xc1\x2b\x83\x62\x61\x0e\x5e\xa2\x70\x48\x5c\xcc\xb3\xc9\xaa\x97\xec\xd6\xcb\x19\x63\x09\x00\xf0\x7d\x94\xcb\x29\x3c\xb6\xe0\x89\xa9\xa7\x7c\x01\x94\x07\x3a\x7f\x71\x77\xb0\x23\x0d\x25\x76\x3a\x2e\xf9\x8d\x47\x70\x4c\xb2\xc3\xaf\x4c\x3c\x1b\x49\x56\x31\xb4\xa5\xb2\x1b\x2e\x56\xbf\xf2\xed\xe0\x3e\xa4\xfe\x7c\xf8\x29\x17\x34\x7e\x3a\x9d\x4d\xbe\xef\x37\xd1\xcf\x17\x61\x5a\xda\xa0\xfd\x17\x05\x79\x69\x91\x7d\x47\x8d\x03\xcc\xd8\xf8\xb8\x8e\x5e\x5a\xca\xe6\x73\x2a\x81\x61\xdf\xb5\xf7\xd0\x21\x23\xc8\xd5\xa5\x65\xcf\x4d\xd9\x8d\xfc\x9a\xaf\x5a\x33\x50\x58\xa9\x41\xca\x43\x07\x3f\x26\x59\x61\x5a\x72\xfe\x78\xc1\x01\xc4\x1a\xed\x07\xf3\xbc\xf9\x80\xb0\xa5\xb3\xfb\xaf\xdb\xbe\xa9\x2f\xd8\x89\xcf\xd5\x3d\x40\x32\x78\xbc\x15\xa5\x9a\xa1\x40\xc2\xd7\x73\xb8\x88\x9b\x96\x3d\xce\xa3\x65\x36\x2e\x42\x6e\xf4\x60\x98\x45\xc9\xbc\xe9\xf8\xae\xb5\x91\xd1\xa4\x69\xb0\x72\xb4\x12\x09\xf5\xa8\xb6\xdc\x23\x95\xad\x90\x60\xeb\x2e\x37\x09\x78\xae\x33\x11\xd1\xcf\x0a\x8f\x20\x51\x42\xd4\x36\xba\xb6\xb9\x59\x43\xa9\x7c\x23\xe6\x1b\xd1\x4b\x2d\x95\x67\x2c\xb9\x32\x5e\x9a\xb1\xfc\x9e\xee\xaa\xcc\xd5\x8b\x9f\x4a\xc1\x55\x0b\xde\xc8\x44\x9b\x03\x60\x39\x49\x6c\x5f\x07\xa5\xed\x64\xd5\xd8\x51\x71\x69\x01\x44\xdb\x5c\x81\xc8\x1c\xbc\x4c\x16\x71\x8d\x52\xc4\xdf\xd1\x95\x8c\xa5\xc9\xc8\xba\x58\x2c\xd9\xd7\x06\xf2\x7a\x74\x74\x4c\x3a\x05\xbf\x1c\xcd\x51\xf1\x09\x20\x10\xd3\x6f\x15\x78\xb5\x78\xae\x0e\x9f\xfa\x47\x07\x90\x55\xef\x94\xfa\xbc\x9f\xf7\x2f\x73\x8b\xef\x68\x46\x1e\xb3\x40\x4c\xce\xe9\x53\xf5\xee\x86\x4c\x97\x4c\xe7\x0e\x90\x37\xe3\x38\x8f\xba\xf2\x88\x9e\x13\x66\xca\xa0\xf6\x51\xe2\x1b\x33\x9e\x3d\x56\xb9\xd9\x5a\xc3\x0b\x35\x92\xa9\x48\x91\x2c\x90\xbf\x54\x47\x3c\xeb\xc4\x67\xb0\x9a\x39\x43\xdc\xac\x48\x68\xac\xb5\xb3\x5e\xa6\x91\xef\xf4\xd8\xcc\x1c\xda\x0c\x6c\x0a\x9c\x16\x9a\x4e\xe1\x00\x41\xf3\x5f\x43\x3f\xb5\x3d\x26\x06\x7b\x29\x10\x56\xb1\xda\x69\xff\x46\xfb\xea\x1c\xa7\x21\x36\x59\xa9\x90\xd5\xd5\xdf\x14\x06\xb0\x93\xda\x2a\x33\xc8\xdf\x95\xab\x3c\xe8\x11\xaf\xb9\xc9\x8c\x5b\xfd\x7c\x4e\x98\x1b\x3e\xa9\x4e\xef\xd2\xe2\xfe\x95\x70\x7d\x89\xf3\x07\xfa\x76\x82\x8b\x5c\x67\x74\x95\x0a\xee\x80\x62\x67\x14\x25\x6e\x19\x7d\xc7\xda\x97\x21\x58\xc7\x68\xbb\xee\x7f\xbd\x16\x9e\xc1\x5b\x4b\xb7\xbe\x72\x97\x6d\xbe\xd3\xe5\x12\x76\x6e\xf2\x2e\xf3\xb8\x12\xbc\xac\x4a\xa3\x11\x5a\xfe\x83\xd3\x12\x84\xaf\x8e\xac\xea\x4e\xe4\x9a\xfd\x42\xd9\xc4\x4f\xff\x2d\x86\x1c\x08\x62\x9b\x55\xda\xe0\x0f\xf6\x74\xfb\x02\x8e\x73\x8b\x05\xdc\xb3\x8a\xea\xa6\x96\x3c\xc3\xfa\xaf\xc7\xb6\x92\x45\xa2\xa1\x22\xa9\x6d\xd2\xf0\x3a\x82\x4d\x72\xb0\xfe\x0d\xd7\x98\xdf\x5c\x4b\xb7\x5a\x87\x32\x4e\x76\x4a\x50\xa5\xff\x52\x54\x7a\xda\x8f\x8f\x88\xe6\xf3\x8a\xee\x49\xd5\x8d\xdb\x01\x26\x48\x85\x4c\xd5\x9d\x0e\xc9\x7b\xc3\xd5\x8d\x0a\xd4\x49\x1f\x08\x59\x07\x67\xce\xb1"}, +{{0xbf,0xc9,0x62,0x6c,0x91,0xf3,0x48,0xfd,0xaf,0x46,0x9d,0xef,0x23,0x02,0xe9,0xe3,0x8f,0x90,0x51,0xe7,0x34,0x9e,0x48,0xf8,0x50,0xcf,0x35,0x2a,0x83,0x31,0xa2,0x8b,},{0x4e,0x81,0x93,0x06,0x1c,0x9d,0x65,0xa8,0x2b,0xcb,0x25,0xda,0x08,0x9b,0x4a,0x80,0xba,0x41,0xb3,0xdd,0x2f,0x8e,0xd1,0xdc,0x81,0xe1,0xcf,0xd0,0x3c,0x84,0x91,0x15,},{0x66,0x02,0x42,0xc1,0xdc,0xf3,0x29,0x13,0x69,0xc6,0x5c,0x9d,0x7f,0x89,0x87,0x2e,0xab,0x48,0x22,0x00,0xe3,0x44,0xb2,0x96,0xe3,0x36,0xa0,0xa2,0xe6,0x31,0xfa,0x79,0x60,0x24,0xb6,0xe1,0x11,0x9c,0x27,0xd5,0x22,0x64,0xa4,0x98,0x15,0xdd,0x78,0x19,0x27,0xa7,0xdf,0x46,0x7e,0x88,0xb8,0x01,0xe6,0x84,0xfc,0x60,0x22,0x96,0x25,0x0e,},"\x2f\x11\xf4\x0b\x2a\x19\xf6\x40\xc0\x04\x4c\x7b\x13\x96\x80\xc3\xc3\xb6\x9f\x00\xff\x9f\x6a\x41\x86\xfd\x7d\xed\x56\x9c\x1d\x8c\x57\x20\xf1\x9d\xd3\x5c\x78\x16\xd0\x8a\x94\xc0\x82\x04\xe4\x76\x43\xe2\x64\xd4\x25\xe2\x1c\xef\xb8\x31\x29\xc9\x09\xa3\xd7\x8c\xaf\x72\xc4\x6b\xf1\xa7\x29\x76\x5e\xf4\xb8\xca\x80\x3f\xda\xf8\x05\x2f\xfc\x6c\xc4\xa6\xb5\x79\xa1\x60\xb7\x03\xb1\x53\x55\xc6\xfc\xd3\xb9\xa2\xec\xbc\x26\x7e\x60\xdd\x59\xf6\xa2\xb1\x94\x20\xe5\x57\x27\xa8\x0b\x0b\xb6\x41\x67\xc8\x3b\xa0\xc8\x05\xde\xed\x49\x1d\x93\xe7\x23\xf3\xb4\x32\x63\xd1\x74\x20\xb8\x5b\xe8\x6c\x16\x5c\x55\x27\x79\xdb\x96\x0e\x0a\xa9\xeb\x4d\x9f\x3a\x16\x4a\x5a\x21\xfa\xb3\xf5\x09\xa8\xf0\x19\x9a\x69\x43\xc4\xb2\x23\xcf\x9d\xac\xa7\xe1\x10\xe0\x56\xa8\x1d\x9c\xe0\xe0\xc0\x2a\xc2\x65\xee\xac\x05\xec\xd8\x44\x48\x46\x8a\x4d\x12\x2b\x87\xa3\xe0\x4c\x28\x37\xe4\x3d\x21\x27\x04\xfd\x41\xe7\xf3\xd1\x98\xa2\xe7\x6b\xec\xa0\xe7\x02\x9c\x43\x2a\x06\x54\xec\xd4\x4f\x98\x4c\x5d\xf0\x67\x41\x96\x4d\x83\x72\xc8\x6e\x16\x2a\x8c\x54\x18\x84\x9b\x41\xe5\x71\xfe\xb8\x3e\xb4\x2f\xbb\xcd\xdb\x8a\x08\x21\x43\x90\x9e\xaa\x50\x12\xb9\x79\x93\x1d\xc7\xe3\xcc\xcb\x44\xc7\x91\xe0\x4b\x80\x65\xee\x63\xf0\x56\x1d\xa1\xbb\xf3\x7b\xf6\x50\x34\x77\x87\x9c\xfb\xaf\x6d\x9d\x7d\x9a\x74\x75\x55\x3f\x53\x53\x5f\x84\x7a\x76\xdc\x3b\x2b\x7a\x3d\x1d\x47\x0b\xbe\x17\x12\x4a\x88\xe0\x3f\xe9\x94\xba\x10\xc2\x42\x21\xe3\x9e\x3d\x0f\xf5\x3c\x79\xe2\xfa\xaf\xa1\x90\x12\xd5\xef\x19\x2b\xc6\xd5\x26\x0b\x66\xf9\x97\xb6\x44\xcf\x48\xd9\x9f\x38\x99\xd7\xc4\x85\xe6\x84\xaa\x1e\x6e\x30\x85\x5c\xf7\x5c\x2d\x80\xc7\xa3\xee\x43\x54\xfe\x13\xc6\x76\x09\x1c\x86\x67\x37\x3d\x30\xe6\x0f\xf8\xe0\x9f\xed\xef\x17\x5a\x1a\x87\x39\x5f\xef\xa0\x72\x2b\xf6\xc0\x1c\x65\x55\xcf\xf0\x68\x89\x2a\xfe\x94\x86\xcb\x1f\xcc\x5f\xb6\x64\x1e\x82\xd8\x70\x79\xba\x5d\x7a\x9c\x13\x93\x55\xd6\xc1\x4c\x50\x7d\xbd\x59\x47\x24\xb5\x53\x51\x10\x09\x65\xbe\x9e\x5d\xbf\xa7\x70\x88\x78\xc4\xb2\x9f\x4d\x54\xc2\x17\x74\x6e\x32\x6a\xb2\xa5\x4f\x99\xb8\x81\xd7\xda\x5b\x11\xed\xb0\x8a\x6d\x79\xd8\x85\x69\x1b\x1f\x70\x85\x51\x73\x10\xb3\x09\xcf\x9b\x1b\x71\x4a\xab\xc5\xc1\x7a\x50\x9b\x14\x0b\x89\xb3\xf9\xdc\xee\x50\xca\xb4\x41\xbf\x5a\xd3\xbb\xc2\x99\x90\xf6\x27\x40\x61\x70\xa7\xa1\x0f\x2d\x47\xdf\xc9\x25\x61\x54\xf9\x62\x30\x8e\x76\x9a\x2a\xb1\xb2\xa0\x0e\x27\xe3\x27\xf0\xd1\xfa\x16\x4d\x1e\x38\xea\xd5\xce\xaa\xe2\x38\xba\x52\x6f\x54\xb8\x1b\x45\xde\xa6\xc8\x97\x41\x86\xb1\xb6\x72\x5f\xa4\xc8\x3e\x62\xf3\xe2\x54\xf7\x29\x87\x1b\xda\x4d\xc4\x44\xbc\xe7\x8f\x09\x03\xfa\x31\x8e\xaa\xc8\x22\xa9\x55\x32\xab\x01\x9e\x9c\xfc\x56\x19\xe2\xc2\x06\x7f\x25\x8f\x43\x75\xd2\xe0\x22\x2e\xa5\xbf\x96\xa2\x53\xa2\xa3\xfa\x9e\xea\x02\xc3\xee\xcc\xb0\x28\xc7\x6b\xc6\x0d\x38\x29\x8b\x95\xb9\xaf\xe6\x60\x31\xb1\xa2\xa2\x61\x52\xfd\xaa\x7e\xf4\xf8\x37\xab\xb5\x11\x85\xdf\x8b\x2e\xf8\x5a\xd2\xc9\xbe\x6d\xfb\xa7\x5e\x37\xdc\x7d\x12\xe1\x78\x7f\xc5\x5f\x86\x6f\xd0\x66\xf1\x22\x91\xdf\xf1\x97\x6a\xfc\x10\xda\x91\x31\x01\xe7\x04\x95\xd8\x78\x33\x48\xd6\x11\xb0\x11\xec\x67\x1c\x0d\xa7\x37\xbf\x96\x2c\xdc\xc9\xe4\xa8\x00\xb5\x13\x93\x5a\x56\xd0\x84\xea\x64\xa7\xd4\xe8\xe9\x9e\xe9\x44\x0a\x73\x61\x32\xe4\x2c\x90\x95\x03\xc2\x22\x4a\x14\x1b\x25\xce"}, +{{0x39,0x3b,0x76,0x94,0x82,0x37,0x5b,0x82,0x14,0x27,0xa6,0x6d,0x16,0xe4,0xf5,0x51,0x85,0xb7,0xa3,0xb7,0x33,0x8f,0x1a,0x06,0xf6,0x7c,0xdf,0xa7,0xe3,0x5c,0x54,0x1c,},{0x84,0xaf,0xd7,0x06,0x78,0xff,0xa8,0x5a,0x9f,0x65,0x74,0xcb,0xcf,0xe3,0xb1,0x5d,0x04,0xa9,0xfd,0x15,0x01,0x6f,0xf8,0x55,0x0a,0x98,0x7c,0x4b,0x95,0x1c,0x71,0x22,},{0x31,0xf9,0x8c,0x0a,0x08,0xfd,0xa8,0xe7,0x35,0xb5,0x73,0x66,0xaa,0x1b,0x83,0xb9,0x3d,0xae,0x63,0xb5,0x81,0x0c,0x82,0x1d,0x99,0xcb,0x39,0xdf,0x52,0x1f,0xea,0xc0,0x7f,0x3c,0x41,0x0b,0x27,0xba,0x33,0x07,0x75,0x7d,0x60,0x49,0xf2,0x24,0x54,0xfb,0x6d,0xe9,0xe2,0xc3,0xc2,0x43,0x8d,0x68,0x31,0x90,0x97,0xd1,0x12,0xcf,0xdb,0x07,},"\x8a\xe8\x05\x3e\x03\xbe\xbe\xae\x54\x40\x43\xb8\x41\x4b\x38\x53\x64\xad\xd1\x67\x37\x37\xcf\x8a\xb2\x01\x93\xd4\xaa\xbc\x8a\x78\xe1\xd6\x9b\x9c\x7e\x52\x72\x9e\x69\x30\x78\x06\xe9\x27\xce\x38\x07\xb0\x7c\x68\xc8\x33\xc4\xfc\xf1\x6d\xb1\x5e\x7d\xce\x60\x4d\x17\x98\x91\x5f\xd4\x21\x16\x89\xb4\x86\x46\x42\x50\x2d\x38\xe9\x1b\x19\x97\xb7\x18\x23\x31\x8b\x69\xab\xe5\xbe\xd6\xf5\xe3\x01\x5b\xfb\x22\xdf\x30\xdb\x37\x1f\x22\x60\xc5\xc2\x2e\xba\x60\xdf\x39\xb3\xed\xd3\xc4\xd7\xa1\xe1\x11\xcd\x9b\x8a\xa4\x6f\x67\xbd\x0c\xf3\xa7\x17\xaf\x06\xec\x0c\xe5\x67\x02\x8e\x06\xe4\x79\x79\x34\xad\x69\xb1\xf5\xbe\x44\x0f\xf3\x7a\x8a\x03\x4b\x15\x33\xfa\x94\x64\x24\xac\x59\x54\x00\xad\x27\xd3\xbe\x76\xdc\x89\xba\x9d\x6c\x49\x93\x9a\x09\xf2\xe4\x01\xc8\xf2\x0f\x7f\x7b\x4b\x9e\x63\xb9\xd5\x52\x01\x53\x4a\xb4\xcc\x7b\xe8\x85\xf0\x43\x2a\x2c\x66\x73\xd2\xe7\x65\x19\x4d\xff\xd9\xb6\x09\x6d\xd2\xb2\x84\x39\x18\x75\x09\x59\xa8\xdd\xe4\xa3\xab\x40\x7e\xb2\xf7\xe1\xa4\x9c\x25\x97\xe3\x08\x05\xf8\x48\x0d\xd0\xcc\x82\x72\xa3\x20\xc0\x0a\xa2\xb2\x10\xf5\x76\xe4\x25\x77\xd3\xaa\x41\x97\x03\x69\x7c\xa4\x06\xd4\x3a\x1a\x4f\x99\xb0\x73\x36\x64\xf6\xd6\xb2\x40\x3c\xba\x1b\xdc\xc5\x1f\x54\x1c\xf2\x42\x36\x07\x05\x70\x54\x07\x55\xc7\xa8\x63\x1f\xcc\x2f\x18\x93\x8f\xa1\x1b\xc2\x91\x15\x5b\x39\xd7\xa7\x62\xa1\xff\x4d\xca\x97\xb4\x48\xf7\x0e\x2d\x3d\xe4\x47\xcb\x08\xf9\x18\xea\x20\xcb\x43\x3f\xa1\x15\xe3\x08\x80\xc9\x6c\x8c\xf5\xf0\xeb\xbc\xf4\x82\x30\x9d\xb6\xdc\x1f\xb6\x4e\x17\xc0\x4d\x7c\xdf\x7a\x90\xf4\x01\x4d\x15\xae\x76\x96\xb4\x44\x23\xb0\xba\x08\x4e\xed\x4d\x3f\xb2\x8c\x1e\xfb\x39\x82\x8a\xca\x2f\x40\xca\x6d\xf3\x42\xc2\x0e\x95\xf8\x00\x6b\x27\x67\xa8\x3f\x50\xc3\x1f\xcc\x15\x81\xa0\x97\x53\xe7\x82\x91\xf0\xd9\x93\x1d\x99\x2a\xd3\x60\x44\x73\xce\xb8\x85\xec\xbe\x78\x57\xcc\x52\xad\x55\x85\x33\x4d\x14\x85\xd0\x22\xe1\x06\xb7\x1c\x29\xbd\xfc\xf2\x3e\xe8\xa4\x75\xdf\x2c\x09\x05\x32\x35\x6a\x6f\xfc\x02\x23\x23\x17\x98\x8a\x2c\xbc\xfb\xc2\xa3\x6b\x4b\x48\x3c\xb4\x45\x10\xe8\x55\x99\xb6\x12\x59\x6b\x62\x65\x72\xb0\x99\x6d\x8a\x61\xc0\xee\x3e\xff\xf1\xf7\xc7\x1c\x05\xfb\x5a\x8d\x8c\x5d\x09\xd9\x24\xeb\xaa\xc8\x80\x04\x51\xc9\xdb\x24\x56\x71\x0a\x27\x9d\xfe\x2d\x22\xf6\xae\xa9\xde\x31\x80\x1d\xc7\x42\x53\x43\x62\xb0\xe8\x10\xe9\x9e\x84\x1d\xbb\x7f\x0c\xf9\xaf\x1a\xef\x54\x2a\x52\xc7\x76\xcc\x51\xf2\x87\x36\x8f\xbe\x6a\xd6\x51\xfa\xd5\x78\x7e\xf7\x7c\x73\x53\x5f\x3d\xfb\x36\x18\xcc\x8f\x0d\xbb\x54\x9d\xdc\xa9\xb9\xbf\x91\x13\x5a\x34\x56\x00\x1a\x46\x21\x5a\xde\x38\x8e\x7c\xeb\x9f\xcd\xfd\x0d\x2d\x0a\x03\x56\xaf\xbe\x2c\xec\x1c\x2e\x78\xb4\xd9\x98\xd4\x55\x4f\x46\x21\xf1\x15\x1d\xd3\xff\xd3\xba\x4c\x0b\xc8\x52\xf3\x11\x75\x8c\x5d\xca\x42\x5d\x18\xba\x15\xa8\xd6\x7c\xa4\x01\xd0\xe6\xcf\x28\x0c\xb8\x83\x84\xa2\xda\xd4\x9f\xae\x39\xba\x2a\x77\xb4\x67\xb3\x23\x8a\xa2\x8c\xfd\x13\x7e\x5c\x5c\x0f\xf9\x00\x0f\x8b\x06\xa2\x19\x2e\x16\x29\x20\x69\x22\x65\xdb\x24\xab\x6a\xed\xe5\x35\xe3\x1c\x20\x93\xbe\x57\xeb\xf8\x80\x5d\xf1\x78\x89\x14\xf3\xa8\x84\xf8\x84\x17\x90\x15\x80\x8d\xb4\xd3\x02\x0f\x3e\x78\xbc\x34\x28\x5d\x23\x37\x62\xe8\x99\xeb\xff\x28\x42\x82\x15\xe2\x44\x40\x4d\xe2\x91\x72\x8f\xbf\x41\x24\xce\x5b\x24\x35\x26\x0a\x8e\x34\x11\x80\x07\x5a\x56\x51\xe6"}, +{{0x26,0xcb,0xc2,0x51,0x0e,0xe6,0xea,0x39,0x0a,0x2c,0xb9,0x48,0xa0,0x15,0xd1,0x31,0xab,0xf4,0xc0,0x95,0x49,0x15,0x62,0x0b,0x78,0x16,0xae,0xcf,0x4e,0x11,0xda,0x6d,},{0x14,0x5e,0x8d,0xd2,0x2b,0x44,0x00,0x28,0x9d,0xaf,0xb6,0x26,0xd9,0x5a,0x94,0xc2,0xf3,0xb6,0x9c,0x65,0x19,0x77,0x17,0xcb,0xdc,0xd8,0x50,0x98,0xc5,0x49,0x21,0x07,},{0x67,0x10,0xd0,0xdd,0x00,0x54,0x5b,0x44,0x4c,0xf7,0x14,0xb7,0x91,0x44,0xfe,0x79,0xf3,0x8c,0xb1,0xc0,0xf5,0xb7,0x42,0x48,0xd4,0xf0,0x1f,0xe3,0x60,0x11,0x7a,0x26,0xff,0xed,0x4a,0x3b,0xf2,0x13,0x23,0xb2,0x8a,0x39,0x3a,0xe9,0xde,0xe0,0x7d,0x69,0xe5,0x83,0xe3,0x16,0xc6,0xa5,0x73,0xd3,0x7c,0x64,0x4a,0x8d,0x62,0xc4,0x05,0x06,},"\x9c\xeb\xe2\x4b\x4f\x8a\xde\x86\x43\x0e\x27\x9a\x3c\x43\x3e\x4a\xe1\x7e\x00\x88\x52\xa2\x4f\x08\x69\x0c\xbc\x3d\x75\xe3\xb7\xf2\x00\xda\x89\x7c\x25\xf7\x48\x3b\x37\x63\x7d\x4b\xc1\x10\x08\xd9\x22\x4c\xd5\x81\xfb\xc0\x38\xad\xad\xa0\x2d\x27\x1e\xd2\xa5\xd2\x85\xd8\x43\xa0\xf8\xb7\x9e\x37\x94\x5d\xc3\x5b\xc2\x64\xbe\xcd\x80\x43\x07\xe1\xd4\x42\x18\xa6\x43\xe4\xb5\x9a\x93\x11\xde\x98\x5d\x24\xb4\xc2\x6f\xb1\x46\x03\xbe\x5d\xba\x18\x39\xee\x0c\x8d\x2e\xde\x6c\xb5\x0a\xf6\x7c\x80\x45\x19\x03\x7b\x1b\x16\x63\x31\x8c\xfc\x6e\x75\xd0\xf0\x51\xdb\xb5\xd3\xea\xf3\xaa\xd1\xf7\x8e\xf0\xcf\xf4\x8d\x5c\x55\xb2\xfd\x25\xdb\x15\x39\xd0\xf0\x2d\xae\x9f\x25\x14\x8a\x8d\x33\x8b\x97\x87\x9b\xbd\x39\xdf\x96\x1a\xa2\xc3\x96\x31\x5a\x2a\x86\xcc\x78\x35\x81\xe6\x7e\xa8\x44\xac\xfe\x86\x45\x42\x8a\x27\xb8\xd3\x2e\xa3\x06\x4e\x3b\xf6\x2d\xcf\x58\x01\x0e\xc4\x34\x88\x62\xfa\xc2\x5e\x3d\x9f\xcd\x4e\x5d\x65\xbe\x59\x90\x5d\x81\x6d\xfb\x96\x49\x92\xba\x7a\xce\xef\x8c\x20\x75\xa3\x12\xe5\xff\xc4\xf9\x53\x0e\xa2\x0f\x77\xf9\x3e\x81\xcf\x8a\x01\x9d\xc3\x94\x56\x34\x36\x4b\xab\xf7\x97\x72\x04\x5a\x0d\xba\xa7\x7c\x47\xa2\x2b\x77\x22\x3b\x70\x4d\xeb\xd2\xd0\x03\xf6\xa5\xc7\xbf\x6b\x19\xcd\x2c\x49\xb6\x14\xfd\x4d\x47\xfd\x25\x1f\xe6\x22\xcb\x98\x17\x85\xc1\x46\xbd\xb7\xc1\xd2\xea\x02\xb1\x16\x92\x3b\xf9\x8a\x1a\xfb\xb7\x85\x8a\xdf\x2d\xf9\x38\xa7\x90\xec\x1f\x90\x74\xad\xb8\xd1\xaf\xb5\x63\x3f\xa9\x61\xa8\x47\x64\x01\x0d\x3b\xde\xd1\xc0\x33\xd2\x5a\xbd\xb4\xb0\x0f\xb0\x5e\xd7\x64\x0f\xae\x61\x87\x9d\xf8\x8f\x0b\x09\xe3\xab\xd0\x57\xb9\xa5\x21\x08\xa9\xbc\x98\x5f\xb7\x3a\x5f\x29\xd8\x4d\x1c\xa6\x92\x1b\x62\xf1\xb7\x03\xc7\xee\xb4\x81\x5d\x9d\xd6\xd0\x66\x73\x8d\xb1\x18\xba\xf6\x1b\x04\x22\xf3\x88\xf1\xbf\xc9\xe3\xa9\xbe\xd8\x3a\x1a\x72\x7d\xcc\x26\x6a\x99\x88\x36\x48\x46\x80\x7f\x4d\x55\x18\xbc\x2e\xdd\x0e\xcb\x34\x13\xc2\x6f\xd0\xc7\x9b\x75\xd8\xcb\x5b\xcd\x85\xc0\x6f\xcc\xea\x4d\x03\xfb\x89\x88\xdf\xf3\xed\x0c\xc9\xdb\xae\x78\xd6\xae\x8d\x5f\xc4\x02\x46\x17\xa2\x3f\x52\xbd\x61\x53\x85\xd4\xee\xe0\x8f\x91\x34\xeb\x3b\x25\x0c\x8f\x82\x2b\x47\xd9\x1e\x8c\x4d\x4c\x29\x29\x80\x16\xe6\xfc\x81\xf1\xf1\x09\x92\x53\xd7\x94\x5e\x07\x98\x95\x5d\xa0\xdd\xe1\x4e\xbb\x93\x4e\xcf\xae\xea\xba\xe8\x78\x83\xe1\xcc\x39\x80\x67\x40\x0f\xe4\x62\xa2\xc4\xe9\xf2\x32\xdb\x5c\xdd\x61\xeb\xa9\x49\x18\x8c\xf0\x1b\x23\x8b\xe7\xad\xa9\x38\xf0\x02\xdc\x3a\xe3\x1f\xdf\xd4\x25\xc8\xd4\x6e\xa0\x32\x32\x3a\xaf\x20\xdd\x3d\xe2\x50\x7d\x36\xbb\x45\xfb\xb9\x1c\x40\x96\x9a\x9e\x5d\xa2\x0f\x7f\x93\x6b\x0f\x4b\x13\x7b\x62\xfe\x2b\xa3\xa6\x67\xbc\x03\x62\xd9\x3f\xc5\x0d\x3f\x22\x95\xe1\x67\xfc\xba\xb0\xfb\x3a\x39\xb7\xcb\x02\x4b\x57\x8f\x94\x90\xf7\x34\xb2\x8c\x9c\xcf\x71\x92\xf1\x83\x94\x7d\x5a\x51\x3e\xfa\x49\x16\xe4\xd8\x2b\x2a\xb4\xba\x7e\xc2\xff\xba\x21\x3c\xe8\x2a\xd6\xed\x3b\x10\xe4\x85\x53\xe7\x33\xc9\x40\xaa\x9b\x9c\xe7\x13\x37\xc6\xc2\x80\x5d\xfb\x8d\xd6\x61\x8b\x6d\x40\x90\xa3\xd6\xcc\x96\x3e\xce\xa2\x6d\x1c\xdc\x2b\xf5\xac\x99\x9c\x11\x27\x61\x68\xa9\x31\xd8\x16\x46\x9d\x79\x08\x3c\x24\x08\x1a\x50\xdc\xbd\x22\x27\x52\x38\x52\x67\xce\x1b\xfc\x1d\xb7\x6b\x15\x54\xad\x57\xe3\x47\x52\xb7\xf8\x98\x31\x47\xc1\x16\xd4\xa3\xfa\xe6\xf6\xd5\x7e\x65\x4f\xed\xd7\x37\x8d\x2b\x49\x89\xea"}, +{{0xb1,0xf5,0x9e,0x3c,0x23,0x80,0xd7,0xaa,0x41,0x4d,0x0b,0xf9,0x08,0x93,0xa3,0x8d,0xdd,0xfc,0x29,0x38,0x59,0x30,0x3d,0x16,0xf0,0x0d,0x9e,0xae,0x6c,0xb3,0x45,0x0e,},{0x84,0xe3,0xf5,0xf7,0x2f,0x19,0x09,0x5b,0x0f,0x53,0x38,0x48,0xa5,0xa9,0x1d,0x0f,0x07,0x43,0xb8,0xe3,0xa3,0xe2,0xf5,0x2f,0xcb,0xd7,0xeb,0xe7,0xc5,0xb5,0xa9,0x98,},{0x60,0xaf,0xc1,0xe9,0x91,0xfd,0xd2,0x7c,0xc4,0x72,0xb9,0xac,0xc9,0xd4,0x05,0xb4,0xd2,0xb9,0x13,0x08,0x92,0x90,0xb3,0x11,0xc4,0xfa,0x89,0x1a,0xe2,0xee,0xa0,0x56,0x71,0xfd,0xe7,0xa0,0xef,0x86,0x55,0x7b,0xd8,0x67,0xd1,0xc0,0xb7,0x47,0xca,0xf3,0x52,0x29,0xd6,0xef,0x52,0x8f,0xe3,0xe0,0xd0,0xbc,0xf6,0x30,0x38,0x0e,0xa9,0x0e,},"\xc6\x17\x4c\x9a\xd3\x68\x5d\xd6\x48\x63\x60\x17\x83\x7b\x8d\x99\x22\x00\x31\x9e\x9a\x5a\x0d\x26\xd9\x4d\x2d\xa7\x5e\x2c\x3a\xff\x46\xf4\x2d\x7b\x3a\xba\x47\x2b\x7f\x86\x0b\x0f\xe1\xf6\x95\x52\x97\x31\xfd\xc8\xcf\x0d\xa7\x05\xd1\xd0\x9a\xca\xd0\x4f\x01\x08\x37\xec\xef\x41\x9d\x57\xe9\xea\x6c\xac\xf1\x68\xc5\x21\x56\x96\xf4\x71\xf3\xca\xa8\x97\x60\x7c\x62\x9d\x44\x3d\xe0\x99\xd3\x17\x53\xc2\x46\x77\xd8\xd7\x5f\x4b\xf1\x72\x46\x81\x8b\x58\xad\xc0\x42\x4b\x76\x2a\x19\x1e\xf3\x9a\x70\x76\xa5\xad\x12\x61\x4c\xf5\x4c\x47\xeb\x09\x08\xbb\x86\x65\x18\xc5\xfa\xc1\xca\x2d\x2e\x5b\x65\x75\x20\xa2\xb3\x69\x5c\x6f\xb3\x60\xf1\x6f\x4a\xb3\x57\x99\x8e\x4c\x0e\x97\x23\x1d\x6f\x89\xc9\x68\xdc\x29\xec\xc1\xaa\x91\xfa\x0d\x75\x43\xb5\xd2\x24\x7b\x0d\x85\xe4\x87\x43\xab\x7c\xc8\x15\xcf\xda\xa8\x2b\xf6\x8c\xa6\xd3\xe2\x25\x0b\xfd\xa2\x70\x24\xd6\x1b\x47\x4c\x6b\x81\x54\xac\x8d\x1b\x5a\x36\x20\x97\x82\x51\x5c\x16\x46\x68\x0d\x37\x06\x9b\x8b\x44\x12\xf9\x51\xb0\x25\xa4\xd5\x43\x62\x5d\xd0\x22\x90\xbf\x03\xc6\x73\x46\x13\xf9\x9b\x7a\x4c\x3a\xf5\xc5\xf9\xe9\xac\x34\x74\x46\x5e\x64\x84\x23\x01\x8d\x40\xa6\xad\xbe\x88\xa3\x30\x1d\x3d\x25\x9b\x04\xee\x44\xcc\x05\x62\xee\x0d\xed\x4f\x5e\x26\xad\x97\x7a\xb5\x63\x1f\x85\x76\x8d\xbc\xe5\x3f\x61\x6c\x02\x9a\x8b\x8f\x93\x3e\x2a\x92\x64\xb1\xc8\x1f\x51\x7e\x9f\xf5\x8a\xb9\xf4\x5a\x23\xee\xed\x42\x04\x35\x8f\x8f\xff\x0c\x8f\x97\x5e\xf1\xdf\xa5\x77\x6a\x5f\x77\x93\xba\xe2\xf2\x81\xd7\xb0\xcb\xef\x24\x0b\x3f\xc6\xbe\x05\x88\x21\xea\x2b\x80\x0f\xff\xe5\x5a\x7d\xe0\xaf\xc9\x3e\xde\x9c\x60\xc8\xde\x00\x5a\xbb\x9a\x2c\x88\xf4\xe6\x1e\x8d\xeb\x31\x70\xf1\x07\x8a\x36\xe2\xd8\xf2\xa5\x82\x39\xbd\xee\x49\x6e\x90\xd1\x37\xd2\x11\x0f\x0a\xd8\x57\xa8\x8b\x35\x27\x66\x4f\x78\x19\x39\xe0\xb2\xf7\x66\x34\xff\x9f\x6c\x57\xe1\xc4\x3f\x58\x24\x31\x71\xcd\x86\x2e\xf4\x28\x45\x76\x17\x2a\xf1\xf6\xc3\xbd\x37\xd5\xd7\x4b\x28\xa7\xa9\x86\x98\xbd\x74\xe5\x7b\xbc\x14\x2e\x67\xf7\x03\xf9\xd6\x2c\xde\x76\x1a\x02\x26\x8f\xec\xb3\x43\xfc\x01\x41\x88\x36\x41\x4f\x12\x22\xca\x24\xbc\xdd\x69\xd0\x05\x90\x1d\xa2\xa0\xf9\x44\x65\xe4\xd4\xba\x68\x89\x88\x16\xbf\x7e\x3e\x4b\xb7\x9c\x8c\xa5\x99\x7f\xba\x9a\x8d\xf8\x4f\xaa\x2d\x24\xb0\x44\xc4\xea\x61\x02\x9a\x46\xcb\xa7\x03\x42\x1e\x36\x1d\xfa\x52\xca\xaf\xf3\xbb\xaa\xb7\xfd\x75\x3f\x28\x56\xd7\xc0\x83\xae\xb9\x76\x8d\xa1\x1d\x82\x1e\x2d\x30\x9f\x7a\x73\x5c\x39\x96\x92\xda\xc2\xf2\x62\x84\x6b\x89\x1b\xf6\x46\x1a\xf2\x3c\x8c\x7c\xe1\xd4\xd9\x03\x2c\x3c\x14\x0f\x73\x9e\x55\x84\xc3\x6f\x05\xea\xf4\x34\x9f\xf4\x54\x5f\x28\x3a\x4e\x0f\xea\x49\x43\x0a\x1b\x18\x0d\x08\x71\xe3\x74\x2b\x88\xcc\xb5\x91\x12\x4f\xc4\x27\xed\x67\x3b\x5f\x27\xb0\xb0\xa6\xf5\x4a\xf2\x2b\xa4\xa6\xd1\xc6\xc1\xdb\x2a\x1f\xca\xa6\xd8\xa0\x30\x8b\x77\xef\x2d\x0c\x61\xbb\xf5\x1b\x95\xf1\xe8\xb6\xab\xc5\x04\x1d\x97\xb6\xb6\xf1\xb5\x69\xb3\xf6\x3c\xec\x05\xcb\x56\x7a\xae\xa1\x06\x72\x70\x96\xee\x8a\x9e\xa8\x7b\x88\x04\x90\x1f\x7e\x88\xa7\x40\x9c\x66\xf1\x52\xde\x9d\xbf\xcb\xe3\x19\x52\xe6\xfd\x83\xb2\x87\x7a\x77\x5f\xae\x42\x5b\x38\x51\xe0\xef\xf8\x79\x2f\xfb\x38\x48\xf8\x4a\x65\xcc\x31\x72\x53\xb2\x72\x47\x5e\x71\x7e\x49\xe9\xc6\xff\x6b\x78\x59\xd1\x1b\xba\x7c\x44\x28\xc8\x2d\x17\x89\xe0\xdc\xa5\xbc\xad\xca\x2f\xdb\x25\x9e\x98"}, +{{0xdb,0x46,0x1b,0x9f,0x70,0x7e,0xb2,0xcd,0x77,0x48,0xc4,0x4c,0x99,0x56,0x2f,0x13,0x02,0x39,0x74,0x89,0x35,0x3d,0xf5,0xf3,0x03,0x79,0x7f,0xe0,0xd0,0xb5,0x8d,0xe1,},{0x63,0x51,0x16,0xda,0x8b,0xa5,0xa3,0x6a,0x37,0x77,0x28,0xe2,0x86,0x18,0xe7,0x5c,0x55,0x92,0xae,0xcc,0x18,0xe3,0x40,0x11,0xc4,0xc4,0x25,0x91,0x97,0x0b,0x73,0x66,},{0xdd,0x04,0x9c,0xa7,0x9b,0xeb,0x9e,0xac,0x32,0x5a,0xcf,0x44,0x67,0x2f,0xf5,0x78,0xa9,0x68,0x50,0x2f,0xe1,0xbc,0xf5,0xea,0x19,0xd5,0x2c,0x0f,0x67,0x78,0xc7,0xf1,0xc7,0xbb,0xf7,0x42,0x74,0x79,0x07,0x78,0x6e,0x60,0x81,0x23,0x91,0x1a,0x92,0x07,0x78,0xd2,0xf9,0x59,0x6f,0xe2,0x9b,0xe7,0xcc,0x28,0xfd,0x00,0x9d,0x7c,0x44,0x0e,},"\x1a\x2a\xc8\xc1\xb9\xea\x09\x9b\x83\x1a\x68\x12\xd2\xb4\x26\x13\x09\x05\x8e\xa5\x88\x3d\x70\xb1\xc6\x07\xb9\xcd\x3f\xdf\xdb\x86\xe7\x99\x02\xb0\xfe\x89\xe8\x0e\xa7\xc4\x78\x20\x76\x74\xb2\xd8\x03\xb0\xb9\xca\x14\x7f\xfe\x62\xe5\x94\xf5\x06\xc7\x96\xd6\x89\x97\xce\x48\x2b\x51\xa4\x6e\x49\xb4\xa5\xd8\x58\xcd\xea\xe2\xc6\xec\x9b\x69\x41\x98\xe6\x82\x2f\x0e\x33\xed\x57\xbe\xdb\x03\x35\xc7\x89\x0a\x72\xa7\xee\x3c\x23\x82\x3b\xe7\x9b\x7f\x94\x71\xe0\x33\xc7\x9a\xee\xd5\x2e\x57\x60\xfb\x0c\xcb\xb9\xd3\x8f\xde\xd8\xb4\x73\x83\xc1\x91\x03\xce\x44\x70\x58\x34\xc5\x9d\xdd\x86\xf7\x03\x39\x48\x61\x2d\x66\x62\xf5\x16\xce\x4e\x39\x9f\xf2\x03\x63\xcc\x72\x81\xa6\x9b\x2d\x5c\x30\x7b\x10\xb7\x04\x15\x01\x84\xec\xe3\x2f\x39\x0d\x77\x2c\xcf\xa7\x84\x83\xbb\x77\xa9\xfb\xa8\x44\x25\x36\x69\x84\x17\x1c\xc2\xbb\x60\xb0\xec\x6c\x62\x8d\x4e\x90\x30\x74\x6d\xac\x1c\xab\xca\x60\xf0\x56\x83\x81\x33\x46\xa1\xa5\xbc\x14\x72\x75\x49\x79\x5c\x1c\x92\x68\x69\xe1\xaa\x25\x09\x3d\x59\x1b\x43\xe0\x86\xe4\x3a\x04\xd1\x70\xd9\x42\xc4\x16\x5e\x1c\x5c\xe7\x6c\x3e\x64\x97\x3d\x91\x36\xf9\x32\x5b\xee\x82\x16\x82\xf1\x04\x3e\x95\x1b\x02\x76\x7f\x3f\xb4\x58\xd0\x24\x49\xad\xd3\xe8\xa6\x6e\x51\x6f\xdb\x1e\xd5\x80\xe0\x56\xe0\xf7\x8e\xe3\x3f\xd9\xee\x32\x80\x91\x2f\xae\x07\xfe\x1e\xa0\x25\x27\xcd\x00\x1d\x6f\x6f\x2f\x89\xee\x64\x9f\x51\x74\x14\xd5\x6f\x57\x35\x9a\x84\x68\x91\xf0\x22\x2c\x32\x1d\x7e\x70\x81\x79\x95\xa8\xcd\x8e\x94\x76\x0b\x6e\x74\x83\x2b\xab\x68\xd5\x5b\xc4\x64\x18\x84\x22\x1f\xd2\x9f\x12\x2d\x87\xa9\xa8\x68\xb6\xa6\x06\x0c\x87\xb2\x38\x2c\xf7\xbb\xdd\xa4\xcd\x6a\xaa\x1b\xbc\x8e\x6d\x63\x4a\xb5\x80\xc8\x65\xf5\xad\xd6\xa1\xd5\x4e\x61\xa6\x07\xdc\x2c\x37\xb0\x8a\x8c\xba\x6e\x61\x0c\x12\xcf\xeb\xef\x9c\x98\x9e\xef\x3b\x78\x2a\xcb\xd1\xbc\xec\x5f\x04\xe8\x35\xca\x10\x12\x98\xb5\xe9\xbd\xd8\x81\x3a\x71\xb0\xd4\x69\xfc\xf1\x27\x27\xd3\xde\x1c\x3f\x97\xdd\xbc\x6a\xb2\x65\x84\x40\xdd\x64\x21\x01\x9b\xc6\x8f\x35\x6d\x6f\x25\x53\x68\x65\x85\x1d\x92\xd9\x0f\xe9\x96\x9c\x3b\x7c\x35\xa2\xe8\x8c\xe1\x53\x47\x6e\xc3\x97\x3a\xf9\x35\x9f\x16\x77\xa4\xca\xf1\xcc\x48\x1c\x71\xbd\x90\x22\x8f\xf5\xfc\x6d\xd8\x3b\x8a\x69\x9f\xfe\x51\x49\x29\xf5\xc9\x5c\xb4\xf0\x4b\x00\xdd\x18\xa2\x87\x2c\x41\x86\x8d\x3b\xeb\x76\x49\x8d\xdc\x92\x34\xb6\x3f\x59\x9d\x70\x71\x80\x1d\xb2\xc2\x87\x8f\x7b\xef\x4f\xfd\xdd\x81\x32\x26\xf0\x6d\xb8\x4e\xb3\x02\x17\xa7\x18\x30\x82\xe3\xc1\x24\x2b\xb6\xd0\x1c\xd3\xa6\xce\x27\xbf\xf1\x6b\xfb\xfd\xd7\x5b\x7e\x51\x04\x31\x2c\x49\xc4\x3a\xad\xfc\xd5\xb4\xed\xba\x0f\xf5\x0d\x28\x90\xca\x3c\xd9\xcc\xa3\x3e\x4f\xc6\x94\xc0\x57\xc4\x7e\xbe\x1c\x20\xa4\xad\x11\x5f\x98\x5d\xc7\x44\x2c\x6f\x6d\xa7\xbe\x53\x0b\x69\x02\x28\x9c\xab\x9c\xa1\x39\xc6\xb2\x4c\xb8\x0f\xfd\xd7\x82\x32\x4e\x60\x2c\x45\x91\x0d\xb6\x3d\x8b\x5c\x44\xca\x29\xd2\x7f\x56\xdb\xf0\x01\x86\xba\x58\x3c\x34\xe1\x60\x31\xdf\x35\x75\x46\xb3\xab\x9a\x3d\xd6\x5e\x91\xd7\x12\x8c\x93\x91\x95\xe6\x46\xa0\xf0\xb8\x9b\xf5\xdf\x04\xba\x23\x3d\x6a\x12\xa2\x71\xf7\xe0\x4a\xa4\x5c\xda\x99\xb4\xa5\x5a\x21\xcb\xbb\x73\x85\x15\xe3\x2c\x56\xaa\xc2\x49\x62\x32\xb1\x00\x8a\x67\x61\xc8\x04\x5a\x1f\xe0\xf9\xa3\x64\x40\x47\xb5\x96\x6a\x58\xa6\x00\x46\x6c\x1b\x1d\x11\xdd\xad\x5a\xa5\x73\xc4\x3e\xbd\xa8\x87\xe1\x6a\x05"}, +{{0xf5,0xc0,0xa7,0xf8,0xf6,0x58,0x4c,0x5d,0x2f,0x2e,0x1d,0x08,0x10,0xe8,0xe8,0x61,0x03,0xe4,0xe2,0xd4,0x5c,0xf9,0xa7,0x21,0xd8,0xc4,0x7f,0x67,0x49,0x33,0x96,0xa4,},{0x3c,0x6d,0x6c,0xce,0x49,0x63,0x31,0x41,0x07,0x86,0x96,0x13,0x1a,0x8d,0x84,0xed,0x82,0x3f,0x30,0x66,0x4b,0x28,0x9a,0xf9,0xdd,0x30,0xc6,0x40,0x7f,0x6f,0x03,0x13,},{0xd4,0xc3,0x0a,0x48,0xc4,0x52,0x3b,0x1f,0x84,0xb1,0x4b,0x65,0x7a,0xf8,0xf8,0x59,0x75,0x5b,0xba,0x63,0x59,0x98,0x8b,0x67,0x5c,0x6d,0x85,0xdd,0xf3,0x54,0x62,0x82,0x0d,0xa4,0x76,0xd8,0x4f,0x6c,0x40,0x2e,0x65,0xb0,0x20,0xd9,0xe8,0xa2,0xc2,0x85,0xc1,0x67,0x08,0xae,0x58,0xd1,0xf8,0xdb,0xc6,0x57,0x82,0xa8,0x98,0xa6,0x65,0x08,},"\xd6\x8a\xbc\x60\x9a\x7a\x0c\xe2\x56\x69\x9e\xb1\x70\x43\xde\xfe\x1e\xb8\x22\xc9\x70\x8f\x65\x71\x8a\x06\x58\x1f\xab\x21\x10\xec\x2d\xb0\x92\x13\xbb\x9e\x0f\x36\x12\xce\x4a\x3f\x8f\xdb\xe7\x57\xa9\xf0\xeb\x2c\x3e\xba\x43\x8a\x90\x88\xb1\x8f\x6c\x5c\xaa\xbb\xe5\xc8\x2f\x7a\x9a\xb2\xfe\xcf\x0f\x58\x59\xd1\x75\xe1\x39\x26\x30\x33\x74\x24\x58\xf8\x2a\x6f\x38\x75\x6c\xd5\xbc\xdf\x9e\x07\x36\xdb\x2c\xab\x20\xa0\xcd\x3f\x0f\x1c\xdb\xea\x85\x56\xd8\x49\x09\x35\x8d\xd8\xf6\x9f\x0d\xac\xd4\x9a\xbf\x8a\xc1\xbf\xe7\x59\x40\xd6\x93\x9e\x6a\x55\x38\x5b\x5a\xce\x7c\xe1\xfd\xe1\x20\x67\x9a\xb6\xea\x7a\x89\xd1\x42\x68\xd2\x9f\xfb\x46\xdf\x10\x5b\xf3\x90\x92\x42\xc6\x60\x5f\x3e\x3e\x2a\xb7\x44\x89\x37\xd6\xdb\x2b\xa0\x54\xc7\xb1\x4f\x43\x2d\xb4\x1d\xc1\x8a\x5b\x95\x73\x36\xb7\xf5\x2d\x97\x8e\xc0\x3e\x7d\x57\x64\xe9\xbd\x2f\x4b\x68\x95\x8d\x93\x7b\xf2\x98\x23\xb2\x7e\xfb\x31\xe2\x5b\x43\x92\x5c\x4d\xac\xbe\x67\x18\xa6\x0f\xea\x3b\x32\x70\xe7\xb7\x6b\x0d\xe0\xe7\x0f\x7f\xa3\xc1\x2c\x21\x5e\xf7\x2b\x95\xdc\x1b\x52\x76\x23\x81\x79\xdf\xc5\x2f\xc4\x88\x59\x64\x9f\xa5\x82\xd0\x5a\x60\xdf\x68\x59\x9a\x1c\xee\xa6\x4f\x64\x12\xd3\xf8\x49\x8a\xe2\xce\xdb\x12\x42\x45\x88\x3a\x24\x0b\xc0\x85\x1f\x0e\x32\x49\x65\xbe\x12\x04\x86\xe1\xea\x89\xa0\x18\x2d\xfa\x8e\xab\xd3\xb8\xfa\x66\xa9\x9c\x51\x49\x13\x89\xf3\xc8\x3a\x3c\xdb\x42\x67\xf3\xe4\xdb\xc9\x8f\x0c\x44\x85\x6b\x04\x4d\xc8\x8d\x90\xee\xee\x84\x15\xbf\x73\xde\x17\x1a\xfe\x84\xbe\x90\x35\xe0\xdc\x4c\x80\xcf\x04\x22\x46\x9f\xe0\xc9\xbd\x1c\x6a\xa6\x54\xa5\x9b\x5e\x34\xee\xd3\x51\xcd\xa2\x87\x12\x69\xac\x47\x8e\x8d\x38\x2e\x74\x0e\x9a\xc7\xab\x4d\xdc\x4c\x0d\xef\x0a\xea\xb7\x97\xb6\xf1\xa4\x27\xb8\xe4\xa8\x49\x7a\x0b\x97\x97\xda\xdc\xd3\x5c\x41\x4f\xd5\x5b\x78\x31\x30\xf6\xcd\xed\x38\xa4\x4c\x1a\x89\x28\x83\x07\xeb\x84\x25\x48\x41\x37\xa8\xae\xdb\x03\x0d\x54\xb6\x16\xa8\x2e\x3c\x5a\xcf\xfb\x08\xd6\xcc\x1a\x61\x74\x5c\x29\xaf\xc6\x8a\x0c\x18\x38\xb1\x39\x15\x9c\x5f\xa6\x67\x4d\x66\xb9\xe3\x38\x11\x5a\xad\x4b\x1b\x47\x10\xaa\x5d\x95\x17\xbc\xf7\xe1\xcb\x12\xd4\xe6\xa5\x1c\x11\x78\x9f\xdc\xae\x9d\x9b\xbe\x78\xf6\x9a\x33\xe5\x2d\xf1\x83\x3c\x87\x6b\x02\x68\x7a\x40\x4f\xac\xad\x32\x84\x1c\xb2\xd5\x25\x54\xe7\xb8\xe2\x20\x9e\x3f\x88\xfd\x94\x8c\x1e\xcf\x83\x95\x7c\x96\xf4\x3b\x03\x4b\xed\xa6\xc4\x76\x09\x6b\xcb\x09\x30\x1a\xd6\x1f\x83\x67\xcc\x43\xe1\x56\x13\x18\x62\xb4\x2e\xce\x28\x5b\xec\x2d\xcc\x2d\x02\xd0\x94\xd0\x42\xa1\x60\x72\xeb\x22\xab\x98\x88\x01\x3b\xe8\x23\x71\x56\x94\x00\xec\x1f\x8e\xc7\xe7\x91\x08\xc4\x1b\x85\x33\x65\x26\x8f\xa4\xcf\xbc\x62\xc4\xac\x12\xcc\x98\xd2\xec\x38\xa8\x7d\x60\x85\x85\x95\x67\xc0\xf2\x7d\x6d\x43\x1a\x04\x6e\x88\xa9\x81\x55\x58\x66\x07\x05\xfd\x05\xeb\x06\xc6\xc0\x5e\x5b\x7d\x62\x34\x7c\xee\xe2\x7d\xff\xed\x71\x41\x54\x0d\x60\x8c\xb9\x75\x07\x5a\x96\x44\xac\xc6\x32\x84\x39\xf9\xfa\x68\x2b\x22\x6b\x18\x61\x54\x54\x90\x11\xc3\xb0\xf0\xff\x4f\x74\xca\xa7\x1c\x19\x44\xe4\xcb\x83\x6c\xe8\x51\xd9\xb5\xd9\xe7\x27\xc5\x53\xe3\xc7\x23\xcf\x98\xc2\x73\xe5\x67\x5c\xab\x89\x9b\xb6\x6f\x46\x33\xa7\x6d\xea\x35\x73\x41\xf9\x83\xc5\x3d\x91\x58\xad\x31\x9a\xda\x75\x40\x8b\x41\xc0\x6f\x26\xb7\x43\x5b\x80\xdc\x3b\xc0\xaa\xf2\x2a\x83\x3d\xde\xdc\xd6\x78\x5c\x87\xd1\x96\xb0\xaf\x2c\x9a\x43\xd1"}, +{{0x1a,0xb9,0x46,0xc0,0xc1,0xae,0xbf,0x9c,0xa3,0x7c,0x2f,0x4e,0x2a,0x4b,0x33,0x7d,0x5b,0x1e,0xbc,0xcd,0x24,0x73,0x4c,0x9c,0xb2,0xa1,0x60,0x8c,0x88,0x1e,0x57,0x57,},{0x9a,0xfc,0x63,0xdf,0xce,0x0d,0x48,0x9b,0x40,0x90,0x7a,0xee,0xd6,0xdf,0xfe,0x4c,0xd8,0xef,0x5a,0x6f,0xfa,0x22,0x98,0x95,0x56,0x44,0x5c,0xbf,0x9b,0x35,0x19,0xc2,},{0xbf,0xab,0xde,0xa4,0x18,0x10,0xa5,0x3f,0x8e,0x52,0x7a,0xcd,0x66,0xec,0x10,0x6c,0xe2,0xae,0x1a,0x67,0xff,0x6a,0x9b,0x52,0x2e,0x0f,0x08,0xfb,0xbf,0x12,0x52,0x68,0x2c,0xb3,0xa1,0xdc,0xc8,0x75,0x60,0x19,0x44,0xcb,0x88,0x00,0x0f,0x72,0xe1,0x39,0x07,0x00,0x79,0x03,0xa7,0x7c,0xd0,0xdb,0x03,0x16,0xd4,0x19,0xac,0x38,0xc2,0x04,},"\x9b\xb0\x71\xb6\x2c\x04\x06\x4b\x0c\x96\xe2\x43\xdd\x19\x8c\x39\x71\x7b\x25\xc9\x94\x48\xc2\xc0\x02\xb8\x4a\x99\x20\x4c\x5a\x6e\x23\xb4\xb9\x12\x02\x86\x75\xbf\xdc\x4d\xf9\x3c\x5b\x2f\xb8\x08\x81\xa2\x3e\x0d\x44\xba\x18\xbd\xe9\x91\x21\xee\xe8\x6a\xdc\x6f\x84\x28\x19\xd6\xeb\xc7\xa2\x88\x99\x2d\xa3\x28\x58\x05\xa8\xb8\xb6\xfb\xcd\x22\x67\xb6\x86\xb3\xe1\xbf\x79\x60\xb4\x5f\x24\x4f\x85\x2e\x82\x49\x29\x44\xe3\xd6\x18\xbc\xc4\x51\x4c\x17\xf7\x22\xba\x49\xac\xa7\xf2\xf3\xbb\x4e\x91\xf9\x40\xe9\xce\xf0\x15\x65\x0c\x3e\x40\xb0\xc8\x55\xa1\x7c\x42\xf1\x1e\x3a\x34\xac\xc8\x52\x87\xdb\xe0\xf9\x09\x3c\x00\x37\x3d\x50\xc0\xb3\x06\x4a\x5a\x5f\x2b\x1e\x89\x20\x65\x17\x52\x82\x95\xfd\x87\x17\x03\xa8\xe7\x62\xb5\xe7\x6f\xb9\xb7\x47\x3d\x21\x49\xb8\x5b\x94\x61\xf5\x58\x7e\xd7\xe7\xfc\x8b\x50\xaa\x09\x87\x6d\xee\xb6\xe2\x37\x07\x85\x02\x14\x2c\xec\x6b\xdd\xc7\x01\x40\xfe\x1d\x1f\x16\x58\xd5\xd3\xe9\x10\xfd\x70\x36\xa2\xf9\x24\xb4\x99\xdb\x17\x56\xf7\xc8\xce\x0d\x5f\x0d\x04\x5b\x39\xbc\x81\xc5\xc2\xf1\xa7\x61\xf5\x2f\xf3\x93\xe0\x64\x9b\x8d\xb0\xbd\x88\x54\xbd\x02\x6b\xe2\xc7\xc3\xcd\x63\x52\x6b\xa5\xa8\x0d\x48\x33\x5f\x03\x38\x32\xd6\x33\x76\x07\x1b\x63\x08\xf0\x59\x60\xcb\x3f\xc9\xfa\xc9\x32\xed\xd8\x37\x6d\xae\x51\xf2\xc6\x61\xf7\x5b\x7c\x6f\x4a\xc8\x56\x75\x3a\xca\x62\x06\x28\x77\x60\x9f\xc4\xa0\xff\x60\x67\x02\x82\xc0\x5e\x88\x2d\x1a\x03\x5b\xf9\x89\x0c\xab\x29\x6a\xc7\xa8\xdf\x24\x4c\x56\xf4\x90\x25\x0f\x02\x00\x54\xb8\xaf\x51\xbe\x4f\xc3\x18\xbe\xba\x50\x62\x32\xbf\x45\xe1\x7f\x5c\x74\x0c\xf0\x9d\x37\x51\x5a\x8b\xc8\x94\xbc\x95\x5c\x8a\x46\x08\x77\xc7\x85\x4f\x8b\xe3\x63\xb2\x19\x33\xe1\x62\x87\xae\x0c\xb7\x0f\x22\x2d\x4e\x36\xb8\xb4\x24\x97\x55\x59\xbb\x4b\xfc\x8d\xd1\xd5\x1b\x3c\x0f\xaf\x4a\x53\xe3\x02\x19\x6f\x9f\xed\xb5\x32\x87\xd0\x93\x15\xdf\xff\xa2\xbc\x4b\x3a\xcf\xf1\x37\xf9\xa7\x6d\x68\x56\x21\x7f\x79\xcb\xb2\x54\x33\xfc\x97\x89\x9f\xd6\x54\x0f\x18\x08\x8e\x84\x41\x7e\x48\x33\xe4\xa9\x1a\xab\xa4\x65\x8a\xe9\xad\x7f\x76\x0d\xd9\xc5\xb7\x19\x1a\x0d\x3c\x05\x54\x1b\x83\xc0\x25\xa7\x99\x21\x38\xe6\xd1\x08\x0d\xa1\x4c\x2c\x88\x7c\x6d\x67\x0a\xab\x37\x4d\x43\x6c\x27\x2f\x9e\x96\xf8\x5a\x9c\x42\x33\x79\xc0\xd4\x7c\x46\xdf\x6d\xe3\x34\xea\x20\x57\x15\x8d\x33\x23\x1e\x14\x26\xa6\x6d\x3c\x70\x82\x7a\xad\x55\x11\xb8\x46\xe0\x3b\x94\x92\x3d\x5f\x94\xba\xf1\xf8\xcf\x11\xa8\x61\x37\x3a\x5b\x80\xad\x5e\x31\x7e\xc2\xa5\x29\xe9\x4e\x63\x6c\xdc\x3a\xa2\x9e\x5d\xac\x20\x5a\x0c\x13\xf6\x8f\xb1\x98\xcf\x94\x56\xe6\x39\x0a\xea\xd4\xd9\x78\x2a\x10\x38\xf6\x47\x8d\x33\x9a\x81\xba\xe7\xaf\x2a\x04\x15\x1c\x2f\x22\xe8\xd3\x9f\xe0\x71\xe1\xa5\x21\x68\xd5\x7c\x84\xc3\x62\x93\x41\x3f\x8e\x6f\xf6\x93\x4f\x05\xe7\xef\xad\x6f\xa1\x20\xc8\xc1\xc3\x8a\xd1\x88\x6a\x3d\x00\xbf\xc3\x06\x45\x92\x03\xc0\x2c\xdf\x4f\x06\x65\x2b\xc8\xfa\x0e\x8b\x9c\xc7\x79\xd4\x3f\xbb\x78\x9e\x7d\xad\x5d\xc9\x9f\x41\xd4\xcc\x58\x8c\x1b\x65\x42\x6a\x4e\x77\x38\x9e\xdd\x04\x97\x75\x78\xf8\xf3\x16\xbc\xdd\x94\x61\xd6\x66\x47\x2c\xdd\x27\x6a\xa5\x69\x72\x1c\x65\x23\x22\x56\xba\x1c\xf0\xe7\xf5\xea\x55\x32\x17\x29\xbb\x0e\x03\x86\xa7\x7b\x86\x55\x32\x02\x46\x96\xed\xde\xf4\x85\xb7\xd7\xb2\x8c\x15\x73\xb9\x34\x7e\x41\x4d\x42\x61\x99\x54\x82\xe3\xb3\x12\xde\x13\x31\xf8\x4e\x75\x48\x60\x7a\x84"}, +{{0x04,0xbb,0x88,0x7a,0x8a,0x31,0x84,0xff,0xc7,0xea,0x09,0xc9,0xbc,0x7c,0x1f,0x7c,0x34,0x11,0x55,0x6a,0x7c,0x7c,0x39,0x8c,0xb8,0xb2,0xd9,0x8f,0xfd,0x9e,0xe8,0x66,},{0x6a,0xb1,0xe4,0xae,0x4a,0xa0,0xd3,0x89,0x89,0xae,0xef,0xa8,0x05,0xb5,0x78,0x80,0x6e,0x2e,0x97,0x1a,0xc7,0xac,0x05,0x40,0x99,0x58,0xbf,0xe6,0x00,0x71,0xf4,0xa7,},{0xcd,0x84,0xf5,0x5e,0x5e,0xf4,0x53,0x19,0x24,0xc5,0xa2,0x18,0x1e,0xc8,0x7a,0x64,0x54,0x13,0x88,0xc1,0x05,0x94,0x06,0xbc,0x07,0xd5,0x31,0x57,0xa1,0x68,0xe2,0x03,0xcc,0x8a,0xa0,0xf0,0x06,0x9d,0x53,0xff,0x58,0xa9,0x5b,0x8a,0x8c,0xaa,0xfd,0xad,0x26,0x36,0x3c,0x7d,0x0f,0x80,0x45,0xc4,0x35,0x9e,0x97,0xb4,0x36,0x02,0xc6,0x06,},"\xb7\xab\x0c\x81\x63\xf4\x78\xc6\xca\xbf\x2b\xbd\x7c\xa3\x7c\xb0\x24\x56\xd7\x6e\x52\x7e\xea\x1b\x0d\x26\xdb\x24\x2e\x37\x87\x76\x32\x98\x5a\x3e\x3c\xa4\x1b\x52\xe2\x1d\x79\x01\x7b\xff\x81\xee\x55\x1a\xd7\x2a\xf2\x77\xb4\x10\xe4\x2a\xf8\x22\xc6\x08\xcd\x69\xd0\x0b\xf4\x40\xb7\x5b\x78\x7a\x8c\x91\x5d\x70\xb6\xc6\x37\x6c\x3f\x67\xfa\x64\xd6\x12\xa1\xb4\x49\xa7\xe2\x13\x4d\x9c\x23\x23\x01\x57\xd5\x76\xe0\x6a\x66\xa8\x42\x2a\x61\x1e\x2a\x0f\x09\x72\x86\xc1\x99\xea\x2a\x16\x28\x61\x86\x4b\xd0\x35\x07\x6a\xb2\x0b\xba\xe2\xb4\x40\x8a\x2c\x64\x33\xcb\x23\x43\x3a\x88\x9f\xe6\x59\x8f\x47\xbe\x53\xbb\xd2\xc8\x0f\x07\xa8\xfc\xcb\x8a\xae\x51\x11\x61\xe6\x09\xda\x4d\x18\x0a\xce\xa5\x44\x81\x1e\x94\x49\xc5\xdc\x22\x50\xe3\xe5\xa0\xcd\x41\xda\x33\xa2\xda\x63\x2e\x60\x38\xbd\x86\xf1\x6d\x5b\x7c\x1b\xe4\x9f\xc6\xdb\x49\x90\x76\xca\x91\xf7\xaa\x02\x8f\xe3\x85\x29\x70\x0b\x21\xd0\x72\xd2\xb7\x5d\xcc\x8b\x43\x78\x1d\x4b\xc4\xd3\xbb\x58\x4d\x9d\xa0\x1c\x3e\xcc\x85\xb1\xe9\x3f\xce\x04\x5d\xad\xce\xea\x51\x06\x46\x8b\xdf\xe5\xf7\x0d\x66\xa4\xfa\xd6\x0e\x4f\xb8\x64\xec\x15\xea\x50\xf6\xcb\x79\x72\x23\xc8\xc7\x56\xf7\xa1\x93\x1a\x39\x46\x4e\xbb\xb9\x67\x9f\x6b\x01\x68\x7c\x17\x4e\xaa\x32\xb9\x68\xb9\xcf\xac\xe8\xc1\x67\x12\x0a\xa7\xbd\x02\x42\xf0\x03\xa0\xc3\x77\x70\x25\x51\xb3\x0d\xa2\x48\x8e\xb2\x94\x40\x52\x93\x4a\xef\x4b\xfe\x11\x5f\x0a\xb7\x40\x5a\x3d\x5f\xa9\xbd\x79\x6b\x37\x17\x42\xbc\x11\x4a\x9b\xf2\x8c\x5b\xd2\x56\x26\x29\x5c\xe2\x61\xa6\xa8\x3e\xf6\x0b\x77\xd2\xd3\x2d\xd7\x10\x5f\xc8\x36\x64\xaa\x89\x76\x5b\x3f\x81\x91\xee\xee\xd8\x78\xf2\xeb\xff\x2f\xb9\x76\x63\xa6\x18\x77\xc0\x93\x93\x3b\xbd\x07\x31\xe6\x37\x57\x57\x1b\x0e\x37\xca\xc9\x9e\xd0\x1f\xd2\x14\xcb\xd4\xfe\xb9\x77\xe8\x56\xe0\xa1\xa7\xef\x0c\x40\x8c\x20\xe0\xdd\xaf\x1f\xd8\xf0\x28\xcf\xa0\x8c\x85\x0f\xa7\x09\x0d\xca\x8c\xdd\xe0\xcb\x69\x03\xda\x18\xc6\x29\x0c\x66\xa1\xc0\xae\x0a\x08\x4b\xf2\x50\xc5\x1a\x9d\x03\x5e\x5b\x16\xec\x61\x66\x36\xaf\xb9\xb5\xbc\xe3\x6a\x77\x5f\xe2\x17\x5b\xcc\x2e\xe0\x72\x20\x83\x4e\xeb\x31\xca\xee\x50\xe9\xf8\x06\x3f\xb1\xfc\x84\x68\xae\x25\xe3\x96\x67\x89\xa6\xd8\xdf\xfe\x08\xa6\xf7\xa1\xe6\x72\x6f\x93\xae\x74\x82\xde\x02\x62\xbb\x1f\x8d\xe0\xc9\x5a\x99\xec\xb9\x56\x84\xd4\x4b\x3f\x1a\x33\x2a\x18\xd2\xcd\x3d\xcf\x25\x3c\x33\xd7\x35\x52\x2f\x79\x6b\x65\x1c\x9a\x63\x3a\x8e\xbe\x95\xd0\x2b\xc0\x46\x58\x25\xee\x54\x1a\x7d\x92\x7b\xb5\xb9\x0a\x6d\xb5\x49\x9f\x8d\x99\x3a\xb4\x04\xb1\x65\x0b\x75\xe7\x92\xa7\xc8\x34\xeb\x41\xf0\x47\x01\x38\xb0\xf5\x78\xa0\x4c\x9b\xa5\xad\x95\x0a\xc7\xc9\xb5\xd3\x28\xf3\x40\x8b\x64\x5a\xd9\xc6\xbf\x19\x6d\xd9\x61\x44\x55\x96\xbc\x78\xf2\x84\xb8\x91\x4b\x2a\x8c\xf9\xb7\xbd\x3a\x71\x6d\x8f\x14\x4b\xb6\xb1\x5d\x83\x10\x23\x71\x3b\x5e\x41\xfd\xa9\xb5\x87\xff\x9d\x6c\xc4\x3c\x08\xd3\x5a\x70\x7f\x49\x52\x83\xe1\xac\xe9\x60\x48\x7e\x7f\x02\xb7\x54\x3b\x68\xa7\x31\xa2\x9b\xf3\xbe\x14\xb6\xe9\xc3\x71\x74\xa9\xf4\x6f\x56\x11\x99\xdb\xd2\x7b\x46\xbf\xe6\x22\x43\xe0\xc1\x1c\x0e\xdf\x13\xb6\x4f\x41\x1c\x8e\x8e\xce\xd3\x5d\x84\x28\xf7\x9f\x10\xea\xcf\xfb\x72\x34\xe5\x46\x41\x3d\x1e\xb0\xfa\xd8\x8c\x0e\x93\x85\x93\xb4\x3b\x5e\xe0\xe4\x28\x5d\x4d\xdd\xf5\x29\x5d\xbf\x1a\x3d\xdb\xe9\xf4\x13\x4d\xd7\x6d\x3d\xe7\x04\x62\xc2\xf0\x4f\xe0\xae\xbd\xf5\x9a"}, +{{0x97,0x76,0xa4,0x67,0xfa,0x14,0x00,0x73,0x54,0x12,0xa7,0x9b,0x49,0x5f,0x9f,0xca,0x07,0x8c,0xe1,0xd8,0x7a,0x85,0x30,0xd8,0x5c,0x26,0x05,0x5d,0x3a,0x39,0x44,0x88,},{0xc7,0xdb,0xe0,0xe4,0x1c,0x0a,0x31,0xc0,0x94,0x27,0x93,0xff,0xd1,0x42,0xd8,0xb9,0x5c,0xc8,0x2e,0x5c,0xaa,0x92,0xa3,0x79,0xba,0x23,0xf6,0x44,0xed,0xf2,0x24,0xda,},{0xe1,0x31,0x7b,0xa2,0xa1,0x23,0xae,0x3b,0x29,0xe7,0xb6,0x0e,0x8e,0x93,0xbe,0xed,0xd7,0xa0,0x84,0x51,0xa0,0x13,0x69,0x5b,0x6d,0xcf,0x35,0x8e,0x40,0x34,0x02,0x6d,0xc7,0x40,0x37,0xaf,0xbd,0xd2,0x17,0xff,0x4b,0x14,0x8b,0x02,0x91,0x38,0xf4,0xbc,0xc8,0xf9,0x83,0x6a,0xbb,0xae,0x7e,0x62,0x76,0xe9,0xe7,0x69,0xdb,0xd8,0xf0,0x07,},"\xd7\x85\x53\xa1\xb7\x05\x5b\x58\xb2\x13\x10\x1b\x1c\x84\xc5\x3e\x16\x4e\x39\xc6\xe9\xd3\x6d\xb4\x3f\x30\xe1\x9e\x2a\x12\x5a\x9a\x67\x70\x9e\xaf\xef\x96\x4f\xa5\xba\xb7\x26\x1d\xdb\x3a\x8a\x01\x88\x45\x7d\xfb\xf5\x15\x9c\x40\xe5\x1d\xa8\x20\x84\x83\x24\x57\x81\xd7\x13\x1e\x23\xa8\xbe\xe5\xe5\x06\x33\x18\x16\xb9\xde\xee\xfe\x6e\x55\x6e\x3f\x0c\x95\xc6\x68\xd1\xbe\xdb\x7d\xa6\x35\x06\x54\x58\xad\x20\x46\x70\x12\xf5\x9f\x17\x13\x52\x06\x80\x20\xce\x3c\x75\x87\x86\x93\xf6\x43\x7b\xc4\xa0\x9f\x13\xb9\xb0\xf0\xcd\xda\xf1\x69\x1b\x87\x2f\x82\x00\x80\x93\xeb\xfb\xe2\x33\xd0\x31\x3e\x72\xc8\x63\x2d\x7d\x17\x93\xf0\xb8\x1c\x76\x88\xf5\x44\x70\x33\x0f\x04\xe6\x48\x60\xe6\x44\x6b\xfc\x6d\x96\xc8\x75\x69\xbf\x18\x2f\x0f\x43\x85\xaf\x48\x5d\x42\x99\xca\xc0\x4e\x06\xba\x47\x34\x65\x56\x6c\x47\x7f\x07\xb9\xdb\x27\x7a\xb4\xa9\xde\x2f\xb2\xde\xd0\xa5\x01\x1c\xd0\x6d\x67\x5c\x08\x00\xb3\x4f\x55\xbc\xf3\xec\x72\xd2\x1c\xa1\x50\xc8\xbf\x23\x61\x28\x7b\xe8\x1e\xfa\xbb\x96\xd8\x68\x8a\x1d\xee\x3f\x43\x0f\x06\xf6\x37\xdf\xd0\x6f\x15\x14\x64\xa0\x5c\x95\xf5\xfe\x76\xaf\x2e\x06\xd0\x12\x3f\x69\x48\xa2\x6b\x3b\xe8\x35\x04\x5a\xa2\x68\xcc\x1b\xe9\x76\x69\x71\x07\x77\x02\x08\xa7\x56\x8f\x02\x5c\x2d\x53\xc7\x19\xe5\x24\xcc\x36\x9d\x9b\x4a\x33\x7d\x8f\xd1\xef\x34\x5b\x9b\xca\x57\xfb\xd7\xb6\x5a\x6b\x99\x7c\xad\x3f\xce\x4c\xf0\x6f\x2c\xa4\x3e\xbe\x29\x86\xd0\x96\x82\xd4\x7c\x92\x2b\x2c\xb7\x56\x9d\x98\xde\x97\xa6\x16\x4f\x54\x70\xee\xc7\x1c\xed\xa5\x20\xcc\xec\x77\x32\xbd\x01\x68\x9e\xf8\x16\x56\xe9\xf6\xd0\xc5\x8a\x89\x55\x58\xae\xe8\x63\xf5\x46\x9e\x7a\xb9\x79\x15\xbf\xe0\xb8\x0a\x06\x4c\x65\x9b\x18\x30\x31\xf7\xf1\xa8\x6f\xb1\x1a\x9d\x52\x8c\x28\x15\xdc\xaa\x2f\x0d\xec\x3d\x21\xa8\x82\xe1\x06\xe2\x04\x93\xee\x0a\xcb\x77\x08\xea\xa2\x91\x25\x74\xae\x97\xbb\x28\x8b\x41\xfc\x09\x25\x05\x3a\x29\xb0\xbf\xbc\x0e\xba\xe8\xd6\x3c\xc0\xb4\x6e\x37\x38\x04\x6c\x5a\x20\x25\x30\xbc\xb1\x5b\x18\x7a\x72\x85\x4a\xa2\xd8\xa7\xa7\x6c\x89\xa8\x9a\x5d\xb4\x60\x32\x07\x4e\x1b\xd7\xde\x77\xef\x20\x65\xa0\x8f\x38\x9d\x78\x3c\xf7\x59\xeb\xd5\xa6\x3a\x44\xd9\x19\xf9\x48\xf5\x60\xc3\xe9\x4c\x42\x39\xe2\x74\xe0\x51\xa2\x04\x85\xa4\x30\xcb\xd5\x29\xf3\x13\xd9\xf7\xed\x67\x9a\x34\x18\x7b\x24\xf8\x41\x30\x87\xa9\x02\x1e\x47\x31\x73\x0f\x5f\x46\x1f\xc5\xaa\xd6\x65\x4d\xfa\x1c\x05\x04\xd2\x61\x24\x70\x7e\x63\xee\x57\xf9\x31\xb2\x78\x59\x08\xf8\x6b\x10\x4b\x3e\xcb\x96\x00\x02\x51\xd0\x6c\xe1\xfa\x45\xe4\xcd\x6d\xf9\x1a\xc1\x5b\xbf\x7c\xa3\xc3\xeb\x8e\xe0\x82\x76\x12\xa2\x9e\xcb\x7a\x36\xd5\x47\x0c\x40\x50\x51\x82\xfa\x9a\xc9\x13\x57\x0d\x0c\x10\x50\xd9\xa4\x34\x55\xcb\x7b\xdc\x17\xd1\x69\x80\x5f\x01\x89\x56\xf8\x54\xf8\x91\x9b\xbf\xb7\x19\xe1\x86\x7b\x36\xa6\x4a\xab\xcd\xb8\x07\xf4\x8d\xcc\xc0\x67\x2f\x67\x88\x74\x50\xb3\xf3\xe9\x58\xd7\x84\x99\xe0\xd1\xab\x36\x8a\xa4\x94\x42\xe5\xe8\xa3\x32\xbf\xfd\x44\xc1\x69\xea\x67\x62\x9c\x85\x72\x4d\xb6\xf1\x58\x6b\x6c\x6b\x5b\xe4\x86\x4d\xfd\x53\xda\x7c\x0f\x7b\x8b\xb3\x57\x31\x16\xbe\x50\x77\xd3\x32\xbd\x12\xa6\x30\x0f\x3a\x68\xa8\x98\x66\xb4\x79\xec\x2b\xaa\x27\x7f\x9f\x56\xf6\xe1\xd4\x9d\x74\x1e\xb3\x22\x03\x5f\xf8\xcb\x1d\xe8\x5c\x8d\xc8\x7a\xc8\xe6\xe4\xc5\xd2\x0b\xfb\x6d\x31\x7a\xb1\x25\x93\x0c\x42\x60\x9b\xe3\xae\x82\x24\x2a\x9e\xf0\x56\x88\x58\xd8"}, +{{0x09,0xd8,0x12,0x26,0x97,0x12,0x6d,0xfc,0x7e,0x11,0x68,0x5a,0x04,0x12,0x3f,0xdf,0xb4,0x7c,0xcd,0xdb,0x44,0x99,0xd8,0xa3,0xae,0xf4,0x18,0xcb,0x65,0xae,0xd7,0xa7,},{0xf8,0xdd,0xb1,0xc0,0x0f,0x6e,0x0f,0x4b,0xea,0xa6,0xfc,0x38,0xe5,0xd0,0xa5,0x77,0x5e,0xe2,0x8c,0x80,0xdb,0xde,0x3f,0x0c,0x79,0x30,0xa3,0x3a,0xad,0x71,0x50,0xf3,},{0x18,0xcf,0xaf,0x6d,0xc8,0xe4,0xe8,0x58,0x2b,0xce,0xfe,0x0c,0xdc,0x6f,0xce,0xfe,0x6a,0x4a,0x87,0xea,0x62,0x95,0x85,0xf3,0x7d,0x2f,0xba,0x44,0x6b,0x3a,0xeb,0xd4,0x52,0x42,0x63,0x82,0xda,0x0d,0x49,0x1c,0x39,0xcb,0x7d,0x54,0xd2,0x73,0x00,0x5d,0xc1,0x32,0x12,0x15,0x68,0xd2,0xab,0x67,0x45,0x20,0xad,0xda,0x75,0x23,0x84,0x0d,},"\xa0\xd8\xd8\x79\x8e\xba\x22\xf5\x67\x60\xc3\x06\x43\xe9\xfc\x67\x95\x54\x7e\xa5\xf2\xf2\xbb\xd1\x1c\x03\x92\xb2\xeb\xf7\x11\xac\xa2\x2f\x08\x24\x19\x9f\xc3\x18\x8a\x45\xbd\xff\xde\x70\xec\xe9\xab\x15\xa5\xea\x89\x62\x2a\x58\x71\xe0\xef\x76\x85\xd1\x0f\x12\x74\xcc\x19\x5b\x4f\xda\x81\xf8\x79\xd1\xe9\xbf\x42\xf8\x73\xb2\x0a\x85\x9c\x23\x3f\x9e\x49\xad\xbf\x05\x77\x31\xe1\x13\x35\xe9\xb6\xd8\xed\x0e\x06\x9e\x13\x4e\xc4\x61\xca\x88\x90\xd7\xb0\x47\x3c\x40\x5e\x8a\x9d\x95\xd1\x57\x11\xb1\x24\x76\x10\x37\x62\xc6\x26\xd9\xf2\xaa\x5d\xd5\x19\xbd\x82\x5b\x60\xb3\x23\x4e\xbf\x65\x1e\x0d\x19\x33\x37\x1c\x52\xbf\xd8\xce\x33\xfc\x36\xbb\xa3\x28\xf7\xf3\xf2\xcc\xc0\x10\x00\xa8\x99\x04\xaf\x37\xe4\xe1\xe9\xe1\x5f\xff\xab\x5c\x2b\x0c\x47\xf3\x7c\xdc\xb0\x68\xdb\x33\xac\x36\xa5\xf0\xd6\xde\x12\x03\xfb\xf8\x94\x93\x24\xbd\x3e\xfd\xa0\xf9\x88\x9d\xb0\x0d\xa2\x31\x7b\x49\xfd\x18\x69\x99\xdf\x7f\xcd\xc3\xcb\x4e\x1d\x18\xfa\xa2\x54\x56\x1c\x25\x11\x78\xb8\xd3\x3f\xdc\x9d\xcc\xd8\xd2\xd7\x21\xb9\x3a\x53\x6c\xcd\x3c\x0e\x9c\x85\x63\x37\xf1\x95\xee\xe7\xda\x9a\x7f\x6b\x0a\x42\xb7\xc5\x41\xc6\xa6\x8c\x59\x5b\xf3\x47\x04\xd9\xfe\x3a\x56\xd2\xec\x84\x81\xd5\x77\xc9\x6e\xcc\x08\xb8\xe4\x0a\xcd\xbf\x05\x0e\x20\xc6\x83\xf3\x9c\x41\x4e\x8c\xbf\xcf\x4a\x01\x52\x31\x4c\x05\x98\x7a\x83\xbd\xe3\x02\x5b\x73\x5c\xca\x30\x23\xab\xc5\xfe\xb7\xe0\x0d\x02\x36\xb4\xf2\x4b\x15\xe6\x79\xdb\x05\x2c\x8d\x2f\xdd\xb3\xbe\xf8\x66\x3a\x6d\xf8\x19\xa9\x81\x55\x27\xa1\xa2\xf6\x0a\x0f\xa4\xe5\x07\x8d\xdc\x6d\x43\x5f\xe8\x92\x87\xb3\x0f\xfd\xeb\x5d\x9a\xe0\x5d\x1a\x86\x90\xfb\xc7\x59\x0a\xad\x57\xd4\x3d\x22\xc1\x2a\xce\x2c\x81\x96\x88\x8e\x35\x4e\x9f\x78\x2f\x5d\xbb\x44\x14\x9e\x83\xfb\x8b\xbc\x9d\xa6\xd8\x9c\xe2\x06\xc1\xe2\xb6\xb2\xb2\x8f\x93\x3f\x3e\x5f\xf1\x17\x5a\x31\xa8\xff\x5d\x31\xe6\x5c\x8b\x00\xc5\xba\x46\x22\x24\xa1\xe0\x9d\x4f\x09\xcb\x40\xfc\x87\xc3\x6e\x7d\x28\x5c\x77\x4a\x96\x97\x62\x03\x65\x18\x28\xe7\x83\x62\x88\x47\xac\x51\x2e\x5d\x1c\x35\xb3\x5b\x03\x01\x71\xf9\x23\x96\xf5\xff\xaf\xf5\x85\xce\xad\x04\xb6\xae\x21\x0d\x80\x70\x7c\xc6\x83\x2d\x98\xa2\x0d\x3a\x94\x76\x48\xda\x26\x04\x93\x7f\xef\xd2\x5a\x9f\xe0\xfc\x5c\xac\x08\x3d\xdd\x7d\x20\x75\x30\x7f\x4f\x38\x26\x64\xf6\x87\xdc\xe8\xc6\x55\xde\xd9\xc1\x2d\x48\xff\x76\x01\xdf\x2a\x48\xd3\x7f\xe2\x14\x97\x08\x44\xc0\x75\xf2\xea\xb0\x02\x05\x9f\xc2\x27\x1e\x61\x7c\x96\x57\xa0\x1b\xec\x1d\xd3\x8f\x6c\x28\xba\x8a\x61\x7b\xd3\x08\x51\xe3\xf9\xdb\xac\x90\x44\x18\xdf\x1d\x02\x15\xad\x45\xdf\xc9\xf0\x2b\x5c\x5e\x9f\x9b\xbc\x6d\xe8\xb0\x7a\xf0\xbd\x1f\x7f\xa8\x92\x25\x44\xf1\x2d\x2a\x3e\x1a\xad\xff\x7e\x9c\x6b\x93\x32\x0c\x3a\x61\xef\x33\xda\x07\xeb\x87\xb1\x61\x7f\x9e\x77\xd7\x70\x2e\x55\x8b\xc7\xd8\x12\x2e\x0d\xfe\x2a\xe8\x3e\x83\x6c\x5b\x1a\x62\xaa\x58\x5c\x0d\xff\xe7\x16\xf7\x46\x3c\x0b\x33\xda\x5b\x1e\xda\x55\x6a\x1e\xf1\xe4\x50\x42\xc7\x9b\xdd\x3e\xc3\xcb\x88\x63\xa7\xbc\x1b\x0f\x7e\x1c\x05\xbd\x99\x20\xf0\x5b\x4e\xda\x86\x51\x77\x05\xed\x07\xf6\xdc\xa7\xbb\x00\xae\x04\x56\xe6\x78\x7d\x9f\xae\x8e\xde\x4e\xcd\x0b\xc5\x72\xeb\x5c\xc6\xd1\x9e\x89\x1f\x1b\xcb\x22\x9e\x94\x09\xe0\x65\x74\xc7\xdf\x05\x81\x73\xcb\x58\xc3\xfd\xf2\x0f\x3f\xf1\x7c\x37\x05\xaf\x62\xd9\xb7\x22\x5c\x57\x43\xf6\x00\x60\x7f\x77\xcb\xe7\xd6\xe7\x61\x8a\xbc\x79"}, +{{0x10,0x20,0x1b,0xf0,0x08,0x43,0x67,0x59,0x0d,0xe6,0x74,0xcc,0x0e,0xd2,0x64,0x8e,0xc2,0x5d,0x3b,0xa8,0xdb,0x40,0xd0,0x0e,0xde,0x15,0x33,0x98,0x50,0x8b,0xc1,0x26,},{0xba,0xdb,0xd0,0x5e,0x5f,0x79,0xe3,0x11,0x69,0xf7,0x40,0xba,0x46,0xa5,0x89,0x10,0xa1,0xb7,0x77,0x05,0xaf,0x45,0x71,0x7b,0x2a,0xf8,0x08,0x56,0x45,0x7c,0x58,0xc9,},{0xf1,0xd9,0x96,0x58,0x8b,0x29,0x8f,0x27,0x1e,0x97,0x0c,0xeb,0xd2,0xa1,0xb3,0x39,0x97,0x9c,0xd2,0x9d,0xdd,0xee,0x36,0x45,0xd0,0x7f,0xab,0x8a,0xb4,0x65,0xdd,0xe3,0xe9,0x86,0x67,0xec,0x01,0xad,0x7f,0x1c,0x0a,0x65,0x92,0xe0,0x69,0x7e,0x66,0x5c,0x72,0xfd,0x38,0x14,0xdb,0xe1,0x89,0xed,0x5f,0x4e,0x76,0xc7,0x94,0xe5,0x38,0x09,},"\x7b\xb1\x47\x06\x17\xd1\x1e\x45\xeb\x60\x2a\x82\x9a\xd7\x73\xee\x2b\xb7\xe6\xb8\x8d\xa4\xc0\x4a\x72\x16\xa4\x50\xf8\x49\x93\xa4\x98\xcb\xd3\xb9\x25\x40\x28\xf2\xf9\x9f\xc2\x1a\x23\x28\x8b\xdc\x1e\x15\x1a\x72\xa9\x13\x0c\x3d\xed\xda\x1b\xbb\xcc\xd4\xe6\xc0\xf4\x8a\xe9\xf3\x53\x18\xcb\xef\xc9\x59\xf4\x05\x04\x5e\x6e\x0b\x5f\xb2\xe7\x38\xf2\xb7\x65\xbe\x11\xb1\xb6\xa0\xf1\xe8\x31\x95\x49\xd9\x5f\xa8\xd1\xdf\x81\x67\xcd\x4a\x77\x17\xae\x16\x36\xa9\xdf\x54\xd9\x6e\xaf\x2d\x63\x23\x69\x00\xfd\x11\x33\x82\x52\xa5\x00\x8d\x5d\x48\x0e\x2b\x1e\x98\x61\xd1\xf7\x06\x88\xc4\x7e\xae\x46\x89\xda\x01\xa4\x7d\xa3\xdf\xb6\xd2\xba\xb3\xcd\xf5\x05\xee\x5d\x80\x1a\x15\x2c\x26\x70\x93\xd1\x7e\x9b\xf7\x13\x7a\x6e\xe7\xb8\x34\xd0\x08\x55\x00\xe4\x01\xc1\x7f\x32\x86\xc1\x57\x5d\x1c\x01\x00\xfa\x98\x07\x63\x0c\x4a\x99\x06\x54\xc1\xe7\x1a\x8b\x71\x56\x27\xbb\x13\xd4\x42\xc8\x4a\x44\x98\x44\xc4\x04\xb8\x72\xbf\xba\xc7\x18\xa4\x8d\x0e\xa0\x94\x5c\x77\x16\x6a\x53\x13\x9b\x0f\xf0\x09\x81\x34\x76\x4f\x9e\xcd\xb8\x8e\xab\xe0\x7c\xcb\x2c\xce\xd4\x95\x5e\x08\x24\x9b\x2f\x57\x70\xad\x41\xfc\xcd\x7b\x5b\xb3\x72\xe6\xc3\x37\x67\xe0\x7f\x5b\xe7\xd1\x07\x12\xde\x81\x84\x1b\x13\x4e\x19\x3d\xf0\x77\x6a\x0f\xc1\x56\xff\x5d\x0e\x96\xf4\x0a\x70\x47\x53\xe1\x14\x5e\x9f\xa0\x83\xc4\xdd\xee\xf4\x41\x62\x34\xf6\xe1\xa2\x38\x2c\x8e\x5b\x3a\xd4\x05\x45\x8e\x89\xd2\xf4\x93\xa4\xd7\xc2\x9a\x23\xde\x21\x07\x48\x5b\x7f\x56\x35\x01\x24\xe7\xe0\xd6\x95\xc5\x22\xb6\xde\x7a\x92\x47\xa2\x92\x4c\xe6\xf2\x86\x32\x36\xc1\x0c\xc2\x12\x64\xad\x54\x59\x0d\x31\x47\x63\xea\x1a\x19\xaf\xac\xd9\x0e\xba\x95\x58\x70\x40\x7e\x8c\x63\x65\xa1\x43\xa5\xc1\xb9\xa8\xbe\x5e\x4a\x4d\xca\xdb\x72\xe0\xd4\x76\x49\xbd\x53\xab\xd4\x6b\x5c\x69\x60\xea\xe2\xca\xb7\x73\x75\x3c\xc0\xe0\x4e\x99\x41\x4b\xc2\xcb\x30\xf4\x8b\xb5\x41\x39\xd0\x66\xe4\x3e\x2f\x0e\x1a\x4a\xe9\x63\x85\x8b\xef\x96\x7d\xf8\xc8\x41\x40\xd2\xd0\x92\x02\xb4\x06\xd5\xd8\x5c\xb7\xa9\x6c\xc5\x7f\x23\x3e\xb2\x18\x7f\xfd\x02\xf9\x4e\x92\x29\x7b\x5e\x69\xd9\x69\xd3\xa5\x93\x6e\xfe\x49\x29\x14\x4f\x25\x8b\xfb\x39\xdd\x0c\xe2\x63\x59\xc4\x54\x9f\xc2\x18\xa0\xaa\x54\xf3\x1b\xd5\x51\xb8\x78\x1a\xcb\xbf\x61\xcb\x3f\x73\x2c\xda\xf6\x22\xc6\xa6\x91\x88\xcf\x55\x7a\x3a\x92\xed\x15\x3e\x69\x12\x5a\x40\x90\xac\x45\x15\x36\xa0\xe9\xa6\x3a\x41\x78\x29\x10\xff\xcc\xb4\xe8\x50\x02\x11\x23\xff\xd1\xf3\xbf\x39\xc7\x34\x60\xa6\x5c\xcf\xe4\xdb\xa9\xbd\xef\xb5\xd5\xf4\xda\x6c\x46\x9a\xa1\x32\x2f\xa2\x70\x43\x23\x83\x63\xee\x72\x91\x86\x88\xd7\xca\x1c\x4c\x29\x52\xe4\x30\xd5\x63\x25\x6b\xb8\x6d\x35\x0a\x35\xee\x82\xe0\x15\x04\x74\x7f\x31\xd0\x2e\x03\xae\xdd\xa5\x46\xd0\xf1\xb2\xf4\x51\xb8\x70\x82\x16\x02\xd0\x0e\x81\x90\x36\xad\xe5\xa7\xc7\xfc\xd2\x1a\x6d\xe6\xaf\x35\xb1\xf9\x63\x2a\x70\xaf\x65\xdf\x64\x45\xf6\xfa\xdf\xbc\x0f\x41\x67\x55\xc8\x24\x66\x40\xe5\x6b\x85\x6b\x66\xdd\xd9\x2a\x60\xc0\x35\x38\x22\x1d\xc8\xfb\x14\x2c\xe2\xdb\xac\xdb\x74\x25\xf3\x3c\xb8\x5d\x85\x0c\xc0\x2c\x31\x5c\xfc\x11\x1f\x6f\x65\x1d\xde\x1b\xdb\x67\xfb\x20\x8e\x1f\x6b\xde\x78\x4d\xdc\xf7\xbd\x18\xc8\x05\x1a\x2e\x0b\xbf\x10\x18\xb8\xf3\x95\x36\xc5\x89\xde\x65\xea\xdc\x6c\xf3\x79\xb7\x7c\xad\x13\xf9\x08\x9c\xb3\x23\xfb\x2e\x94\x3d\x06\xcd\xd1\x07\x05\xc1\x21\x13\x4c\x65\x48\xdc\x53\x41\x5f\x8c\x37\x0e\xc6\x90"}, +{{0xc4,0xaa,0x42,0x52,0x46,0xb5,0x17,0x3f,0x5e,0xf8,0x98,0x15,0x2e,0xca,0x3d,0x09,0x2b,0xb4,0xc2,0xdd,0x02,0x85,0x3f,0xcf,0xc7,0x17,0x83,0x99,0xf4,0xe2,0xf7,0x58,},{0x29,0xb7,0x7a,0x30,0x75,0xf4,0x19,0x24,0x3c,0x0c,0x1b,0xc3,0x96,0x59,0xd7,0x31,0x17,0xac,0x00,0xe5,0x5e,0x8d,0xe3,0x8f,0xe9,0x82,0x9a,0x87,0x9c,0xc5,0xb8,0xa0,},{0x5d,0x85,0x45,0xa4,0xbe,0x3f,0xd6,0xda,0x25,0x78,0xc2,0xec,0xcb,0x64,0x8d,0x83,0xfc,0xfe,0x58,0x71,0x33,0xfa,0x7a,0xe4,0xa1,0xcf,0xca,0x9a,0xe6,0xda,0xa4,0x92,0x59,0xc9,0x52,0x04,0x4a,0x85,0xa2,0x0b,0x6f,0x53,0x24,0xf8,0x27,0xdb,0xa2,0xd1,0xa8,0x38,0x8c,0x40,0xa9,0x28,0xb9,0x50,0x91,0x3c,0x63,0x4f,0xb3,0x09,0x27,0x07,},"\x7d\xf9\x78\xa1\xf4\x97\x68\x38\xff\xed\x74\x49\xa4\xdc\x13\x8b\x60\x4f\x4b\x2a\x4a\xe6\x89\xce\x75\x01\x8e\xbc\xcd\xab\x2e\xaa\x0b\x60\x76\x8f\x72\x08\x25\x7f\x2b\x28\xe7\xaa\x09\xbf\x6c\x05\x88\x8d\xa4\x6f\xd3\x96\xd1\xc8\x03\x01\x17\x50\xe3\x0e\xb4\x84\x87\x0c\x88\x06\x97\x76\x96\xf1\x2e\xbb\x9f\xee\xb4\xca\xf9\x2a\x02\xdb\xaa\x22\xbb\xff\x63\xf8\x42\xc3\xba\x14\x7b\xca\x7c\x00\x31\x42\x78\xac\xd0\xdb\x17\x35\x69\xf4\xe3\x65\x27\x95\x8e\xf6\xf1\x00\x2b\xd3\xcd\x01\xf4\x07\xa8\x65\x31\xed\xcb\xd9\xf3\x1b\x3a\x4a\xb8\x80\xa4\xf5\xb5\x2b\x42\xd0\xd4\xa1\xba\x66\xa2\x09\x86\x51\xae\x3e\x6c\x91\x51\xf4\x02\x73\x28\x5f\x7f\x6a\x4e\x81\x60\x6b\xf9\x80\xf6\x89\x50\x4b\x42\x08\x0f\xdb\x97\xc7\x28\x46\xfb\xa9\x04\x7c\x7e\x66\x0b\xa5\xc6\xbf\x12\x6a\x9a\x59\x9e\x25\x71\xfa\x13\x50\x5a\xf7\x58\x1b\xfe\xbc\x16\x51\x3f\x5c\x94\xdc\x71\x93\x7e\x6e\x61\xb3\xea\x10\x93\x9b\x02\xea\x10\x85\x9f\x32\xd7\x91\x2b\x9e\x38\x06\xab\xef\x61\x85\xfc\xff\xa6\x88\x21\x47\x80\x05\xcb\xfc\x1d\x63\x7d\xd0\x20\x42\x56\x20\xa3\x18\x07\x48\x98\xbd\xc3\x09\x31\xc5\x9a\xc0\xc6\x6c\x4d\x12\x38\xb0\x97\xcd\x5b\x17\x0f\x08\x44\x35\xd4\xba\xe4\x8a\x03\xd9\x2f\xd4\x8f\xc2\xca\xa4\xff\xc5\x05\xf1\xbc\xa5\x16\xfb\xd6\xe4\xf8\x88\xcc\xed\x98\x2a\xe0\xdd\xb8\x8f\xc2\x8a\xa6\x97\xb7\x07\x1d\x01\x5b\x0a\xcb\x28\x09\xb0\x1d\x1d\x9c\x7e\x7b\x53\xee\xe6\x82\x4c\xc3\x7c\xce\x5b\x69\x93\xd8\x8d\x83\xea\xfc\x2e\x92\x8a\x6f\x14\x7d\xb6\xeb\x80\xb1\xa6\x9f\x01\x60\x5b\x04\x6b\xd2\xfd\x1d\x92\xc5\x45\x9d\x6d\x33\x98\xa9\xca\xa2\x99\xdd\xd0\xc3\xba\x2e\x08\x94\x13\x07\xb1\x20\xcc\x13\x99\x2f\x70\x03\xac\xed\x14\xa4\xa4\xd9\x23\xbb\xb1\x2f\xc3\x93\xff\xcf\x92\x0b\x9f\x6d\x47\x75\xe9\x4d\x4a\x51\x22\x67\xfd\x26\xa6\x99\x7c\x60\x62\xb4\xc9\x90\x0f\x98\x62\xb9\xea\x0c\x8d\x7d\xf1\x9f\x05\xc2\xb6\x04\xaf\x5b\x98\x64\xfb\x27\x54\xa8\x07\x3b\xbb\xfb\x18\x23\x3e\x6e\x15\x0f\x72\xa5\x25\xe3\xa5\x76\x0f\xcd\xa7\xd3\x2a\x60\x03\x4f\x95\x6e\x3c\xbd\x34\x36\xc2\x00\x83\x0b\x3e\x7a\x14\x57\x12\x20\xbc\xb6\x27\xd5\xa4\xbe\x72\xc2\x0b\x23\x35\x1b\x2d\x92\x06\x02\xa5\x1c\x3e\xb3\x2c\x12\x37\x03\x9d\xfb\xff\x43\xc9\x87\xfd\x85\x63\x77\x7f\x0e\x5a\x39\xf8\x14\x6c\x16\x4b\xdf\xfc\xe4\x4f\x3b\x13\xee\x74\xd6\x4b\xfd\xcf\x98\x03\xf0\x3d\xd0\x17\x2a\xc4\xfa\x4b\xf6\xc7\x83\x9c\xb1\x1f\x3d\x34\xba\xef\x0e\x32\xb5\x49\x42\xfc\x4f\xa3\x8f\x47\x3e\x29\x66\xf4\x91\x1c\x0e\x80\xd7\x69\x37\xb2\x5b\x76\x32\x27\x5b\xa8\x83\x09\x63\x5a\x60\xdf\x13\x54\x89\x20\x8d\x3e\x73\x4b\x67\x2e\xda\x7d\x2b\xa2\x15\x79\xab\xa8\xd8\x86\x0e\xa7\x64\xfd\x67\xea\xf9\xc3\x8e\xa7\x63\x7d\x1b\xad\x57\xb2\xf3\xd7\x82\xb9\x1e\x1d\x5d\x92\xac\x30\x0b\xdb\xa7\xab\x91\x13\xce\x91\x3d\x0c\x79\x3c\x12\xa9\xa7\x26\xe3\xfc\xab\x05\xcb\x47\x99\x77\x87\x16\x40\x63\x0d\x45\x9e\x69\xe8\x1c\xa5\xcf\x56\xdd\xb2\xa0\x61\x1d\x61\xd4\x81\xc1\xb8\xce\xf3\x80\x4b\xd4\xe5\x75\x4a\x61\xeb\x49\xb1\x7e\xf2\xb0\x3c\x83\x05\x7b\x5d\x20\xd8\x82\x05\x8c\x00\xf5\x4b\x6c\xca\x86\xbe\x95\x35\x0d\xd7\xbc\xb2\x5e\x4c\x1c\x46\x58\xf4\x52\x29\xc8\xbb\x9f\x5c\xdf\xcc\x44\x79\x5c\x97\x8e\x33\x88\xd3\x25\x76\x01\x06\xe5\x2b\xe9\x83\x4b\xd8\x1f\xfc\x5c\x62\x48\x6b\x6f\x33\xc2\x74\x59\xdf\x17\x8e\xb9\x46\xe7\xa8\x2d\xb9\xce\x0d\x29\x5b\x92\x5b\xb6\x12\x6d\xd5\x5c\x31\xf4\x9a\x68\xdc\xef\xc7"}, +{{0xf1,0x3c,0xaf,0xde,0x6f,0x39,0xb9,0x63,0xdc,0xa9,0x66,0x26,0x86,0x2f,0x4f,0xbc,0x5c,0x2e,0x00,0xdd,0xf0,0x8b,0xec,0xea,0xc7,0xa6,0xe2,0xfc,0xa9,0xe1,0xcc,0xf7,},{0xc1,0xb0,0x1a,0x91,0xe8,0xee,0x0b,0x9f,0x19,0xa7,0x2e,0x5e,0x7e,0x0a,0xef,0xcf,0xdc,0x44,0xa1,0x57,0x47,0x4e,0x99,0xfe,0xeb,0xd0,0xff,0x55,0x2d,0x73,0xb2,0xac,},{0x6c,0xa9,0xf8,0x0a,0x62,0x50,0x1f,0xaf,0x31,0x9f,0xb8,0x4a,0xf4,0x71,0xf6,0x76,0xae,0x3f,0xff,0x85,0x56,0x5c,0x97,0x98,0x1f,0x14,0x57,0xcb,0xb8,0xc4,0x9f,0x97,0xb2,0x66,0x31,0x6a,0x99,0x2d,0xb0,0xd4,0x2b,0xc5,0x02,0xf0,0x95,0xa5,0xf2,0xd9,0xa4,0xe1,0xcf,0xac,0x0c,0xc9,0x35,0xd3,0x88,0x2c,0x8a,0x3a,0x0e,0xa6,0xe1,0x0e,},"\x2b\xee\x73\xb7\x4f\x1b\x76\x22\xeb\x09\x6a\x28\xd8\x3a\x81\x9b\xce\xc2\x2d\x99\x99\xa3\x20\x62\x10\x3d\x60\x4a\xe6\xd7\x8e\xdf\x8f\x89\x38\x95\xd2\x22\x0a\xb7\x56\x90\x41\x0c\x58\xaa\xb5\x90\xa9\x8d\xdf\xf2\x3a\x94\xd2\x35\x0f\x88\x9e\x53\x46\x42\x00\xa5\x27\xd5\x4d\x62\x57\x11\x07\xb2\x7e\x57\x4f\x54\x2e\xba\xc2\x49\xb8\xe2\xe3\xce\x08\xd1\xbd\x27\xbd\x8d\x29\xf2\xe6\x12\x43\xde\xef\x0e\x69\x38\xe5\x2e\xe2\x99\x2f\xf2\x18\x7d\x7a\x7f\x52\x82\xed\xd9\x8f\xc4\x98\x5b\x61\x9a\xcb\x80\xaa\x9d\x03\xd6\xcb\x84\xb8\x21\x10\x6f\x40\xd6\xe5\xf4\xc3\x87\xab\x0a\xf6\xf2\x06\x61\x5d\x0a\x17\x5f\x7e\x60\xee\x27\x55\xae\xa3\x46\x75\xfd\xd8\x23\xeb\x24\x10\x9a\x9b\xd8\x18\xea\x2d\x9d\x9b\xd1\x99\xcf\x8d\xfe\x79\x62\x4b\x03\x72\xae\x85\xe9\x8c\x60\x20\x02\x34\xbd\x41\x3f\x4a\x62\xce\x68\xa4\x7b\x6c\x9b\x12\x85\x7c\x0d\x39\x9a\x44\x8e\x5a\x52\x80\xe9\xf2\x2f\x9b\x12\xea\x2c\xd3\xc6\x87\x13\xe7\x7d\x0a\x11\xf3\x62\x8d\x8e\xc5\xe0\x60\x63\x90\x31\xd3\xb6\x40\x02\x1c\x9c\x38\x80\x9d\xc5\xf4\x2d\x2e\x1c\x2e\x23\x46\xc8\x6e\x24\xee\xdc\x59\x84\xa1\x15\xa4\x2d\xe8\xde\x7e\x35\xc9\x91\x75\x39\xe8\x98\x85\xca\x91\x6e\x07\x2a\xfd\x5d\x46\x84\x6b\x2a\x93\x59\x61\xc2\xfe\x28\xe9\xeb\x3c\x8f\x89\x6b\x86\xfc\x12\x0c\xbd\x3a\xf2\xaa\x13\x9c\x49\x9d\x29\xcf\xc3\x69\x9d\xb7\x9c\x14\x48\x4e\x9e\xc2\x57\xa5\xf6\x43\x44\xb7\xad\x1e\x3d\xfb\x34\xee\xe7\x65\x4c\x6b\xf1\x2f\xd3\x8f\xbb\xa8\x0f\xe1\x76\x2a\xab\x57\x11\x2b\x3a\x94\xe2\xbe\xe7\x90\x41\xd1\xe8\x84\x40\xf8\x5f\xb7\x2d\xde\x68\xd4\x9e\x84\xbc\xed\x99\x8a\x2f\x63\x35\x44\x6e\x4a\x83\x5e\x70\xc5\xf8\x27\xfb\x3a\xd7\x82\x3d\x5f\xbe\x3b\xe5\xf6\xec\x7e\x43\x4e\xe5\x24\xcc\xd9\xff\x5b\x7e\x72\xa3\x2d\x09\x1a\x7e\x17\xc8\xb1\xae\x41\xa1\xaf\x31\x79\x3c\xce\x91\xd8\x4c\x36\x22\x67\x89\x69\xc8\xf5\x17\xdc\x26\xe3\xcd\x61\xd2\x44\x69\x12\x28\x3f\x93\x53\xbb\x5a\xd0\x3c\x11\x1c\x62\x33\xde\x31\x4c\x61\xb8\x31\xcb\xf3\x8b\x04\xfe\x58\xcf\x44\xf1\xd2\xd0\xb4\x5f\x25\xa6\xb4\xe0\x25\x68\x59\xcd\x5d\x83\x0f\xac\x5e\xc3\xc8\xd7\x63\x98\x55\x9e\x9b\x26\x01\x0f\x5e\x1d\xa5\xf2\x5d\x22\x00\x93\x54\x53\xff\xac\x5a\xea\x51\xf7\xe8\x1e\x72\xec\x8e\x5f\x04\xd2\xf8\x85\xc7\xb4\x5c\x63\xf6\x44\x56\xcf\xe2\x31\xb8\xcb\x24\xaa\x16\x20\xa9\x02\x63\x9c\xa7\x8d\xd3\x91\xaa\x4a\x3d\x03\xe1\x19\x75\xc8\x90\x7f\x96\x4f\xd5\x5d\xf9\xbb\xb1\x40\xe3\x8d\x6d\xb9\x32\x56\xb4\xb3\x9c\x2b\x7b\xcb\xe3\x5b\x11\x82\x6b\xbf\x8c\x08\xf1\xdc\xb4\x8e\xdc\x4b\xfb\x70\x46\x2a\x35\xea\x8c\xd8\xcb\xa7\x9f\xab\x8b\x4c\x44\xe7\x3b\xe7\xec\xfa\x11\x21\x66\xf6\xdc\xab\x70\xd8\xbb\x55\xd8\xb8\x42\x8c\x2d\xa7\x1a\xac\xa2\xfc\x3d\x90\xf3\xcc\x5e\xd0\x15\x51\x35\x8d\x60\x78\x9b\x9d\x57\x1e\xfe\x10\x89\x20\x27\xfa\x37\x40\x4a\xaf\x59\xec\x1c\x2d\x71\x11\xec\xc3\x59\x24\x67\xed\x1d\x9b\x8a\xba\x8e\x22\x9e\x32\xd2\xa0\x0c\x19\xdb\x71\x87\xfb\xcb\x12\x20\x61\x96\x1c\x1f\xda\xca\x30\x7e\x9c\x9c\x9d\xe9\x72\xad\x51\x40\x2f\xa6\x7d\xc1\xc2\xa4\x03\xb3\xc5\xe8\xb1\xe2\x46\x86\x2d\x6a\xd6\xa4\x98\xdb\x6d\x76\x1f\xb5\x66\xf6\x06\x59\x42\xb6\x0a\xd4\xb4\x30\x9d\x18\x2b\xc5\x15\x4c\xfc\x36\x86\x31\x85\xa8\x7e\x23\xab\xaa\x1d\x54\x1a\xb7\x63\xa4\xa1\x06\x6c\x0a\x7a\x8c\x3d\x82\x1a\xe3\x2f\xd3\x1c\x88\x92\x40\x10\x46\xd0\xa2\x0e\x91\xa6\x47\x79\xf4\xbd\xa8\x11\x20\xaf\x3f\xb3\x48\x6d\x3f\xc0\xa7"}, +{{0xc8,0x46,0x34,0x42,0x61,0xa3,0x48,0x65,0x39,0x38,0x34,0xbf,0xaa,0x3a,0x15,0xa3,0xf5,0x3a,0xc9,0xe1,0x38,0x33,0xb0,0xb2,0x87,0x12,0x27,0x81,0xb7,0x9d,0xe3,0x92,},{0xeb,0xad,0xe0,0x22,0x61,0x95,0xae,0x25,0x4b,0x61,0x15,0xe2,0x16,0x96,0xa9,0xc6,0x5a,0x19,0xd5,0xe0,0x40,0x44,0x31,0x31,0xc2,0x2b,0x89,0xf0,0x2f,0x69,0xab,0x78,},{0xd5,0xe4,0x1b,0x47,0xad,0x0f,0x34,0x00,0x70,0x97,0x70,0xed,0x43,0x91,0x9b,0xaf,0xdf,0x24,0x38,0x1b,0x66,0x15,0x44,0xe5,0x1d,0x8b,0x5c,0xee,0x9e,0x97,0xb3,0x67,0x6a,0x4c,0x0f,0xfa,0xeb,0xb2,0xcb,0xd2,0xdb,0x79,0x85,0x32,0xb6,0x5c,0xf6,0x54,0xa5,0xb6,0xc1,0x66,0xef,0x88,0x6c,0xb0,0xfb,0xbf,0x4a,0x4f,0x84,0x4c,0x44,0x0b,},"\x5a\xbd\x13\xe9\x5b\x6e\xe1\xd5\x51\x47\x68\x28\x22\x00\xa1\x4f\x7d\x1a\x57\x1f\x34\x68\xe2\x2e\xfe\xc9\x93\x46\x30\x66\xa3\x7a\xec\x83\x73\xe5\xfb\x49\x95\x64\x19\x1f\x32\x94\xa9\xb3\x0a\xfb\x5f\x1a\x34\xd4\xd8\x8a\xbc\x3e\x9b\xc3\x03\xc1\xab\xa0\x5b\xd8\xfa\xca\x90\xee\x35\xd9\x7a\xc3\xdd\x91\x06\xf6\xfa\x3c\xa8\x1a\x38\x10\xec\xce\xfa\x6a\x20\x9e\xa3\xf3\xfc\x30\x49\xdc\xb1\xb0\x03\xc7\x28\xf7\xf6\x37\x4c\xa9\x8c\x58\x2d\xe6\xdb\x1a\xf7\x60\xf0\xa0\x21\x33\xca\x4a\x01\x03\x24\x30\x4d\x26\xa0\xe5\x0a\xf0\xd1\x3c\x13\x4d\xa3\x4a\x03\xa4\x1e\x83\xec\x8f\x10\xea\x5b\x85\x9b\xec\x1f\x51\xb0\x1c\xab\xb2\xd1\x6c\x1f\xc5\x2b\x05\x8f\x8e\x5d\xef\xae\xde\x12\x81\x71\xc2\xe0\x26\x90\x23\x16\xf8\x71\xb3\x5e\x32\x92\x65\x6f\x0e\x5b\x39\xbb\xbc\x81\xd0\xc0\x83\x0e\x6a\xc0\x1f\xac\x9b\x45\x39\xf4\x7f\x9a\xcf\xbd\x58\xb7\xab\x9f\x5a\x12\x56\x00\xf2\x51\xa2\x71\xd7\xbf\x16\x7f\x29\x54\xca\x8e\x1e\x0c\x96\xe1\x6b\x06\xe8\x30\x7d\xf8\x8b\xb8\xe9\xd5\x7d\x5b\xa0\x44\xf2\x7f\x3e\xaf\xf8\x1d\x9f\x15\x05\x54\xaa\x71\x22\xfd\x10\xd1\x1f\x35\xd2\xbe\x2b\x16\x24\xe3\xe1\xa1\xd7\x7f\xea\x4c\x5c\x7f\x8b\x98\x3e\x94\x5b\xa8\xc0\x8d\xc1\x54\x5b\x3e\x6b\x29\x73\xad\x04\x1c\x44\xd0\x61\x7e\xcc\xc8\x71\xa3\x82\x1a\x9f\xfe\xa9\xdb\x7c\x2b\x0d\x05\x5d\xa5\x5d\xe0\xb3\x50\x63\xe4\x22\x5a\xee\x6b\x22\x5a\xb2\xa7\x90\x6a\x8e\xe3\x29\xd1\xb3\x97\x2e\x0d\x1f\x70\x81\x7c\x50\xcc\xfe\x94\x03\xd1\x2a\xd6\x2c\x94\x92\x3b\x9a\xa2\xd7\xf8\x5a\x8d\xda\x47\xbe\x4d\xce\xc0\xdc\x2b\x0b\x58\xf7\xac\x19\x0a\xe0\x57\x9b\x9b\x13\xbb\xb8\xb1\x6a\x31\xb0\xab\x4d\x6f\x27\x91\x25\x3a\xb4\x75\x1b\x53\x6b\x88\xd3\xb4\x93\x7c\xc3\xa1\x10\xaa\x82\xa6\xff\xed\x68\x53\x52\x4b\x66\xb3\xef\xfc\xd2\xf6\x3c\x6f\x96\x45\xce\xa1\x3a\xa2\x3c\xd1\xc9\x9d\x9f\xfd\xa4\xcd\x3a\x9c\x5d\xf4\x5e\xc7\x47\x26\xc3\x47\x11\x28\xb7\x08\x9f\xbd\x82\x69\x4d\x2d\x3f\x08\xdc\x93\x06\xc0\xfc\x9c\xe7\xc8\x01\x13\x8e\xb1\xec\xb7\x56\xe5\x71\xe9\x05\x9b\x75\xed\x03\xf9\x2a\x31\x50\x2f\xbe\xb5\xfe\xc5\x1d\xe9\x35\x90\x10\xc4\x39\x7d\x28\xb6\x5e\x35\x6e\x38\x00\x1d\x0d\x51\xac\x96\x00\x72\x8c\x78\xb5\x76\x6e\x0f\x21\x79\x38\xb4\x10\xe7\x85\xb4\xc0\x1e\x86\xa3\x45\x2b\xcb\x38\x84\xac\xa4\x75\x40\x85\x9c\xc4\x9b\x00\x0f\x0b\x61\xfd\xbe\x72\x75\x25\x74\xb2\x7a\x22\xd4\xc4\x04\x13\xa4\x3b\x31\x09\x24\xb1\xbb\x14\x0f\xc9\xfd\xaa\xe2\x66\xd6\x59\x30\xe3\xf2\x34\xfe\x84\x1d\x82\xb2\x61\x76\xff\x86\xc5\xd2\xbd\x8d\x96\x5c\x52\xd7\x28\x06\x4e\xbd\xf6\x8d\xc8\xe4\x83\x49\x41\x80\x1c\xca\x0b\x2f\x25\x6d\x4f\x6c\x3d\xd1\x9d\x35\xd5\x36\x2b\xbf\x9b\x8a\x3a\x1c\x86\x3e\x09\x26\x89\xdd\x28\x52\xad\xd4\x88\xbf\x42\x68\x5b\x11\xe1\xe1\xad\x57\x45\xd0\x75\x62\x8d\x73\x1f\x91\xcf\xd7\x49\x15\x9e\x2e\x1c\x83\x7f\x4e\xf8\x3d\x80\xea\x1d\xd9\xbd\xed\x5f\x88\x01\x8c\xe1\xd4\xb3\x37\x1f\x95\x43\x53\xf3\xd8\x94\x37\x00\x62\xc0\x96\x5d\x67\x98\x6d\xbc\x48\x17\x15\xf4\x2d\xd2\xc9\x16\x07\xab\x8b\x5f\x0d\x89\xf6\x6e\x68\xd7\x3d\x50\xd6\x40\x52\x4d\x72\xe6\x91\x34\xb8\x87\x29\x8e\x5c\xd8\xc4\xb9\x05\xba\x5e\xfa\x0e\x9d\x68\x52\x14\xb8\x42\xf5\x0a\x2a\x39\x83\xa1\xaf\x58\x5a\xf2\xca\x43\xdb\xcf\x02\xc4\x08\x97\xae\x2e\x1a\xb5\x1d\xbc\xe5\x70\x34\x5e\x8e\x13\x5f\xb7\xb4\xeb\x0a\x1d\x6a\x0b\xb5\xa8\xa1\x80\x7e\x42\x5b\x2d\x62\x83\x60\x76\x80\x58\xe6\x1a\xd1\xcf\xaa\x20\x99"}, +{{0xfa,0xaf,0x55,0xd3,0xc2,0x97,0x14,0xb6,0x5c,0x22,0x81,0xe2,0xc2,0x2d,0x61,0x34,0x97,0x1a,0x2e,0x74,0x00,0x8f,0xb9,0x40,0x89,0xa7,0x73,0xee,0xeb,0x44,0x83,0xa6,},{0x39,0x86,0x2e,0xac,0x6d,0xd5,0x2e,0x38,0x1b,0xb3,0x4d,0xc1,0x96,0xba,0x8a,0x37,0x4d,0xcb,0x7d,0xf6,0xcb,0x14,0x0f,0xd0,0xcf,0xa6,0xcf,0xa3,0x9b,0x8c,0x75,0x3f,},{0x5b,0x00,0x83,0xf7,0xa8,0x20,0x61,0xc6,0x5c,0xf6,0xc7,0x56,0x40,0xc8,0x1c,0x28,0xe8,0xd6,0xd2,0xe8,0x7f,0x6d,0x57,0x95,0xc9,0xaa,0x3b,0xb3,0xe3,0x90,0xe9,0x19,0x90,0xe8,0x2d,0xb6,0xf0,0x7e,0x61,0x4f,0x50,0x7a,0x56,0x0a,0xba,0xa1,0xec,0xa6,0x56,0xc6,0x78,0xdd,0xca,0xe8,0x19,0x82,0x51,0xe6,0xaf,0x0b,0x76,0xb8,0x8d,0x0d,},"\x94\xe6\x61\xc2\x52\x40\xa8\x9e\x82\x3d\x7f\x5d\xc0\xe6\x92\xed\xdd\x13\x70\xc3\x5a\xc4\x4d\x5a\x8c\x87\x98\xd0\xc9\xaa\xfd\xf0\xbb\xfb\x54\x92\x60\x56\x8d\xba\x1c\x69\x08\x6b\xee\x63\x6b\xe8\xed\xcc\xd3\xcb\xb2\x70\x16\x24\x4d\x54\xd7\xed\x2f\xeb\x7f\xa6\x46\x14\xd4\x54\x49\xd7\xe0\x58\xe7\x1b\x30\x6c\x22\xe6\x91\x1c\x2a\xc7\x42\x07\xba\xe5\xa8\x4d\x0f\xc2\x47\xbe\x49\xd3\x56\xe5\xd4\x35\x3b\xa5\x58\x6b\x6e\x4b\x2b\x97\xce\x9e\x23\x77\xb6\xee\xd9\x2c\x84\x9e\x67\x69\x44\xae\x90\xdc\x42\x08\xe3\x00\xe1\x9c\xc9\x1d\xc2\x6b\xbd\xd5\xa3\x0c\xfa\x92\x81\xa1\x5e\xfd\x87\x30\x66\xf8\x5a\xf3\xa2\x6f\x31\x06\x23\xe0\x09\x80\x48\x53\xcc\x68\x55\x90\x3e\xa6\x4a\x90\x98\x97\xe3\x15\xe7\x3d\x31\x29\x48\x98\x0e\xf6\x28\x9d\xb2\x1a\x5e\xbb\xec\x8c\x8e\xfe\x20\xd1\xd5\x3d\xfa\xad\x6d\x9f\x42\x96\x53\x2e\x88\x7c\x37\x35\x01\x05\xa6\x33\xab\xc7\x73\x18\x87\x51\xb2\x8c\x3a\x08\xf1\xb5\xee\x04\x72\xde\x46\x27\xe6\xb6\x1b\x68\x27\x8d\xd5\x1c\xed\x6a\x61\xec\xf3\x88\x86\xe4\x53\x39\xdc\x6c\x60\xc3\x1e\x85\x0e\xf8\x29\x6a\xe8\x0f\x9d\x31\x70\x17\x76\xeb\x9a\xf2\x16\x93\xf4\xc5\x2e\xc0\x62\x62\x57\x38\xd4\xe3\xaf\xbf\x71\xd1\xc8\x1f\xc4\x84\x63\x60\x36\x3e\xa5\x41\xa9\x76\x62\x3a\x5e\x4e\x6b\x6a\x67\x23\x7e\x92\x37\x17\x3f\x1a\x1d\x54\x33\x02\x85\x88\x85\x71\x4c\x2a\x59\x1d\x0a\x78\x62\x82\xa0\x28\x5a\x37\x11\xf7\xbc\x2b\x63\xca\x79\x87\xe9\xae\x7d\x02\x03\x55\x55\xcf\x3b\x6a\xd6\xf7\x1c\xa9\x8a\xa9\x28\x88\x3b\xf8\x1d\xd6\xf8\x64\x93\xea\xab\x56\x37\xb4\xdd\x56\x9d\x1e\xe8\xde\x6a\x44\xbc\xed\xb6\x2b\x97\x06\xb1\xdb\x89\xe3\xf0\x5d\xf1\x63\x10\x01\x7d\x89\xef\x3e\x4b\xc0\x99\xb7\x21\xa5\xc8\xd3\x80\x43\xd6\xe4\xa2\x2c\xf0\x40\x09\xc0\xfc\xee\x6b\xe6\x99\x37\x82\x99\x54\x94\x1b\x8b\x4a\x1e\xbf\x4d\xae\xa0\xd7\x74\xd0\x78\x2b\xe1\x76\xc8\xe5\x91\x90\x77\x56\xc2\xcf\x75\xde\xa6\xf7\x87\x7d\xd6\x87\x5b\x8f\xe1\x01\x2f\x30\x50\xcf\xb1\x28\x9c\xf0\x88\x66\x7e\x15\x22\xee\xed\xc9\x27\xac\x86\xbf\xe2\xc4\x07\x43\x2b\x4a\x81\x3a\x6a\x7a\x55\x04\xe9\x99\x20\x6d\xb1\x82\x7e\x25\xfa\xfd\x70\xce\xd3\x6d\xb3\xb2\x81\xb6\xf7\xb1\x4e\xd5\xba\xa0\x57\x23\x15\xa9\x39\xc5\xbf\x4a\xbb\x13\x3d\x2e\x7b\x16\xd5\x2d\xe2\x08\x17\xaf\x05\x5d\xf5\xf1\x41\x20\x77\x34\x61\x0a\x0c\x6e\xeb\xed\xaf\xff\xd9\xcc\x9f\x06\x9b\x67\xf9\xa1\xc0\x45\x4b\xe4\x1d\x54\xc1\x38\xbe\x54\x2e\x5e\x38\xcf\xe2\xf2\x93\xf7\xd2\xd3\xdf\x66\x97\x7a\xcb\x36\x6a\x42\xc1\x9b\x31\x85\xac\xfa\x1b\x36\x3c\x61\x31\xa4\xa8\x11\x1c\x3b\x1f\x4f\xd7\xac\x40\x6d\x0e\x69\x10\x3b\xa1\x5b\x8c\x4b\xf2\x9b\xc2\xed\x9c\x45\xcf\xd1\xd2\x79\xd8\xd9\x31\x44\x4b\x2b\x18\x49\x25\x2b\x8a\x70\xee\xd8\x0f\xd2\x60\xed\xf5\xa3\xc0\x1b\x96\x90\x16\x0d\x23\x11\x85\x1d\x21\xc9\x30\x2d\x98\x59\x86\xea\xee\xb3\xae\x2c\x07\xc7\xc7\x67\x20\x94\xf9\x1d\xb0\xbd\x50\xbe\x37\x7e\x4d\x1e\xb0\x7e\xe7\x6a\xf4\x9d\xc1\x36\xa1\x45\xa1\x1b\x17\x2f\x08\x11\xfe\x73\xd6\x25\x9b\xe3\x70\xc4\xdf\xca\xb6\xf1\x9e\x4a\x64\xb1\x51\xd0\xa6\xdb\x80\x50\xc3\xde\x2c\xc3\x25\xf5\xc5\xf6\x59\x4c\xf6\x24\x8e\xb0\x81\x20\x95\x39\xe0\x8c\xa3\x42\x29\x84\xe7\xbf\x80\x3d\xe3\xa4\x19\xb1\x44\x23\xf1\xe5\xa5\x42\x24\x04\x2c\xe4\xf0\x54\x88\xa6\x04\x4f\x40\x42\xbd\x64\x9b\x1a\x08\xce\x10\xc2\x00\x6e\xa7\x6e\xfa\xb4\x64\x1f\xef\x28\x97\xef\xd7\x24\xe6\x05\x4a\x3b\xd1\xa6\x9e\x39\xa4\xa5\xe2\xd5\x02"}, +{{0x6d,0x78,0x55,0xe3,0x0f,0x7a,0x13,0xe2,0x37,0xb0,0x67,0x14,0x43,0x46,0x43,0x4b,0xb4,0xb0,0x51,0x78,0xc7,0xd8,0x8d,0x49,0x2e,0x79,0x02,0x7c,0x4b,0x0f,0x3c,0xdd,},{0x72,0x73,0x29,0x38,0x28,0xef,0xa3,0x49,0x82,0x23,0x92,0xdb,0xba,0xb0,0x78,0x79,0x57,0x7e,0x1a,0x77,0xa6,0xfd,0x6a,0xfe,0x33,0x75,0x3a,0x9e,0xec,0x88,0xc4,0xaf,},{0x0f,0xe2,0x8e,0xad,0xd9,0xe5,0xdd,0x57,0x4b,0x3f,0xaa,0xea,0x81,0x0d,0x44,0x52,0x2c,0x8b,0x1b,0xfb,0xb3,0xe3,0xd5,0x7e,0xd8,0x89,0xfa,0xed,0xec,0x91,0xd0,0xe1,0x4a,0x86,0xb9,0x14,0xc4,0xc7,0x66,0xf1,0xbf,0x9b,0x8f,0x18,0xb0,0xdb,0x89,0x0d,0xb6,0xc1,0xb1,0x25,0xd5,0x78,0x04,0x33,0x36,0x19,0xb1,0xe0,0x72,0x0a,0x33,0x00,},"\xf8\xb9\x36\xe7\x93\xb0\x17\x58\x0c\xc0\xe9\xcb\xda\x2a\xcb\x64\x74\x50\x7f\x4b\xca\x3a\xfc\x87\x83\xec\x46\xee\xb8\x2c\xcd\x4d\xd2\x52\x56\x76\xaa\x6a\xb5\xc0\xdc\xf7\xd7\x5f\x7e\x03\x11\xe6\xfe\x6b\xf2\x72\x63\xf8\x57\x8f\xeb\x55\xc5\x61\x2d\x1f\x28\xe8\x88\xb7\x66\x56\xc4\x1c\xcd\x8a\x70\xb9\xbc\x60\x4b\x42\x72\x4f\xa2\xbc\x41\x1d\x44\xc3\x1a\xb6\x8c\xe8\x4f\x83\x93\x39\x9e\x34\xd5\x40\x85\x79\xc2\xba\x29\x21\xf2\xf8\xd1\x14\x87\xaa\x7e\x52\x55\x7f\xee\xd9\x67\x57\x19\x9d\x3a\xae\x63\x77\x77\x01\x54\xb1\x7f\x35\x77\xc7\xac\x3d\x8c\x76\xcf\x74\x61\xb5\xe8\xd4\x2a\x71\x85\x07\x8e\xd4\xf8\x62\xfc\x57\x50\x2f\x61\x50\x75\x30\x7b\x6e\x10\x3c\x77\xc1\xf6\xc8\xbd\xa7\xaa\x17\xe4\x35\xe2\x1b\x94\x9a\xf4\x4d\xff\x5a\xa3\x0a\x62\xda\x71\x2f\xa9\x96\x6a\x61\x2f\xfc\xa1\x48\x71\xfd\x6f\x86\x0b\x4a\x96\x14\x01\x2c\x53\x69\x91\x0e\x0f\xfd\x6f\x0f\xbd\x88\x9a\x9c\x25\x7c\x32\xbd\xcf\x90\xbb\x80\x62\x7c\xb2\x72\xec\xd4\x59\x98\x97\x55\x59\x55\xe1\xfe\x08\xcd\x7e\xbb\x21\xc0\x71\xbe\x0f\x48\x98\x96\x96\xcb\x39\xaa\x82\xad\x11\xba\xa5\xd4\xac\x61\x3a\xbf\x1b\x6d\xb8\xa2\x0e\x68\x68\x36\x22\x28\x33\xf8\xb6\xdd\x2f\x00\x06\x22\x7b\xe4\x8e\x85\x80\xdc\xc8\xde\x62\x0d\xac\xb2\xf6\x5a\x69\x36\x75\xd6\xcb\x45\xba\x5d\xd1\xaa\x70\xdb\x76\xbc\x64\x1d\x4f\xb5\x67\xec\xbc\x71\x11\x44\x2e\x29\x41\x58\xbe\x57\x5c\x71\xdd\xc2\x6e\x94\xf4\x12\x66\xa2\xfd\x3a\x0d\x43\x57\x81\xfc\x09\x46\x48\xfa\xdf\x5f\x17\xcd\x41\xab\x89\x58\x21\x89\x4e\xc0\x80\x6b\x26\x2c\x39\x35\x34\xfe\x66\xf2\x1e\x37\x83\xc1\x4a\x96\xc8\x8f\x2e\x06\x53\xfe\x32\xe7\x5d\xce\x8a\x46\x3b\xb9\x7e\xed\x6c\x16\xf3\xf3\x22\x81\x69\xab\xb5\xb4\xbf\x9e\xa3\x27\x8c\x1f\xf0\xf8\x6e\xae\x71\x38\x9b\x64\x33\xac\xd0\x97\xee\xfa\x9e\x6e\x05\xf4\x95\x5c\xd5\x17\x83\x0b\x8d\x98\x70\xcc\xb5\x22\x74\x15\xe5\x0f\x23\xf6\x47\x32\x17\xa7\x45\x09\x64\x70\xdc\xa9\x3d\x2b\x34\x67\x3c\x5d\x6a\x57\xed\x02\xc8\xe0\xca\xe1\x19\xb3\xf3\x29\xd8\xab\x64\x98\x49\x4c\x29\x21\xbb\x6f\x49\x6d\xd0\x83\x81\xe7\xd3\x9f\x2d\xb5\x76\x3b\x14\xa2\x82\x1b\xef\xcc\xa0\xa9\xfd\x31\x25\x45\xde\x68\xab\xf2\x06\xd1\x2d\x8e\x02\xe7\x3b\xc7\xe3\xcb\x79\x6e\x7e\xe2\x6c\xc6\x3d\x74\x1e\xfa\xfc\x53\x45\xf8\x13\x29\x51\xbc\xfb\xfd\xdf\x63\x1f\xb7\xcb\x43\xef\x35\xb9\x45\x3c\x93\x90\xeb\x23\xb1\xf9\xd8\xb1\xc7\x2d\xeb\xd2\x4f\x09\xa0\x1a\x9d\xc6\x0e\xe6\x81\x53\x06\x18\x83\x57\x78\x1a\xf6\xe1\x82\x0a\xa3\x5e\x4e\xc1\x21\xb7\xca\x34\xd7\xde\x76\x11\xb2\x46\xa3\xe7\x03\xed\x48\xc7\xeb\x03\xa6\xfe\x8f\x85\x2e\xe7\xd3\x25\x45\xc9\xd8\x52\xd6\x4d\x5d\x75\x93\x0e\x5f\x1e\xbe\x21\xa3\x07\xef\xa7\x62\x2e\xda\xce\xd6\xd8\x79\x02\x6f\x0f\x85\xa9\x11\x20\x12\x80\x37\x05\x58\x22\x69\xd3\x9f\x14\x32\x34\xdf\x89\x09\xab\x3d\x94\x8e\x76\xd3\xda\xaa\x24\x22\x6d\x9a\xc6\x01\xee\xf2\x77\xfd\x2c\xfc\x4a\x19\xae\xdf\x43\x87\xa2\x16\x17\xb0\x3e\xc3\xd3\x84\x5a\x38\x55\x4f\x5e\x97\x03\x6e\x56\xec\x1c\xe6\x60\xdf\x9c\x06\x2c\x2c\x99\x3b\x77\xc5\xba\x6a\x6d\x05\x23\x1d\xae\x37\x64\x18\x3c\x3e\x96\xaa\x53\x9c\xfb\x34\x15\xfb\x16\x3c\x64\x5b\x23\x03\xb2\xd6\xd4\xbd\xa8\xca\x6c\x72\xbc\x03\xd5\x30\x5f\x9b\x11\x8e\x92\x5e\x27\xd2\x9a\xb7\xdc\xb1\x96\x47\x0e\x63\x39\x63\x1b\x23\x80\x74\x4c\x04\xd1\xda\x34\x8f\xc0\xfe\x27\x42\x77\xf8\x2f\x95\xbd\xfb\x0b\x64\xb4\xcf\x3b\x51\xe5\x71\xc0\xdd\xb3\xb5\x3c\xa6"}, +{{0x7e,0xe4,0xe7,0xe9,0x8c,0x6a,0x40,0xf0,0xe7,0x44,0x13,0xf2,0x40,0x39,0xbd,0x22,0x0d,0xf1,0xf8,0xc7,0xf0,0x15,0x52,0x8d,0xbf,0x52,0x84,0xab,0x9f,0x7c,0x82,0xe2,},{0x4d,0x5a,0x80,0x0f,0x9b,0x22,0x07,0x0e,0x01,0x6e,0xe2,0x3a,0xf8,0xa3,0x10,0x90,0x2b,0x36,0x9d,0x58,0x9a,0x84,0x7f,0x34,0x5c,0x2e,0xa2,0x96,0x8d,0x6d,0x09,0x24,},{0xac,0x3b,0xfe,0x3a,0xdf,0x94,0x1c,0x93,0x4d,0x33,0x49,0xc4,0x92,0xde,0x70,0xd5,0x16,0x6b,0xe3,0x89,0xf9,0x55,0xbe,0x87,0xc2,0x88,0x3f,0x41,0xf2,0xda,0x14,0x6c,0x91,0x06,0x51,0xa3,0xb4,0x52,0xc2,0xd7,0x39,0xdc,0x9b,0x53,0x1c,0x57,0x45,0x56,0x5e,0x69,0xd9,0x83,0x59,0xf1,0xd7,0xd9,0x3e,0xbd,0x36,0xd7,0x0a,0xbb,0xf0,0x0d,},"\x8f\xb0\x13\x73\xc4\x2e\x69\x61\x4a\xea\x99\xaf\x49\x32\x37\x85\xf3\x38\x61\xb9\x4e\x90\xf5\x65\x38\x9e\xbf\x70\xe2\x19\xf5\xde\xc7\x32\xe0\x01\x0b\x58\xf7\x29\x05\x30\xdf\x22\x2a\xc9\xc7\x3e\x1c\x2e\x92\xa5\xe6\x06\x1d\xe5\x59\x0c\xaf\x9c\x0d\x50\x21\xd7\x29\xea\xa1\x15\x41\xfa\x1d\x08\x21\x60\xbe\xaf\x61\x1e\x7c\xfd\xc0\xeb\xb3\x15\xd3\x88\xe5\x38\xb4\xb5\x02\x8f\x9b\x30\xd3\xd9\x73\x34\x7f\xfd\x44\x26\x3e\xef\x08\x3b\x81\xb2\x1b\x82\xec\xa5\x75\x6a\x49\x4b\x1d\x81\xc0\x7d\xe8\x49\x50\x6d\x3e\x3b\x66\x87\x97\xa5\xc5\x44\x25\x4d\x4e\xbe\x5c\xf8\x17\x1b\x39\xf8\x72\x4c\xbc\x41\x89\x29\x1b\x3c\x53\xc2\x1e\xce\x49\xa1\xd7\x39\x56\x3c\x65\xb4\x90\x25\x93\x56\x47\xa7\x30\x3a\xe0\xef\x7f\x6d\x24\x55\x46\x45\xa4\x28\xdb\xbb\x42\x44\x9f\x53\x99\xe3\x6d\xc7\x87\xb7\xd6\x95\x8a\x02\xee\xbb\xb8\x36\xe5\xe5\x3e\x26\xe4\x87\x23\x9d\xe9\x4d\x1d\x25\x0e\x79\x43\xac\x0e\x22\xd9\x27\x50\xa0\xcf\x34\x73\xbe\x1a\x62\x25\xcb\xe7\x95\x45\x04\x82\x69\xf6\x23\x7e\xc9\xf9\xec\x30\x7e\x8a\x34\xb7\xbb\x34\xcd\x49\x06\xe4\x31\x62\xa3\x70\x8f\x32\x9c\x5b\x98\x9d\x7a\x7f\xcd\xe1\x09\x9a\x54\x25\x46\xfe\x9c\x33\x18\x2b\xa5\x1b\x84\x3e\x96\xd1\x1c\x79\xe9\x1a\xd2\x1f\x71\x70\xe2\x57\xfd\xc2\x81\x8e\x12\xf9\x16\x8a\x97\x4c\x96\x8a\x4d\x27\x3f\xa3\xff\xa9\xf3\x5f\xf9\x05\x98\x0e\xaa\xd3\x72\x1c\xae\x80\x2b\xee\x36\x21\x0b\x40\xb9\x93\x19\xbb\x66\x99\x82\xe9\x43\xb2\x70\xa4\xc4\xd0\xa9\x2e\xcb\x5b\xba\x2d\xd8\xb4\x0a\xc3\xd2\xf0\x32\x5c\x46\x9d\x5e\x9d\x48\x3f\x52\x41\x97\x40\x10\xc5\xc0\xda\x33\x5f\x16\xe9\x62\x19\x6c\x2e\xf1\x4e\xb2\x4a\xaf\xbb\x31\x1b\xfd\x5f\xa8\xdc\x8d\x2d\x61\xe6\x87\x8a\xd2\xcc\xe0\xdc\x99\x39\xe4\x45\x22\x72\x3d\x42\x7e\xf3\x2f\xb4\x3b\x96\x7f\x5e\x44\xfc\x66\x57\x92\x79\x6f\x8c\xf9\x34\xf0\x1c\x32\x5d\x63\xd5\x83\xdc\x3c\xa9\xd4\xfc\xc7\x57\xd9\x17\x85\x80\xda\xef\x53\xaa\x3a\xb2\x1d\x2c\xe4\x35\x95\x5d\x1c\x6d\x47\x63\x8c\x5e\xdb\x62\xff\x55\x61\x69\x3d\x1c\xbd\x10\xec\x9e\x39\x9a\x71\xbf\x9d\xb1\xc9\x96\x9f\xd5\x9e\x4e\xeb\x31\xaa\x59\xbf\x39\xe9\xf1\x84\x17\x8d\xef\x72\x46\xed\x4b\x8f\x4b\xe5\xba\xda\xa5\xdb\x4a\xf8\x67\xf4\xf2\xec\x39\xa1\x37\x04\x20\x2c\x87\x84\xfa\x16\x8c\xe9\x6f\x9c\xfa\xc7\x10\x17\x23\x62\x75\xfd\x85\x7c\xc3\xc5\x1a\x9c\x7a\xc2\x56\x21\x5e\x14\xb8\x43\xf7\x21\x4d\xc9\xf8\x24\xb9\x1d\x1a\x51\x70\xd0\xef\x1d\x37\x69\x6f\x93\xee\x96\x6a\x2b\x7d\xec\xe2\x2b\x4f\x3a\xfd\x39\xc1\x6d\x60\x1e\x5f\xf8\x40\x8d\x45\xc1\xa6\xce\x71\xf0\x60\x97\x6c\x5b\xe4\xc0\x42\xb1\xb7\x38\xdf\x95\x80\xba\x5a\xe7\x78\x80\xa7\x0c\x0b\x94\xf0\xe1\xc9\xf9\xaa\x34\xc0\x90\xd6\x12\xd5\x7a\x9b\x93\x1f\x50\xa1\x25\xfa\x35\xce\x40\xa2\xcb\x7f\xaa\xd5\x30\xf8\x09\x08\xc7\x3c\xb7\x82\x58\xaf\xd2\x63\x13\x90\x04\x1d\x92\x61\x7e\x9b\xf6\x4c\xe9\x6e\x8e\x4a\xc7\xf3\x12\x6d\x8a\xf8\xa0\x4c\x75\xff\xd4\x38\x76\x9d\xe0\x6f\x74\xc2\xfc\x20\xcc\x81\x92\xda\x35\x3e\x79\x06\x12\x83\xbb\xa0\x8a\x8d\x24\xe6\xe4\xe2\xe8\x3b\xa5\xb0\x8e\x42\x75\x22\x60\x62\x14\x8d\x8a\x02\xaf\xad\x65\xb6\xf6\x27\xcf\xbd\x29\xb7\x1c\xa1\x8a\xee\x5b\x1f\x97\x16\x9b\xf0\x22\x8b\x37\x6f\x41\x06\xb5\x0f\xd9\x1a\x38\xa6\x62\x11\xd6\x9e\xbb\x4a\x7a\xf0\xe1\xc2\x21\x7f\x1b\xa0\x14\xd1\xe0\xcd\x17\x50\x8d\x58\x15\x5d\x16\x3d\xd9\xde\x2f\xe1\xc6\x4c\x7f\x88\xd5\xb5\x53\xe9\xba\x1e\x1f\x25\x43\x0d\x7e\x12\x5b\x07\xa8\xc2\xed"}, +{{0x1f,0x28,0xd9,0x09,0x1d,0x19,0x6c,0xba,0x3d,0x45,0x52,0xe5,0xa3,0x37,0xa4,0xd8,0xaf,0x3f,0x29,0x5e,0x62,0x9e,0x4b,0xa6,0xfe,0x99,0x70,0x31,0x20,0xae,0x41,0xe0,},{0x81,0x4d,0x34,0xbf,0x28,0xee,0x6d,0x90,0xf0,0x39,0x59,0x90,0x41,0xdb,0x81,0x0f,0x7c,0x9d,0xaa,0x91,0x8e,0x03,0xe9,0x61,0x97,0x41,0x4b,0xc9,0xaa,0x31,0xec,0xdc,},{0x5b,0xe5,0x52,0xfa,0x73,0x1e,0x83,0x67,0x93,0xf6,0xdd,0xa8,0x95,0xdc,0x9b,0x1e,0x2c,0xcd,0x66,0x9d,0xe1,0xc8,0x43,0xe0,0x0e,0xa6,0xfa,0x3c,0x5e,0xbf,0x97,0xa3,0x4b,0x26,0xf1,0xf3,0xac,0x7f,0xf2,0x22,0x5e,0xe4,0xa7,0xe4,0x30,0x07,0x2c,0x13,0xda,0x40,0x66,0xdc,0xdc,0xc0,0x5b,0xa2,0xb5,0xf6,0x1a,0x6e,0x8d,0x21,0x07,0x09,},"\xa6\x94\x68\xbc\x33\xeb\xfe\xf0\x61\x5c\x64\x3c\x49\xda\xc6\xe0\x4f\xdb\x6c\xfb\x8e\xc4\x58\x57\xbb\xb7\xa2\x7e\x52\x8f\xd6\x31\xfc\x34\x11\xba\xee\x65\xcc\x1f\x94\xfc\xc9\x4a\xed\x4a\x43\x32\xfa\x68\x61\xe0\x65\xe0\x61\x63\x54\x17\x09\xd7\x97\x28\xe0\x1b\xe2\xb1\x40\xa0\x22\xc8\x3e\x7b\x23\xb9\xed\x2a\xd2\x83\x21\x69\xdf\xc9\x56\x90\x91\x3c\xf3\x72\x01\x30\x65\x70\x80\xc9\xd5\xa7\x82\x7e\x56\x60\x75\x74\x52\xc5\xfc\x3d\xcd\x80\xcc\x6b\xe0\x98\xc6\x29\x22\x6d\x54\x66\xe0\x2b\x97\x12\x6b\xe7\x4a\x14\x52\xee\x16\x81\x50\x95\xde\xb4\x2b\xf0\x65\x66\x71\x50\x28\xc1\x18\x25\x82\x0a\x8a\x23\xc6\x0d\xa2\xb6\x8d\xd9\xa5\x5d\xad\x2a\x29\xa4\x96\x44\x43\x81\x7c\x07\xd7\x76\xb2\x44\xb1\x51\x86\x81\x9a\x3b\xbe\xd4\x14\xab\xf4\x57\x9a\x3e\xce\x3a\x3d\xc7\xb1\x05\xd0\xa9\xdb\xa3\x7b\x9e\xaa\x78\xbe\x8e\x46\xe1\x69\x8b\x59\xb0\x94\x0b\x01\xf3\x8b\x28\x3c\x33\xa9\xa4\xb1\xd4\xf8\x14\x4b\x16\xee\xb5\xfc\x0a\x7a\xf0\xd0\x81\x69\x66\x45\xa1\xea\xb3\xa7\x87\xcb\xcf\x88\xfa\xd9\x3d\xd6\xcd\x46\xd2\x95\xa8\x79\xa1\x77\x50\x33\xa9\x85\x63\x82\x2e\xf1\xf6\xb6\x9a\x58\x1e\x49\x73\x6c\x8d\x70\x1b\x44\x53\x96\x93\x40\x52\x1e\x4a\xd4\xbf\x94\xb9\x11\xb0\xe2\xd8\x6f\x34\xee\xce\x4a\x63\x85\xff\x1f\xe6\x32\x20\xcd\x3c\xc5\x92\xf3\x6d\x6c\x49\x1f\xa1\x8f\x7c\x14\x04\x36\x0d\x2a\x77\x53\xfe\x07\x3e\x09\xa2\xfc\x42\xa4\xbb\xea\x55\xbc\x96\xd7\xf0\x5c\x98\xae\xd2\xcc\x4a\x9f\xae\x8f\xd4\xa0\x19\x7f\xf0\x1f\xa7\xf0\x04\x6e\x3c\x3e\xb5\x9a\xaa\xbc\xa3\x13\xa4\xdd\xaa\x5d\x20\xd2\x7c\x2c\x5f\x1a\xc6\xd8\x7f\xd3\xcb\x4b\xd3\x5a\x1e\xc7\x5d\x10\x4f\x7c\x36\x73\x31\xa3\xe2\x95\xe5\x3c\x4e\x80\xba\xe1\x4b\x97\x92\xd0\xd5\x26\xf7\x40\xd4\xff\x03\x6f\xaf\x54\x87\x96\x7f\xfa\xbe\x8e\x88\x3d\x3f\xb0\xd1\x6f\xaa\xdb\x28\xe1\x28\x5d\xed\x41\x57\x0c\x0b\x07\xc2\x55\x9b\x53\x1e\x0f\x92\x54\xef\x88\xe5\xb1\x0f\x64\xf4\x83\x9a\x9a\x0b\x6c\x3c\x7f\x1b\x78\x50\xf4\xad\x9b\xf0\x99\x9a\x7f\x2a\xe7\xc4\x5a\x65\x8e\xa5\x30\x36\xfc\x70\x19\x98\x42\xb8\xe4\x9e\x60\xf9\x67\xde\x1f\xf3\xab\xff\xf6\xcd\x73\x5b\x7c\xd8\xb8\xf9\xe2\x48\xf1\x56\xf6\xc6\x54\x38\x69\xeb\x99\x82\x3d\xae\xa8\x8d\xeb\xaf\x79\xf0\x1e\x65\x21\xec\x63\xfe\x72\x72\x4e\xe3\xc8\x22\xb8\x8b\x39\x68\xb2\x48\x52\x09\x15\x83\xc4\x9a\xb3\xc1\x5f\xa1\xf7\x9b\x18\xd9\x8f\x04\xd9\xb6\x84\x1c\x9a\x7c\xa0\xde\x2f\xcc\x02\xf9\x5d\xd6\x49\x49\x2e\x8b\x56\xa3\x1e\xc1\xe2\x44\x33\x7a\xf6\xaa\xae\xde\x8b\xf9\x9f\xc8\x14\xef\x57\xc0\xd5\xe0\x8c\x3c\x7e\xcc\x18\x97\x98\x0a\xa1\x69\xa9\x92\x6d\x20\x69\x8d\xf6\x93\x0e\x21\x10\xcb\x46\x0f\x49\x39\x01\x00\x74\x10\x95\xf8\xed\x00\x41\x2a\xe6\x96\xd9\x8e\xfe\xfd\x29\x0d\xa5\xf7\xd0\xb7\x28\xd2\x0a\x1e\xbf\xa6\xbd\x7d\x27\x0f\x28\x1a\x98\xc7\xb1\xe4\x08\x43\x51\x25\xaa\x48\x3c\x6b\x7d\x63\x3f\xf7\x58\x8a\x94\x16\x58\xf6\x12\x95\x44\xd6\x29\x45\xb9\xb8\xaf\x71\xa8\xc6\x2c\x0a\x50\x07\x6c\xb8\x54\x1b\xa7\xe4\xbd\xe4\xed\xe4\x41\x72\x2c\x6e\xb9\xdf\x8c\xfd\x06\x56\x33\x9e\x86\xd2\x26\xab\xae\xa0\x5e\xa0\x47\xf6\xb8\x30\x77\x01\xf6\xc9\xa4\x4c\xc9\xcb\x83\x7b\x8e\xb6\x24\x45\x92\x5e\x8a\x88\x81\xd2\x53\x8f\xcb\x2b\x24\x9e\x4e\xe8\xb6\x86\xec\xfb\x49\xc4\xdf\x86\x40\x1d\x24\x9a\xac\x35\x84\x1e\x91\x40\x04\xf9\x45\x5d\x3f\xde\x37\x5d\x20\xa0\x1f\xba\x27\xb1\x97\xa6\x98\xd3\x84\xc7\x65\x05\x10\x68\x01\x62\x7e\x83\x36\xbd\x2d\x76\xd7\x61\xa8"}, +{{0xc6,0x4d,0xd2,0x0d,0x42,0x62,0x75,0x26,0x19,0x8a,0x22,0x64,0x76,0x90,0xc8,0x95,0xb5,0xb4,0x5b,0x69,0x8f,0x57,0xa6,0x9d,0xfb,0xe4,0x8d,0xbd,0x42,0x6a,0xa4,0x70,},{0x2e,0x01,0xd4,0x04,0x16,0xf7,0x8a,0xcd,0xdb,0x34,0xb8,0x44,0x5e,0xa4,0xfd,0x0a,0xb3,0xfa,0x9e,0x66,0x43,0x04,0x47,0x52,0x21,0x3f,0x07,0xc7,0xf0,0xff,0x43,0xa0,},{0xde,0xac,0xc8,0xc2,0x32,0x18,0x72,0x76,0x76,0xd5,0x40,0xa2,0x3b,0xda,0xd7,0x81,0x02,0x11,0xe6,0xd5,0x7a,0xd2,0x94,0xc3,0x7d,0x4b,0x1c,0x9a,0xf6,0xb3,0x37,0xa5,0x3f,0x78,0x80,0xd2,0xba,0xfa,0x73,0xb3,0x05,0x08,0xc0,0x08,0x42,0x6b,0xf8,0xd7,0xc9,0x65,0xa1,0xf4,0xa4,0x22,0xa1,0xbc,0x7d,0x6a,0xd6,0x22,0x6f,0xd1,0x97,0x06,},"\x82\x1b\x9f\x7c\x16\x10\x4b\x53\x3b\xd1\x27\x18\x4f\xd7\x2a\xde\x09\x2b\x13\xbb\xd9\xac\xee\xd2\x9b\x8d\x10\xf1\x66\x88\x92\x2d\x16\x5f\x89\x31\xd5\x3d\xf5\x90\xfb\x71\x3b\x67\x4d\x80\x5c\xe0\xc9\xd6\xce\x6c\x43\xba\x69\x68\x19\x1d\x12\xbf\xa0\x8a\x8c\xe2\x2e\x8f\x33\x6b\x2b\x49\x1a\xf2\x5d\x1b\x16\x06\xf9\x30\xca\xeb\xe5\x22\x39\x2a\x87\xd4\x2c\xe7\xbc\x16\x7a\xa7\xb6\x10\x59\x72\x20\xaf\x31\xa6\x65\x35\x30\x71\xe8\xd9\xe5\xf4\x20\x78\xb9\xc3\x88\xbf\x04\x02\x58\xe2\x1f\x9c\x3a\xb3\x8c\x04\x27\x61\x8b\x2c\x28\xd3\x43\x0d\xf2\x79\x21\xbf\xc5\x84\x87\xb3\x46\x19\x78\xbf\xa8\xbf\x58\x6c\xfe\x83\x58\xe0\x92\xf8\xf4\x74\x66\xe7\x62\x45\x1d\x50\x16\x4a\x0d\x74\x36\x0f\x66\xb4\xcd\x3a\x35\x75\xda\x01\xda\x23\x75\x24\x30\xc0\x35\xda\x85\x9f\x57\x7d\xe2\x22\x90\xaa\xb4\xed\x7f\x34\xd2\x67\x40\x6a\xb5\x47\xeb\x44\x5c\xc6\x4d\xf5\x30\x19\x42\x7f\x4e\xb7\x2b\xca\x55\x39\x71\x53\xd0\x1c\xcf\x7e\xc9\x7d\x7a\x96\x7d\x9a\xff\x46\x23\x1d\x2e\x20\x27\xb3\x8f\x3b\x41\xbd\x2c\xb1\xb7\x98\xa4\xae\x88\xab\xf4\x89\x62\x16\xd3\x15\xbd\x53\x83\x02\x42\x59\xe5\x97\x42\x80\x2a\x91\x1b\xad\xcf\x84\x73\xdb\x91\xaf\x31\x97\x33\x32\x0c\xb9\x52\x1e\xf9\xce\x43\x72\x67\xb6\xea\x17\xbc\xaf\xe5\xd0\x90\x3b\x12\x3a\x35\xc9\x88\xf4\x98\x34\xf6\x1d\xd5\x52\x64\x0a\x32\x76\xda\x26\xaf\x17\xec\x21\xa2\x02\x96\x58\x6d\xd6\xf4\xb3\x6c\x7a\x4f\x0b\x89\x9d\x70\xb4\x2a\xf8\x9e\x29\x37\x01\x32\xed\xfb\x72\xd6\x83\x41\x94\xa1\x60\x93\x60\xb1\xf1\xfe\xab\x89\xb9\x6b\x8e\x8f\x0f\x68\x98\x7c\x57\xcc\xe0\xba\xb7\x68\x11\x37\x18\xfb\x17\x09\xde\x2d\xf3\x21\x77\xd4\x40\x85\xda\x5e\xfd\x9d\xa7\x0e\x1a\x85\x8c\x92\xf2\x45\xac\xfe\xe6\x4b\x71\xf3\xeb\x16\xe0\x4f\xc1\x39\x89\xe6\x93\x37\x99\x97\x01\xdd\x73\xab\xc2\x66\xc9\xfd\x4c\xff\x91\xa0\xfd\x04\xfb\xd8\xb1\x3b\x12\xe6\xf4\x50\x38\x57\x15\x84\x8e\x00\x7f\xa0\xd4\x63\x11\x9f\xd7\xde\x63\x25\xb6\x40\x04\x2b\x65\x42\x12\xe0\xdb\x8d\xa1\xad\xeb\xd2\xa7\x58\x9f\x77\xee\x4f\x75\x2d\x28\x2c\xa1\x11\x9c\x43\x1b\x17\xad\x0a\x02\x1e\xf2\xbf\x95\xe5\xac\x47\x04\xe6\x2d\x70\x39\xd0\xe6\x51\xe4\x56\xd6\x0e\x63\xba\xde\x40\x1c\xca\x77\xc9\xa8\x91\x63\x17\x4d\x50\x22\xd7\x45\xab\xdc\x76\xb9\xff\xe2\x54\x41\x55\x23\x5e\x30\x63\xe6\xe4\xae\xec\x44\xed\x5d\x8a\xb4\x08\xd9\x66\xfe\xc1\x20\x16\xc1\x30\x73\x0b\xbc\x55\x87\x32\x06\x5d\xa8\x00\xa7\x0c\xbf\xb0\xfc\xcc\xa4\x5d\x00\x28\xcb\xfd\x96\x32\xdd\xb2\xf0\xed\x12\xed\xae\x7b\x93\x0b\x10\x6c\x9d\x12\x85\xa4\xb8\x70\xde\x75\x07\x99\x9c\x74\x79\x3d\xd4\x97\x40\x87\x19\xc8\x98\xab\xe4\x9f\x7f\x33\xa3\x3e\x69\xb5\x0f\xa5\xaf\x94\x80\x06\x85\x66\xd1\xfd\xdf\x44\x82\xd7\x97\x04\xad\x8e\xf1\x1b\x88\xb4\x2c\xc6\x9f\xce\x8a\x55\x7b\x5b\xa5\x10\xe7\x08\xb9\x37\x51\x23\x03\x85\x68\x27\x0d\xe4\x07\x23\x2e\x95\x62\x1e\x2d\x04\x57\x0b\xec\x2c\x41\xec\xcf\xd8\x55\xb2\x1f\x0c\x9b\xba\xa2\x3b\x5c\x58\x15\xfc\x88\x8f\x7f\xbe\xd4\x82\xc3\x20\xff\xa1\xe0\x63\xe8\x7b\x55\xbc\x8f\x7e\xee\xa3\x74\x06\x3a\x9b\xe6\x5f\x7e\xd9\x22\x5b\xf6\xca\x34\xcf\xa3\x11\xb7\x9f\x3a\x25\x8c\x25\x2e\x63\x45\xed\x6a\xc8\x47\x48\xf4\x68\x07\xa5\x5d\x4b\xa4\x12\x66\x16\x9c\xd2\x62\xd4\xf7\x22\x79\xef\x0c\xaa\x77\xff\x44\x93\x35\x32\xbd\x13\x74\x75\x6c\x23\xec\x85\xf5\x5e\xfe\x9f\xc2\x33\x1f\x26\xf8\x81\x62\x9f\x80\xc2\x69\x2f\x7f\x53\xe4\xbc\x6f\x22\xef\xb4\x54\x57\xa2\x23\xf0\xd1\xc4"}, +{{0x0f,0x8e,0x9f,0x35,0x26,0xb4,0xfa,0xea,0x92,0x76,0xf2,0x2a,0x17,0x79,0xe6,0xf8,0x27,0x09,0x80,0x8f,0x6d,0x0c,0x61,0x2a,0xdf,0xe3,0x2a,0x6e,0x8a,0x06,0x10,0x05,},{0xd4,0x8c,0x3f,0x0f,0xde,0xf3,0x82,0xd1,0xd8,0x03,0x13,0xe8,0x46,0xfc,0xa9,0x5e,0x41,0x81,0x76,0xbb,0x5d,0xfa,0x9d,0x39,0x8c,0x1d,0x21,0x24,0x77,0x6f,0x69,0x0a,},{0x2f,0x59,0xa2,0x93,0x60,0x73,0x91,0x38,0x34,0xeb,0x15,0xa0,0xe0,0xbc,0xb9,0xaa,0x80,0x40,0x89,0x46,0x8f,0x24,0xdd,0x1b,0x2d,0x37,0xa1,0x93,0x4a,0xe9,0xba,0x10,0x20,0xff,0x64,0xb7,0x2e,0xec,0x03,0x26,0x8d,0x0a,0x7c,0x01,0x2c,0x4e,0x79,0x63,0x00,0xf6,0xdf,0x7a,0xdd,0xa0,0x1c,0x8b,0xc5,0xe9,0x01,0x5c,0xcd,0xee,0x1a,0x00,},"\x0c\xcd\x37\xc4\xcf\xd8\xe7\x0c\xa3\xbb\x39\x46\xd0\x9d\x70\xd0\xf6\xa4\xb8\x1d\x6d\xfb\x07\x9d\x78\x73\x74\x80\x71\x58\x98\x80\x92\x73\x82\xf7\x43\x6a\x6e\xf8\xf5\x1c\x25\x54\x73\xdd\x01\xfe\xb5\x2c\x8e\xdb\xe4\xd3\x25\x57\x13\xe6\x8d\x64\x0f\x3d\xcf\x15\x8f\x2b\xfb\x9f\xbe\xcf\x71\xf0\x71\x9d\xfe\x8c\xe6\xb6\x01\x28\x1b\xa6\xc2\x0a\x56\xb4\xf8\xe7\xca\xa4\xaa\x9f\x86\x8f\xbf\xc5\xe4\x32\x1c\x22\xd6\x5f\x03\x82\xc4\x89\x6b\xf9\xbe\xbe\x35\x46\x94\x9e\x81\x85\xa4\xd8\x17\xe4\x5b\x5d\x12\x93\x95\x38\x21\xbd\xd9\x8e\xc2\x59\xf6\x4a\x3d\xe5\x38\x65\xb1\x49\xea\x01\xc8\xf6\x83\xec\xda\x61\xda\x5d\xc1\x0e\x7e\xbd\xdd\xfe\x74\x84\xf5\xeb\x10\x31\xb7\x91\x65\x87\xca\xa3\x99\xa0\x6b\x6f\xea\x4c\x5e\x6e\x0b\xe6\x50\xfb\xdf\x06\xc1\x03\x6d\xf2\xcc\x35\xf6\x2e\xa0\xea\x71\x3f\x52\x80\x9d\x77\xf4\x7c\x2e\x55\xc9\x23\x92\x48\x16\x80\xb6\x33\x20\x56\x22\x69\x13\xb0\xce\x88\xa6\xc5\x5a\x26\xbd\xb5\xb8\xba\xb3\xcf\x46\x95\xa8\xc5\x22\x30\x2c\x4e\xba\x37\xd3\x1f\xf7\x7e\x58\x30\x1b\xcc\xfc\x7c\x7b\xe8\x58\x0c\x63\x42\x68\x79\x95\xf4\x4a\xcd\x19\x09\x65\xae\x0d\x7b\xf0\x66\x95\x92\xb6\xad\x88\x74\x3e\xbb\x36\x0c\x73\xe0\x48\x4a\x23\xd2\xf9\xe9\x9e\x9e\xb0\x38\xdc\xbd\x87\xca\x9b\x1a\x49\x8f\x1b\x2d\x35\xfe\xdd\x7f\x8e\x1f\x7f\xd8\xca\x52\x64\x86\x91\x1e\x07\x6a\xea\xb4\x87\x7b\xba\xcf\x37\x8a\x28\x55\xf9\xc5\xac\x03\x91\x30\xdc\x69\x0e\x17\x7d\x67\xb2\x44\xcc\x8a\xd0\x32\x37\x9e\xf7\x1f\xe0\x5e\x9c\x86\x13\xd8\xf5\xd6\xea\x3d\x4e\x3e\x47\x22\x20\x29\xcc\x00\x42\x53\xbe\x47\xf8\x7f\xb5\xe3\x31\x4c\x48\x98\x13\x4b\x87\xac\xf1\x0b\x25\x38\xba\xd8\x97\xbd\xc5\x01\x2d\x8f\x97\x62\xc8\x71\xb6\x53\xd4\x00\xfe\xe0\xce\xed\x5e\xf6\xbd\xd1\x6f\xaf\x3f\x0a\xbd\xbd\x72\xcd\x0a\x12\x94\x05\x46\xf0\x99\x5f\xf1\x4b\x0f\x1b\xd5\x48\x56\xff\x74\xc3\x6e\xb4\xf2\x2d\x72\x87\xae\xfd\xc6\x09\x99\x8c\x1f\x41\xbc\xc3\xbb\x3a\x5f\xa4\x92\x34\xf4\xfa\x8e\x92\x9c\xd0\xf5\x54\xb3\x15\x39\x5d\xae\x87\x3c\x61\xca\x70\xe0\x41\x0c\x2f\xd5\xa1\x15\xd2\xa6\xff\x1f\x1c\x94\xb2\x7b\xa4\x50\xb8\x19\x4b\x21\xf0\x95\xc6\x1a\x5f\x21\x5e\x3c\x84\xf5\xd4\x3f\x0e\x73\x62\x86\xd3\x3b\x8c\x47\x81\x4d\xb9\x79\xf9\xdc\x00\x91\x98\x46\xbe\xe6\x85\x33\x7d\x99\x55\x5a\x24\x47\x2e\x6b\x00\xb3\xf4\xa1\x43\x11\xa6\xc7\xc9\x04\xba\x58\x89\xda\x6c\x1d\xdc\xc1\x11\x75\x80\xf5\xfb\xc4\x1f\x2b\x8a\x42\x68\xcf\x0e\x9f\xa5\xbf\x41\x25\x34\xc9\xe4\x05\x2a\xac\xb5\x04\xcb\x86\xe2\x14\x7a\xb8\x02\x3d\x58\x80\x0b\x76\x3f\x9a\xbf\x9d\x04\x40\x78\x8a\x51\xdf\xe5\xcb\xd4\x42\x30\xba\x52\x28\xf1\xf5\x96\x0e\xa3\xa4\xe4\x04\x4d\x36\xda\xf8\x11\xcb\xdb\xec\x5d\x69\x64\x63\xd8\xe9\x41\xf2\x72\x17\x56\x3b\xb4\x4a\x21\x18\xa4\xf5\xac\xd6\xe7\x94\xde\x17\xe0\x28\xcb\xde\xef\xde\xf2\xcb\xf0\x3d\xd3\x2e\x78\x99\xe6\x5a\x1c\xf8\x39\xf5\xd9\x0e\x1f\x8c\x36\x4b\x57\x7f\xe3\x10\x53\x53\xf6\x67\x68\xdb\xf7\xaf\x0c\x52\x1a\xa8\xa4\x9f\x7a\x22\x08\x2d\x88\xf9\x01\x49\x8c\x90\xb9\xd7\x77\x7e\xd2\xf9\xf0\xe8\xa5\x52\xd8\xa1\xfa\x5e\x96\x32\xed\x85\x32\x58\xc9\xc2\x15\xb6\xdb\xb4\x11\x1d\xcf\xca\x55\x4b\xfb\xc9\xbb\xa2\x2f\x88\xbc\x55\x55\x2c\x6d\x86\x25\x56\xd7\x41\xda\xd5\x9f\x21\x5e\x37\x28\x83\x46\xca\x7d\x7f\xd8\xc6\x5a\x38\x0d\x72\x0c\xaf\xf9\xef\xa1\x49\xf3\xfd\xa2\x32\xda\xa5\xb1\x2e\xf1\x1c\x0a\xf0\x86\x2b\xd0\x22\x9e\x07\x5a\x3c\x6b\x60\xef\x0b\xbb\x3d\xad\x7f\x29\x08"}, +{{0xfe,0x7c,0xdc,0x79,0x66,0xd0,0xff,0xb9,0xc7,0x6f,0x4a,0x18,0xe7,0xf0,0xbf,0x90,0x69,0x0e,0xb7,0x6d,0xc3,0xd3,0xd5,0x08,0x84,0x64,0x8e,0x2e,0x39,0x37,0xd0,0x20,},{0xa1,0x2e,0xe9,0x81,0x2d,0x6a,0xf6,0xaa,0x48,0x79,0xfa,0x72,0xbc,0x0a,0x69,0x80,0x4e,0xa1,0xa8,0x5f,0x9b,0xc4,0xa2,0x6a,0x5b,0xa7,0xcf,0xbb,0x91,0x4d,0x0d,0xd9,},{0xb5,0x2d,0x03,0xfd,0xeb,0xcd,0x42,0x97,0x37,0xef,0x70,0x92,0x06,0x87,0x21,0x1f,0xbb,0x4c,0x04,0xf8,0x1e,0x35,0x5c,0xec,0x70,0x72,0xc5,0x05,0x41,0x75,0xd2,0xed,0x77,0xf3,0x8f,0x46,0x6f,0x00,0x14,0x22,0xda,0x8f,0xcd,0xf0,0x67,0xdb,0x14,0x51,0x00,0x7c,0xab,0x60,0x7f,0x04,0x9c,0x2e,0x26,0x07,0xb5,0x7d,0x44,0x71,0x3c,0x04,},"\xdc\xb9\x1c\xf1\x55\x46\x1a\x60\xdf\x07\xee\xc2\x9d\x98\x61\x6e\xd1\x72\x8b\x34\xef\xa9\xe1\xf7\x44\x5a\x91\x58\xa8\xf8\x8d\x7f\xaa\xae\x0e\x24\x72\x5a\xef\xf2\x63\xc3\xf7\x4f\x0c\x68\x4f\x18\x58\xf0\x5b\x69\x95\xd2\x84\x6b\x6a\x83\x2f\x67\x08\x5a\x42\x76\xd8\x66\x1a\xeb\xd3\xbf\xcc\x73\x18\x1f\x1f\x51\x02\x93\xb6\xde\x5e\x4b\xb2\x3f\xf2\xdc\xa1\xdf\x60\x8c\xb1\x4a\xe5\x22\xac\x4b\x51\xe1\xf9\xb9\x73\xab\x8b\xaf\xcd\x53\x4e\x71\xc5\x71\x81\xb1\x18\x96\xee\x10\x61\xfb\x36\x9c\xa4\xd2\x93\x9d\x1e\x57\x06\x0d\x9f\x4d\xb0\xa5\xc0\xb0\x7d\x52\x68\x7f\x15\x78\x17\xe6\x3e\x2f\xe7\xeb\xcc\x3e\x7c\x95\xef\xe0\x5b\x85\x99\x10\xc9\x5e\xed\xe8\x6d\x14\x39\x9e\x61\x62\x48\xa2\x8c\x24\xc4\x14\xdb\xb6\x93\xaf\x9b\xe4\x35\xa3\xa9\xcd\xc3\x3e\x0e\x2a\x58\x69\x18\xd9\x1b\x8a\x85\xce\xdd\x16\x12\xd7\xc1\xa2\x17\x92\xbd\xd4\x3a\x91\x5b\x15\x7e\x04\xbb\x3a\x44\xec\xbe\x23\xfa\x49\xcc\x55\xda\xab\xbe\xaa\x15\x5a\x73\x7f\x76\x5b\x8d\xdb\x0f\x3b\x15\xd4\xec\xf2\xce\xf7\x05\x4c\xa7\x3e\xc8\x7d\x91\x75\x2c\x2e\x99\x19\x5c\xdb\x19\x58\x84\x4f\x14\x4e\xda\xb8\x2a\x97\x54\x9f\xc9\xce\xc0\x8e\x87\x11\xcf\xf8\x63\xb6\x3f\xc2\x31\xa7\x7f\x76\x2e\x5c\xd9\xda\x9d\x59\x40\x92\x52\xe9\x9a\xb0\x4c\x42\xbc\x57\x09\x7e\x46\x4e\x3c\x6a\x48\xd8\x02\x41\xe6\x32\x5e\x3e\x40\x94\x98\x9b\x34\xc0\xe8\xb3\x2b\x1a\x78\x29\xd5\x4d\xf3\x2a\x05\x0e\xe8\x7d\x8f\x7c\x4f\xe3\xe4\xf4\xf7\x04\x9d\x1f\xee\xcd\xbe\xa6\x71\x08\x35\x0d\xb4\xe8\xed\xbe\x3c\x3f\xf8\xab\x2a\x25\xd1\x47\xb1\xc1\xc5\x82\x1b\x0f\x8c\x21\x04\x2d\x65\x5d\xb8\x31\x69\x1f\x59\x98\x3f\x27\xd2\xed\x1d\x49\x06\xc5\x44\xe2\x4e\x79\xbe\x68\x65\x3c\x9b\x22\x9a\x7f\xb6\x1e\xf5\x45\xba\xb1\x6e\x98\x81\xcb\x4d\x92\x65\xe2\x93\x59\x0a\x0b\xc2\xdc\x86\xba\xd2\x30\x07\xff\x40\xc9\x58\x61\x92\x3b\x49\x82\x41\xc1\x0d\x26\xbf\x48\x48\xf6\x2b\xa7\x38\x3f\x64\x9d\xc3\x8a\xf1\x84\x0d\x0d\xe9\x28\xa9\xbf\xee\x5e\x11\xb5\x14\x34\x16\x3a\x7a\xb1\xed\x53\x74\x15\xf1\xe9\x32\x85\xe3\x69\x92\x05\x72\x01\x58\xf9\x55\x7d\x86\x41\xed\x2b\xf4\x85\xb8\x21\x2c\x8f\x82\x66\x8b\xac\x3c\x22\x8e\x69\x24\xc1\x7d\x0d\x98\xf2\xe6\xd9\x23\x43\x71\xc4\x42\x5e\xb7\x58\x68\x9f\xdb\x0d\xc1\xce\xa1\x39\x4a\x28\x62\xe8\x7b\xb3\x8e\x62\x4c\x34\x79\x91\x68\x61\x32\x78\x22\x5f\xb5\xe1\x9c\x92\x47\xad\xa3\x55\x54\xf2\xc4\xad\xdb\xb6\x1d\x5a\x50\x2a\x70\x81\x27\xd6\xef\xbc\xa8\xf7\x35\x09\x0b\xdf\xdd\x88\xdb\x29\xfb\xd1\x4b\x69\xab\x12\x62\xf0\xc3\xe2\x6d\x26\x3a\x59\xc5\xae\x46\x39\x06\x53\x83\xd5\x25\x0b\x54\xcf\x59\x2b\xb7\xad\xfe\xaa\xe0\xd2\xfe\x81\x6b\x63\x81\xe8\x6e\xa2\xd1\xc7\x18\x13\xcb\xc3\xd8\xfe\x2d\x31\xde\x7b\x30\xfb\x6e\xc2\x29\x4f\xe4\x53\x6a\x36\xc6\xa1\x83\x5a\x71\x62\xab\x4b\xf8\x9d\x19\x46\x61\x19\x65\x7b\x0e\x46\x45\xae\xf5\x03\x50\x5b\x4d\x55\xdf\x97\x7b\xd2\xc9\x0c\x64\x40\x6f\x49\x70\xd5\xcf\xf2\x45\xb8\x35\x32\x2a\x6f\xbe\x23\x4e\x5e\xfb\xb5\xea\x45\xe8\xf0\xd3\x97\x3b\xe4\xaa\xa2\xaa\xda\xab\x07\x7d\x6c\x9b\x25\xbd\x44\x94\x40\x9e\x93\x47\x9d\x2d\x15\x07\xf6\x6b\xc8\xbe\xf8\x29\x99\xa1\x3c\x79\x43\xb4\x72\xb9\xe6\x1e\xc2\x9d\xeb\xef\xbf\x22\x41\x42\x3e\x0f\xaa\x42\xc1\xa3\x38\xa7\xa6\x13\x1d\xed\x93\x5b\xa0\x3a\x28\x66\x2e\x68\x59\x33\x68\xdd\xe5\x4b\x46\x2f\x2a\x5f\xb7\x46\x18\x5f\xf5\x50\x3e\x69\xba\x36\xbf\x16\xf7\x14\x58\xcd\xd0\x57\xe5\xc1\x72\x67\xf6\x74\x98\xd6\x52\x86\x0b\x46\x5e"}, +{{0xf6,0xc9,0xab,0x5e,0xa7,0x5f,0x29,0x4e,0x8e,0x0c,0x07,0xc4,0xc0,0x9e,0xd8,0xee,0xa3,0x11,0x3b,0xdf,0xc2,0xef,0x75,0x9e,0x20,0xa2,0x64,0x57,0x16,0x04,0x10,0x8d,},{0xb1,0x2f,0xf5,0x5b,0xd3,0xec,0x42,0x61,0x0e,0xac,0xea,0x28,0xb3,0x13,0xa1,0x6e,0x19,0xc9,0xe8,0xb4,0x7c,0x2b,0x15,0x17,0x09,0x91,0xbe,0x08,0x8d,0x65,0xcf,0x63,},{0xa7,0xf9,0xd0,0x8b,0xa1,0x41,0x83,0xef,0x24,0x7f,0x2c,0x25,0xfe,0xcc,0x2b,0x83,0xed,0xa6,0xde,0x58,0x02,0x2e,0x46,0x6c,0xe7,0x8f,0xcf,0x50,0xf7,0x1c,0xe2,0x61,0x62,0x44,0x65,0x62,0xee,0xa4,0x5d,0x63,0xa2,0x1c,0x3b,0x22,0x56,0x1f,0xd4,0x68,0x00,0x58,0xac,0xb8,0x25,0x40,0x7a,0x15,0x40,0x8f,0x27,0x13,0x61,0xa1,0x46,0x0f,},"\x71\x62\x3b\x39\x74\x3e\x39\xc7\xe0\x86\x38\x80\x6d\x46\x8a\x1a\x8a\x6f\x35\xc2\xae\x38\x8e\xef\xc2\x73\x74\xbb\x52\x53\x88\x14\xc4\xb3\x6c\x9b\x8e\x38\x9a\xd8\x31\x83\xde\x02\xa1\xbb\xd0\x32\x57\x34\xe4\x61\x87\x54\x09\x23\x37\xd3\xe7\xdc\x12\x56\x92\x8e\x35\x28\x87\x0c\xa7\xf0\x06\x13\xa2\x5b\x71\xbb\x15\xd1\xd9\xea\xaf\xf9\xf2\x26\x9b\x71\xc1\x97\x69\xe0\x03\xce\x84\x56\x14\xb2\xec\x95\xed\x28\xca\x85\x5b\x52\x21\xd4\xcb\x80\xa6\xca\x94\x66\xaa\x33\xe2\x51\x0d\xdf\xf7\xdc\xe1\x86\x15\x9d\xa7\x0f\xc8\xb1\xfb\xac\x12\xa2\x6e\x1f\xc0\x94\x22\x76\x89\x2a\xd6\xe9\xb0\x03\xf5\x69\x59\xbd\x31\x3a\xf2\x89\xe7\xa0\x53\x2a\x66\x4b\x76\xb9\x6b\x91\x98\x54\xe0\x65\x0c\xb8\xc5\x2e\xc4\xc5\xfb\x50\x53\xaf\x2f\x0c\xf8\xc0\xf2\x2a\x52\x3f\x9e\x2c\x64\x19\xdf\x8d\x0b\x71\x4e\xe3\x77\x68\x00\xeb\xfa\x70\x77\x60\x84\x66\x7d\x6d\xcf\x54\x1f\x14\xcf\x16\x62\x62\xe0\xf6\x4c\x42\x76\xae\x28\x88\x5e\x6c\xfd\x09\x7b\x70\xc0\xd6\x18\x6e\xa5\xdb\xd0\x33\x32\x3c\x98\x76\x13\xda\x08\x64\x5d\xe0\x72\x08\xba\xe1\x2a\x17\x8d\x8f\x7f\x65\x0a\x25\xaf\xbd\x70\x1c\x85\xa1\xba\x63\x9e\xf9\xf1\x21\xc4\x0c\x5c\x12\x9a\x47\x37\x34\x33\x86\xa4\x81\x83\xff\x3c\x59\x13\x89\xd8\x9e\xcd\xa5\x26\xcf\xfb\x26\x74\xf1\x7b\xb1\xc2\x30\x90\x55\x4b\x13\x40\x84\x97\x96\xa6\xd4\x44\x46\x0b\xb4\x19\x42\x7e\x93\xe6\x58\x5b\x0f\x4f\x06\x5a\xd8\x7e\xe6\xed\xf5\x4b\xe6\x18\x8a\x1d\xd5\xac\xe1\x36\x4d\xef\xa5\x61\xf7\x4e\x26\x76\x9c\x9b\x29\x1e\xe7\x55\x52\x76\x50\x1c\x6a\x49\x08\x0d\xa0\x92\x4f\x37\x92\xc2\xa7\x28\xa5\x20\x07\xb1\xc0\x7c\x95\x57\x8f\xed\xaf\x40\x39\x96\x23\x9e\x9c\x55\xa9\xa4\x4c\x3d\xfc\xc3\x7c\xdf\x03\xfb\x48\x5d\xb5\xa0\x8d\xff\x15\xa7\xa4\xf7\xb7\xf1\x54\x74\x2e\x84\x31\x56\x4d\xc1\x7d\xbd\x43\x2e\x10\x33\x7c\x22\x76\xfc\xfd\x9d\x70\xf7\xc3\xd5\x70\x39\x3a\x0c\x19\xf6\x40\x51\xc7\x3a\x87\x0e\x20\x55\x84\x10\x65\x31\xd1\xfd\x2a\x1d\xd1\xc9\xd0\xfc\xe1\x4f\xfa\xaa\x07\x7b\xb7\xe2\x60\x25\x1e\xed\x6c\x62\xbc\x6e\xdc\x24\x22\x51\x94\x40\xc2\x24\x4e\xba\x38\x40\x46\xb0\xed\xda\xa6\xcf\x2c\x1c\x7e\xee\xbf\xcd\x78\xfc\xae\x18\xb8\x22\x90\x55\x2b\x59\xc0\x46\x3d\xc4\x50\x61\x8b\xa6\x7c\x77\x0d\xec\x0e\x22\x9b\x84\x60\x93\x6c\xa8\x19\x56\x2b\xcb\x36\x96\x9c\x8f\xf7\x0b\xf1\x13\xc1\x16\x71\xe0\x0b\x94\x13\x55\xbf\x01\xad\x54\xb0\x5c\xfe\x2a\x04\x8b\x38\x72\x8c\xbd\xd1\xb4\x98\x09\xe1\xf2\x07\xac\xa3\x09\x8d\x99\x42\xee\xc4\x7d\x6c\x9d\x41\x3b\x37\xc9\x14\xfe\xdd\x38\xac\xd5\xff\xe4\x96\xca\xc7\x57\xc2\xef\x8b\x77\xbd\x84\x03\xd1\x4b\x1f\xc9\x8a\x90\x3f\xe2\xb9\x79\x46\x82\x33\xa7\xf2\xae\xd6\xf8\xd5\x09\xd8\x74\xe1\xdc\xe0\x51\x49\xaf\x9d\xf3\xfe\x45\x95\xc7\x1e\x8b\xc4\x63\xde\xe9\x38\x4d\x5e\x05\x05\xd2\xa6\xb0\xa2\xb8\xa1\xed\x62\x16\xaa\xae\x9d\xcc\x76\x02\x48\x7a\x4c\x08\x51\xfd\xf0\x96\x29\xc1\xe9\x91\x18\x80\x9a\x95\x44\xa6\x57\x7a\xf9\xf9\x15\xd1\xe6\x5d\x81\x62\x20\xc4\x8c\x84\x90\xfa\x9b\x70\xda\x42\x2a\xd6\x80\x02\x23\xd6\xd8\xc3\x40\xf9\xea\xb2\xcc\x7e\x14\x93\x62\x12\x4a\x30\x0b\x40\xcb\xb8\xc0\xa6\x5d\xa3\x01\xdb\xba\x93\x1b\xa5\x64\xf3\x59\x73\xca\x8b\xf2\xd1\xed\xb5\x6c\x19\x46\x61\x95\x5b\x3b\x68\x38\x1f\xa1\x5d\x4b\x8d\xc6\xad\xa1\xa5\xce\xbd\xa3\xa4\xcc\xc5\x51\x23\xe0\x05\x7f\x4f\x82\x10\x41\x93\x7d\xd5\x49\x20\x9c\x82\xe1\x16\x57\x0b\xc9\x08\xa2\x8e\x32\x99\xa9\x44\x14\x43\x49\x8f\x74\xb3\xcc\x88\xe1\xa6\x2d"}, +{{0x43,0x10,0x3d,0xf0,0x1a,0x48,0xa0,0x3c,0x57,0xf3,0x2f,0x52,0xd7,0x0c,0x68,0x49,0xee,0x44,0x58,0x0b,0x2a,0xb4,0xee,0x72,0xd5,0x48,0xd8,0x48,0x13,0x4f,0x7c,0xeb,},{0xa3,0xcb,0xe0,0xd6,0x4b,0x05,0x60,0xbc,0xb5,0xae,0x00,0x90,0x01,0xe3,0x14,0xd9,0xec,0x90,0x79,0x01,0xdd,0x74,0xa8,0x04,0xa0,0x05,0x90,0x22,0xed,0x9c,0x6d,0x04,},{0x19,0x54,0x47,0xbe,0xb1,0xde,0x4a,0x7e,0x36,0xea,0x89,0xa6,0xce,0x3c,0x99,0xbc,0xc8,0x94,0x11,0xdf,0x5e,0x0b,0x15,0xf7,0xba,0x0b,0x1d,0x11,0x0c,0x45,0x6a,0xbc,0x6b,0x3f,0x5f,0x1d,0xa6,0x10,0x6e,0xd8,0x87,0x86,0x4b,0xa5,0x6a,0xab,0x46,0x6a,0x8a,0x63,0xb3,0x35,0xcf,0xcf,0x4c,0x64,0xd6,0x5c,0x0e,0x6f,0xb4,0x80,0xb4,0x01,},"\x73\x8c\xbf\x06\xd0\x0d\x4d\xcd\x5e\x5f\x24\x3a\x1c\x18\xdd\x5e\xc2\x02\x78\x88\x46\x95\xa1\xcf\x3b\xea\x67\xbb\x5b\x05\xdd\x7e\x60\xa2\xa2\x4f\xd3\x25\xbe\x6b\xf4\x6b\x46\x28\x73\xec\x90\x7f\x9d\xe8\x8d\xc2\xc7\x62\x62\x0b\x7e\x0e\xf7\x27\x65\xd4\xbd\xa6\x62\x45\x49\x93\xc8\x28\xa1\x74\x6e\x9e\xd8\xd1\x9d\xff\x43\xc4\xc4\x85\x27\xac\x84\x5f\x21\x86\xa4\xad\x7c\x1d\x99\x2a\x16\x24\x5c\xd5\x73\x07\x3e\x09\x40\xdc\xee\xd3\x68\x11\x0b\xb5\xfd\x0a\x4c\x88\x34\xce\x88\xa7\x71\x25\xb9\x14\x73\x93\xc8\xb5\x8c\xb1\x6e\x5e\xbd\xc1\x82\x44\xeb\xfa\x48\xba\xba\x46\x97\x3f\xdc\xd4\x85\xb1\xb2\xe5\xf3\xb0\xe7\x09\x92\xcf\x19\x99\x58\x06\x38\xd8\x7f\x1f\x5b\x27\xc4\xd7\xf9\x1d\xec\xf3\x7d\xe2\xe7\x34\xe3\x19\x55\x35\xc6\x31\x08\x2b\x3e\xba\xa8\xce\x30\xa9\xc2\xc2\xdb\x01\x6d\x7d\x35\x47\xe6\x21\x61\x88\x50\xe2\x20\x40\x03\x8d\x0f\xe0\xfa\xea\x2f\x9b\xf5\x10\xb6\x82\xc4\xfd\x14\x75\x0e\x89\xb4\xc1\x99\xef\x0c\x99\x05\x00\x54\x3e\xee\xab\x5f\x0b\x50\x7a\x31\x31\x99\xc2\xa2\xa0\x26\x2d\x6d\x81\x4c\xbc\x09\x33\xc5\x92\xe2\x56\xc3\xe2\x9d\x52\x4b\x06\x6e\xa5\xa4\x54\x33\x61\xa1\x04\x50\xe0\xaa\x67\x5c\x61\x40\x8f\x30\x7f\x26\xee\x58\x96\x9d\x63\x27\x8f\x13\x5b\x7d\xcb\x66\x6b\x93\xf2\xca\xcf\xd8\x38\x73\x47\x1e\x97\x4a\x28\x6b\x09\x02\x3f\x50\x15\xfa\x1a\xaf\x18\xbf\xbf\xa5\xf7\x43\x85\xd0\xdf\x6b\x9a\xdd\x51\x6f\xfc\x0c\x31\x13\xe3\x7e\x09\x78\x38\x64\x6a\xc9\x30\x54\xff\x4d\x96\x02\x06\x67\x44\xba\x33\x96\x95\x3f\xd7\x81\x68\x13\x01\x70\xbb\x27\x5c\x15\x2b\xdd\x36\x6f\x73\x06\x5c\x0a\x7a\xd7\xad\x00\x75\x8c\xb9\x9a\x7a\xc1\xb7\x80\x9d\x26\xdf\xaa\xc7\x58\x46\x82\x01\xee\xb6\x0d\xea\x36\x8c\x33\xf2\x57\xaf\xe2\xf1\xb4\xc0\x2e\x37\xba\xfe\x40\xf5\xd7\xfd\x40\xc8\x7d\x1c\x56\xa0\xcb\x28\xe9\xd2\x83\x69\xa3\x92\x4b\xce\xf8\xb6\xd9\x99\xdc\xf4\x29\x4d\xd8\xc4\x14\x3d\x75\xc6\xc2\x5b\x5a\x45\x44\x48\x8d\xde\x72\x52\x48\xc7\x8d\x93\xc1\x5b\x81\x5b\x01\xcb\xd0\xf3\x1d\x1b\x00\xac\x04\x83\x7e\xf8\x5b\x40\x03\xfc\x96\xd4\x45\x7a\xc5\xa0\x23\x62\x3e\x67\xb6\x6d\xa4\x70\x0a\x08\x59\xf8\x3f\xdc\xcd\x3c\x7a\xae\x09\xde\x09\xa0\x57\xe0\x0d\xb4\x4a\x2a\x6a\xac\xaa\x21\x74\x6a\x49\xb8\x22\x46\x89\xa5\xcc\x18\x54\xba\x3d\xc4\xaa\x2a\xa3\x45\x24\xe7\xa5\xa8\x9d\x11\xee\xa3\x56\xaa\xea\x5e\xf5\xfb\xf5\x42\xc9\x9f\x54\x4d\xb9\x40\xf5\x08\x68\x38\xee\x2a\xb2\x18\xb8\xd3\xf2\xe1\x07\xd0\xb2\x9d\x4b\x04\x83\x0e\xed\x79\xc0\x76\x8e\x02\xc2\x84\x4b\x3c\xba\x32\x68\x95\xf4\xab\x38\xa3\x99\x4b\x83\xab\x30\x60\x0f\xf5\x11\xcc\xb5\x95\x99\x2f\x8c\xc0\xd2\x95\x48\x07\x97\x2d\xa3\x65\xb0\x6f\xbd\xab\x53\x9b\x2e\x03\x59\x8b\x34\xe5\x3c\xfc\xf9\x39\x90\xb9\x7a\xac\x1d\x32\x97\x83\x36\x6d\x45\x1f\x97\x2b\x8d\x8a\x00\xb6\xb8\xec\xdb\x37\x27\x96\x44\xce\xc1\x44\x7c\x09\x98\xee\x4f\x70\x90\xf3\x4c\x9c\xc8\x53\x05\x90\xca\xe7\x65\x36\x0a\xad\xb0\xab\x31\x35\x00\x49\x41\xc9\x23\x02\xcb\xb2\xb3\x50\xa1\x4e\x8f\x30\xaf\x53\x25\xc2\xb4\x38\x00\x5e\x3a\x9d\x45\x85\xe6\x32\x65\xc3\x27\xba\x72\x57\x54\xb3\x32\x56\x91\x7f\xb9\x65\xae\x9f\x02\xed\x21\x26\xb4\x81\x47\x3d\xc0\xe9\x31\xc2\x52\x2b\xf0\x0f\xe6\xa2\xec\x95\xc7\x92\x24\x7b\x1e\x03\x39\x61\x12\xf7\x83\x07\x0e\x2f\xe6\xc2\xcb\x98\x22\x50\xd1\x3f\x2d\x54\x60\xc7\x44\xfd\xe4\x53\x23\xe6\x31\xcc\xcb\x54\x0c\xd7\x25\xf2\xc5\x5a\x70\x58\xf2\x30\xe8\x2b\x79\xf3\x66\xaf\xcb\xb0\x25\xb4\x92\x55\x43\x95"}, +{{0xf9,0x13,0x9e,0x57,0x9f,0xa9,0x6e,0xbd,0x62,0x87,0xdb,0x3b,0xab,0xcd,0xa6,0x0f,0x92,0xe7,0x31,0x53,0x56,0x6f,0x92,0x4c,0xb5,0xde,0x04,0xde,0x44,0x93,0x48,0x1e,},{0xc0,0x6c,0xe3,0x35,0x53,0x3a,0xf8,0xd8,0xf3,0x37,0xf2,0xb3,0x8e,0x0a,0xaf,0xa2,0xce,0x9b,0x27,0x22,0x3c,0xd9,0xdd,0xc5,0xef,0x32,0x02,0x7f,0x04,0x88,0x9b,0x7f,},{0x05,0x1d,0x8d,0x7f,0x0b,0x68,0xd2,0xee,0xc7,0x2c,0x81,0xad,0xfc,0xfb,0x31,0xae,0x85,0x58,0xf6,0x0a,0xb6,0x3c,0x9f,0x56,0x52,0xa8,0xdf,0x63,0x8f,0x66,0x6f,0x1e,0xbc,0x0c,0x6e,0x0b,0x41,0x19,0x53,0xbc,0xda,0x6b,0x51,0x51,0xb2,0xb9,0x3a,0x39,0xe3,0xc5,0x33,0x0a,0x85,0x73,0xe1,0x68,0x79,0x22,0x72,0xab,0xd3,0x6c,0x81,0x0a,},"\xb3\x30\x76\x4d\xdc\x62\x8e\x4a\xd6\x7a\xa4\x98\x2a\xe8\x6d\x45\x81\x07\x1c\x19\x3e\xc3\xc5\x8f\x81\x3d\x79\x21\xb8\x4d\x2a\x54\x56\x2b\xd8\x74\x17\xae\x1d\xe5\x90\xa1\xa4\x8c\x4e\xc7\xd5\x56\xad\x93\x1d\x65\xc0\x54\x3f\xdf\x06\x07\xc7\x49\x85\x9e\xe1\x2f\x99\x52\x02\x0c\x19\x5c\xf8\x74\x60\x95\xe1\x08\x7c\xc6\xc3\xc8\xef\x9d\x24\x05\x25\x60\xce\x81\x3d\x61\x39\xb7\xa7\x5c\x8f\x4b\x8e\xa3\x0a\x9c\x4a\xb8\x88\xd0\xa6\x34\x1c\x99\xab\xd3\x5e\x09\x03\xbf\xe5\x6c\x93\x15\x23\x40\xc4\x12\x76\xd7\xf2\x4e\x09\x12\xb1\x2a\x4d\xb3\xd7\xee\x44\x84\xdf\xa5\x3a\xfc\x0b\x1a\xea\x14\x09\xd1\xe0\x32\x8a\xa1\xc8\x60\x41\x27\xca\x2e\xb1\xa5\xe8\x1b\xf3\x1f\x8c\x7a\x51\xc6\x05\x2c\x53\x4e\xfe\x6b\x3d\x0e\xe7\x4f\xf5\xa9\xb1\x1c\x61\x57\xe3\x64\x77\xef\xa9\x38\x2f\x57\x51\xbe\x8c\x8c\x64\x54\xc4\x46\xd6\xf8\xdc\x7e\x92\x95\x25\xcc\x3d\xe7\x8c\xb1\xba\x4a\xba\x9b\xd4\xbe\x15\x26\x10\x43\x75\x82\xc9\x65\xee\xa4\x8c\xbd\x4c\xaa\x6f\x30\x8f\x85\xf4\xf8\xd0\x06\xa0\x42\xf6\x19\x20\x07\x62\xe1\xbb\x9b\xa4\x22\xe6\x54\x75\xb3\x3a\x94\x94\x29\x8c\xfb\xb7\x5a\x15\x2b\x36\xd2\xa0\x55\x01\x80\x77\x05\xb9\x52\x76\x53\x50\xcd\x14\x14\x1d\x35\xd4\x98\x66\x92\xd6\xc3\xbc\xfc\x6d\x61\xdf\x00\x52\xa6\x20\xaa\xb8\xcc\x13\x20\x5e\x75\x4c\x16\xf9\x3e\xca\x79\x20\xbb\xea\x51\x57\xef\x11\x2f\x0b\x64\xc1\x05\x4f\x90\xa5\xdd\xc1\x75\xa8\x9e\x29\x24\x2f\x57\x64\x6e\x74\xcc\x88\x5e\x81\xa1\xcc\x14\x4c\x3d\x78\x2d\x11\x52\xa9\xe4\xcf\xe7\x6c\xb3\xff\xab\xe7\xdb\xe6\x03\xfb\x38\x69\xec\xa8\x69\x96\x98\x70\x9c\xc8\x7f\xc9\x61\xc1\xe2\x99\xcf\xca\x22\xe3\x24\x2e\xae\x78\x8c\xff\x11\xbf\xca\x61\x02\x67\x45\xf4\x97\x62\x25\xb2\x6e\xe2\x00\xc4\xf1\x91\x0c\x4b\x83\xdf\x5c\xe4\x6e\xf4\x87\xd7\x48\xd9\xc4\xc5\x02\x14\x1b\x78\x74\xca\xf4\x1e\x5a\x29\x7b\x24\x8c\x2b\xac\x69\x90\xa1\x5b\x07\xb4\xcf\x81\x0e\x59\x28\x74\x42\xd9\xa3\x69\x6c\x02\xe8\xd7\x32\x4d\x3c\xf7\x30\xdd\xa5\x40\x53\x6b\xeb\x13\xcf\xde\xae\x61\x80\xdd\x74\x84\x83\x2d\xfa\x94\xe9\x4a\xa6\xcb\xa1\x17\xaa\xe1\x72\x70\xf4\x8f\x93\xb2\xf9\x8a\xe9\x58\x17\x18\x16\x3f\x44\x63\x54\x6c\x0a\xe0\xf2\x79\xc3\x6b\x92\xbe\xe6\x6f\x1c\xa2\xd6\xa4\xf7\x26\xd2\xdf\xee\x0b\xc1\x1c\x1d\x8a\x1f\xa6\x2c\x3c\xc8\xab\xa2\x66\xb9\x87\x59\x28\x6c\x10\x68\x48\x3b\x23\x76\xb4\x03\xc8\x87\xfb\xb6\x57\xdc\x0f\x25\x5d\xea\x90\xdb\xd2\x33\x08\xf7\xe0\xe8\x42\xb4\x98\xa8\xdf\xc7\xc9\xcd\x5a\xef\x0e\x87\xd5\x6b\xe4\x0d\x50\xfc\x1d\xd4\xc0\xaa\x7d\xee\x55\xae\xbe\x4d\x6b\x6a\x52\x05\x39\x62\xb8\x7b\x0f\x2e\xe0\x9a\x90\x81\x61\x55\x33\x3d\x5c\x57\xa1\x47\x24\xe0\x01\xbc\x3d\xed\x17\x84\x3b\x76\xe2\xc4\x7a\x17\x63\x39\xc8\xde\xfc\x54\xb5\x5b\x23\x58\xae\x7d\x01\xb0\xf6\xe0\x8f\x31\x21\x6a\xe9\x03\x40\x69\x41\x68\xa5\xa7\x9e\xe8\x83\xea\x78\x58\x00\x7d\x17\xc3\x73\x59\xc9\x9d\x65\x97\xef\xe4\x60\xc1\xa2\xf7\x73\x8a\xc3\x2c\x5e\xb5\xe3\x9e\x50\x0c\x49\xc0\xdf\xf9\xc4\x65\x9e\x8c\x50\xcc\x5c\xa7\x9d\x8b\xa4\xe5\x97\x2d\x67\x22\x54\x68\xfb\xa6\x41\x67\xa6\xb2\xc6\xf3\x68\x93\x5c\x7a\x04\x9d\x35\xd3\x55\xc7\x67\x25\x20\xd3\xc9\xe4\xe4\x3c\x67\x1c\x3c\xb8\xde\xe2\x59\x04\x74\x95\xde\x0f\x56\xdd\x71\x91\xd5\xbd\x4b\xbd\x29\x51\x7e\x36\x47\x92\xff\x89\xd3\x37\x99\xb6\xe7\x81\xc2\x01\x93\xf5\xa3\x16\xfb\x40\xde\x74\xfe\xe2\xac\xc2\x5e\x47\xf5\x12\x21\x4d\xe3\xb1\xe9\xb3\x82\xa8\x69\x29\xc1\x57\x3d\x37\x24\xc2\x50\x17\xc0\xe5"}, +{{0xc8,0xee,0x95,0x4d,0xb5,0xa1,0x1b,0x29,0x2e,0xd9,0x77,0x64,0xfa,0xe6,0xb2,0x83,0x05,0x1d,0xb5,0x7d,0xcd,0xc0,0xaa,0x0d,0xf5,0x39,0x3b,0xb6,0x0c,0x11,0x2e,0xd3,},{0x5c,0x2f,0x81,0x82,0x4e,0x99,0x75,0xdd,0x7e,0xa3,0x53,0xbc,0x66,0x80,0x7d,0xed,0xc7,0x61,0x03,0x49,0x79,0x4e,0x2f,0xc0,0x8e,0x5a,0x31,0xe0,0x02,0xe3,0xfe,0x07,},{0xf3,0x07,0x7a,0x75,0x10,0x1e,0x12,0x1e,0x5c,0x3e,0x77,0xd8,0xed,0x97,0xb5,0x78,0xd2,0x39,0xbd,0x42,0x18,0x03,0xd3,0x45,0x5b,0x56,0x54,0x40,0x5a,0x4c,0x58,0x6a,0x60,0x92,0xe1,0x3a,0x85,0x29,0xba,0xce,0x46,0x8a,0x30,0x57,0x84,0xb3,0x73,0xe4,0x33,0xfe,0xe4,0xa3,0xdf,0x89,0x56,0xbe,0xfa,0x01,0x2f,0xd8,0xa8,0xee,0xd1,0x0c,},"\x7b\xa3\xfb\x56\x83\x15\xaa\x81\xe2\x1f\x19\x77\x80\xed\xc2\xc6\xea\x26\xd8\xd0\x6a\x43\x78\x91\x2f\xca\x23\x01\xcf\x1e\xab\x3d\x80\x3c\x84\x69\xde\xdd\xf3\x76\x70\x3d\xdb\x7c\xe0\x6a\x77\xda\xb2\x0e\x02\x34\x4f\xad\xcc\x50\x02\x2a\xb3\xc7\x13\xcd\x03\xc1\xda\xa9\x3f\x1c\x7e\xa5\x72\x62\x9f\x61\x0b\x5e\x3c\x51\x41\x1b\xb8\xc1\x96\x94\xbb\xce\x90\x3c\xac\x47\x05\xf9\xb5\xdd\x0f\x47\xbc\x5d\x0a\xa3\x25\x3f\x90\x88\x70\x29\x90\x27\xff\xbd\x34\x49\xee\xba\xd4\x53\x32\xb5\xd0\xc4\xf5\x33\xdb\xed\x18\xa9\x9a\x24\x98\xb9\x16\x4e\x24\x5f\xb6\x5c\x0a\xfa\x0b\x05\x37\x03\xa0\xcf\x95\x94\x0a\xc7\xa0\x19\x5d\x4f\x70\x46\x60\x9c\xf0\x43\x71\x33\x87\x06\xb9\xb1\x98\x6c\x0f\x11\x81\x75\xd2\xcd\xfc\xe7\x4a\x6f\x88\x65\x98\x25\x85\x4e\x94\xec\xe5\x8f\x51\x57\x63\x6d\x62\x35\xb7\x6d\x32\x74\x5a\x2a\x81\xa9\x67\x1a\x8f\x86\x02\x7b\xa9\xe0\x17\x63\x88\x8f\xc1\x71\xce\xf7\xc4\x51\xc3\x60\x72\xbc\x74\x99\x83\x9d\x43\x1c\xf1\x8c\xd7\xc6\xc9\xfb\xa3\xaa\x71\x2a\x05\x43\x28\xcc\xd6\x2b\xe4\x82\x0a\xbd\x5e\x78\x21\x62\x76\x46\x11\xd4\x53\x9b\xa2\xce\xbd\xc2\x09\xb3\xf4\xe4\xb6\x9c\x3d\x64\x07\x3e\x92\x0d\x21\x52\x14\xfb\x0f\xda\x44\x18\x5a\xad\xa5\xc3\x61\x27\xa1\x5b\xa1\x5c\xa2\x8a\x3a\xd0\x86\xe9\xd0\x33\x66\x86\x9c\x60\xc3\xfb\xce\xbd\x86\x9d\x2e\x40\x64\x3e\x83\x3f\x89\x48\x03\xf9\x80\xa2\xda\x7e\xa4\xe5\x9c\xe4\xd7\xc0\x6f\xd2\xaf\xf0\x87\xee\x7b\xcf\xdd\xaa\x3b\x32\x81\x7c\xe6\x3a\x63\x58\x7d\xba\xfe\xf3\x80\x01\x3a\x6f\x1e\xe3\x73\x4b\x94\xca\x3d\xf9\x64\x4d\xd0\x43\x43\x02\xec\xb3\x24\xaf\xe3\x5f\x46\x5c\x9c\x1c\x93\x1b\x27\x29\x4f\xc6\xee\x02\x72\xde\x22\x42\xae\x90\xd7\xf2\xe0\x67\x02\x7e\xf8\x64\x2e\x8f\x17\x1e\xd8\x80\xff\xab\xce\x8a\x20\xa1\xb3\xe3\x39\xad\x4e\x3f\x1a\x90\x01\xf2\x0f\x90\x02\x61\x88\xfd\xe3\x4b\x21\x7a\x6e\x26\xaa\xff\x18\x42\x2b\x7f\x84\x3d\x0f\xdd\xa3\x21\xc3\x19\xc7\x78\xf2\x31\x37\xf2\x0c\xcc\x1b\xda\x18\x90\xe5\xbc\x91\x6a\x54\x56\xd0\x68\xd3\x7b\x5a\xcc\x63\x47\x72\x0c\x56\xa5\xa4\x91\xbc\x34\x8d\x6c\x84\x8a\x9c\x8f\xec\xfe\x58\xc9\x2b\x1f\x30\x2f\xe1\x49\x19\x71\x8c\xd5\xe7\x8b\x7f\xd6\x01\xd0\x9d\xc0\x1e\x69\x04\x86\x1e\x8d\x68\xb3\xc5\x75\x35\xb6\x13\x66\x76\xcb\xc6\xe8\x39\xaf\x0d\xd7\x39\xdb\x89\xa7\xab\xd9\x13\xfd\xf6\xb0\x0e\x9c\xa0\x26\x02\xde\x6c\xa0\xaf\xd0\x91\x3d\x99\x2f\xba\xa8\xff\x82\x2b\x9d\x9b\x09\xdd\xa7\xa2\x9b\xe9\x19\x10\xd8\xfa\x3c\xaa\x2a\x5e\x51\x83\x46\xc1\x67\xc9\xf5\x19\x41\xcf\x73\x53\xf3\xf3\x4c\x1d\xab\x33\x48\x5d\x0a\x8c\x19\xda\xf9\x51\xfd\x3e\xf2\x0d\x0b\x11\x9d\x80\x38\xdf\x90\xc1\x14\xa2\x5a\x5b\x93\xae\x40\xec\x44\xb9\xa5\xd2\xbc\x1c\x65\x17\xc6\x82\x50\x0d\x4c\xdc\x19\x71\x42\xbe\xc3\xaf\x82\x32\xc0\x71\x42\x8d\xc5\x4c\x0d\x30\x45\x42\x72\xe7\x33\x6b\x0b\x58\x88\xa6\xe8\xfe\xcd\xe8\x59\xe2\xac\xcb\x7f\xb0\x94\xac\xc5\x4f\xfa\x48\x1f\x76\x23\xd9\x44\x69\x1f\x04\xfb\x36\x13\xa9\x95\x49\x80\xf1\x7e\x2a\xd2\x17\x3d\x68\xcf\x0e\xc1\xb6\x7d\x8a\x91\xd6\xec\x82\x94\x6b\xcf\x05\xcb\x90\x68\x1a\x71\x62\x7b\x59\x02\x38\x33\x4e\x3d\x5a\xb9\xda\x6a\x08\x9b\xd7\x26\x24\xdf\x90\x74\xcd\xd2\x30\x9e\x04\xdf\xca\xe0\x32\x81\x2f\xe8\x4f\x9d\xb8\x82\xcd\xea\xae\x69\xee\x5d\xaa\x5a\x66\xff\x42\x7f\xc4\x52\xed\xd0\x76\x9b\x6a\xab\xcc\x13\x9d\x0f\x70\xaf\x8b\x97\x43\x0e\x64\x4f\x58\xa4\x12\x87\xa9\x3f\x63\x1d\xed\xa8\x2c\xa0\x71\x6d\x79\x75\x4c\x5c\x50\x3e\x52\xa6\x65\xda"}, +{{0x6d,0xbc,0x55,0x9e,0x4a,0xb1,0x93,0xee,0xbf,0x70,0xc5,0xc3,0x2d,0x79,0x7b,0xe0,0x0b,0x73,0x11,0xe8,0xe6,0x69,0x1d,0xa9,0xaf,0xcc,0x18,0x72,0x91,0xf2,0x50,0x1c,},{0x38,0xa7,0x03,0x44,0x76,0xfb,0x93,0x82,0xf1,0x41,0x77,0x68,0xc4,0x21,0x62,0x95,0x1a,0x26,0x36,0x90,0x2c,0x38,0x98,0xc0,0x29,0xbe,0x27,0x8a,0xb4,0xc3,0x1f,0x31,},{0x31,0xf1,0x6a,0x7c,0xaf,0x2b,0x74,0xf6,0x5e,0x05,0x7c,0x93,0x33,0xa1,0xa2,0x63,0x3d,0xac,0x73,0x46,0x33,0x8f,0x79,0x85,0x10,0x73,0x0e,0xb8,0xd5,0xd3,0x25,0xfc,0x10,0x80,0xdd,0x5a,0xad,0x5f,0xce,0x05,0x34,0xe9,0x54,0x3f,0x3c,0x93,0x58,0x68,0x04,0x46,0x4a,0xf5,0x88,0x6e,0x86,0x44,0x12,0x9c,0x77,0xeb,0xaa,0x48,0x5f,0x01,},"\x88\xee\x23\x65\xf7\xcf\x9d\xe3\x3a\xcd\x53\x56\x49\x68\xb2\xdc\x7f\x73\x70\xb7\xe7\x03\x3f\x4c\x66\x3a\x88\xc2\x5f\x60\xf7\xf7\x11\xd6\x19\x08\xeb\xf1\xf5\xbb\x72\x83\x55\x53\xc8\xaa\x8c\x8e\x4f\xcd\xec\xd3\x79\x78\x23\x82\x89\xbf\x6c\xa8\x48\x76\xd2\x28\x21\x7a\x28\xd8\x1b\x0b\x45\x7c\x92\x2e\x91\xec\xba\x8d\x3e\x1d\x2e\x66\x59\xc2\xb0\xae\xa0\x51\xb9\xc2\xe0\x9c\x7d\xfe\xb5\x1d\x30\xed\xe7\x67\x57\x03\x41\xff\xac\x1e\xcf\x0d\xe2\x0c\x82\xd1\xe9\xed\x07\x75\xde\xac\x72\xda\x7c\x2d\xec\x23\x48\x65\xde\xc8\x3f\x67\x15\xe1\xc3\xc5\x9d\xe2\x03\x3c\xc2\x4d\x86\xbc\x2d\x31\xaa\x16\x64\x96\x86\xed\xe0\xdb\xbd\x89\x64\xc3\xa6\x4a\x3d\xca\x55\x88\xd7\x24\x8b\x1f\x24\xdf\x8d\x75\xf0\x9a\xac\x62\xc0\x78\x28\xca\x43\x1a\x3a\x2d\x77\xa6\x0c\xc9\x3c\xfa\x34\x95\xca\xbe\xb1\x90\x4e\xd5\xb5\x63\x98\x4e\x8c\x20\x77\x7b\xac\x87\x74\x10\x8a\x64\xed\xa5\x8f\xb3\x20\x24\x4a\x3a\xdd\x3e\x3e\x7a\x76\xcd\x13\x7c\xfa\x4a\x09\xb6\xe6\xe9\x30\x11\xea\x0a\xe6\x51\x71\xaf\x13\x07\x11\x76\x6c\xd2\x5b\x3c\x74\xec\x54\xc0\xbd\xfa\x02\xb3\x12\x0a\xc2\x90\x87\xeb\xac\x98\x37\xfc\xa6\x5b\xa9\x71\xbc\x42\x81\xdd\x55\x7c\x50\x0e\x22\x5e\xa6\x6c\x3c\x3f\xd5\x22\x06\xc1\x9a\x9f\x93\x95\x46\x31\x69\xf8\xc7\xa8\x46\xbd\x9f\x83\x4d\x7f\x33\x7d\x0b\x61\xfb\x30\xbc\xe2\x94\xf4\x78\xae\x1f\x1d\x97\x7e\x45\x4e\x43\x3e\xe8\x72\x9f\xb0\x65\xcc\xe0\x3f\xb2\xe4\x35\xdc\xbc\xbf\xba\x01\x53\x7e\x7a\x67\x62\xe5\x5e\x7e\xd2\x25\x28\x30\x37\x04\xbe\xb5\xae\x38\x1f\x2e\x18\x10\x56\xf2\x51\x33\x27\x3c\xf1\x7d\xdf\x2b\x06\xe2\xd9\x47\x7f\x2c\x09\x75\x5f\xc8\xd9\xc7\x3c\xb3\x31\x00\x46\x8c\x64\x13\x1c\x68\x6c\xac\x79\xfd\x38\x45\x01\xe5\x0f\x8b\x0b\xee\x28\xba\x39\x58\x3f\x42\xe4\xfd\x37\x99\xe2\x4f\x60\xda\x5f\xd3\xc7\x79\xaa\xbf\x69\x9f\xfd\x23\x21\xed\x04\x5a\x85\xbc\x64\x24\xf6\x0f\xdc\xc4\x9c\x1c\xb3\x1f\x24\x9a\x42\x36\xc0\x94\x91\x76\x81\x81\xb9\x21\xf5\x86\x02\xfd\x41\x5c\x1e\xde\xb2\x6f\x39\x32\x4a\xdd\xff\x14\x77\x13\x24\x73\x7c\x67\x20\xcc\x92\x39\x1b\x94\x9d\xcb\x42\x12\xbd\x69\x31\xd4\xde\x51\x40\x1e\x7f\x95\x3b\x7b\x03\x6b\x22\x3f\x0a\xf7\xa8\xe4\x08\xb0\x4e\xa6\x35\xa2\x3f\xa0\x70\x9b\xa0\x42\xa5\xd9\x92\x95\x4c\x09\xd8\x58\x1d\xcc\xcf\x52\x56\x8a\xd2\x7a\x1c\xc7\x1d\x18\xaa\x27\x40\xf6\x21\x21\x2e\x7f\x4c\x5e\x5e\x5e\x5e\x45\x32\xd9\xa6\x7e\xc2\x77\x3a\xc2\x1c\x8a\x4b\x00\x2d\x65\x24\xf6\x18\x2d\xd3\x71\x73\x5d\x2c\x2a\xbe\x6c\x95\xc2\x81\xc6\xfb\x1e\x97\x6b\xc1\x7e\x38\x3f\xd5\x2a\xea\xaa\x9f\xbd\x4a\xbb\x82\xa2\xcc\x65\x39\x5f\x8c\x2c\xc7\xd8\x18\x2a\x0d\x25\x0c\x68\x5c\xfc\xba\x93\xa9\x51\xee\x7c\x50\x3c\x6e\x3e\xec\x23\x6c\xe3\x3e\x08\x6c\x61\x07\x28\x73\x7c\x1c\x3b\x3a\x24\x25\x2d\xa7\xf2\x16\x72\xd9\x28\xeb\xda\x99\x3a\x94\xc4\x58\xab\x99\x0f\x5d\x19\xd8\x00\x23\xc3\x6a\xa1\x6e\xaf\xca\xb1\x43\xf3\x52\xe9\x7d\x64\x09\xf3\x24\x99\x41\x11\x9b\xfd\x9f\x5f\x90\x84\x72\x4d\x9e\xba\xd3\x83\xb1\x0f\x34\xd3\x3a\xc8\x30\xcc\xe9\xe5\xcb\x8a\xec\xee\x6f\x40\x30\x1c\xbb\xe3\x09\xfd\x06\x15\x34\xa7\xd0\xc3\xed\xaa\xea\x02\xa1\x71\xd8\xb2\x34\x9d\xbe\xec\x62\x85\x20\xac\x33\x4a\x5b\xfe\x28\xa9\xd5\xf4\xc0\xd7\x40\xf7\xc7\x2d\x4d\x72\xd8\x9a\x97\x32\x6a\x03\x00\x2d\x1e\xf3\x85\x22\xbc\xd3\x7b\x42\x84\x7a\x31\x4b\xd8\x43\xec\x88\xd1\xf2\xf9\xd3\x9f\x57\xf2\xf1\xa1\x3d\x01\x40\xa8\x84\x74\x50\x44\x8c\x88\x0b\x3a\xe7\x65\x31\xe9\x5c\x43\x92\x97\x32\x50"}, +{{0xc9,0xd4,0x16,0x83,0x0a,0xe2,0x02,0x8f,0x21,0x75,0xd2,0x2b,0x61,0x4c,0x79,0x19,0x8c,0x67,0x0c,0xfa,0xa0,0xe7,0xa3,0x61,0x50,0xef,0x0f,0xee,0x21,0xa9,0x5c,0xe6,},{0x6e,0x3e,0xb4,0xd0,0x18,0x73,0x07,0x2d,0xf9,0x46,0xf1,0x79,0x2f,0x71,0x06,0x33,0x08,0x95,0xe7,0xa7,0x6d,0xd9,0xae,0x27,0xf8,0xa9,0x88,0x03,0x94,0x90,0xfd,0x4b,},{0x47,0xfa,0xad,0x4e,0x65,0x52,0x93,0xed,0xa1,0x56,0xb2,0xa1,0xfa,0xbb,0xfb,0x7e,0x00,0x9f,0xc2,0x90,0xaa,0xfe,0xdb,0xd5,0x65,0x21,0x14,0xa4,0x78,0x53,0xbc,0x77,0xa8,0x23,0x3a,0x2b,0x17,0x9f,0x60,0x54,0x77,0xd7,0x87,0x87,0x8c,0xbb,0x15,0xea,0x61,0x24,0xdf,0x8d,0xc5,0x7b,0x2c,0xe7,0xbe,0x7d,0x18,0xb7,0x16,0x2f,0xb5,0x0d,},"\xff\x9a\xd4\x83\x7c\xd0\xbb\x77\xd6\x21\x0f\xdd\xdc\x75\x5e\x6c\x0f\x1a\x73\xc2\xbc\xd0\x3f\x7a\x58\x69\xe7\x34\x2c\xfd\x73\xcf\x70\x86\xf8\x65\x56\x15\x60\x27\x7b\xf6\xc3\x42\x1a\x91\x2d\x67\x65\x8b\x1f\xa9\x70\x57\xc4\x96\xf4\xbe\x8e\xdc\xbe\x18\xb5\xec\xd0\x8a\x1e\x7d\xb2\x52\x23\xab\xda\x20\x8f\xa5\x31\xf4\xb2\x80\xaa\x03\xb0\x4b\x60\x60\x34\x11\xd3\x74\xba\x7c\xbb\x02\x0b\xb9\xa8\xce\x4c\x0e\x45\xa7\xe1\x32\x14\x48\x43\xc3\x1f\x8b\x45\xc5\x8e\xb3\xea\x85\x3c\x2c\xeb\x61\x37\x6e\x9d\xf8\x1d\x97\x78\xe7\x21\xad\xac\x77\xb5\x03\x54\x93\x7f\x34\x37\x2f\xcc\xd5\x75\xe8\x8d\x9d\x05\x8e\x43\xdf\x94\x2f\x2c\x43\xb5\x23\xc8\x09\x8e\x6d\xd9\xe6\xbd\x21\xd5\xa6\x49\xb4\x72\xd4\x1e\x34\x5f\xcd\x5e\xfd\xdd\x49\xea\xb3\x02\x70\xcd\x87\x88\x40\x4f\x28\x51\x6e\x09\xd3\xac\xc4\x00\x48\xb3\x9d\x32\x46\xf7\x57\xe4\x82\xe1\x45\x9c\x62\x6b\x79\x9e\x04\xd0\x67\x27\x13\x73\x71\xe1\x20\xaf\xb9\xfe\xc3\x9a\x25\xf4\xe6\x76\x4b\xf9\x79\x2f\xe4\x92\xee\x0f\x21\x0b\x57\xdb\x9e\xbb\x9e\x8e\xf4\x1b\x02\xc7\xfe\xe9\xed\xd4\xb6\x17\x4c\x57\x0d\xe0\x20\xa3\x91\x28\x71\x33\xfe\x8c\xcb\x41\xa8\x3f\x91\xbd\x22\x38\x2b\x21\xe1\xd7\xeb\xc2\xc7\xe5\x01\x8e\xf5\x14\x2d\x82\x63\x7d\x02\x62\x0f\xbc\x05\x69\xcc\x09\xc4\x4e\x91\x11\x12\xbb\xae\x99\x06\x4d\x68\xd1\xc6\x9e\x77\xc9\x93\x0b\x0d\xe0\x30\xc8\xc1\xd7\x48\xc4\x14\x05\x9d\x5e\x29\x9b\x7e\xdc\x08\x94\x06\x51\x89\x4b\x30\x3a\x2b\x32\xdd\x2c\x36\x5a\x06\x7c\x97\x23\x58\x55\x94\x64\x4d\x3e\xe8\xde\x1a\x51\xfa\xea\x0e\x65\x0f\x21\x24\x88\x5a\x94\xcb\x99\xeb\x90\x3b\x7d\x45\x79\xbd\xe5\x91\x49\x7d\x95\x39\x30\xd3\x63\xdd\xdb\xda\xc6\x27\xb9\x7a\x91\xf4\x96\x82\xdf\x8e\x72\x50\xa7\x07\x3d\x38\x3a\x7a\x22\xcf\x11\x3f\x28\x58\xce\x6b\x63\x2a\x28\x92\xc4\xe8\x8a\xa9\xa0\xd2\x89\xeb\x57\x62\x9b\x00\x8d\x3b\x1b\x60\x81\xe6\xfe\x5d\x3c\x0a\x6c\x80\x21\x89\xb5\xf1\x08\xe7\x66\x31\x9e\x15\xb3\x3e\xaa\x5b\x8c\xed\x40\x27\xea\xec\x83\xb4\xac\x68\xb1\x4b\x82\x98\xbc\x51\xcd\x8e\xb3\x80\x9b\x7a\x2d\x68\x4f\xe3\x2b\xbd\x9f\xab\x5c\x91\x8e\xeb\x17\xcc\x44\x4d\x73\xf7\x30\xd4\xc8\xcc\x05\x7b\xd3\xa2\xf1\xf0\xae\xbb\x61\x63\x29\x34\xe6\x17\x02\x16\x88\x29\xcd\x7e\x91\xde\x81\x50\x96\x29\xd0\x1a\x8c\xde\xfe\x0d\x1a\xc4\x9e\x21\xf0\xc5\xfb\xe1\xb2\x24\x48\x27\x26\x8a\x0a\x27\x35\x7e\x15\x8b\xd7\x68\x84\xa2\x1e\x7f\x1f\xac\x1b\x62\x72\x16\x6d\x5a\x9f\x64\xf9\xb6\x72\x98\x9a\x87\x62\xf5\x12\xbf\x1d\xf4\xb2\xab\x69\x97\x65\xf2\xcd\x83\x96\xf4\x76\xe7\xf5\x99\x95\xde\xe7\xd8\x90\x20\x7e\xff\x0f\xd2\x72\x63\xec\x23\x2e\x37\xcf\xed\xfe\x7c\x44\x05\x55\xd4\xca\x74\xe5\x2d\xa2\x46\xc4\xb8\x37\x57\xbe\xaf\xd2\xab\x2a\x51\xef\xe1\x60\xbb\x02\xb9\x8c\x26\xd6\xb2\xc3\xf0\xc1\xaa\xcb\x2f\x3c\x34\xa5\xb2\xa3\xb6\x6f\xee\x17\x5b\x78\x75\x48\x07\x3d\x8b\x57\x77\xc6\xbe\x88\x0b\xdc\x19\x6b\x33\x74\xa2\x15\x4f\x94\xd9\x36\x0f\x77\x55\xac\x68\x15\xa2\x8a\xf2\x96\x27\x1e\x22\xa8\xf2\x35\x43\xc7\x49\x55\xa6\x09\x12\x5b\x02\xa5\x69\x21\x80\x11\x42\x02\x95\xcc\xf0\xd7\x35\x69\x99\xa5\xb8\x95\xcc\x88\x48\x3f\xad\xf7\x97\x0c\xec\x6c\x64\x24\x0f\x70\x79\xfd\xb1\x5f\xfc\x5c\x42\x27\xe5\x39\x26\xd2\x78\xba\x0f\xed\x3c\x39\x93\xbc\x86\x82\x28\x23\xdd\x58\x1a\x32\xab\x2e\x3a\x07\xf7\x94\x30\x22\x4b\x27\x4e\xad\xd8\x45\x59\x8a\x7d\x1d\x89\x67\x6a\xaf\x23\x67\x77\x74\xb7\xb0\x58\x3b\xcc\x83\x59\x9d\x15\x5d\x14\xb0\x9a\xdc\xf4\x9e\xd5\x05\xe8"}, +{{0x2d,0x27,0x7d,0xd5,0x5f,0x57,0x19,0x5e,0xc0,0x72,0xb4,0x7c,0xb1,0x44,0x8c,0xb5,0x82,0xc8,0x35,0x73,0x9e,0x6c,0x98,0xba,0x71,0xab,0x12,0x8f,0x70,0xce,0x6b,0x79,},{0xdf,0xa9,0x25,0x93,0xef,0x0f,0x0d,0x97,0x4a,0x11,0x37,0x83,0x0a,0xd1,0x38,0x48,0xaf,0xef,0x3b,0x81,0x0c,0x2a,0x21,0xbf,0x77,0x91,0x78,0xce,0x4b,0x3a,0xb9,0x74,},{0x73,0xc1,0x06,0x06,0x49,0xa7,0xc0,0x14,0xed,0x01,0x94,0x58,0x51,0xb5,0x3e,0x28,0x53,0x24,0xe6,0x0d,0x06,0x1c,0x83,0x1d,0xda,0x41,0xf0,0x33,0xb5,0x65,0x83,0x06,0xa1,0xf1,0x12,0x32,0x7a,0xfe,0x93,0xca,0xa9,0x21,0x02,0x07,0x30,0xaa,0xe0,0x06,0x9c,0x9a,0x2b,0x45,0xee,0xf5,0x5c,0xbb,0x4a,0x5a,0x9c,0xd4,0x6c,0xda,0x80,0x08,},"\x14\x54\x9e\xdd\xd5\xf2\xb7\x90\x5d\xda\x19\xd7\x4a\xb2\x07\xaa\xc6\xfb\x3e\x3d\xf3\x29\x5d\x84\x52\x31\xef\x3a\xea\x6e\x1f\x04\xee\x03\x3c\x90\x38\xdc\xb4\xbd\x3d\x5e\x45\x2c\x54\x83\x4d\x0f\xf2\xb7\xde\x3f\x32\x2e\x56\x26\x94\x9c\xd6\x1d\x6e\x89\x01\x38\xff\x0e\xa8\xad\x84\x6e\x8f\xe8\x87\xae\xe1\x5f\xc4\x8b\xbe\x4f\xba\x42\x45\x5f\x5c\x17\x45\x7a\xe7\x89\xb4\x05\xaf\x85\x96\x11\xfe\x1f\x87\x46\x18\x5a\x65\xae\xf2\x13\x4e\xa4\xd8\xf3\x98\xd4\x8d\xf7\xc1\xbb\xa4\x30\x44\x08\xae\x7e\xfb\x35\x29\x24\x09\xd5\x08\xdd\x55\xce\x21\xde\x8c\x28\x16\x0d\xc9\xe8\x77\x70\x0c\x76\x3d\x06\xb0\x1b\x85\x42\x05\x2d\x7d\xdb\x63\x35\x54\xe3\x58\x42\x79\xc7\x96\x93\x70\x23\xc8\xea\xc3\x72\x77\xbe\x2b\x82\x04\xff\x3e\x0e\x10\x31\x19\x0a\x01\x01\x4c\xf5\xf5\xb4\xd7\xad\x99\x67\x27\xf9\x75\x31\xe0\x35\x5b\x87\xc9\xe6\x11\x52\x5a\xad\x07\x99\x58\xe9\xaf\xe2\xab\x10\xe4\xa3\xe7\xa1\xb6\xba\x0a\xff\x81\x5d\xa2\xcd\x81\xea\x9e\xb9\xf5\x36\x98\x66\x33\xf3\x16\xdd\x06\xc2\x50\x3c\x6b\x19\x8d\xc5\x93\x04\x80\x7b\x98\xb4\x29\x35\xf5\x1f\x63\x7d\xdb\x59\xe2\x33\xfe\xd5\x66\x43\x9c\x1f\xe9\x6c\xda\xaf\xa4\x9f\x44\x12\xd0\xc1\xe6\x54\xd8\xc6\x90\x42\x47\x0b\x3a\x59\xac\xb6\xbf\x67\xe4\x0b\x38\xa7\x70\x67\xd5\x99\x7b\x8d\x35\xed\x61\xd6\xeb\x3c\xc7\x8b\x8b\xdc\xb9\x57\x4b\x1c\xed\x9f\x6f\x33\x9e\x9e\x38\xf9\x41\x46\xef\x63\xf0\x49\xe6\xb8\x02\xbf\xed\x2a\x51\xab\x42\xe7\xd4\x89\xf3\x16\xff\x4d\x1c\xd8\x98\xbc\xf8\x50\x56\x51\x68\x74\x40\x74\x9c\x0f\xb7\xa5\x7d\xbe\xff\x72\xe6\x46\x89\xfa\xa4\x1c\x07\xb4\xad\xe5\x99\x33\xd2\xfa\xc6\xd5\x73\xde\xb7\x39\x54\x9e\xb7\x5f\x1e\x6f\x73\x85\xd8\xc6\x14\x28\x94\x97\x3e\xd6\x85\xeb\x8e\xd0\x80\xc2\xa4\x9f\x3a\xc6\x57\x11\x61\xaf\x96\x63\x5a\xd0\x57\xdf\x14\x86\xd3\x96\x77\x3a\xc8\x98\x32\x10\x97\x89\x86\xe1\xbf\x21\xa2\x08\x06\xd6\x67\xa4\x8a\x55\x5a\x96\x32\x21\xd5\x06\x14\xa8\x97\x6b\x2e\xec\x97\x51\x2d\xb1\x1a\x35\x81\x94\x49\x2a\xb5\x45\x58\x01\xba\xa1\x4a\x51\x1b\x26\xeb\x0c\x68\x28\x9d\x79\x05\x23\x71\x2f\x2f\xf8\x70\x98\x92\x69\x5c\x4d\xb9\xad\x31\x0d\xf8\xc6\xee\x7b\xd8\x3c\x87\x1f\x05\xae\xc3\x3b\x7a\xd3\x26\xf4\x46\x69\x2a\x42\xf7\x22\x23\x76\x24\x6d\x53\x6a\x32\x6c\x4d\x73\xeb\x57\x2f\xea\xda\x11\xb8\xac\x71\x14\xf6\xcb\x44\x4c\xa2\x78\xfc\xf0\x7b\x97\x0d\x2a\xd4\x65\x37\x2a\x68\x7d\x36\xb7\xda\xac\x47\x87\x48\xec\x6a\x93\x2d\xa2\x08\x43\x94\x8e\xfa\x39\x30\x97\x81\x42\x72\xe5\xca\x1c\x73\xe7\x11\x97\x3a\x52\x68\x3f\x98\xc0\x1e\x55\x24\x1c\x15\x4d\x28\xe3\x8d\x3e\xdf\xad\xe2\x30\x3a\x4e\x7c\x45\xc2\xa7\xa1\xc9\x96\xee\x11\x37\xaf\x86\x4a\x98\xb6\x98\x09\xfc\x92\x14\xee\xa8\xcf\x3a\xfe\x84\x2f\xee\x3e\xb9\xa9\x32\x2c\x3b\x82\xfd\xdb\x05\xd4\xd1\xa2\xde\x09\xc1\xce\x72\x73\x44\x53\xa8\xdd\x3a\x89\x20\xd0\xd0\xac\x96\xef\x77\x8b\x9e\x02\xc6\xa3\xf1\x28\x72\xe1\x7d\x3a\x81\xba\x75\xfd\x23\x3b\xaa\xdb\xe2\x16\xea\x0a\x58\xe9\xdd\xa0\x08\x40\x87\x02\x08\xae\x41\x35\x40\x03\x0b\x3c\x05\xe5\xd0\xb8\x32\xdf\x87\xc8\xee\x7f\x15\x34\x87\xaa\x11\xba\xd9\xf1\x39\xc7\xdd\x4b\xcf\x41\x8f\x4b\xcb\x95\xbe\xe8\x57\xd0\xe9\x60\x84\x47\x23\x87\xcb\x39\x12\x7a\x94\x71\x34\x50\x19\x63\xa7\x07\x1b\xdb\x34\xde\x69\x61\xbe\x2b\x6b\x06\xe4\x03\xe7\x59\x18\xe6\xf6\x9d\x08\x02\x1c\xf2\xa8\xac\xb8\x0a\x01\x11\xf4\xd5\x06\x10\xc1\x52\xd3\x9c\x66\x21\xc0\x57\x8a\xc6\x89\x95\x9b\x1c\xe6\xf3\x76\xf4\x3d\x18\xaf\x06\x2e\x4a"}, +{{0x42,0x80,0x66,0xc5,0x24,0x45,0x72,0x6d,0x0e,0xa2,0x00,0x7e,0x50,0x46,0x37,0x27,0x4d,0x84,0xee,0x23,0x23,0x25,0xb5,0x05,0xf2,0xc5,0x16,0x35,0x7f,0x80,0x75,0x83,},{0xdd,0x40,0xfe,0x8f,0x67,0xc6,0x65,0x61,0x3b,0x3c,0x45,0x9f,0x6a,0xce,0x8d,0xc2,0x8d,0x34,0xe0,0xe7,0x7e,0x2f,0x6a,0xa0,0x60,0x59,0x28,0x19,0xbe,0x6a,0x9d,0x68,},{0xc9,0x38,0x82,0x9f,0x59,0x8b,0x1f,0xf1,0xb8,0x18,0x33,0x60,0xd2,0x23,0xf4,0x3c,0x59,0x47,0x30,0x60,0x68,0x76,0xa9,0x9a,0x3f,0x31,0xb2,0x06,0x5d,0x04,0xe6,0xf0,0x75,0xd1,0x39,0x6b,0x3c,0x8c,0xff,0xb0,0xe1,0xe2,0xea,0xab,0xda,0x7d,0xa5,0xe7,0x89,0xcc,0xd1,0xc0,0x20,0x83,0x5f,0xe3,0xa7,0x1d,0xcd,0xb6,0xaf,0x03,0x96,0x0c,},"\xe2\x79\x6c\x50\xd9\x3d\xf8\x12\xbc\xa4\x1b\xf2\xa1\xe1\xdd\x73\x7d\x8c\xf6\xf6\xb4\xf7\x62\x42\xe3\x91\x78\x18\x67\x58\xcb\xae\x08\x84\xe6\x0c\x6b\x4a\xaa\xdd\xae\xc9\xa8\x99\xa9\x12\xe5\xc5\xb9\x80\x4d\x7b\x04\x97\xba\xb4\x45\x8c\x58\x5d\x4f\x25\x92\x22\x49\x8c\xe9\xe8\x0e\xb6\xa7\x97\x9b\xbe\xd6\xd5\x2c\xc3\x80\x72\xf7\x45\xcb\x2c\x63\xe6\x63\xbc\x3b\x9d\x6c\xaf\x01\x2a\x60\x7f\x6d\x3b\x70\x6e\x15\x57\x57\x87\x17\xec\xbb\x97\x1a\xeb\x7c\x48\xe1\xdf\x95\x71\x1c\x55\x0e\x00\x69\x93\xbf\xfb\xa9\x11\xcb\x64\xad\x52\xd5\x17\xed\x18\xbe\x82\x36\x9e\x81\x58\x19\xd3\x17\x59\x47\xd4\xa3\x5b\x2c\xc7\xb9\xdc\x6c\x10\x05\x13\x26\xb3\xf1\xdc\x1e\xdb\x1b\x68\xba\x01\x5f\xf7\xca\x1d\xc3\x61\xd8\x96\x7a\xbc\xff\xd3\xc3\x1f\x7d\x6b\x0c\xb1\x39\x6a\xe5\x41\xf2\x97\x59\xc4\x13\x0b\xe5\x2e\xcc\x11\xd9\x92\x61\xc3\x65\xbf\x7c\xde\xc7\x81\x49\x4c\x5f\xa0\x52\x6d\xb4\xdb\xbe\x66\x0a\x43\x2b\xe5\x60\x43\xc6\x6e\xa0\x7c\x25\x62\x7a\x5f\x72\xb7\x81\x23\xdc\xf9\x86\xff\x71\xed\x1a\xff\xd1\x65\x9b\x13\x93\xd9\x62\x1f\x71\x1d\xfa\x63\xea\xda\x38\x34\x30\x79\x70\x58\xf1\x56\x6a\x00\x05\x2d\x67\xba\x53\xc1\x23\x7b\x56\x91\xde\x3b\x03\x9f\xd4\x47\x6f\x11\x51\xe5\xed\x5f\x5a\x98\x67\x2f\xa3\x3a\x1d\x85\x4f\xa0\x15\x66\xb3\x32\x31\xd4\x6a\xcd\x7f\x34\xb8\x03\x44\x79\x98\x18\x53\x76\x4d\xab\x87\xf4\x98\x44\xcb\x62\xc6\x3d\x53\x6f\xac\xa9\x20\x44\x7d\x8c\xd1\xe8\x11\x3e\xdb\xc8\x3e\x4a\x6b\x78\x15\xe1\x80\xcd\x78\xb9\x33\xd9\x68\x7f\xd5\xbe\x99\xd0\x51\x8a\x44\x66\x29\x89\xbc\x64\x01\x11\x24\xf1\x87\xd4\x39\x79\x99\x4a\x95\xe0\xc9\x03\xa0\x06\xc1\xc0\xbe\xf1\xc0\xf3\xdf\x1e\xb7\x00\xf9\x80\xc2\x8c\x3c\x1e\x99\x7d\x0c\x56\xd1\x13\xda\xe1\x96\x88\x2b\x05\x01\x8f\xca\xb3\x14\xd8\x11\x7f\xaf\xba\xbe\x77\x00\xb9\x32\xd4\x7c\x57\x36\x2b\x20\x35\xed\xdc\xe2\xd2\xef\x33\x64\x1e\xa9\x0c\x3e\xa3\xfe\xc6\xea\x5b\x87\xe1\x61\x01\x4c\x4f\x82\x14\xfd\x03\xce\xbf\x94\xab\xe1\x22\x53\x7a\x98\x70\x32\x39\xdf\x58\x21\xc5\xab\x63\x3f\x98\x36\x5c\xc6\x36\xe3\xf1\xd2\xf7\x4e\x0f\xf8\xf1\xfe\xe0\x6a\x3f\x73\x90\x7e\xe5\x04\xb3\x10\xfd\x52\x24\xad\x4d\x05\xcd\x23\xc3\x56\xdf\x8b\x34\x64\x72\x98\xc4\x98\x28\x72\x5b\xa5\xfd\x60\x61\x1e\x82\x9b\x63\x37\xbc\xc9\xdc\xf8\xe8\x97\x1c\xab\x3e\xe9\xc2\x63\x37\xd3\x8d\xfd\xfa\x03\x6b\xf6\x09\x6b\x63\x5a\xc1\xbd\x55\x25\xec\xd3\x77\xa1\x52\x72\xa8\xac\x9b\xbe\xf1\x33\x10\x7a\x42\x25\x8d\x8b\x19\xec\x69\xdc\x42\x61\xbe\x53\x00\xa2\xd2\xd5\xca\x99\xf3\x1e\xfd\xf2\x59\xf9\xd0\x79\x86\x9a\x34\x41\x37\x79\xf3\x02\x88\x24\xd7\x47\x68\x6c\x46\x0f\xfc\x49\x6f\x20\x10\xf4\x03\xe9\x03\xe2\x7a\x87\xdd\x07\x5a\xe0\xa7\xf1\x68\x94\x16\xd3\x1b\xcc\x15\xf4\x90\xca\xf9\x75\xc4\x0e\x71\x5d\x54\x99\x03\xe8\xbc\x0f\x7d\x91\x41\xe0\x20\xf4\x10\xf3\xca\x2b\x2c\x07\x97\xca\x0d\xc8\xd7\x39\x2b\xff\x24\x35\x28\xc7\xf3\xbe\x13\x89\x97\x18\x5a\x4b\x36\xf4\x53\x76\xd9\xfd\x70\xba\x20\x98\x9d\x2d\x1a\x91\x1d\x4b\x98\xd1\x60\xd2\xb8\xde\x59\x2d\xe2\xf4\xc0\x4f\x35\x86\x0d\xf3\x20\xc5\x48\x44\x0d\x5e\x3a\x34\x6a\x14\xd3\xa6\x3f\xe4\x85\xc2\x88\x91\x26\xb7\xf4\x1d\x55\xa6\xeb\x23\xd5\x62\x0b\xab\xf8\x56\x4a\xa7\x9d\x15\x6e\x98\x3f\x36\xd9\xed\x49\x8d\xa9\xca\x88\x8d\x94\x6b\x53\xcc\x47\x68\xa5\x89\x2d\x52\xd5\x41\x52\x69\x60\x28\x25\x24\xba\x61\x94\xda\x65\x94\x1d\x1e\xa3\x0f\x80\x6b\xb6\xd9\x7c\x74\x88\xb9\x3f\xd0\xa7\x70\xa9\xb1\x5e\xfc\xd1\x2c\x5c\x46\x94"}, +{{0x31,0x45,0xbc,0x68,0xd8,0x29,0x79,0x40,0x8e,0x46,0x57,0xb7,0x75,0xf1,0x50,0xc6,0xd2,0x8a,0x32,0x4d,0x74,0x6e,0xa6,0xde,0x90,0xfd,0x72,0xb1,0x7a,0x25,0x79,0x82,},{0xc7,0x76,0x18,0x6c,0xe4,0x7f,0x30,0xad,0x08,0xfa,0x1d,0x2c,0x61,0x6a,0x36,0x44,0x66,0x5b,0xa5,0x4f,0xf7,0x30,0xfc,0x2f,0x4d,0xb1,0xdb,0xa3,0x8d,0xde,0xed,0xca,},{0x24,0xa4,0x33,0x33,0x76,0x83,0xbc,0x71,0xa6,0xca,0x3b,0xcc,0xd8,0xcc,0x24,0x00,0xc2,0x44,0x64,0xfa,0x67,0x71,0x4b,0x46,0x51,0x5f,0x2a,0x14,0x32,0x71,0x27,0x05,0xd5,0x70,0x61,0x4d,0xb6,0xd2,0x6b,0xbb,0xd3,0xf0,0x26,0x7c,0x14,0x27,0xca,0x1c,0x2f,0x40,0xdc,0x9a,0x6f,0x1f,0xb0,0xf0,0xfc,0x71,0x4a,0x02,0xe2,0x4b,0x47,0x08,},"\x2e\xa8\xdc\xe1\x48\x7f\x45\xd6\xff\x8e\xb8\x3c\x54\xfb\x7e\xdd\x76\xad\x6e\x60\x8b\xb8\xda\xf1\xa1\x82\x3d\xa4\xf4\xe4\xe9\x86\x31\x73\x89\x7c\x19\x7a\xc6\x58\x04\x82\x3b\xca\x95\x09\x1f\x59\xe8\x6d\x63\xc1\x8d\xbc\xdb\x85\x74\x3f\x88\x93\xee\x69\x4d\x81\x56\x01\xf8\xf2\x2f\x4d\x7d\xf0\x87\xf0\x11\x4b\xb2\x6c\x37\x95\xe1\xfe\x4b\x7f\x4a\x8f\xa3\x1f\xd9\xf4\xff\x10\xfe\x5d\xd4\x52\xc5\x4c\x55\x78\xc7\x52\xf8\x88\x21\x30\x76\xbe\x46\x7b\xa3\x0d\x2e\x2f\xbb\xee\x87\x7c\x4b\xe9\xb6\xec\x4f\x04\x02\x1c\x00\x6f\x92\x66\x31\x19\x43\xca\xb7\xce\xa9\x9a\x2a\xce\xbb\x69\xee\xc3\xe6\x18\xc1\x31\xf9\x74\x30\x07\x5f\x79\x75\xe3\x9f\x26\xd5\x31\x51\x78\xb6\x9a\x1d\xdf\x73\x17\x61\x05\x1b\x93\xfb\x8d\xf7\xe0\xe8\xb4\x1e\x82\xe7\xf4\xf7\x5e\x91\xd6\xc8\x90\xb1\x4c\xa5\x33\xe0\x94\xeb\x8e\xa4\x48\x6d\x38\x71\x85\x96\x6c\x98\x29\x5d\x3f\x58\xb1\x7e\xef\x6c\xc3\xb4\xd0\x7e\x93\xa3\xd9\xf4\x77\x2e\xe5\x2f\x18\xa5\xbb\x30\xaa\x39\x72\x85\x0e\x65\x81\x70\xbd\xdb\x67\x6f\x33\x26\x6c\x9f\xd1\x0f\x59\x90\xba\xd8\x91\xf0\xce\xb7\x82\x73\x6b\x40\xf0\x1b\xd8\x65\x09\xb0\x63\x04\xa9\x6d\x93\xda\x23\x3d\xbe\xd1\x8a\xfa\x18\x18\xaa\xf5\x7a\xf9\xbd\xbc\x86\x7b\x39\x7f\xf2\x35\xa8\x3e\x85\x72\x24\xb1\x50\x65\x22\x5e\xec\x03\x9d\xd4\xe2\xd6\x9a\x04\xee\x10\xbe\xa0\x69\x50\x41\xed\xa5\x9b\x05\x8e\xc0\x5f\x49\x04\x8e\xe3\x24\xd1\x6c\x4d\x61\x07\xb6\xec\xd0\x48\x75\xeb\x74\x4e\x93\x65\x47\x1b\x4c\x5f\xe6\x61\x1b\x26\x18\x93\xf9\xd2\xb1\x28\xe1\x35\xf9\x2e\x47\x41\x56\xb2\x71\xb3\xc8\x2e\x9a\x76\x63\xda\xd4\x95\x3d\x30\xe1\x0e\xda\x08\x62\x60\x7d\xec\x33\x72\xb3\x99\x70\xf2\xa8\x4b\x12\xf6\x0e\x6d\xae\x7f\x31\x79\x90\x86\xd3\x8a\x7e\x34\x94\x84\x19\xc1\xb0\x7f\x44\xc2\x15\x9c\x86\xb8\xc0\xcf\xe8\x74\x7f\xc2\xba\xd5\xbf\x47\x53\x56\xcf\xe6\x9d\xe2\xdc\x6a\xd5\xa5\x19\xfd\x65\xc1\x25\x64\x70\x1c\x05\xf7\xc2\x77\xec\xaf\xcf\x4c\x87\xb1\x48\xdf\x1f\x98\x79\xa9\xae\x44\x3c\x55\xae\xa5\x21\x38\xc6\xfa\x01\xef\x0c\x3a\xbb\x5f\x2d\xf9\x0a\x57\xab\x66\x24\x17\x8c\x73\x7b\x54\x91\x5b\x7a\xa2\x9e\xa7\x8e\x8e\x49\xef\x5a\x81\x6d\x8a\x92\xc2\xf8\x1b\x8a\x19\x63\x27\x79\xc8\x92\xd6\x6f\x75\x3d\x51\x8c\x41\xcc\xcc\x9e\x59\x3e\x50\x74\x26\x25\xbc\xaf\xa4\x68\x80\x5c\x37\xa2\x1f\x8e\x29\xa6\x96\x0d\xdf\x5c\x5e\x5c\xa1\x4a\x7b\x05\x2a\x7b\x60\x15\x69\x7a\x02\x10\xed\x6f\x01\x43\xe6\xb4\x84\xc3\xf5\xb3\xb4\x72\x6c\x60\x7d\x07\xbf\xb3\xd5\x4a\x09\xc9\x80\x43\xf2\x1d\xcc\x5c\xc2\x0b\xb4\x75\x4e\x2e\x5a\x73\xb2\xf8\x06\xc2\x20\x4b\x72\xf3\x6a\xb9\xe9\x6a\x62\xc6\x27\x7c\x0a\xd6\x6b\xe7\xab\xff\xc1\x63\xb4\xe8\xfa\xfc\xef\xf5\xe2\x02\xe5\x94\x3f\x4f\x0e\x6b\x92\xb4\xdd\xb9\x53\xcb\xb7\x91\xf8\x31\x66\x03\x69\x38\xe6\xc4\x4a\xd9\x1a\x59\x6a\x55\x73\x44\x0f\xb3\x07\x41\xe6\x60\xb6\xcd\x5f\x86\xff\xa7\x46\xe6\xe9\x72\xb8\x05\xc1\x0b\x7b\x7b\x9a\x63\xc0\x55\x1d\xb8\xeb\x4f\x84\x00\xcd\xe2\x86\x8c\x0d\x0d\x4e\xb4\xcf\x11\x7f\x8e\xc4\xab\x97\x44\xfc\x58\x79\xde\xa7\xf0\xef\x16\xc2\x91\xd5\x5c\x17\xf0\x8b\x73\x1b\x7c\x65\xd0\xc4\x41\xb6\x3b\xc8\xff\x5e\x94\x90\x4c\x02\x6a\x13\x61\xda\xcc\x80\xa9\x3a\x9b\x9f\xba\x3b\x40\x36\x17\xae\xb9\x4a\x56\x85\x41\x84\x80\x11\x95\x42\x34\xae\xad\x70\x0f\x03\x4c\x47\xc7\xde\xf8\x77\x90\x52\x55\xf1\x8b\xdb\x9a\x25\x7c\xe5\xbd\xcf\x0e\x17\x67\x0c\xda\xaf\x13\xb1\xc7\xe0\x9d\x58\xf9\x2a\x96\x63\xaf\x23\x9e\x22\x07\x8e\x18\x0a\x23\xcc\xb6\xf6\x4d\x64"}, +{{0x5a,0x25,0xea,0x5e,0x18,0x2d,0x9b,0xf8,0xe9,0x30,0xa2,0x0b,0x6c,0xf5,0x5e,0x24,0xe8,0x38,0x62,0x78,0x9b,0x38,0x39,0xb1,0xce,0x9a,0x71,0xe9,0x38,0xc4,0x2d,0x37,},{0xc9,0x81,0xfc,0x36,0xf1,0xa6,0xd5,0xf7,0xd4,0x51,0xcd,0x5e,0xf3,0x9c,0xd3,0xab,0x02,0x08,0x7f,0xcc,0x6a,0xf2,0x7d,0xd7,0x8e,0xa8,0x27,0x49,0x7e,0x77,0x9e,0x21,},{0xa4,0xf3,0x5b,0x49,0xd7,0xe1,0x98,0xe5,0xd3,0x26,0xe3,0x53,0xfb,0xb0,0x1f,0xa1,0x3b,0x6a,0xe2,0x60,0xd1,0xe4,0x8e,0x30,0xc1,0xb9,0x67,0x73,0x7a,0x5e,0x79,0x93,0x6c,0x97,0xca,0x2b,0xa7,0x99,0xca,0x34,0xe5,0xe7,0x88,0xce,0xa5,0xac,0x8e,0xd1,0x0d,0x5c,0xd1,0x5d,0xae,0x53,0xe4,0x24,0x32,0x32,0x1c,0xc2,0x6d,0xc9,0x98,0x09,},"\x21\x4d\xd1\x92\x7f\x2c\xac\xd9\x88\x87\x14\x24\x9b\x85\x43\x46\x02\xac\x78\x45\x3b\x4a\xf5\x38\x6e\xee\x39\x29\x5d\x3d\x5a\x22\x67\x80\x6e\xb0\xcf\xf2\xc1\x32\xd3\x64\xc2\x42\x0d\x04\xe3\xf6\xcc\x0a\x96\x7b\xf0\x5a\x10\xff\xcf\x12\x17\xbb\xf3\x15\xe7\x5b\x98\x06\x0f\xd4\x58\xd6\x7e\xba\xad\x93\x80\xf4\xad\xc4\xdb\xdf\x74\xcb\xf1\xc6\x47\x92\x02\xbd\xd7\xfe\xd3\xa9\x46\x69\x7d\xc3\x84\x44\xd8\x8b\xfe\x51\xd4\x1d\x7a\x9b\x38\xda\x60\xb8\x50\xc5\x6b\x48\xba\x98\x4f\x6a\x18\x89\x51\x49\x55\xc0\xda\xdb\x69\xa8\xc7\x36\xcc\x76\xcd\xc4\x9f\x13\xf8\x5a\x8b\xfb\x79\x28\xff\x0a\x0c\x0c\x03\xf1\x7c\x74\xb5\xe1\x06\x2d\x75\x53\xfb\xeb\x9d\xd3\xd5\x08\x1d\xe1\xdf\xd8\xa6\xa9\x97\x66\x97\xc6\xa2\x59\xbc\xf7\xd4\xbe\xf1\xc2\x1e\x0a\xaf\x32\x98\xb0\x42\x1b\x91\x9f\xdd\xfc\x1d\xcb\x3e\xc6\x83\xd8\x6f\xf3\xd4\x23\xd7\x1c\x8f\x2d\x72\x3a\x42\xff\x68\xd8\x2e\x9f\x39\x17\x49\xb8\x29\x98\xdc\xfa\x11\x21\x60\xf5\x2a\x41\x3a\x23\xd9\x5f\xc4\x2c\x3b\xd2\x23\x84\xba\xd7\x77\x54\xa7\x10\xd8\xb9\xf8\x4a\xe0\xa8\x02\xfc\x46\x50\x9e\x7f\x2b\x07\x07\x90\x12\xb4\x3b\xfe\xea\xb7\x19\xbd\xe5\x6f\x00\xe5\x9b\x8e\xdf\x1c\x47\x28\x83\xb1\x98\x5b\x2f\xa6\x99\xa1\xae\x90\xcf\x45\xd7\xac\x58\x0c\xeb\x5f\x27\x97\xde\xf5\xb8\xbf\x4f\x2b\x9b\x35\x19\xa7\x27\xb9\xf2\xcd\x12\x56\xa2\xf0\x76\xed\x22\x96\x49\x5b\x5c\x2d\xf7\x88\x7f\xf8\x9e\x88\xe2\x36\xa1\x4c\xde\x63\x24\xf4\x3d\x68\xd9\x01\x72\xb0\xb8\x8b\xd2\x88\x03\xe9\x99\xdb\xed\xcc\x50\x1d\xb6\x54\x54\x4e\x17\x1e\xc1\xf9\xf3\x2d\x4d\x33\x21\xd5\x89\x39\x2e\x03\xca\x65\x9f\x96\x75\x2e\x1f\x08\xa5\x5d\xb5\x53\xd8\x66\x98\x55\x41\xf5\xbe\xf8\x4c\xe2\xee\x32\x3e\x17\xd1\xf7\xdc\x16\x4b\x50\x51\x5a\x28\x7d\x53\x05\xfc\x28\xc5\x98\x3b\x9e\x53\x98\xb2\x40\x7a\xe4\x72\x96\xfe\x4a\x48\x1d\x22\xff\xb4\xb8\x65\xa6\x6b\x97\xa6\xc2\x79\x35\xdd\x8e\xb8\x69\x94\xb7\x9d\x36\x83\x63\x71\x3f\x10\x1d\xc3\x7f\x42\x9e\xee\x0f\xee\x24\x41\xc2\xdc\x17\xbf\x43\x92\x4f\x0c\x04\x4f\x14\x32\x90\xea\xf3\xf9\xee\x4d\x94\x6d\xbe\x45\x83\x1a\x0d\x83\xc0\x76\xe7\x51\xc1\x4f\x3b\x1a\x72\x67\xf5\x44\x6c\x18\x86\x98\xd2\xb4\x6d\x87\xe6\xf3\xb2\x0b\xb3\xfd\xaf\xe2\x4c\xc0\x96\xbc\x31\x2d\x86\x78\xb3\x8a\x80\xc3\xf0\x52\xa0\xc9\x6d\x5a\xd8\x7a\x5d\xd8\xc1\x33\xcc\x9a\x15\xbe\x33\x57\x4c\xd9\x43\x08\xc2\x4d\xec\x1a\x9b\xdf\x18\x9b\xa6\x87\x19\x9f\x72\xef\x67\x09\x87\x8e\x10\xf8\x7b\xd8\xa0\x3d\xc8\x4c\x8f\xa9\x64\x20\x28\x58\x98\xca\x32\x11\xd8\xb0\xcc\xef\x64\x01\x1e\xc2\x4f\x38\xe5\x74\xda\x34\xda\xb9\xd2\xf0\x02\x10\x52\x27\x89\x0f\x92\x48\x8c\x62\x1e\x57\x13\xe4\x7d\xbc\xb1\xa8\x2a\x6d\xa6\x0d\x8b\x22\x01\xeb\x29\xd4\x94\x49\x33\x60\xed\x5a\x3f\x4b\x52\x25\xea\xe7\x70\x7e\xe0\xb4\xc0\x40\x73\x05\xc1\x67\x54\xc7\xf6\x30\xfc\x85\xc1\x3e\x49\x17\x04\x7b\xcf\xf3\xb2\xa2\x93\xfe\x95\x55\x06\xc7\x26\x4e\xa6\x5b\xf3\xa9\xb2\x5a\xcf\x34\x36\x00\xd8\xfa\x0c\x7c\x1a\x29\x0d\x02\x71\x10\x1b\x7f\x40\xb9\x6e\x7f\xda\xf2\x9d\xef\x9d\x93\x27\xa5\xae\x05\x44\x6c\xb5\xa6\xd3\x22\x45\x3a\x8b\x09\x8b\xcf\x3a\xee\x1f\x70\x4e\x14\xd0\x0b\xe3\x42\xb8\x93\x4d\x19\xe5\x29\x21\x88\x72\xea\x3a\x2f\xb2\x12\x4b\x52\x66\x7c\x01\xfc\xa5\x84\x1c\x66\xe1\xe6\x4a\x1e\x68\x0e\x09\xba\x18\x6e\x04\xd1\x05\x18\x6c\xf6\xeb\x72\x8b\x9d\x50\x2a\x66\xb8\x29\xfb\xc9\x92\xa3\x88\x10\x04\xec\xdc\x80\xad\xfd\x04\x4e\xda\x88\x0f\x8a\xf7\x2a\x14\xfb\x55\x0d\x7c\xc7\x41\x94\xa9\x45\x20\x7d"}, +{{0x42,0x33,0x5c,0x30,0xb3,0xf6,0xb3,0x59,0xce,0xf5,0xaa,0xb6,0xa3,0xce,0x28,0x58,0xa1,0x51,0xb7,0xa4,0xfd,0x78,0xd2,0xfd,0x3e,0xe3,0x6f,0xc2,0x9d,0x24,0x94,0x04,},{0x30,0x1c,0x51,0x5a,0x02,0xa4,0xc6,0x6b,0xc6,0x40,0x10,0x80,0xc6,0xca,0x79,0x23,0xb7,0x83,0x1e,0x3c,0x9a,0x72,0xb5,0x5b,0x14,0x02,0x7e,0xb2,0xe7,0xb3,0xb1,0x52,},{0x67,0xb0,0xf1,0x74,0x49,0x03,0x9e,0x8c,0x79,0x7b,0xf9,0x13,0xaa,0xe6,0xe4,0xf0,0xbb,0x99,0xc7,0x4d,0x6d,0x10,0xc9,0x73,0xb9,0x90,0xff,0xe0,0x3e,0x7e,0xe4,0xab,0x5b,0x35,0x80,0x6d,0xb1,0x5a,0x98,0xc0,0x84,0x6a,0x82,0x7e,0x7b,0xcd,0x53,0x9c,0xd3,0xbc,0x09,0xdd,0x11,0x8a,0xb3,0xe5,0x26,0x63,0xa3,0x57,0xb1,0x29,0x91,0x07,},"\x6d\xa2\x25\x1e\x6f\x55\x95\x36\xb0\x9b\xfa\xfb\x81\x60\xa2\xe8\x10\x2d\x31\xf8\xb5\x93\x24\x08\x3e\x52\x27\xb2\x0c\x3e\x5c\x3a\x06\xe2\x39\x67\x68\xdc\xa3\xec\x76\xdc\x7f\xc0\xeb\x3d\x14\x5e\x62\xed\x07\xfc\x1a\x8b\x1b\x2e\x34\x70\x13\xa0\x52\x72\x74\xd0\xb2\x34\xfe\x72\x50\x26\xa9\xd1\x28\xf8\xdf\x20\xdb\xfa\x3b\x65\x03\x81\x8e\xde\xbd\x7f\x24\x93\x40\x80\x94\x5a\x7e\x1e\xa0\x22\x73\xfe\x48\xb6\xed\x1e\x83\xfd\x16\x8d\x79\x73\xfb\xb7\x94\x1b\x40\x37\xd3\xcd\xa5\x55\xe0\xe8\x9c\x2b\x94\x3f\xb1\xe2\x07\x65\xac\x7d\x4f\xa3\x77\x7f\x35\xa0\xa8\xbc\x11\x8f\x59\x9c\x84\x7b\xe3\xfd\xb2\xd8\xe2\x01\xae\x12\xa3\x0b\xde\xfb\x03\x4f\xf2\x4e\x3e\x2e\x70\x1a\x0d\x17\x33\x73\x40\x78\xbd\x1f\x9a\x69\xbb\xc6\x67\xe4\x61\x21\x1f\x2c\x76\x9d\x29\xdb\x7c\x4d\x62\xd6\xb1\xb9\x2b\x56\xf5\xf1\x8a\x93\x1a\x92\x60\x64\xb7\x8d\xa1\x46\xe1\x8b\x48\x13\x9b\x9b\x39\x86\x2a\xec\x37\xbc\xce\x12\xcb\x78\x94\x29\xe6\x8e\xa3\x81\x12\xd0\xb5\xcc\xe3\x0b\xd2\xd2\x6c\x5f\x7f\xd4\x15\xda\xf7\xca\x31\x7b\x33\x68\xb7\x61\x7d\x45\x25\xe5\xbc\x97\xd9\x46\x1d\x5d\x64\xf6\xb5\xd3\x18\xd0\xbc\x3b\x76\xf2\x5b\x06\x05\x42\x69\x09\xf2\xaa\x0c\xd6\x67\xa4\xf0\xe0\x75\xb9\xa9\xfb\x2e\x9a\x6c\x82\x70\x4d\x8a\x9f\x16\x66\x84\x4e\xdc\x32\xf6\x3a\x3d\x4e\x0f\xd9\xfd\xba\x30\xb5\x1b\x33\x36\xb9\x6e\x9e\xae\x39\x2a\x34\x2d\xe4\x9e\x9b\x5f\xa0\xf9\xb9\x01\x71\xbd\xe0\x9c\xf1\xe9\x46\x49\x91\x40\x00\x81\x59\xeb\x18\x65\x56\x3c\x28\x39\x4b\x03\xa8\xd7\xa5\x52\x27\x1b\x28\x76\x68\x75\x66\xb8\x0f\xd3\xbe\x2b\x66\x33\x2f\xca\xd1\x96\xca\xb8\x52\x7c\x56\xe2\x15\x36\xa1\x41\x65\x2c\xdc\x7f\xa7\x45\xb2\x6a\x33\x1d\x78\x7b\x93\xe5\xe8\x16\xd8\xd8\x51\xa5\x8f\x6a\xc0\x7a\x58\x27\xfc\xdf\x47\x2e\x86\x85\x43\x3a\x40\xca\xc0\xc4\x9a\xa5\x69\x31\x9a\x2e\x57\xb4\x1c\x99\x98\x16\x5e\x69\x72\x3b\xa7\x7e\x5c\x04\x23\xc4\xb4\xca\x07\x18\x7b\xb7\x44\x2e\x7d\x31\xca\xac\xb2\x77\x00\xc7\x1a\xe4\x8c\xd0\x55\xed\x2f\xe4\xda\x36\x3f\x44\x82\x11\x24\xcc\xa1\xbf\x2e\x63\xd9\xb8\xab\xd2\xfa\x41\xb1\x42\x2f\x52\xd5\x58\xbc\x5f\x11\x0c\x86\x3c\xc6\x00\x86\x49\x84\xed\x25\x9b\x73\xcd\xdd\x57\x96\xb3\x29\x79\xed\xdf\x76\xa0\x7b\xc5\x9b\x73\x68\xc4\x8e\x12\x9e\xcc\x0d\x45\x35\xdc\xce\xe2\xc3\xb8\xe5\x6d\xe5\x0e\x6f\x5c\xc6\xea\x51\x5c\xd6\xa0\xeb\xdf\x1c\xa7\x9a\xa2\x79\x48\x21\xad\x2e\x10\x9e\xdd\xa4\x50\xc9\xfc\x3c\x84\xd8\xc9\x6b\xc3\x8d\x4b\x43\x7a\x73\x8f\x81\x8b\x4d\xdc\xb6\x84\x38\x3c\x09\xb1\x1b\x36\x05\x2e\x9d\x2f\x76\xa6\x1e\xb4\xd6\x20\x49\xce\xd5\xf6\x16\x62\xc4\xb9\xec\xd2\x4a\x67\xf4\x51\x9d\x46\x52\x8c\x5b\x2e\xb2\x10\x05\xf4\x9c\x73\xa3\x37\x0c\x68\xe3\x7a\xc2\xb1\x8d\x48\x1f\xa1\x0f\x96\x71\x4f\xe0\x5c\x16\x8d\xf1\x1c\xda\x54\xf1\x4f\x49\x37\xe9\xfc\xe1\xf5\x16\xc0\x37\x1b\x36\xa2\xc0\xa0\x50\xba\xc7\xfa\x51\x22\xa6\xe3\x5e\xc9\xc4\x04\x36\x58\x5f\x31\x6e\x6c\x91\x1b\xdf\xd7\xdb\x4b\x80\xb4\x30\x64\x79\xb8\x2a\x2b\x24\x3a\x52\xb2\xd2\xb6\x27\x42\xed\x11\x28\x27\x90\xcf\x6f\xdc\x7c\x9c\x82\x43\x64\xcf\x25\x63\x6a\x85\x51\x50\xbd\xdb\xdf\x7e\x64\x0f\x9f\x95\x2a\x94\x7e\xc7\x97\x49\x25\xe8\x24\x50\x68\xb2\x92\x10\x1b\x1f\x4b\x20\x18\xe8\x5d\x07\x8c\x2f\xee\xf4\x49\x23\x49\x72\x9a\xd4\xac\xb3\x8f\x1c\x7c\x02\x70\xb6\x1d\x3d\xfd\x76\x36\xc6\xcb\xf1\x81\xe4\xc8\xa0\xe6\x4f\xa0\x61\x32\x55\x3c\x2b\x9d\xb7\x01\x9e\x3b\x3c\x48\x5d\x8d\x5b\x7d\xfd\x5f\x51\x5e\x4d\x71\xed\xe5\x35\xae\x7f\x2a\xae\xdc\x23"}, +{{0xbe,0x6b,0x2b,0xab,0xdd,0xd2,0xdc,0xa1,0xb0,0xe1,0x0d,0x12,0xd2,0x0a,0x9c,0xe2,0x9c,0x67,0x85,0xda,0xc1,0xd6,0x0f,0x2e,0xdf,0xa9,0x4a,0xc2,0x78,0x4b,0xa7,0x66,},{0x39,0x8f,0x22,0xf0,0xef,0xbf,0x8c,0x38,0x35,0x5e,0x47,0x91,0xbf,0x67,0x08,0x98,0x95,0x1f,0xbb,0xd5,0x51,0x8f,0x0e,0x2a,0x60,0x5d,0x46,0x00,0x23,0xf6,0x13,0xf0,},{0x70,0x2a,0xb9,0xac,0xbf,0xa7,0x5e,0xa2,0xad,0xbe,0x4b,0xe2,0xb6,0x84,0x76,0x25,0xae,0xb4,0x09,0xee,0xf9,0x59,0x6f,0xab,0xe3,0x9d,0x2c,0x53,0x3a,0x03,0x43,0x1e,0x5e,0x57,0x95,0x52,0xe8,0xa6,0x4f,0xc4,0xfb,0x7d,0x92,0x6a,0xa8,0xff,0xfe,0x06,0x40,0x69,0x84,0x64,0xc4,0x45,0x4c,0xe3,0x5f,0xe8,0x3f,0xf2,0x63,0x05,0x1a,0x01,},"\x5c\x92\x95\x88\x1b\x7a\x67\x06\x69\xb0\x4c\xbe\x0d\xab\xd8\x96\x93\xb7\x7f\x7c\xce\x0d\x4a\x33\xf5\x2e\x02\xeb\x26\x95\x9e\x71\x3d\x9a\xef\x5f\x95\x44\x2b\xdf\x91\x72\x83\x83\x32\x52\x02\xaa\xcc\xc0\x37\x47\x7e\x36\x66\xfa\xca\xf2\x4e\xac\x95\x34\x87\x9a\xa3\xef\xe1\x8f\xfc\x1a\x5c\x54\xe3\x9c\x76\x87\xd0\x93\x7b\x24\x71\xba\xb3\x89\xb6\x46\xcb\xe6\xb3\xe5\xd5\x96\x1e\xa6\x3b\xd4\x52\xb4\x74\x33\x44\xce\x4c\x79\x33\x74\x52\x37\x95\xc7\x81\xee\x84\xd5\x11\xe2\x94\x11\x19\xba\xd1\xf4\xa7\x46\xed\x9d\xba\x89\xc8\xd0\x75\x1a\x64\x02\x71\x86\x35\xf6\xe3\x1d\x9e\x18\x68\x1c\x69\x56\xc5\x37\x32\x51\xd3\x5f\x53\xba\xa1\x98\x7c\xd4\x48\xc9\x03\x1a\x07\xf3\x2c\x80\x29\x11\x9d\xe3\xa9\x16\x31\xde\xde\x1d\x93\x3e\x0f\xa3\x26\x29\xaf\xe1\xb4\x2e\xb5\x91\xc2\x2f\x87\x33\x1e\x93\xcc\x08\x3c\x23\xf6\x4a\x6e\x5e\x58\x6f\xf3\x1c\xc0\x4e\x42\x3c\x56\xae\x3f\x6a\x73\x94\x6c\x48\xde\x4d\x85\xab\x00\x17\xba\x24\x45\x6d\x69\xb5\x9d\xca\x6d\x40\x3b\x64\xb0\x7c\x40\xd3\xb9\x0e\x12\x23\x21\x5e\x3f\x7e\x87\x6c\x67\x01\x11\x1e\x37\xe5\x17\x77\x08\x87\x31\x0c\xa8\x56\xf0\x09\xa0\xd6\x06\x54\x83\x5d\x94\xe6\x58\x7a\x43\x9d\xa5\xdb\x0a\x0c\x37\xd7\xc9\xd3\x7c\xa1\xd7\x03\xe1\xb3\x22\x76\x31\xad\xac\xaa\x79\x42\x1a\x1c\x43\x9d\x60\x34\x9a\xe5\x77\x41\xb7\xa8\xad\x09\xec\x29\x31\x23\x03\x0b\xf6\xba\xc0\x68\x9e\x53\x1c\xa7\xe7\x27\x18\x22\x3f\x9e\xa4\x3b\xec\xb0\xee\x9d\x9c\x1a\xb8\x45\xed\x1c\xae\x44\x3e\x3c\x5d\x4a\x9b\x1e\xde\x6d\xb3\x41\x7c\x3a\xce\x28\x11\x43\xf4\x2d\x85\xf5\x99\xb3\xb9\xd3\xd0\x5f\xa0\xed\x07\xc1\xec\x35\xff\xab\x03\x05\x16\x8b\x4e\x56\xe5\x8a\xfa\x06\x17\xf9\xa8\x6b\x1b\x5b\x20\x1d\xcc\xb0\x72\xb4\xce\xf0\xbb\x7b\x95\xc5\x2d\xae\xef\x9d\x9e\x74\x24\xa5\xc0\xf1\x48\xf9\xff\xe6\x0a\x5b\x23\xe0\xff\x82\xc7\x30\x99\x2a\xc9\xc1\x7f\x97\xf0\x65\xcf\x0a\xd5\x37\x7e\xac\xcb\x31\xd8\xbb\x92\x3b\xd2\x60\xea\x11\x9e\x6f\xa9\xbd\x69\x83\x48\x2d\x70\xd9\x21\x91\x02\x40\x2d\xc6\xa3\x49\x91\x93\xd0\xc1\xcd\x3e\xd2\xa6\x69\x21\xa9\x8d\xf6\x9b\x79\x14\x13\xf4\x97\x0b\xbc\xe0\x4f\x63\x9a\xf9\x09\xc6\x4f\x45\x60\xdb\x0a\xf6\x00\x3d\xc4\x62\x19\xe8\xad\x2b\x37\x2f\x8b\x5f\x81\xcf\xaa\x04\x1a\xb7\x1a\x34\x8c\x93\x1e\x8d\xfd\xbc\x40\x9c\x22\xd7\xee\x6e\x07\x62\x6e\x10\x4e\xc6\xcc\x7c\x6a\x41\x16\x17\x7f\x93\xaf\x16\xf1\x24\xf1\x96\xda\xb6\x19\xb6\xf6\x98\xc2\xd1\x91\x85\x8e\x96\x0c\x2e\x94\x7b\x51\xf3\xac\x48\x38\x75\x9c\x21\xfe\xf7\xeb\xae\x35\xda\x24\xf5\x5e\xbd\xa9\xb9\x87\x9a\xea\x17\xa6\xd8\xd9\x27\xde\x48\x7b\x17\x5f\xd7\xfa\xa2\x14\x38\xa2\x09\x23\xdd\xbb\xca\x72\xe6\x72\x69\x34\xbd\x6c\x21\xe8\x11\x80\x19\xf6\x5b\x38\x10\xa0\x7f\xa2\x7b\x1c\xba\x64\xd0\xf3\x9f\x0b\xfd\x49\xdc\xfa\xfd\xef\xe3\x79\xbd\xea\x82\xf3\x1a\x9c\x39\xf7\xe8\x1d\x29\x43\x37\xd1\x0f\x1e\x9d\x8b\x50\xeb\xa4\x58\xce\x7b\x75\x3d\x36\x96\x85\x38\x51\x3e\xdd\xb0\xe8\x45\x34\x41\x1c\x4a\xf3\xf0\x21\x46\x10\xee\x39\x01\xa0\xeb\xf3\x16\x17\x3c\xca\xf1\x5c\xd7\xee\x49\x6d\xbf\xc2\x46\x5e\xb8\x34\xdf\x62\x02\x9d\x62\x1f\xe9\x11\x82\x4d\x79\x87\xdf\x2d\x46\x34\x6b\x4d\xce\x1e\xce\x7d\x19\xd5\x51\x18\xc0\x37\xc9\x95\x51\x11\xd0\x7f\x1f\xc3\x62\xc7\x39\xf1\xea\x5b\x27\x5c\x71\xc0\xae\xbf\x59\x65\x5e\x2d\xef\x16\xe1\x23\xb3\xeb\x25\x26\xc3\xca\x5e\x83\xcb\x24\xd5\xb6\x8d\x7a\xc4\x0a\x67\x59\x33\x84\xc5\x63\xaf\xe0\xb5\x52\xad\xaf\x60\x80\x50\x35\xbe\x97\xb8\x06\x76\xad\xeb\x15\x76\x52\x08\x33"}, +{{0xb1,0xe4,0x7c,0xa3,0x1c,0x64,0xb6,0x8a,0xaf,0xaf,0xb4,0x43,0x51,0x2e,0x66,0x78,0x7c,0x65,0x92,0xf3,0x34,0xaa,0x78,0xfa,0x21,0x9a,0x3d,0x93,0xc3,0x3a,0x4a,0xb3,},{0x58,0x11,0x9b,0x38,0xe6,0xa1,0x48,0xa9,0x36,0xbc,0x5f,0x92,0xf4,0xf2,0x9b,0x98,0x2f,0xf2,0xcc,0xa6,0x4a,0x5a,0xff,0xa1,0x4c,0xa1,0xb6,0xa6,0x2f,0xe3,0x28,0xc4,},{0xdf,0xac,0x86,0xdf,0x58,0x6e,0xc3,0x4c,0x7c,0xfe,0xa5,0xd5,0xa6,0xcd,0x11,0x40,0xe5,0x0b,0x6b,0xf0,0x50,0xf8,0xe4,0x1a,0x19,0x0e,0xbf,0xd3,0xb1,0x43,0x2b,0x95,0xa5,0x7d,0x56,0x52,0xdb,0xae,0x8f,0x53,0xe0,0x37,0xae,0x32,0x6e,0x7f,0x18,0xcf,0xef,0x7c,0x77,0x9f,0x40,0x34,0x6f,0x7c,0x0d,0x86,0x44,0x61,0x05,0x93,0xf2,0x09,},"\x76\x7e\xc1\xb3\xda\xf2\x04\x38\x7f\x3f\xd3\xb2\x00\x10\x78\x1a\xfb\x1f\x38\xf6\x14\x47\x42\x13\x28\x7f\xff\x11\x30\x7f\x5f\xf5\xae\x7e\xc9\x45\xa2\xb9\xb4\x87\x00\x49\xd4\x53\x2f\x8f\x61\xc1\xa7\xb5\xf2\x11\xfc\xa2\xe6\x7c\x37\x4d\x96\x21\x9d\x8e\xa9\xde\x73\xf0\xe3\x87\x04\xfc\x94\xc0\xe9\xe7\x2f\x2e\x15\xda\xba\x3f\x88\xf7\x49\xb1\xed\x70\x26\x60\xdb\x1a\x35\x2a\x26\x67\xd4\xdf\xd4\xe0\x0a\x18\xef\xa4\xc6\x60\x9e\xe9\xc9\xa8\x8a\xda\xcb\xbb\x98\x5d\x3d\xe8\xdd\xd1\x7d\x4e\x4e\xb7\xcf\x74\xa1\xda\x91\xed\xb3\x90\x85\x2e\xa4\xcb\x9a\x42\x4f\x7f\xa2\x22\x9e\x08\x30\x33\xa3\x40\x59\x11\x7e\x5e\xfa\x7b\x66\x13\xd7\x5e\x58\xb7\x02\xc6\xce\xe5\xd0\x04\xe8\x59\x9b\x97\x50\x3a\x5f\x10\xc4\xc4\xe5\xb9\x57\x73\x71\xd3\xd0\x5b\x2d\xfb\xf7\xcb\xef\xe6\xd0\x92\xd6\x5c\xbd\x40\x51\x38\xd9\xb0\x4c\x51\x86\x23\x59\x83\xfa\xb6\xd4\xce\x85\xb6\x36\x27\x62\x06\xd7\x4a\x2e\xe7\xdb\x61\x64\xda\xc4\x7c\xce\x78\xf5\x0d\xb9\x9a\xf6\xac\x6e\x70\x64\xc1\x3a\xab\x79\x3b\xe8\x7e\x66\x28\x9c\x94\xa0\x9f\xb0\xa3\x1d\x97\x97\x1e\xdd\x74\xea\x9c\x0c\xe8\x74\xd2\xb7\xd6\xc4\xab\xae\xff\x07\xf8\x70\x22\x51\x51\x94\x6a\x5c\x47\x6f\x6b\x97\x89\x96\xb8\x7d\x8c\x98\x46\x06\xc7\x91\x28\x7d\xa6\xba\xd0\xaa\x44\xb0\x13\x0b\xe8\x86\x71\xa5\x56\xe2\xde\x35\xc4\xcb\x03\x8e\xe7\x81\x27\x35\x30\xac\xe0\xa1\x04\xc2\x78\x09\xae\xe0\x33\xc8\xbf\x90\x29\xd9\x0f\xe7\xba\x06\xaa\xa9\x4e\x16\xa5\x2c\x64\x3d\xfd\x92\xa7\x62\x4f\xbb\xee\x77\xa7\x15\x8b\x2c\xc1\x51\xbd\x3f\x61\xa1\xa7\x6f\x32\xb2\x84\x89\x30\x7a\xcf\x0d\xd8\xc2\x6c\xc4\xad\xbb\xb8\xde\x43\x0d\xb4\xe4\xf5\x83\x08\xb6\xab\x90\x45\x61\x11\xde\xac\x29\x78\x17\x2f\xe1\xfc\x0c\xe4\x98\x08\x8a\xdd\x4c\x31\xc2\x1f\x24\x27\x90\x25\xfe\xb4\x8c\xbb\x7a\x92\x0c\xff\x2d\x28\x71\x05\x87\xaf\x52\xc8\x44\xdb\x8a\x7a\xeb\x7d\xf1\x0d\x43\x41\x1a\x3c\x8e\xee\xbb\x40\x6d\x6e\xfc\xb1\x92\x48\x88\x7d\x45\x0b\x57\x3d\x90\x30\x5e\x1f\x23\x75\x3e\x89\x05\x11\xdc\xc7\x7c\x74\x0e\x31\x6a\xd7\xf5\x2d\x49\x02\x07\x3d\xb3\x99\x8e\x4e\x4a\xcc\x4e\x01\x88\x5b\xd1\x18\x8e\xcd\x61\x65\xae\xde\xd1\xe7\x78\x70\x2b\x6a\x6a\x79\xa9\x49\x99\x10\x2d\xf7\x20\x18\xf7\x92\xf8\xf1\x62\x00\x7e\x81\x2a\xef\x8f\x95\x6e\x12\x32\x82\xbb\xdb\xd0\xc3\x56\x12\xc2\xd3\x47\x3f\x94\x4c\x6d\x76\xbe\x9e\x86\xff\xfa\x46\xcc\xb1\xae\x13\x50\x5a\x4a\x81\xf3\x1b\x84\x26\xb8\xb6\x0d\xe8\xe8\xa7\xc1\x6d\x1e\x16\x65\xb2\x71\x43\x46\x65\xc4\x42\xa9\xc6\xa9\x77\xce\x98\x6f\x69\x93\xb7\x43\x9a\xf0\x3b\x40\x2e\xea\xff\xf1\x45\x6d\x15\x15\x26\xd9\xc5\x8f\x51\x5f\xd2\x48\x5e\x0c\xbb\x32\x4a\x50\x3a\x8d\x49\x13\x44\xcd\xb2\xaf\xf4\xc4\x1a\xa8\xe2\xed\x66\xe5\x80\x83\xbf\x0d\x2f\xbf\x48\x77\xc8\x5a\x4b\xcd\x6b\x9c\xbb\x82\x12\x42\xc9\x41\x47\xe5\xfd\x8b\x7d\xd7\x92\xad\x0a\x28\xd4\x9d\x41\x10\x0b\x43\x1b\xb4\xd8\xc7\x83\x3d\x85\x05\xdd\x9e\x26\x49\xf9\xca\x70\x51\xbe\x68\x71\x2e\xf3\x63\x71\x02\x03\x6b\x00\x26\x49\x47\x3c\xe2\x59\x67\x7d\x82\xc6\x06\x28\x95\xe1\x61\x92\x8b\x75\x2f\x13\xc9\x1a\x45\x95\x5e\x80\xf0\x07\xde\x69\x0e\xdf\x8a\x0e\x5e\xee\x44\x22\xe1\x62\xb9\xd2\xb4\xa9\x21\xd3\xa6\x48\x45\x79\x3a\xa2\x22\x9e\x9c\x23\x9e\x57\xa6\xb1\xa9\x0a\x52\x54\xc3\x51\x2f\x99\x34\x53\x15\xac\x7d\x34\x57\xf9\x15\x42\x96\xc6\x68\x22\xab\xe1\x84\xd6\x4e\x57\x2b\x9c\x38\x49\x29\x58\xe2\x1b\x02\x92\x67\x54\x10\xe7\x34\x8b\x2b\x71\x8a\x0b\x75\x92\xca\xee\x94\x58\x1a\x94\x8d\x2f\x41\xfa\x03\xc6\x1e"}, +{{0xfb,0xd5,0x5f,0xa7,0x43,0xc3,0xa5,0x91,0x0b,0x38,0x57,0xdd,0x0b,0x6a,0xa5,0x84,0xf3,0xb2,0x38,0xde,0x05,0x6b,0x76,0xab,0x76,0x17,0xae,0xb5,0x26,0x38,0xfe,0xf6,},{0xa7,0xa1,0x63,0xc4,0x18,0x3b,0xd8,0x4b,0x75,0x6d,0xf3,0xc8,0xaf,0xdf,0xb9,0xcd,0x5b,0x24,0x23,0x52,0xd9,0x49,0x9e,0xbd,0xab,0x90,0x78,0x5c,0x3b,0xd6,0xdb,0x2d,},{0xef,0xfb,0x29,0xda,0x69,0x85,0x97,0x1c,0x20,0x2e,0x24,0x50,0x30,0x1d,0x49,0x71,0x1b,0xed,0x25,0xfa,0xd8,0x5f,0x61,0x99,0xd1,0xeb,0x1e,0x71,0x91,0x4d,0x96,0x4c,0xbe,0x18,0xe3,0x4c,0xc3,0xe3,0x28,0x72,0xcd,0xec,0x02,0x6b,0xd1,0x19,0xa4,0x1c,0x1c,0x07,0xca,0x41,0xe8,0x2a,0xcb,0xa6,0x2f,0xb0,0xa7,0xc8,0x2a,0xed,0x80,0x0c,},"\xbf\x52\x52\xb2\xae\xca\x11\x63\x77\x1f\x76\x62\x78\x76\x80\x66\xf2\x19\x71\x35\x7e\xa7\x99\x61\x58\xa8\xd6\xe9\x08\xdd\x59\xb5\x99\x71\x34\x9f\xa1\x78\x82\xcb\x92\x24\xb9\x72\xd0\xff\xab\xe8\x55\x10\xdc\xf2\x5a\x9f\x9f\x9b\xde\xfa\xd2\xf4\xca\xdf\xbb\xda\xcc\x1f\xca\x9d\x94\x8c\xb5\x41\x2f\x47\x4c\xad\x23\xb5\xb9\x19\x9b\xf3\xc7\x37\x06\x41\x33\x9b\x75\x0e\x1f\x78\xc2\xad\xb4\x60\xaa\x5b\x21\xb1\xfa\x8f\x97\x71\x4a\xbb\x4e\xd5\xe9\xcb\x51\xd6\xde\x55\x81\x66\x18\xab\xd3\xfd\x2b\x28\x6b\xc1\x1c\x67\xba\x01\x12\x93\x73\xd4\x35\xb3\xe7\xe3\x91\xba\x37\x26\x14\xda\x83\x22\x87\x5e\x46\xa6\x75\xb6\x45\x15\x60\x24\xca\xd2\xdd\x13\xf9\xa0\x81\x61\x6b\xf1\x31\xa2\x43\x58\x89\x4e\x0e\xfa\x1d\x56\x64\x8f\xfb\x42\xef\xb5\x40\x31\xda\x7f\x37\xd1\x97\x61\x51\x55\xae\xdb\x69\xc4\xe7\x09\xc8\xbb\xbe\x7f\xbf\xcb\x59\x83\x47\xac\x5d\x0c\x63\x84\x07\x84\x7b\x28\x1c\xf1\x16\x43\x30\x97\xf5\x66\x21\x58\x71\x9f\xcd\xd3\x7b\xeb\x48\x92\x68\xce\x71\xde\x7d\x70\xed\x92\x5f\x74\x3f\xc6\x3a\x71\x5f\x7e\xee\x75\x49\xfd\xb9\x09\xcc\x45\x4c\x98\x8b\x30\xae\x4d\x77\xd6\x2f\x65\xa0\x7e\x2c\x8f\x93\x62\x38\x5d\x02\x8a\x60\x31\x08\xc9\x45\x87\x2f\x5e\x1a\x97\x41\x98\x78\xed\x49\x54\x2e\x28\x8e\xf0\x7b\x5c\x90\xf5\xc4\x15\x9e\x16\x23\x03\xd0\x80\xf6\xac\x2b\x05\x8d\xdc\xac\x60\x74\x6f\x9e\x1c\x9e\xc1\xdf\x8e\xda\x42\xd6\x27\x38\x58\x6d\x3f\xdd\x65\xdf\x55\xf4\x37\x4f\x32\x94\xe0\x86\x8d\x41\xef\x0b\xb1\xfd\x55\xe0\xcb\xf1\x95\xbb\xfc\xfc\xde\x5b\xdb\x41\xfa\xd9\xa0\x47\x7e\x4c\x90\xca\x27\xfa\x8c\xf5\x03\x36\x2a\x33\xfd\xec\xa5\xa4\xf0\xff\xea\x26\xe8\xd7\xe1\x34\xfa\xd3\xb1\xec\x3d\x05\x60\x55\xbb\xa5\xe6\x5d\x81\x15\x3e\xe8\x31\x87\x3b\x93\x8d\xf7\xd2\xc8\x3c\x2a\x52\xb3\xc2\x21\x82\x7f\x96\x1b\xd0\x08\x36\x22\x32\xd8\x82\xa0\x41\x2a\x04\x7a\xfd\xfb\x85\x97\xc8\x65\xa2\xaa\x2c\x2c\xf5\x18\x99\x34\xa8\x3e\xe6\xb7\x52\xa6\x26\x94\x1e\xdc\xe0\xc2\x0b\x6f\x7a\x69\xf1\xcf\x12\xf9\xa3\x31\xcd\xfa\x9e\xda\x24\xc8\xde\xfa\x76\x9c\xcc\xe2\xef\x74\x6c\x30\x7d\x8b\xb0\x48\x91\xfc\xef\xd4\x9a\xf3\xe6\xf9\x69\x91\xa7\xa2\x0f\x27\xb6\xc0\xaf\x12\x18\xbe\x31\x79\x1d\x1d\x02\x93\xe0\x81\xb9\x0a\xf3\xb9\x2e\xcb\x17\x5e\xc8\xc7\x89\xf7\xa8\x64\x2e\x04\x1e\xc3\xa6\x1a\xae\xfe\xf6\x2a\x80\x7d\x1a\x50\x54\xad\xf8\x32\x3b\xed\x94\x22\x41\x62\x37\x32\xa2\x05\x1d\xc0\x1f\x9a\x20\xa2\x9a\xa4\x8b\x3f\xdf\x26\x5d\x0b\xa6\xc1\x38\xfb\x57\x93\xe2\x87\x50\x02\xe7\xde\x3f\x5c\x3f\xf7\xe8\x3a\xd2\x7d\x11\x1c\x84\x8b\x7e\x6e\x2e\x5a\xd5\xf2\x8e\xb7\xc3\x63\xf9\x5f\x96\x0c\xbc\x42\x13\x36\xce\x98\x5f\x94\x6b\x05\x15\xb1\xbd\xd3\xa8\x32\xc3\xfe\x90\x3f\x7b\x44\xe2\x0c\x92\xea\x80\x82\x6f\xbf\x97\xe2\xa4\xfc\xaf\x2d\xb1\xa0\x86\x98\xdd\x62\xed\xd0\xa8\x45\x89\xd7\x46\x2c\x44\x7b\x4a\x89\x6f\xe0\x08\x60\x04\x24\x96\xbd\x51\xb1\x92\x5c\xb7\x9c\xc3\xb8\x29\x01\x6a\x4c\x7e\x62\x79\x0f\x80\x58\xc5\x46\xf2\x14\x5a\xaa\xef\x4d\x4b\x1e\x27\x3f\xf6\x13\x00\xf8\x00\x8e\x94\x6b\x62\x2f\x60\xe5\x05\xf5\xf6\x29\x0d\x51\xeb\x99\x7d\x20\xfc\x3f\xbb\x3e\x99\xed\xd6\x8f\xf5\xcc\xe9\xe8\xc2\x83\x88\x1c\x36\x4f\xf2\x15\xcb\x50\x04\x5e\x60\xf4\xa7\xee\x45\xb6\xc9\xd8\x64\x47\xf3\x81\x41\xd3\x42\xdb\xc5\x30\x8f\x8c\x66\xef\xc4\x7f\x7c\x45\xf6\xd2\x5e\x65\x64\x30\x9a\x86\x2d\xb9\x0f\x4d\xf3\x31\x78\x7e\xcd\xd8\x9d\x3a\xaa\x46\x05\x3e\x29\xf1\x02\x62\x4d\xdf\xe8\x0e\x8a\x3f\x99\x28\x7c\xec\x19\xfa\x83\xe4\x4d\x55\x7c\x04\x41"}, +{{0x5d,0x66,0xce,0xb7,0xc6,0xe5,0x8c,0xac,0x91,0xe2,0x88,0x27,0x91,0x70,0xe8,0x18,0xe7,0x87,0x18,0x0c,0x6b,0x42,0xdf,0xa1,0x68,0x78,0x7d,0xd0,0x7f,0x80,0x9f,0xa4,},{0xef,0xc9,0xb3,0x5d,0xb8,0x1f,0x34,0x61,0x98,0xa7,0xac,0xc6,0x9f,0x65,0xfd,0xfb,0xf4,0xc2,0x2e,0x68,0xdd,0x76,0x12,0xe3,0xb8,0xec,0x68,0xd3,0x78,0x55,0x3b,0x8d,},{0x6e,0xf2,0x64,0xab,0xf8,0xb0,0xe5,0xc2,0xd7,0x93,0xb2,0xc7,0x52,0x79,0x61,0x4a,0x39,0xc7,0x75,0xeb,0x2b,0xcc,0x08,0x91,0x06,0x7a,0xbc,0x61,0xf6,0xd6,0x44,0xa6,0x9f,0xf8,0xf8,0x14,0xa3,0x05,0x22,0xcc,0xa9,0x05,0x36,0xf0,0x12,0xc6,0x28,0x3a,0x76,0xc3,0x2b,0x89,0xee,0xe1,0xbd,0x9a,0x43,0x36,0xf4,0xfd,0xda,0xc8,0xdc,0x0b,},"\x94\xd7\x2f\x6d\xec\x4f\x7c\x92\x06\xb4\x15\x10\xce\x71\xa0\x29\x55\x60\x4f\x3c\x5d\xe8\xe4\x47\xd5\x87\x18\x65\xa7\x58\x98\xa4\xd2\x07\xa2\x6c\xf3\x3d\x10\xca\xf0\x5a\x0b\x6e\xd0\xd3\x89\xfe\xe9\xed\x49\x27\x50\x98\xa8\x8e\x1c\x0d\x83\x04\xe8\x1b\x40\x74\x21\x4c\x7a\x5c\xe1\x57\xeb\x26\x17\xef\x04\xe1\x32\x4b\xa9\x42\x12\x9f\xaf\x32\xc3\x1c\xb4\xaa\xe4\xa5\x91\x6c\x75\x08\x08\x72\x68\x56\xf7\x18\x0e\x57\x97\xed\xe4\x43\x62\xd7\x47\xd7\x0c\xec\x15\x9d\x3b\x6a\xce\xc6\x3a\x51\x4c\x7e\xf3\x1b\x2e\xcd\x16\xdb\x7f\xe6\x8e\xa9\xc5\xea\xd9\xd8\x70\x92\x18\x00\x34\x8f\x69\x54\x12\xf3\x09\x3e\x61\x98\x5a\x31\xea\xdb\x79\xb5\x9d\x91\xdd\x9a\x37\xf8\xd4\xef\x7a\x5d\xdf\x22\x3d\x4b\x24\x77\x4c\x2e\x44\xe3\xf2\x71\xff\xb8\x50\x0d\x59\x53\x81\xb3\xdf\x2e\x8e\x6b\x79\xee\x65\x53\x5a\x51\x9a\x43\xea\xa5\xe5\x2b\x25\x6c\x26\x43\x30\x5e\x31\x70\xcb\xe5\x76\x06\xa0\x54\x5f\x85\x86\x56\x5c\xfb\x75\xbf\x5e\x95\x64\xc6\x2a\xf0\x5f\x15\xee\x6e\x62\xaf\xee\xf8\xc2\xc7\xa9\xda\xe2\x35\xc9\xed\xd1\xd7\xc2\x5c\xf4\x9a\xdc\x03\x3e\xe7\xb5\x83\xf5\x18\xbc\x16\x8e\xa4\x88\x36\xb5\x0f\xfe\xdd\x20\x32\xb3\xf6\x30\xcc\x56\xda\xad\xd5\x13\xeb\xda\x86\x48\x23\x61\x0f\xc6\x7a\x72\xb9\xa7\xd8\x11\x71\x05\xc1\xc7\x1d\x85\xa9\x6b\x1d\x27\xa4\x41\xfa\x1e\x7c\x6c\xf8\x02\x33\xa4\x9f\xe0\xe7\x6a\x40\x27\x8d\x06\xe3\x43\x47\xd8\x7b\xe7\x7b\x98\xde\xd5\xe2\xa3\xea\x1a\xfb\x13\xbe\xe1\xe6\xcd\x6c\xa6\x3b\xe5\x4f\xcf\x88\xa2\x0c\xcb\x7a\x9f\xc3\x24\xbf\x61\x43\x20\x1b\x44\x48\x3b\xcc\x96\x40\x33\xda\xb7\x1c\xf8\xf2\xa5\x91\xfc\x05\x0d\x57\x24\xe9\x5a\xa5\x0d\x32\x89\x6e\xec\x0f\x3b\x34\x31\x1d\x2a\x99\x34\xe9\xf8\x52\x97\x7e\x25\x3f\x15\x30\x4c\xae\x24\x16\xc2\xc4\xfc\xd8\xf1\xfe\xcc\x3f\x1f\x64\xbb\x79\x75\x99\x29\xab\xb0\xe8\xe8\xf5\xf7\x29\x3d\x69\x1a\xf2\x2a\xbd\x3b\x2a\x67\x70\xb0\xcf\x14\x46\x08\xf2\xd6\x2c\xc7\xe5\x2b\xfe\x33\x3b\x2e\xd2\xde\x39\xb9\x9a\xfd\x37\xe3\xac\xf0\x7e\xda\x37\xdd\xf0\xdf\x02\x9b\xff\x2e\xc2\x25\x44\xb6\x0b\xd7\xdb\x23\x8d\xf1\x97\x5f\xfa\x00\x75\xa8\x2a\xbd\x8d\x6b\x05\xb2\x67\x18\x0b\x87\x0e\x21\xab\xf3\x69\x81\xae\x77\x68\xde\x53\x99\x3b\x30\x4f\x1c\x54\x53\x87\x2f\xdf\xa8\xed\xad\x45\xf8\x00\x1a\xa0\xe7\x34\x2b\x3b\x58\xec\x0f\x38\x9d\xcb\xc2\x71\xfb\x0f\x90\x00\x62\x87\x57\xab\xba\x58\xc0\x57\xe1\xa0\x89\x9f\x6f\xaf\x15\xf3\x74\x0f\x31\x43\xf5\xc0\xb7\xa9\x15\x96\x80\xde\x8c\x55\x72\x66\x44\x1b\x3b\x01\xca\xac\x12\xec\x27\x8f\x5a\x10\x25\xdf\x53\xed\xb6\x13\x4c\x96\x66\x3a\x96\x66\xae\x3b\xaa\x90\xfc\x83\x51\x11\xef\x05\x1b\xd9\x12\xf6\x79\x67\x44\x91\x13\xb6\xa8\x5f\x71\xdf\x8c\x60\x37\x72\x4e\xb8\xfc\x7d\x83\x19\xbc\x03\x85\xbe\x9b\x0e\x99\xe9\x5f\x9a\xed\xca\xe8\xd4\x5a\x51\x44\x76\xf0\x5b\xcd\x72\x35\xc0\x13\xeb\xc3\xae\xa9\x12\x3c\x67\xaa\x6f\x3b\x79\xc8\x5e\xa5\xdb\x15\x9e\xef\xad\xfb\x75\xa5\x0a\xc6\xb9\x5b\x49\x6b\x55\x72\x58\x1a\x76\x11\x2f\xf6\xdb\x26\x3f\xc1\x4c\x58\x18\xaa\xd5\xbc\xa3\xb2\xcb\x3a\xc8\x11\x6d\x42\x94\x82\x78\x1e\x06\xf6\x1e\x75\x63\xe6\x50\x5e\x51\xc8\xff\x99\x8b\xf8\x4a\xed\xb5\x20\x2e\x2f\x9f\xf4\xc2\x68\x98\x20\x29\x6c\xc6\x96\x03\x09\x1b\x8b\x81\x8f\xbe\xb2\xaf\x5f\x4c\x57\x06\x0d\x98\xc1\xa9\x04\x84\x3a\x70\xbf\x97\x5b\x3c\x3c\xa6\x03\x1a\x4c\xad\x5b\x4b\xbf\xba\x7e\x9b\x47\x49\x1a\xb7\x40\xd9\xeb\xe4\x1d\x76\x88\x10\xcb\x8c\xc5\x1a\x93\x7f\x7e\x3b\x22\xe3\xcf\x07\xce\xae\x0c\xe2\x08\x31\x49\x5a\xfc\xdd\x8c\x1a\x98"}, +{{0x62,0xed,0x86,0x82,0xbd,0x3a,0xb3,0x96,0x6e,0xba,0x3b,0xff,0xb7,0x75,0xa3,0x18,0xa0,0x3d,0x99,0x93,0x19,0x79,0xe9,0x9f,0xeb,0x2d,0xdb,0xd6,0x94,0x55,0xa0,0xef,},{0xd3,0x2a,0xda,0x17,0x8b,0x3e,0xc7,0x70,0x0c,0x47,0xdd,0x6d,0x36,0x53,0x22,0x03,0x3f,0xe4,0x31,0xc3,0x02,0xb4,0x6f,0x8d,0x58,0x79,0x8e,0xd8,0x33,0x71,0x56,0x6b,},{0x3d,0xa8,0xd1,0x4d,0xc4,0xe7,0x1f,0xe6,0xc3,0x2e,0xde,0x46,0x37,0x88,0xe4,0x1b,0x82,0x6b,0x4e,0x21,0x60,0xba,0x10,0xc9,0x5f,0x1c,0x8a,0x27,0x49,0xaa,0xd8,0xf1,0x2e,0x98,0xae,0x24,0x68,0x30,0x3b,0xaf,0x69,0x08,0xbd,0xb3,0x5e,0xf3,0x8a,0x5e,0xcd,0x77,0x74,0x1e,0x72,0xee,0x3a,0x42,0x7f,0xd9,0x04,0xda,0xe6,0x6f,0xcf,0x03,},"\x9e\xb1\x3b\xc7\xfa\xcf\x51\xa1\x80\x54\x1e\xc1\xdc\x5f\x5a\xcb\x14\x8c\x8d\x5e\xad\xcd\x2c\x4e\xf0\x68\xbc\xdd\x11\xb3\x49\x25\xea\xbf\xaf\xab\xfe\x82\xa2\x84\xbc\xba\xee\x13\x81\x15\x2a\xf8\xe5\xe0\x9f\x03\x7c\xf1\xbb\x64\x84\xac\x18\xe3\x73\x59\xbf\xaa\x4c\x87\xaa\x07\xd3\xd1\x4e\xd0\x89\xb0\x53\x91\x0d\x1f\xa4\x73\xf7\xbc\xe1\x43\xe2\xa5\x9c\x4d\xaf\x99\xb6\xc6\xe4\xe9\x29\x1d\x97\xc8\x64\x71\x2a\xf3\xea\xba\x53\xce\x25\x17\xa4\xf7\x5c\xd7\xec\xf2\x78\xf3\x4e\x22\xb7\xdf\xfd\x08\x8f\xa5\xec\xad\xc0\xdd\x22\x13\x5e\x42\xa5\x36\xc6\x84\xf2\x19\x5d\x31\x5f\x69\x24\x57\x1e\x46\x3f\x5c\xfc\x11\xb9\xf9\xd0\x5a\x7e\xa1\x1b\x98\xa1\x69\xa1\xe3\x93\x60\x97\x3c\x50\xad\x45\xc7\x49\x1b\x57\x13\x8e\xc0\x50\xf4\x3c\xbd\x5d\x17\xeb\x3f\xe0\x01\x3e\x3d\x28\xd5\x26\x05\x4e\x07\x63\x31\x52\x24\x6f\x16\x55\x4f\x30\x54\x74\x9e\xea\x68\x7b\x9c\x37\x1b\x40\x9c\xd3\xec\xef\xb1\x11\xa1\xd6\x00\x40\x73\x44\xe6\xd6\xec\x38\xc6\x0f\x6e\x54\x5a\x92\x38\x2e\x46\xc4\xd1\x13\x12\x5d\xbe\x5b\x98\x26\xe1\x27\xf1\x01\x81\xa3\x5a\xcf\xff\x28\xab\x37\x64\xca\x7f\x23\x8f\xf4\x79\xfd\xbc\x45\xb7\xa2\xad\x0f\xf5\x38\xc8\xac\xd0\x01\x8d\x44\x70\xfe\xbc\xc6\xa3\x07\x65\x1c\xb5\x83\x2f\x32\x6b\x19\x24\x1b\xe9\x86\x7e\x4e\xca\x6a\xe3\x6f\x0e\x2d\x83\xfd\x77\xb9\x72\x02\xb3\x64\x71\x6e\x36\xd1\x89\x5a\x36\x85\x3e\x7e\x76\xe8\x8f\x62\xdb\xbf\x77\x26\xc2\x18\x05\x69\xc6\x66\x73\x83\x7a\xd7\x2f\xf9\x36\xcf\x0e\x2f\xdb\x9e\xc6\xaf\xcc\x79\xf8\x82\x9e\x15\x7f\x95\x22\x88\xf4\xe0\x0d\x04\x10\xa7\x22\x53\xbf\x60\x5e\xdd\xce\xb0\x14\x40\xde\xe5\xdd\x32\xb5\xa8\x03\x43\x9f\x03\x8c\x06\xaf\x1c\x90\xb2\x7b\x5f\xe9\x84\x3c\x27\xae\x76\x60\x9c\xbf\x83\x28\x35\xc0\xe3\xc4\xbb\x59\x97\x6c\xce\xde\x44\x87\x86\xd9\x1e\x43\x8e\x07\x75\xc0\x6a\x92\xd0\xf0\xb8\xdc\x0e\xf6\x82\x60\xf7\xdd\x9e\x68\x71\xc4\xd0\xc0\xc0\x94\x63\x85\x26\x15\x21\x85\x16\xf4\xa6\xde\xbf\xdb\x46\x27\x3b\x28\x33\x82\xcd\x9c\xa7\x44\xab\xf9\xfd\x43\x91\x94\xb8\xcf\x1b\xdb\xb3\x17\x5c\xa9\xc5\x7a\x1c\x37\x3c\x41\xfc\xe9\x2b\xd5\xfc\x01\x2b\x19\xa0\x69\x8a\xef\x37\xba\xf8\x06\xae\x09\xad\xd8\xcb\x97\x2a\x9e\xf9\xa7\xa5\xa9\xb1\xfd\x9a\x41\xd8\x54\xc3\x0c\xca\x13\x96\x14\x0e\x20\xc2\xb9\x86\x54\xfe\x6e\x51\x1b\x62\x6a\x43\x91\x5b\x22\xfb\x2d\xad\x74\x7b\xa7\xfe\x74\x60\xd8\xce\xbb\x20\x06\xfe\xa1\x9b\x32\x84\xb0\x9c\x06\xa6\xf5\x2f\x17\x9a\x32\xbe\xb5\x63\x57\xb9\x29\xa6\x59\xf0\xfe\x6a\x26\xb6\x97\x03\x3d\xef\x58\xba\x60\x3f\x43\x0f\x74\xaa\x35\x07\x09\x81\xdb\x74\xcc\xf1\x91\x90\xa1\xfb\x05\x14\x4e\xc0\xa0\x9a\x51\xe5\x47\x65\x06\x97\x30\xb0\x9a\x7a\x23\x31\xff\xb3\xde\x2a\x7e\x02\xc5\xe1\x84\xda\x40\x13\xdf\xe9\x37\xc3\x71\x11\x75\x24\xf7\xb2\x10\xba\x60\xe2\x69\x2d\xcd\xce\xf3\x6a\xb2\x27\xb4\xc4\xf0\x2a\x9f\x48\x89\x72\xb8\x47\xf0\xd6\xb5\x9d\x02\xee\x54\xfe\xde\x88\x21\xdb\x6c\xf7\x31\xcc\x8a\xc8\x95\x35\x0a\xc5\xcd\x4d\x6b\xaa\x3a\xd0\x36\xf0\x6f\x20\xd1\x0a\x14\x0c\x4a\xd3\xd1\x0c\xa9\x85\x53\x2e\x31\x60\x46\x27\x73\x38\x5a\x2e\xb5\xe4\x64\xd5\x28\xe1\xe5\x9c\x29\xf6\x6b\x3d\xe5\x9e\x9e\xa2\x8a\xf3\xf9\x7b\xfc\x55\x89\x03\x57\x52\xa5\xa5\x52\x3d\xec\xd2\xdf\xf0\x1f\xc0\x0f\xf3\x1b\x30\x15\x2f\xf5\xda\xfa\x33\x1c\x6a\xb1\x58\x73\xaf\x41\xaa\x96\x0a\xac\xe7\xd2\xcb\x4f\x95\xc2\x3d\xf4\x4b\x9e\x6c\x6e\x2f\x86\x78\x8a\x87\x2f\xd3\xa5\xcb\xe4\xac\xc9\x58\x10\xda\xa0\x9d\xcc\x1d\xf9\x33\x46\x5e\xf0\x40\xc5\x3d\x9d\x95\x9f\x9d\xad"}, +{{0x4e,0x57,0xf0,0x31,0x1f,0xff,0x0e,0x5d,0x53,0x88,0x49,0xb1,0x21,0x6f,0x69,0x5b,0x1a,0x52,0x77,0x94,0x17,0x08,0x20,0x4d,0xb2,0xf0,0xc1,0x5b,0x3c,0x73,0xc8,0x2a,},{0xe3,0x37,0x1f,0xe2,0x36,0xad,0x2f,0x6f,0x42,0xf9,0xe1,0xfa,0x4e,0x1e,0xda,0x2c,0x3e,0x29,0xc3,0x6c,0x8a,0xd2,0x21,0x8a,0x3c,0x03,0x79,0x82,0xf0,0xb5,0x79,0xec,},{0x4f,0xdc,0x7b,0x6e,0x28,0x27,0xf6,0x4b,0xa3,0xc0,0x33,0xc7,0xfb,0x6d,0x1b,0x35,0xdd,0x68,0x0f,0x53,0x29,0x99,0xa0,0xd7,0x7a,0xeb,0x27,0x6c,0x31,0xbd,0x9e,0x39,0xc6,0x70,0x97,0x8b,0xe4,0x72,0x43,0xc1,0x13,0x22,0x3a,0x57,0xaa,0x10,0x23,0x31,0x50,0x67,0x8b,0x40,0xdb,0x78,0x59,0x1c,0x04,0xd0,0x8d,0xf5,0x7a,0x70,0xa2,0x09,},"\x05\x2a\x1f\x41\xeb\xfd\x4b\xf6\x5e\xfb\x0e\xc8\xe7\x4d\xd7\xb3\x06\x5e\x9c\x48\x2c\x49\xb9\x92\x62\xe6\xdf\xa8\x40\x7d\x9e\x31\xed\x34\xd2\x29\xba\x41\xfc\x49\xa9\x4a\x13\x09\xf9\x90\xa9\x9c\xb9\x90\x2f\xb8\x4f\x4e\xde\x91\xbb\x64\x71\x45\x64\xa9\x13\xd5\x74\xd4\xa3\xc2\x86\xf0\xa1\x92\xa7\x8c\xe2\xd5\x5a\xae\x5c\x9f\xb0\x57\xff\x36\x12\x00\x18\xb2\xa8\xb5\x4d\x98\x08\x55\x37\xea\x64\xae\xa9\x99\xd5\x32\x1c\x78\x80\xb3\x6a\xb4\x30\x18\xea\x2c\x92\xa5\xe6\x83\x50\xd3\xde\x85\x26\xe2\xc8\xbc\x91\x41\xf4\x34\x9a\x18\xa3\x4f\x21\xde\x0a\xbb\xf2\x93\x09\x87\x56\x7f\x0a\xaf\x8e\xb1\x91\x45\x58\x0d\x71\x30\x6c\xe8\xa6\x9e\x79\xf8\xee\xa2\x6c\xfa\x0b\x8b\xeb\x49\xcc\x5a\xa2\xbc\x77\xb7\x97\xd4\xf8\xd5\x03\x26\xff\xb9\x37\x39\x9e\x94\xfd\xec\x85\xe1\x92\xf1\x27\x2a\x80\xe9\xa0\xeb\xba\xf5\xd0\x1f\x1b\x97\x06\x08\x02\xbd\x4a\xf3\x4c\x0f\x7d\x7e\x98\x54\x3f\x9d\x66\xd6\x0e\x0e\x6b\xc0\xbf\x9c\x99\x0b\xe3\x1e\xea\x19\x78\xff\xd1\x67\x33\xa8\xab\xe4\x95\x58\xb3\xad\xd0\xdc\xe6\xde\xfd\x64\xdc\x04\x3f\x15\x19\xb1\xe9\xbe\x66\xe0\x6e\x41\xec\xab\x16\x8c\x83\x39\xa8\x5e\x0b\x91\x38\x18\x64\x4e\xa7\xc5\x33\x44\x68\xfd\x71\x96\xa0\x1e\x1d\x4c\xe8\xdd\x1e\x7e\xe3\x13\xdd\x53\x50\xb8\xdc\xe4\xf5\xd7\xa6\xac\x09\x85\x7c\x4d\x3d\x0f\x10\xa3\xd9\x06\x26\x09\x75\x45\x92\xad\x10\x77\xb2\xe2\x09\x6f\xc9\xe5\xb1\x97\x8c\x98\xb5\x66\x0d\xdf\x51\xb4\x6e\xde\x9f\x9d\xcd\x41\xb2\xef\x44\xe7\x9f\x6d\xaf\xf7\xd3\x62\x68\x70\xe2\x24\x3c\xaf\xb2\xf4\x36\x79\x39\x10\x9e\xd9\xc0\x14\x84\xb7\x9e\xaa\x30\xa1\x89\x1e\xa1\x8f\x98\x4e\x16\x1d\xcd\xd1\xbd\xa3\x71\x34\xbf\x67\x35\xd2\xb2\x14\x9b\x48\x98\xda\xcb\xfd\xa6\x1e\x60\x02\xd7\x2a\x6f\xc5\xd2\x1f\x10\x98\x21\x32\x31\x13\x2d\x56\xdf\x68\xd6\xa9\xbf\xdf\x4e\xdd\xc0\x52\x4d\xb8\xfd\x8f\x24\x88\x52\x04\x9a\x68\x25\xa5\xed\xd2\x36\x0c\x00\x9a\xf2\x4f\x0a\x94\xc5\x07\x9d\xdf\x6f\xe7\x96\x94\x5f\xf9\x84\xaa\xc3\x64\x11\xce\x80\xd9\x87\xc6\xed\x67\xb6\xb0\xdd\xb6\xd4\x17\xf6\xe8\x09\x99\x1e\x72\x9d\x14\x7d\xd0\xd2\x1a\x09\x32\x41\x36\x3c\xf4\xef\x3b\x8e\x3b\xa0\x2d\x48\x66\x33\xb6\xb2\x17\xf5\x49\x3e\x2e\x43\x2b\x8c\x2e\x27\xd0\x0c\x5b\x56\xc9\xb6\x5f\x9a\xed\x49\xce\x93\xd7\x7e\x7d\x0b\xf5\xf9\x2f\x92\xf5\xbb\x4b\x59\x5d\x66\xf8\x87\xa4\x88\x01\x33\xf9\x70\x46\x3a\xb8\xb7\xf3\xd8\xc7\x94\xc0\x40\x6e\x88\xe3\xea\xb9\xae\x65\xf1\xa1\x85\xd6\xe3\x9e\x2d\xd6\xab\xb8\xa9\x3d\x2a\xc4\xb9\x20\x83\x98\xda\xb8\x9d\xbc\x07\xa4\x1a\x50\x26\x40\x26\x41\x2d\xa0\x22\xb5\x8f\x48\x9d\x4d\xba\x31\xfb\x88\x2f\xec\xb1\xff\x8c\xa1\x82\x0d\xda\x18\x65\xaf\x15\x51\xe4\x6c\xd6\x18\xb4\x4c\x4e\x6e\xb3\x03\x7a\x93\x33\xfd\xcc\xef\x4b\x89\x51\x89\xe4\x39\x0e\x93\x14\x5d\x26\x4c\xa5\xf4\x52\x02\xa3\xeb\x28\x53\x59\x3f\xee\xd6\xc6\x6d\xbb\x28\x8f\xf3\xa3\xc0\xfa\x83\x2b\x2a\xa7\xe5\x29\xb5\x56\x88\x97\xb3\x14\x94\x02\xa9\x07\xe7\x41\xe1\x01\x1c\xe0\x73\x1c\x91\x5f\x91\x44\x6a\xa0\xd5\xca\xf0\x59\x5f\x18\x16\x43\x4f\xa4\x57\x6d\xb3\xbc\x31\xe1\x0c\xc2\xaf\x33\xf6\x13\xf0\x3c\xa7\xb9\x49\x1a\x0a\x34\x05\x25\x27\x1a\xb5\x37\xf6\x2a\x11\xa8\x4d\xa0\x1c\x7f\x55\x81\xad\x57\x38\xc3\x72\xb5\x33\x5b\xab\x9b\x2b\x9d\xc2\xfe\x91\xe9\x33\x30\x4d\x94\x01\xba\x8e\x1c\xe8\xdc\x55\xc4\xfb\x46\x6b\x3a\x8e\xd7\xf5\x3a\x12\x2b\x83\x81\xd8\xf2\x90\x47\xd7\x26\x4d\x06\xfb\x51\xec\x3e\x70\x07\x1f\x27\x36\xa4\xe7\xe1\x53\x7a\x52\xfa\x25\x6a\x04\xee\x86\xfa\xd2\x7a\xd2\xd2\x8a\x9b\x36\x29"}, +{{0x39,0xf0,0x55,0x6b,0x1c,0x5d,0xca,0xb3,0x87,0x10,0x41,0x81,0xbb,0x30,0x4d,0xe0,0xcf,0x81,0x59,0x20,0xb9,0x72,0xe8,0x71,0xd5,0xf0,0xfb,0x41,0x6d,0x8e,0x61,0x6a,},{0xd8,0x5f,0xb7,0x6e,0x78,0xc3,0xd5,0xbb,0x7c,0xa6,0xb0,0x5b,0x31,0x01,0x91,0x82,0x1a,0x4a,0x7d,0x2d,0x9b,0xdf,0x02,0x29,0x2c,0xc7,0xae,0xa5,0x64,0x2e,0x48,0x19,},{0x01,0x66,0xaf,0xed,0x5a,0x8f,0x7c,0x3f,0x7a,0xd6,0xf3,0xfd,0xd2,0x93,0x8e,0xff,0x00,0x89,0x8e,0xab,0x81,0x5c,0x54,0x55,0xac,0x90,0xfb,0x51,0xf6,0xe1,0x85,0x4f,0x0c,0x07,0x53,0x19,0x4b,0x76,0x29,0x59,0x4c,0xc1,0x27,0x1b,0x00,0x34,0x31,0x22,0x1c,0x57,0x4b,0x0c,0x0d,0x19,0x08,0x2f,0xee,0xda,0x51,0xb0,0x84,0xae,0x5e,0x03,},"\xa8\xd0\x34\xe1\x70\xfc\x22\xb5\x7a\x44\xaa\x62\x69\xed\x1f\x01\xcb\xa8\x01\xf3\x98\xdf\x1a\xdf\xe7\xdf\x04\x4d\x5f\xa4\x68\xbb\xfa\x8a\xf4\x74\x9a\xb5\x0d\x24\xd6\x2e\x31\x3a\xc0\xe7\x3a\x64\xb4\x28\x2b\x74\x62\x6a\xf2\xb4\xa4\xb5\x4c\x27\x4e\x5a\x6b\xc2\x80\xb6\xdc\x25\xdc\xfe\x07\x81\x4c\x9c\x81\x6d\x2f\x9e\x36\xc0\x5b\x9b\xfe\xdf\xf7\xc6\xb0\x3c\xdd\xeb\xd4\x73\x5e\x09\x93\xd3\xc3\xfd\xc6\x54\x04\x43\xc6\x00\x5e\x90\x0b\x40\x35\xe1\x40\x8a\x85\x01\x6a\xa1\xb8\x92\x02\x99\x0e\x5d\x84\xed\x99\x81\xc2\x9b\x77\x20\x6d\x7c\x11\x30\x52\xa2\x02\x98\x12\xc6\xea\x13\xaa\xe8\xbe\x0a\xca\x7a\x33\x06\xbf\x61\x72\x42\x29\x8e\x68\xbe\xcd\x0d\x5d\x16\xc8\x88\x7f\xd1\x95\x0b\x77\x85\xa4\x6b\xb0\x22\xb3\x9f\x76\x07\xcd\x89\x13\x71\x8b\x30\x17\xfc\x3f\x86\xd6\x93\x3f\x75\xee\xc5\x19\x1a\xd1\xf1\x98\x9a\x8d\x26\x17\x86\xf5\x6b\xe4\xa9\x88\x37\x0d\xb8\x29\x61\xa9\xfc\xc9\x53\x54\x2e\x51\xc2\xe0\x86\xdb\x0e\x02\xb4\xfc\x34\x66\x94\xab\xd9\x05\x9d\x5b\x11\x72\x26\x47\x66\x9e\x7f\x17\xb7\x45\xa6\x0b\x02\xf7\x33\x9f\xcc\x99\xbc\x35\xd5\x9f\xd0\xb9\x8b\x60\xc3\x14\xab\xd4\xbf\x8a\xa4\xb7\xea\xe0\x9d\xd0\x09\x7a\xcb\x91\x89\xf0\x2c\xf8\x5a\x25\x1a\xc9\x2a\xaf\x69\x1b\x15\xcd\x4a\x33\xb5\x8d\x76\x63\xab\xd0\xb0\x44\x43\x33\x04\x4a\xf5\xce\x20\xfd\x71\xcb\xaf\xfc\x0d\x29\x83\x58\x19\xf4\x92\x93\xfc\x26\xe7\xf9\x78\x7f\xc3\x68\xc4\xd3\x5c\xae\x92\x74\x7f\x21\xca\x1f\x3e\xfd\x87\xa0\xd8\x10\x41\x99\x41\x64\x82\xd0\x7b\xfe\xc1\x28\x1c\x66\xf5\x65\x28\x5b\xf6\x72\xd5\xe7\x48\x64\x00\x66\x0c\x01\x75\x55\xe9\xfa\x2b\xf6\xa4\xe7\x02\x7f\x0e\x7e\x5f\x44\x3e\xd6\x58\xb7\x5b\x59\x06\x12\xab\xde\x0d\x80\xd1\xa2\x6c\xb8\xbd\xe7\x6b\x99\x6e\xff\x6a\x74\xe3\xda\xfc\x59\xeb\x1b\x58\x4f\x45\x97\xa2\x39\xcd\x83\x9f\xa1\xf1\xb7\xbd\xa1\xa2\x4d\x15\x0c\x4e\x24\xb9\x1c\xec\x01\xee\x53\xa3\xac\x85\x2a\x91\x2d\xe1\x95\xa3\xc2\x9d\xd7\x07\x9a\xa7\xe8\x8a\xa8\x1e\x9d\x31\xb8\xfc\xcd\x43\x5e\xda\x11\x3c\x3f\x82\x45\x8b\x7f\x79\x33\x57\x2b\x77\x67\x53\xc9\x22\x40\xcc\x03\x61\x58\xa4\xba\x0e\x56\xef\xed\x53\xec\xb5\x3f\xc0\x93\xfe\xad\x14\x34\x34\x85\xae\x5d\x91\x05\xbb\x16\x3f\x26\x25\x14\xe4\x8b\xe7\x41\x59\xc9\xfa\xbc\xb7\x1d\x1a\x42\x80\xd9\xed\x70\xd7\xe4\x2b\x75\xf7\xfd\xad\xd0\x2d\x69\x19\x8f\x5f\x46\x5b\xf6\x04\xcb\x42\x54\x41\x7b\xac\x37\x14\xb3\xa9\x9e\x6f\x1a\xce\xc9\xe3\xb3\xd0\x97\xf9\x72\xfb\xc3\x6f\x2e\xda\x39\x26\xd5\x61\x12\xd4\xe9\x09\x7d\x89\xbd\xc3\x59\x37\xb9\xa3\x15\x8e\x7c\xdd\x5d\xa4\x01\xe1\x80\xd3\xed\xe6\xb1\xff\x02\x86\x41\x92\xeb\x72\x97\x81\x53\x4f\x49\x64\xdd\xf2\xaf\x11\x80\x0d\x8b\x5b\x6d\x01\xb2\x09\xaa\x33\x69\x36\x6c\x19\xa2\x8c\x79\xa8\x7d\x21\x74\xec\x22\xfb\x14\x89\xa6\x75\x5c\x34\x8a\x99\x6d\x0a\xa5\x6e\x0f\x60\xd5\x8e\x26\xbe\xfa\x23\xa8\x6b\xef\x4e\x35\x29\x51\x2e\x30\xa9\xd1\xc5\xe4\x88\x50\x18\xcb\x97\xae\xb7\xc9\x3c\x5c\x41\xca\xa3\x42\x36\x57\x5c\x22\x6f\x3b\x23\x5e\xdd\xba\x36\x4e\x28\x5b\x6e\x35\x27\x07\xbb\xb3\xb3\x39\xbb\xf2\xa6\x3a\x9c\xb9\xbd\x33\x3a\x77\xe7\x9b\xd5\x8a\x48\xe1\x4c\xe5\x88\x6e\xd0\xcd\x07\xc2\xd1\x65\xa8\x1b\x5e\x6a\x31\xa8\xae\x78\x06\xbc\xf2\xe0\xc4\xec\x29\xa9\x67\x72\x5e\x57\x7f\x17\x41\xee\x68\xf3\x45\xf5\xf7\xab\x0f\xad\x31\xc8\xb4\xb1\x8b\x43\x1c\x49\x77\xd5\xc5\x84\x00\x4b\x45\xf7\xcd\x19\x61\xaf\xfe\x87\x38\xe2\x4c\x38\x26\x10\xef\xe9\x98\x35\x3d\x7e\xba\xf9\x19\xb2\x79\xbb\xb6\x91\xc3\x05\x2b\x8b\x2c\x5f\x09\x80\x8e\xf3\xa6"}, +{{0xba,0xb3,0xff,0x7a,0x44,0x48,0xd8,0xa0,0x3d,0x8a,0xcf,0xdb,0x91,0x3f,0x77,0xfe,0x77,0x80,0x43,0x95,0xc3,0xe5,0x4e,0xc2,0x35,0x11,0x79,0x27,0xe3,0x2b,0x50,0xd5,},{0x54,0x97,0x5e,0x35,0xe5,0xb1,0xd0,0x32,0x3f,0x2d,0x6f,0xb5,0xc6,0x15,0x8b,0xf6,0x65,0x4b,0x08,0x4f,0x76,0xbb,0xdc,0xfd,0x72,0x34,0x92,0x29,0xe8,0xe4,0xa6,0xe8,},{0xd6,0xb4,0x13,0x5f,0xc7,0xac,0xb3,0xd7,0xcd,0xf9,0x87,0x89,0x6d,0x91,0xb8,0xa9,0x0d,0xb5,0x84,0xd8,0x93,0x3a,0x6f,0x30,0x29,0xe3,0x26,0x1e,0xc1,0xc3,0x90,0xcb,0xac,0xfa,0xaf,0xef,0xf4,0x43,0xb6,0xda,0x4f,0xdb,0x1d,0x84,0xc6,0x4a,0x54,0x56,0x0f,0xef,0xfa,0x2f,0x1c,0x7a,0x91,0xbd,0xe9,0x73,0x02,0x22,0x92,0x3b,0x67,0x03,},"\xb6\x47\xb6\x7c\xf0\x1c\x2c\xac\xc3\x9d\xe5\x96\x9e\x19\x9b\xe6\xd9\x32\x01\x67\xa4\xce\xbb\xf1\x62\x59\x50\xb1\xe6\xb7\xad\xf5\xca\x24\xd1\x34\x95\x68\x86\x5f\xbb\xfd\x90\xf5\x13\xf0\x5f\x79\xf7\x0a\x63\xa2\x38\x73\xdc\x7a\x19\x5d\x4b\x28\x5a\x08\xf3\x0e\xe0\x61\xd0\xb8\xe6\xb4\xd6\xbf\x9b\x2e\xcf\x2c\x69\xf3\xd5\xa0\x7a\x67\x30\x53\x7c\xca\x4a\x4e\x4c\x7e\xe6\x84\x70\x2b\xff\x88\x3f\xab\x8b\xca\xf8\x93\x11\xc5\x49\x8b\xcc\xb5\xa0\xf7\xc8\xd4\x9b\x54\xf4\x82\xff\xfb\xca\x6e\x7d\xa2\x62\x45\x2b\xa5\x9a\x57\xa6\x87\x9d\x81\xb7\x3c\xd7\xad\xf7\x2a\x3b\xe2\x8a\x37\x3c\xd6\x33\x10\x40\x84\x61\xc2\x1b\x90\x7f\x63\xe0\x86\xb2\x92\xff\x02\x83\x3e\x8a\x2f\x46\xad\xbd\x67\x1d\x02\xb0\x3a\x69\xac\xa2\xe1\x1d\x28\x7c\x52\x2a\x95\x45\x20\x44\x2e\xce\xfa\xa9\x05\xdb\xfc\xc8\x25\x4c\x58\xc3\x95\x4a\x89\xbf\x56\xcb\xe0\x1a\xd5\x63\x19\x71\xeb\x39\xeb\x43\x2a\x85\x4e\x69\x19\x29\xdf\x7e\x48\xb9\x00\xca\x6e\x74\x0a\xcc\xf5\x78\xb3\x17\x95\xb4\x9a\x6c\xa7\x74\xbd\x8b\x99\x31\x06\xa9\xc4\x94\x8c\x18\x71\x49\x48\x31\x59\x90\xa5\xf1\x91\x69\x24\x20\xf2\x89\x32\x8a\xb7\x13\xec\x19\xb7\xea\x89\x4d\x16\xe6\x47\x61\x00\x87\x1c\xf3\x16\x8e\x4f\x93\x5b\x55\x05\xd1\xed\x5b\x0a\xa2\x9b\xe3\x6f\xa3\xa3\x46\xac\x3e\x76\xf1\x43\xc4\x6c\xa6\x91\x23\xb7\x9c\x36\x39\x9a\x0d\x2e\xd3\x02\x77\x24\x94\xad\xf4\x42\xbb\xaf\xbc\x4d\x01\x53\x26\x92\xc7\x85\x9d\xf0\x4d\x2c\xa7\x8b\xa5\x5d\x77\xfd\xf3\xe5\xad\x99\x37\x86\xa2\x4c\xff\x21\x99\xbb\x49\x38\x78\x73\xcc\x41\x4b\x4c\xf1\x13\x7a\xbb\x7e\x94\xae\x3d\xdb\xf9\x7f\x53\x4a\x18\xfc\x5a\xe5\x85\x23\xa3\xcc\x52\x28\x3d\xc7\xb0\x16\xf3\x1c\xd6\x55\x79\x81\xc5\x07\x6c\x77\x4f\x30\x3a\x47\xc4\x27\x87\x0e\x20\x7e\xd8\xbd\x66\x64\x0f\xf0\x92\xdb\x50\x3f\xa1\x24\xbf\xdc\xf0\x20\x05\x1d\xad\xd1\x06\xdd\x24\x58\x40\xb3\x19\x10\xb8\xa9\x06\x0d\x59\x86\xf0\x2b\x60\xaa\x5e\x33\xb4\xd7\x55\x09\x12\xcd\xc5\x77\x6c\x77\x2a\xac\x93\xae\x19\xc7\x3b\x7e\xcf\xca\x38\x9e\x62\x76\x81\xa8\x78\x1e\xb4\x7d\x84\xe9\x34\x60\xba\x89\x1d\x3f\xf6\xea\xdf\x8f\x2a\x90\x3c\x38\x34\x74\xbe\xaa\x42\xb9\x0e\x03\x22\x36\xdc\xd8\x98\xd0\x2a\x40\xef\xb4\x4e\x47\xea\xd5\x2b\x75\xb0\x9c\x7d\xa1\xcd\x6a\x2d\xfd\x4d\x1c\x04\x52\xde\x69\xf6\xac\xac\x1a\x68\xdd\x78\xda\xf9\x72\xae\x26\x08\x21\xe2\xec\x52\x2f\xb5\x74\x9b\xeb\xe0\xad\xb4\x52\xbf\xa4\xfa\xa1\xe9\x79\x11\xc1\x29\x9f\x16\x56\x8d\x68\xee\xf4\x05\xf4\xb1\xcd\xac\xab\xed\x59\xf7\xb0\xfb\xce\xab\x71\x9a\x34\xb2\x99\xf5\x8a\x4a\xe8\x15\x4f\x98\xf4\xd9\xf4\xf1\x40\xb1\xf0\x85\x00\x69\x46\x72\x5e\x7c\x29\xbb\x0b\xc6\xcc\xf2\x53\x44\x97\xc6\x1d\x4c\x16\x12\x62\x4a\x61\xd7\x0d\x26\xc3\xef\xb7\xd7\xc3\x51\x84\x86\x57\xf7\xf8\xee\xbf\x8b\x99\x07\x47\x74\x0e\x6f\x91\x0c\x97\xce\xf1\x50\x37\x57\x65\xc8\xc0\xb3\xb4\x49\xc0\xd0\x9d\x66\xf0\x08\xe6\x7c\xfa\x76\xea\x2b\x68\x08\xb6\xfe\x63\x2e\xaf\xe0\x58\x7f\x37\xe3\x6b\xe9\x8d\xcb\x17\xa3\xf4\xa1\x5b\x65\xa9\xf6\xfc\xf9\x64\x2b\x52\x52\x20\x77\xb1\xfb\x4c\xc3\xc0\x8d\xf4\xb4\x67\xca\x71\x6d\xb1\x6b\x73\x7f\x78\x2c\xdf\x38\x71\x70\xa5\xf1\xf6\xa7\xae\x0a\xb3\xf5\xb7\xc5\x85\xe3\xb0\x65\x5a\x64\x56\xa5\x03\x59\x5c\xe8\xea\xea\x25\x37\x85\x5e\x7f\x0d\x50\x61\xbc\x29\xb4\xe6\x7d\xaa\x82\x46\x3c\x19\x0e\x9f\xdd\xd5\x2f\x83\x22\xdd\xb4\xe0\xf2\x6b\x68\x77\x82\x28\xeb\x57\xe1\xa1\x85\xb7\x02\x5d\xa1\x49\x87\xd4\x4b\xaa\x76\x7b\x22\xee\x7f\x4c\x84\x59\x10\x32\xe8\x8e\xc1\x2e\xb8\xc5\xa4\xb9\xe1\x57\xec"}, +{{0x48,0x6c,0x7b,0x43,0x6c,0x1d,0x43,0xd6,0xb7,0x03,0x51,0x22,0x83,0xc1,0x66,0xdc,0x86,0x3e,0x5a,0x33,0x80,0x2f,0x4e,0xa6,0x5f,0xc7,0x38,0x77,0x89,0x02,0xd0,0x14,},{0xb5,0xdc,0x94,0x7d,0x64,0x33,0x7c,0xae,0x82,0x12,0x2b,0xd6,0x8c,0xc8,0x08,0x40,0x59,0x6d,0xe3,0xbe,0x56,0xcb,0xd0,0xc8,0x33,0xaf,0x3f,0xaa,0x3a,0xdc,0x37,0x76,},{0x31,0xf9,0x5c,0xbb,0x74,0x63,0xb8,0x75,0x28,0x65,0x42,0x27,0xbb,0x13,0x97,0xbf,0x10,0x65,0xb4,0xf5,0x76,0x80,0x80,0x78,0x20,0x7d,0xfa,0xf0,0x6d,0x12,0x4b,0x41,0xf4,0xc3,0x18,0xf4,0xa9,0x31,0x5a,0x66,0x08,0x5b,0x9e,0x56,0x8a,0x71,0xe4,0x14,0xed,0x94,0x14,0x51,0x73,0x10,0xc6,0x99,0x94,0x6d,0xb0,0xc9,0x76,0x28,0x52,0x07,},"\xaf\x03\x60\x53\x67\x2d\xcf\x3a\xa2\x6e\x28\xec\x6a\xa6\x42\xce\x28\x4b\x89\x6c\x69\x88\x7d\xfd\xcf\x08\x24\x51\x5e\xb0\x84\x8d\x9d\x97\x0c\xa2\x72\xdf\x77\xa8\x6b\x3f\xf6\xdd\xaf\x3c\xba\xdd\x3a\xb6\x28\x3b\xc3\x7c\xdf\x7a\x56\x07\xd5\xdf\xc7\xcf\x96\x32\x92\x99\xcc\x53\xed\xbb\xe6\x57\xfd\xfa\x2c\xa2\x44\x67\x05\x0a\x0a\xeb\x8c\xff\xd7\xd3\x3d\x54\x3e\xc2\xc1\x91\xcc\x0b\xce\x89\xac\x37\xd3\x32\x93\xb1\x88\x8c\xcb\x76\xc2\x8a\xdc\x67\x1a\x49\x35\xa8\x46\xd9\x07\xe4\xad\xd0\x11\x0f\xeb\xbe\xe5\xae\xc8\x0f\x9d\x2f\xf7\x4e\x2a\xf4\xfd\xbe\xbb\xcf\x49\x10\x5a\x64\x69\xd7\x38\x00\x06\xb2\xca\x44\x36\x48\x14\x45\x4e\x44\x5e\x36\xdc\x00\x12\xf3\x39\xc9\x68\x54\xf8\x36\x44\x2a\x05\xa5\x0b\xec\x90\x73\x27\xf7\x4b\xa9\xf6\xfd\x79\x0f\xf0\xad\x37\x83\xd2\x97\xbd\xcc\xa7\x64\x60\x78\x37\x03\xeb\x5f\x2b\x1f\x51\xb0\xa7\x40\xce\x7a\x8f\x00\xa3\x87\xe3\x63\x62\x70\xa9\x71\xfa\x8f\x15\xb4\x49\x67\x30\xd8\x8a\xdd\x80\x7a\x7f\x7e\x98\x7c\xd4\x15\x95\xa2\xe7\x43\x5d\xf5\x19\x55\x76\xa3\x5f\x5e\x91\xb2\xfc\xfa\xc9\x4e\xd5\xd7\x76\x63\x78\x3b\x61\xe6\x67\x1d\x34\x83\x8b\x6b\x56\x44\xfb\xc1\xc5\x39\xfe\x15\x9b\x77\x92\xdb\x96\x7e\x83\x52\x61\x8d\xda\xca\x0c\xde\x73\x43\x7b\x59\xe7\x80\x1b\x49\xeb\x46\x09\xb1\x05\x77\xca\x26\x92\xdd\x6f\x9d\x5e\x9d\x4b\x5e\x5e\x62\xc5\x91\x3e\x7b\x87\xe6\xb3\x47\xbe\x61\x53\xb1\x71\x99\xc9\x16\xa1\x3f\x8a\x88\x5b\x37\x8e\xf0\x9e\x13\xca\xe4\xd8\xb0\x79\xd7\xd5\xcb\x90\x94\x19\x9b\x0f\x20\x53\x3c\x90\x08\x3b\xc3\xac\xb2\x66\x76\x97\xee\xd2\x2e\x36\x70\xab\xb4\xa5\x53\xe9\x95\xc9\xdd\x95\x94\xe5\x92\x39\x1a\x00\x04\xb6\x55\x65\x44\xf3\x56\x12\xc4\x97\x13\x59\x57\x7c\x47\x63\x82\xca\x53\xb3\xf2\x62\xa5\xe3\x3e\xd2\x6e\xec\x80\x9f\x4f\xdb\xa4\x89\x8a\x11\x36\x75\xcb\x6a\xf7\x17\xdb\x62\x57\x9f\x39\x80\xb2\x14\x63\xbe\x02\x9c\xb4\x16\x0f\xe5\xd2\x57\xc4\x6c\xd6\x66\x4f\x98\x61\xac\x50\xfe\x05\xc1\x44\x05\x7d\xce\x2f\x8d\xf1\x53\x2a\xa7\xaf\x58\x9f\x41\x27\x06\x01\xce\xf0\x6b\xbe\x4f\x35\xc3\x1c\x78\x2b\xb3\xcf\xff\x7d\x5a\xb6\x4a\x14\xec\x41\x73\x61\xf1\xd3\x2c\xbd\x38\xb6\xbd\x0e\x02\x50\x5d\x14\x16\x30\x2b\x85\x05\xae\x2a\x96\xe8\xd5\x33\x9c\x34\x6c\x2b\x06\x62\xd3\x50\x25\x9c\x50\xc5\xe4\x87\x95\x91\x4e\x6f\x88\xe9\x7c\x81\x1c\x39\x3b\xdf\x9a\xec\x7e\xf8\x20\x47\xca\x28\xee\x97\x1c\x17\x5c\x27\xe3\x6e\x10\x97\x27\x96\x0d\xdf\x1a\x1b\x97\x6a\xb4\x4f\x48\x51\x60\x7b\xd9\x66\x80\x8a\xc4\x6d\x54\x00\x31\x28\x29\x7f\x5f\x44\x87\x10\x8d\x6a\x02\xe7\xa1\x64\x13\xd2\xb7\x5e\xcb\x42\xfd\xdf\xb6\x69\xc8\x01\xd2\x3d\xe5\x0a\x6f\x7b\xf6\x58\xf7\x53\xc6\xb2\xb3\xb4\x7c\x06\x40\x10\x5d\x0a\x80\x1b\x32\xa1\x94\x3c\xdc\x15\xc8\x86\x55\x5e\xb7\x5b\xb7\x92\x7b\x93\xc3\x5c\x5b\xe1\xf9\x8b\x19\x6c\xaa\xc2\xda\xd9\x91\xb1\x04\x4e\xa8\x63\x94\x4d\x54\xd8\x83\xab\xc3\xc6\xde\x66\xed\x86\x8e\xe8\x4b\xcf\x9c\x34\xcc\xdb\x80\xfc\xd9\xcc\x04\x02\x74\x77\x32\xcd\x63\x0b\xbf\xa3\xbb\xe8\xb0\x38\xdc\x1d\xbd\xaf\x43\x6d\x9a\xc0\x0c\x02\xd5\x28\xec\xe2\xe7\x91\xee\x31\x2a\x86\x8f\xeb\x2f\x58\x7c\xa4\x4d\xb5\x73\x13\x84\xfa\x18\x31\x14\x20\x61\xb2\xea\xd2\xb8\x0c\x66\xbd\x2f\xa5\xdc\xca\xbe\x6a\x25\xf2\xa4\x93\xfe\xaa\xcd\x23\x1d\x2f\x40\x96\x46\xb9\x42\xa5\x78\x54\x5e\xa4\xfe\xea\x9a\x73\x47\x3f\x79\xdc\xf1\x3e\x0c\x9f\x1b\x49\xfd\x89\x12\xec\x48\x73\x28\x04\x5b\xd0\xfa\x22\x89\x22\xee\x6e\x97\x3e\x61\xf6\xe9\x33\x65\x29\x65\x78\xdc\xc2\x1c\x36\x14\x79\xee\x2d\x24\x87\x9f\x2e\x9b"}, +{{0xa6,0xe6,0xad,0x2c,0x37,0x9c,0x6f,0xcc,0xad,0xb4,0xa4,0x9b,0x23,0x2a,0x91,0x42,0x61,0x8e,0xa3,0x01,0x03,0xc3,0x3c,0x22,0x6f,0xf6,0x28,0xbc,0xfd,0x81,0xf4,0x26,},{0xf7,0xc4,0x32,0x3f,0x5c,0x41,0x9d,0x9b,0x3f,0x34,0xa8,0xeb,0x42,0xae,0x7f,0x1f,0xaa,0x23,0x33,0x07,0x90,0x30,0xc5,0xd6,0x4f,0x9f,0xfb,0x1e,0x9b,0x16,0x00,0x2d,},{0x07,0xd9,0xfc,0x24,0x4f,0xda,0xb0,0x01,0x59,0xeb,0xec,0xc5,0xa0,0x08,0x83,0x45,0x3f,0x08,0x31,0x01,0x71,0x76,0x9d,0x29,0x70,0x01,0xe8,0x77,0x01,0x0e,0x3e,0xce,0xd9,0xfb,0x60,0xec,0x91,0xcb,0x4d,0x88,0xe7,0xba,0x40,0xc5,0x30,0xb1,0xf9,0x23,0x79,0x78,0xcc,0xd9,0x6d,0x5c,0xba,0x9e,0x4f,0xa2,0x7e,0x2a,0x0a,0xd9,0xd6,0x0c,},"\x2e\x85\x76\x76\xa5\xbb\x1c\x6e\x9e\x94\x50\x7f\x83\xc6\x0a\x67\xf5\x47\xc5\xde\x9e\x94\x56\x6b\x19\x7a\x6a\xf6\xcf\x47\x52\xe9\x3d\xbd\xef\x6b\x9f\x66\xd1\xfe\xbd\x95\x7e\x42\xa7\xf5\xad\x64\xef\x1d\xbc\xc4\xfe\x69\xae\x95\x25\xd1\xa4\xde\x67\x05\x4c\x88\xf2\x9c\x06\x47\xba\xcf\x8b\x82\xf3\x21\xff\x99\xfe\x9e\xed\xc9\x92\xed\x34\xc1\x17\x7f\xc5\x42\x12\x27\xcc\xac\x10\xfe\xb9\xce\xd4\x08\x2f\x56\x58\xda\x63\x71\x47\x23\x97\x97\x37\xe7\xdc\xbf\xe2\xe8\xb5\xd5\x0f\x91\xdf\xca\x83\xe7\xf9\x5f\x35\xd1\xad\x8d\xd5\x11\x44\x50\x2f\x3d\xf6\x72\x43\x26\x11\xf0\xe7\x66\xa9\x0d\xcc\x2a\x57\x39\xc8\x05\xd9\x5f\xe5\xb0\x41\xde\x9d\x7f\xb4\x7b\x44\x04\xaf\xc8\x03\xa3\xbd\x48\x04\xc7\x81\x7e\xbc\x5b\xdf\xef\x8a\xdd\x9e\x25\x0b\x50\x96\x6c\xa8\x93\x9b\x22\xb3\xc6\xff\x93\x6e\xaa\x65\x9a\x24\x0c\x0c\x84\x8b\x81\x0a\xce\xcf\x61\x81\xe0\xe4\xdb\x8e\x4c\xf8\xfc\xce\x7d\xe5\x59\xcb\xe8\xaf\xa9\xdb\x84\x99\x57\x09\x11\xa3\x88\x7e\x85\x0e\x50\x9c\xdb\x70\xde\xbc\x34\x77\xd1\x21\x75\x01\x4f\x79\xf8\x1b\xa1\x13\xd0\xb7\xb3\x35\x11\x8f\x85\xcf\x59\x99\x6f\x80\x67\x58\xeb\x90\x3c\xc4\x50\xf5\x2f\xee\x10\x2e\xfc\x01\x44\x1e\x9a\xe5\xfa\xe7\x4c\x23\x1d\xfd\x85\xeb\x6b\xad\x17\xd6\xb7\x0e\x93\x85\x84\xfa\xcb\x21\x72\xcb\x03\xbd\x5e\xa0\x7b\x7f\x0d\x37\x1f\xfa\x35\x1c\x0e\xe4\xef\xe9\xba\x4a\x3f\xd5\x43\x87\x46\x55\xe7\xd3\x9c\x53\xae\x86\x32\x98\x02\xe5\xc3\x85\xe9\x28\x3a\x29\x73\xca\xb8\xcf\x7a\xc7\xff\x0f\x91\xd1\xd4\x8b\x58\xab\xfd\xad\x65\x8d\x81\x2f\x07\x88\x16\x76\xbd\x22\x6b\xfe\x95\x7d\x7d\xf3\x0c\x41\x30\xa4\x48\x35\x4a\x6b\x94\x40\x5a\x41\x16\x50\xa9\xc8\xfc\x85\x11\x55\xec\x5a\x8a\x3e\x3b\x67\xae\x0c\x4b\x5c\xb8\x9b\xb7\x3f\xc8\x29\x74\xbe\x62\xda\x73\xf0\xe2\x30\x92\x93\x7d\x40\x5b\xa4\xaf\x6c\xab\x94\x65\xea\x43\xa6\x25\x3f\x44\x57\x08\x2a\x06\xac\x12\xb7\x5e\x88\xec\x68\x44\x87\xf9\x07\x63\x73\xfa\xb8\x89\x28\x59\xd8\xe8\xba\x43\x14\x23\xaa\x80\x5a\x22\x0c\xbf\xda\x43\x1b\x32\xb1\xe0\x31\x21\xf7\xfd\x4d\xe1\x85\x91\xf2\x50\x5c\xc0\xf5\xb2\xb1\xa7\x60\x5f\xbc\xc6\x37\x57\xb0\x7e\x29\x9f\xef\x5a\x2b\x73\x65\x23\x0c\x2e\x92\xa2\x59\x62\xc2\xe8\x01\x2a\xd3\xfa\x9e\xe9\x48\x82\x70\x96\x25\xba\x68\xc7\xb2\x13\x66\x4a\xe2\x53\x2b\x60\x9d\x7c\x9a\xa0\xe8\x3d\x49\x3d\xbc\xe7\x63\x2f\x35\x58\x0e\x06\xd3\x11\x1c\xed\x32\x0d\xd0\x19\x04\x41\xf6\x2d\x9e\x35\xf5\x0d\xe5\x9c\x27\x2f\xb0\x0f\x56\x8a\x00\xb0\x74\x6c\x33\xa9\xbd\x24\x90\xc0\x74\xb9\x1c\xdd\xc4\x87\xef\x2e\x45\xa0\xf0\x30\xe0\x8f\xdc\x18\x17\xbc\xa8\xa9\xce\x29\xd2\x92\x79\xe7\x55\xde\xbc\x28\xdf\xad\xc3\xc4\xd1\xb4\x58\x48\x6e\x3c\x8d\x0c\x43\x18\xe7\xe6\xf9\xeb\x5a\x36\x53\xb3\xf7\xc4\x95\x07\x07\x7c\xd5\xeb\x81\xf1\x0b\x88\x10\x7c\xc0\xf9\x31\x69\x32\xab\xe9\xb6\x4e\x88\x86\xd0\x68\x56\xa8\x5b\xe6\x3b\x0c\x2b\x47\x5c\x0a\xfc\xb0\x69\x44\x26\x86\x0f\xb2\x4b\x5c\x17\xab\x6a\xb7\x73\x3d\x5e\x64\x1b\xe7\x4f\xd5\xf6\xa1\xff\x18\xd2\xf9\xa4\x27\x70\xfb\x30\x75\x0f\x56\xf4\x85\x4e\x38\xd5\x8a\xef\x18\xa2\xa6\x1c\xbf\xb4\x9e\xe5\x76\xed\x97\x73\x7b\xc2\x8d\xf3\x26\x8a\x33\x41\x75\x51\x3d\x97\xaf\x00\x9c\xbb\xcf\xdf\xad\x50\x39\xd6\x9b\xb4\x6f\x70\x88\x67\xd9\xb3\xce\x0b\xf2\xf5\x69\xe3\xcf\xbc\xf6\x13\x6f\x88\x70\xd2\x52\x08\xb2\x1a\x3e\xdc\xb7\x33\x93\xdf\xcd\x41\x72\xc1\x40\x2c\x41\xf3\x6e\x3f\x82\xa4\xea\x6d\xcd\x89\x16\x86\xba\x66\xe1\x43\x20\xaa\x0e\x22\xba\x0c\x1e\xf0\x33\xd6\x62\xcd\xb8\x60\xcd\xfa\x3a\x40\xf6\xcc\x53\x2a\x08"}, +{{0x9b,0x6d,0x7e,0x28,0xeb,0x05,0x15,0x97,0x32,0x4d,0xce,0xb7,0xa1,0x89,0x41,0x24,0x67,0x25,0xe8,0x8d,0x53,0xab,0x2c,0x34,0x77,0x11,0x05,0x33,0x0c,0xf1,0xf4,0xae,},{0x88,0x72,0xa5,0x0b,0x5f,0xe3,0x62,0xf8,0xea,0xd1,0xd4,0x0e,0x20,0x45,0xf0,0xd4,0x0b,0x2e,0x7b,0x50,0xb5,0x9d,0x80,0x90,0xbc,0x47,0xad,0x68,0xeb,0xee,0x09,0xed,},{0xc6,0xdc,0x5c,0xa1,0xe8,0x56,0x00,0x15,0xb4,0x93,0xaf,0xe2,0x66,0x6c,0xcf,0x6f,0xef,0xa8,0x03,0xd8,0x52,0x6c,0x83,0x7f,0xe7,0xf1,0x23,0xc7,0x99,0x14,0x27,0xab,0x03,0x0d,0x7c,0x77,0x0e,0x45,0xf6,0xde,0x84,0x81,0x52,0x3b,0x94,0xec,0xe9,0x7f,0x3f,0x16,0x1c,0xf5,0xb8,0xc7,0xae,0xa3,0x9f,0x5a,0xd8,0x26,0xbf,0x8d,0x0a,0x02,},"\xd1\xe1\x98\x7b\xff\x65\xf6\x2a\xd6\x76\x24\xc6\x65\x79\x24\xf5\xd6\x73\xb7\x82\x4e\xbe\x40\x40\x26\xc0\x56\x2d\xed\x31\x43\x44\x0b\xe6\x37\xf9\x8c\x9e\x01\xa6\xaf\xdf\xa9\xa4\x7d\xd4\x9c\x7c\xba\x6e\x3f\xd2\x3e\x45\x52\xf7\x63\x2b\x14\x38\x0b\x27\xcd\x3e\x96\x06\xcc\xe3\x50\xf1\x52\xab\x12\x6b\xea\xd0\xa5\xd3\xbc\xe4\xd4\x20\x92\xd9\x34\xc8\xca\x33\x7e\x98\x7e\x11\xd8\x6c\xfb\xfb\xd2\xac\xc3\x22\x3b\xd1\x67\x44\xa9\x27\x72\x8f\x48\x53\x72\x17\x5c\xc6\x94\xdf\x30\xa7\x3f\x9d\x33\x76\x5f\xf0\x14\xef\x00\x8d\x58\x63\x21\x03\x38\xcc\x34\x82\xcc\x27\xea\x31\x7e\xec\x92\x1b\x0c\x56\x8c\x38\xab\x27\xc4\xa5\x64\xe8\x02\xb1\xb9\x46\x68\xc6\x51\xe2\x0a\x0b\x55\xf3\xa7\x9d\x21\x5f\xc3\xa0\xd0\x49\x04\x01\x09\x32\xc4\xcc\x68\xc2\xa9\xe7\xd0\x0e\x5d\x38\xd8\x2d\xf5\x52\x06\xba\xb9\x5c\xf6\x97\xbe\xbc\x72\x06\xee\xde\xf6\xfd\x18\xd9\xa2\x0c\x2c\xbb\x28\x5b\x00\xef\xa7\x69\xa0\x8d\xab\x2b\x3a\xba\xdf\x00\xd1\x98\xb4\xf1\x92\xdd\x44\xbc\xb9\x14\x31\x82\x3a\xe6\xfd\xf9\x84\x58\xec\xa3\x9c\xd2\x92\x63\xf0\x99\x93\x03\xe7\x0d\xc6\x94\xfe\x01\xc5\x3a\x11\xc1\xd1\xc3\x4c\x1e\xe5\x06\x8a\x20\x1d\xbe\x7e\x10\x08\xd7\x64\x35\x89\x68\xb4\x02\xaa\x39\x85\x49\x50\x7f\x7b\xd1\x85\x08\x00\xe4\x11\xb1\xc4\xe2\x8d\xdc\x04\xa8\x59\xe1\x79\xbe\x8a\xd7\xe6\x67\x0e\x50\x9d\xb0\x27\xad\x7e\x51\x7e\x44\x25\x95\x4f\x5a\x80\x74\x14\xa6\xda\x26\x7a\x76\x4e\x71\x2a\x99\x84\x65\x06\x49\x82\xd8\x51\xa2\x65\xea\x3c\x4d\xfb\x74\xf9\x92\xa7\xcc\xcd\x9a\x82\x68\x7f\xa6\x1c\x32\x2c\x4f\x58\x9e\x86\xb8\x82\x52\x13\xbf\xa9\x51\xda\xe6\xaf\x35\x4a\xce\x18\xf0\x73\x99\x5a\xdc\x95\x83\x9d\xac\x01\x65\x51\x1d\x61\x75\x37\x91\xa5\x3e\x48\xe3\xa8\x27\x3d\x44\x82\x3d\x25\x96\xf2\xa2\xdb\x2e\x5f\x1a\xe5\x97\x22\x1b\xa7\xf3\xeb\xaf\x4a\x7b\x28\x88\x39\x50\x02\xbd\xaf\xf5\x1f\xa5\x4b\xfb\x97\x9d\xe1\x03\x14\x04\xca\x77\x89\xfe\x09\x5d\x4d\x17\xf0\x7a\x35\x55\x6b\x10\xfe\x8e\x14\x17\xc8\xa6\xa6\x31\xc2\xed\x36\xcb\x7a\x0e\x61\x81\x77\x62\x89\xc3\x44\x81\x4d\x42\x13\x1a\x73\xb1\x2f\xaa\x35\xd7\x78\x14\xc6\x81\xa6\x01\x37\x4b\xa7\x1c\xb9\xad\x53\x15\xfa\xd4\x2d\x3a\xcf\xc7\xc1\xd6\x28\x81\x02\x56\xda\xf7\xd8\xc3\xc9\xa2\xe5\xbd\xcf\xb7\x70\x08\x2f\xa6\x38\x16\x89\x58\x52\x3a\x1c\x3b\x03\x5d\xbc\x6d\x5a\xdf\x26\xdf\x89\xa7\xcc\xab\xed\x3e\x7d\xd3\x77\xc1\x6d\xa8\x41\xf1\x3c\x68\x94\xd4\x3c\xeb\xb4\xe3\x90\x22\xf1\xcc\xec\x22\x74\x44\x5c\x78\xb3\xad\xc7\xbb\xf7\x0d\x89\x0b\x80\x23\x6c\xc4\x46\x8f\x95\x69\xc5\x9a\x7e\x33\xb5\x70\xe6\x70\x38\x0d\x24\x4e\x4e\x31\x0e\x11\xc3\x92\xf1\xe3\x34\x05\x4b\x92\xc8\x38\x6c\x16\x1c\xe0\x41\x09\xb0\x37\xbd\x62\x8d\x91\x9d\xcb\x62\xda\x14\x35\xbf\x94\xe8\x8b\x0a\x88\x46\xd4\x86\xd1\x67\x78\xf7\xa3\xb8\x80\xe6\x60\xf4\x41\xfd\xf8\x6e\x56\xb8\xaa\x06\x61\xf5\x5a\xae\xce\x27\xf9\xdd\xaa\x0e\x2a\x22\xc2\x15\xb0\x40\x53\x97\x26\xb9\x85\x39\x15\xa1\x59\x2d\xff\xea\xe3\x2d\x7b\x5b\x67\xeb\x62\x05\xbb\x0b\xd7\x27\x9f\x78\x8d\x5f\x83\x3c\x40\x66\x78\x0c\xa0\xa4\x2d\x3e\x4e\x1a\xa2\x2b\xd0\x6b\xb5\xee\xd8\x9b\x94\x13\x77\x1e\xca\xb6\x44\xca\x72\xd1\x29\x1d\x00\xf7\x40\x90\x1a\x73\x11\xdc\x03\x67\x15\xd2\x3e\xbd\x9a\x59\x89\x16\x28\xf0\xd8\x7e\xd4\x89\x50\x2f\x06\xd7\x5b\xbd\x11\xcd\x16\x02\xa3\x5e\xe7\xe1\x33\x35\xd6\xa1\x44\xb0\x88\x30\xe6\x69\xc0\x2e\x65\x2f\x3f\x10\x0d\x39\x3e\xf9\xb4\xac\x05\x32\x14\x39\xbc\xe6\xce\x36\xff\xc5\xab\xca\x89\x0b\x87\x96\xcc\xb5\xe1\x63\x03\x55\x9c\x5d\x91\x17\xf0\xf3\x1d"}, +{{0x70,0x09,0xed,0xd0,0x79,0x50,0x96,0xed,0xc4,0xfe,0xd5,0x5a,0x17,0xcc,0xf4,0x84,0x13,0x1e,0x60,0x8c,0x6d,0x5d,0x66,0x96,0xbf,0x33,0x76,0xe2,0x69,0x24,0x95,0x9b,},{0x77,0x57,0x4b,0xf0,0x69,0x52,0x71,0x45,0xe7,0x2d,0x3e,0x85,0xce,0x7d,0x4f,0xcd,0x67,0x1a,0x33,0xe0,0xa7,0x1e,0x6b,0xf0,0xda,0x7e,0xa4,0x71,0xdd,0x6e,0x86,0xa4,},{0xb7,0x01,0xb8,0xf9,0xa4,0x34,0xe0,0x6d,0x71,0x9a,0xd2,0x5d,0xcc,0x54,0x06,0x0c,0x79,0x86,0x64,0x7f,0x44,0xf3,0x88,0x4b,0xcb,0x6e,0x5e,0xe1,0xd7,0xa4,0x46,0xcc,0x26,0x5c,0xec,0x02,0x9b,0x53,0x7d,0xa7,0xf2,0x52,0x33,0x26,0x55,0x8a,0xc9,0xba,0x34,0xf4,0xcc,0x2a,0x97,0xcc,0xa3,0x45,0x2e,0x70,0x56,0x2e,0x7a,0x8f,0x55,0x04,},"\xb1\x2c\x12\x47\x05\x39\x54\x7c\x2d\xe6\xbc\x4e\xea\xc7\xb6\x3e\x50\x8e\xd7\x10\xf3\x56\x37\xd9\xfd\xd2\xdc\xca\x32\x2a\x7a\x50\x71\xda\xb2\xb2\x84\x5e\x30\x79\x28\x06\x03\x5c\x9f\xcd\xaf\xe2\x78\x3e\x3b\x67\x7d\x6b\xe5\xaa\xc7\x0b\x33\x91\x0a\x2b\x95\xe8\xb5\xd5\x9b\xda\x61\x59\x35\xa4\x17\xb7\xae\x19\xa7\x85\x37\x74\xe8\x9a\x12\xaa\x54\x7b\x41\x92\x97\x9a\x01\xef\x6e\xf3\x2a\x40\xde\x79\xd6\x80\x05\x7a\x83\xa0\x74\x61\x7c\xa6\x50\x1f\x59\xe7\x35\x64\x92\x7c\x38\xb5\x8c\x19\x58\x5a\x2c\x03\x65\x9c\x02\x6e\x4d\xe3\x80\x6d\x6c\x1c\xa8\x95\x8d\xee\x47\xbc\xb8\x89\xe7\x6d\x2c\x3a\x9a\xb5\xb8\xb6\xaf\xb2\xe8\x42\x29\x80\x56\x56\x7b\xf9\xb5\x89\x57\x41\x54\x83\x33\x62\x33\xef\x49\x20\xfa\x57\xf4\x96\xe1\xf0\x34\x8c\xca\x20\x36\x64\x96\xfa\xb3\xa7\x5b\xf4\x21\x4e\xce\x47\xa4\x5f\xea\xa1\x39\x2d\xb3\xf2\x54\xd9\x6a\x7f\x37\x40\x2c\x98\x11\x14\x0d\x73\x58\xb4\xef\x8f\x20\xa2\x98\xee\xef\x90\x4e\x37\xd6\x8f\x37\x8d\x33\xcb\x96\xd0\x0c\x03\x10\x9f\xc8\x3f\xd0\x6a\x87\x6c\x92\x48\x2f\x61\xab\x79\x14\xeb\x7c\x2e\x5e\x84\x06\x6e\x0e\x91\xe2\x1e\x42\xe9\xbe\x23\xdf\x12\xb5\xc7\x47\x97\x3c\xb8\x64\x42\xc3\x22\x91\xd3\xd1\xae\x71\x9b\x36\xa6\x2f\xaf\x3a\xba\xa2\x05\x3a\x31\x3f\x62\x5d\x85\xc5\x1a\x51\x98\x57\x19\x15\xef\x8a\x2b\x19\x9b\xa3\x7d\x25\x88\x45\x75\xba\x1b\x72\x84\x4c\xab\x43\x28\xb5\x7f\xab\x1e\xc9\x74\xee\x8e\xa1\xdf\x7c\xa9\xc7\x8a\x4d\x3a\x03\xbc\xb0\xab\x41\x69\xbf\x06\xa3\xa4\x38\xd9\x56\x6c\x6c\x50\x1d\x8d\x9c\xcc\xcb\x1a\xc2\x6b\x4d\xa4\xae\x1a\x9d\x8e\x8b\x9d\xf6\x62\x82\x1a\xd9\x75\xc9\xb0\x15\xfe\x26\xf6\x89\x8d\x22\xab\x91\x2f\x0e\x40\x5a\x5b\x27\xcf\xd3\x9d\x65\x7d\xcd\x92\xcd\xeb\xe6\x79\x19\x02\x71\x34\x84\x40\x6d\xdd\xce\x71\x18\x87\x31\xe4\x43\x19\x38\x1a\xf2\x7d\xaf\x76\x79\x22\x73\xb8\xc3\x52\x51\xd1\x1b\x83\x6a\xfe\x8b\x3c\xe9\xb4\x02\x73\xf6\x91\x5e\xbe\x6b\xc9\x5a\x75\xbb\x94\x1a\x42\x92\x09\x86\x7f\xba\x87\x64\xbf\x6c\x40\xdb\x6e\xec\xb4\xf2\x17\x47\x83\x7c\xf6\xae\x7f\xbf\xe3\x6d\x50\x23\xdf\x7f\xce\x2c\x0c\x3c\x57\xaf\x28\x98\x88\x53\x13\xc5\xc4\xbd\xa3\x5c\x7d\xa6\xcb\x29\x93\x2f\xb1\x99\x1f\x62\xbb\xb0\x80\xb3\x2e\x20\x50\x61\x93\x11\xae\x69\xab\xb3\x02\x2d\x91\x3f\xa9\xea\xbd\x5d\x5c\xb4\xdc\x54\xd7\x5d\xca\x63\x8c\xda\x9a\xf3\x31\xc0\xcf\x4d\x20\x07\xb6\xca\x39\xf6\x55\xa6\x1c\x01\x03\x9f\x12\xa4\xb9\x78\x2b\xc3\x9a\xec\x4d\x22\xef\x00\x93\x38\x8d\xd7\xd5\xb5\x6d\xfb\x8a\x7f\x9d\x86\x69\x00\x4e\x28\x78\xdd\x8a\x6d\x76\x85\x7c\x08\x45\x24\x50\x68\xfe\xe1\xc5\x31\x96\x31\xe7\x8d\x37\x85\x16\x5c\x70\xaf\xd6\x52\x99\x30\x13\x78\x55\x1e\xbf\x61\x35\x84\xc6\xa7\x62\x0a\x0e\x3b\x67\x79\xf3\x8c\x09\x40\x06\x24\x97\x00\x8e\xb2\x33\x87\x08\x68\xc2\x1c\xcc\xac\x23\x95\x01\xb6\x3b\x74\x9a\x85\x60\x2c\x28\xa0\x95\xca\xfc\x74\x9b\x05\x11\xa6\xc8\x78\xed\xb3\xb7\x80\xea\x17\x4d\x07\xb1\x21\xe3\x15\xa8\x26\xdd\xa6\xec\x8d\xc5\x43\x63\xe2\xcd\x2e\x63\x05\xa1\x94\x82\x5c\x0e\xa9\x0e\xfd\x7a\x9f\xd8\x9c\xd9\x7b\x99\xc4\x30\x0b\xd3\xbf\x93\x53\xd8\x2f\xbc\xce\xea\x71\xb4\xee\x3f\x1a\xae\x95\x39\xb4\xcc\xe9\x0c\xa4\x77\x59\x7c\x17\x4e\xf2\x0f\x4b\x9f\x4e\x62\xd0\x9a\x57\x0d\x31\x35\xaa\xbe\xe9\x55\x1f\xa6\x09\x83\x95\x8c\x0b\x7b\x8c\x37\x44\x55\x3e\xe1\x4e\x7f\x3c\xd1\x03\xa1\x92\x51\xc9\x9b\xf6\x38\x4a\xbb\x60\xa7\x6a\xfc\x66\x58\xb8\x0d\xfc\x51\x10\xad\xc4\xc7\x32\xfe\x0e\xe3\x29\x33\xfb\x28\x48\x28\xe0\x08\x88\x7a\xef\x80\xf6\xf8\x13\x34\x04\x46\xc0\x21\x7c\x12\xee"}, +{{0x12,0xfe,0x8e,0x5c,0xe2,0x0c,0xaf,0xaa,0x32,0x79,0xda,0x7b,0x34,0xaa,0x87,0x75,0x2e,0xad,0x67,0x9f,0x15,0x61,0x28,0xaa,0xef,0xb4,0xaf,0xa5,0xdb,0x4f,0x2a,0x6f,},{0xe7,0x7f,0x44,0x20,0x6b,0xb0,0xc4,0xc5,0x9a,0x28,0x70,0xcf,0xc2,0xec,0xac,0x63,0x36,0x2d,0xee,0xcb,0xe8,0x11,0x5d,0xe5,0xcb,0x1a,0xfc,0x2d,0x9a,0x3d,0x47,0xf1,},{0x04,0xea,0xf9,0x00,0x96,0x6e,0x09,0x92,0xd3,0x6e,0x3c,0x22,0x0a,0x4b,0xd4,0xd8,0x2b,0xcc,0x6e,0xb9,0x98,0xed,0x05,0x1d,0xbc,0xb9,0x16,0x0b,0xcd,0x35,0x74,0x09,0x73,0x6b,0xcf,0xf7,0xe6,0x63,0x0e,0x96,0xf5,0x53,0x8a,0xec,0xa6,0xab,0x8b,0x0d,0x0b,0xd8,0x2c,0x0c,0xd7,0xc4,0x54,0x99,0x17,0xfe,0xbb,0x9c,0xba,0xda,0x08,0x0c,},"\x6b\x80\xcc\x6f\xbb\xd3\x32\xf8\xc6\x19\x7c\xdf\x2e\x6d\xc1\x9a\x21\x30\xfa\xa2\xec\x93\x8e\xf5\x58\xb8\x84\xba\x4f\xa5\xe1\x13\xe5\xb3\xe4\xb1\xaa\xf5\x1b\x69\x5f\x13\xef\xfe\x13\xf7\x7d\x39\xca\xb3\xc0\x7d\x04\xd6\x6d\x43\x0d\x99\x74\xb1\xda\x3d\x39\xdf\x12\x78\xc0\x0d\x6b\xcb\xfd\x4b\xae\x75\xb8\xc0\x76\x40\x4d\xbb\xb8\x34\x48\xfb\x49\x3d\xf6\x70\x00\xf9\x7d\x24\x7e\x8f\x23\xdc\x08\x1f\xce\x99\x2b\x65\xa2\x1b\x35\xd7\xbd\x7f\xa7\xdc\xcc\x54\xa5\x60\xaf\xd1\x4b\x1e\xc4\x36\xc1\x09\x46\xf6\xaa\x59\xea\xe1\xbe\x3e\xcf\x31\x1d\xef\x51\xe4\x6b\x6b\x4d\x1d\x08\x0d\x17\x84\xb2\x33\x4b\x80\xcf\xba\x72\xcd\x93\x1f\x55\xec\xd2\x98\xb0\x5d\xc8\x36\xab\x12\xd0\xad\x8b\x5d\x6e\x9b\x1e\x3c\xea\x3d\x84\x33\x68\xee\xf1\x9f\x5c\x14\xc6\xbb\xad\x94\x14\xcc\x7a\x4d\xb6\xa7\x26\xe4\xfc\xae\xd4\x44\x40\xa0\x19\xfe\x12\xa6\x05\x73\x40\x3c\x0e\x66\x2d\xc9\x02\xd1\xc8\x73\xff\x30\xc9\x31\xba\x7e\x43\xa3\xb3\xbf\x71\xd5\xb0\x94\xea\x50\x49\x71\x64\x7c\xa9\x43\x56\xf0\xa5\x3e\x44\x4b\x4c\x00\x8e\xe5\x97\x72\x04\x22\x1b\x40\x0d\xee\xc3\x7f\xc2\x73\x45\x25\x45\xf8\xf2\x18\xbe\x98\x87\x25\xbc\x38\xc8\x5d\xf2\x12\xea\x73\xdc\x0b\xc7\xcb\xba\xc9\x07\x98\x2f\xef\xad\x68\x0f\xbd\x97\x5c\x20\x93\xa7\xfe\x8e\x6b\x37\xc1\xcc\xed\x87\xf8\x1d\xaa\x57\x29\x1a\x5a\x18\x47\x6d\x11\xa1\x8e\xc4\xb5\xcb\xce\x5d\x55\xac\x9b\x62\x4b\x04\x84\x30\xf2\x54\xf6\x71\x07\x85\x06\xe6\x98\x9d\xf7\xc0\x92\x56\x52\x50\x39\x08\x5a\xb7\xc1\x30\xc2\x40\x00\x4a\xbb\xb3\xaf\x6b\x48\x1c\xc1\xa0\x61\x7e\x57\xe3\x88\xee\x4b\x1f\x05\x2f\x34\xa0\x03\xfe\x6b\xb2\x02\xcb\x87\xd2\x74\x1b\xd8\xe3\x45\x4c\xa7\x3d\x2f\x61\x20\x11\xec\xc7\x4d\x88\x34\x35\x10\xa6\x3c\x93\x13\xdd\xc3\x6c\x25\xd3\xfb\x03\xe1\x88\xf5\x60\xbd\x02\x9c\x80\x15\x85\xce\x55\x29\x88\xdc\x55\xb7\xd8\x52\x2a\x33\x96\xc0\x1d\x5e\x71\x5a\xe2\x6c\x62\x2c\x64\xfe\xd5\xb9\x8e\x9c\x55\x9e\x4a\xa7\x8d\x1e\xd3\xb7\xb8\x90\xd4\x77\xec\x8c\x50\xa0\xff\x10\x7a\x3f\x83\xb0\x7b\xd3\x5e\x9c\xe9\xa0\x8b\xcf\xc0\xf1\x68\xee\xc7\xaa\x31\x1f\x71\xc6\x6a\x71\xce\xb9\xd5\xa2\x19\x9a\x14\xbe\x36\x86\x5c\xa8\xd0\x7e\x18\x6b\x13\x92\xb9\x29\x0c\x57\x80\x04\xd5\x84\xf1\x91\xc8\x2a\x53\xd8\x50\x89\x0b\xcc\x0d\x12\xdf\xf8\x40\xe0\x43\xdd\xdc\x2e\x67\x0c\x83\x60\x20\x92\x4f\x58\xc0\x44\xb2\x18\x76\x3c\xa6\x19\x82\xbc\x33\x2d\x24\x7b\x2a\x00\x8a\xb5\x70\xb6\x56\x5a\x06\x89\x2a\x26\xcf\xb0\x85\x3d\x79\xda\x28\xef\x8b\x91\x0a\x93\x29\x54\x4b\x79\x2a\xe4\x45\x6b\xa7\x76\x50\x66\xb9\xd1\xb4\xa3\x00\x21\x04\x48\x66\x0a\xe4\x8b\x50\x44\x41\x01\x7c\xdd\xd1\xf6\xf0\x09\x38\xb1\x07\x2c\x8a\xb8\x24\xad\xfe\x8a\xe3\x49\x23\xc8\x2e\xec\x75\x4b\xee\x1a\x65\x50\xab\x1d\x3d\xa0\x86\xe3\xae\xbb\xf2\x11\x69\xc4\x44\x69\xe0\x3b\xba\xe0\xd7\x2c\xe8\x63\x45\x77\x84\xcf\xe1\xdf\xc2\x76\xf1\xaf\xad\x9e\xe5\x3e\xba\xb5\xa3\xc6\x57\x2e\xb1\xca\xe0\x99\xa4\xa5\xfe\x19\x31\x92\x90\xe6\xa1\xb8\xb0\xe7\x54\x1e\xd7\x35\xb3\xf2\x1b\x1e\x2c\x75\x09\xf8\x7f\xd1\xfe\xd0\x00\x07\x47\x9b\x3c\x1b\xb7\x84\x32\x46\x63\x02\xd2\x46\xd8\xd0\x31\x99\x63\x07\x26\x0a\x0c\x41\xa0\xe3\xec\xd1\xe7\xfd\x83\x4d\xac\x11\xa1\x3e\xb0\x36\xb3\x9c\x36\x99\x66\xfd\xef\x39\x4c\x18\x3e\x54\xe7\xb0\xcb\x3d\x0c\xeb\x19\x8b\xd0\xe6\x6c\x00\xd3\x8d\xb7\x03\xaa\xce\x30\xcb\xbd\xab\x36\x9d\xfd\x1d\x9e\x51\x4d\x09\x68\xf1\x00\xc9\xf0\x7c\x31\x50\x89\xad\xb3\xad\x02\xe5\x9c\x04\xb9\xbe\x46\xe9\x9f\xbf\x5a\x62\xc6\xbb\xec\xdf\xf5\xb3\x81\xe5\x51\x27\x82\x4d\xdb\x18"}, +{{0xee,0x9b,0x6c,0x2e,0x0c,0x9b,0x01,0x47,0x2c,0xe3,0x2d,0x54,0xd1,0x76,0x2a,0xb0,0x30,0x33,0x17,0xd7,0x6d,0x3a,0xa7,0x8f,0x5e,0x08,0xa9,0x02,0x4c,0xa1,0xe0,0x83,},{0x01,0x6d,0xf0,0xf7,0x17,0xbc,0xb7,0xad,0xf6,0x26,0x95,0x8d,0x83,0xbf,0x8a,0xa3,0x25,0xc7,0x05,0x18,0xc6,0x8b,0xc7,0xef,0xd8,0x42,0x53,0xb7,0x5d,0xb0,0x87,0x88,},{0x4b,0x00,0x1d,0x96,0x42,0x83,0x5d,0x72,0x13,0x8d,0x68,0x01,0x98,0xe6,0xaf,0x70,0xb5,0xde,0x7a,0xf0,0x15,0x13,0x1e,0xa7,0x26,0xf4,0xe5,0x1b,0x5e,0x8b,0x6d,0x48,0xc2,0xa6,0xca,0x8e,0x87,0x09,0xcc,0x82,0x22,0xa5,0x04,0x7c,0x09,0xa6,0x6e,0x51,0x8a,0xc5,0xe8,0xb6,0xe5,0x35,0x48,0x94,0x82,0x61,0xf0,0x70,0x1f,0x68,0x73,0x08,},"\x77\x2c\xc2\x5c\x3b\x69\xbb\x3f\xf5\x65\x56\x64\xef\xa4\x78\xac\x41\x4a\xdf\xae\xa7\x0a\xc4\xa2\xa8\x87\xed\x39\x68\xc5\x4d\x34\xdb\xf1\xbe\x32\xcc\x9a\x9b\x54\x20\xa4\xad\x3c\x9a\x87\x7b\xc8\xcc\xec\x94\xad\x47\x3a\xa7\xa3\xc7\xde\x08\xa0\xfd\xb5\xed\x1e\x89\x87\x2b\xe7\x81\x70\xbe\x22\x1d\x27\x97\x76\xbb\xc6\xed\x9c\x5a\x67\x16\x89\x80\xd5\xea\xf8\x95\xe1\x34\x0f\x5d\xfa\xa3\xdf\x62\x2d\x65\x44\xb3\x99\xd7\x49\x45\xfd\x13\xbb\x11\x73\x62\x1e\x05\x61\x51\x46\x40\x13\x7a\xa7\xbc\x9c\xb7\xde\xbe\xff\x2c\x62\x69\x77\xd4\x47\x26\x3b\x7e\x57\xd4\x3d\x69\xef\xb2\x30\xcd\x25\x86\x5e\x4d\x92\x48\x28\xf5\xe3\x6f\x96\x4e\x40\x3e\x34\x93\xf3\x0d\x6d\xfe\xa6\xca\x3b\x78\x10\x75\xb5\xe3\xb2\x5c\x05\xac\x50\xe5\x55\xf1\x5b\xa1\x2b\x0e\x05\x9b\xff\x99\x64\x84\x12\x9d\xb6\xea\xfd\x88\x99\x3d\x6f\x0b\x7e\xcd\x15\xdc\xe2\xfc\x99\xf8\xb8\xe4\x35\x16\x35\x2d\xdb\x46\x1a\x04\xb9\xff\x34\x86\x45\x2e\x6a\xa6\xa5\x4b\x2d\x10\x62\xa7\x71\x42\x50\xcd\x2a\x88\xff\x6c\x4c\x17\xb6\xcc\x66\x52\xd8\xc5\xac\x27\xd4\x44\x3a\xeb\xf3\xd5\xfb\xaa\xee\x45\x21\xec\x76\xf0\x41\x3d\xb6\x44\x21\xec\x8d\x69\x49\x62\x67\x25\xfe\x56\x16\x0a\xb3\x07\xc0\xe7\x39\x06\xc4\x51\x55\xef\xab\xb4\x72\x22\x02\x1f\x22\x0d\x32\xbd\x3d\xb0\x71\x2a\xbd\xe2\x59\x9e\xa4\xff\x79\x97\x17\x81\x1d\xcd\xf8\x18\x2d\xf6\x71\x6d\x2a\x03\x8a\xee\x15\xd7\x78\xda\x55\xac\x20\xf0\x1f\x25\x30\x9c\xea\xd5\xb5\xb7\xb2\x23\x22\xe1\x82\x8e\xa7\xc9\x1a\xe6\x66\xf2\xdc\xd6\x84\x07\x31\x48\xe3\x1b\xb2\x24\x7d\x5f\x93\x50\x6e\xa8\x08\x52\x27\xad\xc9\xae\x19\x82\xe9\x50\xf0\x06\xa9\xda\x15\x8b\x9c\xec\xff\x89\x29\x76\x1c\x84\xf9\xd9\x76\xfd\xcd\x31\x7f\xfe\xd3\x6c\xbf\x6a\xcd\xa3\xe5\x0c\x9b\x73\xbd\x2c\x80\x85\x40\x9d\x11\x9b\x64\xce\xd7\x34\x9a\x26\x74\x26\x2a\x83\x2b\xec\xb0\x3c\x2e\xdc\xca\xc0\xec\x54\x12\x4e\x82\xf8\x10\x18\x17\x92\xda\x49\xea\x10\xbd\x94\x1f\x98\x95\xa0\x69\x59\xfd\xe0\xd3\xb0\xae\x84\xc3\x9d\xf0\x53\x90\xab\x33\xc3\x6c\x79\xca\x22\xe6\x59\x4d\x7f\xc6\xe3\xf8\x69\x22\xd7\x8e\xb7\xf5\xc2\x54\x95\xd8\x22\xa3\xb4\x10\x51\xb2\x4e\x57\xa7\x6f\xcf\xc1\x65\xcd\xe6\xd0\x96\xcc\x7b\x7e\x9d\x05\x5f\xe8\x64\xd5\x29\x42\xd6\x29\xa8\xac\x26\x1b\xe1\xdc\xd3\xa2\x1f\x89\x5f\x49\xb6\x7e\xe4\x7e\xab\x7c\xf1\x64\x4d\x57\x1d\x5f\xf3\x8c\x17\x9f\x5c\x6a\x54\xa3\x61\x2f\xb3\x47\x53\x41\x2a\x1b\x95\xbf\x62\xff\x31\x79\x80\x4f\xfb\xb9\x90\x51\xf2\xb0\x80\x56\x3a\x4a\xe0\xf2\x7c\xf9\x96\xea\x8b\xe3\xba\xe0\xa4\x33\x9d\xcc\xdf\xf6\xb6\x67\x15\x59\x26\x6e\xaf\xf4\xef\xf6\x82\xb8\xde\xe8\x9c\x9d\x2d\x45\xac\xdb\xec\x4a\xa6\xce\xcd\xbd\xb1\xd2\x84\x60\x9e\x65\xef\xb7\x7b\xb8\xf1\xa5\x1f\xc4\xd4\x56\x8a\x70\x5f\xb9\xc9\x7b\x23\x03\xc1\x46\x7d\xff\x8c\x8c\x5e\xe2\x75\x59\xb9\x3a\xd1\xc5\xb9\xc5\xc6\xc7\xc5\x29\xfa\x8c\x55\xc7\x5e\xbb\x59\xb2\xa8\x18\xaa\x9b\xda\x1e\x9e\x79\xbc\x66\x02\x97\x72\xf8\xae\xa1\x1b\xad\xd3\x22\x65\x65\xd5\x4f\xd0\x1b\xda\x8c\xb2\x70\xe7\x0d\xc9\x33\x9b\x46\x90\x0b\x58\x18\xe9\x32\x07\x5b\xe6\xc2\x8e\x73\xa1\x91\xd0\x2c\xbd\xc7\x45\x4b\xe1\x23\x87\xb0\xd4\x7a\x1a\xb1\x42\x32\xd2\x34\x2a\x6f\x15\x18\xea\x97\x09\x8b\x81\x5a\x1c\xa3\xf9\xc7\x0b\x25\x72\x2b\x1b\xcd\x7d\xac\xda\x63\x56\x22\xfc\x8e\x72\x95\x9f\x57\xf7\x67\xea\x56\x3d\xa4\xc1\x58\xee\xf7\x20\x01\x09\xf6\x14\x16\xc2\xe7\x04\x39\x92\x30\x62\x43\x7b\x1d\x08\x2a\x8c\x7f\x43\x94\x71\x3c\x1b\x7b\xa0\x58\x7b\x84\x1c\x11\x44\x75\xee\x3f\xf0\x59\xdf\x8c\xfa\x12\xa3\x21\xd9\x01\xcb\x47\xf5"}, +{{0xa3,0xd2,0x35,0x05,0xd0,0x7c,0x5f,0x93,0x7f,0x13,0x63,0x9d,0xbd,0x81,0x8e,0x85,0x14,0x52,0x34,0xee,0x70,0x17,0xec,0xee,0x86,0x36,0xc7,0xba,0x76,0xeb,0xef,0x5b,},{0xfd,0x7f,0xdb,0x3d,0x02,0x2b,0xa3,0x6e,0xad,0xfe,0xd0,0xda,0xaa,0xe5,0xbf,0xf0,0x45,0x05,0x40,0x3f,0x17,0x14,0x73,0xe4,0xd3,0x61,0xee,0x8d,0x15,0x0a,0x0e,0xb4,},{0x67,0xa6,0x67,0xee,0x0d,0x62,0x54,0xca,0x0a,0x8f,0x21,0x25,0x82,0xc0,0xcb,0x8b,0x6e,0xd9,0x7c,0xc9,0x67,0xdb,0x02,0x12,0x96,0xad,0x6a,0xa9,0x9f,0x0a,0xd3,0xa9,0x44,0x97,0x8c,0xfd,0xaf,0xf1,0x3f,0xe5,0xf8,0xc6,0xe8,0x8c,0xbd,0x83,0x1a,0x54,0x73,0xd0,0x74,0x2e,0x37,0x34,0xb3,0xe2,0xdf,0x00,0xff,0x32,0x40,0xa5,0xde,0x02,},"\xbc\x29\x8e\xd6\x98\x92\x90\x40\x28\x72\x5e\x21\xb1\x14\x46\x2d\x89\xd8\xc0\x06\xdc\x88\x4b\x17\x87\x56\x83\x8a\xf4\x95\x4f\xf0\xf1\xb7\x95\x17\x30\x7a\x25\x8a\x0e\x76\x81\xe8\x79\xac\x47\xd7\x92\x02\x30\xb0\xcc\x1d\x66\x17\x1e\xb2\x14\xd7\x7c\xd9\x7f\x61\x7c\x40\x5e\x6c\x21\x72\xfc\x58\x9f\x16\x25\xcc\x5e\x1b\x59\x31\x10\x53\x1f\x6e\xb5\x3f\x1e\x6f\x48\x6d\x19\x64\x61\x24\x47\x75\x0a\x04\x1f\xe5\x1b\x33\x2e\xb3\xfb\xc7\x11\x61\x6c\xe3\x5f\x04\x04\x42\xb4\x31\x63\xb8\x0b\x75\x1e\x21\xec\x12\x45\xf1\x2e\x48\x83\xc7\x9d\x3b\x41\x32\x82\xc6\x9b\xfc\x6a\x46\x5d\x1e\x78\x96\xba\xb0\x38\xdc\x89\xb4\xcf\xc0\x32\xfc\xcd\xfc\x87\xb0\x7f\x06\x11\x0e\x1f\x50\x6a\xcc\xa8\x15\x7a\x32\x25\x43\xbf\x1e\xd8\x90\x67\x27\xf2\x8d\x0d\x68\x9b\xcd\x7d\xd3\xdf\x85\x93\x52\x04\xa9\x04\xab\x3f\x7a\x0d\x99\xc1\x6e\x5a\x54\x2c\xc2\xbc\xde\xbf\x5b\x50\x2d\xba\xbe\x33\xb9\x72\x48\x0e\x02\xe7\x1a\x43\x8a\x19\x80\xa8\x76\x6f\x10\x8b\xd8\xad\x51\x10\x42\x23\x99\x4d\x9b\xfb\x3c\x3a\x4b\x7a\x59\x23\x8c\xe2\xef\x7d\x72\x88\x38\x3f\xfb\xf2\x91\xe1\x60\x2b\x38\x4a\xf6\x07\x00\xd7\xda\xf0\xe8\xfe\x60\xf8\xca\xed\xe4\x3d\xb0\x6b\x3f\x4c\x8c\xff\xf7\x49\xae\xaf\xa4\x6f\xc6\x1c\x49\xb2\xd5\xa4\x12\x04\xcf\x86\xf0\x49\x25\x4d\x80\x9e\x94\x98\xaa\x9d\x4c\xfd\xb9\x4a\xcb\x2b\xab\xfc\xf7\x86\xdd\xfb\x03\x69\x15\x16\xb3\x83\x8b\x0d\x4f\x20\x1c\xb2\x59\x1e\xdb\xb0\xb0\xf6\x74\xe1\xe2\x82\x03\x16\xb7\x2e\x81\xb4\x8c\xc5\xa6\xb2\x93\x38\xbc\x36\x68\x1f\x8f\x7d\xca\x43\xee\x6c\x0b\xd2\xe4\x02\xaf\xbf\x96\x77\x97\x51\x64\x53\xbc\x01\xbe\x86\xbf\x42\x29\x9d\x1b\x73\x6a\x0d\x97\xbb\xc9\x22\xf5\xa7\x8a\xf2\xdf\x42\xe6\xf8\xc2\x8e\x95\x3f\x2c\xea\xda\xff\xc5\xe9\x30\x64\x04\x1e\x42\x5a\xd6\x97\x5f\x88\xc7\xaa\xdf\x81\xc3\x68\x69\x1a\x58\x1e\x88\x5f\x2a\x6b\xa7\x2e\xd6\x8b\x8f\xef\xbc\xd6\xce\x36\x86\x26\xd4\x48\x92\xa2\x02\x70\xb5\xf7\x09\xc2\xe3\x4b\x83\x35\xd4\x2e\xeb\xd6\x7a\x24\xdf\x73\xf4\x54\x55\xc4\x19\x44\x18\x7b\x66\x92\xf0\x54\xb2\xfc\x95\x91\x37\x3f\x19\xfc\x71\xaa\x7f\xa2\x7d\xf6\x00\x6a\x1d\x54\x9b\xbf\xae\x7d\x3c\x3e\xb3\x6e\x5a\xb2\xaa\xa1\x0a\xa5\x53\x8d\xa7\xef\x36\xc8\xff\x35\x4b\x60\x58\x13\x40\x04\xd6\x60\xa4\x03\x63\x21\xca\xad\x00\xa3\x0b\x1c\x49\x8b\xa3\xd8\x08\xc4\x40\x5e\xf7\x96\x18\xfc\x22\x12\xa7\xb8\x33\x96\xa3\xd7\xce\xdc\xeb\x86\x3c\x66\x37\x4d\xc4\x69\xae\x18\x3c\x7e\xd7\x4b\x3e\x70\xd6\x37\x4a\x06\x2d\xe0\x37\x9b\x21\xcf\x25\xd3\xc4\xc5\x76\x21\x15\xcd\xfe\x75\x55\x45\xe8\x9a\xd4\x05\x2b\xb0\x27\x9d\x93\x8e\x90\xde\x3a\xbf\x50\x44\x10\xca\xad\x72\xb7\xc2\x9f\x53\xd0\x1d\x9d\xd7\xf2\xec\x5e\x45\x9a\x04\x59\x2b\xdd\x66\x41\x66\x13\xe6\xed\xd0\x04\x56\x9e\x0e\x6c\x98\x82\x7b\x8c\x1d\x70\x02\xa6\xd1\xbf\x30\x3e\x18\x25\x95\x01\xdd\x89\xf6\xee\x94\x76\x6d\x18\xaf\x81\x04\x63\xeb\x13\xb2\xef\xdd\xf1\x72\x3a\xf7\x35\xa8\x87\x16\xe1\xfc\xb4\xb7\xb4\x3c\xb9\x7e\x1c\xc9\x03\xb2\x40\x8e\xf4\x53\xad\xa4\x16\x47\x86\xf0\x08\x45\xfb\xfa\x1f\xfc\xa5\xcc\x3e\x1c\x4b\xd9\x94\x0e\x7d\x99\xae\xf9\x19\x16\x6d\x05\x8b\x51\x45\x3c\x9c\x14\xfb\x9f\x32\x51\xec\x5f\xe4\xf1\x53\xc7\x0a\x44\x92\xdc\x34\x96\x29\x61\x86\xf2\x3a\xd4\x7e\xba\xd1\x3c\x66\xe6\x87\x27\xce\x50\xba\x94\x87\xf1\x80\x18\x90\xb6\x93\xef\xeb\xfc\x37\xbb\x5d\x95\xf8\xaf\x54\x8e\xc8\xd6\x49\x82\x89\xe5\x5f\x98\x83\xfc\x5b\xe8\x4c\x25\x6d\x2b\xc5\x48\x49\x38\xc7\x09\x82\x0d\x9b\x6b\x80\x59\xc0\xaa\x42\x67\xdd\xe6\x90\x78\xe4\x87\xc8\x86\x5c\x0b\x13\x0a\x0c\xa8\xca"}, +{{0x6e,0x26,0x51,0x05,0xee,0x71,0x71,0xd1,0xbd,0x79,0x3e,0xff,0xd8,0x7d,0x1e,0x2c,0x79,0x45,0x0d,0x5e,0x18,0x8b,0x57,0xbe,0x3a,0xa1,0x62,0xe2,0xa5,0x25,0x28,0xad,},{0x1f,0x40,0x3c,0x7a,0x75,0x50,0x31,0xc1,0x3c,0xa6,0x3a,0xf5,0x76,0x35,0xdc,0x6e,0x2c,0x4f,0x23,0xbd,0x6b,0x1d,0x67,0xca,0x65,0xda,0x68,0xb0,0x99,0x43,0xc5,0x54,},{0xb5,0xa8,0x3a,0x11,0x7a,0x60,0x34,0x5a,0x67,0xe4,0xa6,0x65,0xf3,0x7d,0xe7,0x22,0xa6,0xec,0x03,0x91,0x38,0x29,0x38,0x99,0x59,0xf3,0x76,0xee,0x62,0x64,0x77,0xe6,0x54,0xac,0x8d,0x72,0x0f,0xc7,0x27,0xd4,0xbb,0x8f,0xe1,0x54,0x4f,0x5d,0x0b,0x0b,0x85,0x05,0x14,0x29,0x0b,0x24,0x27,0x3c,0x4c,0xd4,0xb7,0x3a,0xca,0x4a,0x53,0x00,},"\xf8\xb9\xd4\xb0\x27\xeb\xb1\x0e\xe5\x11\x81\x9e\x6e\x56\xfb\x1b\xa9\x58\x40\x18\x41\x8d\x82\x88\x5a\x38\xa4\x49\x08\x60\x07\xb8\x78\x5b\x51\x05\xca\xf7\x82\xbf\x9b\x36\xda\x03\x9c\xc6\x0e\x22\x7c\x7e\x16\x14\xf2\x9b\x64\x0b\x1e\x9b\x22\x74\x7e\xea\x7a\x67\x25\x61\x4e\x89\xe0\x78\x3e\xbe\xbb\xb7\xee\x55\x7e\xf3\x6b\x2b\x46\xcf\x64\x61\xe5\xbe\x2a\xd1\xd7\xa7\xc2\x71\x1a\x47\x5c\xa4\xfb\xc3\x30\x92\xba\x42\x56\x67\xe3\x4d\x09\x00\x60\x51\x8f\x2f\xec\x63\x6b\x04\x91\x23\x87\x6a\xb2\x1c\x8b\xd9\xc5\x0d\xcc\xb9\x84\xca\x01\x1a\x02\xee\xa0\x20\x56\x4f\xa8\x21\xfc\x36\x2b\xfe\x39\x2a\xab\x50\xc2\x73\xfc\x7b\x5a\x04\x21\x88\xe3\x31\x62\x1b\x9d\x2f\x74\x3e\x5c\x8c\xf3\xab\x1f\xaf\xfa\xfe\x2a\x00\x04\xc8\xef\x7c\xdf\x5e\x6d\xbb\x5e\xb5\x44\xe4\x28\x9f\x71\xa6\xfd\x15\xc6\x38\xce\x29\xd2\x8e\xfb\x9c\x03\x9e\x47\x74\x29\xa3\x49\x7a\x83\x82\x7e\x76\xce\x77\xa4\x98\x16\xd9\x0b\x41\xa8\xe1\x52\xf3\x7a\x09\xe6\x34\x0d\xfe\x06\x9a\x4a\xc6\xf2\x7d\xd2\xea\xc7\x47\xfd\x21\xe3\x15\x20\x88\xc1\xb1\xec\xd3\x2a\xc6\x79\x92\x74\x90\x75\x04\x88\xc2\x91\x78\x51\x47\xb6\x3b\x0b\x8f\xf1\x1d\x18\x9b\x90\x49\xb8\xa3\x96\xb6\x93\x2f\x85\xbd\x6a\x15\xef\xf9\xf0\xce\x18\x08\x41\x1a\xf0\xf9\xc8\xe6\xe9\x7b\x81\x4f\x11\x0b\xd4\xdf\x13\x86\xa9\x79\x7d\xc5\x11\xf0\xaa\xb6\xab\x65\x07\x1d\x9e\xa8\x36\x53\x2c\xec\x51\xb9\x2c\xa7\xfb\xdb\x8d\xe1\xc8\x43\x66\x58\xde\x2e\xb6\x5e\xdd\x86\x04\x4f\x6c\x1a\xba\x31\x78\x64\x7a\xd6\x78\x61\x2e\xe7\x4f\x04\x6c\xa3\xc7\xfe\x2f\x39\xc0\x9d\xd2\xe0\x7d\xf2\xb4\x22\x70\x85\xfe\x93\x6e\x79\x4d\x22\xfd\x5f\x40\xa2\x5f\x08\x77\x15\x80\xac\x80\x1d\x98\x89\xf5\xa7\x6a\xea\xe1\xf0\xcc\x4a\x9e\x1e\xdb\xdd\xa3\x75\x0c\x74\xc8\x50\x52\x4b\x32\xf4\x49\x33\xfd\x88\x3b\x53\x72\xbf\xb7\xe7\x61\xe0\x69\xfe\x7c\x1c\x0e\x7f\xbd\x4a\x7f\x58\x46\x7e\xa6\x88\x3f\x9d\x5b\x7f\x66\xd3\x86\xb0\x49\x9b\xb6\xfb\x5e\xad\x89\xc9\xa1\xfd\x2c\xce\xb9\x73\xe2\x87\x9b\x5d\x03\xea\xa4\x52\xe1\x60\x22\xd5\x96\x17\xda\xa0\x48\x6f\x4d\x4c\x11\x78\x07\xfd\xa8\x49\x9d\xfb\x7a\x28\x6f\xd2\xf7\x1a\x8e\xb5\xfe\x64\x06\x5c\x41\xe4\xe1\xe2\x36\x2a\xb4\xe4\x77\x96\x9e\x3a\x40\x8a\x24\x7e\x3a\x56\xfc\x86\xf2\xb0\x1e\xf8\xd3\xcd\xda\x87\x25\x82\x34\xbc\x7f\x25\xb6\x69\x07\xf3\x64\xb3\x7b\x62\x45\x29\x6c\x4f\xdf\x49\x9f\x20\x23\x7f\x48\x64\x85\x2f\xc5\xd8\xcd\x5d\x05\x41\x8b\xe8\xb1\x38\x59\xee\x9a\x43\xe1\x7e\x1f\x57\xa4\xc3\x5e\xa2\x82\xed\x68\xeb\xcd\xa6\x82\x81\x74\x24\x5a\x49\xc6\xcb\x65\x90\xeb\x1f\x2d\xcf\xb0\x07\xbf\xa1\xc3\x20\x77\x95\x6d\xa9\xac\xbe\x3e\xf0\x72\x37\x99\xfd\xb8\x69\xd8\xde\x30\x70\x6a\x9c\x02\x68\x14\xd1\x6a\x01\xe0\x33\xc9\x1b\x59\x07\x0d\xfe\x44\x5c\x5b\x84\x8a\x51\x66\x12\xe5\x13\x1f\xe8\x48\x69\x21\xe3\x6b\x8e\x7e\xf1\x57\xa8\x88\x22\x88\x6c\x68\x1b\x5d\xa7\x1f\xea\x94\xd9\x57\xda\xfe\xc2\x6f\x41\x47\xa3\xb2\xac\x38\x3a\x5f\x47\xc8\x58\x5e\xb1\x7a\x8a\xc6\x57\x90\x64\x1b\x42\x18\xd7\x55\xf8\xbe\xa4\xd9\x7a\xe2\xa4\x5b\xdc\xdc\x23\x23\x62\x94\xd8\x52\xc9\x5d\x08\x40\x6d\x2e\x9b\xd3\x0c\x32\x64\x52\x53\x8c\x1f\x5e\x50\x04\xd4\xa1\xa8\x27\x20\xda\x32\xe5\x9d\xc3\xab\x18\xea\x08\xa0\x58\xf7\x91\xd2\x44\x18\x55\x60\x86\xc1\xe4\xed\xce\x89\x82\xaa\x23\xb1\x18\xfb\x26\x6e\x60\xb5\x42\x78\x0a\x69\x33\xad\xd9\x13\x26\x55\x12\xc0\x7b\x11\x49\x78\xd4\x4a\xf7\x3b\x20\x30\xec\x47\xb0\x6f\xd0\x9d\xda\x8c\x4f\x1d\x4e\x31\x37\x75\x46\x8c\x45\x1f\x9e\xe6\x11\xe9\xcd\x4c\x08\x45\xc2\x50\x19\x48\xa7\xb1\x4e\xf1\xd4\xb5\xcf"}, +{{0xc4,0x37,0x0d,0x2a,0xaf,0x35,0xac,0xd1,0x58,0xfc,0x0d,0x16,0x22,0xa3,0x99,0xc9,0x9f,0x41,0xb9,0xda,0x4e,0x97,0x0b,0x35,0x4e,0x5b,0xa0,0x5c,0xbe,0x84,0x4c,0xa8,},{0x35,0x45,0xd7,0xd4,0xc9,0x5c,0x3d,0xb6,0xa5,0x45,0x30,0x53,0x7a,0xfa,0xfa,0x4d,0x86,0xdd,0xec,0xf9,0xcc,0x7e,0x66,0xc3,0x19,0xba,0x9f,0x7d,0xd7,0xd0,0x7e,0xe7,},{0x9f,0xeb,0xab,0x5a,0xe1,0x61,0xd6,0x92,0xa6,0xa3,0x94,0x50,0x0a,0x28,0x90,0xd2,0x1c,0x7f,0x0e,0xe2,0x6f,0x46,0x40,0xaa,0xba,0x4f,0xe6,0x6b,0x90,0xb8,0x9e,0xdc,0xb8,0x0e,0xa4,0xcd,0xca,0xbb,0x4d,0x2c,0x3a,0x5c,0x41,0x54,0xe8,0xff,0x20,0xd0,0xe2,0x37,0xfe,0xfd,0x00,0xc7,0xba,0x97,0x82,0xe1,0x74,0x8f,0x64,0x88,0xac,0x01,},"\x61\x9f\x57\xde\x2b\x1d\xba\xee\x20\x9a\x82\x5d\x8c\xa9\x7f\x84\xee\x49\xeb\x12\xa0\xb1\x3d\xcd\xd2\xb3\xa4\xee\x45\xe0\x17\x6d\x47\x4c\xf0\x94\x60\xc8\x31\xa8\xae\x1d\x3f\x39\xbe\xeb\xd0\x88\x08\xb3\xed\x17\x61\x21\x3b\xa9\x53\x42\x18\x60\xcc\x07\xe2\xdb\x31\x2e\x68\x0d\xf0\x3e\x60\xa6\x87\x02\x64\xab\xca\x8f\xd5\x13\x01\xe1\xc1\x56\x20\x23\xd8\x02\xcc\xd5\xc7\xd1\x96\xdb\x39\xfb\xb8\x30\x4b\x0e\x59\xe3\x33\x16\x41\x92\xec\xc3\x33\x38\x7e\xef\x69\xc7\xa7\x8a\x5d\x11\x25\x88\x62\xd6\xc2\x81\xb1\x9c\x0b\xd3\x36\xcd\x3e\xdb\x2f\x9f\xaa\xd4\x02\x1a\xc2\xf2\x05\xc1\x68\x14\xb3\x85\x48\x43\x3f\xf9\xed\xdf\xd6\x11\x33\x77\x97\x69\xdc\x69\xaf\xac\x65\x8a\xfc\x1d\x1b\x41\x6d\x39\x0a\xd5\xb4\x5a\x1a\xd5\xcc\x4b\x00\xb4\xb2\x78\xfb\xe4\xb5\x9d\x52\xe6\x1a\x6a\x5f\xd0\x02\x41\xc6\xcb\xc3\x82\xd2\xd6\x21\xa3\xde\xd0\x02\x01\x9b\x33\x05\x60\xe3\x61\xfa\xab\x28\xf4\x1d\x1a\xf9\xc9\xc0\x02\x0f\x2b\xaf\x99\xe8\xd8\xee\x58\xe3\x12\x22\x02\x14\x7c\x0a\xdc\x57\xd6\x70\xc5\xb3\x80\xaf\x59\x4c\xc7\xed\x57\xb8\x7e\xc6\x67\x4a\xb6\x3f\x3a\x98\x49\x75\x3b\x94\x62\xaa\xb5\xde\x88\xc9\x48\xa8\xb1\x09\xaf\x4d\x49\x54\x92\x7a\xac\x58\xbe\xe9\x53\xbe\x0d\x8d\x7d\x71\xaa\x11\xd1\x1f\x1a\x87\xb1\x47\x7b\x91\x70\xbd\x73\x5c\xfc\x24\x49\xf0\x51\xb8\x2b\xc5\x9b\x0b\xee\x76\xa1\x72\xe8\xd3\x26\x70\xf5\x1d\xdd\xdb\x80\x4a\xd1\x10\xa5\x65\xe3\x84\xcd\xb7\x6f\xad\x04\xcf\xf6\x78\x93\x09\x1e\x41\xe6\x9c\xfd\xf7\x0e\xa9\x26\xc2\x63\x69\xa5\xb6\x19\x3b\x19\xab\x0a\x62\x55\x8d\xa5\x5f\xfa\xfe\xb8\x78\x97\x57\x71\x06\x44\xaa\x19\xf4\x74\xbe\x4a\xda\x9d\xc1\x84\x9b\x07\xd5\xe1\x7b\x85\xf9\x21\xe1\x01\x6a\x54\xaa\x60\x95\x77\x72\x53\xa7\x34\x26\xfc\x78\x64\xb9\x95\x5f\x04\x90\x70\x23\xdb\x20\x7f\x85\xdd\x21\xa6\x51\x06\xcf\x0d\x62\x23\x85\x87\x0c\x34\xc2\xda\x9a\x11\xe4\x72\x63\x95\x12\x1e\x4a\x67\x61\xfb\x52\x22\x29\xd9\xe5\xcc\x9d\xab\x35\xae\xb8\x7d\x0d\x79\x69\x3c\x00\x6f\xde\x1c\xfa\xf1\x16\x20\x8b\xba\x96\x20\x59\xcf\xc0\xd2\xd6\x37\x0a\xac\x77\x48\x36\x2e\xe6\xa0\xa3\xca\x7b\xf1\x33\xeb\xcf\xa2\x0f\x1c\x4e\xd8\x30\x7f\x80\x0c\xca\x7e\x6c\x4b\xea\xa3\xfb\x2a\xb0\x86\x12\x53\x64\x28\x5c\x44\xed\x1a\x73\x7a\x67\xcb\xf3\xb7\x63\xc9\xf8\xb1\x42\x7e\x89\xdf\xa9\x6d\x29\x0e\x9d\x48\x42\xfe\x63\x16\xaf\xef\x83\x4c\xd8\xcd\x1f\xdc\x1f\x12\x4c\xa3\xfe\x26\x26\x6d\xa6\x2e\x27\x5c\x0b\xf7\xfc\xc8\xe5\xf9\xbb\xa6\xc0\xd3\x8e\x23\xfa\xfa\xb1\xe0\x49\x48\x17\x94\xc1\x4f\x4a\x8c\x53\xbe\x1c\x96\xf7\x69\xc9\xb1\x3e\xac\xa3\x9a\x0e\x49\x36\x6d\x2c\x9f\xfe\x8f\x20\x63\x60\xa9\xd5\x03\xde\xc5\x98\x62\x11\x12\xe3\x77\x67\x13\xe7\xfc\x06\x49\x43\x3e\x25\x7e\x50\x3a\x54\x60\x59\xa9\x89\xda\x89\x15\x7d\x76\x47\x60\x05\xfd\x90\xe4\xb0\x7a\xaf\x0d\xb0\xbc\x0b\xc0\xb6\x7d\xb8\xdc\xba\xdf\xf3\x93\x74\xe1\xaf\xae\x55\x16\x34\xe0\xe3\x28\x31\xad\x0e\x5f\xa7\xd5\x21\x6f\xa7\xc6\x44\xf7\x3e\x1e\x8e\x07\x23\x83\x94\xa4\x16\xc1\x69\xaa\x9d\x53\x03\xf4\x69\xa5\xd4\x07\x43\x08\x72\x1f\xfd\xde\xff\x65\x59\xe5\xad\xf0\xc2\x77\x3b\x3f\x52\x64\xe7\xaa\xa8\xc2\xdb\x88\x8e\x28\xe8\x15\xc7\x10\x69\xc3\xb4\xce\x6c\x29\x03\x4c\x0a\xb3\xb5\xc1\x9a\x80\xa9\xd8\xc2\xe8\x74\x81\x35\x31\xc4\x22\x75\x2a\xd6\x2b\x3c\x5a\x1a\x3d\x6c\x5a\x5d\xb5\x87\x27\x06\x93\xaa\x75\xd5\xf1\x72\xee\xdd\xf4\xeb\x83\x9b\xd7\x93\xaf\xfb\x1c\x79\x6a\x1d\xf0\xe4\x42\xdd\xf9\x9b\x78\x0a\xa4\x1e\xea\x0f\xe6\xf8\x65\xbb\x53\x9c\xa5\x3a\xa4\x5d\xb9\xa8\x56\xcb\x75\xd0\x15\x1d\x35\xed\xea\x80\xf2\x94\x6d"}, +{{0xbd,0x3d,0xe1,0xa1,0xd1,0x64,0xbd,0x6e,0x9b,0xe0,0xa6,0xd1,0x07,0xf7,0x03,0xa6,0xdd,0x91,0x4c,0x86,0x67,0xcd,0x34,0x1d,0x13,0x9f,0x19,0x57,0x8d,0x93,0x3b,0x16,},{0x9b,0x02,0x49,0x64,0xbd,0xfa,0x85,0x2e,0xb2,0xd4,0x14,0x4f,0x35,0xb7,0xcd,0xc2,0x67,0x81,0x14,0x3c,0x2b,0xd7,0xf6,0x60,0x23,0x3f,0x8b,0x8a,0xa3,0x60,0x71,0xee,},{0x13,0xcc,0x15,0x8f,0xd0,0x61,0x79,0x2f,0xce,0xd1,0x56,0x87,0x95,0x98,0x25,0x1d,0xd0,0x1d,0x57,0x5b,0x40,0x0f,0xe3,0xe3,0x9a,0x70,0x08,0x63,0xaa,0xe8,0xdb,0x1f,0x91,0x97,0xfa,0x50,0x1c,0x0c,0xf9,0x93,0xe4,0x4d,0x6a,0xc5,0x51,0x80,0xb8,0x69,0x83,0x8e,0x8a,0xe2,0x4b,0x21,0x4f,0xa3,0x5e,0x24,0x4b,0x7a,0x6c,0xff,0x6d,0x0d,},"\x17\x69\xfc\xdb\xf5\x12\x47\xed\x4c\x83\xa0\x0b\xbb\xf0\x2f\x44\x28\xda\x6f\xce\xdd\xd0\x16\x1a\x02\xfc\xcd\x15\x00\x97\x06\x65\xe1\xc7\x63\x0a\xd2\x2e\x3d\x97\x49\xc7\x92\xe7\x1a\x26\x0c\xff\xf6\x05\x32\x56\xe0\x2f\x5b\x47\xbb\xa1\x4b\x76\x1a\xe5\x3c\xa7\x21\x9e\xd2\x80\x1d\x2d\x78\x8e\x26\x41\x9f\x36\xc8\x1e\xf9\x2c\x23\x03\x68\x37\x35\xc8\xa1\x75\x6a\xda\xb6\xa4\x87\x92\x31\x53\xe4\x35\x60\x3c\x96\xb2\x39\x55\x3e\xdf\xde\xb0\x93\x29\x8f\x7a\xe7\xdc\x90\xf1\x6a\x7e\x56\x64\xb9\xe4\xc0\x2b\xa7\x31\xa2\x3c\xf2\x23\x4e\x25\x0a\xc9\x74\x26\x33\xa9\x32\xa9\x48\xbb\x83\xdc\x3d\x79\x4d\x05\x9f\xed\xf4\xec\x86\x18\xc7\x43\x3c\x5d\x8f\xe5\xe6\x2c\xf0\x7b\x57\x68\xc4\xd9\xb2\x61\xc7\x15\x36\x80\x4f\xe2\xe7\xca\x70\x98\x87\x65\x21\xd5\x76\x77\x36\x14\x24\xe4\x7f\x1b\x95\x92\x37\xf9\x07\x10\x42\x1f\x5b\xc4\xf1\x09\xf7\xd4\x89\xc7\x55\xe9\x4e\xef\xdf\xb3\xc8\x5b\x90\xec\x01\x31\x81\xa2\x3b\xb9\x53\x5f\xee\xa4\x94\x1d\x0a\x06\xa5\x40\xbd\x6b\x58\x8e\x55\xb7\xf3\x57\x57\x14\x9c\xa3\xe6\x40\x96\x5e\x1a\x0f\xf7\xf3\xc8\x25\x92\x59\x95\x7f\xf5\xda\xb9\xfb\x87\x32\xea\xe7\x19\xb6\x24\xa4\x49\x28\x78\x17\x9b\x5a\x83\xab\xe5\x1c\xaf\x02\x08\x3d\x73\x7c\xeb\x4f\xcf\x04\x2f\x2e\x60\xba\x02\x97\xac\x72\xb8\x7f\xe3\xe1\x4b\xa5\xfb\xc5\x4b\x48\x09\x10\x73\x89\x68\x23\xbf\xa2\x89\xce\x8e\x16\x87\x3b\x48\x81\x2c\x32\xbf\xea\x5f\xf6\xbb\x22\x1d\x1e\xa5\x46\x3d\x32\x5b\xbe\x31\x1e\x7f\xd1\xe7\x83\xde\x65\x0b\x79\x52\xea\xe4\x61\xd6\x3b\xc7\x47\x05\x22\xaf\x5b\x77\x89\xf8\xfc\x2e\xb1\x92\xd2\xcf\x77\x6c\x5c\x24\xb4\x4e\x29\xcd\xb0\xcc\xcb\x1d\x90\x36\x14\x38\xe4\x95\x0f\xf3\x4d\xbc\xb3\xcb\x0e\x81\xcc\x45\xf8\xd0\xff\x57\x09\x49\xf7\x80\x84\xe1\x06\x0f\xf5\x59\x4a\xd5\x16\xf5\x0f\x1c\xb0\xa7\x65\xe1\xc0\xe0\x38\xd5\x94\x3b\x93\x6e\x4a\x8b\x49\x33\x54\xe7\x9a\xbc\x91\x7b\xb9\x27\x12\x66\xee\xba\x77\xa9\x3a\x65\x7f\x9a\xd8\x7b\x29\x1a\xc7\xea\x38\x6f\x5d\x4f\xcb\xc5\x82\xe7\x2d\x5c\x23\xd9\x2b\xa9\x44\xb0\x06\x4c\x20\xe3\xe2\xdc\xf5\x04\xbc\xc7\xc6\x96\x6c\x63\xf2\x08\x08\x43\x60\x0b\xa3\x13\xec\x27\xcb\xa9\x5e\x7e\xf3\x18\x16\x8c\x90\x67\xdc\xe8\x6c\x1e\xf0\xd5\xd9\xeb\x7a\x61\x58\x48\x9d\xf3\x2e\xd5\x8b\x69\x31\x03\x08\x18\xf0\x07\x05\xa0\xdc\x55\xd3\xdb\xf8\x00\x6a\x85\x46\x64\x1b\x18\x65\xd9\x19\xbc\x24\x22\x02\xcb\x3a\xe3\x00\xbf\x86\x53\xe3\xb3\x78\x94\xc3\xdc\x0e\x47\x7b\x9d\x7c\x41\xba\xf8\xd3\x88\x7c\x2e\xb5\x9b\x1e\x4d\x50\xbb\xb6\xf1\x79\x2a\x1c\x93\x67\xc6\x5c\xdb\x45\x0c\x2d\xfa\x21\x45\xe6\x11\xa9\x7a\xd8\x1c\xff\x1f\xd8\x3c\x6c\xf7\x23\x09\x47\xea\xff\x4c\x21\xdc\x1b\xaf\xb7\x1e\xc4\x1e\x5b\xc7\x2b\x37\x45\xec\x3e\x38\xbf\x59\x30\xc1\x26\xd0\x60\xf0\xc5\x0a\x89\x5f\x00\x9a\xa1\x8e\x87\xf2\x17\x4f\x58\xab\x53\x79\xa7\x21\xfd\x83\xaa\xd5\x51\x7f\xd9\x9d\xff\x14\x6e\xde\xea\x61\x52\x12\x35\xe2\xf1\xa1\x6e\xe5\x83\x03\xe0\x91\xbe\x8d\x57\x90\x94\xc1\xd8\xa2\x0b\xc7\x4a\x55\x0d\x77\xc0\x0d\x08\x75\x71\x51\x7a\x63\xcd\x41\x26\x93\x3a\x4f\x09\xa0\x70\xbf\x8e\xa4\xff\xb8\x46\xa9\x78\x0e\x97\x34\x04\x3b\xac\x4c\x0f\xf4\x7b\x1a\xfc\xcf\x52\x93\xac\x14\xbc\x73\xeb\xf6\x71\x29\x65\x7e\x4b\x8a\x8b\x33\xdd\xac\x7b\x0f\x4d\x71\x9d\x2d\xc6\x5d\xf6\xea\x0a\x3f\x24\xcf\x44\xc8\x33\x8e\xd6\x01\xa3\x93\x9c\xa3\x58\xfc\x4b\xe1\x3e\x8e\xde\x02\x75\x39\x71\x2c\xa2\x3e\x3f\xfb\xa7\x06\xe8\xfd\xd6\x2a\x07\x4e\xe0\xad\x74\x20\xf7\x80\x60\xcc\x96\xfb\x2a\xbf\x30\xe9\xea\xa2\x41\xc0\xf8\x7e\xbb\xe3\xec\x73\x51\x75\x96\xf7\xc3\xc5\xa8\x0c"}, +{{0xf6,0xae,0x51,0x6a,0x51,0x29,0x6f,0xc5,0x23,0xce,0xa5,0xf0,0x08,0xcf,0xbd,0x09,0xe7,0x3f,0x78,0xb6,0xfd,0xd3,0xb6,0x94,0x26,0x12,0x80,0x41,0xa5,0x60,0x4c,0xf9,},{0x37,0x6c,0x82,0xba,0x7b,0x87,0xaa,0x77,0x41,0x87,0x27,0xdb,0x33,0xd3,0x26,0xae,0x75,0x8b,0xf7,0xa1,0x35,0xc1,0x04,0x60,0xcd,0x8b,0xf8,0xfe,0xb8,0x3c,0x2b,0x10,},{0x0f,0xe4,0xdd,0x7e,0x1f,0x60,0x8e,0xe8,0x2b,0x7f,0xe8,0x63,0xd1,0xb0,0x3a,0x81,0x84,0x3c,0xe2,0x0c,0x76,0x2c,0xd8,0xbb,0x24,0xef,0xd4,0x6b,0xa0,0x25,0xff,0xf3,0x33,0x1d,0x87,0x57,0x52,0xca,0x72,0x20,0xc5,0x3d,0xd3,0xc7,0x1f,0x2b,0xc1,0xe2,0xc6,0x4a,0x2f,0x9c,0x58,0x86,0x5a,0x2a,0x24,0x48,0x09,0xf4,0x13,0x4e,0x53,0x07,},"\x83\x42\xf2\x5a\xc4\xb1\x7e\xba\xd6\xf7\x9b\x9a\x03\x31\x75\xc7\xf2\x8a\xf0\x9e\x65\x8e\x8c\xb9\x8c\x29\x4f\x15\xc3\xc8\x34\x26\x29\xcb\x2a\x32\x47\xdf\xc8\x75\xb8\x2f\x5b\x38\x0c\x5d\x11\x42\x6a\x2e\xeb\x62\x45\x0b\xd8\x85\x65\x01\x07\xc6\x83\x62\xa3\xb7\x2c\xe8\x23\xf2\xd1\x59\x42\xb7\xdd\xa3\x01\xd2\xfb\x63\x8f\x30\x2a\xa9\x57\x0b\x47\x91\x1d\xad\xd3\xbd\xdb\xfe\xd5\x54\xc1\xc8\x0b\xd7\x18\x07\x8b\x8b\xd2\xc9\xc3\x14\xa5\x16\x6f\x26\x5e\x82\x66\xee\x2d\xb3\x57\x56\x1a\x55\x85\xc4\x14\xa7\x84\x0b\xfa\xe6\x09\xd7\xcd\xdd\xe1\xfa\xde\x85\x56\x0f\x23\xd6\x38\xef\x3d\x52\xe5\x1f\x5c\xf3\x13\xa0\x72\xc5\xea\x0f\x81\x7f\x72\x81\xe2\xcb\xa5\xc5\xc8\xd2\x6c\x92\x85\x92\xb8\x1f\x0f\xf8\xcd\x18\xdb\x5a\x2c\x41\xd8\x80\xd7\x44\x73\x86\x3c\x7b\xbd\x00\x56\xfa\x4d\x4a\xfa\xbd\x17\xa3\xb8\x9d\x97\xd3\xfe\x5d\xc0\x6b\x0f\x61\x2a\x1d\x66\x42\x39\x23\xba\x8d\xfb\xb8\xec\x82\x46\x62\x4d\x83\x78\x4e\xba\x4f\x57\x36\xba\x38\x5e\x44\x22\x96\xc8\xcb\x0f\x1b\x68\xe0\x33\x42\xb2\xc6\xc1\x03\x34\x6f\x6d\xd7\x40\xe2\x6c\x3d\x13\xca\xef\x80\x1d\x1b\x26\x21\xd8\x9f\x06\x93\x91\xa0\x78\xd4\x3a\xe6\xff\x12\xee\xca\x66\xbc\x32\x63\x7b\x45\xf0\xac\x62\x7c\x2d\x7b\xbf\x8a\x49\xd9\x46\x81\x75\xe2\x68\x85\xe0\x28\x21\xd3\xa3\xba\xa2\xc3\xe3\xa6\xbb\x96\xb5\x75\x26\xe2\x24\xcf\x3d\x85\x9f\x66\x95\x73\xcb\xd5\xc8\x73\x93\x74\x61\x56\xf3\xd1\xc7\xa8\x03\x08\xdc\x1f\x24\x05\xbf\x0d\x40\xbe\x1c\xa7\x3b\x76\x7d\xed\xf4\x03\x13\x37\xc0\x81\xbf\xa3\xae\x6e\x54\xf6\x02\x3f\x42\xf0\xcb\xd8\x77\x62\xdb\x55\x91\x3c\x70\x72\x06\x03\x40\x10\xdf\x2a\xa8\x75\x3d\x03\x0f\x03\xc2\x67\xe7\x1a\x9d\xd2\xc6\xc1\x9d\xe3\xe1\x85\x1a\xbf\xac\xbb\xd5\xdd\x5b\xf8\x96\xfa\xb8\xe4\x15\x31\x7b\x49\xf1\xe4\x09\x6e\x3d\xa9\x9a\x5b\x5d\x0a\x3c\x42\xda\xf9\xde\x94\x84\x7c\x1e\x53\xc8\x81\x8a\x5b\x84\x33\x23\xf5\x01\xe3\xa7\xfa\x68\xdf\x89\xa5\xf4\x1f\x2c\x62\xc3\x8d\x17\xf2\x50\xb0\x2a\x67\xfa\xe4\x7d\xaf\x06\x3f\x55\x89\x42\x37\x7e\xf8\xa8\x90\x52\xf1\xa2\x15\xd7\x68\xf7\x91\x3a\x7e\xc1\x4e\x98\xb8\x1e\x4b\x2c\xcf\x26\xba\xca\xd6\xf3\x96\x64\xaf\xc0\xe9\x1a\x3c\xad\x69\x1d\xb2\xbf\x56\xa7\xab\x66\x77\xb4\x95\x96\xdb\x88\x7c\x97\xde\xf4\x35\x08\xa7\xa2\xec\x2a\xb7\x55\xec\x36\x8e\x2e\x53\xd1\xe1\x6b\x60\xff\xf0\x9c\x3b\x52\x26\x3f\x0f\x7c\x1e\xa9\xcc\x35\x37\x31\x97\xe9\x5c\x11\xe6\xd2\x2f\xa9\xd8\x29\x9c\x42\x37\x36\xf5\x81\x4f\x1e\x79\x8d\x22\x75\x18\x60\x0d\xf6\xa7\x90\x35\x8d\xea\xe3\x8d\x56\x39\xe1\x98\x3f\xe0\x18\x43\x6e\xa5\x8b\xa8\x46\x75\x48\xc9\x29\xef\xbb\x16\xdf\xea\x41\x02\x25\x3a\x35\x0f\xb8\x4d\x98\x31\xc4\xc2\xcb\xcb\x76\xe1\x8d\x7f\x3e\x95\x36\x41\xad\xa4\x14\x21\x39\x30\x91\xe6\x3d\xfe\x66\xde\x24\xc9\x92\x32\xc7\xd6\xa2\x83\x7a\x48\x98\x3c\xf5\xb1\x63\x31\xce\x00\x05\x0d\x1c\x71\x39\x58\xff\xce\x5f\x2e\x93\x48\xc5\x2f\x53\x12\x05\x79\xa7\xc9\xa1\x60\x08\xd1\x34\x83\x8e\x59\x61\x29\xc7\x02\xfc\xd2\x11\x48\xbd\xf9\x17\x4d\x48\xe2\xda\x0a\x8a\x66\x35\x9e\xde\xe0\x1c\x50\x09\xef\x67\x42\xfe\xc4\x1c\x1a\xce\xcd\x03\xef\xe1\xcc\xc9\xb1\x30\xd6\xe5\xac\x92\x57\x6a\x85\xcc\xb7\xcf\xc7\xd0\xe4\x23\x31\x06\x17\x29\x31\xa0\x86\x99\x79\x0b\xc4\x1a\xcf\xbb\x73\x1a\xdb\xb2\x6d\x56\xb3\x9a\xaa\x5b\x33\x3b\xc1\xa1\x0e\x2c\x70\x64\xca\x86\x11\x9d\x8c\x71\x71\x48\xf9\x24\x41\xaf\x24\xcd\x2a\xa8\xf5\x7c\x86\xba\x38\xa5\x9a\x10\x0b\x92\x76\xdf\x38\x27\xec\x7f\xb4\xd3\xfa\xf5\x8b\xe3\x1c\x6e\xca\xfd\x69\xcf\x1c\x64\x10\xa4\x9c\xd7\x08\x1f\xf6\xe9\xfc\x39\x7c\x2d\x20"}, +{{0x83,0xf7,0x89,0x90,0x0f,0x04,0x0d,0xc6,0x2f,0x4d,0x18,0x78,0x4c,0xb6,0x4b,0x63,0xc8,0x8e,0x8d,0x18,0x00,0x16,0x96,0xbb,0xeb,0x47,0x07,0xc4,0x69,0xd1,0x1a,0x5b,},{0xed,0xfc,0x2b,0xab,0x7e,0x79,0xf4,0x00,0x37,0xfe,0x4d,0x90,0x41,0xde,0x48,0xda,0x9a,0xee,0x8f,0x97,0x80,0x98,0xd7,0xb0,0xae,0x17,0x92,0x90,0x25,0xe4,0x27,0x3d,},{0xea,0x65,0x82,0xcc,0x23,0xe0,0x46,0x09,0x17,0xf7,0x82,0xd9,0x64,0xe3,0xbb,0x6d,0xcd,0xe0,0xae,0xea,0xc4,0x2c,0xc1,0x49,0x19,0xd3,0x6c,0xe7,0x8a,0xa0,0xaf,0xd9,0x80,0x72,0xf5,0x4c,0x79,0x5f,0xbf,0xd7,0xa4,0x1d,0x99,0xd7,0x06,0x06,0xc2,0x8a,0x5d,0xcf,0x19,0xbe,0x38,0xa0,0xce,0x2d,0x09,0xbb,0x8f,0x84,0x4c,0x31,0xbf,0x00,},"\x6c\x11\x2a\x20\xd3\x06\x57\xab\x5f\x8c\x5c\x04\x47\x8d\x6c\x42\xd1\xc6\xbd\xef\x38\xcd\x4f\xe0\x06\xac\x2a\x57\xe2\x90\xff\x29\x28\x78\x96\xee\xa8\xc3\x0a\x01\x39\xc1\x8f\xc8\xc9\x75\x64\x56\x3e\x86\xc8\xd3\x40\x56\xa6\x71\x9b\xfe\x47\x9d\x9e\x87\xe8\x1b\x19\x45\x23\x31\xbf\xa1\x54\x80\x68\x82\xe5\x03\x9a\x20\xc9\xe9\x54\xb1\xfc\x7c\x01\x5d\xcf\x58\x15\xbd\x7c\xf7\xb6\x35\x7d\xf9\x28\x0b\x9b\xd4\x3f\x89\xff\xc9\x19\x45\x32\x3b\x5a\xcb\x2a\xe0\x02\x54\xd4\x16\x28\x68\xd1\xc8\x3e\xc6\xe0\xfc\xbe\x7a\x8a\xb9\x25\x41\x92\x14\x9c\x6b\xc9\xe5\xfe\x35\x06\x94\x16\x5d\x66\x38\x33\x1e\xb2\x4e\x3b\x13\x90\xc6\x98\xc4\x83\x83\x78\xc0\x1b\x2c\x61\xa3\xeb\xe2\xc0\x60\xb9\x8b\xa6\xee\x02\xb5\x19\xb4\xea\xc1\xe0\xbc\xc0\x9b\x23\x24\xcc\xf5\xb1\xa7\xfe\x8f\xd0\xb1\x54\x5a\x94\x27\x83\x2a\xbb\x25\x74\x4e\xeb\x36\x32\x6b\xe6\x4e\xfe\xd3\xa7\xb0\x7d\x63\x0a\x21\xc3\x08\x1b\x55\x26\x1c\x35\x32\x87\xc6\x6c\x57\x66\x3a\x99\xdb\x46\x6a\x5d\xee\x22\x74\x6b\x81\xc7\x50\xef\x85\xbe\x51\x14\x3e\x22\x1e\xcd\xf1\x14\xfe\xf1\xb3\x08\x2f\xf5\x4f\xd0\x44\xbc\x88\x4b\xfb\x3c\xc5\xc5\x33\x59\x97\x00\x98\x67\xce\x94\x91\xa8\x0f\xe6\x96\x82\x5f\x99\x42\x6d\xef\xab\x6a\x49\xba\xdc\xde\x40\x3f\x58\xe8\x31\x79\x66\x21\x07\x47\xb5\x67\x75\x4d\xe5\x30\x76\xb3\xec\xbf\x65\x34\x6c\xb8\x39\x05\x83\x2e\x16\xd0\x1b\x50\xb9\x3d\x37\xeb\x9b\xfe\x20\x17\x2a\x31\x63\x0d\x25\xf3\x21\x7d\x87\xd9\x34\x65\xfd\x8a\xc5\x54\xcb\xbb\x39\xd9\x82\xea\xd7\x21\x93\x91\x23\x4c\x88\x9f\x0b\x92\xa2\xe0\x41\x3d\x86\x6c\xac\x08\x7d\x62\x8c\xe3\x1c\x61\xc6\x32\x3e\xcb\x8e\x68\x95\x55\xaf\x10\xde\x2b\x65\x6e\x6a\xea\x2c\xde\x93\x2e\x24\x1f\x6d\x1f\x8a\x9e\x33\x16\xcf\x13\xf1\x35\xac\xef\x83\xa0\xc0\xcf\x22\xf9\x5c\xa8\x18\xe6\x1f\x92\x76\x87\x74\xc6\x30\xe0\x92\x5b\xe9\x9d\xbd\x32\xb4\x99\xc0\xfe\x7d\x84\xa4\x2e\x39\x32\x87\xf6\xf5\xce\x3d\x0b\x27\x1f\x17\x00\x45\xa6\xd4\x8e\xab\x31\x6f\xe1\x7b\x18\x58\xb1\xff\xee\xe9\x08\x88\xf3\xa3\x7a\x24\x80\xdf\xd0\x4a\x4a\x86\x29\xf8\x68\xb5\xc0\xa8\x0e\xe1\xf0\x37\x19\xf3\xa4\x7d\x40\x95\xbe\xf1\x0e\x02\x34\xfc\x30\x0e\x2a\xf4\x82\x28\x5d\x78\x93\x79\x68\x31\x9d\xa9\x4b\xeb\x6c\x40\xe0\x78\x57\x7c\x02\x4f\x3a\x5c\xda\x00\x84\xe2\xf8\x55\xa9\x39\x6a\xaa\x9e\xe9\xbf\xaf\x2c\xc7\x71\xfe\x68\xc4\x0b\x62\x9e\x8d\xcf\x11\x5e\xf0\x3e\x75\x7a\x2a\xc9\xee\xf0\x73\xf1\xbd\xf9\xc5\xa4\x41\x00\x31\x55\x8a\x6d\x38\x2b\x5f\x16\x02\x4b\x15\x1b\x1c\x01\xee\x78\x17\x41\x3a\x3c\x4d\xe9\xdd\x64\x78\x78\x5b\x81\x10\x1d\xf5\x52\x24\x30\x05\x87\x80\x20\x7e\x79\x0f\x61\x2d\x78\xe5\x70\x5c\xee\xd4\x6b\x0e\xc0\x75\xe7\xc1\xdc\x07\x3b\x17\xb2\xb4\x3d\x72\x53\x59\x27\xbf\xd2\x71\xe9\x2e\x3c\x93\x63\x8e\x40\xa9\x60\x1d\xc2\xc1\xab\x76\xd9\x1a\x41\x03\xdf\x65\x7d\x91\x1c\x82\x9e\xe8\xa5\xf7\x47\xf7\x64\x2f\x5a\x91\x5a\x5f\x40\xf6\x30\xb4\x30\x39\xc7\xd4\xbd\x2a\xd2\xb3\x21\x29\xd9\x4e\x5b\x2f\x03\xad\x4a\x3d\x45\x57\x7e\xb8\x1f\x36\x9c\x9e\x3e\x2a\x4f\x6a\x8e\x41\xac\xf8\x28\x3b\xe5\x84\x25\xea\x99\x3b\x8e\x98\xee\xa6\x33\x05\x56\x64\x86\x18\xda\xd9\x8f\xa2\x55\x62\x0d\x83\x6d\x3c\x7f\x29\xb9\x07\x89\x58\x49\x28\x61\x67\xc7\x18\x1e\x2c\xaf\x55\xc2\xc1\x84\xa9\xa9\x11\xf8\xe4\x1c\xb0\x42\xe2\xcd\x48\xb0\x54\x4e\xa7\x9f\xe2\xef\x38\x1e\xbc\x5b\x15\xe3\x9a\x9b\x5c\x6d\x99\x8f\xae\xaa\xa7\x77\x3c\xfe\xc0\x84\xc0\xbf\xae\xd1\xbc\xab\x96\x3a\x4e\xf3\xd9\x4d\xbb\x3d\xfe\x72\x4c\x04\x0c\xe4\xd1\xe2\xee\x7f\xc2\xda\x4b\x25\x12\x7c\xe3\xa5\xdf\x69\x3f\xcf\x5a\x6e\xd1"}, +{{0x43,0xbf,0xf3,0xcd,0xd5,0x30,0x7e,0xd7,0xd2,0x5c,0xf9,0x6f,0xdb,0xba,0x64,0xab,0x18,0x11,0xc8,0xbb,0x93,0x4e,0x21,0x87,0xea,0x7f,0xfc,0x01,0x8d,0x85,0xe0,0xf2,},{0x00,0xf1,0xb5,0xd3,0xca,0xc6,0xe5,0x6c,0xa5,0xf8,0x94,0xd4,0xcd,0xbf,0x9b,0xeb,0xd9,0x68,0xd2,0x4d,0x5e,0xff,0xa5,0x05,0x8b,0x0e,0x20,0xbb,0x08,0x98,0xf6,0xf1,},{0xa6,0xb5,0x6b,0x76,0x86,0xdf,0x1d,0xc5,0xf4,0xed,0x54,0x4a,0x4d,0x97,0xe6,0x70,0x36,0x19,0x5a,0x32,0xb2,0x2e,0xcd,0x5d,0x31,0xea,0x17,0x30,0xe6,0xed,0x8f,0x81,0x0d,0x25,0x8b,0x44,0xc0,0x8e,0xa4,0x5f,0x03,0x2b,0x93,0x74,0x41,0xb7,0x2c,0xd0,0xdc,0x37,0x55,0x6f,0xd7,0x87,0x4e,0x9f,0xe6,0x4f,0x15,0x76,0x5c,0x52,0x10,0x03,},"\x64\x6f\x8b\x34\x18\x2d\x5e\x60\x2b\x51\xca\x73\x29\x34\x7c\x0e\x19\x8c\xb7\x47\xe4\xda\x0a\x6b\x80\xf3\xf6\xf9\xf3\x36\xf6\x70\x8d\x85\xcb\x42\x9a\xb2\xd6\xbe\xd3\x5d\x50\x13\x12\x9c\xd1\x00\x14\x2c\xdd\xce\xe8\x63\x51\x79\x02\x1b\x3e\x24\x92\x2b\x81\xae\xf1\x3c\x13\x70\x28\x69\x39\xd6\x3d\x6b\x6a\x41\x95\xed\xa1\xd8\x12\xca\x51\x82\x04\x76\x8f\x87\x34\x8c\x68\x89\x55\x2c\x63\xd1\x37\x2c\xde\x6a\x5e\x9d\xaa\x7f\x84\x45\xec\x8d\x61\x30\xa3\xf5\xae\xf0\xed\xea\xce\x01\x0b\x6c\x7f\x0b\x9d\x24\x16\x2a\x8d\x04\x45\x4b\x81\xd4\x8e\xa9\x09\x7b\xd8\xdf\x09\x34\x59\x71\x9c\xcb\x54\xaa\x10\xf5\x1c\x24\x6a\xa9\x9c\x58\x0b\xea\xf9\xc9\xc5\xbc\x60\xfa\xf0\xae\x5c\xec\x7f\x51\x37\xf6\xc5\xc1\x44\xdf\x45\xd1\x2e\xe9\x95\xad\xcc\xf2\x5a\x9d\xb8\x1b\x85\x58\xbd\xfb\x65\x83\x01\x86\xe7\xb9\xd4\xee\xd9\xf6\xb4\xd7\x32\xb1\xb5\x82\x2d\x03\xeb\x01\x7c\x07\x24\xf4\x8f\x87\xba\xaa\xe1\x04\x5d\x6f\xdb\x12\x5c\x91\x34\x06\x4f\xaf\x18\xdb\xed\x58\xd8\xfb\xac\xea\xcd\x4f\x09\x7d\xf9\xb3\x42\xe5\xc4\xa5\xbc\x85\xb2\x95\x97\xd4\xb6\x40\xf1\x55\x1c\x5b\x62\x4a\xb2\x1b\x48\xe9\x4a\x90\x30\x04\x9b\xe1\xf0\x5a\xa8\x51\xd0\x82\x7e\xaf\x87\x00\xdf\xe1\x47\xfd\xcd\xee\xdb\xc9\x8c\x4f\x15\x77\x4f\x01\x20\xfb\x59\x70\xa2\xf8\xb2\x17\x94\x34\x0b\x62\x83\x79\xa8\x02\xb9\xf7\xc0\x68\xb0\xdf\x63\x19\x3e\x51\x0f\xc7\xb2\xaf\x97\xee\x38\xde\x47\x92\x97\x85\x53\x55\x28\xd3\x50\xd8\x86\x20\x61\x0c\xfd\xb5\x5d\x24\x9e\x38\xfb\x73\xc8\x28\x71\x13\x91\x9c\xe3\x32\x67\xd7\xdb\x92\x4e\x49\x19\xa4\x4e\x6e\x29\xa9\x0d\xbe\x3b\x7b\x0d\x39\x21\x16\x3f\xeb\x5a\xc1\x05\x62\x4e\xd8\x52\xbe\xce\x35\x38\xe9\x91\x93\x30\x0c\x89\x33\x45\x69\x93\x50\xa8\xf9\x9e\x8c\x6a\x41\x09\x5f\xc9\xfc\x08\xda\x07\xf7\x57\x11\xf7\xdf\x03\x44\x06\xde\x14\xed\xd8\xe2\x2a\x63\x3a\x86\xe4\xa5\xa5\xc9\x75\xac\x5d\x34\x89\x1c\xcc\xfc\x85\x43\x77\x1f\xfa\x08\x0e\x0b\x45\xd6\x5a\xb8\x30\xa3\x61\xac\x4c\x42\x62\x94\xd3\x68\x5e\xa8\xc2\x60\x39\xc7\x1c\x90\xfc\x3f\xb5\x12\xbe\x9f\xc9\x48\x07\xd7\x6d\xbd\xaf\x8f\xfa\xa4\xfb\xf9\x84\x9d\x68\xe8\xa5\x7d\x30\xc4\xa0\xb9\x73\x5c\x23\xf0\x8e\xf2\xe2\x84\x45\x84\x67\xe1\x5d\x66\x53\x62\xcb\x64\x6f\xde\x69\x37\xec\xba\x53\x09\x12\x64\x63\x83\x57\xa7\x22\x42\x5b\xc6\x2d\x1e\x30\xec\x5f\x0d\xd8\xfe\xa2\x6b\x2e\xa4\xa8\x49\x00\x35\xde\x43\xf2\x74\x84\x6f\xb0\xcf\x02\x09\xec\x74\x37\xf3\xc3\xd0\xa5\x60\x37\x3d\x03\x4e\x5f\xd7\x9e\x25\xb6\x42\x4d\x9b\x2c\x17\x61\x63\x2b\x35\xa1\x21\x32\x52\x18\x27\x34\x5c\x55\xe4\xe7\x14\x2d\xd6\xfe\x94\xd6\x20\xfe\x51\x5c\x15\x3e\x83\x95\xb5\xd1\x30\xc7\x44\x13\x9b\x6a\x92\xef\xd3\x7f\x22\xba\x13\xfe\x4c\x09\x53\x73\x55\x0e\x2e\x4f\xcb\xa0\x32\x5b\x3e\xa3\xb9\xfe\x25\xcc\x7d\xd9\x2c\xbf\x42\xe1\x5f\x45\x54\xb7\x7a\xc2\x7a\x4a\x34\x63\x82\xff\x61\x00\x45\x15\x08\xd6\x02\xcf\x64\x3f\x60\xb6\xca\x42\x86\x35\x6f\x21\xa3\x11\x0d\x4e\x2c\x8a\x89\x62\xa7\x80\xfc\xff\x43\x9b\x3a\xa8\x04\x99\xdf\x27\x0f\xc3\xe6\xca\xd8\x89\x33\x48\x87\x2f\x0f\x70\x2f\x93\x90\x00\x0c\x7f\x6e\x06\x27\xd2\xbb\xb7\xb7\xce\xf5\xc4\xda\x25\xda\xdf\xea\x80\x32\xe5\x02\x32\x97\xa7\x0a\x65\x8e\x9a\xe7\x3b\xdd\xc3\xb2\x27\xa1\xc1\x17\x41\x13\x3f\x01\x2f\x0f\x48\xfe\x26\x44\x6f\xa6\x7e\x64\x72\x0f\xc8\xdc\x97\xf3\x0d\x0d\xd0\x26\xf6\xdc\x21\x64\xea\xd8\x57\x82\x4a\x0a\x7a\xeb\x20\xf1\x15\xd5\x0d\x1b\x65\xdd\x5d\x82\xe0\x9a\xbe\x83\x4e\x8c\xa8\x89\x57\xe3\x99\x84\x82\x49\x55\xa1\xa1\x3e\x3b\x94\xa0\x01\x57\x18\x6d\xcd\xc2\x89\xe3\x4b\x67\x8c\x91\xcb\x2a\x1a"}, +{{0x06,0x3b,0x90,0x25,0xe3,0x21,0xe9,0x72,0xd6,0x53,0xa0,0x62,0xbe,0x34,0xf9,0x93,0x65,0xaf,0xfd,0xcc,0x98,0xec,0x9f,0xf4,0x3e,0xf4,0x22,0xbe,0x0f,0x80,0x44,0x60,},{0x10,0xd0,0x1a,0x63,0x01,0x2a,0xc0,0x99,0x56,0xba,0x9e,0xd6,0x1d,0xf3,0x5b,0xb7,0xaf,0xe3,0x65,0x8b,0xb3,0x00,0x48,0x52,0xe4,0x71,0x74,0xbd,0x07,0xdd,0x4d,0xe7,},{0x85,0xc8,0x1d,0x6b,0x0d,0x85,0x78,0xfa,0x58,0xe1,0x3a,0xb3,0x91,0x00,0x15,0x28,0xb4,0x6a,0x1d,0x63,0xa0,0x32,0x7c,0x7a,0x4a,0x04,0x08,0x7f,0xc6,0x68,0x75,0x8a,0xa6,0x5c,0x01,0xd5,0xa1,0x50,0xf9,0x35,0x67,0x4e,0xf3,0x07,0x50,0x7e,0x6f,0x4c,0x91,0xe1,0xfc,0x35,0x00,0xb2,0x6f,0x64,0x9b,0xee,0xa8,0x7d,0x27,0x56,0x37,0x04,},"\xa7\xee\xd2\x96\x52\x84\x4e\xe0\x04\x9b\xaf\xb2\xcf\x63\x40\x29\x71\x02\x0d\x7e\x65\xc1\x0b\x91\xac\x57\x26\xee\xa8\x6f\x40\xdb\xc5\x3c\x3f\x0a\xbe\xde\xba\xf6\xcc\x44\x9b\x4f\xea\x48\xc0\x15\xfe\x4d\x90\x7b\x3e\x55\x05\xcf\xf5\x0a\x12\x18\x19\xa2\xe4\xa8\xa2\x96\xd5\x75\x10\x15\xbb\xcd\x7e\xf6\xfb\x7c\x27\x27\xbb\x00\x0b\xe1\x34\x2a\x7d\x14\xbc\xa9\x79\x04\xed\xfe\x8b\x18\xdd\xb6\x39\x33\x41\x83\x27\xa5\xaf\x81\x7e\x95\xba\xd7\x4e\xb7\x90\x20\x36\x15\xd0\x82\xe7\x14\x93\xea\xd4\x7c\xcc\x09\x01\xa2\xca\x9f\x50\x13\x3c\x44\xef\x85\x08\xd5\x1f\xb7\x3c\x61\x6f\x01\x47\x53\x22\x45\x82\x2d\xd1\x02\xb3\x37\xa1\xb2\xaa\xe2\xef\xc7\x2d\xca\x7a\x94\x19\xd5\x98\xa6\x47\x52\x33\xdc\x1a\x4e\xe0\xec\x6d\x05\xda\x12\xa2\xb2\x87\xcb\x77\xff\xaf\xdd\xe2\xd0\xac\xc2\x81\x99\x93\x3e\x66\x21\xee\xc1\x6a\xb4\x24\x51\x70\xcf\x02\xda\x80\xd4\x92\x26\x31\xa2\x32\x72\x91\x51\x65\xad\x88\x72\x27\x50\x03\x5d\x2a\x09\x77\xbc\x79\x1d\x14\xfb\x3d\x8c\xb0\x2b\xc7\x7f\x7c\x71\xbe\x52\x42\x62\x9a\x4c\x9a\x58\x8d\xfd\xde\x95\x78\x49\x4d\x8b\xaa\x4e\x68\xf5\x19\x4b\x80\x02\xc8\xe3\x78\xa0\xe8\x33\xb7\xc1\xa9\x69\x81\xc4\xfb\x05\xe4\x57\xff\x48\x26\x0b\x72\x49\x3c\xbc\xb8\x2a\xe1\x16\x73\xd1\x4c\xee\x85\x28\x8f\x63\x70\xbd\x4b\xca\x92\x51\xa7\xe2\x14\xc3\xeb\x79\xe7\xbb\x6f\xce\xbb\x16\xc9\xe0\x56\xf2\x9b\x62\x72\x74\x3e\xfa\x6f\xe8\xbf\xd2\x55\x97\xce\x86\x89\x8a\xb3\x05\x9e\xb0\x23\x1c\x73\xb5\x30\x59\x03\xfd\x13\x19\xbd\xf4\x9e\x59\x9d\x8b\xbc\xd7\x4a\x8b\x97\x67\x30\x8b\x61\x56\x3c\xcb\xac\xd3\x8f\xc5\x0c\x83\xab\x44\xca\x75\x9d\xc9\xb6\x5b\x2a\x4b\x54\x7c\x50\x97\xf2\x20\xc1\xc8\x8b\x2b\x0a\x48\xf6\x5f\x91\xfe\x78\xb1\x50\x12\x78\xe1\xe3\x04\xde\x58\xb4\xc8\x2a\x5c\x39\x99\x81\x09\x8a\x17\x84\xeb\x90\x42\x50\x18\x59\xf2\xa9\x3f\x31\x7e\x41\x77\x2f\xd5\x2f\x97\x2e\x51\xb0\x7e\xd9\x4d\x31\x4e\x1d\x1a\xf4\xed\x82\x90\x9a\x0b\xef\x67\x1f\x54\xb5\x5d\xb7\xb7\x0d\xa1\xf7\x18\xc8\xe6\x48\xae\xdd\x6d\xa6\x4b\x05\x77\x05\x26\xf1\x2b\xc4\x3f\x68\xb9\x55\x48\xda\xc5\x08\x09\xa6\x87\xdb\x97\xd7\x3f\x06\xf4\x7e\xd0\x88\x31\xb6\x0a\x28\xe9\x82\x92\x06\x32\x05\x8f\x0e\x6c\x90\xc0\x18\x7f\xf4\x45\x64\xf8\x1e\xfd\x8f\xd9\x3e\x32\x7b\xc6\xd8\x0b\x49\x0e\x08\x8b\x9a\x10\x03\x6c\x80\xdc\xda\xd4\x9d\x2b\xe0\x74\xfb\xba\x31\xe0\x6f\x71\x80\xe5\xad\x1c\x88\x23\xd6\x09\x66\xa9\xce\x15\x50\x3c\xe6\x0d\xd4\x0e\x91\xee\xf2\x35\x9d\x83\xd7\x0d\x98\x40\x1d\xde\x7b\xe3\xc6\xb0\x7e\x57\xd4\xe4\x7d\x04\x21\x76\x33\xd8\xe2\x63\xca\x34\x8f\x81\xfb\xe9\xa4\xa6\x2f\x45\xd7\x7c\x84\x3b\x6b\x1a\xd2\x84\x66\xd9\xda\xfb\x1b\x91\x0b\x34\x8e\xd8\x7c\x68\x6c\xab\x29\x2d\x48\x0c\x19\x1d\x18\x7b\x40\x4a\x9b\x1d\x13\x2b\xa4\xe2\x93\xd3\xad\xa9\x91\x72\xac\xc1\x21\xfe\x66\xb8\x45\xb9\x8b\x16\x0c\x58\x23\xf6\x01\xc7\x75\x8f\xb2\x6c\xae\xe8\x57\x01\x59\x5b\x2d\x52\xca\xa2\xf5\x68\x8a\xa2\xbf\x2f\x6c\x4b\xb6\x37\xf8\xe0\x0f\x49\xab\x6c\x26\xbc\x6a\xd8\x9e\x13\x67\xfd\x28\xe4\x91\x7d\x25\x08\x93\xa7\xb3\x2d\x39\x66\x0b\xde\x8d\xb4\x9f\x08\x6f\xb7\x39\xe5\x60\x12\xc3\x6b\xea\x0b\x26\xcf\x6d\x93\x57\x94\x0b\x00\xd5\xa4\x52\x8f\x90\x59\xaa\xf0\x86\x69\xe5\xf4\x6c\x99\x5e\x60\xf8\x87\xb5\xc4\xab\x88\xac\x74\x42\xed\x01\xa1\x4c\x6a\x42\x00\x6b\xaf\x1f\x34\x3f\xef\xe3\xe4\xac\xa8\x43\xa3\x24\xe1\x76\xb2\xfe\x7e\xc7\x88\x3d\x1c\xbd\x06\x8b\xc2\xfc\x96\x2f\xfa\x60\x24\x4f\x65\x4c\x77\xac\x56\x50\x81\x7d\xc0\x84\x46\x55\x45\xa9\x23\x0a\x74\x82\x6b\x0c\x50\xeb\x85\x25\x2a\x88\x6f\xf2\xb1\xaf\xea\xf8"}, +{{0x88,0x3c,0xc1,0x38,0x17,0x57,0xb0,0xfe,0x04,0x55,0xb7,0x7b,0xc9,0xcd,0x0d,0xd4,0x64,0xd2,0xb4,0xbf,0x0c,0x7a,0x3c,0x0c,0x2d,0xc7,0x75,0xfb,0x78,0xaa,0x37,0x32,},{0x83,0xa8,0xb6,0x69,0xcc,0xd0,0x12,0x45,0xce,0x3b,0x81,0x8d,0xcb,0x1b,0x58,0x8f,0x86,0x53,0x58,0x50,0xe6,0xc7,0x10,0xc7,0x92,0x17,0xfe,0x43,0x98,0x24,0xf3,0xfa,},{0xc7,0xcf,0xd5,0xc9,0xfe,0x93,0x0d,0x15,0xa1,0x1e,0xbb,0x34,0xe3,0x43,0x1f,0x48,0x9d,0xa0,0x10,0xeb,0x19,0x3e,0xdb,0xfa,0x6f,0x23,0xd5,0xd1,0x4d,0xd8,0xfe,0xab,0xd7,0x88,0x0d,0x2d,0x5a,0x56,0x00,0xd3,0x85,0x46,0xce,0x3b,0xc6,0x4a,0x86,0x29,0x1a,0x1c,0xe3,0x1f,0x27,0x2f,0xf0,0x20,0xdf,0x8c,0xb6,0xa0,0xfd,0x4d,0x3a,0x0d,},"\xff\xec\x29\x3d\x12\xea\x63\x6c\xa4\xc4\xa0\xa5\xe2\xdb\x15\x34\x26\x39\xc4\x76\x67\x4d\x2e\xbd\xab\x4a\xef\xd4\x04\x6b\x5d\xdb\x56\xae\xb2\x10\xc1\x19\xaf\xdf\xb8\xa8\x91\x28\xa3\x4f\x6d\x77\xf2\x61\xed\xea\x07\x72\xa2\xf8\xdb\x14\x0a\x26\x40\xfd\x8e\xca\xdb\x0b\x47\x92\x16\x9b\x6b\x28\x10\xae\xe2\xc5\xcd\x83\x52\x88\xbf\xf4\x93\xbc\xeb\xee\xea\x28\xa7\xa2\x48\xc3\x61\x16\x54\x0f\xa7\x17\x36\xd6\x6b\x0a\x47\x5b\x5f\xa9\x2c\x0d\x46\x00\x2f\xca\x7a\x1e\x69\xd1\xb5\x9e\x81\xa3\xa6\xd4\xf3\x39\x76\x9d\xae\xb2\x0b\x5f\x9d\x75\xc4\xc2\x8f\x69\x21\x32\xd2\x8d\x3c\x56\x4c\x09\xfe\x3d\xcc\xa0\x35\x9c\x3c\x63\xec\x37\x7a\x33\xf9\xee\x87\x4d\x8a\x78\x9d\x77\xc9\x6a\xc0\x5f\xdf\x3a\xb3\x8b\x2c\x82\x74\xa9\x02\xef\x8b\xb7\xf4\x67\xfc\x7e\x07\x3c\x77\xb1\xdb\x5f\xc8\xef\x96\x6c\x12\x0c\x4d\xae\x3f\xb7\xf5\xb7\x4a\xbb\x99\x01\x66\xc8\x12\xa5\x25\xd1\x23\xf7\x6e\xd5\x12\x12\x50\x80\xa1\x53\x4f\x3d\x8b\xdc\xcc\x54\x1f\xc9\x75\x90\x28\x75\x46\x09\x6f\xc8\x80\xbf\xcf\xdd\x00\xe6\x5c\x0e\xbf\x4a\x09\xfd\x64\x76\xce\x1b\x7c\x8f\xaa\xa5\xa1\xcc\x27\x86\x71\x9a\x30\xd8\x25\x58\x11\x18\x47\x52\xa8\x8b\x08\xac\x9f\x0f\xf1\xd6\x26\x2f\x25\x86\x94\x0a\xfe\x1f\xe4\x5e\x0b\x56\x34\x48\xa5\x5f\x30\x30\xe4\xc3\x9c\x1f\x3f\x86\xa7\x33\x67\x03\x80\xea\xb0\x88\xe3\x93\xde\x09\xd1\xf5\x08\xd2\xfb\xca\xfc\x64\x9a\xea\xe6\xb8\xc3\x0e\x32\x9e\xc3\xfd\x28\x29\xbe\x6d\xb0\xab\x8e\x63\x7e\xa1\x09\x5b\xdc\x3d\xf3\xac\xc2\x3d\x3c\xf7\x05\xa9\x54\x2c\x19\xe5\x90\x92\xec\x41\x3a\x4e\x2b\xd5\xde\xd2\x8c\xd3\x4d\xdb\x3d\x32\x94\x9a\xa4\x87\xf1\xc3\x37\xd6\x97\x9c\xf5\x12\x62\x2d\xbf\xb7\xda\x1c\xbb\x1c\x7e\x5a\xbe\xea\x70\x09\xe2\x94\x3f\xfb\xa2\x25\x2e\x1d\x86\xec\xa9\xd6\xd5\xc2\x46\xcd\x2e\x13\x4a\x3e\x5d\xad\x37\xef\xef\x71\xce\x39\x7a\xda\xfb\xd9\xe7\x2b\x3f\x9a\x86\xff\x0f\x5d\x81\x2c\x46\x22\x5b\xeb\xd0\x70\x3b\xc5\xcc\xe9\xc6\x45\x82\x00\x8f\x7e\x55\x8c\x40\xa3\xb3\x52\x20\x96\xd1\xaa\x2b\x61\xbc\x90\xcd\x88\xc6\x28\x5d\x94\x20\x87\xd8\xa4\x66\x5a\x0e\x64\xd3\x57\x2f\x74\x68\x9b\x4f\x24\xef\x40\x0d\x74\x1b\x57\x14\x06\x13\x47\x14\x44\xde\xcc\x65\x4a\xf0\xff\xb2\xed\xfd\xf9\xfd\xd0\x75\x09\x81\x90\xb3\x4c\xde\x28\xdd\x16\x68\x72\xc6\x08\x65\x67\xa6\x87\x61\xce\xf2\x5d\xa4\x0b\xd4\xc3\xd3\x4f\xdd\xd7\x2e\xe5\x65\xb0\xb9\x37\x67\x8e\xe8\x43\x49\xd1\x16\x0f\x5f\x07\x05\xf8\x95\xd0\xf1\x41\xce\x8f\x51\xa1\xe4\xfd\x2d\xc4\x70\x4b\x52\x7a\x40\x25\xa9\x39\xcb\x2b\xb7\x88\x57\xeb\x18\xd7\x88\x72\xed\xc9\xee\x70\xe6\x0b\x2a\x42\x70\x0a\x19\x8f\x4f\xff\x6c\x31\x92\x51\x68\xbe\x07\x7d\xc2\x3c\x32\x2a\xbb\xca\x97\x36\x1f\xec\xaa\x3f\xcb\x19\x6e\x65\x6c\x12\x8f\x39\x82\xfe\x11\xe5\x51\xa4\xa0\x88\x5d\xa6\x0d\x39\x7d\x0e\x40\xd0\xd8\x97\x26\x2f\x1b\x4b\x67\x2f\x78\xa2\xd2\xad\xfc\xdd\x6e\x15\x25\xc2\x6e\x71\x95\xfb\x9a\xc6\x06\xbb\x1b\xa4\xa9\x89\x08\x03\xb4\xbd\x84\x34\x6a\xe8\xd8\xc7\x19\x6c\x90\xae\xcc\xb2\x96\xa4\xc3\xeb\x4e\xfa\xcb\xfc\xb6\x2e\x38\x3b\x8a\x49\x4a\xc7\x23\x56\x2d\x0d\x8c\x37\x91\x87\xa9\x2e\x3b\xda\x6b\x15\x69\x47\x6a\xed\x21\xae\xd7\xa0\x56\xb4\xa5\x82\x67\x44\x01\x7c\xc0\x06\x0b\x4d\x55\xfa\x87\x72\xb5\xb1\xc1\x5f\x57\x48\xad\x72\x98\x00\x5a\xec\xbc\xbd\x90\xa3\xe5\xc6\x15\x9a\x86\x74\xab\xbb\xa3\x79\x14\x41\x50\x02\xb5\xa6\xef\x5d\xf3\xc6\x49\x42\x6e\xa1\x27\x5a\x01\xd8\x0a\xdf\x49\x0a\xc5\x46\x06\x2d\x93\x99\x9a\x6d\xcc\xac\xb9\x6a\x09\x04\xad\x33\xd9\x05\x76\xdc\x6a\x21\xb6\x72\xe8\xff\xb0\x66\x13\xfb\x3f\x14\xe6\xcb\xdd\xe8\x8c\x24\x37\xc9"}, +{{0x5e,0x40,0xa7,0xaa,0xbb,0xb0,0x83,0x0a,0x9a,0xb0,0xfd,0x79,0x69,0x0e,0xe0,0x43,0x39,0x01,0xc6,0xcb,0x06,0x76,0xab,0xe4,0xbb,0xa0,0x6f,0x5b,0xbe,0x58,0xfa,0xc2,},{0x4d,0x4f,0x28,0xfe,0x09,0xc4,0xaa,0xbf,0xca,0x01,0xef,0x6e,0xe7,0xfd,0x63,0x72,0xfb,0x62,0xdb,0x61,0xaa,0xee,0x82,0x7c,0x43,0xfd,0x1a,0x6d,0x1c,0x25,0x90,0x32,},{0x59,0x76,0x72,0xab,0x8d,0x3a,0x60,0xde,0x54,0x56,0xfc,0xc9,0xc3,0x82,0x53,0xf5,0xf3,0x7b,0x80,0xe7,0x4a,0x00,0x7c,0x9f,0x6d,0xb9,0x09,0xd2,0x7d,0x0e,0xad,0x16,0x27,0x89,0x24,0x49,0x94,0xf3,0x5b,0x80,0xd6,0x1b,0xe1,0x99,0xc4,0x17,0xc7,0xea,0x90,0x1b,0x98,0xcc,0x63,0xfe,0x3c,0x50,0xfc,0x3c,0x63,0x38,0x49,0x0f,0xa2,0x06,},"\xfd\x4e\xc8\xb3\x4f\xc6\xb7\x43\x81\x3f\x59\xe2\xfd\x1f\xef\xa8\x70\xf5\xa9\x70\xe2\xeb\x75\x16\xef\x7c\x30\x6f\x4b\x82\x3f\xfe\xe9\x2d\x60\x1f\x76\x5d\x79\xca\x14\x6a\xba\x8b\xc6\xe7\x98\x44\x55\x99\x35\xcd\xdc\x24\x26\x49\xc0\x59\xec\xf2\xdb\x84\xfd\xc2\x19\x36\x66\x88\xa8\x8f\xc2\x5b\x85\x1c\x36\x61\xe5\x19\x88\xc2\xbf\x73\xbb\x8e\x3d\xc1\x6d\x22\x41\x5a\xb1\xa7\xb3\x55\x79\xda\xac\x73\x25\xe3\x19\x15\x7d\x7d\xa5\xfe\xe8\x7c\x93\xa4\xdf\xcb\xaf\xc9\x2f\xba\x7e\x17\xcc\x68\xe3\x90\x37\x33\xc6\xc8\x01\x57\x2d\x90\x73\x20\xb2\xfe\xb5\x17\x10\xe8\x56\xa1\xf7\x6f\x85\xa7\xee\x1a\x11\xe6\x2d\x2e\x45\xa3\x52\x93\x8d\xd8\xcf\xc2\xbc\xcb\x90\x2d\xea\x44\x4f\xaa\xae\x6d\x84\xc5\xf3\x91\xe1\x0a\xef\x76\x92\x8a\x45\x15\x3d\xb6\xcd\x25\xa2\xbf\x35\x3d\x80\xd9\x7b\xf4\xb3\x80\x86\x05\xe8\x98\x00\xd2\x98\x40\xea\x60\x97\x8d\x9e\xc9\xb2\xc3\x02\x74\x98\x88\xf9\xde\xbc\x84\xdd\x1e\x2a\x79\xaa\x0b\x6b\xa0\x2a\x03\x91\x93\x08\x1b\xdb\xff\x05\x99\xa1\x4d\x91\x8c\x0c\x8d\xea\xc4\xf6\x0b\x6e\x99\x47\x4a\xb5\x30\x11\x74\x10\x34\xfe\x2a\x20\xcf\xf4\xe0\xf0\x23\x42\x4c\x8e\x57\x97\x76\x8a\xd5\x3d\xf6\xd0\x1a\x24\x01\x1f\xa9\x0f\x0b\xb1\xd5\x06\x9c\xdb\x36\xb4\x50\xf4\x33\x11\x0c\x2c\x56\xf3\x4a\x1d\xe4\x26\x09\x14\xcd\x46\x96\xb1\x4a\x09\xc0\x26\x8b\x2a\xe2\xe9\x8e\x6b\x4e\x99\x2b\x91\x25\xf8\x78\xf1\xac\x09\x82\x31\x70\x62\x83\x88\xf0\xf6\xe2\x56\x25\x9c\xa7\x86\xbb\xe1\x44\x88\x4c\xb2\x98\xcc\x04\x3d\x02\xf5\xc3\xdc\x68\x4f\x78\x7f\xaf\x16\xc1\x0f\xdd\x84\x37\xa8\xc3\x09\x74\x63\xbd\xb9\x9b\x78\x03\x0f\x94\x74\xfc\x5c\x99\x51\xdc\x75\x26\x49\x05\x86\xfe\x1c\x2d\xb0\x54\x11\x34\x14\x60\x23\x9d\x5e\x8b\xc5\x30\x65\x90\x2b\x95\xfb\xa2\x82\xc2\x76\x65\xe8\x69\xa1\x9d\xae\x84\x60\x6d\x17\x26\x67\x51\x55\xd3\x80\x39\xb9\xe5\x5d\xb4\xd5\xce\xec\x95\xcd\x6d\x87\xf8\x5e\x99\xdd\xe5\x4a\x04\x76\x1e\x6e\xad\xa6\x61\x9d\xa8\x95\xb6\x54\xfe\x38\x45\xe8\xa6\x0f\x3a\x3b\x32\x48\x3d\x6d\x27\x97\x8a\xf5\x45\x02\xb2\x20\xe4\x78\xdb\x78\xcf\xf7\x7a\x9c\x97\xfb\x79\xfb\x5a\xcf\x56\x28\x9f\x38\x1a\xcb\x10\xde\x64\xc3\xf2\x38\x42\xb1\x2b\xf5\xf1\xb2\x83\xbd\x25\xd4\x8d\x09\x12\x8f\xb5\x5d\xda\xe2\x55\xbe\xb7\xc6\x6a\x74\xcf\x6f\x06\x95\xa4\xf8\x28\xcb\x29\xe4\xaf\xdb\xb3\xb4\x2a\x23\x5d\x4f\xdb\x66\xb9\x63\xac\x8f\x68\xe8\x2b\x00\xa1\xc4\x50\x08\x63\x29\x62\x47\x17\x8c\xfd\xef\x80\x3b\xb7\xb1\x14\xf0\xc0\x32\x76\xf6\x71\x66\x9a\x08\x7d\x92\x28\xa3\x7a\xe7\xb9\x9b\x06\x15\x49\xc1\xcf\x8e\xc1\x72\x46\xea\x1e\xe0\x3d\xbc\x88\xbf\x42\x64\x16\xd5\x86\x57\x2f\xf1\x0a\x31\x45\x60\x6f\x27\x84\xe4\x35\x7b\xe4\xed\xee\xc6\xc3\xa7\xbf\x11\xbb\x5b\x0e\x90\xcf\x50\xed\xaf\x89\x1e\x51\xd2\x63\x57\xbf\xc8\x53\xce\x23\xb2\x99\x15\x5c\x82\xc1\x03\x1d\xfa\x64\x07\x4d\x72\xa0\x9d\x29\x72\x0e\xad\x6e\xbb\xbf\x75\xd5\x73\x8e\x32\xcd\xa6\xb6\x46\x6a\x8d\xef\x6b\x50\xa1\xed\x9b\x86\x5a\x9a\x88\xa0\x80\x18\xac\xb5\x01\xa4\xde\x9d\xb5\x4d\x05\x22\xce\x9c\xec\x7a\x06\xbd\x9a\x5f\x86\xb0\xb4\x6c\x07\xbf\x3e\x7f\x5a\x42\x6f\xf6\xb4\xbb\xe1\xe0\x03\x13\xa5\xac\x27\x19\xa9\x59\xed\x44\xee\x0a\x44\xbd\x97\xda\x6d\xb2\xcb\x97\x1b\xd6\x83\x34\x90\x89\x49\xed\x85\x0f\xbf\x73\xd0\xe0\x20\x49\xda\x18\x1c\xce\x9c\x2d\x9c\xa1\xb6\x24\xc8\xd8\x7c\xf9\x04\xeb\x82\x1d\xc7\x95\x92\x95\xda\x57\x77\x92\x06\x60\xb4\x3c\xcc\x25\xcd\x38\x9f\x15\x7f\x67\xfa\x03\x90\xfe\xac\x97\xa7\x52\xc1\xac\x20\x4c\x21\xdf\x56\xbb\x0f\x4f\xc0\x16\x41\xb4\x80\xaf\x2b\x89\xb5\xd1\x6d\x4a\x0b\xcb\x0a\x50\xb8\x2b\x0e\x04\x84"}, +{{0x3a,0x34,0x13,0x6a,0x97,0x34,0x80,0xd9,0x70,0x06,0xdc,0x27,0x93,0x58,0xe6,0x60,0x62,0x93,0xd8,0xcb,0xc1,0xa4,0x4e,0xe5,0x52,0x33,0xaf,0x2b,0x52,0x64,0xb9,0x0c,},{0xe5,0xef,0xfd,0x92,0x1b,0xe8,0xee,0xc5,0x30,0x75,0x2f,0xcc,0xc5,0x76,0xef,0x0d,0x9b,0xcd,0xe4,0xb3,0x2c,0xc6,0x49,0xd3,0xf7,0x95,0x47,0x17,0x56,0x28,0x60,0xcc,},{0x42,0x5f,0x27,0x22,0x12,0x83,0x57,0x55,0xad,0xcc,0x05,0x22,0xc6,0xf6,0xe0,0x5f,0x68,0x00,0x8a,0x3b,0xe9,0xba,0x59,0x74,0xe4,0x20,0xc4,0xc5,0xcb,0x56,0xe6,0xc5,0x5d,0xec,0x0d,0xe3,0x47,0xb1,0x6c,0xae,0xf8,0xbd,0x33,0xb7,0x1b,0x44,0xc8,0x35,0x7d,0x05,0xb6,0x32,0x1d,0x7b,0xf4,0x93,0xd2,0x58,0x61,0xdb,0x48,0x7b,0xd6,0x03,},"\x98\x1c\x8e\x10\x90\xe3\x96\x95\x1b\x07\x2e\xf8\x49\x70\x62\x02\x08\x97\xbf\x7d\xd7\xad\x50\x5b\x4d\x6d\xc1\x1b\x3e\x1d\xbc\xb0\xda\x24\x99\x84\xa1\x40\xe1\x64\xfc\x2e\x02\xb3\x1d\xa3\x98\x46\x55\x4a\xa8\x90\x5b\xc8\xb3\xdf\x8a\x76\xbf\x60\xeb\x5f\xfc\xf2\x2c\x97\xb6\x71\x22\x7d\x24\x90\x71\xda\x8f\xf6\xbb\xa7\x5b\x2f\x76\x68\xce\xc1\x9a\x89\xe6\x47\x5a\x12\x46\x3d\xab\xf3\x68\xb3\xca\x24\x45\xbb\x30\x35\xcc\x00\xfa\xe8\x5b\x70\x72\xfb\xcf\x59\x54\x01\x75\x5b\x80\x51\xe6\x09\x70\x65\xae\x42\x9f\x18\xee\xb1\x3f\xfa\x6d\xde\x59\xdf\x6f\x3c\x20\x6b\xfd\x9c\xe1\xf8\xa8\x00\xc8\x59\x0a\x40\x21\xd1\x60\xf6\x6d\x67\x40\xa3\x69\xae\x83\x56\x17\x53\x8b\x58\x90\x23\x1f\x13\xc5\x66\x7b\xaf\x51\x0a\x60\x6b\xda\xa8\x4b\x8d\x10\xee\x60\x15\xe1\x2a\x4c\x1e\xc0\xbd\x04\x21\xa2\x94\xc5\x1c\xf6\x3b\x5d\x1f\x05\x8e\x11\x53\xdc\x42\x5d\x10\xce\xe8\xb1\xb0\x84\xd6\xc2\x93\x47\xe9\x6f\x0f\x31\xb8\x39\x60\x7d\x07\x8b\x79\xa9\x0c\xa3\xd1\xf0\x63\x80\x7a\x46\x3b\x7c\x32\xf4\x5a\x53\x44\x98\xd7\x1d\x47\xed\xc3\xb1\x7a\x4d\xff\x27\xfe\xdc\xff\xab\x30\x1f\x34\xf1\xa6\x4c\x02\x78\xa5\x35\x89\x34\x9a\x23\x3a\xf3\x0b\x1e\xc1\xae\x41\x0f\x7b\x16\x30\xc7\x14\x5c\xa4\x2c\x96\x63\xf5\x12\xe8\xa5\x78\x26\x7d\xc9\x5e\x83\x28\x9c\x17\x03\x2e\x09\x78\x2e\x2f\xe8\xe1\x6e\xfb\x87\xf0\x3c\xa0\x3b\x11\x95\x61\x4f\x89\x96\x1c\xa3\x93\x9d\x3b\xdf\x73\x72\x21\xa2\x2d\x7a\x18\xec\x30\xfc\x12\x6d\x0c\xa6\x63\xe8\x8d\x60\x60\xd0\x4c\x6a\x44\xe5\x61\x6e\x55\x6e\x07\xd6\xd4\xa8\x47\xf1\x71\x1c\xf4\x37\x17\x81\x0c\x70\xaa\x4b\xe7\x30\x27\x8b\x3b\xd6\x55\x5c\x95\x4d\xc6\xed\xb0\x9d\xb0\x8f\x0e\x21\x18\x03\x59\x62\x80\xf3\xc7\x86\x8d\x23\x42\xcc\x23\x08\xea\xae\x4d\xa1\x91\x35\x14\x66\x4b\x1d\xb9\x62\xe9\x9c\x8a\x8c\xff\xe5\x79\x31\xf5\xdf\xcd\xdb\xc1\xcb\xb3\x6c\xe1\xc8\x42\xe2\xdd\xde\xad\xfd\x7e\x7d\x0a\x50\x48\xcd\xcb\x96\x1b\x14\xf3\x5f\x43\x5e\x73\xa6\x83\xc8\xce\x25\xc8\x16\x81\x25\x66\xfd\xf8\x17\xe0\xd3\x36\xae\x0b\xd2\x47\x32\x85\x12\xb2\xa8\x56\x76\x32\xbf\x20\x55\x3d\x9b\xd6\xfe\x15\x7f\x22\x0f\xfb\x0b\x46\xeb\xae\x89\xa7\x04\x59\x72\x8a\x57\xee\xd1\x79\x62\x56\xf1\xbd\x50\xb6\xd5\x47\xea\x3e\x25\xfa\x59\x13\xd3\x89\xa2\x25\x83\xe9\x15\xeb\x49\xde\x35\xa9\x7b\x5a\xcc\x52\x1d\xb0\xd0\x05\xc2\x95\x75\xe1\x66\x11\xa7\x55\xf2\x1a\x3a\x5a\x82\xa2\x0a\xa9\x00\xa7\x07\xce\x36\x82\x54\x92\xc3\xca\x15\x39\x5f\x17\x00\xb4\xaf\xab\x94\xda\xa7\xa0\x2f\x14\x53\xb1\xf9\xa6\xbd\x36\xef\xb2\x04\xd9\x28\xee\x1f\x4d\xcc\x86\x0f\x3a\x85\x9b\xad\xc0\x06\xfb\x30\x5f\xa1\x23\xd4\xc7\x9b\x23\xa2\x0e\x32\x29\x5d\x04\x0a\x7f\x8f\x6c\xac\xa2\x5d\x83\xf7\x1c\x62\xe3\xaf\x78\x36\xef\x76\xb9\x3a\x83\xd3\xc3\xb4\x93\xaf\x14\x17\x53\xda\x19\xe4\xcd\xcb\xa5\x66\x17\x27\x10\x34\xb4\xf4\xf3\x94\xc7\xc6\xb7\xd7\x96\x66\xf3\xaf\xb6\x92\x24\x4f\x06\x1c\x69\xa8\x88\x1d\x1b\x52\xb8\x84\x9f\xb5\x34\x99\x0a\xc2\x39\x19\x09\x47\x1e\xbb\xb7\x28\xe2\x9c\xd2\x0f\x42\x23\x54\xc4\x30\x97\x17\xeb\xff\x3e\xfd\x18\x33\x37\x08\x06\xd5\xbf\xb5\x3c\xa2\xda\x31\x6d\xac\xb5\x0a\xb7\xfb\x73\x96\x73\x23\x5a\x1d\xc5\x3a\xa8\x89\x30\x72\xd5\xb9\x1c\x9f\x6d\xb8\x3f\xc4\xea\x41\xd1\xee\xf4\x9a\xc2\x8a\xfc\x1c\xed\x8f\x36\x18\x90\xab\x9f\x77\x9d\x19\x30\x82\x83\x1c\xb8\xc4\x2f\xb2\x79\x2b\xee\x3b\x26\x29\x6b\x62\x95\xeb\x78\xa8\xd8\x53\x11\x76\x61\x62\x4e\x11\xf7\xf5\x7a\xfd\x60\x85\xa7\xb9\x12\x36\x79\xfd\xac\xa1\xcf\x2a\x78\xd3\x80\xbc\x4c\x36\x0a\xa7\xc3\xcb\xfd\xe0\xc0\x09\x1f\xe5\x3e\x22\x19\xc0\x70\xf2\xf0\x2f\x14\x83"}, +{{0xcf,0x33,0xe7,0x97,0x4d,0x8f,0x0b,0xf8,0x99,0xac,0x5b,0x83,0x4c,0x7c,0xf9,0x64,0x79,0xce,0x1c,0xfd,0x45,0x3a,0xf0,0x7f,0x97,0x05,0x27,0xf3,0x6a,0xa8,0x5c,0x1f,},{0x57,0x8f,0x60,0x33,0x8b,0x1f,0x04,0x1a,0x97,0xd3,0x19,0xfe,0xcf,0xa3,0x0c,0xfa,0xed,0x36,0x93,0x03,0xcc,0x00,0xb3,0xec,0x8c,0x5c,0x99,0x04,0x11,0x58,0xe2,0x0c,},{0x97,0xa5,0xb6,0xd2,0x68,0xa5,0xb4,0x17,0x5f,0xb0,0x6f,0x1f,0x37,0xd0,0xa6,0x33,0x51,0x92,0x96,0xed,0xc3,0x00,0x11,0xc9,0x54,0xd8,0xf0,0xb9,0xbb,0xe2,0x64,0x18,0x00,0x39,0x6c,0x4b,0x35,0xd4,0xb0,0xd7,0xd2,0xa1,0xd1,0x7c,0xbb,0xeb,0xdc,0x55,0xa8,0x09,0x46,0x2d,0x6c,0xc1,0x9a,0x6f,0xad,0xbe,0x1b,0xd1,0xba,0xe8,0x8a,0x01,},"\xe8\x13\x14\x4b\xd1\x16\xf6\xac\x36\x38\x92\x17\xb5\x17\x1a\x90\x2f\x06\xb7\xdd\x7b\x14\x4d\xf4\xf9\x09\x15\x53\xc7\xc7\x83\x57\x53\xa2\x96\xcb\xb0\xd7\xfa\xb9\x9c\xef\x77\xb6\x1f\x34\xa0\x4c\x8a\xf0\x4e\x7d\x5d\x1f\x96\x13\x02\xde\x89\xe2\x00\x5f\x29\x9f\x5a\x4a\xa1\x79\x24\x61\x7d\x00\x66\x93\x93\x77\x45\x53\x9c\x30\x48\xee\x36\xb8\xc2\x3a\xfe\xc0\xaf\x9f\xea\xa0\x06\x6c\x8a\xf8\xe0\xa7\xf0\x90\x93\x49\x82\x10\xf6\xd8\xdc\xc0\xaa\xad\xa5\x66\x87\x86\x91\x0f\xf7\xc5\xb3\x48\xd4\xcc\xd6\xee\xef\xfa\x3a\xcd\x18\x16\xd9\x01\x1a\x4c\x40\x25\xf6\xc2\xfd\x2c\x02\x0a\x10\x59\x36\x27\x52\x0d\x4d\xd9\x9e\x07\xc6\x2d\x2d\xbe\xbe\x84\x13\x9e\x1c\x7d\x86\x7c\x09\x35\x74\xfa\x60\x1e\x4e\xe3\x07\xac\x92\x6e\x5d\x36\xb6\x2d\x7e\xd8\x4a\x26\x15\x88\xb7\xe2\x88\x3c\x79\x26\x61\x2b\x4c\xc6\x7e\x2b\xb7\x25\x44\xa1\x0d\x6b\x49\x29\xc8\x8e\xf6\xc4\x7c\x26\x25\xd2\xf6\x81\x6b\xd7\x3c\x3b\xae\x89\xd2\xe0\xc8\x61\x71\xac\x4b\xd0\x80\xae\x55\x5d\x62\x74\x0d\x1d\x2a\x76\x1c\xed\x86\xdf\xc3\x28\xec\xc2\x7e\xe3\xdb\x6d\x40\x41\x08\xef\x4e\x0b\x64\x90\x62\x53\xb4\xc0\xa7\x71\xad\xef\xed\xc8\xa2\xc5\xb5\x3c\x42\x5a\x70\xcd\x6f\x63\x95\x6f\x7a\x0a\x61\x9f\xdf\xbf\xd0\x0a\xa0\x78\x41\x8e\xb4\x65\x2f\x8b\xc6\xf3\xc2\x53\xbe\xec\x98\x38\xb7\x7f\x9c\xbe\x2e\xf2\xb8\x05\x5c\x57\x73\x53\x9e\x35\x6b\xd8\x19\x26\x06\xec\x10\x1e\x3f\x60\x58\xb1\xdd\x08\xa6\x8f\xdb\xc5\x49\xdf\xe6\xb7\x72\x5d\xc2\x54\x9e\x8e\x3f\x90\xdc\x5b\xe3\xcc\xfb\x0a\x38\xba\xf9\x37\x7c\xb3\xf6\x50\x1d\x2e\x15\xcc\xb3\x55\x6a\x89\x5c\xcb\x23\xf0\xb6\xdf\x9f\xe5\x93\x11\xcf\xf5\x53\x74\xc3\xfb\x3a\x32\x98\x1c\xa2\x6a\xb4\x26\xf3\x66\x3d\x04\xe3\x16\x7e\x53\xa5\x37\xb7\x58\x9a\x9f\xb7\x36\x79\x09\x0a\x20\x55\x32\xc1\x32\x90\x66\x34\x33\x4a\x7e\x87\x49\x79\x3f\x8c\x59\x3f\x3f\xd6\x27\x8c\xe0\x05\x03\x83\x48\x7f\x3b\x24\x50\x67\xaf\x94\x88\x1a\xa1\xae\x96\x8d\x0c\xae\xba\x5f\xa5\xc7\xbe\x5f\x4e\x4b\x72\x57\x51\x86\x95\xd8\x9b\xcc\xde\xc5\x07\xb9\x67\xb4\xfd\x64\xb6\x89\x3b\x3e\xe7\x80\x3c\x1d\x36\xea\x8a\x02\xfc\x42\x6f\x9a\xfc\x8e\x9f\x24\x32\x15\x27\xec\x98\x44\xbc\x3c\x54\xa0\xf7\x66\x7e\x03\x43\x00\xbb\xb4\xfb\x02\x0f\x6d\x5b\xb9\x54\xe7\xb5\xa3\xa7\x06\xa4\x93\x9d\xb3\x3c\x15\x48\x92\x64\x34\x76\xa2\x91\xd4\x7d\xc1\xe6\xf7\x2c\xe9\x1d\x13\x6f\x11\xdb\x26\xb9\xc9\xba\x73\x6e\x40\xdf\x0a\x15\xc1\xa8\x91\x49\x99\x6b\x25\x1d\xd9\x88\xb3\x90\x04\xe6\xef\x41\xbd\xc0\x61\xdb\x58\x0b\x7b\x74\xde\x2a\x65\x18\x10\xbd\x89\x17\x53\xb9\x73\x86\xd7\xf8\xcb\xdb\xb6\xec\x38\x6f\xa2\xc3\x42\xf5\xef\x20\xe6\xe3\xa8\xbb\x4d\x51\x49\xa7\xd4\xde\x12\x24\xdf\xf1\xd1\x72\xc8\x75\x70\xf7\x76\xd5\xef\x45\x95\x9b\xe0\x93\x8a\xd7\x9f\x5d\x33\x95\xcb\x27\x21\x62\x71\x22\x88\x7b\xd7\xa8\x98\x3b\x64\x77\x97\xbd\x41\xd8\x82\x64\x1c\x81\x43\x1c\xe8\xd9\xb3\x06\x7a\xde\xc4\xcd\xe9\x26\xc5\x13\x13\xf0\xcf\x84\xc5\x29\x25\x62\xdd\x49\x08\x64\x2d\xd2\x45\x28\x84\x84\xc5\x56\x8a\x78\x7d\x0c\xed\x36\xa3\x52\xf0\x32\xda\x4f\x7e\x4d\xe0\x6b\x11\x47\x3f\x65\x0e\xec\x65\xdd\xa9\x96\x39\xaf\x2d\x42\xd8\x4e\xe2\x30\xf4\xf8\x36\x23\xd9\xc9\xaa\xa3\xb1\x6b\xda\x10\xdd\xaa\xd2\x5a\xf5\xc1\xc1\x0f\x81\xc8\xc5\x1c\x81\x1a\x3a\xa3\xe3\xdb\x58\xa7\x02\x5e\x43\x80\xe2\x85\xda\x47\x4a\x61\xba\x59\x17\x3f\xf0\x42\xa4\x6a\x79\xab\x18\x4b\x07\x01\x08\x41\x6f\x9d\x61\x58\xcf\x96\xd0\xe6\xdb\x44\x76\x14\xa0\xd9\x08\x9e\xbb\x6a\xee\x4e\xf1\x07\xbe\x45\x93\xd7\x1e\x79\xf6\x79\x86\x68\xa7\x40\xae\x4b\xac\x5a\xc7\x59\x4e\xcb\xd5\xdc\x82\xe7\xd0\xf9\xcb"}, +{{0x51,0xb1,0xad,0x0f,0xfc,0x21,0x49,0x7a,0x33,0xdb,0xdb,0x85,0xea,0x2b,0xc1,0xce,0x3d,0x0c,0x2d,0x95,0xd9,0x46,0x1a,0x39,0x09,0x73,0xfe,0xe3,0x77,0xfc,0x75,0xf4,},{0xba,0xd0,0x41,0x25,0x75,0xd3,0x80,0x13,0x01,0xed,0xee,0x6b,0xc0,0xf2,0x76,0xe7,0x87,0x35,0x7b,0x41,0x22,0xf5,0x2d,0xe9,0x81,0x88,0x58,0x51,0x88,0x42,0x49,0xcb,},{0xcf,0xb6,0x5b,0x6f,0xf0,0x37,0x7c,0xef,0x51,0x1f,0xd9,0x7b,0x90,0xc3,0xec,0xb8,0x08,0x33,0xf1,0x42,0xa7,0xcf,0x50,0x22,0xce,0xd3,0x0b,0x3f,0xb7,0x86,0x20,0x86,0xd0,0x13,0x39,0xb8,0x86,0x6a,0x23,0x8c,0xb0,0x70,0x27,0x6e,0x19,0x44,0xb5,0xfe,0x32,0xcc,0x40,0x99,0x47,0xcb,0x91,0xde,0xb1,0x43,0x2c,0x29,0x1b,0x60,0xfb,0x0d,},"\x78\x82\xe8\x6e\xf3\x40\x2f\x6d\xbc\x65\xcc\xe8\x31\x5b\x39\x76\x5f\xaa\x4b\x1f\xc8\x76\xfa\xd5\xf8\x22\x0c\xb2\x2a\x7d\xf2\xe3\x58\x0e\xab\x3a\x7e\x8f\xa7\xfb\xb6\xb5\x94\x82\xca\x0e\x36\x4a\x13\x13\x96\xdf\x79\x2a\x32\x41\xa0\x60\xe4\x41\x43\xb6\x76\x74\x93\xc6\xbf\x75\xf1\x87\xa9\x64\x3a\xa1\x1e\x11\xeb\xa7\xb0\xa8\x0f\x0a\x68\xb9\xf1\xb7\x9f\x75\xb6\x6c\xc5\x9d\x9d\xa7\x79\x55\xfd\x7e\x87\x99\xf9\x9d\x6e\xb0\x8f\x90\xd3\x18\xf4\xef\xcb\xfe\x71\x15\x9b\x10\xa8\x3a\xa5\xfd\x69\xbb\x75\x33\x6f\x5d\xf2\x96\xea\x06\x0a\x42\x6c\x95\x45\xdf\x94\x0b\xc1\x45\x4e\xfc\x1f\x9d\xc9\x65\xf1\xf2\x2d\x94\x73\x03\xfb\x8e\xc1\x24\x07\xff\xf6\xb1\xdb\xe4\x7e\x34\x21\xc3\x17\x64\xfd\x90\xc8\x3a\xc7\x11\xd1\x99\x26\xe2\x29\xa0\x64\xc6\x1f\xe3\x67\x6a\xf3\x00\xa1\x71\x6f\xab\xe4\xe3\x84\x22\x64\xad\xb3\x2e\x0d\x9c\x9f\x5d\x4a\x65\xd0\xd7\xb5\xc3\x77\x0d\x73\x7e\xe1\x3c\xbe\xd2\x1d\x7a\x1d\xa3\x6a\xaf\x7e\xc0\xf3\x6f\xcc\x47\x6f\x65\x96\x81\xe5\x16\x0a\x5a\x1f\x49\xe7\x59\xb9\xd0\xfc\xd4\xfd\xb8\x54\xec\xcd\x99\x17\x2a\x47\xd2\xc4\xef\xbe\x0b\x37\x57\x63\x1d\xf1\xba\xe1\x75\xf0\xfa\x74\xdd\x04\x8b\xb6\xa5\xfe\xd8\x43\x02\x84\x34\x9d\xa3\xd6\x7d\xf2\xa6\xf7\xe8\x26\x9b\xc7\x9f\xb2\xc5\xd5\xed\x60\x84\xe9\x07\x6f\x45\x5a\xb6\x38\x91\x90\x46\x36\x9a\x44\x6d\x57\xfc\xad\xa7\x01\x1c\xc7\x71\xbf\x6d\x87\x4a\x8e\x5d\x23\xc6\x87\x74\x7d\xe4\x1d\xd0\x4b\xff\xc7\x17\xd6\x12\x81\x83\x84\x6e\xb5\x94\xb3\xcb\x1c\x1a\x8a\xa0\x4f\x0d\x7e\xba\x53\xaf\x39\xcb\x1d\x4e\x6f\xec\xf3\x11\x3b\xd8\x42\x24\x16\xf4\xc4\x40\x37\xae\xee\x9e\x0f\xdc\x51\x7c\x48\x73\x1f\xd0\x4e\xe9\xc9\x9f\x5d\xbc\xa3\xd5\x74\x50\x9d\x7b\xaf\x32\x88\xf2\xc2\x30\xa0\x2d\x17\x03\xbd\xb1\x61\x1c\xde\x2a\x76\x6d\xac\x19\x3d\xe1\x67\x44\x3d\x20\x09\x0d\xc3\x4d\x29\x27\x7a\x86\xb1\xe9\x98\xb2\x45\x64\x51\x17\xe5\x11\x1f\x12\xf1\x46\x06\xc5\x54\x46\xdd\x91\x2d\x34\x75\xc1\x98\x76\xe1\x9a\xc5\x36\xd3\x17\x87\x6c\x4b\x0a\x2e\x0f\x98\x61\x61\x29\xa5\x68\x37\x32\xa4\x23\x17\xc5\xe8\x09\xdc\xa9\x56\xb2\xab\xb4\x84\xad\xa8\x10\xa1\x5c\x81\xcc\x85\x62\xb5\x55\xda\x94\x58\xf9\xb4\x43\x38\x49\x02\x30\xc7\x40\x4f\x3d\x48\x61\x1f\x84\x12\x7e\x73\xe2\x77\xd8\x8c\x62\x21\x2d\x2a\x3a\x35\x1f\xc6\x76\x65\xb1\x8d\x77\x21\x62\x30\x63\x2c\xbc\x78\x12\x88\xe1\x5c\xeb\xf3\xec\x33\xa7\x20\x5e\xb2\x2b\x9a\xbe\x4c\xdb\xc7\xdd\xba\xaa\x53\x64\x08\x75\xeb\x76\x3f\x52\x2c\x36\xcf\xff\x2e\xb2\x3e\xe5\x86\xd7\x75\x28\x62\x59\xfa\x94\xa4\x4f\xa7\xec\x01\x50\x96\xa2\xa4\x46\xb6\x73\x2b\x80\x02\x42\x67\xfe\x3d\x5d\x39\xd1\xc4\x85\x09\xb3\xec\xaa\x2e\x24\xe5\x4d\xe4\xd6\x1c\x09\x7b\x70\xf7\x53\xb5\xaf\x9a\x6d\xb6\xf9\x75\xd2\x5f\x4f\x83\xd0\x6f\x87\x9e\x17\xef\x7c\x50\x9a\x54\x14\x44\xba\x3e\xb6\x86\x78\x38\x09\x0e\x22\xda\xfd\xbb\x0e\xb3\xb0\x56\x5b\xe1\x57\x9c\xee\xcd\xed\x20\xf5\x44\x25\x6c\x7c\x4e\xde\x3b\x62\x84\x3c\x65\xb0\x46\x6b\xe6\xb7\xe2\x73\x05\xb9\x63\xca\x91\x4e\x3b\x7d\x21\x73\x61\x18\xed\xb3\xd6\x58\xd9\xd7\x6f\x50\x9d\xb3\xb9\xca\x2e\xae\x28\x96\x4a\x4b\x3b\x3c\x38\x4a\x81\xa4\x89\x0e\xe9\x6f\xbe\x93\x4a\x6f\x2a\xec\x8e\xeb\x6c\xfe\x59\xac\x9d\x3b\xbc\x16\x46\xba\x32\xa1\x14\x2f\xee\x59\xfe\xd6\xfb\x7b\xbc\x04\x98\xcc\x27\xde\xad\x41\x3b\x7b\x43\x51\xec\x20\x63\x43\xc0\xab\x89\xfc\xf8\x72\x43\xb1\xab\x45\x0e\x58\xff\x11\xa1\x14\x0a\x38\x3f\x19\x6a\xa3\x97\x6c\xe1\x7c\xf3\x45\x30\xf0\x49\xa1\xde\x90\xe3\x17\x53\xcd\x85\xe7\xf1\xfd\x5c\xf2\x04\x26\xc9\x37\x9f\xeb\x8c\x31\xb4\xbf\xec\x35\xea\x5a\x78\x95\x3d\x75\xc5\xcf"}, +{{0xfa,0x2f,0x46,0x1c,0xe8,0xc7,0x12,0x62,0x18,0xc4,0x7c,0x91,0x56,0x9e,0x87,0x99,0x79,0x7c,0x83,0x36,0x8f,0xc8,0x42,0xb6,0xe1,0xc2,0x2f,0xd5,0x2a,0xec,0x70,0xbf,},{0x6b,0x89,0xb2,0x3f,0x1e,0x11,0xa7,0x5a,0x53,0xf9,0x92,0xf6,0xca,0x57,0x75,0x00,0x8c,0x6e,0x9e,0x7e,0x49,0xc0,0xd8,0x51,0x0b,0x0e,0x83,0x69,0xb7,0xa2,0x0b,0xcc,},{0x84,0xf7,0x9d,0x9e,0x8f,0x30,0xe5,0xbb,0x63,0x62,0x23,0x97,0x14,0x55,0x6b,0x04,0x73,0x6f,0xa4,0x44,0x65,0xca,0xba,0xad,0x23,0xbe,0xaf,0x5a,0x99,0xfc,0x45,0x1a,0xd4,0xae,0x5a,0x18,0xc7,0xf6,0xf9,0x64,0xfa,0x41,0x03,0x92,0x16,0x01,0x8e,0xc5,0xa2,0xac,0xca,0xe1,0x07,0x5a,0x6b,0xb3,0xa6,0xec,0xbc,0x1f,0xca,0x02,0xb9,0x04,},"\x79\x9b\x39\x80\x2a\x18\x27\xe4\x5c\x41\x12\xfe\xe0\x26\x03\x4c\x0e\x59\x8a\xff\xce\x2c\x55\x0c\x19\x3f\xee\x73\xf1\xdf\x8c\x30\xc8\xd3\x87\x33\x40\x08\x8c\xe8\x59\xde\x34\x71\xe9\xd0\x57\x68\x6c\x82\x9b\x54\x08\x79\x5e\x08\xb3\xdc\x7a\xa3\xb6\x37\xc7\xde\x9d\x21\x72\xad\x03\x33\xc1\xbe\xa8\x61\xa6\x23\x2f\x47\xf0\x5a\x10\xbf\x5d\xf8\x08\x15\xa2\x71\x25\x6e\x37\xe8\x08\xa0\xe6\x2f\x1f\x07\xd9\xe1\x0e\xbb\x94\x7d\x3e\xfa\xbf\x8a\x28\xfa\x9d\xcc\xd9\xa1\xd5\x99\xf5\xfd\x61\x65\x50\x8e\xfd\x67\x9c\xf3\x56\x01\x50\x58\xbf\x4b\x34\x11\x8f\x83\xaa\x3e\x5b\xc2\xce\x19\xec\xa8\x4f\x71\x83\x98\xad\xbc\x0a\x52\x76\xcf\x9d\x8c\xaf\xfc\x27\xe3\xe6\xab\xbe\x34\x5b\x0e\x9e\xcf\x89\xc6\x77\x1b\x0e\x75\xd4\x08\xba\x2f\xbb\x90\xfc\xfd\x70\xc5\x3f\x2e\x4d\x52\xba\x54\xd9\x78\x4c\xf7\x1c\x34\x9e\xf6\xf1\x4a\xe4\x97\x0d\xef\x6e\xfb\x5f\x30\xe9\x84\xd6\x01\x6a\x19\x6d\xea\xec\x7e\x04\xb4\x76\x19\xc4\x8b\xf4\x9d\xc0\x2f\x7f\xef\x3e\x13\xb7\x56\x17\x4e\x90\xd0\x5f\xcb\xdd\x5e\x13\xf0\xe4\x34\xef\xd5\x42\x1b\x09\x1d\x51\x79\x00\xed\x0d\x57\x85\x96\x88\x62\xb4\xbf\xe5\x09\x3a\xb6\x72\x17\x18\x0d\x97\x55\x4c\xcd\x9c\xc3\x14\x29\x32\x6c\xab\x42\xf3\xf8\x39\x80\x60\xc1\x9d\xb4\x88\xb5\xd1\xc8\x0b\x29\x09\x0a\xfd\x1c\x6b\xac\x36\x42\x26\x48\x00\x21\x1b\xc2\x78\xfc\xb9\x9d\xae\x9d\xbf\x49\xda\xf1\xb2\x4a\xb5\x69\xdc\xbb\x87\xd4\xd3\x54\x73\x35\xe3\x5d\xb9\x84\x00\xcd\xfc\xe6\x79\x06\x82\xe9\x36\x00\x22\x0e\xc4\x99\x24\x5f\xa4\xee\x15\xd8\x43\x83\x1b\x56\xcc\x26\x41\x80\x25\xbf\x87\x00\x16\x05\xc6\x69\x1c\xa6\xbd\x40\xa4\xe2\x48\xc3\x09\x80\x1b\x76\xa7\x95\xed\xe8\xad\x53\x08\xbc\xb6\xd1\x75\x4a\xb3\x37\x1f\x00\x03\xbb\x8c\x4e\x4e\x47\x19\x54\xe2\x8b\x1e\x98\x66\x37\x9f\x82\xe1\xfb\xac\xb7\x9d\x50\xad\xdd\xad\x5b\x97\x78\xb5\x58\xcd\xdb\xb0\x03\x8a\x5f\xf3\xd5\xc9\x55\x7b\x96\x5d\xe3\xa7\x08\x2c\x45\xa8\xec\xf3\xe7\x72\x1e\xb6\x90\xb6\xc7\x1f\x3d\x89\x75\xd5\x30\x0f\x67\xc4\xdc\x4a\x73\x68\x46\xe4\xcc\xd2\x6f\x93\x46\x3d\x5b\xc6\xf4\x6e\xdc\x48\x86\x64\xbe\x96\x96\xbe\x12\xb0\x2d\xd1\x04\xd1\x0c\xc6\xb1\xd8\x2e\x81\x17\x81\x12\x14\xa6\x48\x7d\x17\x36\x7e\x39\x5a\xde\x2e\xf6\xb2\x6a\x17\x83\xa7\xe2\xf2\x45\x21\x3b\xc0\x3a\x75\x5d\xf3\xee\x8e\xf9\xf1\xef\xf9\x72\xc6\x91\x90\x65\xcb\x7b\x75\x66\x78\xd4\xdd\xfd\x19\x3e\xdd\xc0\xb4\x2e\x86\x89\x61\x36\x43\x14\x6d\x74\x28\xca\x37\xbf\x31\xbd\xf1\x4e\x31\x86\x78\x58\xf3\x9d\x23\x23\x70\x9e\xb3\xb7\xd7\xf4\xe3\x97\x02\x23\x78\x42\x4b\xde\xe9\xbc\xb7\x4e\x9d\x5d\xfd\x37\x1f\x47\x34\x99\x8f\xc1\x8d\xf4\xcd\xfb\x4b\x5c\x21\xc2\xe5\x0f\x8d\x6c\x15\xbc\x14\xbf\x4f\xda\x6c\xeb\x9d\x80\x82\xca\xe4\x32\xdf\xc9\x8b\xfb\x3e\xcd\x16\xb8\xd7\x4f\x83\x0b\x64\x2b\x04\x28\x75\xe9\x21\xb0\x54\xbd\x1a\xaa\x58\x1f\x60\xd7\x18\xdf\x66\x9f\x56\xdc\x2f\x10\xd4\x78\x99\x77\x22\x16\x2e\x83\x94\x0e\x61\xa1\xb6\xe4\x2d\xf2\xa4\xa3\xa7\xcb\xcd\xd6\x11\xce\x96\xcb\xcf\xb5\xa9\x5c\xc4\x73\x23\x1c\xa1\x3c\x06\x09\xd0\xce\x1a\xe5\xdd\xb5\x46\x6d\x6d\x65\xee\xfa\xd9\xda\xf2\xa3\x69\x01\xbc\xc9\x45\x84\x7d\xa1\xed\x6e\x2e\x24\x0e\x84\x8b\x23\x1b\x7d\x0e\x1a\xcd\x06\x54\x3e\xc9\x3e\x76\x8e\x59\x98\x5d\x7e\x96\xc8\xc3\x1f\xcd\x12\x10\xf0\x96\x42\x71\xe2\x18\x77\x52\x5c\xb1\x34\xbc\x35\x36\x25\x7d\xbb\x11\xd3\x0a\x3c\x4f\x94\x9f\xb8\x2a\xe0\xc3\x1c\xcd\xfe\x41\x94\x32\x51\xe5\x0a\xa4\x35\x53\x92\xac\x30\x9e\xf6\x0f\xc1\x74\x32\xa2\xbe\x4b\xdb\x2f\xcb\x28\x60\x7c\xc4\x5a\x52\xb6\x00\x16\xbb\x1d\x2e\x23\x97\x2f\xf2\xc2\xa2\x47\xd7\x25\x58\x5b\x1e\xf2\xb1\x5f"}, +{{0x1b,0xe2,0x94,0x9d,0x51,0xe7,0x20,0x81,0x75,0x82,0x62,0x13,0xee,0x6a,0xe3,0xc0,0x91,0x17,0x27,0x42,0xe8,0x8c,0xaa,0x02,0xed,0x0f,0x31,0x3e,0xcb,0xe5,0xd9,0x10,},{0xd7,0xbf,0x47,0x48,0xd6,0xdd,0xed,0x5b,0x57,0xa2,0xab,0xf7,0x97,0xfa,0xcc,0x56,0x0b,0x48,0x56,0x3d,0xfd,0x9d,0xcf,0xf4,0xbe,0x52,0x2c,0x71,0x7a,0x6c,0xfd,0xa9,},{0xf4,0x1f,0x2e,0xf6,0x59,0x5f,0x17,0x66,0x0b,0xb2,0xfe,0x93,0xe5,0x1f,0xc6,0xfa,0x9c,0x31,0xda,0xdc,0x9d,0xb9,0x0c,0x3f,0x46,0x60,0x7a,0x7f,0xb4,0x80,0x0b,0xb7,0x5a,0xd9,0x63,0x25,0xdc,0x7e,0xab,0x78,0x24,0x72,0xb0,0x4d,0xa6,0xd8,0xe6,0xfe,0x64,0x65,0x5d,0xea,0x55,0x1f,0xbd,0x50,0x49,0xe8,0x76,0xce,0x5a,0x40,0x5f,0x02,},"\x04\x5e\x2b\x0e\xc7\xbb\x20\x3a\x49\xbd\xcb\xa9\x41\xe2\xb7\x3c\x23\xc1\xfe\x59\xa1\x7d\x21\xa0\x12\x4e\xa2\x4b\x33\x7f\x92\xab\x9c\x92\x3a\x20\x57\x6b\x62\xd5\xd0\xf6\x24\xe7\x93\x2c\x11\x5b\x54\x74\xe0\xa4\x6a\x4d\xc9\xec\x51\xf6\xa0\xce\x8d\x54\x74\x4d\x1d\x52\x09\x33\x20\xe3\x9b\xe2\x03\xf7\x4a\x0f\x5d\xfa\xc5\x2c\xf0\xf9\x95\xc6\x6d\xf2\x91\x4b\x68\xad\x87\x1f\xbe\x81\x52\x5a\xd2\xd8\x8a\xc6\x99\x33\xa7\x5a\xea\x74\xac\xe4\xe3\x63\x43\xdd\xc0\x6d\x32\x08\xf1\x6d\x80\x5f\x5d\xd7\x86\xb4\xda\xaa\x16\x67\x48\xcf\xee\xc5\x71\x4c\x85\xc1\x04\x78\xb5\x97\xac\x7f\x6a\xe2\xc9\x88\x91\xe3\x8f\xd4\x14\xaa\x81\x1b\x76\x21\xd8\x05\xeb\x8f\xcc\x46\xcf\x4d\x56\x8a\x8a\x92\x58\x7c\xbb\xc1\xae\xcc\x12\xf1\x0d\x90\xac\x1e\x01\xae\x98\x6d\x14\xfe\x82\x95\x1c\x68\x2c\xea\xc8\xc9\x25\xfc\x66\x54\xd8\x38\xac\x93\x53\xae\x2f\x93\xf3\xc8\x8b\xf7\xb8\x2c\xbc\x43\xb1\xe4\x9e\x5c\xeb\xfb\x19\x49\xad\xe4\xb2\x2e\x4b\xcf\x1b\x40\x0c\x0a\x8f\xa8\xa6\xfe\x76\x70\xf6\x9f\xc3\xfa\xec\xd4\x80\x5b\x8c\x95\x4c\x01\xa5\x40\xd1\xa1\xe7\x88\x43\x6e\xae\x07\x3a\xe9\x56\xda\xe3\x17\x69\x05\xa8\xf0\xa3\xc6\x0f\xd9\x80\xda\xb4\x19\xd4\x1e\xc0\x6e\x52\x73\xfb\xb1\x3d\xb9\x38\x1f\x89\xb6\x63\xcc\xc4\xbd\x75\x3f\xd9\x0f\x14\xa7\x7b\x3d\x81\xc4\x5d\xd3\x56\x1c\xd1\xfa\x0e\x94\xd2\x34\xce\xf9\xd7\x85\x9a\x2e\xc9\x42\xbf\xc1\x88\x49\xd7\xf2\xad\xa3\xa5\xd6\x57\xbc\x19\x3d\x2e\x14\x91\x68\x2f\x16\x65\xa5\x34\xb1\xac\x20\x83\xb7\x38\xbe\x8f\x9e\x96\x3f\x59\x41\xed\x48\x3c\x6a\xcc\x82\xe9\x59\xb8\x1b\x8a\xf0\x2f\x47\x1c\x08\xf5\xf8\xb1\x2e\x10\xe0\x08\x19\x28\x98\xa4\x45\x02\x02\xaf\x73\x15\x92\xe7\x4e\xfe\x2a\x94\x8e\x51\xd0\x6e\x44\xde\x9b\x95\x6b\x7b\xc9\xa6\x9b\x6e\x74\x68\x7a\xb2\x06\xde\xc4\xd3\x5b\x31\x73\xfb\xc4\x38\x82\x9d\x50\x64\xbf\xbc\xf7\x43\xc1\xe2\xd4\x6f\x62\x8f\x2e\x51\xc6\x26\xd8\xe4\x16\xd7\xbe\x6e\x55\x5a\x24\x96\x91\xab\xb1\x67\xf1\xd9\x2f\x4f\xa3\x39\x2f\xde\x24\xe9\x93\xce\x7f\xf5\xc1\xb8\xe1\x57\x7a\x7c\x0e\x73\x02\x5c\xc6\xfc\xd7\x27\xa8\x2e\xf0\xc1\x29\xe9\x1e\x55\x33\xe0\x21\xa3\xcd\xbb\x99\xd5\x4b\xf7\xcd\xcd\x3f\xf1\x19\x15\x4f\x3f\xad\x92\x42\xb6\xed\x35\x0d\x10\x37\x2c\x97\x6f\xf3\xa4\x37\xd0\x97\x86\x7d\x9b\xfb\xa9\x1d\x84\xbd\xa5\x5a\x6b\xcd\x6e\x36\x41\xb2\x13\xa2\x18\xb3\x04\x15\x89\xc5\x5a\xfb\xb3\x44\xde\x6e\x97\xd8\xc3\x5b\x5c\x86\xcf\x3b\xe0\x63\xf9\x01\xff\xee\xa8\xcc\x91\x06\x99\x67\xd2\x34\x60\x35\xa9\x1e\xb5\x70\x6a\x3b\x53\xf6\xd1\xc3\x4d\x4d\x21\x16\x70\x6b\x65\xc2\x98\xec\x57\xde\x82\xab\xc4\x00\x3c\xe8\xcc\x5e\x0b\x88\xff\x71\x0d\xda\x1d\xce\xf6\xf1\x54\x27\x71\x06\xb8\x3e\xb4\x6c\x04\x5b\x08\x2d\x11\x3b\x36\x1d\x6a\x62\x58\x08\xc9\x13\x05\x84\xdf\xc9\x67\x07\xef\x89\x55\x90\x7b\xaa\x61\xcf\x88\xc6\x6b\x6d\x1f\x60\x58\x11\x19\xcb\x62\x17\xa8\x52\x15\x73\x36\x17\x8c\x68\x5e\x6e\xd4\x85\x26\xed\x5c\x4e\x3b\x79\x67\xd5\x1f\x99\xdf\x68\x76\xa1\xac\xfb\x84\x5c\x57\x1b\x89\x86\x56\xe5\xe3\xbc\x73\x98\x0b\x9b\xed\x11\x98\x86\x63\x59\xc9\xe9\xb1\xef\xa9\x15\xf8\x10\xd1\xef\x8a\xd6\xcb\x3f\xc2\x1f\xbf\xe6\x54\x30\x6d\xe6\xca\x13\xa3\xa6\xa4\x8e\x7a\x13\xed\x87\x46\xac\xbd\x07\xf4\x8e\xb0\x0c\x36\x37\x4b\x1e\xb4\xf3\xf0\x1c\x19\xe2\xe8\xd3\x7e\x9f\xc0\x64\xb3\x3c\x0d\x66\x9b\xba\x55\x4d\xdc\x68\x21\xa7\x7b\x40\x89\xca\xbd\xca\xfc\x97\xf6\x0e\x60\x50\xbc\xa4\x44\xae\x8c\xfc\x44\xd9\x3c\x40\xef\x53\x18\xbe\xe6\xf8\xcf\x0c\x06\x7b\x85\xcd\xdd\xc4\x59\x74\xa4\xea\xcf\xc3\xef\x51\x31\x5b\xa0\xf3\xf6\x29\x68\xc7\x00\x3a\x7f\xf4\x44\x61\x24\x00\xb1\x59"}, +{{0x3b,0x6b,0xa6,0xd5,0xcc,0x9c,0xd6,0x24,0x1d,0x8b,0x00,0x97,0xa3,0x72,0x2e,0x4d,0x06,0x6f,0xea,0x3d,0x56,0x0a,0xea,0xb4,0x67,0x3e,0x86,0xf1,0xf8,0xec,0x60,0x26,},{0x8c,0xa6,0x52,0x07,0x17,0xcf,0x36,0x3c,0x4c,0xef,0xfa,0x76,0x32,0x8a,0x0a,0x16,0x6f,0xf8,0x3e,0x45,0xca,0x7d,0x19,0x1c,0xc8,0xef,0x6c,0xa6,0xe5,0x24,0x33,0x67,},{0x78,0x8c,0x9f,0x45,0x54,0xdd,0xba,0x5c,0x7d,0x64,0xba,0x75,0x9e,0xc4,0x56,0x94,0xec,0x79,0xfb,0x85,0xe8,0x23,0x68,0xa0,0x74,0xbd,0xd8,0xdf,0x34,0x42,0x13,0xa5,0x6d,0xd0,0x9f,0x33,0x4c,0xd9,0xac,0xb9,0x41,0xbe,0x28,0x3d,0x98,0xc4,0xb1,0x5d,0xcf,0xec,0xd1,0x4e,0x93,0xf6,0xa2,0xe3,0xcb,0x0c,0x1a,0xa2,0xde,0xe7,0xd9,0x0b,},"\x36\xde\x93\x0c\xc8\xe1\x88\x60\x83\x6a\x0c\x82\x9d\x89\xe9\x63\xa5\x8b\xdd\x9c\x6b\x6e\xf5\xbc\x61\xf7\x59\x92\xd2\x07\x52\x42\xdc\xa2\x3e\x28\xde\x20\x5a\x33\xdf\xea\x86\x1f\xc4\x4a\x32\x62\x8e\x8e\x7c\xdd\x3e\xd7\xff\x49\xea\x6a\x70\x97\xe0\x09\x0c\xfd\x9f\xf5\xec\xab\x1d\xe8\x22\xfc\x0a\x4c\x37\x76\xdd\x56\xc1\x91\x92\x04\x51\x6a\x94\xce\xc5\x63\x8d\xa1\xd9\x9e\x52\xb8\x66\xf5\xec\x41\x62\xa9\x12\xed\xb4\x1c\x1e\x92\xed\xfc\x35\x3f\x67\x05\xe1\xc1\x2c\xd4\x1c\xb6\x2d\xed\x4a\xd8\x15\x79\x40\x05\x9b\xfc\xf5\x07\x19\xd3\xf2\xad\x00\x84\x85\x40\xce\x89\xf3\xf9\xaf\xa6\x10\xcc\xba\x5e\xcc\x37\xe3\xe2\xc1\x53\x4f\xcb\x38\xfc\xd3\x9a\x2d\x14\xd5\xb5\xda\x6f\xea\x24\xe0\x06\x65\x4e\x30\x90\x47\xa2\x9c\xad\x0a\xe4\xda\x8e\x70\x8f\x97\xa1\x8c\xad\x5f\xbd\xc9\xac\x84\x40\x0c\x53\x2c\xed\x54\x88\x86\x53\x9e\xdd\x6c\x54\x10\x74\x79\x0a\xe4\x50\x2f\xdf\xe9\xf3\x27\x3a\x87\x6a\x21\x86\x23\xa2\x57\x06\xa1\x52\x5e\x67\xe5\x7a\x16\xd2\x2c\x21\xb6\xa4\x5e\x23\x84\xe2\x87\xac\x44\x52\xae\xc4\xe0\x63\x05\x6b\x4c\x17\x8a\xb0\xe5\xb2\xa5\xba\xd3\xf4\x63\xc4\x72\xc4\xea\x1f\x9c\x1a\x66\xe5\x27\x04\x73\xa8\x35\x09\x4e\x8f\x0e\xef\x68\x0c\xd7\xb2\x0d\x0e\x70\xf4\xd6\xc9\x58\xfe\xe0\x8a\x93\x60\xaa\x60\x66\x88\x8f\x4d\xd7\xce\x5e\xc2\x22\x59\xfa\x0b\x53\xfe\x92\x71\xc0\x83\xc6\xfc\xdb\x72\x83\xb0\x90\x61\x08\x8c\x52\xf7\x1b\xfd\xd2\x77\x7c\xe0\x80\x1f\x41\xa6\xc4\xce\x90\xef\x13\x1d\xe1\xe1\x83\xcb\x89\x49\xce\x32\x3c\x9e\xb1\x3a\x4b\x0c\xac\xf9\x9d\xef\xdf\xdb\x68\xd5\xed\x1f\x68\x91\xb4\x8e\x21\x04\x76\x68\xd6\x9d\xe8\xa8\x0f\x8e\x56\x34\xde\xd0\x87\x36\xa4\xfb\x54\x10\xcd\xea\x9c\x72\x59\x6e\x36\xdf\x68\x41\xf2\xee\xa4\x68\x50\xc8\x74\x73\xc8\x95\x54\x02\x05\xb0\x92\x19\x60\xff\xa5\xd9\xd8\xff\xb8\xe2\x9c\xde\x96\xa3\xed\xe0\x15\xac\xbc\x26\x97\x40\x04\xd3\xe4\x38\xa8\x5b\x2e\x33\x85\xf6\x4d\x18\x14\x00\x39\x41\xff\xd3\x63\x99\x2d\x39\x40\xc6\xe6\xd8\x1f\xf8\xe4\x5f\xce\xd6\xd3\x6c\xe1\x98\xd8\xcc\xbe\xfe\xe4\x32\xa7\x7d\x8f\xca\xdd\x73\xfb\x79\x9f\x6b\xaf\xef\xb5\x1a\x2d\xa7\x98\x72\x1c\x3d\x46\x5b\x16\x3e\xf1\x3e\x6e\xcc\x65\xe6\x03\xb2\x89\x3e\xe4\xcc\x9e\x1c\x6d\x1d\xe7\xa6\x5c\xab\x5c\xbd\xf5\x36\x85\x5e\x28\x8c\x3c\xcd\xa8\xd2\xfa\x3c\xe1\x0c\xf4\x93\x58\xa2\xef\x4e\xf0\x76\xe5\xbf\xa9\x1b\xbc\xf3\xd9\x66\xdf\xa3\xdc\x6e\x71\x2f\x19\x56\xd4\xe5\x8a\xa3\x6e\x71\x2d\xd3\x34\x71\x69\xb1\x9c\x8d\x44\xbe\xc5\xbc\xb7\x30\x77\x8f\xcc\xcc\x58\x9e\xd5\xd3\x50\xd4\x4c\x17\xbd\xe2\xee\xbb\x6f\x5e\xc5\x9f\xb2\x40\xd6\x7d\x81\xae\xa9\x26\x7f\x34\xf1\x5e\xee\x2d\xe3\xf4\xfa\x67\x39\x14\x79\xbd\xbb\x43\x0f\x48\x43\x70\xfb\x0e\x08\x95\xb9\xae\x06\x5b\xbd\xd4\x3e\x23\x0c\x62\xac\x07\x18\x4e\x8b\x06\xb2\x4b\x8b\x97\xec\x02\xdc\x6f\x37\xef\x61\x64\x1e\xd5\x6e\x3f\x5e\xb8\xd2\x08\x0b\x51\x44\xef\x76\x0b\x51\x87\x52\xe1\x97\x54\x79\x2e\x19\x34\x3a\x38\x55\xe1\xe2\xf7\xa7\xdc\x62\x35\x17\xee\xd2\xf5\xd2\x65\x48\xa6\x8e\xb8\xff\xd7\xbf\x70\xf7\x8f\xd1\x86\xdb\x63\x49\x28\xbb\x98\x13\x8f\x2b\x8f\xe8\x44\x81\xcc\x53\xf5\xaa\x35\xe2\x66\x6c\x63\x25\xe1\xd2\xb8\xac\x5e\x2d\xf2\x93\x5b\x7f\x64\x13\x95\x2d\x10\xd6\x07\x6f\xfc\x75\xbb\x6a\xf6\x3b\x29\xb0\xb9\x66\x3b\xec\x37\x24\x7b\x66\xb5\x08\xdd\xe4\x1f\x2f\x11\xb8\x43\x33\x55\x9d\xfa\xc7\x3f\x76\x1b\xcd\xa8\x4a\x48\xd2\x66\x07\x3a\xef\x16\x38\x46\x08\x49\xe7\xa1\x72\x06\xa2\x5f\x68\x00\x77\x0b\x91\x4c\xc0\x26\xba\xf9\xe3\x25\x59\x14\xe1\x32\x58\x44\x1c\xef\x35\xad\x1d\x66\x83\x3e\x98\x7e\xbe\x44\x31\xe6\xa6\xbb\x22\x2c\xbb\x65\xaf"}, +{{0xdd,0x99,0x87,0xb1,0x8f,0x9a,0x92,0x2c,0x0f,0x6f,0xea,0x18,0xeb,0x00,0xb8,0x96,0xc7,0xa2,0xd3,0x09,0x3d,0xb3,0xea,0x31,0xd3,0x84,0x21,0xda,0x0d,0xe5,0x12,0x31,},{0x57,0x39,0x21,0xa9,0x55,0xfe,0xb6,0xdd,0xe4,0x1b,0x05,0x5c,0x8d,0xac,0xac,0xcd,0x1d,0xb7,0xfe,0x9e,0x36,0xb5,0x09,0xd3,0xc9,0xe3,0x6f,0x97,0x35,0x75,0x23,0x24,},{0x3e,0x9f,0x2b,0x00,0x7c,0x0e,0x29,0xec,0x87,0x59,0x95,0xa6,0x30,0x9b,0x97,0x3d,0xeb,0x8b,0xaf,0x11,0x3d,0xed,0x13,0xf1,0xe0,0x00,0x3e,0x9b,0x9b,0xf9,0x39,0x16,0xa4,0xdf,0xe4,0x79,0x37,0xda,0xdf,0xc7,0x8a,0xa6,0x63,0xc5,0x5f,0x67,0x4e,0xc3,0x5c,0x38,0x46,0x25,0x8f,0x18,0xe7,0xbb,0x93,0xfb,0xba,0x3e,0x82,0x6a,0x1f,0x0d,},"\x48\x16\x2f\xdc\x3a\xbf\x73\x19\xc6\xca\xab\x60\xcb\x8d\x05\x20\x87\x5c\xb4\xee\x8a\x07\x09\x27\x83\x16\x7d\x47\x33\xff\xe5\x20\x4e\x5f\xeb\xe7\xd2\x91\xe9\x53\x6b\xde\xa3\xdf\x06\x37\x15\x9a\x65\x3e\x09\xfd\x99\xaf\x66\x1d\x83\x00\xae\x74\x1a\x3e\x91\xa8\xbd\x85\xea\xd0\x5d\xc7\xd9\xe6\xf9\x29\x32\x33\x16\xed\xc4\xca\x62\x4e\xa7\x81\x8b\x25\xbd\xc0\x61\xf7\x14\x92\xfd\x22\xd4\x65\xab\x22\x6f\xd9\xa1\x0d\x8b\xab\xfc\x07\x4c\x68\x6c\x43\x6c\x24\xa3\xa5\x3f\x8f\xf3\x89\xce\x9c\xa1\xdb\xc8\x90\x74\x45\x88\x92\x41\xf8\xfd\xa3\xa7\xa3\xf5\x02\x4f\xa8\xcb\x0d\x04\x4b\xda\xf6\x71\x6d\x98\x3a\x6d\x83\x98\x14\xff\xe7\x0d\xdc\x55\xbb\xba\x11\xac\x97\x88\x7b\xdb\x4d\xad\xa9\x65\x65\xbb\x07\x5d\x5f\xc1\xd3\xc5\x24\x4b\x9f\xff\x77\xde\x58\x72\x9a\x05\x9a\x91\x1f\xb3\xe0\xeb\x16\x4f\xb8\x42\x9e\x26\x56\x85\xd1\x4a\x63\x23\x30\x46\xd2\x0e\xcf\x28\x9c\x55\x72\x31\x69\xa9\xd6\x3d\xda\x0d\x52\x55\x15\x3d\x9e\xf4\xa6\x1b\x92\x12\xf4\xb8\x20\x69\x7a\xe7\xc3\x08\xcf\xab\x40\x3b\x2c\x34\x31\x90\x62\x26\xe4\x5c\xe2\x19\x20\xdf\x52\x01\x60\x9d\xaf\x83\x0f\x28\xad\x79\x60\x05\xa9\xbd\x8e\xba\x62\x0c\xf8\x39\xc3\xba\x22\x7b\x96\x3c\x7b\xd0\x91\x48\x22\xdf\x2c\xa0\x3c\x22\x54\xd0\xcb\x8a\xca\xe0\xd5\x9e\x4c\x3e\x0e\xc2\x15\xc8\x36\x96\x9d\xcd\x1d\x49\xbf\xe1\x97\xe2\xf3\xee\xa3\xfa\x8a\x37\x3b\x55\x8d\x0f\xb9\x06\x3c\xf1\x56\x8e\x73\x9a\xad\x8f\x09\xfb\x43\x7c\xaf\xb5\xa2\x72\x37\x5f\x43\x60\x64\xee\xe1\x1b\xd9\x03\xd3\xaa\xea\xb4\xe3\xfd\xcd\x36\xbd\x20\x76\xee\xa1\x79\xa4\xf0\xd4\xfb\xc8\xdf\x42\xbf\x26\x60\xf0\x8d\xe7\xd5\xc6\x39\x7c\xae\x10\xb7\x27\x74\x58\xaa\x6c\xfa\x01\xe8\xa6\x73\x7e\xb1\x26\x22\x78\x56\x64\x66\x91\x68\x1c\x10\x6a\x15\x7a\x26\xae\xd2\x1b\x1a\xaf\x0e\xd2\x76\x64\x21\xcf\xc3\xd1\xc7\xdd\xfb\x72\xfc\xdf\x4b\x8b\x49\x0f\xc0\x9a\xce\x49\xae\xdd\x77\x12\xb2\x1a\xc5\x6f\x86\x01\xf6\x25\x56\x3c\x78\x43\x06\xf3\xb9\x17\x4a\xdd\xf7\x64\xe0\x51\xaa\xdf\xe1\x28\x31\xaf\x96\x69\xe6\x2c\xab\x12\x1c\x74\xdf\x34\x37\x24\x42\x9d\x6c\x26\x66\x02\x71\xc3\x2f\x40\xcf\x7c\x2d\x08\xbd\x0a\xfc\xc7\x28\xde\xf4\x13\x5d\x4e\xb5\x5b\x6a\x3e\x76\x29\xd8\x06\x86\x4a\x85\xb3\x6a\x32\xb9\xb2\x1a\xc0\xd3\x96\x80\xa2\xae\x4e\xc4\x18\x97\x09\x17\x8e\x34\x94\x97\xf3\x93\x99\xfb\xc7\x8b\x3c\x6c\xfa\xca\x6e\xde\xa7\xc3\x3d\xda\x3c\xc1\x1e\x43\x84\xf1\x58\x3d\x6c\xfc\x6b\x58\xf4\xea\xa2\xbc\x56\xab\xa4\x2f\x73\x8a\x42\x9b\x93\x58\x08\x50\xde\xe3\xfd\x25\x39\x94\xf8\xb0\xfa\x66\xee\x8e\x27\x3d\xec\xab\xd5\x32\x09\x5f\xb0\x4a\x4a\x3c\x34\x0a\xf0\xe5\x5b\x57\xef\xab\x43\x63\x0f\xc0\x2e\xf2\x0b\x42\x5c\xa2\x18\x7e\x3c\x6c\x5e\x10\xf1\x2d\x61\x8f\xd2\x43\xa2\x24\xf6\x50\x1e\xbe\xb9\xd3\x21\xc6\x38\x5b\x81\x27\xef\x9c\xdc\xd0\x97\xce\x7f\xa0\x21\xcf\x40\xd2\x1c\x39\x91\x23\x43\xf6\x7a\xcc\xe1\x82\x5e\x3a\x51\xb8\xa7\x18\xe8\xc3\x40\x62\x2f\xff\x65\xfe\x00\x53\xd2\x4a\xa3\x35\x1b\x6a\x24\x00\x18\x5d\x7a\xeb\x88\xe8\x7a\xc4\xa1\xd3\x94\x90\x9d\x49\x41\x4a\xef\xc2\x2b\xa0\x09\xaf\xf6\x96\x2c\x92\x17\xd7\x55\x69\x4e\x4d\x6a\xa8\xa5\xd6\xa8\x03\xce\xbb\x15\xde\x8f\x54\x16\x34\xb6\xfc\xeb\x0c\xac\x79\xdd\xa8\xa1\x8e\xef\xbb\x53\x7e\x70\xff\xe9\xaa\x5a\x6a\x6a\xaf\x92\x40\xfa\xc2\xea\xcb\xfb\xef\x01\xad\x6b\xdf\x50\x75\x87\x80\xf8\x6a\x4e\x48\x89\x85\x36\x2d\x58\x25\x01\x1f\x5e\x8b\x66\x42\x5a\x61\x6b\x7e\x10\x4e\xb2\x3f\xe8\xf1\x00\xcb\x02\x49\x82\x36\x62\xbd\xa3\xda\x47\xa4\xc3\xc1\xca\x2f\x91\x4b\x25\xb9\x73\x85\x34\x02\x60\x47\xdf\x6d\x7f\xf6\x31\xdf\x2c\x41\x31\xf6\x80\xe1\x37\x43\xc9\xcc\xf2"}, +{{0x38,0xd2,0xef,0x50,0x9f,0x93,0x05,0x1f,0x14,0x51,0x67,0x73,0x7c,0x22,0xe1,0xa5,0xbf,0xe8,0xf4,0xa9,0x1e,0xba,0x0b,0xb8,0x7c,0x39,0xce,0x04,0xa8,0x9b,0xae,0xc6,},{0x01,0x11,0x5f,0x6d,0x89,0xa5,0xda,0xab,0x54,0xf8,0x92,0xbb,0x4a,0x4b,0xda,0x1c,0xe5,0xd8,0xf6,0xc9,0xc8,0x8a,0x50,0xce,0xe8,0x3b,0xd9,0x87,0xa2,0xc0,0xdd,0xf7,},{0xde,0xc4,0x62,0x53,0x50,0x9b,0x11,0xe4,0xb5,0x2a,0x6a,0xe4,0xf3,0x66,0xb6,0x80,0xdf,0xfc,0x28,0x0d,0x0a,0x04,0x4f,0xc0,0xcb,0x79,0x0b,0x6e,0x75,0x13,0x81,0x46,0x1e,0x1e,0x60,0x2a,0x89,0xe3,0xb3,0xd3,0x06,0x4c,0x40,0x7f,0x60,0x2f,0x1c,0x22,0x40,0x4b,0x68,0x23,0xbd,0x24,0x67,0x54,0x93,0x14,0xa0,0x00,0x01,0x66,0x4a,0x08,},"\x42\x7b\x5a\x01\xe8\x59\x7f\x04\xfd\x42\x2f\x0a\x66\x2d\x0b\xe2\xdf\xa8\x53\xed\x5f\x9d\x3f\x60\xff\x90\xf2\xc5\xee\x08\xbb\x59\xfd\x03\xd4\x02\xb7\x54\xca\xf5\x4d\x00\x58\xf5\xa2\xcf\x87\xaf\x4f\xef\x21\x77\xd5\x9e\x18\x22\x62\x93\xfd\x2a\xf3\x76\xbc\x98\x7b\xf7\xb3\x20\xb9\xd1\xe2\x49\xab\x9e\xfb\x75\x07\x8e\x6d\x3d\xf2\x9e\x03\x50\x47\x76\x35\x43\x44\xaa\x69\xe7\x2e\x1e\xbc\x52\xa3\xc3\x8a\x4c\x2a\x16\x73\xb4\xe9\x74\xa2\xe4\xe1\x2a\x2e\x78\xea\x3e\x3f\xe5\x0c\x53\x63\x0d\x09\x6d\xa3\xe2\xfe\x82\x99\xf7\x1a\x1b\x44\x1b\x4c\xf0\xca\xeb\x93\x7a\xfa\x4a\x0e\x39\x15\xcc\xab\x39\x96\xc9\xf6\xa8\xf4\xfd\x37\x54\x3e\x8f\x75\x90\x0c\xfd\x47\x17\x53\x70\xef\xb8\x52\xa5\xf6\x9d\x67\x36\x83\xf9\x98\xfd\xcf\xf8\x5f\xf8\xf3\x2b\xaa\x80\x70\x66\x60\x44\x22\x02\x7d\x51\xa4\x35\xdd\xf9\x88\xed\x2f\xd8\xeb\x19\x1f\x10\xb4\x68\x07\x42\x00\x08\x75\x6e\xb4\xe3\x00\xc4\x09\x9c\x2d\x64\x50\xbc\xc6\xa4\xe7\xd0\x67\x31\x56\xb8\x37\xf0\x50\x63\x38\xf3\xd1\xb5\x73\x4b\x16\x6c\xa5\xcc\x2f\x24\xa4\xef\x02\x6c\xda\x2c\x4a\xe3\x10\x5b\x63\xca\x85\x70\xd1\x85\x46\xcf\xac\xb8\x60\x42\x96\x6a\x00\xef\x52\xc7\x29\x90\x19\xf6\x8a\x2d\xf0\x8c\x8b\x70\x4e\x85\xe7\x13\xc3\x48\xd7\xf1\x67\x76\x60\xe1\x8e\xba\xb5\x9b\xf4\xe1\x2e\x6f\xf2\xd7\x83\xd8\xd5\xd4\x2a\xab\x6e\xf0\x17\xb7\xa1\x96\x6a\xee\x8d\xc1\x4d\xda\xbe\xd4\x9b\x4b\x64\x3d\xf4\xe9\xb0\xb6\x03\x83\xc7\xd8\xb4\xb8\x8c\x65\xa8\x98\xc1\xc7\x7d\x43\xd6\xbd\x68\xb2\xa5\x74\x3f\x1f\xed\xd6\x54\xdc\x84\x49\x6d\xa0\x2c\xeb\x69\xb9\xb4\xd3\xa8\xe0\x0c\xcd\x72\xe7\xc7\x5f\xc5\x0a\x8d\xd0\x87\xe1\x83\xe6\xc1\xf5\x79\xba\xeb\xc5\xc6\x3f\x28\x07\x93\x67\x91\xb5\xfe\x48\x47\xcd\xcf\x15\x17\x74\x23\x52\x05\xcd\x2d\x7b\x8b\xf4\xae\x88\x19\x22\x5e\xa7\x08\xb7\xba\xac\x66\x99\x8f\x0c\xba\xb2\xc7\xdd\xf2\x51\xf3\xb1\xde\x10\x17\xd3\x97\x69\x22\x05\xee\xa6\x39\xf1\x2d\x77\xbe\xef\x6c\x13\xbb\x12\x10\x0f\xf8\x90\x64\x70\xbc\x7b\x21\x29\x80\x53\xbe\x1a\x61\xb7\xb3\xa4\x99\xed\xc3\x10\x99\x6c\x8b\xc0\x87\x19\x07\xca\x46\x8e\x89\xed\x31\x1a\xdc\xa2\xe2\xb8\x29\x30\x97\x5b\x3e\xfb\xbf\xc0\x3c\xdd\xf4\xd9\x48\xc4\x76\x5e\x8c\x10\x59\x08\x82\x16\x9a\xcd\xdb\x8f\x8c\x36\xd8\x4c\x2d\xac\x3b\x79\x8e\x7a\xbf\x84\x47\x12\xfa\x45\x8d\x27\x7c\x24\xe8\x14\x04\x7d\x74\x23\x19\xa8\x34\xdd\x9f\x92\x7a\x2b\x44\x85\xef\x13\x74\x5f\x7a\x60\xdd\x6b\xb3\x37\x93\x63\x04\xc9\x7d\x3f\x9f\x14\x4e\xb2\x9b\xb6\x95\xb8\xdc\x31\xb9\xd8\x49\x10\x61\x1d\x28\xd5\x81\xca\xa9\x36\x5d\x6d\xff\x52\xd4\x10\xa4\xad\x52\xbd\x12\x17\x29\xff\xf5\x28\x88\xf4\xda\xae\x17\x07\xf6\xf5\x6d\xac\x61\xff\xb9\x96\x1c\xda\x71\x76\xaf\x44\x60\xa6\xd5\x54\x2a\x20\x44\x6f\xb5\x14\x7f\xce\x72\x72\x04\xce\xc6\x89\x9b\x9a\x3d\x4f\xf6\x22\x6b\xb8\xa1\xc7\x8e\x36\xfc\xdd\x9e\x50\xc0\x40\xd7\x2d\x0f\x40\x07\xd3\xfa\x9a\xa7\x67\xe4\xab\xd0\xad\xd6\x2f\xdb\xcc\xde\xff\x67\x21\xeb\x25\x9e\x00\xa7\x21\x63\x20\x06\xbe\xde\x0d\x17\x3d\x38\x34\x4d\xea\x44\xf9\x6b\x67\xd9\xa2\xee\xa1\xd2\xaf\x5f\x74\x8e\x8e\xbd\xb4\x41\xbf\xb4\xe5\x8e\x2d\x42\xfe\xc7\x40\x56\x6a\xcf\x73\xa3\x03\x35\x8f\x7d\x89\xc8\x15\x8c\xf2\x1f\xe8\x5b\x0d\x4a\x41\x7e\xbd\xc8\x6d\x04\x69\xf6\xb9\x1c\x24\xad\x61\x0d\x48\x6d\xed\xc2\x18\xb2\xce\x7a\x8b\x96\x75\x47\x23\x15\x1f\x0d\x00\x76\xff\xf9\xf1\x9d\x11\x2d\x9c\x05\x92\xfb\x8d\x92\xc9\x9d\xcb\x8d\xdf\xaa\x46\xfb\xe0\xd9\x2d\xf4\x6b\x8c\x00\xca\x43\x45\xad\xb6\x9a\x5a\xca\x69\x4a\x86\xcf\x30\x64\x64\x51\xbb\x17\xba\x6e\x60\x7a\x91\x2b\xf1\x09\xd5\xfc\x2d\x3e\x27\xd0\x0d\x94\x56\x00\xa8\xa5\x7c"}, +{{0x43,0xbf,0xb3,0xdb,0xe4,0xd9,0xbd,0xaa,0x82,0xb3,0x54,0xdd,0x59,0x63,0x34,0xe6,0x60,0xd7,0x6f,0xc0,0xb2,0xeb,0x69,0x89,0x93,0xae,0xf3,0x76,0x7f,0x1c,0x7c,0x7f,},{0xd0,0x0a,0xec,0xef,0xf0,0xce,0xb8,0x32,0xc2,0x51,0xd1,0xfe,0x6b,0xcb,0xea,0xea,0xcb,0xb4,0x11,0x3f,0x52,0x81,0xba,0xba,0x4e,0x87,0x8f,0x7b,0x95,0xf9,0x3f,0x07,},{0xa9,0x99,0x55,0x23,0x02,0x0a,0x0d,0x22,0x2b,0xc4,0x8f,0x98,0xd0,0x55,0x04,0xe3,0x06,0x8f,0x30,0x4a,0x6d,0x19,0x70,0x06,0xcc,0x9c,0x03,0x5e,0xea,0xde,0x09,0x9e,0x7a,0xa9,0x7e,0x90,0x89,0x4e,0xad,0x17,0xe8,0xc3,0x0b,0x0a,0xa4,0xa9,0x80,0x88,0xf0,0x38,0xb9,0x22,0x44,0xc4,0xb2,0x0f,0xde,0x96,0x4f,0x85,0x34,0xe8,0xfb,0x03,},"\x3f\x3e\xed\xdc\xae\xf4\xe1\x66\x2a\xdb\x66\xbb\x1b\x20\x7d\x79\x3f\xcb\xef\x81\x50\x05\xe8\x26\x43\xed\x70\xc9\x85\x54\x03\xda\xc2\x8b\x52\x07\x27\xa9\x01\xa5\x32\xd2\x8b\x9b\xd1\x34\x8d\xb2\xf8\x96\x7b\xbb\x8c\x90\x98\xb0\x7f\x57\x0a\x2e\xae\x1e\xe4\x82\x64\x0c\x0b\x67\xa5\x2a\x38\x61\x21\x33\xa1\x5e\x25\x8e\xde\x38\xcd\xa8\x78\xff\x36\xed\x32\x1d\xff\x87\xcc\x6a\x01\x38\x3b\xa8\x40\x67\xd6\x0a\xf4\x17\x76\xac\xf8\x0a\x8a\x4e\xac\x77\xf7\xd8\x7c\x37\xa7\x04\xa3\xe2\xac\xa1\xe8\x81\x5e\x49\xfb\xca\xb7\x97\xc8\x56\x52\x95\x38\xbe\x07\xd5\x16\x96\x32\x1f\x69\xb0\x9b\x5d\xc5\xa1\x5e\x5f\x0e\x4c\x22\xd2\x28\x37\xf6\x2e\xe4\xc8\xbc\x7f\x25\xa9\x48\x7b\x96\x2c\xc2\x0f\x13\x3f\xcb\x87\x0e\xd1\x25\xcc\xa5\x85\xd1\x81\xbd\x39\xf9\xdf\xa6\x61\xf1\x9b\xe7\x6d\xa7\xf6\x5f\x22\xfb\xbc\x80\x75\x2a\xeb\x39\xe8\xd5\x9e\xd9\x6e\x14\xf5\x95\xd0\x49\x29\x40\x2b\x50\x29\xc6\x0c\xee\x37\xc0\x21\x7b\xc5\x31\xd8\x0d\xb3\x41\xda\xce\x3c\xce\x76\xe6\x43\xaa\xc5\x38\x87\x47\x3e\xdc\x6e\x19\xcb\x39\xfe\xcf\x6a\xf4\x24\xa2\x06\x63\x93\xd1\xc3\x3f\xc7\xb9\x36\x76\xd7\xe6\x10\x5b\x9b\xfc\x96\x7d\x1e\x29\xaf\xdc\x4c\xf1\x5b\xca\xfa\x09\xc2\x95\xa6\xf9\xde\xee\x33\x1a\xb3\xb0\xd4\x93\x12\x6e\x2b\x2f\xff\xb4\x2a\x6b\x68\xe7\x9e\x13\x8d\xb5\x50\x82\x72\x62\xe4\x87\xa8\x3f\x37\xf0\x1d\xd7\x92\x2b\xe7\x5e\x92\xfc\xf5\xd9\xd4\x80\x3b\x3a\xc2\xf3\x5d\xa2\x10\xfb\x38\xb2\x63\xb0\xff\xb6\xc2\x70\x8d\x4b\x55\xb7\x57\xaf\x52\x07\x7a\x7e\x31\x84\xd0\x1e\x82\xf6\x4d\x32\xcc\xe4\xfd\xee\x0f\x8d\x4e\x36\x4b\xcf\xb9\x58\xeb\xbf\xdb\xb6\x22\xb3\x8b\x51\xe9\x30\x27\x1c\x7b\x1b\x70\xaa\x9d\x4b\xb3\xaa\x4b\x99\x7c\x52\x14\x4d\x3a\xa6\x21\x62\x57\x3a\x3a\x1d\x9c\xe4\x6c\xdb\xee\xb8\x44\x9f\x12\x25\xc4\x49\x63\x1e\x88\x97\x52\x1c\xd0\xf6\x37\xb7\x21\xa1\x25\x2b\x8a\x10\xab\x0b\xe8\x70\xaf\xbc\xd8\x9d\x58\xb2\xeb\xb6\x32\x11\x95\x0c\xad\x7a\xb8\x2c\x81\x95\x02\x6b\x50\xea\x8b\x77\xb9\xe9\x0e\xd5\x59\xaf\x44\x84\x30\x88\x51\xa3\xa1\x56\x71\x68\x53\xa8\xac\x4e\xcb\x8c\x5c\xc7\xd9\x35\xb0\xf4\x66\x12\x41\x43\xb1\x17\x7f\x05\xd0\x8b\x97\xd1\xad\x54\x2e\xd2\xc2\x46\x5a\xf1\x85\xe7\xdb\x42\xb6\x9c\xb8\x02\xa7\x17\x94\xa3\x13\x98\x83\x02\x96\x70\xc9\x56\x74\x2a\xaa\xd7\x90\x7a\x71\xd9\x59\x85\xfc\x1d\x45\xb6\x59\x97\xb4\xec\x6c\xe8\x25\x5d\xe9\x59\x27\x0a\xfa\x7d\xe9\x0f\x29\x29\xde\x63\xf9\xb1\x72\x11\xd7\xf1\xae\x82\x0a\xda\x9c\xe3\xe4\x86\x49\x17\x9d\x60\xb0\x14\x94\x93\x48\x1f\x01\xd4\x59\xdb\x7d\xad\x05\x26\xb5\xbd\x9f\x4b\x33\x80\xd2\x5b\xa2\xc5\x02\xba\x8f\xa3\xc4\xd4\x13\x1b\x46\x62\xad\xde\xfb\x41\x82\x7f\x75\x9f\xa7\x1d\x44\x7d\x5f\x02\x92\x45\xf4\x8c\x62\x2e\xb7\xc6\x8c\x8e\x71\x08\x1f\x7f\x78\x9d\xe7\xa2\x83\xd2\xed\xa8\x3a\x7d\x17\x22\xa0\x5f\xb7\x2e\x17\x60\xc2\x40\x40\xc4\xd8\x34\xde\xf5\xdf\x5f\x74\x2e\x02\xb3\x04\x51\xc8\x93\xbc\xf7\xd7\x71\xdb\x78\x4c\xbb\xda\xec\x87\x6d\x8a\xc8\x67\x43\xb5\x29\xa2\x92\x00\x7a\xc7\x53\xc9\x9a\x57\x99\xcc\x32\x4f\xe5\xeb\xb5\x44\x8a\xb5\x54\xb1\x0d\x41\x36\x97\x4a\x12\x54\x2d\x25\xc6\x14\x7c\x67\xc5\xd2\x33\x6c\x9d\xb7\x5c\xba\x2f\xd6\x08\xcd\x43\xab\x95\xbe\xac\xd0\x43\xa1\x34\x9c\xef\xa8\x28\xe2\x3b\x5f\x0b\x6e\x0e\x29\x51\xf3\x35\x3b\xb9\x2b\xfd\x1f\x0a\x49\xc3\x3f\xb3\xcf\x37\x99\xa0\xb5\x43\x19\x8a\xd5\xd0\x3d\x26\x3c\x1a\x06\xc3\x5a\x26\xad\xe1\x51\x84\x91\xc8\xc1\xd2\x7a\x2d\xb0\x33\x80\x89\x32\xcd\x1c\x47\xb5\xa1\x26\x98\x5a\xcb\x8d\x88\x83\x60\xee\xcc\xfe\xb3\xbf\x51\xb0\xd1\x89\xb4\x19\x04\x40\x40\x4d\x12\xfb\xa6\x5d\x0a\x7a\x14\xc6\x20\xc5\x55\xf8\x22"}, +{{0x51,0x4e,0x07,0x0b,0x01,0x90,0xd1,0x8c,0xbe,0x98,0x1a,0x5a,0x15,0x1e,0x77,0x53,0x39,0x8a,0x27,0x2b,0xcf,0x01,0x48,0x13,0xad,0x37,0x97,0x22,0xc3,0x6e,0x13,0x3d,},{0x6f,0xbd,0xe0,0x47,0x4c,0xc4,0x81,0x0e,0xff,0xa5,0x0a,0x07,0x82,0x0c,0x96,0x5a,0xa0,0x03,0x95,0xff,0x3a,0x5b,0x3e,0x2e,0xdd,0x7d,0x35,0x6b,0x7d,0x6a,0xef,0x2b,},{0xb6,0xc3,0x55,0xc9,0x58,0xb5,0xba,0xa7,0xeb,0xe9,0x77,0xa9,0x3f,0xcf,0x53,0x95,0x89,0xa3,0x66,0xd4,0x01,0x60,0xe4,0xe0,0x31,0xb8,0x8a,0xb9,0x64,0x02,0xc7,0xbd,0x57,0x7f,0xf6,0x35,0xfc,0x07,0x78,0x24,0x23,0x59,0x8d,0xca,0x43,0x66,0x81,0x24,0xa8,0xb2,0x87,0x51,0x0e,0x2c,0xfd,0x07,0xa1,0xe8,0xf6,0x19,0xf6,0xc8,0x54,0x0a,},"\x83\x14\x55\x76\x2a\x5d\x80\x09\x7b\xb2\x84\x50\x42\xf4\xc8\x76\xe7\x10\x85\x35\xbe\xd6\x83\xe8\xc4\x46\x19\xd0\x81\x54\xa2\x29\x44\x4b\x10\x1e\x3e\xd7\xc0\x15\x07\xe8\x70\x94\x14\x46\xaf\x97\x8c\x0f\x53\x41\xd1\xac\x1d\xd1\x5b\x14\xe8\x96\x67\x12\xdf\x19\xf5\x2f\xeb\x51\x03\xcf\x62\xb6\x63\x27\x56\x44\x6c\xc7\x54\xdf\x00\xa3\xf6\xdd\x71\x99\x68\xa2\xce\xf6\x6c\x3a\xdf\xb7\xd1\xfc\x49\x1f\xbb\xf3\xd5\x92\x94\xab\x34\x61\x9e\x17\x6d\xb0\xd4\x46\x15\x1e\x37\xea\xa3\xda\xf1\x72\x40\x6e\x98\x3d\x9d\x23\xa6\xb6\x9e\x92\x97\x60\x30\xf5\xac\x70\x40\xad\x51\x14\x12\x9f\xea\xf9\x7a\xf1\x5b\x22\x96\xfa\xe7\x04\x92\xdb\xbe\xb2\xb4\x82\x76\x87\xfb\x79\x87\x15\xc9\xbb\x2c\x32\x55\x7a\x81\xd8\x91\xb8\x97\x05\x29\x00\x70\x71\x59\x75\x1f\x07\xdb\x07\x4c\x77\xf0\x71\x96\x71\xf1\x76\x66\x89\x02\x9a\x3c\xdd\xf3\x9d\xf3\x48\x3c\xf2\xb0\x4f\x71\xc2\x5d\xe0\x5f\xc2\xd0\x2b\xb4\x8e\x53\x9e\xaf\x1a\x32\x16\x46\xcd\x80\xef\x2f\x0a\xc7\x03\xf4\x5e\x73\x89\x53\x08\x00\xe5\xd4\x17\xcc\xea\x8a\x5c\x08\x66\x82\xf0\x47\x45\xd5\x0b\x5d\xfc\x8f\x6e\xdc\x87\xa9\x5c\x7d\x20\x2a\x9c\xfd\x99\x87\x14\xb7\x46\x92\x0e\xbb\xe2\x33\x5b\xca\x1a\x01\x71\x76\x20\x16\xf5\xe4\xbd\xa8\x9c\x57\xd0\xed\xc6\x91\x0c\x6d\x22\xc8\xf9\x09\xda\x3d\xb1\x35\x2f\x0c\x8b\xd1\x8f\x3b\x5a\xac\x25\xf1\x93\xb8\x94\x70\xf9\x76\xbc\x4f\x1a\xff\xb3\xc6\x6b\xc5\x87\x6c\x6f\xe2\xac\x75\x08\x53\x3d\x97\xbb\xcf\x77\x11\x9d\x9a\xae\x19\x3f\x07\xe0\xb6\x4b\x46\x1c\x9c\x6c\x3b\x9d\x29\x3b\xd3\x7d\xe3\xd8\xe1\xab\x1e\x8d\x87\x2c\xd9\x4e\x6c\xf0\xeb\x68\x43\x9f\xdc\xd3\xb2\x5c\xe8\x48\x34\x60\xbd\x8b\x7c\xce\x88\x9f\xb7\x22\xb4\x36\x1e\x11\x8d\xa9\x83\xef\x4a\x9e\x45\xce\xbc\x0c\x1b\x82\x29\xea\x53\xe6\xf5\x55\x05\xf6\x44\xe0\x9a\xca\xa4\xc4\xb8\xcc\x64\x0b\x2c\xd2\xb3\x12\xe1\xc3\xa2\xc0\x26\x69\xe1\xf9\xc0\x63\x11\xc7\x8d\x36\x00\x09\xdb\x9e\x67\xc3\x9b\x49\xd1\xe5\xd7\x70\xc0\x1d\x28\x4b\x0a\x17\xa4\x1b\x4e\x7c\xa7\x45\xd6\x65\xec\x07\x50\x0e\x4d\x9f\xc8\xeb\xc1\xcc\x6a\xf5\x3a\x3f\xc7\x6b\x0c\x3f\x14\x31\xd4\x98\x43\xf2\x0e\x18\x27\x82\xc8\x2b\x3b\x5a\xae\x36\xfe\x20\xca\x64\x26\x18\x06\x8b\xe2\x33\xd4\xb5\xef\x9e\xae\xff\x40\x15\x36\xdc\x59\x3a\x2b\xc1\x83\x44\xf5\x5a\xc5\xd5\xfc\x7b\x3e\xb5\x06\xd1\x1c\xb3\x75\x33\x00\x63\xc6\x20\xc5\x33\x4d\x72\x3c\x7d\x1f\x04\x28\x16\xbc\x47\x85\xb3\x5a\xc0\xe6\xf1\x74\xf7\x36\x87\x8b\x7b\x49\x16\x58\xca\x67\xd8\xfc\xab\x53\x8f\xc6\xec\xd2\x77\xea\xd9\x0d\x95\x4b\x46\x0d\xa4\x25\x3a\x1c\x3a\x30\xb3\xd8\x92\x8f\x69\xac\x98\x76\xa2\x89\x19\x69\xfc\x2d\x06\xa6\x68\x99\x2b\x8e\x21\x15\xdf\xe5\x35\x8a\x71\x24\xba\x7c\xcf\x42\x1d\x80\x54\xea\x04\x34\x44\xcd\xeb\x40\xb7\x16\xdc\x7a\x36\x59\xa3\xca\x94\x34\x72\x93\x48\x90\x60\xe2\xcf\x67\x12\xa2\xa6\xc7\xb8\xad\x14\x67\x85\xfc\x40\xcc\xb9\xda\x28\x78\x30\xd0\x11\xd0\xd2\x4d\xf3\xe7\xaf\xbe\x97\x2d\x6f\x41\x7d\xe5\xcd\x75\xf2\x59\xea\x07\xca\xfd\xde\x20\x5f\xc0\xa3\x65\x13\x5c\x23\x2c\xbd\x7c\x1b\xc5\x39\xfa\x4b\x7e\x1c\xce\x35\x18\x52\x37\xc2\x3f\x80\xae\x97\xc1\x86\xd0\xd3\xb1\x05\x03\xd5\x98\x4a\x20\xec\x41\xc3\xcd\x04\x2c\x28\xa4\xc3\x1f\x95\x74\xb0\x6a\x87\x2b\xf9\x59\xab\x0a\xdd\x1f\x5d\xee\x14\xa1\xe7\x41\xef\x23\x8d\xfc\xde\xc0\x85\xaa\x08\x8d\xcf\x39\xa3\x6d\xda\x8f\x2a\x85\xed\x0d\x36\x2c\xcb\x00\x5d\x02\xe5\xac\xcc\x09\x2a\x37\x6d\xc1\x1a\x56\x61\x70\xd5\x83\xdb\x35\xf1\xde\x0b\xe3\xf1\x59\x08\x59\x6e\x9b\x78\x1a\xc8\x1b\xe0\x7b\x9b\xd2\xaf\x46\xc5\x6f\xb4\xd9\xd8\x42\x76\x01\x1e\x46\x18\xb7\xf7\x6f\x96\x79\x4c\xd0\xfd\x57\xed\x41\x4b\x63"}, +{{0xbc,0x79,0x0a,0x73,0x85,0xdd,0x1d,0xdd,0xc7,0x62,0xe3,0xb2,0x02,0x21,0xdc,0x07,0x8b,0x6c,0x3d,0xa8,0x98,0x6d,0x41,0x80,0x94,0x07,0x27,0x25,0x7c,0xfd,0xcd,0xf1,},{0xc9,0x26,0x46,0x26,0xf6,0x8f,0xed,0xb5,0xb3,0x9c,0x28,0xf0,0x30,0x45,0x3b,0x54,0xd0,0xd5,0x1a,0x98,0xb1,0x77,0x21,0xf2,0x61,0x1d,0x7f,0x27,0x7e,0xf4,0x8b,0x81,},{0x6d,0x6b,0xd6,0x5f,0x37,0x26,0x79,0xfe,0x9d,0x94,0x5f,0xf5,0x65,0x16,0x33,0x3e,0xce,0x0b,0x7a,0x25,0xb1,0x5a,0xd2,0x48,0x73,0x81,0x67,0x0e,0x53,0x6f,0x52,0x46,0x77,0x5e,0xb3,0x9a,0x11,0x4d,0xb2,0xb9,0xcd,0x50,0xf3,0x12,0xb3,0x60,0xd9,0xd0,0xbe,0xa2,0x95,0xdc,0x37,0xb8,0x17,0xb3,0x32,0x89,0x0a,0xdb,0x65,0xe4,0xc4,0x01,},"\x14\x3d\xd7\xbf\xbf\xf2\xad\xc7\x1f\x5d\x12\x3d\x47\x4e\xa0\x69\xdf\x14\xae\x92\x3e\xd9\xbf\x8f\x98\x91\xe6\x0b\xae\x43\xf0\xc9\xf5\x55\x37\xac\x9d\x1a\xe5\x23\xce\x4e\xcf\xd3\x3b\x20\xae\x44\x5e\x9c\x42\x63\x72\x05\x0f\xa5\x21\x7c\x1e\x4f\xb0\x13\x53\xeb\xf2\xe3\x29\x04\xef\x7e\xef\xcf\x72\xe8\x02\x3b\xae\x06\xbb\xb6\x40\xcf\x77\x7d\x5b\x0e\x11\x52\x7b\xc8\x35\x49\x3a\xd6\x98\x0a\x15\x7b\xb2\xd5\x0b\xe2\x33\x65\xe7\x2c\xbf\x0b\x3f\x20\x9e\xf0\xc4\x4a\x00\xb4\x1a\x62\x26\x24\x88\x09\x6c\xae\x5a\x69\x6b\x4d\x64\xcb\xad\x34\x50\x0d\x41\xfb\x4e\x4b\xc7\x0f\x8b\xf6\x21\x44\xd0\x1c\x22\x75\xd6\xd2\x9f\x5d\xe7\x5b\x17\x21\xd5\x04\x6b\x68\x29\x16\x44\x43\xeb\xfd\x9c\x17\x81\x31\x9d\x88\xf5\x40\x10\xed\xc2\x96\xab\xbe\xd0\x2b\x7d\xad\x9b\xa5\x85\xb5\x52\xe0\x00\x5d\xcc\xa4\x00\xbf\x4f\x45\x9e\xed\x7d\xb8\x6e\xa8\x61\x2b\xe9\xe9\x18\xdf\xd4\xe2\x70\x0c\x47\x10\x08\x32\x83\x62\x6f\xac\x75\x44\x17\xe0\x08\x7d\x26\xba\x14\x5d\xfc\x45\xb1\xc9\xbf\x7b\x4d\xd7\x0e\x6c\x50\x87\x47\xef\x80\x5c\x9a\x02\x42\x5a\xeb\xc6\x42\x1e\x0d\xeb\x6a\x79\xd8\x9a\xce\xee\xe0\x1e\xce\xcc\x9f\x3c\xa3\x65\x38\x38\x26\x58\x4c\x43\x0e\xbd\x39\xec\xf0\xa7\x28\x66\xae\x0a\xce\xca\x5a\xd4\xf0\x40\x5b\x67\x77\x9c\x04\xc5\xde\x03\x30\x61\x4d\xa3\x47\x0b\x80\x5d\x78\x7c\xe7\x9a\xc5\xa6\x96\xdd\x6f\x6b\x55\x39\xb1\xa6\x51\xb4\x24\xce\xfb\x19\x49\x1d\xa6\xe0\x88\x92\x23\xcc\x98\x39\x8b\x42\xc0\x04\x14\xff\x8d\x6c\x06\x27\xeb\x97\xcf\xf2\x0a\x8c\xbe\x7f\xcc\xb4\x1d\x81\x0f\xcf\xe8\x58\xca\x74\x75\x24\x7e\xf6\x28\xe8\x4a\x09\xd0\x12\xfe\x12\x23\x5b\x38\xc1\xcc\x9d\x82\xe2\xb6\x9d\x01\xd6\x21\x8c\xfd\x48\xe8\x5f\x26\xae\xad\xd1\x95\x40\x8c\xdd\x4c\x2f\x80\x6a\x89\x04\x1f\xd0\x31\x7f\xb1\xa7\xb6\x20\x9f\x90\x42\x70\xd3\x4e\x60\x61\x95\x04\x72\x88\xb0\xfb\x11\xa5\x72\x29\x38\xf6\x7c\x22\xb3\x13\xf7\xf7\x4b\x20\x25\xc7\x5b\xcd\x1e\xcc\x5a\x9a\xdd\x4a\x64\x0a\x41\xf2\x99\x6e\xb6\x6e\x5a\xf1\x96\x19\x8d\xb5\x8a\x3f\xb9\x93\x8f\x34\x9f\x92\x2a\x24\xd8\x6f\x4e\xd8\xa9\x6a\x09\xa1\x96\xc2\x4d\x6d\x01\xed\x76\xf3\x81\x6c\x05\xc4\xf2\x6b\xac\xa9\xb9\xd6\xdc\xc7\x9b\x58\x0d\xfb\x75\xd6\xc9\x05\xd4\x80\xda\xd7\x69\x51\x85\x4b\xda\x1c\xaa\x7f\x4a\x81\x95\x43\xae\xd0\x1a\xe9\x56\xbf\x30\x58\xfe\x8b\x3c\x7d\x5d\x72\x49\x62\xf1\xa6\xa8\x31\x43\xdd\xad\x27\x4f\xda\x3a\xd5\x78\xe9\x8a\xa9\x67\xc4\x10\xee\x57\x57\x5e\xf0\x1c\x02\x58\x56\x0f\x0a\x1f\xa4\xb7\x93\x27\x79\x6d\xe9\x94\x20\xcf\xd0\xa4\x15\x50\x63\x60\xf1\x24\x2c\xcc\x58\xa6\x88\x09\x27\x75\x0d\xbb\xff\x13\xd7\xc1\xb4\xed\x51\x9c\xda\x35\x72\x10\xf1\x2f\xb0\xd1\xc4\xd4\x8f\x04\x11\xbd\x7e\x05\x8c\xc4\xcb\x93\xd3\xc7\x75\x97\xe2\x65\x3f\xfa\x28\x2d\x3c\x2f\x12\x8a\xc3\x3a\x23\x7a\xf2\xfc\xbc\x9e\xf9\xc8\x11\xf3\x78\x14\xba\x2b\x0b\x85\x09\x3d\x0f\xd1\x8b\x8c\x6f\xb0\x9a\x43\xce\x52\x25\x4d\x23\xd5\x5f\x32\xe1\xd3\x24\x2a\xed\x1f\x23\xd9\xcf\x20\x4a\xa0\xdf\xd4\x4a\x34\x6f\xe0\x9e\x55\xa4\xa0\x6c\xf1\xbe\xf8\xbb\xf3\x7b\xa1\xf1\x59\x8a\x58\xae\xf8\x95\x01\xec\xba\xc0\x45\x35\x43\xe4\x80\xed\x0a\xdd\xe9\x0c\x84\x1d\x95\xeb\xd6\xeb\x23\xba\xa9\xf7\x0f\x83\xc1\x49\xea\xb3\x2d\x09\x13\xc7\x9b\x09\x93\xd0\xe1\xd3\x57\x4f\x0f\x54\x2e\x56\xa2\x06\x16\xcf\xe4\xa8\xbd\x7a\xae\xeb\xe0\xb0\x83\xdc\x2c\xe0\x14\x61\x78\xc0\x74\x82\xa0\x11\x29\xbc\x6f\xef\xdc\x81\x41\xc1\x38\x48\x94\xb6\x9c\xbe\x2f\x29\xda\x18\x8f\x7f\xd4\xac\x34\x1a\x2d\xf6\xfd\x90\xde\xe6\xa4\x46\xd2\x74\x63\x24\xc7\x5c\x1e\xf5\xb1\xac\xe1\x87\xd3\xbc\x16\xd7\x05\x59\x89\x29\x75\xd7\xe4\x71\x38\xf0\x40\x63\x85\xea"}, +{{0xdb,0x3a,0x44,0xdf,0x40,0xd2,0x55,0xa2,0x5c,0xf2,0x3f,0x53,0xc4,0x52,0x23,0xb7,0xd8,0xf1,0xf1,0xf1,0x11,0xba,0x07,0x40,0x6b,0x71,0xe1,0x84,0xa8,0xcd,0x06,0x12,},{0x6b,0x12,0xbd,0x95,0x80,0xae,0x20,0x7a,0x9b,0x0b,0xaa,0x82,0x87,0xb8,0xbb,0x86,0x66,0x93,0x73,0xee,0x5e,0x5a,0x62,0x5a,0xb4,0xa6,0xef,0x2d,0x08,0x71,0x25,0x97,},{0xcc,0x28,0xb5,0xef,0x4b,0x97,0x73,0x63,0x7f,0xae,0x7e,0x5f,0x08,0x4b,0x69,0x94,0xaa,0x35,0x98,0xf8,0xf4,0xa6,0x5d,0x0b,0xb2,0x01,0xd1,0x72,0xd8,0x61,0xa3,0x01,0x49,0xb3,0x33,0x8d,0x3c,0x3a,0xb7,0x5b,0x32,0xb2,0x55,0x95,0xcd,0x8b,0x28,0x96,0x30,0xc3,0x37,0x6a,0xcd,0x10,0xba,0x2a,0xb2,0x6b,0xc1,0xab,0xa9,0x00,0x84,0x0e,},"\x52\xdd\x8b\xa4\xff\xfa\x34\x4d\x1e\x08\x11\xd9\x67\x5c\x31\x3f\x9c\xc0\xe5\xa1\x38\x47\x86\x91\x98\x9d\x2b\x7f\x73\x89\x02\x50\x68\xfa\x35\xf7\x4f\x9a\xea\xf1\xe9\x56\x65\xec\xf8\xd5\x70\x7f\x75\xf6\x5f\x22\x56\xee\xa9\x33\x98\xbe\x59\xc0\xd5\x38\xf5\xe8\x58\x4b\xfb\xb3\xa2\x40\xf5\x01\x6d\x79\x27\x23\x4c\xb3\xea\xc3\x5b\x39\x1b\x8b\x53\xf2\x0e\xd8\xba\xe0\xba\x11\x08\x96\x94\xbf\xea\xde\x11\x07\x16\x56\xd4\xcf\x18\xef\x2d\x36\x81\x92\xe0\x4e\x08\xe3\x02\x4f\xc1\xd2\xfd\xa6\x31\x2a\xfc\xa6\x8d\x10\xc9\xc3\x36\xa0\xe3\x68\x50\xbe\x1a\x4f\x35\xb0\x33\xa8\x5a\x2a\x95\x49\xf2\x67\x3a\x99\x5f\x2a\x9a\xb4\xbd\x46\xc8\xfd\x2d\x83\x8e\x64\xf7\x61\x71\x34\x27\x32\x9c\x9a\xf5\xe4\x21\x1a\x22\xab\x20\x8a\xaa\xb8\x0e\x19\x4c\xd0\xf6\xa5\x02\xb3\x08\xfe\xd6\xc5\x83\x51\x78\x01\xa4\x8e\xd4\x33\x0e\x2f\xad\xdc\xd4\x18\x09\xc3\x91\x9b\x30\xe8\x4d\xb3\xc6\x87\x31\x03\x1e\x79\x85\x7d\xd9\xf9\x7f\xfd\x12\x54\x7d\xa7\x06\x67\x98\x07\x41\x51\xec\x88\xa5\xfa\x96\x3b\x9d\x9d\x83\xba\x2f\xee\x13\x58\x33\x95\x0e\xf7\xbc\x62\xb3\x40\x1e\xa1\x1b\xb3\x6f\x25\x56\x1b\xc0\x52\x2b\xb0\x2d\x8d\xad\x05\x43\xf6\x3d\x54\x7b\xe7\x7d\x0a\x4c\x9b\xf6\x5d\x42\xf3\xa2\x76\x14\x4d\x2e\x47\x4e\x29\x42\xf3\x79\x02\x21\xe2\x6f\xba\xe7\xca\x91\xef\xd8\x59\x21\x99\x08\x35\xfa\xfb\x6d\xc6\x74\x63\x5c\x96\x01\x82\x10\x38\xb5\x27\x11\x34\x3d\x1a\xa2\x5f\x1c\x46\xba\x4e\x3c\x6e\x71\x2b\xac\x19\xe5\x3e\xae\x30\xe5\x24\x6e\x4f\x04\xdd\xf2\xac\xdb\xb3\x41\x63\xc2\x43\x67\x76\x90\xbe\x0b\xf2\xe3\xfa\x16\x48\x70\xb5\xe6\xf5\x36\xb2\x2f\xb8\x9e\x5e\x8e\x1d\x87\xcd\xb3\x40\x44\x97\x7e\xd2\x83\x6e\x54\x4d\x7b\xa4\x93\xdd\x42\xa2\xb6\x49\xbc\xf3\x13\xc5\xb3\x9a\x1d\xbf\xff\x3e\x7f\x2a\x59\xad\xe8\x7d\x3e\x7b\x25\x8f\x58\xe5\x65\xfd\xba\x3e\x4d\x92\xb1\xed\xb8\xbf\xf5\x4d\xc4\x9d\x86\xc5\x3c\x03\x0c\xf5\x8b\x97\xef\x06\x6d\x24\x1b\x54\x05\x30\x21\x39\x05\x73\x9d\x8e\x1a\xa7\x2e\xd9\x0f\x68\x5d\x39\x58\xea\xa2\x42\xb0\xcb\xf7\xa2\xeb\x97\x6e\xe9\x6a\x63\xe6\x67\x86\x46\x41\x69\xa7\x42\xd4\x57\xe4\xd9\x11\x7c\x7d\x66\x42\x84\x45\xa4\x69\x30\xc2\x8b\xa7\xa2\x65\x82\x41\x80\x5e\xbe\x72\xc7\x8e\x02\x03\x5d\x26\x3a\x21\x1e\x59\x0b\x49\x0c\xdb\x84\x41\x50\x62\xee\xd1\x4f\x13\xb8\xa1\xa9\xe7\x7c\x8d\x7b\x75\x51\x5b\x18\xfb\x85\x38\x6e\x4a\x7e\x05\x39\x80\xd3\x0f\x48\x99\xe8\x38\x63\xbe\xe8\x75\x58\x58\x87\xc5\xf4\x8b\x51\x6c\xcb\x73\x1c\x4b\xca\xa3\xdf\x07\xd0\x47\x95\x81\x40\x96\xc7\x9d\x7c\x5f\xdc\x4d\xab\xf5\xe2\x6a\x4c\xa1\x83\x8e\x0e\x5d\x87\xdb\x71\x30\x9b\x81\xea\x7c\xe4\x61\xe5\xe4\x4c\x7a\xb2\xf1\x05\xad\x75\xc5\x43\xc1\xe9\x17\x9c\x36\xa5\xfa\x55\x5e\xc9\x22\xff\xed\x1b\x76\xd2\x58\x01\xdd\x74\xf8\x0c\xd0\xa6\xba\x7b\xc2\x0d\xb0\xad\x58\x0b\x7b\xbb\x9d\xdc\xfd\x93\xad\x1c\x5f\x20\xf3\xe2\x7c\x3e\xa3\xa1\xe7\x1e\xb7\x4f\xf5\xf9\x44\xcd\x3b\x98\xf6\xd0\x45\x29\x59\x30\x11\xc4\xae\xce\xf6\xdc\xaa\x60\xfb\x18\x36\x8c\xb1\x2b\x6e\x39\x1b\x3f\x5d\xf7\x65\xcb\xab\xff\x15\x89\x8c\x84\x79\x6f\xc2\xb5\x3f\xa4\x90\x0d\xad\x03\x4a\x13\xb0\xce\x14\x45\xad\xda\x4e\xf7\x19\xbe\x74\x14\x19\xe2\x31\xe9\x2f\x1f\x66\x7a\x32\x84\x2a\x42\xdb\x79\xbd\x7a\x01\x4a\x80\x9c\x81\x59\x6e\x82\x62\x73\xd1\x6f\xe5\xd4\x04\x58\x24\x2a\xe1\x0e\x12\xe6\x0b\x34\x89\x53\x0c\x66\x22\xb5\xbb\x44\x45\x4f\x29\x61\x6e\x47\xe9\xa2\x97\xce\x1c\xa0\x74\x13\x7f\xd9\xae\x13\xe3\xee\x8e\xdb\xcf\x78\xaf\x26\x54\x59\xdb\x1a\xf3\x42\xdc\x0b\x2f\xc8\x09\xbd\xa0\x15\xb5\xa8\x2b\x2b\x7c\x54\xef\xe4\xe5\xfc\x25\x2e\xb1\x3d\x66\xe8\x08\x93\x6f\x19\x10\xf4\xc4\x8b\xe0\xef\x7a"}, +{{0x77,0x96,0x4d,0xad,0x52,0xb5,0x79,0xb8,0x96,0x67,0x53,0xda,0x31,0x86,0xd1,0xc5,0xe9,0xd3,0x3d,0x33,0xa4,0xdb,0x38,0xbc,0x0d,0x7a,0x1a,0x6c,0x11,0x2c,0x13,0xc2,},{0xfc,0x25,0x12,0x5e,0x78,0x29,0xf6,0x42,0x34,0x37,0x5e,0x52,0xae,0x9f,0x77,0xae,0x10,0x13,0xf9,0x9d,0xf5,0xf9,0x96,0x5a,0xd2,0xaa,0x16,0x58,0x95,0x96,0xd0,0x91,},{0x3d,0x1b,0x4b,0x4e,0x82,0x0d,0x25,0x0b,0xe2,0xa8,0xfa,0x97,0x1e,0x59,0x9e,0x1e,0x98,0x97,0x75,0x28,0xb2,0xf9,0x30,0x18,0x96,0x81,0xa9,0x3b,0x05,0xe1,0xa7,0x06,0xfc,0x80,0xef,0xfa,0x94,0xe9,0x29,0xbc,0x43,0x92,0x16,0x56,0x89,0x73,0x88,0x28,0x8a,0x9b,0x29,0x27,0x1f,0x37,0xa1,0x4b,0xe0,0x14,0xb8,0x73,0xc6,0x8f,0xc9,0x04,},"\xc3\x39\xe7\x18\xa7\x57\xf3\xf3\xbd\x1b\xab\xdd\x2e\x00\xaa\xa5\xcd\x7f\xc9\x00\x5e\xe3\x4b\x6f\xdc\x09\xd7\x1f\xbd\x9c\x92\x89\xab\x1d\xd1\x4d\xba\x2c\xad\x58\xcb\x80\x51\x16\x77\x7b\xd8\x0c\x85\x96\x64\x33\xad\x46\xf9\xca\x6e\x54\xf1\x3d\xd3\xca\x7e\x56\xe4\x7f\xea\x41\xe5\x48\x8a\x45\xad\x53\xbc\x5d\x65\x74\x27\xe1\xd7\x93\x8f\x55\x19\xf1\xb0\x9f\x5b\xdd\x98\xaa\xe5\xac\x96\x43\xef\x78\xeb\xa4\x93\x49\x25\x33\x9a\x15\x5d\xc6\x68\x28\x57\x10\x02\x09\x7a\x11\xa5\xce\xe7\xb5\x1a\x44\x1b\x75\x6b\x0c\xe6\x5b\x77\x9a\xfe\x19\xda\x6a\x18\xef\xc1\x45\xf6\x09\x0c\xe7\x70\xde\x9e\x0e\x91\xf5\x43\x27\x0a\x09\x85\xea\xb4\x75\x29\x3c\xcf\xdd\x31\x41\xc4\x14\x2e\x47\x22\x23\x3b\x26\x74\x99\x44\x76\x41\x23\x5d\x72\x8b\xd7\x5c\xd1\xad\xc0\xdb\x14\x2f\x73\x31\xad\xdd\xf8\xc5\xee\xa3\xd5\x76\x40\x5d\x86\x99\x15\xb5\x60\xf9\x64\xe3\xe0\x00\x3c\x91\xf5\xe9\x6b\xff\xbe\xee\xc7\x3e\x51\x02\x4e\xf5\x2c\x55\xc6\xdc\xb5\x4d\x58\x20\x3e\x62\xf4\xdd\xb6\xe1\x37\xeb\x08\xe1\xbf\x13\x26\x01\x8a\xfd\x1a\x86\xca\xb6\xc8\x41\xe0\x66\x1c\xe0\xa1\xa7\xae\x96\x7f\x24\xc1\xa7\x7f\xc7\xca\x50\x5f\x72\xe5\xf7\x93\x6e\x39\xc6\xf4\x83\x7e\x25\x95\x19\x5a\x69\xcd\x67\x65\x10\xa7\x16\x1a\x4d\xc5\xe3\x18\xf3\xd4\xf3\xac\x0a\xf0\x3f\x8c\x4a\xe5\xbc\xe3\x93\x24\xe9\x73\x8a\xea\x49\xf0\x02\xd3\x2d\x16\xde\x23\x17\xe9\x5a\x9f\x32\xee\x60\x4e\x13\xdb\x80\x38\xb2\x64\xcf\xc1\x7a\xed\x29\xc9\xde\xbf\x81\x91\xde\x9e\x0e\xfc\x95\x1a\xd6\xd5\x48\x67\x06\x8c\xf5\x0a\x26\x9c\x37\xa2\x41\xf8\x52\x06\x78\x8d\x23\x14\x31\x77\xf6\x59\xcc\xa6\x6c\xfc\xe0\x3b\xc0\x50\x22\x55\x33\x7f\x16\xb3\xda\xd6\xf7\x91\x32\xab\xf8\x0f\xf1\x2b\x6d\x22\x81\xe6\x37\xeb\x6c\x71\xf7\x6e\x26\x33\xa1\x14\x56\x52\x40\xee\xd0\x0f\xab\xea\x9e\xd8\xde\x28\xc8\x32\x21\xf8\xcb\x48\x5f\x51\x2d\x90\x08\xbf\xc7\x4a\x36\x6d\x4c\x2b\x4e\xd1\x72\xd3\x67\xe0\x24\x7c\xb6\x50\x98\xc1\x10\x28\x2e\x83\x1d\xf8\xe9\xbd\x4f\xbd\x5f\x4d\xd2\xb7\xf2\x42\x0c\x23\xb8\x5a\x63\x7a\xa2\x26\x2c\x3c\xb8\x84\x05\xf7\x07\x30\xc9\xab\x4c\x9d\x0f\x22\x7e\xe4\xfa\x4e\xf9\x1e\xfe\x9a\x59\xb3\xe6\xd8\x43\xdb\x87\x9f\x56\x50\x05\x9e\x99\xf0\xe4\xa0\x38\x68\x38\xe6\xf9\x87\x6f\x67\xd5\x0f\x89\x83\x2d\xda\x5f\x30\xa9\xcb\xfd\x71\x01\x34\xf9\xb5\xb5\x46\x27\x49\x6a\xa3\xa4\x32\x12\xb0\x7f\x03\xdb\x11\xd3\xd4\xf8\x75\xd4\x1d\x1f\x4a\xc4\x59\x69\xdd\xef\x69\xf8\x1a\x06\xd2\xb0\xc6\x46\xc9\xcd\x93\x1c\xf2\x50\x2f\xef\x0d\xd3\x2a\xbb\xf0\x95\x1e\xd3\x03\xf5\x28\x48\x25\x93\x43\x97\xfc\x22\xe7\x86\x98\xd3\x5a\xd8\x1d\x82\x25\x6b\xf9\xe1\x54\x00\xa1\x09\x16\x23\xa9\x82\x6f\x1e\x57\x79\x23\x67\x41\x7e\xf0\x25\x86\xd6\x4e\x65\x0d\xa9\xac\xe2\xf1\x8a\xa0\xa1\x26\xd8\x67\xca\xc4\xb5\xd4\xc9\x1b\xf5\x20\x9e\x53\x59\x55\x63\x86\xf8\x27\x08\x3e\xb5\x3e\x8b\x47\x09\xff\xfa\xbe\x92\xc6\x1d\x78\xff\xb5\xda\xf1\x02\x74\xe2\x42\xa7\x00\x91\xf3\xf9\xb9\xd5\x96\xc1\x25\x8c\x9a\x63\x38\x4f\x4b\x05\xb0\x28\x66\x12\x22\x18\x1c\x0f\xca\x96\x5f\x0a\x2c\xb5\x6e\x4b\x55\x6d\x6f\xbf\xf7\x1b\x64\xd9\xb3\x58\xda\x31\xaa\x37\xc7\x4f\xf5\x96\x2f\xb8\xd9\x6a\x38\x3d\x04\x97\x24\xc1\x9e\x24\x9c\x9e\xdb\xb2\xa3\x75\xb2\x3c\xe3\x10\x4d\xa0\xec\x58\xd2\x63\x5b\xa0\x3b\x55\x42\x3f\xa2\xdb\x7e\xb3\x49\xa4\xfc\x58\xa1\xef\x54\x0e\xe9\xa0\x2c\x2e\x70\x3c\x68\xd7\xf8\x47\x5f\x43\x4d\xdd\x32\x00\xdb\x1f\x06\x74\x57\x91\xa3\xac\xc3\x16\x0d\xba\x50\xa3\x93\x44\x7f\xfe\xef\x6d\xc7\xb9\x8f\xb0\x66\x84\xcc\x90\xfd\x85\x20\x3d\x11\x9d\xcd\x81\x99\xe4\xd9\xa8\x9a\xe3\x46\x7a\xe4\xbb\x19\xfb\x71\xcf\x74\x70\x29\xc2\x40\x96\xf9\xa5\x0e"}, +{{0x5c,0xaf,0xd8,0x17,0xa4,0x41,0x0c,0xcb,0x27,0x12,0x17,0x23,0xef,0x32,0x07,0xc1,0x73,0x1a,0x08,0x61,0x94,0x5b,0xe9,0x62,0x71,0x4c,0x0e,0xd9,0x50,0x38,0xa1,0x95,},{0x4e,0xa0,0x86,0xbe,0x43,0xec,0xe1,0xc3,0x2d,0x08,0x05,0x9b,0xba,0xdc,0x9e,0x9a,0x2b,0x2f,0x4f,0x3f,0xe3,0x70,0xf1,0xf5,0xcc,0xd7,0xdb,0xde,0xc0,0xaa,0xf3,0x03,},{0x28,0x85,0x15,0xfa,0x72,0x59,0xf1,0xeb,0x58,0x7f,0xe8,0xa2,0xc4,0x03,0x43,0x4c,0x46,0xf8,0xd7,0xe7,0x5b,0x6d,0x22,0xbb,0x38,0x96,0x56,0x6c,0x01,0x7d,0x09,0xb6,0x98,0xc2,0xc8,0x07,0x79,0x9c,0x2f,0x65,0xf9,0xcd,0xb4,0xeb,0x58,0x15,0x1c,0xcf,0xc4,0x8d,0x10,0x80,0x61,0xa6,0xb3,0x14,0x84,0x32,0xb2,0xbf,0xc1,0xcd,0xab,0x05,},"\x50\xb2\xf0\x53\x42\x41\x80\x46\xd1\x6a\x30\xbe\x4f\xc6\x2b\x67\xda\xf6\xc1\x8d\x2a\x74\x24\x2b\x7c\xb5\x5b\xa9\x0a\xd2\x0b\x6c\xaf\xdd\x60\x15\x57\x37\xc2\x9d\xe4\x8a\xa5\xd7\x99\xfe\x54\x95\xfe\x59\xdf\x5a\x9b\x8c\x0a\x8e\x54\x18\x90\x47\x63\xfb\xad\x83\xea\x69\x86\x65\x1b\xac\x31\x11\x79\x39\xce\xf4\xe0\xc7\x99\x30\xd5\x2d\xfd\x7d\xb4\x3c\x31\xad\xda\xe3\xcf\x93\xe3\xef\xc5\xa9\x16\xef\xd0\xd6\x5f\xdc\x30\x90\x9f\xa3\x56\xcc\xbc\x52\x47\xd7\xaa\xa0\x67\x13\x1b\x6b\x48\x20\xfd\x02\xf8\xe3\x95\xf5\xa9\x70\x4c\x9b\xdd\x75\x60\xa6\x11\xd6\x25\x59\xa8\xdf\xe1\xd2\x85\x9c\x52\x48\x6c\xc1\x1e\xd3\x33\x19\x92\x48\x8f\x41\x75\x20\xd9\x20\xdc\x73\xa3\x2d\x4f\x08\x11\x00\x82\x50\x0f\x5a\x96\x2a\x30\x69\x32\xc6\xa7\x80\x29\x55\xce\xda\xd7\xab\xf5\x3b\x0f\x19\xfe\x47\x94\xa3\x1d\x6b\x85\x53\x80\x28\x43\x06\xcc\xff\x71\xa4\x00\x78\x59\xa2\x32\x8b\xb1\x90\x24\xc4\x3e\x10\xd7\x70\x64\xd8\x66\xd9\x62\x2d\x14\x2c\x27\x35\x4b\x84\xac\x3b\x4f\x82\x32\xf7\xa2\xf8\xaf\x64\x09\xd5\xcc\x75\x7a\x18\xef\x81\x3d\xfa\xf4\xb9\xbc\x04\x0c\xb0\x06\xd7\x7f\x14\x36\x41\xaa\x20\x36\xac\x7b\xc9\x28\xdc\x96\x58\x5d\x9e\x36\xc7\xbc\x9c\x56\x4d\x25\xf1\xc2\xcc\x0b\xea\xb9\xd5\xf2\x07\xe8\x4b\x21\x5f\x1e\x7a\xa6\xfc\x32\x82\x37\xb7\x9c\x39\x92\x3a\x4e\x09\xc7\xc7\x3d\xc6\xb2\x4b\x14\x16\x29\x4d\x79\x8a\x4e\xd5\xf7\x58\x33\x6d\x91\x5a\x87\x0a\x7d\x6b\x75\x92\xb5\xb8\x8a\xac\xe2\xdc\x5f\x26\x7b\xdb\x49\x11\x41\xcb\xba\xe2\xa6\x77\x40\x7c\xc0\x95\x5f\x96\x19\x62\x59\x93\x04\xba\x0b\x83\x96\x71\xa5\xc0\x00\xe9\x20\x10\x8a\x05\x29\x80\x87\xe4\x97\x70\xae\xee\xaa\xb3\x63\x27\x24\xcb\x0f\xc2\x28\x57\x96\xdc\x41\x48\x14\xfd\xa7\x8a\x54\xe6\x7f\x00\xa0\x2f\x77\xd3\xcc\xde\x1e\xd9\xd7\xb1\xde\xf1\x4e\xa1\xf6\x19\x10\xbd\xf3\x0a\x11\x96\xfc\x63\x51\xb6\x22\x54\xd6\x44\x5e\x6c\x90\x44\x5b\x16\xef\xaf\xe2\x89\xa2\x78\x4b\x92\xe4\x2b\x78\xa4\xa9\x00\xc3\x5f\x55\x63\x0b\xbb\x77\x62\xff\x9e\xb7\xfe\xf7\xd0\x4c\x90\xb9\x57\x1c\x4f\xc7\x60\xa4\x10\xdb\xfc\x25\x29\x91\xd0\xba\x27\xf2\xd4\x14\xfe\x64\xee\xfd\xff\x4a\xbc\x18\x81\x7c\x97\x06\xc6\x31\xbf\xa2\x03\x82\x1d\x3b\x92\xcb\x33\x8b\xaa\xf5\xd1\x23\x2b\x46\x26\x47\x95\x4d\x09\x02\x46\x2f\xb1\x69\x6e\x99\x1f\x07\xfa\x9c\x3d\xbc\xf2\x87\x29\x60\x83\x1b\x4d\xed\x92\xa4\x21\xcf\x21\xb7\x53\x16\x5f\xf3\x09\xef\xe2\xef\x54\x38\xc0\x12\x70\xd1\x0c\x6a\x03\xd3\x4f\x71\xeb\xc2\xda\xb1\xda\x90\xda\xa3\x57\x98\x4d\x24\x62\xbc\xb3\x5e\xe3\xde\x55\xc3\xa5\x5f\x8b\x98\xae\xc2\x11\x4f\x74\xc8\x43\x41\xa6\x41\x27\x86\x3c\x12\x0b\x5e\xca\xd9\xe3\x29\xa5\x75\x6a\xe4\xa2\x55\x5d\x84\x92\xcd\xa8\x35\x22\x5a\x8d\xeb\x3f\x9c\x15\x58\xf0\xd4\x25\xbc\x17\x2f\xf7\x64\x0c\xc7\x9d\x97\x80\x04\x16\xfd\x62\x94\xcc\xcc\x70\xcd\x1c\xf5\xb6\xa8\xe2\xaa\x07\x28\x9b\xd5\x22\xbf\x99\xdc\x96\xc3\x6b\xfe\xe8\x0e\x84\x6f\x5d\xd7\x46\xdd\x4c\x50\x03\xe4\xbf\x7d\x29\xef\xee\xa7\x50\x8a\x01\x61\x23\x68\x82\xc9\xa8\x2a\x56\xaa\x2c\x25\x74\x66\x96\x52\xc6\x30\x92\x3a\xb4\x70\xdd\xb9\x5d\x45\x6f\x7b\x8e\x8f\x07\x59\x9b\xa0\xd1\xd3\x8b\xc7\xf8\x17\x6e\x3f\xdf\x02\x09\xbd\x6f\x75\xd4\xcc\x11\x80\x3a\xfb\x18\x56\xcb\xc0\xe9\x1c\x73\x73\x0e\x4f\xb9\x8f\x3c\x94\x8a\x87\xd5\xa7\xed\xcc\x0a\x6a\x8a\xc8\x10\xea\x3e\xaa\x6e\x06\x3c\xec\x5f\x55\x66\xcd\x6d\xed\xc5\x37\xdb\x6d\x68\x6b\x80\x21\xf6\xea\x82\x5a\xd7\x47\x5e\xc7\xf1\xc5\xdb\xde\x45\xd3\xff\x4b\x5e\xe5\x1c\x0d\x04\xf1\xd7\x40\x18\xeb\x91\xe5\x04\x0d\x01\xc8\xb7\x1a\x4a\xab\xbd\xe6\x09\x4d\x4a\xfe\xcc\xb1\x8d\xfc\xde\xd7\x3e\xa7\x5e\x3b\x9f\x8c\xe1\x67\xdf\x62\x09\xae"}, +{{0xd5,0xca,0xc8,0x55,0x21,0xaf,0x78,0x1f,0x3d,0x5f,0x66,0x86,0x2a,0x04,0xb0,0x87,0xd0,0xcc,0xdc,0xac,0x92,0x6c,0xfe,0x9e,0x74,0x7b,0xe8,0xd5,0xc2,0x63,0x3f,0x78,},{0x10,0x0d,0xcc,0x53,0x03,0x9b,0xf0,0x5e,0xa0,0xa9,0xf5,0x88,0x82,0x12,0x69,0x3d,0x4f,0x9e,0x0e,0x75,0x25,0x95,0xbb,0xcd,0x02,0x06,0x10,0xe0,0xae,0x21,0x35,0x96,},{0x5d,0xc0,0x33,0x63,0x41,0x4e,0xea,0xc0,0x08,0x6f,0xb6,0xfe,0xba,0x44,0x21,0x7c,0xef,0x4c,0x52,0x0d,0xb6,0x19,0x26,0xdf,0x68,0x0c,0xa6,0x02,0xdc,0x11,0x00,0x3c,0xe6,0xaf,0xbf,0x3d,0x13,0xc8,0xc5,0xb0,0x52,0x73,0xd2,0x14,0x15,0xe6,0x7c,0x14,0xa2,0xee,0x5d,0x0b,0x1d,0x53,0x52,0x41,0x9a,0xb9,0xb3,0x9c,0x00,0x3a,0x51,0x0c,},"\xd5\xe7\xdd\x59\x49\x09\x37\x5a\x4b\xe0\x8e\x74\x82\x5d\x59\x8d\x53\x5b\xf4\x6e\xc0\x84\xde\x52\xb5\x73\x91\xc1\x27\xef\xf5\x22\x4a\xb2\xd1\x94\xdf\xb2\x66\x33\x47\x8d\x02\xfb\xda\x74\xd1\xdc\x58\x21\xf7\x91\xbf\x96\x2d\x8d\xad\x9e\x4e\xf2\x42\x24\x89\x19\x07\xb0\x18\x9c\xcc\xc8\xb1\x33\xd3\xaa\x20\x78\x92\x6d\xae\xf2\x89\x8c\x19\xc2\xe0\xbf\xe0\x20\x41\xa9\x04\xb9\xf0\x4b\xe7\xcb\x50\xae\xd0\xd9\x62\xd1\xad\xd2\x0b\x40\xa8\x8a\xb7\xab\xad\x62\x6c\xf4\xda\x0a\x78\xf9\xf5\x36\x85\x50\x1f\xdf\xa5\x85\x43\xdd\xf2\xea\x0e\xea\x69\xe7\xba\x16\x0f\x8a\x17\x7a\x25\xfc\x21\xe8\xa2\x9c\x66\x16\x33\xe3\x0e\x52\x3b\x0e\xc0\x1b\x2a\xee\xe2\xd4\x26\xe4\xae\xad\x45\x74\x88\x10\x8f\xe5\xf5\x69\xcf\x6e\x2f\xdb\x68\xc2\x8f\x2b\x30\x52\x82\x35\x77\xcd\x93\x4e\x7b\x06\x2c\x8a\x34\x24\xcd\x43\x67\xfb\x31\x5b\x74\x4c\xa3\x52\x55\xd7\xf1\xaf\x4e\xdc\x9b\xc9\xd8\x83\x71\x23\xd9\x79\x03\xb4\x3d\xf3\x67\xc7\xd4\x18\xc7\x93\x47\xff\xaf\xe7\xc7\xb1\x72\x4b\xba\x34\xed\xe8\xd3\x56\x8d\xb5\x05\x98\x3e\xad\x47\xf6\x2b\x56\xe3\x61\x8c\x11\xdb\x8f\xf0\xbf\x49\x2a\xc6\x75\x97\xd2\xf9\x6a\x6f\x42\x0f\xf9\x85\x34\x1b\x78\x6a\xd6\xce\xae\xdd\x10\x5d\x0d\x15\x63\xb2\xd5\x35\x43\xd7\x8e\x72\x56\x72\x5d\x20\x4e\x82\xed\x3a\x2e\x6a\x6e\x83\xdf\x61\xfc\x28\x2a\x62\xca\x06\xe6\x21\x74\xb5\x5b\xef\x40\xa0\xbd\xf8\xd2\x3d\x1c\x33\x0c\x71\x44\x14\x85\xee\x85\xe7\x0c\xed\x12\x1e\xac\x60\x7f\x58\x06\x78\x16\x3e\x4b\xd7\x5c\x67\x09\xff\x3b\x41\xde\x80\x59\x4b\x9e\x2f\x2a\xa2\x78\xfe\xfc\x21\xd7\x3e\xe3\xf7\x28\x54\xb9\x58\xd9\xa8\xf6\x3e\x3d\x70\xf7\xfe\xad\x8c\x3d\xca\x8e\x71\xbf\x4b\x9c\x2a\x36\xf2\x12\xb3\x2e\xb3\x29\x2e\x63\x55\x80\x38\x65\x59\xee\x1a\x11\xdf\x15\x29\x3a\x0c\x21\xcd\x73\x60\x86\x98\x46\xba\x5b\x7b\xa8\x5c\x99\x4f\x5b\x2f\x9c\xc5\x0e\x5e\xea\x8e\x4b\x36\x91\xd8\x86\x06\x2a\x18\xcf\xb1\x82\xf1\xe8\xb6\x11\xfe\x1b\xc2\x63\x15\x9c\xb8\xa0\x86\x78\x7c\x81\x1b\xea\x48\x12\x53\x00\x08\xc7\x0c\xa0\xc4\x7e\x64\xeb\x2f\xba\xd5\xb0\x27\x27\xa6\x6f\x2c\xdd\x6d\xde\x86\xf5\xd2\xa9\x64\x5a\x1e\x9a\xa6\x6e\xe0\xe1\x5b\x97\xf5\xfd\x22\x95\x96\xee\x02\xe6\x61\xca\xb9\xa5\x4e\xee\x1b\x81\xf9\x8f\xe2\x56\xed\x6c\x54\xfe\xaa\xa0\xba\x04\x7e\xea\x35\x33\x44\xf6\xe5\xc6\x2b\xe1\xe9\xd5\xc0\x9a\x2a\x69\x94\x11\x11\x0c\x56\xd1\x94\x9e\x90\xc0\x7b\x19\x38\xba\x95\x55\xac\x1b\xe8\x51\x1b\x51\x02\x18\xd7\xcd\xe7\xe1\xd7\x4a\x68\xaf\xb6\x42\xf8\x17\x15\xfe\x9e\x6c\x96\xc5\x03\x81\xae\x5a\x9d\xf3\x06\x51\x87\x85\xdc\x4d\xbc\x3a\x64\xf6\x0f\x24\x5c\x56\x4b\x80\x29\x51\x2f\x38\x1b\x56\xee\x78\x77\x03\x42\x68\x03\xc8\x0a\xb1\xc3\x11\xf4\x77\xb8\x91\x70\x8b\x59\xfa\x74\x8f\x32\xde\xbf\x54\xd2\x41\x37\x71\x97\x8c\x26\x5c\x9b\x87\x11\x4a\xdf\x25\xb8\x33\x7a\xa9\x3b\x0e\x63\x2a\x5b\x6e\xda\x47\x4b\xec\x16\x32\x81\x59\xfb\xed\x06\x7b\x00\xb8\x7a\xdd\x61\x96\x54\x92\xec\xcc\x6f\xd3\x46\x1c\x10\x00\xe4\x03\x7a\xb1\xe8\xac\x89\xa8\x52\x4f\x78\xae\x09\xd3\x08\xea\x6c\x94\xff\x88\x37\x32\xb7\x12\xee\xc0\xef\x07\x71\x8d\x33\xc0\x11\xb9\x39\x8f\x8c\xfe\xa7\x33\x07\x5a\xf3\x31\xfb\x3f\x97\xcd\xc1\xe8\xc9\x9f\x6a\x10\x72\x5a\x68\xc5\xc5\x8f\xdd\x8b\x0b\xaa\x50\x22\x7f\x34\xd7\x3d\x23\x90\x52\x03\x69\x8e\xaf\xf6\x26\x65\x4c\xe8\x3d\x86\x51\x08\x49\x9b\xe6\x86\x1f\x61\x41\xbf\xa6\x21\x9d\x7a\xb8\xb5\x84\x51\x91\x99\xf8\x80\xcf\xa1\xb2\x6d\x91\x94\xd3\x01\x71\x1c\x30\xfb\x44\x6d\x6e\xa7\x64\xa4\x31\x0f\x70\xe4\xb8\x59\xcf\x95\xfd\x44\xaa\xf8\xc1\xe2\x40\xe8\x0a\x71\x61\x1d\xbc\xf5\x2d\xa5\x8e\xdc\x32\x03\x11\xde\x38\x8d\x5d\x9d\x76\x9e\xb5\x9b\xe0\x93"}, +{{0x15,0x9a,0x9e,0xdd,0xea,0x5d,0xe6,0x34,0x03,0x98,0x7b,0x56,0x70,0xdb,0x6f,0xac,0x98,0xff,0xe5,0xec,0x3a,0x6c,0xf0,0x15,0x16,0xee,0x2c,0x70,0xce,0x3b,0x3b,0xe0,},{0xf6,0x1f,0x4a,0x04,0xa5,0xa1,0x2c,0xca,0xec,0xfa,0xf4,0x4c,0x1c,0x9c,0x18,0x88,0x47,0x5a,0x2c,0x89,0xfb,0x02,0xf2,0x6b,0xb8,0x1a,0xb5,0xf7,0x8f,0x4c,0xe3,0xa8,},{0x05,0x43,0x71,0x2c,0xef,0xa2,0x9a,0x22,0x0d,0x90,0xf8,0x1b,0xaa,0x4e,0x4c,0xf7,0x7a,0xc6,0x52,0x08,0xb2,0xd5,0xce,0x9f,0xd1,0x7c,0xe2,0x14,0xad,0x4a,0x93,0x7b,0x7f,0xc5,0xc7,0x86,0x41,0x3b,0x58,0x05,0x1c,0xca,0x3b,0xb8,0xb2,0xeb,0x55,0x65,0x7d,0x89,0x57,0x2b,0xc5,0x0e,0xa2,0xe5,0xec,0xdc,0x55,0x50,0x88,0x49,0x16,0x03,},"\xd1\x95\xe5\x90\x0d\xd3\x93\x14\x81\xbc\x01\x2e\x77\xbf\x06\x0a\xaf\x31\xcc\xcb\x0f\xe1\xa6\xc4\x0e\xaf\x28\x6a\x61\x66\xa1\x66\xb1\xea\x37\x05\x34\x26\x28\x4b\x92\x0c\x67\xfe\xe1\xd4\xb9\xd8\x6f\xb8\x61\xcc\x6e\xdd\x34\xe1\x0c\x52\x23\x37\x34\xd9\xcd\x92\xf5\xdb\xf4\x33\x51\x2e\xd2\x55\xac\x6b\x26\xe5\x6f\x5c\x66\x4b\xcc\xb2\x60\x69\x2c\xf4\x9d\x08\x36\x3e\xe9\x4e\x33\x6a\xcc\x48\x96\x00\xa6\xaa\x51\x2a\x04\x0f\x10\xeb\xf1\x8f\x7d\x2c\xbe\xe9\xca\xd1\x4c\x4f\xf8\x73\x77\xa3\x26\x34\x19\xd8\x29\x75\x29\x40\x1f\x15\x33\x7a\x4c\x4d\x23\x25\xed\x7d\xef\x76\x3a\x0d\x47\x9c\xaa\x40\x82\x66\x83\x4d\xa2\x42\xf3\xa1\x6b\x79\xa4\x58\x66\xb9\xd9\xd7\x1a\x48\x29\x31\x76\x74\xcf\xf7\xae\x6c\x8c\x58\x7b\xa4\xd4\x98\x0e\x81\x86\x13\xd3\xad\x82\x50\x7a\x7a\xb0\x32\xbb\xf9\x9c\x5e\x9b\x64\x03\x71\xbb\x41\xb9\x1e\x96\x5d\xc3\x1e\x8c\x7d\x4b\x3b\xaf\xd4\x95\x70\x52\x7f\xaa\xa8\x7a\xbb\xf6\x41\x6c\x47\xb1\xb1\xb0\x9d\x34\x01\x25\x31\x26\xcb\x24\x6a\xe4\x5a\xcf\x5f\x10\x0b\xb1\xf9\x2f\x11\xa5\xc6\xc9\x37\xe0\x58\x8d\x8b\x14\x6b\x3e\x4d\x3c\x7e\x5b\xf5\x74\x84\xe9\x84\xfe\x3a\xfc\x47\x72\xf2\x4e\xbf\x89\x4c\xdb\x39\x83\x7f\xbd\x46\x9a\x92\x1a\x96\xac\x5a\xf5\xe0\x70\xf6\xc9\x62\x4c\x58\x8e\x9d\x4f\xe6\xdd\xfe\xed\x1f\x8f\xe2\x0e\xb9\xc4\x60\xce\x6e\xe3\x8b\xf4\x71\xdd\x56\xdc\xf2\xe3\xee\x99\x8b\x8e\x7f\xdc\xf6\x12\xe7\x8a\x2e\x7c\x71\x73\xc0\x16\x09\x82\xbe\xde\xcc\x2c\x62\x1e\x5f\x66\x11\xb4\xef\x21\x02\xe3\x2e\x7c\x29\x80\x3a\x7e\x25\xfe\xe1\x51\x24\x31\x58\xa7\x6e\xe5\xd8\xc1\xbb\x2e\x7d\x8c\x88\x87\x1b\xa4\x33\xc5\xe5\x41\xc2\x60\x26\x93\xd9\x01\x10\xbe\x79\x5b\x52\x3a\x8f\xad\xb6\x05\xd8\xe3\xd7\xe4\x93\xfe\x24\x5d\x9c\xc5\x32\x0d\x32\xb8\x5d\x61\x35\xa4\x4b\x11\x68\x72\x94\x14\xc2\xca\x21\x56\x0f\xb4\xfe\xec\xde\xef\x0c\xf7\xd8\xe0\x71\x27\x4e\x88\x56\xc0\x04\x03\x3e\x80\x01\x3c\x73\xaf\x71\x77\xc3\x19\x78\x16\xa5\x03\x2d\x90\x59\xb1\xb6\xe4\x15\x2c\x38\x61\x92\xdd\x54\xb9\x0f\x9d\x30\x8b\xe9\x8e\xd7\xd0\xca\x9d\x12\xe8\xaa\xf6\xf9\xd8\x69\x38\x6a\xa9\xdb\xb0\x15\x93\xd3\x7e\x72\xf0\x90\x12\x4d\x34\x55\x29\x8e\x9b\x4c\x9e\xc3\xca\xe7\x3b\xb8\xee\x41\xeb\x63\xe3\x8c\x56\x13\x3e\xfd\xba\xf4\x49\xb8\x4e\x1e\x49\x1e\x49\x6f\x1c\x70\xa4\x4d\x06\x99\x86\xba\x88\x18\x42\x20\x69\x06\x1b\xb6\xeb\xcb\x7b\x20\x54\xe6\x3d\xf3\x81\xba\x03\xc6\xa7\x67\x4a\xbd\x61\x05\x0d\x69\x3d\x41\xbf\xe3\xca\x50\x46\xc6\x5f\xfb\x06\xa0\x74\x98\x09\xe5\x8d\x4c\x93\xa9\xff\x69\xed\x30\x95\x0b\xde\x1f\x99\x21\x6f\xff\x29\x9f\x22\xf1\x6b\x07\xc2\x54\xc2\x65\xae\x0b\x12\xe3\x13\x16\x3c\xcd\xf5\x03\x6d\x49\x05\x5f\x9a\x96\x67\xb0\xb7\x12\x92\xbc\x3b\x62\x60\xcb\x87\x56\x8f\xd2\x67\x17\x0b\xc9\x40\xc3\x33\x29\xd7\x29\xc9\xe3\x2d\x0f\x91\x80\xb1\x34\xbf\xf8\xae\x93\xb1\xbf\xeb\xfa\x38\x42\xfe\xf2\x0b\xc0\x4a\x29\x7b\x00\xa8\x4a\x0f\x42\x8d\x5f\x42\xfa\xb8\x61\x42\x99\x6d\x4a\xd9\xef\xab\xc4\x98\x52\xf8\x81\x2f\x3b\xfb\x5e\x57\x53\x9e\x21\x86\xeb\x8a\xe2\x29\x58\x0b\xc6\x04\x48\xac\xde\xf5\x72\x3c\x88\x15\x88\xb5\x37\x89\xf0\x5b\x91\xe0\x22\x89\x22\x32\x52\xd7\x53\xf7\x98\x13\x77\x9a\xce\x70\x5e\x04\xae\xd1\x52\x65\xd3\xbd\xf2\xa2\xe4\xb1\x56\x54\x77\x0a\x27\x58\x54\xe6\x4c\xf4\x43\x90\x60\x7a\x45\xd7\xbb\xa9\xaf\x3e\x1a\x2e\x28\x30\x67\xfc\xd6\xe6\x33\xaa\x2d\x24\x03\xbd\x81\xf7\xc7\x92\x76\x55\x10\xb5\x98\x41\x2f\x6b\xda\x07\xb2\xa9\x45\xb9\xf6\xd4\x6a\xb2\xf7\xc3\x20\x07\x5b\xc6\xb6\x0a\x80\xda\xa4\x4a\xf3\x91\xf4\xcd\x56\x21\x31\xbb\xdd\x40\x7d\x66\xf8\xdb\x12\x59\xbd\x76\xfa\x7e\x4d\x52\x64\xe1\x45\x54\x6c\x94\x2d\xfe\x90\x07"}, +{{0xed,0xa0,0xfe,0xac,0x0f,0x2a,0xfe,0x01,0x74,0x49,0x15,0x52,0x48,0x7f,0x39,0x62,0x17,0x13,0x32,0xb8,0x22,0xdc,0x3d,0xa4,0x26,0xf9,0xa5,0xf6,0x2b,0xef,0x7b,0x8d,},{0xef,0xf2,0x7c,0xb5,0x1f,0x4d,0x39,0xc2,0x42,0xf3,0x23,0x01,0x9a,0x12,0x34,0x81,0x8e,0xf2,0xe4,0xcd,0x1b,0xda,0xbc,0x0f,0x2d,0x8d,0x21,0x34,0x58,0xdc,0x47,0x1a,},{0x6c,0xbc,0x7e,0x6f,0x5e,0x12,0x14,0x5b,0x01,0x68,0x7a,0xd9,0xca,0x6b,0xf6,0xe4,0x7f,0x94,0x17,0xc2,0xce,0xfa,0xd3,0xfb,0xd6,0x8f,0xd6,0x5d,0xd7,0x4f,0xaa,0x97,0x50,0xcb,0xa9,0x92,0xde,0x4c,0xeb,0xcf,0xcd,0x35,0x80,0x8c,0xbb,0x3f,0xf1,0x2c,0x8d,0x93,0x07,0x99,0xaf,0x36,0xef,0xe7,0x97,0x6b,0xf2,0xfe,0xa7,0x9e,0x3e,0x0e,},"\x90\x11\x19\xda\x4e\xd1\x81\xaa\x9e\x11\x17\x0b\x20\x62\x6e\x00\xab\xf0\xb5\x48\x24\x5e\x3d\xeb\xf9\x4b\xf5\xed\x50\xae\xef\xe9\x42\xb4\x02\xcc\x99\x48\x94\x78\x52\xde\xdf\x2b\x53\x04\x01\x76\x65\x74\x9c\xd4\x7c\x21\xfc\x65\x2e\xe9\x95\x67\x9f\xf9\x31\xe3\x0e\x94\xaf\x98\xb4\xa9\x8f\xd4\x4e\x84\x9e\x98\x47\x0f\xe0\xa7\x6c\xe8\x0c\x61\xf8\x3f\xb4\xe8\x5b\xa5\x23\xee\x3f\xd2\x5d\xb0\x00\x05\x3b\x49\xd0\x93\x0e\x3b\x07\x9e\x86\x6e\x15\x3f\x7d\x86\x36\x7f\x23\xa4\xc4\xab\xc6\x3b\x30\x75\x46\x1e\x90\xe4\xfd\x89\x6d\xa0\x49\x2e\x27\xd7\x14\x94\x1e\x96\x7f\x52\xc9\x3f\xfa\xec\x44\x80\x3f\x57\x87\x7d\x86\x6e\xb5\xf8\xc5\x28\x17\x85\xaa\x48\x26\x79\x2e\x39\x64\xc6\x65\x90\x82\x1e\xea\x66\x75\x20\x74\x26\x40\x18\xa5\x71\xf5\xb0\x13\xb3\x8e\x15\x2c\x95\xc0\x24\x8a\xe6\x03\x68\x22\xa6\x7a\xfc\x9e\x02\x69\x45\x73\x15\x2b\x86\x4c\x56\xc2\xf7\x30\xa0\x82\x10\xf8\x5e\xc4\x6f\x98\x4a\x64\x3d\x51\x6a\x15\xfc\xfa\xa8\x48\x40\xf5\x12\x04\x7d\x11\x0e\x07\x18\xd2\x93\x95\x5f\x01\x58\x25\x7f\xba\x0d\x78\xeb\x7d\xf2\xf0\xb7\x7e\x6e\xeb\x76\xdb\x5e\x71\x70\x73\x10\xe8\x27\x36\x1c\xd4\xe1\x19\x74\x0e\x63\x92\x2d\xb4\x2c\x2c\xeb\x5e\xe1\x75\xd5\x0d\xec\xc7\xb7\x49\xfd\x23\x25\xbc\xe1\xe6\xa8\xf7\x10\xff\xcc\x1e\x1c\x9b\x33\xc3\x80\xe5\x2a\x64\xda\xa9\x58\x5f\xab\xe4\x06\xd9\xcf\x24\x48\x8f\xe2\x6f\x3a\x49\x5f\xb0\xab\x50\xe1\xe2\xba\xd8\x23\x81\xaa\x22\x43\x10\x99\xcc\x8a\x56\x98\x13\xd7\x9c\x9d\x78\x56\x9c\x0d\x95\xda\x9a\xad\x2b\xfb\x57\x75\x8d\x52\xa3\x75\x27\x52\xe0\x23\xd6\x51\xc9\xcb\x66\xa4\x12\xa5\xc8\x0f\x6b\xa5\x47\x93\xf7\xec\x87\xb4\xc5\x98\xfe\xd2\xce\x24\xab\xd7\x60\x87\x08\x89\x5c\x46\x72\x73\x59\xff\xec\xa6\xd6\xc6\x2e\x10\xa6\x78\xca\xa7\x18\xb4\xcd\x26\x32\x92\xcf\xef\x53\x5b\x9f\xbe\x27\x56\xb7\x39\x6d\x69\x7b\x31\x46\xc5\x51\xe6\xaa\xc1\xf5\xf1\xc2\x4b\xe9\xb6\x7a\x1e\x2a\x2a\xff\x74\x53\x01\xba\x6a\x21\x22\x17\xc5\x3d\x68\x16\x81\xbb\xb4\x01\xbf\x4a\x43\x65\x6f\x5d\x15\xcd\xe9\x69\xc1\x78\x00\x99\xa3\x32\x37\xeb\x19\xa3\xb8\x58\x5d\x6b\x5d\xea\x2f\xb5\x77\x84\x5f\x25\xee\x2a\x82\xcc\xf4\xb2\x85\x02\xf9\x0f\xe8\x0b\x8c\xdc\xdf\x2c\xcf\x93\xc4\x34\xc0\xe6\xaa\x5d\x87\x52\xa4\x43\x43\xc2\xb1\x8d\x20\xfe\x40\x04\xc4\x70\x38\x65\x93\x56\xf8\x7a\xbe\xd5\x44\x50\x34\xd8\xe2\xd3\xd1\x47\x68\xf5\xef\x31\x2c\xf1\x02\xa9\x88\x46\x83\xbc\xc0\xcd\x8a\x71\xe3\xec\x36\xfb\xb6\x33\x4a\x1b\xba\xed\x5d\x2b\xf1\x04\x16\xd8\x2b\xd6\x53\x04\x75\x38\x0a\xb6\xe2\x57\x7b\xbc\x69\xce\xbd\xa7\x5f\xaf\x02\xad\x82\x7b\x54\x51\x82\x13\x20\x6f\xd4\xcd\x66\xf2\x52\xb2\x34\xac\xa9\xee\xde\x7e\x3e\xeb\x81\x5d\xdc\xd8\xd5\x19\xc5\xd7\xf5\xd9\xd1\xfb\x9c\xa0\xfa\x44\x67\x99\x00\x95\xfa\x46\x22\x0c\x20\xa2\x07\x1d\xfc\xaa\xd5\xf0\x24\xda\xe3\x41\x6f\x7c\x49\x2d\x75\x74\x88\xc4\x9a\x2e\x4d\xf4\x83\xbc\x9b\x80\x09\x8e\x0d\x5d\x68\x3f\xac\xb8\xc9\x60\x82\x9d\xff\x09\xb3\x03\x36\x9d\x46\xcb\x57\x33\x1f\xf2\x17\x91\xee\x25\xd6\xbe\x7d\xec\x7e\xba\xf1\xb3\x24\x79\xa7\xf5\x14\xdc\x64\x71\x05\xc9\x44\xc3\x6f\x7d\xbf\x0a\x5b\x58\x91\x28\xdb\xaa\xa4\x21\x71\xd6\x42\xf2\x5a\x98\x1c\xe1\xf8\x37\x9f\x91\x69\x0b\x36\xaf\x77\x46\x48\xd5\x62\x4c\x08\xdb\xd0\xa9\x0f\x70\x87\x16\xdf\xab\x20\x24\xda\xe8\x65\xb9\xc4\x9a\xb2\x74\x73\x82\x6c\xd4\xa0\x10\xbf\xdb\x52\x01\x1d\x8c\x7c\xb3\xf4\x21\xca\x8c\xa3\xcd\x04\x86\x88\x91\x88\xe6\x7d\xf0\x0f\xb8\xc2\xa6\x43\xe7\xad\xb2\xf8\x27\x9f\x76\x3e\x5b\x9a\x81\xb6\xdf\xc3\xf7\x21\xfc\x5f\x68\x49\xf6\x67\x36\x78\x8c\xc5\x57\xc4\xeb\xc6\xfc\x68\xd6\xf6\xac\x77\xbe\xdd\xa8\xac\xb3\x62\x24\x3b\xda\x74\xe7\xb2"}, +{{0xec,0x05,0x9f,0xc6,0xbe,0x98,0x3c,0x27,0xec,0xa9,0x3d,0xdc,0xdc,0xb5,0x3a,0xf7,0x28,0x62,0x55,0xda,0x91,0xe2,0xa5,0x6a,0x68,0x4f,0x64,0x1e,0xc2,0xd0,0x9d,0x6e,},{0xff,0xc6,0xcb,0x75,0x1c,0x70,0x07,0x1b,0x65,0xec,0x2a,0xc6,0xb4,0x5f,0xd1,0xd5,0x5f,0xe8,0x36,0x96,0x5f,0x80,0xb3,0xe7,0xc7,0x84,0xfc,0x70,0x4a,0xcb,0xdf,0x69,},{0xa7,0xb8,0x8e,0x5a,0xbf,0x13,0x28,0x24,0xbd,0xde,0x77,0xc5,0xf8,0xdf,0x94,0xab,0x26,0x48,0x1f,0x6b,0xee,0x66,0x0e,0xa1,0x62,0x24,0x70,0x82,0xa2,0x50,0xd3,0x90,0xc7,0x1d,0x32,0x0a,0xd0,0x60,0xd8,0xef,0x34,0x1f,0xb6,0x9a,0x48,0x32,0x94,0xf0,0xd6,0xde,0x72,0x6f,0x0c,0x86,0x2f,0xa3,0x7e,0xa4,0xbc,0x6d,0xab,0x52,0x15,0x09,},"\xd1\xac\x63\x25\xa4\xe6\x90\xfa\x79\x53\x68\x83\xd5\xc2\x0e\xac\xb7\xd9\x64\xc0\x17\x8f\x74\x2c\x2b\x23\x72\x7d\xeb\x62\x64\x5a\xf7\xc8\x19\x22\xa0\xe7\x2e\x5e\x30\xb5\x83\x9a\x2e\xd5\xe5\x67\xec\x31\xce\x22\x41\x15\xb8\x2d\x2b\xf2\x51\xb7\x39\x3f\x01\xb0\xd0\x3a\x60\x2b\xc1\x20\xae\x62\xaf\x7f\xbc\x37\x9d\xfc\xf9\x5b\xbb\xba\x98\x4a\xab\xa3\x4f\xe2\x12\xac\x99\x00\x33\x28\xb8\x32\xc3\x53\x2d\x42\xee\xe1\xe1\x87\x4d\xc2\x2a\xd6\x7d\xb6\xc9\x1d\xbb\xfb\x2b\x45\x78\x5d\xbc\xd3\x99\x17\xd3\x6f\xb4\x8c\x1b\x5d\x6f\x38\xbd\xda\x5d\x28\xfb\xba\x64\x17\x55\x75\xaf\xea\x46\xc8\xed\x67\x57\xff\x30\x16\x4e\x0d\xf2\xe7\x21\x76\xe8\xb6\xc9\xdb\x5b\x5e\xf3\x90\xb7\x2f\x2d\x4d\x94\xe3\xb6\x6f\x0d\x44\xa7\xe0\xf0\x6e\x89\xde\xbc\xdf\x13\x63\xc0\xe7\x5d\x50\xdb\x5b\xb7\x01\x90\xd1\x9f\x66\xa3\x9c\x6f\x7d\xba\x70\xdf\xcd\x4a\x9f\xed\x02\xc2\xf1\xd0\x67\xe7\xc7\x88\xc5\x8f\xdb\x3e\x17\xa2\x37\x7c\xe4\x86\xec\x65\x82\xf3\xba\x99\x7b\xb5\xf7\x0c\xd6\x21\x00\x29\x56\xf5\x13\x1a\xa3\xa1\x61\x7c\x0c\xeb\xcc\xd9\x39\x1d\xe1\x30\x7c\x85\x97\x0a\x8b\xc1\x55\xf5\x19\x87\x26\x68\x45\x0c\x91\x48\x86\x89\xf5\x3c\x2c\x1a\x7e\xd5\x3f\x38\x8c\xb1\x3a\x2c\x38\x96\xfe\x5b\x7d\x3a\x0d\xc1\x68\x3f\x27\x66\x4c\x8b\xea\xea\x68\x0c\x8c\xc5\x4a\x90\xe4\xc6\xf9\x9f\xbf\x05\xf2\xc2\x2d\xf6\x0d\xe9\xae\xc8\x0c\x79\xb7\xd6\x62\x07\x05\x06\x67\xb4\x52\xd7\x85\x7f\x9a\x8c\xa7\x23\x28\x0d\xac\x79\x92\xe2\x07\x92\x67\xec\x3a\xd9\x11\x40\x46\x42\xc4\xe3\x26\xbf\xb9\x6b\x43\xc8\x94\x34\xba\x4b\xc7\x8c\x25\x2f\x4d\x4c\xa8\xd1\x3a\x88\x74\xc6\xfc\x82\x52\xea\x0b\x56\xc6\xbc\x78\x68\x47\xd4\x31\x83\x06\xe1\xc6\x52\xc4\x52\x58\x5e\xef\xd0\xbd\x9d\xd3\xc1\x48\xa7\x3b\xa8\x6e\xed\xea\x94\x5f\x01\x67\x13\xed\x7d\xf0\x85\xd0\x06\x66\x89\xe7\x92\xda\xcb\x2b\xfc\x1e\xb5\xc8\x24\x37\x2a\x26\xc5\xe9\x44\xaa\x74\x44\xac\x97\x73\xd4\xa1\x92\x1e\x49\xbd\xd4\xf8\xf6\xd7\x88\xc2\x63\xfe\xe0\x4c\x7b\x44\x4c\x53\x05\xed\xb6\x33\xe1\xff\xe0\xba\x4e\xa8\xda\x01\x1a\x62\xf2\xbb\xfe\xf4\xb8\x95\xad\x3f\x22\x4c\x3b\xa3\xbf\xf0\xc9\x5d\x75\x75\x0c\x9b\xcc\x66\xff\x8a\x20\xb6\xc2\x4b\xde\x75\x81\xa7\xec\x38\x66\xf8\x71\x6f\x78\x1f\x46\xdc\xad\x45\xa9\xeb\xcb\x6e\xd4\x69\x53\x36\x83\x97\x01\x17\x35\xd4\xb5\x2d\x00\xe8\xdb\x39\x79\x95\xdb\xdb\x3d\x4f\x42\x54\x68\x7f\x04\x68\x8a\x26\x8c\x30\x5b\x2b\x1f\x62\x2c\xf5\x1b\x17\x47\x75\xba\xd7\xf6\x67\x4a\xdc\x2e\x58\xe0\x5c\xce\x86\x5f\x12\xd7\x56\x9c\x8e\x9b\x35\xbc\xdf\x3c\xcc\xe6\x33\x0d\x08\xce\x53\x40\xa7\xc6\x30\xf2\x7a\x6c\x80\x86\xb5\x14\x6b\x29\x2f\xcb\xf5\x0f\xf6\xaa\xae\xf8\x84\x8a\x70\x7b\x25\x43\xc6\x18\xd1\x7b\xd9\x76\xc2\x40\xbc\x79\xd3\x3e\x00\x4e\x49\x53\x48\x29\x15\xe7\xe6\xef\x94\x96\x4b\xde\xa4\xe0\x2d\xd7\xc2\xf4\x75\x23\x5f\x2b\x99\xe4\x32\x29\xc9\xac\x3a\xba\x0d\xb5\x9a\xc2\xda\x03\xa9\xee\x4f\x37\xdb\xf2\x47\xa3\x3e\x6d\xfe\x5b\xe7\xc7\xf8\x25\x84\xf0\x4a\x46\xd4\x9f\x66\x21\xda\x31\xb9\x1a\xc3\xda\xa4\xd6\x8d\x48\xa5\x66\x59\xb4\x48\xc0\xed\x36\x5c\xb4\xaa\x0c\xfd\x90\x88\x53\xdf\x5b\xbf\xa8\x8e\x60\xe1\x0a\x5a\x00\x2c\x32\xab\x33\x33\xf2\xc3\x9b\xbf\x3e\xe0\x1a\x4a\xa6\x0d\x2d\x01\x42\x3e\x60\x97\xdc\x54\x30\x5f\x81\xa2\xd9\x3e\x2f\x6b\x4e\x8b\x35\x19\x71\xcb\xf2\x45\x7d\xc7\x6e\x1f\xb8\x92\x93\x38\x47\x98\xef\x28\x23\x4e\x9b\x1a\x47\xde\xdc\x23\x36\xf8\x6b\x8e\x13\xc4\xae\xf7\x90\xf5\xa1\x12\x39\xc7\x47\xd9\xd8\x65\xc9\xa1\x5a\xde\xb0\x71\x07\x02\x67\xe5\x34\x62\x56\x64\x8a\xdc\x0f\xa4\xdb\xdf\xd7\x87\xca\x14\x65\xfc\x24\x0a\x32\x4c\x3c\xaf\x29\x31\xda\x41\x49\x9e\x27\x5f\xd4\xb3\x5f\x6d\x08\xdb"}, +{{0xf1,0x6a,0xbd,0xbc,0xc0,0xbc,0xc6,0x1a,0x1a,0xee,0x3a,0xbd,0x87,0x67,0xab,0x52,0xe5,0xf7,0x99,0x99,0xbb,0x77,0xa3,0x97,0x6c,0xbc,0x82,0x67,0x0d,0xfd,0x2f,0x73,},{0x10,0xf4,0x51,0x71,0x9d,0xb0,0xfd,0x21,0x37,0x6e,0x22,0x8a,0x41,0xc3,0x03,0x5c,0x8c,0x2b,0xc4,0x2e,0x5a,0xaa,0x92,0x6f,0xe6,0x08,0x87,0x8d,0xbb,0x0d,0xc7,0xab,},{0x33,0xd8,0x05,0x29,0x08,0x69,0xb8,0xe0,0x4f,0xf0,0x89,0xfa,0xa2,0xd1,0xfa,0xb8,0x37,0x43,0xba,0xda,0x68,0xad,0xe5,0xb3,0x8a,0xe5,0xf0,0xcc,0x58,0xc3,0x37,0x4e,0xba,0x43,0x94,0x3c,0x1f,0x51,0x10,0x67,0x8e,0xb3,0x9b,0x46,0x58,0x61,0x18,0x22,0xa2,0x6d,0x35,0xff,0xe1,0x9e,0x9c,0xfc,0xb9,0xba,0x95,0x89,0xe4,0xec,0x31,0x05,},"\xbf\xac\xd7\xdd\x4e\xea\x46\x7d\xcc\xe4\x04\xf4\xa3\x52\x0a\x45\xb9\x4e\xba\xa6\x22\x19\x7d\x02\xd6\x15\x29\xd2\xb3\xbf\x27\x3c\x4e\xe1\xfb\x95\xa1\x80\xc8\xf8\x7d\xe1\x90\xa2\xe5\xea\x70\xb8\x4a\xe1\xeb\x6f\xd4\x44\x7d\x8a\x3a\x8d\xed\x10\xf6\xed\xe2\x4f\x0e\xb9\x2b\xd3\x0b\xc6\x5d\x48\x71\xe8\xf5\xda\x08\xcb\xe8\xcd\x3c\x0a\xc6\x4f\xd5\xa5\x7a\x6b\x06\x4a\x89\xd5\x15\x9b\x42\xf8\xb3\xe5\xa1\x83\x8c\x9c\xb1\x9d\x88\x10\x6c\x07\x73\xa2\x75\xcd\x2a\x1d\x60\x99\x30\xbf\x6b\x30\xae\xca\x62\xb9\x7e\x31\x9b\xbf\xa9\x34\xf4\xd0\xa1\xe6\xac\x80\xba\xeb\xcb\xa2\xd8\xea\x4b\xed\x9c\xa8\x56\x2b\x4a\xcb\x56\x97\x9b\xf8\x85\x32\x4a\xc4\x0a\xb4\xa5\x0b\xfb\x9f\x34\x90\x49\xfc\x75\xa0\xe0\x3d\xe4\xcc\x43\xea\xe3\xc6\xa6\xcf\xfb\x5f\x6a\xe6\xc9\x45\x04\x41\x5e\x6c\x7e\xd3\x04\x5a\x93\x2f\x47\xfd\x20\xb9\xf3\x48\x3a\x77\xb6\xd4\x49\xd8\xdf\xd4\xa6\x38\xdb\xf5\x6f\x03\xf0\xf0\x31\x87\x90\x59\xb2\xfb\x49\x76\x79\x43\xf4\x6b\x38\x72\xe2\xde\x56\x7d\x5f\xef\x80\xb0\x29\x25\xe9\x86\x3e\x0f\x1d\x31\xa8\x0f\x4e\x64\x51\xc3\x25\x69\x4b\x80\xcf\x1f\x19\x18\xc6\xe4\x98\x87\x8e\xdc\x47\xc4\x53\x0c\xac\x46\x6f\x1a\x29\x4d\x55\xdf\x09\xaf\x4f\xdc\x80\x72\xad\xb1\xbf\x26\xca\x8c\x92\xf9\x12\xa2\xb9\xfe\xbc\x8b\x97\xb5\x8c\x1e\x9d\x32\xc7\x80\x32\x30\x52\x97\x2b\x6f\xbd\x53\x30\x4c\x05\x19\x3c\xae\xb6\x7c\x5b\xd3\xe6\x74\x79\x72\x5d\x29\x7d\xff\xb0\x68\x90\xab\xf8\xcd\x9e\x42\x45\x8e\x16\x8a\x61\x18\xf9\x05\xb1\xd5\x34\x86\x01\x6f\x85\xdc\xd9\x8d\xd3\x39\xe3\x46\x05\x33\xd0\xb8\xa4\x9f\xae\x6d\xc1\xa0\x71\x72\x5e\x6a\xe5\xf2\x94\x47\x9e\xe3\xbd\xca\xeb\x74\x06\x18\x41\xfb\x26\x08\xe8\x8a\x49\xfd\x0f\x38\x95\xb1\x8f\x85\xb9\x0f\x72\x41\xdd\x13\x87\x71\x00\x53\xfa\xa6\x2b\xae\x75\xe9\xae\x39\x36\x9c\x1c\x02\xde\x5d\x19\x24\x2e\xfa\x16\xe1\x1d\x44\xa4\xba\x57\x78\xce\x77\x22\xa9\x1c\xec\x0b\xc0\xa0\x8c\x06\x9b\xdf\xa1\x30\xd1\xc6\xc4\xb5\x6c\x6e\x93\x54\x24\x03\xcc\xf2\x76\x84\xde\xf5\x7d\xef\x26\xdf\x86\xce\xd5\x71\x28\x2d\xc9\x60\x97\x46\x18\xf0\xa7\x4a\x0c\xde\x35\xb6\x53\xcc\x6e\x77\x30\x43\x1b\x82\x5f\xfb\x9b\x8a\xaa\xb3\xc7\xa3\x97\xc9\x92\xbc\x2f\xa2\x32\x70\xfb\x11\xee\x43\x1a\xfd\x5f\x9a\x64\x44\x83\x01\x11\x73\x99\x3f\x19\x48\x5d\xd3\xcb\xdd\x18\x7b\xd3\xd9\x95\xeb\xf0\x03\x1b\x1b\x0d\xe4\xa8\xde\x9c\x14\xeb\x6f\x78\x0e\x36\xb8\x92\x57\x56\xb9\x79\x06\xa1\x96\x9d\x85\xe9\x67\xd8\x80\xe6\xe7\xdd\xa4\x2f\xd3\xc3\x00\x19\xf1\x1d\x70\x81\x07\x1e\xee\x66\x26\x42\x28\x36\xbb\xed\x27\xd4\x6d\xd0\xdf\x1f\xeb\x66\x10\xdc\x85\x9f\x51\x3c\x0b\xc6\x53\xd7\x02\x20\xfe\x04\x8d\x2e\x97\xc2\xe0\x6a\xf5\x30\xe1\x1b\xdc\x70\x29\xbc\xcc\x5c\x92\xed\xec\xef\x5e\x4a\x2e\x0b\xe2\xd2\x51\xf4\x41\x5d\xca\x3e\x55\xb3\xa8\x50\xf2\x63\x0b\x87\x9e\x4e\x03\x6c\xe8\x63\x3b\xf2\x09\x20\xb6\x80\x94\x21\x59\x29\xac\xcc\x7b\xe4\x0c\x57\x78\xbc\x55\x4e\x6e\xdd\x7e\x54\xc9\xe1\x45\xb2\xee\x07\xb6\x5d\x06\x1c\x11\xde\x0e\x83\xf3\x81\xce\x4f\x57\xc6\x48\x3f\x51\x06\x93\x63\x51\x10\x74\xc7\xa5\x77\x35\x3b\x45\xc6\xeb\x71\x19\x9d\xce\x50\x59\xfd\x2c\x46\x11\xb0\x54\x23\x8a\xaa\xdf\x2b\x6b\xa5\x34\xbf\xff\xc2\x72\x2a\xe3\xe3\x1f\xf7\x9a\xe2\xeb\xca\x99\xcc\x35\x07\xf8\xa0\x33\xcf\x4f\xea\x70\xc5\x2f\x7d\xb5\xde\x44\x2b\x42\xb8\xd4\x1e\x99\x01\x2e\x42\xca\x0e\x85\xa9\xfb\x6d\x4f\x16\x5b\x33\x0d\xe6\x38\x3c\x57\x26\xef\xca\x2f\xe9\x71\x34\x00\x02\xf5\x62\xdc\x6c\xb8\xf2\xfa\xf0\x66\x57\x25\xe0\x97\x79\x9d\x09\x60\x91\x86\x4d\x66\xa9\x50\xa5\x79\x09\x53\xee\x16\xb9\xea\x58\x20\x09\x21\x87\x08\xc4\xac\xcd\x81\x38\x13\x58\xa2\xc6\x89\xa0\x41\xd0\x2d\x78\x61\x21"}, +{{0xbe,0x79,0xd1,0xae,0xea,0x86,0xe8,0x6f,0x39,0x81,0x37,0xe6,0x2f,0xfd,0x79,0xe5,0x0e,0xff,0x9f,0x31,0x3f,0x25,0x19,0x2f,0x89,0xe5,0x2f,0x0b,0x4b,0xbd,0x5d,0x32,},{0x18,0x7d,0xac,0x85,0x5c,0xa4,0x42,0xfd,0x9a,0x3d,0xdc,0x32,0x89,0xc2,0x4e,0xb2,0xd2,0x6f,0x7a,0x40,0xfb,0x29,0xd8,0xe7,0x44,0x31,0xb2,0x50,0x22,0xc3,0xa0,0xcc,},{0x6d,0xab,0x59,0x3b,0xb1,0xd4,0x48,0xc9,0x74,0xa6,0x5c,0x6a,0x0b,0x6f,0xad,0x22,0xb4,0x73,0x26,0x32,0xd0,0x04,0x89,0x17,0x6e,0xf1,0x26,0xaa,0x59,0x01,0x09,0xe0,0xa7,0x23,0xa1,0x13,0x10,0x7b,0x53,0xe1,0x7d,0x69,0x0a,0x0d,0x40,0xb0,0xfa,0x33,0x6c,0xc8,0x7f,0xd5,0xfc,0xe8,0xf5,0x41,0xac,0xce,0xc6,0x7f,0x7d,0x1e,0xbc,0x06,},"\x6d\x63\x2a\x7d\x3c\x9b\xe5\x36\x49\xd0\xd1\xa5\xee\xdf\x51\x9a\x41\x3b\x13\xac\x64\xe9\xad\x85\x4d\xfa\x04\xf2\xe1\x73\x29\xd8\x22\xbe\x57\x3d\x9e\x35\xac\x06\x6f\x02\x22\x13\xa3\x44\x62\x0b\xba\x28\x9f\x53\x31\x69\x55\x84\xd1\x34\x3e\x81\x54\x05\xae\xab\xe3\x86\x1d\x63\xb3\xa5\xb9\x2b\x8c\xd8\xee\xed\x22\x80\x22\x2a\xbd\xe3\x0a\x1b\xcc\xd3\xf3\xe4\x11\xaa\xb9\x22\xfa\x1b\xaa\x09\x7a\xa5\xc7\x80\xd0\xea\xef\x94\xea\x10\xfe\x21\xf7\xd6\x39\xb7\x6d\x47\x88\xae\xb5\x92\x4a\x9d\x26\x2d\xcb\xc5\x68\x8a\x3e\x43\x54\x4b\xec\x08\x8c\xa2\xe0\xd0\x6d\x77\xa7\x1f\xb6\x41\xd5\x52\x26\x61\x44\x52\xb1\xe0\x80\x7a\x9f\xcd\x3c\xa6\x9b\xf7\xf2\x5d\x80\x41\x47\x0c\xeb\x7b\x21\xea\xd0\x3e\xc0\x37\xa1\x62\x9b\xd5\x00\xaa\x23\x3b\x59\xbe\x44\x97\x82\x10\xb6\xa3\x66\xf2\x23\xac\xfa\x07\x97\x95\x40\x07\xb0\x0e\xfb\x4f\xfa\xdb\x5f\xc9\x2b\xdb\x37\x86\x3e\x50\x2d\x7d\x70\x68\x10\x39\xed\xf3\x37\x70\xdf\x3d\x1d\xe3\x43\xdc\x35\xf2\x26\xd5\xe7\x39\x44\xba\x02\x55\xe2\xa8\x8e\xf6\xc4\x1e\x47\x2b\x21\x45\x67\xc2\x49\x59\x4a\x50\x87\x8b\x67\x31\xc1\xae\xb5\xb1\x0f\xa9\x1f\xa7\x6a\x37\xe1\xf9\xf1\xc0\x0f\xdb\xfe\x34\x85\xde\xd5\x4a\x00\x9a\xb6\x13\x39\x27\x11\x56\x68\xb5\x9f\x51\x15\x50\x8d\xa9\x37\x0f\x6b\xc9\x2a\x11\x85\xc0\xd5\xca\x01\xd2\x91\xe1\x8c\x54\xac\xfa\xca\x73\x8b\xd7\x19\x68\xa3\x42\xa0\xcb\xa6\x2e\x4b\xb1\x04\xa5\xbb\x37\x9f\xc8\x3e\xe1\x82\x0d\x1d\xb9\x80\x25\x3d\x6c\xb3\x83\xe9\x5a\xf1\x5f\x53\xc8\x5d\x17\x58\x90\xdd\xe5\xe4\xed\x03\xd2\xd0\x13\x5e\x3d\x60\xb1\x82\x93\xf5\xb5\x64\x1e\xf8\x3c\x6e\xce\x3d\x52\x59\x8f\xc6\x35\x36\x86\xe6\xf7\xb0\x9f\xde\xc1\xf6\xf1\x53\x67\x2d\x34\xb4\x89\xb4\x8a\x0d\xb9\xe4\x2c\xed\xa7\x17\x55\x48\x1c\x04\x70\x16\xc2\x25\x34\xe9\x0c\x6d\x20\x1e\xd7\x85\x96\x02\x63\x6e\xa7\x7a\xe8\xc6\x73\x4b\x7c\x4c\x5b\xd9\x95\x79\xc5\x08\x73\x1c\x72\x46\xa2\x95\x86\xe4\x06\xe1\xd9\x32\xf6\x71\x30\x71\xd4\xbe\xa6\x3d\xc5\xe2\xa3\x76\x1e\x16\x02\x4d\x2c\x32\x84\xf7\x09\xa1\xf2\xba\x08\x5e\xad\x32\x00\xc7\x04\x62\x75\xcb\x96\xb6\x1a\x60\xb5\xac\x55\x9b\xc4\x88\xbd\x10\x64\x67\xc3\xde\x50\xbf\x5d\x74\x0d\x05\xc9\xcd\x70\x1d\x65\xb7\xda\xea\x29\xe6\x4d\xd5\xa9\x7a\xdb\x6b\x5c\x82\xcf\x7f\x23\x01\x7a\xa7\xca\x1a\xc9\xa3\x9e\x58\x27\xeb\x47\xe2\x0d\x35\x9b\x67\xc7\xd4\xe1\xa8\xe3\xe2\x7c\x52\xd3\x3d\x93\x03\xa5\x92\x62\x34\x84\xd7\x97\xb4\x02\xcb\xb4\x58\xd1\xac\x2e\xa5\x3e\x1c\x4f\x7a\xbb\x70\xcc\x02\x95\x54\xa2\x34\x57\x4d\xef\x9b\xc3\xb0\xd3\x83\x5d\xc3\x14\x90\x2e\x25\xab\xb2\x2d\xfd\xed\xdc\x67\x9a\x3c\xc8\xf0\x73\x40\xb1\x5f\x57\x62\xf4\x40\x7f\x38\x03\x42\x55\x4e\xd0\xc6\x2f\x73\xb6\x18\x16\xea\x8c\x52\x94\x61\xe1\xbf\x0e\x9d\x1c\x2d\x5e\x4c\x57\x46\x33\x6b\xc0\xe1\x32\x87\x3c\xde\x0d\xc2\x15\x8b\x54\xfa\x1b\x67\x8a\x00\x6b\x4d\x95\xed\xa8\xa9\x55\x71\x42\x73\xb7\xcc\x5c\xf2\xad\xd9\x09\x4d\x46\xe4\x9a\xbc\x09\x6a\x45\xf4\x18\xe2\xed\xbe\x99\xdd\x85\x29\x11\x68\x80\x64\xdf\x7c\xf0\x61\xd0\x7a\xee\xf4\x27\x95\x69\x0f\x48\xc9\xba\x19\x56\x54\x75\xd5\x46\x8a\x9e\xf4\x5d\x7b\xf7\x5f\xd7\x11\x82\xdd\x6e\x64\x01\x38\xf1\x82\xa6\xa0\xc6\xcb\xbd\x00\xc4\x95\xc4\x38\x95\x30\xac\x8e\x67\x96\x0e\xb5\xc5\x76\x3f\x54\x84\xea\xb1\xc1\xab\x85\x01\x40\xda\x04\x2b\xa4\x7e\xd8\x52\x88\x00\xd4\x17\x87\xf0\x75\xfe\x0d\x85\x50\x1a\x7a\xb7\x66\x35\xd0\x34\x10\xd2\x86\xc0\xe1\x7d\xb4\x02\x3a\x76\x39\x74\x68\xcc\xb0\x91\xcc\x5a\xc1\xf6\x43\x45\x87\x91\x3e\xab\x92\x2b\x50\xca\x55\x67\x01\x6d\xde\xa3\x2f\xb5\x32\x55\xbe\x67\xf2\xdc\xf9\xff\xa8\x5d\x11\x7f\x1a\x65\x5f\xa7\x0d\xd3\xa5\x4c\xf9\x91\x53\x1f\x19\x13\x0e\xaa"}, +{{0x26,0x99,0x52,0x17,0x2c,0x3f,0xa9,0x76,0xde,0xfb,0xf4,0x0b,0xd6,0xed,0xd8,0xf1,0x5c,0xfd,0x4b,0xe1,0x0c,0x75,0x8e,0x37,0x41,0xd7,0x41,0x62,0xd8,0xea,0x22,0x9a,},{0x4a,0xea,0x57,0xc7,0x21,0xe3,0xdc,0xca,0x82,0x39,0xe9,0xad,0x9b,0x22,0xc1,0x9b,0xab,0x8d,0xf7,0x2c,0x88,0x79,0x3b,0x24,0xd8,0xdc,0x47,0xcf,0x97,0x40,0xfc,0xf8,},{0x3a,0xc8,0x0d,0x1e,0x8f,0x68,0xb4,0x05,0x8c,0x3a,0x04,0xda,0xd7,0x18,0x73,0x73,0x95,0x9f,0x26,0xa2,0x70,0x02,0x49,0x6f,0x8a,0xfa,0xac,0xcd,0x8b,0xea,0x09,0x01,0xc5,0x4c,0xab,0x87,0xb2,0xa2,0x30,0x2e,0x1f,0x36,0x25,0xc2,0xb0,0x6c,0x7e,0xbc,0xf3,0xce,0x96,0xde,0x3a,0xfd,0xf0,0x0f,0x51,0x94,0xa3,0x5e,0x05,0x52,0xc7,0x0e,},"\x7c\xcb\x6a\x05\x70\xc5\x33\x73\x7b\x9a\x53\x4a\x34\x1a\x7a\x96\xdc\x76\x52\x8b\x99\x7a\x9b\x48\xe6\xe0\xfd\xe1\x0f\x47\x4b\x27\xec\x98\x99\x12\xd1\x76\xca\xb7\x42\xd8\x9a\x84\x8b\x36\x66\xe9\x27\x7d\x69\x5b\x02\x2f\xd5\x3a\x9e\xb8\x9e\x88\xc7\x20\x39\x9e\x24\xed\x25\xdb\x9e\xb3\x5d\x6d\xa0\x09\xe9\xf0\x24\xef\x8e\x65\x51\x65\xbd\xef\x1c\x0d\x79\x7c\x74\xf0\x19\xcd\x59\x1a\x04\x42\xa1\x2d\x1c\xa8\x93\x83\x6c\xa2\x62\x8b\x33\xe8\x54\xf3\x42\x8e\xec\x4a\xa5\xed\x84\xf4\xbd\xd2\xee\xf8\xb6\xd2\x25\xca\xf9\x49\x6d\xf9\xed\xff\xd7\x35\xea\x54\xdb\x1b\xde\xa8\x83\xad\x5d\x47\xeb\x0b\xd4\xa6\x65\x3f\x0a\xb0\x37\xf0\x40\xa4\x15\x17\xa7\x74\x1f\x91\xe8\x2f\xdb\x6f\xda\x04\xf0\xdf\xa1\xbc\xf8\xb9\xb3\x7b\xf2\xbf\xbd\x87\x32\x7a\x63\x6f\x90\x7f\xdf\x96\x8d\x01\x89\xd1\xa1\x18\x09\xc4\x23\x0b\xa6\x9d\x5c\xbd\x84\xf5\x61\xbc\xac\x3a\xd0\x02\xe5\x58\xc5\xb9\xb0\x97\xa0\x19\x02\xf2\x9c\xe3\xf1\xec\x26\x41\x53\xd6\x68\xc7\x8b\x84\x51\x05\xb9\xcd\x2e\xf3\xc9\x43\x53\x1b\x75\xaa\x42\x8f\x17\x9e\x4b\x34\x18\xb1\xd5\xa4\xaa\x7a\xb1\x20\x3e\xfa\x49\x5c\x87\x69\x62\x8e\xb1\x06\x3a\x93\x7b\x73\xe4\xb5\xcd\x0c\xda\x33\xda\xb0\x1a\x50\xc6\x4f\xeb\xd9\x75\xc5\x7a\x1e\x84\x15\x08\xe8\x60\x60\x94\xd0\x82\x4f\xdd\x96\xcc\x6c\xfa\x18\xfa\x82\x09\xb3\x0f\x0a\x2a\x78\xea\xc9\xa7\x67\x17\x6f\x57\x3e\x78\xc0\x68\x80\x9b\x19\x9a\x69\xac\x6d\x33\x5d\x7c\x92\x09\x99\xc4\x0c\xba\xd8\x7c\xf4\xcc\x7c\xa5\xc6\x44\x29\x1d\x75\xad\x7a\x74\xbc\x1e\x63\x92\xd1\xce\x31\x1e\xcf\xd2\xeb\xc9\x16\xe3\x9e\xb6\xaa\x3e\x7d\x89\xfb\x80\x5a\x27\xa5\x5f\x17\x89\x12\xb1\x57\xbc\x01\xa0\x55\xf6\x7a\xef\xa7\x8e\x55\xc8\x06\xcb\xd9\xc0\x1b\xaf\x8e\xf9\x2c\xad\x22\x60\xb4\xbb\x14\xcf\xe6\x17\x82\xde\xe5\xc5\x99\x72\x50\x69\x41\xc4\x62\xa4\xda\x7e\xb8\x99\x53\x1c\xf9\x96\xbc\x98\xba\x36\x29\xef\xfe\x6f\xcd\x17\x06\xd1\xb4\xee\x4f\x2a\x14\xe9\x21\xbd\x40\x8f\x30\xe1\x2e\x73\xfb\x7a\xa8\x60\x53\x6b\x03\xe7\x7c\xa9\x37\x82\x32\x81\xa1\x64\x53\xfe\x82\x79\x35\x94\x32\x01\xe6\xec\x14\x3a\x67\xee\xfa\x4f\x94\xe9\xab\xf9\x4f\x7e\x3d\x41\xb7\x0a\x82\xbe\x69\xde\xd8\xa5\x30\x60\xc2\x30\x5f\x42\xf6\x2f\xe6\xa2\xf7\x04\xb6\x7a\x1e\x8f\xdd\xc7\xd9\x8b\xa7\xf3\x45\x71\x19\xb3\x11\xd4\x49\x66\x3e\xd9\xe3\x20\xd6\x18\xdc\x23\x68\xd4\x95\x08\x75\xb9\xc3\x8c\x5d\x8c\x03\x10\x4e\x2e\x32\xc4\x32\x5d\xed\xd2\xbc\x26\x7e\x2a\xcc\xb0\x11\x20\x18\xe9\xc5\xa8\x00\x7c\xca\xb2\xf6\xd7\xc7\x37\x79\x20\x02\xac\xb7\x30\xd7\x2e\x9f\x73\x08\x29\xeb\xc4\x2c\xa5\x64\xc1\xd9\x27\x1b\xf1\x86\x9c\x4d\x35\x83\x55\x89\xb7\x43\x1e\xf7\xa3\x1a\x07\x00\x60\xfe\x4a\x08\x9f\xb1\x1f\x2d\xd3\xdc\xe6\x5a\xe0\xfb\x45\xbc\x3a\x28\x60\x91\x7d\x93\x3b\xa2\xd0\x90\x56\x9e\xf5\xed\x43\xbc\x25\x32\xdb\x87\x9e\x0f\x1f\x22\x5e\xad\xcb\xef\x1c\x03\xd9\xed\x78\x29\x9e\x23\x3e\x4c\xf0\x7b\x06\x4a\x7b\xaa\xc3\x4c\x5a\x0c\x19\xfc\x3a\x55\x42\x08\x9f\x70\x16\x7b\xe2\xf8\x5b\x4a\x10\xe7\x78\x52\x52\x23\xbe\x8f\xfd\x5c\xff\x96\x48\xb1\x00\x5a\x09\x8b\x4b\x39\x24\x39\x8f\xb0\xbc\xab\xcc\x6e\xdf\x30\xc0\x61\xec\xe7\xae\xa3\x5f\xe9\x8a\x92\x03\xf8\x71\x13\x69\x53\x0f\xeb\x5e\x67\xbb\x2d\x4f\x59\xd9\xc8\xbc\x99\x38\x54\xdd\x47\x47\xcd\xe3\x99\xbd\x0e\x63\x74\x0c\x1c\xc8\x39\xad\x0f\x09\x8a\x38\xa8\x0b\xea\xdd\x64\x8e\x14\x36\xde\xee\x60\xe9\x31\xe6\x8f\x52\x97\x9c\xe4\x9f\x30\x1f\xe3\x9a\xfb\xb6\x15\x35\x20\x91\xc8\xb6\x58\x5f\xe8\x84\x47\xed\x6e\x59\xa0\x20\xb2\xbb\xe6\x6a\x94\x23\xae\x52\x28\xc2\x03\xbf\xd4\x84\x7b\x51\x81\xe2\xc3\xb4\xda\xd8\x3a\x6d\x4f\xa7\x69\x85\xee\xf7\x6a\xdd\xe3\xb3\x4e\xdb\xdd\x28\xd6\xa0\xb4\xa4\xee"}, +{{0xcc,0x31,0x38,0xe5,0x02,0xa5,0xff,0x6f,0x80,0xd2,0x46,0x36,0x6e,0x84,0xd6,0x5c,0x59,0xf1,0x2d,0x4f,0x49,0x63,0x97,0xe6,0xeb,0x99,0xb5,0x26,0x7b,0x8c,0xbe,0x2a,},{0x9e,0x2d,0x3e,0x88,0xaf,0x7b,0x52,0xdd,0xcf,0x00,0xe6,0xd0,0xc7,0x75,0x9c,0x12,0x38,0xb8,0xfb,0x3e,0xb1,0x44,0x21,0xfe,0x82,0xc3,0x48,0x33,0x43,0x78,0x35,0xbd,},{0xa2,0x70,0x0e,0x38,0x95,0xed,0x0c,0xc2,0xaa,0xf0,0x12,0xa4,0x0b,0xc7,0xbd,0x0b,0xd2,0x9d,0xd7,0x9c,0x69,0xc0,0xb4,0xa6,0xed,0xd0,0x53,0x0c,0xf3,0xe2,0x67,0xc0,0xf8,0x2d,0xd8,0x4e,0xda,0xf1,0x74,0x4d,0xc4,0x11,0xd6,0x2c,0x00,0x28,0x71,0x52,0x58,0x82,0x2d,0x7b,0x63,0xd3,0x97,0x05,0x61,0x2b,0x3f,0xad,0x4b,0x5e,0xfb,0x04,},"\x58\x5e\xcf\x2f\x09\xeb\x92\x3d\xf2\x0a\x85\x55\x64\x2a\x2b\xc0\xb6\x8c\x6a\x5f\xcf\xd6\xb8\x40\x1c\x4a\x0c\xba\xbb\x4c\x6e\x6a\x20\x67\x62\xb7\xa3\x9f\x2c\x54\x55\xd7\x80\x8e\xbf\xbe\xd5\x6d\x67\x60\xa4\x31\xc7\xd2\x0c\x2d\xc6\xef\x1b\x73\xca\xa3\xc4\x94\x88\xe3\x0b\x1c\xa2\x52\x0a\xd2\x0b\x26\xa1\x97\x00\x78\x0e\x5e\xf3\xce\x01\x44\x38\x8d\x84\x07\xb6\xa7\x0c\x1c\xda\x37\xdb\x7f\x12\x09\x1d\x89\x2f\x2e\x91\xad\x40\x78\xbb\x4d\xb1\x76\x2e\x46\x28\x5a\x7b\x66\x4b\x2a\xd3\xa3\x4d\x26\xd8\xa9\x4d\x64\x58\x7a\x84\x52\x77\x22\xea\x83\xcb\x8a\xa8\x89\x84\xe1\x48\x97\x43\xb4\x21\x4e\xa6\x04\x1a\xa1\x8e\x55\x20\x09\x54\xef\xc7\xed\xb3\x19\xdf\x94\x7e\xfb\xfc\x6c\x8d\x0f\xea\x48\xa1\x31\x61\x34\x65\xd8\xf4\xc4\x94\x98\xf2\x26\x91\x45\xc6\xda\xe5\x04\x78\x05\x25\x98\xe1\xca\x3b\xe0\xe3\x36\x11\x57\x1f\xa3\x84\x77\x1e\xee\x40\x2c\xc2\xb1\xd8\x48\x36\xc8\xf1\xad\x28\xf2\xad\x23\xde\xe9\xff\x1d\x7e\x1f\x25\x21\x63\x58\x74\x11\x5d\xef\x4d\x93\xe8\x9b\xe7\x61\x80\xbc\x55\xf7\x61\x14\x43\x60\xa8\xb2\x22\x89\x2d\x64\xd1\x57\xcc\xb5\xd8\xf4\x85\x5d\xca\x56\x70\x14\x95\xa0\xe1\x00\x2d\x34\x0a\x4a\x46\x15\x6b\x9b\x7f\xe0\x6b\x7c\x07\x59\xe0\xb6\xdf\x55\x9b\x69\x1e\xde\x78\xb5\x5a\xf6\x4e\x7c\x8d\xd9\x08\xb7\x88\xdd\x6b\xa3\x5a\x90\x2c\x81\xdc\xeb\x37\x88\xb6\x15\xde\x22\x5a\xfa\x58\xa8\x11\x81\xab\x24\xa7\x37\x05\xee\x83\x8b\x6e\x86\x3f\xe1\xbc\xc2\x6c\x1b\x94\x32\x39\x23\x0c\x27\xc6\xb3\x97\xb2\x3d\x13\xde\x6a\x02\xc9\x7f\x36\x45\xda\x91\xd4\x13\xf9\x16\x47\x3b\x01\x8a\x61\x59\x4b\x6f\x51\xce\xa4\x44\x57\xda\x1e\x3d\xbb\xba\x6d\xe1\x68\x66\x65\x7e\x92\xef\x02\x02\x71\x8a\x84\xad\x03\x33\xe8\x33\x6b\x05\x2b\x00\x47\x33\xe8\xe9\x5e\xc1\x3e\x5f\x91\xb3\x80\x6a\x98\xd3\xdb\x72\x9f\xb7\x35\xb8\x14\x7c\x4a\x98\x2a\x2d\x5b\x4e\xfa\xe9\xc0\x9d\x0a\x9b\xf8\x91\xcb\xbc\x3c\x8f\x53\x1e\x76\xe4\x04\x4e\xc9\x1f\x4d\x7c\x5c\xf7\x73\x10\xe2\xb2\xcd\xe2\xe0\x7c\xcf\x3e\x0a\x19\xdd\x6a\xe1\xb3\xfc\xb2\xdf\x42\x18\x6e\x9c\x72\x92\x2d\x2d\x4c\xe5\x1b\x30\x6e\x81\xb1\x6c\xfc\xf8\xf0\x0d\x51\x3f\xbd\x2c\x52\x39\xb4\x5a\xfc\x65\x4f\x6f\xe2\x1a\xcb\x7e\x8a\x0c\x9a\xa8\x7b\x0b\x60\x50\x74\xdf\x95\x76\xa6\xdd\xd9\x00\xac\xa5\x67\x61\x7c\xb7\x96\x56\xb3\xb5\xec\xb9\xff\x68\xb2\xf6\x24\x1e\xd0\xd0\x24\xac\x27\xaa\x6e\xb4\x86\xb6\x9f\xdc\x0a\x0d\xb9\x20\x96\xab\xf8\x60\x02\xde\xc7\xaf\xd8\x47\xa0\x06\xa3\xf6\x95\x5b\x49\x56\x90\x53\xbe\x9f\x1d\x0a\x49\xb7\x93\xa5\x41\x1e\x59\x16\xf4\x18\xec\xab\x95\x32\x43\x55\x3b\x66\xe6\xba\xdc\x4e\x90\x9b\xe0\xef\x5c\xc7\xc6\xd2\x71\x99\xec\x3f\x21\x42\x3b\xc4\x57\x73\xfb\x40\xb9\x7b\x61\x18\x5b\x57\x08\x0e\x8f\x0b\x89\xa3\xea\x57\xc8\x44\x4a\xb2\x7e\xcf\x70\x06\xa7\x66\x04\x7e\xef\xf5\x4d\x85\x56\xcf\xed\x23\xde\xf1\xda\x2c\xc8\xae\xbb\x48\xc9\x4e\x77\x9e\x82\x03\xae\x2c\x90\x2b\x51\xde\x0e\xde\x04\x56\xfb\x73\xfb\x4d\x5f\x51\x4a\x4c\xeb\xc4\x7f\xec\x3f\x94\x84\x69\xa5\x45\xc6\xbc\x57\xb4\x13\x8d\xb3\x4e\x7c\xc0\x06\xde\x26\xef\x50\x7b\x54\xd2\x81\x47\x56\x7a\x8c\x29\xac\x1e\xce\xf5\xbb\x84\xfb\x99\xac\xeb\x23\xa2\x02\x94\xd7\x4a\x85\xae\x36\xb3\x34\x50\x66\x8a\x5c\x26\x09\xd3\xa9\x39\x34\x58\x6f\xf9\x0c\x3b\x6d\x27\x32\x9e\xee\xf3\xa7\x54\xe9\xa9\xcb\xd5\x61\x7e\xf3\xb0\x93\x97\xbd\xc9\x71\x37\x07\x66\x58\x9a\x12\xd8\x90\x05\x0d\x16\x51\x45\x8b\x3f\xc5\x33\xc8\x43\xbf\xfd\xf9\x75\x4d\x93\x2c\x4e\xd7\x61\x1d\x4d\x27\xc3\x2a\x08\x75\x55\xb5\xea\xa3\x7a\xe9\x0c\x49\x79\xef\x54\x29\x9c\x42\x0a\xb5\xe2\x9a\xe2\x84\x5d\x4d\xcf\x21\x78\x92\x0a\x86\x51\x75\xfb\x9c\xc0\xe6\xb8\xc5\x24\xb1\xee\x49\x58\x05\xd5\x17\xbf\xe0"}, +{{0x5c,0x69,0x2c,0x68,0x11,0x98,0xb1,0x72,0xdf,0x2f,0xac,0x2a,0xec,0x3f,0xcf,0x70,0x15,0xc2,0xbb,0x68,0x30,0xf2,0xa9,0x8e,0x30,0xa3,0x96,0xb6,0x4a,0xf4,0x28,0x0e,},{0x33,0xb1,0x69,0xd4,0xca,0x27,0x10,0x40,0x92,0x6e,0xa8,0x78,0x35,0xe5,0x06,0x6f,0x9f,0x05,0x78,0x2f,0x08,0x7f,0xca,0x7a,0x55,0x6f,0x7b,0xf4,0xcb,0xa2,0xe8,0x86,},{0xad,0x8f,0x37,0x9c,0xaf,0x41,0xf7,0x2d,0xcc,0xad,0xc3,0xe9,0x15,0x35,0x7a,0xb0,0xcd,0x30,0x4e,0x10,0xf4,0x12,0x0e,0x0d,0xbb,0xfa,0xac,0x01,0xbf,0xfa,0xf2,0xbe,0x89,0x3f,0x70,0x07,0x2d,0xc9,0x64,0x06,0x91,0x81,0xbe,0xc1,0x7f,0xe0,0x25,0x10,0x55,0xb2,0x1e,0x23,0xde,0xe4,0x36,0x3b,0x27,0xef,0x1f,0xff,0x67,0xaa,0xfe,0x06,},"\xb1\x60\xee\x3a\x93\xcf\x6b\xc3\x45\x6e\x5b\xd0\x19\x7c\x09\xaa\x76\xc2\x25\x80\x52\xf9\xa3\x4d\xbc\x2e\xd5\x89\xf8\xdb\xe5\xff\x99\x69\xa6\x1c\xfe\x84\x6b\x2f\x67\x39\xdc\x7d\x4a\x14\x96\xe9\xad\x58\x60\x5b\x5a\x27\x58\xca\x07\x8c\x55\xa9\xfc\x1c\x4e\xeb\x54\x91\xa8\x4b\xfd\x46\x8a\x2c\xeb\x14\x1a\x77\x34\x93\xa9\xb3\xee\x82\x8b\x5d\xde\x9c\x00\xc2\x36\xff\x01\x56\xe4\xe2\xe4\x5f\xa0\x79\x31\xda\x68\xbb\xd2\x03\x0a\x88\x14\x05\xc4\xf7\x87\x28\x81\x3a\x5e\x04\x81\x24\x04\xc2\xa1\x9c\x9b\x87\xb1\xcf\xe9\xaf\x95\xe2\x73\xec\xf9\xc5\x18\xc5\x39\x35\xf8\x42\x56\x3b\x19\x2f\xae\x12\xa7\x3c\xef\x08\x5f\xe1\x9e\x89\x9e\x5b\xa0\x89\x79\xe3\x11\xfb\x28\x6f\xbf\xc7\xb2\x48\xaa\xbd\x40\xdc\x61\x61\x0e\x1d\x4f\xc9\x80\x6d\xd2\x12\x92\x39\x2d\xb2\xdb\x40\x42\x6c\x5d\x19\x6a\x48\x9c\x5d\xb7\x7e\x3e\x9c\xf0\xbd\x04\x1e\x3c\x23\xb5\xba\x1d\xb7\x81\xa1\x07\x90\xbe\x1f\xe0\x7a\x2b\x00\xca\x3a\xf8\x9c\xbd\x46\xef\xce\x88\x0e\x1e\xf2\x8b\x0c\xd7\x9d\x53\xb4\x2c\xd8\x0e\xaa\x13\x7e\xff\x7d\xf9\x0b\xcb\xcf\x95\xc9\x85\x8d\xc0\xcc\xc6\xd8\xca\x8a\xe3\x54\x7b\xdb\xf9\xff\x90\x24\xf3\xcf\x17\x01\x15\xeb\x28\xbf\x12\xb7\xd3\xb7\x01\x46\x0f\x48\xd1\xb4\xb2\x3d\x7f\x6f\xf7\x2f\xfd\xc9\xa6\xc5\x26\x24\xd1\x53\x12\xd7\xf1\x9d\xdb\x60\x26\xa1\x5e\xb5\x42\x95\xd3\x31\xfd\x79\x50\x91\x03\xbc\x59\xa3\xb6\xe1\xba\x7a\xc8\xc1\x12\xe4\xde\x28\x17\xe5\x1c\x1e\x16\x50\x7b\xa6\x6f\x25\x47\xbc\x89\x9f\x69\xc1\x20\x7a\xe5\xe3\x7b\xdb\x0e\x16\x1b\x15\xb6\x12\x30\x5b\xc0\x94\x0f\x9d\x1b\x38\x2a\x37\xec\x2d\xa6\x39\xa6\xec\xba\x1b\xcd\xfc\x51\x21\x4c\x32\x23\xc1\x1b\xba\xb7\x9f\x3f\xae\x3d\x55\xe2\xd4\xbe\x58\x4f\xd7\x60\x1e\x4e\x2e\x55\x8b\x3b\xe5\x70\x71\x15\xa6\x1f\x5a\x81\x5e\xc2\x4a\xac\x18\x09\x34\x57\xbc\x46\xc0\x5c\xfb\x7a\x3f\x25\x33\xea\xda\xdc\x9e\x6c\x1f\xe3\x10\x77\x9e\x69\x7f\x68\x30\x35\xce\x57\x87\x3d\xf5\x5d\x79\x1f\x6d\x2f\xb0\xe2\x10\x7e\x68\x66\xf8\x39\xc3\xa1\x26\xe9\x02\x38\x65\xce\xd1\xbc\xf6\x77\x99\x55\xaf\x54\x7e\x1d\x87\xeb\x32\xa9\xbf\x32\x28\x57\xfd\x12\x6b\x0c\xdc\x5d\x5e\x90\x4e\xb7\x6c\x67\x06\xe3\xc8\x97\xae\xfd\x6e\x47\x56\xfb\x8a\xca\x81\x70\xca\x5b\x39\x66\x90\x89\xaf\x1b\xb1\x41\xa2\x5d\x6b\x8b\x06\x03\x4d\x8b\x11\xab\xf1\xff\x8f\x8d\x43\x37\x58\x46\xfa\x8f\xa8\xa3\x4b\x5f\x26\x48\x20\x74\x4d\x31\x14\x9b\x7d\x57\x32\x6c\x59\xb1\xdb\x74\x13\x16\x78\xf6\x34\xe7\x23\x2c\xa5\xea\x51\x88\x76\x0a\x70\xdc\x35\xdc\x89\xf8\xe4\x53\xb4\xc6\x5b\x77\x2c\x2b\x6b\x62\x76\x8d\x83\x73\x23\x65\x51\xba\xaf\x24\xd3\xc3\x04\xc4\x1b\x62\xc3\x6e\x6a\x33\x83\xb3\xa1\x63\xb7\x3e\x78\xd8\xba\xdb\x75\x74\x1e\x50\x01\xd4\x19\xd3\x0e\x2e\xd7\x7c\x30\x96\xe8\xd8\xdf\x71\x3b\x93\x76\x2c\x97\x07\xbd\xd0\xf3\x65\xa8\x74\xb9\xda\x8a\xb7\x10\x49\x5d\xd5\x6a\xea\x93\xbb\x77\xfb\x22\x26\x35\xc6\x3b\xce\x9f\x63\xaf\x91\xfa\xc8\x9c\x66\x98\x6b\x8e\x21\x76\xdd\x45\x1d\x58\x33\x94\xc1\x90\x7c\xba\x17\x25\xf0\x6d\x25\xd1\xd0\x91\x2b\x3e\x5c\x6c\x7d\xcd\x34\x35\x8f\xad\x59\xdb\xc6\xf6\xb1\xc2\xef\x33\xd3\xca\x82\xf4\x35\x18\xfe\x4f\xf3\x13\x78\x01\x6e\x57\x8a\x7b\xab\x0b\x77\x67\x6e\xba\xe0\xd4\x8d\x08\x89\xd6\x90\x29\xd2\x09\xf2\x83\xce\x8f\xe0\xec\x23\xcd\x83\x2a\xdc\x12\xa9\xc3\xe3\xae\xc2\xd6\x03\x66\x95\x55\x6d\x93\x13\xf1\x2a\x89\x9d\xd5\x9a\x66\xbe\xf2\x8e\xde\x17\x5f\x8a\xae\xee\xb2\x94\x2b\xb9\x08\x92\xa0\x4b\x44\x0d\x04\xb6\x6f\x5e\xef\xf6\x1a\xda\x72\x79\x02\x94\xce\x55\xc8\x6c\x6d\x92\x78\x5d\xdd\x26\xc7\xa7\x31\x60\x3b\x06\x9c\x60\x3c\x92\xe4\xfe\x8f\xf7\x82\x54\x4c\x8e\x89\xb4\x0b\x8b\x55\xf9\x0e\x2a\x5e\x9a\x0f\x33\xc7\xfe\xc7\x7d\xad\x81\x52"}, +{{0x9d,0x5f,0x85,0xd2,0xe7,0xdf,0xd0,0x3b,0xb6,0x89,0xd9,0x00,0x28,0x5f,0xd4,0x46,0x15,0x38,0xa5,0xf2,0x71,0x0a,0x13,0xed,0x21,0xc7,0x75,0xf6,0xef,0xf6,0xb3,0xff,},{0xb8,0x67,0x97,0xe4,0xbe,0x02,0x86,0xae,0x39,0xe4,0x4d,0xf0,0xa0,0x0c,0x01,0x6d,0xb4,0x55,0x5e,0xf8,0x6f,0x2f,0x05,0xd0,0xa3,0xed,0x89,0xd8,0x9a,0x4c,0x3e,0x5e,},{0x17,0x6b,0x95,0x92,0xf8,0xc2,0x51,0x35,0x29,0x2a,0xdd,0x4d,0xaa,0xcc,0x9c,0x4f,0xaa,0x21,0xd4,0xf4,0x9b,0x27,0x84,0x80,0xc4,0xe8,0x88,0x1c,0x01,0x62,0x4d,0xf9,0xa3,0x7e,0x23,0xe1,0x8e,0x84,0xca,0x32,0xd0,0xd8,0xcb,0x85,0x10,0x54,0x22,0x2f,0x10,0xa4,0x95,0x41,0x9f,0x19,0x7e,0x7b,0x3d,0x18,0xdf,0x0a,0xdf,0xb1,0xb3,0x07,},"\xf7\x0b\x5b\x05\x3a\x46\x72\x51\x2c\x24\xb3\x16\x83\x92\xf6\xa1\x7d\xd7\x7d\x86\x89\xc2\x1c\x86\xef\xc2\x58\x29\xa1\xa0\x4f\xab\x4f\x76\xc8\x52\x16\x84\xd3\x20\x10\x45\x59\x07\xa2\x69\x08\x67\x7b\x40\xdc\x69\x47\xd6\x54\xf2\x91\x4c\x30\xec\xee\x72\x4f\xa6\x84\x46\xb5\x9d\x09\x1e\x25\x8f\xc8\x62\x41\x1c\x96\x4d\x66\x8d\xef\x83\x03\x4b\x62\x7e\xd4\x16\xdc\x19\x0b\xb5\xa2\x63\xa6\xff\x8d\x55\x9e\x13\xb8\x93\x62\x25\xfb\x4d\xab\x4f\x7b\xda\x04\x68\xe5\x47\xe7\x08\xcb\x04\xce\xbe\x1e\x5c\xfc\x69\xf7\x6a\x1d\x28\x3f\x28\x16\x82\x86\xf2\x4e\xce\xa5\x53\x5e\x44\x90\xa0\xc5\x55\x67\xa7\x34\x5e\xf9\x53\xce\x42\x6b\x20\x9a\x3d\xe3\xdf\x59\x5e\x80\xee\x61\xe5\x72\xa2\x78\xab\x02\x21\x95\x51\xb7\x3d\xa4\x19\x84\x80\x82\x85\xa8\x35\x98\xa0\x2d\x9b\x28\x67\x12\x10\x00\x4e\x31\xd8\xaf\x92\x42\xc1\x6f\x90\xd5\xea\x8f\x63\xa1\xff\x66\xcf\xe6\x0e\xcb\xe5\x37\x24\x5f\xa1\x2a\x9b\x15\x41\x15\x29\x58\x06\xea\x2d\x11\xf3\x67\x17\x82\xb9\xaf\x4f\xa8\x6a\x12\x88\xe1\x23\xcf\xd2\x40\x9a\x5d\xc9\x8f\x41\xb8\xf6\xdf\x29\x9b\xbc\xc4\xbb\x64\x47\xdc\x03\xa6\xd6\x0e\x9b\x2c\x5b\x8f\xfc\x40\xd9\x83\x95\x6b\xe9\x77\x68\xdd\x06\x12\xd4\x7c\xbf\xa7\x57\x1c\x99\x69\x85\x6c\x15\x2c\xd3\xb4\x73\xac\xe0\xb8\xa1\x44\xaa\xc2\x09\x5c\x0f\x72\xf1\xd3\x14\x71\x52\xb9\x08\xef\x66\x26\xd5\x22\x28\x19\xb2\x0b\xb3\x35\x0a\x46\x45\x2f\x67\x54\x90\xc2\xa8\x21\x50\xee\xc4\x0d\x75\xb6\x6a\x32\x5d\x6e\x92\x9a\x90\x5a\xde\x1e\x31\x60\xab\x95\x01\x81\xef\xc6\x6e\x59\x23\x08\x65\xd5\xe5\x99\x69\x8a\x8a\x3f\xf5\x60\xc4\xc6\x01\xa7\xa9\xa5\xda\x3b\x5d\x89\xbc\xa9\x3f\x7c\xf5\xbc\xf5\xbd\x5e\xcf\xf8\xf1\xa1\x85\xc8\x22\x0e\x4c\x77\x82\x1e\x62\xad\xf9\x5a\x03\x7f\x2d\xf7\xce\xf4\x3a\x4c\x60\xac\x75\x80\x1e\x9f\xcc\xdc\x5b\x08\xee\xd3\x28\xdd\x93\x10\x09\x04\x11\x56\x45\xec\x1e\xe0\x85\xcc\x77\x8b\x0f\x4e\x46\xe1\x72\x98\x98\x4a\x70\x2e\xce\xb3\xe1\x52\x83\xd8\x20\x00\x4f\x74\xa0\x79\x52\x0d\x63\xa7\x5f\xae\x33\xec\x3f\x4b\x83\x64\x69\xe1\xaa\x99\xea\x24\x4a\xf1\xfb\x08\xb0\x0a\x8c\x9d\xfd\x03\x30\x8d\xfc\x20\x23\x5e\xa9\xc8\x28\x3f\x4d\xa4\x7c\xfb\xcd\xbd\x03\x1a\x02\xd1\x64\x16\x0f\x2a\x58\x98\x67\x00\xb1\x95\x26\xd4\x1e\x4d\x7f\xd4\x58\x43\x4d\x72\x64\xbc\x8e\xb6\x42\xe6\xd8\xdd\x27\x59\xce\x2b\x85\xc9\x7b\x37\x02\xe7\x0d\xa7\x1f\x18\xed\xc5\x3e\x91\x40\xa6\x45\x62\x7e\x02\x78\xe8\xe7\x05\x39\x03\x74\x84\xdc\xd1\x8c\x62\xfa\x33\x07\x17\xd6\x14\x8a\x0d\x62\x3f\xf8\xb6\x5e\xa8\x56\x7e\xc7\xfa\x04\xc8\x92\xe3\xa1\xec\xee\x96\xe8\x32\xf4\x15\x50\x74\xc8\x3c\xbc\x93\xe9\x8c\xc6\x7f\x1f\xa1\x12\xaa\x06\xe9\x91\x5f\xa4\xd2\xde\xa9\x31\x55\x1e\x7c\x62\x3a\xa8\xa3\xa7\x61\x9e\xa2\x4f\xf9\x14\xe2\x64\xf3\x1f\xc7\x3d\xfa\x8c\x43\x0a\xc4\x6c\xe1\x6d\xc9\x68\xc5\xa4\x08\x5d\x5c\x38\x0d\x30\xcd\xc6\xf4\x3d\xee\x80\x6f\x38\xd1\xdf\x42\x0a\x06\x55\x74\x14\x47\x37\x05\x6d\xaa\x62\xf0\xc0\x98\xc9\xc5\x2f\xcc\x04\xcc\xa6\x42\xc4\x5d\x68\x73\x45\xa0\x94\x61\x3d\x4a\x3c\x6c\x87\x88\xbf\xa2\x18\x53\x8a\xd7\xec\xe1\xbd\xb6\xc9\x39\x24\xee\xc4\xba\xaa\x3e\xb1\x5d\xc1\x49\x4d\x65\xff\xa1\xa2\x3f\xf8\xe9\x85\x26\x34\x08\xfb\x02\xbf\xe3\x9a\x8c\x55\xb3\x00\xb1\xa0\x2e\xd3\x6c\x67\x14\xdd\x5a\xb7\x50\xd4\x7f\x02\x1f\x65\xe0\x8c\x63\x5f\x1d\x6b\x7b\xaf\x39\x6c\xb4\xf9\x3d\x56\xc1\xca\x46\x1b\xb1\x2e\x94\xde\x7e\x5d\x98\x65\x9a\x8a\xf0\xbf\x01\x9f\xc4\x22\x80\xe1\x11\xe0\x48\x00\xff\x80\xe0\xc1\x57\x15\x0e\x16\x56\x09\x45\x42\x81\xb2\x00\x07\xe3\xed\xfa\xa1\xea\x85\x44\x65\x54\x7a\x00\x6a\x4c\x32\x36\x41\x14\x95\xda\x16\x60\x98\xaf\x28\x23\xa4\x59\xcf\x10\x0a\x1f\x3c\x92\xc6\x39\x0c\x60\x66\xcd\xbf"}, +{{0x4a,0xaf,0x2d,0x13,0x28,0x84,0xf3,0x0d,0x11,0x27,0xcf,0x18,0x7e,0xe0,0x93,0x88,0xb4,0xa5,0xc4,0x4a,0x9a,0x92,0x67,0xe6,0x72,0x83,0x17,0x39,0x89,0x51,0xfb,0x61,},{0x83,0x72,0x7e,0x92,0x57,0x34,0x91,0x28,0x55,0x9e,0xbf,0x75,0x9f,0xdc,0x82,0x12,0x2c,0xce,0x76,0x74,0x66,0x39,0xc0,0xad,0xa9,0x76,0x1f,0x0d,0x60,0xb9,0x40,0xb1,},{0x5f,0x11,0xdf,0x39,0x06,0xa7,0x12,0xa9,0x53,0xf4,0x7c,0x85,0x98,0x06,0xb5,0x23,0x73,0x58,0xd0,0x8b,0xa9,0x5e,0x49,0xf9,0xe5,0x30,0xa3,0x71,0x65,0x83,0x5e,0x93,0x59,0xd9,0x76,0x9d,0xc2,0x1f,0xbb,0x4d,0x44,0x49,0x7b,0x93,0x90,0x5b,0xca,0x8d,0x99,0x17,0xc7,0x28,0x49,0x3f,0xee,0x3a,0xcd,0x5b,0x52,0x1d,0xbd,0x1e,0x24,0x08,},"\xd7\x3e\xaf\x11\x41\x3b\xf4\xd5\xbc\xcf\x6a\x2e\x80\x9c\xd6\x83\x2a\x51\x82\x3a\xa2\x2b\xd1\x6e\x09\xcf\x56\xff\x04\x5e\xef\x2d\x1a\xda\xdd\xa5\x0c\x2e\xbd\x67\xbb\xc4\xd7\x0e\x49\x3c\x96\x8c\xb4\xde\x49\x77\x06\x5d\x44\x63\x30\x06\x94\xc9\xca\xa5\x72\x06\xd6\x66\x46\x93\xd8\x46\x2c\x3c\x57\x6b\x52\x5c\xc7\xac\xf7\x9f\x26\xf9\x05\x5a\x1b\xcf\xa7\xd0\x77\xf4\x5e\xbe\x0b\x2d\x48\x1e\xbd\x63\xf7\x34\x0a\x33\xe4\xab\x68\xf1\x60\x49\x75\xec\x1d\xfe\xc4\x5a\x79\x1a\x2a\xbb\x10\x44\xd7\x5a\x4d\xb5\x5a\xdf\x59\xb8\x39\x4e\xbd\xe6\x82\x4c\x21\x14\x5b\x00\xef\x3b\x1b\x08\xed\x11\xfd\x51\xdd\xa5\x14\xed\x7e\x21\xe5\x4d\xba\xf6\xab\xb6\xd9\xe3\x17\xfc\xf9\xfd\x37\x5b\x18\x76\x4e\x64\xac\x9b\xe5\xb0\x8f\xec\x3b\x78\xab\xba\xb1\xd1\x2a\x2a\xb0\x9d\x55\x9a\xcd\xc7\x13\x3f\xb2\xe0\x00\x8e\x0c\x11\x4b\x7c\xad\xb4\xbf\x76\x30\x78\x67\x4d\x03\xe9\xc8\x07\xbe\xc1\xe2\xca\x71\xad\xcd\xaa\x31\x0d\x58\x7f\xa5\x69\x50\xfc\x0f\xb2\xe9\x79\x04\x3d\x50\xf9\xae\x23\xfa\x8f\x82\x1c\xd9\xd6\x23\x27\x89\xd0\xee\xcc\xfc\x4f\x47\xe3\xad\x80\x4e\x25\xcf\x5a\x42\x5f\x94\x37\x7d\x17\x87\x48\x33\xe6\xae\x36\x38\x17\x8c\x78\xb7\x95\x19\xd6\x4d\x97\x93\xf4\x50\x46\x06\xa0\xea\xb6\x87\x07\xf6\xe1\xf7\xcc\xcb\x51\x5b\xe3\xd1\x20\x1b\xcd\x19\xf2\xf0\xe2\x55\xc7\x22\xea\xb1\x2b\x43\xaf\xf8\xc8\xc5\x56\x11\x25\xfb\xca\x1f\x65\x42\x07\x6a\x06\x15\x2e\xb7\xe4\xb0\x78\x63\x24\xc2\x49\x5e\x79\xd7\x9c\x0a\x8e\x29\x5b\xb2\xe3\xdf\xd0\x5a\x90\x33\x19\x00\x65\xa2\x84\x55\x2a\x6e\x73\x60\x06\xac\xe4\x1f\x97\xcc\x43\x4a\x25\x12\x05\x1b\x72\x7c\xe5\xbc\x9c\x4a\x75\x52\x9e\xc5\x3d\xd7\xd1\xf1\x26\xe7\x93\x85\x77\x47\xb5\xba\x8d\x03\x15\x5d\x45\x55\xf5\x9e\x8b\xaf\x2f\x0c\xdb\xa8\x71\xac\x16\x0e\x75\x19\xa8\x52\xdb\x00\x4f\x70\x16\x41\xa4\x0a\x42\x2d\x4c\x38\xb6\xc0\xc3\xcc\x8f\xbb\xd0\x53\x22\xdd\xc0\x00\x1f\xb8\x67\x28\x6e\x29\x6c\xbd\x69\x86\x2c\xbc\xcc\x74\x47\x03\x8e\xb3\x0f\x8a\x81\x23\xb7\xb3\x13\x73\x98\x47\x02\xc3\xbe\x45\x7a\x4b\x8c\x54\xe6\xe5\x28\x04\x85\xa2\xc4\xff\x84\x52\x1f\x29\x8d\xde\xb3\xb3\xb2\xbc\x91\xf1\x14\xdd\xce\x67\x03\x02\x48\x04\x44\x69\xdc\x06\xf3\x62\xf2\x91\x9a\x3f\xec\xe5\x08\x23\x75\xd0\x40\x80\x37\x6f\xe2\x19\xd9\xb4\x57\x5b\x1c\xf1\xc9\xec\x4d\xca\xc5\x74\x9f\xc7\x78\xf5\x15\xdd\xa1\x3f\xa0\xd5\x86\xc2\x64\xb9\xbb\x61\x50\x33\x10\x76\x2c\x78\x9c\xa1\x16\x08\xd2\xfe\xe6\x74\xc7\x0a\xc4\xfc\x6d\x5e\xbc\xf6\x8c\x4a\xb8\x9b\xd8\x45\x55\xfc\x00\x75\x23\xc2\x8a\x7e\x1d\xd0\x8a\x98\x62\x04\x4d\x52\x45\xb9\x1a\x87\x78\xec\x9e\xe9\x84\xa4\x1a\x9e\x13\xb7\xab\xd6\x57\xae\x2a\x46\xae\x86\x01\x52\xc6\x44\xac\xd9\x53\x67\x67\x8f\xf6\x4c\xc5\x40\x06\xe3\x66\x14\x80\x5e\xd6\x18\xa7\xc6\xd0\xfd\x33\xa9\x08\x52\x30\x90\x84\x1c\x23\x0a\xf0\x98\x46\xd1\x32\xbb\x4c\x6b\x60\xe2\x44\x1f\x9d\x3c\x49\x87\x14\xf4\x70\xf6\xbc\x03\xa8\x0d\x14\xa2\x94\xb5\x65\xd1\xd5\xe7\x81\xcf\xfc\xb1\x30\x4e\xfd\xbb\xc7\xbf\xea\xbd\xed\xc8\x57\xac\xc4\x2e\x27\x62\xbb\xf9\x7a\xf8\x39\xa1\x66\x75\x2d\xa2\x95\x67\x28\x17\xf1\x0d\xbd\x47\x2d\x38\x1f\x53\x16\x55\x55\xac\x82\x22\xa7\x85\x35\xa8\x68\x05\xf1\xbe\xd4\x22\x88\x9f\x20\x61\x09\xaa\x74\x77\x2e\xdc\x0b\xb5\x1e\x8a\x98\x40\xcf\x62\xc9\x2f\xa6\x35\xb9\x0c\xae\x07\x6d\xd5\x0e\x5a\xed\x9d\xea\xc8\x43\xfa\x8a\x6b\x53\x99\x88\x28\x5f\xf1\xad\xab\xe4\xc7\xb8\x3d\x9e\x29\xac\x2d\x94\x09\x2d\xaa\xfe\xc9\xf6\x67\x36\x89\xba\x9e\x92\x52\xd8\x64\xd7\x57\x7a\xa8\x95\x05\xd3\x31\xfe\x78\x09\x86\x12\x77\x00\x2a\x0b\x44\xa9\x6b\xa6\xae\x4a\x52\xb3\x54\x8b\xf2\x68\xe7\x77\x78\x0c\x00\x20\x9b\x24\x5f\x8b\x14\x17\xee\x5e\x70\x1a\x12\x33\x4a\xd5"}, +{{0x4b,0xc7,0xda,0xab,0xc5,0x40,0x7c,0x22,0x6d,0x19,0x20,0xdb,0x4a,0xfd,0x21,0xb2,0xa5,0xb3,0xe5,0x9b,0x8e,0x92,0x46,0x05,0x3f,0x6a,0x1a,0x6a,0xfa,0x54,0xe7,0xe7,},{0xdc,0x53,0x98,0x85,0xfc,0x7b,0xee,0x00,0x2a,0xc5,0xde,0xba,0xe1,0x6b,0xdd,0xbe,0x4b,0x55,0x3f,0xa1,0x5e,0x81,0xee,0x79,0x88,0x76,0x94,0x0f,0x38,0xcf,0xc4,0xc5,},{0xa7,0xa6,0x48,0x88,0x39,0xbb,0xae,0x04,0xde,0xc9,0x2f,0x96,0xd7,0x28,0xc4,0x64,0x68,0x5d,0x7a,0x96,0xdf,0x51,0x2b,0x00,0x51,0x16,0x3d,0x22,0x53,0x8f,0x74,0x54,0x6f,0xa9,0x86,0xb1,0xb6,0x0a,0x6d,0x8c,0xc7,0x66,0xa2,0x6c,0x69,0x84,0xc9,0xcd,0x26,0x88,0x39,0x58,0x98,0xe2,0xb2,0xae,0x72,0xdc,0x6a,0x2d,0x5a,0x9f,0x75,0x0e,},"\x6a\xcc\xe9\x98\x43\xb2\x41\xaf\xe6\xed\xd5\xd0\xab\x78\xd0\xfb\x21\xc8\xc3\x5a\xff\x88\x13\x89\xd5\x05\xf2\xf1\xdd\x91\xaf\x1e\xb2\xad\x22\x92\x54\x92\x7c\x7f\x0e\xcf\xb7\xa8\x14\x16\x90\x57\x3a\x65\x5d\x69\x85\x3d\x74\xd0\x70\x8b\xf8\xb1\xe6\x0a\x03\x96\x30\x28\xa6\x25\xb7\x9f\x3d\xfe\xa2\xb1\x13\xff\xca\xb4\x6f\x3c\xfd\x4a\x62\x1e\x8f\xd8\xff\x0a\x96\x81\x43\xb0\xae\x03\xcc\xb6\xf4\x2e\x25\xe2\xd7\x4d\xbf\x51\x5b\xc3\x58\x69\x9b\x63\x50\x09\xb0\x1d\x61\xfe\x59\x7f\x1d\xc2\xc3\x5a\x7b\xa4\x55\x52\x78\xee\x0e\xa4\x56\xc7\xd3\x5f\xa8\x75\x7a\x41\x79\x24\xb1\xd0\xa8\x35\x1f\x22\x6a\x13\xec\x29\xd0\x25\xb4\x26\x96\xec\x1d\x99\x25\xb7\x69\xcd\x59\xc8\xe2\xf9\xcd\x3c\xe4\xe5\xc0\x20\xe0\x51\xe7\xa3\x6f\x3f\x97\xc1\xe8\xec\x71\x97\x4b\xc1\x6a\xc4\xde\x46\x51\xad\x4d\xf2\xe9\xc0\xee\xd6\x86\x92\x42\x24\xfe\x6d\xe6\xc6\x0d\xd4\xac\xc2\x6e\x0a\xab\xd8\x0c\x21\xd5\x09\xd9\x59\xb8\x0b\x43\x53\x95\x8d\x00\xe4\x4c\x51\x1d\x23\xbc\xf4\x45\x52\x60\x8b\xfa\x56\xa9\xc5\xae\x79\xde\x62\xbb\x23\xf1\x1d\x74\x0f\x48\x24\x0c\x27\xe1\x01\x99\x97\x51\xf2\x53\x47\x42\xc0\xa6\x91\x3f\xf6\x4b\x68\x3a\x18\x99\x5a\xbc\x39\x3f\xeb\x9d\x57\xc7\x1f\x49\xa0\x80\x55\x72\x98\xcc\x40\x5d\x11\xb7\x98\x8d\x71\x16\x84\x0c\x5a\xda\xf5\x3b\xc6\x72\xb4\x69\x23\xcc\x45\x7c\x70\x39\x94\x0a\xd4\xd5\xbf\x07\x3c\x6c\x88\x6b\x13\x39\x52\x59\x26\xd2\x81\xdb\xd1\xa7\x97\x39\xb2\xe3\x64\x14\xcb\xd3\x21\xb1\x85\xfc\x88\xf1\x8d\x2f\x81\xc8\x09\x97\x5b\xe9\xa0\x93\x64\x4c\xc5\x59\xed\x2a\xe5\xcc\x0e\x35\xcb\xdd\x18\x11\xf7\x02\x86\x05\x7a\x3f\x70\x30\x67\xed\xdd\xf5\xeb\x16\x90\xa7\x42\x7b\xb7\x3f\xe3\x02\x4e\xd0\xdb\x82\xa5\xce\x8f\x17\x16\x42\x8a\x76\xfd\x29\x2b\xa9\x9a\x30\x0c\x4b\x2f\x36\x0d\xa2\x12\x46\x17\x59\x0b\x10\xe3\xb1\x62\xa6\xe6\x7d\xd5\xd5\xa5\x9b\xcc\xa1\x0f\x61\x0f\xa0\x64\xaf\xfd\x55\xf8\x48\x3b\x98\xa6\x8d\x07\x6f\x27\x8a\xbf\x88\x8a\x08\xa0\x14\xe0\xea\x49\x91\x80\xfb\xc7\x98\x40\xce\xed\x13\xcc\x6b\x24\x58\xbf\xab\x9b\x0d\xd7\xae\x9d\x86\x46\x1f\xe2\x15\xe7\xc9\xf6\x3f\x76\x8c\xee\x4a\x88\x2d\xf0\xdd\x84\xe3\xeb\x4f\x2d\x7f\x6b\x18\xfa\x57\xd8\xbc\x7d\x9a\xfb\x63\xc2\x1a\xc4\x65\xe7\x90\x3b\x9b\xfb\x86\x38\xa2\x93\x61\xf7\xeb\xfc\x6e\x54\xe5\x46\x5a\x6c\xef\x46\x3a\xe2\x26\x43\xae\x41\x02\x58\x77\x9c\xa7\x4b\x70\x40\x1a\x94\x55\xa4\xd1\x57\xd7\x4a\x70\x29\xef\xe6\xb5\x19\xa8\xc4\xbe\x69\x67\x56\xe0\x45\xae\x40\x81\xb7\x7d\xd6\x03\x1f\x0d\x25\x0f\xa7\x61\xe6\x0f\x85\x9d\x90\x63\xfc\x10\x5a\xa0\xa1\xa7\x45\x0a\xf1\x53\xe7\x05\x47\x77\x77\xc4\x42\x58\x6d\xf4\x07\x40\x2b\xa2\x38\x75\x2f\xae\xf7\x4f\x33\x45\xc2\x6a\x45\x33\xbe\x9a\x61\xf5\xfc\x6b\xde\x48\xe3\xcb\xa7\x5c\x04\xd6\xf7\xb3\x33\xe3\x70\x06\xdd\x0c\x94\xfd\x3b\x6a\x13\x0b\xd6\xfc\xdb\x3c\x6a\xbe\x21\xca\x60\xeb\x43\x1c\xc2\xd8\xa2\xec\xe7\x16\x9d\x2d\xcf\xce\x27\x60\x82\x56\x57\xfd\x4c\x26\xf3\xc3\xb8\x30\xac\xdf\xd5\x08\x01\x1d\x14\x76\x4b\x3b\xe9\x17\x15\x57\x1a\x31\x83\x01\x8e\x0d\x22\x1f\xb9\x53\x2b\xb2\xe1\x71\x1e\x72\x5a\x27\x3a\xe0\xcc\x2f\xac\xcb\xa7\xd5\x50\x49\x29\x45\x9c\x99\x25\x17\xb0\x5c\x1d\xdd\x03\xaa\xcc\xd9\x37\xb8\x6e\xb6\x7b\xc8\x20\x2d\x01\xca\xb3\xd4\x89\x58\x6e\xea\x1a\xcc\xa7\xdc\x20\xcd\x0b\x64\x75\xc2\x58\xff\x67\x36\x61\x49\x6a\x22\xea\x96\xb8\x9d\xb4\xbf\x3f\xca\xae\x3b\xb0\x4f\x67\xdb\x09\x6a\x47\xff\x7e\x1e\xe2\x39\x56\x2d\xc1\x0d\x40\xf0\x53\x94\x4f\x3d\x7b\xcc\x3f\xf4\xc0\xff\x76\x56\x54\xba\x5e\xa6\x4f\x0e\xa6\x3e\x45\xa2\x1d\x9b\x12\x94\x9f\x14\xf7\xea\x70\x74\xe9\xb6\x59\xc5\xc5\xd4\x48\x16\x84\x2d\xe8\x96\x98\xa8\xfc\xca\xce\x43\xeb\x6b\x41\x35\xe0\xb3\x33\xac"}, +{{0xf2,0x6a,0xf2,0x10,0xe3,0xb2,0x01,0x73,0x99,0x0c,0x77,0x45,0x92,0x2c,0xdf,0x94,0x24,0x77,0x3a,0xbb,0x37,0x4d,0x77,0x7a,0x51,0x2c,0xf5,0xb9,0x7b,0x3a,0x00,0x0d,},{0x54,0x58,0x6a,0xbf,0x04,0x11,0x76,0xe0,0x6a,0xec,0x5b,0x60,0x10,0xe1,0x90,0x91,0x6d,0xa5,0x4a,0x8c,0x4b,0xde,0x28,0x8c,0xf2,0x4d,0x8c,0x10,0x7c,0xb3,0xb7,0x30,},{0xce,0x45,0x45,0x30,0xb9,0x22,0xba,0x5e,0xa1,0x62,0xf1,0xa4,0x52,0xe0,0x5c,0x00,0x36,0x3a,0x49,0xa9,0xdb,0x8a,0x56,0x94,0x97,0xc0,0x0c,0xaf,0x1c,0xbe,0xa9,0x91,0x80,0x77,0x05,0x54,0xed,0x4e,0x31,0x40,0xdf,0xca,0x45,0x55,0x15,0x9e,0xbf,0x48,0xef,0x5d,0x2a,0x50,0xf3,0x94,0xae,0xbd,0x78,0x21,0x16,0xed,0x65,0x69,0xa4,0x09,},"\x88\xe2\x6d\xa3\x5c\x54\x88\x4b\x47\x14\x6f\x4e\x3f\x01\x4a\xb6\x5b\x3d\x71\xaa\x7e\x3c\x33\x91\xad\xbe\xb1\x9e\xf2\xe7\xb9\x30\x2e\x28\x19\x91\xb2\x61\xb6\xa0\x99\x2e\x2e\x89\xa4\x9f\x48\x0c\xa2\xd8\xe6\x84\xb1\x2f\x9b\x15\x09\xb3\x8f\x6a\x7a\x98\xa5\xdd\xb4\xc2\xd8\x69\xfd\x03\x18\xe9\x8e\xcd\x8f\xd9\xdf\x49\x1b\xaf\x99\xa9\x29\x4d\xe4\x9e\x1c\xf8\xdd\x41\xee\x85\x73\x0a\xf0\x25\xa7\x01\x14\x3e\x4f\x0c\x8e\x3d\x92\xd5\x5b\x59\xca\x7d\x4a\x6c\x89\xad\x76\x0d\xff\xc0\xc2\x18\x92\x09\x50\x8e\xf6\xc2\x21\x4e\xdf\x99\x67\xb1\x7d\xef\x12\x3d\x86\x92\xc9\xe4\xe2\x0b\x1e\x98\x26\x88\x08\x70\x4f\x5f\x9f\xe1\xa6\xd6\x05\x5e\x32\xc8\x72\x56\x4b\xd1\x7e\xdb\x73\x59\x57\x86\x29\x01\x7f\x0c\x30\xfe\xab\x8b\x50\x4e\x22\x89\x23\xad\xc7\xe8\x1a\xe2\x0a\x85\x2d\xb0\xad\x67\x6a\x78\xe0\x81\x33\x6d\x6b\x04\x02\xf9\xcd\xc5\xd5\xe9\x01\x28\xca\x94\x5d\x10\x51\x5c\xa0\xc5\xef\x03\xf7\x31\xb1\xd4\x0a\x71\x07\x41\xd4\x1c\x1d\xd1\xca\x16\xb1\x06\x0f\xeb\xf2\xa0\x53\x2e\x6f\x5d\x76\x51\xef\x44\x63\x75\xec\x18\x09\x0c\xb8\x41\x8b\x82\x02\xf2\x5a\x03\x89\x03\x1b\x30\x7f\x22\x3c\x5b\x5f\x6a\xfe\x36\xa9\xad\xc1\x06\x8f\x2c\x6e\x0e\xa5\xb2\xb6\xcf\xeb\x8d\xc0\x04\xf7\xb8\x29\xc8\x04\x39\x06\x9b\x81\xa7\xbd\x90\x74\x77\xc6\x13\x5e\xf2\x82\xb7\x71\xf1\x41\xdb\xe7\x5a\x0f\xa0\x56\xe0\x6b\x8a\x1a\x1f\x98\xc2\x5f\xa5\x4d\x14\xc8\xfd\xb4\x2d\x65\x02\x59\x5c\x59\xd2\x5b\xac\xf1\xa1\x9a\xde\xfc\xc1\x31\x70\xf7\xa4\x31\x7b\x6a\xb6\x10\xb6\x09\xd4\x14\xb0\x07\x3e\xa0\x4a\xc2\x9e\xb1\x0e\xe7\x3c\xd7\x1a\x4c\xa6\x04\x09\xf8\xe7\x60\xe6\x0f\x93\x95\x10\x10\x0d\x0c\x8c\xd7\x6f\x26\x4b\xb3\x78\x11\xf9\x7a\xa5\x29\x9a\xc0\xb1\x2d\x41\x68\xff\x38\xec\xdf\xa8\x0b\x1e\x5c\x1b\x3b\xbd\x4d\x40\xd3\x54\x47\x35\xdf\x71\x67\xeb\x15\x8a\x9a\x9a\x23\x4d\x44\x5f\x1d\x66\x3d\xed\x71\x71\xed\xc6\x8d\x17\x2c\x92\x21\x4b\x82\xef\x13\xfe\x6b\x8c\x43\xaa\x89\xb7\x39\xb4\x99\x0a\xe9\x47\xa3\x4f\x02\x0a\x8d\x89\x43\xb0\xf7\xa5\xd6\x1d\xfa\x76\xad\xde\x02\x72\xe9\x8c\x11\x59\xc0\xfd\x8a\x1d\xe3\x3f\x2c\xef\x8e\xdd\x32\x85\x7b\x21\x89\xed\x96\x12\x80\x57\xeb\xde\xa8\x1f\x7a\x3a\x3d\xff\xe1\x89\x3b\x5b\xa8\x77\x55\x6c\x90\x38\x3f\xa2\xc5\xa6\xfd\x68\x0e\x8a\x67\xde\xe4\x80\x2d\x90\xdf\xe9\x71\x62\x3a\x7b\xe2\x2a\xb3\xca\x56\x06\x7b\x1e\x5c\x69\x4a\xa8\x4c\x19\xf1\x6d\x69\xe2\x84\xdd\xfa\x03\x9c\x10\x8d\x04\x35\x81\x38\x12\x39\x0d\x8e\xbc\x1e\x50\x13\x81\x76\xf2\x59\xdc\x0f\x26\xbc\xa1\x3b\xc9\x43\xf5\x0d\x5a\x35\x00\xb1\x8d\x59\x35\x74\xc6\x20\xfc\x09\x7a\xce\x43\x0f\xb8\x07\x28\xd3\xa1\xaa\x64\x4e\x50\x4b\x10\x09\xad\x67\x53\x6c\xeb\x01\x1f\x2a\x35\x7d\xbd\x00\x9e\x4a\x63\xf5\x24\xd5\xb5\x95\x7f\x33\x15\x67\xc5\xb4\xd1\x85\xa6\x1d\xf2\x2d\x70\x71\xd3\x1a\xe9\x21\x41\xe1\x99\xc1\x22\x89\x51\x5a\xed\x80\xc9\x10\x21\x45\x6b\xcd\x45\xcc\xc6\x34\x03\x7d\xcf\x69\xb4\x1d\x6b\x1f\xf5\x34\x71\x01\x0d\x99\xf1\x87\xf0\x46\x54\xf4\x36\x22\x28\x78\x71\xfe\xe6\xdc\xf5\xf3\x02\x3c\xbd\x09\x13\xd9\x9a\xff\x43\xfa\x95\xb3\x2e\xa2\xb1\x33\xb4\xc9\xac\x4b\x01\x7b\x7c\xf8\xf9\xbe\x50\x86\xfe\x92\xb4\x2c\xb8\xdb\xed\x5b\x63\x0b\xf0\x97\xc1\x8e\x2e\x55\xc3\xdd\x93\x27\x1e\x09\xc2\xd1\xcc\x6a\xf8\x7d\x83\xfd\xef\x3c\x3e\x3c\x4c\xba\xfb\xea\x9b\x60\xfd\x5e\x9c\xf0\x01\x1d\xe2\xe9\xe2\x6f\xbf\x09\xaf\xee\xf5\xc6\x98\x02\xa6\xc4\x6b\xdf\x54\xc1\x45\x86\x29\x44\x17\x3e\x01\x7e\x30\x14\x9e\xa5\xc0\x3c\x7a\xef\xa2\x8a\x9c\xac\x77\x67\x00\x2e\xa3\xfe\xfb\xde\xae\x5b\xae\x00\x5c\x37\x0d\xbc\x06\x42\x44\xd5\xb9\xbe\x55\x00\xa3\x57\x26\xa9\x9b\xc9\xe8\xc2\x75\x2d\x51\x0e\x13\x9a\xf2\x25\x58\x00\x98\xc8\x18\x9a\xa9\xc5\x20"}, +{{0x39,0xbf,0xfe,0x00,0x7f,0x8d,0xf7,0xce,0x4e,0x56,0xfd,0x17,0x6b,0x10,0x2b,0x92,0x3b,0xa4,0x8a,0xeb,0x82,0x69,0xfd,0x0c,0xd5,0x20,0xc2,0x3a,0x7b,0x23,0x6e,0x6c,},{0x95,0x32,0x63,0x68,0x00,0x01,0x0b,0x3d,0xd4,0x01,0x2e,0x34,0x1f,0xca,0xd6,0xd2,0x9a,0xfa,0xd4,0x84,0xe6,0xfd,0x73,0x6e,0x89,0xd5,0xbc,0x02,0xba,0x0a,0xc8,0x53,},{0xa2,0x7c,0xca,0x4b,0x9f,0x5b,0x95,0xad,0x0e,0x44,0xe4,0x74,0x0c,0x15,0xde,0xae,0xb9,0x3f,0x22,0xa9,0xb2,0x54,0xeb,0xbd,0x23,0x29,0x36,0x5a,0x00,0x96,0x6c,0x9f,0x4e,0xc1,0xe5,0x5c,0x58,0x94,0xe7,0xbf,0xc2,0x3d,0x39,0x8d,0x39,0x70,0xb9,0x46,0x5e,0x98,0xa8,0xd2,0x3e,0x72,0xda,0xe8,0xe3,0x50,0xda,0x35,0x31,0xae,0x69,0x08,},"\x7a\x8c\x20\xbf\x2e\xff\x69\xaf\x8b\xad\x6b\xdf\xab\xc7\x90\x9c\x58\xce\x74\x6c\xc4\xdf\x78\xb6\x9b\x33\xc1\x05\xba\x3b\xd8\xda\x75\x24\x47\x58\xb5\x17\x2d\x5c\x45\x01\xbc\x39\x97\x01\x85\xee\x3d\x43\x70\x83\xa9\x95\x9f\x81\xe7\x66\x5b\x82\x9a\x69\xa5\xd7\x2e\x03\x4d\x35\x1a\xdd\xdc\xeb\x3d\x3f\xff\x58\x99\x88\xdf\x18\x2b\x46\xfa\x53\xd2\x6e\x7c\x9e\xac\x06\x22\x15\x78\x8f\x23\x37\xbf\x90\xf0\x17\x7d\x8c\xa7\x44\xf9\x5f\x28\xfe\xa8\x54\x59\x3c\x43\x62\xc8\x2e\x9d\xed\x19\xb9\x04\xff\x99\xd2\xbe\xa8\x24\x32\x82\x2e\x52\xc3\xda\x6d\x46\x2d\xa7\x54\xff\x1f\x8b\xd1\x09\x94\x2d\xf5\x1d\xba\x25\xb7\xcd\xe8\x38\xd5\xf5\x24\x23\x9f\x13\x31\xf4\x63\x19\x4e\x10\xff\x56\x79\x5b\x29\x68\x78\xfe\xb1\xf5\x5d\x43\xec\x7d\xaf\x0c\xa5\xab\x3d\x68\x4b\x55\xbb\x0a\xa4\xc7\x20\xd4\xb5\xc2\xe8\x30\xc8\x58\x69\x4d\x3d\x0f\xdb\xaa\xd0\xbf\x67\xd8\x73\x18\x2d\x95\xb2\x41\x2f\xce\x5e\x7b\x00\xfa\x6b\xfc\x38\xb1\x32\xef\xb9\x6f\x87\xbc\x6c\x10\x07\x0a\x57\x16\xec\x9b\x33\xa2\x69\x2c\xdf\x5b\xc4\x1c\x7f\x73\x7e\x28\xc4\x22\x03\x17\xa4\x89\xb7\x32\x3d\x5e\x20\xf6\x5d\x37\x5d\x76\x9f\x9e\x79\x37\x6f\xd0\x2d\x85\x36\x86\x71\xe7\xe0\x81\xeb\x75\x3f\x88\x85\x45\xeb\xe5\xc0\x00\xb2\xf8\x01\x43\xeb\x35\x8d\x43\x18\x5e\x2f\x1c\x29\x4b\x9f\x29\xc8\xbb\x91\x48\x2d\x43\x87\x49\x4a\xad\x17\x6d\xeb\x85\x54\x0f\xd0\x05\xc9\x7d\x13\xe6\x66\x3f\x09\x94\x4e\xb4\x3a\x46\xe6\x23\x67\x94\xbf\x6e\x21\xf8\x1d\x0a\x42\x09\x0f\x9c\xce\xf9\x0a\x6c\x48\x07\xb5\xff\x54\x13\x00\xe5\x93\x48\x81\xa8\xd9\x21\x96\xb4\xce\xe8\x5d\x28\x09\x2a\x82\x8e\xa3\xbf\xc6\xb7\x45\xad\x21\x9b\xe9\xf5\xe9\x57\x41\x17\xd0\x79\xe0\x2f\x4b\x74\x8e\x2c\xc0\x1a\x32\x82\x6a\x37\x08\x23\x19\x14\xd2\x77\x2c\x76\x41\x19\xfd\x99\xd5\x3a\xb5\xb5\xa2\xe9\xd8\x91\xa4\x8a\x9a\xaa\xac\xc2\x63\x38\xb1\x82\x48\xdb\x8a\xb2\xd5\x25\xda\xf1\x5f\xf5\x3a\xcb\xc3\xaa\x98\xd4\xf2\xd4\xa3\x37\xbb\xaf\x6d\x1b\xe2\x19\x85\xa4\xaf\x60\x0e\x29\xbb\xb4\x2c\x8d\x89\xe6\xb3\x89\xc6\x6f\x42\x27\x0c\x3a\x0b\x05\x1b\xdb\x62\x38\x81\xe0\x2f\x2f\x42\x94\xce\xc3\x47\x63\x86\x74\x7a\xba\xe6\xc7\x70\x0b\x8f\x9b\x03\x87\xcd\xdf\xb7\x36\x68\xfb\x57\x69\x3d\x84\x74\x19\x6b\x33\xab\xd1\x2d\xce\x59\xa5\x7c\xf7\x2e\xe6\xcc\x1d\xdb\xaa\xdf\xb1\x9e\x90\xaf\x81\x31\xb3\xa9\x0f\x98\x67\xf4\xc7\xe1\x5b\xdf\x9e\x21\x84\x77\x01\x6b\xd0\xad\x3b\xe8\xdd\x05\x96\x71\xff\x65\x6c\xbd\x4e\xd8\x98\x08\x6d\xe4\xd4\x23\xf3\xdf\xb2\x70\xbb\xf1\x9d\x9f\x53\xf7\xf6\xf2\xd2\x2c\x6a\xc9\x02\x5c\xba\xdb\xa4\x42\xe3\x1d\x98\x11\xe3\x7e\x84\x7d\xbd\x48\x4d\x80\xcf\x74\x30\x39\xff\xa7\x04\x84\x70\xfb\xdc\x60\x80\xf6\xd3\x81\xdc\x7e\x3f\xa2\x71\x22\xdf\x53\xcc\x06\x39\x4e\xa6\xfc\x44\x6e\x1b\xa7\x25\x38\x73\x3e\xd3\xab\xb6\x85\xf1\x6d\xfd\x5c\xcf\x58\x5a\xe8\xfb\xf9\x95\x4b\x50\xf1\x0b\x7e\x54\x32\xa2\x2b\x36\x94\x06\xa9\xb7\x08\x89\x61\xf0\xae\x20\x74\x95\xae\x71\x85\x39\x6d\xcc\xf2\x92\xdc\x46\x3f\x41\xf3\x76\xa1\xca\x89\xee\xfb\xae\x19\x26\x91\x52\x03\x1b\xfd\x81\x52\x88\xe8\xb5\xba\xf3\x48\xc4\xf8\xff\x3d\xff\x4f\xd6\xd1\x08\xf8\x71\xda\xa3\x52\x11\x0f\xa6\x41\x88\xb0\x1b\x85\x26\xa8\x45\xaa\xed\x13\x3e\x45\x6b\x4c\x83\xc4\xfd\x4b\xbb\x16\x5b\x40\x90\x30\x7e\x8e\xb1\x7d\xf1\x76\xc3\x22\x52\x0f\x37\x59\x9c\x21\x05\xaa\x81\x20\x75\x83\x94\xa4\x22\x24\x73\x47\x67\x64\xcf\x0a\xf7\xc5\x51\x83\xeb\xa9\x68\x3d\x72\x70\x63\x14\x43\xf3\xc5\x1f\xb8\xab\x0c\x13\x0a\xc4\x36\xab\x60\x3f\xf4\xf1\xd8\x65\x6c\xdb\xed\x22\x9a\x20\x2b\x40\x00\x8e\xa1\x0b\x17\x15\x42\xf7\x4a\x70\xb7\xbb\xac\xc4\x01\x6b\x7f\x63\x6a\xa8\x96\x33\xb7\x66\x80\x58\xf1\x33\x12\xf5\x7c\x51\x62\xd1\x8e\x39\x9e"}, +{{0x3c,0x40,0x80,0xcd,0xa0,0xfc,0x3c,0x03,0xb6,0x14,0xd9,0x80,0xf2,0xff,0x83,0x1f,0x5b,0xe0,0xe7,0xa9,0x81,0xd5,0x38,0x1a,0x16,0x18,0xe0,0xb8,0xfd,0x00,0x17,0x76,},{0xf1,0xc3,0x26,0x9d,0x87,0x04,0x02,0xca,0xa4,0x38,0x82,0x13,0x5d,0x9d,0xba,0xdb,0xbb,0x16,0x2d,0xfc,0xa0,0xb3,0xda,0xd1,0x97,0xe6,0xb8,0xa7,0xee,0x67,0x9a,0x70,},{0xc9,0xd4,0xa4,0x72,0x8b,0x8f,0xdd,0x24,0x0d,0x9c,0x49,0x8a,0xa3,0x5d,0xe9,0x5a,0x4b,0xbd,0x51,0x78,0x5b,0x73,0xc8,0x40,0x3f,0xdf,0x04,0x0d,0xfa,0xed,0x94,0x47,0xef,0xad,0x00,0x69,0xb6,0x7c,0x78,0x3d,0x4b,0x81,0xd9,0x66,0xbe,0xf6,0xe3,0xd9,0xa8,0x08,0xa0,0x58,0x4b,0x98,0xec,0x2b,0x18,0x32,0x2c,0x4c,0x92,0x0e,0xb0,0x0a,},"\x0c\xee\xbc\x0e\x8a\x47\x72\x0f\x25\x83\x5e\x2b\x9a\xcf\x89\x1b\xcc\xa4\xbd\xa3\x86\x37\xf3\x63\x27\x44\x58\xba\xa9\xe2\xbb\xaf\xed\xd0\x93\x8f\x56\x88\x73\x4e\x22\xac\x50\xfb\x12\x0f\x66\x5f\x6c\x4c\x61\xc6\x53\x17\x39\xb9\x29\xac\x83\xcd\x77\xf8\x96\x3b\x75\x44\x88\xb9\xb8\x59\xc1\x38\x53\x63\x7c\xf0\x25\xc1\x4e\x8f\xdd\x11\x8f\xaa\x14\xcf\x39\x30\xce\xb3\x5f\x10\x4d\x95\x44\x1e\x56\x48\x94\x40\xf6\x20\x41\xef\x1a\xa7\xc4\xb0\x8b\x28\x07\xe3\x2b\xb9\x58\x4b\x90\x04\xd7\x6e\x76\x53\x33\x48\x50\x6d\x64\xf1\x12\xe1\xff\x6f\x93\x8f\x64\x22\x30\xbf\x38\xaf\x01\x0e\x41\x98\x72\x70\x24\x8b\x13\x63\x5a\x35\x67\xb3\x55\xbb\xa5\xb5\x74\x48\xc6\xd1\x3b\x74\xf3\xbe\xbf\x61\x79\x15\x82\x10\x28\xfc\xa5\xde\xfa\x4c\xe5\x42\x4c\xa1\x91\xcd\x54\xa2\x29\x44\xa3\xd9\x40\xe4\xee\x2e\x2b\xa5\xd5\x04\xc8\x5f\x95\x9b\x51\x4c\x4f\xab\x41\xcc\xb5\x74\x3d\x9c\xb2\xf9\xbf\x33\xd1\xd8\xc2\xa5\x86\x9e\x9f\x46\x60\xc3\xfb\x22\x4b\x39\x14\x1e\x31\x10\xc9\xee\x8a\xeb\x87\x1e\x14\xc6\x2c\x6b\xe3\x8f\xb9\xa4\x56\x8d\x73\x68\x10\xbb\x9d\x20\x73\x17\x8b\x6c\x7e\x87\xe3\x58\x2e\xfc\x62\xb5\x3c\x23\xc5\xd4\x65\x20\xba\x33\xff\xb3\xa9\xca\x64\x9e\xf2\x6f\xe7\x4a\x3c\xff\x61\x88\x42\x73\x26\xb8\xc9\x6f\x74\x35\x4c\xb3\xec\xaa\x61\x1b\x12\xcd\xed\x56\x5e\x59\xfe\x1f\x8f\x40\x00\x97\xe9\x3e\xa8\x59\x51\xb5\xb4\xe9\x00\x9e\xea\x7d\xb9\x37\xe4\x34\x9c\x4e\x5e\x00\xc4\x45\x6c\x6c\x5f\x4e\x57\x41\x1b\xaf\x4e\x46\xe7\x00\xac\x40\x02\x57\x76\x5f\x48\xda\xb0\x3e\x43\x9f\x76\xc1\x49\x9b\x51\x08\x04\x7c\x83\x01\x09\xdc\xe7\xf7\x40\xd1\x39\x37\x87\xe2\x9d\x37\x16\xd3\xc4\x7e\x75\x5c\xb8\x28\xe7\xd4\x40\xa9\x71\x97\x51\x97\xeb\xdb\x3f\x9b\x73\x7b\xa1\x1f\x7f\xd0\x38\x6a\x95\x92\x49\x01\x7d\xe7\x23\x4d\x5e\x5a\x9b\x47\x3b\xb9\x58\x3a\x37\x42\xc7\x74\xee\x55\x2a\x12\xa1\xf3\x6e\xb3\xf2\x6c\x88\x5b\xed\x22\xe9\x1c\x74\xcf\x32\xa8\xdd\x3e\xdb\x08\xb6\x74\xbf\x38\x6e\xf4\x27\x72\x79\x12\xd5\x7c\x5f\xaf\xaa\x1c\xfe\xb7\x40\xcd\x52\xb9\xde\xe9\x95\xe3\xd0\x16\x1c\xd9\x21\x3f\x38\xfd\x68\x1d\x53\x8a\xb8\xbf\x97\xb7\x45\xf5\x49\x80\x03\x0e\xf8\xb7\x26\x96\xd4\xe2\x74\x73\xfb\x0f\x1a\xcd\x5d\x0a\xae\x02\x97\x21\x16\x80\xea\x0f\xc5\x9d\x7b\x6d\x51\xc6\x32\x92\x58\x5a\x1d\x55\x3d\x0c\x89\x54\xb4\x2a\x4b\xd6\xfc\xd3\xa4\x95\x75\xbf\x5c\x88\x95\x3f\x1f\x4e\xa7\xfe\x0e\xd7\xa5\x79\xd1\x69\x7e\x64\x5e\x2a\x61\xc6\x9d\x1a\x56\xbc\x60\x5b\xb0\x40\x60\xa2\x77\x8d\x50\x9a\x8a\xad\xbf\x35\xd9\x46\x97\xcc\xee\x9d\x35\x43\xdd\x01\x28\x1a\x03\x1f\x2a\x0e\xb3\xa9\xeb\x13\xae\x56\xff\x44\xfa\x0a\xed\x4f\x34\x88\x74\x7d\x6a\xf8\x20\xf3\x98\x9b\x71\x33\xf4\x49\xea\x56\xd3\xa7\xf7\x31\xe7\x91\xb7\xed\x2a\x5d\xb9\x39\xbb\x75\x35\x2d\xe7\xda\xec\x50\x66\xfd\x57\x55\x71\x65\xad\xff\xa6\x31\xcd\x3f\x96\x7c\x3c\x7c\xfc\x11\xcc\x1f\x14\xfa\x23\xde\xfe\xc3\xeb\x02\x39\xb4\x5e\xd6\x01\xa3\xa8\x07\x8c\xcf\xc7\xf8\x38\x09\x02\xa8\x59\xee\x9c\xe2\xdb\x79\x5e\xfa\xca\x0a\x01\xdc\x08\x79\xd5\x06\xac\x97\xd1\x07\x04\xd7\x75\x7b\x3c\xcf\x3b\x37\xc3\x39\xb4\x2d\xb2\x37\x82\x27\x80\x23\xe4\xc2\xe7\x7d\x74\x24\x6c\x9e\x54\x41\x49\xa5\x5c\x0c\x92\x0e\xbf\x29\x86\xb4\xc5\xb4\xb3\x57\x2f\x74\x8c\x4b\x15\xc7\xf8\x63\x99\x9b\xc5\x13\x2a\xda\xd0\x97\x61\xeb\x76\x50\x50\x19\x76\x9f\xb5\x54\x22\xf6\x03\x18\x4e\x24\xc0\xd4\xf3\x76\x19\x87\xb5\xc5\x0f\xea\xfc\xce\x53\x30\x2a\x3a\x41\x5e\x20\xf5\x6a\x05\x48\x03\xe5\x53\xba\xcd\x24\x2a\x5e\x13\x64\xaa\x3b\x2d\x7c\xb3\xbc\x1e\x1b\x86\xa4\x74\x31\xcb\xd3\x96\x95\xb6\x7f\x55\x4c\x46\x45\xb7\x23\x69\x04\x09\x4c\x11\xaa\x1b\x40\x32\x6b\xa9\x1b\x8b\xf4\x87\x3e\x9a\x4d\xe0\x4e\x2b\xf4\x62\x59\x72"}, +{{0x45,0x43,0x8f,0x91,0x46,0x5d,0x74,0xa2,0x82,0x5b,0x0f,0x66,0xa3,0x5b,0xd7,0xc8,0xd0,0x05,0x86,0x54,0x79,0xb3,0xdc,0x10,0xa9,0xb5,0x6f,0x29,0x7d,0x31,0xb9,0x26,},{0xf0,0x92,0xb5,0x88,0x03,0x30,0x87,0x1e,0x5a,0xaf,0xdd,0x3c,0xeb,0x38,0x50,0xee,0x7e,0x09,0x41,0xa2,0xa1,0xdc,0x89,0xf4,0xfb,0x47,0x71,0xd7,0x5a,0x22,0xf6,0xf2,},{0xd9,0x28,0x7b,0x7f,0xec,0x01,0x7f,0x2e,0xa4,0x0a,0x14,0xa1,0xf6,0x2d,0xca,0x78,0xb0,0x2a,0x3d,0x66,0x32,0xdf,0x7c,0x60,0xeb,0xd9,0x0f,0xc5,0xe4,0x92,0xc5,0xc6,0x2c,0x43,0x16,0x6b,0xf8,0x56,0x58,0xfb,0x30,0xa0,0x8b,0x57,0xa5,0x81,0x31,0x21,0xb8,0x03,0x97,0x57,0x1a,0x31,0x2b,0x6d,0xd1,0x1b,0x65,0x39,0x20,0x54,0x16,0x02,},"\x30\x71\xd4\xb7\x20\xdf\x10\x93\x65\x99\x67\xcd\x4e\xef\xef\x2e\xf9\x67\x84\x75\xf7\xde\xc5\x8f\xec\xec\x1d\x92\x8d\xea\xf8\x02\x45\x7a\x19\x34\xe6\x04\x55\xf4\x96\xcf\x42\x51\x82\x0e\xd6\x0a\x3d\x81\x33\xb6\x24\xd3\x3a\xf2\x6a\x26\x27\x84\xb5\xa2\xfb\xa7\x3c\xca\x2a\xa5\xe5\x19\xe1\xf5\x39\x58\x47\x80\x64\x98\x64\xba\x5f\xbc\x1f\x01\x1d\xdd\xac\x38\x1f\x8d\x48\xd0\xd6\x0c\xe8\x23\x17\x01\x17\x3c\x9d\x2a\x30\x7a\x76\x30\x2e\xbc\x69\xdc\xbc\x93\x0d\x28\x43\x14\x75\xb5\x16\xf9\x8f\x77\x8e\xd2\xe1\xff\xf2\x72\x90\x9a\x27\x2c\xc3\xfb\xb6\xb3\x1c\x80\x41\xa3\x7c\xb7\x77\xe0\x62\xe4\x96\x49\xaf\xad\x12\xc1\xb5\xf7\xfc\xb8\x06\x5a\x99\xe7\x42\x33\x62\xad\x16\x90\x60\x31\x26\x5d\xb7\xe8\xb8\x97\x51\xf8\xa4\xa4\x07\xf2\x50\x26\x50\xfe\xd7\x53\xe4\x2c\x8c\x91\x1e\x50\xb9\x4b\x38\x00\x69\x5b\x0e\xba\x7d\xff\x06\xb7\xa7\x10\x11\x7e\x49\x20\xd4\xb1\xc6\x05\xa3\xeb\xf3\x2e\x06\x96\x67\x16\xed\xa1\x4b\x30\x42\x99\x8a\x3c\x7a\x5e\x9f\x83\x54\x2d\x7d\xde\x65\xe5\x28\xbe\xd6\x10\x1d\xeb\x33\x1d\xeb\x94\xcd\xd4\x60\x44\xbe\xf8\x8c\x09\x7b\xaf\xd4\x0d\x69\x21\xa7\xc4\x84\xc8\xf9\x66\x84\xdc\x37\x16\x71\xd9\x4e\xee\x7c\xbe\x5d\x58\x77\x15\x31\x4c\xff\x0d\x18\x77\x27\x2d\x81\x90\xa9\x0e\x18\xbf\xb3\x21\xd5\x2b\xf7\x47\x05\x13\x7b\x2a\xbf\x91\x65\x73\x17\x67\xa1\x3a\xdc\x9c\x85\xe0\x39\x7b\x47\xae\xf9\x6b\xad\xb2\xca\x7f\xcb\x82\x93\xb0\x1f\xd1\xde\x31\x6e\xe1\xe6\x5f\x35\x6b\x9d\x6e\x8e\xa1\xfd\xd8\x37\xbd\x96\x08\x11\x49\xea\x2d\xcd\x73\xc4\x88\x1f\x32\xb7\xde\xeb\xc3\x71\x5e\x2d\x7c\xdb\x64\x3e\x0d\x98\xf4\xe8\x46\x50\x8b\x04\xb3\x24\x39\xff\x14\xb1\x16\x4f\x46\x84\x6d\xf9\xaf\xae\x44\x46\x4c\xf5\x50\x10\x4c\xd3\xaa\xb3\x81\x75\x40\x47\x0a\xaa\x2a\xb9\x55\x9a\x68\xb7\xff\x6b\x1b\x9c\x0c\xe9\xf5\x86\x9c\xbd\xcd\xd6\x17\x09\x09\x42\xe3\x53\xb4\xc7\x7f\x09\x39\x58\x96\xbe\xcd\xdf\xf1\xab\x7f\x07\x58\x6a\x51\x4d\x81\xfb\x09\x63\x61\x55\x75\x66\x87\x0f\x16\x91\x98\x34\x85\xa8\x0c\x34\x13\xda\x98\xb8\xd1\x9c\x78\xe6\x37\x9f\x94\x3e\x5b\xd5\xa5\x69\x7a\xa3\x3c\x5e\x6b\xfc\xfb\x7b\x8d\xf1\xe1\x57\x4e\xe4\x16\xfa\xb3\xc8\xa7\xd0\x88\xb3\xa0\x57\xcf\x86\x53\x21\xb7\x4e\x61\x03\x52\x6d\xd9\xad\x15\xca\x5a\xd3\xc0\xf6\x97\x18\xe2\x70\x81\xd4\xb3\x4a\x7c\x6d\x1a\xab\x6b\x96\xc0\xa7\x54\xb9\x89\xb4\x94\x06\x38\xc9\xed\xe3\xd1\x7b\xd4\x9f\x65\xbf\x78\x3d\xc8\x5f\x1c\x4b\x14\x48\x76\xcd\xbd\xb2\x28\x2a\x95\x64\xaa\x81\xb5\x70\x92\x08\x0d\x64\x48\xfb\x65\x80\xec\xf0\x9f\x82\xa7\x55\x01\x0d\x55\xd4\xa5\xe4\xf3\x05\xe2\x59\xdb\xe9\x95\x08\xb4\x79\x25\x0d\x80\xec\x17\xc8\x76\x0a\x93\xe0\x5a\x29\x57\x1f\x68\x56\x07\x30\x22\xc8\x70\x69\x13\xc4\x6a\x2e\xfd\x2e\x9c\xaa\xe4\xff\xa1\xb4\x22\x2e\x3d\x70\xe9\x79\xe8\x1a\x71\x95\x1d\x7c\xb8\x30\xbc\xbc\xf9\x01\xaf\x24\x4f\x64\xe4\xad\x9f\x52\xfa\x3b\x62\x03\x1e\x35\x16\xda\x50\xbc\x2b\xce\x78\xeb\x9d\x61\xbf\xed\xd9\xb3\xf5\x7e\x89\x35\x5f\x17\x7d\xb6\x16\x2b\xf6\x1d\xa0\xe4\x54\xc3\x42\x88\xb9\x67\xc3\xfb\x4c\x34\x1b\x32\xd4\xd1\x3a\x31\x98\x69\xb8\xe3\x60\x46\xf9\xe3\x38\xb5\xf3\x6a\x1f\xc1\xa7\xed\xa7\xd7\xb0\xd4\x38\xe0\xa7\x5d\x84\xbb\xe4\xd6\x8c\x87\x9a\xda\x80\xdd\xe2\x3f\x71\x55\xb5\x32\xcc\xcf\x7a\x63\xf1\xbe\xdf\x84\xf8\x2f\x44\x0c\x9e\xc3\xcb\x0e\x45\xf3\x2c\x92\xf7\x64\x38\xf5\xb4\xb9\x10\x44\x1e\x67\x38\xaf\x3f\x5d\x20\x50\xd5\x79\xee\x96\xb8\x8f\x3b\x00\x81\x0a\xb1\x26\xff\x3a\x8f\xef\xd9\x71\x04\x43\x24\xdd\x4e\xb3\x44\x7d\xac\x5b\x77\x80\x9c\xda\x8c\x71\x68\x25\x49\xd7\xcf\x2d\xce\xe3\x40\xed\xcf\x94\x94\xac\xa4\x29\x01\xe2\xc1\x1e\xd9\x77\x90\xaf\x48\xbc\xea\x29\x52\x1e\xf0\xe3\xd0\x3c\xda\xde\xcd\xc8\x94\xdd\x07\x56"}, +{{0x72,0xcf,0xce,0xf4,0xc9,0xd6,0xa1,0x98,0x6d,0x19,0x03,0x11,0x84,0x0e,0x55,0xcb,0xaf,0xac,0xc8,0xa6,0xeb,0x5e,0xcc,0x72,0x93,0x4f,0xda,0x53,0x5b,0xdc,0xff,0xb2,},{0xa9,0x44,0x64,0xd8,0xcc,0x8f,0x3e,0x43,0x39,0x39,0x47,0x64,0x9f,0x91,0xc2,0x75,0x23,0x27,0xe4,0x0d,0xac,0xa1,0x1a,0x99,0x70,0xc5,0x18,0x1e,0xda,0x37,0xd6,0x06,},{0xdb,0x72,0x70,0xac,0xce,0x78,0xd7,0xfb,0x09,0x08,0x0a,0x32,0x79,0x41,0xbc,0xe7,0xeb,0x14,0x5b,0x9e,0x36,0x61,0x86,0x6a,0x86,0x83,0xf9,0xa1,0xa3,0xde,0x97,0xfb,0x02,0xb0,0x25,0xdb,0x9e,0xc7,0x6f,0xf3,0x25,0x60,0xfe,0x63,0x88,0x27,0x74,0x2e,0xa2,0xf4,0xeb,0xef,0x6b,0x7c,0xce,0x44,0xf9,0xaa,0xee,0x43,0x4f,0xd7,0xc1,0x08,},"\x66\xa6\xcb\xe8\x8a\x8a\xb9\xa3\x38\x47\x79\x7f\xc4\x80\xb2\x44\xe8\xa2\xb8\xec\x79\xe8\x0b\xc2\x63\x77\x53\xde\xb3\x6f\xa3\x01\x4f\x84\x3e\x22\xa4\x7d\xb0\xa3\x17\x78\x38\x5e\xc1\xf4\x55\x67\x2e\x0d\xff\x6c\xa2\x1c\xa4\xcf\xd2\xb9\x89\x47\x1b\x7f\xfc\x30\x78\x28\x13\x8b\x0a\xd4\xe6\x47\xc2\xd1\x3c\xef\x72\x44\x69\x05\x4a\xbd\x37\x40\x24\x5a\xea\x4b\x78\x9e\x24\x4e\x95\xcf\x9e\xcf\xd0\x8a\x0d\x13\xc7\xce\xd3\x93\x33\x27\x27\xa7\xf3\xd8\xfb\xda\xbd\x93\x9d\xe2\x8c\xaa\x41\xcc\x96\xc7\x08\x11\x98\xe2\x26\x53\xd9\x4e\x02\x4a\x61\xf5\xf3\xdc\x5a\xa3\x7f\xa9\xad\xdd\xc9\x6c\xf1\x69\xd3\x50\x62\xa0\xa2\x9b\xa4\x5a\x53\x9c\x87\xa6\x8a\x3a\x03\x04\x36\x13\x09\xd2\x13\xe6\x14\xee\x83\x73\xda\xfb\xa2\xa7\xd6\xed\x7d\x2a\xd3\x77\x04\xc0\x94\x6e\x4d\x09\x3e\x2d\x94\xd0\x61\x36\x4c\xc1\x23\x10\x63\x72\x91\x03\xa7\x7c\xcb\x50\x18\x91\xbb\xc3\x18\x54\x57\xbb\xd2\x86\x9e\xb6\x3d\xc6\x0f\x19\x6f\x10\xa3\x8b\x7b\x36\xcb\x3f\x64\x3d\x35\xdd\xbf\x43\x8a\x44\xbf\x0c\x8f\x57\x0f\xad\x41\xbd\xde\x26\x7f\x0f\xfc\xf1\xf2\xf9\x27\xd6\x26\xd1\xb0\xd9\x80\xa0\xce\x22\x3f\x2f\x00\x54\x84\x5a\xfe\x41\xd3\x9d\xe5\xa4\x57\x21\x9f\x27\x6c\x67\xe6\x9b\xe2\xd5\xc9\xe0\x70\x13\x16\x39\x56\x1c\x26\x75\x1f\xb0\x64\x35\xe0\xe4\x2e\x25\x08\xc5\xf4\x9c\xd1\x2b\x51\x7c\x98\x33\xff\x97\xf5\xe5\x1e\x1d\xce\xaf\xa9\x42\x6d\x3d\xc5\x2f\xd1\x37\x9c\x64\xcc\xaa\xbb\x26\xdb\x1a\xf6\xde\xd7\x15\x36\x28\x84\x2f\x0c\xbd\xbb\xbd\x6a\xa0\xcf\xa5\x40\x7f\x40\x94\x96\xc0\x65\x32\xdb\xea\xc9\x4d\xab\x9b\xab\xa0\xb3\xc9\x88\xfa\x03\xd3\x6f\x91\x1d\x80\xe4\x9b\x37\x0b\x68\x37\x03\x7f\xf2\x49\xe7\x6d\x69\x2c\xd1\x77\x37\xe0\xd0\x79\x65\xd3\x3f\x17\x04\x2b\xbc\xd1\xe9\x90\xe0\x40\xf7\x19\x36\xf6\xfc\xa2\x54\x2a\xe3\x37\x48\x36\x77\x87\xc0\x1b\xde\xa7\x5c\x9a\x0e\x66\x15\x02\x81\xc4\x68\xfe\x5c\x73\xaf\x9e\x5b\xec\x37\x2d\x50\x20\xc3\xd3\x7f\xa1\x03\x5a\x67\xe2\x24\xd0\x95\xf0\x66\xa5\x1f\xe1\xf6\x81\xc3\x07\x39\x39\x27\x2f\x6a\xf7\x75\x0e\xd8\xd1\x83\x49\x17\x8a\xb4\xa2\xee\xb4\xe9\xca\x82\xbb\x67\x29\x6e\x98\x90\xf3\x16\xc9\xd9\x49\x59\x53\xd6\x84\x36\xeb\x1c\x1a\x2f\xb6\xa1\xcc\xa4\x5a\x8e\x88\xa0\x9b\xdd\x65\xa5\x55\x80\x25\x61\x8b\x36\xd7\xf3\xcb\x38\x9d\x2e\x2a\xb1\xed\x23\x32\x28\xec\x92\xa3\x27\x97\x8c\x0a\xdc\xed\xdb\x6c\x96\x32\xd3\xab\xd7\x97\x16\x21\x71\x37\x54\x75\x8e\x21\x01\x3a\x0c\x3d\x00\x9b\x6e\x31\x93\xcc\x15\x2c\x57\xef\x73\x10\x7b\xd4\x35\x7d\x52\x8b\xe4\x08\x73\x02\x7b\xf1\x84\x0f\x68\x55\x36\x08\x0f\x12\xc5\xff\xa9\x3c\xa6\x29\x73\x67\x80\xe0\x15\xe8\x6d\x19\x09\xf0\xd8\xf3\x72\x01\x0c\x9c\xb7\x2c\x09\x89\x84\x5f\xc8\x83\x15\xe6\xb9\x37\x0d\xc9\x2d\x36\x83\xef\x44\xd3\xf7\x5f\xc9\x6c\x4b\x0e\x89\xe1\x3d\x68\x2d\x19\x88\xb6\x85\x71\x3e\xad\xa8\x42\xbe\x9d\x2b\xbe\x2a\x76\xbb\xa1\x5d\x38\xcb\xaf\xb6\x5c\x40\xc2\x15\x9b\x0c\xee\xb0\xd7\x69\xb9\xbe\x35\x55\x40\x73\x4f\xf3\x77\x36\xc0\xf0\xfa\xcb\x95\x15\x93\x09\x36\x5b\x96\x46\xbc\x4b\x34\x4f\xb1\x9a\x5c\x16\x39\xa8\x8e\x87\x31\x7b\xfb\x3b\x5e\x7b\x51\x30\xfa\x7d\x56\x43\xed\x4d\xa0\x64\x30\xc8\xa0\xc1\x85\x8c\xcf\x2f\x9a\x6e\x3d\x62\x01\x22\x53\xf0\x12\x2d\xba\xb4\xa3\x54\x75\xa6\xf6\x55\x89\xb2\xb0\x95\x99\x28\x26\xe4\xf1\xb5\x8f\xa0\x50\xb8\xf9\x5c\x4f\xeb\xa3\xfb\xaa\xdd\x2c\x22\x44\xad\x4a\xbd\x41\x01\x39\xad\xf4\xc1\x53\xcb\x5e\x69\x33\x7a\xf1\x76\xa7\x83\x7e\xea\xea\x99\xbd\xcd\x59\x38\x5a\xfd\xed\x34\xff\xba\x80\x63\xa3\x5f\x4f\x55\x8e\x4e\xeb\x48\xf1\x48\x7b\x56\xb1\xf8\xd1\xf7\x30\x67\x62\x1c\xb5\x48\xc8\x08\x75\x3e\x35\x26\xa2\xf2\xaa\xbd\xe1\x26\xbe\xa5\x21\xcf\x67\x3d\xea\xfa\x79\x2c\xa5\xbd\x22\x12\x79\x5b\xd6\x6b\x86"}, +{{0xa6,0x33,0x7e,0x4d,0x3b,0x1a,0x49,0xb1,0x26,0x31,0x67,0x78,0xc6,0x13,0x51,0x6c,0x03,0xac,0x88,0xc9,0x6d,0x92,0xff,0x5c,0xc7,0xe0,0xc8,0x52,0x7c,0xce,0x1a,0x62,},{0xf5,0xea,0xc4,0xfe,0x0e,0xa1,0xa5,0xf2,0x36,0xb4,0x9d,0xa3,0x3a,0x24,0xe2,0xf3,0xa8,0x3d,0x4b,0x26,0x0c,0x54,0xd3,0x41,0x6c,0x64,0x4e,0x05,0xc8,0x38,0xbf,0x51,},{0x78,0x13,0x76,0xc9,0x51,0x2f,0xa3,0x3c,0x45,0x70,0x47,0xa1,0xf4,0xf0,0xda,0x31,0x76,0xe6,0x0e,0xe4,0x77,0x82,0x86,0x9b,0x7e,0x9f,0xa5,0x84,0x1d,0x96,0x4f,0x3c,0x1a,0xd6,0x6b,0x70,0xc1,0x14,0xb1,0x77,0x1c,0x32,0x4c,0x83,0xff,0x6c,0xd9,0x97,0xae,0xfc,0xcd,0xc5,0x9c,0x11,0x4d,0xb9,0xf2,0xf3,0xca,0x7d,0x84,0xa7,0xb6,0x0f,},"\xe3\x34\x30\xc3\x8c\x4a\x40\xb3\xc6\x6e\x20\xcf\x3b\x70\xe9\xfe\xa8\xcc\x50\x76\x1f\x2a\xfe\x24\x9e\xc0\x59\xc0\x7b\xc3\xb3\x7e\x5b\x94\xf4\xa4\x3e\x31\x00\x99\xb1\x9a\x85\xf5\x9d\xff\x73\xa7\xe4\x95\xc4\xdf\x31\xf7\x47\x80\xcd\xef\x7b\xd6\xe4\x7c\x39\x4c\x18\x91\xea\x30\x52\xe3\xcc\xf5\xd8\x4b\xae\x08\x2d\x24\xba\x71\x78\xac\x65\xd2\x29\xad\x18\xa8\x49\x40\xf6\xb4\xdb\xc5\x96\xee\x63\xc1\x81\xb5\x7b\x5b\x49\x69\x89\x79\xc1\x86\x32\xfa\x82\x1c\xa6\x1e\x35\xa0\xd0\x35\x1f\xe1\x3d\x69\xe0\x6d\xdc\xc8\xd6\x66\xdc\xa2\x45\x02\x17\x7f\x34\x4e\x2f\x44\x05\x75\xd3\x9e\xbf\xe5\xe7\xf1\x06\x53\xb6\x5b\xef\x29\x1d\xc8\x13\xa0\x43\x4c\x97\x5d\xe1\x64\xc1\xa7\x6b\xf6\xfc\xef\x98\xf2\x31\x81\xc0\x09\xb9\x18\x30\xb6\x18\xe4\x87\x48\x47\xd2\xe2\x1b\xbd\xb9\x3f\x20\xcd\x8b\x1f\x4b\xaa\xdf\x99\x42\x8a\x22\x67\x43\x86\xa6\x68\x15\x2b\x4b\x90\x39\xff\x06\xab\xcf\xe3\x34\xa0\x62\xf7\x94\x05\x61\x72\xec\xbc\x07\x94\xdf\x98\x27\x1b\x9a\xcf\xe4\xb7\xda\x55\x3a\x87\x63\x42\x37\x63\x00\x09\xa0\x5b\x25\x7c\x18\x4c\xbe\x23\xd9\xcd\x5a\x03\x86\x58\x01\x0f\x57\x48\x99\xf3\xb2\xd1\x54\xd1\x85\xee\x67\x23\x09\x13\x65\x0c\x3a\x05\xb5\x4a\x2e\xdc\x24\x3a\x42\x87\x39\x8e\x37\x69\x28\xea\x9c\x6b\x2c\xba\xf3\x71\x25\x25\x40\xe2\xb8\x04\x3f\xcf\x55\x68\x13\x19\x6a\xe5\x72\xc2\x7c\xfb\x5a\x46\xab\xb9\x72\x9a\xf2\xdc\xfc\x29\xe0\x33\xdd\x11\xf3\x3e\x86\xcc\x6a\xc3\xbc\xe6\xf3\xf9\x57\x7d\x36\x78\x1a\x69\xed\x7e\xaf\x8c\x82\x63\xa0\xf1\x8e\xba\x0f\xe8\xa4\x81\xf3\xe1\x5a\x55\x59\x94\x34\x19\x5f\x7c\xb0\x57\xdd\x36\x4e\xaa\x07\xdd\x0d\xfd\x26\x6b\x80\x7f\x53\xa2\x07\x0f\xd7\x91\xe8\x72\x42\x2f\xd9\x07\x13\x4f\x4a\x8a\x78\xa8\x76\xbd\xcb\x03\x1a\xc8\x60\xdf\xe0\xbb\x57\xe1\x05\xdb\x82\x87\xb3\x1a\x60\x4e\xb7\x12\x69\xbe\x5b\xa2\x29\x98\x5c\xea\xbc\x2b\xdf\x16\x5a\xc7\x41\x65\x0b\x1f\x01\x3a\x66\xc9\xbd\x24\x3d\x03\xa8\xb1\xc5\x08\x13\x81\xcb\x92\xe2\x3f\x90\x57\x77\x1f\xc0\x7c\xa3\x2d\xff\x1d\xb9\x4f\x5a\xdf\xd2\xf4\xff\x9a\xf3\x1d\x25\x0d\xd4\xf8\x6b\x22\x59\x2f\x60\xa7\x45\x75\x15\x62\x13\xf1\x08\x46\xc7\x46\xa9\x20\xfe\x39\x85\x1b\x32\xfe\x4c\x8b\x87\x58\x76\x5b\xc5\xb8\xb9\xd5\xb9\x92\x63\xdf\x36\xf9\x78\x88\x05\x3f\xd1\x0f\x1d\x68\xf5\x77\xae\xd5\x59\xbc\xfd\xe7\x44\xbc\x65\x11\x07\x6c\xaf\xd6\x89\x44\xa0\xed\x10\x55\x2d\x11\x34\x4b\xc7\xe4\xd9\xef\x93\x6d\xac\xce\xd5\x27\x43\x31\x32\x95\x9b\x1c\x73\x24\xad\x1c\x4c\xbc\x3a\x1a\x73\x6b\x1f\x02\xaa\xe8\xe0\x61\x1a\xe2\x3f\xdd\x47\x4f\x5b\x8e\xe7\x05\x6f\xcb\x5a\xf6\x13\x3e\xcc\x08\x4b\xb9\xf1\xf5\x0c\xbd\xac\x66\x24\x44\x37\xb4\x34\x8f\x4e\xdf\xe2\x37\xfc\x3c\x38\x29\xab\x94\xeb\x4f\x14\xca\xb1\xcc\xd6\xca\xee\x36\xfa\xdc\x20\xa3\x10\xcf\x06\x90\x62\x2c\xdc\xa8\x48\xae\xd0\x3f\xf4\x03\xa6\x63\x3f\x4f\x65\x79\x94\xb7\x80\xdd\x60\x48\x14\x9c\x3b\xfb\xc1\x78\x89\xe3\x7d\x90\xb1\xe5\x42\x0e\xb3\xd4\x59\x6b\x91\xba\x11\xbc\x02\x29\xc6\x5d\x05\xb9\x3c\xd7\xe0\x45\x4d\x1f\x3c\x6e\x1e\x80\x71\x98\x37\x92\xc4\xd4\x36\x8d\x07\x78\xae\xf4\xe1\x23\x33\x5f\xd2\x96\x2c\x65\x7b\xd0\x51\x35\x71\xa5\xfc\xe2\x11\xde\x62\x87\x4f\x27\xca\x10\xdc\x15\xba\x2d\x44\x5f\x1c\xf4\xbe\x5f\x83\x3c\xf0\xb5\x64\xc0\x22\x57\x6b\x98\xc0\xa2\x43\x49\xb6\x70\x85\xf9\x22\x02\x67\x5d\x7d\xac\x48\xb9\x5e\x3b\xfd\x65\x55\xa9\xec\xb7\xc7\x2f\x08\xbf\xec\x0d\x22\x02\x22\x49\x2f\xdc\x96\x36\xf0\x36\xec\x45\x08\xa3\x65\xb7\xb7\x09\x79\xf9\xeb\x4a\x72\x63\xa8\xba\xcb\x1c\x1d\x01\x55\x73\x86\x46\xcd\xd4\x6a\xb9\x23\x4a\x17\x03\x11\x50\x0d\x0b\xae\x6e\x55\xa8\x63\xbd\xaa\x56\xf5\x16\x45\xad\x85\x29\x7a\x73\x81\xf8\xd2\x0c\xf9\x6c\x47\x4d\x1b\xb8\x1f\xce\x13\x2b\x14\x55\x5d\x1a"}, +{{0x10,0x7d,0xa9,0x8d,0x0e,0xe8,0xe7,0xc0,0x0f,0x6d,0x41,0xec,0x26,0x59,0x44,0xce,0x67,0xef,0x8c,0x8f,0xfb,0x51,0xf4,0xf1,0x1f,0x4e,0x5f,0x1a,0x27,0xfb,0xe8,0x05,},{0x3b,0xec,0x34,0xb1,0x61,0xb1,0xbc,0xff,0x00,0x9f,0x8c,0xfc,0x50,0xd8,0x4c,0xeb,0x6a,0x2d,0x5b,0x20,0x3b,0x52,0x38,0xa8,0xaa,0xd8,0xa8,0x36,0x18,0xb4,0x42,0xe7,},{0x53,0x25,0x2b,0x92,0x3a,0xd1,0x9c,0xc3,0x97,0x84,0xd3,0xa9,0xae,0x59,0xd6,0x2a,0x63,0x00,0xdc,0xc5,0x0a,0xc8,0xfd,0x07,0x13,0xcb,0x58,0x84,0x45,0x01,0xd8,0xd3,0x80,0x5a,0xfa,0x0f,0xda,0x64,0xc7,0x3e,0xa0,0xf6,0x0e,0x6a,0x8b,0x34,0x45,0xbf,0xff,0xe6,0xca,0x6b,0xfd,0xc8,0x7e,0x12,0x8b,0xaf,0x99,0xbf,0x62,0x68,0xfc,0x09,},"\x1a\x7b\x7f\x3e\x1c\x7c\x41\x49\x2a\x7c\xe7\x99\xef\xdb\x2d\x9d\xc2\xf2\x48\x9c\x84\xae\x28\xbb\x7d\x08\x4f\x32\xec\xa8\xfb\xb0\x66\x88\x5a\xc6\xf2\xef\x74\x49\xe7\x12\x26\xa8\x2e\x9f\x15\x37\x72\xa9\x93\xeb\x6b\x6b\xca\x64\x91\xd2\x6a\xca\x5d\xee\x98\xb7\x7a\x1d\xdc\x59\x92\x2b\x31\x45\xc4\x47\xde\x73\x7f\xaf\xac\xba\x5a\x75\xf2\xa8\x01\x37\xb5\x59\x46\x97\x22\x0d\x19\x61\x76\x74\xa6\x91\x13\xfd\xf7\x7c\x34\x3a\xf2\xb7\xe3\x86\x1b\x5b\x78\x22\xf5\x8d\x60\x08\x9c\x3c\xa5\x4c\x74\x9d\x27\xf8\x83\x79\xc0\x67\x59\x8f\x06\x39\x39\xba\x86\x31\xd1\xf5\x2d\xc9\xab\x45\x50\x45\xfb\x36\x0c\xc2\xa5\xb6\xb0\x12\x7f\xac\xfc\xf5\xb1\xb4\xc3\x3e\x3f\x19\x4f\xc9\x24\xb8\x54\x16\x8c\xb1\x16\x9a\xb1\x09\x97\xb4\x38\xb7\x1c\x80\x87\x83\x47\xbe\x88\x7a\xf4\x48\x10\x13\x4b\x51\x4c\x80\x69\x08\x20\x1a\x3d\x3e\x6d\x0c\x56\x12\x0c\x43\x14\x87\x4d\xc2\x94\x4d\x84\x44\xf0\x1b\xaf\xa3\x4a\xa6\x2e\xce\xf0\x98\x15\x45\xe5\xd0\x2f\x40\x16\xc0\xb1\x64\xfc\x05\xae\x18\xf5\x35\xc3\x1b\xf2\x0b\x86\xf3\x1f\x7a\x79\x4a\xba\x14\x89\x84\xc3\xff\x43\x3d\xc2\x22\xc4\x43\xb5\xd2\x6c\x1f\x66\xe6\xc5\xf1\x9d\x19\xcd\x6e\xad\xd4\xdc\x94\x10\x1b\x2f\x52\xb5\x8c\x9d\x45\x90\xcb\x10\xdb\xc5\xd6\xea\xcd\x11\xd4\x2e\xd0\x9f\x15\xbd\xe4\x4e\xe9\x27\x1d\xef\x29\x2f\x73\x1b\xf3\xb4\xac\x6c\xd1\x27\xe4\x88\x4c\x2c\xb3\x0b\x28\x5f\xc9\x24\x76\x38\xa2\x99\xe4\x16\x52\x06\x24\xd1\xec\x8d\x0d\xf2\x49\x89\x39\xc7\x19\xa9\xe7\xbd\x29\xa3\xc5\xc3\x2a\x3e\x82\x41\x36\x8d\x6e\x4f\x90\xfe\xa2\x9d\xc3\xa3\xf1\x47\xea\x9f\x76\xc5\x78\x0e\x73\x14\x3f\x55\xd3\xde\xc7\xb6\x63\x41\xd3\xf3\xea\xc1\xd9\x8f\x8e\x7d\x4e\x87\x75\x09\xb4\x43\x8c\x3a\x52\x46\x6d\x24\x2a\x10\xb4\xc2\x7c\x4a\x0d\xb9\x23\x2d\xad\x01\x14\x14\xeb\xfb\xd5\x79\x06\xf1\xa4\x10\x20\x7b\x52\x6b\x0d\x1f\x1b\x69\x86\xb3\xeb\xd7\x55\x0a\x2b\x3c\x15\xfc\x24\x09\xc7\x62\x6e\x0d\xd3\x30\xef\x67\x22\xe3\xba\x48\xb1\xd9\x20\x56\x52\xac\x19\x4c\x21\x47\x3c\xe2\x58\x55\x9d\xb5\x11\xef\xad\x3e\x5d\x55\xf2\xa7\x96\xd6\x5a\x6a\xb9\x7d\x86\x31\x06\x2a\x59\x3a\x13\xaa\xa0\x95\xdb\xc9\x3e\x62\x17\xce\xd6\x19\xcb\x16\xa5\x7e\x74\x43\x55\xa1\x6b\x15\xe7\x7d\x49\x79\x11\x92\x99\xbb\x04\x3e\x48\xfa\x3e\x61\x54\x60\xe1\x64\x88\x29\x84\xa2\x23\xd4\x18\xca\x95\x34\x0c\x5b\xfc\xda\x67\x3f\xcd\x13\xb2\x9f\x2c\x47\xd2\xf9\x7e\x3e\x8c\x61\x3b\x6c\x58\xdf\x0e\x62\xcf\x23\x06\x1d\x6f\x54\x5b\x75\x50\x33\xfd\x3d\xc1\x40\x5e\x5f\xef\x35\xa1\x3e\x01\x5f\x98\xb1\xcc\x42\xf7\x1b\x99\x68\x1f\x96\x81\x25\x82\x29\xa4\x47\x3d\x86\xea\xbb\x0c\x17\x92\x79\x41\xe5\x0c\x08\xf3\x4a\x76\xb4\x3b\xcc\x6d\x04\x2e\x56\x32\xef\x9c\xcc\x91\xb6\xe6\x95\x0f\x5d\x30\xf6\x70\xfb\x39\x02\xc3\xd4\x09\x31\x5a\x40\xb0\x82\x1c\xe8\xa9\x9a\x97\xfe\xca\x54\x78\xbf\xd7\x82\xe7\x87\x67\xb3\x11\xf3\x74\x16\x3f\x58\x96\xb0\xbe\xb9\x58\x38\xe6\x45\x87\x8c\x64\x99\x03\x85\x12\x3b\x61\x57\x5d\xd8\x42\xdc\x76\x35\x4b\xac\x9c\x6d\x5a\xcd\x99\x35\xb6\x09\xbc\xcc\xb8\x46\x3d\x39\x22\x5d\xa1\xaf\xb8\x91\x1d\x36\xe6\x09\x89\x2d\xd1\x72\x38\x52\xab\x9f\x82\x75\x8f\x3f\x1e\x4d\x28\xdc\xf0\x2c\xb0\x6e\xed\x26\x84\x4a\xae\x68\x82\xed\x44\xbc\xe4\x4a\xbc\xd1\xdf\xba\x63\x34\x18\xc9\xf1\x55\x87\x9c\x97\xab\x27\xf8\xae\x23\x83\x30\x39\x2b\xe5\x49\x1a\x07\x86\x62\xda\xaa\x02\xa3\xd5\x45\x8b\x77\xc5\x49\xc4\x9b\xe2\x01\x24\x5e\x7a\xae\xc0\xd9\x4e\x54\x37\xbe\xca\x6e\x5a\xb0\x46\xd6\x94\xe9\x6b\xf5\x1e\x04\xfb\x44\x37\x9b\x2b\x9b\x80\x16\x75\xfe\x14\x77\xf3\xe0\x89\x87\x4a\x60\x11\x71\xd8\xb6\x8f\x02\x02\x01\x46\x01\xa5\x3f\x81\x2f\x53\xe5\x81\xc3\xb9\x63\x12\xb3\x6b\x9e\xe0\x4f\xff\x11\xd9\xea\xb4\xe4\x51\x48\xdc\xc8\xf0\xfa\xb1"}, +{{0x8b,0xc2,0x29,0xfc,0x23,0x46,0x53,0xb1,0x3c,0x92,0x47,0x10,0xcb,0x46,0x8b,0x8f,0xa9,0xb2,0x80,0xe2,0xad,0xb4,0x9c,0xb4,0xb3,0x6b,0xf5,0x9d,0x6f,0xa4,0xa6,0x39,},{0x46,0x14,0x69,0x75,0xdf,0x67,0x04,0xcb,0xf4,0x53,0x20,0xa5,0xe6,0xcb,0x6d,0xe8,0x13,0x46,0x9f,0x31,0x31,0xe6,0x1d,0x44,0x7b,0xbc,0xa1,0xa4,0x77,0xa0,0xc5,0x57,},{0xd2,0x43,0xb8,0x7d,0x13,0x97,0xd5,0x94,0x13,0x9d,0x83,0xc3,0x9a,0xcf,0x85,0x01,0xd0,0x73,0xbd,0x4b,0xe7,0x18,0xb4,0xc2,0x06,0x98,0x07,0x29,0xe7,0x20,0xa4,0xc5,0xb0,0xea,0x91,0xa2,0x8e,0xa1,0x26,0x04,0xa9,0x87,0xe6,0x95,0x91,0xc5,0x43,0x04,0x9f,0x29,0x73,0xbb,0x91,0xc1,0x70,0x21,0x3c,0x32,0xa6,0x4a,0x0f,0xac,0x82,0x04,},"\xba\xe2\xdc\x7f\x94\xab\x5c\xcd\xca\xa8\xcf\x49\xed\xbe\xf0\xf6\xd7\xae\xb1\xfa\x89\x07\x80\x05\x33\xaf\x44\x92\x61\x11\x94\xe5\x6c\xef\x37\xb1\xf0\x33\x30\x37\x38\xae\x2c\x3b\xc4\x58\x8f\x5c\xb3\xd5\x5f\x34\x5b\x9a\x40\x7e\x78\x77\x42\xa0\x6a\xf0\xb6\xee\x20\xde\xe3\xdf\xe9\xc9\x1d\x76\x2a\x3e\xbd\x19\xae\xd0\x79\x07\xbb\xb9\x1c\xd7\x76\x32\x65\x40\xde\xd9\xf7\xff\x7d\xda\x76\x61\x5f\x97\x8e\x94\x90\xf4\x06\xed\x2d\x91\x16\xe2\x09\x3f\xa7\x85\xe9\x71\xb5\x06\x2d\x31\xcb\x40\xff\xf9\xe3\xc5\x51\xa7\x3b\x20\x24\x5d\x46\xdf\x4d\x7f\xd1\x30\x3a\x28\x18\x01\x72\xd9\xa2\xbf\x55\x93\xc4\x79\x17\xb5\x86\x90\x91\x7c\x1f\xb0\xe1\xe2\x99\x4d\x1f\xa9\x77\x35\xae\x37\x8d\xe6\xea\xfd\x5c\x1a\x25\xab\xaf\xa3\xcf\xd2\xdf\x7a\xea\xbd\x6e\x68\xfc\x44\xed\xf8\x2f\xc8\x36\x94\xe5\xd8\x41\xa1\x5b\x14\x56\x8b\x61\x10\xbe\x64\x4b\xf2\x2b\x71\xfc\x47\xd7\xf0\x7e\x16\x66\x95\x7d\x0f\x87\xda\x17\xf1\x3f\xcd\x63\xc1\xc2\x96\x6f\x68\x7d\x25\xdc\xbd\x99\x63\xf0\x1e\xff\x13\x2d\x5f\x2b\x86\x67\x78\x16\x58\x8c\x12\x3e\x94\x57\xbe\xfc\xce\xd2\xd3\xcd\x1d\x1b\xeb\xe8\xdd\x8f\xbb\x15\x87\xe5\x53\xcb\xcc\x4c\x87\x62\x06\x4c\xd3\x2e\xf7\xa1\x70\x24\x10\xf7\x7f\x15\x24\x0d\x7e\x2b\xb5\x82\xc6\x78\xc0\xda\x88\xef\x45\x22\x83\x0b\x14\x36\x60\xac\x9c\x43\x4d\x95\x77\x2e\x6e\xee\xed\x60\x14\xae\x16\x82\x4c\xcd\xc4\xdf\x2d\xf6\x4a\xeb\x69\x80\xb5\x1d\x11\x89\x85\xdc\xbb\xd1\x96\x1f\x31\x5e\x6a\x94\x33\xf0\xb9\x6b\x1e\x63\x51\x25\x7e\xad\x83\xe0\x5b\x4c\xc8\x9c\x92\x4b\xf8\x35\x58\xba\x7d\x2e\x7c\xa3\x7c\x03\x17\x9a\x8f\x85\xb8\x31\xe7\x21\x7b\xf4\xc5\x53\x83\x87\x61\xd3\x26\x02\x85\x3b\x81\x59\x3b\x0e\xbf\x8e\x4b\x9f\xfa\xf0\xec\x40\x5b\x2a\x83\xaf\x7d\xe5\x55\x4d\xaa\xd2\x8b\x58\x2e\xe0\x8b\xd8\x4b\x37\x55\x50\xca\xe0\x8a\xe4\xa5\xbd\xa7\x15\x81\xfc\x3b\x7b\x54\x49\x8c\x4e\x1a\xfb\x96\x6b\x4a\xf1\xd9\xc8\x43\xa6\xb2\x5b\x34\xe0\x4c\xfd\x9b\xd2\x37\x42\x44\xf1\xfe\x20\xec\x62\xbe\x3c\xcf\xab\x4e\xde\xf7\x9e\xd6\x4e\x6b\x71\xaa\x92\x28\x12\x7c\x63\x59\xea\x1c\x4a\x80\x87\x89\x08\x96\xff\xa4\x6e\x00\x92\xde\xc7\xef\xbc\x96\x0a\x17\xb7\x70\x91\x6f\x95\x40\x70\x13\x2e\x26\xd9\x8d\x97\x74\xa2\xac\xdf\x80\x9d\x58\x6d\xf0\x25\x2f\x67\xcf\xe8\xd9\x85\xa3\xe2\x48\xdb\x0f\x90\x73\x1a\xce\x7a\xbd\x99\x9c\x74\x6b\x69\x64\x8d\x5c\x3b\x4b\xd6\x11\x37\xe0\x8f\xcc\x8b\x2e\xfc\x56\x76\xbc\xd8\x56\xa1\x3b\x36\x21\x51\x47\x4c\x4a\x1e\xfd\xed\xc5\x92\xcf\x3e\xad\x1a\xba\xbc\xd4\x8e\xe2\x04\xd2\x77\x26\xad\x1b\xda\x4f\xe4\xb0\x9a\xb5\x10\x89\xd0\x16\xde\x6b\xa2\x59\xea\x81\x80\x7f\xaf\x21\x1c\x87\xe4\xc9\xef\xbf\x6a\x4c\x75\x3e\x08\xf7\x80\xed\x55\x33\x8c\x0f\xde\x14\xfb\x99\xb3\x07\x22\xb5\x59\x4b\x3a\xbe\x02\x04\x7f\x46\x62\x42\x42\x1f\xb8\x11\x76\xc9\xc4\xf0\xfd\x2b\x5e\x7c\x5a\x0f\x65\xa0\xc5\x9a\xa8\xc3\xa9\x86\x08\x7d\xe7\xba\x40\xba\xca\x77\xbd\x36\xac\x21\xce\x34\xe9\xfe\x97\xfa\xcc\x4e\x29\x83\x30\xee\xce\x1c\x8e\xc6\x23\xe6\x6a\x4b\x0f\x23\x42\xd2\xc5\xa0\x2c\x5f\x5a\xbd\xdc\x5f\xf1\xf1\xf2\xd0\x3c\x1d\x4e\xe9\xb4\xb3\x42\xed\x3b\x1c\xc2\x65\x61\xf3\x21\x7b\xf8\x50\x0e\x08\xf0\x27\x57\x1c\x53\xc9\x23\x26\x05\xa5\x3f\x2b\xda\x02\x4e\x39\x92\x91\x63\xa8\xe0\x07\x91\xac\x06\x56\xbb\x07\x83\x82\x5e\x71\x05\xff\xa9\xd9\x09\x69\xdc\x09\x4a\xf4\x6f\x70\x2e\x85\xcc\x11\xe4\x42\xb3\xd5\x53\x4c\x1d\x32\x75\x20\x7d\x6d\x29\xa9\x42\xc3\x58\xed\x5f\xa0\x75\x57\xc3\xc0\x14\xcf\x54\x1f\x9a\xae\xea\x60\x25\xb4\x1e\xcd\xd8\x48\x51\x2b\xa2\x5e\x72\x1e\x43\xd3\x29\x18\x5f\x8f\x94\x89\x2e\x9e\x2d\x5e\x7c\xbb\x99\xe7\xad\x25\xf6\x9e\x5b\xef\x73\x2c\xfc\xeb\x07\x86\x11\x55\x3c\xc7\x83\x77\x37\x5e\x74\xe6\x6f\x1b\x9d\x8d\x20"}, +{{0x3e,0xdb,0x50,0xff,0x07,0x4e,0xf9,0x71,0x7f,0x4f,0xb0,0xb6,0xce,0x25,0x2b,0xf4,0xbd,0x04,0x9c,0x90,0x83,0x77,0x5f,0x52,0x9e,0xaf,0x51,0xe9,0x75,0xcb,0x32,0x45,},{0x4b,0xc2,0x1f,0xe0,0x3e,0x67,0x9a,0xbb,0xfc,0xd8,0xc5,0xea,0x2b,0xcc,0x4d,0x83,0x8a,0x78,0x7d,0x48,0x40,0xc3,0xbc,0x39,0xde,0x4b,0x04,0xc4,0x17,0xc7,0x68,0xa5,},{0xde,0xb3,0xd9,0xfc,0x7b,0x2d,0x86,0xab,0x4b,0x92,0x6f,0x99,0x52,0x79,0x70,0xab,0xb5,0x18,0x38,0xbc,0xc2,0x91,0x9e,0x94,0xcd,0xa3,0x37,0x1f,0xd0,0xe7,0x69,0x3f,0xe3,0x7e,0x0c,0x40,0xe1,0x23,0x3b,0x09,0xff,0xa9,0x03,0xa0,0x34,0xdd,0xe2,0x87,0xc0,0x23,0x7d,0xc5,0x94,0xf5,0x3a,0xbc,0x87,0x84,0x48,0x69,0xdc,0xe9,0x20,0x02,},"\x97\x5e\xce\x4e\x81\xf0\x01\x5f\x5a\xc3\x04\x46\x09\xd0\xac\x3a\x8d\xf9\x14\x5b\x50\xc4\x28\x89\xdd\x31\x2f\x56\x3c\xf6\x12\x6e\x36\xff\xfa\xf2\x1e\xb6\xb8\x4f\xbd\xa1\x5a\xa8\x5c\x66\x14\x5f\x75\x41\xe5\xb4\x1a\x8e\x81\x70\x0b\xe3\x56\x22\x4f\xc1\x09\x32\x7a\x69\x19\x66\x56\x73\x53\x4f\x5c\x8a\x4a\x00\x17\x50\xb1\x99\xdb\xfd\x63\x06\x91\xaf\x55\x2d\x4d\x26\xa9\xd9\xaf\xb3\x3a\x16\xaf\x39\x11\x54\x12\x4b\x53\x42\x6c\x9f\x69\x50\x57\xb1\x81\x4f\xd6\xd3\x10\x29\x8a\xf6\xc8\x30\x68\x6a\x4a\x00\x7a\x14\xe0\x05\x7b\x72\xfb\xad\x5b\x80\x3a\xd3\x53\xd1\xc3\xfd\xb8\x90\xa9\xc8\x18\x08\xe8\x9f\x22\x91\x87\xbc\xb4\x4f\xee\x16\xa4\xeb\xca\xd5\xeb\xa4\x59\xb0\x28\x27\x2a\x56\x2c\x05\x07\x9f\xa7\xae\x3e\xca\xe8\x04\xa9\xe8\xc4\xf3\xf3\x15\x81\x3c\x5e\xe0\x84\x1b\xbc\xcf\xe4\xa9\x56\x23\xb5\x17\xa4\xb4\x2b\x2c\x6d\x97\xa3\xbf\x26\xac\xdb\xe2\xe9\x79\x63\x3f\x02\xaa\xc4\x66\x52\x6a\x3e\xbb\x14\xda\x19\xbc\x95\xf2\xc3\xfd\xf6\xbd\xb0\x8b\xe8\xbd\xe9\x7a\x86\x4c\x90\x7e\x91\x8c\x67\x9a\xb7\x26\xf8\x01\x77\x14\x58\x40\x21\x6b\x9d\xc3\xf9\x81\xef\x17\x87\x4f\x08\xb2\xfc\x66\x11\xa6\x34\x6c\x3d\xa6\xa5\x5e\xcf\xa7\x53\xc9\x91\x9f\x4f\x19\xe3\xc7\x90\x93\xbf\xd7\x8f\x86\x15\x98\xe4\x66\x6e\x1c\xab\x68\x8e\x46\x04\xd4\x6c\x9c\x58\x2e\xad\xb9\x2c\x98\x8f\x47\x8d\x16\x0f\x5a\x15\x18\x2b\x33\x40\x20\x17\x97\xd0\xb9\x55\x28\x2e\x4a\x21\x7b\x50\xb1\x4b\x10\xc9\xf4\x90\x67\xea\x3e\x84\xe5\x27\x4d\xca\xec\x74\x47\x4c\x57\x07\xc2\x8b\xba\x0d\xb8\xcd\xe3\xe8\x38\xd7\x31\x3c\x17\x1b\x85\xff\x2b\x9a\x3d\x2b\x16\x7e\x90\x61\xf8\x4d\xf3\xb1\x3b\xdd\x08\xb2\xd5\x01\xe5\x37\x92\xd6\x80\x54\xd0\x48\xab\xfe\x3b\xce\x98\xd9\x78\x25\x6f\x2f\xd2\xc6\xc4\xe7\x6f\x39\x68\x8c\xcc\xf0\xfe\x14\x9a\xf9\xd3\x47\xe7\xb0\x40\xef\x24\x1d\xd5\xa5\x3e\xaa\x5e\xab\x35\xa1\x8c\x68\xc7\x54\xa0\x6b\x03\x39\x9b\xbe\x56\xa2\x52\x68\xc8\x29\xa5\xba\x82\xb2\x81\x92\x04\x1d\x3b\xd2\x44\xeb\x08\xbf\x78\xe7\x6d\xef\x87\xcd\x09\xf3\x2b\xea\xc9\xbb\x63\x98\x23\xb3\x69\x67\xa5\x74\xd8\x96\x0d\x1b\xd0\x34\x35\x67\x9d\x93\xed\xdc\x55\x80\x63\xc5\x40\xb9\xc2\xf6\x09\xfe\xd2\xe2\xe3\x57\x6d\x19\xe6\x20\x9e\xab\x46\x6c\x20\x67\x91\xc3\xaa\x19\x96\x23\xfb\xae\x7d\x34\x97\xe8\x0f\xdd\x3f\xcb\xaf\x5b\x89\x11\x0e\xd7\x22\x44\x23\x4b\xe8\x5c\xca\x4b\x27\xa0\x9b\xb7\x0a\x26\xec\xe4\xeb\x8d\xd9\x70\xa2\x6e\x5b\x04\x36\x1f\xa5\x0e\x90\x38\x0e\xd6\x5f\x41\x4c\x1b\xe9\xf5\x06\x4f\x71\x42\x91\x16\x26\x7e\xdd\x69\x76\x42\x2a\xd9\x2d\xeb\x2b\x80\x4a\x92\xe8\x1c\x9f\x65\x22\xa0\xf3\xb5\xd8\xad\x36\xb4\xf8\x7d\xb5\x16\xa2\x28\x73\xe6\xf2\x72\x84\xf2\xca\x36\x0a\x2f\x40\xff\x3d\x8e\x23\xde\xc8\xef\x8a\x17\xa4\x3a\xcb\xb6\x12\x71\xa7\x27\xcb\x86\x90\xd2\x9b\xb8\x20\x16\x73\x6b\x31\x02\x62\x01\xdd\x3d\x38\x8d\x2c\x64\x3a\x73\xcf\xbd\x0a\x94\xe2\x05\x51\xfb\x5f\x8e\x1f\xfc\x39\x74\x12\x72\xaa\x23\x08\xdc\x8d\x21\x33\xa3\xfa\x9c\xf1\x09\x79\x6d\x69\xd2\xcc\x8a\xdd\xc4\x4a\xe2\x52\x77\x81\xee\x99\x3a\xf2\xa6\x37\xa8\x72\xf0\x2a\xff\x47\x4a\x70\x73\xf2\x9d\x9c\x89\x50\x77\x01\xfe\xcb\xbf\xd5\x10\x13\x53\x53\x7e\xba\x17\xc2\x96\x69\xda\xc0\x42\x7e\x38\xe2\x2d\xfa\xac\x91\xfc\x20\xd9\xe3\xfe\xe7\x91\xf4\x62\xa8\x63\xbb\x19\x08\xfb\x1e\x42\x04\xb6\x88\x80\x31\x4d\xda\xca\xaa\x35\xa1\x7a\xf5\xf5\x7a\x39\x9f\x19\x31\xe7\x8f\x5a\x37\x45\x4f\xd3\x8c\x57\xa6\x8e\x8d\x36\x78\x48\xa9\x73\x45\x18\x9c\x70\x07\x7f\xd1\xaa\x07\x54\xe7\x03\xe3\x52\x61\x80\x63\xb9\xe3\xfa\xf3\xb1\x4b\x5f\x0b\x27\x11\x36\x33\xc5\xd1\x73\x63\x74\x1e\x96\xa6\x7e\x81\x64\x01\xe8\x09\x8c\x17\xbf\xfe\x9c\x6f\x35\x87\x64\x6f\x40\xe9\xfd\xb6\x81\x9f\xd2\x2a\x74\x3a\x7a\x6e\x10\xfe\xba\x11"}, +{{0xcd,0xa4,0xba,0x93,0x94,0x0a,0xa0,0xc0,0xc3,0x15,0x0b,0x39,0x29,0xb9,0x5e,0xe7,0x76,0x9c,0xe4,0x3f,0xd9,0x8e,0xca,0xff,0x9c,0x4a,0x50,0x9e,0x73,0x6d,0x5c,0x8e,},{0xf4,0xc7,0xa2,0x5f,0x1a,0x74,0x3d,0xaf,0x41,0x41,0x7e,0x47,0xe0,0x27,0x53,0x7f,0x24,0xf4,0x81,0xbd,0x1a,0x75,0xe6,0xb1,0xd3,0x3e,0xc4,0xc8,0x2c,0x55,0xa2,0xd3,},{0x31,0x04,0x8d,0x33,0x4a,0xf0,0x5a,0x4f,0x27,0x5f,0xf8,0x27,0x54,0x4e,0xa2,0x96,0xa4,0xa7,0x75,0xfa,0x59,0xef,0xa0,0x00,0xc5,0x76,0x13,0xfa,0x6e,0x5c,0x49,0x3c,0x3a,0x9b,0x79,0xe8,0xce,0x56,0xe7,0x22,0x5b,0x0f,0xa3,0x26,0x20,0x4f,0x03,0x36,0xc2,0x13,0x53,0x5a,0xe5,0x89,0x17,0x7a,0x8e,0xae,0xdb,0x6d,0xf8,0xb2,0x02,0x03,},"\x3a\x1d\x66\x8c\x66\x88\x41\x48\x96\xa7\x69\x7f\x3c\x2e\x43\x10\x98\xed\xfc\x45\x7e\x04\xd2\xda\x86\x95\x68\xad\x5b\x33\x10\xe5\x9e\x4c\x72\x7c\x90\x3c\xbf\x18\x17\x40\x88\x02\x31\x9a\x8c\x23\x1b\x58\x02\x3d\xfa\xe4\x94\xc0\x13\xaf\x0f\xdb\x78\xc9\x1d\x5b\x45\x7f\x8c\x47\xa3\xdc\x31\xd8\xc8\x59\x4a\xa0\x8f\x14\x62\x03\xfa\x2c\x28\xb3\xdd\x79\x6a\x11\xa9\x7a\xde\xde\x6a\x7a\x70\x9b\x5a\x19\x18\xef\x1b\xea\x83\x53\x3c\x78\x34\x73\x70\x33\x56\xf5\xbe\xea\x7f\xd1\x8a\xc4\x4e\xc6\x89\x04\x95\xed\x17\x0d\x03\xf1\x5b\x41\x86\x08\xa7\xd9\xef\xd5\x2f\xa1\x09\x18\x63\x80\x51\xc4\x48\xd9\x8d\x57\x24\xf5\x67\xc8\xc6\x7f\xd5\xb6\xec\x8c\x3d\x63\x60\x08\xb9\xba\xe5\xe8\xb1\xe9\x84\xf8\xff\xb8\xb6\x4b\xee\xbd\x63\x45\xa1\x05\xc1\xc1\x08\x31\x32\xfd\x45\x08\xd6\xac\x0d\x4e\x91\x45\x50\x12\x10\xe5\x17\xd9\xb2\x24\x78\xe2\x15\xb6\x02\x59\x9f\x80\x37\x62\xdc\xd5\xa4\x09\xb3\x46\x0e\x7f\x34\x0f\x47\xef\x77\x28\x1a\xd2\x38\x3d\xe0\x8c\x5b\x80\x95\x38\xaa\xec\x92\x2b\xfc\xa0\xd6\x75\x2f\x14\x79\x72\x64\x6d\x0a\x8d\x83\x40\x77\x2c\x87\x1d\x3b\x34\xab\xc0\x60\x37\xde\x3a\xb4\xe3\x71\x29\x86\x5d\x5b\xa7\x0b\x6f\x3c\xc9\xa0\x59\xef\xb7\xdd\xdc\x38\x82\xf4\xfc\xfe\x13\xf4\x48\xc9\xbc\x66\x48\x88\x58\x96\x03\xba\x98\x68\x3a\x93\xb4\xb3\xb1\x01\x49\x92\xa5\x5c\x8e\x4e\xa1\xba\xf9\xcc\x00\xd1\xba\xdf\xf5\xfd\x7f\x5d\xa5\xe3\x07\xfb\xd1\xb4\xc9\x84\xe0\xfa\x0e\xde\xc5\xd3\x0b\xfe\xf5\xf4\x77\x30\x12\x63\xb5\xd7\x52\x00\x1b\x85\xdd\x52\xdf\x3b\x4a\x7a\xc2\x3b\x93\x0a\x91\xc0\xa4\x57\x65\xa6\x64\x88\xd8\xeb\x59\x01\x85\x70\x60\x06\x7b\x82\x37\x81\x88\x54\x92\x88\xdd\xc6\x18\x31\xe5\xb6\x84\x1b\x34\x4c\xae\x22\x50\x04\x22\x19\xcf\xb4\xac\xe0\x23\xe6\x91\xf9\xe4\x8d\x00\x6e\x9a\x07\xc6\x7d\x24\x68\xf9\x35\x93\xb4\xaf\xc1\x61\xc0\x76\x8b\x6c\xeb\x74\x4c\x24\xc9\x23\xda\x34\xaf\x3d\x5e\xd5\x77\xcc\x7f\x85\xd4\x91\x56\x0f\x4c\x0b\xcb\xcd\x1d\x5e\x34\x21\xbd\x1c\xcf\xaf\xb3\x73\xd6\x51\xbd\x61\xed\x71\xc0\x9e\x99\xf6\x12\x00\x17\x04\xd0\xc6\x30\xd8\x54\x7b\xd9\x70\xb6\x6e\x7f\x5c\xe7\xa0\x14\xe0\xff\x5a\x33\x7d\xc5\xc5\x6a\x99\xf1\x31\xb9\x12\x91\x40\xee\xea\x39\x39\x7c\x48\xca\xa9\xa8\x08\x6f\x9f\xd9\x91\x50\xbe\x7e\xf8\x7b\x6d\x4b\x94\xb1\xbd\x52\x87\x8b\xf3\xbb\xfc\xce\xac\xc2\xcc\x45\xe8\x97\x1c\x3a\x4d\x4a\x3e\xb8\x6a\xf9\x87\x4d\x4f\xa5\xe7\xca\xa7\xf4\x5d\x15\x53\xff\xbb\x41\x64\x5b\xf0\xf5\xe9\xb2\x97\x72\xe3\xdc\x08\x1b\x25\xb5\x2e\x1c\xb7\xe2\x16\x74\x83\xd5\x4f\xba\x69\x0d\xdb\x29\xd5\x46\x2d\x2a\x27\xa3\x5d\x85\xf0\x07\xad\xed\xe2\xa3\xdd\x72\x81\xf6\x54\x33\x6a\xfa\xfb\x73\x70\x78\x2b\x29\xca\xd6\x43\xd9\xd9\xdb\x2f\x05\xf2\x81\xb5\x3e\x13\x3e\xc3\x0e\xec\x09\xfb\x0d\x06\x1b\x74\x58\x1a\x2b\xd2\x79\x0b\x13\x73\x91\xf1\x93\x28\x88\x0f\x64\xc5\x3b\xe7\x00\xd0\xfa\xdd\xb7\x0d\xc1\x65\xd2\xd6\x2e\x67\x1e\xb9\x44\x9a\x2e\x6e\x9d\xf2\xc1\x6d\x8f\x49\xfa\x4b\x5b\x84\x30\x9f\x73\x35\x13\x3d\xbe\x87\x2c\x5a\x8f\xdc\xfb\xc4\x98\x0a\xbf\xb3\xc9\x59\x7d\x5d\x66\x7a\xd2\xf6\x88\xc7\xab\x24\xc9\xe4\x40\x29\x8d\x72\xb2\x8b\x0f\xcd\xe9\xc6\xf0\x71\xbc\xcc\x93\xe8\xdd\xbb\xa7\xb6\x0a\x0b\x54\x4a\x2e\x06\xc3\x9c\x67\x23\xd4\xf7\xdc\x18\x5c\x21\x13\x5f\xd1\x3a\x72\x77\x0b\x97\x61\x19\xe4\x9a\x1f\x81\xed\x47\x6b\xe0\x7c\x44\x3d\xe0\xb0\xee\x76\xfb\xd9\x19\x38\x93\x28\xb3\xeb\x86\x07\xbc\x2f\xe3\x8f\x85\x74\x5e\x28\xad\xb7\x48\x2b\x70\x1c\xcc\x66\x90\xe4\xae\x5a\x93\x32\xea\x44\x61\x31\x79\x38\x7d\xc6\xfc\x47\xc1\xd1\xec\x36\x60\x35\xe9\x91\xe1\x40\x43\x23\xbd\xbb\xf5\x35\xf1\xc3\x3c\xf5\x7b\x67\x23\xf1\x3c\xa6\xca\x32\x9e\x2a\xaa\x4b\x46\xb4\x26\x07\x33\x99\x06\xc7\xef\x49\xb3\x2d\xb8\x2c\xdf\x6a\x87\xad"}, +{{0x21,0x7e,0xcd,0x6a,0x7f,0xcc,0x98,0x71,0x92,0x10,0xc3,0x4c,0xc2,0xe1,0x4f,0x5e,0x2d,0x6b,0x5a,0x22,0xf2,0x68,0xc1,0x4b,0xc4,0xd8,0xa7,0xf2,0x81,0x72,0x00,0xc3,},{0xd5,0x91,0x91,0xce,0x28,0x2d,0x72,0xfe,0x3a,0xc4,0x58,0x78,0xe2,0x4b,0xb2,0xf2,0x8c,0x40,0x9b,0xa0,0x5d,0x76,0xce,0x9b,0xcf,0x22,0xf5,0x0b,0x0c,0x77,0x86,0x75,},{0xa0,0xb1,0x69,0xe8,0xe9,0xce,0x55,0x75,0x55,0xe0,0x33,0x4a,0x0d,0xe7,0x43,0x8e,0x55,0x36,0x75,0x48,0x9e,0xa4,0xba,0x9c,0xc6,0x3a,0x23,0x4d,0x00,0xde,0xd8,0xab,0x69,0x67,0xa3,0xbe,0x90,0xef,0x69,0xe0,0x76,0xdb,0x9e,0xa3,0xd5,0xca,0x23,0xb3,0x24,0x8d,0xd2,0x59,0x91,0xee,0x1f,0x4d,0x80,0x62,0x0b,0xf4,0xdb,0x43,0x8f,0x0e,},"\x9b\x53\x37\xe7\x8f\xb3\x82\xf2\x2e\xa6\x0e\x03\xc0\xbf\x3e\xe4\x70\x0b\x69\x78\xa9\x1e\xe6\xac\xdf\x6a\x40\x9e\x49\x18\xd1\x68\x48\x81\xfa\x1d\x11\x8c\x08\xc9\xf6\xf2\xca\x0c\xab\x56\x74\x02\xc9\x50\x10\xe7\xab\xdf\xe8\x48\xae\x79\xba\x24\x9a\xdc\xb9\x6e\xae\x1d\xfa\x08\x43\x95\x21\x39\xcf\x49\xb5\x88\x64\x78\x95\x69\x1a\x2e\x98\x80\x46\x6b\x7e\x77\xe5\x4f\x6f\x60\x81\x5e\xbf\xd5\xe5\x74\x8f\x41\x3c\x0e\x15\xf9\xd5\x76\x79\x9b\xcf\x31\x28\x47\x10\x63\x6f\x6e\x9d\xc7\x87\x85\x00\x79\x6e\xed\x80\xc8\xaf\x4b\xe2\x96\x19\x52\xea\x80\xbb\xed\x14\x04\xbd\x5d\xae\x9e\x6d\x05\xfd\x4f\x32\x5a\x3b\x83\xcd\x45\x28\xa0\x86\x9c\xef\x84\xb4\xd3\x0e\x02\xf9\x41\xd7\x49\xa8\xda\xc9\x7b\xb3\xfa\x83\x9d\x25\x73\x9b\x97\xec\x37\x45\x36\xbd\xea\x50\x04\x84\xa9\x41\xdb\x9f\x22\x99\x97\x06\x58\xd4\x11\x48\x29\x5c\xa0\x84\x6c\xa2\x36\x62\x38\xb6\x20\x1a\x48\xb3\xe4\x47\xed\xbe\xa7\xa4\xc8\xf7\x10\x20\x14\x27\x69\xe1\x5f\xa7\x2a\xe5\xf2\x87\x14\x0b\xc5\x95\x3b\x8a\x9a\x24\x2d\x20\x5f\xc0\x19\x09\x1f\x2a\xbe\xd0\xfd\xa4\x7f\x52\xd5\x9a\x02\x04\xce\x74\x01\xc1\x82\x9b\x58\x57\xb9\xa0\x91\x6f\xce\xbe\x2e\xef\x99\x1c\x41\x3a\xcd\x71\xb1\x8d\x85\x90\xd6\xb6\xd0\xfb\x39\x94\x30\x26\x78\xc2\x9f\x2b\x6a\x53\x02\x3f\x91\x87\xe4\x6c\x36\x79\x0b\xce\x73\x87\x3c\x54\x5a\x72\xbe\xb5\x53\x29\x4b\x1e\xe5\xd0\xd0\xdf\xf2\x39\xe2\x8e\xc6\x3b\x01\xe4\xd8\xfe\x0d\x6e\x69\xb1\x60\x1e\xfa\x24\x11\xf0\xc0\x60\x1e\x7e\x4f\x65\xc9\x84\xf8\x29\xf0\xdc\x2a\x84\x21\xe7\xf6\x6d\x93\x30\x53\x71\x51\xc7\x24\x3c\xa5\x24\xd7\xa5\x47\x35\xc6\xe3\x44\xf1\xfc\x93\x8e\xae\xea\x27\x79\xc9\x40\x89\x1d\x6d\x01\xaa\x55\xf4\x0c\xc1\xad\xba\x12\xe8\xa6\x7a\xd9\xa2\x7f\xe6\x3f\xb4\xf3\x8d\xc0\xf0\x18\x41\x92\x57\x18\x42\x72\x55\xbd\x66\x5d\x5e\xb3\xbc\x86\x98\x96\xdb\x86\x25\x20\x4a\xd4\xb0\x2f\x5a\x22\xaa\xee\xad\x6e\x30\x04\x71\xfe\xa6\x1d\xbb\x1b\x55\xc0\x71\x36\x5c\x58\xb1\x51\x1f\x38\xb0\x9a\x46\x71\xbd\x66\xb3\xfe\xdd\xa9\xc8\x7e\x43\xd1\xeb\xf3\x01\x76\x4e\x18\xfc\x0c\xf1\x6b\x2d\x2d\x67\xed\x23\x9b\x39\x3a\xc7\x19\x68\xa9\x03\xc0\x24\x77\xfb\x2d\xf9\xef\x01\xdb\xfc\x31\x67\xde\x72\x65\xf8\x91\xe4\xfd\x24\xd0\x2c\x63\x10\x35\x19\xb8\x6a\x70\x85\xb1\xec\x2f\xb4\x19\xdb\x76\x6b\xee\x7a\x64\x1a\x4b\xe4\x29\x61\x4a\xb8\x9f\x20\xf9\x75\x34\x10\x72\xbf\x04\x41\x9f\xb6\x9b\xe7\xa9\xee\x71\xa5\xb4\x9a\xf8\x3e\xd3\x22\xba\xc6\x8a\x42\x9f\xf5\xc5\x20\x67\x73\xbe\x54\x38\xb6\x5e\x53\xf6\x09\x72\x9f\x4f\x6a\x21\xc1\x33\x39\x11\x26\x4d\x63\x92\x70\x17\xe8\x13\x6b\x47\x25\xcd\x1c\xc9\x64\xe0\x8c\xa0\x93\x3a\x56\x1e\x7e\x3f\x59\x87\x76\x83\x30\xe2\xe5\x4f\x8d\x72\x8f\x59\xed\xfe\x2c\x91\xc4\xf9\x9a\xef\x97\xd1\x85\x59\x19\x5a\x3d\x8e\xb3\x15\xdf\xf9\x6f\xe2\x76\xda\x71\x37\xef\xf9\x30\x57\xac\x73\x1e\x06\xa6\x0a\x58\xbd\x8a\x9a\xe8\xc7\xcb\xaf\xf0\xcb\x33\x72\xc6\x8d\xaa\x17\x5c\x42\x8d\x52\xf1\x07\x3a\x38\xbf\x29\x46\x5d\x2a\x71\x28\xbb\x40\x07\x40\x06\xed\xcb\x72\x5a\x83\x1d\x81\x28\x64\xef\x43\xf3\xb8\x66\x7c\x9f\xb7\x10\x93\xa1\x67\x30\x49\xde\xc0\x5e\x09\x16\x9d\x86\xfe\xe9\x2d\xf2\x86\x00\x8a\xd9\x90\x65\xa2\x92\x97\x97\xa9\x13\xd0\x23\x3f\x4d\x1a\x95\xa2\x20\xbd\x91\xc1\x1d\xd9\xc4\x56\x85\xdc\xad\x38\x57\x80\xa0\xc4\x8b\x9c\x4a\xd2\xd6\x63\x03\xe8\xde\x4a\xf1\xdb\x3c\x04\xe4\xa3\xdd\x42\x19\xfe\x77\x3f\x83\xa8\x92\x4b\x0f\xcb\xff\xfc\xf2\x64\xab\xce\x32\x83\x29\x24\x03\x6b\xfa\xbb\xa6\x54\x6b\x1d\xf4\xe3\xf7\x88\xed\x8a\xd5\xc2\xcd\x92\xb2\x64\x1b\x47\x09\x0a\x10\x3c\xf5\xbd\xc4\x6d\x8b\x21\x43\x17\x47\x57\xda\x80\x1c\x36\x0a\x7a\xa1\x07\xfa\xc6\x54\xb3\x4c\x86\x0b\xd5\x4f\x76\xbb\xf4\x3c\x48\x47\x8d\xf4\xfe\x7a\xa5\x9c\xf9\x1d"}, +{{0x08,0xd1,0xd0,0x6f,0x3e,0xc2,0x9e,0xb5,0x22,0x93,0x90,0x7b,0x70,0x5e,0xc5,0x6c,0x5a,0xb3,0x54,0xfb,0x78,0x67,0x37,0x73,0xae,0x61,0x25,0x30,0x94,0xb8,0x9e,0x82,},{0xc1,0xb9,0x9a,0x87,0xad,0x15,0xbd,0x46,0xf6,0xc8,0x48,0x45,0x2a,0xf0,0xfa,0x3c,0xcc,0xcb,0x5c,0xdf,0x6e,0x34,0x8d,0x81,0x6e,0x36,0xc5,0xd0,0xfc,0xa6,0x6e,0x66,},{0x0b,0x8e,0xdc,0xb8,0xb1,0x5a,0x8c,0xd0,0x74,0xc4,0x1d,0xc2,0xa1,0xba,0x29,0xd9,0x64,0x8d,0x6a,0xcb,0xdc,0x33,0x83,0x14,0x70,0x7e,0xca,0x6f,0xb4,0x71,0x4c,0x99,0x54,0x3b,0x49,0x07,0xb9,0xf8,0x5e,0x57,0xee,0xcf,0xfe,0x0f,0x7a,0x6b,0x70,0x73,0xa8,0x09,0x46,0xf8,0x08,0x75,0x53,0xf4,0x68,0x31,0x09,0x27,0x3a,0x60,0x4a,0x08,},"\x12\x0b\x35\x57\x3c\x34\x91\x4b\x37\x30\x51\x88\x0d\xa2\x7e\xd2\x41\x37\x7f\x0e\x78\x97\x2c\x98\xd0\xfa\xeb\xaa\x76\x7e\xb7\xa7\xc7\xe7\xc6\xfc\x34\x05\xa4\x33\x6e\xf9\x5b\xc5\xda\x92\x25\xbb\xd0\x9e\x9e\x11\xf2\xa1\xbf\x14\x2a\xf4\xe8\xa0\xf9\x24\xd3\x23\xdd\x5a\x49\xdf\xe5\x84\xf0\x90\x43\x9c\x08\xe5\x15\x11\x34\x4d\x47\x0c\x62\x00\xac\x7e\x7c\xa1\x50\xd0\x88\xa9\x1e\x47\xc4\xc9\xff\x74\xe3\x8a\x42\xa3\x32\x15\x5d\x81\x52\xae\x4a\xbd\x11\x61\xad\xca\x93\x4c\x23\x4c\xe4\x60\xaf\x87\x89\xe5\x3f\x10\x9d\x7d\x31\xee\xde\x0a\x90\x9b\xd1\x93\xfc\x8d\x3c\x2c\xfe\xc1\x0b\x14\x3c\x31\x47\x67\x11\xbb\xec\x27\xe1\x96\xa5\x49\x85\xbc\x34\x71\x67\xac\xd2\x33\x50\x88\x27\xba\xd3\x6e\x54\x8c\x88\x06\x42\xb8\x6a\x28\xc6\xd3\x40\x4b\x51\x1d\xa2\x4f\x11\xdf\xaf\x6a\x8f\x46\xdd\xcb\xc9\xde\x9e\x39\x15\x97\x66\x9b\xdd\xfc\xa6\x56\x0f\x91\xac\xd3\x45\x9f\x32\x9b\xb0\x71\xdd\x80\xda\xdf\x35\xf0\xe5\x0d\xf5\xb1\x0f\x88\xd2\x67\xac\x9d\x30\x62\x33\x0d\xd9\x9a\x6b\xcf\xa1\x31\x87\xf4\x5c\x0c\x21\x4d\xcd\xe2\xcd\xf9\xc3\xba\x4d\x59\xe6\x33\xa3\x54\xa4\xe2\x77\xc6\x77\xbb\xdf\xa2\x41\x91\x17\x9c\xbc\xaf\x05\xa1\x0d\x40\x78\xd8\xad\xd9\x3b\xc9\xed\x8f\x6c\x6c\x49\x97\x57\x40\x36\x55\x34\x1f\x90\x4e\x37\xd9\x27\x75\x0c\x69\x9c\x26\x9d\xc9\x0d\xc2\x6d\x00\x56\x25\xc3\xf4\x12\x4b\xff\x66\xfe\xca\x59\xd4\xab\xff\x41\x72\xba\x3d\xf4\x5a\x87\x43\x02\x23\x10\x30\xfa\x78\x33\x84\xf5\x09\x99\xe3\xc4\xba\xa5\xea\xdb\x45\x14\x52\xc8\x88\xb5\x19\x27\x2e\x90\xf7\x3c\x68\x72\x76\x8e\x0d\xe2\x0e\xe2\xe5\xf9\x50\x2f\x35\xe4\x9f\xec\xc2\x8b\x75\x20\x18\x87\xfe\xd2\x81\x8e\xff\x54\x53\x98\x39\x2f\x5e\x5b\x68\x76\xbc\x55\x6a\xc1\x3a\x19\x03\xad\xa1\xb9\xd7\x25\xb0\x4a\x14\x20\x4b\x59\x9e\xc3\x3d\x62\xb7\xdc\xae\xea\x8c\x52\x87\x7b\x2c\xfd\xc3\x55\x8a\x91\xd2\xc9\x15\x75\x00\xa3\xbb\x6d\x45\x2e\x5e\x2f\xf0\x93\x29\x4f\xc4\x33\xcb\xd6\x34\x65\xbb\x19\x13\x07\xed\x80\x1a\x15\xb8\x5d\xc2\xff\x0b\xb3\x83\x12\xf8\xb8\x17\xa4\x36\xd4\x22\xcf\x46\x07\xc6\x4e\xe7\x03\x59\x23\xdb\x6b\x96\xa3\x89\x99\x10\x14\x9b\x0d\xa4\xaa\x3e\x96\x68\x5d\x71\x63\xaa\xcf\x9e\x61\x9d\xc6\x08\x13\xce\x4f\x34\x4f\x30\x79\xb4\x3f\x18\x7f\xa3\x1b\xda\xcb\x9a\x1d\x77\x20\xb9\x39\xd5\xbd\x24\x1b\x96\xa1\x77\xd7\xb7\x76\x8f\xfe\xbf\x79\x04\x4c\xd2\x95\x6d\x6f\x88\xdb\x1c\x24\x3a\x10\xfe\xde\x68\x14\x85\x2c\xf4\x04\xb2\xcd\xcf\xa7\x74\x07\x6d\xc1\x25\xc7\x0a\x57\xc6\x90\x7e\x99\xaf\xe3\x96\x22\xae\x11\xf5\x57\xe7\xd3\x4b\x39\xaa\xaf\x45\xf8\x34\x05\x8d\x2f\xe5\xf1\x5b\x5e\xb7\x0a\xc1\x5a\x90\xa3\xde\x58\x50\xab\x1d\xcb\x48\xb0\x6b\x6c\xca\xa4\xb4\x2f\x85\x7e\x71\xec\x00\xb8\xa3\xd8\x97\x4b\x0b\xea\x68\xfa\x0f\x66\x55\x92\x11\x5b\x4f\xa5\x55\x72\xcf\x0b\x07\x38\x64\x1f\xc8\x68\xd4\xa2\xe7\x14\xdb\x3a\xd7\x21\x9a\x82\x3d\x54\xb7\xf7\xc2\x65\x6b\xa5\xc5\xee\xbe\x35\x94\xc7\xdb\x12\x29\x8c\x16\x25\x1d\x98\x45\xbf\x2f\x78\x00\xb4\x19\x0b\x74\x6e\x21\xb0\xc1\xa5\xc4\x7a\x3d\xf9\xa0\x59\xce\x09\x56\x67\x4e\xb7\x03\xde\xcb\x0a\x00\x45\x43\x7d\xa4\xda\x10\xf2\x86\xd7\x20\xd1\xb9\xdf\x05\xfb\x24\x41\x5d\x68\xe0\x65\x57\x0e\x6b\x31\x50\x31\x42\xd0\x33\x35\xa8\x07\xbd\xca\x30\x89\x2e\xdb\x5f\x55\xf8\x98\x9d\x9e\x64\x96\x59\xc0\x74\x4c\x54\x33\xbf\xb4\xde\xeb\x11\xc2\x62\x6a\x86\x50\xe5\x4d\x4d\x39\x8b\xa1\x9b\x64\xf6\x8b\xed\x06\xd7\xfc\x40\x8f\x47\x0a\xc7\x04\xe2\xac\x92\x2a\xc1\x41\x1f\xee\x24\x54\x3e\x56\xf2\xf5\x0b\x6b\x08\x95\x3d\xc5\x6a\x7a\x75\xed\xae\x43\x0a\x6d\xf2\x8a\x22\x7a\xda\xc9\x1b\xa2\x6f\x0e\x19\x85\x95\x32\x77\x39\xcb\xa3\x03\xe9\xaa\x39\x3e\xa6\x61\x8a\x84\xf8\xf5\x03\xd0\x05\x6e\xe8\xd8\x7e\x37\x96\xe0\x36\xcc\x51\xcc\xb7\x91\xde\xb7\x95"}, +{{0xf0,0xc8,0x5c,0x76,0xb1,0x53,0x2e,0x89,0xae,0xa9,0x75,0x15,0x6d,0xdd,0xb1,0xd3,0xd0,0x66,0xf6,0x40,0x9f,0x84,0x1b,0xb4,0x41,0x09,0x22,0x72,0x5f,0x26,0x9d,0x86,},{0xfd,0x75,0xfc,0x75,0xc3,0x6f,0x83,0x49,0x8d,0x8f,0x08,0x27,0xf0,0x1d,0x3b,0x45,0x7f,0x8b,0xc4,0xd9,0xdc,0x55,0xe4,0xa4,0x62,0x74,0xdd,0xf0,0x03,0x4f,0xe1,0x6f,},{0x42,0x18,0xfe,0x4c,0x1d,0xce,0x79,0x5c,0xa9,0x2a,0x49,0xa6,0xf4,0x79,0x8e,0xb5,0x41,0x2d,0xc8,0x25,0x86,0x03,0x14,0xec,0x46,0x9f,0xed,0x45,0xde,0x3a,0x7b,0xf8,0xea,0x55,0xe8,0x53,0xa3,0x49,0x58,0x4b,0xd9,0x5a,0x82,0x6a,0x58,0x5a,0x50,0x3f,0xd5,0x0b,0xfe,0x4c,0x63,0x5e,0xf1,0x83,0xd0,0x73,0x01,0x36,0x7e,0x90,0x10,0x0a,},"\xae\x2e\xb0\x18\xd4\x8d\xbd\x4f\x21\x0b\x16\x77\x8b\x5b\xd2\xfd\x14\xc9\x4e\x6b\xbf\x2b\x3f\xf8\x55\x18\xe5\x60\xab\x8d\x3e\x72\x20\x1f\x43\x34\x20\xf0\x0f\x11\xbc\x78\xe0\xe9\xf3\x72\x08\x75\xb2\xe9\xdc\x11\xe0\x43\x25\xb8\xb3\xf0\xd4\x65\xdd\xab\x21\x51\x1c\x45\x7d\x6a\xca\xd8\xf2\xfd\x5f\xdc\x0d\x28\x23\xfe\x6c\xaa\x66\xa1\x91\xa3\xb6\x32\x6b\x32\xa1\x6b\xef\xd6\x4d\x15\xb3\x61\xa4\x15\x13\x64\x1b\xce\xba\x26\xbf\xe9\x3b\xdf\x85\x4a\x4f\x8f\x8a\x0b\x29\xf7\xe2\x82\x62\xe2\xd6\xe9\x8a\xa2\x4a\xc2\x7f\x6f\x78\x83\xac\x01\xa7\x4c\x40\xcc\xe9\x47\xeb\xac\x70\xe9\xfe\xf2\xa1\x6e\x62\x89\xe4\x68\x95\x0e\x39\x1e\x9e\x24\xef\x58\xe8\x8a\x44\x37\x72\x69\xce\xba\xfe\xd8\x98\x7d\x22\x0d\xca\xe2\xd8\xb1\x26\xb6\xbf\x81\x21\x67\xd0\x23\xd9\xba\xac\x95\x0d\x9d\xb8\xcf\x52\xde\x63\x06\xbd\x48\x99\x96\x10\xc0\xa4\x33\xfa\x9e\x17\x71\xcb\x83\x2d\x41\x97\xaa\x34\x0d\xd0\xcc\xd0\x74\x4f\xc6\xb6\x2f\x90\xbd\x3e\xbb\x53\x08\xca\xb5\xf9\x40\xe2\x91\x64\x23\xcf\x0f\x3b\xf0\x80\xc0\x6a\x94\xf0\x26\x91\x04\x60\xdd\xa8\x09\x37\x4e\x64\x57\xf0\x64\xf1\x78\xe3\x08\xe7\xa1\xb5\xaf\x4d\xef\x31\x90\x07\xd0\x41\x77\x8c\x3d\x6a\x41\x9f\x51\xba\xdf\x87\x66\x38\x79\x30\x2b\x53\xff\x26\x9d\xf4\x42\xd0\xe0\x5c\x95\x8d\x5b\xaa\xcc\xee\xd7\xf5\xf8\xaf\xc8\x11\xc1\x89\x00\xee\x3b\x0f\x61\xe5\xdc\xcf\xd5\xda\xc8\x53\x32\xd3\x2e\xbb\xa3\x71\xaa\x2d\x47\xa6\x06\xf5\x95\x46\xe4\xbb\xb6\x05\xa7\x46\x77\xb1\x9a\x0f\xe8\xe9\x5f\x9f\x77\xc0\xb8\xb7\x1d\x07\xe9\x83\x00\x4d\xc2\xab\x2c\xb3\x79\x3a\x32\x3c\x10\x8d\xfa\x79\x70\xda\x00\xdb\x19\x86\x74\xbd\x34\xbf\x73\x10\x76\x7f\x76\xa2\x24\xe0\x7b\xdb\xc6\x2b\x9d\x07\x8c\xbc\x75\x36\x7e\x2e\xba\xa2\xc5\xd2\x74\xbf\x34\x27\xf2\xa0\xcc\x5d\xbe\xf0\xaf\x4e\x63\xad\x88\x9e\x13\x1b\x12\xbc\x8c\xa3\x2d\x82\x7f\x72\x60\xb0\x44\x9d\x04\x43\xfa\x28\x84\x40\xef\xd1\x36\x4e\x3c\x98\x49\x47\x7e\x73\xee\x0b\xa4\x24\x0d\x49\x2a\xf5\xce\x13\xc3\x45\x61\xb4\x50\x10\xc1\x09\xd8\x42\xc1\xfe\xd1\xbe\x3f\xa9\xe1\x84\xaa\xa1\x40\x64\xf4\x3f\x6d\xea\x0b\x65\x9c\x5b\x97\x89\x3c\xf2\xa4\x33\xbc\xfb\x1d\x2a\x87\xeb\x56\x4b\xd9\x09\x2c\x26\x66\x70\x47\x31\xf8\x3e\x56\x43\x4b\x2a\x42\x99\x65\x0c\x70\x60\xf9\xff\x7e\x8a\xad\xcb\x45\x93\xf6\x09\x18\x8d\x8b\x46\x76\x46\xcf\xe9\x52\x70\x06\x7a\x1d\x35\xcd\x75\x9f\xe5\x81\xaf\x4e\x62\x60\x2c\x02\xef\x14\x74\x41\x43\xeb\x42\x4f\x2d\x9f\x33\xa6\x02\x88\xc1\xb2\x5f\x08\xe4\xb2\xf5\xfe\xae\x06\xcb\xcc\x2b\x20\x52\xbf\x38\x4e\x1a\x6f\xcd\x84\x71\xce\x5e\x56\x58\xd7\x7f\x40\xc3\x5c\x41\x5e\x2a\x9e\x09\xfb\x58\x3b\xb7\x47\x12\x58\xe7\xc8\x06\xf3\xc2\x18\x22\xdd\x10\xf5\x6a\x64\x0c\xdc\x00\x12\x8d\x3b\xa5\x56\xba\x51\xdc\xaa\xb4\x7c\x3b\xaf\x9f\x01\x97\xd3\x66\x3d\xe8\xd0\x93\xe8\x31\x73\x32\x5d\xef\x1e\x83\xa2\xf5\xf5\xac\xf1\x2a\xe0\x9f\x3c\xe9\x6c\xd8\x88\x03\x4d\xcb\xe6\x14\x7d\xc5\x99\x83\x62\xa4\xbc\x40\x6d\x28\x84\x6a\xb1\x50\x3c\x17\xc9\x4f\x9a\xfd\x90\x3c\x9a\x58\xe1\xce\xbb\x4a\xbb\x4f\xf6\xf2\xa4\x10\x24\xe0\x6d\xca\xad\x14\xf5\xb7\x0c\x1b\x26\xe6\x9f\x96\xec\xf1\x4b\x8d\xa3\x1c\x62\x1f\x9a\xd4\xe3\x0a\xeb\x98\x23\x78\x67\x1f\x7d\x1f\x2c\x4b\x57\x2c\x41\xbb\x88\x30\x84\x0a\xc5\xdd\xce\xd8\x81\xf8\xff\xf2\x10\xc3\xc7\xf2\x36\xd8\xc5\xf2\xcf\xda\xcd\xa2\x98\x93\x30\x2f\xde\x15\x28\x2d\xb5\x40\xcb\x54\x37\x37\xdd\x77\x85\x25\x69\x22\x1f\xdd\xcd\xd6\x8d\x87\xe2\x40\x21\x79\xd3\xa5\xa7\x77\x34\xc2\x75\xa1\xd5\x60\xa4\x62\xf4\x03\x18\xbb\x68\x19\x83\x7d\xa3\xd3\x05\xeb\x49\xb3\x86\x50\xef\xdc\x8f\xe4\x09\xd4\x0f\xb9\x4c\xd5\xdc\x3e\xb0\x27\x38\xf3\x88\x52\xf6\x71\xa0\xc4\x14\x14\xb7\x6f\xb4\x36\xf3\x41\x7b\x8e\xf3\x00\x92\x1c\x00\x9e\xbb\xd7\xcf\x8e\x11"}, +{{0x18,0xe2,0x68,0xb1,0x5a,0x25,0x01,0xdd,0x4c,0x97,0x9d,0xc1,0x03,0xca,0x6a,0x84,0x22,0x16,0x13,0x2b,0x3b,0x50,0x81,0xd7,0x75,0xf8,0x86,0x40,0xf8,0x9c,0x80,0x41,},{0xb3,0x4e,0x19,0xc1,0xe2,0x08,0xfb,0x48,0xa8,0x85,0x07,0x9d,0x9f,0xbf,0x37,0xc7,0x4f,0x92,0x71,0x09,0x60,0xf8,0x32,0x15,0x4f,0xab,0x18,0x57,0x0c,0xfb,0x4c,0x1d,},{0xf2,0xdc,0xfc,0x06,0xef,0x1d,0x8e,0xcc,0xd8,0xe4,0x0b,0xdf,0x01,0x30,0x7d,0xd1,0x96,0x83,0xf2,0x14,0xd4,0xf0,0x84,0xe6,0xb6,0x93,0x4f,0x63,0x72,0x78,0x30,0x0d,0xbb,0x18,0x89,0xf2,0xd3,0x7f,0x53,0xb3,0xae,0xf2,0x6f,0xbb,0x3e,0x36,0xbd,0x75,0x98,0x5f,0xa7,0xc8,0xea,0x6d,0xdf,0xfa,0x72,0xc8,0xe4,0x06,0xf2,0x4b,0xb2,0x0e,},"\x42\x4b\xdc\xf0\xb2\x56\x00\x14\x39\xd1\x69\x58\xff\xf6\x48\xcf\x7a\x86\x04\xaf\x22\xcf\xa5\xb4\x43\x31\xb4\xdc\x35\x6d\xff\x25\xcc\x05\x63\xda\x9d\x64\x01\x33\xac\xb7\x0b\x6a\x11\x76\xc4\x82\xdb\xc9\x40\x8c\xd6\x79\x3d\x56\xbc\x29\xcc\x40\x88\x23\xd3\x88\xed\x88\xb2\x4c\xeb\x66\x21\xdb\xac\x00\x23\xee\x69\xf7\x6f\x82\x96\xa7\x39\x52\x11\x68\x5b\x3c\xea\xa9\x95\xf0\x35\x5d\x9a\xad\x3d\x97\x35\x8f\x4a\x37\x9e\x59\x20\xec\x54\x5f\x46\x96\x21\xcf\x76\x8a\xbf\x55\xd2\xa5\x54\xc9\x49\xb0\xed\x70\x18\x7c\x22\x05\xad\x03\x29\x85\xc9\xb5\xb2\xe4\xba\x57\xe0\xb4\xa4\x7d\x34\x45\x12\xb8\x4b\xfe\x9f\x3a\xa5\x60\xfe\x6e\xcf\xc5\xbd\xf8\xc3\xb4\x18\x45\x29\x35\x73\xf8\x1e\xd3\xb7\x0e\xdc\x63\xa3\x0c\x70\xcd\xa3\xf4\x55\x90\x13\x13\xf6\xd2\x3d\xb3\x09\x47\x8f\x03\xe3\x4e\x71\x35\x6d\x83\xfa\x5d\xb9\x28\x0c\xc2\xb4\x36\x9c\x3d\x24\xdd\x90\x38\xf2\x47\x59\x6c\x39\x1e\x48\xb2\xf3\xf8\x90\xa1\x41\xca\x1d\x12\x07\x7c\x69\x34\x47\x35\xa5\x9b\x1d\xd4\x07\x6b\x22\xe1\x61\x89\x99\x1e\x5f\x1b\xe4\xfb\x76\x95\xaf\x90\xeb\xea\x5d\xf2\x86\x13\x5c\xec\x2a\x6e\x99\xaa\x1d\xda\x32\x8e\x62\xc0\xdf\xb6\x37\x42\x20\x2d\x63\x62\x4d\xcc\x0c\x5c\xf1\xa5\xdf\x79\xe2\x87\x8d\xbc\x71\xfa\x96\x57\x66\x01\xaf\x22\x84\x4f\x54\x57\x33\x12\x6a\xf7\xd3\x98\x4c\x3e\xd2\x52\xe6\xa8\x76\x44\x5c\x92\x25\x9f\xbb\x47\x0a\x10\x56\x9b\x49\xe5\x79\x1f\xd0\x18\x2c\xfe\x1c\x3f\x88\x29\x7f\xac\xc8\xc3\x1a\x53\x32\xf1\xf4\xeb\x49\x58\xdb\x13\xb6\xc0\x79\xaa\x9c\x94\x94\x87\x26\x34\x03\x19\x0c\x83\xc1\x1a\x43\x19\x1f\xfe\xc6\x02\x3f\xb3\x4c\xfa\xb2\x52\x5b\xeb\x54\x6c\xf9\x20\x0a\x96\xf5\x85\x4b\x2f\x78\xec\xb2\xd9\xa5\x3a\xa9\xd2\x87\xa9\x0d\x4d\x41\x0a\x63\xad\xa0\xe9\x75\xd3\x04\xd5\x14\x83\x53\x46\x3f\xa8\x05\xb4\x80\x5f\xb4\x68\x7e\xd8\x85\x7d\xfc\xe4\xbc\x6e\x80\x83\x3c\x8f\x9a\x79\xcd\x4f\x02\x9a\x2d\x80\x2b\xfd\xc8\x19\xed\x0c\x0a\xc8\xf2\x10\x23\x28\x7f\x2b\x4b\xaf\xbc\xc8\x99\x93\xfe\x46\xd5\x2a\x9c\x62\x46\xde\xad\x61\x7d\xf7\x97\xd4\x8e\xe9\x85\xf0\xf0\xdf\x9a\xa8\x2e\xa2\x0e\x0d\x0d\xb2\x8a\x25\x4a\x9a\x25\x3f\x39\xf9\xcf\x01\xe3\xdb\x8f\x3e\xbc\xf7\xcb\x97\xce\xc5\x8c\x4e\xfe\x03\x12\x69\xb4\xb3\x7e\x4c\xbb\x36\x1f\x73\xab\x4b\x49\x80\xbd\x90\x08\x49\x53\x88\x44\xc5\x2c\xb3\xac\x75\x83\xb8\xf8\x96\x53\xa0\xde\x65\xa8\xbe\x91\x58\x2c\x55\x23\x9c\xb8\xf5\xd5\x31\x8a\x88\xd1\x60\xe1\xc8\x71\xe5\xea\x7e\x75\xf5\xa6\x9c\xba\x85\x38\x22\x1a\xb4\x2c\xe2\xa2\xc4\xd9\xc3\xb7\xec\x85\x7f\x23\x0d\x57\x37\x31\x13\x36\x86\xae\x8a\x7e\xd6\x40\xf4\x2f\x31\x02\x94\x89\xe4\xe6\xaf\x2b\x3e\xa4\xc7\x94\x8e\xd5\x37\xc0\xc5\x90\x67\x26\xc2\xb6\x25\xfd\x5f\x94\x9e\x3a\x7c\xf3\xb6\xe9\x98\xec\x76\x1d\xd6\xe2\xb5\x17\x1a\x68\x74\x97\x52\xe7\x21\xb7\x88\xc3\x47\x7f\xa1\x90\xcd\x6e\xa8\x1d\x57\x9d\xce\x64\x62\xd9\xc6\x62\xad\x89\x62\xe7\x93\x38\x71\x0c\xc8\xd2\x73\x8a\x5f\xb0\x4a\xdf\xdb\x3f\x14\x32\xcf\xd8\x0e\x2e\x96\x7d\xa0\x00\xd8\x3a\x0f\xa8\x5a\xba\xe2\x95\x2f\x3f\x36\x83\xe2\x54\xd8\x68\xf4\xbf\x80\x9e\xb2\xe3\x00\xe7\xb2\x09\x73\x4a\x3c\x89\x4e\x96\x6b\x16\x08\x8d\x5e\xd3\x54\xbf\xfb\xff\xbb\xf2\xec\x2b\xe9\x3a\x32\xa8\xbe\x5c\xfa\x18\xfa\x56\x53\x01\x2e\xda\xe5\xaf\xd8\x70\x9c\xa5\x5c\x0c\xf2\x3a\x55\x0d\x34\xca\x0f\x32\xd8\xf6\x66\xfb\x47\xa1\x2f\x2b\x73\x53\xa4\x0c\x53\x79\xf7\x53\x66\xc1\x3f\x4a\xb9\xf1\x4c\xf8\x0a\x94\xe1\xf1\x3d\x8b\x09\xb7\x6f\xd8\xd1\x4f\xfa\x53\x8f\x31\xfd\x8a\xeb\x49\xd3\x34\x33\xf4\xdf\x7c\x2c\xa6\x73\x99\x57\x9f\xe9\x90\x78\xaa\x72\x1d\x6b\x6f\xc0\xc5\x0e\x8a\x91\xfc\x71\xca\x25\xea\xc1\x37\x6f\xc6\x71\xbf\x61\x53\xe7\x20\xb2\x5c\x7e\x97\xa3\xd4\xef\x84\x42\xac\x67\xac\xf5\x8b\x50\x4b\x67\x15\x8f\x91\x30\x25"}, +{{0x3c,0x39,0x3f,0x9d,0xf1,0xfb,0x0b,0x1e,0xec,0x09,0xb7,0xf2,0x70,0xb8,0x59,0x82,0xba,0x0f,0xd5,0xe4,0xb1,0x79,0x5e,0x1a,0x7f,0xa9,0x91,0x37,0xfe,0xe2,0x4d,0x7d,},{0x97,0x4f,0xe2,0x37,0x30,0xfc,0x17,0x94,0x56,0x70,0xfb,0xc1,0xf8,0x0b,0x93,0xf9,0x45,0x93,0xc8,0xd4,0x4b,0xc7,0x5d,0x18,0x9a,0x6b,0xbf,0xaa,0xba,0xf5,0xdb,0xd9,},{0x22,0x33,0x3e,0x56,0x41,0x0f,0xdc,0xbf,0x84,0xf6,0xa8,0xde,0x74,0x13,0x37,0x69,0x16,0x84,0x49,0x5b,0xa6,0x9e,0xff,0x59,0x6d,0xb9,0xc0,0x3a,0x28,0x12,0x10,0x88,0x1e,0x6c,0x91,0xef,0xa9,0x1b,0x21,0x83,0xc0,0xea,0xc9,0x16,0x15,0x28,0x17,0xa7,0x8c,0xa7,0x24,0xba,0x7c,0x8b,0x51,0xbb,0x4c,0xaa,0xde,0xa9,0xa3,0x41,0xeb,0x0e,},"\x54\xd8\xb8\xd5\xfa\xc2\x8c\xff\xa7\x7a\x09\x16\xd6\x33\x3c\x16\xed\xbc\x8b\xb7\x4a\xa0\x6e\x56\xdc\x00\xe4\x7e\x39\x29\xe4\x08\x64\xb8\x84\x0d\x91\x20\x79\x59\x7e\xac\xd8\x1d\xae\x43\xe2\x78\x5d\xfc\x68\x9f\x3e\x85\xf8\xc6\x65\x81\xef\xc5\xe8\x53\xd1\xfa\xaa\xc7\x44\x40\x0a\xb0\x8c\xbd\xb5\xd1\x61\x46\xfa\x60\xf9\x99\x05\xed\x84\xfd\x29\x36\xdd\x73\xf4\xbc\xa2\x57\x2b\x7c\xf5\x16\x05\x60\xff\xaa\x68\xda\x7a\x67\xe4\x0e\x08\xa7\xbb\x7a\xef\xc4\x04\x3e\xbe\xd5\xfe\x80\xa4\x14\x81\x7e\xdf\x2c\x63\xf6\x2f\xac\x0d\x47\x44\x6e\xd0\xbb\x58\x40\x58\xf4\x87\x2f\xec\xff\x62\x15\x59\x31\x1a\x27\x0a\xea\x37\xa6\x29\x68\x64\xe8\xd1\x68\xbf\x1e\x2f\x55\xcd\x3b\x27\x6e\xdf\xa6\x12\xb5\xd9\xc3\x36\x2e\x61\x8b\xe6\xe8\x2a\x6e\x5f\x82\x66\x79\x24\xf3\xd1\xd3\xdf\x82\x5f\x9d\x23\xf4\xd6\x14\x2d\x31\x00\xdf\xc7\x0f\x70\x60\x3a\xbf\x3f\xda\xda\xca\x69\xef\x6a\x18\xef\x90\x92\xb3\xc4\x1e\xc6\x58\xab\x27\x21\x6f\xc6\x14\x7a\x08\x0a\xcd\xa6\x0a\x84\x19\x84\xee\x83\xf4\x1a\xc4\x2a\x80\xea\xac\x91\xff\xfc\x82\x28\x39\x1e\xf5\x83\xab\x3e\xdd\xcf\x87\x65\x23\xc2\x02\x81\x35\x53\x00\xd8\x6c\x11\xa4\xe7\xc1\xad\xe8\xe5\x05\x60\xf4\x39\x06\xc9\xbc\x8c\xa5\xfb\xf8\x33\x9f\xbe\xbd\x02\xe3\x3e\x85\x18\xbe\xe5\xe8\x06\xb8\xc1\x0f\x82\x77\xf4\x10\x66\x47\x35\xa2\xbf\x55\x68\x39\x63\x54\x92\x45\x2e\x6c\xa0\x79\xde\xb9\x75\x1c\xfc\x67\x97\xf4\x9b\xca\x96\x13\xff\x2e\x7f\xdd\x36\x46\xf7\xc5\x23\x6a\x36\xbd\xf0\x05\x17\x45\xe5\x95\xdc\x00\x72\xfd\x66\x51\xd5\x76\x27\xa6\x00\x4c\x0f\x0c\xfa\xe8\x56\xbb\xc2\x8a\x12\x31\xcb\x83\x96\x65\xff\x04\x15\x2e\xc3\x1c\x00\x7b\x3e\x2e\xd0\xa9\x73\xb2\x4c\x93\x14\x9c\xe7\x01\xe6\xfd\x65\x39\x20\x6a\xe9\x1b\xec\x4c\xe6\x5a\x89\xdb\x26\xc7\xd3\x8c\xec\xb8\x91\x9f\x96\xfb\x6c\xb8\xf6\xc1\x93\x9d\x90\xfb\x3f\x90\xb8\x87\x78\x9f\x29\x57\x5a\xb2\x0e\x0b\x08\xbc\x35\x81\x53\xd8\xc0\x35\x21\xdc\x89\x18\x70\xb5\xf7\xee\xdc\xc1\xe6\x2b\xee\x7d\xa0\x63\xae\x66\xff\x0a\x4b\x7d\x98\xd1\xcb\x75\x8f\x69\x74\x3c\x3d\xb3\xae\x2a\x2c\x9b\xe1\xbe\x09\x4f\x17\xcd\x28\xf9\x2d\x8c\xcb\xca\x98\x3c\x74\x9c\x75\xc6\x10\xf8\x40\x83\x6e\x2c\x43\x0c\xcd\xef\xf0\xaf\xa5\x44\x44\xf1\x2b\x4a\x4f\x00\x2c\x60\x94\x51\x83\x42\x44\xc0\xc0\x7d\xf8\xe1\x22\x02\xa6\x5f\x94\x44\x7c\xd4\x90\x3a\xcb\x60\x6d\x77\x25\xa8\x6e\x4a\x23\x43\x98\x4e\x67\x9c\x4a\xf1\xb3\x67\x9c\x75\x5e\xa5\x0d\x0a\xbe\x2f\xcc\x0c\x1c\x33\x51\xa9\xee\x19\x6b\x46\x44\xc4\x24\x22\x2b\xe9\x9e\x2f\xb3\x73\xf9\x64\x1e\x3f\xae\xbf\xf4\x31\x70\xeb\x03\xfb\x8e\xc4\x55\x7d\x15\x1a\x55\xfa\xb6\xc4\x99\xd4\x44\xc8\x4b\xe8\x9f\x24\x47\x68\x2d\xe4\xe6\xf6\x35\x34\x75\xef\xcb\x8f\xc5\x32\x56\x76\x3a\x94\x8d\xc7\x5c\x51\x5f\xa3\x53\x54\x5d\x0c\xba\xd2\x9d\xf5\xe9\xdb\x5c\xc4\x57\xed\x30\x86\xcf\xfb\x3d\x75\xe8\x46\xc4\xe8\xd8\x81\x47\xfc\xd0\xd8\xaa\x5a\xba\xb4\x9b\x5e\x05\xc3\xd7\xfe\xef\x63\x79\x43\x34\x7a\xd3\xf4\x92\xee\x35\x6e\xf3\x48\x81\xcf\xd8\x5a\xbc\xe8\xa1\x44\xce\x77\x61\xe2\x84\xe8\xb8\xcb\x08\x96\x60\x49\x04\x7a\x99\x6e\x23\x55\x9f\x77\x6b\x1a\x9f\x41\xcb\xa3\x95\x41\x08\x48\x6e\x29\x27\xbe\xb6\x43\x3a\x36\xff\x8b\x2f\x03\xaa\x74\xb3\xd2\x09\xc4\x88\xe0\x77\xf9\x24\xf2\x31\xe2\x83\x45\x94\x2c\x7d\xcc\x2e\x61\xd7\xc9\xb5\x22\xb6\x59\xfc\xb5\x36\x62\xaf\xf3\x64\x8f\x66\xda\x3e\x83\xe5\x9b\x0d\xaa\x90\xb9\x4c\x51\x5d\xad\xab\x10\xd5\xa8\x39\xcb\x3a\x2f\x1d\x3c\xd0\x92\xde\x55\xd9\x95\x13\x8c\x3a\xc0\xb9\x07\xaf\x15\xac\x63\xec\x18\x74\x11\x43\x27\xe2\x19\x71\x34\x5e\xf1\x70\x31\xd5\x26\x17\xe7\x84\xda\x37\x71\x43\x9b\xe2\xe8\x41\x48\xbc\xfe\xa1\x32\xbd\xe1\x0e\x6f\xda\x54\x7d\xcb\xb1\xc4\xd8\xf7\x4d\xdc\xe1\xfc\xcf\x82\x13\xe0\xda\x6e\x97\xb8\x1f\x75"}, +{{0xf8,0x66,0x9c,0x88,0xf1,0x68,0x5b,0xbf,0x04,0x80,0xcc,0x92,0x21,0xac,0x2e,0xad,0x8f,0x55,0x1b,0xfa,0x87,0xec,0xba,0x2f,0xd4,0xdd,0xf3,0xba,0x34,0x76,0xeb,0xda,},{0x34,0x72,0x3f,0xb8,0xe2,0x53,0xad,0x9c,0x71,0xce,0xfd,0xe0,0x36,0x28,0xd2,0x04,0xe5,0x35,0xde,0x47,0x9e,0x10,0x48,0xe5,0x18,0x87,0x62,0xa1,0xf3,0x37,0xfe,0x5f,},{0x37,0x46,0xda,0x6c,0xd8,0xca,0x10,0x8b,0xee,0xf0,0x64,0x87,0xbe,0xe6,0x35,0x84,0xf8,0x12,0xc8,0xe0,0x69,0x5f,0xc8,0x63,0xb8,0x6e,0x5d,0xb1,0x32,0x38,0x0b,0x62,0xff,0x85,0x44,0xf6,0xf3,0x74,0x82,0x5b,0x0e,0x3e,0xa0,0x62,0x0e,0xf8,0x54,0xc1,0x33,0x11,0x14,0xd6,0x67,0xdf,0x1f,0x9e,0xa7,0x76,0xc3,0x96,0x38,0x70,0x29,0x0d,},"\x5b\x49\x41\xbe\xec\x22\x41\xc9\xfb\x76\xd8\x48\x4f\x4f\x3f\x3a\xb4\xff\xe8\xec\xc8\xe7\xae\xc7\x6d\xe2\xab\x8c\x36\x85\x84\xd7\x51\xb0\xd3\xfe\xb8\xa1\xdc\x81\x68\xcd\xc6\x94\x96\x8f\x66\xb2\xa0\xb0\x52\xaf\xbf\x8b\xe3\xa7\xd9\x51\x63\xe9\xda\x91\x41\xc5\x9c\xa5\x59\x76\xc2\x92\xc5\xc7\x4d\x31\x31\x8d\x6a\x91\xe7\x81\x7c\x5a\x8b\x2f\x81\x21\x18\xcb\xeb\xa3\xa1\x33\x23\xcd\x97\x48\xbf\x86\xed\x1a\x85\xdd\x4e\xbc\x0d\xf4\x95\xcf\xa3\xd4\x62\x74\x34\xbf\x14\xaa\xe8\xab\x67\x81\x46\x7a\x56\xd9\x65\xd1\x0e\x63\x71\x98\x9d\xfa\x0f\x6b\xc0\xf7\x85\x9f\x37\x71\xeb\x90\x04\xb3\x43\x67\xdb\x27\x05\xdb\xd6\x0f\xa8\xf7\x89\x5c\x1e\xad\xf5\x9f\x53\xda\xb1\x68\xb4\xf9\x36\x39\x79\x02\x55\x01\xdd\xd9\x68\x0d\xeb\xc0\x7c\xd1\xca\x4a\x09\x97\x87\x6e\x92\x11\xf3\x07\xd9\xb7\xb9\xd9\x04\xe4\x8d\x28\x61\xa7\x78\xb8\x79\xad\x59\x0a\x9a\x2f\x14\x1b\xd5\x68\xe3\xa1\xbb\x24\x94\x62\x8e\x9e\xc0\xc6\x42\x55\xae\xea\x6f\x0e\xed\xca\x30\xad\x38\xa1\xf3\xff\xec\x3b\x2b\x5e\x94\x2e\x21\x94\x01\x04\xe9\x14\xd1\x1a\x44\xc0\x0f\xdd\x47\xda\x3e\x55\x13\xaa\x85\x30\xae\xe2\x47\xc9\x5c\xa6\x6d\x08\xa2\x60\x8c\x75\xba\x98\x58\xda\x14\xf9\xa8\xa3\x2b\xe7\x13\xd3\x09\xe0\xf5\x84\xc8\x1e\xf5\xbe\x04\x0e\x00\x65\xf0\x7b\x77\x5a\xe1\x75\xdf\xe2\xc8\xb9\x0a\x88\xcc\xda\x17\xfa\x4f\x21\xc7\x7e\xad\xf5\xd2\x5b\x6e\x40\x4b\xf0\x04\x47\x9e\x05\xa0\x1a\xc0\x04\x2b\x89\x93\x7e\xb2\x78\xc1\xc3\x4f\x33\x02\x8d\xb7\x80\xba\x3b\x61\x79\x18\x59\x5a\x39\xc0\xfc\xad\x67\x4b\x85\xc4\x0c\xac\x8d\x34\x5b\x7c\xa0\xbb\x48\xa2\x8e\x66\xc4\x4d\x8b\xb5\xf2\x79\x41\xe4\x0b\x0e\x9c\x70\x97\x97\x6c\x62\xdf\xef\x50\xc9\x8f\x17\x56\x6c\xcb\xac\xc8\x7c\xb0\x3b\x94\xdf\xdf\xaf\x32\xf1\xe5\x6f\xfa\x63\x9d\x63\x61\x1e\x21\x3c\xeb\xf5\x4c\xd0\xa3\xe2\x17\x2d\x81\x1c\x0e\xbd\x75\xb1\xa8\x64\x62\x64\xdd\x8b\x1a\xbd\x46\xe5\x48\x97\x2a\x1b\x26\x2c\xd9\x5d\x51\x15\x36\xdd\xdc\xb4\x97\x29\xfe\x7b\xd0\x0b\x38\x38\xbd\x2f\x20\xa1\x42\x64\x0e\xdb\x1b\x6e\x76\x5b\x65\xda\x72\xe7\x23\x32\x61\xc8\x89\x2e\x2f\x49\x49\xbb\x51\xf3\x2a\x1a\x5a\x3e\xe1\x49\xbe\xa2\x6f\xdc\xed\xb9\x91\xd2\xcd\x12\x66\x37\xe2\x97\x1e\x9b\x6f\x0b\x78\x5d\xf2\x8a\x48\xf3\x01\x70\x73\x49\x42\x3f\x44\xe8\x46\x22\x89\xd7\x25\x49\x82\x30\x48\x9d\xf1\xb5\x1b\xe3\x0f\x08\xd7\xe3\x25\x05\x65\xc6\xef\x82\x4b\xc5\x3a\x1b\xa7\x4a\x57\xa2\x5c\x06\x86\xad\xcb\x6c\x82\x5a\xb1\xca\x70\xc8\xa5\xd4\x6d\xbb\xc6\xfa\x60\x74\x61\xe2\x6d\x16\xfe\x93\xbb\x3d\x3a\x94\x3a\x3d\xc0\x5f\x30\xea\x6d\xc8\xbb\x12\xd7\x08\x21\xd3\x20\xf1\xad\xf1\xce\xba\x4b\xe6\x57\x19\x4f\x7f\xcc\xd2\x19\x90\xf8\x62\x9d\x74\x46\x01\xcf\x52\xea\x6d\x94\x05\xaa\xa2\x87\x8f\x1e\xec\x40\x03\xb4\x5a\x42\x18\xd8\xf8\x0b\xb0\xf5\xaf\x04\x73\x26\x48\x77\x52\xe2\xb7\x6d\x68\x87\x25\x20\xbb\xea\xe7\xb3\x09\xd7\x82\x82\xa0\x73\xfe\x0b\x1a\x1a\x7a\x98\xda\x23\xdf\x68\xca\xf8\xc2\x69\x9b\x1c\x7d\x0f\x47\xbd\x7d\xe2\xc0\xbb\x23\x36\x99\x63\xe6\x8a\x69\x74\xc8\xe2\xb5\x95\xb8\x29\x3a\x9f\x4d\x98\xdf\x7e\x9a\xe3\xad\xd2\xa3\xf6\x4e\x83\x03\x97\x39\x64\x2d\x19\x22\x04\xe8\x5e\x6c\x48\xd5\xd6\x71\xf6\xc7\x5a\x0a\x89\x57\xed\xbb\x74\x18\x76\x20\xf2\xab\xa9\x9c\x1c\x62\x58\x4c\x59\xac\x00\x64\x7e\x3f\xb4\x02\x92\xb9\xdc\x1a\x33\x46\x86\x85\x53\x39\x2f\xd3\xf1\x1d\x6d\xc6\xf5\xf2\xf4\xe8\x5e\xe2\x51\x25\xcd\xd6\x44\x74\x3c\x7d\x45\x28\x1e\xda\xc6\x38\x4c\x77\xcb\x98\xa6\x7d\x9a\xe6\xfc\x9a\x0a\x76\xb9\xf6\xfa\x69\x6f\xdf\x4a\xce\xab\x5f\x79\x4e\xe5\x21\xb1\xe5\xa0\xee\x57\xaf\x53\xbd\xf1\x76\x80\x1b\x4f\x45\xcf\xb3\xca\xe3\x28\x72\x34\x23\x4b\x77\xce\x21\xed\xf8\x68\x0d\x68\xc4\xa8\xee\xcf\x1b\x03\x53\x7e\xa5\x69\x9a\xcb\x56\x27\x77\xe4\x2a\x48\x6f\xe7\xcd"}, +{{0xce,0xcc,0xc6,0x83,0x11,0xfc,0x45,0xb6,0xc2,0xa2,0xf1,0xff,0x9c,0xdd,0xe0,0x07,0xec,0x78,0x7f,0xdf,0x25,0xd0,0x2c,0xcd,0x2a,0x1c,0xad,0x9d,0xe3,0xfb,0x4c,0xff,},{0x6f,0x80,0x47,0x34,0xef,0x92,0x82,0x41,0x80,0xda,0x71,0xe5,0x5c,0xf3,0xbf,0x1a,0xfe,0xf6,0x5b,0xcf,0x56,0x09,0x62,0xe0,0xb0,0xac,0xbb,0x2d,0x8c,0xca,0x59,0x84,},{0x3c,0x44,0x62,0xaa,0x47,0x01,0x01,0x32,0xdb,0xb2,0x63,0x11,0xe4,0x44,0x72,0x72,0x79,0xed,0xad,0xe1,0x5a,0x4d,0x66,0x2c,0xf6,0x47,0xf3,0x27,0x5c,0xf3,0x25,0x3e,0x6d,0xe9,0x33,0x38,0x30,0xe0,0x51,0x7a,0xa5,0xfa,0x7b,0xc2,0xd0,0xe6,0x3e,0xa2,0x59,0x7a,0x94,0xb0,0xfe,0x92,0x70,0x6e,0xcd,0x17,0x2c,0x5e,0xc5,0xc7,0xf0,0x06,},"\xba\xc1\x86\xd9\xfe\x5a\xbd\xa7\x9c\x3a\x35\xa7\xa3\xc2\xea\xe6\xae\x6a\xb2\x82\x47\x91\x27\x70\xc8\x4e\xfd\x04\x8e\xbd\x3a\xba\x57\xc3\x7c\xf4\xc6\xc7\xf3\x0a\x79\xf6\x8a\x3f\x76\xb2\x0c\xd8\xc6\x63\x1f\xcc\x96\x67\x05\x22\x08\x0e\x6b\x62\xe8\x87\xae\x6f\x44\x36\xd4\xca\xf5\x69\x43\x13\x1c\x52\xdd\x28\x2b\x25\x1c\xd0\x75\xf1\xf7\xf8\xe0\xbd\xb6\xbe\xdf\xc9\xa0\x79\x6f\x55\x79\x04\x2b\x56\xe6\x93\x74\x96\x1b\x11\xdf\xd6\x1b\x12\xde\x2b\xb7\xd4\x9b\xfc\x50\x9c\xdb\x31\x38\xf3\x35\x6a\x0d\xde\xd9\x8f\x53\x01\xb7\xc4\xa7\x48\xbf\x89\xb2\x3d\xf4\xf7\x47\x2f\xf8\xb1\xf5\x05\xd7\x65\xc6\xff\x82\xdb\xad\x74\xb9\xd7\xae\xf2\x2f\xbc\xca\x0b\x7f\x35\x04\x2f\x9a\x76\x2b\xd0\x69\x02\xbb\x21\xc7\xf9\xf7\xf6\x6b\xef\x38\x90\x1d\x75\x01\x2d\x61\xd7\x44\xde\xe7\xaf\xd8\x9f\xc7\xe9\x08\xc4\x06\x85\xbd\x44\x0a\xed\xa4\x20\x4d\x00\x6f\x26\x30\x7d\x82\xa4\x96\x96\x31\x15\xf9\x0e\x09\xf7\x66\x88\x29\x1f\x4a\x67\xd6\x41\x1f\x76\xd1\x66\x17\x87\x5b\x2b\x99\x82\xdf\xdc\x5e\xe9\xb8\x3b\x98\x17\x00\x93\x19\x11\x0b\x54\x04\xc6\x31\x16\xfb\x6e\x94\x64\x84\x6f\xa0\x09\x55\x56\x32\xf0\x76\x98\x4c\x15\xe1\xf6\x08\x17\x33\xa0\xd4\x6f\x2d\x6a\x3c\xeb\xf7\x9e\xd9\x02\x0c\x9d\xec\x8d\xf1\x58\xa3\x34\x1f\x39\xea\xa5\xfc\xf1\xcf\x42\xa9\x48\x49\xb2\x35\x2c\x1a\x1e\xcd\x4f\xb8\x14\xc2\x0d\x07\xdf\xda\x31\x2b\xd4\xf2\xf5\x8c\x15\x76\xb4\xaa\x31\x5c\x96\xc8\x78\x6a\x4c\xfb\xb7\x36\xb2\xd2\x3c\x38\xb1\xd8\x1c\x46\x44\xea\x36\xaf\xa0\x76\xe0\x55\xbe\x59\x17\xcd\x7a\x92\x35\x0a\x7e\xd6\x6a\x5a\xb2\x25\x3f\x55\xc4\xfd\x1a\x0d\x0e\x6d\x4e\xda\xb5\xf7\x12\xed\xb4\x40\xc0\x6f\xac\x8f\x07\xe6\xd7\x3c\xc9\x0b\x2b\xa7\x13\xd7\x3c\x73\x80\x23\x61\xce\x46\xa4\xeb\x5e\xd1\x06\x0c\x4c\xf5\x32\x07\xd3\x01\xf0\xfc\xd4\xf0\xc9\xd1\x58\x0d\xb2\xfc\x10\x59\xd3\x72\x07\x64\x38\xa0\x11\x92\xa7\xf9\xfd\x6f\x78\x83\xf5\x64\x22\x86\x6f\xd9\xf0\xaf\xe5\x3f\xdc\x91\x0a\xfa\x5a\x75\x1c\xbf\xa3\x77\x59\x25\x79\x16\x5c\xb5\x6d\xc3\xeb\x4d\xce\x67\xe3\xdb\x33\xa9\x81\xa5\x6b\x7d\x9f\x7b\xde\xa7\x4f\xba\xea\x34\x78\xe6\xab\x2c\x64\x4f\xd7\x77\xb8\xbf\xa7\x2a\xa0\xf0\xa5\x21\x98\xd3\x6e\x5b\x63\x4d\x2c\x9a\x11\xb7\xfe\x0a\xb2\xf9\xa4\x09\x01\xc5\xb1\x48\xa0\x19\x2e\x95\xa1\x70\xba\xf7\xd5\x35\x0f\xe0\x1e\x56\x95\x42\xb9\x34\x85\xa4\x19\x71\x44\x34\x85\xfa\xf5\x7f\x67\xf5\x6d\xfe\x2c\x58\xe5\x39\xc9\xf9\xb4\x49\xc3\xf9\x12\x49\xa1\x0c\x1a\x1b\xe7\xe0\xb3\xea\xbe\x8e\xe0\xba\xb1\xf1\x1f\x89\x61\x4d\xce\xd4\x18\xc6\x2a\x07\xa0\xb5\x9a\x13\x70\xd6\x53\x1b\xa1\x77\x09\x1c\x6a\xd5\x95\xfb\x59\x48\x82\x04\xf6\x33\x44\x73\x6e\xa1\x01\x7a\xff\xbe\xb7\x53\xa9\x97\x86\xb1\xeb\x64\x51\x0e\x2e\x71\x7e\xc9\x0e\x02\x74\x4b\xc3\x52\xd3\xf1\xb2\xab\x7b\xe0\xeb\x65\x62\x3d\x04\xfb\x3a\x04\x6c\xe7\xf4\xda\x69\x7d\x82\x98\x28\xa5\x2c\x7b\x04\x3b\x2a\x82\xec\x97\xfb\x04\x1b\xf5\x19\xb4\xde\x31\x6f\x4e\x2f\x5b\x0d\xb6\x2a\xed\x0e\xed\x95\xca\xd4\x32\x0c\x19\x47\xc3\x5f\xd8\x84\x7a\x58\x67\x87\x28\x83\x56\x11\x19\xc0\x1b\x00\x89\x21\x3d\x84\xdb\x99\xd4\x39\xf0\xf6\x44\x4d\x87\x83\xdd\x4b\x64\xbe\x35\x77\xcd\x46\x1c\xf7\x53\xc8\xe6\x1c\x91\x2d\xe2\xe5\xd7\xa7\xe2\xba\xef\xa2\x58\x97\x5d\x16\xef\x31\x17\xda\x59\xa6\xc8\x93\xf3\x33\x91\x87\xdf\x31\x68\xb8\x9f\x0f\xb0\xb2\x19\x8b\xb6\xf1\x59\x4b\xb8\x8f\x3d\x61\x0f\xce\xc3\xe3\x6d\xe0\x4a\xe1\x03\x28\x11\x2e\x6f\xf7\x4f\x5a\x8c\xe6\x8d\x40\x71\x74\xb4\xc0\x69\x1c\x76\x02\xea\xb1\xbb\x10\xf3\xc4\x9d\xd2\x2b\x84\x50\x78\x2d\xea\xe9\xa7\x31\x5e\x3b\x88\xde\x79\xcd\x15\xe6\xc9\x26\x81\x65\xed\x3a\x0f\xb3\xf8\x9b\x18\x3e\x1a\x21\x21\x52\x00\x3f\x32\xa2\x66\x5d\x37\xcd\xd7\xf6\xb5\x6c\x24\x53\xe5\x58\x0c\x4d\x21\xf9\x98\x3f\x38\x79\x8e\x9b"}, +{{0x7b,0x30,0xb4,0x2d,0xc2,0xc6,0x70,0xa1,0x95,0xfe,0x2a,0xf8,0x79,0xfc,0x5d,0xe3,0x74,0x02,0x45,0x88,0xfe,0x3d,0xe4,0x3e,0x2d,0xd5,0x08,0x44,0xf4,0x8f,0x42,0xbe,},{0x82,0xa2,0xac,0x60,0x79,0xf2,0x12,0xb5,0xee,0xdd,0x0c,0x19,0xe9,0x39,0x4f,0xaf,0xac,0xd7,0x4d,0x71,0x6f,0xde,0xfb,0xfc,0x6c,0xb8,0xa7,0xea,0xf4,0x1c,0x03,0x62,},{0x0a,0x63,0xb8,0x4f,0x46,0x93,0x5f,0xaf,0x3e,0xa1,0x64,0xb0,0x0a,0xf2,0x27,0xb0,0x08,0x68,0xa0,0x3f,0x56,0x12,0x93,0x5e,0x18,0x61,0x9a,0x84,0xa2,0xe5,0x7b,0x88,0x51,0xd7,0x46,0xe6,0x3f,0xd9,0x10,0x07,0x87,0xf5,0x33,0x8d,0x51,0xc1,0x07,0x3c,0x2f,0xc5,0x30,0x30,0x99,0xe1,0x87,0x3e,0x5e,0x3d,0x3e,0x5c,0x03,0x6f,0xbe,0x01,},"\xc6\x68\x7a\xef\xeb\xc5\xc8\x16\xd1\xa3\x34\x53\xbe\xca\x50\x20\xd3\xa9\x7c\xda\x1d\xac\x56\x62\xf0\xaf\x72\xba\xd4\x44\xe2\xfd\x11\x76\xa7\xb0\x4c\x1b\xd0\x9d\x83\x26\x18\x20\x9b\xf3\xe3\x3e\x52\x35\x38\xd6\xda\xa7\x53\x04\x6e\x87\x1d\xd3\xb3\xc7\xac\xad\x33\xe7\x9c\x1b\xb7\x89\x64\x07\x86\x5d\x16\x8d\x4b\xc3\x75\x7b\xde\x4f\x82\x3c\x08\x77\x86\x26\xf8\xc7\x1f\xb7\xcf\xcf\xdf\x03\xa8\x24\x97\xbd\x8b\xe7\xd8\xf8\xef\x64\x90\x30\xb5\xf3\x6a\x33\x94\x59\x96\x8e\x24\x6a\x1e\x42\x08\x53\xda\xce\x41\xca\x85\x0a\x4e\xea\xe8\x34\xae\x11\x96\x10\xca\x4c\xd0\x66\x2a\xac\x39\x62\x15\x86\x99\x80\x27\xef\x2f\x61\x48\x5c\x02\x85\x06\x71\x4a\xe0\x9c\x76\x39\x9d\x87\x3e\x80\x81\x58\x57\x8a\xa5\x9e\x82\x12\xf5\x88\x65\x31\x9f\x9e\x0d\x2b\x8d\xa7\xad\x52\x9e\x0a\xc1\xf1\xeb\x43\x5a\xec\xfd\x35\xf5\xab\xb9\x2b\xea\x50\x73\x49\x6b\xf4\xc0\xbf\x15\xba\xa2\x73\xbf\xc5\xc3\x10\x44\x74\xa2\xdc\xf1\x32\xc3\x33\xeb\x36\xec\x2c\xbf\x04\xfa\x95\x80\xb7\x68\xf5\xce\xa7\xb5\x61\x7e\x58\x80\xaf\xf6\x32\x01\xc2\x74\xd6\x69\x74\x3e\x1b\xc5\x56\xb0\x67\x90\x2e\xee\x29\xd2\x91\x11\x28\x89\x69\xcf\xfa\x87\x9f\xc9\xcb\xf6\x6f\xbf\x93\x26\xd9\xd9\x25\xac\x41\x02\xfa\x9f\x1a\x06\x08\x1a\xde\xc0\x79\xcb\xc9\x67\x46\xd7\x9b\x63\xa0\x12\xed\x77\xd8\x2c\x9f\xfd\x4e\x3f\x16\x1f\x6c\xea\x28\xcc\x23\xfa\xc2\xa5\x43\xf5\xb1\xd0\x64\x4e\xc0\x48\x38\x32\x7b\xcc\x65\x2b\x85\x8f\x93\xff\x46\x3f\x7e\x94\x9e\xec\x8c\x9d\xb6\x56\x9a\x86\x98\x4f\x83\x1d\xf6\xac\x6d\x95\xf3\x8f\x46\xce\xbb\x6e\x65\x83\x65\x7f\xac\xd2\x10\x8d\xbc\xd0\xaf\x23\xab\x01\x01\xa1\x30\x1b\xeb\x48\xa4\x4c\xac\xcb\x91\x09\x44\x73\xd7\xe5\xa5\xc8\x8c\x64\x4f\xd3\x42\x05\x73\xb6\x78\xf1\x7b\x51\x74\xcb\x14\xe9\x0f\xac\x69\x4d\x1d\xbc\x6c\x96\x32\xb5\x97\x4a\xef\x28\xac\x08\xd7\x20\xb2\xea\x30\x44\x0d\x2a\xfb\x04\x93\xb4\x0d\xb2\x4e\xfb\xdb\xf5\x3c\x43\x09\x21\xe5\x2a\x10\xb5\x46\x61\xe1\x49\xd1\x65\x59\x1a\x7c\xf9\x1d\x65\x08\xea\x47\x2f\xb3\xbe\x16\x39\x5e\x30\x31\x2f\x19\xb8\x7c\x47\xe4\x68\x04\xa0\xfa\x29\xb5\x6b\x5a\xc9\x50\x67\x7b\xc6\x02\x38\xb5\xe9\x9e\x03\x0b\x1e\x55\x21\x46\xa0\xe8\x8c\x29\x4c\xfc\xa8\x35\xc1\x01\xc5\x5f\x34\x23\x87\x4c\xc1\x28\x75\x6e\x73\xa5\xde\xbe\x8e\x97\xfe\x21\x66\xb6\x5c\xb4\x46\x42\x77\x0c\x6d\x1d\x23\x90\xaf\x1b\x0f\x31\xb9\x58\xc8\x30\xe9\xac\x4f\xe2\xf5\xad\x59\x05\x82\xfb\xb8\x92\xbf\x94\x95\x84\x47\x7e\xf7\xbd\xe2\x3f\x7d\xd0\x2b\x63\xf7\xc2\x90\x88\xa5\x72\x51\x00\x91\x32\xff\xbb\x78\xed\x14\xde\xfb\xef\xd9\xfd\x31\xfd\xca\xb0\x3b\xa8\x0a\x23\xf3\x33\x98\x37\x60\xab\xad\x4f\x16\xdd\xf9\xdd\x44\x14\xf0\x4d\x00\xdb\x56\xba\x72\xd6\x3a\x3a\x13\xd2\xc4\x42\xf5\x49\xfd\x66\xc9\x88\xd2\xe4\x60\x1d\x13\xb5\x2f\x77\x50\x0d\xd6\x92\xbe\xc9\xd6\xbd\x3b\xaf\xa9\x24\x2f\xdc\xfa\xeb\x69\xb9\x8b\x0b\x57\x89\xb2\x80\x38\x40\xde\xc6\x37\xb4\x9a\xf4\x38\x1a\xe3\xfa\x42\x9f\xb5\x34\x61\xa0\xc6\x74\xeb\x5a\xa1\x8d\xbd\x60\x7a\x2b\x77\xa9\x6d\x3a\xb4\x64\xec\xd9\x74\x92\xf6\xde\x46\x0c\x9f\x11\xb5\xc1\x75\x6c\xb5\x9c\xb1\x34\x8d\xfd\x77\x95\x6b\x71\x90\x7c\x54\x82\x1e\x30\x3c\xb8\xb1\x49\x06\xc0\x03\xe3\x48\x4b\xe4\xea\x05\xa6\x90\x1d\x69\xb0\x74\x85\xe8\x58\xf7\xb4\x71\xc6\x35\xf9\x03\x95\xb9\xa3\xe2\x24\x7f\x1a\xd1\x2b\x11\x8f\xfa\xfc\x72\x21\xa5\x7b\x10\xe3\x19\xb6\x1a\xf1\xc1\x36\x06\xa8\x16\x16\xce\x3f\x1d\x62\xba\x93\x2f\xf4\xe6\x3e\x74\xb8\x42\x55\xe3\xaf\x52\x10\xbb\xd5\x71\xbd\xa4\x4c\xbf\x44\xb7\x14\x42\x2c\xb4\x5c\x2e\xf2\x1f\x98\x13\x1b\xa9\x6b\x7e\xdb\x9b\x03\xe3\x3d\x7d\x18\x8d\x5b\x8d\x90\x4c\xb4\x13\x6f\xe2\x69\xdb\x14\x69\x88\x16\x8e\x7e\xe2\x45\x35\x63\x54\xf0\x02\xa5\xea\x8b\x35\xa3\xa9\x9e\x83\xa1\x32\x72\x27\x41\x44\xb3\x3a\x60\xca"}, +{{0x66,0x56,0xf4,0xd4,0x71,0x81,0x57,0xc4,0xba,0xc3,0x8f,0xf7,0xab,0xe5,0xeb,0x1f,0x81,0x2c,0x0b,0x98,0x6d,0x9c,0x01,0x4a,0xba,0xd5,0xb0,0x9a,0xa6,0xc8,0xee,0x4a,},{0xf3,0x08,0x78,0x98,0xe4,0x52,0xbe,0x9e,0x30,0xae,0xcc,0x4e,0x8f,0xfe,0x0c,0x01,0x16,0x98,0x88,0x68,0x3f,0x62,0xa4,0x5b,0x8d,0xa3,0x82,0x99,0x01,0x4f,0x5b,0x4a,},{0x9c,0x2c,0x39,0x91,0x5a,0xed,0x6a,0xdd,0x00,0x4e,0x7d,0xd6,0x84,0xee,0x3d,0xcd,0xd1,0x0d,0x87,0xa4,0x87,0xf6,0x77,0xe7,0x3c,0x2b,0xce,0x0f,0xca,0x7d,0x50,0x87,0x96,0x46,0x41,0x50,0xa5,0x2a,0x44,0x0f,0x52,0x37,0x85,0x0a,0x00,0x9c,0x72,0x16,0x2d,0x9d,0x29,0x85,0x47,0x0a,0x33,0x49,0x0e,0x66,0xd3,0xc4,0x01,0x70,0x4c,0x05,},"\x94\xd9\xe5\xe5\xa7\xb7\x05\xd9\xd9\x76\xfe\x71\xe9\x4d\x3f\x7f\xa7\x86\x6a\xfb\xf7\xec\xe4\x24\xf1\x36\x32\x77\x99\xb2\xb2\x06\xce\x4e\xf4\xc3\xf3\xe7\x05\x55\x3a\xfc\x8f\xd5\xc1\x95\x2a\x4c\x16\x65\x8d\x4a\x78\xaf\xbb\x9a\x97\xf2\x71\x93\xc6\x5b\x65\xb8\x2e\x8f\x3b\x71\x51\x5f\xac\x82\x64\x0e\x0f\x8a\x5f\xb3\x5a\xe6\xfc\x6a\x3d\xb0\x51\xa2\x2d\x4a\x53\x00\x41\x3e\x6e\x33\xd1\x9c\x20\x13\xc2\x98\x3a\xca\x8a\xd6\xce\xc2\xce\x64\xa8\x14\x16\x4f\x06\x1a\x1a\x3c\x5a\x86\x10\xa7\x65\x0b\xfb\x54\x23\xd4\x36\x2c\xe0\x22\x06\xdb\xe4\xa6\xfa\x82\x6f\x03\xb4\x2a\xc3\xcd\x9e\xa4\xc6\x51\x40\x1b\x3c\xea\x82\xc3\x99\x3f\x6a\xf8\xb2\xc9\xe2\xe6\xff\xe6\x92\x80\xab\x3f\x09\xfb\xe9\x0d\xd5\x47\xcc\xda\x9d\x9e\x8e\x8a\x53\x7b\x3b\x36\x05\x54\x22\x7e\xd0\x70\x9f\x29\x31\x98\x98\x2e\xfb\x5e\xfb\x0e\x73\xe0\x00\x42\xd1\xa0\x63\xb5\x74\x52\x02\x7d\xce\x1a\x39\xe4\xb0\x06\x8f\x58\xb1\x11\xec\x5d\xc1\x42\xbf\x41\x9a\xd8\x93\xd5\x4f\x42\x60\xcb\xde\x76\x28\xf7\x83\xde\x84\x96\x38\x03\x06\xa4\xef\xf6\xd8\x28\x69\x10\x42\x59\xc9\x4c\x54\xad\x5a\xa8\xb0\x67\xc4\x24\x96\xcb\x88\xdd\x31\x15\x0e\xa0\x4d\x49\x9b\xfa\xc9\x1f\x4b\xb3\xe6\x8a\xf5\xaf\x7a\x56\x8a\x3e\x4c\xe7\xf1\x70\xd9\x86\x01\x16\x3f\x49\x52\xf1\xd2\x5e\x12\xe0\x0e\xf0\xa2\xd8\xf1\x11\xaf\xdb\x0f\xaf\xba\xd2\xbf\x8e\x8b\x9d\x49\x36\x3f\xca\x68\x18\x36\x17\xb5\x41\x27\x0d\xda\x46\x09\xb2\x61\x67\x29\xab\x1b\x8c\x42\xdb\xdd\x7b\xf9\x86\xaf\x8f\xba\x52\xe7\x33\xe4\x2b\xa0\x3c\x89\x2e\x1e\x1e\xc0\x6a\x90\xb1\x63\xf5\xa7\x9f\x61\x65\xeb\x73\x16\x97\x2a\xc1\xad\xbf\xcf\x1d\xca\xb0\x78\x47\xef\x82\xc2\xca\xb1\x01\x5d\xbb\x50\xaa\xdc\x79\xfe\x11\xc8\x32\x09\x8c\xac\xc3\x98\x20\xab\x08\x5b\x69\x63\xbd\x42\x16\x0e\xd6\x61\x3b\xae\x5e\x20\x1f\x17\xc0\xfd\x7f\x32\x35\x7a\xe3\x50\xce\x9c\xbb\xe9\x26\xfa\x42\xdc\xbd\x42\x2a\xc1\xbf\x09\xa1\x9a\xd1\xf6\x94\x69\xe4\xd1\xdc\xb1\x24\x11\x8e\xd4\x52\x2d\x35\x3c\x17\x42\x98\x65\x0f\xf8\x83\x82\xfa\x2f\xdb\xb2\x86\xc4\x5b\x18\xa9\xba\xf6\xf6\x76\x3a\xc2\x0c\x9c\xa4\x76\x7d\x34\x8c\x4b\x8d\xed\x63\x00\x76\x65\x7b\x85\xb1\x4c\x11\xae\x27\x37\xea\x29\xa4\x35\x15\xb7\xf0\x56\x74\xa0\xcd\x3e\xd4\xbf\x6a\x3d\x18\x9a\xe9\x72\x21\x8f\x87\x7c\xd8\xaa\x69\x49\x9d\x5a\x08\xc9\x9e\x44\x06\x94\xcc\xac\xcd\xf1\xf6\x42\xe1\x4e\x90\x10\x5b\xee\x6d\x98\xed\xee\xab\x3b\x4f\x33\x9f\x30\x01\x88\xae\xc0\xc1\x6b\xd6\x45\x21\xd9\x28\x73\x98\xe6\x48\xdb\x94\x33\x0e\xd8\xf6\xb9\xab\x6c\x7a\xd9\x3f\xfc\x43\xe8\x79\x2e\x63\x7c\x61\xbf\xf7\xd8\x56\xe5\x4e\xf4\x98\x73\x84\xe3\x12\xcb\x57\x01\x7a\x50\xea\xe5\x95\x2a\xbe\x19\xd8\x99\x9c\x8c\x82\xdf\xc4\x57\x98\xcc\x17\xc8\xd9\x49\x6b\xf5\x20\xec\xc5\xb7\x7f\xe2\x84\x91\x55\x66\xc4\x56\x85\xc3\x04\xa2\xac\xd5\x25\xef\x12\xc8\x6f\x38\xae\xf5\x54\xd8\xa2\x38\x47\x37\xcc\x41\x33\xfb\x7e\x2b\x65\xc1\x3b\xef\x31\x66\x8a\x6c\x2f\x60\xee\xcd\x84\x12\xee\xff\x7f\x6b\x60\x5c\xbe\x95\x08\x3e\x23\x3e\xc1\xa7\xbb\x36\xde\x23\x6c\x8a\x71\xba\x28\x72\xbe\x94\x6c\xd3\xb3\x89\x35\xf5\xda\x64\xc8\xfe\xc8\xe1\x4f\x45\xcc\xf6\x12\x4b\xab\x7f\x70\x56\x7c\x2f\x2b\xfd\xd5\x66\x67\x60\x95\x72\x03\x7c\x76\x14\x6c\x99\x17\x07\x65\x9b\x57\x09\xb0\x74\xe3\x45\x1f\x92\x1a\x2d\xf2\x83\xb9\x6a\xa2\x6a\xb4\x76\x62\x50\x16\xf1\x81\xad\x64\xc9\x91\x9c\xf4\x1d\x71\x4a\x1a\x9a\x5e\x2b\xb2\x6b\xaf\x87\x70\xb2\xeb\xa7\x7b\x77\x8a\x33\x26\x77\xa7\x57\x2e\xe3\xa2\xb1\xdc\x05\xf7\x35\x6b\xdc\xae\x5f\x55\xe3\x53\x29\xe3\x4c\xaa\x79\x43\x0b\x27\x0c\x03\x61\x60\xdc\x9f\xca\xab\x5b\x25\x45\x43\xac\x94\xb2\x46\x81\xf1\x71\x72\xb6\x15\x9d\x16\x62\x1d\x7a\xd0\xee\xbd\x89\x5a\x1e\x1d\x09\xb9\x16\xa8\x6f\xb4\x8e\x4c\x91\x66\x10\x57\xee\xe9\x5c\x08\x70\xed\x54"}, +{{0x14,0x38,0x3e,0x6e,0x56,0x04,0xc9,0x9c,0x24,0x8d,0x39,0xbe,0x51,0xd1,0x64,0xb1,0x34,0x42,0xb0,0x5e,0x51,0xd7,0x8e,0xcd,0x99,0x93,0x64,0x22,0x1a,0x45,0x03,0x6b,},{0x2f,0xc1,0x61,0x38,0x22,0x0a,0xb7,0x4b,0x3b,0xd4,0x46,0xf8,0xa7,0x14,0xb5,0x8d,0x54,0x63,0xd4,0x0d,0x43,0x67,0x92,0x50,0x07,0x47,0x4c,0x5b,0x9e,0x35,0xd4,0x94,},{0x45,0xe8,0xed,0x1a,0x75,0x1d,0xfc,0x3b,0x9b,0x7b,0xd7,0xa1,0x0b,0xf5,0xbd,0xcf,0x8c,0xa4,0x61,0x86,0x5a,0x49,0x0c,0x10,0x5f,0x10,0x45,0x29,0x41,0xcf,0x87,0x72,0x12,0x14,0xbf,0xbf,0x3a,0x35,0x60,0x6b,0x7c,0xe3,0x5d,0x6f,0x70,0xaa,0xf2,0xd5,0xea,0xdc,0xc0,0xde,0x03,0x5e,0x9b,0x2f,0x6d,0x7b,0x86,0x2f,0xc2,0x84,0x90,0x04,},"\xc4\x75\x3b\x7f\x7a\x6f\x6d\xea\x25\x15\xc6\xe3\xd2\x95\x61\x50\x6f\x4f\x36\xe0\xde\x84\x99\x92\x21\xf2\x28\xe2\x0b\xd5\x12\x8e\xd9\x3b\xdb\x8d\x11\x93\x23\x7d\x8e\x29\x41\x69\xa2\xbc\x44\x8a\xf9\xdd\x36\x06\x63\x01\xef\xb7\xfe\x12\x31\x35\x3c\x06\x23\xff\xe1\x11\x5d\xeb\xb6\x90\x5a\xc6\x94\x6e\xe3\x82\xa2\x7c\x3c\x09\xe1\xb1\xf5\xc1\x14\x93\xdb\xa3\x7d\xa0\xff\x6e\xea\x75\xd9\xfa\xb0\xee\x92\x6d\x70\x1d\xac\x2f\xc5\xb7\xef\x57\x88\x80\xa5\xd5\xee\xec\xad\xc1\xf4\xbc\xc4\xcd\x4e\xc6\xf2\xf1\x4f\x52\xa8\xc1\x64\x07\x2e\x6f\xde\x5a\xb2\xee\x9c\xee\x0b\x48\xe5\x1a\xf0\x55\xf9\xfe\xc7\xc6\x37\x50\xfe\xdf\x72\x33\x2b\x23\x86\x3a\x1e\x54\xc5\x2b\x46\x1a\x21\x50\x6d\xfd\xfc\x63\x88\x0e\x22\xd8\x9c\x89\x44\x12\x66\x6c\x92\x98\x21\xc0\xe4\x39\xe7\x45\x41\x5f\x71\x79\x69\xe6\x05\x85\x54\xd6\x4b\x94\x7a\x4f\xc9\xd1\x6a\xca\xe3\xe4\x9a\xec\x08\x80\x1a\x09\xd9\x72\xf7\x9e\xad\x68\xd5\x29\x76\x80\x69\x73\x5c\xaa\x74\x2b\x45\xa5\x83\x05\x81\xb8\x0c\xa0\x61\xa6\xc1\x51\x5e\x3f\x7d\x5a\x93\x37\x87\x8c\x19\xfc\x94\xee\xf2\x26\x98\xea\x6c\x4d\x05\xf9\xed\x41\x1b\x6b\x8f\x05\x2b\x5f\xf1\x5d\xc2\x3a\x64\xbe\xea\xae\x99\xf8\x48\x93\xde\x3d\xf9\x40\xa4\xe0\xb8\xe9\x93\x93\x01\x39\x05\x2d\x99\xbe\x47\xbc\xa8\x77\x5f\x85\x63\xbd\x40\x26\xb7\x13\x43\xd5\x19\x68\xf2\x33\x75\x28\xf4\xc9\xdb\x8b\xbd\x0a\x29\x8a\xf0\x4b\x27\x69\x5d\x86\xb7\xf7\xba\x6c\x4c\xcc\x62\x73\xfe\xbc\xd8\xf7\x5c\xff\x26\x69\x95\x24\x4f\xc1\xfa\x13\xd8\xd8\x43\xf0\xbf\xf4\x9c\xc2\xd5\x08\xf4\xa2\xb3\xaa\xd1\xd9\x5f\xb2\x2a\x2b\xc6\xad\x1b\x96\x6b\x08\x12\xd9\x90\x70\xbb\xa0\x7c\x92\x3e\xe4\xd0\x81\x07\x48\x6d\xc0\x1a\x06\xdb\xa6\xf1\xd5\xf1\x05\xac\xea\xde\x33\xb1\x66\x51\x0e\x42\x7e\xbb\xce\x52\xa3\xe7\x83\x1f\x0f\x78\xa3\xc6\xe0\x72\x60\x83\x34\xd8\x02\x1c\x33\x8a\x73\xcc\x0c\x47\xf1\x9c\x9f\xae\x40\x3b\x97\x16\xd0\xd1\x5f\xbd\xf6\x46\x6b\x08\xf6\xac\xce\x3f\x50\xa7\x03\xb1\xde\xa8\xd8\x26\xdf\x84\x2c\xa1\xba\x20\xd2\x9f\x45\x48\xac\xfc\x75\x4c\xf0\x11\xf5\x70\x68\x1b\x59\xe4\xda\x25\x38\x5e\xbd\x6d\x5c\x3a\xdc\x93\x05\x29\xe1\x66\xce\x67\x05\xf6\x01\x02\x10\xdb\x10\x64\x62\xb3\x33\x32\x04\xe7\xad\xad\xee\x66\x06\xa5\x62\x06\xb4\x7e\xef\x20\x74\xb1\x16\xe2\x2a\x61\x54\x18\xec\x2c\xdc\x33\x1f\x1e\x19\xe0\x7e\x8a\x37\xb9\x2d\x69\xdf\x07\x34\xe0\x85\xda\xee\xb9\x01\xec\x6e\x8c\x35\xf1\x03\xf1\xd8\x6e\xf0\xd2\xa2\x65\x2b\x01\xd1\x83\x59\x7e\x4c\xfd\xee\xdf\xe5\xdf\x9a\x7e\xf6\x6a\x1c\x79\x6a\x37\xa2\x71\x13\xb9\x44\xdd\x7b\xa1\x7c\x46\x00\x15\xab\x8a\xce\x45\x1c\x57\x85\x0e\xc6\xc2\x90\xc5\x4e\x51\x13\xf5\x5e\x99\xa8\xe6\xe4\x71\x1e\x3b\x78\x17\xbf\x91\xa5\xad\xb3\x7f\xb9\x46\x1b\xe6\xb1\xb5\x5d\x58\x60\x46\xe4\x2a\x54\xc5\xde\xf4\x07\x6f\x1f\xf6\xc3\x1b\x80\x6f\xc6\x02\x47\x43\x56\xaa\x28\x99\xea\xe7\x0f\x5e\x5a\xbf\x1f\x75\xa7\xf2\x4c\x13\x4c\xde\x11\x79\x3b\xb1\x62\xe0\x3a\x58\x3d\x5b\xe0\x46\xac\xc7\x34\x56\xd1\x2d\x50\x9d\x92\xf7\x70\x57\x68\x68\x6f\x6c\x71\x4a\x4e\x57\xec\x88\xb7\x13\x98\xe2\x3e\x83\x5d\x6d\x65\x47\x22\x59\x96\xb7\xed\x08\xf3\xb7\x44\x3b\xb1\x7c\x89\x94\x09\x49\x3d\x0e\xfe\x84\x55\xbe\xc8\xe8\xc2\x84\xa3\xb1\x49\xa5\xb4\xca\x63\x1e\xa6\x20\xb1\xbb\x81\x7c\xed\xab\xa5\x0b\x04\x44\x11\x84\x9d\x26\x0a\x6f\x2a\x0d\x3f\x2c\xce\xec\x38\x42\x71\x9a\x5e\xa4\xfe\x18\xdd\xe0\xd4\x2d\xcb\x33\xad\x21\xe6\x45\x33\x25\xaf\x6f\x3c\x00\x9f\x2b\xb9\x78\xd3\x0c\xee\xae\x9a\xa4\x92\x8b\xf7\x37\x67\xcd\xa9\x29\x2a\xb8\x93\xce\x5f\xa3\xaa\x4c\x23\x21\x63\xb4\x5c\x64\xed\x79\x77\x77\x9b\x1c\x0c\xaf\xcf\xc2\xb9\xfa\x08\x4a\x32\x4f\x11\x3a\xde\xec\x21\x8b\x47\x35\xb6\xb4\x64\xdb\x6d\x46\xc2\x79\x1a\xf3\x45\x5f\x1c\xa5\xea\x1e\x9a\x04\x8c\x05\x1a\x54\xdf\xa0"}, +{{0x59,0xb0,0x72,0x63,0xb2,0x2c,0x0a,0x38,0xbb,0xc5,0x91,0x05,0x95,0x94,0xb2,0xbd,0x92,0x7e,0x80,0x59,0x61,0xdd,0x07,0xe1,0xf9,0x42,0x45,0xb2,0x3a,0xa2,0xe0,0x16,},{0x0b,0x1e,0x4c,0xf5,0xaf,0xf2,0x78,0xec,0x65,0xb4,0x05,0xf5,0x10,0x8e,0x1b,0x5b,0x18,0xa9,0x69,0xad,0x1f,0x1e,0x63,0x81,0x91,0x2c,0x82,0xd6,0x98,0x90,0x7c,0xba,},{0x88,0x6d,0xa3,0x3e,0x35,0x53,0x28,0x5e,0xa5,0x9c,0x14,0x31,0xb6,0xe8,0x6e,0xa4,0x9b,0xb6,0x8b,0x2e,0x0e,0xfd,0x2b,0x15,0x7e,0x77,0x91,0xb7,0x4f,0x35,0xa2,0x42,0x1b,0xb3,0x59,0xf3,0xdc,0x1e,0x4c,0xe5,0xf1,0x1f,0x73,0x65,0x2e,0x03,0xbf,0xc0,0xb4,0x29,0xc5,0x8f,0x0f,0x2d,0x74,0x18,0xc7,0xc2,0x0b,0xce,0x2e,0x2d,0x19,0x01,},"\x08\xce\x0d\x4d\xb5\xc2\xaa\x50\x0a\x19\xef\xbc\x8d\xc8\x54\x92\x50\xf7\xdd\x46\xa7\xa9\xa5\x40\x74\x17\xb3\xd5\x18\x20\xe4\xb0\xd6\x12\x75\x58\x3f\x56\xf8\x97\xfd\x94\x2b\xdd\x73\x11\xad\x6b\xaf\x73\x81\x28\x56\x7a\xf6\x55\x8d\x75\x90\x6a\x02\xc4\x34\x3a\x99\x55\xd5\x9b\x11\x08\x8c\x58\x8d\xc7\xdd\x08\xf6\x79\x65\xc5\x60\x2a\x56\x92\x8d\xda\x4a\xe1\x64\x29\x31\x63\xb5\x17\xca\x17\xde\xd0\x4f\xe4\xab\x2f\x97\x89\x13\x0a\xe9\x6a\xb2\x31\xf0\x7e\x09\x01\x5b\x78\xf3\x84\x8c\xef\x43\x5d\xb0\xad\x9f\x35\xe0\xfb\xc9\x85\x1e\x3e\xcf\xc9\xfb\x18\x6d\x14\xd8\xda\x4d\xda\x45\xd0\xb3\xeb\x3e\xe4\x50\x0c\x10\x1e\x31\x94\xb5\x72\x14\x06\x89\xcd\x75\xda\x12\x87\xb2\x54\xf3\x74\xe3\xd9\x33\x26\xae\x5f\xaf\x11\x40\x18\xac\x71\x4b\xd0\x03\x75\xd9\x2a\x8b\xb6\x59\xc3\x29\x12\x83\x1f\x4f\x20\x77\x6e\x9e\x2c\x25\x02\x9f\x0a\xff\x39\xfd\xda\xc7\x24\x15\x43\xa0\x36\x6b\x84\xde\x7b\x1f\xf2\x3e\x8e\x4d\xc0\x93\xdf\x0d\x2d\xd5\xe5\x3e\x68\x47\x94\x8c\xf3\xd0\xff\x3f\x56\x4a\xd9\x4d\x9c\xc0\x0a\x5e\xa5\xb6\x95\xe4\x08\xbf\x50\xf5\xba\xb2\xf6\xea\x87\xba\x8a\xd3\xa1\x94\x01\x95\xcf\x1b\xc2\xb5\xb3\x48\x47\xad\x3a\x5e\xff\xb8\xa7\x82\x3d\xe9\x1e\xf1\x63\x38\x69\xd1\xf0\x46\x43\xaf\x4d\x82\x6a\x59\xe7\x8b\x9d\x18\x63\x12\xb3\xd9\x72\x26\x36\x54\xac\x55\x87\xb8\x0b\x71\x76\x46\xf3\x10\x03\xdb\x81\xac\x70\x86\x0d\x3f\xc8\xcd\x3a\x6a\x0a\x0d\x57\x6d\x25\x73\x1e\xf7\xb8\x96\x62\x63\xd7\xa0\x5b\x55\x00\x9e\x8a\x23\xda\xc0\xf9\xa2\x1a\x24\xb0\x6e\x13\x90\x0e\x44\x44\x46\xfd\xfe\x56\xcb\xc1\xa0\x26\xdf\x41\x06\x6b\x20\x1b\x14\x81\xe5\x61\x58\x92\x6c\x0c\x9e\xa9\x0f\x0c\x64\x5a\xab\x4b\xef\x12\xd4\xe0\x72\xcb\xfd\xc3\xc3\xd5\xe0\xc7\x2c\xf8\x8f\x16\x6d\xe0\x48\x87\x4f\x35\x34\xe0\x40\xc6\x2b\x16\x62\x82\x1b\xdd\x16\xb0\xe8\x58\x28\x17\x46\x1c\xb2\x68\x92\x79\xb4\x46\xd7\x0c\x8a\xc2\x0a\xd0\x3e\x59\x8c\xad\x49\x08\xc5\x2c\x35\x0d\x42\x43\xee\x8a\xed\xb8\x7a\x4a\xf9\x77\xf7\xdb\x57\xcd\x94\x7b\x47\xd6\xbb\x51\x40\x9d\x80\xd8\x1f\x6d\xb0\x3c\xb9\xa6\xa6\xb7\x98\x12\xf4\x70\x69\x0a\xfc\x18\x36\xa5\x31\x33\x80\x94\xcf\x26\xd3\xc1\x23\x2f\xd5\x60\x5d\x8f\x8c\x55\xb6\xf8\xa2\xa7\xef\x1e\x0c\x78\x15\x55\x94\xb2\x37\x95\x6d\x2a\xba\xd6\xa9\xad\xcd\x58\xe1\x1c\xcd\x35\xcc\x99\x5b\x9a\x0a\xec\xbf\x7f\x57\x41\xac\x05\x1b\x04\xef\x6b\x97\x44\xb5\x6f\xcc\xb4\x63\x98\x52\x8b\xb3\x1f\xbe\x84\xe0\x78\x84\x3e\x69\xbf\x33\x88\x98\xcd\xef\x69\xad\x41\x87\x23\x95\xe4\x6b\x59\x39\x04\x82\x55\x47\xe0\x0b\xda\xf2\x21\xf8\xfa\x58\x7e\xa2\x03\x7f\xfb\x9a\xc9\x30\x7d\xd3\xf8\xf3\x5e\xc5\x38\x6b\xa9\x66\x33\x3e\x2a\xc8\x72\x7b\x0e\x1b\x80\x61\x2d\x3c\x7f\x2c\xb8\x8b\xaa\xca\xdf\xe2\x16\x3b\xc3\x8c\x88\x84\x2e\x76\xa3\x94\x57\x1d\x40\x61\x0e\x8a\x29\x76\x02\x79\x37\x63\x29\x6e\x3e\xab\xf7\x20\xe9\x84\xb2\xed\xd2\x8c\xf5\xc4\xe0\xf9\xa0\xf7\x6a\xce\xba\x28\xcc\x1f\x1b\x69\xff\x1d\x35\xb4\xbd\x33\x47\xb7\xf9\xa9\x5a\x4c\x1e\xa1\x07\x34\xe1\xc9\x18\xeb\x96\x24\x9d\x0c\xc7\x0b\x47\x7f\x6f\x23\x80\x9b\xbd\xa9\x01\xd5\x3f\x48\x5a\x71\xf5\x08\x60\x02\xc1\xb7\x1e\xfc\xc4\x1c\xb1\xae\xb5\x12\x2a\x3f\x3b\xfc\x96\xc5\x1a\x55\xd7\x5c\x02\x98\x42\x88\xbe\x65\x78\x87\x85\x4c\xfa\x73\x89\x74\xbc\xd5\x44\x01\x46\xf9\xbb\x14\x04\x0d\xe5\x4f\x54\x44\xad\x43\xb7\x9a\xf9\xbd\xb2\x4e\xd6\xa4\x8e\xb2\xfd\xee\xd7\x1f\x31\xf0\xec\xe1\x02\xe9\x18\xe9\x56\x35\xc7\xa0\x38\x63\x3e\xe3\x48\xd8\xb5\x78\x16\x52\xd5\x05\x9d\x21\x5a\xc9\x7f\x30\xea\x20\xd2\x77\xeb\xbf\x15\x24\x69\x05\x42\x8a\x7b\xec\x02\xb8\xf9\x26\x31\x5b\xad\x67\x23\xfd\x64\xd7\x1f\xc9\x5f\x33\x33\x64\xcb\xe9\x0d\x46\x46\x33\x3c\x40\xdd\xa6\xd1\xd4\x33\xb7\xc1\x95\xa7\x58\xdb\xb4\x03\x8a\xf5\xdc\xc7\x23\x2d\x45\x47\xf5\x40\xe3\x94"}, +{{0x5c,0xc1,0x15,0xd8,0x39,0xe0,0x58,0xcd,0xb6,0x51,0x8e,0xe9,0xc1,0x61,0xc0,0x04,0xd8,0x8b,0xd3,0x90,0x8d,0x3c,0xf6,0xd5,0x2c,0x8f,0x29,0x6a,0x1a,0x07,0x6b,0x9b,},{0x1e,0x8f,0x33,0x05,0xbf,0x2f,0xa1,0x1b,0x17,0xd9,0x24,0x16,0xab,0x0e,0xa7,0x62,0x39,0x6d,0x88,0xf2,0xf9,0x70,0xef,0x0b,0x10,0x0e,0xd3,0xbf,0x5c,0xc1,0x34,0x40,},{0x03,0x71,0xc2,0xd6,0x4c,0x5e,0xc0,0xc8,0x27,0x6c,0xa5,0xff,0xa6,0x15,0xef,0xf4,0x2f,0x9e,0xff,0xfc,0x58,0xdd,0x8e,0xcf,0xcf,0x67,0x62,0x0a,0x9b,0xcb,0x38,0xfa,0xf1,0x18,0x93,0x2b,0xf2,0xcd,0x5b,0x92,0x05,0xfa,0x55,0x13,0x34,0xdf,0x2a,0x75,0x7c,0x59,0x77,0x44,0xf7,0x91,0xf3,0x71,0xfb,0xed,0xd9,0x8b,0x21,0xf7,0x34,0x05,},"\x53\x3e\x49\xc1\xd5\xf3\x3c\x5e\xc4\xbe\x84\xc6\x19\xf4\xec\x64\x9c\x25\xfd\x70\xbd\xcf\xe2\x57\xa6\x3c\x33\x73\xa4\xd0\x89\xc8\x9a\xf6\xee\xb7\x16\x0d\xd7\x7a\xb6\x6b\x1e\xe7\xe1\x08\x50\xab\x4f\xc1\xf3\x51\x32\x33\x2b\x53\x78\x9b\x2b\x01\x40\xc4\xf2\x0f\x97\xf2\x14\x20\x72\xd6\x24\xaf\xf7\xaa\xd3\x24\xaa\xcd\x06\x8c\x03\x5a\xff\x52\xfa\x71\x2f\x4e\x74\x83\x2d\xe0\x31\xb2\x64\x23\x14\xd1\x71\x10\xde\xe6\xfb\x85\x76\x2d\xc3\x0d\x7e\x97\x78\x2f\xd1\xfb\xff\x71\x79\xf0\x09\x17\xf5\x5a\xf7\x50\x3a\x5b\x7e\x23\xc6\xea\xdb\x65\xe1\x04\xf1\x51\x7b\x66\x24\xc9\xe5\x20\x4b\x3f\xd2\x9a\x65\x85\xe9\x2c\xe3\xa3\xee\xe2\xc5\xae\x17\x79\x20\xf7\xb4\xab\x2c\xac\x87\xd6\x72\xab\x6b\xaa\xc1\x18\x6d\x90\x4a\xea\x34\x98\x53\x4e\xb5\xab\x23\xe4\xac\x4c\x0d\xdb\x0d\x82\xa5\xae\x53\x1d\x76\x54\x9d\x36\x76\x28\x57\x7b\xac\x42\x35\xe8\x97\xd9\xfe\x20\x55\x22\x04\x7d\x21\x4f\xf6\xcc\xf3\x11\xc4\xe3\x97\x82\x7d\x97\xf2\x86\x8e\x70\xac\x17\xd2\x8e\x33\x49\x99\x74\x4d\x35\x93\x76\xa4\x82\xfd\xcb\x41\x4b\x02\xb2\x68\x7b\x96\x2e\xe8\x08\x6e\x57\x3f\xe0\x00\xdc\x51\xde\xe0\x68\x79\xc6\x84\xe2\x5f\x94\xce\xe5\xe8\x61\x34\x7e\x7b\xe7\xfc\xa5\x49\xa0\xf7\x65\x13\x6a\x2f\x4b\x88\xfe\xde\x07\x02\x4d\xd2\xfc\xe1\xf6\xd0\xc0\x35\x4d\xa1\xa1\x6e\xf3\x66\xb3\x15\xb3\xf7\x23\x30\x31\xf9\x79\xb7\x0e\xac\x6e\x23\xbf\x3b\x34\x9e\xfb\xd0\xe4\xf5\x3f\x4d\x5c\x41\xfc\x00\x42\x76\xa5\x96\x70\x65\x9f\x69\x05\xef\x03\xd2\xfc\x09\x8d\x58\x9f\xcb\xc1\x32\x82\x82\xfa\x22\xb1\x0d\xb8\x3c\x5d\x70\x86\x59\x94\xfd\x19\xd7\x60\xa3\x9d\x47\x6e\x02\x33\x0d\x2c\x6d\x19\xe7\x42\x26\x7d\xd3\x65\xbb\xe1\xfe\x5c\x71\x1a\x95\xb1\x84\x50\x8c\xe4\x8c\x1c\x96\xd7\xe6\x39\x90\xb4\x08\xd4\x50\x89\xbe\x79\xe3\x2f\x9c\xb0\x16\x2f\xd1\xe7\xd0\xd1\x9d\x97\xd0\xae\x78\xff\x82\x4c\xc6\x98\x94\x86\xc0\xbd\x03\x83\x52\x55\x1f\x37\x49\x9e\x9e\x98\x26\x80\x4e\x9d\x26\x24\xad\x0c\x7b\x75\x34\x56\x0f\x45\xfd\x7d\x32\x4b\x8e\x51\x7e\x01\xc9\xb2\x74\x3c\x14\x97\x9c\xfd\x51\x2b\xc3\xfe\x66\x72\x79\xb3\xa2\x77\xfb\x46\x3e\x9d\x73\x49\xb6\x4f\xfc\x9f\xe6\x08\x84\xc2\x1e\x48\x10\x81\xed\x70\xe6\xda\x5a\x35\x39\xc4\x48\x97\x1f\x0d\x97\x87\x28\x9f\xcb\x00\x80\xf2\x19\xe9\x94\x49\xf8\x29\x8c\x42\x47\x5f\x87\xfd\x10\xae\xb5\x09\xc5\x30\xcf\x6a\x57\x74\x8e\xb8\xf3\x56\x21\x61\xfa\x48\x75\xea\x95\x3f\x09\x65\x9c\x7d\xf7\xa9\x95\x0f\x03\x17\x46\x7c\xb4\xe5\x36\x6e\x19\x6e\x32\xf5\xe2\x69\x67\x33\xa2\x5e\xac\xbd\xe4\x92\x10\x49\x07\x62\x06\x0e\xa2\x31\x37\x0d\x40\x90\x42\x9b\xb0\x6b\xb8\x67\x39\x9e\x8d\x37\xbf\x5d\x21\xa0\xe7\x21\x47\xe4\x96\xcf\x3b\x7d\xd6\xfe\x6e\x5e\xde\xa9\x66\x8d\x80\x21\x90\xa9\x1c\x60\x0e\x29\x52\x3f\x8e\xb9\x04\xe4\x8b\x70\x41\x2b\xc1\x0a\x70\x20\x98\x4c\x5f\xf0\xf5\xf3\x83\xf2\x14\xae\x59\x4d\xc8\x59\x71\xe4\x80\x37\x28\x48\xd0\xd7\xe7\xcc\x5c\x18\xff\x88\xba\x9b\x26\x2d\x78\x84\x69\x8a\x41\xc6\xc7\x81\x9c\x03\x19\xfd\xc6\xbb\x07\xb9\x1d\xc1\x69\x4d\xaf\xe3\xaf\x37\xa5\x38\xbf\x2b\x2d\x8c\xac\xb2\x7d\x24\xcd\xc6\xea\xdb\x8c\x6a\x2e\x6b\x7d\xf8\xa4\x65\x4a\xe9\x37\x85\x0c\x89\x0a\xd9\x30\x98\x0a\xfc\xc1\x49\x2d\xb8\xa0\x16\x8c\xbc\x9f\x10\x65\x7e\xb4\x8d\x2a\xc8\x7f\x51\x75\xd2\x3c\xae\xd4\xb5\xe6\xf1\x0b\xbe\xaa\x5e\x33\xfc\x5f\x64\x18\xd6\x3b\xa3\x74\xab\x1a\x3c\xbd\x36\xb7\x29\xdd\xbd\xab\xa9\x89\xd4\x64\x5e\x3a\x66\x13\x0b\xae\x41\x7c\xad\x08\x6d\xad\xd3\x08\x43\x35\x25\x14\xc3\x75\xf2\x57\x1a\xba\xf9\x3e\x9a\x07\x71\xfa\x10\x3a\xe9\x25\x85\xb0\x4f\x55\xc4\x34\x76\x9b\x43\xd6\xd2\x2f\x75\x3f\x93\x06\x03\x6e\x53\x52\x4f\x6f\x4d\x9c\xcb\xd2\xc3\x03\x17\xa8\xe8\x99\xf3\x16\x14\x90\x35\x89\x4d\xa9\x45\xb7\x6d\x90\x82\xbf\xee\x32\x8e\x7a\x31\xb6\x63\x28\xee\x8b\x94\xe0\x68\xc7"}, +{{0x75,0xa5,0x03,0xf4,0x8f,0xfc,0x22,0x16,0x17,0x67,0x25,0x19,0x11,0x1b,0xf9,0x0d,0xa3,0x9d,0xa9,0xea,0xb2,0xe2,0x91,0x4f,0xd3,0x75,0x5f,0x10,0xf5,0x39,0x36,0x68,},{0xf6,0x80,0xcc,0x0f,0x63,0x58,0xcd,0xcf,0x53,0x7a,0xa7,0x11,0x28,0xcf,0xad,0xfc,0x0f,0x3a,0x89,0xc1,0x00,0xaa,0x34,0xbc,0xd2,0x42,0x7e,0x24,0x8b,0x6e,0xd5,0x0b,},{0xdf,0x28,0xe3,0xe6,0x30,0x36,0x08,0x67,0x86,0x4b,0xc4,0x1e,0x43,0xfd,0x7d,0xde,0xb5,0x28,0x76,0xdc,0xe9,0xb2,0x34,0xa3,0xfc,0xc3,0xd8,0x54,0x9d,0xb0,0x11,0x2e,0x17,0x63,0x90,0xa6,0x85,0xeb,0xd4,0x84,0x93,0x6e,0x25,0xc0,0x8c,0x8a,0x38,0x78,0xa3,0x7b,0x3c,0x4e,0x23,0x9a,0xd0,0xa0,0xe5,0x01,0x99,0x37,0xff,0xbc,0xd4,0x07,},"\x7b\x01\x09\x04\x23\x23\x6c\xb4\xb1\x3c\x41\x77\xfc\xe5\x2a\x7f\xf6\x58\x05\x88\xcc\x2e\xb5\xa3\xf3\x9f\xf5\xd0\xc7\x3e\x01\xe0\x1b\xf7\xbd\x74\xaf\xe4\x15\x12\x50\xc3\x91\x42\x6e\xa5\x07\x27\x1b\xea\x1d\x6d\x85\xf0\xb2\xfe\x35\xc4\x05\x00\xf9\x8d\x06\x56\xc6\x38\x8f\xc9\xef\xba\x18\x37\xdb\x22\xdf\xa2\x9d\x89\x26\x76\xf5\x0e\x57\x5f\xe8\x9f\xd2\x93\x89\xd0\x9d\x08\x0b\xad\x67\xba\x54\x4c\xac\xab\xf5\xa7\x73\x82\x37\xc5\x5e\x28\x75\xed\x49\x16\x30\x2a\x2b\x4d\xc4\x96\xe7\x42\x73\xbf\x05\x19\x11\x37\x81\x0e\x50\xe4\x81\x95\x26\x0b\xab\x6d\x81\xf9\xc8\x05\x62\xee\x73\xcc\xb9\x33\x3c\xd9\xb6\x1d\xaf\x5b\x00\x38\xa4\xe6\xc5\xc9\x58\xa9\x1f\x68\x50\x8c\x1d\x88\x25\x19\xc1\xaa\x4f\xfc\xc5\x35\x62\x46\x3a\x0a\xe3\x01\x63\x69\x6f\x84\xb9\x7c\xcb\xd8\x67\x98\x20\xed\xd3\x61\x7e\x7b\x89\x6e\xef\xfe\x34\x1e\xc6\xb5\xb0\x3f\x73\xb6\x25\xd7\x41\xc6\x55\xfe\x6e\x82\xd1\x1d\x47\x8a\x7d\x54\x3f\xf6\xc0\xfa\x3a\x3a\x8c\x94\xa6\x16\xfb\x84\x70\x70\xd1\xfb\xdd\xe6\x01\x0f\x02\x6b\x08\x9c\xd8\x63\xc3\xbd\x29\xb1\xc4\x26\x9f\x77\x65\x9e\x51\x57\x28\x89\x0c\x97\x3b\xe8\x7f\x0b\x83\x3c\xa5\xaf\x6b\x4c\x31\x33\xad\x4f\xa4\xf9\x16\x55\xc6\xad\xb5\xb7\x23\x5c\x27\xfe\x34\x82\x84\xf3\xf1\x33\x66\xa6\xa0\x3a\xd2\x2b\x87\xc6\xf5\x58\x4b\xde\xae\xa4\x8c\x70\x32\x5d\x6e\x33\xa4\x75\xf5\x05\x11\x06\x38\x75\x19\x2a\x87\xed\xc3\x88\x08\x9b\x84\x39\x53\x90\xc2\xa3\xad\x89\xa2\x25\x95\xdc\x4a\x71\x5a\x42\xa2\xc0\xef\xde\xf6\x7b\x35\x4b\x34\xfc\x75\xca\x98\xdf\x91\x3e\x75\x9e\x51\xc7\xf6\x25\xdd\xd5\x98\xac\x22\xd4\x21\xde\xcb\x57\xbe\xbd\x54\x22\x0e\xc6\xda\xa5\xec\xe7\x69\xd2\xe0\x1b\xe7\xb6\xbe\xe2\xff\x5a\x0b\x06\xb3\x2d\x6d\xa1\xd7\xbc\x05\x7e\x3a\xbf\xaa\xb2\x42\xa3\xf7\xe6\x64\x6a\x15\x9e\x4f\x50\x5e\x46\x62\x98\x2b\x13\xd0\xcc\x1f\xba\x91\xd1\x03\x09\xa4\x2d\xc1\x08\x7c\xf1\x0d\x36\xe3\x1f\x17\x06\x15\xa0\xac\xb5\x08\xbf\x68\x3e\x2d\xe0\x0c\x87\x64\x0d\x30\x4a\x94\x7b\xc4\x97\x1f\xf3\x61\x9c\x72\xab\xd8\x3c\x7b\x2c\xbb\x34\x64\xc4\x04\x0c\x26\x62\xb5\x85\x08\xb7\x46\x80\xcf\xa6\xde\x06\xe8\xd2\x1e\x3b\xec\x85\x11\x19\x93\x12\x68\x00\x09\x07\x1f\x70\x6b\x7b\x13\x3a\x24\x87\xd5\x74\x5f\xfa\xdd\x5d\xc0\xeb\x2b\x55\x3d\xf4\x40\x78\x7f\x01\x1d\xda\x37\x71\x9f\xa7\x13\x15\xe8\xb2\x91\xef\xd7\x7d\xa3\xba\x14\xfb\x99\x5f\x03\x57\x1a\x3d\xb5\x22\xb6\x3c\x60\xbe\x56\x19\x94\x16\x99\xb3\x92\x22\xb5\x9d\x0f\x23\xe5\xeb\x37\xea\xd4\xb7\xf7\x50\xed\x4a\xbf\x4d\xb8\x7c\x70\xda\x66\x5b\xef\x4d\x7a\x29\x21\xb2\xc9\x98\x97\xf2\x32\x1c\x9b\xe6\x07\x5e\x74\x4c\x82\x28\x63\x9a\xb7\x36\xdb\xeb\x2b\xea\xb4\x40\xc1\x56\xa3\x9a\x2e\xfd\x26\x1d\xb5\x08\x55\xe3\x04\xd9\xcf\xeb\x99\x14\x1c\x61\x35\x58\x10\x9f\x21\x47\x4d\x27\x2a\x2d\x90\x6d\x48\x93\x93\x4a\xff\x8e\x08\xa4\xfc\xee\x96\x4a\x5c\xd0\x07\x32\xfd\x33\xaf\x29\x84\x9c\x8d\xfc\xa6\x59\x79\x42\x18\x57\x18\x5c\xf6\x29\xf8\x68\x07\xa8\x59\x73\xd3\x44\x0a\x6b\xf8\x11\xa5\x8d\x04\x13\x87\x24\x98\x11\xec\x04\x7e\x5e\x8b\x34\x3b\x23\x87\xd0\x18\x1e\x0d\x0b\xd4\x61\xef\x10\xe8\x16\x4a\xae\x35\x7d\x9b\x29\xdc\x0a\xce\x3e\xc6\xd7\x43\xae\x34\x54\xab\x9f\x84\x2a\x28\xd5\x71\x02\x17\xdf\xfe\x50\x34\x4e\x8d\x93\x2f\x18\x01\xb0\xe8\xf9\x66\x19\x8e\xf1\xc9\xcc\x69\x69\xf3\x47\x34\xaa\x6a\x63\xae\xaa\xb4\x33\x9f\x75\xd3\x4f\xfa\x8a\xcb\x93\x7e\xd9\xc7\x30\x92\xa3\x09\xa9\xb8\x4a\x25\x01\x1e\x31\x14\xc2\x65\xe4\xf6\x02\x33\x7e\xb6\x99\xb5\xa2\x2d\x57\x2b\x03\xe4\xda\xd0\x3b\x04\x61\xc0\x0d\xb9\x67\x9b\x72\xfc\x5b\x49\x3e\xf4\x48\x6f\x85\x53\x5d\x81\x3a\x58\x08\x03\x85\xaf\xd4\xe8\xd8\x71\x82\x80\x34\x33\x4b\xfe\x44\x1d\x18\x98\x4e\x4d\xfc\xde\x02\x44\x03\xb5\xae\x66\xcc\x50\xa4\x73\x01\xb5\x7f\x9a\x32\xf7\x40\xbd\xc7\xff\x1d"}, +{{0xd8,0xaa,0x2a,0x0a,0xa5,0x14,0xfd,0x84,0x5f,0x7a,0xa6,0x6b,0x83,0xc0,0xea,0xbb,0x9c,0x16,0x02,0x3a,0xbc,0x16,0x95,0x77,0x34,0x50,0xb2,0xbb,0x33,0x25,0x22,0xf2,},{0xe4,0xe8,0xd6,0xb2,0x98,0x24,0x8c,0x15,0xfe,0x08,0xf8,0x7a,0x3b,0xc6,0x08,0x4b,0xf2,0xd6,0x4d,0x7f,0x1e,0x4b,0x2d,0x51,0x59,0x9e,0x9f,0xad,0x9c,0xc9,0x10,0x92,},{0x14,0x6f,0x65,0xd4,0x3e,0x71,0x55,0x42,0x89,0x4b,0x79,0x00,0xa2,0xf8,0xcd,0x4b,0x17,0xd3,0x87,0x0a,0x61,0x00,0xe3,0x7d,0xe0,0x05,0xb0,0xdb,0x5d,0x81,0x51,0x24,0x6d,0xe4,0xee,0x38,0x42,0xd3,0xeb,0xca,0x20,0xa5,0xda,0x22,0xa3,0x63,0xa7,0x57,0x5e,0x7a,0x55,0x12,0x82,0x95,0xf2,0x72,0x11,0x48,0x4a,0xf5,0x7c,0xd5,0x31,0x09,},"\x08\xde\xb3\xb8\x32\xf5\x2d\x65\x56\xf7\x8c\x3f\x0a\xbe\x46\xf1\xef\xe4\x5e\x3d\x5d\x88\xe7\xf8\xed\xf8\x03\x67\x0c\xe4\x61\x29\x21\x74\x9e\x9e\xce\x63\xfd\xc9\xbe\xf2\xba\x48\x38\x12\xbb\x62\x2b\xe7\x44\xd4\x04\x04\xfd\x6e\x09\xc9\xe1\xcb\x7c\xe1\x9d\xe8\x1a\x9d\xad\xf5\x56\x35\x2e\xe8\x98\x10\xc7\x6a\x9b\x10\x47\xac\x62\xb1\x6e\xbb\x7d\xa2\x3d\xdc\x2d\x4a\xb7\x6a\x02\x05\x61\xd0\x2d\x41\xb5\x8b\x94\x95\x3a\x23\xfa\xaf\xdd\xd7\x81\xb7\xdc\xa7\xb7\xfb\xee\x70\x6e\xc1\x0a\x73\x12\x5b\xf7\x44\x36\x05\x6b\xf3\xb4\xf2\xa0\x70\x1c\xfe\xf0\x5b\xeb\xd3\xdd\x8e\xef\x30\x6c\x1a\xc1\xb0\x09\x50\x88\x1f\xf0\x5a\xb5\xc8\x24\x8a\xd1\x09\x6a\xc9\x1d\x52\x6a\xe5\x9b\xa0\x58\x3b\x27\xdb\x7d\x1e\x39\x0f\x57\xa5\x88\x9e\x27\x99\xa4\xa1\x51\x9b\x15\xd9\x3d\xbf\x0b\x21\xd4\x50\x87\x3c\x76\xba\x52\x04\x61\xe8\xbb\x5c\x83\xc9\x01\x2e\xac\xd5\x57\xbe\xa6\x40\x58\x6e\xfc\xb8\x69\x00\x76\x47\xd4\x49\xf9\x1c\xcd\x52\xaf\xe3\xa8\x94\x77\xde\x7c\x2b\x64\x7e\xcc\x9b\xf9\x67\xfb\xf5\x76\x9d\x74\x88\x94\x47\xd9\x52\x2d\x9e\x80\x69\xc3\x49\x9a\xf6\xa8\xa1\x09\x7a\x95\xd3\xbc\xc5\xf8\x34\x33\x93\x44\x84\x31\x4c\xb3\x07\x58\xb5\x25\xfe\x53\xe9\x07\x21\xdf\x5c\xbe\x03\xd9\x6f\x0d\x0f\x98\x52\x1f\x01\xa5\xfb\xe5\x7c\xe8\x80\x4d\xbd\x18\xf8\xf5\xea\xc8\xf7\xdb\xb5\x8c\x41\x78\x9a\x44\x43\x3f\x8a\x8d\x12\x45\xd2\xad\xda\x8c\x78\xd8\x81\xc6\x5e\xa6\x61\xab\x17\x8d\x4f\xc2\x63\x4c\xd6\xcb\x51\x4a\xb6\xf2\x54\x3e\x91\x12\x18\x3f\x3f\xf7\x3a\x3f\x45\x01\x06\xb0\xee\x8a\x34\x7a\x80\xcb\x82\x4a\xc1\xf8\x01\x64\xe3\xbb\x51\x23\x69\x8d\xe0\xe7\x47\x35\x9c\xa3\x5a\xca\xa3\xba\x0c\x94\x3b\xea\xcd\x7a\x9b\xdf\x8f\xf7\x39\x78\xe9\xfb\x00\x20\x45\xe8\xfe\x56\x48\xcc\x0f\x9c\xfa\x88\xb0\xd8\x12\xe8\x1a\xa6\x2e\x0d\x9c\x73\xfe\x61\x3a\xfd\x95\x39\xbc\xb6\x15\x72\x1f\xb4\x97\xd6\x2f\x65\xc8\x3b\x87\xa6\xd2\x14\x3f\x9b\x1c\x88\x0e\xc8\x67\x1b\xd4\x2c\x8d\xe9\x57\xb1\xa6\x8e\xe4\x92\x26\xff\x71\x7c\xcc\x6e\x74\xf2\xee\xe4\x9c\x30\xde\xa5\x3f\xec\x3c\xd4\xd9\x0f\x2c\xcc\xd8\xf9\x7c\x55\xd5\xc7\x52\x45\x4b\xe2\xba\x7b\x6f\xf2\x03\x0b\xe6\x7e\x0d\xf5\x0c\x5e\x88\x38\x43\xe7\x16\x12\xf2\xb9\x53\x59\x54\x3e\x2b\xa1\xbf\x2e\x98\xde\xbc\xf5\x76\x8f\x2b\xe6\xfd\x50\x4d\x97\x83\xce\x92\x1a\x81\xe0\x94\x16\xdb\xcf\x2b\xb6\x55\xa9\x24\xb1\xef\x01\x12\xd6\x71\xf0\x84\xa5\xb6\x90\xb0\xb6\x4a\x8b\x9b\xf5\x03\x33\xc3\x59\xff\x3f\xef\x19\x96\x94\xf9\xb6\x29\x24\x24\xf0\x06\x66\xce\xf6\xd0\x6d\x16\x1a\x79\xe3\xa1\xb9\xb9\x62\x9e\xea\x53\x50\x5f\x5e\x36\xae\xad\xfe\x0d\x75\x96\x72\xb0\xff\xe4\x98\x39\x7d\x90\xa5\x5d\x99\x44\xb3\x05\x41\xa7\xe1\xbd\xac\x53\x02\x06\x40\x13\x7d\xc2\x52\xae\xf6\x22\xf3\x81\x9d\x36\xab\x49\x8d\x76\x3e\x43\x27\xba\x85\x80\xdd\x9f\x7e\x5f\x47\xc2\x4c\xc9\x92\x87\x34\xb7\xe6\x21\x12\xc5\x7e\x3e\x0c\xfe\xde\xcd\xcb\xac\xcb\x0c\x45\xaf\x82\x19\x45\x5e\xe7\x22\x3c\x71\xe7\xe2\x04\x10\xc5\x24\x4e\xb8\x27\xaf\x2f\x39\x35\xce\x47\x55\x44\x47\x47\xaa\x94\x5f\x4c\x26\xdb\x3a\x29\x85\x19\xe7\x5f\xc6\xba\xce\x91\x52\x99\x72\xe8\x69\x1b\x69\x4d\x30\xaa\x8b\x5e\xc4\xc1\xa0\x28\xd3\xbd\x10\xbd\x0c\x8a\x40\x8f\xb7\xd9\xd7\x03\x49\x55\x53\xec\xea\x59\x8d\x06\x22\xdc\xc7\x4d\xe4\x89\xba\x71\x95\xcd\xae\x8d\x5c\xff\x98\x55\x92\x18\x37\xb5\x28\x43\x3e\xe5\x5c\x0b\x70\x90\x85\x7a\x0c\x27\x84\xd9\x31\x0b\x48\x25\xa7\x99\x3a\xd9\xc6\xf1\x8f\x83\xbc\xa5\xcc\x6a\x25\x04\x71\x68\xa8\x37\x6b\x06\x2e\x3a\x48\xea\x90\xca\xd8\x8e\x33\x11\x87\xc2\xb6\xf2\x81\x42\x6f\x81\xf7\x88\x04\xa8\x95\xc4\xec\x06\xc3\x41\xfe\x84\x6a\xf4\x52\x7e\xa2\x60\x69\xdc\xf6\x1d\x81\x3f\xdd\xf0\xfc\x43\xc7\x07\x35\x0b\xfb\x2f\xc1\xcf\xfc\xee\x7d\x7c\xcd\x7d\x75\xf7\xa4\x65\xa3\xd1\x4d\x57\x30\x2c\x14\x6a\xba\x3e"}, +{{0xde,0x8f,0x1c,0x99,0xe7,0xf8,0x55,0x6d,0xf2,0x0b,0x59,0xb8,0x50,0x4c,0xff,0x7c,0x6c,0x52,0x41,0xa8,0xae,0xeb,0x30,0xb9,0x2e,0xab,0x97,0xbf,0x48,0x1d,0x0f,0xe9,},{0xe4,0x63,0x79,0x1d,0x0f,0x56,0x7e,0xe7,0x3a,0xbb,0xf4,0x7d,0xd5,0x71,0x67,0xa5,0x35,0x61,0x3b,0x05,0xcd,0x48,0xd9,0x2e,0xbc,0x7d,0x24,0xe6,0xeb,0xff,0x95,0x73,},{0x30,0xab,0xc4,0xe4,0xe4,0xb3,0x88,0x58,0x1e,0x66,0x8b,0xd4,0x09,0xee,0x18,0xa6,0xed,0xe8,0x1a,0x13,0x6c,0x28,0xa2,0x92,0x4d,0xf5,0xfc,0x00,0xd7,0xc2,0x80,0xd9,0x78,0x62,0xae,0x3a,0x67,0xa9,0x35,0xce,0x49,0x23,0x64,0x13,0x5e,0x65,0x9a,0xdb,0x5f,0xba,0xbe,0x68,0x98,0x16,0x59,0x1f,0x49,0xac,0x50,0x22,0xa3,0x87,0xcc,0x09,},"\x38\xd9\x3e\x5c\x98\x01\xdb\x90\x17\x97\xec\x75\xc6\xdd\xdc\x65\xae\x79\x80\xde\x21\x0b\xed\x43\xb3\x3e\xb4\x4c\xdc\x6d\xc9\x93\x3f\xb6\xbe\xc7\x42\x1d\xb1\x0f\x0a\x59\x32\x0b\x9e\x64\x2a\x21\xf1\xdd\x23\x56\x01\xfc\xd6\xc5\x3b\xe4\xa8\x77\xf4\xfe\xd3\xfa\x4a\x0a\xd4\xdc\x6e\x9b\x39\x1b\xcf\xa4\x34\x90\x69\x25\xba\x45\xec\xc5\xb4\x35\xd9\xab\x8c\xfa\xfc\x39\x4b\xdc\xca\x9b\x07\xd5\x66\x83\x93\x44\x6e\x34\x00\xe9\x03\x94\x35\xa1\xdc\x78\xcb\xc0\x88\x07\xa3\xfb\x24\xca\x8b\x19\xf6\x4e\xa0\x8b\x8b\xf6\xc2\x0a\x19\x5b\x51\xff\x80\x15\xf3\xe7\xc9\x1d\x08\xe4\xbc\x62\x41\x55\x95\xa5\xa8\x82\xfb\xa6\x51\xdc\x3a\x67\x51\x87\xaf\x61\x82\x49\x74\x7b\x46\x80\xd1\xd1\x5a\x20\x2e\xa9\xdf\x48\xb1\xc2\x14\xfd\x40\x34\x66\xfd\x1a\x26\x5f\x2d\xef\xaf\x8e\xd5\xa6\xbf\x0e\xb0\x8d\x18\x64\xf2\xa2\x8e\x94\x72\x14\x3c\x6f\xd1\x03\xb6\xb1\x08\xc0\xd1\xd1\x36\x3b\x99\xf9\x20\x2d\x11\xf0\x20\x56\xc2\x79\xcc\xa3\x15\xdb\x1a\xb6\xd3\x10\x18\x45\x8f\x57\xba\x33\x16\xcd\x27\x38\xe8\x0c\x49\x2d\x85\x7c\xb1\x74\x99\x25\xe3\x31\xc6\x58\x58\xb5\x09\x83\xcd\x98\x38\xcf\xd2\x18\x8a\x5e\x8f\x05\xb4\x71\xfd\x3c\xdd\xcd\x30\xd9\x69\x01\x19\x40\x20\xf1\x15\xfb\x46\x9a\xb5\x84\x90\x06\xdf\xfa\x2d\x54\x3a\x13\xb3\xb5\x06\xed\x65\xcc\x45\x75\x32\xb8\xaa\x3e\xe3\x1d\x9d\x8d\x9e\x52\x98\xd7\xac\x70\x7a\xc1\x5b\x82\x7a\x57\x8c\x81\xd4\x34\xf8\x4c\xb1\xb5\x61\x20\xd6\x67\xb2\xaf\xe6\xd1\x53\x0a\xfd\xdf\xb9\x66\xd9\x53\xbe\x7e\x32\xdf\x07\xde\x38\x9e\x2d\x04\xb2\x32\xd3\x51\x2c\x7d\xb9\x35\x8f\xc9\x44\xd1\xb1\x18\x07\x8e\x69\x99\xe8\x91\xbb\xfa\x4a\x43\x29\xf6\x5d\x80\x71\x88\xb5\x98\x58\xc4\x31\x21\x1b\x29\x57\x6f\x44\x96\x13\x8b\x7c\x0c\x12\x8f\x7b\xef\x5f\x79\xb0\xf4\x46\xfc\x6b\x4a\x0e\x20\xbc\xa4\xc4\x0a\x83\x57\x1a\x36\x64\x4a\xbf\xfa\xbd\x49\xcb\x58\x5f\xd0\x64\xc8\xe5\x09\xd9\xa0\xfc\xff\x46\x26\x76\xf0\xeb\xcb\x61\xce\xc6\x1e\x51\x2b\xe6\xf1\x82\xab\xd5\x9e\x09\xf6\x42\xaa\x61\x96\x34\x85\x34\x82\xec\xe8\xf8\x98\x00\xf9\xc5\xbc\xfb\x84\x14\x31\xca\x06\x91\xed\x8d\x80\xe0\xa2\xfc\xb7\x97\xa0\x36\x89\x7c\xfb\x65\x37\x58\x6b\x31\xc0\x0b\x79\x65\xef\xdd\xfd\xa7\x28\x61\x84\x50\x26\x45\x91\x57\xf7\x9e\xba\x1b\xca\xf6\xcd\x41\xd6\x18\xae\xb1\xbd\x8d\xa1\xbe\x98\xf0\xcd\xc7\xf2\xe0\x9b\x90\x3d\xe4\x9c\x0c\x1b\xe9\x1d\xcc\x17\x7b\x29\x80\x96\x83\x6d\xce\xa4\xf6\x01\xdd\x86\x69\x15\x55\x12\x83\x25\x43\x8b\xd9\xcc\xbf\xc0\xe7\x77\x92\x0a\xe8\xbb\xd5\x76\x34\xc6\x10\x4f\xe6\x9a\x3a\x72\x01\x2a\x23\x60\xb6\xe5\x52\x55\x0c\xff\xb4\xe2\xf0\xb4\x1f\xe1\x55\x37\xee\x0e\x6f\x37\xe7\x88\x0f\xb4\xd1\x2b\xef\x6c\xad\x26\x6c\xe5\x8d\xf9\x81\x6b\x35\x96\x0c\xd0\xbf\x86\x52\x86\x2e\xe7\x89\xcc\xc3\x1a\x7e\xfc\x21\xa8\x1b\xda\x46\x14\x6b\x11\x1f\xcf\xd9\x4f\x04\x85\x6a\xb6\x1a\x55\x7b\x1f\xf7\xc8\xe4\xea\x6d\x9c\x4b\xcd\xd9\x3b\x15\x1a\xa0\x84\x61\xc5\x68\xde\xfb\x2a\xef\xdf\xce\x96\x39\x4d\xc8\x22\xd4\xef\x6c\xc4\xb9\xa3\xe6\xc3\x32\x03\x9f\x65\x38\xaa\x0d\xf8\xde\x81\x26\xd9\x0c\x31\x2f\xf4\x96\x88\x74\x86\x11\x15\x65\x53\x43\x46\xa7\x46\x26\x25\xd6\x3d\xf6\x9f\xcb\x57\x41\x90\x6f\x19\xe0\x0f\xc8\x00\x3f\x08\xb9\x59\x85\xc3\x8b\x86\x74\xaf\x42\x3c\xa5\x6d\xe5\xf8\x81\xb5\x9c\x46\x62\x43\xa7\xad\xba\xdb\xa2\x9c\xaf\x57\xfa\x77\x71\x22\xe6\x18\x23\xb4\xe7\x08\x18\x2a\xaf\x37\x20\x6d\x7d\x5e\xd0\x51\xc1\x2a\x5c\x0f\x6b\x43\x71\x04\x3f\x56\x2c\xdc\x02\x9d\x5e\x1b\xa9\xb2\xbf\x5f\xfb\xf1\xf5\xf5\x23\xdb\x06\xfe\xca\x42\x7d\xb7\xa0\x88\x19\xff\xb2\xd0\x58\x52\x42\xe2\x0d\xa5\x8e\x32\x0b\x16\xb1\x6e\x44\x8d\x8b\xe0\xef\x74\x02\xd2\x4a\x71\x94\x25\x71\x33\xbd\xc9\x82\x31\x4d\x83\xad\xbc\xd1\x2e\x8a\xf3\x13\x03\x42\x6c\x59\xff\xd8\x26\x9c\xe4\xb9\x87\xca\x9b\x6f\x0f\xfd\xbb\x4d\x1d\x12"}, +{{0x07,0x36,0xf8,0x01,0x72,0x0a,0x94,0x7c,0x5c,0x2f,0x32,0x58,0xce,0x0d,0x51,0x1c,0x3e,0x17,0xe9,0x4e,0x37,0xb3,0x0a,0xdf,0xa5,0x20,0x95,0x92,0x11,0x71,0xd4,0x00,},{0x4f,0x69,0x42,0x55,0x92,0x0d,0x0c,0x38,0xde,0x6e,0x72,0xe1,0x65,0xc3,0x3a,0xee,0x76,0xb1,0xcb,0xf6,0xf4,0x83,0x7a,0xa5,0x90,0x14,0x75,0x66,0x7a,0xcd,0x28,0x26,},{0xc0,0x3c,0x03,0x14,0x85,0x12,0x79,0xed,0xcd,0xe9,0x70,0xc2,0x3e,0xfa,0x23,0x6f,0x23,0x5e,0xda,0x96,0x0d,0x2c,0x27,0xd3,0xca,0x94,0x6f,0x65,0x0c,0x20,0x0b,0x4e,0xba,0x04,0xbe,0x66,0x8f,0xf6,0x2e,0xaf,0xfa,0x6c,0xea,0x35,0x1a,0xbd,0xfc,0x54,0x40,0x1d,0xcc,0xce,0x3d,0xba,0x78,0x00,0x4a,0xec,0x95,0x81,0xa2,0xcc,0xf4,0x0f,},"\x7f\x87\xb5\x1f\x6e\xad\x2d\x44\x02\xa3\xbd\x3c\x37\x69\xa2\x67\xac\x8e\x82\xf7\x79\xad\x7b\x98\x6d\xec\x82\xcb\xfc\x1e\xa5\x12\x91\x88\x43\x26\xd9\x22\x69\x67\xcb\x66\xa9\x68\x73\x18\x4f\x0e\x83\xb3\xab\x25\xa5\xab\x2f\xa8\x05\xfe\x3a\x0e\x7b\x19\x0a\x62\x2d\x46\x1b\x78\x30\xa3\xf6\x97\xc8\x31\xc2\x9e\xa7\xc0\xcd\x4b\x68\xd8\xe7\x7a\xa6\x97\x11\xcf\x86\x4d\xc1\xd5\x39\x4f\x48\x45\xe2\xfb\xb5\x07\x64\x04\xe0\x9a\x88\xb7\x9f\x05\x67\x05\x51\xbc\xe2\xef\x54\x68\xb7\x9d\x57\x88\x8b\x98\x52\xa4\xbb\x47\x9a\x4f\xd0\xbe\xb6\x81\xfd\x52\x3f\xc5\xbf\x44\x58\xab\xbc\x38\xec\xe7\x2e\x10\x6e\x00\x22\x20\x15\xa5\x7e\xbe\xc5\x5b\xf4\x75\x13\xe2\x5c\x3c\x45\x54\x84\x3b\xda\xcb\xcf\xe9\xf1\xb8\xd0\xae\x35\x4e\x48\xd0\x3f\xde\xbd\xf2\x0d\x65\x5b\x52\x68\xd8\xbb\xbf\x33\xb1\x28\x89\x10\xf0\x44\x4f\xcd\x56\xc0\xda\x7b\x89\x03\x36\x2b\x7e\x37\xa8\x64\x65\x42\x77\xcf\xfb\xe6\xc6\x08\x57\xf0\xb3\x51\x4d\x22\xa4\x0b\x9d\xd2\xd3\xfe\x5c\xae\xa5\x50\x7a\x0d\xe3\x05\x1b\xb3\xa4\x01\x5f\xa0\xfe\x4c\x46\x2b\x98\xfe\xf2\x35\x7d\xcf\x6b\x97\xdc\x75\xde\xf3\x82\xf9\x01\xf9\x6f\x4a\x04\xa3\xef\xc6\x02\x54\x20\x0a\x2c\x4c\xdc\x8a\x58\xb2\x5d\x94\xe3\x29\x54\xea\xff\x15\x11\xac\x46\xe3\x60\x66\x63\xb6\x87\x5f\x13\x64\x99\xda\x6a\x76\x90\x97\x87\x9a\x6e\x08\x34\xd5\x64\xfa\x7f\xdb\x99\x58\x11\x83\xed\x0c\x9d\x48\xfd\x19\x5d\x7e\xcd\x9f\x4d\xd4\x86\x55\x65\xfd\x17\xa0\x08\x71\x8d\xcd\x76\xf6\x8a\x54\xe5\x16\xa2\xb7\x30\xed\x3d\xba\x5c\x2c\xf4\x06\x30\xbb\xfe\x7f\xa0\x3b\xb7\xcd\xd9\x67\x69\x54\x95\xa7\xc8\x6e\x2e\x84\xcb\x01\x7e\xc6\x96\x01\x92\x46\x31\x59\x5a\xff\xaa\x8c\xfd\x04\x8d\x14\x26\x7c\x73\xe5\x4c\xfa\x53\x90\x47\xe7\x17\x69\x1e\x39\x97\x37\xfa\x50\xcc\x48\x44\x96\x12\x57\xc9\x3d\x72\x53\xd2\x32\x26\xb7\xcd\x0d\x1b\xd3\x1f\x3f\x0d\x2d\x89\x2d\x07\x3d\x8c\x50\x73\xc6\x02\xf6\x1a\x04\xd6\x43\x7c\x39\x03\xeb\x4a\x64\xa0\x1f\xbc\xc0\xc7\xe1\x59\x20\x1c\xdc\x4a\xa4\x2e\xf3\xb1\xff\x9c\x78\xfc\x27\x5c\xfb\x11\xa0\x5f\xfe\xd8\xf9\xf2\x2d\x85\xba\x92\x4d\x8d\x32\x23\x1c\x25\x4d\x89\x8d\xa7\xf0\x67\x9a\x64\xca\xb8\x40\x26\x90\x6e\x9e\x85\xf9\x5e\xfd\x8e\xe2\xa1\x72\x56\x33\xf4\xde\x2b\xa6\x7d\x99\xaa\x7f\x05\x50\xaf\x13\x9e\x9f\x8c\x52\x93\x78\x67\x27\xd8\x26\x30\x29\x6d\x5d\xaa\x9e\x83\x0a\xa1\xb3\xb5\xb3\x02\xb8\xb6\x62\xac\x83\x2e\x92\x13\x01\x6b\xa4\x93\xa0\x3a\x28\xcc\x3e\x95\x40\xd0\xd6\x5a\xcd\xdb\xfe\x12\x52\xb5\xc1\x6a\x84\xa4\x45\xce\x75\x41\x5c\x6c\xd8\xab\x16\xfe\x5e\xef\x11\x70\x97\xd7\x1e\xb5\x67\x6b\x9a\x95\xb3\x58\x82\xa7\xc3\x50\x6b\xc5\xd0\x2f\x03\x91\x0a\x63\xd4\x68\x46\xb2\x13\xc3\xc9\xbb\x2f\xc3\x4e\x6c\x69\x01\x7d\x20\x65\xa1\xad\x3c\xe3\xfd\x14\xab\x00\x14\xf5\x84\xe5\x7e\xa9\xd9\x03\xe4\x0a\xce\xb2\x30\xa8\x69\x3f\xa2\xe6\x36\x41\xc2\x54\x38\xff\x7a\x16\x38\x76\x04\x38\x84\x4c\xdf\x00\x11\x80\xf5\xb1\x77\xbe\x69\xed\xf7\xef\x66\xb3\x93\x12\x80\x52\x14\xcb\x17\x70\x6c\xef\xe5\x45\xbe\x5a\x77\x01\x9a\x5e\xc5\x2b\xbf\x78\x85\x0f\xa3\xd9\x7d\xe2\xd4\xd7\x4a\xa6\x8b\x58\xca\x81\x2a\x1b\x15\x6a\x0c\x40\x01\x12\x9f\x06\x72\x32\xa6\xec\x91\xa5\xed\x42\x70\xf2\xa4\xc6\xef\xee\xe7\x87\x00\x47\x70\xc8\x59\xe4\x50\xe8\x37\xef\xb0\x4d\xc9\x98\xbd\x27\x3c\x27\xa0\x98\x55\xe4\xec\xa1\xa2\x2a\x9b\x88\xc1\x7b\xdb\xf2\x53\xa7\x97\x61\x07\x0a\x76\x81\x7a\x7f\x74\xff\x3f\x07\xfb\x71\x8b\xff\xa0\xb4\xf3\x26\xf2\x84\xe6\x2f\x83\x68\x32\x42\x7b\xe8\x2f\x48\x33\x73\x51\x5b\x9b\xf5\x9a\xf4\xa7\x6a\x57\xe2\xf4\x0b\x91\x03\x4d\xd5\x68\xec\x14\xac\x10\xe2\x30\x9b\x87\xe2\x92\x2f\x9c\xd9\xfc\x1a\x46\xa4\x7e\xd3\xbc\x7e\x1b\x9f\xeb\x9e\xe0\x67\x07\x3f\xa5\xdc\xe2\xa6\x75\x30\x52\x6d\xe6\x7e\xe0\xe5\x09\x66\x3c\x44\x46\x7e\xeb\x59\x42\x01\x03\xeb\xcd\xff\xa7\x09"}, +{{0xfa,0x75,0x65,0x04,0x91,0x04,0x74,0x28,0xd3,0x63,0xb5,0x82,0x22,0x22,0x12,0x2d,0xff,0xb5,0xa9,0xfd,0xdc,0x60,0x3c,0x33,0xc8,0xa6,0x08,0x61,0x83,0x75,0xdc,0xf3,},{0x98,0xc9,0x64,0x1f,0xa9,0xdf,0xa8,0xea,0x13,0xe0,0xd1,0xc7,0x16,0xb8,0x67,0x9e,0x26,0x4b,0xe1,0x5d,0xd2,0xd4,0xc0,0x6a,0xb4,0x3c,0xbe,0xe4,0x79,0x16,0xee,0x01,},{0x1e,0xff,0xbf,0x92,0x99,0xa1,0xb9,0x35,0x4f,0xe1,0xf1,0xde,0xc1,0x76,0x65,0x95,0xea,0x76,0x7a,0xb8,0xe4,0xda,0x9b,0xb5,0x7b,0x4f,0x69,0xbc,0xbd,0x8c,0xb3,0xd8,0x6f,0x76,0x83,0x92,0xf5,0x9b,0x39,0xfa,0xfa,0x8a,0x21,0x0a,0x65,0x09,0xfe,0x0d,0x60,0x08,0xd6,0x35,0x61,0x11,0xad,0xfb,0x37,0x99,0xc1,0xd5,0x59,0xc2,0x63,0x09,},"\xf5\x4e\x41\xb9\x39\xe3\x7d\xf1\x7c\x7d\x60\x43\xfd\xed\x14\xa9\x15\xd9\x34\xe8\x67\xc3\x45\x26\x9f\xdc\x01\x77\xf5\xbd\x10\xc4\x34\x8f\x31\x9e\x0a\xb9\xa6\x4c\xc0\xb7\xd4\xe0\xc9\x1c\xa9\xaa\xda\xab\x2e\xdc\xba\x54\x4f\x14\xed\x2c\xb5\x39\xca\x89\x75\x09\x7d\x87\x92\x70\x95\xb4\xeb\xd4\x90\x34\x43\x40\x06\x1e\xd9\x3c\x38\x16\x7e\xda\xa0\x96\xa2\x30\xdb\x59\x62\x4c\x67\xfb\x9a\x1e\x1d\xda\xc4\x02\x13\x3f\x4d\x47\xcf\xc1\x1e\x2f\xae\x6b\x3f\x3c\x50\x01\xcb\xa9\xa8\xae\xd9\x00\x73\x10\x32\x40\x22\x7e\x71\x6f\xf7\x1b\xf6\x8a\x59\x1b\xa2\xce\xff\x2d\x31\xb8\x6e\xf2\x1a\xb0\x12\xec\xcd\x40\x9a\xd5\xc2\x9d\x65\x9a\x1b\x37\xc4\xd8\x55\x05\x30\x41\x40\xfb\x2c\x34\x37\xa2\x06\x86\x8b\x13\x52\xc1\x02\xbb\xfa\x3b\x9a\x76\x52\x2a\x2b\xfc\x54\x06\xb2\x57\x69\x6d\xe7\x4e\xe7\xd3\x15\xc8\xe9\x9c\xaa\x96\xbd\x83\x80\x06\xc6\xda\x2a\x42\x33\x31\x5a\x85\x6a\xcb\x8e\x80\xc3\x31\x68\xb3\x33\x55\x1d\x91\xd0\x74\x05\x57\x34\x13\x0b\xd7\xd1\x4c\x56\x81\x1e\xba\xbf\x7d\x5a\x25\x0e\x60\x72\x59\x3d\x9f\x2f\x8b\x97\xc1\x2a\x70\x3c\x2c\x47\x9c\xb0\xb1\x5b\x7a\x27\x75\xc9\xdc\xd2\xca\x46\x24\x67\x23\x68\xa2\xe6\x14\x54\x67\xf3\xbe\x66\x15\xf9\x3b\x81\x20\xa0\xa1\x2d\xa1\x56\x06\x63\xa2\x6a\x61\x73\x19\x66\xb4\x4b\x29\x9e\xbf\xad\x2a\x95\xc6\x23\x60\xf3\x9c\xe0\x5d\x95\x58\xe3\x05\xee\x23\xa5\x2f\xa5\xce\x20\xf6\xbe\x5e\x26\x2a\xff\x3a\x86\x4d\x5d\xda\xbe\x23\xff\x94\x3f\x71\xd5\x99\x84\x93\xd9\x9f\xe2\xac\x23\x74\xb4\x64\xa6\x91\x83\xc3\xbc\x4f\x1d\xdb\x88\x36\x11\x14\x9d\x7d\xdb\xf1\xe8\x38\x0b\x54\x43\x35\xe2\xb8\x93\x95\x05\x4c\x9f\x25\x58\xdf\xc5\x6e\xa9\x3f\xf1\x4d\x0f\x15\xd2\xe0\xbd\x89\x37\xa5\x56\x38\x7d\xe9\x6e\x41\x8d\x8b\x3a\x7d\x66\x6f\xb1\x90\x36\x4b\x2c\x21\x90\xd3\xc2\x5f\x17\x52\xd5\x48\x3d\xcb\xb5\x96\x00\x64\xf0\xc8\x7f\xcf\x8f\x31\x3d\x28\x78\x1c\x11\x4a\x16\x9b\x69\x0a\x87\x01\xc5\x0d\x89\xc7\x73\x24\x53\x1c\x0f\x84\x9d\xba\xd1\x63\x3d\x92\x5a\xcd\x06\xc1\x6a\x9c\xea\x19\xa4\x34\xeb\xc4\x2a\xeb\xb1\xfd\xb9\xb0\xba\xcc\x93\xce\xc3\x99\x19\x94\x36\x64\xea\x1a\x95\x84\x06\xff\x9e\x49\x35\xc9\x2c\xa7\xc3\x97\x08\xf9\xca\xb7\x10\xa5\x83\x09\x6b\x4e\xd9\xf4\x8d\x9e\x09\x06\x47\x24\x0d\x76\xec\xcb\xab\xa5\x91\xf5\x5f\xe7\xe3\x6d\x72\xc2\x17\x27\xac\xba\x0f\x80\x30\x95\x4e\x62\xbc\x58\x0b\x8b\x67\x0c\x44\x57\xc3\x40\x3e\x36\x9a\xc2\x0e\x66\x0d\x66\x2f\x7f\x6a\x41\x42\x13\xea\x43\xf7\xc0\x10\x50\x09\xc1\xde\x81\x7a\xdf\x6f\xfd\x9c\xca\x3b\x45\xa6\x3a\x82\x22\x81\xc6\xe2\x77\x2f\xd7\xb7\x80\x96\x03\x18\x4b\x48\x79\xb1\x8c\x88\x79\x03\xf0\xfc\x8d\x8e\x1e\x2d\xbf\x6e\x77\x2f\x0b\x2d\x9b\x8a\x29\x92\x7a\xcc\x81\x71\x4a\x22\x56\xad\x8d\x7b\x73\x30\x52\x7d\x7d\xbf\x8b\xef\xd8\x2f\x8c\x9b\xb4\x01\xcf\x0a\x90\x24\x9a\x64\xca\x6f\x88\x33\xdb\x31\xbd\x03\xb9\xe7\x94\x6d\x06\xdd\x04\x38\x3d\x7c\x08\x2d\x70\xae\xb3\x7f\xf8\x4c\x2b\x05\x7d\x97\x3b\x89\x4b\x4a\x03\xec\x7b\xf0\x31\xae\xa6\x56\xa1\x90\x84\x88\x89\x4a\x4a\xda\x3f\xd7\xfa\xdf\x91\xed\xe9\x55\x0d\x38\x41\x5f\x82\xa0\x94\x55\xc0\xf4\x32\xfb\x55\x98\x71\x32\xf0\x00\x42\xaf\xd6\x0e\xa5\x1d\x1f\x1c\x6c\x1a\xfe\x0c\xf8\x7c\x34\x6e\x31\xe6\x3e\x26\xf4\x9b\x13\x71\x77\xb2\xd4\x7a\xb3\x0f\x07\xce\xa0\x71\x93\x12\x74\xcf\x01\x08\x36\xd6\x83\xff\xf3\xbe\x71\x34\xc7\x8b\x8b\xfd\x8b\x1b\x8f\xc2\x04\x9e\x18\xcc\xb1\xe1\x8a\x0a\x95\x85\xa7\xd8\xa1\xe2\x54\x92\x60\x86\x68\xc9\x6d\x62\xa0\xac\xa8\xef\x90\xe0\x48\xd2\x03\x78\xc1\x08\xd0\x6b\x03\xfe\x3e\xc4\xad\xb2\x75\x28\xae\x08\xf7\xde\xd9\x48\x78\x93\xae\x64\xca\x4b\x93\x92\x02\xaa\x4c\x17\xaf\xe7\x18\xcd\xca\x49\xff\x96\x16\xd0\xcd\xf8\x33\x4b\x6a\xee\x2d\x6d\x20\x94\x7c\xa4\xbd\x7d\xf5\x31\xdd\x1d\xa9\x95\x81\xff\x72\xea\x56\xfe\x62\xca\xa2\xc9\x5e\x35\x87"}, +{{0xe1,0xc1,0x29,0x46,0xd2,0x21,0xa1,0x94,0xf2,0x2f,0x27,0x62,0xc0,0xe5,0x1c,0xbe,0x3f,0x98,0xb9,0x14,0xa4,0x7d,0x3d,0xc4,0x1a,0x1f,0x45,0xc5,0x43,0x70,0x63,0x7c,},{0x10,0x40,0x81,0x36,0xa6,0x8f,0xc5,0x6c,0x7d,0x3b,0x36,0xb7,0xfe,0xf1,0x22,0x09,0x4d,0xe0,0x81,0x03,0x11,0x89,0xcc,0x84,0xa4,0x88,0x06,0xaa,0xf6,0xcb,0x91,0x85,},{0x8f,0xd7,0xfa,0x40,0x0c,0x03,0x2f,0xcf,0xbc,0x40,0x29,0x42,0xfc,0x78,0x63,0x75,0x26,0xbe,0x97,0xab,0x82,0xf2,0x37,0xbb,0x39,0x3e,0xa3,0x9e,0x35,0x73,0x8c,0x67,0xd7,0x54,0x09,0x54,0x3a,0x8b,0x3c,0x05,0x5f,0x08,0xbf,0x69,0x19,0x9a,0xf6,0x3b,0x69,0x11,0xa4,0x82,0xfb,0x4f,0x65,0x80,0x80,0x2e,0xc9,0xd2,0xdc,0x3c,0x11,0x06,},"\x87\x0f\x4c\xd9\x7c\xfc\x0a\xaf\xad\xa4\x00\x72\x31\x2f\xb5\x4b\xcc\xc0\x76\x28\x71\x4e\x49\x62\xd4\xbe\xf4\xee\xb5\xde\x40\xa1\x9a\x24\x6b\x5b\x7d\x52\xd4\x87\xb7\xe5\x2d\x65\x6f\x2c\x64\x03\xb9\x16\xd0\x2e\x02\xa6\xd2\x91\xc1\xe1\x82\x8d\xd9\x45\xa5\x83\xb4\x38\x52\x8d\x1c\x39\x76\x5a\x57\x20\x31\xff\xa9\x16\xb6\x83\x21\xf3\x2e\x66\x46\xf0\xdc\xc1\xc6\x02\x35\xff\xaa\x32\x35\xf4\x84\xa5\xc4\x97\x8f\xa3\xe6\xbf\x14\x30\x1d\x53\xe1\x2f\x4c\xc5\x21\x18\xb1\xf6\xf0\x7f\x53\x36\xf5\xd0\xa9\x37\x89\xbb\x01\xd1\x62\xfb\x31\x26\xdc\xd7\x56\xe0\x64\x2e\x7e\x69\x89\x63\xc0\x34\x59\x11\xa5\xcf\x3c\x99\x53\xf7\x73\x19\x42\x6c\xea\x2c\xde\xda\x3e\xfe\x98\x9e\xcb\x63\xcb\x9e\xb8\xb9\x20\xde\x76\x6c\x4f\xcf\x63\x36\xe5\xbc\x43\x71\xa0\x68\x37\x1f\xed\x95\xc8\xc2\xb6\x1e\xe9\xb7\xc3\xe3\x83\x1c\x20\xbf\xfe\x87\x07\xc0\xc9\x8b\xe9\x61\x53\xc8\xa8\x73\xd7\xf2\x8a\xfc\xa1\xbf\x71\x08\x5c\xe0\xe3\x89\x9e\xef\x55\x91\xbd\xd6\x66\xdc\x2d\x07\x64\x17\x72\xd7\x45\xc5\x16\x44\xa2\x60\x81\x5b\x20\x8c\x4d\xd3\x05\xf0\x5f\xe4\x63\xd0\xd9\xd5\xa9\xee\xff\x97\x79\xf5\xb1\xd4\x4f\x26\x08\x30\x78\x56\x6d\x0e\x5f\xf5\x6b\x3a\xf0\xe6\x4c\xc3\x87\x08\xaf\x5a\x65\xf6\x54\x35\x2d\xf1\x04\x37\xf1\xdd\xf9\x45\xa0\xda\x1f\x4d\xef\x6a\x71\xa0\x60\xe0\xc4\xad\xec\xca\xac\xf8\x5e\x09\x0f\x70\x90\x37\x0a\xe2\x4e\x52\x38\xd7\x68\xa0\x8f\xe6\xb4\xbb\x5e\xc4\x97\xa6\x60\x31\x98\x60\x84\x15\xc7\xc6\x49\x00\x48\xaa\x36\x73\x7c\x08\x50\x30\x08\xae\xce\x0f\x49\x42\x19\xdd\xf8\x9b\x72\xea\x77\x17\x1c\x6d\x31\x17\x08\x9e\xb8\x89\x07\xe8\xc3\x3f\xb9\xe7\x0b\x0d\xc2\x81\xf6\x64\xb5\xf9\x65\xb5\xd2\xad\xb1\x25\x07\x10\xef\x23\x52\x02\x5f\xb2\x93\x39\x5a\xe1\xd2\x3e\xe3\xb5\x92\xb4\xc5\xf2\xd5\x55\x69\xa5\x45\x86\x54\xce\x3f\xc2\x5d\xd0\xe3\xf7\xe6\x75\x7a\xa7\xb3\x47\xc1\xff\xd3\xba\x4d\x4f\x2c\x4b\x6d\x36\xaf\xd5\x98\x63\xa3\x2a\x59\x4e\x74\x53\x7e\xce\x9b\x8b\x1e\xc2\x69\xbb\xc4\xcb\x54\xd7\x62\x38\x21\x1f\x62\xa9\x8a\x46\xa4\xaf\x66\x2f\xa8\x1e\xba\x6f\x30\xf5\x14\xb8\x66\xb7\x94\x2b\xc1\x73\xf7\x21\x1a\x6c\x01\x4d\xa1\x4e\x74\x13\x27\xa5\x68\x62\x3d\x14\xb8\xf8\x35\xef\x1d\x5d\x62\xb2\x52\x3c\xfe\x6a\x85\xbc\x69\xfa\x05\x20\x0d\xea\xc1\x56\x8b\x94\x6a\x81\x6b\x75\xc5\xd7\x60\x31\x74\xfd\x4e\x2f\x91\x01\xa7\x90\x63\x79\x1b\xc3\xd5\x92\x97\xcd\xc1\x0b\xda\xa6\x63\xab\xf3\xc1\xbe\x2f\xda\x17\xe4\xe5\xce\x39\x4e\x90\xbd\x76\xb1\xf9\xe0\x40\x5f\x56\x75\xb9\x9d\x63\x8a\xbc\x2c\x1b\x2d\x8b\x53\xa6\xfd\x3d\xc8\x37\x58\x55\xec\x54\xcc\xbd\xa2\x4e\x67\x25\x27\x72\x3b\x07\xbb\x59\x9d\xb5\x4e\x38\x79\x33\x91\xcf\x09\xef\x3b\x1f\xd7\x61\x49\x90\x06\x5b\xbd\x4a\x19\xe8\xd3\xd1\x04\x82\x53\xba\x4c\x97\x1c\x2f\x98\xd2\xb3\x59\xdf\x50\x90\x87\x32\x3a\xa6\x90\x50\x29\xf5\xcc\x5e\x1a\x0a\xaf\x2f\x7c\x01\x08\xdd\xb1\xa4\x0f\x56\x2b\xe6\x4e\x57\xe6\x95\xed\x21\xdc\x7d\xb1\x7d\x53\x36\x77\xef\x12\xfc\xbb\xe2\x9f\x3b\x23\x7b\xb6\x34\x4b\x11\x09\xb3\x2a\x94\x62\xab\xc3\xad\x3c\x07\x10\xb0\x4f\x38\xc6\xf5\x95\x2d\xb2\x75\xe7\x7e\x2f\x37\xe9\x5d\x55\x09\x6b\xba\xf3\xe3\x05\xd5\xd7\x43\xd3\x65\x95\xbf\x05\x67\x89\x2c\x21\x0a\xc7\xba\xe7\x37\x1d\x16\x45\x84\x78\x5d\xd8\x90\x17\x41\x59\xb3\x93\x0a\x9a\x6c\xe3\xa1\x66\xdd\xa2\x38\x3e\x6e\x2a\xf2\x8c\x1b\xf3\x19\x24\x47\xe9\x05\x11\xdc\xd8\x0e\xbd\xf9\xee\x2c\x9b\xde\xdd\xee\xb6\x10\x55\x86\x41\x53\x2d\x07\xcd\x13\xda\x61\x25\x41\x54\xcc\x0f\xd9\xd4\x81\xe3\xb0\xa2\x37\xaf\x2e\xc2\x62\x56\xd4\xab\x21\x9f\xaf\x15\xad\x2b\x7e\x8e\x57\xab\x72\x6f\xf2\x72\x32\x16\xa5\x74\x58\x5e\x2a\x63\x9d\x94\x8c\x2c\x4f\x69\xee\xaa\xd2\x83\xe3\xa4\x4f\xf2\x68\xea\xef\xd7\xe6\x6b\x73\xed\xe4\x73\xa8\x39\x7c\x76\xb4\x8d\x56\xcb\x3c\xcd\xab\xc9\x1a\x89\x29\xcf\x42\x99\x83\x50\xe0"}, +{{0x76,0x2f,0x06,0xca,0x01,0xe3,0x14,0x71,0x5f,0x92,0xc9,0x0b,0xbe,0x72,0xa2,0x5b,0xf2,0x62,0x12,0xc8,0x1e,0xb1,0xd1,0xa0,0xda,0xe2,0xc3,0x11,0x30,0xf7,0xcd,0xbb,},{0xf9,0x62,0x6f,0xfd,0x69,0x27,0x31,0x92,0x5e,0x5a,0xac,0xfa,0x1b,0xde,0xd0,0x1a,0xa8,0xf7,0x30,0xb7,0x72,0xd5,0xe4,0x6a,0xdb,0xc3,0x15,0x56,0x5b,0x9b,0xf2,0xc9,},{0xe8,0x42,0xb4,0x9e,0x53,0x3d,0xbc,0x92,0x99,0x8d,0xc0,0x78,0xe5,0x97,0x93,0xa2,0xc2,0xfa,0x63,0x6b,0xdf,0xaf,0xdb,0x48,0x93,0x4c,0x93,0xcf,0x34,0x79,0x71,0x02,0x93,0x8d,0x13,0x7a,0xb7,0xea,0xd1,0xa0,0xf7,0x0e,0x94,0xa6,0x7d,0x57,0xef,0x6a,0x02,0xc9,0xec,0x77,0xd7,0x1f,0x70,0xcc,0x57,0xf1,0x53,0x3b,0xec,0x87,0x73,0x0e,},"\x94\x97\x48\x3a\x4f\xba\x78\x43\x3b\x38\xe9\xde\xb8\x91\x5c\x75\x0b\x6d\xa0\xf7\x8a\xf4\xa6\x8b\x62\xf9\xfc\x03\x91\xe3\x38\x87\x3b\x1d\x64\xb1\xb7\xf0\x9f\x12\xf0\x56\xa3\xc9\x16\x53\x49\x8a\xd5\x6e\x06\x9b\x8b\x16\x08\x87\xe8\xe3\x78\xa7\x6d\x8b\x3c\x66\x70\x83\xc0\xa2\xb2\xd2\x31\x7d\x3b\x87\x48\x57\xe5\x78\x62\xef\x0c\xb7\x04\x36\xa9\x02\x8f\x01\x91\xcc\xc6\x16\xe9\xd7\xc9\xbd\x86\x98\x08\xcf\x09\x48\x35\xff\x51\x86\x77\xb3\xfb\x08\x9f\x4c\x9d\x07\x7c\xc7\x74\x24\x05\xb4\x86\x3a\xc7\xa5\x96\x45\xc9\xcf\x54\x0d\x57\x39\x9d\xa6\xae\x9d\x07\xfd\x19\xfc\xa9\x5b\xc8\xa8\x6d\x8b\x8e\x24\xe4\x87\x33\xf3\x21\x58\xfd\x19\xa8\xa1\x11\x1d\x1d\xa1\xf9\xb5\x80\xa3\x9c\x10\x48\x46\x16\xcf\x2b\xc0\xec\x29\xf6\x3f\x77\xc8\x53\x56\x15\x8e\x16\xda\x59\x4b\x5a\x89\x0e\x55\xd0\xb6\x45\x99\xb3\x02\x93\xe9\x00\xed\x92\xad\x26\x19\x69\xe7\xdf\x4c\x4b\x1d\x0b\x60\x24\xbd\xce\xb6\x90\x67\xef\x48\x6c\x20\xfd\xcd\x22\xa1\x0d\x5d\xa4\x5f\xbf\x90\x5b\xa1\xe9\x35\xc9\x6f\x50\xaf\xb6\x35\x71\xbc\xff\x31\x30\x68\x4e\xda\x0b\x56\xe6\x0b\x26\xcf\x4c\x0e\xf9\x93\x8a\x92\x76\x8f\xc8\x63\x1f\xe3\x08\x23\x6b\x01\x2f\x92\xaf\x24\xa8\xf6\xe6\xec\xbe\x76\x62\x9b\xba\xf8\xff\xe5\x4c\xdb\xe8\x67\x1d\xe2\xba\x62\x4a\x7c\x0f\x61\x93\xbb\xa4\x11\x04\x12\x90\x2b\xac\x29\x90\x92\x2a\x9e\x5a\x81\x05\x3c\xf8\x76\xa4\xc8\x05\xa0\x4c\x56\xa8\x13\x9d\x34\x19\xe4\x54\xa6\x22\xd0\x34\x2b\xf4\x26\xe9\x80\x2c\x3d\xc1\xb4\x08\x0c\x75\x49\x2a\xfe\x9d\x7b\x15\x45\xfe\x08\x6d\x96\x35\x41\x32\x4f\xf5\x2a\x48\xc6\xbf\xae\xa2\x66\x68\xb3\xe0\x1e\x52\x36\xfd\x45\xfe\x54\x59\x45\x35\xc0\xb2\x3e\x28\x7e\xbd\x14\x28\xc8\xbe\x0a\xd1\x41\x60\x0e\x91\xcb\x51\xe1\xea\x66\x27\x1a\x64\x21\xfb\x68\x9e\x88\xa0\x79\x0a\x65\x1d\xbd\x21\xee\x20\x89\xb2\x74\x66\x6f\x66\x0c\xa0\x9c\xe2\xd6\x0e\x39\xe2\xee\x5f\x03\xb6\xeb\x82\xd1\x99\x76\x96\x6e\x79\x90\x0a\x81\x0f\x6d\x5b\x5c\x1a\x54\x8e\x50\x64\xf5\xc3\xd8\xa9\xf2\xde\xf0\x17\x9d\xf9\x9d\x14\x3f\xde\x69\xb0\x71\x2c\x09\x1c\x29\xe9\xb2\x5f\x40\xca\xfd\x57\xa0\x24\x65\x8d\x77\x74\x03\x76\x10\x34\x2f\x38\x00\xfd\x51\xf4\x9e\x79\xa5\xb3\xde\xcc\x11\x2f\x58\xd0\x3e\x3d\x29\x58\x75\x85\x88\xbc\x4b\x1c\x6a\x6c\xda\x7b\xc5\xf5\xbe\x18\x3e\x41\x51\x3c\x1f\x23\x0f\x3c\xc3\x64\x30\x4b\xf8\x24\x84\xb7\xcf\x19\xa0\x02\xe1\x50\xf9\x8c\x5e\x97\xc6\x16\x6e\xa1\x5b\x86\x34\x0b\x8c\x5e\xbe\x5c\x1a\x18\x3e\x55\x88\xe6\x6f\x55\x90\x50\x86\x31\x3f\x37\xa4\x09\xe8\x9b\x47\xdb\x31\xae\x97\x45\x3e\xdf\x69\xfe\xd7\xbe\x08\x11\x30\x71\xf3\x74\xb2\x6e\xc6\x04\x3f\x2a\x0e\x9c\xf8\xba\xd8\x02\xab\xad\x69\xe6\x17\xe7\x62\x43\xb3\xcc\x03\x4b\x09\x9d\x87\x29\xee\x40\x7a\x53\xeb\x03\xbd\xc6\x41\x0a\x03\x95\x04\xb3\xb1\x2c\x81\x9b\x64\x54\x5d\x40\x5c\x6a\x4f\x08\x49\x21\x93\x5b\xdf\xf4\x13\x0a\xe6\x29\xd9\x09\x62\x6b\x06\x26\x76\xe5\x38\xea\xfd\xff\xb1\xd6\x22\x9c\x08\x89\xd3\xcd\xdd\x33\x65\xdc\x3d\x65\x36\xf7\x24\x8c\x49\x31\x7c\xb5\x0c\x56\xfb\x57\x85\x55\x41\xd6\xfe\xeb\xac\x81\x6c\x99\x28\xfa\x66\x2d\x0a\xe8\x0a\x0f\x39\xe5\x70\xbb\x7d\x22\x41\x6f\x98\xf3\x71\xb6\x42\x47\x96\x89\x51\xa8\xa2\x46\xf7\x4b\x30\x61\x74\x3c\x9a\xf7\x68\x4b\xbb\x96\x6a\xe0\xbd\x78\xa8\x10\x49\x3e\xa4\xcc\xd7\x11\x74\x87\x1c\x82\xbb\x65\x2b\x27\x48\xe5\xbc\xcb\x0a\xb6\x38\x8a\x50\xf0\x53\xa0\x48\x08\x7f\xd9\x7e\xb1\x5c\x1a\x21\xb1\xee\x18\x25\xe5\x4a\xa1\x30\xd6\x63\x18\xaa\xf6\x61\xbb\xb2\x47\x63\x57\x7e\xb3\x7d\x31\x0e\x21\x9b\x0a\x9b\xba\x03\x75\xeb\x9c\x9b\x4a\xf8\xc4\xb9\x9a\x36\x99\xe0\xd3\x26\x67\x33\xb6\xe4\xe9\xc5\x34\x49\x0a\x13\x41\xcb\x19\x90\xca\x5b\x1c\x84\x7b\xc8\x12\x60\x26\xfe\xa9\x03\xa1\xf5\x49\xd6\x5a\xf8\xfe\x02\xa9\x16\x3f\xf8\xea\x28\x1e\x72\x26\x24\x3e\x2a\x15\x3b\x92\x18\x51\xde\x10\xf7"}, +{{0xc5,0xcc,0x0b,0x95,0x81,0x8c,0x4b,0xf3,0x8d,0xa1,0xd6,0x5f,0x02,0x16,0x27,0xe9,0xe5,0x7d,0x26,0x2b,0x02,0xec,0x6d,0x91,0x7a,0x7d,0x46,0xb1,0x1c,0x7f,0xe4,0x8a,},{0x45,0x7d,0xa4,0xef,0x14,0x51,0x9d,0x54,0x1e,0xdf,0x92,0xca,0xbe,0xd9,0xb0,0x4d,0x8a,0x2f,0x2a,0xfd,0x15,0x10,0xa9,0x2f,0x00,0x9b,0xb4,0xe8,0x75,0x4f,0x1e,0xba,},{0x3b,0xa0,0xaf,0x8a,0xf1,0x27,0xc4,0x58,0x48,0x26,0x09,0x0e,0xcd,0xaf,0x48,0x5e,0xbd,0xf0,0x7b,0x82,0xbc,0x49,0x9c,0x9a,0x2b,0xef,0xca,0x28,0xd4,0x93,0x44,0x97,0x4a,0xdd,0xbc,0x8d,0x80,0xa5,0x25,0x60,0xe0,0xf3,0xd7,0x3f,0xf5,0xcc,0xcc,0x72,0xc7,0x4b,0x5b,0x47,0xad,0x2e,0x6d,0xe9,0x61,0x2d,0x1a,0x00,0xae,0xc9,0x27,0x01,},"\xd6\x60\x8b\xf5\xac\x00\x0e\xca\xf9\x5f\xc0\x9f\x9c\xb7\x49\x8c\x51\x8a\x6e\x02\x55\x58\x6e\x63\x37\x85\x3b\x1d\x7d\x9d\x7d\xe4\xdf\xe1\x24\x5d\x59\x03\x1a\x31\x7d\x4e\x2b\x6a\x73\xc4\xc3\xf9\x5b\x58\x2e\x72\xa6\x42\x02\x21\x58\x7b\xac\x12\x0f\xb8\xed\x73\x48\x07\x0f\x28\x60\xd8\x58\x66\xa0\x9f\xe7\x56\x74\x34\x97\xf2\x11\x9b\xc1\xbf\xdf\x57\x3b\xe3\x5d\x10\x91\xbe\x37\xf1\x8b\xcd\xa6\x74\x1c\x90\xd5\x66\xcc\x92\x4b\x72\x16\x4b\x74\x9a\xf9\xa6\xf4\x0f\x71\xd3\xea\x5d\x87\x64\xcd\xc8\x17\x14\xbd\x73\x95\xe5\xf6\x79\x97\x36\x36\xef\xf1\xdb\x1c\xf0\x01\x29\x83\xf7\x1a\x2f\x2b\x12\xd4\x5a\x29\x4e\x5a\x38\x9f\x4c\xd2\x48\x3e\xb3\x9d\xa0\xdf\x26\xb7\x36\xc7\xaf\x6e\x41\xdd\x35\xa7\x8e\x45\x29\x2c\x39\x4e\x34\x68\x95\x32\x88\x87\x21\xf8\x63\xc5\x6d\xb9\x7d\xa1\xcd\x10\xa6\x6a\x20\xa6\x70\xb2\x7f\xe8\xce\x55\x68\xa4\x2b\x89\x37\x79\x0c\x7b\xe1\xaa\x42\x0d\x20\x3d\x7a\x88\x5c\x17\x29\xcd\x6b\x8e\x19\x71\x89\xe4\x79\xd5\x42\xcb\xcb\x9b\x53\x65\x6f\x2b\x9f\x53\x9c\x32\x5c\x34\xaa\x59\x8f\xd9\x1e\x7d\xf7\x0f\x9a\x74\xab\xec\x46\x76\x54\xb1\xc9\xa3\xd1\x44\x38\xe7\xc0\x83\x60\x40\xb7\x93\x87\x1e\xcb\xe9\xe5\xf6\x68\x0c\xcc\xcd\x5d\x46\x96\xa8\x7e\x37\xe8\x9e\xab\x28\xb6\xbd\x67\x9e\x8f\xe1\x62\x7b\xdc\x9d\x37\x3b\x82\xf5\x2c\xd8\xc4\x9b\xe9\xba\xcd\xc6\x30\xa3\x2f\xd1\x28\x35\x25\x5a\x54\x2f\xb7\xb1\x23\x93\x77\x9d\x44\x98\xaa\x06\xa0\xe7\xe1\xa4\x97\x79\x39\x81\x7e\xb2\x08\x8a\xf1\xe1\x9b\xb0\xe5\xac\xa8\x54\xc1\x25\xdc\x60\x3d\x83\x57\x36\xa0\x3d\x93\x80\x51\x53\x0c\x9a\xb1\xaa\x3b\xc7\x79\xb3\xba\xe7\x45\x0e\xf5\x7d\x1b\x3f\xc0\x93\xa3\x7d\xbe\x9d\x1b\xd6\xd0\x40\xf2\xf8\xee\xba\x77\xf7\xfa\x88\xc1\x49\xf0\x65\xc7\xac\xe3\x32\x77\xaa\x99\x69\xc2\x66\xea\x6d\x85\xca\xd6\x2c\xfa\xf5\x50\x8e\x70\x32\x71\x6b\xe6\x84\xa2\x28\x56\x41\x3e\x0e\x65\xe4\x2b\x6e\x9e\x6d\x86\x5a\x87\x36\x3c\xbb\x62\xd5\xbb\xb6\xa3\x73\x1d\xdd\xa0\xfa\x6a\xd0\x29\x3a\xf9\x89\x3c\x09\xa9\xe7\x43\x09\x0f\x2c\xee\x2f\x44\x37\x73\x6d\xd4\x33\xe2\xac\x74\x28\xbd\xc8\xc7\x7c\xb9\x96\x43\x55\xfa\x44\x15\xcc\x38\x31\xd8\xc7\xca\x5a\xf9\x3d\x51\x75\x2e\x71\x8c\x60\x66\xec\xa1\x42\x6a\x87\xc2\x98\x08\x28\x1a\x85\xac\x7e\x0b\x40\x44\xff\x6e\x28\x0e\x28\x01\x4b\x93\x83\xd1\x9c\x9d\x38\x7d\x29\xdc\x14\xde\x43\x3d\xa2\x60\x78\x4a\x49\x44\xca\x76\xc2\xfe\x8a\x08\x0d\x09\x96\xd9\xa6\xc2\xa3\xd3\xa7\x07\x72\x80\xed\xce\xe0\x38\x9a\xa8\xe5\x36\x5d\x1d\x9b\x34\x6e\xca\x09\x47\xb0\xff\x52\x65\x94\x3c\xcf\x09\x93\x9a\x4b\x4a\x8f\x98\x5f\x6a\x5e\x72\x72\x3c\x79\x5d\xa0\xbc\x36\x0d\xce\x50\x1f\x67\x3a\xb6\xea\x84\x43\xf1\x29\x42\x79\x52\x45\x3e\xb7\x2b\x3a\x8d\x0d\x97\x6c\x27\x8c\x5b\xd1\xa9\x85\x3c\x91\x8e\x0c\x24\x0c\x3c\x73\x49\x32\x95\x3f\xdb\x50\x39\xfb\xb0\x46\x87\x93\x7c\x9f\xf0\xab\x74\xa1\x6e\xae\x21\x2b\xc6\xf2\x0e\x70\x0a\x77\xc0\x92\xd2\x3d\x2e\xfb\x58\x0e\x0c\x19\xd6\x5f\x30\x41\x29\xab\x8e\x6c\xc1\x2e\x58\x05\x22\x57\xba\x09\x44\x9f\x30\xd3\xd9\x74\x39\x1a\xff\xf5\x63\x3d\xef\x2f\x5c\x4e\xbd\x57\x3a\x9e\x44\x4b\xf3\xa3\xdd\xac\xed\xf0\x2c\x05\xf3\xcc\x2e\x75\x06\x64\xa8\x4a\x1d\x24\xc5\xd2\x8b\x49\x67\x0d\xe8\xa2\xf2\x09\x08\x39\x48\x3c\xa3\x89\x59\x99\x1a\x7d\x37\x27\xe2\x1a\x15\xe8\x20\x16\xc1\x5a\x09\xee\x71\xf4\xf4\x3c\x0a\x60\x8b\x48\x48\x5c\x99\x34\xa3\x86\x14\x79\x4d\x62\x91\xda\xa3\x9c\x01\xc4\x5d\x3d\xeb\xe5\x79\xb5\x82\x3b\xf3\x40\x64\x04\xb4\xc8\x0e\xe6\xff\x34\x2b\x46\xb3\x34\xb0\xb8\x83\xb4\x0b\xfd\x2f\x9a\x53\x59\x5a\xb6\x2f\xd1\x35\x1e\xbc\x88\x30\x83\x70\x49\x72\x18\xdf\xc9\x8c\xe0\x81\x40\x7d\xa8\x12\xa4\x6d\x64\x97\xd7\xaf\x9e\xc6\xd8\x3e\x1c\x60\xee\xb7\x12\xd8\x89\xdf\xbe\xd0\xc8\x05\xaa\x11\xcf\x81\x7d\xd8\xf0\x43\x96\xef\x87\x1a\x26\x11\x2d\xcb\x7c\x0e\x1d\x2e\x68"}, +{{0x61,0xfa,0x86,0x77,0xee,0xda,0xde,0xd6,0x9b,0x16,0x5c,0x8d,0x27,0x7c,0x97,0x82,0x49,0x66,0x30,0x28,0x30,0x1d,0xf6,0x16,0x3e,0x39,0xb0,0x6a,0xc2,0xf5,0x62,0x5f,},{0x87,0x33,0x9e,0xb5,0x72,0x38,0xdb,0x2e,0x4e,0x60,0xf3,0xc2,0x8a,0x3f,0xd5,0xfb,0x61,0x1c,0x65,0xfd,0xdc,0x81,0xee,0xd7,0xcf,0x77,0x71,0xdf,0x34,0xd9,0x22,0x67,},{0xc0,0x4e,0xbd,0x11,0xc3,0xeb,0x09,0x39,0x6f,0xe8,0xd6,0x82,0x79,0x51,0x0a,0x9e,0xfe,0xe3,0x91,0xab,0xee,0x40,0x81,0xf0,0xd2,0x75,0x67,0x4a,0x30,0x47,0x94,0x83,0x5a,0xad,0x7f,0x3e,0x34,0x5b,0xcf,0x0a,0xf8,0x02,0x7f,0x97,0x47,0x7e,0x79,0xe6,0x79,0x2b,0x8f,0x29,0x98,0x46,0xae,0x28,0xcb,0x13,0xbd,0x88,0x75,0x37,0x99,0x0d,},"\x02\xc5\x81\xde\xe0\x3f\x2c\x60\x39\x35\xaf\x5e\xce\xec\xfa\x67\x71\x34\xa3\xe0\xae\xa5\x4f\xec\xaf\x42\x71\xfb\x52\x95\x1a\x27\xb7\x68\x77\xcc\xd4\x9a\xb4\x86\xdf\xc2\x27\xcf\x31\xc9\xd9\x57\xcc\x97\x30\x65\x73\xfc\x7f\xe1\xd3\x1b\x6c\x7d\xf3\xd7\x80\xf3\xa0\x5c\xa6\x39\x56\x57\xa9\x42\x43\x42\xc9\xc6\xb7\x03\x12\x7e\x03\x8d\xf0\x79\x21\x54\xe3\x0a\x49\x47\x61\x12\xcb\x92\xd0\xd5\xa2\xd2\x2e\x89\x57\x52\xa8\x6e\xdd\xdd\x91\x2f\xdc\x81\xb1\xe6\x4a\x7b\xb7\x50\xf0\x99\x18\x21\x32\xee\x48\x23\xfd\xe8\x45\x80\x2a\x94\x45\x39\xd4\x12\xb2\xa8\x1a\x15\xb0\x00\x71\xa9\x50\x50\x4c\x5b\x55\xa7\x1b\xdb\x8c\x5a\x58\x26\x39\xe8\x55\xe8\xbe\x24\x1c\xda\x1b\xa6\xb3\xb4\xf6\x45\x54\xd1\x78\x24\x90\x4c\xb3\x0c\xd7\xef\xd9\xac\x04\x9e\x39\x0b\xb7\x9f\x53\x59\x8e\xf1\xe8\xfc\x27\xdd\x7b\xf5\x99\xc9\x02\x8c\x9e\xbf\x92\xfc\x3b\xe1\x1d\xf3\x29\x61\x2a\x22\x8e\x0f\x56\x84\x68\x7b\xf4\x1f\xf2\x03\xe9\x7a\x76\x86\x12\x6a\x39\x36\x6b\xdc\x26\xd5\x0b\xe0\x25\xd5\x18\x7c\x6b\xa0\x66\x6e\x37\x9b\xe4\xa8\x0a\x9e\x62\xef\xfc\xd9\x16\xd7\xf9\x8d\xe6\x51\xe0\x0b\x97\xad\xf5\xd2\xd5\x3d\xaa\x7f\x8d\x69\x5a\x29\x15\x60\x75\x5c\x74\x44\x82\x36\x4c\x4f\x1f\xa4\x7e\xc0\xb1\xda\x16\x1a\xa3\x88\xf9\x59\x79\x89\xa9\x77\x26\xd3\xed\x2c\xec\x82\xf1\xa1\xbb\xc4\xac\x0b\xe0\xa0\x0c\xb4\xa8\xdb\x1f\xb7\xc1\x4b\xa0\x5d\x89\x63\x48\xdc\x05\x59\xd2\xa9\x0b\xea\xc2\x04\x1d\xd7\x7f\x82\xd6\xb1\x2a\xeb\x22\x43\xca\x0f\x41\x9a\x57\xd3\xca\x9c\x7d\x25\xa3\x0f\xf0\xe8\xbb\x0d\x94\x51\x55\xd1\xb3\x6a\xd1\x07\xb5\x5b\xea\xa9\x5b\x7d\x5e\x32\x00\x34\x07\x62\x9f\x15\x15\xf8\xa7\x08\x9e\x24\x88\xd0\xd7\x54\x4c\x2f\x7c\xc7\xc7\xf0\x98\x5d\xa4\x28\x40\xd4\x36\x8f\xf4\xf0\xfa\x4f\xa2\x98\xe3\xb7\x22\x93\x03\xab\xa5\x14\xae\x94\xe7\x02\x65\x35\xa3\xf4\x26\xff\xbb\x4e\x00\x1c\xd5\x0e\xd1\x2f\x21\x4b\x3a\xbe\xf9\x6e\x30\x16\x35\xc9\x87\xb1\x33\xfc\x5e\x61\x84\xe7\xb7\x57\x2b\xc3\xd9\x9a\x45\x23\xcb\xd5\xaf\xe5\x93\xce\xdf\x4c\x9c\xd0\x2f\xf2\xe3\x62\x37\xe4\xee\x12\xef\x1a\x22\xd1\x6d\x7c\xf4\xc0\x72\xdc\xed\x91\xcd\xd2\x6e\xe1\x44\xcc\x2b\xef\x49\x50\x02\x63\x49\xe9\x44\x47\x84\x08\x1f\xe4\xe0\x49\x8b\xc7\x5f\x72\xe6\x81\x8f\x45\x9b\xba\x90\x49\xc5\x61\x31\x6c\x9f\x49\x8e\x7b\x1a\x99\x4b\x0e\x93\x05\x5f\xe7\x3e\x44\x4c\xbd\xf9\x6a\xc3\x5e\x9c\x4e\x92\xe6\xb4\x9e\x3b\xc0\xe9\x9d\xe1\x71\x6d\xf8\xea\xca\xeb\x8d\x2f\xd7\x48\x70\x04\x4c\xb3\x9c\x0e\x36\x7a\x1f\xe3\x2a\x9b\xb2\x97\x44\x16\x36\x4e\x73\x0d\x52\x48\xdf\xb1\xdf\x16\x4a\x8d\x58\xca\xa1\x00\x5f\xdc\x91\xba\xc2\xbc\x01\xcc\x77\xde\xcc\x14\x89\x3e\xf9\x46\xfb\x3c\x81\xbe\x08\x32\xc7\x2f\xba\x37\x20\x62\xf8\x36\x0f\x4d\x8e\x6d\x5b\x74\x1c\xf7\x03\x2d\x8d\x89\xde\x2e\xdf\x4c\x71\x4a\x29\xf7\x5a\xbd\x8f\x5f\xf4\x3e\xcd\xd4\xb7\xa0\x4d\x7d\xb0\x88\x2d\x16\xe7\x44\x73\xa0\xfb\x79\xdb\x44\x4a\x78\xea\x44\xaa\x26\x31\xb8\xc0\xd7\xb0\x30\x0d\x55\xcb\x6a\xc4\x85\xf2\x4c\x0a\xcc\x64\x77\x47\xc4\x3d\xb3\xb2\xa8\x67\x7b\xaf\x65\x6f\xa7\x35\xa5\x75\xf1\x81\x3f\x36\x68\xa2\xac\xa9\x17\x57\x11\xb5\x25\xeb\x49\x6e\x9e\xf9\x71\x1d\x75\xf5\x90\xc7\xd9\xef\x99\xe0\xf5\x9e\x84\x83\xcb\xf9\xf2\x84\xe3\xf5\xa3\x3e\xe7\x78\x1e\x62\xb8\xb0\x55\x51\x77\x7e\xfe\x0f\xbf\xd1\x9e\x54\xb6\xbb\xd1\x42\x94\x4b\xc2\x95\x9a\x82\xeb\xd2\x95\xd2\x3d\x34\x43\xb6\xce\x65\x8c\x2d\x57\x9a\x76\x37\xb5\x49\x52\x04\x91\x90\x8e\x34\x28\x2e\xc2\x71\x69\x72\xe6\xf0\x35\x39\x29\x54\x7e\xf1\x53\x7a\xec\xc9\x6b\x2d\xf6\x16\x14\x85\x99\xb0\x9d\x9b\x81\x39\x4a\x13\xfe\x7d\xb8\x67\x60\xb1\xe2\xa0\x60\xef\xd4\x84\xe8\x18\x99\x39\xeb\xdf\x6f\x21\x64\x0d\x89\xd8\xe7\x36\xde\xe0\x82\xad\x72\xa0\x18\x4a\xde\xdd\x8d\xf2\x14\x74\xc9\xf5\x26\xbc\xfd\xf7\xe8\x56\x58\x19\x4b\xb6\xd9\x42\xe7\xf3\xfe\x96\xc2\x3f"}, +{{0x70,0x48,0xc6,0x52,0x1a,0xef,0xaf,0xa4,0xea,0xc6,0xd6,0xc3,0xa7,0x02,0xb9,0x52,0x54,0x80,0xa6,0x64,0x82,0xe4,0x96,0x98,0x96,0x75,0x7f,0x2c,0xd1,0xac,0x7d,0x5b,},{0xed,0x93,0x11,0x3c,0x16,0x43,0xa5,0x3a,0xa0,0x64,0xca,0xa6,0x31,0xce,0xb6,0xe2,0x0f,0x6d,0x6e,0xc2,0xfc,0x6c,0x07,0x11,0xcb,0x8a,0x1f,0xe7,0x31,0x39,0xaf,0x93,},{0x7c,0x45,0x70,0x3e,0xd3,0x94,0x2e,0x44,0x04,0x1c,0x7f,0xa1,0x85,0x8a,0xa5,0xf1,0xdc,0x38,0x1f,0x49,0x3a,0x45,0x2d,0xfb,0x52,0x70,0x80,0x17,0x89,0x8f,0x71,0x0e,0x31,0x11,0x8e,0x33,0x1f,0x00,0xaa,0x64,0xcb,0x73,0x88,0x36,0x68,0x2b,0x7d,0x17,0x7e,0x97,0x95,0x5c,0x00,0x31,0x9a,0xbd,0x79,0xa4,0x9e,0x0f,0xcd,0x16,0xfe,0x00,},"\x53\xf7\x4c\x72\x4d\xb1\x57\x8a\x1a\x29\x6a\x7c\xca\xc9\x04\xa2\x50\x4d\xd9\x00\x53\x89\xb4\xf8\xd4\xea\x4b\x63\x07\x29\x8f\xc6\xdc\xce\x98\xa6\xbc\x07\x28\x0d\x20\x36\x4e\x40\x5a\x46\x7e\x73\x65\x78\x96\x52\x69\xc8\x14\x61\xd6\x1f\xc6\xb7\xe4\xba\xd6\x8d\x2b\x6d\xd0\x00\x58\x50\x10\x5f\x0a\x67\xbb\xc6\xee\x22\x3e\xc1\x75\x4a\xf4\xe3\xb9\xaf\xa5\x06\x2d\x1c\x18\x61\x04\x8f\x18\x5b\x12\x8f\x1a\x5c\x0f\xb2\x5c\x39\x19\xb4\x83\x3e\x29\xe2\x02\xbc\x94\x1a\x90\x5e\x63\xc2\xc0\x5b\x10\x14\x64\x7b\xd7\xed\xe5\xbe\x9f\x99\x66\x15\x18\x7a\x3d\x3b\xb2\xc7\xdc\x4c\x28\xf7\x05\x3d\xef\x9b\x28\xb2\x9e\x23\x31\xf1\x62\x96\xdc\xe8\xf1\xed\xe4\x84\xca\xec\x99\x67\x02\xbd\x99\x02\xe5\x26\x84\xc8\x12\xc8\x74\x40\xf6\x9b\xd1\x41\xc7\xe0\x0c\x69\x47\xd1\xfc\x7c\x3b\xdc\x0b\xc5\x50\x6b\x6e\xa4\x62\xe6\x5f\x9e\x74\x3b\x72\xc0\x07\xdd\xc7\xa3\x77\x49\x37\x77\xd4\xeb\x12\x62\x0c\xa6\xc0\x19\xc8\xbf\xc4\xc2\x9e\xc8\xaf\x38\x2f\xc3\xea\xc8\x41\x02\x1a\x74\xe4\x67\x4b\xa3\xe4\x3e\x5d\x7b\x41\xe3\xfe\xeb\x17\xda\x00\xa7\xce\x45\x5a\x1c\xec\x70\xb0\xbe\x6e\x56\xf8\x5f\xc3\x7f\x64\xcf\x07\x33\xb7\xe3\x12\x41\xde\x64\x1a\x8a\x8e\x5b\x91\x89\x7b\xc1\x58\xfe\x93\xd1\x02\xc0\x1d\x1f\x5e\x16\x6d\x40\x81\x65\xfe\x3f\xcb\x13\xd5\x30\x45\x90\xab\x8e\xf0\xdc\x8d\x5a\x8c\x1d\x8a\x93\xfc\xeb\x85\x4f\xc1\xfa\x36\xd0\xcc\x48\x0c\xf8\x51\x2d\x80\xbe\xe6\x9b\x06\x50\xa9\x57\xda\xed\x28\x3c\xd7\x63\x81\x55\xed\x77\x30\x86\xe8\x6a\x8f\xfb\x19\x8a\xcc\x74\x23\xb5\xd1\xa6\x09\xa1\x75\xa5\x6b\x94\xc9\x6b\x73\x18\x51\xb9\x3a\x94\x97\x71\x01\xe2\x55\xf1\xce\x92\xe2\x32\xa0\x5e\x2e\x33\x87\xfc\xb4\xdc\x13\xa3\x1b\xee\x6e\xe2\x55\x07\x32\x2c\x73\xc9\x88\x30\x80\xa7\x4c\x00\xf8\x03\xa9\x98\xdd\x53\x0a\x79\x12\x6b\xb1\x44\xed\x55\x74\xc4\xb2\x31\x80\xe3\x4e\x09\x92\x83\xb4\xbb\x1d\x28\x82\x2f\xce\x37\x17\x04\x6f\xf3\x2e\xf9\xe2\xcd\xf9\x67\xe3\x18\xea\x72\x6a\x2a\xee\xc5\x78\x06\x64\x3a\xd4\x80\x1d\x3e\x0d\xa5\x2a\x1d\x77\xbf\x04\x3f\x5a\xe9\xf3\xae\xa9\xe4\xbc\x4f\xa7\x95\xd0\x84\x01\x08\x5c\xa9\x4c\xfc\x4c\xe7\x19\xda\xbc\x7b\x23\x90\xd0\x3d\x29\x4a\x65\xb7\xaf\x9b\xc3\x90\x72\x28\x5b\x77\x7b\x2f\x13\x3d\xc1\x1a\x70\xc0\xa9\xf0\x60\xe1\x04\x41\xf4\x02\x16\xac\xb6\x41\x63\x7a\x2e\xad\xf1\xf7\xb8\xd2\x62\xfe\xc1\xb4\xd0\xf0\xf4\xfa\xa9\x3f\x3f\x73\x2c\xac\x38\x2d\x8a\xc4\x2e\x17\x8e\x22\x44\x99\x9d\x76\x4a\x9d\x0e\x98\x17\x14\x68\x6e\xb4\x92\x44\x97\xe5\x6b\x50\x15\x7e\x99\x39\x03\x2c\x9f\x88\xeb\x65\x7c\xfd\xe4\x4a\xd3\x47\x14\xaf\x4a\x51\x32\x4e\x5e\x77\xd0\xde\xea\x99\xc9\xf2\x44\xd2\xe0\x9e\xa4\x25\x82\x0a\x74\x6d\x88\x3a\x0c\xf4\xb7\x05\xc2\x9d\xf8\xc0\x37\x44\x81\x54\xdc\x08\xa4\xd4\x33\x74\x05\xfb\x87\x65\x82\x31\x14\x37\x0b\x37\xed\x86\x08\x6e\xc5\xf8\xbd\x6c\x72\xab\xf1\x3f\x51\x84\x30\x71\x0f\x59\x7b\x06\x10\x8f\x65\xb3\x0a\x48\x34\x96\xe2\xed\x81\xda\xb1\x0f\xee\x94\x7f\xe0\x4b\x54\x85\xf2\xe3\x07\x40\x49\xd2\x22\x84\x26\x66\x51\xad\x10\xdd\x08\x6a\xaa\x5d\x45\x2e\x0d\x1a\x61\x12\x9d\x1e\x77\xc6\x63\xc2\x6d\x08\x89\x62\xb5\x54\x56\x45\xb7\xa1\xa8\x71\x3d\x51\x32\x7a\x7a\x35\x9b\x12\xda\xad\xb8\x5a\x2c\xd4\xb5\x41\x0d\x5c\x20\x26\x7f\xa7\x66\xb8\xc4\x2a\x84\xdc\x42\x66\x45\x88\x87\x9b\x3e\xae\xfd\x4c\xc8\xdc\x69\x3f\x98\xac\x20\x56\x09\xe5\x70\x66\x5b\x01\xea\x46\x55\xe3\x94\x29\xa7\xa7\xe5\x42\xef\xb4\xf7\x89\x0d\xbf\x4e\x34\xc6\xcf\xf0\x7e\x4d\x35\xbd\x3e\xee\xdf\x5b\x46\x28\x0f\x4a\x0d\xa0\xc2\xe7\x3c\x94\xea\x81\xcf\xea\xe7\xf9\xbd\x04\xfe\x2d\x45\x97\x65\x00\xf7\xdc\xac\xb0\xdf\x2a\x5d\xc7\x36\xa8\x23\x67\x1d\xb6\x79\xbe\x66\xcb\x33\xc1\x62\xfd\x2c\x74\xae\x71\xfb\xf4\xd2\xb0\x5a\xf0\x42\xb3\xa9\x77\xf5\xb9\x44\xb9\xfd\xb6\xc3\x44\x24\x42\x1b\xcf\x4f\x62\x23\x76\x84\x28\xfa\x14\x0f\xd4"}, +{{0x3e,0x63,0x73,0xb2,0x65,0xb9,0x67,0x89,0x00,0x7a,0xd2,0xa1,0x0c,0x30,0x9a,0x56,0x76,0x38,0xf2,0x55,0x87,0xd7,0x7e,0x28,0xb0,0x82,0x3a,0x4f,0x17,0x9a,0xe4,0xfe,},{0xa3,0x23,0x4e,0x5d,0x13,0xb0,0x34,0x72,0x16,0x50,0x36,0x40,0x4f,0x6d,0xe8,0x0e,0x70,0x28,0x39,0x50,0x0f,0x13,0xd9,0xc9,0x85,0xa0,0x77,0xd4,0x5c,0x69,0xff,0x45,},{0xf5,0x1e,0x0f,0x87,0x8a,0x5a,0x70,0x96,0x47,0xe8,0x5f,0xea,0x83,0x9f,0xd5,0x66,0xe6,0xf3,0x5c,0x8a,0x61,0x85,0xd0,0xc9,0xeb,0x13,0xe0,0xd5,0xb9,0xe6,0xe8,0xaa,0x95,0xc3,0x33,0xa8,0xf5,0x06,0x32,0xa4,0xd6,0x65,0x7b,0x51,0x8c,0xe4,0xcf,0xde,0x40,0xb8,0xf5,0xa0,0x5b,0x2d,0x9f,0x84,0x41,0xfc,0xc9,0xd2,0xd6,0x92,0xd5,0x09,},"\xb9\xd0\x68\xbb\xca\xe7\x72\x2f\x82\x8b\x0f\x8c\x98\xa7\x38\xe3\x6a\x7d\xf4\xc9\x97\xc7\x24\xba\x27\x53\x1a\xf3\x4a\x2f\x10\x6c\x75\x13\xa4\x4a\x46\x1a\x9a\xa4\x30\x9b\xc1\x5c\x4e\x0d\x42\x75\x91\x93\xea\x1c\xde\xa9\x56\xbb\x81\x59\x85\xf5\x78\x67\x14\x5e\x9e\x2c\x75\x85\xfc\x8d\x61\x02\x7e\x47\xd2\xd7\x35\xe2\x44\x8a\xf3\x78\x29\x09\x40\x4e\xde\xaa\xc0\xfd\x73\xf6\x04\x5d\xcd\xb0\x4f\x03\x77\x75\x8f\x02\x20\x4a\xae\x3a\x72\x20\x31\x1c\x0f\x47\x23\x58\x27\x10\xcc\x44\x0c\x36\xc9\x58\x7b\x5c\x9e\xbc\x40\x63\xfe\xa8\xca\x3f\x43\x19\x58\x94\xf7\x9a\x36\x50\x87\x13\x72\x82\x30\x2d\xbf\x2e\x7a\x0d\x41\x1a\xb5\x8b\x70\x26\xcc\xde\x19\x88\x69\xaa\x73\x43\x34\xc0\x52\x38\xe2\x75\xe3\xc3\xab\x21\x70\x83\x49\x57\x69\xe2\xfa\xd3\x74\x05\x14\x52\xd7\xf5\xb1\xdb\x0e\x78\x58\x36\xd4\xbd\x5e\x29\x78\xa3\xe9\x91\xaf\x0f\xf7\x16\xf4\x38\x89\xa0\x7f\x5d\xf2\x99\x60\x36\x21\xc3\x9e\x2c\xde\xe0\x89\x98\x5d\x9e\x6b\xf7\xb2\xfb\xd0\x23\x73\xae\x1b\x5e\x9b\x88\xf5\xb5\x4a\x07\x6e\x67\x6d\x77\x90\xbf\xc8\xf5\x7d\xcc\x59\xef\x52\x85\x0c\xe9\x92\xa7\x3b\xa7\xbc\x99\x1d\xeb\x4d\xde\x5e\xb0\xb2\x16\x70\xb1\xb3\xd4\xb6\x4f\x36\xcc\xa8\xe3\x07\x09\x85\x68\x49\x7d\x89\x16\xf6\xb5\xd0\xe9\xe8\x9f\x99\xf8\x60\x06\xf3\x9b\xd3\xa8\x10\x76\x9c\x8f\x78\x01\x77\x3c\x96\x38\xab\xcf\x5e\x27\x11\xb1\x9d\x11\x67\x59\x3a\xcb\xe8\x5e\x41\x61\x42\x89\x97\xa2\x19\x4d\xc5\xe7\xb7\x64\x0f\x0d\x2c\x1e\xb2\x05\x55\x3b\xe9\x16\x7f\xfb\xc2\x2b\x7c\x2e\x76\x98\xf3\xaf\xa1\x07\x54\xcb\x44\xd4\xb1\xd4\x5b\x83\x73\x03\xb1\x66\x90\x73\x41\x5a\x22\x60\x6b\x50\xf2\x1f\x82\x65\xe1\x39\xf2\x30\x5a\xc0\xe0\x12\x7a\xe0\x56\xce\x8a\xbe\xab\xa2\x0e\x1d\x26\x9a\x2b\x2e\x89\x9c\x49\x54\x72\x68\xa0\x69\x6a\xe4\x50\xdc\x02\x67\xf7\xf6\x3a\x8e\xdf\x07\x4c\x47\xd3\xc2\xdb\x1d\xa3\x63\x93\x73\x73\x04\xe6\xdd\x4f\xac\xcd\xb6\xab\x55\xe5\xf8\x52\x0c\x3d\xff\x5f\x6b\xea\xc3\x0b\xa8\x5b\x86\x08\x23\x51\xe3\xde\xd8\x40\x0a\xa5\x7f\x65\x0c\x0c\x33\x03\x6d\x65\xb3\x9b\x7d\x2f\xb6\x11\x28\x63\xd5\x9b\x72\x55\x82\x42\xe8\xb0\x45\xad\xdd\x35\x7d\xe6\xfd\x37\xa8\xf6\x61\x17\x65\xc9\xb5\xff\x19\xcc\x4d\xb7\xe1\x17\xc6\x5a\x00\x45\x89\x08\xb0\x24\x5d\x04\xf7\x90\x8f\xc7\x3b\x16\x5d\xff\x6e\x4b\xe4\xb4\x20\x32\xd8\xcf\xd7\xd6\xf7\x77\x2c\x1b\xfe\x72\x1d\x4b\xcf\xe2\xfc\x52\x79\x98\xf3\x4f\xb4\x41\x8a\x1f\xae\x1e\x6c\x37\x67\xc4\xd0\x78\x06\x21\xf9\x23\xda\x1f\x0a\x0d\x3d\x21\x9c\x03\x6a\xcf\xd3\x70\x9d\xad\x4c\xf2\x4d\x90\xbc\x69\x1d\x70\x0e\x6a\x9c\x80\xcc\xfd\x10\xbd\xe8\xe7\x91\xc0\xfe\xa8\x28\x80\xc0\x7b\xaa\xaa\x31\x1e\xef\x79\x24\x07\x84\xf6\x28\xa7\xd2\xa0\x91\x84\xe0\x16\xf8\x10\x08\xe7\x74\x29\xa8\x65\x8b\x15\x3e\x44\xe7\x9a\x98\xad\x24\x8f\x7f\xda\x23\xb5\x90\xd6\x46\xd7\xc1\xd8\x41\xf4\x92\x7d\x6e\x8b\xc7\x32\x14\xd1\x0a\x7f\x3c\x29\xc8\xf8\x39\xa8\x90\x8d\x20\xa7\x4e\x82\x7a\xf4\x67\xac\x5a\xbf\x0f\x1d\x0e\xd3\x9c\xdd\xd9\x69\xdd\xe9\xee\xb4\xa4\xb7\x52\x7a\xb3\xe2\x47\x5a\x19\x5e\x24\x47\x4a\x4e\x36\xb0\x90\x52\xe2\xda\xd4\xa5\xeb\x46\x91\xe2\x63\xb8\xc6\x1b\xbd\xe8\x77\x72\x20\x7e\x01\x1c\x4c\x1e\x14\x23\x5f\xb2\x4e\x4d\xa4\x38\x87\x5d\x18\x53\x0f\xef\x90\x26\x19\xdd\x48\x5d\x77\xb5\x45\xab\xb5\x6b\x69\xc7\x55\xaf\xe7\x58\x60\x69\x71\xab\x97\xdd\x3a\xce\x1c\x1a\x34\xa3\x37\x94\xc8\x15\x6d\xa7\x99\xe8\x22\x4d\x88\x5e\x18\x68\xf9\xcb\x46\x6d\x80\x2c\x82\x7c\xc3\xe1\xec\xd0\xae\x6e\x0b\x01\xf8\xf7\x91\xb1\x22\x08\xfc\xc0\xfe\xd3\x85\xb7\x96\xeb\x2f\x29\x08\xb5\x8d\x30\xb3\x73\x3f\x14\x70\xf2\xe2\xef\x12\xad\x43\xfe\xb7\x2d\x08\x16\xde\x3c\x13\xa8\xb5\xa5\x23\xe1\x4c\xdf\x5f\xf3\x72\x0b\xf8\x77\x69\xcd\xe7\x49\x5d\x22\x6b\xf3\x82\x38\xa8\x25\xf7\x5a\x09\xf6\xbb\x9a\xfc\xe5\x16\xa7\xbc\x70\x11\x43\x70\xbb\xc4\x0f\x17\xc7\xbc"}, +{{0xf5,0xe8,0x59,0x7e,0xac,0x0e,0xbf,0xa9,0xd3,0x85,0xde,0x85,0xa1,0xfb,0xaa,0x35,0x14,0x63,0x95,0xb1,0x34,0x57,0xb5,0xb1,0x4d,0x36,0x70,0xda,0xca,0x69,0x05,0xe7,},{0xce,0x93,0xe6,0x42,0xc2,0xf1,0x50,0x84,0xbc,0x83,0xba,0xfd,0xaa,0x19,0x67,0x63,0xde,0x2a,0x3c,0x51,0x3b,0x0e,0x44,0xf6,0x8d,0xdb,0xde,0x37,0x85,0x14,0xc4,0x41,},{0x57,0x65,0x43,0xfc,0x21,0xab,0x0a,0x7c,0x5f,0x63,0xb1,0xcf,0xf0,0x1b,0xf8,0x45,0xdf,0x91,0x79,0x2e,0x7a,0x97,0x50,0xc5,0x50,0x8b,0x51,0x66,0x5e,0x7f,0x89,0xf1,0x7c,0x6e,0xc3,0x35,0x5a,0x0a,0xed,0x87,0xdb,0x8c,0x77,0xbd,0xb2,0x71,0xfb,0xed,0xc7,0x14,0xff,0xad,0xb7,0x8b,0x5e,0x0f,0x97,0x81,0x16,0x77,0x1b,0xa7,0xcf,0x0b,},"\x27\x33\x41\xf2\x19\xff\x5c\xf3\x81\xc7\x7b\x2d\xd2\x26\xc5\x8f\x8f\x33\xc4\x52\x70\x48\xcb\x00\x6a\xff\xef\x8c\xee\x15\x1e\x30\x0e\xfe\xf6\x29\xfe\xd2\x1b\x70\x45\x1f\x72\x92\x92\x62\x7d\x1f\x3f\x1b\x52\x57\x35\x9e\xe5\xa6\x71\xcf\x62\xae\x57\x32\x49\x40\xf2\xd0\xb1\x5a\xac\x76\xff\x39\x82\x20\xc0\x80\x24\xe2\x9a\x8c\xf3\x65\x04\xe1\x2a\x4e\x96\x43\x8f\x42\xc3\xda\x0c\x00\x05\x41\xbc\x11\xf0\x91\x38\x1b\x0b\x72\xb5\x8a\x92\x08\x3f\x44\x6e\xca\x19\x91\x99\x68\x78\xde\x35\x08\x1c\xc4\xab\x90\x95\x8c\x96\xcf\x5c\x99\x79\x6c\xba\x79\x51\xee\x18\x6f\x26\x52\x7a\xed\xe6\x9d\xb3\x04\xce\x29\x41\xba\x15\xcc\x00\xba\x2f\x14\x11\xf2\x08\xda\xd4\x5e\x87\xbc\xf6\x38\x79\x2d\xe0\xa6\x86\x24\xb6\x67\x29\x7c\x27\xa3\x43\xdb\x4b\xaf\x34\xa0\x22\x8e\xaf\x0d\x10\x22\x00\x9b\x5d\x06\x8b\x25\x34\xd9\x20\x30\x2e\x71\x31\x0f\xeb\xf0\xdf\x1b\xb0\x2c\x2e\xf0\xad\x1a\xe1\x49\xde\xad\xf8\xc1\x84\x37\x3c\x0f\x7e\xb6\xb2\x56\x95\xbe\x82\xd1\x2c\x71\xb6\xc8\x32\x67\xd9\xa2\x33\x66\x7e\x77\xbc\x20\x59\x83\xf8\xb8\xd8\x77\xd8\x5a\xea\xd3\xf6\x0e\x82\x0f\xfc\xb1\x7a\xdd\xdd\x92\xa7\x71\x2b\xbe\xb3\x4e\xe7\x19\x66\xda\xfd\x99\x07\xd1\x93\xdd\x9d\x72\x5a\x31\xa6\x13\xd2\x9e\x32\xbe\x72\x13\x28\x08\x92\x6d\x94\x37\x47\x7f\xee\x25\xed\xa6\x10\xae\xb1\xdc\xe1\x2e\xa3\x16\xc6\xae\xc6\x68\x9e\x50\x1c\x55\x19\x23\x82\x5a\x34\xb4\x2c\x4f\x06\x75\xb8\x6a\xb2\x6a\xde\xea\x2e\x60\xda\xe6\xc6\xd1\xcd\xd0\xcb\x3c\x34\x7b\x16\x38\x40\x39\xa8\xe3\xfd\x60\x87\x38\x13\x87\xcb\x4b\xc7\x2d\xdb\x5f\x25\xb3\x74\x85\x9b\x02\xe5\xbb\x1b\xa0\x6d\x3c\xc6\x9e\xc4\x4c\xec\x4b\x98\x5c\x84\x76\xe3\x50\x32\xe9\x9a\xbf\x00\x1a\x1d\x44\xdd\xc6\xe2\x88\x9c\x3c\x2c\x3e\xca\xce\xd6\x09\xb2\xb2\x68\x0e\x00\xb1\xef\xa7\xe9\xd2\x6d\x62\xf2\xb3\xab\x36\xf9\x21\x04\x47\x90\xab\xbd\x49\x36\x07\x56\xdc\xff\xcc\xf2\x30\xf6\x6d\xbb\x70\x1a\xa1\x64\xda\xd6\x06\x9a\xa2\xb8\xb3\x30\x9f\x2f\xe4\x4d\x5e\x0b\x25\xbd\x55\x64\x31\xf0\xdf\x4c\x2e\xa9\x7a\xe7\x9e\xd4\xa5\x75\x78\xd6\x6f\xc6\x93\x9c\x57\x62\x8a\x90\xca\xc9\x7a\xdf\xa8\x70\x2a\x4a\x1c\x89\x65\xba\x1a\x90\x26\x25\x67\x28\x66\x64\x00\x30\x03\x53\x3c\xc9\x31\x4c\xaf\x7d\x3b\x98\x2e\x0a\x43\x2f\xf5\xaa\x4e\xd5\x74\x19\x83\xd9\xb5\x43\x23\xac\x7e\x29\x9b\x2b\x49\x56\xc1\xa2\xc1\x91\x55\x7b\x27\xd8\x6b\xe7\x14\xb5\xb6\x8f\xcb\x1d\x41\xf7\x8c\xa5\xdd\xb6\xb5\x3b\x3d\xfc\x8e\x7d\x6b\x3c\x3d\xb0\x59\xaf\x9f\x2d\xd7\x65\xef\x04\xb6\xd1\x6e\x67\x37\xc7\x27\xaa\x11\xf3\xdf\x37\x74\xa3\xfc\x96\x18\x2e\x28\x2a\xcc\x3d\x23\x3e\xea\xbf\x8c\x72\xd3\xf2\x46\xae\x18\x45\x05\x28\x8f\xef\x39\xb3\x67\x66\xb1\x0d\xd1\xbf\xbf\xbf\xa7\x0f\x97\xb3\xc9\x01\x72\x6d\x1e\x0d\x0a\x83\x7d\x11\xf0\x12\x3a\x34\xab\xad\x1a\x79\xaa\xbe\x80\xb1\x25\xb1\x28\xee\x16\x0b\x51\x18\x48\xf7\xf0\x4c\x49\xc8\xd5\xc2\xf2\x04\x1d\xa7\xd9\x59\x9c\x29\xb1\xda\xc8\xc6\x80\x77\xef\xac\x3e\xca\x58\xbb\xc1\x63\x7a\xad\xce\x21\xc7\x74\xfe\xa4\x2d\x2b\xcf\x4a\x0b\x98\x92\x30\x7e\x36\xfa\x25\x0a\xce\xe7\x95\xad\x2b\xfe\xcf\xbf\x60\x31\x9b\x81\x66\x3e\x2a\x26\x57\x19\x46\xf7\x5a\x8d\x96\x9a\xf1\x6b\x3b\x57\xc3\xec\x3e\x66\x15\x8a\xaf\x42\xcc\xf5\xe5\x8b\x93\x7a\xae\xf6\x13\x31\x86\x06\x60\x33\x17\xe5\xaa\x31\x8b\xe7\x0f\x8d\xa3\xc0\xc1\x6b\xe6\xc2\x9e\x3e\xc9\xfe\xf4\xe4\x6e\x8c\xa2\x41\xd9\x41\xd5\x80\x49\xa0\x63\xd9\x0a\xfc\x95\x3c\xa3\x2e\x8a\x50\xa6\x47\x36\x32\x58\x8a\xc4\x1e\xae\x97\xf2\x0c\xe9\xb7\x41\xed\x41\xc9\xa4\xaa\x65\x51\xfd\x82\x3c\xe0\xc8\x11\xa5\xbb\x5a\x17\x1c\x1e\xa4\x23\x8a\x02\x46\x81\x1e\x46\x9c\xf4\x98\xb7\x96\x21\xc3\x23\xeb\xa7\x98\x53\x44\xfe\x11\xe6\x74\x99\xed\xf4\x96\x74\x91\xaa\x74\x9f\x8f\x3f\xe3\x99\x61\xd7\x68\x92\xc9\x3a\xac\x3b\x19\xfa\x4b\x4f\xc1\x74\xd7\xd4\xd4\xd8\xbd\x6e\xe4\x75\x47\x50\x08"}, +{{0xcd,0xad,0xc5,0xb8,0x9c,0xb2,0xb6,0x30,0x8a,0x00,0x6f,0x2f,0x4e,0x95,0x5a,0x91,0xaa,0xf3,0xba,0x70,0x16,0x5f,0x2d,0x44,0x4e,0xf1,0xff,0xeb,0xbd,0xaa,0xa2,0x21,},{0x05,0x41,0x41,0x5f,0xf5,0x46,0x7f,0x28,0xce,0xac,0x83,0x9b,0x13,0xa1,0x76,0x6e,0x72,0xc9,0x9e,0x65,0x45,0x20,0x7d,0x9d,0x5d,0x96,0x97,0x41,0x1e,0xb6,0xbc,0xa7,},{0xff,0xed,0xe7,0x01,0xeb,0x18,0x29,0xce,0x23,0x61,0xcd,0xa2,0xc8,0xbb,0x63,0x33,0x85,0x39,0xd8,0xad,0x2f,0x66,0x77,0x58,0x55,0x31,0xe7,0xbf,0x1d,0x39,0x22,0x38,0x26,0x79,0xa1,0xae,0x84,0xff,0xeb,0x75,0x3f,0xc9,0x75,0x4e,0x50,0xc0,0x18,0x52,0xf9,0x55,0xe3,0xfd,0x60,0x9f,0xf6,0x4b,0xf0,0x5b,0xbe,0x70,0x75,0xcd,0xbe,0x00,},"\x91\x17\x27\x03\x6d\xb3\x09\xd6\xe2\xe3\x36\x9e\x4f\x17\xd9\x8d\x99\xec\x07\x0c\x33\x28\x3b\xb1\x24\x4e\xfd\x62\xe7\x6b\xd7\x0a\x69\xb9\x72\x3b\xd2\xb5\x20\x47\x2b\x98\xaa\x06\x59\x24\x36\x6d\xe7\x80\x90\x0b\xcd\x8b\x77\xb5\x0f\x87\xc3\xc3\x61\x87\x02\x4b\xbc\x59\xcc\xf4\x48\x2c\x7b\x4a\xad\xb5\x6e\x2e\x5e\xcc\x00\x03\xd9\x89\xd6\xaf\xc6\x3e\xc1\x02\x42\xe5\x74\x82\xfe\x39\x21\x52\x61\xd5\xfc\x95\xa0\x18\x5f\x95\xe9\x54\x0c\x55\xf7\x4d\x69\x60\x48\xbc\xa7\xab\x11\x26\x81\xa5\x55\x8e\xa9\x3c\x3b\x1f\x1c\xd3\x64\x65\x9e\x94\x33\xce\xee\xbe\x05\x4e\xe7\x13\xc4\x77\x60\xd7\xad\x13\x2a\x7f\x3f\x8f\xe3\xd5\x04\x1b\x81\x1a\x26\xb6\x5e\xfb\x1f\x34\x0e\x18\x1a\x4e\xc7\x20\xea\x13\x6b\x3a\xf3\xd9\xe5\x46\x1d\xd2\x43\x70\x33\x6f\x10\xe6\x35\x4c\x8c\x17\xac\xf9\x99\x85\x44\xce\xc0\x87\x3e\xfa\x68\x7c\xb1\x32\xae\xcf\x70\xae\xbb\xc5\x67\xba\x03\xc5\x36\x49\x9e\xf9\x6c\xc8\x41\x2e\x7a\xaa\xd5\xbf\x96\x42\x2b\xe4\x7c\xb9\x41\x36\x45\xdf\x2c\x17\x03\x19\x23\x47\xdc\xbb\x12\x31\x27\x45\x59\x71\xae\x15\x7e\x9f\xa2\xdb\xff\x88\x74\x5a\x96\xc6\x58\xb8\x65\xe4\x1f\x55\xae\xbf\x98\x39\x50\x05\xdd\xcb\xd5\x98\x3e\x6a\xe0\x2c\x4f\xbb\x5e\x17\x91\x67\x96\x32\x5f\x76\xed\xf5\xb6\x4a\xfa\x4e\xc5\xa7\x41\x8a\xfe\xd2\x3a\x97\xef\xad\xe6\x8b\x6a\x5b\x31\x45\xf0\x8a\x5d\x3d\xb9\xc2\x98\xa5\x12\xfa\xbd\xac\x68\x56\x2b\x3f\x55\x37\x7f\xf4\x4b\x00\xc1\xc2\xf3\xef\xd1\x81\x32\xda\x71\xf9\x71\xa9\x53\xa9\x31\x8c\x57\x52\x33\x61\xa1\x60\xf9\xb7\xe3\xb5\x1c\x52\x4e\x95\xdd\x5e\xf4\x56\x8e\xf1\x8a\x80\x07\x75\xe9\xd2\x6e\x07\x13\x19\x42\xd2\xbe\x4e\xf2\x2c\x0c\xbc\x13\xdf\x01\xc6\x8b\x1b\xcd\x3b\xce\x9b\xd5\x1c\x4c\xed\x65\x2a\xdc\x40\x07\xbe\x43\xb3\x7c\x67\xa5\xc5\x5e\xd4\x02\x9e\x8a\xd1\x5d\xef\x83\x05\xc9\x68\x62\x1a\xed\x4c\xd4\xbf\xe0\x79\xa6\xf4\x88\x84\xd8\x56\x80\x39\x2c\xa9\x2b\xa6\xe1\x2f\xea\x6f\x4a\x05\x6f\x79\xd6\x7b\x19\xb0\x5f\x90\xd6\x84\xbe\x7d\x45\x72\x5f\x79\x67\xc6\xa4\x67\xaf\x43\xb8\x6a\x6b\x1b\x9d\x9e\xed\x3a\x42\x48\x97\x1c\x76\xa7\xac\x29\xc2\x92\xdf\xba\x4d\x75\xc5\xf7\xba\x70\x9a\x39\x05\x8e\x96\xad\xf6\xdb\xd7\x60\xd3\xce\xf4\x02\x4b\xf3\xed\xc4\x41\xef\xbf\x11\x47\xa2\xc1\x08\xbd\x6f\x9e\xb4\x39\xc1\xc5\xc4\xd3\xa6\xea\x4e\xc3\xd9\x2c\xef\x38\x13\x61\x88\xbe\xc9\xe0\xb6\xc0\x51\x8d\x8b\x79\xba\x59\xc5\xdc\xba\x39\x3a\xed\xfd\xff\xb0\xb7\x0d\x77\x9c\x2b\x97\x65\xce\x44\x52\xe7\xe3\xb0\x8c\x44\x02\xb1\xa6\x08\x32\x08\x40\xfb\xe9\x6d\x1e\xb8\x65\x6e\xb1\xc2\x0d\x95\x51\xdd\xf5\x33\xb9\xf1\x5e\x4e\xb5\x78\x37\x56\xc5\x3d\xdd\x3b\x14\xd8\x07\xf8\x38\xac\x96\x80\xf8\x9f\x1a\xdf\xb7\x8d\x68\xcc\xb0\x67\x31\xa9\x0b\xea\xc5\xf0\xd7\x09\xd5\xb8\x8c\x75\x43\x7a\x66\x3c\xb9\x62\xd3\x7f\x96\xb8\xe8\x92\x84\x77\xb5\x61\x12\x28\x01\x5d\x33\x7f\x04\x9e\x8b\x62\xe4\xdf\xf8\xd0\xbb\x6c\xda\x24\xa5\xdf\x90\x83\xe3\x48\xbe\xf1\x25\x85\xf5\xf4\xc4\xd3\xbb\x3c\x7e\x78\xd5\x50\x19\x4a\x45\x25\x1a\x08\x79\xa1\x62\x4b\xf9\xdd\x35\xeb\x65\x5c\x39\x39\xfe\xa8\x90\x9f\x6d\xf3\x95\xbe\xbd\x02\xb6\x8a\x17\xa8\x97\xc9\xaa\xdd\xd6\xe2\xe2\x04\x61\xe3\x03\xf5\x7c\xde\xb0\x0a\xe0\xf2\x3e\x60\xa9\x4c\x19\xc7\x71\xd8\xaa\x60\x53\x3b\x93\xce\xdc\x1b\x76\xd2\x29\x0a\x01\xbf\x43\xb2\x72\x5f\x12\x5b\xef\xa5\x75\x15\x4e\x98\x6c\x9c\x62\x05\xa1\x59\x6c\xba\xa2\xd1\x34\x70\xc2\x34\x22\xf2\xdf\x7b\xec\xe4\xe6\xeb\xd7\x52\xe9\x38\x9a\xe6\x08\x57\xb5\x29\x69\xd2\xdd\xef\xa9\xc0\x34\xf1\xbf\x35\xae\x33\x16\x30\x4e\x94\x9c\x89\x90\x82\x0e\x26\xe6\xcf\xfa\xe4\xb3\x88\xd1\x50\x5f\x92\x37\x06\x29\x7f\x8d\xb5\x56\x53\x79\x19\xeb\xbe\x30\x86\x02\x3f\x12\xf4\xde\xd3\xb1\x1a\xcf\x2a\x6d\x97\x3d\xdd\x8e\xb2\x7b\x07\xc5\x80\xbf\x44\x8c\xaa\x5a\x2e\xa1\x16\xc5\xea\xf3\x6f\x7a\x6b\x17\xa8\x5b\x39\x55\xdc\x8a\x44\xa6\x20\xd8"}, +{{0x2d,0xdd,0x79,0xe7,0x60,0x64,0xc2,0xe6,0xb3,0x22,0xaf,0xb0,0xc5,0xc6,0x85,0xcd,0xbe,0xc6,0x28,0x21,0xcd,0xfc,0x0c,0xb1,0x4d,0xb7,0xd0,0x1b,0xa3,0xbf,0x21,0xa5,},{0xf5,0x5b,0x4a,0xb6,0x4a,0x25,0x82,0x21,0x2b,0x96,0xcc,0xac,0x06,0x40,0xe2,0x71,0x94,0x4a,0x34,0xa2,0x86,0xd0,0x35,0x83,0x30,0x45,0x81,0x0e,0x34,0x18,0x24,0xbb,},{0xa4,0xc3,0x96,0xe1,0x9d,0xd4,0x2e,0x03,0x91,0x84,0xcd,0x25,0x11,0x88,0xff,0xa2,0x45,0xf0,0x36,0x7c,0x69,0xc0,0x2d,0x12,0x47,0x4e,0x5c,0xa9,0xe5,0xc7,0x68,0xa7,0xee,0x3a,0x3d,0x47,0xeb,0x22,0xd1,0xac,0x9e,0x04,0xb7,0x04,0xa7,0x4f,0x41,0x69,0x47,0xf3,0xf4,0x9a,0x32,0x42,0x59,0x4e,0x7b,0x63,0x90,0xe8,0x2b,0x60,0xd5,0x05,},"\xa5\x66\x74\xa1\xe1\xf0\x97\x95\x25\x1a\xbe\x54\xab\x43\xc2\x98\x20\x8f\xef\xc9\xbb\x91\x76\xfd\xb2\x3e\x1e\x9f\x60\xf0\x32\x64\x79\x15\x56\x7e\xbd\xcc\x2b\x86\x9e\xdb\x70\x55\xf4\xab\xa6\x7e\xcf\xe7\xfa\x19\xed\xa4\x5c\x06\x04\x7c\x7a\x51\x84\x8b\xe9\x97\x32\x51\xf8\x5f\xf7\x6f\x1c\x59\xe3\x65\x43\x82\x85\x8c\x9b\xe1\x23\xdb\x8a\x94\x90\xc6\xc9\xb3\x09\xb8\x2d\x1e\x2c\xa6\xf4\xa0\x7d\x00\x12\x02\x83\xc6\xc2\x95\x64\x49\x95\xa9\x66\x28\x61\x2b\x8d\x67\x91\x57\x35\x18\xe2\x55\x6a\x68\x8a\x09\xf1\x49\xbc\x84\x6a\x68\xbd\x0e\xf7\x92\x79\x03\x57\x10\x03\x1e\xf0\xa8\xfe\xd1\xdd\x0b\xf0\x26\x12\x5d\xc6\x64\x8f\x86\xf6\x43\x09\x94\x2e\x18\xf2\x3b\x12\xd1\xdc\x68\xc6\xf2\x77\x0c\xa8\xb5\x48\x5b\x36\x9b\x0c\x92\x00\x7a\x94\x61\xc1\x39\xfc\xbb\x41\x17\x5f\x31\x6d\x44\x67\x06\x0a\xb4\x3d\x12\x22\xf5\x80\x24\x04\xbf\x63\xc2\xdf\x7e\x00\x4b\xdc\x40\x0c\xa8\x0f\xe0\xd2\xcb\x68\xa2\x10\xfb\xc3\xfc\x0b\x90\x32\x09\xd5\x47\x6e\x7a\x56\xba\xef\xb8\xfa\xd7\xf3\x28\xb7\x2f\x32\x71\x13\xe1\x39\x41\x4b\xa6\xf3\x4e\x99\xc2\xec\xcd\xe0\x44\xe7\xa3\xac\x70\xc5\x80\xcd\x26\xc7\x45\x01\x92\xca\x4c\x82\x3c\x7a\xc5\xea\xe8\x76\xc0\xd1\xc8\xc7\x68\xc1\xcb\x0b\x7e\xa4\x1f\xc9\xb7\xd2\x94\x37\xbb\xad\xab\x18\xe0\xf5\xed\x1d\xef\xe0\xcf\x6c\x0e\xba\xa6\xb6\xd7\x77\xf4\xda\xd9\xab\xdd\xbf\xc0\xfd\x6a\xb5\xee\xea\x80\x3c\xfa\x01\xc0\xbd\x46\xf6\x5f\xef\xa4\x69\x01\xab\xbe\x0d\x89\x10\x4e\x3b\xc4\xae\xe1\xf0\x59\x9c\x69\xb6\x7b\xa5\x45\xab\x9b\x54\xf5\xde\xe3\x40\xac\x69\xd8\x82\x99\xe8\x68\x22\xac\xdd\xdd\xce\x60\x11\x22\x01\x2f\x99\x29\x97\x74\xaa\xf1\x7c\x96\x4e\xde\xcb\x95\xe1\x27\x7d\x46\x2d\xe6\x4e\x91\x15\xa6\x1a\xd9\x8a\xa3\xd2\x2e\x3b\xa6\xf8\xf1\xcd\x69\xb6\xb5\x2b\x83\x38\x28\x23\xf3\x0e\x96\x6b\xda\xd1\xff\x5f\xc1\x98\xae\x32\xe9\xb6\x80\x55\xd4\x39\x2b\xc7\xc3\xdf\x10\x15\xf1\x28\xae\xe1\xe4\xfa\x3d\x49\x99\xe3\x29\xf2\x2f\x0f\xf6\xaa\x77\x8b\xae\x02\x94\xa1\xdf\x74\x36\xcb\x16\xa2\xbf\xcd\x74\xb4\x63\xab\xe7\xcb\x4b\xac\x53\x62\xc8\x9c\x9d\x1a\x37\x8a\x2c\xb8\x85\xcc\x3b\x26\xab\x4b\xe8\x81\xef\x1a\xfc\x14\x43\x0e\x10\xd2\x65\x39\xca\x35\x8c\x36\x76\x28\x6a\xd8\x1c\xe1\xc9\xe7\x85\x92\xaf\x66\xf1\x82\xbb\x1f\x7f\x86\x2f\xe7\x55\xbf\xfb\x5b\xe5\xc5\xf2\xb7\x31\xc1\x32\xe2\x38\x8a\x76\xa1\xa7\xb1\xcd\xdf\x05\xae\xd2\xac\x9e\xc4\x08\x47\x52\x71\x94\x2c\xca\xdd\x32\xe4\x9d\x87\x91\xed\xf8\xb8\xde\x11\x75\x51\xce\x26\x4a\x60\xb8\x41\x05\xea\xe8\x7e\x66\xf6\xa4\x01\xd1\x32\x2b\xb2\x1a\x98\xe8\xac\xd2\x77\x49\x32\x54\xe5\x04\x00\x4f\x72\xc7\x6e\x79\x03\xd2\xfa\x38\xfa\xb7\x17\xe9\x4c\xe6\x27\x94\x7c\x4e\xa3\x26\xbd\x25\x75\xc3\x73\x10\xf3\xb4\xd8\x43\xb9\x0f\xa7\x7d\x32\xd9\x95\x21\x94\x15\x0b\x62\xf8\x50\x18\x7a\x4f\xdf\x38\x46\x6d\xfa\x06\x56\xc0\xa2\xe0\xb3\xf0\x74\x92\xac\x8e\x37\xe5\xd0\xdf\x95\xcc\x89\xdf\x30\x85\xa2\x69\x29\x1d\xc2\x51\x22\x10\xd3\xfe\x44\x24\x8d\x7a\xb9\x96\xbe\x09\x9a\xf6\x4c\x22\x75\x66\x66\xf8\xde\xa5\x6c\x00\xb9\x06\x77\xd1\x18\x25\x00\xdd\x27\x4f\xd0\x76\x92\x53\x82\x6d\x67\x7a\xb1\x6a\x55\x7b\x08\xb3\xc5\x22\x65\x49\x8d\x85\xc4\xcb\x2b\x60\x0e\xe0\x48\x1b\x7c\x1c\x47\x6a\x9d\xaa\x8b\x88\xc7\x1f\xc2\x1b\x6f\x89\xbf\xdf\xec\xe5\x8d\xa9\xe8\xd5\x65\x65\x2e\x43\x95\xbd\xf4\xc8\x11\xb4\xf4\xf2\x2d\x2b\x96\x13\x26\x1f\x88\xc6\x04\xc2\x97\x4d\x3e\x97\x7d\x14\x0d\x04\x6e\x1b\x66\x25\xb7\x07\x16\x40\xd3\x52\xcb\x7e\x7e\x65\xd4\x6c\x61\x34\x47\xbe\x8d\xc5\xa2\x00\xaa\x9a\xca\xb4\x6a\xfc\xcf\xeb\xb6\xb1\xc3\x19\x73\x24\x6c\x34\xfa\xaf\x8d\x26\xea\x5e\x83\xbe\x15\x71\x8f\x8f\xdb\x0c\xfc\x44\x4e\x2e\xb6\x0f\x36\x59\xb0\x20\x16\x1c\x22\x8e\x6b\x92\x40\xb7\xac\x39\x4c\xab\x81\x2d\xe1\x05\x15\x76\x6f\x22\x47\x3e\xcc\xa5\x35\x59\x4c\xe5\x28\xa5\x7c\xf5\xda\xb2\xeb\x32\xab\x84"}, +{{0x3a,0xbb,0xdb,0x0b,0xa1,0x1a,0xa1,0x06,0x3b,0xd2,0x6b,0x02,0xc1,0x16,0x03,0x78,0x62,0x28,0x5b,0xab,0xd2,0x15,0xd2,0x40,0xbc,0x9c,0x09,0x26,0xf4,0xec,0xea,0x81,},{0xb8,0xfc,0x59,0x43,0x8f,0x8c,0xe9,0xe3,0x78,0x5a,0x47,0x3b,0x22,0xc8,0x89,0x2c,0x51,0xea,0xc2,0x56,0x8c,0x68,0x1d,0xcc,0x77,0xb6,0xf0,0xe0,0x79,0x9c,0x4e,0x33,},{0x98,0x1f,0x20,0x05,0x5a,0x45,0x75,0x25,0xae,0xe5,0x61,0x62,0x64,0xe6,0xaf,0x42,0xe8,0xb3,0x87,0xcb,0x08,0xf8,0xb4,0xa7,0x3f,0x9b,0xe0,0xb3,0x66,0xf1,0x03,0x5b,0xb3,0x0a,0x1c,0x87,0x48,0x94,0xcb,0xec,0xe0,0xa8,0x46,0xd8,0x49,0xb7,0xec,0xc5,0x56,0x58,0x5d,0x0d,0x3d,0x39,0x56,0x45,0x80,0x7f,0xf2,0xa3,0xca,0x5a,0x59,0x0c,},"\xdc\xcd\x55\xf9\x22\xcd\x27\x4f\x69\x75\x00\x0a\xdc\x8d\x98\x63\x0c\x6d\x75\x2c\x12\x02\xa9\xdd\x12\x10\x48\xb9\x39\x45\xaf\x2b\x11\x10\x96\x77\x88\xf9\x9e\xc0\x28\xe3\xd3\xb4\xcf\x82\xfb\x07\x17\x3e\xa4\x40\x1e\x3b\xb4\xb0\x7b\x7b\x0b\x24\xb0\x59\xa7\x66\x33\x95\x32\xd9\xdf\x3e\x31\xb7\x2c\x95\x8c\x11\x9d\x8d\xfa\x15\xa5\x07\xaf\x6c\x5f\x7e\x78\xfe\x27\x0f\xa8\x1b\x9d\xf0\xf2\xe4\xaf\x24\xbd\x99\xfb\xeb\x14\xe0\x03\x30\x84\xd7\xfb\xf8\x4d\xde\xdf\xd5\xce\x56\x75\x1d\x15\x90\x84\x75\xdf\x8a\xf0\x13\xd0\x91\x17\x3c\x13\x86\xb9\x13\x94\x26\xcc\x60\x81\xea\x16\x5b\x8c\xe4\x81\x94\xb8\xe1\x8a\x9b\x91\xa4\x63\x13\x44\xfe\x29\xc8\xe7\x28\x18\xb7\x1f\xa1\x5c\x92\x92\xd1\x3f\xdf\x5f\x9d\x18\xe2\x9b\xd0\x29\x1b\x81\x38\xde\x73\x8f\xd3\xa3\x6c\x35\x23\x90\x22\x36\x8b\x45\x6f\x1f\xac\xba\x90\xa0\xd8\x0d\x6e\x31\x1c\x5f\x6c\x6f\x04\x67\x7e\x92\x37\x3a\x5f\xc4\x73\x88\x94\xdb\xed\x20\x6c\x30\xda\x34\x1b\x3b\x19\x6c\x94\x78\x58\xa6\xd2\xad\xc6\x8a\xac\x3f\x20\xcf\xdb\xe0\x49\x79\x61\xda\xe3\x34\x70\x26\x6d\x17\xec\x71\x9a\x59\xf0\x58\x6f\x82\xf9\x9f\x1c\x90\xed\x70\x05\xa2\x07\x21\x9a\x55\xed\xc7\x60\xf4\xeb\x8f\x24\x02\x64\x7f\x6f\x77\x97\x1f\xf7\xb6\x34\x35\x7b\x6b\x29\xbb\xd7\xea\x05\xe2\xe2\x58\x54\xe9\x9c\x62\x0f\x4b\x8b\x64\x73\x90\x22\xff\x0b\x33\x8a\xfe\xf3\x5f\xb6\xf4\x1a\x53\x62\x9a\x51\x8e\xb9\x3d\x66\x02\x0f\xb3\x53\xae\xf8\xdd\x07\x1e\x09\xc9\x16\xd4\x70\x4a\xcd\xf7\x76\xb3\x8c\xa9\xc5\x9f\x21\x1f\xf8\x8c\x43\x0a\x57\xe8\xf1\x71\x39\x23\xb3\xf3\x0c\xa8\x69\x70\xa1\x4a\x52\xdb\x4b\xcb\xe6\x0d\xf4\xbc\x3c\xfd\xf2\x54\xbf\x10\xf8\xaf\xae\x87\xbd\x61\xb3\x58\xf4\x3c\xc2\x96\xc0\x41\x29\x64\xc4\xe0\x0f\x71\x21\x33\x97\x46\x85\x17\xcb\x01\x37\x9c\xb7\x29\xc7\xb9\xe3\x5b\xd5\x0b\xdd\x98\xc3\xd3\xb7\x62\x97\xa1\x38\xb5\x7c\xeb\x6c\x77\x74\x2d\xf0\x88\x1d\x07\x66\x8c\x08\xa6\x30\xa4\x4e\x6e\xd7\xeb\x20\x6d\x6a\x56\x44\x07\x10\x43\x8a\x51\x11\x42\x4b\x61\xaa\xee\xce\x40\xe9\x00\xf5\xe3\xc4\x57\xe9\xd6\xe3\x1a\x79\xec\x5b\x4b\x42\xb6\x8e\x66\xe1\x99\x30\x92\x87\xca\xd6\x53\x36\xfc\x7f\xe4\x3f\x43\xcd\x8c\x77\x3d\x3c\x65\x80\xd7\x21\x7e\x2c\xab\xec\xd3\xea\xbc\x48\x5c\x4a\xcf\x47\x71\x8c\x39\xb0\x2c\x78\x58\xff\x34\x7c\xec\x75\x35\xed\xdc\xd4\xfc\x81\x5d\xf8\x14\x56\x9a\x88\xae\x70\xf2\x73\x3a\x65\x39\xf2\x08\xc7\x9c\xf4\xe7\xc4\xf9\xea\x24\x1a\x92\xe9\x51\x51\x71\x36\x14\x18\xa4\xc2\xe5\x3c\x07\x6a\xaa\xbc\x47\xe4\xc9\x71\xbd\x04\xb1\x00\xc2\x62\x82\x30\x88\x57\xe0\x6e\x7e\x5f\xbc\x43\x42\x56\x4f\xb3\xb1\xea\x4a\x17\xa9\x25\xe9\x1e\xe6\x91\x22\x32\x1d\x39\x2b\x24\x69\x65\xb8\x6b\x54\xfd\x5c\x83\xfa\x5c\x47\x41\x63\xf9\x8a\x9f\x44\x7d\x88\xcb\x59\xfe\x2c\xdf\x9f\x54\x12\xfc\xbe\xb3\xef\xfa\xc8\x97\x67\x91\xc6\xa4\x7b\x66\x9a\x2f\xc5\x5a\xbe\x8e\x09\xe7\x41\x57\xef\xcd\x1c\xa7\x8f\xc1\x0f\xa6\x87\x01\x0c\x68\x26\xc6\xe8\x96\xef\x5c\xd7\x1d\x0f\xe4\xd1\xbd\x07\xc1\x0d\xac\x3b\x03\x48\x5e\xdd\x25\x69\xa7\xee\xcf\xbc\x4e\x5d\x2e\xe2\x37\x98\x59\xe2\x65\x26\x7b\xed\xaa\xd6\x9d\x93\xb7\xc1\xbd\x18\xf2\x7e\xa4\x24\x83\xc7\xe4\x10\x0e\xe0\x5b\x28\x30\x39\xbf\xb9\x89\x1d\x37\xc4\x67\xed\x83\xb8\x8c\x79\x4e\xab\x6b\xab\x9d\xc6\x77\x89\x26\x50\xe2\xd8\x96\xfb\xfe\xc1\xb1\xcd\xb7\x21\xbe\x30\xb0\xb8\xe5\x35\x87\x09\xe1\x65\xcb\xe3\xa1\x82\xc9\x3b\xc0\xa0\xce\xa2\xf8\xcf\x3a\x62\x57\xad\xf7\x64\x53\x40\x41\x20\x22\x41\xa5\x27\x9b\x66\x8e\x40\x12\x5f\xc0\x94\x58\x5a\x3c\x58\x8a\xba\x82\xb6\x7c\xd9\x1d\x48\x3e\x54\x30\x04\x28\x42\x68\x63\xa4\x23\x64\x04\x9d\x7c\x45\xa1\x69\x38\x5a\xa8\x9b\xf3\x77\xf0\xd3\x2b\x07\x80\x9b\x58\x71\x39\x5e\xc0\x53\xa2\x57\xd9\x3e\x48\xbb\xf4\x07\xeb\x60\x91\x40\x1e\x25\x65\x46\xe3\x1f\x9f\xcd\x24\xd2\xc5\xb3\x33\xcf\x65\x78\x50\x02\xf0\x8d\x54\x8d\xb2\x6a\xd1\xf3"}, +{{0x8a,0x44,0xd6,0xaf,0xc6,0xc8,0xee,0xe1,0xbc,0x7d,0x5f,0x69,0xe4,0x95,0xb0,0xb1,0x8c,0xa7,0xae,0xe0,0x07,0xde,0xa7,0xcf,0x0d,0x17,0x14,0xd7,0x85,0xa9,0xf4,0xed,},{0xd4,0xf3,0x66,0xb3,0x37,0x7f,0xa3,0x9b,0x36,0xf9,0xae,0x14,0xda,0x40,0x4e,0x22,0x40,0x49,0x0d,0xbd,0x8d,0x79,0x6b,0x1a,0xb8,0x72,0xdf,0xcb,0x83,0xa5,0x95,0x40,},{0xe0,0x72,0x7e,0xb7,0x2e,0x84,0xd2,0xb8,0x2c,0xdb,0xd0,0xa6,0xbd,0x2f,0x49,0x49,0x63,0x16,0xaa,0xe8,0x35,0x1e,0x49,0x02,0xac,0xd5,0xe3,0xcc,0x57,0x34,0x6e,0x7e,0xba,0xfd,0xd9,0x2a,0x90,0xde,0xd7,0x6f,0xd0,0xc6,0x69,0x0d,0x68,0xbb,0x2f,0xed,0xd6,0x13,0xe4,0x4f,0xa2,0x22,0xbe,0x01,0x26,0xda,0x52,0x0a,0xcc,0x2c,0x41,0x05,},"\xde\x80\x32\x69\x66\x53\x6c\xe9\x49\x96\xaf\x2d\xe7\xa0\x76\x05\xcc\x4f\xcb\x9e\x75\xee\x0a\x67\xa1\xe2\x09\x32\x11\x1d\xe9\xb3\x56\xd5\xbe\xea\xe8\x6c\xc5\xf5\x64\xc1\x0d\x66\xe3\xde\x95\xa5\xb9\x9e\x84\x49\x28\xea\x8e\x77\x58\x6c\xf3\xc1\x0a\xd3\x63\x3d\xde\xeb\x1d\x9d\xcf\x3f\x94\xb7\x0b\xf1\xef\x63\xd2\x38\xdf\x20\x4d\x70\x5c\x0b\x17\x4f\x83\x28\x25\x45\xf5\xe4\x07\x5f\x8d\x69\xa4\x81\x79\xc2\x9e\xab\xf5\xc1\x74\x2e\xf3\x9e\x1a\xd9\x63\xbe\xbb\xb6\x6f\xce\x94\x91\xa9\x84\x65\x12\x15\xc2\xe7\x50\xe6\xee\x83\x65\x76\x64\x40\xa8\x44\x19\xe5\x2d\xcf\x67\x1f\x1c\x52\xea\xa2\xb9\x90\x2b\xcc\xa4\xb3\x7c\xff\xdb\xac\x8e\x7e\x7e\x6b\x0a\x5c\x87\x48\xef\xbf\x45\x2d\xf6\x16\x3f\x4c\xa0\x7b\x61\xf9\xa0\x5e\xc2\x0a\x2b\xd6\x33\x38\x9e\x67\x0b\xb5\x45\x4a\xcd\x6f\x3a\x06\x33\x5b\x5d\xa9\xec\x32\x62\x64\xe9\x62\xc7\xd9\xd0\x6c\xe7\xe9\xff\x04\xa0\xa5\xbb\xdf\xaa\x4c\x41\x08\x66\xa5\x72\x01\x16\x51\x43\x9f\x2d\xbc\xe5\xde\xe6\x67\x92\x4a\xc4\x93\x4d\x20\x54\x96\xbd\x1d\x4d\xf0\x8b\xd0\xcb\x3f\xd2\xde\x73\xa2\xef\x34\x2f\xf0\x09\x1e\x10\xe1\x5b\x3b\x76\x0a\x57\x5d\xf9\x3c\xf1\xc9\x7c\x01\xc5\xab\x11\xc0\x94\xbf\x34\x87\x82\x06\x71\x8f\x6b\x28\x5a\xa5\xcc\x51\x27\xbd\x7f\x98\x8b\x84\xa9\x04\x95\x30\x6f\xd9\xe9\x9d\x89\x55\xe6\x68\xd1\xa3\xff\x10\xf6\x5b\x7c\x47\x9f\xac\x24\x11\x9a\x3c\x10\x12\x2d\x4d\x18\xa8\x05\xb2\x47\xdf\x16\x8c\x0a\x51\x00\x16\x9b\x55\x72\xd1\x70\x12\xd7\x51\xa4\x2e\x83\x37\x61\x15\xe1\x15\x61\xc1\x60\xc1\x5e\xfa\xd7\x6d\x21\xf7\xab\xb4\x30\x36\x64\x75\x23\x86\x31\xf8\x4c\x88\xf8\x38\xb0\xac\x40\x4c\x91\x3d\x2f\xa1\x24\x50\x23\x84\x85\xc3\x02\xfc\x20\x1f\x44\x15\x1c\x19\xbc\xbd\xc1\x19\x0c\x12\xd1\x54\x08\x31\xfb\x19\x58\x1c\xb9\x31\x72\xb0\xd2\xff\x5c\x65\xf3\x1c\xaf\xf2\x0f\x81\x38\x81\xf8\x4e\x5e\xf9\xd5\xc1\x65\xe0\x96\xd2\x54\xca\xdf\x89\x52\x49\xaa\xb8\xd4\x49\x6c\x94\x0a\x40\xf9\x07\xbd\x40\x93\x5a\x94\xf5\xe5\x5b\x6d\xd0\x51\x15\x41\x00\xfe\x33\x17\x70\xef\xf2\xba\xd6\x54\x56\x19\xb8\xa3\x3e\xf6\x46\x2a\x50\xc0\xb2\xc4\xed\x2f\xba\x4e\x4e\x38\x3e\xbf\x29\x32\xe6\x19\x27\x66\xa4\xaa\xd1\xd6\xe2\xb6\x92\xd9\xf2\xbd\xc2\x33\x93\xe8\xaa\xcf\xba\x32\x3b\x53\x4f\x84\xed\xf2\xdc\xed\x7c\x94\xd5\x16\x87\xda\xa2\x71\x98\xa9\x14\x4b\x31\x2b\x71\x6f\xe1\x70\x14\xa7\xbe\xd0\xc1\x4a\x24\x38\x73\x3d\x55\x5c\x65\x64\xc8\xc1\xa3\xd9\x97\xeb\xae\x7b\x3d\xe8\x87\x7a\xf5\x3c\x1d\x1a\x50\x29\x15\x8a\x80\xaa\x0c\x87\x48\x9f\xef\x27\x0c\xdf\xfe\x10\xd3\x4b\x15\xc1\xa9\x69\x3a\xe0\x39\x02\x43\xe3\x14\xcf\xac\x06\xef\x6e\xef\xeb\xcc\xf4\x3d\x42\xea\xc2\x4c\xe9\x87\x94\x29\xd2\xfc\x72\x53\xb3\xed\x17\x58\x25\xbc\x4d\xa0\x76\x2b\x49\x33\xa9\x8a\xfd\xb9\x4b\x06\xf4\xfc\xd2\xad\x36\x11\xaa\x99\x9d\x7c\x1c\x8d\x85\x2d\x01\xdd\x9e\x52\x64\x84\x55\xa0\x4e\xb2\x33\x0a\x76\xfd\x94\x2c\x53\x1e\x51\x4b\x5e\xc0\x72\x8a\x89\xd3\x4c\xa5\x90\xea\x99\xc8\x8f\xaa\x20\xdf\xb7\xbb\xf6\x56\x54\xaa\x6c\x21\x2b\xeb\x8a\xd6\xbf\x7c\x77\x73\x91\xcd\x49\xc3\x9c\xf8\xab\x51\xb9\x5b\x41\x9e\x3d\xfc\x8d\x94\xa9\x3a\x1e\xf0\x22\x3c\x6d\xe9\x0b\xf9\x62\x18\xd8\x04\x5b\xd4\x95\x2a\x0d\x83\x72\xa5\x57\x8c\x6a\xaf\xa7\x4b\xa6\x62\xe3\x18\x8e\x6a\x6e\x56\x7e\x4d\x2f\xe8\x22\x7d\x07\x43\x98\x2a\x41\xeb\xfa\x0d\x31\x0f\xe7\x9f\xed\x27\x04\x17\x90\xef\xd5\xaf\xac\x22\x43\xe1\xd1\x50\xb1\x45\x01\x5d\x9d\xea\xb0\xed\xed\x63\x94\xac\x36\xfc\x5f\xb2\x01\xf5\x20\x4f\xbd\x42\x2a\x36\x04\x23\x30\x15\xbb\x0a\x48\xa9\x20\xe2\xe5\xe0\xd4\xde\xed\x67\x20\x25\xf2\x3c\xfb\xa9\x38\x89\x59\x7e\x50\x4c\x88\x87\xad\xd4\x6c\xfe\xf4\x02\x4a\xfb\x8a\x26\xee\xb7\xdc\xdd\xb2\x39\x7b\x44\xa1\x79\x63\x67\x34\x00\x42\x13\x70\x28\xc3\x30\x76\x26\x81\x6c\x29\x31\xe6\x1e\xbb\x6b\x69\xed\xcb\xcb\x61\x2c\x9b\x18\x1a\x28\x53\x01\xce\x46\xf8\x2f"}, +{{0x8a,0x97,0x2d,0xd0,0xf1,0x19,0x0c,0x2b,0x9d,0x54,0x8f,0x4b,0xa5,0x82,0x64,0xbb,0x04,0x82,0x67,0x75,0x50,0x2a,0x8d,0x5c,0x2b,0x20,0x9e,0xe8,0x8d,0xce,0xa5,0xfb,},{0x6d,0x80,0x37,0x5f,0x3c,0xf1,0xaa,0xb2,0x83,0x55,0x1d,0xf4,0x45,0xd1,0x7e,0x7d,0x3b,0xaf,0x9b,0xcb,0xec,0xbb,0xb2,0x67,0x05,0x2e,0x02,0xfd,0xb6,0x91,0x44,0xd3,},{0xbd,0x45,0xb3,0xc0,0x45,0x85,0x0e,0xbe,0xf7,0xb8,0x0d,0xd1,0xde,0xab,0x48,0x03,0x7b,0x13,0x46,0xc7,0x1d,0xea,0xf1,0xe5,0x8f,0x2a,0x7b,0x16,0x26,0x74,0xf9,0x4d,0x1e,0xf3,0xd4,0x23,0x90,0x37,0x33,0x0b,0xd6,0x33,0x5f,0xe4,0xf0,0x14,0x92,0x50,0x90,0x1f,0x00,0xa8,0xe4,0x6b,0xe5,0xfa,0x0a,0xae,0xc6,0x9d,0xe0,0x6d,0x73,0x04,},"\x30\xb2\x89\x48\x93\x9a\xa2\x63\x43\x7e\x45\xc5\xc0\x25\x4f\xb2\x0e\x61\x7e\xd0\xf3\xfa\x7d\xac\xe5\xa0\xa8\xe0\xfe\x3c\x1f\xc4\xad\xb2\x80\x9b\x61\xc5\xe8\xd9\x2c\xd2\xf3\xde\x93\xb1\x73\xbe\x70\x7b\xad\xa9\x42\x40\xc6\x26\x2c\x16\x0e\x8c\x78\x21\x65\xbe\xef\x99\xd0\xbe\x8e\xcd\xad\x63\x16\xdc\xd7\x34\xbb\xb9\x0a\x66\xcb\xd5\xb1\xcb\x4f\xd8\xf2\x22\x6c\xea\x94\x8e\x4d\xf7\x6b\xbe\x25\x1d\x47\x8f\x5c\x3f\xe0\xd6\xde\x4b\xe5\x4f\x67\xf5\x02\xb2\x80\x4f\x62\x8b\x79\xa5\x50\xfb\x1a\xc4\x83\xad\x2b\xa1\x66\x37\xc4\xbc\x9d\xa6\x7f\xb4\xf9\x86\x59\xc4\xc4\x39\x4d\x16\xb6\xd1\x4b\x3e\x0b\x0c\x1e\x62\x5d\x71\x0d\xcc\x1c\x11\xdf\x5d\x34\x14\x7b\x1e\xc5\xa4\x17\xb9\xe2\x1f\x90\x8c\xfc\x52\x3d\x43\xe3\xf1\x81\xc7\x20\x9c\xc5\x6b\xdb\x5a\x21\x62\x86\x95\xed\x32\x0f\x8d\x4c\x07\xfd\x6d\x84\xaa\x03\x42\x6f\x21\x64\x4a\xae\xfe\xee\xc3\x11\xc7\x4e\x94\x99\x93\x60\x47\x35\x0a\x9b\xf5\xb7\x03\x96\x2e\x77\xce\x55\x13\x36\x83\x5f\xc3\x2c\xcb\xd2\xc9\x0a\xe5\x2e\x24\xd4\x7d\x8d\xcb\x98\x7a\xbd\x12\x1d\x3f\x74\x6b\x5d\xe2\x30\xf2\x64\x69\x60\x3f\xb0\xc4\xa8\xf6\xcd\x79\x73\xd7\xda\x88\x2e\xd1\xd6\xe4\xd9\xc5\xa4\x6e\xc2\xc2\x19\x40\xad\x33\x89\xa1\x86\x01\x4e\xe9\x72\x78\xe5\x35\x09\x88\xb1\x5e\xcd\x9e\xa7\x45\x6b\x3c\xb5\x5e\x4d\x30\x93\xf1\x3a\x87\x5b\x50\xd6\x51\x63\x78\xec\xaf\x58\xd7\x52\xc6\x37\x4e\xd1\x56\x38\x40\x93\x11\xfc\xd3\x79\xd1\x22\xc8\xd8\xc5\x9b\x86\xf4\xe8\xdc\x46\xad\xb7\x30\xa9\x33\x84\x6e\x0b\xd2\x48\xd3\x60\x82\x52\xd9\x70\xb5\x04\xc8\x13\xc6\xde\xa9\xfc\x88\xa3\xde\x64\x19\x56\xdc\xa2\x91\x20\x4d\x39\x0b\x6b\x39\x98\x1f\x8c\x0a\x6b\xcf\xc3\x1c\xa0\x74\x44\x20\x66\x2a\x9b\x35\xeb\x3f\xc2\x11\xf8\x10\xa3\xe8\x06\x25\x00\xb1\xe4\x9b\xdf\x85\x76\x65\xff\x32\xa9\xba\x76\x19\x4b\xbb\x77\xfb\x9c\x15\x41\x29\x64\x24\x4b\x98\x65\xf7\x3d\xed\x9f\x25\xb4\x9b\x42\x5a\xa2\x53\xd8\x07\xd9\x81\x82\x92\x76\x3a\x51\x3e\xc8\x07\x47\x34\x4f\xba\x0a\xcf\xe5\x93\xcc\x26\xb1\x33\x0b\xb9\xad\xe6\x6c\x4e\x88\xcf\x1b\xae\xd6\xd6\xe7\xb7\x50\xe6\xc7\x23\x9d\x7b\xcb\xfa\x3f\xbe\x45\x40\x5a\x63\xb9\x6d\x50\x34\xcc\x0c\x07\xff\xc3\xb5\x08\x58\x08\x1d\x19\x55\xe2\xd2\xfe\x5b\xe5\xfd\xa7\xa8\x99\x69\x43\x76\x8b\x05\x51\x70\xb7\xfd\x52\xf0\xa3\x20\x97\xfe\x1b\x7a\x94\xf1\xbf\x87\x9a\x0c\xba\xbe\x10\xac\x9a\x7c\xc1\xf9\xf5\x50\x68\xc4\x8e\x3c\xcc\x06\x51\x36\x43\x10\x18\xd3\x8d\x20\x10\x9d\xc9\x5d\x99\xcc\x2b\xbe\x7c\x62\x7a\xb1\xa8\xaa\x5f\x43\x16\x13\xb7\x90\xc2\xe6\x52\x6c\xf0\x4f\xdc\x9e\x55\xf5\x1c\x05\x5f\x3c\x20\x45\xa6\x75\xe3\xa1\xe5\x4b\xa4\x09\xf7\xae\xfa\x7e\x4a\xa0\x7a\x2b\xbd\x5e\x4a\xb1\x63\x21\xa9\xf0\x99\x69\x43\x91\xfd\xa6\x8a\x74\x58\x1e\x2f\x1f\x11\xdd\x9a\x6d\x52\x4b\x1b\x83\x26\x0d\xb5\x7b\x72\xef\x29\xc2\x8c\x8d\xb5\xc3\x7f\xd1\x85\xb7\xc2\xd8\x45\x50\x90\x65\x3a\xf3\x32\xdb\xc8\x2b\xfb\x0d\xb5\xdc\xca\xbf\xb6\xb2\x8c\xaa\x35\x05\x25\xcb\x54\xcc\x84\xe5\x53\xe1\xcf\x39\x54\xb6\x12\x39\x3e\x79\x93\xff\x7e\x8b\xf5\xec\xe3\xf1\x45\x09\x4d\xd7\xa2\x7c\xb4\x7f\x22\x74\x76\xf2\x89\x23\x52\x51\xf7\x72\xb3\xba\x77\x6b\xb7\x73\xaf\x0c\xc5\xf7\x86\xa3\xfb\x9e\x93\x1a\x53\x0c\xfb\xd8\x91\xcb\x5a\x5d\xfe\x25\x16\x9e\xf9\x33\xcc\x82\xc9\x08\x0f\x32\x39\x61\xa1\x20\x15\x8e\x4b\xbd\x71\x13\x4e\xf1\xf9\x01\x08\xb8\x15\xc2\x89\xd4\xe9\xa9\x58\x9e\xc6\x4c\x05\xfb\xb4\x2a\x21\xb2\x3d\x16\xe2\xa6\x46\x78\xae\xcf\xab\x65\xcd\x9a\x80\x6c\x59\x81\x03\xd4\x1f\x70\x09\x77\x63\x17\x83\x1f\xed\xdd\x1c\x90\x02\xd4\xa9\x22\x04\xf9\x7b\xa9\x49\x0c\x61\x46\x98\x03\x07\x21\x02\x52\x4b\x9d\xf5\x19\x00\x5f\x98\xaf\x54\xd6\x0c\xa5\xba\x60\xb5\x5b\x09\x6a\x4a\xc2\xb1\x6e\xb9\xcc\x81\x97\x3c\x31\x35\xd3\xfb\x68\x73\xdd\x96\x53\x80\x0a\x22\xbb\x5d\x0d\x61\x17\xca\x5d\x91\x65\x53\xbe\x39\xc9\xa3\xb5\x11\xeb\x3d\xb7\x30"}, +{{0x12,0x38,0x0c,0x45,0xa7,0x9a,0xde,0x0f,0x48,0x3c,0x88,0x1a,0xaa,0x37,0x30,0x43,0x8b,0x08,0x35,0x90,0xf4,0x04,0xdc,0x9e,0x60,0x1f,0x76,0x15,0xf3,0x75,0xa6,0x28,},{0xd6,0x6f,0xc5,0x9a,0xe9,0x17,0xf7,0x6d,0x24,0xce,0x8a,0xb8,0xee,0x03,0xfb,0xcb,0x71,0x5d,0x5e,0xea,0x4b,0x08,0x39,0x2b,0x59,0x1e,0x64,0x85,0x91,0xc7,0x3c,0x89,},{0x02,0xb2,0x51,0x74,0xa3,0xdd,0x52,0x19,0xed,0x48,0xb2,0xc9,0x4c,0xa2,0x12,0xb6,0x3a,0x6a,0x3a,0x25,0x97,0x70,0x3c,0x07,0xb7,0xf0,0xc9,0x65,0xc3,0xc6,0xac,0x2e,0xb4,0x50,0xef,0xe3,0x87,0x16,0xa2,0xa2,0x8b,0x3f,0x89,0x84,0x6b,0x06,0xeb,0xdc,0xa4,0xbd,0x09,0xaa,0x58,0x1f,0x24,0xe8,0x4d,0x80,0xfc,0x10,0xac,0x1a,0x00,0x0a,},"\x68\x45\x23\xc2\xe7\xfa\x8b\x4b\xd7\x54\x8c\x4b\xac\xaa\x86\x78\xa3\x30\xdb\xbb\x96\x06\x32\x94\x01\x66\xb2\xcc\x9a\xfc\x15\x35\xc8\x0c\x11\x2c\x8d\xc4\xad\xa7\x62\x92\x33\xfe\x90\x90\x55\x23\x7d\x51\x3e\x29\x2a\xf1\x5a\xd7\x69\x2f\x11\x5a\xa0\x92\xda\x65\x75\x32\xf5\x18\x99\xc3\xf7\xf5\xd9\xd4\x07\xed\x5c\x16\x3e\xb3\x95\x04\x80\xa4\x12\x2a\x09\x92\x98\x1f\x07\x7b\xc8\x67\xf9\x06\x07\x54\x07\xba\x98\x49\xc4\xea\x04\x73\xce\x54\x0a\x79\x67\x44\xef\xa3\x86\x03\x78\xe1\xb8\x93\x43\xe5\x83\xd0\x80\x7e\x5a\x67\xc4\xd5\xbd\x7c\xe6\x41\x29\xfe\x90\x2b\x8c\xfa\xbd\x2c\x21\xfa\x3d\x2a\x10\xe9\xbf\x9e\xa5\xe5\x47\x3a\xe2\x50\xc9\x16\x05\x09\x97\x26\x78\xf9\xa7\x40\xe6\xca\xdb\x3b\x52\xf5\x02\xfa\x61\x6c\xff\xae\x1d\xef\x89\x3d\x54\xe4\x1e\x54\xd3\x26\x46\x4c\x9f\x43\x5c\x63\x50\x5f\xb1\x5e\x3e\xea\xf5\x02\x1c\x65\xdc\xd0\x10\xf8\x40\xaa\xb3\x17\xc8\x60\x5d\xfb\x1a\x0c\x8a\x3d\x55\x49\x86\x1b\x69\xaf\x2c\x93\xd8\x6c\x98\x1d\xf3\xa5\x1c\x5b\xf5\x78\x5c\x2f\x85\x26\x10\xe4\x4f\xa4\xff\x1c\x71\x61\x15\x2e\x56\x18\x38\x47\x44\xfe\x83\xba\xbf\x0b\xcb\x75\x61\x78\x9a\x02\x31\x25\xf6\x24\x2a\x18\x3c\xac\x95\x49\xc9\x32\x73\x3a\x86\x8a\xa1\x82\x65\x6e\x2b\xa0\xa8\xc0\xbe\x10\x69\x96\xa8\x5c\xeb\xf1\xbd\xad\x12\x3b\x98\x2b\x4e\x05\x55\x10\x87\x94\x82\x02\x1d\xae\xa9\xd8\xf2\x6c\x58\x8e\x6c\xd1\x01\x26\xcb\x31\x96\x88\x03\x56\xbe\xe8\xf2\x98\xbc\xa3\x06\xec\x56\x99\xc7\x57\x6b\x76\x50\x87\xc2\x53\xa6\x02\x14\x01\x0c\x6e\xd7\x0d\x87\x1c\xfc\x87\x38\x01\x8a\x0e\xdb\x57\xf1\x06\xb4\x21\x8d\x85\x5e\xab\x2c\x91\xf3\x9f\x85\x8b\x3f\x25\x90\x56\x31\xa0\xee\xe2\x98\x56\xfd\x34\xf7\xb8\xc9\xba\x51\xc1\xc4\xc6\xa7\x35\xd6\xc7\xa1\x3d\x22\x0d\x7a\x56\x6c\x3f\x50\x6c\x72\xbc\x74\x17\xab\x37\xf0\xd6\xd7\x96\xff\xc7\x1d\xf9\xdc\x7c\x6e\x13\x7d\xa5\x6b\x7a\x3e\x10\xcf\x0b\x1a\xbb\x3f\xfb\x70\xbc\x66\x29\x3b\x5d\x75\xb4\x05\xed\x8b\xec\x0d\x6f\xcd\x06\x92\x5c\x38\x11\x68\xac\x18\x8d\x0b\x8a\x1a\xf0\x83\x9f\x5b\xde\x84\x3b\x69\x91\xe5\xa5\xd6\xcd\x66\xfe\x6b\x0f\xde\x86\x7c\x08\x6e\xd4\x38\x76\x91\x9a\x1b\x72\x33\xd8\xd7\xe1\xd2\x74\x2f\x61\xc7\x7d\x8e\x59\x91\x68\x9c\x83\x28\x67\x66\x55\xb7\x6a\x37\x50\x56\x0e\x75\xd1\xc7\xe8\x5e\x3c\x00\x85\x05\x93\x31\x09\x4b\xba\x57\x10\x03\x2c\xf6\x79\xa5\x25\xc7\x8b\x31\x70\x0e\x6d\x91\xf7\x52\x94\xc4\x22\x48\x92\x97\xe1\x73\x59\x43\xe4\x17\xfc\xd3\x55\x80\x58\x2f\xdd\x02\x39\xb5\x11\x46\x53\x0c\xc0\x9d\x83\xb2\x8f\x0a\x1d\x64\x22\x20\xdf\xb9\x9b\xad\x62\xf3\x95\x41\x03\x50\x81\xd6\x5d\x77\x8d\xdf\x32\x39\xba\x0e\x6f\xa9\x91\x4b\x17\xb3\x97\xa5\x34\xcb\x8f\xd3\xb4\xff\x42\xa8\xd8\xc8\xee\x66\x15\x3f\xbb\x1f\xf0\xfa\x54\xf7\xbd\x03\x27\x85\x16\xe6\x34\x1a\xf8\x0f\xcd\x1f\xce\xe7\x0c\x35\x9d\x20\x53\x68\xac\x49\x0d\x75\xa3\x54\x51\x2d\xa4\x6b\xa7\x63\x4c\x15\xb2\x84\xb2\x44\x77\x80\x8f\x17\x63\x33\x60\xa4\xb4\x9f\xb3\xbc\xaa\x84\x18\x41\xcf\x92\x41\x7e\xb2\x4c\xe4\x82\xd5\xa2\x4b\xfd\x2d\xac\x37\x22\x31\xda\x53\x9a\x05\x42\x00\x02\xff\x7a\x20\xc4\x76\x09\x7d\xa0\x6f\x59\xf0\x33\x14\xe6\x05\x9f\xad\x88\xc5\x0c\x3b\xaa\xc0\x3c\xef\xa7\xcd\x82\x11\xd2\x46\x1b\x16\x60\xea\x6b\xcf\x47\x68\x38\xc9\x1a\x10\x07\x4e\xb4\xb4\x0e\x6e\x97\x4a\x94\x5a\x67\xf6\xee\x69\x04\x23\x1e\xf0\x41\x88\xf1\xea\xd5\xba\xf3\x56\x94\xef\xe3\x01\xed\xc7\xe8\x66\xda\x23\xb5\xa6\xc5\x8f\x01\xb2\xa5\x2c\xf3\xab\x80\x5e\xdc\x5c\x13\x68\x62\x6b\x95\xb9\x4e\xb4\x64\x5b\x69\x3e\xc8\x80\xf2\xb8\x11\x7a\x69\x3a\xfb\xdc\xd2\x48\x24\x31\x89\x0f\x41\x0b\xc5\x80\x53\x0f\xef\x37\x58\x79\xc2\xe4\x60\x49\xca\x89\x1a\x2c\x3e\xcd\x60\x43\xae\x80\xd8\xaf\x34\x66\x34\x67\x4c\x6d\xfe\x90\x59\x97\xde\x5d\x05\xd6\x20\x09\xee\xed\x27\x75\x02\xfb\x5a\x5a\x31\x55\xee\xee\xb6\x73\x48\xb6\x0d\x89\xa3\x4a\x78\x12\x63\x9f\x54\x1f\xfe"}, +{{0xd1,0xb3,0x43,0x0d,0x4e,0x63,0xaa,0xbf,0xa9,0xef,0x96,0xbc,0xba,0xf1,0xfa,0x6a,0x9e,0xb5,0x21,0x9d,0xd4,0x4d,0xf3,0xb1,0xa6,0x15,0x63,0xdf,0xfe,0x1c,0xcb,0x28,},{0xc2,0x8a,0x05,0x19,0x52,0x45,0x29,0x0e,0xcd,0x38,0x53,0x55,0x85,0xce,0x51,0xf3,0xc2,0x35,0xc5,0xd6,0x50,0xc8,0xc5,0x7c,0x2f,0x79,0xbb,0x0a,0xc0,0xe8,0x08,0x34,},{0x4c,0xb6,0xff,0x5d,0xd7,0x06,0xb1,0xae,0x81,0x6c,0xdb,0xaf,0x9e,0x9e,0x1e,0xdc,0x80,0xa6,0x62,0x84,0xf9,0x46,0x52,0xd5,0x0e,0xc1,0x4e,0x28,0x3b,0x2a,0xdc,0x59,0x2f,0xd0,0x84,0x33,0x71,0x44,0xff,0xa7,0x12,0xdc,0x34,0xce,0x8e,0x61,0x06,0x68,0xa6,0x5e,0x96,0x9f,0x05,0xce,0xb5,0x47,0x86,0x30,0x4d,0x0d,0x58,0xd3,0x1a,0x08,},"\x07\x6c\x0c\x87\x62\xe4\xbc\x00\x3c\x36\x0a\x12\xa1\x95\x98\x05\x05\x51\xd1\x6b\x4b\x8d\xa0\xfb\x9c\x4a\xfc\xc8\x1a\xdb\xe6\x19\x95\xf2\x5c\xbc\x28\xdc\xa4\x20\xbf\xa9\x46\x10\x54\xd3\xee\x00\xad\x78\x18\x3e\x7f\x26\xdf\x68\x98\xaf\x9a\x4d\x22\x5f\xca\xb6\x7c\x04\x2e\x9a\x13\x52\x5d\x1f\x75\xff\x0e\x3d\x8d\xa8\x08\x96\xb7\x28\xf3\xe2\xdb\x65\x94\x4a\xe0\x71\x7d\x77\x59\x90\xb5\x9e\x5b\x70\x43\x4b\xd4\xb3\xee\x45\x2f\x10\xac\x06\x10\x57\x0b\x38\x22\x08\x32\x96\x8f\x54\x4d\x3e\x4d\x11\x9b\x1d\x4b\x50\x15\xc6\xcd\xf4\xcf\x22\x0b\x56\xb5\xc0\xcc\xd8\xe3\x98\xd5\xe4\xa5\x8d\xa3\xb0\xe2\xb2\x70\xa5\xd3\x9b\x82\xab\xb7\xf9\xd2\x7a\x41\x90\x18\x55\x0b\x62\x00\xae\x51\xc8\x48\x82\xf0\x86\xae\x7e\xa5\x35\x16\x71\xb6\xdd\x96\x09\x23\xad\x6b\xef\xc1\x34\x09\x87\x9a\x8d\xf6\x19\xbd\xf6\xc8\x8a\x6f\xe1\xec\xc0\xf0\xf3\xaa\x21\x9f\xb6\x19\x02\xbe\x48\xa5\x3d\xf2\xbc\x66\xc5\x6f\x1c\x1d\x17\xf7\xe6\x16\x7d\x25\x51\x65\xf1\x74\xba\xa9\xca\xf5\x3c\x73\xcb\xbb\x7c\xc2\xc7\xc0\x87\xf4\x3a\xbe\x2a\xed\x5a\x21\xfe\x42\x90\xb8\xd6\x79\x60\xa8\xa9\xcb\xc2\xa5\x7a\xbe\x22\x65\x4d\xc1\x84\xcf\xf9\x16\x8b\xb6\x97\x27\x03\x75\xfe\x88\xd5\xc4\x9c\xf9\x5b\x06\xcf\x9d\x0d\xac\x81\xfb\xd9\xc0\xd7\xb8\x2d\x05\xed\x2c\x3f\xd4\x9c\xcc\x29\x40\x44\x41\x71\x25\x45\xf9\xa9\x91\xe4\xf0\xdd\xb6\x21\x90\x83\x82\x96\xf9\x67\x29\x9a\x38\x60\x72\x26\xd8\xa6\x81\xf0\xa8\xf3\xc4\x38\x4f\xd1\x8b\x30\x25\x7c\x46\x3c\x0a\xbd\x0f\x4f\x6f\x12\x25\xa5\x1b\x76\x2d\x6d\x0a\xc7\xd5\x9c\xd2\xef\xd6\x98\xb8\xd1\x3e\x23\xd7\x04\x09\xf6\xb0\x7d\x69\x5c\x16\x71\xcd\x6f\x59\x44\x3b\x1d\xb0\xab\x35\xb9\xdc\x06\x40\xe4\xc6\xd1\xac\x50\x47\x5d\x28\xef\x94\xf8\x17\x90\xe2\xe5\xb2\x54\x55\x14\xb2\xa4\x9c\x5c\x21\x53\x45\x9b\xe5\x40\x89\x0f\x53\xbc\x18\xe4\xa1\x6d\xcb\x5d\xcf\x50\xf3\x7a\x95\xc6\x06\xfd\xf4\x85\x98\xe5\x2a\xf3\x17\x9a\x20\x48\x61\x5d\x93\xd9\x7e\x05\x99\xb7\x08\x8c\x11\x74\xbb\x9f\x15\xe3\x70\x18\xf9\x9a\xcb\xce\x5b\x13\x02\xf8\xd8\xce\x2a\xb8\x54\x37\xfe\xeb\x0c\xaa\x77\x84\xdc\x83\xc9\xe7\xc3\x6f\xe0\x59\x90\x6b\x03\x0a\x86\xa3\xde\xd0\xab\x9d\x8b\x73\x52\x9d\x47\x5e\x66\x1a\x08\x08\xd6\xd3\xf0\x90\x7f\x85\x28\x87\x3f\x08\xd5\x74\x8b\xe1\xd6\x97\x12\xe8\x52\x62\xd7\x7b\xdf\x13\xbf\xd1\x8a\x5c\xde\x6f\x71\x46\x26\x73\xab\x29\xb1\x61\x73\x15\xa9\xa6\xe9\x36\xa8\xe8\x1a\x8e\x43\xbd\x0f\x66\x44\xa5\xc6\x9e\xaa\xac\x89\xbd\xaa\x99\xcc\xa8\x03\x83\x37\x05\xe5\xaf\xa6\x9b\x3b\xd1\xd0\x25\x2b\x85\x46\x50\xf2\x19\x97\x91\xe6\xac\xa7\xc7\x5a\x86\x12\x83\x21\x62\x33\xa2\x63\x3a\x6a\xef\xf9\xd3\x01\xee\x5c\xb4\xdd\x72\xc0\x8a\x45\xcd\xae\x8f\x54\x58\xc0\x95\xb2\x2e\x75\x9c\x43\xb4\x9b\x98\xe9\xf4\xcb\x33\xd5\xde\xa8\x79\x44\x9e\xae\x73\xcb\x87\x4c\x73\x59\x43\x25\xeb\xf6\x8c\x1e\xd4\x06\x4b\x6f\x61\xab\x2f\x01\x4a\x2f\x19\xf3\x2e\x12\xb3\x3c\x5e\xaa\x8a\x29\x20\x4d\x5e\xba\x58\xdc\x07\x50\x72\xfe\x39\x9b\xe7\xd1\xab\x18\x08\x20\x8f\xb4\x08\x12\x3b\xdc\x0b\x4a\xb3\x13\x0f\x9f\x70\x6d\xc3\xeb\x19\x4b\x60\x5e\x73\xa3\x2f\x12\x5a\xe4\x91\x28\x5c\xe6\x03\x9f\xb6\x23\xc3\x8b\x81\xd5\xab\xa0\xf5\x59\x9f\x6c\x86\xe8\x72\x48\x6b\x4e\x96\x49\xda\xff\xe3\xa3\xd0\x6c\xb0\x73\xdd\x3b\xc6\xf4\xe1\x0a\x18\x70\x0e\x45\x72\x2d\x78\xa6\xb0\x97\x2d\xc9\x4d\x5c\x7a\x7b\x66\x41\x75\x7b\x79\x60\x75\x71\x9d\x7b\x8e\xc3\x6a\x1e\x79\x6f\xb5\xf8\xfe\x6f\x1b\x79\xa0\x85\x9c\xb4\xd6\x7c\xec\x05\xed\x91\x4c\xfa\x32\xc1\xdd\xfe\x21\x8e\xf9\x63\x43\x6c\x3a\x11\x48\xac\x2c\xf9\x09\xdf\x73\x59\x89\x06\x57\x46\x3a\x4e\xa2\x5f\xed\x59\x61\x8a\x06\x81\xa1\x21\x7e\x22\xd6\x4e\xf9\xd9\xb4\x55\x9d\x0a\x0f\x6b\x3c\xe8\xd8\x47\x93\x0b\x23\x23\x01\xca\xf4\x4c\xdf\x7a\x3f\x18\xa2\xac\x13\x0b\x92\xcf\xd9\xc0\x33\x60\x55\x7b\x5f\x7c\x47\x75\x46\x2a\x10\x71\xf7\x03\x44\xc7\x18\x37\x4b"}, +{{0x03,0x3e,0x00,0x3d,0x7a,0xab,0x7b,0xc7,0xfc,0x8a,0xc2,0x04,0xc7,0x33,0x79,0x9a,0xe5,0x53,0xc3,0xfe,0xc5,0x3f,0x10,0xdb,0xf7,0x95,0xb5,0xf4,0xb8,0x7f,0x1c,0x95,},{0x68,0x2f,0x46,0xf5,0xc0,0x56,0xdd,0x45,0xba,0x0b,0x5a,0x78,0x20,0x31,0xf9,0x59,0x6a,0x73,0xaa,0x29,0x2c,0xa2,0x32,0x6b,0xed,0xa7,0x4a,0x52,0xfc,0x32,0xb7,0x16,},{0xed,0xb4,0xe0,0x20,0xd6,0x76,0xfa,0xc6,0xa8,0x45,0x53,0x48,0x80,0xbf,0x61,0x36,0x37,0x4a,0x8b,0x7f,0x2c,0x53,0x85,0xbb,0x9e,0xe2,0x25,0x38,0x1f,0x49,0x4e,0xfb,0x74,0xa5,0x5b,0x41,0x3a,0xe0,0xea,0x70,0xad,0xd6,0x1b,0xfd,0xfb,0x87,0xfb,0x42,0xd5,0xbc,0x0c,0x53,0x59,0xdd,0xdd,0x57,0x3d,0x53,0x8a,0xe9,0x3a,0x6b,0x36,0x09,},"\x59\x6a\xa2\xc4\x0b\x33\x18\x87\x89\x38\xeb\xc1\x38\xdb\x27\x4b\xb3\x8a\x52\x01\xeb\x7c\xaf\x87\x5e\x6c\x64\x57\x91\xda\xe0\x12\xbd\xef\xd4\x85\xe6\xbd\x9d\x84\x99\xc4\x2a\x2a\xe8\x6c\xf3\x2b\x18\x00\x2e\x76\xbb\x58\x2c\xca\x0d\xec\x48\x15\xde\xd8\xa1\x21\x1f\x8f\xc8\x85\x7f\xce\x1d\x57\xf6\x15\x1d\x88\x78\x7b\x97\x8f\xab\x56\xbf\x92\x6b\x15\x33\xe1\x94\x99\xe8\xbb\x99\x15\x8c\xdd\x6e\x98\x0f\x6b\xa5\x43\xae\x83\x1f\x9d\xd1\x34\xb0\xfe\x6d\x5c\x24\x88\x7d\xc7\xa8\xd4\x78\x1d\xd9\xb7\xfc\x5d\xc9\x46\x4b\x04\x5c\xbf\x9d\x1e\xf5\x03\x6b\x5b\xf2\x8b\x54\x9a\xc7\xaa\x8f\xaf\xb9\x1a\xdc\x9f\xec\xa7\xa1\x45\x54\xd1\x10\xe3\x10\xc7\x49\xe4\x85\x33\xf3\x59\xc7\x0f\x05\xfb\x7a\xed\xef\x13\x66\x36\xb8\xef\x72\x23\x88\x65\x39\x86\x4e\xe5\x2d\x34\x11\x8b\x4b\x8b\x74\xe0\x8f\xe6\xb6\x58\x96\xe4\xb1\x9b\x6d\x7c\x3f\x25\x28\x26\x55\x85\x48\x17\x10\xd2\xd7\x49\x48\xeb\x4b\x17\x08\xa5\x0f\xa7\x40\x21\xbd\xa4\xb3\x61\xbc\x68\xd2\xa5\xd2\x02\x10\x9f\x8d\x28\xd8\xaa\x67\xd7\x8c\x11\x36\xcd\x2e\x90\x3c\x8d\xfa\x17\x5a\xf7\xbd\x96\x3b\x73\xda\xe4\x95\x87\x3c\xcd\xae\x62\xbf\xef\x88\x56\x36\xdd\x83\x55\x0f\xf9\xc0\x5c\x37\xba\x33\x89\xd1\x54\x36\x85\xd8\x94\x83\xb0\xc1\x04\xe7\xef\xbb\x77\x02\xc5\xa0\x39\x8a\xc7\x20\x48\x4c\x50\x93\x68\x35\xee\x9d\xf2\x53\xf0\xef\x8c\xbe\xf3\xe0\x7d\xe9\x69\x51\x1c\xcb\xf8\x75\x57\x49\x3a\x0b\x97\x2e\xf0\xe8\xe6\x29\xcf\x38\x22\xdb\x21\x28\x6e\xd7\x27\x66\x1b\xd3\x17\x86\xfc\xa1\x42\x11\x06\xda\xcd\xee\x1c\xaa\xf4\x94\x54\xe8\x54\x79\x4f\x70\x4d\x22\xa9\x5a\x4c\x8e\x6b\x1c\x2f\xee\xa5\x7e\x56\x23\x8c\x20\x96\xf1\xcc\x57\x86\x47\xfe\xa5\x44\xd6\x76\x44\x82\xbd\xf5\x14\x88\x79\xa2\x5f\x94\x3d\xb1\x6f\x29\x02\x1b\x9e\xcf\xe3\xe0\x90\xb4\x25\xc8\x1c\x70\x09\x84\x2e\x1c\x7a\x02\xd9\x1c\xa6\x0c\x12\x01\xc3\xbd\xae\x9c\x53\x73\xaf\x03\xf2\xf4\xdb\xef\x40\xde\x8d\x9b\x21\xfe\xd6\x8d\xee\x51\x0d\xe0\x42\x72\x34\xca\xa1\xc2\x0a\x3a\xe5\x49\x95\x48\x34\xc9\x33\x73\xd9\x13\xb8\x75\x0f\x23\xa0\x37\x80\xd7\xa9\x45\x4e\xd6\xfe\x51\xfd\x2d\x27\x6b\x9d\x4a\xa3\x2d\xe0\x5e\x03\x81\x6e\x64\xe9\x46\x6f\x4f\x0e\x22\x46\x51\x42\x8d\x34\x2c\xbc\xc6\x97\x17\x0a\x47\xef\x99\x6b\xda\xcb\xce\x91\x11\x7c\xa1\xf8\x45\x5b\x25\xb2\xb0\x84\x43\xe9\x91\x4e\x3d\x90\xc4\x89\xee\xaa\x77\x31\xdd\xea\x21\x23\xd5\x5d\x67\xb1\x66\x83\xfb\x7c\x82\x36\xaa\xa5\xa1\xb0\xfc\xaf\x8d\x17\x00\x11\xdb\xe9\xaa\x28\x57\xbe\x61\x2c\xbb\x85\xef\x69\xe5\x68\x31\xb4\xda\xcf\xbc\x7a\x59\xb4\x65\xa6\x6d\xc7\x41\x2d\xdb\x3d\x6a\xf4\xeb\xfd\x70\x58\x64\xe7\xd4\xfb\x99\xa6\xcc\xb4\x8b\x11\x83\x68\xfe\xab\x02\xa3\x40\xc4\x32\x76\x8d\xe0\xe0\x67\x87\x1e\x9e\xa8\x08\xd6\xd9\x93\x81\x58\x29\xe7\x1f\x6c\x04\x2b\x66\x49\x95\x09\x8f\xee\x94\xd5\x43\xdf\x15\xe5\xb1\x69\x57\x03\x1b\xd2\x38\xbc\xad\xbb\xdc\xc5\x76\xaf\xfb\x64\x03\x03\xd6\x9c\x5b\x25\x0b\x3a\x53\x9a\xfd\x12\x7f\x7e\xe2\x60\x9e\x52\xe5\x15\x4f\xbd\xff\x3e\x45\xf9\xc4\x40\x66\x65\x6d\x56\x1e\x0f\x64\xdf\xf2\x80\x5d\xf8\x8e\x30\xa3\x80\x53\x08\x22\x41\x3a\x7a\xb7\x6a\x1b\x9a\x86\x53\x78\xd2\x47\x63\x06\x9a\x81\x40\x02\xa9\xa9\xd0\x37\x95\xca\x8d\x2b\x5b\xd1\x09\x03\x93\xe9\xe4\xb1\xff\x7d\x7f\x0e\xb8\x4e\x71\x2a\x01\x8f\x68\xc9\xe3\x84\xf0\xa0\xae\xf3\x96\x78\x79\x28\x4f\x40\x9e\x30\xd2\x36\x50\x86\xe6\x69\x52\x27\x8c\xa9\xb6\xf9\x0e\x8f\x69\xa4\x8d\x9b\x28\xbb\x4c\x4e\xd6\x32\xab\xca\x3a\xf4\x14\x4d\xa7\x42\x2b\xf5\x19\x92\xf7\x34\x73\x14\x53\xc7\xa3\x3e\x15\xe5\x9f\x53\x08\x12\x9d\x6a\x77\x4a\x94\x58\x6f\x72\x33\x11\x17\x91\x76\xc0\x94\x8f\xff\x4e\x30\xc1\xb9\x59\x81\x2c\xac\x97\x7c\xc7\x43\x47\xb0\x07\x94\x0f\x2f\xb9\x62\xa9\x0d\x66\x06\x6a\x6d\xe8\x80\x19\x84\xde\xe4\xa5\x32\xd4\xb0\xac\xd6\xdc\xaf\x06\x72\x7b\xab\x70\xb3\x86\x62\x32\x23\x4c\x91\x00\xbf\xdc\x66\x9f\x77\xca\x49"}, +{{0xee,0x55,0xfc,0xf7,0x0a,0x27,0x5c,0x72,0x6b,0xd4,0x85,0x66,0x83,0xb3,0x47,0xde,0xcf,0xd4,0x22,0xf1,0x82,0x6c,0x07,0xa9,0x32,0xcb,0x85,0xbe,0x9f,0xa4,0xef,0x3c,},{0xdf,0xcf,0xfb,0x5e,0x15,0x53,0x78,0x9d,0x56,0xa9,0xf3,0x91,0x4b,0xce,0x50,0x0d,0x07,0xc5,0xac,0x31,0x1f,0x92,0x78,0x54,0xb2,0xcf,0x1e,0x58,0x33,0xc0,0x32,0x37,},{0x9d,0x8c,0xb2,0xea,0xf3,0xff,0x3e,0x0c,0x2b,0xc6,0x72,0xe1,0xd2,0x55,0xc5,0xb8,0xe8,0x07,0x31,0xbf,0xf6,0xf6,0xab,0xa5,0x17,0xe1,0x33,0x54,0xe8,0x51,0x08,0x0f,0x4a,0x8b,0xb8,0x12,0x1b,0x26,0x24,0x24,0x4c,0x9e,0xe9,0x5c,0x8a,0x09,0x2f,0x10,0x37,0x03,0xfb,0xe6,0x6f,0x9c,0xba,0x10,0x0d,0x2e,0x91,0xed,0x77,0x4a,0xc9,0x07,},"\xb8\xc8\x45\xcf\x7c\x54\x85\xf0\x62\x2d\x1d\xdc\x17\xf7\xa0\xf6\xf0\xfd\x70\x74\xfe\x19\x4b\x0e\x0c\xd4\x26\x50\xcf\xc8\x17\xf5\x7f\x09\x5f\x8c\xdf\xad\x1e\xbe\x0d\xfb\xc1\xbd\x76\x17\xab\x4f\x20\x4e\x9d\x55\xd8\x1a\x7c\x8a\x43\x39\x40\xec\x6f\x17\xc8\xa8\xe3\xd5\x6c\x1a\xfb\x0a\xf3\x74\xbd\x32\xd5\x4e\xf7\x13\x2d\x26\xb8\x9c\x47\x0c\x2a\xb5\xbe\x16\xfa\xbb\x4c\x75\x19\x3d\x6d\xa5\x9b\xa2\xfd\x15\x7e\x9e\xa4\xe0\xc5\xc0\x8a\x52\x02\xf5\xed\xc6\xa6\x17\x01\xf0\x8b\xb3\x44\xca\x64\x55\xd7\x5d\x14\x5a\xdb\x24\x4c\x53\x4c\x8c\xfc\x62\x3f\x4d\x4b\x67\x67\x59\x4b\x39\xa7\x69\x0b\xee\xec\x4d\xf9\x74\x6a\x57\xff\xee\x05\x14\x54\xc4\x27\x8e\xa4\x3c\x81\x0f\xf1\x3c\xd7\x69\x61\x5f\x9d\x05\xd4\xfe\x4a\x51\x58\x3e\x80\xc0\x15\xdc\xfe\xd9\xaf\x05\xf9\x3d\x05\x4d\x34\xff\xd9\x39\xbd\xd8\xf0\x51\x8f\xa3\x03\x0a\x96\x4d\xc9\xd8\x0d\xf0\x0f\x16\x35\x82\x40\x72\xcd\xf2\x9b\xc8\x02\x59\x20\x9d\x50\xf5\x6f\xca\x9f\xbd\x6a\xe1\x51\x4a\x67\x19\x89\xce\xa4\xf6\x84\x6b\xc1\x91\x79\x09\x7c\xca\x40\xc6\x24\xd7\xed\xbf\x91\xfb\x5b\x25\x39\xeb\xbd\x50\x2d\x36\x46\x71\x14\x30\xba\xe4\x23\xfd\x11\x58\x48\x09\x33\x18\xb7\xd0\x87\xef\x1e\x3b\x89\x4b\xc3\xb9\xea\x27\xaf\x85\x3f\xca\x85\x95\xd3\x6f\xb7\x29\x99\x69\x16\x2f\x2e\xd6\xa2\xb5\x50\x75\xb2\xc6\x30\x80\x28\x57\x17\x6d\xec\x4c\xb5\xac\xf2\xb1\x3a\x35\xa9\x94\x9b\x91\x2b\xb5\x7d\x81\xeb\x0c\x8a\x8a\xdf\x3c\xf6\x4c\xb5\x71\xbf\x5f\x3d\x71\xf9\x87\xd6\x4d\x74\xe9\x19\xa0\x03\x36\xe5\x7d\x35\xee\x4e\xec\xfc\x65\x70\x00\xdd\x5b\x12\x99\x5e\xe1\xb1\x16\x59\x1c\xe5\x8e\x56\xde\x25\xb2\x9c\x94\x82\x9d\x1d\x68\x52\x1b\x95\x58\xe4\x72\x5e\xc7\x70\x39\x06\x9c\x0c\xd1\x7b\x2a\x00\x33\x59\xe9\xe1\xe1\x12\xc7\x59\x01\x76\xce\xbc\xe7\xf0\x01\xf1\xd1\x36\xe8\x18\xf4\x81\x8c\xfd\x94\x74\x5a\xfa\xab\x56\xf1\xa4\x06\xf9\x7d\xd9\xe6\x1b\x73\x52\x66\xd6\x82\xad\x7d\xf2\x6d\xd7\x0c\xde\x0b\x57\xfe\xa7\xdb\x2d\xf8\x32\xfa\x88\xa3\x5f\x53\x97\x94\x88\x4d\xdc\x41\x21\x84\x03\x01\x6c\xb6\xd5\x22\x1f\x3f\xeb\x5d\x3a\xee\x4a\x98\x40\xa9\x13\x07\x2d\x29\xf8\xd1\xa9\x36\x7b\xb0\xbb\xf5\x45\xf7\xda\xe7\xc0\x0a\x0d\x0c\x03\x42\x23\x1a\xe4\x62\xbb\x74\x2e\x14\x98\xee\x58\x4a\xe6\xc8\x3f\x2f\x1f\x2d\x04\x52\xbe\xad\x98\x22\x68\xcd\x3c\xfd\xe7\x8f\xf4\x22\xe2\x26\xbf\x7b\x2a\xf1\x13\x77\x57\x79\x7f\xb0\x2e\x52\x75\xc3\x48\x09\xd5\x4c\xa9\xee\x2a\x65\x27\x5e\x6e\x5c\xff\xdd\x20\xad\x1f\xa1\xee\x0b\xd8\xb2\x1e\x04\xce\x82\x9e\x02\xcd\xb6\x3c\x48\xbf\xcd\xd8\x6d\x3a\x08\xc5\x97\x89\xc9\xd7\x8e\x36\x18\x1d\xef\xeb\x72\x27\x10\x72\x75\xed\x6b\x5c\xcb\x12\x7c\xd7\x2b\x37\x4e\x17\xf5\xee\x0b\x5e\x47\xb4\xb3\xe1\x4a\x8e\xc6\xd8\x6b\xb7\x50\x71\x87\xf2\x8d\xb3\x2b\x3f\x3f\xa1\xca\x13\x44\x6f\xe5\x25\x3e\xe7\x83\x64\x5e\x79\x42\x72\x79\x9a\x86\x3b\x4f\xca\x99\xe4\x43\xcb\xaa\x05\xde\x3c\x50\xed\xf3\xd5\xcd\x7c\x10\x52\x9c\x6c\x09\xa0\xc1\x45\x34\x06\xac\x7e\xca\xfa\x9b\x3a\x1f\x36\x9d\x68\xf3\xc6\x18\xf5\x8e\xfc\x35\x9d\xf2\xf3\xfc\xd2\x47\x8b\x55\xa4\x1a\x11\xf2\x48\x7e\x7f\x70\xec\x29\x3b\x3e\xcc\xc7\x00\xef\x44\x4a\x33\xd1\xea\xe9\x84\x9c\x5b\x76\xd2\x9a\xfd\x5a\x23\x86\x1a\xef\x4f\x2a\x7b\xa3\xf6\x66\x30\x1f\xde\xb5\xd3\xd8\xf0\xdc\x9e\xe2\xe0\x14\xb2\x4c\x74\x65\xde\xe3\xc0\x96\x4e\xdd\x49\xed\x49\xed\xab\xb5\xca\x7a\xfb\x99\x57\x4d\x00\x1e\x58\x12\xa0\x85\x23\x1f\x24\x1b\x6b\x08\xc7\x3e\x80\xfb\x44\xbb\x2a\xdf\x55\x4f\x14\xfd\x6d\xce\x94\xa6\xf6\x36\x23\xd9\xc1\xde\xb4\x1a\xd1\x01\x65\x1a\x6b\x67\xae\x52\x34\xda\xae\x81\x97\x9f\xbd\x82\x33\x89\x64\x9a\x3b\x0a\x06\xc6\x8b\x80\x46\x8a\x99\x1d\x30\x07\x74\x87\x51\xfa\x69\x28\x1d\xb1\xb9\x4d\x6c\x16\x0a\x1c\xab\x50\x94\x3c\xdb\xb8\xde\xa5\x75\x09\x06\xb3\xc6\x59\x5b\xb5\x80\xde\xdb\xfa\xe5\x74\x64\xcc\x7a\x65\x1d\x4c\x51\xdb\xb5\xfa\x98\x05\x97\xd1\x76\x69"}, +{{0x49,0xc2,0x98,0xa2,0xdb,0x3d,0x25,0x89,0xc9,0xfe,0x16,0xa4,0xe5,0x71,0xe5,0xaa,0x23,0xcb,0xaa,0x77,0x7b,0x86,0x47,0x02,0x90,0xa3,0xed,0xa7,0xa5,0xd3,0xe9,0x6b,},{0xda,0xc5,0x23,0xd6,0x37,0x4c,0x8f,0xf1,0x5f,0xc4,0xdd,0xc7,0x13,0x71,0x5a,0xc3,0x5c,0xf5,0x54,0x7f,0xc1,0xb1,0xb2,0x64,0x6b,0x63,0xfb,0x41,0xa7,0xf2,0x16,0x21,},{0x2a,0x43,0x9c,0x73,0xc9,0x81,0x17,0xfb,0x29,0x52,0xe2,0xb1,0x61,0xf7,0xf3,0xb9,0x9e,0x7d,0x39,0xbc,0x69,0x7f,0x79,0x40,0x75,0xdb,0x7b,0x63,0x4d,0x29,0xf1,0xff,0x57,0x24,0xf6,0x77,0xf8,0x31,0x2a,0xd5,0x15,0xb0,0x97,0xcc,0xa9,0xdf,0xc3,0x0e,0x79,0xee,0x8a,0x7c,0x9d,0xd7,0x28,0xbd,0xd4,0x5d,0xf8,0x59,0xc7,0xbd,0xe3,0x0a,},"\x35\x82\xee\xb0\xd3\x71\xdf\x38\x5d\xe8\x8b\xaa\xd3\x80\xcb\x0c\xdb\x60\xea\xb2\xba\xeb\xb3\xc7\x98\x37\x75\x3d\x08\xe1\xcb\x78\xc0\xbd\x76\xdd\x11\x04\x45\x49\x56\xd5\x71\xce\xb7\xe6\xb5\x71\xa5\x23\x68\x35\xd7\x84\xb5\x0f\xf6\x60\x57\xb1\x35\x95\xe7\xd0\xc8\xf2\x5d\x08\xae\x8b\x54\xb6\x12\x3b\xa0\x81\x51\xac\x7d\xb0\xc5\x6a\x98\x0f\x7f\x0b\xb3\x9a\x54\xb4\x37\xf5\x48\x51\x97\x99\x86\xab\x13\x67\x83\x5e\x5c\x4f\x3a\x3b\x3d\x76\x0d\x38\x27\xe7\x6c\x56\x8a\xe7\xae\xbb\xb6\x12\xe7\x75\xbd\xde\xcc\xd3\x34\xac\x6b\xcd\x32\x53\xab\xc2\x9d\x4b\x7c\x3f\x10\x36\x26\x66\xf6\xae\x75\x08\x03\x70\xa3\x6c\xba\x55\xdb\x3a\x91\xcb\x57\x89\xe4\xd6\xf9\xef\xea\x4d\xf1\xdd\x77\x30\xa5\xe2\x79\x60\xd5\x3b\x51\x21\x94\x8c\xce\x5a\xf6\x53\xff\xf1\xd5\xb4\xe5\xb0\xa8\x8c\x71\x8c\x49\xb3\x1c\x79\x3d\x88\xc1\xcc\x45\xab\x8d\xa2\x9d\x05\xe9\x06\xcd\x05\x94\xb5\xf6\x63\x8c\x8e\xc3\xf1\x76\x0b\xa4\x23\xb5\xab\x1d\x08\xa5\x87\x70\xaf\xb0\xf1\x39\xab\xd3\x49\xc1\xbf\x16\x0d\x89\x02\x23\x9c\xe2\x4f\x19\xb4\xe1\xbe\x09\x5f\x7e\xd1\x65\xf3\x93\x1e\x3c\xbc\xc3\x07\xe9\xfc\x5c\x65\x80\x31\x22\x8e\x55\xcb\xbe\xec\x0d\x0b\xcf\x8f\x69\x51\x54\xa9\xee\xd1\xbe\xf3\x52\x28\x78\x9b\xfc\x0d\x23\x8b\x83\x72\xd3\x18\x32\x8c\x13\x39\xfe\xa0\x88\x14\xdb\x86\x21\xab\xca\x3a\xeb\x82\x09\x8b\x5a\xa8\x7b\xb9\x8f\x5e\x40\x52\x2a\x08\x88\x53\x2c\x17\x48\x45\x3d\xb2\xd2\xb3\x94\x3e\x4a\xbb\x31\x2d\xe3\x19\xae\xc4\x8c\xc1\xc9\x47\x75\x97\x29\x53\xfb\x64\x96\xb8\x16\x89\x37\x62\x35\x10\xcd\x48\xc8\xb2\x47\x95\x6d\x31\x68\x48\x6c\x17\x6a\xe7\xa4\xcb\x38\x4e\xac\xfd\xab\xfa\xdd\x9f\xba\x30\xa2\x3b\x81\x1b\xd7\x79\xf3\xcb\xa5\x43\x38\xc2\x8b\xb3\x38\x22\x38\xed\x3b\x8d\xd2\x1b\xea\xb2\xf5\xca\xde\x28\xc5\xe0\x9b\x31\xa4\x54\x80\x8a\x53\x48\x12\x2e\x3a\xe3\x81\x22\x96\xf7\x86\x9c\x38\x65\xc3\xc9\xd8\xfe\x18\xbd\x81\x2f\x2e\x60\xe9\x14\x97\x5c\xfe\x1b\xef\x8d\xbb\x80\x97\x00\x6f\x0d\x7c\xf3\xfc\x15\xeb\x95\xc2\x78\x54\xb1\x43\x12\xb8\x8d\x52\x80\x15\xaf\x69\xfb\x75\x05\xb8\xf3\x27\x03\xf6\x4e\xb1\xc9\x58\xf0\x46\xdd\x25\x12\x42\xf8\xbe\xa7\x46\x7f\xc7\x29\x1d\x09\x5e\x96\x96\xe1\x1a\xa4\x5a\xbe\x79\x24\xe8\x56\x35\x15\x35\xaa\x07\x73\xd3\xd9\xe6\x1c\xc9\xa2\xd8\x9b\x5b\x07\x74\xd7\x64\x5e\xe1\xaf\x7e\xb6\xfc\xd4\x40\xbc\x69\xd4\x3e\xde\xaa\xf9\x35\xfd\x2a\x52\x95\xac\x19\xa9\x7d\x70\xaf\x92\x98\x83\x0f\x81\xc0\xa5\x09\xf2\x42\xf4\x73\x37\x24\x78\xfa\x58\x79\xfb\x2c\xb8\x51\x10\x80\xfc\x2e\xcd\x82\x59\xb8\xc3\xce\x9e\x8b\x64\x07\x61\xdc\x79\x27\xc3\x2e\x7f\x5b\xae\x97\xa8\xb8\xac\x93\x56\x62\xe5\xf4\x5d\x14\xca\xd6\xd3\x4a\xff\xc9\xa1\x94\x14\xc4\x56\x6f\x45\xf9\x77\x39\x67\x10\x89\x4c\x53\x99\xed\x44\x80\xf1\x8e\x90\x95\x7f\xaa\x76\xcc\xb5\x12\xa2\xd0\x75\x73\x05\x8a\x95\xb4\x2f\xe1\x81\x02\x49\xd1\xc8\x5e\xc4\x31\xa0\x49\xd1\xae\xcb\x0f\x11\x83\x79\xbd\xc3\xf1\xee\x49\x0b\xc8\xa0\x54\xc3\x2c\x3d\xac\x76\x59\x96\x6c\xdb\x66\xf9\x95\xac\x40\x3d\x5e\x79\xeb\x6b\x25\xb3\xf3\xf6\x5a\x6c\xee\xc2\x20\xd6\x6c\x05\xf8\xa8\xa9\x8b\x80\x79\x9b\xa4\xf2\xc6\xdb\xbb\x4d\xfb\x58\x62\xc9\xa4\x6b\xca\x01\x3e\xbd\xfa\xba\x74\x94\xa3\x0c\xe1\x46\x06\xaf\xc0\xb0\xf9\x93\x14\x3f\xed\xee\x78\x96\xd9\xa6\xbb\x81\x49\x91\x66\xed\x02\xe9\x41\x86\xaa\xf3\x21\x87\xae\xb6\xe2\x82\x50\x1b\xca\x43\xb5\x7b\x7e\xfa\x09\x39\xc9\x34\xbc\x8f\xbb\xd2\x6c\x44\xb6\x18\x33\x5a\x35\xc6\x92\xff\x99\x6a\x5b\x95\xd3\x27\xdf\x9b\x2a\x66\x21\xb3\xb0\xf1\x90\xdb\x1f\x36\xd9\x11\xd1\xa6\x63\xa4\xeb\xf9\xa2\x85\x4b\xb4\xf4\x06\x10\x95\xb6\x98\x12\xc8\x2c\x2f\xfe\x3f\x92\xe9\xb4\x4d\x2e\xa6\x31\x69\x88\x1c\xae\x84\x53\xd6\xee\xf7\xcf\x69\xc2\x5a\x28\xb3\xf8\xdd\xc7\x01\x48\xef\x26\x72\x1a\x3c\x1f\x2e\x62\xd9\xd1\x0c\xea\x42\xfc\xa3\xfa\xcd\x74\x67\x3a\x4e\x7f\x33\x50\x73\x64\xaa\x28\x6c\x0f\x38\xd7"}, +{{0x82,0x3f,0x0c,0x29,0xfb,0xfd,0xd3,0xd1,0x82,0x8f,0x30,0x55,0xe9,0xec,0x01,0xff,0xd1,0xb5,0xa3,0x75,0x11,0x8d,0xdd,0x7e,0x4e,0x0c,0x43,0x71,0x9f,0x57,0x3f,0xf7,},{0x73,0x12,0x5f,0xc8,0x3a,0xbb,0x8b,0x7c,0x65,0x85,0x59,0xfc,0x12,0x73,0x93,0x23,0x1d,0x03,0xca,0x58,0x46,0xe0,0xc8,0x81,0x18,0xd1,0x3d,0x55,0xca,0x44,0x78,0x9d,},{0xfa,0x74,0x7b,0x6f,0xe3,0x38,0x1a,0xd6,0xbc,0x82,0xa9,0x56,0x43,0xc1,0xf4,0xa2,0x0b,0x76,0xba,0x73,0xbf,0xf0,0x0e,0x63,0x5d,0x64,0x20,0x2d,0x8b,0x0d,0xf0,0x3d,0xbc,0x56,0xb0,0x13,0x8b,0x3a,0x6d,0x41,0x98,0xff,0xaf,0x58,0xcc,0xd3,0xd3,0x88,0xed,0x25,0xeb,0xcf,0x77,0x04,0x43,0xe4,0x1e,0x9d,0x21,0x47,0x95,0x0a,0x30,0x0b,},"\x80\x2c\x39\xce\x7f\x2a\x50\xbd\x81\x62\x2a\xdd\x0d\xf4\xe0\xfe\x03\xec\x3d\x2d\x30\x5a\x45\xa6\x16\x52\x71\xed\x79\xad\xd2\x43\xb9\xa0\x0e\x52\x18\x31\x92\xfe\xb2\x4c\x4f\xdb\xd2\x2c\x80\x7a\xe1\x00\xef\xcf\x16\x5b\x9c\x99\x61\x94\xe0\x0f\xa8\x17\x76\x5e\xa9\x4a\x03\x07\x0e\x48\x66\x86\xb4\x45\xfc\xb2\x63\xcc\xfe\x1f\x58\x62\xf3\xb8\x4b\x10\xf3\x90\x08\x0b\xfc\xae\x44\x7a\xe0\x06\x97\x42\xb8\x61\x8f\xa9\x57\x5f\x7e\x63\x7a\xd5\x4e\x83\x4c\xaf\x03\x94\xd7\x45\x03\x2c\xe1\xe2\x55\xc0\x27\x32\x50\xf1\x50\x4b\x37\xa0\xad\xd9\x4a\xa2\x45\xc7\xde\x52\xc8\x0e\x05\xd6\xe0\xa9\x6a\x14\x41\x05\x43\x82\x6a\x49\xe9\xb9\x45\x62\x6d\x4e\x89\xf5\x50\x27\x16\x3d\x4b\xd6\xd0\xe9\xbd\x1a\x24\x77\xf6\x7d\x3d\x56\x68\xa4\x2e\x94\xd8\xb6\x11\x93\xd8\x21\xe0\xd1\xb2\x30\xfc\xad\xc5\x36\x13\xb7\x5b\x02\xcf\xb8\x15\x84\x56\x07\x7e\xbd\xf5\xa5\xf0\x0c\x3b\x5b\x18\x63\x70\xca\xfe\xc4\xa2\x1c\x69\xdc\xe1\xf0\x1e\xfe\xf2\x3c\x37\xab\x90\xf8\x58\x23\x8a\xef\xbe\x21\x2b\x55\x6d\x2f\x07\x34\x06\x55\x9f\x1a\x51\xd8\x4e\xff\xfd\xce\x07\xb0\x0d\x01\xbb\xf3\x37\x71\xcc\x12\xc9\x60\xac\x89\x36\x5a\x9c\x82\xc5\x23\x43\xf7\x60\x33\x81\xb8\x90\x23\xc1\xa6\xe7\x02\xa5\xb1\xe4\xbd\x19\x1e\xa6\x97\x0b\x5e\xa4\x51\xea\x05\xb5\x9b\xf8\x3e\x55\xf2\x9a\x1f\x80\x32\x12\xbb\x2e\x58\xf0\x61\x63\x33\xd9\x11\x47\x08\x52\x9e\x8b\x6c\x60\x81\xde\xeb\x7c\x29\x9a\x5a\x2a\x53\xcc\xd2\x4e\xd5\x8f\xfb\xfe\x50\x3d\x80\x61\x4a\xdb\x05\xca\x11\xcf\x29\xde\xd0\x09\x04\xea\x12\x39\xf8\x2b\xa4\x0c\x79\x3e\xbc\x33\x97\x75\xf8\xb0\xfe\x39\x01\xf5\x48\x2e\x31\x0c\x79\x3c\x6e\x2c\xf0\x1d\xc1\x57\x72\x7a\xf2\x38\xf4\x9c\x98\x62\x80\x4b\x04\x75\x51\xfd\x88\x6f\x4a\x48\x99\xe2\x2a\x6a\x65\x70\x11\x17\xa3\x85\x80\x55\xbb\xfe\x96\x6e\x37\x0e\x73\x3e\x17\xef\xad\xa2\x85\x9f\xd8\xff\xa9\xe0\x1f\xce\x56\x06\xa2\x55\x36\x76\x78\xf4\xbd\x4e\x21\xe5\xda\x0f\xef\x30\x75\x7f\x34\xe3\x89\xf7\x6b\x7d\x57\xc4\xe4\x10\xa0\x02\xe9\x00\xe4\x8f\xb2\x18\xc8\xf2\x77\x8f\x14\x8f\xee\x56\x96\x5f\x5b\x47\x3e\x25\x25\x6c\x23\xa7\xaf\x19\x83\x42\xcf\x3e\xf0\x2b\x84\xdf\x2c\xd5\x80\x0a\x46\x1c\x1b\x07\xbd\xa2\xf4\x26\x28\xa6\x8a\xd2\x9d\xbb\x82\xa4\x70\x96\x7d\x73\x02\xc9\x93\xb2\x34\x13\x6e\x5b\xf2\x55\xe6\x24\x8b\x10\x2c\x2b\xff\xb2\x01\x72\x37\x1f\x1c\xa3\xe1\x0b\x08\x10\xe8\x64\x95\x03\x54\x6d\x9a\x73\x1c\xf1\x9b\x08\x33\x57\xd4\xcf\xec\xc8\x9b\xed\xb5\x35\x06\xfe\x19\x9b\x67\x03\x91\xa6\x20\x06\x9a\x30\x81\xf2\x53\xb4\xd7\x90\x88\x0a\xa2\x3b\x53\xe9\x7c\x75\xdc\x0c\x36\x05\x40\xe5\xb0\xa3\xef\xb1\xac\xcf\xfd\x13\x74\x14\xff\x84\x23\xd5\x46\x46\xfc\x56\xba\x5f\x53\xbd\x84\xc7\x26\x7c\x2f\x7e\xe3\xe3\x76\x07\x54\x41\x54\x36\x5f\x9f\x85\x08\x1d\xd7\xd2\xee\x75\xd3\x02\x27\x5c\x79\x9e\xf2\x42\x7c\xa6\x49\x63\x55\xdc\xda\x1d\x44\xe0\xd9\x77\xbf\x68\xdb\x30\x06\x50\x0a\xe3\xf4\x00\xd6\xa8\xc7\xcf\x47\x05\x7d\x4f\xc8\x7e\xee\xcb\x02\x11\x6b\x73\xee\xd6\xce\x1f\xcc\xef\x6e\x8f\xb8\xae\xa3\x63\xb2\xf6\xf5\x32\x2a\x5f\x07\x53\xf4\x58\x99\x53\x76\x46\xd5\x86\x51\xbe\x90\x37\xbf\x91\x42\x3c\x29\x86\xf5\xcc\x2b\xcb\xce\x4f\xae\xc9\x03\x49\x8b\x40\xfc\x2d\xea\xb6\x60\x3d\x6e\xea\x58\x5d\x27\x20\xd2\x1b\xb2\x72\x2b\xc0\x5b\x35\xae\xd2\xbc\xc0\xe8\x04\xfe\x9d\x23\x9f\xaf\xda\x7d\xda\xfe\x1d\x78\x60\xab\xb0\xfb\x28\xf4\xbf\x2b\x1f\xbb\x62\xa7\x86\xe4\x55\xbe\x02\x4b\x19\x3b\x78\x30\xbe\x0d\x55\x8f\x02\xc9\xf3\xae\x31\xdc\x10\x7e\xe9\x42\x1d\xc5\xf0\xb0\xf8\x94\x02\xb7\x1a\x45\x81\x40\x15\x36\xbc\x47\x30\x85\x06\xd9\x69\x39\xa2\x06\x36\x27\x44\xe2\x7d\xde\x94\x4f\x40\x96\xa1\x2b\x5f\x63\xda\xb6\x4d\x04\x14\x84\xd3\xfd\x91\xa6\x2c\x2f\x0e\xf9\xae\x78\x74\x22\xeb\x27\xfe\xd0\x80\x2e\x25\xf9\xbc\x77\x5c\x49\x15\xa8\x37\xfe\x3e\xb7\xb9\xd5\x84\x3e\x4d\x82\x10\xc6\xb4\x94\xb6\x12\x81\x63\x7a\x6b\xe3\x20\x52"}, +{{0x65,0x67,0x66,0x33,0x37,0x42,0x14,0xc4,0xac,0x4b,0x7b,0xce,0xa9,0xf1,0xcc,0x84,0xb1,0xb7,0xe7,0x94,0x11,0xe3,0x10,0x52,0x5a,0xce,0x38,0x5f,0x45,0x66,0xc1,0xd5,},{0x0e,0x6e,0xc5,0x80,0x1d,0x8b,0xd6,0xb1,0xeb,0x42,0x14,0x21,0xa1,0x40,0x8f,0x13,0x4c,0xf7,0x12,0x33,0x8e,0x0f,0xfc,0x24,0xcd,0xcc,0xdc,0x4f,0x7f,0xa3,0x1d,0xbe,},{0xe0,0xb8,0x67,0xc9,0xdb,0xda,0x35,0x32,0x34,0x33,0xc0,0x46,0xe0,0x83,0x0c,0x25,0x1b,0x43,0x46,0xc5,0x39,0x59,0x72,0x28,0x6b,0x3a,0x72,0x31,0x0e,0xd4,0x52,0x6e,0x54,0x5d,0xc0,0x9d,0x39,0x18,0xf2,0xeb,0x99,0x20,0xbc,0x9b,0x24,0x1e,0x90,0x50,0xd8,0x48,0xd3,0x83,0x02,0x88,0x65,0x15,0x91,0xf9,0x36,0xd3,0xba,0xe4,0x53,0x01,},"\x9d\x62\x2c\x20\x67\x87\x69\x40\x93\xc6\xf2\x9f\x93\x61\x9f\x21\xbb\x64\xc0\x39\x41\x6d\x20\xdc\x70\x8a\x08\x4a\x9d\x2e\x49\x0c\xf5\x65\x8e\x13\xd6\x2c\xb0\xd2\x1e\xab\x00\xe4\x2d\x85\x1b\xc6\xec\x75\xda\xf4\x05\xd2\x37\x32\x46\xee\xa4\x15\xe8\x66\x29\x1b\xab\xf7\x64\x97\x68\x0a\xaf\x04\x42\x5a\x42\x55\x2b\x10\x7d\x58\xcd\x18\x56\x1c\x8c\x94\x83\xf7\x40\x74\x4c\xbf\xa6\x05\x4c\x1b\x12\x6f\x5a\x76\x65\x9a\xc1\x9d\xdd\xad\x4a\xb5\xa0\x91\x55\xd8\xc0\x50\xb5\x35\x4e\x06\xa4\xdd\x3e\xe3\xa6\xf9\xc9\x1e\x8b\x4c\x7a\xf2\x74\x96\x64\xe7\xab\xe9\x70\x61\x58\x9e\x15\x3c\x58\xe2\x7c\xf2\x99\xa2\x5f\x2b\x53\x0c\x06\x07\x31\xec\x0f\x43\x66\xbd\x1d\xeb\xeb\x4d\x4e\x91\x2e\x76\xe5\x08\x53\x4d\x43\x3e\xc4\x8f\x96\xb6\x2e\x15\x0d\xe9\x39\x63\xa1\xb3\xe6\xc8\x09\x1b\x49\x5a\x96\x51\x8c\xe3\xd3\xb9\xa8\xdb\xdc\x2a\x13\xfd\xd0\x77\xf2\x23\x1d\xe8\xd7\x6f\x56\xd9\xab\x1c\x2f\x9e\xfa\xbc\xe4\x63\x83\x64\xf8\xfb\x2a\x2c\x68\x3c\xa8\x19\xb7\x03\xab\x45\x3b\x11\xd3\x7a\x69\xfa\x4b\xcb\x80\x23\x98\x08\x34\xf7\xb9\x02\xad\x18\x19\xfc\x02\x92\x12\xfd\xea\x0a\xbf\x11\xde\xc8\x8c\x55\xd6\x8e\xf8\x7a\x26\xdb\xb1\x5d\xc3\xd3\xdf\xbc\xdd\xdd\x5e\xd7\x1b\xe8\x6f\x32\xc7\x6e\xe2\x22\x1d\x92\x43\x68\x3d\xf9\x51\x65\x64\xb2\x6b\xab\x5c\x84\x5d\x4d\xfe\x0a\xdc\xc7\xcb\x9f\xe1\xee\x2c\x05\x1a\xf5\x90\x8c\xe0\xcc\x3a\x90\x90\x4d\xbc\x0d\x36\x80\xed\x49\x92\xf4\x6c\xe2\x5c\x2e\xe8\x51\xc4\x14\xf0\x18\x7d\x89\x3e\x5c\x3b\x01\x89\xa7\xbb\x68\x93\xd6\x83\xf5\xe3\x39\x4c\xc0\x46\x29\x9a\x16\xa1\xc1\xb5\x69\x59\x33\xa8\x9b\xb1\x30\x30\x85\x5b\x81\xb3\xc7\x46\x85\xf7\x19\xde\x01\x60\x57\x5a\x0f\xf0\xa9\x1f\xd9\x43\x47\xb8\xbc\xbe\x12\x5d\x1d\x3f\x9c\xe7\x72\xa8\x12\x6e\x00\xf5\x63\xb3\x18\x96\x56\xd5\x52\x2c\x18\x7a\xb8\x31\xa7\xad\xe7\xac\x06\xfd\xca\xc7\xf1\xd4\x58\x82\xe5\x1f\x9b\xf5\xb4\x4a\x2d\xab\xa4\xa5\x3d\xbb\x31\x97\x0b\x4a\x0f\x12\x72\xfe\x14\x08\x7e\x0c\x3c\x7e\x45\x42\x31\x2f\xe7\x4d\x76\x7f\x21\xe7\xea\x48\x7d\x52\x84\x28\x4f\x46\xf2\x0f\x32\xc5\xb1\x6e\x1e\x0a\xc8\xd7\x96\xab\x2f\x80\xb3\x44\xe7\xa8\xd8\x4d\x5d\xe8\x23\xa5\x08\x97\x75\x2d\xc5\x49\xa4\x8f\xc1\x0b\xcd\x43\x6a\x7a\x93\xe9\x7c\xd0\x5d\x78\x30\x13\x8f\x32\x38\x79\x68\x0c\x34\x3c\x16\x46\x7d\x26\x4d\x74\x9b\xf4\x5e\x40\xf3\x9f\xbc\x3a\x00\xc4\x3b\x00\x69\x3b\x01\x56\x76\x8f\xf2\xe3\xf8\xad\x9e\xb6\x40\x50\x22\xf5\xca\xda\x66\x94\xe8\xa3\x3c\xdc\x59\xc6\x67\x3c\x44\x11\x72\x44\xeb\x03\xfd\x7f\xd6\x75\x93\x0c\x29\x4e\xdd\x29\x40\xf5\xf1\x80\x95\x3d\x91\x0c\x55\x48\x5b\x20\x57\xae\x0c\x93\x02\xf4\xa8\xe8\x31\xa5\x53\x0e\x3c\xbb\xf6\xf4\x72\x22\x40\x83\xa9\x52\xa8\x39\x0a\xb0\x0d\xc0\xf6\x9d\xfd\x88\x0e\xea\x2d\x73\x9d\x21\x8d\x6a\x66\xf2\x37\xf1\x0d\x44\x01\xaa\x75\x8f\xf8\x12\x0c\x0a\xe2\x76\x61\x27\x84\x90\x24\xf5\xa4\xcc\x57\x4a\x5b\x02\xb9\x35\x96\x68\x12\xcd\x1f\xb6\xd7\x9d\x0c\x4f\x59\xff\x80\xf0\x35\xa0\xb1\x09\xcc\xcb\x22\xfb\x08\x53\x5b\x87\x41\x49\xed\xf2\xa0\x97\x0c\x14\x88\x84\x27\xd0\x7d\x1e\xaf\xa6\x84\xa6\xd3\x45\x4e\x49\xb2\x25\x18\x4c\x6b\x99\x3e\xc8\xdd\xb8\xb5\xa3\x5e\xe4\x5f\x87\xf6\x92\x66\xd4\x90\x96\xa3\x17\xd8\x6a\xde\x27\xf4\x52\x9f\xe7\x23\x64\xd0\xb9\x58\x00\x72\x99\xd9\xde\x87\xd6\xff\x9f\xb0\x4d\x57\x3a\xea\x46\xba\xc8\xeb\x76\x47\x52\xeb\x46\x5c\xaa\xab\xa6\x89\xa6\x46\x0c\x11\x07\x30\xbd\xd0\x8b\x16\x89\xde\x7b\x05\xde\x59\xaf\x9f\xe2\x44\xac\x36\x3e\x95\xc9\x8b\x66\x93\x59\xaf\x90\x31\xa3\xa9\x3b\xa6\x31\xab\xf1\xf6\x1d\x20\xef\x7f\xc6\x88\x3b\x48\x40\xfc\x92\x67\x12\xe1\x3d\x87\x4b\x72\x2f\x6a\x79\xb1\x60\x70\xc0\x31\x13\x25\xe9\xa7\x0f\xcd\x86\x91\x6c\xfa\x1d\xa7\xf9\xd0\x56\x3a\x22\xfe\x9b\xfe\x85\x4b\x0c\x18\x6c\x86\x63\xb0\x61\xb6\x5b\xc0\x71\xe8\x39\x93\x8d\x8f\xdd\x7c\xf8\xf6\x95\x2a\x64\x67\xfa\xd8\xe5\x84\x90\xed\x2b\x26\x81\x33\x01"}, +{{0xd2,0xed,0xed,0xcd,0x85,0x32,0x06,0xcb,0xf5,0x9b,0xd7,0x4a,0x25,0xa3,0x03,0xfa,0x2d,0x6c,0x39,0x36,0xbb,0x48,0xeb,0x42,0xf6,0xd9,0x00,0xcb,0xe8,0x07,0x72,0xbe,},{0x22,0x44,0x11,0x1e,0x2e,0x76,0x9e,0xab,0x81,0x87,0x1e,0x06,0xc5,0x80,0x17,0x8c,0x23,0x5c,0x7b,0xf4,0xa5,0x2d,0x2e,0xcc,0xe1,0x18,0x87,0xa9,0xb4,0x6c,0x45,0xc8,},{0xbe,0x3c,0x2b,0x56,0x7f,0xe8,0xc2,0x08,0xc9,0x8e,0x71,0x97,0x11,0x7e,0xb0,0x1b,0x3c,0x19,0x7b,0xdf,0xc8,0x58,0x56,0x2d,0xc5,0xcd,0x90,0xf8,0xe2,0xc0,0x35,0x70,0x42,0x30,0x39,0x95,0xba,0xba,0x2f,0x40,0xb7,0x34,0x5c,0x56,0xdb,0x0b,0x46,0x25,0x58,0x0a,0xa8,0xdc,0xc4,0x8d,0xf6,0x01,0x9d,0x23,0xa8,0x38,0xea,0x71,0x72,0x02,},"\x80\x70\xbc\x0d\xb0\x89\xa5\x92\x54\x46\x01\x9b\x7e\x40\x3c\x74\xec\x78\x90\x3e\x4b\xd5\x4b\xc1\xd0\x8a\x54\xa6\xf0\xed\x75\xa8\x5b\x76\x3f\xf5\x4d\xc3\x3a\x26\x00\xcc\xb4\x57\xfd\xba\xea\xe5\x48\x47\x7f\x6d\x69\x47\xae\x26\xde\xb7\x1e\xac\xd1\xd2\xd6\x22\x82\xa0\x83\x84\x3b\xe4\xe5\x93\x1d\x91\xc9\x3b\x62\x82\xc5\x88\x07\xce\x8f\x0d\x88\x0b\x14\x38\xda\xd8\xfd\xcb\xa8\x61\x2d\xf7\x3b\x9f\xaf\xf3\xa9\xf7\xdb\x30\x05\x25\x05\x36\xaa\xbd\x98\xae\x02\x7a\x89\x5e\x10\xb5\xcb\x7b\x69\x87\x5c\x0f\x39\x93\xaf\x24\x51\x92\xf4\x39\x3e\x9c\x4d\x34\x05\x74\x6e\x31\x1d\x3a\x91\x44\x7f\xcd\xbd\x73\x06\xb6\x02\x0c\x93\x3b\xba\xb9\xe3\x9d\x13\x49\x16\x25\x03\x5c\x9c\x63\x6e\xfa\x17\x39\xc3\x58\x87\x10\xa8\x79\xd9\xe3\xce\x17\x64\x61\x6f\x10\x82\xe8\xdf\xf5\x75\x59\xc3\xf5\xa5\xd7\x6d\xd3\x01\x12\x4f\xa4\x89\xfb\x94\x9e\x9e\x03\x9d\xd4\x62\x1b\xda\x60\xf0\xb8\x6b\x31\x1e\x78\xed\x0a\xb3\xb5\x28\x96\x50\x44\xb2\x3d\x78\xee\x2f\x81\x06\x1f\x8e\xdb\xd6\x92\x99\x33\xd1\x8c\x02\x07\xde\xc4\xb5\xb6\xb2\xfa\x4a\xca\x27\x47\xcf\x5b\x11\x0d\xf0\x0b\x0c\x98\x27\xbd\xb3\xd9\xdb\x2c\x7b\x03\x28\xd4\x0d\x99\xe1\xf6\xb2\x28\xe4\x0d\xad\xae\x78\xae\xda\x02\x89\xb6\xa2\x3d\x4e\xb5\x83\x70\x88\xe5\xd8\x84\x13\x63\x2c\xcc\x22\xe2\x1a\x73\x76\x8c\x67\x32\x01\xe9\xa8\xd8\xdc\x6e\xb6\xf7\x39\x7f\xed\xbd\x39\x8d\x26\xf9\x69\x2c\xa7\x2f\x6d\x6c\xf0\x56\xaa\xac\x50\xac\x2f\x3b\x26\x6d\xbe\x5e\x7b\xe7\xa0\x24\x77\x45\x78\xea\xd5\x85\x24\x5d\xaa\xa7\x3e\x0a\xaf\x83\x3c\x07\x0b\xa4\xb2\x04\x4c\xcb\x5e\x5c\xd1\x6f\x9c\x0a\xd9\x2e\xa8\x44\x80\x55\xdd\x82\x8c\x79\x93\x5a\xa6\xc0\x74\x1f\x9e\x2b\x81\x03\x24\xfd\xc6\xe6\x1e\x84\x2f\x94\x57\x22\x68\xbf\x7d\x5a\xdf\xa7\xab\x35\xb0\x7f\xb1\x9e\x78\x15\xa8\xaa\x5d\x81\x13\x01\x30\xac\x5c\xda\x8a\x47\x51\xee\x76\x03\x8c\x0a\x6b\xc2\xfa\xba\x4c\x49\x7e\x62\xb9\xf1\xf1\x94\xb8\xa5\x99\xb0\x77\x01\x81\x4b\x6d\xfb\x7d\x84\xbc\xdd\x5b\x7b\x5b\xc2\x24\x9f\x1d\x38\x45\xef\xf9\xef\x8c\xc7\x32\x85\x35\xd7\x0d\x53\xc7\xaa\x0c\x73\x05\x90\x1d\xe7\xc4\xed\x2f\xe1\x83\x82\x65\xd4\xa4\x17\xb8\x76\xad\xbd\x88\xeb\x93\x3f\x27\xc9\xaa\x48\xc8\xc7\xe3\x4e\x48\x14\x7c\xcf\xfb\x2f\xb6\x1a\x34\x8f\xea\x13\xef\x67\xcd\xf2\xe0\x39\xe3\x3f\xd8\x9e\x2c\x1a\xd2\xa4\x25\x4e\x3b\xf7\x48\x45\x2a\xa8\x3e\xfe\xca\x46\xe7\x80\xed\xe1\xd1\x3f\xf4\xcc\x5e\x7d\x01\xed\x45\xeb\x8c\x74\x81\x8d\x48\x60\xaf\x47\x59\xa8\x3e\x14\x88\x96\xab\x68\x73\x43\x95\x76\x0e\x00\x14\x6b\x79\x3c\x3e\x72\x89\x8a\xa0\xb3\xc5\xe0\xc1\xd3\xfd\xf1\x21\x58\xd2\xe8\xff\x11\x23\xa3\xa0\xc6\x4c\xf6\x37\x4a\x7f\x44\xf1\x1a\x57\x5e\x48\xa3\x79\x18\x1b\x30\xa4\x86\x5c\xfd\x02\x2a\xa9\x83\x27\x56\x35\xce\x4f\x2c\xc4\x0b\xfe\x06\x60\x67\xec\x4f\xe2\x41\xfa\x04\x7b\x55\x27\x0a\x1a\xd0\x77\x6c\x5f\x96\x86\x10\x14\xcb\xf4\x0a\x04\x32\xc5\x59\xf2\x2d\x79\x34\x2b\x79\xf8\xe7\x04\x2d\xcc\xfb\x1c\xf5\x0f\x83\x08\x5f\x80\x63\xfb\x18\x87\xed\x2d\xfc\x9d\xb7\xef\xc9\x6d\xaa\x0f\xf2\xbc\x4f\x52\x33\x5b\x02\x11\x2d\x16\x39\x2e\x13\x4c\x02\x23\xde\x45\x8f\xc0\x72\xcc\x22\xbf\x9e\x7e\xab\xc0\x62\x08\x18\x0a\x57\xe7\xce\x48\x05\xee\x4e\x0f\xc0\x15\x84\x09\x98\xfd\x56\x86\x44\xa0\x38\x6b\x3d\x8e\x7d\xda\x52\xab\xf6\x4f\x7d\xd0\x08\x68\xfc\x84\xf0\x36\xca\x8a\x78\xe9\xba\x81\x71\xca\x90\x26\x7c\x74\xe6\x15\x9a\xca\xc7\xaf\x5b\xf2\x37\x59\xab\xc5\x3d\x82\xe7\x93\xdb\x87\xfd\xad\xe1\x36\x33\x54\xff\xdc\xb0\xbd\x4c\xc9\x21\x3f\x5c\x84\x54\x45\xfc\x64\x9b\x2a\x1f\x32\x9f\x9d\x41\xd8\xa0\x31\xab\x46\xb4\x72\x16\x0f\x03\x43\x4b\x4b\x6b\xc5\xa4\x01\x52\x4d\x61\x79\xad\x66\xf9\xe2\x21\xc9\x06\x7f\xc8\x7f\xe4\xa7\x7e\x21\xe8\x02\x3b\x61\x69\xeb\xf1\x09\x0c\xd5\x56\xa9\xbe\x50\xb9\x18\x7f\xe4\x60\x7c\x59\x25\xe6\x0b\x41\x4f\x6a\x5c\xbf\x8a\xfa\x15\xed\x0e\xb3\x4b\x67\xb4\xc9\xc5\xd5\x4a\xdb\xe6\x40"}, +{{0xb5,0x69,0xf7,0xc1,0xaa,0xdf,0x56,0xed,0x1b,0x5f,0xa1,0xb6,0xfa,0xd6,0x48,0xd0,0xdc,0x54,0x4f,0xf8,0xfc,0xd1,0x73,0x78,0x0d,0xe4,0x1a,0x7d,0x4d,0xe6,0x0c,0xb6,},{0x9e,0xff,0xa4,0xae,0xd9,0xc6,0x58,0xe4,0x34,0x60,0x71,0x43,0x44,0x68,0xa0,0xb8,0xa0,0x4e,0xcf,0x78,0x41,0x69,0x9d,0x63,0xe8,0x88,0x7c,0xe2,0x05,0x57,0x0c,0xea,},{0x2e,0x32,0xba,0x05,0x56,0xbd,0xe9,0x74,0xd7,0xa1,0x9b,0x3b,0x9a,0x1e,0x92,0xf1,0x83,0x92,0x4c,0x4b,0x74,0xc5,0xd7,0x51,0xb5,0xab,0x3d,0x00,0x79,0x67,0x01,0x6e,0xc0,0x3a,0xfe,0x91,0xd7,0x42,0xfb,0x22,0xb6,0x3e,0x5e,0x55,0xb2,0xfc,0xb6,0xc6,0x1a,0x46,0xe9,0xdc,0xe7,0xfe,0x9f,0xa3,0x0b,0xbf,0x66,0xae,0xf4,0xb8,0x5f,0x09,},"\x7c\x5a\xa4\xdc\x80\x78\xaa\x77\xe8\xb3\xb7\xfe\xe6\x10\x84\xcf\xad\x76\x47\x62\xf1\xef\x26\xd8\xde\xb7\xf2\xf3\xb1\x86\xdf\xc7\x72\x48\x75\x50\x19\x78\x45\xfb\xa2\xf4\xc2\x3c\x83\x5b\x9b\x58\xdd\x0b\x63\x5c\x64\x91\x35\x13\x7f\x24\x8f\x5e\xf7\x13\x56\x4d\xe3\xc9\x66\xef\xa5\xf6\xdb\x6b\xea\x9e\x30\x97\x07\x49\xf8\xe8\x72\xd8\xd7\xae\x45\x35\xb7\x5e\x17\x6e\xa0\x48\x9b\x91\x5f\x34\x71\xd8\x27\xeb\x5b\x44\x45\x86\x48\x8c\xfc\x3f\xa6\xa4\x50\x82\xda\xcb\x82\x64\x95\xe5\x0a\x3b\x5d\xc6\xbb\x93\x0a\x33\x1f\x30\xc3\x85\xbc\x3b\x24\xce\x70\xb8\x95\x96\xdb\x6b\xfb\x68\x7d\x99\xa5\x81\x98\x7c\xa8\x76\xea\x0e\x75\x76\x96\xb3\xfc\x03\x77\x9a\x65\x81\x30\xc4\x10\xb3\x44\xed\xac\xc4\x27\x7d\x44\x84\x54\x99\xd6\x78\xe1\x41\x4f\x15\xf3\x6e\x16\x63\x35\x18\x95\x69\xce\xf3\x56\x7a\xc2\xe3\xab\x82\x1c\x91\xc9\x32\x74\xf5\xc2\x8a\x5d\x1f\x7c\x1b\xf5\x09\x9b\x10\xf8\x4e\xcb\x13\xa4\xe4\x53\x8f\x66\x49\xbf\x74\xf7\x39\x4b\x70\x3e\xf5\x36\x49\xd8\x15\x16\xcb\x1d\xb5\x21\x41\x60\x65\xcf\x9f\x27\x6a\xb8\x0c\x93\x08\x89\x7a\x27\xdf\xe3\x7e\x5e\x14\x2f\x18\x19\xb8\xd3\x48\xdf\x50\xa0\x46\xa1\x28\x88\xe3\xb7\xf2\xdc\xc7\x0f\x52\x18\xd1\x5e\xbb\x9a\xa7\x29\x1a\x1a\x92\xac\x44\x5c\x51\xd3\xa5\x3d\xd6\x91\xef\xff\xcf\x5a\x01\xe8\x76\xa7\x2a\xa4\x81\xeb\x4f\x12\x1a\x07\x23\x97\xd8\xcc\x93\xbb\xc2\xc9\xa6\xc2\x8c\xc8\x9b\x11\xff\xc0\xe9\x10\xd8\x2d\x9d\x62\x98\xa3\x67\xa0\xe1\xe3\xe8\xc8\x65\xe4\x32\x6a\x31\x9b\x22\x66\x6e\x52\x9f\x19\x98\xf1\xb3\xc8\xef\xb5\xfc\x21\xcc\xe9\x70\x40\xfb\x62\x47\xda\xa0\x00\x0a\xc5\x55\x4d\x89\xe7\xb2\x71\x59\xdd\x0b\x18\x00\xb7\x60\xb7\x9c\x91\xef\x6e\x97\x0b\x1e\x6c\x5f\xf4\x24\x42\xb1\xb3\xae\x4d\x3c\x43\x9e\x08\xec\x2f\x6b\x94\x17\x73\x87\xca\x5c\x01\xdf\x6f\x07\xf8\xe3\x4d\x25\xed\xbd\x49\xd8\xb7\x4e\x31\xa5\xe6\x5d\xec\x1f\x87\x60\xfa\x22\xc0\x0e\x6f\xb1\xcd\x55\x5b\xe6\x8b\x0a\xb4\x35\x99\xf0\xb9\xf4\xa5\x4a\x7c\xcb\x06\x26\x83\x89\x5d\x5e\xf6\x6d\x24\xdf\xb1\x67\x8c\xb0\xd0\xe8\xc8\x01\xd8\xe5\xff\xe7\x9b\x91\x39\xfc\x96\xd1\x18\xeb\x39\xb9\xc8\xd4\x40\x44\x89\x32\x5d\x45\xb4\xa3\x20\x2b\xea\xdc\xa6\x6f\x83\x1c\x68\xef\xb8\x15\x94\x15\x81\x93\x0e\xad\x29\xfd\x5f\x21\x1b\x90\xe7\xa3\x9f\x0d\x4f\xf4\x8c\x62\xa5\x45\xe2\x8a\xc2\xce\x29\xbe\xdc\x35\x6d\x92\xfc\x00\x34\x71\x76\xd7\x76\x23\xe0\xe1\x80\x9e\xff\x3f\xe6\x2b\x75\xa7\xd9\xde\xb7\x27\xd8\x61\x72\xd1\x4e\xdb\xf2\x78\x9a\x57\x14\x3c\x69\x92\x5c\x91\x7d\x43\x3b\x46\x83\xb0\x69\x3b\x3c\xd9\xe7\xe3\x77\x99\x64\x10\x72\x7f\x5e\x6f\xb8\xf5\xcc\xd1\x86\x0a\x20\x29\x4e\xcf\x33\xfa\xf9\x7a\x1e\x0f\x85\xb7\x61\x44\x7d\x47\x61\xb9\x6e\x4d\xf1\xb3\x12\xbd\x41\x4c\xab\xcf\x49\x84\x97\xb0\xea\xd6\x7c\xd1\xe5\x90\x1b\xbf\x3a\x16\xa8\x89\x1c\xcc\xed\x8a\x90\x7d\xf8\x87\x26\x95\x2d\x4a\xb3\x70\xa6\xb7\xdf\x29\x42\xcf\x13\x61\x5a\x5b\xc1\x2b\x4e\x10\x6d\xc3\x01\x3c\x68\xb8\xfb\x90\x63\x99\xdf\x15\xf1\xaa\x90\xd5\x6a\xa9\x74\xb1\xd2\xb2\x8c\x1a\x84\x53\xb9\xbf\x07\x92\xa5\x1c\x97\xce\x8a\x12\xaf\xc9\x34\x1b\xb4\xc0\xc3\x7b\x12\xdc\xb1\x2c\x63\x94\x49\x77\x5d\x9a\xc5\xc2\xec\x49\x67\x3d\xa5\xaa\xf7\x49\x3e\xd5\xf1\xf2\x11\x6e\xae\xf7\x2b\xb7\xfb\x1e\x09\x3e\xde\x2c\x26\x31\x7f\x4f\x4b\x6a\xd5\x85\x34\x62\x05\xdf\x91\xa6\xe9\x6b\xc6\x6d\x30\x64\xbc\xe9\x52\x39\x8f\xfc\xe8\x80\x71\xed\x9f\xf2\x75\x0c\x65\xc0\xc3\x04\x12\x5a\xc2\xca\xdc\x4f\xef\x71\xa8\x18\x73\x24\x96\xa8\x4c\xa5\x74\xd4\x82\xd5\xa3\xbb\xa2\x0e\x16\xdd\x2f\xa2\x4d\x32\x70\xf6\xc6\x09\x92\xf7\xf6\x3e\x88\xf5\x2e\xff\x62\x22\x99\x8e\xb4\x41\x67\x27\x38\x43\x75\xf5\x9f\x00\xe4\x75\x12\xee\x46\x4c\x31\x84\xac\xea\xff\x3c\xcf\xb0\x6b\xd1\x5c\x18\x3c\x5e\x48\x59\x26\x28\x8b\x99\x7b\xfa\xaa\xec\xf6\xec\xbb\xf7\xd2\xab\xf4\x90\x6d\xf7\x6b\x12\x77\xc5\xf5\xa8\x7e\x68\x17\xb1\xc6\x36\xe9\x1e\xfd\x7e\xcc\xf6\x4f"}, +{{0x32,0x34,0x65,0xd0,0x31,0x3d,0x10,0x01,0xa2,0x61,0xab,0xfd,0x44,0xfe,0x65,0xc3,0x8c,0x9a,0x00,0xca,0x0f,0x20,0x33,0x5d,0x65,0x53,0xde,0x49,0x26,0x99,0xfc,0x46,},{0xe2,0x2f,0x16,0xbd,0x4c,0xc7,0xe9,0x4c,0x46,0xba,0x31,0x96,0x1a,0xf8,0xc5,0x83,0xf9,0xd2,0x71,0x8c,0x68,0xf7,0x3d,0x85,0x06,0x9f,0x60,0x8e,0x15,0xba,0x87,0x66,},{0xda,0x3a,0xad,0xb3,0x43,0x60,0xb2,0xda,0x0c,0x26,0x54,0x2e,0xa7,0x1d,0xef,0xa8,0xa0,0xbf,0x7f,0xbd,0xae,0x3e,0xe9,0xe1,0x1c,0x84,0x08,0x4a,0xd0,0x5c,0xce,0x7b,0xa7,0xd9,0x4d,0xe2,0x5d,0x85,0x63,0x98,0x26,0x16,0xbc,0xdb,0x5b,0xb6,0x39,0x5f,0xac,0x4a,0x7e,0x84,0xbc,0x77,0xe2,0x1e,0xd3,0x6d,0xf7,0x5d,0xec,0x99,0x0b,0x06,},"\xbb\x10\x82\xe1\xcf\xdc\xd2\x9b\xfc\xa2\x46\x4d\x5c\xe4\x46\xb5\xba\x65\x4b\xa5\x8c\x22\x53\x8d\xa9\x26\xb8\x30\x3c\xab\xfd\x28\x4a\x7b\xd5\x99\x4a\x78\x6f\xa6\x6a\xed\xf0\xe1\x5f\x20\xc3\x82\xcd\xac\xf3\xd1\x45\x57\xff\x7a\x82\x67\xfa\x04\x67\x2c\xac\xab\x76\x70\x08\x65\x0a\xa9\xb4\xa7\xc9\x07\x1c\x47\x99\xf1\xff\xa4\x5c\xa4\xd5\x86\xe0\x20\x47\x44\x4c\x14\x23\x19\x43\x46\x7a\x3a\xba\xef\xa5\x39\x59\xda\x22\x6e\xb0\xc1\x53\x92\x01\x97\x60\x15\x96\x97\x74\x82\x93\xc0\x25\x56\x87\x83\x58\x8a\x39\x10\xe7\x8e\x5e\xa4\x27\xc4\x40\x7a\x89\x01\x06\x1b\x8b\x99\x2b\x82\xa2\xdf\x58\xc0\x4a\x1b\x2c\x5f\xad\x11\xc6\xb3\x79\x85\x6c\x2e\x0f\xef\x8a\x95\x0d\xe7\xe0\xfc\x22\x31\x03\x09\xe0\x8b\x13\x2b\x0c\xce\x4f\xc1\xec\xbf\x94\x57\x4a\x38\x8d\x4a\xe3\x66\x75\xd3\x29\x9a\x95\x15\x54\xeb\xf1\x80\xeb\x38\x1e\x1b\x5d\xf9\x77\xd9\x38\x43\x38\x91\xbc\x47\x8d\x76\x81\x85\x0b\x9d\xc9\xc5\xc7\x69\xd4\x05\xf5\xd8\x83\x9f\xc9\x73\x61\xd6\xcb\x30\x6c\x20\x30\x26\xcf\x2e\x2b\x3d\x39\x84\x9e\x1f\x4b\x12\x25\xeb\x25\xef\x8a\xcd\x40\xb0\x06\xf2\x0c\x64\x4d\xb6\x50\xc7\x5d\x38\xc0\xfc\xdd\x48\xf5\x98\xc7\xb4\xa6\x01\x06\xe6\x9e\x19\xcd\x71\x25\x89\xce\xdc\xcf\x50\x86\x4e\xa5\xf9\xe9\x5e\x01\xf1\xdd\x85\xc7\x51\x4f\x2c\x94\xb2\x83\x59\xde\x41\x32\xb8\x8c\x3e\xe1\xd1\x0a\x80\xa9\xfa\xdf\xb6\x90\xe3\xd8\x86\x41\xb3\x16\x8f\x0b\x89\x6a\xf8\x99\x0a\xdb\xf0\xe4\xf8\xe9\xd3\xf9\xd4\xcd\x31\x4e\x12\xc3\xbc\xe0\xcc\x87\x38\xe0\xcf\xc1\x90\x5b\xe5\xef\xa0\x71\xf7\x10\xb3\x2f\x8e\x58\x98\xc6\x0e\xb1\xbb\x8f\xee\xb7\x40\x00\x56\x0f\x41\xcb\x2e\xbc\x32\xb2\x60\x0b\x69\x80\xa2\xa4\x06\x4d\xfa\xa3\x79\x7e\xc4\x4c\xfb\x72\xd3\x79\xf8\x09\x73\x79\xca\xd6\x7e\xcd\xc0\xc3\x24\x14\xfa\x41\xc7\x2b\x1b\x9e\x4e\xdf\x55\x18\xcb\x39\xfe\x90\x92\xb4\x39\xaf\x3a\x4e\xbd\x5a\xfe\x79\xbe\xdc\x0e\xa8\xbf\x17\x47\x9a\x28\x21\xf5\xe9\xbd\x91\xd7\xf4\xaa\x5e\x38\x46\x99\x52\x37\x19\xb6\x95\x7f\x82\x36\x7c\xd8\x5f\xea\x9d\xed\x62\x36\xa2\x07\xc9\x4c\xb3\x73\xe3\x39\x3c\xb4\xfe\x11\xf9\x0a\x1b\x87\x79\xe4\xab\x4c\x34\x66\x13\x6b\xf2\x1e\x2a\xab\x78\xf7\xd2\x72\x6d\xb6\x41\x4f\xa5\xc4\xa3\xf7\x31\x3a\xd2\x11\x6a\x6d\x7c\xe4\x0a\xaa\x10\x01\xc2\x70\x4d\x5b\x05\xae\x54\xc7\xcc\x6f\x56\x72\x17\xf1\xa4\x7b\xfd\x0e\xe7\x38\xea\xea\x5e\xad\xb5\x37\x10\x75\xbe\x07\x6c\x87\x50\xae\xce\xfc\x41\x7e\xa7\xbf\xda\xac\x3c\xc3\x8b\xf1\x6c\xc2\x6d\xf7\x60\x0e\x3c\x7e\x8e\x43\x1f\x26\x76\xfc\x2a\x8c\x43\xa6\xa1\x43\x68\xba\x62\xbb\x32\x43\x9a\x06\xbe\xac\x38\xa0\x47\xb3\x74\x5e\x26\xf4\x07\xad\x82\x3d\x6a\xd1\xc0\xb6\xa4\x43\x41\xe1\x5f\xc9\xb3\x31\x21\x4f\xfc\x89\x69\x82\x11\xb0\x51\x33\xd6\xd3\x43\x3b\x5d\x59\xf7\xab\x4d\x10\x9e\x54\xe4\xc5\xd6\xf3\x2f\xcf\x72\x30\xfa\x4e\x25\x28\xc8\x61\xbb\x21\xcc\xc9\xe3\x10\xe9\x49\x7e\x07\x7e\xa6\x75\x51\x0d\xa7\x12\xb1\xa5\xdf\x57\x5c\x5d\x1b\xf7\x36\x2d\x07\x11\x80\x03\x9a\xec\xfa\xa5\xc8\x57\x3c\x24\xc0\xf4\xeb\xe8\x1c\x2f\x88\x9a\xed\x3d\xe5\xa0\x00\xbe\x12\xfe\x3d\x0a\xf2\xdc\x2c\xd4\x24\x0e\x31\x4a\x17\x6c\x55\x3e\xfd\x5c\xba\x79\x8d\x9f\xf1\xe3\xd4\xbd\x9e\x90\xbb\x81\x13\xe3\x84\x9d\x73\x5a\xfa\x4a\xf6\x94\x5c\xc5\x7d\x4c\x37\x8d\xb8\x4f\x20\x6e\xf7\xea\xb1\x1c\x63\x7a\x7f\x72\x60\xf1\x22\xa9\x7d\xff\x67\x47\xe9\xb4\xc1\x74\xed\x0d\x64\xf9\xef\xd7\xfc\xcc\xf9\x81\x51\x9e\xc5\x80\xa8\x18\x25\x47\xd1\x79\x68\xc4\x01\x51\xfd\xf6\xd5\x4b\xc5\x7a\x91\x15\xf0\x40\xfa\xb5\xc1\x00\xde\xb0\x39\x12\x2b\x7d\x2b\xfd\x98\xb6\xad\xf3\x8f\x42\xb2\x96\xea\x3b\x37\x8a\x90\x42\x59\xb7\x5d\x60\x70\x3b\x48\x40\xb3\xf5\xda\x09\x62\x0a\x54\x77\x62\x80\xe9\xca\x9e\x8c\xd9\x24\xae\xd2\xb5\xdd\x2b\x49\x83\x4e\x58\x1c\xae\xd5\x27\x1c\xd7\x8c\xe0\x8e\x4b\xba\x49\xb5\x9c\xd7\x7c\x1b\x62\x76\x64\x91\x48\xab\x72\x47\xf9\x7f\xc0\x13\x16\x35\xde\x47\x4d\x3c\x23\x49\x3c\xa9\x8d"}, +{{0x60,0xff,0xdb,0xae,0x00,0x3f,0xa2,0x79,0x4f,0xca,0xbb,0xf8,0xf5,0xb4,0x16,0x44,0xfe,0x3a,0x7f,0x44,0xed,0x6c,0x83,0x41,0x93,0xda,0x07,0xa9,0xdc,0x5e,0x26,0x65,},{0x35,0xb5,0xeb,0x31,0xab,0x55,0x64,0x92,0x57,0x8b,0x3d,0xbd,0x6c,0xf1,0x68,0x7d,0x1f,0xdb,0x21,0x6a,0x72,0x58,0x18,0x07,0x96,0x63,0x48,0x2f,0x22,0x1c,0xe4,0x21,},{0xb8,0xf3,0xe1,0xf3,0x78,0x5a,0x2a,0x39,0xbb,0x08,0x6c,0xa4,0x65,0xc0,0xab,0xf0,0xa3,0xe8,0x74,0x43,0x22,0x5a,0xc6,0xe9,0x66,0xed,0x9b,0x45,0x31,0xc5,0x4a,0x89,0x4a,0x9a,0xbd,0x01,0xac,0x31,0xb8,0x57,0x57,0xfe,0x75,0x30,0x8c,0x95,0x94,0xff,0x65,0xf9,0x7c,0xdd,0x91,0xe8,0xd8,0xa9,0x3c,0xf1,0x2b,0x9e,0x6d,0xbe,0xe9,0x0b,},"\x3f\x8f\xf2\x0b\xb4\xf0\x08\x34\xc8\x0f\x2e\xe6\x89\x3d\x6f\x73\xbf\x7a\xce\x27\x29\x60\x1b\xb2\x6a\x0f\xb2\x72\xa4\xd0\xee\xa1\xfa\xe1\xd3\x06\xac\x2c\x5f\x32\xad\xd6\x01\x35\x85\x1d\xa2\x7e\x4f\x12\xe6\x4e\xa5\xe9\xe9\x96\x0b\x13\x83\xb0\x4c\xe0\x5a\x98\xb0\x41\x4d\xad\x97\x1e\xa9\x89\x44\x87\x1d\x41\x5c\xc2\xc4\x6d\xa4\x03\x97\x6d\x9f\x21\x93\x89\x58\xd4\xea\x8c\x79\x03\xb1\x4f\x2a\x44\x85\xfd\x69\xaf\xb2\x4a\xbe\x10\x2d\x8f\xec\x26\x6f\xb4\x68\xb4\x11\xeb\x20\xa3\x39\x67\x7d\x88\xeb\x31\xc9\x97\xb4\xdc\x88\x56\x13\xf0\xbe\x7c\x70\xda\xf8\x56\xa3\xdf\x92\xda\x96\x02\xfb\xa2\xe6\x74\x9d\x2f\x42\x6b\xee\xf6\x86\x62\xd5\xb0\xc2\xfd\x31\x32\x1b\x22\xb5\xec\x59\x7d\xa5\xd7\xe6\xa2\x88\xeb\xd9\x44\x3c\x5f\x39\xeb\x87\xdc\xf4\xa5\xad\x9d\x56\xc6\xba\xf6\x08\x09\x96\xa7\x79\x36\xbd\x87\xdc\x3c\xb4\x2e\xd4\xc4\xd4\x26\x88\xa9\xe1\x93\x82\x9b\x76\x1f\xf3\x20\xe2\xa6\x6c\xc6\x76\x48\xe7\x0e\xea\x3a\x1f\x2f\x9b\x9d\x5b\x42\x02\xfb\x5a\x39\xe9\xad\xc6\x09\x08\x6a\x9b\xe2\xa8\x32\x3a\xc6\x69\x31\xbd\xf6\xc5\x04\xd3\x33\x62\x11\xe4\x6f\xde\xfc\x48\x1f\xbf\x17\xf6\x13\xda\xb1\xfc\x5c\x09\x7c\x92\xdb\x06\x09\x90\x6d\x78\xb2\x5a\x45\x5a\x30\x45\x71\x8e\xfd\x3e\x3b\x14\xe2\x52\xb1\xae\x59\xc7\xc3\x89\x3e\x31\x91\x3b\x2c\x26\x4c\x0f\xfc\x3b\x60\x6c\xa1\xb0\x1d\xc4\x7e\xe8\x28\xa0\x8e\x46\xaf\x60\x4e\x59\x0d\xef\x44\xd2\x7a\xab\x93\xa4\x03\x25\x1f\xca\x07\x72\xe9\xdf\x0f\xab\x7a\xf0\xcb\xc5\x18\x1e\xfd\xa4\xda\x91\x3d\x8e\xb6\x45\x2f\x6c\xec\xbd\xa2\x04\xbc\x72\xd7\xc9\x90\xf6\x0c\xe0\xdd\x83\xc6\x34\xe9\x12\x23\x60\x91\xb0\xa6\x67\x3a\x7c\x89\xea\x59\x30\x8d\x55\xbd\x7e\x63\xa8\x52\x67\x74\xcb\xdd\x7a\x13\x39\xfa\xc2\x12\x4c\x90\x22\xab\xd6\xfe\xce\x7f\x2d\xae\xdf\xd8\x7f\xa6\x83\xdc\x0e\x3e\xf4\x08\x06\xa0\xab\x19\x87\x69\xd3\xa9\x9f\xe8\x1a\x99\xb6\x86\x00\x31\x90\x87\xaf\xa4\xea\x79\xd7\xee\x45\xda\x9c\xd4\x08\x09\xf4\xee\x8f\x4e\x25\xa0\x17\x75\x21\xee\x9d\xba\x8b\x56\x21\x2e\x88\x71\x9b\xb7\x36\x73\x36\xf4\xa7\xbc\x71\x22\xb4\x1a\x7d\xfa\xa2\x67\x2f\x92\xf2\x34\x03\xa1\x0c\x4f\xb2\x53\x88\xc6\xb2\x00\x81\x09\x3d\x49\xf3\xbe\x8a\x9e\x1c\x63\x4e\xf7\xba\x96\xb6\xd5\x23\xdd\x6f\xf6\x13\xc0\xa2\x3b\x60\x45\x70\x26\xcd\x48\x5b\xa8\xdb\x61\xd8\x0a\x0d\xc6\x59\xd9\xaf\x42\xa3\x8c\xae\x77\x7f\xec\x68\xe3\x9c\x52\x98\x6f\xf9\xfc\x20\x78\x9c\x10\x58\x51\x07\xc0\x40\x47\xb6\x6b\xa1\x4e\x93\xfb\x90\x4e\xa9\x0d\xf7\xac\x9f\x01\x54\xc9\x6f\x32\x36\xac\xf6\xdc\x8b\x44\xf5\x54\xc0\xcd\x51\x31\x93\xe5\xdf\xd8\x7e\x08\x5a\xd4\xb3\x8a\xa4\xc5\xe3\x6b\x24\x27\x72\x20\x88\x81\x6e\xcd\x2b\xc3\xa3\xdd\xa0\x1e\x4f\xb3\xff\x5e\xec\x7a\x64\x17\x32\x2b\xa6\xa2\x77\x73\xd2\x44\x95\xa8\x39\x19\x4a\x4a\x58\x2f\xe5\xab\xdb\x8b\x5d\x53\x3a\x24\x26\x25\x89\x24\x1f\xc8\x1f\xdf\x5e\x79\xfd\x26\x77\x64\x28\xf8\xe1\xce\x9e\x92\x6c\xf2\x72\x71\x6e\x75\x83\xab\xfc\x67\xa9\x4a\xae\x08\x16\xc1\x00\x0a\x19\x61\x70\xbb\xff\x1f\x45\xe5\xed\x9e\x26\x7a\xce\x1e\x4d\x91\x5d\xce\x72\x16\xc5\xf4\x04\xde\xf6\xfe\x2b\xd8\xb2\x8b\x2e\xcc\xf3\xe2\xae\xa0\xc0\xd6\x62\x63\x90\x27\x4e\x47\xe7\x45\xed\x3a\x23\xbc\xfd\x21\xd2\x84\xc3\x95\x37\x9d\xc0\x20\x80\xf0\x79\x36\xbc\x15\x4e\x7b\x99\xee\x73\xdb\x18\x8b\xd2\xa3\x94\xe0\x3a\x01\xff\xe2\xd1\xb3\x30\xce\xb7\x21\x58\xf9\x58\xc7\x16\xa8\x17\x11\xdb\xf6\x5a\xff\x8c\xd1\x2f\x5d\xfa\x53\xb3\x76\xeb\xb8\xb9\x8f\x86\x28\xf1\x7e\xf8\xb2\xab\x9c\x0b\xb6\x84\x12\xf4\xe3\x47\xa6\x33\xe2\xf8\xda\x1a\x55\x6d\x96\xf4\xaf\x72\x11\xc0\x78\x07\x9c\x10\x54\x1c\x07\xdc\x37\x22\xd1\x8d\xab\x8f\xa8\xbc\x49\x25\xab\xa5\xc9\x66\xf8\x05\x04\x03\x22\xdf\xbb\xbe\x87\xfb\xfe\xb1\x96\x1f\x5c\xcd\x40\xa9\x1b\x99\x7e\x54\x31\x5a\x7e\xef\xc3\xa4\x7b\xb0\xc8\x7d\xc2\x37\x55\xce\x72\x27\x57\x49\x96\xf4\xbe\x7a\xa3\x44\xfe\x0d\x17\xb9\x7b\xc5\x0c\x58\x38\xf9\x92\x92"}, +{{0x17,0x4e,0x99,0x3d,0x9b,0x81,0xf2,0xaf,0x67,0xe9,0xff,0xb8,0xeb,0xd5,0xda,0x41,0x79,0x66,0xa9,0xe7,0x7f,0x66,0xc6,0x5c,0x76,0x77,0x38,0xfe,0x83,0x57,0xd0,0x7c,},{0x3b,0xb7,0x38,0x6f,0x1b,0x1c,0xbf,0xae,0x55,0x37,0x03,0x83,0x3e,0xbc,0xbf,0xe2,0xdf,0xff,0x8c,0x89,0x9a,0x07,0x92,0xd7,0xce,0x23,0x22,0xb5,0xba,0x64,0x5a,0x5f,},{0xe6,0x07,0xbc,0x9a,0x53,0x60,0xb3,0x1d,0xa5,0x6b,0xe1,0xc5,0x44,0xc2,0x00,0x02,0x84,0x95,0x1d,0x86,0x89,0xf4,0xb7,0x22,0xbc,0x46,0x73,0xa0,0xc8,0x48,0x9b,0x84,0x48,0x3e,0xd8,0xe7,0x6e,0x29,0x7e,0xa0,0x46,0xe8,0x5b,0x37,0xba,0x56,0x30,0x58,0x5e,0x53,0x75,0x56,0x6a,0x18,0x7a,0xfb,0x56,0x96,0x66,0x1e,0x5b,0xfd,0xc1,0x0e,},"\xa4\x01\x75\x0a\xfc\x48\x37\xdf\xe3\xaa\xcc\x28\x4a\x59\x71\x45\xdf\xef\x02\x62\x9e\xf8\x7b\xd0\x93\x8d\x44\x39\x79\xdf\x76\xf2\x9f\xcd\x66\xa5\xb7\x1e\xa8\xab\x78\x72\x77\xe3\x05\x6f\x6e\xa1\x1b\x08\xbd\x23\x89\x79\xf9\xd3\xb0\x62\x53\x8c\x4d\x60\x40\xa8\x6b\x6e\x32\x04\x7a\xec\xc5\x9c\x23\x77\xad\x0e\xa4\xc4\x0c\x79\xff\x9f\xe9\x8c\x95\x8b\x2b\xf2\x5f\x2f\xd6\x34\x24\x32\x63\x6f\x5f\x7d\x5b\xb0\xd2\xec\xf1\x81\x83\x42\x6c\x73\x14\x79\x84\xd9\x5b\xbe\x16\x2e\x11\x97\x2d\xdb\x78\xa2\xa7\xc3\x45\xc5\xc0\xbb\xba\xba\x9c\xf3\x8a\x2d\x5d\xd5\x09\xa7\xdf\x8b\x84\x28\x74\xa9\x6e\x64\xb5\xd6\x4f\x5c\x41\xa2\x1d\x20\x8d\x14\xce\xa7\x06\x6c\xf2\x2d\xee\x0c\xa4\x1a\xa4\x6a\xb9\x21\xd4\xce\xec\x89\xec\x87\x3f\x77\x96\x0e\xda\x60\xd9\x67\x6c\xfd\x0d\xbf\xae\xc8\x72\xc2\xad\xe8\xfb\xa4\x28\x5a\xac\xd5\x27\x14\x3a\xe0\x34\x1d\x67\xd0\x07\x81\x19\x65\x3b\x5d\x23\xd4\x6e\x6e\xf7\x02\x64\xb1\xb0\x91\x38\x70\x87\x76\x23\x71\x6d\x0f\x1a\x59\x02\x1b\xe7\x4c\x91\x4b\x43\x24\x71\xa4\x3a\x29\xf2\xb6\xdb\xeb\x6a\x22\x3e\x2d\xba\xab\xb8\x20\xb4\xad\xbe\x33\x78\x29\xe1\xde\x0c\x18\x4d\xd0\xd0\x9f\x9d\x01\xd4\x25\x27\xe5\xd4\x0a\xbb\xda\xcc\x8a\xc0\xf1\xb2\xc5\xc1\xcb\x2f\x23\x87\x6d\x2d\x1b\x6b\x43\xdf\xe4\x82\xf9\xd4\x5a\x18\xf5\xc2\x2b\x15\xf1\xfe\x52\x1e\xf5\x7b\x08\xae\xc6\xa3\x03\x39\x25\xc7\x45\x4c\x93\xe6\x31\x9e\x77\x8a\xc4\x94\xfb\x14\x0a\xe5\xf1\xa3\x1c\xc8\x32\xca\x24\x88\x65\x10\x04\x06\x3b\xcf\xf8\xfd\x9a\xe9\x26\x6a\xf5\x27\xf2\xc3\x1f\x6a\xcb\x8f\x3d\xeb\xd9\x97\x8e\xf9\xdf\x01\x08\xe3\xd5\x0c\x49\x19\x90\xc9\x0d\xd8\xee\x9d\x64\xea\x4e\xbf\xd7\x11\xc9\x9d\x90\x44\xec\x11\x34\x2c\x53\x83\xca\x39\x23\x2e\xd9\x7a\x07\xe4\xdc\x51\xdb\x4c\x1f\xe9\x47\x34\x8d\xff\xe7\x0a\x95\xc9\x9d\xb1\x47\x51\x31\x48\x01\xf1\x3f\xa2\xbf\x42\xd8\x67\x37\x5a\x08\xee\x9b\x3b\x79\x9e\x0b\x15\x27\x8e\x95\xe9\x1a\x89\x68\x06\x4d\x6d\xfd\x8f\x51\x15\x43\x8c\xcb\x8b\x51\x6c\xa0\xc4\x1d\xbb\x19\x87\x3c\x6e\x10\xa2\x36\xec\xc2\xda\xd5\x22\xf8\x0f\x01\xc1\x4e\x2f\xa1\x4a\x0d\x79\x2b\x9f\xc4\x86\xc6\xfb\x0e\xfb\xdf\x21\x30\xf0\x2d\xf1\x49\x7d\xb5\xab\xa8\xbe\x61\xca\x70\xb2\x93\x88\xe4\xee\xc7\xe0\x69\x4a\x38\xc0\xd0\x3c\x59\xbb\x6a\x2d\xc3\xcc\xd6\xdd\xe1\xe2\x9e\xe2\xc1\xb3\x25\xac\x72\xaa\x8e\x6f\xab\x91\x38\xf8\xb6\xf5\xd3\x24\xd4\x6a\xf3\xa3\x54\x2c\x8b\xd8\x7c\xb0\x4f\xaf\xc5\x4b\x5d\xb8\x27\xde\x60\x67\x62\xa0\x97\xb6\x22\x79\x9c\xa8\x27\xbd\xa9\xc1\xc0\xbb\x26\x7e\xba\x82\x54\xa8\x1c\x6b\x85\x8a\x37\x5b\x94\xbd\x09\xf3\x9e\xeb\x88\xcb\x14\xb8\xd4\x6e\x47\x40\xdc\x1a\xb4\x2a\x89\x5f\x86\xd2\xc5\x7f\xc2\x8b\x07\xb7\xf6\x0f\xc4\xf8\x84\x7b\x8b\xc8\xad\x83\xa2\x48\x1a\x28\xf2\x9b\xca\x35\x10\xff\x8b\xf1\xdd\x75\x81\xe3\x35\x71\x64\xf4\xfe\x92\x0f\x9d\xe8\x39\x37\x6d\xe0\x64\x90\x0d\xc7\xf8\xbc\xf5\x11\xdc\x57\x2e\x0f\x0f\x6a\x75\xb9\x29\x79\x7d\xa4\x1c\x52\xea\xe6\xfe\x13\x75\x0c\xe3\x51\xe8\x76\x76\x30\xba\xdf\x6d\x7d\x4e\xab\x90\xcd\x19\x04\xc9\x6c\x04\x8a\x9a\xcb\x21\x3a\x9e\x5b\x86\x46\x15\x73\x8a\x84\xf2\x22\x98\x6a\xc2\x35\x54\xcf\x4c\xe5\x4e\x80\xab\x57\x33\xc0\x65\xb8\x04\x59\x92\x1d\xd3\xd8\x37\x2d\x0e\x85\x94\xd4\x36\x43\x51\xbf\x04\x1c\x14\x6f\xa8\xd2\x3a\x19\x3e\xb8\x07\xec\xe2\x3f\x24\xab\x65\x95\xe9\x32\xc9\xce\x1a\x75\x9b\xf7\x88\x91\x4d\xb0\x08\xe8\x70\x98\xdd\x81\x46\x5e\x26\x10\x64\x7a\xc3\x8e\x08\x86\x66\xf6\x0e\xc5\xd0\xe2\x17\x33\x20\xa4\x0c\xd9\x85\xf0\xe0\x0d\xbc\x2b\x45\x70\x72\x74\x83\xa8\xc2\x5f\x6f\xc1\xe0\x93\xbb\x57\xcc\xaf\xd1\xca\x20\x2f\x29\x86\xc7\xc5\x54\x0a\x7c\x3e\x10\xc4\xa6\xfc\x26\xd1\xd6\x2c\x2c\xa5\xaf\x83\x05\xce\xeb\xe4\x2f\xf9\x6e\x7d\xc5\x48\x21\x43\x75\xe8\xa7\xf9\xf7\x12\xba\x8b\xd8\x75\xe4\x3c\xa1\x0c\xf9\xb1\x83\xf0\xc8\x51\x95\x12\x92\x85\x38\xa4\x78\xcb\x98\x25\x9b\xd8\xb3\xe3\x34\xbc\xc4\x63\x55\x95\xca\xd3"}, +{{0xe5,0x37,0x15,0xfe,0xc9,0xd3,0xb2,0x0e,0x9c,0x29,0x91,0xe5,0x4b,0x5e,0xb0,0xa8,0xcc,0x81,0x87,0x55,0x69,0xc9,0x5e,0x22,0xa2,0x00,0x13,0x60,0x02,0x17,0x60,0x04,},{0x53,0x51,0x89,0x9b,0x69,0xb2,0x11,0x6b,0xc7,0xf8,0xa8,0x81,0x4d,0x1e,0x5b,0x9f,0xc7,0x85,0x69,0x8b,0xeb,0xd9,0xab,0x14,0x27,0x7c,0x3e,0xcc,0x01,0xef,0x8b,0x1d,},{0x3d,0x0a,0xdc,0xe7,0x7a,0x4e,0x04,0x6f,0xcb,0x9b,0x49,0xad,0x5e,0x6c,0x68,0x09,0xc8,0xac,0x33,0x6c,0x73,0x34,0x04,0xe5,0xd3,0xf0,0x15,0xc9,0x22,0x5c,0x3d,0xf4,0x6e,0xf2,0x1e,0xa3,0x4c,0xff,0xb3,0xaf,0x69,0x97,0x4f,0x8b,0x7e,0xab,0x2d,0x23,0xfc,0xd5,0xa1,0xe1,0x75,0x3a,0x40,0x23,0xde,0xb3,0x81,0x86,0x29,0xa9,0x8a,0x0b,},"\x84\x31\xcd\x16\xd5\xc0\x93\x77\x5e\x18\xc0\x82\x52\xc4\x3f\x95\xb1\x01\x7e\xb7\x11\xfc\xaf\x73\xe1\xe0\x0c\x0c\xd6\xf3\x44\x87\x44\xab\x9b\x0e\x64\x33\x55\x18\xc4\x83\xae\x94\xde\xb9\x76\x77\xf8\x18\xf0\xe8\x1a\x74\x90\x61\x5b\x71\x41\xb9\xc3\x5f\x80\x55\x6e\x69\x71\xce\xa2\x8e\x9a\x32\xc3\x28\xcc\x26\x69\xfc\xa5\xb1\x23\xcb\x66\x2d\xeb\xab\x2b\x98\x15\x77\x64\x66\x80\x70\xe1\x8e\xdf\x76\x1a\xe1\x96\xbd\x4b\x24\x4f\xea\x7b\x74\x98\x45\x16\xbe\x2c\x00\x73\x9e\x76\xe6\xc4\xb6\x21\xcb\x39\x83\x76\x5a\x20\xd8\x47\x78\xd5\xa4\x35\x0b\x16\x8f\x6a\x0f\x71\x2a\x98\x20\xa8\x5a\x63\x6f\xaf\x92\xc7\x89\xc4\x28\xcf\xd2\x96\x2e\xd2\x07\xc3\xac\x88\x99\xc2\x58\xca\xc1\xad\xb5\x15\x9f\x76\x4b\xa3\x72\x29\xc5\xcb\xf7\x83\xfc\x9a\xa4\xd1\xea\x46\xec\xc8\x5f\xe0\x96\x14\x85\xd4\xfc\x5c\xb2\x1d\xf0\x01\x2a\xc9\xb9\x55\x37\x3b\x14\x22\xe5\x1a\xfa\x1c\x55\x09\x88\x86\x2c\x86\x13\x3b\x76\x0a\xa6\x30\xfc\x0a\xce\xe8\x98\x91\x17\xd1\xdd\x96\xe3\xe6\x28\x7b\x69\x28\x7c\x59\x0b\xdc\xa9\xcb\xc8\xee\xce\xf2\x81\xee\x6d\x1c\x8d\x88\x82\x2b\xfe\xa5\xfa\x0f\x53\x0f\x23\x27\x80\x93\xc7\xc8\x5a\x0d\x44\xc3\xa7\x74\x04\xee\x79\xf1\xc8\x36\x8c\xd7\x32\x1b\xf1\x48\xfd\xa4\xdc\xf2\xeb\x07\xe4\x63\x0e\xa4\x22\x58\x75\x86\x37\x17\x80\x51\x45\x36\xb8\x94\xc5\x24\xe6\xb8\x3d\x5a\x76\xa1\x5c\x83\xe9\x5a\xb3\x14\xe0\x7b\x34\xb9\x8c\xd9\x9e\x07\x70\xb4\xeb\x9b\x3f\x3f\x50\x5b\xae\x8a\x06\xf7\xf9\x50\x25\x8d\x79\x07\x48\x10\x71\x95\xeb\x4f\x6b\x84\x84\x0f\x8c\x05\x90\x72\x73\x96\xed\x14\xe3\xf5\x32\x39\x47\x6c\x4d\x2a\x72\x69\xb2\xe1\xf9\x72\xfb\xff\x33\xe4\x72\x44\x26\x74\x5e\xc8\x86\xa3\x29\x16\x29\x5e\x70\xd4\x68\xd0\x6c\x7d\xbb\x5f\xf9\xa3\x54\xe1\xac\x90\x3b\xb4\x5c\xa5\x26\xf0\x8b\x49\xa6\x5e\x82\x29\x7d\x8d\xd3\xfb\x25\xaa\x42\x8f\x64\x34\x5b\xca\x97\x40\xd9\x07\x8d\xac\x9e\x11\x38\xc9\x21\xbd\xd7\x48\x81\x67\x3d\x49\xd0\xcd\x20\x06\x81\x17\x23\xde\x28\x7c\x6c\x95\x83\xe4\x56\xa0\x1a\xb1\xa3\x4d\xfa\x1e\xaa\x96\x3b\x71\xe8\xbc\x7f\xa8\xa9\x8c\xad\x4f\x94\x1e\x4b\x37\xb6\x0e\xef\x92\x3b\x32\x94\x88\x23\x50\xb3\x8e\xa4\xea\xc0\xe9\x23\x2e\x93\xc5\x32\xdb\x5d\x7e\xec\x8e\xcf\xae\x65\xe0\x80\x47\x30\x78\x77\x7d\xdf\xdd\x11\x50\x8a\x6e\x59\xf0\xeb\xaa\x3f\x60\x44\x1f\x82\xa7\x1a\x73\xc8\x4b\xca\x06\xa3\x71\xff\x5c\x9f\x77\x21\x3a\x2d\xb7\x95\xd4\xa8\x89\x78\x23\xd8\x8f\xd9\x2a\xe3\xe0\x57\xe8\xbb\xd8\x0c\x99\x0a\xf8\x38\x6b\xdf\x26\xf1\x2d\x97\x3c\x8c\x5f\xf9\xed\x6f\x7b\x2d\x8e\x61\x83\xcf\x6e\x68\xf3\xbb\x89\x8f\x59\xa9\x3e\xc4\xde\x3b\xea\x60\x5a\x5d\x8b\x15\xdf\xab\x71\x3f\x35\x85\xc4\x8d\xc9\xa5\x76\x82\x42\xb3\x31\x01\x43\x80\x30\xe7\x04\x48\x80\xd1\x7c\x2e\xe8\x4f\x89\xd2\x6a\x1f\x7b\x19\x86\x19\x3f\x96\x63\xc5\x87\xd5\x0c\xa9\xdd\xf6\x18\x6a\x51\x76\xaf\xef\x1a\xdb\x24\x81\xb7\x92\x54\xb7\x8d\x3b\x34\xc6\x97\x90\xeb\x28\xb9\x0b\x14\x61\x17\x0c\x3d\x73\x81\x83\x76\xcd\xf3\x71\xaf\x0a\x0f\xea\xf1\x4f\xdf\x70\x16\xed\x6e\x7f\x08\xc0\xc1\x4b\x52\x70\x5c\x86\xd4\xf0\x00\x3b\x5e\x45\xf9\x74\xc0\x64\x16\xcc\xb5\xca\x3e\x9d\x52\x9a\xa9\xd4\x15\xc2\x5a\x44\x6f\xa2\xd6\x9e\x82\xf4\x99\x4e\x57\xe9\x22\xc1\x7c\x1c\x34\x2d\xd7\x28\x1e\x41\x00\x52\xd9\xe4\xaa\x1b\x30\x9b\x7d\x47\x0d\x45\x8c\x66\x3e\x17\xff\x25\x00\xd0\xbb\x8e\x46\xa9\xc4\x36\x7e\x09\x1c\xaf\x87\xdd\xfc\x06\x2a\xae\x08\xa6\x5c\xb9\xe0\xea\xa7\x1c\x99\x45\x9c\x5e\x7c\xb1\x12\xa2\xee\x98\xa5\xe4\xcb\xee\x0d\xc5\x20\xf8\x7c\x30\x22\xda\x65\x49\xbe\x1e\xe7\x0a\x0a\x73\xad\x84\x99\xc9\x7d\xd0\x6a\xa1\x4c\x9f\xd8\x62\x8a\x92\xca\x6d\xb4\x87\x32\x2d\xb9\x59\x8a\xda\x1f\xce\x28\xf4\xb9\xfc\x1d\x3c\xc3\x9d\xcf\x2e\xd1\xdf\x3d\x86\x2d\x87\xf5\x5c\xc1\x01\x6f\xb9\xe7\x3e\x7c\xc8\x97\xb9\x70\xd5\xff\x35\xac\xfe\xb0\x5c\x1c\x89\x19\x28\x08\xae\xeb\xfb\x2c\xd1\x7c\xb1\xc9\x4f\xab\x05\x98\x98\xfe\xdc\x2f\xbd\x44\xcc\xef"}, +{{0xab,0xfd,0x69,0x7b,0xfb,0xc5,0xb6,0xff,0x2b,0xdf,0xf3,0xbc,0xe1,0xd7,0x77,0xe0,0x5f,0xbe,0x3e,0xc8,0xb9,0x5c,0xe6,0x93,0xd6,0x23,0x93,0x12,0x09,0x31,0x3d,0x4f,},{0xa7,0x09,0x32,0x1a,0x02,0x10,0xcb,0x80,0xab,0x58,0xbf,0x95,0x5e,0xcd,0xeb,0x8a,0xaf,0x9e,0xe4,0xc3,0x75,0xf9,0x59,0xc5,0x30,0x89,0xd4,0x37,0x48,0x8c,0x08,0x2d,},{0x8c,0x36,0xb5,0xa1,0x11,0xc5,0xa8,0x11,0x9f,0x2d,0x9d,0xb5,0x7e,0xbb,0x59,0x2d,0xae,0x86,0xad,0x4b,0xf6,0x78,0xc1,0x49,0x2e,0x26,0xf3,0xc1,0x0f,0xbe,0x03,0xf1,0x05,0xca,0xe0,0xdc,0x68,0xb5,0x52,0x59,0xb9,0xb5,0x98,0x92,0x89,0xdb,0x33,0xd9,0x5d,0x2e,0xe6,0xb7,0x56,0xc7,0x60,0xf9,0xd3,0xaa,0x0e,0x68,0xa1,0x89,0xde,0x02,},"\x89\x6b\x7a\xb8\x41\x3f\xfe\x43\x9a\x2f\x44\x87\xec\x49\xd6\x4e\x31\xc7\x4f\x50\xac\x83\xf5\x5d\xa6\x1a\x70\x03\xaa\x71\x6c\x2a\x9d\xf6\xb4\x38\xe6\x2f\x53\xd8\xf0\x19\x2f\x37\x36\x32\x47\x60\xd7\xe8\xc4\x4a\xc0\xba\xca\x3a\xe2\xa6\xfb\x93\xf1\x3d\x96\x88\x67\x99\xfd\x2c\x45\x51\xb0\xab\x36\xf1\x73\x08\x55\x55\x12\x65\xa5\xa3\xc3\xc2\x1d\x95\x16\xa2\x37\xf5\xdb\xc1\xc8\xe7\x29\x99\xb7\x82\xc5\xca\x41\xa4\xf6\xe9\x30\x8e\x64\xaf\xde\xe0\xbf\x47\x9e\x54\x6b\x89\xc5\x1b\xc5\xe4\xf7\x1e\x57\xfb\x24\xce\x43\x7a\x8b\x81\xb9\x1d\xc7\x98\xb5\xab\x36\xf2\x9a\xfd\x5b\x48\xe8\x1c\x17\x6a\xe5\xed\xf9\x53\x71\xba\x32\x46\xfb\x43\x94\x05\xbd\x10\xee\xd3\x67\x8e\x3e\xc6\x23\x07\xa3\xb3\xdc\x1b\xad\xba\x05\x1f\x16\x77\x4b\x85\x08\x81\x88\xc2\xa9\xe3\x20\xa1\x61\x8d\x5f\x26\xce\x94\xee\x2b\x93\x3c\x30\x5f\x6d\x95\x84\x95\x8e\xea\x31\x56\xc3\xd1\xe0\xef\x39\xa1\x86\x27\x5e\xe6\x2c\x40\xf3\xc1\xac\xd1\x5d\x8b\xe6\xe0\x74\x35\x1f\x53\x49\xce\x3d\xf6\x95\x17\x50\x5f\x45\xfa\x06\xa8\x15\xc6\x9c\xa1\x8f\x45\x0f\x42\xb5\xcf\x4e\xbd\x99\x26\x84\x45\xe0\xf6\x81\x04\xa7\xde\xeb\x0a\x11\x5b\x81\x7b\x99\xe1\xa7\x3e\x0f\xa9\xd8\x7d\xb7\x1f\x8e\xc9\x4f\x87\x08\xc9\xbc\x2e\x62\x2b\x96\x33\x65\xeb\xcf\xb9\x7c\xfe\x73\x32\x63\x00\x70\xe9\x65\x4e\xaa\x60\x36\x1a\x45\xd4\x02\xdc\x0a\xb2\x97\x66\x52\x42\x66\x7f\xbd\x99\x40\xf6\xcd\x33\x19\x52\x46\xa8\xc2\x86\x9a\xf7\x59\xa8\x62\xd4\xb6\x41\xdb\x14\x4d\x57\x32\x36\x6b\x20\x63\x6c\x40\x27\x78\x7f\x55\x80\x27\xd7\x6f\xcb\xf8\x43\x2e\xb9\x3e\x6d\x14\x56\x7d\xf8\xdb\xf2\x11\xda\xeb\x56\x55\xdb\x10\xac\xdd\xd0\x5e\xca\x06\xac\xce\xe9\xfd\xa8\xd3\xb7\x0c\xa1\xe6\xdc\x58\x7f\xa4\xb7\x8f\x63\xcd\x66\x3f\xf0\x24\x38\x70\x57\x0f\x4d\xcb\xaa\x3f\xb6\x26\xb4\xe1\x13\xbd\xe4\x7d\x5c\x9d\xb2\xb4\xba\x6e\xc6\xdb\xf9\x18\xac\x05\x69\x49\xef\x3c\xfc\xb1\x15\x56\x16\x15\x77\x1a\x03\x5a\x43\xd3\x3b\xa2\x65\x1d\xbe\xb4\x63\x48\x26\x1c\xe3\xc4\xc9\xf2\x46\xd2\x3f\x94\xdb\xc2\xd0\xc1\x9b\x92\x1e\x24\xc7\x7d\xa5\x99\x2f\x1b\x4b\xdf\x2e\xde\xa4\x99\xf5\x41\x11\x68\xac\x0c\x12\xe9\x6f\x3b\x15\xd2\xe1\x2a\xc8\xd7\xb3\xed\x8d\x1e\x07\xc4\x26\x7a\x25\xd3\xa3\xc3\x53\xa4\x20\x8b\x74\x06\x27\x8a\xab\x9e\x70\x0f\x7b\x20\x6f\x48\xe6\xea\x7c\xc9\x7e\x55\x4f\x15\xc9\xbe\x34\x9d\xd9\x15\x14\xdb\xe8\xd8\x89\xf2\xdc\xbb\xfa\x18\x2c\x9f\xaf\x58\x07\xa6\x9b\x2e\x97\xfa\x77\x1a\x6f\x23\x1a\x4c\x7b\x31\xd1\x17\xb8\xed\x0e\x63\x0c\xdf\x13\xe0\x82\xbb\x4f\x63\xc3\xf9\xac\xb3\x55\x32\x04\xcc\xd7\x6e\x18\x35\xc4\x6e\xec\x3d\x43\xc5\x61\xbb\xf1\x7c\x92\x21\x4a\x6d\xb1\x21\x2b\x60\x03\xcf\x2c\xc2\x6c\x7a\xe6\x75\xfc\xd0\x53\xb9\x47\xe7\x22\xf9\xe8\x57\x62\xce\x8a\x16\xe4\x65\x4e\xc6\x34\x2f\xc6\x46\xe5\xca\xb4\x72\x79\x7e\xab\xf6\x58\xba\x4a\xfd\x14\x2f\xc8\xfc\x4c\x8f\x98\xf2\x3c\x24\xdc\x99\x84\x7a\xe8\xce\xf0\x87\x9e\x1a\xb3\xbb\x80\x97\xe4\xc3\x52\x9a\xdd\x2d\x8e\x8e\x2c\x20\x69\x21\x0f\x50\xac\xe1\xae\x32\xa6\xc8\xe6\x38\x4a\x2b\xf7\xd7\x9c\x66\xc7\x46\x14\x9c\x84\xad\x75\xa3\xa1\x76\xe4\x5e\x13\x6d\x94\x69\x5a\xed\x4b\xfd\x08\xb4\x26\xea\x8c\x4b\x93\x79\xf3\x74\x25\x50\xe1\xcf\x5a\xc8\x4c\x18\x17\x4d\x68\x0e\x92\xaf\x2c\x18\x74\xac\x1c\x13\xd2\x82\x32\xde\x19\x37\x68\xe5\x61\x94\x7c\xbd\x6b\x79\xe9\xb9\x9d\xa6\x5c\xfb\x74\xff\xb3\x2f\x7d\x3d\x20\x25\xc6\x07\x63\xdc\x07\xf5\x55\x39\xb4\xd2\x53\xde\x1e\x6c\x25\x82\x3a\x62\x58\xc7\xa9\xce\xd1\x50\x1d\xce\x27\x86\x89\x8a\x3e\x05\xc9\xbf\xf8\xfc\x5b\x21\x25\xd0\xf4\x71\x08\x8a\x13\x4b\x48\x73\xc8\xd5\x5c\x04\x45\xf6\xca\x39\x6b\x3d\x7b\x4b\xc2\xbf\x5c\x4d\x22\x40\xda\x41\x82\x93\xaf\x6a\x3e\xd8\x53\xde\xdd\x3b\xf6\x68\xd9\x37\xb3\x5a\xa0\xc2\xac\xbf\x23\x76\x6f\x9f\x3e\x96\x82\x84\x75\xab\x08\x64\x96\x61\x7a\x6e\x81\xd6\x53\x58\x9b\x2f\xe5\x0b\x7b\xa8\xf0\xcf\x1e\x5a\x44\xd8\xd6\x2f\x08\x37\x7a\xbf\xc2\x62\x97"}, +{{0xdc,0xfa,0xd5,0x9f,0xc6,0xb6,0x97,0x10,0x9e,0x72,0x7f,0xf6,0x6a,0x5f,0xe9,0x3a,0x6a,0x22,0x6f,0x63,0x1a,0x64,0xe5,0x79,0x7a,0xd8,0xd8,0xc8,0xb6,0x35,0x87,0x34,},{0xe7,0x9f,0x4f,0x51,0x13,0x72,0xe3,0x55,0xe7,0xe9,0xe0,0xe8,0xb5,0x34,0x6f,0xdb,0xcd,0x2d,0xf1,0xfc,0x5c,0x3a,0x18,0x90,0xd2,0x7f,0xa1,0xfa,0x92,0x8d,0x27,0xa6,},{0x05,0x2f,0xf7,0x95,0x40,0x73,0x74,0x56,0xc6,0xa4,0x2c,0x41,0xc9,0x7d,0x6b,0xf5,0x17,0xb8,0xcf,0x28,0x9b,0xc7,0x8b,0x50,0x3d,0xee,0x6a,0x30,0xef,0x51,0x68,0xb3,0x8f,0x75,0xbe,0xac,0xa1,0xe1,0x4d,0x97,0x1f,0x87,0x73,0xe3,0x94,0x1b,0xd6,0xdf,0x5c,0xb9,0x77,0x8d,0xea,0x12,0x5a,0x4c,0x4f,0xe0,0x11,0x6b,0x70,0xee,0x84,0x0b,},"\x7d\x92\xdd\xd8\x13\x3c\x61\xc6\x10\xc1\x30\x8c\x23\xae\xaf\x99\x38\x84\xa4\xe6\x7f\x7b\x94\xbb\x88\x6d\xad\x50\x98\x69\xa9\x32\xec\x4a\x27\xd4\x10\xd2\xc2\x9c\xa7\xae\xae\x6f\x92\x80\xcf\x6c\x4b\x06\x7e\xc7\x51\xe5\xe8\xc3\x9f\xf4\x44\xd4\x22\xce\xab\xae\x14\x5d\x42\xf0\x47\x45\x3d\xd4\x02\xd1\x79\x74\x05\x03\x34\x09\xe7\x2c\xc1\x9f\x79\x3d\x5d\x26\x8f\xb3\xfd\x2c\x11\xea\x2c\xb0\xd7\x04\x36\xe1\x8f\x9e\x88\xa0\x15\x15\xdc\x86\x5f\x6a\x1e\xb2\x36\x90\x32\x8f\xd7\x5d\xe2\x63\x21\xa3\x8f\x12\x19\x7a\x97\x20\x1b\x1d\x84\x52\x94\x4f\xbc\x54\x1c\xb6\x8c\x77\xd4\x95\x15\xdb\x53\x26\xf2\xb1\xd0\x76\x3e\xda\x06\xd2\x50\xce\x2a\x5e\x0b\xbd\x7d\x16\x76\xd7\xd4\x1f\xb3\xab\xe8\x8b\xdb\xe3\x72\xf9\x6b\xf7\xbb\x52\x6d\x6b\x65\xa2\x51\x5e\x83\xa5\x77\x04\x5b\x54\x79\xb3\x8b\x85\x2f\xe4\xab\x01\x1c\xbf\x21\xc0\x85\xef\x5f\x0a\x7c\x1b\xed\x76\x57\x2b\x0f\x86\x02\x28\x06\x7a\x89\x9f\x89\x5a\xe7\xf6\x25\x6e\xb6\x51\x40\x87\xf9\xd6\xf5\xc3\x55\x96\xc1\xf4\x80\xc7\x31\x13\x54\x6c\xb9\xcc\x30\xf5\x6a\xb0\x74\xa9\xff\x28\xac\xab\x7e\x42\x65\x0a\x96\x1d\xa3\x25\xac\x5b\x65\x94\xb8\x1c\x93\x25\x0a\xe7\xd3\x92\x67\xa1\x9c\x97\x62\x54\x07\xed\xda\x04\x04\xcb\xe5\xa3\x6e\x95\x9f\xc8\x20\xb2\x7e\xf5\xca\xd7\x96\xc1\x1e\xaf\xf1\xc0\xe2\xf9\xd4\xb3\xc6\x49\x15\x02\x19\x5d\xe0\x36\x59\xb3\x64\xe4\xe8\x7b\x2b\x2d\x73\x3e\xc2\x5e\x6f\x9b\x63\xd5\xf6\x91\x79\xe0\xd2\x7b\xd4\xae\xcc\x8f\x12\xa5\x07\xa9\x1b\xaa\x48\xd9\x9b\x3a\x42\x6c\xec\xeb\xae\xf3\x7d\x73\x61\x10\x6a\x84\x90\x64\x43\x09\xf6\xeb\x4d\x25\x96\x44\x3b\x6b\x01\x18\xb9\x45\xac\xec\xc6\x44\x3e\xa6\x1f\xcd\x15\x5b\x54\x32\x5b\xc2\xc3\x1b\xe0\x25\x0f\x94\x82\xe1\x3f\xd8\xeb\x44\xe2\xae\xd7\x6b\xe8\x12\xaf\x54\x53\xcb\x7f\x86\x32\x45\x8f\xc8\xa0\x2a\x2f\x45\x48\x0d\x79\xb0\x6c\x7d\xda\x38\xb4\x69\x5d\x08\xb5\xa4\x30\x50\x4f\x1a\xe2\x27\x5b\x05\xc9\x1e\x79\x9d\x44\x70\xf3\x8a\xbe\x77\x73\x6d\xfa\x89\x5c\x19\x7e\xa4\xb6\x3c\x2d\xf1\x8e\xfe\xb1\x41\x84\x83\x7b\x8d\xdf\x48\x90\x95\x20\xd9\x10\x45\xb9\xd9\x65\x5c\x22\x5a\x83\x17\x39\x60\xb4\xd7\xcd\x0d\x8b\xae\x30\x23\x75\x57\xf8\x69\x70\x8b\xe1\x38\xad\x52\x46\xc8\x66\xc6\xc0\x59\xdc\x59\x7a\xbf\xd4\x94\x32\x37\x37\x68\x96\x73\x6b\x97\xb7\xe0\x28\x9e\xf9\xbb\xd2\x94\x77\x74\x5c\xb6\x0f\x46\x20\x2f\x1d\xe9\x84\xf5\x09\xb1\x80\x88\x33\xf5\x80\x18\xcd\xe8\xc2\x6b\xef\x4c\x00\x5b\xdc\xa3\x85\xb0\x57\x35\x11\x0c\xa0\x2e\x56\x2b\x50\xed\xdf\xf6\xfd\xe9\xfb\xb8\xd0\x30\xce\xdf\x70\x31\xbb\xeb\x32\xb1\x2b\x24\x2b\xe4\x9f\xde\x01\x60\xc1\xfb\xde\x99\xb0\x3c\x06\x2a\x1a\x47\x06\x23\x45\xc9\x2e\x0b\x60\x4d\x08\x0f\xac\xce\x92\x43\x48\x15\x29\xc7\x05\x97\xdf\xd6\x43\x82\xcb\x54\x06\x91\xb5\x9b\x71\xb0\x94\x33\x2b\xaf\x0b\xbb\x12\x5b\x63\xa4\x46\xbb\x97\x49\x1c\x04\x64\x32\x8c\xab\xd7\x62\x7c\x46\xf3\x92\xf3\xb1\x24\x82\x2f\x20\x13\xc6\xe1\x6d\x3c\xa8\x7c\xc5\xbe\xcf\x56\xb0\xfc\x6e\xb2\xbf\x99\x23\xb3\x01\x2b\xa2\xb6\x12\x50\xa6\x33\xa4\xd2\xee\x39\x12\x56\xc5\x20\x95\x73\x82\xaf\xf9\x70\xc5\xd2\x23\x85\xc3\x34\x4c\x6d\x4b\x45\x61\x57\x1c\x96\x32\x9b\xf7\x56\x15\x29\x75\x16\xb9\xf2\xce\xb9\xf9\x97\xa3\x95\x23\xaa\x0f\x58\xb4\x88\x77\x2d\x82\xfc\x0d\x78\xc5\xdd\x52\xec\xfa\x6b\xfa\xc6\x3a\x76\xe1\x48\x08\x8b\x36\xf2\x4a\x88\xe6\x83\x85\x49\x6d\xda\xdf\x30\x23\xf7\x2d\x87\xc2\xef\xa2\x6e\x87\x7d\x32\xf1\xda\x97\xcd\xb4\x2c\x8f\x15\x71\x89\x88\xe4\x28\xcd\x02\xf4\xd0\x95\x43\xbd\x0b\xd5\xb2\xf4\x09\x96\x3d\x0f\xa3\x73\x53\x1f\x78\xb5\x92\xbd\x13\x7e\xea\xea\x0b\x4e\x7f\x91\x82\x08\xe1\xd5\x90\x08\xa8\xaf\x50\x58\xf5\xd9\x23\xc4\xf3\x2d\xf1\x99\x90\xf1\x0d\xd3\xf0\xeb\x20\x62\x93\xb2\xb3\x44\x3f\x4a\x5d\x2d\xcc\x5f\x7d\x3b\xba\xf6\xaf\x43\xfe\x45\xf5\xdb\xbe\x53\xec\xf4\xbf\x1b\x4a\x13\xe2\xd4\x6e\xf8\x02\x98\xd4\xf0\x1c\x40\x2e\x21\x0f\xcb\x9f\xf2\x08\x4e\xc0\x3e\x42\x00\x8d"}, +{{0x69,0x6d,0xc4,0x81,0xf6,0x19,0xa9,0x49,0x85,0x63,0xc8,0x3d,0x0d,0x0e,0x55,0x56,0x5c,0x14,0xa0,0x78,0x45,0xfe,0x4a,0x66,0xab,0xa2,0x24,0x7b,0x11,0x3f,0xf8,0xef,},{0xc9,0xd7,0x37,0xab,0xc4,0xa9,0xe7,0x3c,0x14,0x9e,0xad,0xc1,0x95,0xa8,0x37,0x89,0x9f,0x2c,0xd5,0x01,0x93,0x73,0xc3,0x0e,0xca,0xf6,0x2e,0x5f,0x8e,0x14,0xb6,0x45,},{0xde,0xd5,0xd9,0x91,0x93,0x5c,0xd1,0xf9,0x39,0x0f,0x1e,0x85,0x92,0x9c,0xa1,0x6d,0xab,0xfc,0x83,0xe6,0x5e,0x43,0x27,0x2e,0xb1,0x75,0x16,0x71,0xaa,0x31,0x93,0x0c,0x72,0x85,0x55,0x34,0x14,0x30,0xce,0x7c,0x80,0x48,0x5d,0xe5,0x80,0x06,0x42,0x71,0x29,0xa4,0xd3,0x4f,0xd6,0x81,0xd5,0x2d,0x84,0x0a,0x16,0xba,0xfa,0x15,0x30,0x02,},"\x2d\x4b\x3a\xd0\xcc\x99\xf9\x83\xe4\x1f\x9b\x48\xc4\xa8\x18\xef\xf7\x5f\xcf\xb9\x3a\x12\x29\xec\x27\x40\xed\x19\xc1\x07\xd6\x21\xdf\x78\x05\x8d\xe7\xc2\xdd\x72\x51\xf5\xff\x45\x43\x40\x86\x5f\x6c\x86\xda\x65\x83\x1f\x66\x72\xdb\x23\x17\x26\xfd\xfe\x4b\x9e\xe3\x15\xd9\x3c\x72\x44\xa9\x20\xdf\x37\x05\x4c\x82\x44\x9d\x31\x0f\x89\x29\x32\xdd\xba\xd9\x4c\xc9\xbb\x39\xac\x89\x37\xcc\x76\xc9\x65\x21\xd3\xfd\xc0\x28\xba\x23\x41\x0b\x29\x02\x3e\x81\x38\xfd\x3f\x52\x43\x19\x88\x4e\xe5\xda\xd0\xd2\x34\xc8\xdf\x66\x1f\x88\x24\xbe\x47\x7e\x21\x69\x9f\x63\x69\xb1\x5f\xf3\xff\xef\xc1\x51\xaa\x55\x5b\x3c\x3d\x76\xad\xb4\x5f\x25\x67\x2d\x38\x0d\x47\x2b\x31\x48\xda\xbd\xef\x42\x45\xb6\x8e\x82\x85\x62\xf2\x5c\xc5\xb8\x1d\x9b\xbb\x24\x1b\xca\x9d\x19\x34\xea\x35\x3f\x95\xf7\xdb\xf3\x64\x64\x33\xe8\x1a\x35\x4e\x1e\x20\x56\xb8\x1c\x15\xaa\x1f\xa8\xed\x7a\x9d\x1a\xf9\x92\x38\xcd\x5a\x5a\xe9\xe8\x41\xc4\x8d\xc3\x48\xae\x1d\xe7\xc4\x1a\xca\x23\x32\x82\x36\xbc\x38\xb4\x7f\x47\xc7\x36\xb2\x57\xa3\x07\x8d\x57\xd5\x74\xb6\x47\xa7\xfc\x8c\x4d\x01\xbc\x50\x30\x21\x50\xd5\x03\x2b\xfa\xcb\x04\xbb\x0f\xd1\x55\xd9\x4d\x92\x06\x66\x77\x20\xe1\x80\xa6\x45\xaf\x46\x24\x59\xe3\x32\x6d\x46\x0d\xa3\xc4\x8e\x75\x72\x67\x8e\x19\x19\x26\x8d\x3e\x47\x40\xd6\x2a\x26\xf7\xc8\x55\x9c\x1c\x43\x9b\x4b\x0b\x0c\x59\x42\xa6\x20\xcf\xdb\x93\xcc\x68\xaa\x15\x52\x0f\xf2\x86\x42\x69\xd7\xa0\xc1\x55\x78\x0a\xdc\x6c\x18\x8e\x0b\x56\x5f\xb9\x59\x43\x19\xe6\xf5\x1d\x15\xca\xf6\xb2\x80\xe7\x15\x8f\x25\x79\x94\x07\xf3\xba\x0d\xd1\xce\xea\x64\xb9\x32\x6d\x2c\xfd\xef\x01\x7e\x1f\x17\x2f\x4d\xde\x0f\x7e\x46\x13\x50\x1a\xf0\x1e\xe0\xac\x30\x09\x5f\x48\xb5\x95\x90\x90\x2b\x1a\xec\xfe\x09\x34\x13\x91\x8d\x83\x5a\xdf\x96\x2e\xcf\x18\x58\x0d\x16\xf9\xfd\x4f\x6f\xa1\x09\x8a\xf1\xd8\xa2\xbc\x24\xdc\x86\xf7\x1d\x0a\x61\xff\x15\x00\x10\x86\x7d\x08\x69\x87\xb5\x1d\xd0\x30\xf5\x0a\xb6\xe3\x74\xb8\xe0\x11\x84\xb3\xe2\xb2\x14\xab\x1c\x7f\xdf\xae\xdb\xc5\x45\xe3\x8c\x3c\xd2\xf6\x98\x29\x79\x54\x1f\xe0\xff\x88\xbe\xd6\x75\x06\xda\x95\x72\x7a\xf1\xa2\x03\x8f\x32\x40\xae\x5b\xfd\x30\xee\x09\x21\x0e\x00\xfd\xcf\x2a\x06\x4d\x5d\xb4\x61\x49\x46\xbd\xa9\x72\xc6\x70\x08\x1a\x6e\xe6\xa1\x0b\x63\xf6\x73\xc8\x3c\x91\x5c\xa5\x57\x3e\x0e\xd6\x87\xb0\x06\x7c\x40\x07\x92\xa9\xbc\xc3\x34\x4e\x0e\x43\xf5\xdf\x63\xfe\xd5\xef\xa8\x5e\x9a\xaf\x85\xe4\xd7\xa2\xc5\x3a\x6c\x92\x82\x8e\x07\xfe\x63\xe2\xd2\x3f\x1b\xdf\x97\xd8\x4a\xdc\x36\xe9\xfc\x95\xfa\xad\xf0\x3e\x06\xd6\x5a\x19\xc5\xe2\x85\xef\xfd\x0e\xa0\xcf\xa8\x39\xd5\x5a\x0a\x0d\xbf\x6d\xa2\x87\x85\xc7\x7f\x5c\x04\xbf\xd5\x99\x74\xef\x37\x93\xcd\xc3\x98\xdf\x7a\x1b\xbc\x9c\xfc\xfc\x3a\x51\xff\xa9\xa2\x0d\x60\xc4\x7b\x24\x5d\xaf\xa3\xe4\x46\x23\xcd\x71\x1d\x77\x62\xc5\x0a\x67\xd6\x50\xc7\xe8\xc4\xfd\x3b\xeb\xc0\xc4\x98\xd2\x15\x2a\xb9\x82\x7c\x70\x0c\x7b\x28\x61\x56\x57\x49\xb5\x86\x4f\xec\x95\xb7\xf6\xb1\x99\x4e\x78\xd8\xf8\x5d\x06\x9c\xc1\x1f\x85\xbe\xd9\x71\x2f\x7a\x9f\x06\x0b\x0b\xf6\x75\x32\xe8\x8e\xb9\xdf\x3e\xb4\xa8\xd2\xfb\xba\xa8\x5e\xda\x92\x6d\x81\xc4\x9f\xb8\x6e\x73\x73\x1b\x7e\xd2\xa1\x90\x50\x78\x51\x3f\x7c\xa0\xfd\xcc\x3b\x1d\x57\x6e\x6a\x60\x12\x4c\x44\x61\x8d\xf1\x89\x0e\x16\x97\x94\x95\x6c\xb1\xec\x50\x1b\xa2\x04\x99\x70\xc8\xe7\x4c\xc1\x80\x06\x4c\x18\x44\x68\xbe\x4f\x08\x9a\x3a\xe2\x26\x3c\x85\x58\x63\xb6\x2c\x28\x31\x3d\xdf\x9c\xa8\x5b\xf6\x6b\x08\xa2\x64\x15\x5a\xd7\xc3\x28\x23\x8d\xfe\x61\x4a\x07\xed\xe9\x15\x5a\x09\xcc\xaf\xf9\x22\x92\x24\x93\x41\xba\xed\xcb\xe0\xe6\x46\x6e\x2c\x76\x04\x5e\x46\xda\xd2\xfc\x89\x9a\x17\x82\xe0\x09\x98\xe7\x9a\x83\xab\xfa\xe9\xb7\x06\xf7\x07\xf5\x8e\x73\x02\x03\xe1\xd2\xcc\xa0\x28\xc9\x22\xbe\xb6\xd1\x57\xfa\x7a\x98\x13\x2a\x92\x1a\x3d\xa2\x1f\x2f\x76\x9b\xb6\xc1\xf5\xf1\x9e\x9e\x85\xa1\x3b\x78\x1a\xf1\x41\x03\x9d\x51\x4e\xe1\x07"}, +{{0xf3,0xf8,0xd6,0x2f,0xee,0x3a,0xf3,0x75,0x66,0x96,0x30,0xcb,0xf0,0x63,0xbf,0xa9,0x30,0x18,0x9a,0xf1,0x36,0xcd,0x75,0x91,0xe2,0x4d,0x57,0x8d,0x73,0x66,0xbf,0x61,},{0x47,0x14,0xc6,0x04,0xaa,0x95,0xe1,0x82,0x8a,0x28,0x36,0x7b,0xa7,0x87,0x60,0xb5,0x89,0x64,0x31,0x68,0x3e,0xe9,0x96,0xcf,0xf9,0x68,0x71,0x77,0x32,0x91,0x95,0x3c,},{0x8d,0x6f,0x7c,0xee,0xb9,0x30,0x8b,0x4a,0x30,0x38,0x79,0xfc,0x6c,0xfa,0x5c,0xa8,0xe0,0x5d,0xfc,0x3d,0xef,0xc2,0xb2,0xcd,0x29,0x10,0xdd,0x4b,0x17,0xc9,0x4e,0xae,0xe8,0x45,0xab,0xe6,0x5f,0xd7,0x15,0xdf,0x05,0xb0,0x12,0x8e,0x43,0x16,0xe2,0x33,0x47,0x99,0xc6,0xe8,0xfa,0x74,0x7e,0xbc,0x8a,0x04,0x0c,0x74,0xf5,0xa1,0x48,0x0c,},"\xe1\xdd\x1f\xfd\x73\x7a\xc6\xdc\x24\xb3\xb9\xce\x3b\x79\xe8\x35\xbf\x69\x8e\x93\x13\x03\xd8\x09\xce\xa1\x78\x2d\xc3\xaf\x63\xa0\xd5\xe6\x73\x92\x82\x3d\x14\x39\xe7\xb6\xe3\x37\xb0\x1c\x8b\x21\x54\x34\xc2\x78\x2b\x3b\xe7\x44\x3c\xb5\xc8\x81\xe5\xfb\x6c\xf3\xbb\x24\x41\x28\xb4\xda\x6a\x6f\x42\xb2\xbb\x2c\xd7\x51\x29\xd5\x64\x18\x85\x43\x48\xc3\x39\xdc\xd9\x12\xb4\x55\x57\xa9\x15\xe9\xfd\x7f\x37\x91\x62\x36\x51\x0c\xb6\xc3\x31\xc1\x40\xb8\x7d\x22\x53\x11\x60\x0b\x8d\x13\x2a\xc4\x74\x73\x83\x9c\x72\x0f\x9f\xf0\xf9\xc1\xdc\xaa\x85\x81\x5a\x9d\x27\xb9\x75\x8c\xd9\x1d\xc5\xd3\xe5\x33\x26\xfc\xdf\xb2\x73\x0e\x52\xbe\x31\x03\x95\x7a\xc8\x91\x49\xa4\xc3\x00\x4c\xb6\x03\x8c\x0d\x80\xfa\x72\xac\x63\x0d\x33\x3b\xe5\xad\x4a\xdb\x58\x5a\xeb\x71\xae\xf1\xcd\xfd\x57\xb9\x15\xfa\xc4\xf1\xaf\x78\xe7\xa5\x97\xf8\xd1\xba\x06\x67\x2b\x19\xc0\xb6\x58\x08\xa8\xa0\x71\xff\x84\x09\x03\x43\x79\x58\x9f\x3d\x41\x30\x2d\x2d\x39\xb3\x31\x8e\x8c\x00\x90\xfa\x36\xcb\x95\x88\x57\xff\x5b\x21\x1c\x96\x66\xe2\x7b\xc8\x95\xab\x9d\x00\x6a\xba\xf5\x95\x0a\x03\xff\x17\xea\x98\x21\x78\xa4\x46\xdd\xa2\x46\x6f\x5a\x40\xb8\xf8\x95\x50\x9e\x4f\x4d\x4a\x6a\x27\x39\x99\x7f\xbd\x49\x68\xf8\x94\x36\xce\xe3\xd8\xed\xb8\xa6\xda\x9b\xd3\xd5\x5b\x06\x64\x90\xe8\x33\x9c\x78\x93\x5b\x77\x88\x3f\x95\xb9\x32\xfa\x5e\x6b\xb7\xdf\x30\x3b\xe3\x0f\xa5\x67\x24\x9f\xff\xb4\x73\xa1\xe4\x64\x32\x2d\x7c\x10\x3f\xe8\x22\x4c\x7e\xc5\x7b\xd3\x9b\xcd\x03\x0b\x96\x78\x7a\xeb\xcd\x20\xe9\xad\x65\x1c\xfa\x2b\xf0\x4b\xa7\x0a\x1c\xf6\x48\xe0\xa5\x44\x95\x67\x20\x2a\x93\x7a\x45\xbe\xcb\xb6\xfc\xde\xd3\x0c\xf9\xb5\xc7\x48\xf8\x82\xb5\xdc\x2a\x4d\x65\xbe\x69\xfd\x7d\x9c\x38\x1e\x83\xd0\xdc\x2a\x34\xb6\xde\xe9\x12\x20\xba\x90\x6e\x51\x2f\xcd\x63\x36\x8e\x2c\xe7\x33\xe4\x66\xb4\xb8\x2b\x84\xfb\x0c\x71\x7d\xc8\x94\x5c\xaf\x6d\x46\xac\x1c\x2f\x64\x18\xf7\x72\x9e\xf4\xc3\x5e\x40\x24\x22\xd6\x4b\x1c\x3e\xbd\x1b\x32\xa3\x0f\xc4\xc5\xee\xce\x7d\x44\x08\xff\x67\x9f\xf0\x1a\x1c\x7b\x03\xca\x51\x7b\xe5\x2e\x6a\xe7\x65\x0f\x7b\xad\x38\x90\x1e\x34\x8a\x55\x93\xbc\x99\x8f\x7c\xf2\xea\x97\x72\x9c\xb0\x04\xf5\x61\xb3\xb5\x8f\xe5\x98\x09\xa4\x1f\xd4\xb3\xb7\x66\x60\x90\x6a\xd9\xed\xa2\x3b\xf9\x25\x43\x7e\xf4\x52\xb1\x6f\x54\x0b\x3b\x80\xa3\x5a\x70\x93\xc2\x73\x4e\xef\xe6\xfa\x97\xd8\x81\xd7\x9e\xf5\xb7\x67\xd9\x88\x9f\x11\x84\x77\xb7\x3f\x58\xa4\xc0\xcb\x15\xe0\xac\x81\x01\x12\x05\x71\xca\x32\xce\x87\x1f\x30\x8a\xd9\x05\x7a\x80\xc8\x28\x15\x4f\xb1\xbc\x2b\x20\x1d\x0c\xd1\x00\x6e\x02\x2d\x44\x4d\xc9\x3f\x1b\xcf\x22\x4d\xb7\x4a\x5b\x37\x3e\x15\x3e\x85\x18\x54\x94\x8b\x6d\xa1\x47\xb7\x32\x87\xcf\x17\xd1\xfb\x72\xb4\x82\x76\x11\x10\x36\x09\xca\xb2\xa1\x77\x9e\x97\x93\xb9\xa7\x08\x20\xfc\x6f\x38\x28\xa6\x4c\x9e\xac\x35\xef\x7a\xa7\xb1\x76\x09\xd8\xef\xf8\xa9\xe5\x2e\x4e\xbc\xd8\x6b\x1e\x14\xfd\x14\x0b\xea\x47\xc6\xb8\xdd\xc4\x1e\x8c\xd2\x71\xeb\x92\x28\x7c\xbd\x06\x10\x51\x22\x42\xf7\x6a\x1e\xf3\xea\xc1\xe4\xbb\xbc\x1a\xda\xe5\x00\x34\xa7\xa2\x64\x7e\x08\xb2\xfd\x20\xaa\x93\xa9\x3c\xb2\xff\xde\xbf\x2e\x46\x1e\xcc\xef\xbb\xd1\xfe\x89\x4c\xe7\x0a\xdf\x79\x01\x73\xba\xe9\x6f\x5a\x55\xa1\x88\x7e\x9a\xe0\x9f\xce\xd1\xd4\x30\x6c\x29\x1c\x6b\x19\xec\xac\x47\x07\xe9\xef\x71\x3e\xa1\x8a\x75\x62\xc6\x67\x83\x26\x22\x89\x92\x07\x7a\x46\x69\x73\x49\x66\x10\x80\x00\xb4\x14\x4f\x45\xa0\xc3\xa2\x86\x3a\x4c\x6a\x3c\x07\x63\x2c\xb9\x3e\xb1\x97\xd2\x94\x88\x4d\x9c\xa3\xdd\x4b\x21\xf3\x9d\xb7\x07\xf6\x3a\x7f\x9a\x57\x0f\x7f\x0f\xeb\x99\xb2\xca\x7d\xa7\xdf\x92\xa1\x77\xab\xcf\xe8\x6e\xc6\x61\xd3\x0b\xcd\xcf\x15\x22\xbd\xb1\xfe\x11\x67\x32\x58\xdf\x7e\x46\xef\x4d\x32\x66\x65\x09\x31\x56\x55\x3f\x28\xb3\x56\x3f\xe7\x19\x2f\x72\xf5\xf9\xb3\x90\x3d\x79\xfe\xa0\x4e\x2c\x48\x8b\x46\x5b\x49\x78\xd6\x9f\x26\xe0\x5a\x59\xd5\xed\x4e\xf4\xca\xb2\x32\xac\xfd\x56\x4f\xc6"}, +{{0x86,0x5a,0x43,0x2e,0xcc,0xe7,0xe7,0x8c,0x42,0x70,0x9f,0xc1,0xe5,0x31,0xdf,0x5e,0x39,0x59,0x13,0x2b,0x2b,0x6f,0x31,0x8f,0xd1,0xc3,0x45,0x21,0xf9,0xa2,0x6e,0x3b,},{0xc7,0xa8,0xca,0xf8,0x93,0x0b,0x62,0x2a,0x50,0x13,0x37,0xf9,0x28,0x40,0xed,0x96,0x61,0x1a,0x32,0x20,0x80,0xfd,0xe5,0xe4,0x9f,0x0a,0x2f,0x6e,0x33,0xb8,0x82,0x83,},{0x32,0xbb,0x75,0x20,0xe2,0x63,0x9c,0x6c,0xca,0x19,0xa2,0xb9,0x83,0x6b,0x08,0xf8,0xb0,0x83,0xca,0x33,0x36,0x9d,0xdf,0x5f,0x9a,0x87,0x7d,0x4c,0x7a,0x9e,0xb0,0x5f,0x9c,0x3d,0xc3,0x4e,0xd4,0xcf,0xa4,0xb2,0x83,0xe5,0x19,0x22,0xb0,0x94,0x06,0x6c,0xe9,0xff,0xa4,0xd9,0xdf,0x62,0x19,0x10,0xca,0x37,0xb0,0xb3,0x7f,0xba,0xbb,0x0e,},"\xb2\x31\xb6\xd2\xec\xde\x49\xf5\x13\xb0\xdf\x25\xaa\xfc\x3e\x5d\xa4\x5b\x6a\x99\x58\xd6\x0f\x54\x64\xca\x59\x3c\x03\x00\x5e\xcf\x36\x1e\xf1\x69\x6b\xb6\xe5\x5d\x65\x38\xe3\x4b\x38\xf3\x24\xc2\x1c\xea\x5c\xc8\x1a\x00\x73\x27\x8b\xb9\x27\x27\xef\xf8\x1a\xf5\x61\x80\x2d\xce\xf3\x3b\xec\x10\xad\x65\x94\xe2\x2d\x9c\x44\x18\xaf\x39\x88\xa4\x3e\xd0\x87\xb9\x95\x4b\xf8\xd6\x28\x3e\x4b\xea\xe8\xc0\x96\xde\x66\x06\x75\x1c\xbe\xd6\x85\x84\x6c\x66\x30\xb9\x52\x8f\xf3\x64\xa7\xc4\x84\x64\x11\x34\x72\xc9\x86\x0b\x33\x71\x96\x3c\x91\x14\x95\xa9\xc6\x28\xa3\xe3\xe4\x7a\xb0\x99\x1f\x10\xdd\x1d\xd3\x31\x61\x52\x52\x62\xd6\x3b\xab\x64\x88\x19\xd5\x7d\x12\x69\xe1\x14\x82\x5c\x54\x34\xe6\xb2\x84\x5f\x42\x79\x5d\x4f\xb0\x83\xad\x79\x40\x1f\x2a\x07\x61\xc6\x34\xa5\x45\xae\xc7\xcd\xb1\x3b\x5b\xe4\x49\xf1\xd8\x29\x32\x63\x78\xed\x1f\x49\x3f\xe8\xc8\xe9\xb0\x68\xcc\x1d\xbc\xf1\x65\x55\x0b\x81\x32\xc3\x19\xda\xc4\x87\xb8\x7b\xb2\x2a\x54\xcd\xf6\x0a\xac\x71\x51\x61\x82\xa4\xe6\x9b\xa0\x83\xf6\xe8\x6d\x1a\x4f\x05\x08\x3a\x77\x61\x9e\xf2\x39\xf7\x02\x39\x6d\x7e\x46\x96\x8c\xc0\x4a\x3b\x34\xdf\x32\x65\xec\xf1\x61\x57\xab\xe1\x5c\x64\x2c\xd7\x42\x70\x96\xd8\xd4\x0d\xb0\x02\xd1\x96\xca\xb1\xbe\x30\x4b\xcf\x32\x2d\x9d\x1a\x24\x51\xb6\xc1\x1e\xea\xf3\xe8\xe3\xd9\x29\xf4\x80\xb6\xb7\x78\x04\xfe\x84\x49\x6c\xa7\x57\xe0\x43\x37\x91\x4c\xe9\x44\x75\xd7\x99\x0c\x74\x57\xc8\xe6\x06\xf8\xbc\x20\x7d\x2d\x48\x11\x9c\x80\xa6\xb4\xa9\xe0\x7b\x22\x92\x26\x57\x0d\xcd\x99\x49\x89\xfe\xcc\x69\x4c\x6c\x2f\xb5\x97\x5c\x9a\x6a\x9b\x74\xe8\x15\x9c\x27\xdd\x36\x77\xdf\xd5\xcb\x65\x1f\x1e\x32\xad\xfa\xfd\x81\x0b\x6e\x5d\x5e\xfb\xac\xe3\x1a\xe6\xd9\xb1\x21\x91\xe8\x93\x98\xda\x06\x3f\x13\x8b\x75\x84\xc5\x8e\x77\xe7\xf9\xfd\xd7\xfb\x9e\xf5\xd6\x8a\xe4\x9c\x6c\xca\xd2\x8d\x18\xbc\x60\x09\xd4\x18\x7e\xd1\x42\x02\x24\xa5\x65\x8a\xad\xf1\x35\xb5\xa9\x53\xf2\xdc\x3c\x8b\xfc\xaf\x66\x9e\xd5\xda\x38\xd0\x14\x4f\xd9\x66\x5e\x6f\x06\x77\xd3\xfc\x88\x04\xe2\x1c\xc2\x5f\xd5\xe0\x1a\x3f\x3f\xa8\x3e\x57\x1e\xb2\xf8\x82\xa7\x65\x9c\xe5\xd8\x64\xd8\xbb\x54\x07\x2b\x09\x86\xa8\x54\xf1\xa7\xf2\xd2\x72\x0d\xf8\x57\xe6\xd4\x21\x96\x30\x84\x1b\x1c\xcd\xcf\xc6\x72\x6b\x91\xbf\xc1\x7e\x18\xc3\xe3\x48\x0c\x23\xa2\xc0\x5e\x4b\xfe\xdd\xd4\xdb\x9e\xf4\x23\x88\xf2\x34\xfd\x3e\x4f\x3d\xad\x66\x60\x26\xe2\x78\x06\x12\x37\x41\x61\x31\x6a\xfc\x76\x65\xf9\x41\x1b\x6c\x5a\xa7\x89\x33\xb1\x80\x21\xc0\x12\xb0\x84\xf3\x24\x47\x60\xa4\xea\x1b\xcf\x31\xcc\x9f\x5c\x40\x44\xa9\xbc\xc7\x5a\x98\x67\x07\xf3\x8f\x45\xac\x1c\x7f\xa1\x39\xee\x95\xa6\xd8\xf1\x6c\x3c\x1e\x12\x76\x4c\x4b\x0b\x11\x94\xc0\xfc\x5f\x7e\xef\xf9\xa8\x48\xc4\x05\x0b\x0e\x65\x16\x84\x71\x9d\x43\x8a\xad\x56\x01\x91\x64\xfa\xe4\xf4\x88\x82\x20\x5e\xce\x0b\x99\x73\x67\x91\x08\x4a\x75\x3b\xa7\xd5\x6e\x88\xfc\xee\xa5\x33\x56\x6c\x3a\x2c\xa4\x8d\xd6\xef\xc4\x9b\x27\xdb\xf1\x4f\x26\x16\xce\xd6\x52\xe1\x38\x33\xab\x90\x28\xad\xa4\x54\x43\x1c\x89\xb3\xcb\x74\x41\xfd\xb8\xf2\x3e\x12\xb6\x0a\x1a\x10\x4a\x2a\x8c\xf4\xa6\x4e\x87\x8a\xa2\x6f\x54\xe8\x88\x1a\x4b\x15\x1a\x16\xa9\x6d\xe8\xb9\x80\x7e\x72\x93\x96\xeb\xe3\xe3\xd3\x94\xf8\x08\xbd\x74\xb7\x31\x2f\xe6\xb8\x4b\x13\x12\xaf\x8a\x1e\x41\x33\x59\x9d\x07\xbd\xf3\x3d\xb2\x1e\x01\x6b\x5c\x19\x6c\x1b\xa3\x11\x57\x08\xf5\x81\xbb\x82\xf4\xb5\x7a\x6c\xa1\xa5\x29\xe6\x4d\x19\x30\x42\xc1\xdc\x5f\xaa\x0a\x03\xab\xf5\x38\x49\xe1\xbd\xef\xba\xb6\x4b\x1c\xb6\x0f\xe1\x0a\x3f\xc1\x82\x3a\x23\x4c\x45\xf3\xb0\xdc\xe6\x6a\x46\x73\x9c\x01\xae\xad\x12\xde\x6f\x03\x13\xc7\xbe\x71\x40\x5f\x3f\xdc\x4a\x50\x7a\x9d\x84\xe8\x68\x6f\x6f\xc9\x26\x35\xdb\x0f\x78\x56\xc7\x37\x3a\x61\x8a\x72\x52\xc1\x29\xa7\x76\x0e\x20\x29\x54\x3d\x72\x62\x28\xc2\x1d\x00\xad\x4a\xc5\x2e\x5b\x1a\x6e\x31\x20\x09\x17\xf1\x5a\xf5\x15\x85\x9e\x08\xf2\xa7\x9a\xce\x67\x99\x1e\xd6\x90\x44"}, +{{0x2b,0xe1,0xf9,0x8c,0xe6,0x55,0x3c,0x91,0x5b,0x6a,0x09,0x33,0xec,0x0d,0xe3,0x47,0xb3,0x70,0xe2,0x9c,0xa2,0x94,0xe8,0x00,0x55,0x41,0x23,0x9f,0x63,0xb4,0x30,0xd0,},{0x7a,0x6f,0x44,0x69,0xc3,0x0a,0x63,0xf5,0x60,0xf9,0x87,0x34,0xfc,0x19,0x06,0xeb,0xd1,0x37,0x1e,0xd8,0x01,0x25,0xfa,0x3e,0x4c,0x86,0xb4,0x3f,0x26,0x2c,0xab,0xbc,},{0x8e,0x65,0x9a,0x3f,0x53,0x5a,0x58,0x9a,0x5f,0xd2,0xd2,0x17,0xcb,0xcb,0x8b,0x77,0x7e,0x5a,0xf2,0x0b,0x23,0x44,0x32,0xf7,0xda,0xc2,0x9f,0x81,0x0a,0x2b,0x47,0x37,0xc5,0xca,0xb1,0x0b,0x59,0xdf,0xd0,0x14,0x4f,0x30,0x90,0xf5,0xf9,0xe0,0xe6,0x67,0xf0,0xe2,0x1a,0x9f,0x57,0x3f,0xe1,0x3b,0x1c,0x28,0xec,0xcb,0xb5,0x31,0xa2,0x05,},"\x62\x68\x20\x1f\x93\x2a\x7c\xd3\xf8\x79\xae\x6a\xb8\x38\x55\xa2\xf5\x02\x91\xde\x78\x4d\x7d\x9e\x9a\xda\xa1\xb9\xaf\xed\x6f\x5a\xea\x20\x24\x0e\x59\xfe\x93\xe5\xa7\x08\x8c\x95\xec\x8e\x15\x74\x5f\xb8\xfd\xeb\x91\xdf\x01\x51\xc7\xb4\x60\x50\x67\x56\x1e\xa0\x8d\xbf\x00\xc4\xff\xe1\xfd\x0a\xcf\x10\x36\x56\xa7\xb5\x4f\xad\x0f\x25\xab\x16\xb4\xbd\xa3\x47\x17\x9e\xd1\xca\xdb\x7b\x98\xbe\x08\x95\xe0\x50\xdc\xbc\x37\x9d\x1f\xd5\x53\xe9\x97\x95\x92\x8b\x67\xa7\x52\xf8\xd2\xec\x1b\x9d\x66\xbf\x6a\xc9\x97\xe7\x44\xdc\x32\x7f\x24\x22\x30\xf9\x2e\x79\xae\x31\x27\x45\xa5\xab\x6d\xde\xc1\x99\x8f\xb6\x3d\xc4\xf6\xb0\x5f\x14\x72\x22\xd4\xb6\x5a\xce\x90\x17\xdc\x1b\xcd\x67\x5e\x49\x5f\x9e\xab\xb5\xf6\x02\x13\x3f\x6c\x72\xe0\x53\xe9\xf4\xae\x30\xd8\x72\xd7\x8b\xf7\x1f\xeb\xa3\x7a\xcc\x59\x50\x55\xc3\xbe\xa5\x3a\x05\xef\x0c\x7f\x21\x2d\xcf\x4e\x0a\xf8\x38\xea\x29\x28\xf4\xcd\xc9\xfd\xc8\x37\xda\x25\xf2\x69\x66\xb2\x45\x6a\xbe\xa6\x6a\x5d\xfb\x8f\xaa\x8f\xa0\x91\xf7\x33\x1d\x54\x36\xe9\x8a\x8d\x63\x23\xcc\x9e\x9a\x91\xd5\xa0\x2a\x49\x51\x17\x14\x84\x9b\x47\x45\x4b\xaf\x99\xc5\xf8\x50\xa0\x8d\x3d\x98\x41\x0e\x93\x9a\x9e\x89\xb1\x50\x53\x82\x5f\x3e\x9a\xee\x71\x44\x74\x16\x14\x07\x82\xe1\xbf\x3b\x0d\x8b\x4f\xf6\x2e\x77\xa4\xa0\x3f\x71\x0a\x8a\xb7\x6c\xf6\x35\x92\xc0\x5c\x44\x0c\x8f\x06\x47\x70\x09\x91\x63\xc1\x22\x70\xf3\xd5\xec\x9a\x6b\xc9\x71\x5b\xff\xfe\xc7\x69\x61\x1d\x21\xfa\x00\x3c\x3c\xc8\x35\x6c\x97\x5d\x37\xb6\x2b\x88\xaa\xbb\x85\x97\xda\xca\x19\x6c\x96\x48\xa3\x1d\x15\xbb\x0b\x86\xcf\x07\x0e\xe0\x1e\x51\x1e\xf3\x73\xb4\xa4\x4c\x6a\x00\x16\x0a\x79\x7f\x2e\x82\x0b\x71\x6f\x5c\xa6\x44\x64\xe4\x18\x9a\x00\xfe\xe9\x78\xd3\x5b\xf2\x04\xf7\x1d\xb1\xf5\x01\xf9\xb6\xe5\xdf\xc8\x21\xa8\xaf\x5d\xbf\xef\xd3\x53\xad\x36\x81\xf9\xbc\x3c\x22\xc6\x7c\xb2\x11\xb4\x30\xb6\xa5\x5f\x3e\x73\xda\x7c\x3a\x07\xce\xb7\xd2\xfe\x25\x4b\x10\xc2\x70\x3a\xb2\xe2\x29\x4d\xd0\xd3\x15\x2d\xc7\xb2\x1a\xab\x87\xb1\x50\xf7\x37\xa9\x47\x46\x3f\xb2\x04\x17\x5d\xe8\x54\x32\x36\xfb\xb0\xda\x5c\x7d\x48\xc5\x7f\x61\x74\x4d\xe6\xf9\x84\xaa\x8e\x61\xb9\x70\xc6\x2d\x0e\xeb\x84\x9d\xa7\xe8\x9a\x61\x22\x2d\x43\x20\x79\xcb\xcf\x5f\x8a\x2b\xa9\x30\x30\x16\x83\xc0\x78\x5c\x26\xfd\xf8\x5d\xa3\x02\x08\x74\x60\x45\x99\xac\x6c\x84\x7e\xc2\x60\x86\x58\xb5\x78\x8c\x7b\x8d\x3a\x37\x44\xfd\x54\x42\xe2\x4c\x8e\xec\xcd\x42\x07\x56\xbd\xd8\xb8\xa7\x7c\xfd\x80\x58\x96\x05\xdc\xed\x9a\xfd\xa2\xbd\xb6\x30\xa0\xcb\x61\x2f\x73\x9c\xe6\x17\xd5\x4e\xde\x6c\xcf\x36\xaa\x31\xe7\xe3\x73\xd8\xa0\xfb\x1b\x7c\x99\x06\xf7\x6b\x5f\x9d\xe8\xc2\x68\x91\xde\x00\x6e\xb7\x97\xea\xd4\xa8\x6f\x70\x16\xf3\x4b\xcd\xe9\x2f\x94\xac\x3e\x92\x0b\xa5\x8d\x6d\xff\x77\x20\x78\xd8\x02\xa9\x4f\x56\xcb\x26\xbf\x79\x4f\xd9\x0c\xa0\xad\x4f\x2e\x7a\xcd\xc5\x92\x9b\xc7\x36\x49\x97\xde\xd9\x8c\xa6\x9c\x57\x39\x91\xbb\x9a\xb8\x5f\x23\x5b\x63\xe7\x6f\x77\xe0\xab\x45\xe7\x89\x12\x38\x98\x69\xaf\x21\xe7\x4e\x66\xf7\xc4\x56\xb8\x27\xe6\x70\xbe\xb0\xf0\x72\x66\x88\xbb\x1f\x90\x36\xd3\x8d\xa0\x7d\x69\xea\x36\x66\xf7\x6b\xd6\x05\xd8\x2e\x2d\xd6\x38\x7e\xce\x6e\x82\x4a\x56\x97\x00\xf0\x1b\x19\x5d\x1a\x9b\xdc\xb0\xf9\x6a\xb5\xc5\x4e\x06\xc2\x11\x9b\x40\x6b\xc4\x88\x84\x80\x66\x04\x18\xbb\x42\x88\xea\x2f\xda\x96\x63\x1b\x0e\x1f\x60\xac\x86\x1d\x6c\xcc\x4c\x84\x4b\x64\x7a\x7d\x74\x03\xbc\x2d\x15\xba\xfe\x4a\xf6\x77\xe8\x56\xfe\x0d\x2b\x5f\x66\x3b\xe4\xe4\x80\xb3\x8f\x6b\x76\x6a\xdc\xd3\xd0\x52\x98\xef\x13\x98\xd0\x4d\x15\x23\xa6\x8b\x91\xdd\x31\xcf\x5d\xc4\xb7\x3d\xec\xbf\xd7\x21\x3f\x98\x1b\x20\x7e\x1f\x6e\xf2\x25\xd7\x94\x8a\x1a\xa1\x7d\x8d\x57\xa1\x12\xf1\xd4\x46\x8d\x2d\x28\xf7\xec\x2e\x54\xb7\x4a\x69\x2c\x59\x58\x02\x2e\x82\x03\x1a\x41\xb3\x15\x09\x0e\xd4\xd5\xbd\x7b\xd0\xb4\x51\x47\x63\x38\xf7\x39\xa7\xd7\x03\x1a\xf2\xd3\x6c\xaa\x09\xff\xdb\xb7\xc3\x96\x50\x7c\x75"}, +{{0x10,0xbb,0xe6,0xe7,0x61,0xa7,0x5c,0x93,0x5b,0x51,0x7f,0x09,0x36,0xfe,0xcb,0x9e,0xc6,0xfc,0x21,0x5e,0x58,0x13,0x08,0x00,0xea,0x18,0xd1,0xff,0x44,0x2a,0x4f,0x13,},{0x86,0x43,0xdd,0xf8,0xaa,0x8d,0x9c,0x8a,0x78,0xb6,0xeb,0x69,0x9f,0xd2,0x0a,0x57,0xf6,0xf1,0x86,0x36,0xb0,0x6c,0xe6,0x9d,0xac,0xdc,0xa1,0x26,0x7a,0xcb,0x39,0x54,},{0xf0,0xf3,0x57,0x41,0x03,0x73,0x31,0x3b,0x7c,0x62,0x52,0xd6,0xd9,0x66,0x00,0x36,0x0c,0x23,0x75,0x2d,0x43,0x1c,0xa8,0x07,0x5b,0xcf,0xb7,0x72,0xd4,0x9c,0xd6,0x09,0xb6,0x5c,0x9c,0xd8,0x38,0xd6,0x34,0xd8,0xd9,0xb9,0x5d,0x1e,0xe3,0x0e,0xde,0xcc,0x13,0xe3,0xca,0x99,0x7b,0x24,0x37,0x30,0x3f,0x8a,0x33,0xa1,0xff,0xc8,0x33,0x06,},"\xe8\x10\x8c\x6d\xe4\x13\x37\x33\xdc\x19\x9a\x73\x39\x2e\x22\x6f\x71\x2c\x36\xa2\x4f\xa9\x1d\x6f\xb0\x9f\x92\xdf\x21\x8d\xeb\x2d\x28\x30\xa6\x68\xfd\x69\x4b\x48\x09\xd0\x25\x35\x07\x23\x12\x47\xc7\xf2\x58\xb4\xd6\x5c\x56\xbb\x69\x34\x5e\xf6\xaa\x97\xe7\xc5\x9e\x81\x53\x77\x5a\x5a\x3c\xf1\x09\xc4\xbc\xa9\x81\x55\x69\xda\x69\x32\xe8\x21\x83\x42\x5b\x42\xd7\x48\x3c\x9d\xbf\xcb\xd8\xeb\x38\xc8\x47\x29\x57\x1e\x8e\xc9\x39\x82\xc3\x17\x71\x67\x59\x59\x8c\x4f\x6a\x1b\x7f\x8d\xa7\x30\x6a\x78\x15\x72\x1c\xaf\x02\xe7\x02\x46\x71\x23\x14\xf7\x66\xbe\x9c\xb1\x77\xcd\x2f\xa3\xbd\xa2\x2c\xd6\x76\xc5\xd2\xe8\x6e\x8d\x79\x8f\xd3\x4f\x54\x3c\x9b\xe3\x12\x96\x51\xf2\x73\xf4\x84\xf0\xb9\x46\x7b\x14\x09\x55\xcd\x29\x81\xff\x26\x03\xc0\xbd\xbb\x43\x6a\xc0\x95\x5a\x11\x6c\x5e\x5f\xc3\x04\x25\xe1\xfe\x78\xf6\x41\x0f\x6e\xf7\x57\xf6\x04\x66\x88\x54\xba\xe7\x9b\xfe\x22\xe1\xa8\x5c\xe5\xee\x5d\x64\x34\xb4\x61\x01\x20\xea\x7e\x5d\x3d\x13\x7c\xe2\x07\x51\x4f\x85\x34\xad\x9b\xf3\x92\xb7\xdc\x53\x55\x51\x4b\x59\xf8\x35\x46\x6c\x8e\xb5\x6f\x44\xed\xdc\x5b\xad\x20\xcf\x0b\x48\x0b\x2e\x82\x2a\x6f\x46\xfd\x95\xf3\x0f\x18\x3c\x7b\xb3\x14\x3e\x4e\x61\x00\xe2\xdb\xc9\xf2\xbf\x0d\x43\x07\x3e\x0f\xe6\x5f\x01\xbc\xce\x6a\x1a\xe4\x01\xc1\x25\x41\xbe\x3a\xe6\x8c\xde\xac\x2a\x4a\xc7\x1f\x16\x63\xb5\xfd\xfc\x2e\x50\xf0\xe0\x77\xfb\x3a\x0a\x8b\x8e\xee\xad\x62\x7c\x1c\x3e\x79\xdd\x73\x61\x04\x6f\x7e\x57\xc1\x74\x36\xc3\x2d\xc4\x43\x2f\x05\x00\x28\xcc\x7a\xa4\x40\x8c\x2d\x29\xd1\xd7\x99\x8f\xdc\xdd\xa3\x2b\xb3\x2f\x70\x4d\xc2\x63\xdb\x9b\x8e\x06\xc5\x76\x30\x87\x0f\x8b\xb6\xec\x66\x1f\xde\x1b\x7d\xa9\x4d\x53\xb0\x47\x70\x1a\x45\x88\x47\x8c\x1c\x66\x23\x46\x74\x1a\xea\xc4\xc2\x53\x38\x55\x6a\x3d\x84\x8d\xe5\xb2\xa2\x3e\xce\xa6\x1b\x77\x6b\xd0\xe8\x03\x7e\xfb\x85\x01\xef\xf2\x39\xc7\xfa\xcc\xa6\xc8\x36\x7e\xd7\xc8\xad\xce\x91\x9f\xef\x1a\x15\x5a\xe0\xd5\x47\x8a\x98\x00\x2c\x95\xa1\x6f\xbf\x4c\x0e\xd0\x16\xea\x5d\x38\x66\xfe\x1d\xe4\x54\x83\x2a\x4e\x95\x65\x97\x6b\x60\xb3\xdd\x2e\xaf\x7f\xee\x61\x2f\x2b\xc0\x40\xd9\x39\x75\x43\x5e\xeb\xd1\x2f\x06\xeb\x09\xec\xea\x2c\x66\x76\x83\x08\xf5\x8c\x77\xac\x51\xed\x7b\xd2\x16\x36\xfc\x9c\xc3\xfd\x14\x87\x0b\xd0\x6b\xdf\x12\x8a\x81\xb1\x47\x92\xe6\x08\xc4\x7e\xa2\xd5\x35\xca\x7a\xa2\x1e\xb8\xa8\xa5\x6d\x76\x99\x16\x63\xa8\x19\x0a\x95\x05\x7d\x33\x67\x1e\x73\xc7\xcb\xce\x5a\x98\xd3\x1e\xf0\xd7\x3b\xd0\xb1\x63\x78\x7b\x7f\xdc\xd2\xdd\xfc\x72\x96\x0f\x2b\xe3\x20\x84\x6d\x4b\x29\x08\x0d\x7a\xeb\x5b\x7e\xa6\x45\xa2\xad\x5a\x59\xc0\x12\xbf\x7b\x95\x15\xd8\x59\xe1\xc1\x47\x2e\xf8\xa4\xd3\xc9\x5e\x71\x1a\xf9\x7a\xe4\x61\x8e\xfb\xab\x3d\xff\xe8\x8c\x9f\x6a\xf4\xa0\x9b\x0e\x73\x38\x7e\x25\x1b\x77\xd7\xbf\xf5\x21\x4f\x79\x18\x62\xdb\x69\x88\x41\x1e\x2a\xe2\xc7\x5b\xf2\x8d\x28\x60\x2a\x63\x7c\x26\xf4\x9c\x18\xd3\x09\xd2\xfc\x58\xa1\x26\x66\x7a\xd3\xc2\xec\x16\x0c\x99\xba\x40\xfb\xda\xc1\x7e\x7e\x4c\x21\xa5\xd5\x07\x85\x97\x62\xeb\xa0\x9c\x41\x60\xdf\x66\xf5\xfe\xef\xe6\x71\x5a\x28\xc5\x29\x6c\xf4\x3e\x5e\x77\x1f\x31\xfc\xe5\x13\x3b\xe9\x7c\xab\x57\x30\x1b\x4c\x9d\xf9\xcd\x9a\x4a\xcf\x1c\x33\xfa\xc9\x46\xfa\x15\x96\xfa\x65\xc8\xf3\x65\x8b\xe4\x7a\x47\x3a\x62\xc5\x21\x81\xec\xa1\x83\xe4\x24\x6c\xd6\x24\xd8\x78\x3d\xcc\xe5\xfd\xcc\x1f\xea\x17\x3f\x80\x71\xf7\x07\x4f\x55\x89\x7d\xe9\xbf\xe8\x4a\x6c\x4f\xdf\x80\x2d\x50\x26\xb8\x14\x5e\x6c\x8c\x89\x50\xaf\xc5\xb4\x0f\xd0\x35\x6f\xc5\x5e\xe1\x7e\x1f\x85\x3a\x4c\x2f\xcc\x34\xa1\x36\x9b\x87\xd2\x8d\xc2\xfd\x20\x10\xf1\x99\x03\xaf\xf8\xe4\x6d\xe0\x49\x38\xf4\x94\x82\x45\xd5\xb4\x25\xd0\x74\xac\xdf\x2b\xd8\x0b\xfc\x37\x35\xcc\x34\xa2\x25\x90\xf1\x94\xaf\x93\x13\xee\xf4\xab\x5f\xde\x61\xf1\xf9\xb5\x85\x78\x63\x8f\xcb\x4f\x28\x50\xb2\xfc\xe6\xe0\x3d\xb4\xd0\xa8\x34\x84\x81\x63\xc4\xb2\x7e\x12\x9f\x5c\xc7\x4f\x67\xf0\x08\xa2\x71\x2d\x1d"}, +{{0x18,0x6d,0xcc,0x7e,0xfc,0x5e,0xd7,0xe6,0x1a,0xe5,0x3d,0xc4,0x20,0x93,0xba,0xe8,0xf1,0x5d,0xd9,0x9f,0x0f,0x03,0x33,0x26,0xc5,0x76,0xff,0x75,0x69,0x50,0xd0,0x6d,},{0xc8,0xd1,0x41,0xac,0xb6,0x42,0xaa,0x9b,0xfb,0xd5,0x43,0x27,0x7c,0x2d,0xca,0x8a,0xa9,0x88,0x8e,0xef,0xf0,0x45,0x43,0xb3,0x78,0x9b,0x21,0xf2,0x6a,0xeb,0x0f,0x71,},{0x89,0x45,0x06,0x97,0x87,0xc1,0xc6,0x76,0xa8,0x4a,0x70,0x3c,0xae,0x1e,0x0b,0xac,0xae,0xff,0xd3,0x3e,0x91,0xbe,0xc3,0x60,0x3e,0x1f,0x13,0xfb,0x17,0x0e,0x31,0xe6,0xd7,0x04,0x9e,0xda,0x2b,0xf6,0x27,0x18,0x0f,0x45,0x6c,0x3f,0x7a,0xab,0xfc,0xd3,0x6c,0x49,0xa8,0xc0,0x4f,0x8a,0xe6,0x92,0x9e,0xc5,0xad,0xa0,0x7b,0x65,0x72,0x08,},"\x97\x43\x64\xd6\xc8\x38\x84\x2c\xcc\x4e\x74\x9e\x6a\xfd\x53\x71\x70\xdc\xd8\xcc\x50\xd6\x66\x54\xd1\x05\x48\x23\x39\xca\xbd\xf7\x4e\x32\x93\x5e\xe2\x19\x27\x2e\xa1\x68\x4f\xb9\x3c\x1f\xab\x42\xb5\x63\x18\x39\x24\x35\x91\xbd\x07\xd3\xbe\x94\x9b\x0d\xd1\x5e\x31\x96\xdf\x19\x6b\xa7\x52\xad\x11\x21\xac\x71\x12\xd5\x66\x94\x4e\x15\x3a\x4e\x06\x19\xb3\xa2\x32\x24\x1f\x02\x0b\xe0\x71\x9f\x6b\xec\x91\x8b\x26\x82\x8e\xb1\x67\x0e\xcf\xc7\x3c\x66\x84\x4e\xa3\xe4\x04\xc6\xa2\xfc\x01\xbe\xb4\x03\xc9\xd6\xca\x55\x1a\xd8\xa6\xe7\x1f\x46\x64\x7f\xa6\x05\x3f\x03\x14\xf8\x12\x4d\x8d\x2b\xc1\x2c\xc8\xfa\x8d\xb9\x5f\x2b\x73\x53\x75\x20\x1b\x81\x6a\x9c\xf4\x0f\x83\xee\x4b\x86\x71\x61\x80\x32\xde\x22\x9c\xe7\x62\x71\xd0\x3d\x26\x72\xa1\xae\x4a\x28\x8c\x85\xdc\xd2\x7f\xb8\x45\x2a\x81\x32\xe9\xff\x29\xe1\xe8\x9b\xf1\x1b\x1c\x83\x51\x92\xc0\x4b\x13\xbe\x14\xf3\xcd\xe5\xd3\x7c\xe9\x6f\x1d\xc2\xa9\xcc\xda\x0c\x4d\x73\x7b\xca\x1f\xa2\x20\xd2\x1b\xf3\x60\xb9\x05\x15\xbb\xd2\x26\xbb\x2a\x6c\x8d\x5f\x2a\xb0\x18\xd4\x08\x4e\x24\xee\x33\x3c\xe4\xe3\x9b\xcb\x6b\x46\xe7\xae\xb4\xdb\x9b\x6c\x65\xb2\x44\xd9\x82\x82\x3a\x77\x0f\x9c\x62\xa0\xbd\xe2\xcb\xb7\xec\x36\x84\x0d\x45\x51\x87\xfa\xff\x4e\x48\x8a\x5c\x60\x8e\xbd\xb7\xdb\x84\xd8\x7d\xad\x38\x67\xe3\xb0\xd0\x4b\x64\x71\x5e\x16\x56\x0a\x62\xf1\xee\x03\xdf\x61\x83\xfd\x5e\x37\x55\x5d\xa1\x97\x2f\xca\x06\x2d\x12\xbb\x84\x20\xe0\x82\xda\xcb\x8d\xeb\xb9\xc1\x43\x85\x41\xd0\xda\x24\x64\xef\x7e\xc5\x22\x63\xfb\x9b\x9a\x4c\x46\x9c\x83\x32\x3e\x48\x19\xdf\xdf\x4f\xa0\xa7\x70\xc3\xa7\x09\x25\x4e\x05\x31\x48\x30\xe8\x7f\xbb\x67\x36\xc7\x2d\x9d\xab\xe0\x1a\x31\x0e\x91\xeb\xbf\xae\x76\x7a\x1f\xcb\x62\xf6\x4f\xa3\xba\x8d\x53\x40\x0d\x64\x69\xad\x1c\xcb\x81\x1f\xb9\xe1\x15\xf1\x41\x27\xb1\x3e\x83\x64\xaa\x2f\xe8\x0b\xbc\x88\x6a\x10\xdf\x1b\x9c\xc4\xae\x46\x01\xf5\x46\x1a\xf0\x91\xf5\x26\xd2\x72\xda\x9b\x20\x38\x57\xa4\x44\x7e\xab\xde\xf4\x39\x83\x04\x96\xa5\x75\x9c\x21\xde\x65\xba\x3a\x3c\x8b\x8e\x93\x9c\x46\x13\x32\xa9\x24\x85\x2c\x20\x5c\x77\x11\xf3\xa6\x8a\x23\x67\xa9\x45\xde\xf4\xfb\xe5\xf8\x1c\x60\xcb\xb7\xe3\x94\xa2\xa4\x9b\xe9\xec\x2a\xae\xb1\xf3\x30\x57\x59\x79\x44\x6a\xd9\xd0\xd5\x4a\xbd\x43\x6f\x28\x60\xf0\x42\x34\x26\xf4\xbb\xc2\x6b\x3b\x9f\x65\x0d\x69\xb1\x00\x72\xd7\x47\xa3\x9e\x47\x8f\x45\x5e\xaa\x12\xc7\xc6\xe1\x2b\xfc\x45\x36\xa3\x59\x43\x44\xbd\x02\xb6\x20\xe3\xe2\xb4\xe0\xd5\x34\x08\x9d\xd7\xb0\x4f\xa6\x34\x80\x45\x67\x58\x6c\x62\xbe\x03\x91\xc7\xbd\xb0\xa9\xfb\xc1\xef\x3b\x33\x21\x1e\xdb\xf8\xef\x58\xc2\xb7\xa4\x9d\x06\x66\x79\x59\xd7\xe5\xd4\x46\x71\xee\x73\x57\xa1\x0b\xa0\xcb\x1a\x44\x5a\xe5\xd7\x09\xce\x25\x5e\x92\xde\x71\x59\x75\xaf\x94\xb8\x9d\x4a\x29\xc7\x1f\x9d\x88\xc8\x5b\x6c\xd1\x1d\x8b\x33\x5b\xf8\xf2\xc6\x58\xe6\xdd\x7c\x3f\x6c\x80\xad\x4d\x0e\x5a\x6c\x87\xdb\xa7\xb5\xb8\xa8\xa4\x7e\x72\xf4\xd1\xd3\xc7\x43\x63\x1d\xf9\xad\xfc\xfa\x45\xce\xe0\x49\x8d\x5a\x44\xa9\xf7\x5c\x83\xb7\x5b\x2a\x3c\x23\x0f\xf0\x76\x7d\x38\x88\xf9\x41\xee\x1b\x66\x24\xdd\x0e\x12\xd0\x6e\xd1\xab\x8b\xb1\x35\xff\xd3\x79\xe9\xde\x37\x88\xbe\x54\x1a\xad\xb2\xd6\xa7\xcc\x60\x13\x16\xf2\x1e\xb9\xaa\xa9\x22\xf5\x6a\x8e\x35\x26\xc9\xbd\x11\x77\xfe\xfc\x2f\xbe\x3e\x43\x0b\x62\x8e\xeb\xd6\x66\x1e\x3b\xa2\xd6\x31\xc6\xa8\x42\x2c\x24\x1e\xcd\x96\x99\x72\x41\x2f\x74\xda\x6b\x12\x43\xbf\x0f\xbe\xe8\xa8\x4d\x52\xe4\x0a\xee\x3f\x1e\x4f\xc8\x31\x40\x2c\x62\xf3\x57\x6b\x22\xe8\xe3\xc3\xdc\x4e\x16\x0b\xc3\xb6\xb9\xd2\xce\x00\x58\x53\x81\x2e\xaf\xc0\xa4\xe2\x5b\xa7\x12\x27\x9b\x00\xba\x3f\x91\x30\xff\x36\xe3\xef\x19\x71\xdd\xe7\x50\x8b\x27\x92\xfe\x64\xd4\x75\x68\x8f\xc6\xf3\x31\x3a\xad\xb7\x85\x30\x2e\x6b\x7f\x9a\x84\xf2\xdb\xc2\xf3\xcf\x06\x0e\xe0\x8b\x46\x37\x36\xf8\x36\xdb\xb2\x62\xd3\x29\x68\x4c\x20\x84\x92\xd1\x7d\x81\x12\x21\xbe\x02\xb6\x5e\xe2\x8e\x11\xb5\x46\x92"}, +{{0x07,0x05,0xb3,0x36,0xc8,0x9c,0xa3,0x5f,0xfd,0xde,0x0a,0xf0,0xf9,0x06,0xea,0xcf,0x62,0x3c,0x56,0xc3,0xf7,0x67,0x38,0x16,0x8e,0x76,0xfc,0xd5,0x88,0x2d,0xf7,0x9e,},{0xea,0xaa,0xf2,0xa1,0x5f,0x44,0xb6,0x34,0xce,0xf1,0x5a,0x63,0x8b,0x80,0x20,0x7f,0x61,0x09,0x9a,0x07,0x96,0xf5,0xd4,0x3f,0x3e,0x9d,0x04,0x8e,0x6a,0xe7,0x96,0xc1,},{0xd4,0xa9,0xba,0xe8,0xec,0xc4,0x72,0xc3,0x76,0xba,0xb8,0x05,0xc2,0xce,0x0c,0x1c,0x2e,0xd5,0xfc,0x77,0x37,0x15,0x46,0x8c,0xb1,0xa4,0x93,0x45,0x64,0xda,0xce,0xcf,0x43,0x8b,0x1d,0xd2,0xac,0x1b,0x5c,0x5e,0x33,0x6a,0x1e,0x20,0x70,0x1d,0x5d,0xcf,0x3c,0x8e,0xe3,0xad,0x22,0x3b,0x13,0x9f,0xa9,0x0a,0x1b,0x55,0x2e,0x1b,0x77,0x07,},"\x61\x6f\xe1\x5f\xcc\xb3\x31\x0f\x9e\xc7\x45\x64\x47\xda\xda\xf8\xe0\xa5\xfb\x26\x9b\xe1\x69\xb0\xc3\xea\x2c\xfd\xaa\xa5\x5d\x37\x93\x7f\xe7\x5b\x78\x32\x4a\xc2\x78\xa6\x50\x47\xe0\xae\x4f\x32\x7e\x97\xef\xfc\xb7\xbe\xd9\x1d\x09\xda\x72\x0b\x0a\x10\x1b\xe9\xe9\x6d\x0b\xa8\x5b\x1f\xf4\x9d\x8d\x1d\xf3\x62\xd3\x45\x4f\x0d\xb6\x82\x55\x96\x10\x1c\x97\xe5\xda\xca\xd0\x7e\xc4\x92\xd3\x0f\x2d\x0c\xb7\xe7\xde\x4e\x74\x4b\xb6\xa6\x10\x0b\x75\x4d\xa8\x47\x41\x1d\x09\xaa\xce\x8d\x5d\x41\x07\x58\xb8\x30\x87\xdb\x4b\x5e\x62\x97\x97\x9a\x21\xfb\x65\xaf\x39\x09\x52\xc4\xf9\x36\x26\x0e\x72\xd7\xc7\x83\x27\xb9\x4a\xa6\xcd\x61\x72\x78\xb0\xce\x9e\x1b\xd3\xfb\xed\x93\xb6\x9b\xc6\x49\x85\xdd\xe0\xe2\xc4\x35\x7b\x50\x2f\x05\x5e\xe7\xb0\xa0\x38\x84\x74\xda\xe0\x2d\x6c\x1a\x73\x1f\x87\x78\x5d\x75\x3a\xeb\x0d\x9c\xfd\xf8\x50\x02\xdf\x56\x6f\xc2\x50\x7d\xe7\xba\x6f\xd0\x35\xbe\xe1\x7a\x2e\x80\x8b\x4a\x75\x88\xc5\x83\x37\x5c\x82\x40\x7a\x40\xae\x9e\xeb\xdf\x94\xdf\x2f\xb8\xca\xbf\x17\x60\x6c\x43\x9e\xa7\x04\x59\xb2\x12\xaa\xe4\xa3\xf5\x30\xec\xad\xc5\xe8\x8e\x25\x48\xfa\x64\x3c\x7d\xdf\x50\x63\xb2\xe1\x06\x73\xe5\x9d\x07\xfe\x90\x68\x92\xb6\x7e\xb5\x8f\x93\x88\xa5\x6b\x37\x04\x52\xe9\x97\x77\x55\xfc\x04\xdf\xbc\x77\xda\x6c\x05\xbe\xdd\xeb\xf0\x36\x52\x56\xb5\x2c\x9a\xef\x8a\x82\x17\x3b\x8c\x89\xfb\xd9\x8c\xea\x36\xa8\xb8\x96\xfe\x66\xd3\x7c\xa7\x9b\xec\x7f\xbf\xe9\x58\xfe\x89\xf6\x76\x50\x85\xb3\x35\xdc\x77\x03\x43\xe2\x30\xca\xdd\xfa\x28\x33\xda\xa6\x62\xfe\x82\x08\xdd\x88\x5a\x6f\xdf\x72\xe3\x6e\xcf\x22\xbb\xbb\xcb\xe7\x9d\x37\x06\x50\x23\x69\x40\xbc\x2e\x6d\x4a\xc7\x4f\xe4\xd5\x54\xc9\xbc\x23\x2f\x07\xd2\xaf\x62\x20\xd1\x57\xbd\x2d\xa6\xa6\x61\x2a\x08\x1b\x4c\x99\x04\xa2\x86\x9b\x13\x7e\xe3\xa0\x85\x6f\x12\xb2\xeb\x87\x62\xdb\x94\xed\x0b\xa1\x36\xf2\x3e\x7f\xb4\xbd\x1f\xcd\xee\x10\xdd\x84\xe2\xcd\x3b\x0a\x49\x14\x8a\xc7\x4d\xb4\x66\xdb\xee\xf8\x1e\x6a\x8c\xe0\x86\x11\x02\xde\x9b\x1a\x3e\x1d\xcf\x5c\x6b\x03\x08\xa8\x2e\x3a\xc7\xc2\x28\x3c\x7c\xc2\xf3\x4f\xfa\x14\x5b\x9f\x74\xb7\x99\x04\xb3\x2b\x79\xe9\x60\xb8\x14\xaa\xde\x63\xa0\xdf\x01\x67\xdc\xd2\x4e\xd9\x0a\x8d\xa7\xb9\x34\xc7\x72\x93\x2f\x5a\x47\x8f\xe2\xa7\x2f\x94\x5a\x13\x09\x6e\xc3\x7c\xe7\x64\xb5\x81\xeb\x89\xe5\xf6\xb2\xbd\x7e\xb8\x8b\x85\xa8\x95\x87\x77\x4d\x45\x8c\x58\xcd\x87\x94\x57\x97\x3d\x64\x8e\xf7\x71\xc5\xf1\xde\xb2\x7a\x0c\xc5\xb2\x92\x46\xac\x2f\xa1\x2d\x18\xdd\xc6\xb9\xf9\xac\x9c\xf1\x46\xc3\xf2\x2b\x1e\x44\x99\xad\xee\xfb\xcd\x22\x49\x74\x0e\x13\xa2\x24\xe7\xb6\xb3\xef\x15\x60\x5e\x7e\x74\xe6\x8d\x7b\x72\x64\x24\x09\xb9\x0c\x4e\xc1\x61\xeb\x24\xc9\xb4\x0f\xf9\xc7\xe6\xe5\xda\x98\x32\x2a\xca\x52\xc4\x6a\x8d\xdc\x19\x0f\x1c\xab\x15\x7c\x4c\x76\x19\x60\x1a\x6b\x33\xdf\x6a\x50\xda\x66\x1b\xc7\x53\x60\xdf\xf6\x97\x50\xd3\x45\x74\x09\xcc\x02\x41\xc3\xe8\xc4\xb3\xe5\x06\xd4\x26\xaf\x52\xb7\x02\x31\xcd\x6c\x91\x26\x0c\xc4\x31\xe4\xcc\xfd\x49\x6c\xa1\x4c\xea\xae\x1c\xda\x78\x72\x1e\x16\x33\x9d\x52\x68\x2b\x69\x51\xf9\x66\xc7\xda\x5c\x6e\x10\xd9\x19\xae\x66\xa9\xf5\x2d\xec\x10\x86\x75\x38\xd3\xdf\x6d\x59\x3a\x32\xdb\x69\x5a\x8d\x77\x45\x70\x35\x16\xea\x56\xf8\xc1\xc8\xf0\xef\x53\xbd\xeb\x7f\x53\xc2\xd9\x44\xf5\x11\x94\x0c\xcb\x90\x62\x49\x22\xac\x59\x9f\x46\x19\xc3\x04\x62\x07\xd6\x05\xf6\xff\x94\xde\x78\x8d\x25\x34\x22\x29\xdc\x8a\xf9\x2b\x5f\xdf\x0d\xd7\x1d\xf2\xb4\x46\xcd\xf1\xd9\xa2\x05\x24\x33\x9e\xe1\xc3\x18\x26\x28\x7e\xf7\x27\x81\xa7\xa3\x52\x89\xf8\x5a\x15\xba\x57\xc7\xfd\x5d\x88\x5b\xd0\x55\x3a\xb4\x08\x05\xf5\x17\xe8\xf1\xb1\xb3\xc4\xfc\x67\x71\xe6\xf2\x24\xbc\x03\x11\x24\xb9\xc9\xae\xb1\x9c\x5a\x96\xbf\x14\x88\xe1\xe6\x6c\x6e\x88\x80\x92\x30\xc8\x3a\x74\x15\x55\x54\xa2\x19\xec\x37\x9a\xe5\x4a\x9f\xe7\x9d\xbe\xde\x3d\x57\x60\x42\xa6\x35\xd1\x97\xf4\xd8\x18\xc7\x78\x75\x5b\x8b\x45\xe5\x13\xde\xac\x88\xf6\x04\x25"}, +{{0x95,0x17,0x4a,0x09,0x15,0x68,0x4c,0xdb,0xb6,0x19,0xb0,0x55,0x49,0x5b,0x00,0xf1,0x92,0x82,0xcf,0xfc,0x3b,0x05,0x01,0x9e,0x6a,0xb7,0x09,0xa4,0xa1,0x74,0x2b,0xab,},{0xaa,0x8c,0x87,0x2d,0x7e,0x10,0xb6,0x7f,0x7f,0xf2,0x41,0x72,0xc3,0x63,0x7e,0x80,0x82,0x5a,0x0a,0x71,0xee,0x0c,0x48,0x86,0x3a,0x2a,0xcd,0xcb,0xe8,0xda,0x45,0x9a,},{0x78,0x0f,0x40,0xc2,0x0f,0xea,0x3b,0x11,0xc9,0x42,0x2a,0x43,0xb9,0xa6,0xf7,0x96,0x11,0xe7,0xf1,0xf5,0x9d,0x14,0x88,0xc1,0x5a,0x5f,0xd2,0xd3,0x2c,0x07,0xda,0xdc,0x39,0x1c,0x38,0x95,0x3e,0xdf,0x0d,0xe4,0x8b,0xe5,0x2d,0xa2,0xaf,0x33,0x5c,0x47,0xb8,0xd2,0xe4,0x4a,0xb9,0xd3,0xdf,0xb7,0x6b,0xa5,0x38,0xb0,0x66,0x49,0x52,0x08,},"\x5e\x1a\x74\x00\x45\x6c\xad\x4f\x9b\xa8\x66\x43\xbc\x7c\xbf\x3b\x35\x68\xdc\xb5\x22\xb3\x70\x55\xe8\xc3\x9d\x3c\x80\xf2\x28\x42\x38\xe5\x72\x7f\xd7\x51\x3c\xc8\xb3\x1c\x57\xae\x7b\x40\x50\xaa\x81\x9f\xc2\x36\x09\x30\xeb\x0d\xd6\x77\xa5\xb2\xc7\x29\xfe\xb2\xda\x3a\xd7\x9a\xe7\xfc\xcd\xdd\xb6\xc0\x84\x46\x26\x1e\xc9\xbb\xe5\x9c\x64\xe9\x9a\xbb\xc8\x6d\x3c\x48\x35\xf0\x0f\xef\xe5\x27\x43\x3a\x50\x1a\x3b\x6d\x57\x2c\xf5\xe1\x2a\x88\x01\x0b\x46\xa4\x72\xb9\xbd\x86\x91\xa4\x07\xc3\x65\xf9\xf7\x16\x34\xb4\xd9\x7e\xdf\xdf\xf0\x63\x14\xc0\xc1\xb4\xeb\x93\xc7\x60\x7f\x1d\x6f\xa3\x54\x65\x93\x22\xc2\x84\x07\x3f\x42\x60\x25\x18\xc5\x4f\xdf\x26\xea\x2c\x27\xc8\x0a\x6d\xfa\x20\x56\x83\x91\xab\x35\x72\x82\xc0\x6b\x23\xbe\xdc\x1d\xf1\x26\x4b\x61\x1c\x1e\x9c\xf1\x8a\xeb\xe2\x49\xfd\x86\x17\xc6\xe3\xee\x98\xc5\x3c\x0f\x6f\x21\x75\xc5\x7e\xf8\xe2\x06\xbd\x3c\xf1\x05\x62\x7a\x98\x92\xeb\x68\x99\x20\x21\x3a\xae\xb6\x3d\x87\x66\x3d\xbf\xa5\x3f\x0f\xb2\x81\x62\x69\x48\x29\x6b\x2d\xbc\xdd\xe1\xc5\x1a\xf8\x62\xee\xcf\x1c\xfe\x8a\x46\xa2\xc4\xb2\x8c\xfe\x71\x30\x33\x0a\xd1\x73\xf8\x71\x27\xaa\xca\xff\x43\xc0\xbd\xde\xa4\x8b\x00\x38\x97\x6e\x66\x2c\x04\xb6\xb0\x4a\xd0\x3d\xe1\x24\x62\xc2\x76\x5d\xb5\x35\x04\x95\x20\xcc\x11\x4a\xfd\xb6\xc9\x25\x49\xb0\x54\x6a\x90\x27\xd4\x49\x75\x5b\xeb\x8d\x4c\x17\xe6\xa2\xa4\x75\xf9\x67\x6a\x33\x7b\x4e\x86\x6d\x96\x32\x5e\x38\x9a\x52\xc1\x6c\x51\xe1\x8e\x0d\x81\x03\x34\x0c\x84\x17\xb2\xc5\x7a\x55\xd0\x42\xff\x5e\x5f\xc6\x5d\xf4\x23\xe0\x09\x2b\x0e\xa8\x8b\x96\xa9\x07\xc9\x51\x21\xc5\x47\xa6\x80\x61\xf2\x7b\xcf\xb5\x8c\xe6\xc0\x77\x28\xd4\x84\x6b\xdc\xbf\x0c\x62\x54\x10\xed\xf8\xde\xa8\xcb\x4c\x9d\x0b\xbe\xef\xcd\xe1\x92\x73\x36\x5f\x48\xd7\x5a\xec\x07\xd1\xc2\x2c\xcd\x23\x06\x8a\x97\xc3\xfe\x75\x2e\x87\xa3\x01\x18\xfe\x2d\xfd\x52\x18\xb6\xb1\x25\x15\x4e\x0e\xa3\x86\xcf\x23\x9e\x31\x37\xf8\xca\x6d\x8b\x74\x6b\x6a\x67\xd5\x08\xcf\x8c\x1a\xb6\x3e\x57\x15\xe6\x72\x1e\xda\x5c\x2b\xc3\x93\xa4\x93\xdb\xd2\xf9\xa1\xfa\x92\x6b\x9a\x59\xe4\x5a\x18\x0a\xee\xb0\x25\x99\xa8\xcd\xd6\x86\xf8\x89\xb4\x85\x27\x23\xcb\x6d\xbf\xb5\x01\x4c\xab\x5f\x65\x8a\x30\x9a\x47\x22\x39\x36\x0e\xea\xf6\x4f\xc8\x20\x3a\x3c\x70\x89\x70\xe1\x5c\xbc\xf1\x36\x25\x5d\x96\x44\x6c\x39\xa9\x27\x03\x1d\x26\x7d\x69\xec\xd5\x1d\x7a\xf6\xe9\x1f\xb4\xae\xf9\xd7\x8c\x33\x35\xe9\x07\x11\x33\xcf\xb8\xe2\x12\x99\x90\xc6\x46\x37\xc7\xad\xf1\xda\xef\x2d\xc2\x6c\x11\x63\x39\x9f\x3f\xe1\xe7\x92\x33\x80\x92\xef\x6f\x8d\xfa\xf2\x57\x30\xdd\x2f\xe8\xd9\x78\xf6\xf7\x70\xf5\x2b\x68\x23\x81\x76\x56\x4c\xee\x5f\xbb\x98\x50\xb3\xb3\xa0\x4d\x94\x84\x60\x41\x78\x26\xeb\x2e\xb2\x4f\xcc\x5f\xe3\x53\x34\xbb\x95\x21\xe8\x7b\xc4\xdb\xde\x2a\xc9\xe1\xc9\x89\x49\xdc\x2d\x29\xad\x27\x9e\x38\x84\xb9\x05\x26\x8e\xbd\x08\x08\xbf\x41\x82\x57\xe7\x5e\x26\x2b\x4d\x01\xb0\x24\xa6\xe9\xaa\x7b\xd5\x01\xdb\xa9\x4f\xf5\x06\x39\x4b\x4b\x0a\xe6\x08\x1e\xa7\x30\x30\xc4\x3a\x6a\x91\x76\x6e\x80\xf9\xf4\x2c\x0b\x68\xb9\x84\x19\xad\x4e\xee\x4e\x9a\x72\x8a\xde\xfb\xd7\x9e\x83\x1f\x70\xf4\x1e\x62\xb4\x3f\x0b\xf4\x2b\x3b\x2c\xd5\x3b\x55\x89\x11\x76\x64\xbc\xeb\xc4\x09\xa7\x64\x5b\x1e\xed\xda\x48\x2f\x6b\x68\x95\xa6\x57\xba\x78\x9b\x89\xe5\x02\xd6\x99\x87\x51\xd6\x30\x3d\xed\x5f\xa1\x56\xee\x7c\x7e\xaf\xe5\x46\x26\xd1\x03\x2c\x4d\x7d\xff\x97\x7f\x1d\xcc\x86\xaf\x89\xb1\xe6\x46\xa4\xaf\xc2\x42\x7e\xd0\x2c\x0a\xf5\xd3\x28\x90\xf9\x5f\x13\xf9\x8c\x1a\x5b\x1d\x9f\xbb\x78\x1a\x9a\x89\xb2\xd7\x90\xc1\x46\x5c\x2d\x15\x20\x92\x6f\xdf\x28\xc1\x7d\x9b\xa1\x58\x7a\xd7\x61\xf0\x65\xd3\x39\xbd\xbe\x38\xf4\x13\x3f\x45\xbb\x59\x78\x74\x26\x42\xf9\x0c\x06\x5e\xe4\x89\x25\x73\xf6\x05\x9f\x8b\x4c\xe2\xc1\x3e\x73\xb8\x91\xcd\x05\xf2\x37\x31\xed\x9a\x07\xe2\xb8\xff\xdc\x96\x3b\x06\xa5\x10\x20\x9c\x32\x99\x80\x94\x9f\x40\xd8\x07\x3a\x01\x3e\xf8\x43\xdf\xcc\x4a\x33\x94"}, +{{0x5a,0x84,0xaf,0x28,0xa5,0xdf,0xbb,0x32,0x33,0xa1,0x2f,0x08,0x37,0xf6,0xe8,0x65,0x4e,0x7b,0x0d,0xe1,0x6b,0x02,0xab,0x3c,0xd1,0x78,0x64,0x43,0x1e,0x27,0x46,0x67,},{0x80,0xd4,0xba,0x78,0x9f,0x8a,0x4b,0x20,0x47,0xad,0xaf,0xa5,0xed,0x26,0xcd,0x8c,0x54,0x67,0x33,0x29,0x2e,0x8b,0xf6,0x93,0xcf,0xd1,0x7e,0x28,0x4e,0xfc,0x68,0x71,},{0xa0,0xb8,0x4c,0xa5,0xaf,0x76,0x46,0xe6,0xf6,0x2a,0x69,0x35,0x37,0x94,0x73,0xfa,0x6e,0x4c,0x27,0x69,0x58,0x51,0xfc,0xbd,0xae,0x29,0x17,0xb2,0xdc,0x68,0xd7,0x96,0xe2,0x78,0xd7,0x0c,0xd6,0x7f,0xce,0xdf,0x6c,0xa6,0x29,0xb8,0x81,0xf7,0xc4,0xf2,0xaa,0x25,0x59,0xb2,0x0d,0x67,0x06,0x11,0x76,0x6b,0xd6,0x5a,0xa4,0xfe,0xf2,0x04,},"\x8a\xac\xd1\xb8\xa3\x9b\xf0\x8f\xd5\xc9\x18\x44\x6b\xe5\x76\xe6\xa3\xf2\x7f\x36\x11\x16\x07\xf2\x7b\x56\xa9\x12\x14\xe7\x63\xf9\xa8\x7f\xb1\xd1\x84\x48\x98\x96\x17\x97\x64\x44\x60\xbf\xf5\x48\x8c\x10\x3a\xf6\x05\xe8\x74\x0e\x46\x58\x8f\xb9\x3e\x44\x3c\x3b\xb2\x3b\x92\xc0\x98\x70\xa5\x57\x65\x3a\x1f\x22\xc2\x18\xcc\xbc\x2f\x07\x3a\x27\x2d\x17\xa8\x42\x23\xef\x14\x3f\x4c\x7c\xa2\x58\x46\x0b\x79\x81\x69\x67\x3d\xa1\x07\xd7\x1d\x53\x56\xce\x9f\x75\x59\xa9\xb0\x38\x39\x99\x51\xf5\x75\xc7\x7e\x5b\x9d\x05\x29\x57\x8e\xca\xa2\xe2\x08\x92\x66\xfc\x52\x6c\x5d\x40\x9f\xbd\x46\xbb\x86\x84\x1c\xb5\x54\xf5\xbd\x3c\x99\x71\x3b\x04\x3e\x40\x46\x53\xa7\xd0\x13\x44\xd4\xdb\x83\x1a\x21\x72\x82\xc4\xb3\x36\x40\x56\x53\xb8\x5d\x27\xa4\x6b\x25\x9c\x85\x5c\xdd\x85\xad\x6f\x7a\xed\xd8\x35\xff\x55\x00\xcc\x8b\xaf\x0f\xb2\xf0\x18\x09\x10\xc6\x46\x72\xb8\xa8\xd4\x9d\x98\x4a\x78\x29\x3c\xf5\x77\x9c\x91\x0c\x3a\xcb\xbc\xa4\x55\xa8\x54\x66\xe5\x35\x04\x4f\x34\x80\x26\x2c\x09\x0f\xbf\x4e\x0b\x0d\xb4\xd1\xef\x87\x59\xda\xaf\xdd\x8d\x05\x90\x74\x82\x46\x1f\xf9\x10\xc4\x37\x19\x5d\x5c\x7f\xed\x9d\x82\xcb\x94\xe7\xe4\xec\x24\xda\x05\x3e\x47\xf6\x2b\x48\x8e\xb7\xb2\x44\x65\x5c\x7d\xbb\x20\xed\x60\x7e\xed\x45\x31\x44\x9e\x07\x80\xe6\x1c\xfd\x57\x40\x86\xff\xc5\xdc\x52\x42\x83\x77\x5c\x44\xf7\x54\x7c\xda\xb0\x4a\x51\xee\xe4\xe1\xb7\xb6\x5a\x57\x57\x3a\x92\x48\x4a\x35\x90\x0a\x90\x9f\x81\xe4\x15\x02\x9d\x22\xca\x93\x7a\x3a\xcd\x9e\x61\xf8\xc0\xe6\x86\xb2\xd2\xad\x03\x77\xaf\x8e\xe1\x66\xe4\xa2\x0a\x82\xaf\xf4\x51\xe1\x51\x10\x3e\x0a\x17\x67\xb2\x71\xfa\x9c\x2b\x1d\xd1\x20\xf8\x05\x85\x3b\x3b\x8a\x56\x0f\xc8\xb9\x37\x62\x83\xb5\x11\x24\x32\x4a\x28\x4a\x0e\x9a\xc4\x9d\xf6\x9f\x52\x4c\x8e\x04\x2d\xf8\x2e\xfb\xcd\x16\x88\x1e\xc1\x31\xa1\x52\x10\xdf\x73\xde\x02\x94\x34\x47\xf2\x2a\x2e\xa1\xdc\x8b\xf9\x68\x29\x8e\xe9\x7f\x3a\xd5\x46\xd7\x8b\xc6\x60\x89\x7e\x08\xd2\xa2\x8b\x2b\xa6\x8b\x54\xb9\x54\xf1\x47\x64\x51\xc6\x92\x07\xe5\xdd\x24\x8a\xe4\x7e\xf3\x56\x94\x99\x0e\x6f\x05\x8b\xc0\x01\x7b\x74\x95\x10\x5c\xc8\x73\x90\x66\xaf\xb1\x1e\x1f\x26\x60\x19\x42\x54\x6a\xe8\x49\xff\x2f\x56\x73\x0f\x13\x26\xbb\xee\xa6\x40\xee\x17\x8f\xa2\x47\xad\xff\xef\xc0\x46\x49\x4f\xc7\xff\xc0\x77\x7d\x5d\xbe\x8a\x55\xda\xee\x61\x40\x6f\xe3\xc7\x08\x8d\x43\xd9\xe1\x4d\xa2\x1c\xa5\x2f\xd8\xc1\x60\x09\x1c\x8f\x99\xa6\x7d\xad\x65\xc6\x4f\xea\x9d\x18\xb1\x53\x7d\x06\x1f\x5d\xce\x87\x9e\x0b\xc4\x26\x48\xd2\xea\xa0\x2d\x97\x21\x85\x75\x3c\xb2\xf6\x22\x5d\x8d\x03\xbb\x07\xf9\x44\xb1\x0c\xf4\xea\x22\x27\x5c\x3d\x70\x84\x80\x20\xf3\x0c\x82\x3b\x76\x14\x3a\xcf\x54\x59\x99\xa2\xcc\x4b\x58\x98\xd9\x4b\x4a\x25\xef\xbe\x5a\x60\x33\x1c\xc0\x09\xfe\xc0\xa2\x5b\xc9\x89\x47\xb1\xb7\x13\x9e\x22\xd2\x32\x80\xff\x88\x54\xa1\xec\x76\x22\x1b\x1b\xf3\xd1\x08\x32\x8c\x8a\xc4\x63\xc6\x52\x63\xa2\xd7\xca\x74\x33\x48\x29\x31\xa1\xd8\xfc\x14\x4b\xbe\x9b\xef\x67\x8c\x92\xe1\xc2\xd1\x09\x21\xb6\xad\x43\xa7\x5c\x53\xbc\x07\x58\x54\xed\x2d\x99\xd8\x25\xf3\x0a\x5e\x10\xd5\x17\x43\x8e\x4d\x4f\x71\x13\x42\x9f\x1e\xdb\x38\x7d\x6b\xd7\xaa\xd2\x92\x74\xf8\xd2\xdc\x88\x9b\x7e\xfb\xeb\x58\x68\x6f\x8d\x66\x9c\xea\xef\x92\xc7\x5e\xd5\x30\x7f\x0c\x03\xf5\x90\x01\x81\xce\x57\x3c\x8f\xa2\x86\x75\x20\x5f\xb1\x05\x7f\x62\x6a\xa2\x30\xd0\x3e\x2e\xaa\x8c\xff\xcd\xe2\x00\x81\x47\x5d\x80\xb2\x45\xa1\xca\x60\x45\xba\x20\x4a\xb0\x00\x69\x07\x9c\x63\x7f\xc3\xfb\x3e\x80\xca\x04\x62\xe7\xa4\xcd\xd9\x28\x3f\xf9\x00\x85\x30\x36\x48\x16\x79\x2f\xdf\x3b\x9a\x4e\x4d\xc8\x37\x92\x28\xed\xcb\xb1\x54\xbe\xf3\x87\xd3\x77\x60\xd7\x9a\xfb\xb7\x36\x26\x0a\x1d\xb1\x01\x38\x36\x1f\x24\xb8\x26\xdb\xcd\x5f\x0f\xc9\xe7\x83\x0d\x26\xd8\x0c\x52\xa7\x92\x18\x92\x76\xbc\xe3\x47\x60\xfb\x77\xbe\x13\x12\xac\x8c\xf9\x7d\x92\xcb\xf3\xd0\x77\x80\x28\xdb\x5e\x8e\xae\x89\xe0\xb9\xbc\x87\x78\xae\xb1\x27\x8f\x04\x71\xcb"}, +{{0x79,0x3a,0xc8,0x8d,0x7d,0x3b,0x6f,0xa7,0xf4,0x7d,0xee,0xc3,0x1f,0x68,0xdd,0xcc,0xb7,0x01,0x82,0x0f,0x1b,0x13,0xdd,0xc6,0x52,0xf7,0xc6,0xa8,0x5b,0x60,0x52,0xa5,},{0x91,0xb6,0x22,0x7a,0xcd,0xd1,0x83,0xda,0x62,0xc5,0x19,0x65,0xc6,0x35,0x35,0x8b,0x20,0x4d,0x68,0x3e,0xe0,0x64,0x43,0xcb,0xd4,0x0e,0x71,0xc1,0xf7,0x6a,0xd1,0x02,},{0xa8,0x4f,0x55,0x2b,0xf4,0x43,0x22,0xa6,0xdb,0x24,0x5c,0xa0,0x06,0xd1,0xcf,0x78,0x0c,0x61,0x68,0x0f,0xe7,0x42,0x9a,0x89,0x47,0xc3,0x5f,0x21,0xbc,0x4b,0x44,0x22,0x8b,0xa3,0x0a,0xea,0x0c,0x74,0x4b,0x86,0x64,0x59,0xd3,0xb8,0xac,0xad,0x45,0x3b,0x06,0xac,0xe2,0x47,0xba,0x69,0x52,0x8c,0x6b,0x3b,0xc4,0xb2,0x0e,0x75,0x63,0x0e,},"\xec\x50\xaf\xad\x8a\xde\x74\x05\xe2\xc6\xf5\xc6\x24\x7b\xbb\xcc\xfb\x2c\x17\x16\x6f\x78\x84\xfe\xae\x10\xd9\x0f\x5d\x83\xc4\xb6\xf0\xbf\x76\xde\x2f\x78\x97\xba\x11\x94\xd6\xd3\x44\x9d\xdb\x80\xae\x74\xeb\x8e\xd6\x8f\x04\x9b\x35\xc6\xf2\x19\x16\xdb\x4d\xfc\x27\x24\xdc\x3a\xf7\xad\x8d\xd5\xc4\x4f\x60\xd2\xf4\x9f\xad\xd7\x00\x4d\xa1\x59\x30\x93\x94\x2c\xae\x52\x08\xbf\x54\xcf\x90\x3b\xee\x64\x69\x05\xfc\xe2\xeb\x2e\x37\x0d\x0d\xca\x48\xd8\x20\xad\xea\xb1\x6a\x3b\x67\x5e\x5a\x4a\x8e\x26\x7e\x34\xff\x96\xf3\x12\x2b\x18\xde\x0c\xad\x92\x92\xab\x63\xd2\x6e\x5f\x31\x0f\xa2\x16\x8c\x29\x66\xbd\xb6\x3b\x0d\xe0\x86\x26\x76\x7b\x37\x9d\xe4\x63\x3b\x9f\x3e\xda\x79\x17\x28\x1d\xad\x66\x1e\x9f\x77\x2b\x84\x4a\x79\xe8\x00\xfd\x84\x27\x02\x44\x6e\x4a\xa7\x31\x75\x71\x07\xf3\xfd\x65\x47\xbf\x40\x75\x96\x3d\x5f\xd5\xf5\x8e\x80\x85\x3f\xc4\x27\x51\xdc\xa0\x78\xa9\xfa\x8d\x5b\xb3\xd9\xa3\x4a\xbc\xab\x02\x93\xd6\xce\xae\xc4\x89\x67\xa1\xe6\x22\x43\x98\xca\xd0\xf6\x05\xa3\xbe\x8e\x67\x58\xea\x8f\x29\x20\x9d\x8e\x4c\x4c\xa1\x89\x3b\xaa\xd9\x1e\x37\x9b\xa3\xb1\x73\x30\xc1\x2a\x5b\x6f\x21\x9b\x38\x4a\x8a\xb9\x78\xbf\x1b\x37\xc3\x73\x1a\x1b\x47\x4b\x24\xb5\xd6\x7d\x4c\xec\x28\xaa\xc6\x51\x0b\x11\xf2\xcf\x21\xbc\x16\x96\x3d\x51\xf5\x53\x87\x27\x71\x8f\xc4\xe2\xe5\x17\x2e\x3c\x0c\xda\xbc\x27\x7f\x0d\x70\x37\xc3\x4c\xa6\x8f\x73\x28\x88\x48\xb9\x26\xbd\xe0\xcf\x47\xab\xfa\x66\x60\x09\x16\x94\x6f\x07\x65\x1c\x28\x0a\x20\x86\xb1\x4d\x52\x57\x0c\xc8\xa4\xb7\x43\x58\xb5\x9c\x30\x2b\x9d\x00\xe1\xb4\x98\xf3\xbc\x33\xee\x4e\xcf\x2b\xce\x2c\x65\xed\x7e\x8b\xa7\x4d\x35\xb7\x51\xd3\xc9\x9f\x40\x86\x19\x68\xc2\xb7\xf3\xa5\xbe\x34\x8c\x57\xd9\x3b\x40\xff\xd0\x51\xed\xd7\xca\xca\x6e\xe6\xbc\xa7\x21\xdc\xba\x8d\xb8\xd0\x06\x4f\x54\xd3\x6e\xc5\xe8\xd6\x2a\x71\xfd\x1c\x90\xf1\x49\x24\xf4\x1c\x16\x3f\x00\x7a\xfc\x6f\xbb\xfe\x86\x45\xfa\x47\xc3\xc9\x80\x24\x6d\x1b\x92\x27\x43\x85\x95\x3c\x53\x41\xcd\x64\xc3\x4a\xe9\x71\x7c\xc2\xc3\x7f\x58\x35\x9c\x0a\x99\x91\xc2\x3f\xe6\x37\xde\x6c\xdf\x08\x62\xf7\xd0\x32\x9f\xe7\x58\xaa\x89\x2a\xd4\x58\x3b\x9d\xf2\xf3\x33\x7d\x5b\xe5\x70\xba\x65\x49\x98\xed\x29\x2f\x11\xf0\x17\x72\x38\x2a\x04\x34\x2f\xdd\x99\xe6\x9e\x0d\x97\xc4\x3f\x10\xac\x9b\x96\xf1\x40\xa6\xf8\x3c\x47\x29\xe7\xa9\x00\x47\x1f\x2b\x1d\xf2\x40\x1b\xc5\xc6\x80\x42\x2b\x13\xb0\xc8\x00\x7d\x63\x68\x1f\x66\xa0\x59\x5a\x1c\x5d\x3a\xcd\xe5\xb7\x79\x42\x6e\x73\x6b\xc1\x00\xc5\xe6\xf5\x26\x08\xdc\x39\x1e\x3e\xf9\xb1\xbb\x6a\xf1\x3d\x24\x9b\x7d\x32\xce\x06\x80\xc3\x68\xf5\x4d\x5f\xe0\x39\xcf\xe1\x01\x30\x25\x1e\x4d\xb1\x4c\x79\xc8\xd0\x44\x06\x04\x65\x82\x29\x90\xd8\x80\x93\xcd\x73\x65\x32\x85\x2e\x44\x78\x89\xdb\x89\xcc\x60\x05\x29\x96\xa3\x2a\x64\x36\x5c\x07\x26\x05\x1c\x11\x9e\xda\x90\x1d\xe5\x76\xb3\x34\xfc\x70\x49\x48\x23\x92\xe2\x62\x0b\x0a\x3a\x13\xfa\xb1\xd3\x6f\xc0\xa5\xf2\x3d\xb1\x47\xfd\x85\x7b\x26\xa6\x98\x04\x8f\x8b\x81\x1e\x23\xd7\x22\xe2\xe9\x02\x7e\xd4\x12\x4b\x48\xdc\x5e\x57\x8a\x7a\xeb\x19\xa1\xb4\xf9\x48\xee\x5b\x46\xf6\x5b\x97\x96\x46\xe2\xbe\x07\x47\x14\x11\x8b\xaa\x4b\xfc\x15\xb0\x89\xa0\xe0\x66\x27\xda\x46\xe4\xbb\x06\xaa\x3c\x7c\x5d\xd6\x48\xe0\x3c\x9c\x2d\xec\x3f\xac\xd9\x56\x26\x56\x2f\x30\x00\x88\x32\x30\xd2\xb0\xa1\xf8\xa7\x47\x8c\xb7\x7f\x93\x9a\x5f\x18\x8f\x45\x8d\x10\x37\xb9\x01\x76\x66\x4d\x86\xea\x85\x0b\x8a\xf5\x08\x7f\x86\x60\x5a\x77\xe0\x25\xef\x6c\x7e\x6a\x2a\x59\xf0\x06\xcb\xa1\x89\xfa\xd9\x33\xf4\x2c\x53\x27\x08\x10\x9b\xc1\xaf\x81\x48\x19\x59\x5f\xfc\xb9\x5f\xbf\x5b\x7e\x93\xa7\x11\x97\xe4\x77\xee\x7c\x04\xb8\x51\xc1\xc3\x66\x22\xcd\xd8\xe6\xc8\x60\xd9\xab\x2c\xac\x56\xd2\xdc\x98\xfa\x69\x12\x4f\x2b\xb2\xa6\x47\x1e\x1c\x73\xb6\x61\xf0\x71\xf5\xd8\x6d\xe7\xd1\xde\xaf\xa4\xed\xcd\xc7\xbf\x1f\x70\x5c\x56\x30\x0a\xff\xd0\x58\xb9\x69\x77\x91\x41\x9e\x5f\xb2\xa5\xb7\xf7\x8c\xe3\x40\x1f\xf5\x50"}, +{{0x89,0xde,0x74,0x42,0xd7,0x4b,0xa9,0x38,0x59,0x69,0xc9,0x65,0x1a,0x88,0xfe,0x28,0xe0,0x40,0xd5,0x93,0x90,0x7d,0xac,0x1a,0x39,0x87,0x41,0x8b,0xdf,0xdb,0xad,0x89,},{0xfd,0x3b,0xa9,0xfa,0xd3,0x20,0xeb,0xa4,0x5d,0x07,0xb8,0x4a,0x49,0x7b,0xe1,0x7d,0x3f,0xc7,0xdd,0x99,0x99,0xc9,0x68,0x88,0x3c,0xd6,0xac,0x13,0xb0,0x66,0x9b,0x17,},{0xba,0xb5,0x72,0x84,0xd2,0x0e,0xe5,0x4c,0xc7,0xf9,0x70,0x8d,0x71,0x77,0x06,0xd8,0xfa,0xf6,0xe4,0x63,0x32,0xb0,0x69,0x1d,0x6f,0x21,0x3a,0x8d,0xb8,0x01,0x15,0x5b,0x4e,0x33,0x8c,0x13,0x61,0xb5,0x92,0xbe,0x75,0x85,0x01,0xb1,0x82,0x17,0x93,0xae,0x52,0x27,0xcc,0x3b,0xa8,0xdf,0x8a,0xdf,0xc6,0xed,0x9a,0xca,0xb5,0x4c,0xc4,0x01,},"\x9d\x52\x72\xf0\xb7\x84\x88\x2b\x94\xc7\x6d\xfb\x9d\x46\x0c\xa4\x95\x02\x5e\x0a\xec\x5d\x52\xcc\xff\xfe\xce\x9f\x81\x73\xc1\x05\x58\x26\x6c\x49\x85\x25\x89\x1a\x97\xbf\x38\x78\xe3\x3c\x3d\xe2\xfc\x2e\x52\x55\x0b\x43\x15\x62\xcb\xe4\xa3\xd0\x11\xec\xc9\xe7\x7e\xc3\x6a\xd3\x83\x41\x35\x8c\x88\x32\x1c\x03\xd0\x8b\xb4\x26\xa7\xd5\x85\x41\x71\xc0\x27\xec\x48\xd5\x78\x19\xa9\x1a\xfd\x02\xa6\x18\xcc\xbc\x25\xe6\x8e\x53\x09\xd0\x47\xb1\x56\xe3\x57\x05\x37\x3a\xda\x2e\xb8\x31\x32\x1a\x20\x3e\x1b\xd8\xf0\xef\xec\xc0\x96\x18\x64\x7b\x41\xdf\xf2\x2b\x39\xd0\x22\x35\xf8\x71\x53\x2f\x60\x85\xe9\xcc\x52\xec\x00\x9b\x33\xee\xbc\xdc\x26\x7d\x77\x67\xc9\x0c\x92\x7e\x15\x4f\x72\xf3\xf4\x8a\x34\x95\x63\x19\xb2\x93\xc8\xa8\xb3\xe3\x4e\xfc\x5f\x62\xf2\xb4\xe8\x01\x9b\x50\xa0\x8f\x5c\xcf\x95\xbc\x83\x1b\xaf\x40\x81\x1d\x87\xe5\xed\xbd\x2f\xd5\x36\x5b\x26\xa4\x31\xae\x95\x80\x0f\xf3\x81\xcd\x62\xca\x40\xe1\x86\x6d\x95\x0d\xce\x14\xf0\x30\x91\x8a\xba\xc6\x8e\x79\x16\xdd\xb9\x5a\xdc\x19\x71\x28\x78\x74\xd0\x7e\xb0\xed\xef\x64\x29\x66\x52\xc4\x80\x44\xb0\xc5\x52\x1a\x8d\x27\x0d\x53\xd7\x4e\xc6\x3b\x89\x0f\x33\x63\xf9\x20\x7f\x66\x52\xae\x8e\x78\x35\xc3\x82\x0a\xd6\xd9\xe3\x63\x3f\x4b\xfd\x53\x79\xa4\x4f\x29\xd6\x5f\x36\x09\xfe\x35\x58\x17\xdc\xa5\x51\x8d\xfe\x3b\xd7\x69\x32\x0a\x03\x19\x02\xe9\xcf\x66\x69\xc2\x4f\x88\xb0\x1e\xb3\x69\x95\xbd\xb8\xdb\xed\x6e\xe0\xc9\xb7\xf3\x22\x95\xc6\x1b\xa8\x90\x5e\x55\x98\xf3\xc9\xe1\xc8\xbf\x72\x64\xf9\x82\x93\xfa\xea\x17\x74\x7f\x88\x44\x0c\x31\x81\x8c\x43\x3e\xa3\xd2\x3c\x01\xf4\xf7\xe9\xc3\xdd\x3d\x5f\x32\xec\x9e\xac\xd7\x1a\x09\xe3\xa9\x97\x38\x1f\x1c\xbf\xfd\xf4\xb5\xba\x49\x79\xde\xb7\xb0\x98\x41\xaf\xa3\xb0\x3d\x1c\x93\x11\x09\x7b\x86\x2c\xae\x11\x70\x7c\xbd\x3a\x4a\xe6\xc8\xa2\x6a\x30\x6a\x68\x7c\x41\x4a\x4e\xa1\xe8\x12\xf1\x15\xf6\x0f\x70\xbd\xa7\xf8\xfb\xe7\xbc\x2d\x50\xcc\x55\x0b\xba\x29\x1d\x5e\xc5\x23\x22\x9a\x08\xed\x56\x8b\x5c\xee\x18\xfe\x6f\x46\x78\x2c\x17\xcd\x82\x88\x01\x63\x92\x15\xbc\x5e\x9b\xe4\x55\x5c\x9a\x18\x00\x97\x67\xa6\xc5\xc7\x4a\x82\x29\xd2\xff\xaa\x39\x9d\x8e\x64\x32\x4e\x88\x42\x23\xd5\x07\x0f\x73\x5a\x75\xd8\x5f\xf6\xc9\x4a\x9f\xbc\x2b\x36\x51\x38\x6d\xe5\xa2\x3c\xce\x95\xc8\x78\x81\xc7\x93\x99\xae\x71\xf0\x90\x73\x7e\x21\x87\xfe\x90\x4a\xab\x1d\x92\xd6\x18\x67\x95\xc9\xb4\x6c\x62\xa5\x91\x4f\x36\x30\xfd\xcb\xac\x3b\xd4\xb0\xda\x4e\xc3\x13\x6a\x1f\xb2\xba\x40\x32\x2d\x7c\xc4\x08\x5e\x16\x70\x09\xcf\x74\x50\xfc\x6a\x28\x6c\x2f\x79\x51\xd5\x1a\xae\x23\xb8\xf3\x30\x20\xef\xb5\xe3\x24\x5b\xa6\xa3\x54\x3a\x2b\xde\xc4\x47\xd5\x1a\xe0\x0b\x5e\x16\x78\xb7\x60\x93\xcf\x21\x6b\x95\x07\xc9\x63\xeb\xfc\x02\x4c\xcd\x6e\xf6\xc7\x8c\x45\x72\x27\x3b\xea\xaf\x55\x07\x6d\xc4\x4a\x22\x4b\x58\x61\x57\x05\x79\x19\x65\x30\x7c\xef\xd4\x86\x72\xc0\x81\xbc\xcf\xbc\x1d\x15\xb0\x62\xb3\x8b\x4f\xba\x9b\x9b\xec\x95\x6c\xd1\x44\x44\xee\x43\x7e\x79\x60\xcc\x60\x1e\xdd\xc0\x2f\x1a\x76\xb6\x85\x74\xd5\xf8\x84\x31\x50\xc0\xb9\x00\x99\x34\xa2\xbf\xaf\x60\x57\x70\xc1\x36\xba\x29\xf3\xdc\x7e\x29\x59\x7a\x24\x80\xdb\x23\xe2\xb2\x67\x7e\xc6\xc5\x1b\xd3\x01\xf2\xb5\xa3\x9d\xfd\xa7\xb4\x77\xbe\xdd\x1c\xda\xed\x10\xe2\x9d\x29\x54\x62\x9b\x98\x76\xf8\xee\x54\xe4\x04\x73\x69\xd5\x34\xca\xb5\x4a\xea\x44\x1d\xc9\x47\xeb\x3f\x59\x38\x2b\x21\x83\x60\x57\x2f\x26\x59\x58\x31\x53\xc0\xe2\xb9\x12\xcf\x30\xc8\x15\xb2\x6f\x05\x85\x3d\xd3\x05\x51\xee\xcf\x64\xb8\x58\xa4\x41\xbb\x8c\x6d\xb8\xa9\xfd\xe7\x7a\x32\xa7\xb4\x6a\xf6\x6f\x8c\xb9\xf3\x5e\xe0\xfa\xfb\x0b\xd4\x2d\x9e\x65\xb2\xa9\x05\x82\x41\xa3\x1b\x8c\xa1\x11\x54\x34\x23\x76\x70\xaa\xb4\xef\xf3\x60\x10\xed\x03\x71\xf4\x65\x95\xda\x1b\xdd\x57\x9b\xbb\x67\xaa\xdb\x68\xe7\x7a\xd3\xa3\x8c\x8f\x26\xd2\xaf\x5a\x71\x03\xba\x5f\x22\xb4\x2c\xc1\x2a\x8c\x3c\xe5\xc9\x21\xc9\x1c\xfc\x0e\x63\xdf\x90\x27\xd2\x62\x29\xb1\x04\x7c\xbc\x18\xf6\xb0"}, +{{0x26,0x22,0xbd,0x9b,0xbe,0xf7,0xff,0x4a,0x87,0x62,0x9e,0xa0,0x15,0x3d,0xc4,0xd6,0x08,0xc3,0x1f,0xa5,0x84,0x79,0x88,0xff,0x50,0x0d,0x88,0x06,0x81,0xf1,0x13,0x72,},{0x19,0x97,0x58,0xa9,0xc3,0xd0,0xee,0x3e,0xeb,0xcb,0xbd,0xa3,0xe1,0xef,0x54,0x55,0xff,0x46,0xd7,0x36,0xbb,0x4e,0xf0,0xc0,0x6a,0x73,0x9f,0x9a,0xc5,0x84,0x83,0x95,},{0x43,0x78,0x96,0x6b,0x78,0x31,0xde,0xf4,0xae,0xcb,0x49,0x89,0xbc,0xaf,0x9c,0xae,0x99,0x46,0x1c,0xb9,0xb5,0x9d,0x19,0x51,0x8c,0xc1,0xec,0x7b,0x83,0x51,0xbc,0xd1,0xf7,0x23,0xaa,0xc5,0xf0,0x61,0xb3,0x83,0x63,0x57,0x4f,0xf9,0x6b,0xa1,0x0e,0x19,0x6b,0x1b,0x05,0x31,0xe1,0x18,0x30,0x36,0xa4,0x25,0xe6,0x9c,0x45,0x98,0x04,0x0c,},"\x89\x1e\x82\x12\x25\x47\xd6\x1e\x83\xb0\xab\xaf\x27\xc7\x30\x3f\x05\x22\xa2\xec\x4a\xf4\x4e\xf0\xac\x19\x6a\x99\x78\xb1\xc6\x23\xef\x1f\xa7\x2b\xaf\x70\x91\x0a\x5c\x51\xc4\xf7\x8e\x0f\xe9\xfe\x37\xe2\x43\x9c\x47\x95\x91\x6c\xfa\x22\xab\x47\x1a\x25\x57\xcc\x7b\xa6\xb6\x69\x56\x06\x3d\xde\xb3\x9c\x50\xf1\x4f\x06\x34\x8f\xa6\x6b\x60\x64\xdc\xff\xca\x50\x43\x96\x7f\x05\x25\x4d\x57\x7a\xbf\x22\xae\x8c\x90\x00\x0c\xe2\xe6\xa1\xa8\xb2\xe3\xa6\xb3\xab\xc5\x63\xeb\xff\xb2\x04\x45\xf0\x91\x1c\xc4\x2a\x98\x7f\x84\x56\xef\xba\x41\x30\xe6\x8f\x01\xfc\xdf\x7b\xf7\x71\xfc\x1d\x35\x37\x1a\x0d\x75\xdd\x5f\x90\x00\x2c\x90\xb6\xcb\xad\xe4\x0d\x5b\x23\xfd\xb4\x9a\xba\xcb\x72\x19\xae\x27\x56\x1a\xa2\xa8\x79\xda\x88\xdf\x34\xa8\xc5\x81\xf0\xc6\x71\x98\xff\xc6\x08\xfe\x91\x95\xb5\x55\x5c\x8a\xe9\x34\xc8\x30\xaa\xe2\x88\x5b\xea\x87\x48\x74\x48\xe1\x1b\x4f\x2f\x17\x2e\x4d\x5c\xfe\x4f\xd1\x13\xf9\xd2\x01\x6c\x24\xa7\x34\x51\x2b\xb9\x18\xf5\x75\xe7\x54\x13\x97\x18\xe3\xd2\x0e\x79\x0a\xbb\x94\x2c\xba\x3e\xc8\xb2\xdb\x59\x07\x96\xdc\x43\x5f\x13\x9f\xc6\x4d\xdc\x85\xa2\x24\x94\xef\x2b\xfa\x1f\x5c\x0f\x18\x75\xea\x58\xe8\x4e\xb3\x74\xec\xf8\xce\xc6\x46\x8b\x6b\x09\xd1\xe7\x4f\x15\x41\xed\x45\x4a\x28\x07\xd3\xf4\x05\x35\x66\xb0\xe4\xe2\xc6\xae\xce\xd1\x0d\xc0\x07\xe9\xdf\x41\x6f\x26\x7f\xcb\x3f\xe1\x7b\x8b\xac\xe0\x3f\x07\x43\xe0\xe6\xd4\xa4\x8c\xe7\x6e\xdf\xf6\x0c\x0e\x3a\x30\x84\x56\x99\x54\x13\xc1\x07\x6f\xf3\x7e\xcf\x23\x81\xa0\xd4\xe9\xe4\xa9\x13\xa2\x58\xd9\x83\xb9\x69\x6b\x5c\x45\xaf\x37\xc8\x68\x40\x70\xe4\x00\xb8\xf8\x65\xa5\x04\x04\x3f\x45\xd7\x8b\x97\x13\xf3\x35\xaa\x41\x6a\x46\x16\x64\x10\x73\x5f\xb5\xd8\x22\x10\x45\x8d\x5a\x08\xa1\x04\xd4\x00\x2a\xb6\x11\x88\xf9\xdf\x45\x7d\xd7\xed\x59\x37\xca\x50\x77\x60\x6b\x41\x8b\xbc\x86\x84\xa1\xd5\x25\xbf\xa5\x51\x08\x76\x40\xb1\xd1\x77\xca\x6d\x4f\x64\x71\xb3\x9b\x2c\xe4\x3a\xfb\xf8\x28\x5e\xcd\x68\x7e\x43\x8f\x44\x25\xdf\x56\x8a\xb8\x6f\xa2\x31\x63\x49\xa1\x10\x2b\x41\x43\xd7\x1e\xf4\xe2\x4f\x5c\x53\x0c\x77\xaf\xb0\x10\x07\x88\x63\x64\x40\xe7\x40\x67\x5a\x61\x74\xc5\xf0\x57\x10\xb2\x53\xa4\x11\x17\x3f\x9e\x82\xce\x6e\x22\xf4\x09\x5e\x77\x14\xb8\x73\x7e\x14\x7a\xa0\xf2\x31\x91\x57\x8f\xfd\x93\x82\x3c\xe4\xbf\x91\xc1\xd1\x10\x98\x2a\x5d\xa0\xe4\xb8\x1b\xd2\x5b\x9b\x9c\x21\x42\xa7\x67\x1e\xe9\x37\xc9\x0f\xd0\x71\x5e\xc9\xaf\xa4\x4d\x86\x04\x68\x98\xb4\x2f\x75\x35\x89\xd2\x26\x8d\x2a\xaa\xa9\x85\xcc\x90\xe0\xf9\xe8\x27\xa3\x92\x3e\x77\x16\x34\x6f\x4f\x89\x31\xc7\x28\x21\xb3\xeb\x64\x5d\xaa\x74\x52\xc8\xaf\xc8\x98\xd7\x97\x55\x45\xc1\x2d\xa1\xbd\xb2\x09\x04\x5c\xb0\x0f\x4b\xfd\x53\x83\xdf\x01\xf0\x03\x68\x0b\x97\x34\x40\xf1\xa3\x9c\x9d\x82\x09\x59\xef\x6f\x85\xbd\x33\x63\x90\x65\xae\xfd\xc8\xbc\xfe\xcb\xd9\xb9\x55\x40\x49\x73\x8a\xf2\x9f\x12\x94\x63\x9d\x39\x15\xd6\x32\x99\x5e\x8f\xaf\x71\x3e\xf2\xee\x3c\x29\x8b\x55\x96\xfa\x10\xc9\x9f\x94\x6d\xdb\x32\x34\x06\x95\xdf\x1c\x19\x45\x94\xea\xf3\x77\x8d\x73\xc8\xba\x60\x40\xc0\x4e\xb3\xa4\xff\x86\x77\x93\x6b\x88\xe0\xc5\xf0\x44\x14\x80\xd1\x07\xd7\xac\x22\x02\xb3\xb6\x94\xe5\x7c\xcc\xa6\xd8\x25\xe2\xa0\x7e\x81\x2e\xd2\x9b\x2c\x20\xd5\xc6\x05\x47\x15\x79\xe3\xed\xff\xc2\x23\xf2\x42\xc5\x93\x91\xdb\x41\xe9\x8d\x5f\x3d\x6c\x5b\x1e\x32\xac\x82\x37\xfc\xfd\x10\x20\x54\x3a\x40\x41\xe0\x3d\x92\xad\x3e\x2e\xc5\x52\x91\x47\x07\xc7\x7c\xd0\x1f\x3e\x48\x01\x14\x44\x28\x3f\x09\x68\xfa\x4d\xee\xee\x55\xc4\x56\xed\x1f\x87\x7a\xde\x04\xac\x8e\x8d\x2c\xb6\xc8\x58\x20\xb4\x92\x9b\x25\xbf\x31\xe9\x25\x43\x5d\x6b\xcc\x50\xd3\xe2\xe9\xb8\x51\x02\xe9\x70\xd7\x89\x5c\x25\xad\xe5\x21\x61\xa3\xb6\xbf\x50\x1a\xb0\x19\x61\xcb\x63\xed\x99\x0a\xeb\x93\xed\xa3\x82\x8b\xf0\x4c\xa5\x28\x53\xc7\xb6\xb8\xe9\xe4\x9e\x34\x9d\x69\xb5\x3b\xe0\x74\x85\xf5\x42\xb7\xcd\xd0\x6b\x52\x7d\x41\xdd\x11\x9c\x70\xb5\x64\xf1\xa9\x3a\xec\x62\xae\x74\xe6\xe8\xf8\x55"}, +{{0xae,0xb1,0x3c,0xcb,0x90,0xc8,0xcb,0xef,0x90,0xd5,0x53,0xda,0x3f,0x69,0x01,0xb3,0xd7,0x5c,0x13,0x01,0x1f,0x02,0x49,0x74,0xda,0xf7,0x9a,0x17,0x89,0xc8,0xc6,0x32,},{0x5f,0xaa,0xfe,0xb5,0x95,0xf1,0x6d,0x33,0x8f,0x1c,0x72,0xa9,0xf3,0xe4,0x98,0xf3,0x8b,0xab,0x69,0xa8,0x1b,0x37,0xd2,0xd0,0x92,0xb7,0xbf,0x7e,0x50,0x5d,0x82,0x0d,},{0x06,0x11,0xb1,0x9a,0x74,0x72,0xa4,0x43,0xe8,0x7e,0x54,0xd7,0xc6,0x64,0x7f,0xaa,0xb1,0xb7,0x9a,0x83,0xfd,0x43,0x71,0xc9,0x2b,0x97,0x54,0x00,0xfd,0x62,0x8a,0xcf,0xc3,0x25,0x77,0xcc,0xbb,0xaf,0x03,0xd8,0x8f,0x89,0x3c,0x88,0xf2,0xca,0xc7,0x84,0xc7,0x22,0xa0,0x8f,0x38,0x7a,0xbc,0x31,0x9a,0x70,0x2c,0x86,0x84,0x79,0x65,0x0b,},"\x86\x1a\x10\x18\xd6\xbd\xc4\x80\x5a\x5c\x4d\xf8\x7e\xfa\xa4\x62\xc6\x8b\x4b\xf4\x06\x5c\x68\x4c\x2a\xf1\x31\xc6\x37\x73\x88\xba\xee\x58\xc6\xc8\xf8\x84\x23\x62\xec\x6e\x3b\xce\x07\xc8\xaf\x55\x88\x5e\x82\xdb\x87\xa1\x52\x27\x80\x0d\xd3\x3a\xfc\x5e\x5f\xd1\x57\x01\xe9\x5f\x53\x50\x1b\x1a\x6f\xf8\x3c\x64\xe8\x51\x71\x49\xbf\x3f\xf0\x11\xb0\x94\xa0\x9c\x67\x3d\x0f\xc4\xa3\x9e\xe5\x5e\x69\xf0\x71\x17\x7b\x8a\xa3\x64\xe1\xe2\x56\x06\x4c\xf7\x02\x79\xcc\x76\x69\x5a\xe4\x9d\xaf\xcd\x80\xca\x0a\x14\xe1\x69\x1d\xb9\x46\x42\x2e\xc7\x5a\xb4\xf7\x86\x59\x15\xa6\x9b\xd4\x8d\x89\xb1\x2a\xdf\x48\x7d\x4d\xb9\xbe\x87\xcd\xdc\xa2\x11\xaa\x88\xe9\xbb\xe8\x49\xda\x21\x39\x89\xeb\x08\x44\x59\x2a\xd6\x3e\x28\x1b\x2e\x4a\xfe\x6a\x88\x36\x00\x66\x09\x92\x6c\x0f\x78\x7e\x84\xf2\xa9\x5b\x46\xb6\x6f\x0e\x45\x55\xc9\x48\x3c\xe2\x17\x6f\xc6\x3f\x7c\xc9\xf4\xf2\xa2\x2d\xb0\x55\xaa\xe2\xe6\x8b\x30\xa0\xda\x5f\xeb\x80\xc2\xa6\x0e\xa1\x0d\xbf\x67\xfb\xbc\xdb\xe0\xbe\x33\xf2\xe9\xc1\x3c\x46\x9e\x77\x68\xf2\xff\x59\x60\xa5\x5e\xb4\x82\xec\x11\xd4\x7e\x15\x4b\x7c\x42\xa5\xfb\x75\x6c\x8a\xd5\x39\xb3\x3d\x12\x5a\x4a\x65\x19\x2c\x6c\x9b\xd5\x76\x23\x8c\xa7\x2a\x73\xcd\x17\x9e\x8c\xf5\xcd\x04\x8e\xd3\x30\x21\x38\x23\xab\xba\xfc\x36\x82\xb2\xb7\xf6\x8c\x5b\xc4\x6f\xd0\x9a\x8c\xb2\xa3\xfd\x09\x95\x73\xee\x2e\x6f\x28\xc8\x2e\x27\x1b\xb5\xef\x93\x4b\x0b\x0c\x38\x1c\xfa\xae\xc6\x66\xd7\x17\x10\x6a\x87\x4a\xf3\x0a\xa7\x41\x25\xea\xe9\xac\xc2\xf1\xf2\x41\x18\xcb\x4e\x68\x3a\x73\x1e\x37\xe5\xe4\x64\xa1\xea\x3d\x2a\x53\xcc\x0d\xca\xd4\xc1\x7c\xea\x9a\x43\xe2\x36\x5f\x3a\xe3\xdd\x89\xeb\x39\x97\x74\x20\x04\x55\x50\x74\x5f\xc2\x67\xfc\x7d\xcc\x56\x02\xe9\x14\x97\x2a\x4d\xa6\xeb\xeb\x68\x7f\x68\xa0\xcd\x7d\x8b\x4f\xdd\x73\x72\x21\x06\xa8\xe4\x36\xb9\x3e\x5b\x58\xf5\x98\x2a\xce\xcd\xec\xfd\xb3\x82\xfe\x98\x53\x82\x61\x42\x6b\xa6\x40\x52\x55\x76\x43\xce\x9f\xec\x71\xea\x43\xcf\x5b\x6c\xba\xde\xb4\x95\x31\x93\xff\x3e\xd1\xa1\xf9\x22\xa9\xaf\x2e\xc6\xf3\x38\xe7\xfb\x0a\xff\xe3\xd1\x3c\x33\xe3\x95\x87\x3e\x4a\x7a\x7f\xb0\x44\x98\x1e\x05\xa6\x71\x97\xb9\x96\xb1\x99\xb4\x30\x11\x11\x93\x63\xe5\x61\xd5\xb8\xa5\x17\x84\xfd\xff\x58\xab\x80\xed\x4c\x49\xe9\x3f\x0c\xf4\x19\x24\xf9\x83\x5e\xfb\x09\xf6\x44\x63\xb6\x55\x17\xb6\x7b\x15\xdc\x3f\x28\xad\x9a\x9b\x2d\x29\x46\x8d\xe2\xc6\x3e\x62\x00\x4b\x6a\x3f\xd0\xc5\xc2\xe2\xaa\xa6\xcf\xa1\x5e\x4f\xaa\xfa\x1e\x2c\x71\x3e\x98\xd3\xfd\x25\xca\xb9\xe5\x17\x03\x59\xc8\x36\x51\x52\xb4\x74\x27\x6e\xd0\x03\x7c\xdf\x77\x18\x28\xe2\xfb\x7c\xce\xc4\x89\x5f\x21\xad\xcc\x5b\x68\x87\xc8\x6e\x51\xad\x05\xf2\x55\xf6\xe9\xda\xd2\xc4\x1f\x56\xb9\x8b\x7b\xbb\xf9\xfc\xb6\xba\x8c\xad\xfd\x38\xad\x8c\x62\xf9\x2d\xd8\x77\x40\xfa\x1e\x1b\xd1\x70\xc0\x0b\x20\x49\xc5\x13\x0f\xe7\x33\xf1\x6b\x1f\x2c\x7f\x00\xb2\xef\x97\xb3\xa9\x54\x58\xc5\x3f\x19\x9d\x46\x53\x36\xd5\xff\x59\x77\x80\x6e\x1a\xfd\xe3\xea\xa2\x46\xd8\x5c\xab\xf7\xe1\x23\x48\x1e\x23\x92\x99\x76\xed\x19\xc4\x0e\x29\xff\x33\xd8\x0e\x7d\xea\xb1\x92\x71\xde\xcd\x5e\xe0\x61\x72\xb0\xb0\xa1\x39\xbd\x62\xa2\xe7\xc8\x3a\x8a\x65\x60\x1d\x0a\x05\xd6\x1a\xf9\xc6\x03\x2d\xf5\x80\x01\xd4\x73\xe2\x0d\xd6\xc6\xaf\xd7\x8d\xdb\xd7\xcd\x17\x8e\x9c\x27\x1e\x05\x72\xf8\x59\x82\x82\x3c\xe6\xc4\x02\x93\x0c\xf8\x0f\x5e\x0c\x7c\xda\x85\x12\x2a\x76\xd1\xce\x02\x1b\x1e\x3d\xe2\x55\x6d\x1b\x45\xac\x7b\x01\xb5\x9c\xad\xa2\x52\x91\xd6\x38\xa5\x2a\x5e\x7d\xbc\xdd\xf9\x6b\xb1\x77\x4a\xb0\xb0\x77\xe4\xb3\xda\x5a\x95\x8f\xe1\x1d\xee\x4a\x02\xe6\x9b\x91\x8d\xdb\xfa\x1c\x5b\x3b\x7d\xca\x9f\x87\x84\xbb\x6b\x0b\x9d\x5a\x7f\xee\x74\xbb\x03\x74\x7f\x61\xc2\xb2\xf1\xb4\x92\x45\x2d\x3b\x56\x0b\x48\xd3\x9d\x87\x21\xe9\x83\x75\x25\x56\xd4\x4d\xa6\xb0\x28\xd9\xae\xf8\xbf\xf9\xaa\x37\x9c\x8e\x2b\x0a\x63\x6d\x74\x88\x60\xab\xd8\xe6\x4f\xc8\xe9\x65\x20\xa3\x4a\x27\xf7\x67\xaa\x97\xa8\xf7\x7b\x60\x95\x21\x8e\xad"}, +{{0x73,0x87,0x2b,0x14,0x76,0x2f,0x68,0xda,0xe4,0xfc,0x10,0xdf,0xd6,0xf4,0x2d,0x3f,0x96,0x22,0xbf,0x2a,0xfe,0x6b,0x34,0xa9,0x56,0x49,0xaa,0x38,0x74,0x24,0xee,0x6c,},{0xdf,0xab,0x2c,0xe1,0xab,0x99,0x81,0xaa,0x7c,0xbf,0x32,0x07,0x35,0x00,0x07,0xfa,0x6c,0xe6,0xca,0x60,0xa2,0xed,0x7b,0x59,0x0f,0x3c,0x2f,0x62,0x92,0x2d,0x8f,0x61,},{0x85,0x25,0xc3,0x46,0xca,0x3a,0x6a,0x6c,0x5f,0x65,0xc4,0x17,0x78,0x59,0x93,0x77,0x65,0x98,0x70,0xcb,0x6d,0xf9,0xa4,0xa0,0xe5,0x5b,0x40,0xc3,0x5b,0xeb,0xa5,0x5c,0x8e,0x00,0x9e,0x56,0x00,0xb6,0x44,0x7d,0xc7,0x40,0x2b,0xa2,0x77,0x49,0x29,0x7e,0x8f,0x95,0x28,0x69,0x18,0x56,0xf7,0x2d,0x2a,0xd7,0x61,0xed,0x1b,0xc1,0x53,0x09,},"\x43\x3d\x71\x78\x1c\xea\xb2\xb4\x7d\x82\x6e\x67\xd3\x9f\x9b\x80\xd2\xff\xd7\x25\xf8\xc5\xae\xb4\x0c\xbe\x4f\x9b\x5f\x48\xef\x93\x52\x1c\xce\xc6\x04\x36\x0b\x96\x47\x32\x31\x90\xbf\xef\x75\xac\x93\x15\x62\xd2\x7f\x4a\x4e\x31\xf4\x6e\x57\xbc\x99\xfa\x51\x58\xc8\x2e\x12\xb7\x37\xe4\x5c\x5d\xe9\xf7\xdd\x7c\x86\x22\xd4\xa7\xea\xad\xf7\x20\x2f\xb4\x9d\x81\x9c\x9a\xd2\x4f\x88\x07\x31\x3c\x5f\x37\xdc\x20\x45\x3b\xdf\x05\xc9\xbf\x1a\x3c\x21\x17\xc9\x3e\x7f\x3c\xc8\xa2\x54\x20\x98\xe8\xfc\x1c\x64\x2f\xa4\x7b\x05\x54\x36\x57\xb8\x5f\x48\x0b\xc8\x6e\xc4\x28\x00\xbb\x14\x22\x35\x9c\x7c\x3e\x8f\xf4\xbe\x59\x8b\xd5\x4f\x1d\xc5\x86\xac\xae\x45\xa4\x74\x06\x22\xb9\x62\x74\x2b\xc8\x6e\x17\xcf\xa6\x3e\x77\x53\x54\xe7\x70\x7e\x50\x79\x58\x9e\x8d\x10\x8b\x1f\x11\xda\xce\x05\x75\xcb\x9a\x6d\x26\xb5\x9f\xce\x98\x14\x65\xd9\xbc\x34\x4e\xa6\x94\x5a\x95\xb8\x62\x79\x63\x84\xfa\x81\x70\x56\x08\x57\x45\x7b\xef\xf9\x5a\x9b\x5a\xc3\xd6\xad\x28\x2d\x44\x92\x9a\x30\x30\x26\xb4\xbb\xed\xd6\x0e\x2e\xf0\x55\xa3\x1f\x52\xd7\xce\x8d\xf2\xca\x5d\x18\x51\xc5\xb1\x67\xdb\x08\x09\x25\x9b\xb8\x12\x56\x90\x74\x10\x5c\x73\x4c\x85\xd6\x23\x12\x73\x75\x5f\x3a\x8b\x56\xdc\x50\x8d\xb5\xc2\x3d\xac\xb7\xa0\x61\x67\xbd\xa5\x1b\xc0\x13\x50\xf0\x16\xcd\x41\xb2\x1e\x8c\xc5\xbc\x93\x34\x3a\x9b\xb6\xea\x47\x38\xc5\xc8\x4b\x78\xfa\x96\x3c\x41\x0e\x43\x3d\xc5\x98\x19\x6c\x22\xe5\xb7\x91\xe1\x2a\x4b\x34\x3f\x7c\xd4\x7b\xbb\x0e\xb0\x78\x2b\xdb\x1a\x4e\x46\x68\x46\xa0\x30\x52\x8e\xeb\x89\x05\x6f\x73\x25\x71\x93\xad\xaa\xbc\x1b\x22\x98\x62\x03\x48\x78\xc3\x25\x8a\x53\x25\x48\x76\x2e\x29\xec\xc0\x01\xab\xd9\x89\x64\x9d\xa5\xe1\x44\xcf\x35\xd4\x86\x99\xf2\x3b\xc4\x6c\x5b\x34\xe0\x4a\x53\xe7\x27\x24\xb2\xb0\xb8\x78\x98\x25\x75\xd6\x88\xe2\x3c\xbe\x3a\x34\x06\x7f\x49\x71\xe5\x55\x97\x2e\xc2\x90\x8a\xe5\xf0\x3e\x88\x31\xec\x67\x75\x5b\xe9\x56\x87\xce\x63\x72\x93\x9e\x1e\x2f\xb6\x95\x1e\xc9\xec\xf4\xbf\x7d\x15\x35\x43\x1e\x25\x9f\x29\xad\x43\x12\x22\xb5\x4b\x65\xaa\x7d\x07\xcf\xb5\xdf\x16\x2a\x87\xc4\xd0\x34\x81\xeb\x44\x1f\x22\x1d\x7f\x58\x62\x7a\x14\x16\x4e\x7f\x4c\x2e\x3a\x1d\x50\x7e\x89\x9d\x53\x58\xe0\x08\x29\xb0\x8c\xf3\xae\xcb\x8a\x75\xb2\xa3\x1c\x31\x85\xa5\x80\xe1\x2b\x13\xf0\x64\x28\x69\xff\xfb\x05\x67\x23\xe9\x61\xaa\xf6\xfe\xfe\x67\xb4\xa7\xc4\xc9\x3d\xb3\xfe\x1f\x61\xad\xcc\x76\x55\x69\xa9\x9c\x09\xa3\xc8\x24\xed\x4a\x98\xba\xbe\xae\x43\xef\xb1\xf3\x51\xba\x13\x0e\x22\xaa\x97\x81\x19\x86\xbe\x92\x3c\xc4\x18\x0a\x7c\x4b\x78\xbc\xc1\x40\xce\xc1\x55\x74\x65\x4a\xa6\xd6\x5a\x06\xb9\x7e\xcf\xa5\xf3\xa9\x35\x5f\x96\xe4\xee\xaa\x76\x89\x21\x7b\x66\x3f\xba\x4d\xab\x0d\x99\xb1\x9c\x8d\x8d\xbf\x47\xa1\x57\xe5\xd5\x96\x9a\x35\xef\x84\xdf\xf9\x56\x2e\xdd\x43\x4e\x73\xae\xe7\xd0\xd8\x92\xdd\xa7\x2a\x36\x2a\x22\xa7\xe9\xfa\x86\x34\xa5\x7e\xeb\xd1\xa9\x07\x48\x5c\xa8\x92\x1b\xdc\x19\xee\x9e\xe5\x88\xf3\x95\x68\x7d\x3f\xc8\xf8\xc2\x5f\x2e\x95\x76\xca\x60\x31\x3f\xbb\x2c\x26\x5a\x99\xf2\xcd\xd5\x57\x5b\x1d\xd5\x30\x60\x4e\x9a\xd6\x69\x5c\x9f\xb3\x59\x94\xa8\xb8\x7d\x5c\x85\x70\x54\x9a\x4d\x32\x9b\x9f\xe0\x87\x06\x9a\xb7\xeb\x0d\x71\x4a\x94\xe1\x92\x61\xf8\x6e\x44\x8f\x2d\xa9\xb1\xcb\x0c\x0d\xbe\x41\xd4\x4c\x3a\x82\x47\x83\xd1\xbd\xbd\x73\x26\x05\x1a\xeb\x10\xad\xab\x80\x5c\x5c\x59\xd0\xe8\x3b\x1c\x11\xa2\xfd\xd3\x5e\x44\x4a\x49\x9e\xd1\x5d\xaf\xd8\x38\x62\x77\x5f\x6c\xdf\xc6\x75\x95\x81\x84\x07\xbe\x55\xec\xbf\x7b\xf8\x6c\x73\x06\x9a\xac\xe5\x77\x62\x6a\x85\x63\x53\x6f\x60\x50\x42\xcf\x7c\xaa\xf6\xfc\x8e\x3b\x54\x5b\x77\x41\x4d\xf8\xd9\xf6\x49\xb9\x9e\xe4\x25\x41\xda\x38\xc3\xaa\xe6\x27\x20\x78\x45\xb8\xf4\x14\xa8\x07\x4d\x70\x86\x8a\x5c\x0b\x07\xb0\x70\xc3\xc6\x53\xbe\x04\x07\x6b\x83\xca\xd7\xb0\x30\x5d\x95\x00\xaa\x44\x45\x5c\xb8\x60\xdc\xc7\x64\x00\xaf\x93\xc3\xd2\xef\xb4\x2a\xe0\x56\xf1\x42\x8b\x65\xf1\x22\xe1\xc7\xb9\x58\x4d\x81\x4d\x50\xac\x72\xef\xdb"}, +{{0x67,0xcf,0x27,0x15,0x52,0x87,0xbe,0x6b,0xfa,0xb6,0x62,0x15,0xe0,0x17,0xc3,0x46,0x63,0x22,0xf2,0x1e,0x6e,0xb1,0x40,0xbe,0x4f,0x1b,0xde,0xcf,0x55,0xab,0xfd,0xc1,},{0xd0,0x70,0xaa,0xb2,0x95,0xa8,0xaf,0x93,0x57,0x27,0xc3,0xbe,0x44,0x2b,0x25,0x1d,0xb9,0xe7,0x74,0xd2,0xf4,0x4b,0x3c,0x24,0x24,0xc5,0x2f,0xc8,0x96,0x56,0xe1,0x69,},{0xc9,0x34,0xa3,0xa1,0xaa,0xab,0x78,0xd9,0x26,0x9d,0x1e,0x9d,0x13,0x39,0x2f,0x72,0xc6,0x37,0xbc,0x5d,0xe5,0x4f,0x04,0x69,0x1e,0xfc,0x29,0xd4,0x73,0xb4,0x75,0x02,0x5d,0x8d,0x8f,0xe3,0xc5,0x23,0xd2,0xd2,0x9c,0x41,0xc5,0xf3,0xde,0xc6,0xca,0x38,0xce,0x6d,0x68,0xd7,0xff,0x09,0xb6,0x13,0x5b,0xa2,0x4d,0x0d,0x32,0xcc,0x15,0x02,},"\x0f\xf0\x52\x97\x03\x1c\x89\x27\x74\xcb\x2c\x01\xe8\xca\x60\xdd\xd0\xce\xac\xc0\xb8\xd5\x91\xa8\x91\xe3\x3b\x19\xe1\xbe\x9e\x36\x3b\xc6\x42\x0d\x6f\x52\x9f\x04\x84\x0b\x3b\x08\x85\x3c\x83\x5a\x03\xe0\x36\x97\x8b\x04\xa4\xf9\xec\x6b\xe4\xae\xf3\x31\x95\x61\x90\x99\x6d\xea\x27\x26\x19\xf1\x68\x6d\x33\xbe\xf0\x3d\xbc\x08\x5a\x92\x3a\x0f\x11\x5b\x78\xf6\x53\xfe\xeb\x60\xbb\x9e\x45\xf3\x4f\xb8\xbe\x5a\x4c\xbb\x64\x8c\x7d\x29\x95\x6f\x0d\x0e\x96\xbd\xd3\xc8\xd0\x64\x97\x20\x62\x4c\xbc\x20\x79\xe8\x4f\xd6\xd0\x10\x24\x11\x24\x09\x84\x59\xf1\x2a\xf2\x99\x1d\x38\x28\x77\x0f\x50\xb1\x04\xea\x6e\x5f\x51\xfd\xad\x30\xa9\xb8\x07\x9d\x21\x59\xe4\x6d\x64\xaf\x91\xd0\x7c\x10\xed\x19\x81\x4d\xf2\xaf\xe6\x60\xd7\xd8\xf2\x40\x35\x34\xe9\x2c\x62\xe1\xea\x6d\x68\x82\x03\xbc\xa3\xd9\x7c\x2a\xfd\xa8\x3b\x25\x55\x20\xff\xe9\x2a\x33\x62\x57\x72\x51\x3b\x1f\xe3\x4f\xaf\xe3\x2b\x6a\x9b\x8c\xf9\x94\xdf\x7e\x63\x4e\x68\x65\x91\xe5\xf0\x07\x3a\xba\xbc\x64\xa8\x92\x10\xba\x53\xa4\x99\x1c\x11\x55\x7e\x03\x34\xe6\xc6\xa5\x03\x6c\x64\x2a\x31\x8f\x22\x95\x11\x71\x39\x08\x5f\xb3\x40\x75\x64\x70\x06\x75\x8e\x32\xbc\x00\xad\x10\x9f\xe8\x03\xf7\xee\x9f\x5e\xc2\xaf\x4d\x25\xc3\x07\x0a\xbc\x51\xcf\x4d\x78\xe1\x3a\x7c\xe2\x83\xd4\xfb\x4e\xb4\x1d\x3e\x8c\xe9\x02\x38\x50\x0a\xe0\xce\xda\x32\x0e\xc5\x92\x2e\xfa\x10\xb9\x03\x74\x8e\x1e\x85\x3a\x37\x29\xd2\x4c\x10\x54\x39\xdf\x2f\x70\x00\x12\x3d\xb9\xb2\xc0\x15\x33\xbb\xf0\xd0\x28\xeb\xb2\xfc\x00\xdc\xe3\x8a\xd0\x63\x28\xee\x9e\xcd\x84\x9a\x6e\xfc\x3a\xe8\x84\xef\x69\x33\xcf\xeb\xed\x05\x5b\xb2\x96\x8a\x0b\x06\x76\xb5\x72\x92\x16\x17\x8c\x75\x19\xef\x07\x88\x59\x3f\xc0\xdc\xff\x50\xd7\xe0\xb1\xeb\xb3\xcf\x49\xbb\xd1\xbf\xa5\xc3\x0e\xa7\xb8\x8c\x36\xe1\xa1\x59\x3a\xef\x0b\xb3\xf9\xe2\x09\x1c\x85\x89\xf7\x41\x4b\xee\xd8\xdf\x46\x6a\x2e\xd8\x7b\x2c\xb5\xf3\x5f\x1d\x31\x24\x6c\xeb\x96\x86\x09\x25\x36\x15\xd7\x80\x43\x51\x73\x79\xee\x69\x74\xa6\x69\xcb\x48\xda\x6a\xc2\xf9\x6d\x70\x0b\x7e\x44\xa4\x35\xcf\xef\xec\x40\x2a\x1e\x31\x10\xe7\x69\x81\x92\x4f\x26\x01\xc0\x1d\xc0\x35\x46\xfd\x4f\x51\x16\x49\x30\x2f\x06\x33\xdf\xbd\x25\x65\x1c\x5a\x59\x9c\x90\x95\x44\x89\xc7\x6a\x65\xec\x05\xa7\xe4\xcc\x74\x61\x6c\xe2\x56\x01\xcc\x37\xb8\x04\xe1\xf0\xbc\xc8\x65\x10\x23\xb1\x2e\x13\x56\x84\x41\xe8\xb8\xef\x4c\x30\x5f\xcd\xad\x3d\x2b\x13\xfa\x08\x03\x24\xb2\xfd\x6b\x61\x99\x8c\xf8\x64\xb6\x58\xbc\x7f\xef\xcc\x48\xa5\xa7\x68\x1d\x7c\x86\x6c\x34\x2c\x7f\x5d\x6c\xf1\x08\x81\x52\x2c\xc7\x10\x25\x7d\x25\xa4\xc1\xe3\x52\xd2\x70\xe9\x02\x08\x2a\xb9\x54\x1d\x59\x00\xce\xff\xa0\x91\x4b\x16\xb5\x5e\x0d\xd3\x78\x6e\x98\xd4\x17\x20\x87\x5a\x14\x8e\xb4\xab\xdb\x01\x53\x85\x66\x79\xfb\x98\xc0\xec\x48\x5e\x5f\x45\x8d\x63\x5b\x78\x61\xa2\xb3\xa8\xba\x5e\xc2\xc1\x44\x4d\x35\x39\x80\x20\x0e\x5e\x07\x18\x08\x85\x4a\x26\x8c\xc7\x6c\x60\x5c\x94\xf3\x73\x29\xc3\x61\x87\xa4\x1f\xdd\xf9\x2a\xab\xdb\x49\x96\xa0\xe1\x0b\x31\x55\x26\xaf\xea\xc8\x0e\xb2\xfa\x32\xaf\x78\x6a\x34\x31\x6b\x36\x11\x1e\xe9\x35\x21\x08\x14\x4d\x70\xf7\xd1\x72\x3b\x32\xf4\xdb\xaa\x82\x20\x13\x53\x41\x1d\x65\x77\x13\xe5\x5e\x35\xdf\x78\x58\x0b\x1b\xc0\x86\x80\xf0\x15\x9f\xa1\x16\xfa\xf4\x63\x56\x6a\xaf\xe8\xae\xa6\x98\x57\xe7\x2e\x44\xac\x80\x9a\xc4\x3f\x5c\x45\x93\x9d\x85\xa1\xa5\xf4\xa3\x70\xa1\x89\x96\xc8\x51\x4a\x46\xf3\x43\x71\xef\x9e\x5f\xb2\x04\x42\x2c\x93\x4a\x1d\x29\x3d\x10\x1b\x8c\x16\xf9\x9c\xc0\x73\xea\x36\x6a\x13\xa4\x5c\x43\x7d\x62\x0d\x13\x2b\x74\x40\x9c\xbf\x8b\x9c\x07\x5b\x41\x63\xf7\x26\xaa\x67\xe5\x09\xa2\x48\x74\xfc\x1b\x1f\xb6\xfb\x7c\x73\x55\x15\x9c\x02\xaa\x13\xe6\x4b\xad\xf1\x50\x35\x6b\x18\x41\xb3\x21\xf8\x04\x1e\x13\xed\x77\xe8\x46\x1c\xfb\xb8\xe8\x28\x48\x8b\xf5\x17\xa5\xd2\x9f\xf8\x2e\x73\x67\x48\x0a\x8e\xdd\xde\xb5\x35\x0e\x7a\x83\x42\x3b\xd0\xb1\xc5\x5f\x7b\xb4\x24\xca\x04\xc2\x05\x72\x3c\xd5\x40\x56\x71\xe7\x33\xf3\x91\x60\x0a"}, +{{0x18,0xc2,0x1c,0x0d,0x0d,0xe1,0x3d,0x4c,0x64,0x49,0x7e,0xf0,0x26,0x0d,0x66,0xcf,0xd3,0x42,0x16,0x98,0x1a,0x1b,0x49,0x39,0x1a,0xe5,0xcb,0x0e,0x41,0x43,0x6e,0x9f,},{0xf7,0xd4,0xdd,0x1e,0x05,0x9c,0x36,0xf6,0xd1,0x21,0xc0,0xaf,0xfe,0xb2,0x1f,0x0c,0x57,0x2b,0x45,0x99,0x2f,0x84,0x94,0x8b,0x09,0xaa,0xfb,0xcd,0x86,0xbb,0x53,0x5c,},{0xc9,0xc0,0x99,0xe2,0x1d,0x09,0x5a,0xfa,0xdd,0x4e,0x71,0xc9,0xab,0xf6,0xb7,0x08,0x33,0x24,0x77,0x62,0x25,0xb5,0x87,0xb6,0x0a,0x0e,0x60,0x92,0xec,0xb3,0xd3,0x3c,0xff,0x39,0xc6,0x7d,0x34,0x77,0x6a,0xe9,0x9d,0xda,0x75,0x4a,0x3c,0x2b,0x3f,0x78,0x11,0x35,0xa3,0x8c,0x78,0xed,0x64,0x55,0xaa,0xf0,0xae,0x0c,0x31,0x3b,0x62,0x05,},"\x68\xab\xca\x7c\x16\x6a\xfe\x06\x3e\x47\x7b\x80\xe3\x7d\xb2\x24\xe1\xa2\x35\xde\x8f\xcd\xeb\x7f\x42\x7a\xf6\x7e\x00\x12\x47\xcc\x5e\x05\x71\x82\xfd\x9b\x6d\xb8\xba\xba\xa6\x58\xcf\x3b\x3f\xe4\xb0\x76\x3b\xf8\x8d\x67\x31\x1b\x11\x90\xbe\x83\x40\x18\xcf\x57\xa3\x32\x92\x24\x13\x76\x46\x20\xac\xe0\x54\x45\xee\x01\x9a\x06\xdf\xf9\x8b\x23\x89\x79\xad\x6d\x30\x90\x1b\xef\xa3\xc6\x4f\x6b\xd8\xc6\xeb\x09\x2c\x2e\x62\x84\x13\x88\xfd\x8c\x4e\x84\x19\xe2\x77\x89\x84\x89\x67\x37\xed\x90\xa2\xcd\xb2\x19\x96\xae\xf7\xc2\x16\x38\xd6\xcb\xe6\x80\x32\x2d\x08\x99\x65\x97\xa9\xe3\x03\xf6\xf5\xf4\x79\x40\xf8\xc5\xba\x5f\x5f\x76\x38\x3e\x7e\x18\x06\x4a\x3d\x2d\xff\x5f\xdf\x95\xe9\x0c\x5e\xb3\x0f\x4d\x8d\x45\x9e\xe1\xd5\x06\xa8\xcd\x29\xcd\xc6\x9b\x67\x54\x96\x3b\x84\xd6\x74\x94\xb3\x53\x05\xd1\x0d\x12\xb9\x48\x74\x17\xb2\xce\x28\xad\xcb\x10\xb6\x5c\xc9\x31\xfb\x33\x81\xae\x02\xe7\xaf\x79\xa0\x2b\xf9\x9e\x25\x8a\x56\x36\x10\x90\xe0\xb7\x12\x22\xb3\xac\x60\xbf\x2f\xb7\xba\x83\x2d\x03\x4f\x5b\x6b\xc6\xfa\x66\x3a\xe7\x41\xf7\x6d\x97\xc1\xac\x32\xbc\xb7\x41\x15\x07\xd5\x18\xd2\xf6\x05\x4b\x57\x83\x28\xc5\xf6\x7f\x75\x8a\xc0\x1b\xfe\x6f\x4d\x35\x90\x0f\x50\xa5\xdc\xd3\x0d\x2f\x92\x61\xb6\xbb\xec\x4c\x1d\x1f\xc1\x8d\x2a\x7e\x70\xc4\xd3\x6c\x21\xfa\xf8\xcf\x94\xa5\x87\xc3\xa0\xd1\xa9\xcd\xe7\x83\x1a\xe6\x26\x77\x54\x68\xdd\xcd\x40\xa8\xba\x18\xf4\x2b\x34\x18\x8d\xe5\x74\x1e\x1b\xe8\x30\x7b\x10\x84\x58\x65\x15\xec\x01\x5e\x4e\x37\x1d\x29\x44\x3a\x40\xb0\xc0\x69\xc6\x41\xd8\xce\xe5\xe4\x61\x18\x62\x98\x7c\x3e\x35\x6b\x12\x93\xb0\x51\x8b\x4a\x4c\x8e\xa9\x7f\xc5\xa4\xdb\x1f\x01\x29\xab\xee\x72\xfb\x80\x92\xea\x35\xc2\xda\xb6\x75\x73\x85\x02\x07\xb8\xe8\x27\x18\x99\x9a\xd9\x9c\x4c\x83\x9e\xac\x14\x63\x6b\xd5\xe4\xd8\x43\x6a\x27\x0d\xd9\x0b\x8e\x32\x13\x02\xe5\x2a\x92\xd8\x91\xff\x18\x91\x54\x2a\xe2\xca\xa0\xd6\x6e\x0f\x66\x1e\xae\x37\xb2\x5b\x08\xbb\x2e\x0e\xee\xc4\x83\x80\x09\x77\x8c\xd5\x25\x98\x43\x80\x98\x3b\x2b\xaa\xdd\x71\x02\xa1\xe3\x56\x73\x4e\x41\xd7\x61\x83\x82\x9e\xa9\xab\x82\x44\xc3\x36\x59\x7c\xa2\xd6\x79\x88\xf2\x81\x43\x84\x67\xe4\x53\xf5\x62\xc6\x7b\x22\xd0\xa4\xdd\x9f\xcb\x46\xa5\xf8\x0d\x29\x9d\xb5\xf0\x1f\x59\x16\x0a\x19\xd7\x4c\x64\x4f\xa5\xa9\x40\xe3\x2c\x9d\x8d\x98\x3b\xab\x7e\xfb\x0d\x7c\x7d\xa4\xe3\xfd\xa1\xcd\x0d\x18\xa4\x55\x8e\xb9\xfe\x46\x40\x8a\xab\x50\x85\x91\x2b\xf2\xf4\x6a\xb6\x3a\x93\x54\xf9\x02\x7c\x93\x69\x12\x23\xff\xaa\xb8\x46\x3b\xac\x4c\x4b\xc3\xb1\x1a\xbc\x46\xba\x68\x71\x7c\x91\x78\x0d\x3f\x30\x47\x0d\xbd\xd8\x8b\x37\x80\xa1\x94\xc8\xa4\x0a\x2c\x0a\x81\xa4\xd5\x6d\xec\x2d\x89\x62\xc3\x4d\x2a\xb7\x33\x69\x02\x8e\x1b\xfe\xaa\x6b\xb5\x82\x41\xff\x4f\x89\x8f\x80\xad\x3b\xb1\xc6\x91\xb8\x64\x7f\x2c\x69\x83\x95\x4c\x1c\x77\x95\x74\x58\xee\xbf\x1c\x50\x55\xc3\x16\x93\xab\xce\xd0\x53\x84\x73\x5a\x4f\x74\x19\x68\xbd\x6a\xc3\x15\x65\xcf\xee\x71\xc8\x84\xc1\xe2\x9e\x9e\x7a\xe0\xf7\xec\xd0\x4d\x46\x3b\x1d\xc3\x89\xc3\x60\x37\xe8\x14\x58\xdc\xec\x61\xd0\x76\x40\x32\xdd\x58\x9b\x92\xaf\xda\x2f\xc9\x02\x8f\x41\xab\x53\xcc\xa2\xd0\x4e\xc6\xa9\x56\x59\x55\xcb\xcf\x1a\x34\x63\x98\x9c\x71\x39\xbb\x90\x2a\x59\x21\xe8\xb2\xc9\x9c\x48\xe1\x37\x11\xf0\xbc\xc3\x99\x25\x95\x16\xc8\x1a\xe9\x42\xa6\x79\xd4\xba\x33\x97\x9e\xb1\x2f\xcd\x28\x60\x60\x2e\x47\x24\xb1\x33\x0f\x1c\xd2\x57\xb5\xb2\x89\x1d\xae\xe8\xef\x4c\x92\xfc\x3b\xfd\xb3\x4e\x53\x2d\x58\x70\xf3\x80\x59\x86\xac\x97\xb5\x03\xfd\x85\x87\x35\x48\xe3\x09\x50\x00\x0f\x8a\x70\xbe\x51\xfa\x75\x76\x03\x50\x1f\x2d\x30\xe8\x52\xef\xea\xc4\x82\x68\x62\xae\xd7\xf6\xd2\x0c\x9a\x8c\x8d\xbe\x36\x2d\xfe\xe4\x18\x93\xf2\x7e\x6f\xd5\xe9\x1d\x0e\x7e\x3d\x4f\xd8\x15\x5f\x44\xfd\x8e\xf1\x7a\xf1\x4a\x84\x8d\x44\xa8\x76\x31\xae\xee\x75\x14\x62\xb2\xa5\x40\x87\x06\x8d\xae\xab\x3e\xa3\x28\x9e\xce\x62\x12\xb3\xb5\x2c\xe7\xa8\x88\x6d\xf2\xa7\x27\xb7\x2a\x57\x0c\x2f\xb9\xc5\x03\x41"}, +{{0xdb,0x9a,0xae,0xe1,0x98,0xcd,0x26,0xa5,0x2b,0x11,0x81,0xfa,0x3f,0xd9,0x2a,0xbe,0x42,0x5e,0x66,0x6d,0x89,0x0b,0xf9,0x69,0x46,0x7d,0xd2,0xce,0x28,0x0e,0xd4,0xa7,},{0x3c,0x89,0x7c,0xaf,0xe2,0xb4,0x99,0xec,0xb2,0xe1,0xdd,0x01,0xea,0x55,0xf3,0xfc,0x88,0xf6,0x8c,0x25,0xb6,0x4a,0x63,0x6b,0x31,0xa1,0xfd,0x1c,0x78,0xf3,0x7f,0x3f,},{0xb2,0xe3,0xd9,0xc5,0xd0,0xff,0x32,0x99,0x96,0xbc,0x89,0xd2,0x6f,0xb3,0xac,0x12,0x6b,0xde,0xd3,0x13,0xcb,0xf8,0xdf,0x86,0x71,0x86,0x38,0xc1,0x99,0xe0,0x57,0x27,0x3d,0x09,0xeb,0x16,0x3c,0x6c,0x18,0x1f,0xd8,0xbc,0xe5,0x1f,0x72,0xd4,0xd9,0xd2,0xe8,0x4a,0xbb,0xe0,0x83,0x30,0x77,0x3b,0x9f,0xcc,0x21,0x66,0xf1,0x40,0xd6,0x0e,},"\x47\xfb\x62\x15\x61\xf8\xb7\xee\xce\xc6\x03\x3f\x2b\xcb\x6f\x43\xac\x68\xc9\x58\xdf\xd2\x65\x6f\x52\xa0\xc2\x9b\x4a\xcd\x44\xf4\x30\x4c\x6b\xf7\x7e\xea\xa0\xc5\xf6\xd3\xb2\x2d\xb1\x96\x99\xc3\xdc\xde\xde\x69\x8a\xbd\xe6\x23\xec\x4b\x2b\x90\x91\x0c\x80\xac\x3a\xf3\x9c\x55\x0b\x6d\xd4\x09\xe6\x3d\x77\x70\x66\x55\xa9\x19\x9c\xb5\xc0\x25\x8f\x5b\xa3\x82\x85\xff\xdc\x64\xb8\xa8\xf3\x73\xd1\xfb\x29\xba\x87\xf8\x4d\xdf\x5f\x34\xd8\xf1\x40\xbb\xc1\x7b\x39\x61\x68\x2d\xf5\xd0\xa8\xf9\x10\x2e\x37\x9a\x99\x98\x13\x9d\xfe\x40\xab\x8c\xe7\x53\xbf\x56\x26\x10\x82\x37\x77\x1a\x7d\x8e\x10\x9e\x9e\x0a\xfe\x9b\x66\xd0\x42\x09\x42\xe1\x63\xa4\xf3\xc0\x3f\x71\x81\x3e\xe0\x78\xbd\x09\x0a\xc3\xd0\x77\x2e\x26\x22\xc2\x59\xe6\x82\x55\x2c\x75\xb0\x8d\xd0\x55\xa4\xa5\xeb\x5e\x60\x94\x40\xbc\xd3\xf3\xa6\xfe\xb8\x76\xfd\x16\x92\x15\x20\xc6\xcb\x68\x84\x71\x0d\x2e\x15\xcd\xad\x6d\xaa\xee\xd9\x59\x62\xdd\xa2\x1c\x67\x88\xf7\x84\x91\x79\x17\x98\x2e\x1c\xcb\xb5\xfd\xd9\xbd\xc1\x76\x9d\xb6\xb6\xdb\x57\xca\x35\x4e\x01\xa1\x33\x9d\x8e\x77\xe9\xdb\xbb\x58\x12\xfb\xab\x6a\x14\xc5\x40\x85\xc0\x65\x95\x99\xf1\x50\xe2\x24\x72\x47\x0f\x1e\x5e\x67\x2c\x42\x5f\x37\x5f\x9e\x0d\x6e\x8d\x52\xfa\x17\xb7\xa8\xd7\xa4\xd7\xca\x3e\x12\xf4\xdb\x53\x83\x6a\xed\x2b\xeb\xd7\x45\x89\xba\xca\x8c\xe9\x10\x02\x91\xbf\xb7\xe4\x56\xdb\x7f\x2f\x0a\x84\xdc\x0a\x74\x88\x85\x13\x66\xa9\xa5\xfe\xa0\xe3\xef\xc7\x4b\x9c\xdd\x4b\xd9\x7b\x65\xab\xf3\x61\x39\x3c\xe1\x70\x3d\x85\x71\x80\x5e\xe6\x8a\x13\xd3\x65\x4f\x03\xdc\xec\xfb\x77\xa5\x34\x30\xd0\x94\x96\xad\x73\xec\x01\x75\x99\x57\xe5\x10\x46\xaa\x73\x96\xf5\x92\x33\x86\x50\x11\x7a\xc7\xb4\xdd\x35\x73\xeb\x53\xd9\xc9\xf9\xdf\xa6\x2e\x23\x69\xc7\x7a\xf9\xc0\xd4\x2f\x61\xba\xe7\x4b\x28\x7d\xdf\xa2\x7b\x7f\x1c\x1b\xe9\x88\x3a\x04\x46\x91\xd5\x6d\xc1\x37\x34\xad\x4e\xe3\xa3\x2a\x9f\x40\xe3\x28\xc5\x00\xd0\xfe\xd8\xea\x05\x10\xe9\x38\xf2\x75\x80\x04\x02\x2b\xca\xa6\x90\x2b\xda\x10\x14\xb8\xae\x33\x65\x27\x28\x29\xed\x94\xfa\xba\x63\xcb\x14\xa3\x6c\xf8\x13\x90\xec\xa8\x3f\xc1\xc6\x27\x17\x20\x13\x26\x1b\x39\x93\x77\x9a\xa0\x76\xa5\xc5\xd8\x1d\x90\xd2\x70\x62\xe1\xa6\xd9\x0b\x5c\xf1\x00\x5c\x70\x19\x17\xb7\xad\xac\x18\x0c\xb7\x5b\xbc\xe0\xf2\x7f\x2f\x18\x0e\x2c\xb9\x01\x40\xc1\x4c\xc6\x00\x9d\x2d\x41\xaa\xb1\xdb\x94\x18\xf9\x1d\x4c\xf3\x94\x00\x2c\xd7\x0a\xc9\xdc\x11\xce\x86\x53\x47\xfa\x3f\x56\xf8\x7c\x14\x9e\x2b\x17\xd2\xc7\x2b\x66\x3a\x58\xe3\x18\x7b\xb1\x9b\x9b\xac\x2d\x11\x48\x3b\xa1\x2f\x77\x0a\xc0\x4d\xc4\x6d\x38\x85\x18\xfa\x54\xdc\x15\x2e\x9a\x9d\xfb\xff\x14\xf1\x4c\x61\xcb\x37\x58\x97\xe3\x0c\x53\xe6\xde\x42\xd5\xe1\x40\x1d\xae\x1b\x22\xba\xaa\x0e\x8a\x41\xc6\xaf\x9d\x0e\x0b\x13\xa9\x1a\x23\xd9\xb7\xd5\x55\x20\x47\x02\x9a\x35\x21\x94\x6c\x71\x20\xd3\xd2\x58\xb3\xae\xfc\xf7\x54\xd1\x95\x94\x87\xa1\xfe\x77\x43\xac\x7e\x1c\xc8\x9e\x36\x8b\x19\x78\x09\xc3\xa2\x73\x17\xe0\xec\x48\xd5\x46\xdb\x1e\x21\xeb\x62\x9a\x29\xbc\x62\x47\xcd\xd4\xa1\x37\x14\x37\x56\x3e\xdd\x12\xfa\xea\x2c\x5c\xb7\x7e\xed\xed\xbf\xc5\x80\x08\xfa\xd1\xf6\x5a\xf3\x58\x43\xfa\x27\x4c\x73\x4e\x3f\xbb\xaa\x9c\xc5\x0d\x68\x37\x48\xb7\x5a\x48\x5f\x94\xd6\x30\xb0\x32\xa5\xf1\x06\x7d\x1d\xeb\x30\xe9\xd2\x21\x8c\x93\x5c\x98\x1d\x01\xc0\xc5\x47\xfd\x68\x41\x31\x36\xed\xf4\xc0\xc7\x70\x28\x6e\x82\x34\x42\xe1\xc5\x13\x65\x19\x29\x21\x3c\x12\x1c\x1d\xe7\x00\x98\x91\x41\xab\x4a\xf3\xb3\xfe\x74\x04\xb4\xd2\xa3\x8c\x53\x0b\xaf\xb4\x98\xe6\x49\x53\xce\x1c\x0f\xb7\xd3\x40\xe2\x11\x35\xbf\x8a\xfd\xd8\xdd\x65\xb1\xb1\x8c\xf1\xc8\xfb\x9f\x40\x2b\x26\x70\x40\x0b\x86\xdd\xaf\xb1\x84\xcc\x51\xd5\xfd\xa2\x73\xb8\x0c\x26\x52\x1f\x91\x2f\x35\x83\xb4\xae\x30\x1d\xae\x15\x1c\xb5\x5c\x75\x70\x3a\xad\xef\x03\x24\x15\x22\x7d\x53\xe3\x95\xdb\x6c\x15\x0a\x1e\xe8\x39\xad\x26\xba\xe5\x52\xe1\xab\x73\x62\x14\xdc\x04\xb0\xf3\xc4\x1b\x7c\xfb\xd0\x49\x68\x1b\xc8\x4c\x3d\x16\x53\x07\x68"}, +{{0xa8,0x04,0xc3,0x3b,0x4d,0x38,0xcb,0x3c,0xe3,0x1c,0xf3,0xba,0xc1,0x04,0x9e,0x0d,0x4e,0xc6,0x3a,0x1a,0x0b,0x7b,0x59,0xfd,0x8a,0x36,0xee,0x37,0x54,0x16,0x56,0xaa,},{0x60,0x72,0x25,0x6d,0x65,0x74,0xa2,0x93,0xbd,0x7c,0x22,0x1c,0x55,0x1c,0x32,0xcf,0x2f,0x77,0x15,0xe1,0x9e,0x43,0x3a,0x49,0xd9,0xb8,0xb0,0x49,0x0e,0x56,0xef,0x62,},{0xb1,0xb4,0x4a,0x14,0x2a,0x7c,0x4c,0x3d,0x0b,0xf4,0x66,0x1e,0xda,0xc5,0xb7,0x67,0x00,0x57,0x26,0xc1,0x4a,0x27,0x69,0xb7,0xc2,0x14,0xfb,0x58,0x73,0x7e,0xc2,0xe4,0xbc,0x51,0xc3,0xa1,0x95,0xd2,0xba,0x1b,0x74,0xa5,0x4e,0xff,0x4c,0x33,0xa9,0x0f,0x41,0xcc,0xde,0xfa,0x9e,0x93,0x65,0xfd,0xe8,0xdd,0x85,0x9f,0xd3,0x97,0x8c,0x0a,},"\xdb\xfe\x30\x7f\x2a\xae\x9e\x07\xec\x7c\x4b\x68\x21\x06\xd2\xc9\x36\x7b\x0c\x4a\xaa\x58\xae\x80\x4e\x0a\x39\x04\x75\x4e\x6c\xf8\xfe\xe7\x3c\xf9\xe2\xd4\x5d\x02\x89\xe5\x07\x82\x93\xdf\xc4\x69\xd4\x6e\xa6\x70\x26\xc5\xaa\x69\x2d\x2f\x2c\x9f\xb4\xec\x57\xcd\xab\x4c\x04\x3f\xf9\xae\x61\x85\xf2\x7a\x70\x44\x54\xe5\xf5\x39\x50\xaa\xbd\x25\xc9\x91\x04\x74\xd4\x5a\xf8\x83\x68\x62\x72\x3e\x0e\x6a\x27\x82\x3d\x82\xbc\xbb\x68\xa9\x60\x52\x42\x2a\x18\x19\x51\x2e\x3b\x43\x40\x8c\xf4\x89\x57\xad\x6a\xe2\x35\xb7\x23\x3d\xf1\x82\x84\x74\x91\x53\xdf\xa5\x7d\xe3\x50\x74\xa3\x0e\xdf\xab\x8a\x56\xdf\x28\xab\x2e\x29\x40\x30\x6c\x22\x1a\xa5\x54\x90\xcc\x66\x4e\x14\x68\x3f\x30\xee\x61\x5e\x2d\x93\xfd\xf9\x71\xf5\x96\x66\x34\x65\x84\x3b\x3a\xdd\x63\x92\xba\x33\x90\x31\x1e\xf8\xdc\x59\xf2\x51\x44\x5d\x66\x9e\x10\xa0\x06\x19\x91\xe1\x13\x56\x19\x23\xaa\x21\x52\x44\x46\x3d\x82\x64\x19\x9a\xc5\x88\x92\x4e\x23\x1e\x84\x19\xd8\x68\x5f\x33\x8e\x59\x9b\x5f\x40\xbf\x9b\xd1\xae\xce\x77\x25\x35\xbb\xbc\xb8\xf6\x88\x1c\x2e\x80\x04\x91\xab\x3b\x57\xb4\x4b\x8a\xe4\x3a\xeb\x5c\x4a\xe5\xe7\xed\xeb\x22\x8f\xed\xc9\xf6\xb9\xca\xde\xa1\x76\xe1\x34\x93\x6d\xed\x60\xaf\x1c\x22\x87\x34\xfb\x00\x57\x0f\x23\x74\xbb\xbf\xa1\xbb\x17\x07\x85\x80\x5d\x6b\x6c\x70\x1e\x82\x09\x52\xea\xe4\x5b\x8c\x23\x66\x11\x3a\x1d\xfb\x2e\x35\x85\x2a\xf4\x19\xb7\x54\xf9\xcf\x7a\x08\x1c\x3d\xde\x6c\x80\x53\xbf\x1c\xe0\xc8\x53\x39\xd5\x69\x9c\x42\x24\x76\xfc\x21\xf2\x6c\xe7\x5d\x2a\x7f\xed\x09\xfc\x0f\x41\x75\x78\x98\x47\xd8\x76\xc5\x1a\xa4\xe0\xbf\x7c\xe8\x42\xb8\x30\x8d\xc7\xa2\x8c\x82\x39\x52\x07\x14\xdc\x23\x31\x36\xe0\x9f\x55\x7c\x7e\xf3\xe0\xf8\x3b\xad\x63\xcb\x28\xac\x61\x6d\x39\x28\xf3\x83\x7d\xce\x1d\xd5\x8a\xcb\x8d\xdb\xc7\x2e\x82\x2d\xee\xe4\x5f\x00\x77\x6a\xcc\x88\xe0\x0c\xd3\xa9\xdb\x48\x6d\x92\xd5\x35\xa5\x7a\x0f\xdc\x4f\x90\x3b\x62\xe5\x17\x22\x1c\x30\x8c\xba\x2e\x30\xff\xe7\xb9\x19\x37\xa9\x94\x17\x72\x1f\x56\xfe\x6d\xf4\x48\x40\xe9\xe4\x11\x36\x92\x9c\x0c\xa3\xdc\x28\xdd\xf2\x37\x9e\x4d\xcf\xde\x83\x72\x3e\x2d\x4c\x9e\x23\x29\x9c\x05\x6a\xfb\x31\xd3\xe7\x0d\x08\x5d\x0a\x31\x2c\x5c\xd5\x70\xb6\x99\xde\xa8\x71\x74\x58\x53\x13\x48\xc9\x6f\x6e\xb5\x2d\x7e\xe6\x1d\x56\x60\xf6\x5e\x90\x9a\x14\xce\x10\x33\xdc\x85\x3f\x2f\x25\xd0\x9c\xf4\xe4\x0d\x07\xef\xf7\x2e\x15\xa3\x90\x56\x4a\x2b\xe3\xc0\x42\xd8\x9a\x68\x66\x0a\x97\xff\xac\xec\x49\x67\xa4\xb6\x18\x71\x2d\x70\x60\x75\x65\x20\xc2\x9e\xe8\xd9\x22\x0a\xd8\x61\x5c\x4f\xcf\x39\x69\xbd\x3b\x2e\x09\x47\xe1\xf0\xbe\x7e\x2d\x80\xe0\xa6\x14\x80\xc3\x16\x6d\xb5\x58\x22\x18\xbb\x0a\x8b\xe9\x84\x8e\xfd\x41\xb6\xce\x0c\xd7\x95\xc4\x86\xab\xb6\x72\x10\xbe\xb6\x0c\xd0\x78\xb4\x6a\xeb\x7f\x4f\x48\x50\x31\x90\x2b\xcd\x71\x31\xe0\x0b\x70\x35\xaa\x2d\x43\xfe\xe0\x63\xf7\xf3\x0b\xd5\x70\xda\x1d\xbb\x65\xc0\xca\x92\xa4\x81\x26\x32\xe4\x32\x77\x85\x53\xe3\x5e\x85\x6c\xaa\x82\x18\x22\x1f\xd6\x31\x6a\xb0\x86\x91\x73\xb3\x84\x09\xbc\xef\xe6\xd2\xdb\x92\x10\xf9\x02\x41\x73\xb6\x6d\xbb\x92\x67\x7c\xbc\x71\xc8\xa1\xcd\x58\x3f\xa6\xf3\x54\xd3\xc9\x3f\xa8\xb1\x6c\x71\x37\x4f\x25\xa0\x0c\x33\x2f\x85\xa8\xbe\xfd\x54\x03\x88\xfb\x50\xdb\x9f\x5d\x96\xe4\xe4\xe6\x98\x83\x3c\xe3\xd6\x3c\x10\xb8\xee\xc7\x0a\x24\x3b\x90\x15\xdb\x45\x94\x31\xb6\x2f\x56\x68\xbb\xa6\x0f\x07\x04\xf6\xbd\xfe\x95\x46\xea\x47\x5c\xef\x2e\xbc\xcb\xa4\xb7\x68\x08\x48\xe8\x2b\xef\xf5\x85\x4e\x49\xf6\x5b\xb7\x73\xa4\x92\x2e\x90\xf9\xb8\xaf\xc7\xcf\x81\x87\x30\x58\x8e\xd5\xaa\x7b\x39\x98\x26\xaa\xdd\x54\x37\x2f\xcb\x76\x14\x58\xb6\x4d\xe6\x68\x57\xf4\xad\xac\xd4\xc3\x29\x00\xcb\x77\x13\x6a\x53\x5d\x7b\xbb\xb5\x54\x59\x7a\xec\xf3\x9f\xf6\x98\xb4\x5e\x6a\x21\x8d\xf1\xd2\xab\xe6\x15\xeb\x8d\x9e\x18\x24\xc0\xbe\xcc\xe9\x07\x67\x89\x9e\xbf\xd2\xc7\x30\x14\x4b\x32\xc7\x46\x04\xc0\xe5\x3e\x25\x05\xbb\x15\xd2\x80\x07\xa8\x7b\x99\x31\xd6\xee\xc0\xa6\xcb\x5b\x0f\x96\xd3\x19\x4b\x24\x23"}, +{{0xf8,0x20,0xe6,0xf2,0x4a,0x84,0x18,0xb6,0xac,0xda,0x16,0x5f,0x29,0xa3,0x60,0xf7,0x67,0xcd,0xed,0xde,0x8f,0x64,0xd7,0x68,0xb9,0x5f,0xc2,0xa5,0xf3,0xf4,0x04,0xe7,},{0x79,0xc4,0xb2,0x63,0xb2,0xe5,0x8f,0x67,0x86,0x28,0xd4,0xea,0x82,0xb1,0x75,0xac,0xa2,0x30,0xb9,0xa2,0x02,0x85,0xc8,0x28,0xf9,0x4e,0x1f,0xfd,0x63,0xd7,0x5b,0x23,},{0xf9,0xfd,0x72,0xf3,0x21,0xca,0x21,0x33,0xbf,0x85,0x85,0x90,0x8d,0x9c,0xa7,0xb8,0xe3,0x36,0x22,0x7e,0x3f,0xfb,0x37,0x49,0xa1,0xfb,0xe8,0xc9,0xb1,0xe5,0xd5,0x0e,0xf0,0x1f,0x9d,0xb5,0xf0,0xd2,0xa7,0xc7,0xc1,0x39,0x9b,0x97,0xc9,0x04,0x4e,0x1b,0xc1,0xad,0xc3,0x2b,0x8b,0xea,0x46,0xda,0xd7,0xb8,0x10,0x26,0x46,0x96,0x03,0x03,},"\xab\x6b\xd4\x5b\xb0\x6d\xfb\x90\x69\x11\x8f\xf9\x98\xf3\xbd\x39\x3e\xa8\xe9\x44\x97\x9e\x89\xe0\x49\xf2\x50\x5c\xd8\x93\x1b\x93\x08\x6b\x7e\x9d\x8e\xe7\x64\xe9\xb4\x47\xea\x4e\xa1\x21\x38\xbb\x45\x27\x5a\x21\xa1\x98\x43\xf7\x5d\xc5\x42\x1d\x61\xff\xd8\x61\x83\x8e\x58\x33\x82\x5d\x67\x16\x2f\x32\x59\xc2\x64\x47\xbe\x51\xdc\x18\x02\xef\x5a\x04\xba\x73\xb7\x83\x93\x57\x06\xab\xb4\x2c\x51\x3b\x65\xf2\xbb\xc4\x4f\x83\xda\x10\x61\x24\x2f\x2d\x5e\x51\x98\xf3\x8c\x10\x71\x7a\x86\xa3\xa1\x97\xe7\xcd\x90\x34\xf6\x36\x11\x44\x99\x03\x72\x77\xac\xb4\x72\x2c\x06\xa9\x1c\xb2\xf6\x5e\x21\xeb\x8d\x22\xd3\x6a\xd7\x3b\x42\x65\xf7\xa7\x94\x7e\x00\xe7\x22\xbd\xa6\x70\x43\xcd\x12\x81\xbc\xd8\x7e\x76\x3f\xc9\x7b\x54\xc8\xf8\x68\x36\xcd\xbf\x08\xc9\xa1\xf7\x00\xf4\xea\xed\x9e\xa5\x9a\x6f\xc1\xbc\x0d\xf8\xc9\xec\x1f\xc2\x97\x7c\xad\x60\xf9\x78\xab\xc0\xc8\x38\x1a\xa9\xfb\x06\x0e\x3f\x99\x37\x8a\x51\xb2\xd9\xaf\xbe\xf3\x58\xd5\x51\x62\xa3\x89\x22\xeb\xb8\x7d\x2a\x3e\x0f\x0f\x40\x00\xb1\xc3\x9b\x15\x02\xe9\x59\x45\xe8\xac\x9f\x4a\x3e\xa7\xc9\xdd\xb5\x81\xa5\xec\x06\xc0\x0b\xa8\x7a\x73\x70\x84\xb3\x84\xfa\xba\x09\xc8\x48\x71\xdd\xd6\x7d\xc1\xbe\xbb\x2f\x7f\xbd\x94\xa5\x59\x7d\x01\x9f\xe6\x29\xe5\xbf\x12\xbe\xa2\xe3\x3c\xa8\x4c\x68\x0d\xc5\xa3\x98\x9b\xbf\x3a\xf9\xee\xec\xe8\xab\x8f\xc8\x61\xe3\xb8\xbf\xc1\xe6\x7e\x2a\xee\x32\x6b\x37\xfb\x9b\x51\xcf\xa0\xb5\xf5\xfc\x16\x00\x69\xb4\x50\xb7\x04\xe0\xfa\xb7\xfb\x6c\x5a\xb3\xc4\x0b\x8f\x0b\x3d\x09\x30\xb9\x11\x2d\x64\xb9\xda\xca\xb4\xdd\x87\x5f\x29\xd8\xc5\x8c\x5d\x20\x53\xad\x91\x48\xff\xde\x22\xd9\x0b\xc0\xd5\x0f\x5d\xec\xa6\x8d\x3e\xa2\x5c\x5b\x4c\x76\x88\x87\x1c\x0c\x77\xdb\xce\xea\xcb\xd0\xa4\x22\x9f\x49\x70\xec\x87\xb3\x44\x99\xe2\x78\x30\x3c\x06\x69\x4c\x30\xac\x68\x52\x4d\x11\xb1\x72\x79\x4b\x48\x12\x73\xa5\xda\xc4\x61\x22\xd2\x47\x20\x95\xa5\x63\xa4\x35\xd1\x85\xd5\xe9\x1d\xa7\x26\xe7\x45\x92\x99\x9c\xda\xc6\x88\xa3\x3f\x38\xf7\xc0\x35\x58\x8f\x62\x5d\xc6\xac\x73\xd0\x04\x7a\xb3\xd6\xd1\x2f\x1a\xe3\x3d\x8b\x62\xd6\xd6\xc6\xca\xcf\xf0\xbd\xd8\x94\xb5\x7e\x31\x89\x12\xac\x0c\xf4\xa5\x34\x76\x2b\x2f\x6d\x26\x3c\x93\x58\x04\x42\x3e\xd8\x68\xcf\x8c\xfb\xb8\xbe\x8f\x6d\x8a\x71\x4a\x26\x8a\x39\x0e\xdc\x2d\xd5\x09\xd2\xdc\x96\x85\x1d\x1b\xd4\x32\x49\xbd\x0f\x69\xb0\xc4\xcb\x2f\xf4\x08\x0d\x1f\xd5\x62\x2b\xc2\x38\xdd\xa6\xe9\x30\x02\x5d\x8a\x2b\x12\xb9\x72\xf9\xeb\xa1\x74\x21\xd4\xce\xa6\x42\xf4\x0a\xd9\xea\x85\x47\xae\x59\x49\x8c\x3a\xd1\xb9\xa0\xc3\x4e\xd8\xc0\x1a\xae\x3b\xd2\x1a\xc1\x77\x43\xb5\x77\xf9\x51\x5c\xfb\xdd\xe2\x70\x4d\xc5\x7e\x80\xf1\x25\x32\x3d\x55\x10\x0b\x9f\x69\x79\x27\xd4\x31\xdf\xe7\x36\x31\xb5\x8e\x52\xaa\x6a\xeb\x04\x78\xbf\x45\x95\x52\x43\x86\x89\xfb\xeb\x9c\x60\xd8\x7a\xae\x09\x95\x43\x62\xcd\x02\xa2\xb0\xb4\x79\xef\xd3\x8f\x17\x82\x1a\xf3\x9b\x21\x92\x6e\xe0\x2f\x7d\x97\x2a\xd0\xf5\x4e\xa6\x57\x2c\xc3\xeb\xd0\x20\xb1\xee\x26\x88\x25\x33\xbd\x19\x11\x43\x23\x81\x5f\x67\x2e\xc8\xc9\x05\x68\x73\x0a\x58\xe4\xe1\xe3\x5f\x68\x21\x21\x9a\x32\xb8\xa6\xc5\x2c\xed\x6f\x95\x73\xd9\xf3\xbe\xb2\x85\x13\xba\x62\xfb\x20\x1f\x7f\xd4\x1b\xb1\x0c\xa3\x4b\xb1\xc7\x0f\x2f\xd7\xbb\x92\x99\xa7\xc5\xf7\xf2\xe0\xfa\x1d\x1a\xf0\xe9\xae\xf5\xed\xe7\xc1\x69\x50\xe8\x60\xec\xd6\x1f\x18\x42\xa1\xa2\x2c\x98\x31\xc0\xc0\xd4\xed\xa8\x40\xb0\x88\xa5\x45\x20\xc9\xb1\x8c\x76\xeb\xa9\xbe\xbc\xd5\x91\x38\x1c\x18\x0d\x7f\x86\xa0\xe5\x8a\xdd\x92\xb9\xb0\xc8\x07\x6a\x7c\xdc\xab\x60\xde\xa4\xc1\xaf\xb1\x8c\x8b\x94\xb1\xb3\x92\xcc\xfb\x4d\xae\x27\x11\xe7\xd1\x2d\x2b\xc7\xc7\x82\x5f\x63\x99\x2e\xc3\x24\x71\x63\xc2\x83\xb1\x07\x5e\x32\x24\x5f\x69\xcf\x47\x24\x0a\xef\x0d\xb4\x3e\xfa\xe8\x6f\xc1\xfd\x3b\xb9\x9c\xf5\xb7\x89\xf5\xbc\xba\x95\x04\x65\x7d\x9e\x62\x2a\x4a\xa1\x6f\x01\xd4\xd8\x44\x41\x31\x24\x44\x7d\x6d\x1a\x44\x23\xe7\xb5\x5d\xb7\xe6\xa3\x1a\x31\x9f\x4b\xac\xae\x43\x0a\x33\xa9\xbd\xd4\xef\x36\x80"}, +{{0x0a,0x05,0x6b,0xe0,0x39,0xfd,0x55,0xda,0xda,0x44,0x1d,0x03,0x73,0x61,0x27,0x3f,0x20,0x6e,0x00,0x0a,0x74,0xa0,0x5c,0x51,0xc0,0xcb,0xb6,0x27,0x43,0xf1,0xf3,0x40,},{0x73,0x14,0x02,0x17,0xa4,0x93,0xa1,0x78,0x66,0xff,0xf5,0x15,0x48,0x32,0x27,0x3d,0xf7,0x9d,0x58,0x11,0x54,0x3c,0x22,0x2a,0x39,0xd0,0x56,0xb8,0xc9,0x70,0xdb,0xfa,},{0xfa,0xb8,0xe5,0xd9,0x3d,0x7d,0x46,0xc6,0x5e,0xe1,0x17,0xc5,0x37,0x5e,0x73,0xc9,0x70,0x5f,0x87,0x54,0x17,0x7f,0xdd,0x46,0xef,0xed,0x47,0x37,0xc2,0x87,0x68,0xcc,0x4b,0x95,0xa9,0xc8,0x4c,0x52,0x9b,0x4b,0x91,0x6b,0x28,0xda,0xbd,0x87,0x41,0x18,0x31,0x44,0xbc,0xdb,0x48,0x3d,0xf9,0x8a,0xf8,0x9d,0x82,0x40,0xcf,0x09,0x46,0x04,},"\xa5\xab\x14\x76\x84\xe4\xd4\xa7\xbc\xb5\xa9\x6f\xb3\x98\x18\xe2\x3f\x56\xc2\xd8\xa7\x44\xe9\x12\x3d\x62\x08\x39\x30\xab\x1d\x0b\xb5\x32\xe6\x87\x14\xfc\xec\x7e\x6c\x41\x13\x4b\x6b\x19\xdd\xd8\x67\xfe\x63\x5c\x9e\xd6\x53\x93\xee\x39\xc5\xe8\xfa\xb4\x56\xcb\x5b\x32\x79\x78\x83\xf3\xcd\x9a\x09\x02\xb9\x79\x63\x48\xee\x66\xc6\x91\xfb\x4f\x2b\xb1\x47\x64\x41\x06\x57\xc7\x4a\xb3\x64\x56\x78\x79\xb6\xfa\x0a\x6f\x4d\xaf\xd9\x30\xd9\x23\x4c\xd7\x83\x4f\xb9\xd0\xee\xdf\xbb\x5a\x39\x4b\xf0\x84\x6e\xc6\x96\x9c\x2e\xf7\xce\x39\xe3\x85\x38\x95\xff\x5b\x4d\xa3\x1e\x54\x34\x1b\x42\x72\xe4\xa2\x60\x49\x18\x9f\xf2\x82\x41\xce\xef\xfb\x7d\x2e\x1f\xaf\x4f\x77\x9f\xa6\x5c\xac\x0f\x57\x83\xc6\x0a\xe7\x7d\xe3\x0a\xd4\x46\x5f\xdb\x39\x0d\x42\x57\x1e\xff\x4a\x63\x13\x63\x49\x93\x7d\x6c\xae\xef\xcd\xae\x22\x9e\x2f\x28\xce\xa8\xab\xf3\xff\xae\x3c\x3e\xcc\xd9\x06\x70\xa4\x21\x2a\x2b\xee\x1c\xa6\xa5\xb5\x4f\x09\x4f\xc3\x23\x10\x58\xf5\xcb\x9e\xce\xb9\x99\x3b\xe4\x70\x27\xd5\x1c\x18\xde\xca\x41\xcd\xda\xf4\xe8\xbc\x56\xa9\x9f\xd2\x70\x35\x5f\xf4\x59\x71\x95\x0e\x34\x37\xa1\x98\xcc\xc3\x25\x41\x68\xdf\xc1\x57\x40\x80\x80\x2e\xe1\x01\xa6\x17\xfb\x60\x4e\x86\x8f\x8f\xa8\xfb\x30\xda\xeb\x43\x07\x4d\xe1\x1f\x24\x83\xd9\x16\xde\x56\x43\xb7\xca\xc2\x3d\x93\x40\x50\x8a\x3f\xd6\x21\xec\xd2\x50\x04\x35\x6a\x53\x55\x4a\xd3\xad\x7d\x5d\x25\x81\x7a\xd7\xc9\xa6\x10\x00\x8c\x67\xac\x16\xba\x42\x11\xc4\x2f\x5d\xad\xf8\x6c\x2c\x3a\xed\x82\x5c\xf2\xa9\xb5\x23\xbf\xc0\x3d\xd7\xde\x40\x0c\x67\x80\x7e\x13\x9e\xa5\xdb\xce\x4e\xe1\xf7\xd3\x18\x88\x9b\x01\xa9\xf4\x48\x03\xc3\x22\xac\x3b\x61\xe2\x0e\x63\x12\xd0\xa0\x3b\xf9\x92\x7f\xa3\x3f\x04\xed\x7e\x20\x7b\x16\xf2\x65\x02\xc2\x98\x3a\x3a\x96\x1f\x22\x44\x61\xfe\x9b\x64\x92\x3b\x1d\x09\x18\x94\x76\xae\x8d\x00\x1d\x0e\xca\xae\x4d\xf6\x0d\xb3\x5f\x44\x8b\xb6\x12\xf9\x65\x5a\x5f\xb1\x44\xdf\x11\xd8\x3a\xa6\x93\x68\x86\xc3\x04\x94\x9e\x59\xaa\x46\xdf\x65\xc2\x2c\xe7\xbf\x28\x9b\x3c\x77\xc2\x5d\x89\x6b\xe6\xd5\x1d\xee\x10\x74\x82\x61\x68\x8c\x8b\x07\x1c\x85\x6f\x99\x62\xc6\x67\x75\xdd\xf1\x60\x83\xda\xe0\x65\x87\xe3\x2a\x63\x61\x19\x9d\x72\x09\x7e\x38\x3a\xd7\x43\x94\x91\xb5\xa5\x63\xa3\xe6\xd5\x8d\xa3\xd5\xab\xb1\xde\x84\x89\x0a\x36\xb4\x21\xce\x03\xd4\x84\xdf\xd6\x00\x39\x63\x8d\x46\xed\xfb\x60\x65\x9e\x3a\x25\xac\x6e\x9a\x93\x5a\xd6\xda\xd5\x0f\x92\x7b\xcc\x2f\xf9\x9f\x99\x24\xa5\xb7\x99\x5d\xc2\x3c\x8f\x30\x1c\xcc\x77\x69\xf7\x1c\x18\x26\x09\x04\xa3\xdc\xfb\x81\x7d\x2d\x80\x5c\xb1\xf1\x96\xbe\x8b\x6e\xcf\x35\x2b\xc2\x96\xbc\x3f\x76\xea\x91\x35\x3f\x8c\xf3\x5b\xcd\x2b\x57\xeb\x59\x42\x77\x3d\x68\x34\xac\x50\xee\xad\xc7\xe6\x64\x61\xd1\xda\x09\x8c\xce\xc7\x5f\xf7\x20\x52\x15\xf5\x24\x59\xd9\x76\x20\xf9\xf0\x28\x9e\x93\x91\x1d\xb3\x9b\x21\xdf\x81\x8f\xdf\x0b\xed\x45\x50\x92\x44\x63\x3d\xf0\x1c\xdd\xdb\x4b\x75\x97\x2f\xa7\xea\x6f\x73\x28\x1c\xbd\xbb\xd1\xbc\xb0\x0c\x3b\xc1\xb1\x72\x8e\xea\xe0\xbb\xa1\x72\xb1\x31\xf5\xd3\x08\x90\xa3\x41\xe6\xb7\x2f\x7e\x89\xdd\x4b\x6d\xb3\xe7\x9b\x69\x27\x58\x6c\xf2\xc8\xac\x38\xdd\x14\xf3\x74\xd7\xf5\xbb\xa9\xf4\x35\x3d\xef\x10\xdd\xc9\x4d\x3d\x11\x18\xc5\x69\x9e\x38\xb6\xb5\x04\x91\x8e\x58\x9e\xfe\x3f\x7e\x97\x3f\xb4\x0e\x2e\xbd\x05\x7d\xe1\x38\x5e\x39\xd6\x99\xa8\xf6\x83\xb9\x62\xfa\xe4\xf3\x90\x28\x81\xf1\xaf\xbe\xd7\xc7\x83\x82\x35\x58\xc3\x6d\x68\xc6\x87\x5d\x16\x6f\xa2\x43\xeb\x2a\xe1\x4f\x7e\x63\x15\xa6\xd2\xab\x4e\x79\xea\x8e\x16\xe6\x9d\x30\xed\xc7\x08\xf1\xe7\xaf\x7a\xda\xfe\xdc\xd3\x16\x88\x98\xb3\x31\x87\x81\x78\xc4\xba\x88\x33\xd2\x0b\x3c\xac\x9d\x32\xb8\x88\x8c\xc6\x78\x32\x06\x39\x74\x70\xa2\xe7\xcc\x4c\x98\x09\xff\x79\xce\xac\x9d\xc2\x4c\xa1\x43\x8c\x91\x9c\x8a\x41\x5e\x82\xf0\x90\x2b\x4d\x9c\xf4\xcc\xd5\x76\x96\x8d\x5b\xee\x81\xc5\xf1\x9c\x7d\x57\xb9\xba\xda\x8e\xab\x47\x56\xea\x27\x0d\xd2\x61\x29\xe6\x12\x2e\xe2\xd6\x15\x24\x2b\xc7\xfa\xbf\xf4\xf8\x31\x2e\x68\x6c\x8f"}, +{{0x22,0x05,0x24,0x86,0x0c,0xb8,0x9a,0xb2,0x95,0xbd,0x88,0x4f,0x98,0x8a,0x57,0x91,0x18,0x68,0x69,0x3d,0x6b,0x10,0x5a,0x80,0xb2,0x30,0xf2,0x1e,0x57,0x80,0x5a,0x7d,},{0x4a,0xb3,0x2b,0xc1,0x56,0x6a,0x76,0x77,0xe7,0x99,0x73,0x4d,0xc8,0x41,0x81,0xfb,0xb6,0x54,0xb8,0x13,0x37,0x91,0x80,0xf1,0xdd,0x35,0xae,0xf2,0xd3,0x24,0xc1,0x2c,},{0xdb,0x1c,0xc0,0xc5,0xdb,0x77,0x3e,0xc5,0x16,0x89,0xbe,0x28,0x84,0x2f,0xa6,0x79,0x1a,0x7d,0x75,0xe2,0x9c,0x22,0x8a,0xe9,0x59,0x3a,0x58,0x0e,0x08,0x75,0xb1,0x67,0x0f,0x09,0xb0,0x34,0x42,0x92,0x9a,0x18,0xf1,0xe9,0x41,0x4e,0xa3,0x43,0x15,0xff,0x09,0xd9,0x1d,0x92,0x2e,0xe4,0x7f,0x10,0xf7,0x1d,0xa4,0xab,0x13,0xb7,0xd9,0x01,},"\x02\x4a\x54\xac\x5e\x01\x63\xb3\xa4\xfd\xd0\x2f\x59\x36\x88\x8a\xe2\xf9\xb7\x4a\x64\x14\xb5\x3c\x63\x81\x17\x3b\x09\x5a\x4d\xda\xcf\xc3\xa6\x9f\x19\x16\x7d\x0f\x1a\xe0\xc1\x20\xbb\xa7\xe9\xfc\xb7\xcc\xfc\x79\x6d\x89\xea\x46\xef\x80\x58\x86\x6e\xf6\xda\x7d\x01\xa6\xa1\x42\xea\x69\xd7\x20\xc4\xf8\x05\xac\x54\x05\xa8\x01\x2c\x3c\x2a\x82\x63\xb5\x37\x2d\x59\xbf\x7f\x40\x99\x29\x90\x13\xd2\x62\x59\xdf\xd5\x19\x3e\xce\x56\x17\x97\x77\xbe\x51\xb8\x6b\xd1\xce\x5f\x1f\xc9\x15\x6f\x2b\x3a\x32\xc0\x9d\x86\xbc\x61\x32\xde\x57\x61\x02\xe2\xf0\x3c\x71\x6d\xb5\x36\x6c\xcb\xe7\x42\xae\xe3\x55\x2a\xc3\xb3\x9d\x0e\xc7\xd4\xe4\xe9\x62\x6b\xf8\xec\xe0\x31\xd6\x78\xd3\x48\x09\x05\xc0\xe3\x38\xfb\x7c\xc0\x26\xe3\xe7\x9c\xf2\xc2\x78\x1a\xc2\xa5\xa4\x0d\xf4\x28\x4e\x23\x5a\x03\x89\xe9\x28\xfc\x63\x55\x7d\xc6\xf1\x99\xfc\xec\x5f\x36\x1e\xa2\x47\x59\xfa\x7c\x5f\x71\x97\x8c\x0b\xa2\x45\xe4\xb0\x3a\xe4\x35\x94\x1c\x86\xc8\x1a\x51\x43\x0c\x2d\xc9\x92\x7e\x3b\x0f\x4e\xc4\xeb\xa7\xc2\x74\x5b\x49\x39\x87\x15\x4d\x7d\xa8\x5b\x67\xde\x21\xc5\x98\x40\x7f\xb2\xa7\x60\x80\x4a\xd0\x5b\xfd\xfa\x45\xa6\x13\x22\x4b\x22\xa0\x85\x88\xcc\xea\x3c\xbd\xf4\x7a\x19\x8b\xeb\xf8\xcf\xed\x86\x49\xd6\xd5\xf3\xfa\x50\x13\x76\xbd\xfb\xa4\x00\x3d\xac\x22\x37\xdc\xac\xe5\x31\x5b\x7f\xef\xb8\x79\xa8\x9a\x85\xbc\xe6\xda\x52\x6f\xc3\x60\xcb\xb4\xfd\x55\x4e\xf0\x13\xf3\x3b\x73\x84\xcd\x2b\x22\xa8\x85\x77\xf3\xa2\xd3\x66\x42\x2a\xae\x46\x41\x7b\xa9\x16\xe1\x64\x6e\x24\x40\x4a\x88\xb5\xd5\x3f\xf1\xae\xd2\xa4\x7b\xaf\x81\xfc\xb4\x28\x63\x97\x99\x13\x94\xb2\xec\xc3\x96\x67\xac\x46\xc2\xbd\xb6\xd0\x23\xb3\x3d\xb0\x13\x45\x7c\x40\x05\xd8\x39\x01\x5d\x88\x51\xf0\x28\xac\x33\x4f\xb2\x4b\xba\xd2\x90\x2a\x4d\x63\xae\x68\xe0\xec\xa7\xea\xea\x1e\x85\x65\x29\x64\x7b\xaf\x14\x12\x21\x37\x54\xed\x50\xaf\x3f\x43\x6e\x9b\xaf\xc1\x60\x16\x39\xb3\x9d\x3e\x52\xa9\x3a\x89\x8f\xb6\x01\x9f\xd5\xed\x6e\x7d\xfc\x05\x0e\x7c\xe5\xf3\xd3\x5c\xeb\x50\x67\x02\x1c\x0f\xbd\xc7\x08\xd3\xf2\x6b\xd6\x05\x68\xd1\xed\x2b\x61\x2b\x69\x62\x35\xd5\x33\x33\x18\xf9\xa6\xc9\x87\x23\x5a\x7a\x07\xf8\xc6\xa9\x35\x4f\xb8\xe7\x34\x76\x30\x65\xaf\xcd\x4d\x93\x77\x64\xa4\xf0\x37\xcc\x7e\x7e\x2b\x93\x21\x7f\x16\x41\x68\x4f\xa8\x1b\x7f\xf7\x98\x6a\x28\xb3\x8e\x95\xb3\x32\xe7\x46\x49\xe8\x3d\x0d\xed\x79\x5c\x57\xf2\x4c\xf2\x76\xe0\x14\x39\x01\xba\xfe\xf0\xf1\x69\x3f\xe7\xcf\x10\x90\x4f\xb0\xd8\x80\xd7\x2e\x44\x71\x6a\x70\x69\xda\xaa\xe7\x42\xcf\x0f\xf3\xed\x92\xf5\xf7\xd1\xe1\x0e\x04\x9d\x8d\xf0\x43\x63\x1e\xd0\xed\x4c\x4a\xc4\x02\x2d\x84\x03\xcb\x04\x21\xb4\x54\xcb\xfb\x6f\x48\xa3\x0e\x9e\xe1\x60\x9a\xd7\xb6\x82\x11\x97\x7a\xcb\x33\xb9\xc1\xa1\xbe\x73\x58\x14\xc5\x8f\x66\xdb\x5f\x0b\x8a\xc7\x73\xb1\xd5\x8d\x4e\x6b\xc4\x5d\xfd\x48\xa2\x94\xbb\xd2\x5e\x92\x67\x1f\x56\xf3\x02\xf2\x9b\x50\xd8\x04\x31\xc8\xf2\xea\x33\x99\x62\x57\xb2\x08\xe0\x57\xea\x76\x72\xcc\x2d\x1c\xd4\x20\x4b\x85\xb2\xab\x50\x90\x27\x13\x13\x59\xae\xb4\x2e\x3e\xcc\xdb\xae\xcf\xe2\xcd\x3e\x5a\x33\x13\x26\x6e\x76\x11\x94\xff\x69\xca\xe9\xe3\x7e\x51\xcc\x0a\x54\xf0\x86\xdd\xe1\x3c\xb3\x31\x18\xe3\x4f\xe3\x3c\x74\xd7\x35\x58\x27\x52\xd6\x8d\x21\xc7\x9e\x5c\x3a\xae\xa9\x4b\xa1\x07\xcb\x7e\xe8\xa7\x0a\x3f\x9a\x01\xe9\x80\x8c\x0a\xeb\xa6\x66\x53\x15\xb4\x56\x25\x84\x0a\x03\x3a\x6e\x2a\x87\x54\x95\x05\x79\x42\xed\x9b\xb2\xce\x6e\x4e\xe6\x0b\xed\x47\xcd\x9d\x58\x4b\xc2\x45\x24\x39\x7a\x10\x94\x98\xee\x2a\x97\x3a\xad\x6a\x29\xb7\x0a\x1c\xfb\xfe\x9a\xa5\xc7\xcb\x9f\x35\xf0\xfa\x00\x22\x7f\x43\x98\x8d\x07\x61\x9b\x6f\xb2\xf6\xd3\xbe\xe2\x8e\x10\xee\x70\x53\x47\x01\x5a\x92\x2e\x2e\x88\xd3\x4f\xb0\xce\x51\x5b\x08\xdf\x3a\x1b\x63\x4f\xf9\xec\x15\xd0\x59\x41\x82\xc8\x6e\xbb\x0d\xb7\x83\x61\x2a\x7d\x19\xe4\xb2\x2e\x82\x2d\x56\x62\x45\xae\xd7\x2e\x69\x4c\x3d\x10\x1b\xfa\x4c\xa8\x79\x86\x2e\x5f\x99\xc2\x3a\x5d\x66\x08\x3c\xe0\x6d\x87\xf3\x99\xaa\x78\x88\xab\x83\xb8\x66\x44\x72"}, +{{0x4e,0xf6,0x0f,0x06,0x91,0xd7,0x37,0xe6,0x4d,0x43,0x7b,0xfd,0x33,0x98,0x33,0x0e,0x55,0xe3,0xc0,0x94,0xcf,0x41,0xfc,0x55,0x7b,0x0f,0xe0,0xb6,0x43,0x90,0x9a,0xb8,},{0x30,0x6a,0xb1,0x46,0xe5,0xc8,0xcd,0x63,0x0f,0x9b,0x48,0xbf,0x8b,0x68,0x5d,0xb0,0xb6,0xb5,0x53,0xef,0x69,0x68,0x68,0x53,0xb6,0xb5,0x31,0x96,0x01,0x18,0x54,0x8c,},{0xcb,0xf7,0xcf,0x22,0x08,0x1c,0x5f,0x23,0x5d,0xba,0x35,0x63,0x0f,0xb3,0xf0,0x40,0x8f,0xce,0xcc,0xef,0xeb,0x28,0xb9,0x9d,0x74,0xdb,0xd9,0x8c,0x90,0x2c,0x7d,0x99,0xba,0x9c,0xa7,0xfa,0xb3,0x74,0x7c,0x50,0x4c,0xc2,0x19,0xf4,0xdd,0x10,0x10,0x81,0xf5,0x8c,0xe6,0x16,0xe2,0x92,0x80,0xe3,0x62,0x53,0x9f,0xe4,0x9f,0x34,0xd7,0x05,},"\x0a\x18\x8a\xc2\x6f\x3c\x5d\x89\xf3\xd5\x88\x37\x4f\xac\x5e\xcf\x9a\x46\x7e\x21\x65\xb3\x1d\x0b\x0f\x23\x50\x1b\xd2\x2e\x62\xbf\x35\x55\xff\xba\x94\x63\x1d\xe7\x4a\x6a\x3c\x3c\xf6\x3b\x03\xac\x1b\xbb\x37\xd2\x33\xec\xa5\x99\x3b\x09\x70\xa0\x22\x0d\xe8\xd6\xc4\x1a\x97\x03\x07\x30\x9a\x52\xda\x05\x76\xdc\x33\x4d\x80\x64\x47\xaa\x09\xd0\xb2\x45\xea\xcd\x0b\x42\xc4\xe1\x9f\xa3\xd6\xfb\xdc\x22\x94\x30\xeb\x3c\x75\x58\xaf\x53\x31\xc6\xe7\xfc\xc2\xe5\x52\xce\x35\xd5\x79\x07\x3b\x54\x8d\xc1\x15\xbb\xd2\x7e\x5a\x33\xce\x1c\x47\xfc\x84\x61\xe3\x91\xb6\xd7\x67\x95\x34\x87\xcc\x52\xee\x67\x3b\xc4\xbe\x96\x56\x9c\x85\x57\x36\x9e\xbb\x6e\x02\xf7\x92\x38\x10\x8c\x3b\x58\x56\xee\x38\x1a\x79\xff\x46\x4c\x8f\x60\x09\xfd\x47\xe6\x7b\x4c\x80\x20\x1e\x11\xe6\x1a\xb8\xf5\x9b\xa5\xd0\x7b\x15\xac\xe3\xfb\x37\x4c\x64\xb6\xb4\xc3\x45\xe2\xb0\x0e\x91\x51\xab\x8e\x1c\x5c\x98\x56\x8b\xc5\x8d\xd0\x81\x2a\xaa\x3b\xee\xe1\x65\xe7\xea\xe5\x8f\xbd\xe6\x30\x77\x20\x3c\x4f\xd6\xe1\x60\x68\xd7\x6e\x3d\x3a\x13\xf1\xcd\xd7\x32\x88\xbd\x5e\x4d\xa4\x4e\xb1\x19\xa0\x4c\x4d\x32\xef\xa2\xf1\x3e\x74\x26\xa2\xf4\x1c\x56\x23\xc9\xb0\x66\xb1\x30\x36\x39\xb8\xfc\xea\x0d\x87\x74\xcc\x08\x04\x5f\x7e\x34\x63\x65\xff\x31\xd3\xb1\xed\x99\xe9\x7b\xca\x5f\x25\xc9\x2b\x28\x43\xac\x58\x5d\x02\x19\x3a\x2f\xd3\x94\x66\xf7\x3a\xaa\x98\x9b\x1f\xa0\x5b\x9a\x15\x7f\xd0\x27\x7c\x5e\x74\x5d\x25\x8e\x02\x78\x03\xa5\x24\xad\x94\x30\x94\x25\xc3\xf4\xde\xc3\x1c\x0e\xfc\x54\x77\x52\xf4\xc7\x19\x4c\xbb\x27\x2f\x84\x9a\x52\x16\x9c\x6a\x07\x8d\x20\xed\xe1\x43\x20\x16\x52\x84\x77\xb5\x8c\x2b\xdf\x60\x63\xf9\x44\x7e\x33\x83\x7c\xcb\x43\x7d\x8d\x6b\x95\xcf\x4c\x44\xbe\x70\xc8\x19\x3a\xd9\x80\xa1\x05\xf3\xdb\x6f\x99\x30\xba\xb4\x67\x8c\x77\x63\x42\xfa\xf1\x70\xed\xf7\x42\x48\xd3\xb1\xca\x96\xf7\x31\xb9\xd0\x26\xd8\xf0\xf7\xc3\x4e\xd3\x72\xc1\xcd\xe1\x76\xf5\x5f\x55\x86\x75\xcc\x31\x80\xc2\x39\x02\xf4\xba\x95\x08\xd1\xc9\x1c\x3c\x9e\x68\x87\x30\x32\x7f\x3f\x7b\x63\x7a\x8f\xee\x54\x37\x37\x59\xfc\xb1\x7c\x92\x17\xea\x44\xce\x43\x69\x1a\x8f\x64\x63\x64\x0a\x4a\x5e\x15\x1e\x62\x54\xc4\xef\x12\x62\x3b\x49\x39\x4d\xa7\xcc\x79\x45\x26\x93\x81\x7d\x6b\xae\xa9\xa0\xa7\x58\x76\x94\x8b\x1f\x8d\x3b\x71\x7f\x9e\xc3\x67\x53\xf5\x32\x63\x71\x03\x83\xb9\x82\x62\xae\x63\x54\xff\x2a\x22\x83\x22\x0a\xd4\x2c\x5c\xb2\xcb\xbd\xf1\x2c\x87\x95\x13\x71\x0b\x16\xbe\x85\x6f\x3b\x13\x55\xb3\x6f\x4b\x80\xc0\x17\xc2\x1b\xe8\x5e\x96\x05\x3d\xa0\x50\xc4\x03\x12\x10\x0a\xbb\x64\x0b\x87\x3d\x88\xfb\x6e\xe0\xd1\x9e\x9e\x61\xb0\x4c\x97\x0b\xd1\xf0\x60\xdd\x31\x1b\xbb\x9a\x6e\x35\xb9\x85\xfd\xca\x17\xca\xee\x8c\xd5\xdb\x63\x7a\xcd\x90\xcb\x8e\x82\x32\x55\xc0\x56\x01\x8f\xef\x59\x20\xdb\x64\x0d\x22\x01\xc5\xed\xdb\xd8\xa9\xc9\x47\x4d\xa8\xde\xf7\xe1\x32\x5b\x3c\xc4\x36\xc7\x4f\x81\x5d\xb1\xe4\x2b\x42\x1f\xaa\xb6\x26\xa4\x37\x8c\x2d\x84\x26\x1b\xf6\x49\xa5\x3b\x32\x1f\x59\x8c\x44\xbb\xd3\x00\x2b\x06\xcf\x7f\x1f\xde\xf8\x4a\xb3\x5f\x73\xed\x7d\xc6\x50\x96\xcb\x1d\xc0\xcc\x0e\x34\xc5\x61\xc8\xa1\x5c\xf5\x27\x9a\xbb\xed\x9b\x16\xff\x24\xa9\x74\x4e\x3f\x5e\x64\x9c\xc9\xd8\x88\x4f\x89\x1c\x3f\xb7\x89\x02\x03\x1f\xfe\x0e\x01\x21\xc7\x20\x80\xad\x10\xc2\x47\xb7\xc9\x3a\x9e\xbb\x2d\x84\xd4\xf8\x77\x75\x0d\x7b\x34\x16\x39\x3d\x03\x04\x52\x26\xbb\x79\x94\xee\xa5\x8e\x27\x2d\xc1\x8c\x46\xb3\x82\xd1\xf9\x7b\x23\x76\x5f\xda\x7a\x8c\xe2\x1f\xc6\xb9\x8d\x72\x3f\xfc\xcd\x99\xac\x46\x55\xcc\x5d\x10\x10\x5a\x2a\x5b\x7c\x8c\xfb\xfb\x90\xe2\x7a\x9a\x80\x9e\x41\xae\x64\x00\x63\x28\x64\x05\xa9\xbe\x83\xac\x5d\x29\x07\xa4\x5f\x16\x3c\x77\x64\xb0\x9f\x99\xa5\x55\x93\x22\x0d\x69\x01\x29\x2b\x9b\x58\x03\xa0\xfe\x71\xb0\xe4\x44\x1c\xbf\xef\x84\x1c\x33\xce\xbc\x98\x36\x4d\x66\x6e\x5a\x9f\x5e\x7e\x69\xa1\x50\x8e\x43\x80\xed\x36\x13\x45\xb7\x24\x8a\x4c\x1c\x1c\xe0\x87\x69\xbc\x71\x52\xdd\xb3\x32\xfb\xa1\x76\x20\x0f\x5a\xbb\xae\x38\x12\xf4\x06\xda\x72\xdd\xe5\xdb"}, +{{0x19,0x7e,0x15,0xdc,0xe4,0xc4,0x7d,0x73,0x4d,0xbc,0xe4,0x68,0x8a,0x7a,0xd5,0xfe,0x41,0xeb,0xf2,0xaa,0x29,0xa2,0xbd,0xdb,0x2b,0xee,0x62,0x84,0x29,0xc1,0xbc,0x02,},{0x30,0xfa,0xc3,0x23,0x04,0x8b,0x0c,0x78,0x1a,0x9f,0x63,0xc1,0xee,0x69,0xf2,0xb9,0xe7,0x5a,0x27,0x06,0xd2,0x49,0x51,0x2a,0x27,0x39,0x60,0x7f,0x26,0xdb,0x13,0x8f,},{0x2c,0x3c,0x8c,0xd2,0x99,0xc9,0x06,0x0b,0x65,0x99,0x9b,0x03,0xa6,0x57,0x9b,0xc5,0x0e,0xf1,0xfe,0x0d,0x85,0x1f,0x23,0xbe,0x9c,0xb5,0x8f,0x8f,0xb8,0xc6,0x72,0xee,0x08,0x6a,0x53,0x9e,0xad,0x94,0x9e,0x08,0x7d,0xf0,0x91,0x12,0x2d,0x26,0xfa,0xaa,0xd2,0x06,0xa5,0xc5,0x2f,0xcd,0x58,0xb5,0x14,0xd7,0xa9,0x35,0xbe,0x01,0x79,0x08,},"\xfd\x97\x1d\x48\x94\x6b\x51\xff\xed\x7b\x62\xc5\xd0\x99\xc1\xe5\x6b\x13\x58\xb9\x22\x35\xe1\x01\x0e\x3f\x23\x84\x4d\xdb\x73\xbc\xee\x8d\x2e\x1c\x99\x77\x35\x3b\xc9\x6a\x22\x1c\x05\x60\x29\x31\xfa\x16\xcc\xc2\xab\x6d\x0f\x01\xc8\x46\xc2\x92\x0e\x99\xde\x02\x6d\xc2\x89\x7f\x3d\x5f\x3c\xee\x17\x4c\xe7\x51\xd4\xa8\x05\xee\x19\x59\xa3\xc6\x9c\xfd\x42\xd7\xc9\xaf\xd3\x1f\xa9\xb1\xcf\x05\x78\x6d\x8f\x90\x42\xa4\xf9\xf8\x1c\xf7\xac\x9c\x1c\x39\xb3\x6f\x1e\xe9\x5b\x98\xcf\x7e\xe3\xf4\x3e\x2c\x34\x37\x33\xd1\xd8\x2c\xc0\x8b\x2c\xde\xb7\x8d\x98\x20\x34\x08\x5f\xf4\xdc\x65\x36\xcd\x15\x4a\x79\x0c\x85\xc8\x61\x3e\xc4\xe5\xe1\xdc\x37\x7d\x38\xa7\x45\xd9\x38\xcf\xb1\x5c\x8b\x8a\xa8\x61\x21\x83\x5f\x2e\x25\xe9\xe6\xd0\xde\x68\x02\x5d\x81\x0c\x3d\xc9\xdf\x99\x1d\xad\xad\x39\xdc\x69\x81\xfd\xba\xc1\xff\x9b\x7a\x79\x1c\x39\x60\xd8\x56\x43\x66\xe5\xaa\x39\xa9\xe9\xc7\xcb\xf1\xd3\xf0\xf8\x20\xd1\xb9\x01\x08\x75\x1a\xc7\x64\xda\xbe\x05\xc5\x1c\x18\x52\x9d\xa1\xb0\x34\x96\x14\x66\x84\x24\xab\x4e\x93\x64\x40\xc4\xa2\x51\x3b\xe5\x28\x53\x93\x72\xee\xe7\x87\x54\x58\x9d\xbe\x79\x94\xfa\xa1\xf6\x22\x91\x24\xf8\x39\x95\x0e\xd0\x92\x3f\x43\x23\x31\x5a\xc9\x63\xbb\xe4\xc8\xe1\x77\xda\xc5\x16\xe7\x34\x22\x38\xf1\xcd\xf1\x40\xbe\xfc\x8a\xcd\xca\x3d\x00\x2b\x16\xc1\x39\x8d\x86\x86\x00\x30\x4c\x7e\x98\x53\xb2\x3a\x51\xb1\x7d\x9f\xd0\x61\x56\xe1\xd1\xd0\x8a\x28\x46\x09\x09\xfa\x20\x9c\xcc\xcc\x4c\xec\xbd\xb1\xa4\x63\x48\x08\x91\x15\x31\x86\x81\xa9\x5a\xe5\x80\xab\x67\x66\x04\x13\x84\x65\x1c\xc4\xe6\x14\x51\x03\x92\x3b\xdf\x4a\x32\xa9\x3d\x93\xee\xd3\x18\x79\x1f\x20\x80\x5f\x7e\xa8\x4b\x74\x3e\xe1\x1e\xad\x9e\x4c\xa0\x3d\xa7\x6d\xdd\x24\x9f\xd4\x47\x5f\xc1\xa3\x53\xc7\x0a\x83\x38\x9b\xfa\xc5\x20\x98\xdb\x06\x6d\x10\x29\xc4\xef\xfb\xed\x86\x4e\xbe\x7f\x10\x7e\x01\x03\xb3\xa8\xf3\xfd\x1d\x6a\xb4\x36\x0b\x99\xe8\xb1\x40\xc5\xea\x13\x3e\x92\x3c\x39\x2b\x8e\x40\x63\xaa\x6e\x52\x26\x38\xf6\x1d\x7a\x71\xc9\x22\x58\x97\xd9\xf8\xa1\xe1\x6c\xfc\xc8\x01\xe7\xd5\x41\x04\xeb\x10\xe6\x1a\x5a\xe6\x3c\x5c\x85\xa5\xb2\x93\x92\xab\x3a\xb8\xe5\xc0\x39\xf1\x00\xd0\xf4\x60\x0c\x61\x0e\x02\x09\x43\x6e\xf2\xec\xe4\xd0\xbd\xb0\xba\xb4\x37\xb2\xdb\x5f\x37\x08\xfd\xdf\x96\x66\x0f\x6f\xb1\xa9\x0d\x60\x48\xd3\x95\xaf\xaf\xa7\x60\xcc\xaf\x15\xde\xaa\x0e\xff\xeb\x26\xec\x17\x68\x1d\x17\x2c\x13\x30\xf7\x8e\x78\xa8\x73\x6b\x28\x5f\x61\x5f\x15\xd4\xf2\xc3\x13\xd2\x5f\x30\xae\xe9\xd1\xdb\x39\xf5\x35\xfc\xdd\x0e\xbc\x8e\x71\xb8\x9c\xe6\xb3\xfc\xb5\x67\xcd\x0f\xa2\x88\xf4\x8e\xd3\xa7\x59\xbb\x2e\xd2\x00\xfd\xc2\x30\x91\x50\x2f\xd9\xca\x65\x1c\xe5\xe3\x42\x2a\x98\x33\x5a\x81\xd7\x4a\x65\xcc\x15\x00\xe9\x07\x0a\xbb\x60\x9c\x1c\x1f\x68\xfc\x2c\xa9\x4c\xdd\x55\x0f\x99\xbc\xb2\xd0\x92\x41\x6b\x9b\xd3\x88\x41\x0b\x8f\xe7\x48\xfb\x8c\x9a\x5a\xb8\x61\x5f\x2e\xd9\x68\xf8\x5d\xcb\x27\x27\x72\x69\x84\xbe\xad\xa7\xa1\x8a\xfd\xb0\xc7\x2a\xa6\x5d\xe7\xab\xb7\xa8\x6f\x11\x16\x9a\x6e\xad\xf1\xc2\x1d\x61\x4e\x52\xc0\xc8\xf0\x19\x74\x7d\x34\x1a\x05\xd8\x5e\x37\xbf\x58\xd8\x32\x7e\x99\x39\xc2\x38\x7c\x27\x44\xed\xf8\x38\x56\x3c\xb3\x7f\x0b\x16\xe8\xa0\x6f\xc6\x28\xa9\x72\x30\x50\x6f\xa4\x18\x39\x54\xdc\x74\x81\x5f\x3b\xe2\xeb\x2a\xff\x4a\x13\xc0\x65\xf7\x43\xb7\xd8\x5d\xe8\x04\xeb\x28\xef\xe5\x70\xed\x5e\xcc\x71\xab\xa9\x7f\x97\x63\xb4\x36\x17\x32\x47\xf3\x8e\x0c\xf6\x29\x72\x09\xb6\x51\x28\x46\x5a\x38\x26\x64\xce\xd8\x01\x1f\xcc\x3d\x0e\x56\x3f\x15\x5b\xc6\x3c\x94\xdd\xe7\x3c\x7b\x17\x24\x7b\x8c\x3a\x4e\x80\x34\xeb\xd4\x36\x46\x35\x18\x5c\xe9\xc7\x08\x1d\xbd\xbe\x85\x45\xf7\x9d\x01\xaa\x53\x2a\x0d\xc5\x2c\xb7\x90\xa3\x1f\xc2\xff\x41\xac\xeb\xad\x27\xcc\xe9\x24\x45\x54\xdb\x65\x2f\xa2\x87\xba\xe7\xde\xcb\xcc\x8c\xe9\xe0\x1d\x1a\x88\xab\x41\x2b\x6c\x65\x78\x20\x3b\x42\xde\xc9\x82\xb7\xf3\xb8\x23\x14\xdb\x2c\xc7\xc5\xc3\xdc\x1d\x3d\x8b\x17\x14\x4d\xa7\xfe\x60\xe7\xa8\x72\x5f\xd0\xa9\x7c\x61\x06\x07\xcf\x41\x3c\x72"}, +{{0x08,0xb5,0xfd,0x4e,0x41,0x9d,0x23,0x70,0xc0,0xfc,0xd6,0xc3,0xb9,0x2f,0x8d,0xb3,0xaf,0xd4,0x22,0x68,0xf5,0x33,0x08,0x5d,0x9f,0xce,0x32,0xb5,0x22,0x82,0x4e,0x34,},{0xcd,0x0d,0xa6,0x99,0x37,0x9e,0x4f,0x94,0x25,0xe8,0x4b,0x97,0x57,0x30,0x0a,0x51,0xa1,0x63,0xf3,0x58,0x73,0x4c,0xc3,0x7a,0x91,0xff,0x0e,0xa4,0x88,0xd2,0x97,0x79,},{0x42,0xa1,0x37,0x56,0xb7,0x5c,0x67,0x22,0x48,0x5f,0xa3,0xf6,0x94,0x04,0x1b,0x39,0xb7,0xd7,0xc5,0xfd,0x40,0xeb,0xc0,0x6a,0x52,0xe0,0xff,0x34,0xce,0x14,0xd8,0xd4,0x0f,0xa8,0x2a,0x95,0x08,0xb5,0x68,0x53,0x7d,0x26,0xd0,0xdd,0x7c,0x0a,0x31,0xbe,0x71,0x0d,0xa8,0x0a,0xab,0x35,0x19,0x6a,0x03,0x9b,0x60,0x64,0x1d,0xb1,0xe1,0x01,},"\x3c\xee\xee\xa3\x0f\xa4\x01\x56\x3d\xf3\x6b\x19\x8b\x9b\x59\x69\x8c\x10\xe1\x00\xa2\xf3\x0e\x6f\x78\xfe\x62\xb9\x2e\xca\xc9\x89\xe8\xaa\x09\xec\x76\x0e\x89\xca\xc0\xa1\x6b\xde\x3c\xac\x73\x62\x2a\x86\x27\xef\xed\xfa\x4e\xc0\x9b\x87\x3f\x7e\x10\x00\xe7\x69\x82\x91\x0c\xa0\xaa\x4a\xfb\x1f\xf5\xa8\x44\x8b\x76\xf7\xb0\xd2\xa2\xd5\x2a\x7f\x40\xde\xde\xfc\x68\xd6\x0c\xe6\x62\x2c\xa0\x80\xd6\x69\x8e\xa6\xc3\xbd\x72\x10\xb3\xb6\x48\xf5\x32\x52\x29\x14\x94\xb3\x5a\x55\xff\x40\xfa\x1a\x63\x1a\x57\xc5\x10\x01\x1a\x46\xbf\xb9\xe2\x71\xba\xe1\xe7\x8c\xe6\xc6\xea\x60\xc5\x5b\xa0\xcc\xe3\x60\x59\xbf\xb0\x1e\x39\x45\x56\x98\x7f\x74\x4b\x72\xae\xbb\xdb\x4b\x1b\xdb\xb3\xbb\xaa\xee\x1b\x8b\x2f\x31\x74\x50\x6a\x79\x3f\x0a\x51\x1b\x2b\x56\x90\x49\xb3\x0a\x2e\x08\x41\x42\x41\x84\xa4\x8e\xca\x9e\x2d\x83\x78\x3a\xc5\xb6\x1e\xb9\x47\xcb\xd8\xba\xb7\xad\x38\xb0\xc6\x84\x27\xd8\xf9\x4a\xe2\x85\x19\x0d\xbb\x6e\x0c\x6d\x58\x0a\x25\x14\x23\x94\xbe\x94\x81\x58\xd8\xda\x83\xb4\xf3\x4a\x8d\x25\x8b\x97\x07\x56\x32\xb3\xc2\x8b\xfa\xe3\x10\x5e\xd1\x87\x2e\x35\x6e\x43\xae\xd5\x93\x97\xb9\x11\x0b\xbf\x9d\x8c\xa2\xa0\x44\xd5\x27\x1e\x6c\xc3\x61\xe1\x4e\x69\xa9\x32\x51\x76\x83\xec\x81\x81\x8f\x02\xcf\xa0\x29\x5e\x56\x61\xce\xa3\xe5\x86\xaf\xc0\xdb\x41\xba\x95\x55\x3e\xe7\x5b\x20\x0b\x0f\x97\x90\x11\x1d\x37\x57\xa7\x39\xe5\x63\x55\x7a\xff\x9b\x70\xca\x14\xe8\x7b\x79\x54\x37\xba\x91\xa9\x5d\xd0\x7e\xa6\x9a\x11\x35\x9f\x36\xca\x03\x29\x8e\x0b\xfa\x4f\x91\x2f\x64\xa2\x92\x4a\xd9\x01\x97\x5a\x2a\x96\x0b\xa1\xbe\x89\x92\x1b\x1f\x54\x85\x49\x6b\x7e\xa5\xda\x6d\x8a\x69\x37\xac\x10\x5b\xf3\x76\x0e\x48\x76\x99\x0a\x0f\x5c\x5a\x63\x4f\x74\xcb\x57\xdf\x7c\x17\x2c\x8a\x41\x53\x72\xe6\xd9\x03\x29\x87\x17\x49\x96\x16\xf8\x97\x1c\x68\xbb\xec\xe9\x2e\xa8\x78\xa1\x8e\x23\xf3\x27\xc3\x64\x9b\x6a\x85\x2e\xf2\x3b\x7b\x3e\x60\x3c\xdf\x80\x45\x2d\xbf\x1b\xe2\xfb\x77\xe8\x14\xd2\x52\x54\x96\xbb\x31\xfb\x6e\x4e\xd2\x53\x32\x48\xb3\x9d\x5f\xbe\x23\x90\xa9\xb6\xfc\xca\xba\x99\x7e\x8b\x49\xb5\x98\x36\xe3\xe0\x95\x29\xea\x5e\x41\x13\xee\xe4\x51\xc9\xc6\xbb\x26\x74\x1d\x0e\x4c\x58\x6f\x53\xd6\x04\xc6\xea\x0c\x0e\x60\xdb\x02\xe5\x10\x9f\x37\x34\xf5\x1c\xdd\x89\x85\xaf\xeb\x3e\xca\xff\x65\xe0\x59\xe3\x12\xcd\x50\xfa\x34\x9f\xf2\x8b\xdc\x9b\x70\xb7\xf5\x32\xdb\xab\x1d\xf4\x3b\x03\x16\x7c\x1d\x2e\x3f\xa6\xee\x8c\x9b\x17\x4a\x0b\x2c\xf8\xaa\x9f\xfa\x40\x6b\xf5\xbd\x72\x88\x78\x0c\x9c\x4a\x6b\x69\x79\x49\xb4\x86\x38\xd4\x20\x79\xc8\xc6\x6e\x14\xd9\xb5\x72\xa2\x10\xa0\x93\xea\xf1\xd2\xf7\xa7\x03\xb5\xcd\x20\xad\xc4\xf9\x92\x7a\x6e\xa8\xea\x78\xfa\xa6\x1b\xc6\x2b\x3c\x5c\xbd\x3a\x53\x25\x25\x66\xd0\x43\xba\x55\x65\x90\xd9\xa7\x63\xbe\x7f\xea\x4b\x20\xe1\xe9\xcf\xbe\xbf\xae\x15\x43\x9b\x33\x4d\xc5\x39\xb1\x7d\xad\xa2\xe4\x34\xe9\xc8\x32\x25\xb1\xe8\xf6\xbe\xb7\xd5\x56\xb4\x7d\x7f\x69\xf7\xeb\x7d\xf5\xed\xe2\xee\xbd\x84\xe2\x50\xb7\xc9\x46\x8c\x21\xfd\xc0\x17\x0e\xa8\xdf\x66\x2d\x61\x80\x58\x1f\x65\x7f\xe7\x6c\xef\x18\x58\xb6\xb0\x2f\x73\x25\xc7\x21\x96\x43\xfb\xa2\xf7\xe9\x96\x3a\x33\x32\x2d\x65\x04\xab\x91\xbf\x10\xa9\x78\xfa\x07\xb4\x7d\x5d\xb0\xbe\x00\x0d\xcd\x00\x2b\xdd\xaf\x67\x6b\x77\x25\x9c\x9f\x60\xad\x0b\x11\x67\x1c\xd5\x77\x7c\x1e\x80\xb1\x3f\x82\xeb\x0f\xb6\xa1\x80\xb5\x66\x62\x93\xa4\x32\x40\x86\x2f\xbf\xa3\x97\x8d\x95\x31\x19\x71\xaf\xab\x9e\x1c\xc8\xab\x14\xa8\x76\xb6\x57\x2a\xc8\xa4\xb7\xe0\xb4\x0a\xaf\x6b\x52\xa1\xcf\x4c\x1e\xbc\x6c\x1c\x48\x7d\xf5\xa3\xcb\xc4\x00\x5a\x0e\xe3\x29\xca\xbc\x28\x6d\xb1\x0f\x17\xd0\xf1\x78\x2e\x07\xd3\x32\x4f\x0c\x73\xef\xbd\x3c\x2f\xb5\x2b\x71\xf9\x8a\xd9\x5d\xb9\x50\x62\xd9\x14\x25\xe7\x34\x67\xbc\x1e\x4e\x9b\xf5\x52\xe8\xa2\x44\x29\xd9\x7d\xb1\xd6\x6d\xd4\xd9\x95\xe5\xf8\xd2\x4e\x9c\x91\x0b\x2e\xb1\x75\x8e\xf7\x55\x25\xc3\xd6\x5a\x3f\x43\x0a\x02\x73\x48\x82\x0c\xe3\x05\x3b\x6f\x3a\xf4\xec\x96\xd0\x49\x37\x31\xc8\x18\xc6\xb1\xa7\x0c\x25\x0a\xc6\x86\xa4\xfc"}, +{{0x1e,0x85,0xc9,0xe4,0x51,0xb7,0xac,0xf8,0x01,0xd1,0x6b,0xc8,0x26,0x8e,0xb4,0x2a,0xe8,0x5c,0x72,0xc6,0x8e,0x9f,0x90,0x92,0x7a,0xa0,0xf3,0xb5,0x0b,0xef,0xd2,0x29,},{0xa6,0x9d,0x05,0x7f,0x4b,0x74,0x38,0x11,0xe0,0x7a,0xc7,0x45,0x61,0xc2,0x25,0xbe,0x03,0x81,0xc7,0xd5,0x84,0x9e,0x60,0x18,0x79,0x37,0x01,0xa8,0xcb,0x6c,0x99,0xb5,},{0x6c,0x36,0xda,0x9a,0xd6,0xc4,0x56,0x34,0x3c,0xe6,0x42,0xac,0xa4,0x54,0x92,0x3a,0x52,0xa2,0x84,0x4c,0xe5,0xee,0x58,0x94,0x7c,0x8d,0xf7,0xba,0xb2,0xeb,0xe4,0x67,0x82,0x3c,0x56,0x33,0xe5,0x30,0xb1,0x67,0xd7,0x1c,0x47,0xad,0x95,0x49,0xdf,0x05,0x94,0x3f,0x99,0x42,0x1e,0x17,0x47,0x5c,0x4d,0x4f,0x08,0xde,0xdf,0x6f,0x32,0x05,},"\x18\x9e\xa9\xc8\xd9\xed\x14\xb0\xde\x82\xb4\x4c\xbd\xd5\x87\x57\xa2\x7c\x68\x38\x3f\xba\x59\x77\x61\xf9\xe8\x62\xe0\x8d\xe1\x5b\x1e\x44\xc3\xdb\x1b\xad\xbd\xe7\x69\x80\xee\x39\xe6\x99\x62\x9f\x6f\xcf\xef\x32\xd3\x6b\x33\x93\xda\x2c\xa5\xa8\x1f\x95\x9c\x8b\x0f\x1b\x80\x1b\x5f\xa4\xc4\x7c\xa3\x95\x91\xe6\x12\xa2\x43\x5c\x5b\xaf\xd7\x7a\x5c\x7a\xb7\x43\x59\x21\x09\x06\xf4\x75\x33\xb1\x87\x9e\x2a\x5a\xf5\x86\x4d\x96\x1c\x81\x46\xe2\x5d\xac\x77\x25\x55\xe0\x42\xa8\x87\x26\x14\x19\xab\x8c\x9f\x6f\x62\x56\x25\x48\x1d\xa5\xb9\x35\x26\xa1\x31\xf3\x7b\x53\x4a\x00\x50\xa8\xa4\x62\xb3\x3f\x20\xa7\xe9\x4b\x89\x15\x30\xb1\x9b\xf6\x54\xee\x95\x34\xc9\xa8\x36\x1d\x03\x63\x5d\x8d\x27\xd4\x6b\xe7\xbf\x84\x78\x1a\xd0\xd4\x2d\x1e\x7c\x48\x54\xa4\x9b\xa1\xba\x45\x82\x62\xfe\x5e\xa1\x90\x21\xb9\x35\xa6\x94\x94\x92\xd7\x0b\x60\x5e\x15\x19\x89\xef\x26\x41\xb2\xbf\x81\xec\x4b\x92\x02\x0f\xc7\x07\x4c\x2a\x63\x22\x9d\x51\xa9\x44\x18\x6a\x28\x89\x5e\x8e\xa9\x52\x92\xc2\xf8\x72\xbb\x21\xa3\x14\x93\x99\xe2\x3c\xcd\x8e\x2f\xc4\xf1\x7a\x46\xb5\x9c\x28\x2c\x51\xb5\x8d\x00\x26\x6a\x5c\x16\xb1\xce\x35\x0d\x54\x85\xe8\xd8\x01\x6d\xd0\xa5\x0a\x59\x84\xcc\x94\x81\x54\xcd\x5c\xe7\xcd\xa0\xee\x0a\xb1\xd7\x25\x1b\xdc\x70\xa1\x78\x5b\x8e\x91\x03\x91\x7f\x4b\x91\x7a\xb2\xb4\x94\xf3\x48\x33\x89\xa2\xf9\x23\x75\x41\x84\x9e\xd3\xbd\x56\x5c\xff\xac\x9e\x75\x6d\xb5\x6e\xf5\xe2\x34\x95\xbc\x77\x1e\x88\xbf\xfa\x87\x07\xce\xea\x5c\x09\xbe\xca\xdd\x05\x9a\xb8\x89\xd1\xdf\x7e\x88\x7b\x71\xa9\xe6\xc2\x38\x37\x8f\xbe\x0c\x36\x30\x38\x66\x16\x36\x3f\x20\x7b\x16\xc3\x27\x0d\x39\xac\xde\xd5\x11\x52\x99\x92\xf4\xe5\x98\x78\x91\x21\xd3\x16\x13\x58\x10\x63\x6b\xaa\xde\x8a\x28\xed\xc6\x6b\xbf\x5e\xde\x3f\x40\x4a\x70\xb4\x7d\x35\x98\x8b\xe7\x06\xb4\xea\xa0\x30\x23\xa3\x90\x93\xd5\x83\xcd\x4c\xd8\xbf\x4c\x74\x34\x1a\x02\x8c\x19\xd6\x0d\xa3\x1b\x6a\x7a\x03\x4c\x08\x1a\x2b\x03\x0f\xeb\x3c\xd2\xf0\x3d\x0f\xaa\xbf\xfb\x58\xe3\xfc\x36\xc0\x06\xcf\xb9\x29\x47\xa7\xde\x5b\xa8\x74\x76\xc1\xb0\x51\xe1\x82\x83\xc0\x3e\x9c\x6e\x5a\x5c\x3c\x27\x77\xd9\xa0\x75\x73\x72\x37\x96\x64\xe8\x2f\x84\x85\x82\x4f\xed\xb7\x0a\x4b\xc4\xe3\x56\xed\xd1\xb5\xce\x0f\xb6\xe4\x1d\xe0\x17\x16\x21\xb8\x4f\xaf\xa0\x01\x89\xaf\xa8\xa6\xa9\x00\xb1\x4c\x70\x75\x8f\x7a\xa4\xfb\x82\x40\x0e\x0d\x18\xab\x3c\xd7\xe4\x8a\xcf\xd4\x89\xca\xb0\xe7\x2e\x71\x9f\x79\xa0\x7d\x06\x6c\x53\x1a\x89\x1c\x55\x29\x1f\x22\x45\xdb\xbe\xe4\x4e\x52\xb1\xdf\xc8\x72\x7a\xae\x38\x7a\xb9\xe7\x19\x94\xa3\x85\x4e\x1a\xdd\x73\xd9\xa7\x96\x5c\x77\x55\x21\xc2\xf5\x40\x84\x22\x76\xdd\x30\x9e\x2f\x6a\x34\x1e\x7f\x0f\x37\xf2\x2b\xb6\x62\x7b\x6e\x9c\xb2\x5b\xa2\x4c\x6c\x4f\x4e\xb9\xf5\xe7\x62\x2d\x88\xda\x19\x84\xe2\x9c\x5d\xa0\x01\x03\x9c\x44\x04\x2b\x59\x35\x14\x06\xa4\x13\x36\xdd\x77\x2d\x49\x7d\x3f\xc8\xaa\xc4\x11\x72\xeb\x5a\xa6\x41\x7f\xe4\x22\xec\x7c\x15\x0b\x96\xb0\x45\x4e\xe3\x31\x24\x7c\xb1\x53\x8a\xef\xf3\xec\xa2\xd5\x0e\x53\xd6\xd1\x31\x70\xa7\x6a\x00\x49\xea\x0c\x05\x90\x4a\x63\x90\xed\x14\xce\x74\x91\xe9\x7f\x75\x4c\x52\x22\xda\xc4\xb6\x11\x8b\xa3\x81\xf5\x52\xe7\x3e\xa8\x49\x1e\x3b\x7a\xc9\x49\x56\x9b\x56\x9c\xf2\xd2\x9a\x80\x41\x0e\x06\x5b\x5c\xc4\xa4\x66\xbb\x04\xeb\x7a\x15\xf5\x96\x79\x2e\x84\x90\xba\x70\x02\xec\x36\x15\x71\xaf\x5d\x8f\x57\x67\x5c\x95\x64\x49\x47\x0a\x2f\x99\x55\x40\x73\x67\xe4\x09\xa2\x32\x89\x95\x53\x12\x0a\x27\x7d\xb8\x63\xe9\xa8\x2d\xda\xba\xe8\x7b\x78\x91\x45\xba\x89\x8d\xf3\xc2\x8b\x96\xfb\xe3\x01\x4c\xd0\x85\xc6\xe6\x0e\xe8\x83\x17\x01\x03\x6d\x99\xc5\x42\x5d\x58\xe8\xbc\xc9\xfd\x92\x71\xd4\x6a\xec\x1e\xb9\x55\x13\x01\x02\xea\xaa\xb4\x4e\x07\x70\xc3\x0b\x2b\x12\x7e\xfb\x0e\x5f\x8a\x3f\x7a\x0c\xa3\x4e\xc9\x98\x4a\x46\x01\x1b\xc2\x6b\xfd\xe0\xc0\x81\x9b\xb5\x47\x06\xb5\x65\x63\x8b\x75\x42\xdc\x4b\x8b\xf8\x09\x8d\xc0\x1f\x16\x1b\x3b\x12\x96\x18\xb5\x9a\xde\xd3\x3c\xb5\x9c\xe9\x18\x9a\x67\x62\xdb\xae\x5b\x0d\x34\xb7\x1c\x8d\xbf"}, +{{0x51,0xcf,0x86,0x8f,0x82,0x0e,0xed,0xa0,0xdb,0xd1,0x01,0x80,0xf7,0x77,0xe6,0x06,0x5c,0x93,0xa4,0x83,0xc5,0x8a,0x77,0x8b,0x67,0xe7,0xd8,0x42,0x30,0x2f,0xb7,0x67,},{0xab,0x08,0x8f,0x50,0x2f,0xbc,0xf2,0x15,0x0e,0x48,0x46,0xb3,0x4d,0x2c,0x80,0x97,0xff,0x01,0x3c,0x02,0xa8,0xb9,0x7c,0xfc,0xf2,0xb9,0x5a,0x1c,0x72,0xdf,0x3e,0x24,},{0xe1,0x53,0x42,0xa1,0x1c,0xaf,0x89,0x28,0x95,0xe4,0x66,0x22,0x88,0x63,0xd0,0x83,0xb0,0x69,0x2f,0x01,0x06,0x10,0x74,0x8c,0x23,0xdf,0x2f,0x11,0xd2,0x94,0x75,0xba,0xfc,0xe9,0x27,0xca,0xfe,0x7f,0x07,0xef,0xb8,0xc3,0x47,0xed,0x56,0x63,0xe7,0x3b,0xea,0x89,0x53,0x1c,0xed,0xc0,0xc3,0x48,0xe7,0x9b,0x6e,0x58,0xa7,0x57,0x49,0x07,},"\x7c\x2d\x8e\xe8\x2d\x9a\xbf\x8a\xa9\xc7\x24\xc7\x5b\x90\x99\x04\x73\xf1\x31\x76\x3f\xe9\x3b\x30\xcb\x04\x72\x35\x88\x62\x1d\xa2\xa3\x27\x92\x8b\x22\x64\x9f\xa0\x62\xcd\xea\xbd\x77\x76\x15\x38\xb2\x70\x9b\x8f\xb7\xa2\x00\x6e\x50\x35\x09\x13\x4c\x92\x9c\x30\x11\xe1\xd7\x28\xa5\x7a\x4e\x17\x51\x98\x07\x5e\x21\x42\x53\xf3\xf3\x0e\x01\xb6\xe0\x4e\xab\xd4\xde\x06\x78\x95\x58\xe6\x98\xb1\x86\xef\xe3\x4b\x32\x12\x95\x68\xb3\xe8\xd0\xd7\xea\x3f\xf0\x0b\x3f\x25\xa4\x22\x36\x89\x3a\xa8\xa4\x1b\x67\x4a\x0a\xb5\xf4\x1e\x7b\x28\xcf\x5a\x7c\xb7\x65\xe1\x8e\xad\x6d\xe6\xa3\x53\xa7\x82\x4a\x3c\x49\x78\x60\x38\xd6\xf4\x93\x7f\x32\x64\xd6\xcc\xf0\xc0\xa2\x46\x5b\xb6\x93\xe5\x2b\x3d\x1e\x6e\xb9\xae\x4c\xb6\x5d\x09\xcf\xf5\x48\x42\xe8\x53\x62\x85\x7a\x59\xf7\x19\x8a\x68\x8a\x3d\xf3\x85\x13\xcd\xd6\x1e\x21\xdf\xd8\x59\x14\x2c\x83\x44\xa3\xb8\xb2\xa7\xc7\xdb\x17\x0f\x39\xf8\x7c\xa3\xff\x8e\xd4\x27\x96\x2b\x2b\x1a\x14\xd1\x22\xfa\x2d\x5a\xea\x2a\x66\x40\x11\x7d\xd2\x58\xfa\x0f\xc5\x4a\xc6\xe9\x40\xbc\x16\xd2\x11\xec\x9a\xdf\x91\x4a\xb1\x65\x78\xf5\x21\xf6\x55\xd2\x12\x7e\x79\xe8\x71\xbf\x7f\xa7\x54\x47\x19\xd5\x8e\xd8\x47\x85\x0c\xb2\x7b\x99\xeb\x8f\x29\xb1\x6c\xdc\xc2\x8b\x15\xc1\x25\x9a\xb4\xd5\x89\x70\x5a\x40\x66\x88\xf6\x05\xa2\xeb\xf5\x80\x51\xc4\x3a\x77\xc4\xe0\x1f\xd6\xf7\x49\xd3\x2d\xb4\xe8\x9f\x26\x3c\x2c\x16\xde\x18\x1f\x0e\x6b\xdd\x0a\x6a\x64\xff\xe6\xf1\x82\x94\x44\x09\x6d\x9f\x3e\x2b\x67\xe4\xbb\x00\x66\x50\xb5\x92\x9d\x1f\x82\xeb\x11\xbb\xed\x24\xe8\xf1\x01\x8a\x73\x84\x60\x5a\x3c\xf2\x9a\xb5\x98\x33\x79\x39\xc7\x6a\x3b\xe8\x61\xe4\x83\xc5\x80\x5e\xc3\xce\xe4\x5e\x34\x24\x84\x7a\x08\x55\x8d\xcc\x99\x49\x9f\xb9\x38\x2a\xca\xe5\x6c\xdc\x87\xfb\xd5\xb2\x6f\xf9\x4c\x86\xf2\xe1\x08\x79\x43\x83\x50\x1c\x8b\x33\x36\x68\x50\xa7\x6a\x0d\xfc\x0a\x7c\xd7\x89\xa0\x3f\x01\xa3\xe9\xd9\xe9\xae\x39\xfd\x72\x45\xdc\x29\x29\x9d\x24\xf3\xb4\xb1\x67\xca\xcc\xd2\x23\xa9\x9b\x6b\x20\xa3\xb6\x73\xdc\x5f\x74\x66\xd0\xb2\xf8\x15\x09\x8a\x49\x7c\xca\xf8\x04\x20\x16\x8e\xdd\xbf\x4d\xa5\x7b\x86\x66\xe9\xd3\x3c\x48\xeb\x30\x4b\x4c\xfc\xf4\x57\xcd\x76\x59\x54\x3f\x6d\x1e\x66\x18\x90\xf5\x62\xb4\x3b\x8b\x6d\x1c\x4d\xcc\x07\x7b\x60\xbf\xa5\x33\xff\xab\x92\x8d\xbf\xd9\x55\xdc\x51\x16\xd7\x70\x95\x0b\x69\x0e\x21\x06\xad\x52\xd4\x2c\x31\xc2\x2b\x88\x48\x89\x43\x32\xb5\xc6\x99\xe5\xc3\x31\xfb\x38\x1e\x58\x12\xe7\x52\x6f\xdf\x4b\x8a\xa2\xda\xaa\x2c\xa2\xcf\xb9\xc9\x21\x11\xb6\x1c\xbc\x3d\x1e\xef\x6c\x8c\x67\x37\xf0\x55\x88\xf0\x44\x67\xdb\x83\x30\x84\x3a\xcc\x98\xdc\x1a\x16\xfb\xd9\xd9\xd9\x4b\xd8\xbf\xde\x26\xc3\xf7\x1d\xee\x72\xb5\x09\x10\xc3\x6b\x24\x0f\x80\x2a\x61\xca\x16\x37\x2f\x6f\xfa\xad\xb2\xbe\x4e\x85\x3c\x5e\xd6\x9a\x3d\x1f\x6c\x7b\x2d\xe5\x13\xc5\x3a\x3f\xdd\x0a\x67\x6f\x83\xd0\x9d\x5c\x51\x17\x60\x47\xd9\x20\x07\x16\xbf\x22\xba\xe4\x5f\xe0\x1b\x3e\x0c\x2c\x51\xc1\x6e\x46\xad\x06\x37\xf7\x9f\x9b\x4d\x83\x86\x77\x04\xfe\xda\x9f\x22\x78\x31\xde\xa2\x63\x39\x9c\xa2\x77\x1a\x4e\x78\xb4\xdf\x8a\xc0\xde\x6a\x94\x1e\xab\x37\x0b\x1f\xdb\x47\xda\xf6\x64\x2a\xae\xaa\x63\x17\x0f\xa9\xb3\xd1\xe1\x62\x8f\x7c\x4e\x7c\xf0\xea\x8b\x8a\x8e\x51\x8c\xba\xce\xf9\xad\xe8\x4d\xf0\x32\x48\x48\x47\xff\xb6\x1b\xbd\x07\xe8\x72\x7c\xc4\xc2\x5d\xa5\x77\xb2\x64\x51\x9b\x49\x99\xfa\x7c\x0b\xc3\x23\xd4\xf3\xf9\x73\x9f\x78\x0b\x9b\x2c\x23\xc7\x78\x55\xee\x5f\x6d\xcc\x40\x15\x44\xd6\xb6\x4b\x27\x70\x15\x8f\xdc\x6c\x12\xf4\xd8\x9b\xeb\x04\x4e\x0e\x85\xac\x7a\x68\xd4\x29\x17\xb1\x34\x51\x14\xb9\xa6\x72\xd1\x23\x1b\x2c\x6c\x0f\x96\x9f\x20\x35\x31\xe7\x1b\xbb\x40\x05\xb1\x03\xa7\xdc\x3a\x58\xb5\xb8\x24\xa7\xe0\x1b\x6e\xb9\xf4\x96\xdf\xa6\x4d\x64\xd8\xc6\x77\x7f\x53\xaa\x58\xd5\xda\x04\x6d\x72\x6f\x55\x45\x4c\x88\xb6\xd7\xd4\xab\x0d\x21\x98\xa8\x97\x09\xf1\x18\xa6\xb3\x24\x60\xb9\xeb\xce\xff\x3f\xdd\xc6\x05\xda\x77\xef\x3d\x1b\xa3\x0f\xec\xf0\x7b\xe2\xf5\x31\x3f\x4e\xe6\x35\xaf\x5e\x95\x61\xd8\x77\xe9\x9c"}, +{{0x54,0x3d,0x5f,0x1d,0x4a,0x6e,0x10,0x29,0xb1,0x91,0x41,0x38,0xfb,0x1f,0x46,0x59,0xe6,0x94,0x56,0x55,0x72,0x07,0x40,0x66,0x88,0xa2,0x03,0x5c,0xbb,0xb2,0xa6,0x8a,},{0x3c,0x83,0x79,0x0c,0x3b,0x45,0x53,0xde,0xae,0x4f,0x84,0x3b,0x50,0x1d,0x26,0xf6,0x16,0x70,0x93,0xee,0x54,0xe2,0x79,0x75,0x9f,0xfa,0xd8,0xcb,0xc0,0x61,0xe7,0x20,},{0x55,0x20,0x11,0x94,0x02,0x6f,0xd6,0x44,0x8b,0x1d,0x52,0xf8,0x3e,0xd2,0x0a,0xc2,0x84,0xe7,0xe7,0x7f,0xa9,0x2d,0x52,0x95,0xd3,0x38,0x25,0xce,0xa3,0xac,0xa4,0x7e,0xc7,0xaa,0xca,0x2f,0xc0,0x86,0x79,0xf9,0xac,0xfc,0xed,0xb3,0x76,0xfd,0xa4,0x61,0x9b,0xe3,0x27,0x2c,0x74,0x45,0xe8,0x70,0x5c,0x30,0x61,0x41,0xcd,0xe1,0x6c,0x0f,},"\xfe\x00\x57\xf0\x62\xfc\x87\x13\x24\xb8\xbd\x5d\x42\x7e\x9a\x52\x76\x23\x1b\xd3\x09\x90\x7e\x58\x81\xd7\xae\x53\xb1\xf3\x70\xc2\xa4\x33\x02\xa1\x65\x10\xb4\x60\x64\xa3\x07\x36\xba\xc9\x09\x51\xf1\xd9\x88\x1a\xf6\x2c\x70\x14\x83\xeb\xb9\x27\x2a\xd7\x72\x12\xee\xb5\xfc\xbc\x7e\xc2\x28\xd9\x69\xf8\x90\x27\x32\x11\x3b\x98\xe3\xbf\x82\xdf\xea\xdd\x0d\xe5\xe7\x65\xd2\x87\x0b\x12\xd1\xf9\xb5\xa2\x82\x97\xc9\xfd\xd1\x49\x5c\xf8\x77\x89\x19\x6a\x7d\x64\x4e\xec\xd9\x35\x87\xdb\xf2\x0c\x28\xeb\x09\xda\x28\x66\x03\xc5\x82\xd2\x12\x9a\x65\x7d\xb2\xd1\x7a\xdd\x35\x58\xdd\xe0\x29\xce\x27\xb8\x83\x52\xde\x3f\x95\xab\xa1\x7e\x1e\xd1\x91\x37\x22\xdb\x08\xa7\x95\xdf\xbb\x70\xd6\x2a\x88\x02\x72\x4c\xb0\xf5\x35\xf8\x48\xd0\x52\xaa\x3d\xde\x91\x66\x96\x3a\x80\x41\xfc\xcc\x4e\x60\xbf\xb1\x1d\xe2\xbf\x28\x6e\xb6\x02\xa4\xaf\x84\x2f\x4d\x1a\x34\x0d\x78\xbb\xbc\xb2\x85\x7f\x0c\x30\x8f\x44\xbb\x10\x1e\x7b\xc8\xb7\x41\xd5\x06\x09\x4e\x27\xbb\xaf\xa7\x24\x28\xef\x66\x6e\xa6\xea\x16\xf7\x99\xb4\xee\x58\x27\x8f\x04\x59\x74\xd8\x6d\xc7\x2c\xf5\x26\x0d\x96\xf9\xc0\x9b\x2f\x11\x81\xe1\xa4\x50\x0f\x92\x83\xdc\x67\x7f\x38\x4f\xf6\x4e\x51\xe8\x9f\x76\x58\x20\x20\x32\x6c\x38\x8c\x08\xa0\xfd\x00\xde\x73\xd5\xd4\x9c\x06\xc0\xc6\x84\x19\x1a\x26\x4f\xff\x72\x6d\x87\x2d\xc3\xae\x49\x6c\x7b\x47\x8c\xfc\x61\xb5\x17\x14\x19\x2f\x76\x46\x3e\x3d\x0a\xab\x41\x0e\xa1\x15\xe8\xbe\xfe\xdb\x99\x7d\xdd\x16\x99\x21\xb3\x20\x7e\xa6\x6c\x1f\x59\x45\x0b\x76\x23\x12\x9f\xd1\xe2\xdd\x3d\xa8\xf5\x20\x63\x91\x17\x13\x38\xea\x0e\xc8\xef\x3c\x59\xed\x8a\xfc\x69\xf3\x86\x5c\x29\xa0\x72\x3a\x9b\xbe\x95\xa7\x42\x68\x1e\xf9\x85\x7e\x81\xab\xc8\x0c\x92\xd2\xa7\x18\xa8\x04\xf5\x30\x4f\xef\x3c\x63\xd7\x99\xa6\xef\x87\x82\xa7\xdb\x46\x68\x1d\x0d\xe3\x50\x64\x46\x98\x22\x67\xb2\x15\x2b\x0c\x32\x18\x69\xe2\x3c\xce\x8c\x4e\xbe\xbe\xaf\x4a\xa1\xeb\xe9\x28\x3b\x69\x26\x05\x26\x0f\xf6\x21\xb0\x3c\x10\x82\x2a\xa5\xf6\xd0\x3b\xde\xf4\x9c\x46\x2a\x68\xd4\x71\xe8\x49\xe1\x64\xe3\x87\x4f\x6e\x9f\x6c\xb3\xb5\xf2\x93\xeb\x38\xae\x52\x45\xa1\x59\xec\x42\x61\xa9\xbf\x6b\x5f\x7b\x76\x15\xfd\x33\x9e\xa1\x27\x33\x11\x3c\xe7\x67\xf8\x83\xae\x66\x75\x41\x7f\xc7\x70\xb5\x0b\xd6\x0e\x6f\x20\xad\xdb\x29\xc1\xf7\x50\x62\x33\xe3\x2a\x7e\xbf\xad\xab\xff\x98\xcf\xd0\x9b\x2b\x3b\xbd\x3e\xae\x00\x69\x54\x8b\x9d\x89\x87\xaf\x46\xca\x98\xeb\x09\x5b\xac\xbd\x87\x47\x24\xba\x10\xf3\x63\x3a\xa0\x8a\xb6\xec\x26\x49\x4d\xdf\x68\x54\x30\x9b\x55\xd4\x3b\xdb\xd2\x9a\x75\x56\xf1\x2d\xfb\x23\xcd\x0d\xb4\xeb\x39\x37\xa6\x5c\x4a\xed\x96\xe8\x7b\x34\x65\x55\xf9\xfc\x68\x97\x94\x3a\x0f\xae\xe6\x5c\xcf\x39\x4b\xd8\x9b\x38\x1b\xee\xce\x25\xd1\xba\x68\xf8\xfe\x32\xc2\x3b\x33\x54\xf5\xbe\x7e\x3e\xa3\xc0\xde\xc0\xf7\xec\x2d\xd8\x3f\x92\xb7\x30\x58\x89\x2b\x63\x8d\x4c\x3b\x72\x42\xbb\x8f\x55\xbf\x08\x7b\xa4\x5a\x19\x0a\x69\x8b\xae\x67\x5e\x0c\xd5\xe8\x44\x6f\x2b\x21\xae\xb6\x3d\x2c\xae\xa0\xf6\x79\xa8\x37\xe7\x93\x57\x30\x8d\x9f\x0b\x8a\xf3\x1f\x9d\x08\x00\x8c\x39\xee\x8d\x34\x75\x28\x71\x3c\x88\x50\x01\x7a\x7f\x4a\xb9\x8a\x35\xc7\x53\x19\x40\xfa\x76\x21\xe6\x72\x03\xee\x78\x2d\xb3\xa2\xfa\xa3\x0f\x3a\xa8\x50\xa5\xff\x7a\xae\xd8\x4c\x00\xff\xd2\x14\xf2\xc9\x26\x17\x35\xfa\xc3\x25\x9d\x50\xe0\x3c\x26\x52\x50\x52\x79\xd9\x12\x51\x92\x7d\xe5\xe5\x6a\x8b\x90\x64\xcc\xf9\xf4\x5d\xcb\xef\x46\xe1\x18\x9c\xed\x2b\xc7\x9e\x6f\xf6\x52\xe6\x90\x97\xac\xe5\x56\x8b\xb2\xd5\xbe\xf3\xce\x21\xa2\x5b\x3f\x79\xee\x27\x5e\xa3\x4e\x62\x13\x80\x56\x6d\x70\x4c\xd9\x3f\x24\xdd\x90\x20\x93\x2c\xc0\x52\x18\xc2\x3b\x5b\x22\xff\xfa\x7e\x99\xee\x7f\xe4\x57\x87\x6a\x5e\x33\x64\xc9\xa8\xe8\xb0\x49\xcf\xa2\x09\x69\x77\x4f\x50\x6d\x19\x96\xcb\xe6\xef\x5a\x37\x79\x3e\xcd\xb0\x4c\xfd\xea\xed\x7d\xcf\x79\xab\x27\x84\x74\xdd\x77\x08\x22\xd4\xb3\x6f\xc6\x8e\x4b\x2d\xd6\x61\xef\x99\xde\x01\xde\x6e\xec\x57\xfa\x57\x3e\xde\x10\xfb\xbd\x5a\xc6\xfd\x6c\xd8\xbb\x4e\xee\x50\x9d\xbb\x46\x10\x37\x44\x01"}, +{{0xf8,0xd2,0x57,0xfd,0xfc,0xf9,0x97,0x96,0xf8,0xce,0x4d,0x8a,0xad,0xe3,0xb2,0x25,0xa5,0x3c,0x26,0xfe,0xec,0xef,0x39,0x5b,0x95,0x61,0xd9,0xd5,0x87,0xf5,0xa3,0x3c,},{0xf6,0x6b,0xd4,0x87,0x7d,0xf7,0x8a,0xec,0x04,0xca,0x7e,0x77,0x73,0x28,0x99,0xde,0x06,0x77,0x7e,0x69,0x86,0x29,0xf2,0x99,0x69,0xf8,0xfa,0x9c,0x2f,0x47,0xab,0x9e,},{0x92,0x35,0xd4,0x48,0x07,0x86,0x98,0x16,0xe2,0x8e,0x42,0xc8,0x1c,0x80,0x1f,0xfb,0x12,0x1d,0xe8,0x26,0xc0,0xd3,0x3d,0xcc,0x4a,0x4e,0x1c,0x93,0x2d,0x52,0x28,0xb6,0x39,0xbb,0x29,0x4e,0x16,0x09,0x0a,0x93,0xd1,0xf6,0x90,0x4a,0x70,0x04,0x22,0x2f,0xda,0x0a,0x55,0x44,0x6d,0x99,0x01,0xc7,0x23,0x40,0x00,0x7b,0xb4,0x5a,0xe1,0x03,},"\x23\x3e\x1e\xf9\x01\xab\xcb\x69\xfb\x48\x60\x85\xd8\xdb\x02\x33\xff\x78\xf3\x7b\x13\x6f\x0a\xfe\x24\xf7\xda\xc1\x94\x4c\x36\x78\xe7\x4f\xed\x58\xa1\xad\x54\x83\x5b\x7d\xbc\xb4\x6f\xff\x6c\x35\x24\x31\x22\x73\x30\x0b\x6d\x87\x8a\x93\xe0\x60\x8a\x4a\xba\xca\x4e\x31\x94\x72\x2b\xb9\xe2\x3d\x17\x19\x4d\x86\x67\xb8\x4f\x2d\xb0\x38\xc2\x4e\xfb\x8f\x53\x40\x9c\xf5\x59\x4f\xdd\xb8\xbc\xd6\x1f\x74\xcf\x07\x26\xb5\x1c\x65\x1c\xe0\x1e\xb6\x6a\x59\xb4\x55\xf7\xd8\xa7\xd6\x0d\x39\x27\xe0\xc6\xc5\x4b\x13\x8e\x01\x92\x53\x71\xd2\xd9\xd9\x62\xaa\x98\x2f\x5e\x60\x85\x28\x0c\xc0\x5f\x35\x69\x93\x91\x1f\xd2\x03\x9d\xfc\x34\x21\x17\x97\x02\x91\x38\x1d\x82\x02\x7d\xb3\x6c\x79\x91\x00\x05\x7d\x93\x52\xb2\xcd\x87\x9d\x9c\x82\xaf\x73\x4b\x7f\xa2\x97\xd2\x11\x49\xc9\x78\xaa\x5e\x12\x5b\x20\x37\x2a\x9b\x2e\x0e\xd3\x57\x33\x7e\xfa\xea\x13\x91\xf3\xb9\xef\x11\xe3\xe5\x13\x5b\xb7\x0b\xdb\xe3\x2a\x9b\xdb\x7c\x3c\x42\xd5\xd5\x7c\xc8\xda\xb6\x81\x16\x28\xa0\x10\x89\x49\x5c\xb8\xa4\xa7\x6a\x48\x29\x6c\xd8\xdf\xaf\xc0\x05\xad\x49\xd7\x0b\xb1\x9f\xac\xa2\x08\x4a\x1b\x6f\x5e\x48\xd2\x3c\x03\xfb\xcf\x6f\x10\x6d\xb7\x70\xf0\x7c\x33\xe8\xe7\xf4\x75\x7d\xa9\x04\xa4\x4d\xd0\xe7\x38\xf3\xd5\x73\x3a\x32\x93\x75\xce\xd7\x4f\x3c\x42\xbf\xcd\xbb\x91\x01\x00\x45\x5d\x6a\xa7\xd2\xe3\xe3\xaa\xa5\x8a\x82\x96\x30\xd3\x76\xb0\xb4\x66\xdc\x85\xaa\xc4\x8f\xe2\x69\x94\x6a\x7b\xc7\x2d\x91\xeb\x37\xde\xd2\xf4\xa7\x7c\x68\x4b\xe0\x10\x93\xfd\x12\xde\x9d\x9d\x83\x19\x9c\xcc\x50\x95\x9a\x48\xd6\xe9\xa4\x14\x27\x56\x60\x92\xf0\x4a\x0f\x95\xca\x52\x37\x2e\x07\x62\xb9\x66\xce\x62\x32\x05\x5a\x4f\xd7\x57\xc6\x1b\x8b\xad\x83\xba\xef\x91\xa3\xc2\x77\x2f\xb3\x2e\xad\x8f\x59\x1a\xc1\xe0\x2b\xbf\x90\xa7\xf6\xc3\x90\x79\xb8\x6f\xb8\x14\xcc\x24\x2e\x98\x0f\x0b\x8b\x1a\x2c\xec\xb8\xe6\xd4\xe8\xa5\x21\x1b\xf8\xba\xbf\x38\xe8\x29\xab\x98\x83\x60\x8b\xd6\xd5\x9e\xa5\xe8\x36\xa9\xb4\xa4\xfb\xed\xed\x1b\xea\x2f\xfe\x97\x7e\x8c\xf3\x61\x5c\xa4\xa5\x0f\xea\x1f\x05\xf1\xfe\x53\xc8\xea\xc5\x00\x32\x3e\x1f\x52\xa8\x06\x83\x15\x39\x95\x79\x88\xd7\x9a\xcc\x7b\x54\xf7\xd0\x2b\x48\x0c\x46\x9f\xd6\x95\x40\xfe\xa4\xbd\xd6\x8c\xbd\xc6\x8c\xf9\xc7\x87\x2f\xd7\x92\x59\x1b\x01\xe9\xd9\x90\x2d\x8a\x61\x4f\x4c\x21\x82\x3f\x23\x50\x8f\xfd\x49\xff\x21\x8b\xea\x92\x2e\xc1\x41\xef\xf6\x0d\xa1\x77\xcc\xad\x7d\x7b\x9d\x44\x4f\x3b\x03\x45\x81\x15\xf1\x16\xcc\x6e\x37\x62\x5c\x39\xcb\xad\xf0\x93\x62\xf3\x1d\x33\xf4\xc1\x3c\x33\xb6\x29\x20\x07\xf2\xca\xfd\x19\x4f\x62\xc6\x43\xe7\xa2\x55\x71\x56\x4f\xeb\xad\x7d\x33\xe3\x64\xb6\x33\xd0\x08\xb0\x90\xd7\xa0\x91\x35\x8b\xc6\x9c\x56\x7b\x95\x22\xb5\xc1\xcd\x01\x21\x8d\x38\x52\x9a\xeb\xb0\x3d\x9c\x2a\x5e\xb2\x28\x5a\x71\x76\xf9\x8c\x28\x03\x6f\x21\xe1\x9e\x92\xb4\x06\xe9\x48\x95\xfa\x28\x1b\x35\x22\x8f\xbf\x76\xe7\x3e\x17\x58\xaf\x1b\x43\x4a\x4d\xf9\x8e\x8c\xc5\x56\xb9\xd8\x3f\x6b\x0b\x7f\xf5\x2c\x68\x0f\x65\xef\xe4\xe0\x0c\x59\xb4\x6c\xe5\x93\xbf\x98\x89\x98\x05\xd0\x2b\x91\x65\xb7\x42\x98\x49\xe7\x39\x53\x77\x0a\xe3\x93\xe4\xf1\xf9\x7c\xb9\x0c\xd6\x15\x9c\xc9\x39\x52\xae\x8a\x4d\x3d\x56\xa9\xa9\x5d\xf7\xcf\xab\xac\xd4\xd0\x30\xd7\x36\xea\x45\x4d\xfa\x4b\x4a\xed\x1b\xcd\x88\x5d\x2f\xbe\xa5\xff\xa2\xcf\x29\x27\xc1\x37\xc8\x6b\xe4\xfe\x01\x64\x12\x62\x8f\xe7\xa0\xa0\xf0\x2b\x6b\x6a\x9a\x21\x68\x93\x2b\x94\x3f\xf8\xb2\x8d\xd5\x87\xe7\x72\x87\x79\x0a\xaa\xa6\x9a\x98\x50\x6c\x76\x4e\x6f\x5b\xa6\x33\x8c\x09\xf3\x82\xe1\xb9\x87\xd9\x9f\x14\xa3\xe1\x95\x8c\xb6\x2a\xe6\x70\x5a\x57\x7f\x9f\xfc\x67\x30\x64\x01\x12\x87\x41\xa8\xd0\xaf\x03\xc0\xaa\xaf\x6a\xf0\x6b\xd8\x8e\xe4\xb0\xaf\x67\x03\xe0\xea\x60\xb0\x40\x9a\xce\x24\x57\x2f\xb3\x86\xe0\x7e\x9c\x22\xc9\x68\x6b\xdc\x66\xd4\xfc\xf3\xc7\x46\x1d\x38\x33\xa4\xc3\x01\x32\x43\x60\x7d\x4d\x15\x82\x17\x18\x73\x26\xdf\x51\x72\x5a\x6b\xc5\x11\x6e\x99\x0b\xef\x8a\x5a\x95\x79\x60\x02\x07\x20\x6b\xfc\x3a\x6d\xcf\x07\x46\xef\x75\x6f\xd9\x39\xe1\x87\xf6\x68\x75\x07\x16\xc0"}, +{{0x8d,0xa9,0xf5,0x4d,0xa0,0xb6,0xa5,0xa3,0x89,0x85,0xb8,0x8b,0x71,0x33,0x9d,0xc7,0x38,0x4c,0xfd,0x5a,0x60,0xbe,0xe1,0x59,0xc3,0x94,0xc2,0x23,0x63,0xbc,0x7e,0xdd,},{0x1a,0xc1,0xa8,0xed,0xeb,0x21,0x7a,0xe9,0xb3,0xa3,0xde,0x53,0x0d,0x24,0xd8,0x3e,0x11,0xfb,0x65,0x38,0xcc,0x70,0x9b,0x52,0x99,0x4f,0xa9,0xc3,0xf1,0xfa,0xdd,0xc8,},{0xf6,0xdc,0xc2,0xd2,0x7b,0xaf,0x16,0xc4,0xf4,0x81,0x7f,0x87,0x49,0x91,0x57,0xd3,0xac,0x1f,0x84,0xed,0x39,0x8a,0x5e,0x8b,0x0d,0x50,0xf4,0x2e,0xdd,0x73,0x85,0xcf,0x06,0x33,0x7a,0x02,0x36,0x10,0x99,0x70,0xb7,0x9c,0xa0,0x9d,0x7c,0x98,0x31,0xc8,0x76,0xa8,0x02,0x79,0x94,0x21,0xc2,0xab,0xd0,0x75,0x87,0xf5,0xeb,0x66,0x16,0x0f,},"\xbd\x53\xba\xba\x66\x57\xd8\xdb\x8b\xec\xae\x6e\xab\xff\xa5\x2b\x01\x5a\x5a\x05\xfd\xd2\xe0\x70\x64\x7d\xe9\x6f\x9c\xa4\xdd\x21\x9f\xe0\xda\x60\x8f\xa0\x44\x7f\x46\xd1\x7c\x9a\x35\x82\x44\xcd\x54\x08\x59\x65\x82\xcc\xd3\xcd\xd0\x15\x1d\x6f\x09\x23\xe6\x3d\x16\x68\x37\x84\x5f\x27\x3f\xca\x7a\xf6\xc8\x9d\x8d\x52\x46\x17\x5c\x21\x67\xfb\xb9\xc2\xeb\xf6\xa7\x59\x54\x91\xf9\x7a\x97\x13\xb0\x2b\xdf\x41\x3e\x20\x9a\xb2\x2d\xb7\xdd\x2b\x37\xfc\x49\x43\x69\x18\xcc\xeb\xe5\x74\x6b\xc6\x4d\xdd\x6d\xce\x19\xec\x45\x58\xc4\x0e\x08\x96\xe2\x19\x09\x28\x0c\xba\x06\xd1\x6b\x72\xf3\x1d\x98\x76\x85\xd0\x71\xdb\x81\x55\xe9\x9e\xbc\xc6\xc8\x21\xd9\x26\x83\xfd\xce\xe0\x86\x68\xa5\xed\x58\xf8\x39\xd9\xed\xaf\xb9\xf1\x45\x9d\x48\xde\x8e\x1b\xb6\xf7\xce\x84\xda\x0b\xe4\x11\xc8\xf7\xbe\x1b\x9a\x24\xbc\x5d\x0f\xe3\xa9\x6b\x02\x35\x07\x50\xa5\xcb\x25\x0b\x49\x55\x5a\x48\x76\x72\xbd\xff\x3c\x3f\x78\x4e\x3f\xb6\x3c\x1c\x97\xba\x6a\xe4\x3a\x10\xe1\x96\xf1\x88\xdc\xc6\x35\xe2\x14\xe2\x9d\xf5\x09\xe5\x60\x8a\x53\x67\xaa\x28\x00\xc1\xa9\x6a\xd9\x36\xa9\xe2\xa5\x79\xb8\x59\x2e\xc1\x3a\x35\x93\x36\xa6\x27\x88\xc3\xec\x55\xc0\xff\xd6\xa7\xd4\x9e\xcb\x7c\x68\x2e\xfa\x30\x81\x99\xf7\x08\xd7\x9d\x0e\x88\x56\x36\x6d\x26\x9f\xab\x24\xeb\x1a\x07\x5c\x96\xc8\x81\xca\xb8\x97\x08\xce\xd2\x79\x23\x0d\x3f\x1f\x3e\xe1\x73\x67\x22\x83\xeb\x8d\x8a\x82\x40\x38\xf6\x48\xac\x43\x72\x75\xd7\x5a\x0e\x15\xf7\x1c\xe5\x6a\x8a\xeb\x77\x1f\x07\xa7\xf3\x2a\xfc\x9d\x61\x2a\x13\xbd\x83\xb7\xf9\x39\x90\xd3\x8f\xc3\xf4\xf4\xab\x8a\xa9\x43\x0c\x65\x73\x6e\xb6\x4b\x16\x80\x6e\x99\x5c\x1c\xe9\xdc\xf4\xc5\x54\x4e\x7b\x3d\x01\x54\x1c\x57\x21\xbb\x4b\xe4\xcf\x0a\xe3\x82\xa0\xc1\xb1\x69\xd8\xe4\x18\xde\xfd\x55\x94\x42\xac\xea\x14\xb0\x0d\x70\x5b\xcf\xa7\x8b\xe0\x75\x6a\x8f\x37\x7c\xbf\x18\x3b\xf2\x59\x06\x87\x41\x15\xd8\xce\x4c\x3b\xa8\x74\x10\x29\x38\xa4\xea\x16\x03\x6d\x91\xa4\x2c\x5f\x8f\x18\x86\x55\xca\xcb\x00\xc8\x8e\x3a\x68\x50\x88\x16\xe5\xe1\xc3\x1d\x27\x18\x0b\xbb\xa9\x51\x8a\x96\x30\x72\x6d\x7d\x04\x7d\xd8\xd2\xc0\x40\x12\x19\xe1\x4e\x6b\xad\xfc\x9b\x95\xb7\x7a\x6a\xce\x9b\xea\x71\xd1\xb4\x7c\x21\x89\x03\xa1\x15\xad\x02\x9e\x7f\x20\x39\xea\x23\xcf\xd1\xfa\x6a\x44\xd0\x89\xfc\xac\xb6\x78\x15\x3d\x67\x4c\x0e\x08\x17\x64\x99\x55\x95\xcb\x68\x94\x89\x5f\x08\xe2\x5b\x98\x4e\x3a\x69\x4c\x92\xfc\x7c\xbe\x0f\xfc\x46\x97\x23\x0b\xcb\x0c\xa4\x08\xc2\xd7\x08\x5c\x11\xba\xde\xb3\xe6\xc0\xe7\x5e\x6c\x49\x8d\xb1\xbe\xc1\xed\x2a\x3e\x24\x45\xc3\x2b\x19\x13\xa8\x95\x00\xf6\x9e\x7f\x23\xf4\x1d\x62\xe5\xc1\x89\xf3\x9a\x05\x6c\xb9\xfc\x68\xa4\x52\x02\x3a\x33\x3f\x75\x22\x0c\xb9\xb9\x44\x84\xac\xac\x6b\xbc\x67\x1f\x59\xff\xa0\x72\xb7\x1a\x18\x96\xa1\xb3\x06\xe9\xdc\x55\x8d\xa0\xec\x20\xf3\x73\xe4\xc3\x55\xe0\xc5\xec\xcb\xbf\x13\x50\xc8\xc0\x79\x14\x89\x2c\x45\x4d\xef\xce\xfb\x71\x7b\xe3\x4d\x08\x7a\xeb\x24\x4a\x86\xff\x49\xa6\xc4\x70\xaf\xb3\x6b\x40\xfe\x8b\x71\xc5\x05\xa4\xff\x7a\xf2\x98\x4c\x65\x28\x49\x38\xec\x0e\x40\x52\x31\x52\x1f\x48\x10\x14\x7d\xc4\xe3\x73\xfd\xab\x66\x47\xb8\x6f\x79\x82\x75\x02\xfd\x08\x7e\x27\xf3\x10\xd6\xb3\x12\x36\x31\x13\x84\x21\x55\xc5\x7a\x32\xba\x03\xb6\xcf\xf9\x65\x53\x0b\xd7\x95\xfc\x29\x2e\x24\x1c\x9b\x6c\xa0\x85\x14\x00\x32\xef\xe7\x46\xf3\x7d\x57\xe9\x58\x42\x11\x84\xb8\xa4\xc1\xa6\xa1\xe3\x7d\x45\xe0\x77\x31\x98\x33\x06\x8d\xdc\xb8\x9d\x38\xc7\x5b\xeb\xa1\xa6\xe8\xe4\x05\x28\x88\xec\x18\x16\x2d\xd6\xff\x0c\x59\xa2\xfd\x0b\x47\xf3\x11\x91\x95\x68\x0f\xfc\xcd\xdf\x5f\x76\xb3\x5f\x02\x2a\xa6\x6b\xd1\xac\x56\xf1\xae\x33\x3e\x9b\x9d\x04\x6f\x0b\x79\xa8\x92\xec\xc4\xf8\xd2\xf3\x1e\x17\x53\x6c\x4c\x62\xa9\xb5\xe0\x63\xdd\x2d\xce\x37\xd3\xd0\xac\xb4\x20\x23\xeb\x2f\x2e\xa3\x29\xd3\x87\x6c\x23\x86\xa0\x22\x76\xff\xf9\xd3\x08\xab\xba\xdb\x72\x74\x30\x1a\x69\x62\xec\xae\xeb\x20\xbe\xf5\xe3\x6a\xff\xfc\x38\x7c\xa8\xe1\x85\xe5\x62\xb8\x65\xb4\x92\x04\xc1\x7b\x2a\x70\x11\x9b\x06\x1c\x29\xc0\xfe\x90\x04"}, +{{0x7a,0x2e,0xfd,0x39,0x01,0x24,0xd3,0xfb,0xef,0xc5,0x4a,0x57,0x71,0x06,0xe7,0x4b,0x2d,0x1f,0x5d,0xd5,0x04,0xc0,0x50,0xd0,0xd3,0x59,0xe5,0x3c,0x0f,0x5c,0x87,0x2b,},{0xef,0xc3,0x03,0xd9,0x22,0xe8,0x8f,0x70,0xf3,0x8c,0x1a,0x2b,0x92,0x06,0x84,0xef,0x66,0x30,0x34,0xa1,0xb2,0x3a,0xb9,0xd6,0x9b,0x6c,0xe8,0xed,0x87,0x06,0xf7,0xf7,},{0xc2,0x8b,0x34,0x80,0x48,0x05,0xd8,0x1f,0x7a,0xef,0x78,0x49,0x70,0x67,0x0e,0xda,0xa4,0x17,0x23,0x2b,0xcc,0x67,0xda,0x9b,0x51,0xe9,0xc3,0xd7,0x4f,0xc4,0x99,0x1b,0xde,0x97,0xa0,0x6b,0xd5,0x3f,0xa0,0x0b,0xb4,0x40,0xfd,0x56,0x16,0xcd,0x0d,0xe6,0xe9,0xb0,0xd1,0x9f,0x2f,0x68,0xbf,0xaf,0x9d,0x4c,0x51,0x72,0xc4,0xe5,0x20,0x0a,},"\x23\x8f\xbe\x9f\xb3\x5c\x72\x5c\x6c\x1f\x32\x92\x48\x09\x4b\xc7\xda\x1b\x27\x3e\xdc\x76\x99\xa7\xe3\x45\x2b\x57\x88\xd8\x78\x67\xde\xfc\x40\xa0\x05\x90\xe8\x75\x80\xd2\xc0\x27\x5d\xf5\xab\xcc\xe0\xe1\xaa\xa1\x82\x90\xbf\x93\xb4\x4e\x5a\xd9\xd7\x60\xdd\x21\xf1\xaa\xca\x38\x31\x78\xf9\xff\xf9\x13\x0f\x73\x18\x7b\xa9\xd3\x1e\xa3\x60\x4a\x1c\xdf\x39\x11\xe1\x43\x77\xa0\xce\x8b\x44\x18\x9a\xda\xa7\xaa\xc2\x3b\x6c\xdc\x7a\x42\x5b\x7e\xa7\x45\x50\x84\x55\x70\x4f\x9a\xd7\xa8\x95\x27\x18\xc3\x98\xb4\x21\xb6\xe0\x9c\xb7\x8c\xb5\x2a\x18\x14\xee\x2e\x96\x39\xec\x68\xd3\x61\xf0\xa3\x20\x41\xd6\xe7\x42\x5b\x4b\xb3\x3c\x70\x19\x6e\x24\x00\xeb\x81\x2d\xb8\x50\x6c\x9f\x32\x45\xbd\x98\x8f\xbc\x89\x1b\xe2\x0c\xb0\x69\x15\x59\xfc\x91\x6b\x57\xff\x96\xc9\xb1\x44\x89\xe0\x99\x3c\xb7\x39\xa3\x9d\xa2\x46\xd0\x1a\x6e\xbd\x07\x58\x35\x81\xf2\x50\xbf\x48\x0b\xc4\x4b\x2c\x33\x91\x54\x2d\x59\x5e\x4d\x39\x94\x90\x19\x5f\x84\x45\xdf\x63\x8f\x34\x69\x8f\x1a\x96\xed\x27\xb3\x53\x3e\x3e\xb6\x7e\x8f\x86\x58\x65\xfa\x95\x55\xed\x34\xdf\x11\x15\x76\x41\xa0\x0e\x6d\x60\xcf\x62\x3f\xec\x1a\x92\xb8\x7a\x15\xd7\x65\x18\x5f\xd9\x05\x5a\xcb\x38\xd7\x5c\x99\xdb\x4f\xce\x7b\x0e\x39\xfd\xc3\xf8\x51\xda\xf6\x5c\x7a\x33\xf4\x64\x81\x69\x31\x83\x9f\xef\xe8\xe5\x8d\x9a\xb7\x42\xb8\x61\x87\x3f\xd2\x29\x18\x9e\x59\xcd\x4c\xe8\x23\x9f\xc9\x54\x3f\x53\x9d\x2d\x29\x61\x14\x26\x6e\xa8\xc6\xfd\x15\x2a\xc6\xb3\x42\xe5\xd1\xa5\x57\xab\x35\xca\xc5\x1e\x2d\x12\x12\xee\x31\x7c\x4d\x26\x71\x68\x29\xe2\x57\x46\xdf\x17\xd2\xa6\x22\xc2\x43\xf3\xec\xbb\x65\xf5\x7a\xb0\xf4\x27\x0e\x3d\x06\x68\xa9\x62\x50\x22\x45\xb9\x4c\x06\xdf\x0c\x5e\x39\xe3\x53\xaa\x84\x2e\xa0\x80\xcf\x50\x27\x08\xb1\xdd\xa2\xd0\x01\x82\x4d\xe4\x58\xd3\x77\x62\xaf\x2c\xdf\xd5\xa6\xd3\xf3\x5e\x08\xa1\x8e\x14\xaa\x7a\x64\x2c\x51\xe4\x04\x7e\x63\x75\x17\x84\x6d\xf6\x46\xd0\x73\x36\xfb\x17\x24\x34\xe0\x88\x3e\x2b\x77\xd8\xed\x1c\x52\xc9\xcc\x63\x6a\x56\xa1\x9e\x57\xa5\xf1\x61\xb9\x2d\x1d\xcb\xfa\x49\x6f\x34\x4a\xe6\xd4\xdf\xdc\x95\x69\xad\xe4\x57\xa4\x90\x91\x36\x2e\x5a\x0c\xdd\x81\xb3\x75\x32\x43\xfd\xac\x30\xa2\xd2\x7e\xa0\x26\xa5\xe6\x01\x44\x1e\xcd\x55\x37\xa7\x20\x1b\xdc\xb7\xfd\x58\xb2\x40\xd0\x22\x9f\xdd\x9b\xab\xf1\x12\xb5\x69\x48\x12\x25\x0e\x76\x8d\x7c\x0c\xe6\xca\x56\x5a\xd0\x6a\xb8\xf7\x8a\x5c\x99\x50\xee\xf5\x38\x72\x6f\x57\x6c\x4b\xd2\xe0\x75\x5c\x7f\x98\x39\x29\x37\x2a\x5f\xe1\x1c\x73\xf9\xe1\xfa\x45\x3a\xb5\x4b\x58\x17\xaa\xd3\x59\x67\x56\x12\x7d\x84\xe3\x11\x94\x53\xe8\x82\x5b\xb8\x46\x0d\x85\x1f\x1f\x7e\x4a\x28\x38\xa2\xbe\x78\x6b\x23\x35\x04\xa6\x91\xdb\x0f\xa2\x2a\x5f\x41\xfe\x3f\xd3\xc9\xb5\x38\xb0\x4f\x40\x9e\x09\x18\x09\x48\x6b\x28\xad\x0d\xed\xa7\xb3\x8a\x42\xce\xfc\x48\xde\x7d\x86\x79\xc0\x3b\xf8\x77\x23\x85\x11\x82\x0d\x07\x70\xcc\x8d\x7b\x41\x72\x37\x78\x23\xa0\xb9\x91\x49\xab\xb8\x91\x8b\xfb\x66\xd5\xab\xfc\xd1\x00\x60\xb0\x5c\xb4\xf2\x39\xdd\x42\x81\xd9\x34\x83\x50\x4b\x73\x1e\xaf\x5a\xdd\x51\x5f\x1f\x3c\x3b\x52\xb4\xe3\xbd\xaf\x97\x6a\x17\xb3\xc9\xec\x61\xbf\xc8\xe7\x71\x16\x71\x58\x04\x53\x2c\xf2\xdb\xf2\x0b\x7b\xa5\xea\xd8\x5a\xfb\x95\x2b\xee\xc2\xfc\xcf\xf8\x5f\xf5\x07\x2b\xa4\xed\x6b\x54\x38\xab\x15\x20\xc6\xef\x4b\x0b\x26\xf1\x2e\x84\xae\xdd\x65\xce\x5c\x7b\xbe\x6a\xcb\x67\x72\xf5\x93\xa6\xb4\xf8\x1d\xdd\x9d\x50\x27\x46\x50\x50\x47\xc8\x12\xa0\x06\x7a\xfc\xeb\x8d\xc9\xbf\xf3\x0d\x40\x87\xf8\xd5\xa3\x75\xec\xa6\x05\xa0\x62\x27\x84\xd8\xfe\xa2\x78\xcd\x1a\x52\x41\xad\x4b\x3f\x1b\x91\x4f\x74\xf7\x3b\xc3\x6e\xe7\xcc\x82\xd9\x6e\xfd\xa6\x3a\x3b\x67\x99\x73\x0f\x20\x65\x6c\x12\x35\x6c\x79\x06\x9b\x2b\xe6\xf9\xb7\x7b\xe1\x01\x98\x31\x18\x82\x3e\xa6\x6e\x7c\x20\x98\xfb\xc7\x2f\xc9\xc0\x39\xdf\xe3\x0f\x2d\xab\xa1\x3c\x3b\xde\xfb\x8a\x78\x0b\xeb\x5c\xb1\xb6\xc2\x86\xa6\xb3\xef\x48\xfd\x15\xc6\x6c\x04\x5b\xa2\x9f\x09\x70\x41\x3b\x98\x8d\x0e\xa0\x04\xab\x84\xc9\x39\x19\xf0\x4f\x9b\xf8\xca\xf5\x8c\x4e\xb4\x78\xf3\x58\xef\x8b\x68"}, +{{0xef,0x36,0x48,0xcb,0xe7,0x34,0x02,0xab,0x45,0x0c,0xd6,0xec,0x37,0xe5,0x45,0xd0,0xcd,0x2c,0x99,0x9e,0xcc,0x1f,0xa3,0x81,0xa4,0x5c,0x66,0x0e,0x18,0x53,0x30,0x32,},{0x52,0xa1,0xa4,0x52,0x73,0x87,0x26,0x76,0x58,0x2c,0xc7,0x67,0x33,0x99,0x26,0x41,0x4c,0xd5,0xd0,0x3d,0x98,0x0c,0xf6,0x29,0xdd,0xa2,0xd1,0xa2,0x05,0xe9,0x83,0x0a,},{0xf6,0x70,0x79,0x29,0x42,0xec,0x41,0x44,0x28,0x47,0x56,0x38,0x85,0x3c,0x42,0x72,0x8e,0x86,0xba,0x12,0xbb,0xe8,0x59,0x48,0xb3,0x91,0x34,0xcf,0x6e,0x2b,0xd1,0x28,0x13,0xe0,0xd8,0x3e,0x51,0xe6,0x57,0xc9,0x01,0x07,0xad,0x93,0xa4,0x78,0x8a,0xa3,0x83,0x13,0xfa,0x96,0x2f,0x67,0x67,0xa8,0xf7,0x80,0x5b,0xde,0x65,0xca,0x42,0x0d,},"\x6a\x93\x37\x8f\x88\x0c\xf0\xff\xdb\x8e\x07\xd6\x83\xcc\x35\x2e\x2a\x10\x33\xc4\x50\xba\xa0\xe8\xc4\xe1\x62\x05\xfd\x0c\x02\x74\x3b\x0e\xa0\x64\x97\x1d\x91\x1e\x49\x47\x13\xe6\xd9\x4a\x02\x17\x2e\xd0\x14\xd5\x06\x59\x2e\xc6\xc7\x0a\x9c\x97\x85\x52\x46\xbf\x3d\x26\xf3\xcf\x74\xf4\x93\xc1\xb6\x97\xa0\xc4\x14\x16\x0c\x34\x14\x12\x83\x09\x85\x43\x08\x06\xa0\xcb\x3c\x84\x75\xe7\xe5\xa9\x73\x68\x6c\x24\xd5\xef\x1b\xe7\xd0\x06\x50\x96\xfe\xb5\x2e\xab\x26\x0b\x5c\x48\x8a\xf0\x92\x70\xde\x6d\xec\xd3\x3f\xea\x85\x89\xdd\x10\x21\xba\xf4\x1e\x3f\x25\x5f\xb8\xfa\x19\x16\xeb\xd8\x53\x1e\xeb\x2f\x88\x6b\xb3\xb3\xb0\x4f\x9a\xf6\xb2\x76\xc3\x59\x23\xf1\x0d\x3a\x0a\xf1\xe3\xf5\x8b\x0d\x15\xae\xd1\x65\x04\x5f\x20\x6f\x3f\x43\x0a\xbd\xff\x09\x44\x90\x97\xe4\xb2\x6d\x00\xa8\xf9\xf1\xe8\xf7\xa1\x9f\x38\x58\x81\x24\xc3\x28\xec\x43\xa9\xcf\xb4\x3d\x3b\x2c\x6b\xdf\x6a\x3c\x1a\x10\x2e\x0e\x33\x3d\xe1\xac\x21\x4a\x6d\xf7\x6d\xab\x44\xba\x76\xbf\x03\x52\x73\xb7\xff\x62\x38\xec\x82\x48\x3b\x2d\x2d\x9d\x54\x29\x1a\x72\x27\x0f\x88\x93\x3b\x78\x6c\xac\x05\x1d\x99\x0b\x3c\xf7\x40\x84\x5f\xed\x3a\x67\x86\x7d\x7c\x7c\x05\x67\x4e\x7c\xb0\x2c\xa5\xb7\xac\xdf\xba\x38\x52\x80\x3a\x3d\x56\xc4\xd5\xc1\x3b\xb1\xd7\x72\x34\x67\x74\x1e\xac\x1f\x2a\x7a\xcd\x3a\x95\xf3\xa5\x16\x10\xa4\x86\xfc\x53\xa9\x85\x16\x28\xc5\x57\xd3\x6d\x8a\x4c\xd3\x7a\xae\x9c\x41\x74\xdb\xbd\xb6\xbd\x88\x5c\xf4\x0b\x38\x2b\x8d\xed\x24\xa4\x52\x2a\x27\x8f\xef\x76\xc4\x53\x19\x06\x7e\x55\x28\x6e\x7b\x08\xc6\x03\x48\x6e\x38\xa0\xac\xf4\x7e\xde\xf8\x48\xec\xbe\x94\x2e\xce\xad\xb8\x63\x6c\x83\x3f\xeb\x88\x2a\x51\xa4\x59\x5e\x24\xf6\x07\xca\x3c\x9d\xa1\xb2\x40\x4c\xe5\xc7\x47\xe0\x62\x64\x17\x4d\x64\x50\x43\x31\x70\x9b\xef\x30\x05\x5a\x5d\x69\x5e\x09\x53\x7c\x8f\x8c\x1e\x5a\x3a\x5d\xb0\x65\x99\xe3\x19\xdf\xdb\x28\x72\x96\x65\x27\x3b\xf8\x68\x95\x5e\xa5\x64\x27\xf0\x8b\xac\xd7\x77\xf1\x79\xb3\x02\xf3\xf6\x8d\x04\xf3\xf3\x88\x3d\x34\x49\x55\xb6\x55\xdd\xc6\xd5\x28\x2b\x6d\x4d\xf1\xd8\x36\x30\x21\x0e\x69\x91\x78\xe1\x1f\x72\x2e\x9e\x5c\xda\x67\x28\x92\xae\x9b\x23\xe8\x16\x9c\xbb\x54\x80\x93\xb8\x3e\x64\x3e\xb4\x99\xd9\x37\xd2\x8f\x38\x11\x59\x7b\x64\x84\x10\x2f\x0c\x8e\xb8\xc8\x88\x8c\xda\xc2\x29\xae\xbf\x89\x08\x6a\x64\x95\xac\x55\x1f\x3b\xbd\xf2\xd1\xc9\xa9\x3e\xd1\xd3\xa8\x61\xee\xcd\x9e\xb8\x39\x94\x9b\xfb\xe6\xa4\xf6\xe6\x48\x6e\xde\xda\xb5\x22\x9d\x53\x2b\x58\x97\x6d\x67\x51\x2f\x9f\x71\xae\x79\xb4\x14\x5c\xa2\xfa\x49\x7a\x16\x5f\x11\x07\x17\x66\x6c\xa3\x34\x0b\xbd\xa8\xdf\x1f\x82\xb8\xc0\x54\xcf\x76\x54\xc3\x56\x90\x16\x8f\x96\x27\x7d\x41\xc1\xc2\x36\xb6\x81\x98\x17\x3c\x6e\x2b\x0a\x20\x8e\xf8\x3c\x02\xa4\x3e\x47\x3d\x90\x68\x6a\xce\x75\xb5\xbd\x32\x1b\x3f\x54\x28\x13\x27\xa6\x73\xca\xd4\xd4\xad\x30\x40\xd4\x8c\xf4\x93\xea\x23\x1b\x3f\xec\x06\xf3\x99\x32\xd7\xf7\x0a\x38\x42\x8d\xf8\xfe\xe4\x37\x05\x32\xae\x5f\xb1\x12\x05\x9f\x0a\x1d\x4f\xbe\x11\xb5\xa2\x3b\xb8\x76\x35\x42\x9e\xd3\x3a\xd1\xf6\x14\x80\x14\xcb\xc1\x60\xd9\x3c\xa2\x59\x20\x53\xa6\xe9\x53\x78\xd6\xcd\x3f\x50\xdb\x52\xbe\x92\x8e\x40\x92\xfe\x5d\x2b\x70\x95\xa9\x56\x68\x64\xad\xfd\xa5\x9f\xd5\xf2\xfb\x62\x54\xbd\x59\x17\xb7\x0f\xa1\x46\x99\x66\x5a\x37\x29\x7c\x98\x3c\x1b\xb9\xef\xe1\xc6\x7b\x41\x3d\xd1\xa8\x53\x0c\xbf\x22\x72\x97\xa8\xbb\xf9\x3a\x8a\x02\x45\x4e\x8e\x46\x1a\xc2\x12\xb8\x46\xa7\x0d\x5d\x56\xd6\xc3\xa6\xe6\x5a\x03\xbe\x05\x80\x21\x9b\xdd\xec\x88\xd4\x03\x89\x11\xfd\x95\x74\x56\x3f\x33\xe0\xf9\xe6\x04\x46\x88\xd3\xdd\x48\xfa\xc7\x03\x86\x9a\xa0\x9d\x96\xef\xee\x7d\x6c\x68\x07\x1d\x99\x22\xd5\xe8\xed\x8d\xc4\x0f\x1b\x79\x8f\x1c\x58\x0f\x78\x59\xcb\x84\xf1\xe1\x4b\x5e\x74\xdd\xea\x16\xad\x5c\xbe\xea\x4c\x48\xfb\xcf\xfd\x29\x53\x1a\xcc\xc0\x63\x39\x38\xe3\xbc\xb2\x21\x26\x76\xb6\x1e\xf9\x01\xe9\xc8\x31\xa4\x17\x74\xd8\x31\x7e\xf3\x5a\xf7\x69\x90\xbd\x24\x93\x1f\xde\x6d\x40\x7e\x22\xe7\x63\xcf\x6a\x57\x90\xb2\x37\x61\x90\x8e\xee\x60\x96\x37\xa2\xc1\x10\x59"}, +{{0x2c,0x8e,0xe7,0xfa,0x9b,0xa2,0x8c,0xe7,0x04,0x96,0x76,0x08,0x7b,0x11,0x63,0xb2,0x41,0x11,0x8d,0x34,0xcd,0xf5,0x34,0xae,0xbe,0x8b,0xa5,0x92,0x82,0xa6,0x2a,0xc2,},{0x24,0x4c,0x24,0xf5,0xec,0xb2,0xdd,0x1d,0x14,0x63,0x51,0x22,0x21,0x32,0x5d,0x73,0xc8,0x1e,0xe4,0xd8,0xad,0xb8,0xe0,0x1e,0x23,0x34,0x5c,0xaf,0x9c,0xa5,0x35,0x3b,},{0xca,0x0b,0xb6,0xc1,0x23,0x56,0x55,0x5f,0x6e,0x1d,0x8f,0x5c,0x8a,0xa7,0xb5,0xe8,0x0c,0xd2,0x80,0xe8,0xb1,0xb9,0xba,0x2e,0xc9,0x55,0x0f,0x62,0x2f,0x48,0x2c,0x3a,0x9a,0xd3,0xbe,0x03,0xa4,0xc9,0xdf,0xc1,0x0d,0x01,0x12,0xb0,0x18,0x9d,0xe9,0x4b,0xff,0xaf,0xd7,0x03,0x41,0x14,0xe0,0xe0,0xd4,0x2c,0x23,0xf3,0x2d,0xc8,0x18,0x07,},"\x07\x66\x9a\x89\x64\xf0\x63\x80\xd2\xd4\x98\x2c\xb6\x34\x9d\xe5\x50\xb3\x8c\xbc\x35\xdb\x2c\xe5\x72\xde\x88\x7f\x66\x30\x55\x73\x6f\xaa\xc7\xec\x07\xc3\x2d\xf6\x0e\xe2\x59\x84\x22\xbf\x37\xe7\xcf\x31\x9a\xb3\xc9\x05\x56\x08\xca\x0c\x49\x75\x7d\x76\x88\xe2\x01\x3b\x82\x44\xf3\x54\x04\xf4\x5a\xc2\x19\x49\x7f\xe9\x24\xde\x93\xa5\x8d\x0f\x72\x1a\xed\x78\x25\xf6\x3b\x26\x67\x07\x7c\x16\x1e\xb4\xdd\x8b\xf7\xdd\xbd\xbb\xc1\x9a\x9e\xae\x59\x78\x97\x8d\x5a\xeb\x33\xa0\x6d\xde\x18\xe6\x12\xe0\x5b\xdb\xca\xe0\x16\x1a\xa2\x38\x90\x38\x02\x64\x29\x96\x0d\xda\x3a\xa1\x7e\x96\x7d\x10\x77\x3c\xa4\x97\x35\xd8\xec\xd7\x40\x9b\xe1\x65\xc0\x9b\xb0\xb5\x09\x69\x1d\x59\x1c\x18\x5c\x93\xcd\xee\xae\x95\x35\x23\x16\x54\x46\x80\x52\x38\x21\x45\x8c\xac\xcf\x52\x8a\xc0\x45\x4e\x4c\xdd\xc6\xdf\x0d\x1e\xa5\xf1\xf5\xcc\x1e\xee\xe0\x5e\x19\xa2\xad\x0b\x6a\x49\x73\x6e\xd8\x55\x23\x36\xfc\xfc\xad\xbd\x93\x1b\x0b\x8e\x96\x3b\xe0\x5c\x8e\x70\x37\x38\x85\x52\x51\x2b\x68\x23\x58\x3e\x4a\x14\x38\x4c\xef\x50\x29\x23\x2d\x3e\x0b\xaf\xe4\x66\x35\x1b\x4b\xb3\xf5\x67\x54\x5a\xb4\x1f\xa4\x6b\xff\xaf\xa8\x77\xa1\x2b\x38\xa2\x7a\xbd\x64\xf7\x7f\xbb\x4d\xb4\x66\xff\x7f\x70\x65\x04\x14\x1d\x3a\xdd\x0d\x73\x72\xf1\x6f\xe3\xd8\xc6\x9f\x62\x99\xd9\x39\x66\xd6\x24\xa3\x07\x0e\xad\xb8\xb4\x9f\x29\xfa\xb4\x84\x4c\x75\x28\xa2\xa4\x0b\x66\x98\x70\x60\x69\x5c\xaa\x66\xb8\x67\x18\xc5\x10\x49\xac\xf4\xcf\xad\x38\x53\xed\xb4\x92\xe3\x68\xcb\xd0\x73\x96\x8e\xca\xa4\xa1\xee\x60\x46\xb5\xe8\x26\xe9\x01\xf4\xa8\x08\xc0\x42\x7c\x02\x6f\xe2\xf7\xb2\xe1\x96\x86\x67\xb5\x3a\x7d\x36\xd7\x02\xf2\xff\x82\xc6\x42\xd3\x49\x19\xf8\xe9\xaa\xaf\xe4\x62\xa3\xd4\xf9\x26\x92\xde\xac\x75\x2b\xe3\x48\xf5\x4c\xf0\x89\xdd\x9c\xd0\x51\x84\x6b\x04\xb7\x19\x31\xe1\x9e\x89\xd1\x25\x86\x4b\xfa\x89\x48\xac\xe0\xef\xf3\x3c\x45\x11\x05\x69\xa0\xdf\x37\x53\xf4\xc5\x8d\x80\x02\xb5\xbc\x38\x10\x2e\xc2\xec\xf6\x95\xfa\xfa\x89\x16\xda\x90\x02\x38\x7e\x44\xf9\x6d\xab\xf8\xa9\x82\xc5\x3c\x9b\xad\xbc\x37\xbd\xe4\x37\xf1\x46\xf7\x7d\x8f\x7b\xaf\x12\x87\x31\x96\xb0\xc3\x61\x93\xaf\x55\xf5\x42\xd9\x96\x8a\xed\x80\x69\xab\x9f\xbc\xd6\x81\x4e\xc4\x72\x79\x9a\xd0\x9c\x73\x0d\x41\xed\xde\xca\x3b\x62\x69\xd3\x1a\xb5\x23\xb5\x95\x47\x07\x73\x76\x34\x5b\x05\xf2\xae\x69\xb4\xee\x72\x8c\x86\x3d\x1b\xc0\x4e\x9b\x7d\x3d\x0f\xcc\xeb\x35\x9c\xbd\x08\x58\x59\x7a\xf2\xd6\x06\x3e\x25\x3f\xae\x2c\x3f\x25\x03\x4c\x33\xed\x59\xed\xd2\x78\x28\x68\x29\x86\x81\xca\xf5\x64\xdb\x8d\x19\x36\x6f\x34\xea\xe8\x5b\xa7\x3c\x1e\x23\x89\xb0\xdd\x78\xa9\xd2\xca\xa0\xf2\x3c\x9a\xd5\xf6\xcd\x9f\x2c\x4a\xd5\xd5\x89\x46\xad\xb7\x18\xcb\x83\xda\x58\xe2\xfc\xbb\x60\x25\xbe\xf4\x66\x0a\x83\xe0\xaf\x55\xe2\x03\x08\x02\x93\x2f\x2a\x89\x6a\x09\x60\x79\xb7\x54\xc9\x9f\x7b\x64\x23\xb4\x5a\x86\x47\x2e\x67\x23\xef\x88\x96\xc4\x32\x4c\x73\xd3\x4a\xd5\x8a\x4c\x01\xb3\x8a\x97\xc7\x3b\xe5\xaa\x7f\x74\xa2\xfa\x4d\x07\x95\xaf\x6d\xbf\xcd\x6d\x4e\xb4\x42\xa7\xe2\x04\xdb\x4e\xcb\x1f\x8a\x22\x6b\xdf\xa2\x1b\x6e\xb1\x71\xc9\xe5\x9f\x1a\x19\x2e\x23\xa7\x6c\x35\x2b\x04\xd8\xa8\x02\x33\x98\x5b\x77\xa2\x9c\x02\x01\x19\xce\x65\x1c\x7f\x41\x83\xd0\xe9\xc1\x9f\xe1\x8a\xa1\x02\x0c\x25\xe4\x58\x9d\xee\x34\xb9\x01\xbd\xaf\x9f\xf9\x45\x0c\x91\xaf\x3c\x1d\xb6\x70\xb4\x77\xe0\xac\x21\x07\x69\x6c\x9e\xc0\xd3\x1d\x82\x64\x7b\x68\xea\x19\x49\x9f\xe3\x4a\x8e\x2e\x7b\x37\x8d\xc7\xe7\x54\x24\xe8\xc4\x56\x45\xb0\xc2\x81\x8e\x9f\x88\x5a\x1c\x58\x41\x5b\xba\x1c\x3f\x2a\x77\x54\x9b\xdc\x46\x80\xdb\xcd\x16\x50\xc7\x5d\x0f\x45\x2a\x6b\x20\x85\x91\xdf\x0f\xa6\xe1\x81\xda\x2a\xbf\xab\x44\x46\x21\xd5\xf7\x7c\x2c\xd7\x95\x56\x46\x72\x46\x44\x7a\x89\xf0\xaa\xac\xad\x66\x0c\x9a\x92\x5e\xba\xfb\xad\x43\xc4\x78\xa3\xc8\x50\xa2\x7e\x01\x01\x9d\x88\xa5\xb1\xdc\x81\xb5\xd2\xe9\xf7\x40\xa0\x28\xcc\xb7\x2c\x1a\xcf\x89\x7e\xa5\xad\x89\xe0\xf9\x44\x88\x88\xd5\xb1\x5c\xe6\xe4\x29\x77\xf7\xa7\x29\x15\x5a\x28\x4d\x11\x87\x58\xac\x65\xf3\xfb\xb9\x8d\xeb\x65"}, +{{0xdd,0xd8,0xe9,0xff,0x85,0x56,0x79,0x89,0x6a,0x13,0x97,0xb4,0x27,0xdb,0x85,0x43,0xab,0xe8,0xbb,0x5d,0xd1,0x22,0xe3,0xe3,0x02,0xcc,0xfc,0xe5,0xfd,0xc6,0x3e,0x12,},{0x5a,0x9a,0x31,0x2e,0x89,0x2a,0x10,0xb9,0x8d,0x0d,0xcd,0xd2,0x8d,0xb3,0x48,0x1c,0x3c,0x28,0xad,0xd5,0xad,0x0b,0x19,0x46,0x16,0xda,0x4a,0x3d,0xf7,0x66,0x01,0x09,},{0xdf,0x84,0x9b,0x7b,0xd2,0x97,0x45,0xf8,0xbe,0xcd,0xdd,0xf6,0xc9,0xba,0xf0,0x94,0xd7,0xa9,0x8c,0xc9,0x33,0x8c,0x34,0x4e,0xca,0x17,0xfd,0xe0,0x75,0xfd,0xa8,0xd1,0x54,0x32,0x99,0xf6,0x25,0x98,0x23,0x17,0xdb,0x7b,0x3c,0x77,0x3b,0x64,0xf7,0xd1,0xf2,0x86,0x92,0xac,0x45,0x3b,0x81,0xd7,0xec,0x7b,0x7e,0xc3,0x41,0x7a,0xce,0x04,},"\x5e\x8f\xee\xc5\x09\x35\x0d\x2e\xe7\x95\x5b\x6f\x3e\x27\x82\x78\xa4\xcb\x48\xae\x72\xb4\x65\x89\xe4\x78\xbe\x59\x74\x7d\xf5\x39\x4a\x16\x9f\x19\xe1\x0d\xb5\x32\x02\xa6\xa5\x23\x20\xb6\x3a\x9a\x2b\x72\x3f\xd3\x1a\xa2\xdb\x6d\x58\xc5\x73\x32\xda\x31\x78\xbc\xf9\x66\xc5\x3a\xbd\xa3\x5f\x12\xda\xef\x9e\xdc\xf3\x99\xe4\xa8\xc5\xf8\x3d\x36\xf4\x4a\x17\xd7\x98\x46\xbf\xc9\x6c\xe6\x90\x19\x4c\x21\x9a\x29\x89\x2f\x03\x67\xa7\xab\x38\x44\x83\x78\x79\xe3\x81\x8d\xb8\xd7\x0c\x4e\x3f\xba\x4d\x28\x07\x34\x64\xdf\x20\x85\x95\x10\x38\xfe\xa4\x32\x81\xb6\xb6\x06\xdc\x88\x46\xb3\x0b\x07\x63\xf2\xca\x82\xbd\x50\x21\xf9\x11\x70\x35\xa7\x7b\xcd\x10\x75\x47\x7c\x5f\x43\x21\x43\x34\xd4\xd4\xce\xdd\x18\xf7\x38\xd6\x76\xc7\xb5\x1a\x18\x5f\xfa\x8d\x04\x10\x11\x86\xa4\x95\x2b\xbd\x87\x22\xf5\x39\x90\xb6\x06\x37\x04\x1e\x11\x4a\xeb\x8c\xe7\x11\x11\x31\xd4\xdb\x3f\xb4\xd3\x5d\x99\x5a\xd8\xd6\x65\x0c\x0c\x4c\xcd\xce\x9d\xcc\x39\xdb\x18\x8a\x68\x78\x55\x62\x74\x06\x26\xb3\xae\x3e\x02\x3f\x40\x77\x2d\xed\x87\x6a\x45\xcb\xef\x74\xa0\x58\xfd\x78\xc1\xa1\xff\x2c\x24\x51\xe1\x11\xac\x1b\x4b\x7e\xe4\xc8\x1c\xd7\x63\x10\xd4\xd2\x98\xfb\x3c\x49\xf5\xe6\x40\x19\x08\xa6\x30\xfa\x85\xdb\x74\x71\x80\x4f\xe9\x90\x84\x7f\x0f\x75\x94\x72\xf5\x93\xdc\xf0\x2e\x11\x3e\x15\xe5\x64\xd3\x0d\x59\x84\x69\x2d\xa5\x5b\x0b\x7f\x22\x19\xc4\xac\x16\x26\x51\x1a\xcf\x19\x4d\xc7\x02\x6e\xb9\xd3\x67\xa4\xa2\xf1\xdf\xb5\x15\xcb\x2c\x08\xda\x4f\xe5\x95\xc8\x58\x11\x12\x0c\xba\x2a\xe7\xb6\x6e\x67\xc9\x1f\xb8\xfb\xcb\x9d\x99\xf1\x3e\x50\xfd\x67\x46\x4d\x90\xc8\xdc\xf6\x93\x55\x23\xcf\x6d\x13\xfd\xd1\x06\x35\xb9\x23\x2b\x7a\x61\xdc\xec\x9a\x2b\x92\x10\x61\x41\x0d\xf1\xde\x6a\x45\x16\x7f\xb9\xf6\xf1\x09\xdc\xc0\x88\x91\xf2\x03\xb2\x74\xa3\xb6\x82\x71\xb3\xf3\x5e\x74\xf9\x4b\xdc\xed\x0c\x5f\xf8\x63\x71\x73\xa1\x76\xe7\xda\xcc\x81\xf2\xcd\xc4\xfb\x0d\x52\xd1\xdf\xa7\xf2\x7b\x55\x2f\xd8\xd8\x7a\x1c\x55\xd6\x94\x7f\xd9\x2e\xd3\x25\x3f\x95\x94\xdb\x7d\xf1\x7a\x7f\xc6\xa7\x5e\xcf\x4f\xaa\x4d\x1e\x21\xb6\x76\xb3\x72\x7d\x77\xfb\xd4\x3f\xa7\xbe\x76\xbf\xb5\x8f\xc3\x09\xe5\x67\x5f\x0a\x85\x9c\xc4\x7f\x37\xb1\xbf\x45\x59\x32\xd8\x24\xe8\x63\x78\xde\x7a\x7e\x8c\x40\xce\xd2\x20\x90\x04\x4d\xbb\xf9\x1c\x70\xe5\x28\xea\xcd\xef\x37\x85\xba\x3c\x69\xa3\x73\x5a\xf6\x70\x9c\xd7\x6a\xab\x28\xa6\xac\xa6\xe8\x44\x97\x4b\x10\xb3\xfb\x7b\x09\x86\x00\x7a\x72\x7c\x2c\x8f\xc9\x5b\x25\xf3\x1f\x14\x6b\x36\xac\xd4\xc5\x37\x07\x49\x20\xaf\xf2\x47\xde\x0f\x17\x9c\x13\xca\x57\x79\x0a\x6a\x71\xd6\x2e\x23\x32\x1c\xcc\x75\xb7\xf3\xb0\xaf\xa0\xd0\x35\x27\xc9\x11\x4a\x7d\x4e\x30\xc1\xac\xe6\xd7\x71\x20\x13\xde\xe6\x66\x99\xaf\x9c\x56\x1c\x44\xae\x61\x98\xed\x39\x10\x4e\x60\x61\xae\x2c\x45\xa9\xa3\xc7\x4b\x5d\x0f\xbc\x4a\x33\xe8\xdf\xe2\xa8\xac\xc9\x51\x1e\xf7\xe6\x56\x71\x33\xf9\xfe\x35\x54\x28\x4a\x75\xa0\x59\xa6\x49\xdd\x24\xec\x04\xa5\x77\x30\xc6\xd2\xe9\xbf\x11\x4e\xa5\x8a\x89\x94\xab\xdb\x0c\x19\x43\x24\x15\x72\xc7\x9e\xad\x04\x3a\xd1\xc8\xca\xaf\x5c\x9d\xa5\x3d\xd0\x55\x22\xfe\xbc\x40\x33\x54\xd6\x2f\xe3\xff\x93\x88\x2d\xf7\x5f\xb2\x94\x58\xd2\x2e\x69\x96\xc3\x5b\x69\xfa\xae\xf2\xe0\xc4\x16\x38\x86\xcb\x3c\x3d\x0f\x60\xe1\x50\xd3\x63\xd6\xdb\x59\xfe\xfc\x62\x6b\x1b\xbb\x1e\x05\x2a\x62\x41\x4c\x4b\x78\x56\xd7\x20\x93\x43\x2b\x08\xf8\x21\xbc\x78\x4a\x5a\x6b\x0b\xc2\x64\x9c\x2d\xaa\x50\x86\x58\x98\x0d\x80\x22\x91\xe7\x34\xab\xaf\xf0\x6a\xfb\xf2\x79\x5e\x4e\x35\x4d\x52\x21\xdc\x4f\x52\xcc\x96\xd6\xb8\xcf\x18\x08\xb1\xa8\x20\x8d\xb7\xda\xa8\x0a\xb7\x10\xc5\x6a\x8b\x0e\x9c\xb8\x08\x1d\xee\x93\xf5\xf0\x15\xf0\x76\x64\x46\x3a\x3d\xcc\xff\x7c\x8a\xd1\x99\x23\xa9\x7e\x39\x04\x5b\xcc\x4d\xce\x0a\x73\xd4\x9c\x56\xd5\xe9\x37\xbd\x11\xe6\x18\x23\x40\x1c\x06\x62\x06\xe3\x13\xe6\x0b\x47\x53\x7e\x34\x70\x4d\x7d\x35\x15\x55\x9b\xb9\xd0\x53\x2d\x02\x8e\x28\xa5\x7a\x87\x9f\xd6\x17\xcc\x61\xf7\xf7\x76\xbd\x6a\x00\x8c\xd4\xf8\x12\x37\x8e\xd3\x7f\x39\x4b\xb9\x7e\x6e\x75\x6d\xa8\x19"}, +{{0xa8,0x86,0xf4,0xd3,0xf3,0x4e,0x32,0x0e,0xc6,0xd5,0xf4,0xca,0xa8,0x63,0xf8,0x14,0x77,0xdf,0x77,0x2e,0xff,0x97,0xe6,0x4a,0x37,0xa0,0x5f,0x42,0x11,0xd1,0x90,0xa8,},{0xe9,0xbc,0x96,0xc8,0x1e,0x87,0x81,0x10,0x26,0x8b,0x55,0xde,0xf7,0xea,0x40,0x07,0xa4,0xef,0x9f,0x54,0xd3,0x83,0xd5,0xfb,0x0f,0x6d,0x43,0x43,0xe1,0x01,0x0f,0x38,},{0xab,0xf2,0x83,0xdb,0x1f,0x80,0xc5,0x4c,0x58,0x3b,0x49,0x9d,0xbe,0x20,0xaa,0x04,0x24,0x8c,0x1d,0xce,0x12,0x1f,0x39,0x11,0x67,0x78,0x13,0xac,0x3e,0x01,0x1f,0xd1,0x59,0xad,0x0b,0xf7,0x6b,0x1a,0xa7,0xcc,0x7b,0x14,0xd7,0xb5,0x50,0x84,0x86,0x88,0x25,0x2a,0xcc,0x7f,0xec,0xe9,0x04,0x87,0x24,0x0c,0x3d,0x39,0x9d,0xd3,0x43,0x08,},"\x8b\x83\x1b\x87\x7b\xc3\xa9\x9f\x61\x3c\x89\xcd\xa6\x98\xb3\x75\x9d\x64\x38\x22\xb5\xa8\x8f\xaf\x38\x22\xec\xb2\xce\x98\xf6\x71\xd7\x55\x43\x21\xb2\x4b\x74\xb4\xe3\x0a\x66\x3f\x7a\x55\x70\xae\x91\x7f\x47\x9b\xda\x29\x89\x4b\x1a\x8c\x02\x8c\x9d\x19\x3e\x4e\x7a\xc1\x19\x16\xdd\x8e\x9c\x3f\x0e\xc0\xef\x80\xbd\x27\xfd\xfe\xee\x80\xc1\x70\xc7\x81\x40\xb2\x4c\x15\x27\x14\x15\xac\xf7\x5c\x26\x95\x6a\x4d\x4b\xf9\x9d\x40\xe8\x61\xe9\x07\x83\x20\xd0\x97\xe1\x25\x9e\x5e\xc1\x7b\x58\x3a\x95\xe5\x24\x30\xdd\x8c\x00\x8e\xd8\xc7\xdd\x1d\xe1\xbe\xcd\xd1\xe6\xbf\xec\x4b\xf3\x34\x7a\x22\xdd\x24\x9f\x3a\xc3\x07\xa2\x94\x5e\x91\x37\xfa\x4a\x8c\x26\xc8\x02\x10\x77\x23\x9c\xb3\x24\x81\x6a\x8d\xad\x32\xb0\x1e\xe3\x4a\x08\x90\x30\x98\xcb\x9c\x42\x45\x29\x1b\x90\x3c\x96\x27\x07\x40\x95\x24\x9e\x78\x28\x13\x47\x70\x32\xba\x32\xef\x04\x1a\x07\x48\x6e\xb4\x47\x8c\x57\xb9\xd5\x32\x26\x9a\x4a\x47\xcb\x5e\x97\x4d\xf7\xe0\x10\x96\xfb\xe4\xf1\xcc\xd4\xe6\x63\x66\x34\x87\x97\x4c\x62\xcd\xd9\x4d\x77\x71\x6c\x84\x79\xd7\x9f\x6b\x6a\x7d\x9c\x15\x59\x88\xcf\x39\x02\xfb\x69\x74\x24\x96\x3e\xc4\xec\x34\xff\x2a\x35\xd7\x42\xc4\x45\x5a\x59\x3b\xac\xff\xc4\xd9\x69\x9b\xa7\x62\x6c\x76\xcb\x1a\x61\x62\x53\x75\x18\x87\xf6\xff\xe2\xbe\x20\x8c\x71\x3d\xf1\xab\x63\x6d\x72\x2e\xa0\x6c\x1c\x03\xa5\x7f\x2c\xec\x08\x03\x86\x6c\xca\x33\x35\xc2\x8b\xf4\x1c\x7d\xef\x81\xac\xb3\x88\x58\xdc\x10\xe5\x94\x67\x20\x86\x24\x96\x7e\x2e\x22\xd9\xe5\x66\x1b\xb9\x45\xf9\xe0\x51\x76\x87\xdc\x80\xf9\xb8\xfd\xec\xc8\xa9\x76\x00\xb6\xc2\x19\xa3\xb2\x3a\x90\xb6\xd1\x8a\xaa\xce\x2c\x78\x40\x0f\xf3\x8c\x8c\x05\x96\x7f\x54\x4b\x6a\x60\x6c\x71\xac\x19\x9e\xaf\xd0\x7e\xb5\x84\x8d\xf1\x65\x7e\xfb\x23\x3f\xba\xba\xe6\x3a\x05\x63\x81\x91\xa0\xaf\x74\x84\xa1\xba\xe1\x58\x13\x75\x67\x2c\x57\x1e\x26\x4f\x60\x42\x25\x17\x3a\x54\xa3\x8d\xd6\x2a\xe7\x13\x0d\x05\xdd\x29\x1a\xd1\x23\x54\xde\x86\xa6\xe1\x13\xe8\x3f\x6d\x66\x85\x16\x15\x7b\x79\x67\x02\x0d\xc6\x51\x7d\x8c\xf4\x2d\xd7\xb1\xa8\x97\xfe\x1b\x4e\x04\x55\x3c\xe2\x6e\x29\x99\x80\xaa\x5f\x7c\xe0\x17\x9b\xf4\x95\x4f\x01\xc2\xa2\x36\x54\xe5\xe9\x73\x1e\x14\x47\x34\x7f\xa4\x3a\xa8\xb2\xcb\xd6\xd4\xb2\xdf\x93\xfa\x54\xaf\x71\xe5\x02\x8a\x6d\xa8\xc7\x1e\xf3\xc5\x0c\x0d\xe2\x4d\xca\xee\x78\x56\x78\xe9\x2a\xaf\xab\xeb\x23\x3b\x01\x1f\x45\xc1\x06\x49\x65\x08\x5d\x25\x47\x05\x0f\x21\xc6\x52\xaa\x53\x3a\xfe\x91\x8a\xa0\xf9\xbd\xaa\x26\x07\xb8\x73\xcc\xd3\xdb\xd1\xd3\xa8\xcc\x62\x17\x2c\xeb\x43\xb9\x21\xef\x6b\x25\xc0\x6b\x09\x92\xe4\xdf\x2b\x91\xe3\x71\xb0\xef\x2b\x39\x47\x38\x8d\xae\xc8\xec\x6f\x7e\x38\x67\xd1\xf6\x10\x72\xaf\x59\x01\x54\xfa\x61\x9a\x07\xf8\x7e\x02\xbd\xdc\x74\x06\x31\x42\x70\xaf\x1c\x15\xe8\xee\x88\xb3\x9c\x01\xbe\x60\x2e\x4f\x0b\x52\xd9\xa0\x72\x4e\x71\xed\xdd\x7f\xa9\x13\x41\x69\xc5\xfa\xab\x91\x59\x79\xee\xa9\x36\x2d\x0f\x1f\x91\x60\x26\x81\x62\xdd\x38\xdb\x02\xfc\xfb\x41\x35\x0a\xa0\x8e\x1e\x14\x09\xb2\x28\x8d\xb1\xfe\x4a\x0e\x58\x6b\x59\x10\xf4\xde\x89\x4b\xf9\x97\x4f\x6a\x49\x83\x01\x3a\x19\x0e\x7a\x73\x6d\x14\xec\x54\xc3\x64\x4a\x3e\xe9\x58\xa5\xbd\xfb\xcb\x62\x97\xab\xa4\x3a\xf6\xc7\x27\x46\xbb\x13\x54\x10\x50\x7d\x8f\xdd\xe7\x3a\x2a\x48\xb7\x46\xf9\x18\xbe\xf9\xed\x92\xc5\xbe\x62\xdd\x55\x23\xfe\x14\xb1\x6d\x63\x84\xca\x46\xef\x59\xb2\x18\x5f\xe9\x33\x38\x3a\x2c\x7a\x9b\xf0\x2d\xa9\xd0\xfd\x8b\x0c\x7d\x7b\xde\x6b\x43\x9f\x99\x60\x15\x5e\x34\x5d\x68\x5d\x4d\xc3\xc7\x14\x04\xd6\x56\x81\x19\x23\xaa\x3c\x47\xd4\xb0\x9a\x0b\xae\xf0\xa1\x2e\x75\xb6\x43\x9b\xa8\x13\x5d\xb1\x58\x65\x87\x42\x22\xcd\x7a\xa4\x28\xf5\xca\x5c\xe5\x14\x0e\x22\xff\x92\x69\x7f\x37\xfc\x70\xb5\xb4\xc9\x4d\x33\x14\xe6\xaa\x16\xb2\x14\x6b\xca\x4f\xc9\x41\x57\x95\x1f\xc4\x92\x45\xda\x53\xf6\xc4\x3d\x1b\xeb\xd8\x94\xe3\x1a\x13\x49\x88\x4d\x71\x1b\x55\xdb\xe7\x78\xff\xa7\x27\x16\x5c\xf7\xcb\x67\x64\x35\x86\x6c\x2d\x2c\xb8\x39\x74\x5c\xa4\x01\x66\xa2\xf7\xcf\xc7\x7a\x84\x24\x68\xb5\x1a\x8e\x76\x57\x5f\xc9\xdd\xfb\x5f"}, +{{0x49,0x7e,0x3e,0xbd,0x9e,0x4c,0xaa,0x81,0xc5,0xa8,0x97,0x3d,0x52,0xf1,0xd2,0x3f,0x60,0xc1,0x34,0xca,0x53,0xf6,0x2a,0x85,0x3a,0x0a,0xc0,0x43,0xe5,0x1c,0xb5,0x17,},{0x71,0xc0,0xca,0x7c,0xfa,0x05,0xca,0xfa,0xbb,0x14,0x3d,0x84,0xae,0x41,0xde,0x83,0x84,0x6f,0x42,0xc7,0x7c,0xaa,0x7a,0x91,0xa2,0xe3,0x48,0x39,0x7d,0x07,0xd5,0x2f,},{0x12,0x74,0x08,0x39,0xb3,0xc9,0xf1,0xba,0x87,0x98,0x96,0xdf,0xf6,0xd7,0x25,0xe8,0x4e,0x04,0x43,0xef,0x96,0xc3,0x49,0xef,0xf9,0x4d,0xc4,0x83,0x31,0x43,0xe5,0xb4,0x19,0x80,0x4d,0xa9,0xdb,0x11,0x8a,0x95,0x92,0xb1,0xb1,0xca,0x48,0xaf,0x18,0xf7,0x5b,0xef,0x1c,0xa4,0x68,0xa1,0xa5,0xc7,0x4c,0x7a,0xc8,0x13,0xbb,0x2c,0xf3,0x06,},"\xe1\x32\xf9\xd6\x7b\x17\x29\x38\x9b\x82\x8a\x9f\xae\x05\xa6\x7a\xa5\x7f\x0e\xf7\xe7\xd4\xd1\xba\x24\x4d\xec\x87\x04\xdb\x96\x95\x65\xd1\xca\xb8\x09\xe4\x8f\xc0\xab\xf9\x50\xbc\xd4\xa3\x7d\x97\xae\xac\xe6\xda\x54\x6d\x49\x14\xcb\x5b\x86\xd6\xab\x18\x1d\x83\x18\x70\xc3\x09\xbc\xa6\x16\x46\x8f\x2a\x34\xd3\xdf\xaf\xcd\xbb\x75\x80\xb0\xc5\xd9\xff\x98\xe2\xc5\x4e\xc8\x03\xbe\x0d\x3f\xda\x1d\x4b\x8c\x0d\x77\x09\xc8\x9e\x68\x0b\x00\x8b\xf9\xb8\xd9\x03\xb5\xe9\x34\xb0\x19\x70\x5f\xe0\xb0\xc8\xcf\xbc\x3c\x09\x67\x84\x3b\x0a\x1f\xa1\xb3\xf1\x62\x77\x6e\xbe\x96\xb7\x40\xed\xd6\x4a\xd7\xc3\x5b\x3f\xd1\xa0\x85\xc9\x9d\x16\xf5\x41\x67\x82\xde\x17\x35\x85\x87\x47\x0d\xd1\x3b\x51\x94\xf2\x0f\x23\x23\x2b\x2f\x70\x2f\x10\xaa\xfc\xaa\x59\xc7\x06\x6f\x24\xc4\xc4\x71\xe4\x2f\xa8\x6c\x6b\x9c\x5c\x3e\x1e\x8f\x83\x65\xf4\xdd\x75\xac\xb3\x2f\xff\xc0\x53\xc9\xaf\x41\xc6\xfd\x2e\xfa\xc3\x0e\xcf\x6a\x2d\xd0\x08\x5d\xe9\xb1\xd8\xcd\xc5\x0b\x16\x60\xa8\x66\xdf\x77\x67\x19\x8b\xd9\xc8\x73\x70\x61\x5d\x2b\xca\x99\xf7\x7b\x84\xd9\x8d\x7b\x24\xc9\xc2\x0f\xd7\x76\x8f\xd0\x38\x0d\x6b\x37\x36\x03\x40\xd1\x35\x98\x04\x78\x20\xdc\xed\x88\xa8\xd4\x2d\x57\x29\x37\xb6\xef\xa1\x69\x21\xa1\xb2\xb2\xd0\xeb\x93\x16\x73\x07\x08\x38\xe6\x11\xe6\xc0\x23\x29\x0d\x86\xfe\x90\x2f\x14\xac\x3a\xcd\x02\x9e\x33\x97\xfe\xb9\x7b\x17\x16\x62\x45\xab\x40\x7a\x76\x6d\x2e\x09\x04\x42\x4d\x33\xcd\x3d\x6e\x2e\x62\xa5\x2c\x65\xdf\x7c\xf0\x04\xd1\x41\x5c\x0b\x43\x0c\x11\x27\x62\x3d\xab\x27\x2a\x2c\x2e\x2b\x43\xe0\x2b\x48\x1b\xe9\x28\xe8\x99\x54\x27\x28\x32\xbe\x09\x8b\x50\x2b\x8b\x56\x43\xc6\x74\x82\xf5\xde\x44\x03\x03\x25\x81\xf0\x8a\xfb\x0a\xea\x48\x86\x85\x82\x60\x7b\xb3\x91\x98\xc1\xbf\x13\xa8\x69\xb6\x32\x58\xa7\x58\x90\xb6\x94\x45\xff\xd3\x45\x64\x02\x3e\x47\xf8\xb1\x88\x4a\x5e\x49\xb7\xd9\x42\x5f\x28\xd5\x15\x30\x13\xfe\x37\x55\xc6\xcb\x11\x4d\xb1\x80\xe6\x0b\x3d\xc4\xad\xb3\x6a\x21\x42\x81\x28\x00\x5a\x77\x2f\xb5\x71\x89\x34\x55\x65\xbb\xd1\x75\x98\x13\x52\x3b\xad\x62\x85\x5e\x79\x28\xee\xf5\x88\x0d\x3b\xff\xf1\xd0\xec\x65\xc2\x45\x92\x33\x5c\xda\x47\xcf\xcc\x5b\x5f\xa6\x52\xb4\x72\x63\x22\x52\x24\x84\x6a\x20\x9a\x3d\xd7\x76\x66\x61\xfc\xa4\xcc\xca\x59\xc4\x56\xfc\x9c\xc3\xe1\xcf\x80\x42\x55\xaa\x5f\x39\x7b\xab\x19\x98\x04\x33\x6b\xde\x29\xe5\x5c\x6c\x37\x7d\x58\x3f\x08\x2c\xe6\x47\x23\x73\x9e\x4f\x02\x46\x06\xf9\x06\xc1\x10\xd0\xa5\xb6\x10\xe5\xfe\xd9\x6d\xab\x5f\x08\xf4\xcb\x3c\xfc\x40\xa3\x55\x57\xe1\xa7\x40\xb8\xc7\xc0\x1f\x7d\x32\x79\xdd\x9c\x4e\x87\x64\xc9\x0b\xc1\x4f\x41\x61\xdb\x5a\x37\xf0\x98\x9b\x7b\xd8\x03\x5f\x8b\xea\x39\x4e\xa1\xd6\x00\x2c\xe9\xc3\x4f\x1e\x9c\x52\xc6\xa1\x5d\x15\xbc\x5b\x25\xc6\xc1\x5a\xb0\x0d\xfd\x6a\x5b\x1b\xc9\x17\xaf\x0b\x1b\x05\xfd\x10\xd0\x61\xb3\x68\x3d\x75\xb5\xf9\xef\xfb\x22\xae\x72\x08\x5b\xe4\xf6\x79\x7b\x58\xcb\x0c\xab\x56\x18\x44\x12\x1f\x98\xbf\xd9\x58\x3e\x0b\xcc\xb7\x0f\xad\x76\x98\x0a\x7a\x73\xb2\x3c\x70\xb3\xfd\x02\xf7\x75\x7c\x11\xa3\xc2\x1d\x19\xe0\x56\x50\xff\xb8\x2b\x9e\x0d\xf8\xa6\x73\x5d\x48\x01\x56\xf4\x79\x49\xd4\x45\x85\x1b\xae\xaa\x5e\xe2\x38\x14\xa4\x1b\x25\x23\x4f\xb9\x2c\xc0\xdf\x19\x80\xd0\x23\xd5\x1b\x5c\xf4\xc3\x11\x85\xc1\x18\xe3\xee\x3c\x0c\x0a\x46\xe0\xa2\xbe\x6f\x1d\x3a\xe4\x52\xcb\xb6\x6f\x0f\xd9\x19\x71\x34\x2d\xa7\xb1\xb9\x96\x58\x9d\x94\x09\x67\x81\x55\x21\x95\xc4\x33\xca\xf1\x9c\x37\xf9\xf1\x4f\xa0\xae\x15\xae\x0b\x02\xb9\x39\xe4\x02\x03\x4f\xf8\x18\x85\x93\x9d\x94\x4e\x60\x4f\x47\x4f\x21\x52\x43\x89\x39\x0f\xda\xda\x06\xe3\x0d\x69\x06\x8c\x88\x48\xcf\x0a\x95\x1e\xab\x25\xc4\x91\x25\x62\x94\x4f\x40\x24\x68\x18\x7a\x23\x23\x9d\x33\x63\x2f\x29\x12\x3d\x49\xb7\xde\x13\x08\x33\x98\xdb\xa9\x7d\xed\xe1\x2f\x79\x59\xb9\x52\x47\xa0\x8f\xc8\xe4\xb5\x39\x9d\x1c\x03\x5c\x08\x94\xcc\x75\xae\x98\x1c\x2d\xd4\x93\x54\x13\xbb\xeb\x68\x53\xfe\x04\x65\x5c\x77\xd1\x58\xc1\x23\x7b\x3e\x0d\xec\xa5\x63\x6d\x69\xe0\xdb\xc5\xac\xaf\x72\xb6\x0c\x10\xbb\x98\xcc\xdd\x60\x09\x8a\x03"}, +{{0x85,0xb4,0xd7,0x64,0x16,0x91,0x28,0x62,0x6f,0xd9,0xc7,0x82,0xad,0x61,0x16,0x22,0x9e,0xdd,0x77,0x63,0x1c,0x2b,0xc9,0xb8,0xee,0x54,0xb3,0x65,0x42,0xc1,0x49,0xeb,},{0x6a,0x09,0x89,0x7e,0x62,0x9b,0xb4,0x37,0x04,0xde,0xbb,0x67,0x15,0xc9,0xde,0xa5,0xd8,0x92,0xb6,0x34,0x30,0x64,0x40,0x99,0x7c,0x3c,0x9e,0x94,0xbe,0x8a,0xb5,0x47,},{0x4a,0x79,0xc4,0x42,0xa4,0xc3,0x9c,0x62,0x89,0x26,0x17,0xef,0x8e,0x80,0xb4,0x09,0x11,0xc4,0xb9,0xd3,0xff,0x0a,0x56,0x73,0xb5,0x7b,0xdb,0x84,0x54,0xad,0x73,0x67,0x69,0xdf,0x27,0xc7,0x8a,0x4b,0xf7,0xad,0x56,0x60,0x40,0xe7,0x47,0x27,0x8b,0x11,0xeb,0x65,0xcf,0x9e,0xc7,0xeb,0xa8,0x66,0x12,0x0a,0x36,0x54,0xf4,0x71,0x6e,0x00,},"\xb2\xa0\x49\x3d\x47\x1c\x33\x91\xf7\xad\xd1\xe2\xcf\x0b\xfb\x32\xab\x05\xdb\xcb\x14\xf6\xe4\xf5\xf3\x46\x3a\xa8\xd9\x95\x52\xf4\x33\x02\x20\x46\xd2\xf8\xeb\x76\x3c\x01\x71\xfc\xb1\xe7\x4a\x04\x9f\xfe\xb4\xb8\xf0\x10\x0b\x82\x10\xfc\xe8\x56\xb2\xe1\xa8\xe7\x39\xd2\xf9\x36\x73\xef\x8f\x8f\x40\x49\x8b\x30\x81\xfa\x1f\xd7\x85\x19\x8c\x6d\x37\x0e\x16\x2d\x41\xab\xe8\x31\x86\xf2\x32\x97\x83\x40\x8b\x9b\x88\x0d\x00\xf8\x1d\x53\x10\x0b\x42\xd2\x7a\x26\x1f\x20\xcd\xee\xd1\x9c\xc5\x8c\xb8\x63\x12\x81\xd8\x0d\xb1\x92\x53\x10\xe2\x35\xe4\x49\x66\x30\x9b\x87\x9b\xdf\xc2\x32\x22\x14\x33\xba\xe5\xca\xe4\x66\x90\xcb\x52\x7b\x67\x79\xe1\x1f\x1b\xd2\xa5\x6b\x59\xc5\x6e\xd4\xd9\x4f\xdf\x7a\xa8\x9d\xfa\x9b\xf2\x0d\xbf\xa6\xa4\x39\x8b\x98\x38\x45\x17\xe1\xdd\x5d\x2c\xd9\xce\x52\x4a\x47\x36\x2e\xf3\x2a\xc7\x92\x74\x2a\x12\x9c\x9e\x06\x13\x08\x76\xab\x5a\xd5\x51\x8e\xab\xc5\xe8\x0b\x02\x2d\x8f\xa1\x3e\x50\xd5\x5d\xed\x58\x95\x33\xe6\xea\x32\x24\x2c\x1b\x3f\xd7\xe6\x5f\x80\xde\xe7\x20\xb6\xd8\x7d\xcf\xf3\xe3\xdf\x04\xc8\x02\xd2\xe9\x14\xa8\x7a\x36\x29\xc9\x0b\xb6\x9e\x0a\x6f\x8b\xbb\x5e\xe5\x05\xf1\x43\xc9\x97\x73\x75\xad\xb0\x65\xc3\xe3\xd3\x91\xf9\x05\xfa\x3c\x33\x6c\x9d\xa4\x1e\x4a\x23\x20\xbc\xf4\x60\x97\x6f\xc7\xeb\x1f\xb6\xc6\xa3\xc3\x95\xdb\xd1\xd2\x8a\x1b\x09\xcd\xb9\xae\x9f\x9a\xae\xe4\xd9\xc5\x66\xa2\xac\x40\xad\xd8\x70\x47\x9f\xaf\x54\xad\x1b\x76\x97\x71\x0b\x4e\xb6\xf7\x32\x02\x44\xb5\x97\x57\xd1\xea\xc3\xd9\x22\xb7\xa7\x30\xb1\xac\xf0\xde\x9a\x45\xd4\xac\x87\x9d\x21\xfc\x61\x6e\xf3\x96\x5d\x74\x34\x5e\xd7\x07\x79\xeb\x68\x32\x80\xce\xe2\x5b\xf3\x73\x9b\xeb\x6b\x4c\xdf\xa2\x5d\x20\x2d\xa1\x3a\x4a\x67\x30\x40\xd9\x70\x48\x65\x8b\x92\x05\x47\x95\x05\xd0\xbe\xe4\x88\x0a\x73\x99\x7c\x70\x82\x5a\x6e\xc5\xfd\x9f\x95\x2e\x65\xfa\x02\x22\x54\x45\xfc\x3b\xdf\x4a\xde\xa3\xd4\xd2\x25\x51\xcb\xac\xeb\x38\x74\x79\x8d\x6a\x33\xa6\x66\x3f\xe3\x75\x70\x81\xd6\x24\x3d\xfd\x7c\xd2\xee\xbf\x60\xa3\x89\x9f\xa1\xf8\xf6\xc9\x56\xa3\xb1\x83\xf8\x9b\x9e\x7d\x2c\xa3\x64\x48\x58\x4d\x53\xaa\x8b\x44\xe6\x5a\xd3\xe5\x27\xf7\x87\x23\xfa\x6f\x59\x22\x42\x98\xdf\x31\xd5\xe8\xad\xa5\x67\xc8\xd1\xb1\x1f\x3b\x13\x14\x75\x53\x31\xc1\x73\x2d\xc5\x4a\x12\xa4\x35\x6e\xdd\xa4\x7e\x3c\x13\x0b\x32\x52\x82\xa3\x54\xbf\xe1\x5c\x30\x00\xd2\x07\x82\x29\x31\x79\x41\x87\xe0\x97\x3a\xb8\xef\x87\xbf\x89\xc3\x54\xa0\x35\xa8\x1f\x45\x91\x12\x23\x56\x3b\xfd\x99\xf9\x0a\x75\xe5\x3d\x01\x0d\x89\x29\xf4\xf8\x5a\x5a\x5a\x4f\x9f\xcc\x1c\x78\xf0\xa2\xfc\x46\x6f\x5f\x1c\x65\x22\xcf\x62\xa7\xbe\x37\x88\x07\x96\xe9\xb3\xca\x09\x11\xec\xca\x3f\x22\xc3\xb2\x4d\x5d\x9d\xaa\x68\x88\xf8\x9a\x8f\x71\xa1\x58\x59\x35\x9c\xea\x46\x8e\xf2\x38\xec\xf6\x46\x19\x27\x83\xa2\x57\xad\xda\xde\x90\x47\xe1\x3e\xdd\x8b\xcc\x1f\xd4\x17\x7c\xb2\x0f\x88\xd1\x19\x98\xd9\xc7\x26\x2d\x64\x8c\x2b\xf6\x6f\xb2\x27\xb9\xb3\xa9\xed\x46\x96\x2d\x22\x57\xa4\x20\xf6\x4b\xea\xd9\xe2\x86\x57\xb5\x21\xdb\x2e\x22\x16\x52\x87\x79\x1f\x3a\x1b\xec\x4c\x78\x22\xa6\xca\xbd\xe5\xec\x77\x01\x88\xcb\x74\x49\x8a\x4f\x08\xe5\xa3\xa7\x63\x9d\x24\x0a\xe3\xf4\xfd\x03\x53\xc0\xdd\xa8\xae\x41\x0b\x9f\xa7\xf4\x3f\xee\xd1\x3e\x9f\x13\xe6\xc9\x41\x0a\x1d\x24\xcd\xfc\x2c\x8e\x64\xa1\x5a\x12\xf7\x55\x45\xb0\xa5\x75\x71\x35\x23\xd4\xdf\xa1\xa4\x74\x27\xa8\x85\x1b\xa9\xac\xcc\xad\x78\xb4\xef\x6a\x18\x5f\x5c\x3b\x00\x11\x90\xdd\x8f\x37\x08\x8a\x00\x0a\xcc\xf4\x48\xbe\x8d\x49\x37\x1d\x9d\xa2\xe1\xcb\x5f\xfe\x07\xd4\x1a\x5c\x22\xe9\x46\x60\xac\x37\x13\x5a\xc8\x58\xcb\x17\x69\xcb\x66\xe8\x26\x9f\xd5\x33\x58\xec\xac\xf5\xdd\x92\xc7\xeb\x61\x86\xb4\xd4\xd6\x13\x0a\x73\x2d\xc1\x0b\xbb\x2b\xe3\x2f\x9b\x1d\x69\x51\x01\x4a\x63\x5c\x12\xd2\x2f\x0d\xc5\xbd\x5c\x2a\x3f\x96\xae\xc6\x2e\x77\x77\x94\x7e\xaa\x02\x28\x12\xca\xce\xd3\x3a\x5b\xef\x9f\xf8\x83\x5f\x88\x03\x67\xa3\x7b\x0b\x76\xd2\xdd\xe3\x96\xc6\x14\xe1\xa4\x72\x1e\x00\x0c\x00\xf1\x61\x93\x5b\x14\xa7\x38\xa1\xb7\x0f\x6e\xa5\x42\x55\xb7\x95\x18\x69\x64\x62\x12"}, +{{0x33,0xd4,0x77,0x60,0x2f,0x29,0x63,0x05,0xa6,0x71,0x9e,0xa6,0x94,0xc0,0x44,0xe9,0x0d,0x23,0x3c,0x2d,0xea,0x85,0xc4,0x6a,0xbe,0x19,0x20,0xe8,0x8c,0x31,0x78,0x49,},{0xff,0x6f,0xee,0xa0,0x28,0xec,0x34,0x6d,0xd4,0x91,0x07,0xbb,0x71,0x3f,0xdd,0xbb,0x28,0x2e,0xbc,0xd0,0x34,0xe2,0xea,0xfc,0x7c,0xdb,0x1c,0x5a,0xdf,0x92,0x63,0x90,},{0xca,0xa2,0x87,0x98,0x95,0xd4,0xf6,0x20,0xb9,0xeb,0x5f,0xed,0x22,0xb4,0x56,0x2e,0xeb,0x1a,0xd6,0x38,0x22,0x96,0x8f,0x76,0xad,0x91,0x07,0x6b,0x16,0x6c,0x05,0xee,0x20,0x86,0x4d,0x98,0xbb,0xbc,0x6e,0x79,0xdd,0x03,0x62,0xca,0xcf,0x7a,0x21,0xb4,0xcf,0xc2,0x30,0xd6,0x35,0x5d,0x43,0x12,0x0c,0xff,0xfb,0x94,0x8b,0x8f,0x6c,0x0e,},"\xcf\xea\x07\xa7\x79\xf1\x53\x7e\x49\x81\x23\xc6\x76\x29\x05\x73\xef\xcc\x5d\xb7\x02\x45\xd9\x3d\xea\x5c\x05\x72\x6f\x87\x13\xd0\x02\xae\x66\xc1\xc9\x69\x07\x47\xca\x92\x30\xb1\x62\x9d\x36\x62\xab\x73\xd6\x6b\x94\x98\x79\x16\x4b\x21\xa3\x5f\x40\xcf\x37\x99\x04\x19\x08\xed\x6f\x92\x29\xec\xb3\x90\xc5\xf2\x22\x34\xe1\xc5\xf2\x6b\x3a\xb5\xba\x59\xe7\x8c\x64\x96\x98\x71\xb4\x28\xb7\x85\x16\x77\x75\x55\xaf\x4e\x89\xc6\xfb\xc1\x93\xa9\x46\x95\x22\x6c\x6d\x32\x99\x91\xa1\x1b\xd5\x80\xd1\x89\x56\x08\x9b\x58\xa0\xe4\x2c\xa3\x5f\x6c\x6d\x26\x09\xad\xe0\xd0\xb6\x19\xd4\x89\x25\xc6\x8c\xd9\xd2\x25\x0d\xff\x27\xcf\x2f\x0d\x44\x44\x87\x09\xb6\x79\xf3\x5b\xbd\xce\x0f\x49\x6b\x0a\x16\xca\x67\xea\xce\xec\x25\x8b\x1a\xec\x91\x77\x5a\x3a\x2e\xe8\x01\xb1\xc9\xa2\x26\xa6\xb0\x01\x92\x6a\x05\x7a\x06\x30\x67\x27\xee\xda\xe8\xc5\x77\x53\x1d\xf0\x4a\xc0\x9b\x5b\x49\xbc\xde\xab\xde\xb8\xac\x4e\x8e\x82\xcf\x1e\x7a\xf8\x35\xfc\x61\x1c\xa7\xa6\x84\xb8\x35\x26\x04\x24\x15\xb1\xd6\x65\x2e\x86\x34\x31\x1e\x19\x46\x27\xea\xe7\x8d\x01\x1e\x6f\x40\xf6\x45\x79\x4e\x36\x89\x5a\x23\xe1\xbd\x84\x88\x3a\x39\x3e\xcf\xe5\xa2\x48\x02\x6a\xea\x86\x44\x70\x59\xf7\xa4\x29\x36\x8f\x21\xc8\x9e\x01\x45\x20\x79\x78\xb9\x13\xc8\x0a\x22\xd7\xca\xf2\x67\x3f\x7c\x76\xf6\xc2\x6c\xf8\x84\x41\x2e\x17\xd0\xc2\x55\x43\x0f\x50\x2b\xce\x74\xe3\xa3\x10\xd1\x7f\x6f\x4d\x48\x5d\xa2\x80\xed\x5b\x5e\xea\x6c\x49\xba\x74\x8d\x76\x48\x14\xb9\xe3\xda\xf6\xfc\xc2\x18\xc2\x74\x0c\xa7\x70\x18\xf7\x13\x44\x51\x9d\xa8\x2a\xda\x31\xe0\x01\x92\x4f\xc7\x76\x79\xe3\xe9\xff\x9f\xab\x67\xdd\x09\xa6\x19\x24\xc8\x21\xa1\xfd\x99\x9f\x74\xdf\xa3\xf8\x19\xad\xb3\x1d\x15\xe5\xed\x8a\xaa\x52\xc1\xbd\x7c\xca\x26\x67\x11\xa7\x4d\xd6\x21\x04\xef\x3c\x2b\xf7\x37\xfc\xe6\x94\x2b\x34\x8a\x33\xc3\xdf\xd6\xd9\x2a\x72\x4b\x6d\x58\x78\x42\x1a\xeb\x23\x0a\x53\x3f\xe2\x1c\x8b\x2f\xd3\xda\x59\x6a\x61\x80\xa4\x5c\x98\x6d\x7e\xce\x4c\xdc\x8a\xd6\x81\xea\xd6\x90\x64\xbb\xdd\xfc\x20\xf3\xc5\x21\x25\xf8\x33\x95\xbe\xd1\x55\x7f\x67\x18\x2b\x9f\xe9\x91\x38\xaf\x3c\x35\x6c\x5e\x65\x29\x78\xdd\x23\x8b\x76\x1c\x74\x2f\x81\x58\xe2\x31\x4b\x96\x42\x08\x33\x09\x78\xb0\x62\x0a\x13\xa1\x6d\x76\x1d\x52\xf0\x6e\x46\x6a\x40\x94\xb6\x5c\xd6\xf2\x68\x54\xae\xd6\xf9\xa8\xc2\xa8\x84\xa0\xd0\xbf\x4e\xe5\x87\xee\xb8\xb6\x02\x48\x72\x39\xa7\xe5\x81\x72\xc8\x09\x98\x3a\x8d\xb1\xc1\xfc\x7c\xe8\xc4\x8b\xc8\xa6\xfb\x81\x2d\x6a\xa9\xe8\x3a\x3a\xb4\xdd\xf7\xa8\xd4\x0d\x3f\xe0\x0e\xa1\x6e\x04\x06\x2b\x8a\xce\xb9\xc9\x9e\xef\xa4\x1f\x4f\x87\x44\x78\x28\x12\x6d\x0d\x9c\x9f\x86\x05\xe8\x46\x7c\x5e\x4d\x67\x1d\x5c\x6d\x9f\xa7\x0d\x74\x70\x98\xd9\x41\x21\x12\x23\xb9\xbc\xf2\x61\x93\x8d\x67\x04\xa3\x2d\x22\xc6\x1e\x30\xf3\x57\x0a\x1f\x5d\x09\x98\xb4\x79\x10\x80\x88\x2a\xa5\x62\x31\x67\xb6\x3a\x23\xf3\x40\xf0\xe7\xc6\xf9\xa8\x30\xa7\x5b\x74\x63\x1f\xa5\xb5\x7a\xfd\xb1\xe6\xbc\x22\x69\x9b\xb0\x31\x56\x67\x5d\x59\x83\x53\xa5\xd1\xb5\x58\x97\xe4\xc1\x10\x61\xdd\x14\x5f\x23\xe8\x53\x7c\x63\x2f\x75\xc1\x0d\xf0\x5b\x25\x54\x72\x38\x57\x40\x17\xfe\x7b\x64\xb8\xe9\x98\x69\x15\x7f\xee\x35\xf7\xad\x7e\x63\xe9\x95\x93\x30\x29\x29\x50\x3a\x96\x76\x80\x23\xb4\x12\x5a\xd7\x49\xdf\xf4\xb9\x92\xee\x5c\x2b\x4f\x3a\xda\x48\x89\xe4\xae\x62\xec\x15\xd2\xdb\x59\x69\xd7\x30\xdb\x30\x75\x47\xf6\x38\xc3\x18\x50\x32\xb1\x2f\x75\xfb\xb3\x17\xe4\x7d\xf7\xb9\x29\x2a\xe9\xe7\x6a\x2c\x0a\x06\xfc\xad\x10\x8c\xdd\x23\x5f\x6e\x38\xd9\x67\xb6\x37\x95\x11\xff\x69\x65\xc2\x2f\x2c\x66\x80\xa1\x2b\x03\x04\xeb\x2b\x29\x6c\x99\xa7\x6c\x27\x29\xd9\x8e\x0a\x78\x24\xb6\x7f\x3f\xe8\x42\xd6\xf6\xab\x27\x3e\x89\x48\x45\xb3\x2d\xc6\xdd\xfc\x7a\x22\x0f\x76\xbd\x96\x5c\x69\x85\x81\x83\xc8\xf3\x57\x39\x5f\xc5\x7d\xc8\x29\xde\xfa\xac\xb5\x60\x3a\x75\x78\x68\xd5\xe5\x62\xf9\x78\x1e\xe3\x9e\x0e\x94\x68\x8a\xd3\x54\x5b\x32\xdd\x73\x66\xb6\xb0\x47\xe8\xd1\xd3\xd5\x65\x99\x7b\x23\x6e\x7f\x75\x96\xc5\xf8\xd7\xc1\xc1\x1b\xcf\x4a\x24\x46\x20\xcb\xd2\x1d\x55\x9a\x7c\x9b\x3f"}, +{{0x70,0x74,0x56,0x86,0x11,0xa6,0x6d,0xfc,0xa8,0x30,0x7c,0xae,0x60,0x8b,0xb2,0x69,0x95,0x84,0x4d,0xf4,0x35,0xe5,0x30,0x0e,0x5b,0x4d,0x72,0x91,0xcc,0x22,0x90,0x7f,},{0xdd,0xab,0xdd,0xd1,0x5e,0xaf,0x83,0x11,0x5d,0xdd,0x06,0x5d,0x7e,0x22,0x0b,0x1e,0xfc,0x26,0x2a,0x61,0xc5,0x2e,0x91,0x43,0x47,0x44,0x2b,0xde,0x6d,0x00,0x25,0x06,},{0x7f,0x65,0x31,0x34,0xc0,0xb9,0x0f,0x44,0xa4,0x89,0xf0,0xb0,0x5f,0xc4,0x07,0x07,0xad,0x9f,0x13,0x98,0xf3,0x40,0xb4,0x47,0xa3,0xc9,0x86,0x1f,0x51,0x1c,0x9f,0x15,0x68,0x80,0x3b,0x76,0x84,0xa0,0x4a,0x89,0x8c,0x45,0x15,0x4d,0xd4,0x86,0xbd,0x50,0x75,0x89,0x98,0xe1,0x26,0x43,0x93,0x78,0xb3,0xf5,0x9f,0xf3,0x67,0x49,0x2a,0x0a,},"\x6c\x13\x74\x23\xea\xc7\x90\xb8\xe8\xe4\x18\xb2\x90\xe0\x57\x9c\x7b\x86\xb1\x4a\xed\x81\x8d\xe8\xce\x53\xce\xa3\xf3\x40\xa1\xa9\x53\x91\xf9\x84\x96\x8f\x2b\x42\x29\x28\x2a\x81\x61\xc0\x9a\xb1\x49\xcd\xac\xd6\x69\x70\xb4\x01\x3f\x52\xe5\xe6\x8e\xa8\xc9\xdb\x68\x5b\x2c\x53\x07\x35\x00\xe5\xb3\x5e\x29\xea\x0b\xa1\xf4\xd1\x59\xa5\x58\xd3\x61\xb0\x65\x16\x83\x6c\xf7\xb9\xea\x50\x1f\xa0\x50\x6b\x98\x5f\x03\x6a\x82\xd9\xe0\x84\x48\x9d\x3b\xfe\xd3\x40\x93\xe2\xd6\xd9\xed\xf5\x57\x85\xed\x35\xa9\x0c\xe5\x6c\x76\x16\x86\xcc\x3e\xa1\xa2\xc7\x6a\xda\x5e\xc8\xc1\x45\xd8\x18\xb0\x47\xcc\x51\x6e\xec\x5d\x2d\x6a\x93\xa5\x55\x92\xd8\x92\xe3\xd5\xcd\x10\xc2\x50\xc0\x4b\x04\x9b\x38\xfc\x7e\xc0\xf3\x9a\xba\x15\x82\x40\x07\x33\x6c\x2b\x0f\x7f\x81\xd6\x4d\x5c\xa3\xe2\x9d\x6f\xda\x4c\x23\xd9\xba\x65\xd9\xfe\x3c\xb4\xe0\x39\x13\x69\x72\x87\xb4\x6a\x0b\x1f\xcc\xd2\x62\x4e\x39\x7a\xe9\x5c\x52\x54\xbc\xd8\x8d\x2c\x7c\x8f\x70\xfd\xc8\x17\x3f\x64\xc1\xde\x32\x28\x1a\xb4\x18\x46\x93\xb4\x8a\x34\x9e\x67\x82\xbc\x89\x92\xb4\x3c\x7d\xe7\xcb\x9d\x33\x92\x9b\xf9\x53\x06\xc2\xaf\x7e\x93\x8d\x84\x86\xb3\x86\xf9\xfd\x3f\x0f\x71\x61\xe0\xe6\x86\x2d\x4f\x92\x81\x44\x68\x65\xa1\xc9\xbe\x24\x60\xef\xbc\x20\x15\x1b\x06\xe7\x9d\x01\x46\x17\xd0\x30\x0e\x67\x1d\x48\x76\x74\x58\x59\x66\x25\xb7\x6d\xff\xc5\x58\xaa\x9b\x40\x61\x21\x96\xec\x82\x7e\x1c\x6f\xff\x51\x8f\xb7\xad\x4b\xf8\xc4\x6f\xcb\x27\x88\x85\xaa\x49\x1b\x77\xa2\x89\x95\xcf\xb9\xd7\x96\x40\xaa\xd1\x74\xc6\xdf\x43\x93\x8e\x3f\x13\x85\x20\x5c\x54\x59\x5b\x33\xde\xde\x50\x14\x37\x46\xa1\x70\x5e\x7e\x0b\x69\xaf\x4a\x26\xc3\xb7\x65\x15\x05\x18\x92\xb1\x5c\xa6\xe4\x8c\x3d\x91\xfb\xc7\x5e\x8f\xe4\xa0\xfe\x8e\xd2\xc2\x6c\x10\x73\xbe\xb7\x0e\xa3\x8d\x09\x27\x02\x92\x78\x40\x67\x55\xae\x6e\x11\xda\x37\x86\x53\x64\x95\x15\xe0\x08\x5b\x5e\xa7\xdb\x32\x49\x20\x8e\x33\xa6\xc8\xb6\xae\x8c\xd8\x0c\x9b\xd6\xb9\x83\xe7\x3e\x9b\x91\xdb\xec\x09\x1f\xae\x99\x5f\x80\x32\x42\x7e\xde\xc0\x2c\xad\x90\x55\xeb\x8b\x7d\xbc\xfa\x80\xd4\xf6\x4f\x57\x27\xa1\x52\xf1\x1c\x47\xe5\x2d\x75\x3a\x57\xb6\xe5\xfd\xdf\x77\x4c\xea\x4d\xa9\x10\x02\x68\x19\xc4\x1e\x32\xb4\xf1\x99\x72\x7e\x23\xc5\x4a\xb5\xd7\x01\x42\xb8\x54\xa2\x7b\x04\xe6\x4c\xf4\x4a\xf2\xa8\x99\x5e\x12\x00\xbd\x11\x7c\x7a\x16\x74\xed\xef\x59\xbc\x53\xf7\x3a\xda\xf6\x38\xe0\x77\x3b\x85\xb5\x63\x34\xaf\xf6\xe1\x17\x43\xe3\xa3\xd3\x61\x4a\xa8\xa3\x75\xb3\x78\x1e\xc8\x14\xcc\x08\xe7\x1e\xfa\x78\x18\x51\x9c\xb2\x4a\xf8\x2c\x33\x1d\xfd\x6a\xc7\x8e\xc1\x7f\xd7\x17\x4b\x61\x02\x1e\x8c\xf9\x01\xa2\xaa\xa6\xad\xbc\x90\x2a\x91\x6b\x2a\x2f\x4f\x79\xe5\x51\x50\x1f\xbf\x01\xdf\x6b\x85\x18\x50\x4c\x1e\x94\x64\x69\x38\xbe\xd1\xa8\x50\x9c\x2a\x38\xfb\x6a\x79\x8a\x78\x58\xf4\x09\xb0\xf2\xfb\x9b\x3f\x48\x17\xe5\x68\xc5\x2d\x9a\xbf\xe2\x16\x8c\xc3\x65\x0f\xc4\x3e\x0f\x99\x75\xfe\x29\xe3\x3a\xed\x1a\x7b\xf3\x0d\x86\x31\x15\x07\x90\x65\x0a\x3c\xb7\x8c\x36\x8f\x1a\xea\x9a\xc6\x0c\x5e\xeb\x96\x9a\x45\xf8\x4a\xa3\x73\x66\xa8\x39\x77\x19\x0f\x41\xae\x42\x1e\x0c\x46\xfd\xa3\xfa\x01\xb9\x26\xfc\xef\x82\x24\xfd\xa3\x6d\xf4\xf8\xa8\x77\x01\xfe\x79\xfe\x06\x28\xef\x0c\xc0\x2d\xf2\xbd\x78\x32\x07\xc7\xdb\x87\x11\x9a\x03\x69\xfe\x16\xee\xb3\x8f\xdc\x9f\xb3\x5d\x9e\x19\x5f\xe1\x4f\x8c\x10\x38\x20\x8a\xb9\x77\x00\xaf\x79\xf2\xe2\xe0\x54\x96\x83\x02\x07\xc7\xda\x8d\xbe\x8e\x9b\xb7\x3b\xc4\x71\xa4\x3f\x1b\xe6\x50\xfa\x92\x81\x9a\xeb\x5d\xc7\xee\xd7\xee\xd8\x17\x12\x70\xd2\x19\x25\x7d\x19\x61\x0b\x89\xd2\xd6\x2d\x3f\x5b\x64\x8e\x13\x9e\xed\xf1\xff\x74\xbe\x01\xa5\xef\x1d\x95\xf8\x12\x92\x26\x01\xee\x92\x51\x51\x57\xc4\xec\xad\xfa\x3e\xef\x9f\x2a\x67\x7c\x00\x3c\xa4\xab\x9b\x2c\x45\x47\x2c\xe5\x5e\x18\xf4\x0a\x21\xfe\x1b\x0d\x45\xb5\x0b\x50\xc5\x2a\x0b\x1a\x5d\x7c\x37\xd8\xeb\xc1\x5e\x02\x05\x84\xd9\xed\xd7\xb5\x65\x05\xf8\x20\x78\xe0\xf8\x99\x38\x91\x35\x01\x4c\x86\xd1\xe2\xed\x49\xf9\xcd\x31\x90\x76\x94\x35\x53\xa3\x12\xae\x05\xab\x33\x35\x26\xe1\x36\x71\x4f\x09\xa4\x02\xb3\xc8"}, +{{0x7d,0x7c,0xa8,0xe8,0xd3,0xb8,0x43,0x44,0xa5,0xe4,0xde,0xa0,0x8b,0x33,0x8d,0x8f,0xaa,0x5f,0xfc,0x11,0x9c,0xe5,0x66,0xef,0x65,0x6f,0x0f,0x45,0x84,0x77,0x5b,0x21,},{0x0b,0xde,0x34,0xb7,0x46,0xd2,0xc5,0x49,0x08,0x53,0x06,0x4d,0x48,0xc6,0xb4,0xc1,0xcb,0xbc,0x3e,0xe7,0xbe,0xff,0x5e,0x8f,0x68,0x4c,0x12,0x0f,0x31,0x5d,0x7e,0x4e,},{0xd0,0xc3,0xe2,0x48,0xa8,0xcb,0x2d,0xdc,0x7e,0x9f,0x21,0xc9,0xc5,0xb0,0x09,0xf7,0x0e,0xa2,0x9d,0xa6,0x89,0x7c,0xd9,0x2c,0x26,0x0f,0x04,0x7e,0xd6,0x8a,0xa1,0xc8,0xb9,0x65,0x7f,0x9d,0x82,0x6e,0x88,0xf4,0xa5,0x12,0xc5,0x00,0x3b,0xe6,0x40,0x68,0x80,0x74,0x12,0x63,0xae,0x7c,0xe6,0x86,0x0e,0xfe,0x73,0xad,0x54,0xd4,0x82,0x04,},"\x0b\x72\x70\x75\x34\x5d\x61\x9f\x5c\xdc\x7f\xc4\xc4\x3c\xdc\x19\x10\x58\x11\xd9\x5d\x06\x9f\x81\xc0\xa6\x2f\xe1\xe1\x17\x8c\xf1\xc3\x5d\xb0\x5e\x2d\xe8\x7d\x11\xae\x1a\x6f\x53\xef\x38\xb3\x9b\xf4\xed\x8f\xbf\x56\xef\x01\x7a\x1d\x3c\x15\xb6\x4f\xe4\xb2\x61\x0b\xf6\x9b\xd1\x9a\xc7\xaf\xd4\x6a\x2b\x87\xb4\x88\xb6\xc7\x8a\xd4\x56\x81\x1c\x1d\xd6\xbd\x4a\x6b\x5d\xa6\x98\x73\x9f\xd1\xa1\x4c\xeb\x9f\x27\xf1\x24\xb6\x9f\x6b\xd1\x6d\xe5\x53\x7a\xad\x80\x68\x1c\x56\x33\x58\x03\x94\xda\x3b\x84\xe9\xb7\xa5\x5e\xba\xb8\x52\x2d\x2d\x6b\xf1\xaa\x4e\x7b\x15\x9c\xbf\x4e\x20\xb5\x0b\xfe\x9c\x71\x1a\xa0\x47\x11\x9f\x1d\xad\x87\x49\x26\x0b\x87\x63\x9e\x9c\x14\x1d\xef\x62\x02\x6a\x99\x03\x73\xdc\xfd\x99\xf7\x7b\x0f\x5e\xa6\xad\xfd\x8f\x59\x4b\x9c\xe4\x10\x64\xa5\xed\x30\x7b\xf2\xd8\xd1\x73\x70\x49\x8a\xd7\xf4\x5f\x9c\x4d\xd2\x6c\x42\x0f\x45\x0f\x53\x62\x3b\xb6\xd7\xf3\xf4\x6a\x14\x9d\x8f\x13\x5b\xc2\x91\x33\x10\xfb\x8f\x90\x43\xd0\x99\x27\x8b\xbe\xba\x39\x17\x9f\xa3\x67\xb0\x16\x73\xe1\xc9\x53\xef\xfd\x2c\xae\xa7\x31\x1c\x47\xc0\x37\x27\x44\x09\x5b\x1c\x8f\x90\xee\xf5\xf1\x92\x9d\xb1\x99\x6c\xd5\x84\xf6\x15\xd5\x6f\xae\x3a\xec\xac\x3e\xe8\x8b\xd0\xb2\x96\xf4\x49\xcc\x27\x13\xc5\x2d\xa6\x95\x24\x8f\xaa\x8e\x38\x9b\x05\xa0\xbc\xac\x69\xdc\xe9\x71\x97\x23\x19\x4f\x43\x3b\x02\x97\xeb\x08\x59\x01\x9f\x14\x1a\x20\x7c\xe8\xcc\xb5\x98\x82\xca\xa6\xe1\x8f\x0b\x43\xbd\xdd\xb9\x0a\x0a\x85\xff\xd5\x77\xd6\x39\x4a\x1d\x80\x48\x94\x10\xf9\x2a\xfb\x85\xba\x50\x6a\xa9\xf3\xf4\x27\x44\x5d\x21\x22\x4b\x9c\xb0\x46\xc0\x5f\x1b\xac\xd7\xb7\x49\xfb\x7b\x10\x24\xd0\x92\xe4\xee\x4b\x30\xa4\x6e\xdf\x71\x84\x70\xc9\x94\x91\xc6\x8f\x48\x79\xd6\x2b\xfc\xe7\x04\x6d\x81\x38\xcb\xb9\xe7\x21\x29\x99\xa4\x49\x8b\x45\x5f\xc9\x0a\xc2\x83\xe9\x35\xde\x04\xdf\x6f\xc9\x99\xe4\x43\x4b\xe1\x10\x63\xd6\xe4\xee\x9e\x09\x6a\x87\xbc\x71\x6d\x2c\x81\x99\x16\xc3\x7a\x4e\x62\x98\xc4\x99\x45\x36\x6e\xc3\xf5\x00\x72\x0b\x06\xdc\x99\xd3\xd8\xac\x30\x3e\x6c\x26\x4e\x28\xa7\xc2\xd4\x19\xec\x62\x2a\x97\xa7\x11\x54\x4f\xb1\xf4\x73\x5b\x11\xf8\xbb\x1d\x7e\x2c\x81\x6a\x15\x62\x87\xb4\xcc\x0c\x65\xaa\xa2\x80\xb8\x37\x73\x7f\x0a\x84\xe3\x6d\xe2\xdf\x2f\xc3\xa5\x0d\xf9\x80\x91\x8f\xb9\xe5\x83\x4b\x42\xac\x0e\x0c\x72\x78\xd7\xfe\x8d\xb4\xdb\xde\xca\x01\x41\xd5\xfe\xf5\xdc\x61\x51\xf8\x7b\x86\x34\xc2\x41\xa8\xfa\x0a\x82\x71\x78\x99\x77\x3a\xe8\x9f\x53\x78\x90\xb9\x15\x5a\x7a\x05\xbc\xe4\x78\x66\xec\x20\x28\xa4\x78\x98\xd4\x85\x82\x3a\x2e\x99\x23\x19\x68\x0e\xb6\x99\xb0\xdd\x53\x58\xf5\x46\xfc\x53\x7c\x73\xd3\xa4\xb2\x23\xa0\x94\x15\x18\xb6\xd1\xe6\x6b\x27\x67\x6c\x1b\x1f\xc7\x6a\x08\x32\x05\x24\xa7\x2e\x29\x7f\xce\x17\xaa\x80\xd8\xea\x7b\x38\x8a\x55\x16\x8e\x7d\xad\xb8\x36\xe9\xde\xe7\x07\xed\x25\xc0\xee\x4d\xb2\x5b\xee\x3c\x48\x5b\x39\x64\x92\x04\xef\xaf\x28\x20\xb2\x73\x63\x68\xfc\x77\x3c\xe0\x90\xc3\x85\x37\x80\x02\xc4\x71\xb0\x94\x79\x5c\xb2\x66\xd3\x9e\xb7\x58\x0d\x70\x1b\xe4\xc8\x91\x6f\x6b\x38\xbf\xe2\x5f\xdf\x36\xd6\xc4\xad\xaf\xa9\xae\x98\x64\xc5\x7b\xb7\x37\xb4\x95\x06\xed\x38\xd6\x2d\xe6\x0c\xc0\x59\x9e\xc6\xbb\x1a\xcf\x24\xb1\xd3\x7d\x60\xef\xde\xb7\xd9\x42\xc5\x36\x03\xa2\xf0\x47\x6e\x95\x12\xc9\x38\xb2\x8d\x49\x5a\x6f\x26\xa9\x07\xc3\x96\xb8\x41\xae\xdd\x8e\x14\xac\x44\x7b\x49\x5d\xf1\xf6\x76\xda\xcc\xd5\xa7\x40\xc0\x42\xf5\x77\x2b\x7d\xb1\x7f\x4f\x1a\x3a\x1c\x8e\x7c\x48\x83\x70\xe7\x36\xb5\x1e\x69\x0f\xd2\xdd\xcb\x5a\xa6\x19\x57\xa7\xc7\x97\x5a\xcb\x2d\xcb\x91\x5d\x07\x4d\x74\x42\x79\xea\x1c\x41\x69\xf8\x68\x87\x3a\xc5\xc2\x08\x90\x16\x2c\x1d\xf9\x65\x64\x19\x97\x5a\x43\xd3\x19\x8e\x18\xc3\x09\xa1\xeb\x7c\x1d\x87\x87\x3f\xb1\x5c\x6d\xa4\x7f\x54\x8a\x01\xf6\x9b\xda\xb9\xc3\x9e\xf0\x0d\x41\x8a\x6f\x61\x9d\xd7\x3d\x7d\xb4\x5c\xbb\x6a\xd2\x25\xa2\xde\x78\x7b\xa7\x77\xbc\x73\xd2\x8f\xc3\x04\xf1\x00\x09\xf4\x02\x2c\x2c\xf8\x4d\xe0\x08\xd7\x0f\xcd\xc8\xba\x7f\x10\x7c\x36\x98\x59\xe9\xc9\x0c\xa8\xa3\x93\xb5\x53\xf2\x66\x05\xff\xd7\x23\x0c\x92\x14\x90\x70\x0f"}, +{{0xd2,0x1f,0xdd,0x7b,0x10,0xe5,0x4a,0x8b,0x6b,0xe9,0x5a,0x02,0x24,0xad,0x70,0x66,0x4d,0xd9,0x21,0x12,0xe2,0x68,0x3a,0x4f,0xd2,0x79,0xc4,0x07,0xdb,0x38,0x71,0xbb,},{0xf8,0x9c,0x27,0x2e,0x7d,0x1c,0xc9,0x3d,0x69,0xf6,0x94,0xde,0xc9,0xcc,0xe0,0x5a,0xc2,0x47,0x73,0x45,0x04,0x82,0x9c,0x56,0x99,0x74,0x13,0xc8,0x95,0x8b,0x93,0x30,},{0x6d,0x69,0xe8,0x3b,0x3e,0x7e,0xd5,0x5a,0x85,0xf9,0xfc,0x9d,0x25,0x19,0xda,0x0b,0x0a,0x1e,0xb4,0xda,0xae,0xe9,0x91,0xa6,0x65,0x1f,0x5c,0x89,0x19,0x0c,0x0d,0xe7,0x23,0x73,0xcd,0x98,0x9d,0x46,0xbe,0x13,0x67,0xf9,0xda,0xf1,0xb9,0x2f,0xed,0x3b,0x52,0xbb,0xa5,0x4a,0x1e,0x4c,0xca,0x5b,0xc8,0x72,0x6e,0xd0,0x7f,0x30,0x25,0x01,},"\xb8\x64\x4a\xdb\xef\x9c\x7c\xab\x91\x20\xac\xed\xc8\xe7\x5c\x43\x3d\x03\x6f\xfa\xe0\xf9\x55\xbe\x6a\x48\x8f\x1f\x42\x7a\x68\xa8\x90\x2d\x02\x6e\x63\xdd\x6c\x9b\xf9\xd9\x7d\xe7\x86\xb3\x1d\xd4\xf4\xc9\xa4\xf8\xa6\x22\xf1\xff\xc8\x4d\xa6\x96\x7c\xa7\x74\x33\xc3\x98\xf4\xd3\xf1\xc4\x43\x49\x89\xb7\xac\x9d\x0f\x3b\x1b\xe0\xc8\xb3\x52\x82\x4f\x4e\x7a\x08\x3f\x34\x2e\xc1\xbe\x1d\xa8\xfb\x75\x52\x42\xa6\x54\x88\x0e\xf2\x98\xf0\x59\x79\xff\x02\x6d\xdc\xc0\x44\x86\x0e\x67\x57\xa2\x9c\xfa\xa2\x22\xa3\x59\x7e\x38\xf1\x77\x99\x62\xa4\x1a\x4c\x8c\xe6\xa6\x5b\x87\x81\x99\xb4\xd8\x0f\x4a\x03\x90\xca\xc1\x9c\x22\x6e\xea\x4b\x60\x36\xe5\x7a\xd8\x30\xec\xfc\x00\x69\x3e\x26\x13\xd3\xed\xf4\x65\xfc\x8c\x4f\xa2\x93\xfd\x8c\xfc\x36\xdc\x8e\x37\xbc\xeb\xab\xec\x03\x49\xeb\xd8\x84\xe1\xb2\x8b\xce\x82\x4e\x0d\x55\xb6\xd0\x15\x38\x38\x01\x66\x8b\x34\xf5\xba\x72\x3d\x2a\xc0\xa2\x64\xfa\xb2\xc7\x28\x60\x8f\x16\x2d\xe0\x11\x79\x25\x9b\xe2\xcc\xb0\x81\x50\x02\xfd\xed\x8e\x0d\x78\xb0\x28\x07\x31\x3e\x91\x0e\xb3\xa7\x33\x7c\x53\x4e\x84\x6f\x9e\xe1\x55\x42\x6e\x4a\xef\x64\x36\x61\xb0\xed\xb4\x45\x96\xfd\xdc\xd0\xb3\xe8\x14\xc1\x37\x81\x7a\x42\x2b\xaa\x40\xc9\x05\x3d\x03\x86\xc6\xec\xdb\x58\x90\x52\x59\x47\x42\x67\x7c\x48\xdc\xfc\x8c\xd4\xa9\x36\x67\xed\x4d\x87\x64\x60\x01\xed\xa0\x79\xe8\xb9\x9d\x52\xba\x21\xc5\xec\x56\x69\xfe\xdf\x6f\x40\x44\x7a\x7f\xf8\x90\x1d\xb0\xef\x18\x47\xd3\xca\xcf\x01\x98\xa2\xf3\xbd\x7b\xcf\x2d\xd8\x11\xa0\x97\xfc\x5e\x51\x88\xb0\x3f\xdf\x54\xe5\x17\x63\x7a\x14\x50\x10\x00\xd0\xd3\x55\x16\xca\xf0\x69\x94\x02\xb4\x8f\x8d\x8c\xc3\xaf\xb1\x7a\x56\x13\x2d\x08\x23\x70\x35\xa0\xc9\x54\x90\xbf\xe5\xd7\xb7\xfb\x40\x17\x8f\x28\x1e\x4d\x87\x2e\x47\xa0\xe9\x55\xce\x97\x36\xf3\xc3\x33\xa6\xad\xf5\x0a\xd3\x19\x94\xeb\x9f\x45\x32\x7f\xac\xc8\xc5\xd1\x13\xfa\xd4\x71\x3f\xe7\xf1\x98\x01\x0d\x42\x04\x6b\xbf\xe6\x8b\x0d\xaa\x79\xdc\xb8\x75\x59\x29\xbe\x92\xf9\xca\xa1\x50\xdf\xbd\xe3\xfc\x9e\x39\x2b\x2b\x70\x1c\x30\x21\xc2\x40\xe4\x67\x9d\xe4\x11\x24\xb1\x88\x8e\x5d\xb5\xa8\x3d\x05\xce\xaf\x49\xeb\x44\x0d\xc4\x50\x26\xd4\x50\xbc\x98\x4b\x8d\x6f\x02\x85\x0e\xcb\x57\x0e\xee\x0a\x38\x19\xb1\x2b\xc2\x63\x67\xb5\xb9\x8e\x1b\x14\x1c\x9b\x0a\x96\x90\xea\x4a\x37\x00\xda\xd1\x23\x95\xf9\x75\xd1\x1c\xd7\x7f\x96\x36\x88\x31\xf2\x1f\x4e\x96\x8c\xc5\xba\x9e\xf8\x24\x74\x03\x8b\xc7\xaa\x26\x12\x2d\x21\x8b\x74\x30\x41\x50\x6a\xeb\xbd\x1f\x98\x79\x59\xfd\x16\x0d\x6e\xb7\xd5\x8d\x4f\x57\x6f\x8c\x0c\xa8\xaf\x86\x8e\x39\xb5\xea\x87\x20\x39\x37\xe0\x30\x8a\xcb\xea\xe9\x1e\x10\x60\x7e\x44\xe8\xab\x49\x5b\xc0\x1d\xd5\x73\xfb\xad\xc9\x44\x79\xff\x92\x08\x2c\x7b\xb7\x51\x34\x79\xc7\x0f\x04\x07\x76\x90\x25\xd3\x4d\x72\x14\x0c\x25\xd8\x21\xf0\x34\xa3\x98\x51\xa9\x3c\x62\x3b\x71\xc9\x40\x0e\x94\x26\x39\xf2\x8b\xbd\x03\x2e\x1d\x8d\x3c\x05\x9f\x7c\x2c\xd3\x1d\x74\x76\x46\x2d\x27\x76\x03\x5d\x07\x88\x02\x02\xdb\xfe\x9e\x07\xd1\x54\x62\x2d\x7a\xc6\x17\x5a\x5a\xfa\x79\xfe\xd4\xdc\xc1\x37\x12\x62\x0c\x41\x99\x4e\x11\xd9\x24\x30\x8f\xb2\xff\x3a\x1e\xda\x44\xc7\x61\xbc\x73\x6f\x34\x51\x22\xf0\x2a\x40\xae\x6f\x7d\xbd\x03\xd9\xfe\x96\xee\x3d\x7a\x3b\x4a\x5e\xef\xbf\xcc\x56\xdc\x42\xef\x27\xbd\x80\x85\x17\x60\x38\xb9\xeb\xae\x63\xaa\x75\x03\x52\x75\xec\x34\xe4\x18\x57\x39\xd6\x36\x24\x67\x70\xac\xcc\xc6\xdc\x62\x0e\x2f\xc9\x15\x6f\xa9\x48\x3e\x0d\x9c\xae\x0e\x8c\x46\x39\x48\xa3\xd9\x7a\xe8\xdd\xa5\x96\x6c\x88\xf0\x70\x93\x29\x2c\xce\x22\xbb\xda\x06\x2b\xaa\xfa\x7f\xe8\x4d\x0b\xa2\xd2\xdd\x29\x5b\x23\x45\x8b\xca\xeb\x2e\xf7\x42\xa2\xed\x1c\x83\x44\x83\xcd\x70\x93\x85\xaf\xea\xdc\xbc\x0a\x9c\x6a\x4f\x38\x7b\xab\xf7\xe3\xdc\x36\xc8\x10\xdb\x20\x9b\xeb\x66\xc8\x66\x64\x04\xc6\x61\xdf\xe9\xd3\x2c\x4c\x08\xaf\xc6\xf3\xb1\x25\x7d\x64\x84\xa7\x55\xf5\xac\x70\x1e\xb1\x3f\x87\x76\x3f\xee\x33\x0f\xfa\x04\x22\xcd\x80\xa9\x20\x38\xc6\xf4\x52\x92\xbd\xee\x5f\x89\xe9\x4c\x7a\x65\x21\x97\xfc\x19\x06\xb4\x82\x58\x37\x24\x49\xb1\x08\x1c\x6b\x97\x13\x4c\x43\xc8\x9e\xe2"}, +{{0xd3,0x36,0xfd,0x84,0x08,0x19,0x6d,0x22,0xfb,0x69,0x8e,0xb2,0x5b,0x76,0x54,0xfd,0xa4,0x6f,0x5d,0xe4,0xc9,0xb4,0xd0,0x49,0x50,0xc3,0x98,0xb5,0x9a,0x44,0x29,0x0a,},{0xf3,0xcd,0x96,0x34,0x7c,0xea,0x63,0xe5,0x00,0xa4,0xc9,0x2c,0x3b,0xf2,0x15,0x66,0x2d,0xd0,0x40,0x07,0x84,0xdb,0xf8,0xb5,0x95,0xdd,0x3d,0x39,0x5f,0x90,0xcc,0x12,},{0xaf,0x7e,0x2d,0xf7,0x52,0x9f,0xd1,0x8d,0x1b,0x21,0xb8,0xfd,0x4c,0x06,0x81,0x50,0x59,0x18,0xe2,0x51,0x14,0x34,0xfe,0x4e,0x49,0x54,0xe7,0x43,0xc1,0xcf,0xa4,0x5e,0x41,0x09,0xd3,0x6c,0x3e,0xec,0xf2,0xe2,0x5d,0x20,0x9b,0x9b,0x5d,0x25,0xf7,0xcb,0xc3,0x80,0x29,0x6d,0x64,0x77,0x52,0xe3,0x0d,0x3b,0xea,0x3b,0x92,0x9b,0x09,0x03,},"\xfb\x49\xc1\x9b\xc4\x44\x4c\x28\xeb\x26\x25\xf3\x1d\x99\x6d\x5e\x36\xc5\x7f\xa6\xfd\xd7\x72\xe6\x7b\x71\x99\xce\xc6\x7e\xda\x54\x51\x71\x2d\xf7\xa6\x9d\xbb\xd5\x6e\x7c\x39\x87\x96\xb2\x00\x1d\xef\x65\x1c\x4b\x9c\x05\xee\x31\xd9\x56\x79\x53\x5c\x81\x2a\x37\xd3\x1d\xdb\x30\x73\x19\x9c\xd7\x04\xff\x7c\xa2\x98\x1f\x7b\x9c\x92\x7a\x7f\x7d\x77\x6f\xb6\xf6\x09\xf7\x27\xe6\xea\x70\x9c\xe7\xf4\x3a\x60\x79\x35\x04\x16\x9a\x89\x05\xd9\xb2\x31\x09\xf0\xd8\x67\x96\x6a\xa3\xe3\x00\xc7\xe1\x1d\xde\xdb\x9c\xc1\x17\xb9\x04\xf6\x29\x27\xe4\x8e\x4d\x73\xfe\x1a\x6c\xec\xcc\x4c\xeb\x08\xe6\x4a\xb5\x5f\x25\xc9\x82\x16\xce\xc9\x37\x60\x8a\xd7\x93\x14\x69\x98\xf1\x4c\x29\x85\xe6\xc2\x91\x0d\xf7\xb1\x38\x8f\x9d\xd8\x63\xf1\xe4\xd7\xd1\x62\x14\x79\xb8\x51\x2c\xdb\x34\xe6\x73\xeb\x02\xa4\x89\x34\xe3\x9c\x2d\x18\xd7\x0f\x96\x6d\x67\x6a\x2b\xd7\x5d\xb5\x43\xd2\x5c\x5d\xcd\xc3\xef\x3b\x8b\xc8\x20\x18\x48\xc3\x09\x61\xe9\x15\xd9\x68\xbd\xc3\x19\x46\xb0\xd1\x8e\xde\x7c\xb0\x16\x6d\xbe\x1f\xfe\xff\x94\x39\xc9\xc3\x40\x4a\xf6\x01\x6c\x73\xed\xeb\x25\x3d\x93\xf5\x62\xa1\xa6\xcd\xd5\x78\x98\xa9\xb3\x42\x25\x87\xd5\xf5\x6a\xf3\xd0\x6b\x3f\x6c\x25\x75\x1f\x44\x46\x0f\xb3\x29\x96\x56\xdc\x11\x22\x7e\xf4\x83\x7a\xab\xdd\xee\x40\x0f\xa5\x3f\x69\xe5\xce\xd0\x53\xc7\x6d\xce\xcd\xf0\xad\xc9\xef\x80\xf4\xb3\x30\x54\x2f\xf1\xfa\x2d\xf0\xb8\xd4\x3c\xd1\xc3\x11\xb1\xb9\x95\x5c\x63\x2c\x8e\x5f\x04\x91\x93\x1c\x04\xde\x43\x4d\xf8\xf7\xa3\x94\xe5\xfe\xf0\x16\xdb\x2e\xb7\xc8\x7b\x2a\xc7\xa4\xa7\x30\x43\xbd\x7f\x98\xad\x0a\x4d\x45\x3a\xbf\xb0\xbe\x8b\xe4\xcb\x14\x57\x42\xaa\x56\xaa\x5e\xf2\xdf\xf1\x22\x30\xa5\x10\xe3\xb7\xf8\x2f\x78\x47\x70\x0e\xee\xa5\x90\x5b\x02\x89\x69\x6c\x4c\x14\x2b\xf3\x4b\xcf\x81\xa9\x62\xd7\x5b\x8d\x09\x10\x55\x73\x37\x79\x33\x5b\x7f\xd4\x7a\x20\xd1\x7c\x94\x8a\xb7\x32\x94\x78\x32\x67\x43\x71\xe2\x2e\x71\x11\x34\xf5\xc9\x19\x79\x23\x57\xf7\x9b\xf7\x0c\x44\x70\x78\x75\x28\x43\x4f\xc0\xb4\xca\x09\x3e\xe9\x25\x43\x42\x0d\x1c\xa8\x11\x24\xf5\x58\x53\x17\xe2\x50\x82\x1a\x4f\x3d\x8c\xe0\xf9\x19\xde\x9f\xbf\x01\x27\x08\x7e\x67\x69\x03\xf6\xcb\x39\x02\x5b\xcc\x73\xa0\x76\x29\x54\xb7\x2e\x66\xa6\xbe\x9b\x96\xc9\x7b\x6f\x60\x30\xbf\x5c\xa0\xbc\x27\x27\xa9\xa1\x79\xcf\x9d\x94\x05\xf3\xfe\x18\xf3\x49\x23\x89\x07\x9a\x5b\x65\xbc\xb1\x3a\x0d\x5e\xf4\x1c\x2c\xd9\x7e\x70\x2c\xee\x4a\x2f\xeb\x1e\x67\x02\xbd\x4c\x63\xfe\x0a\x4a\xe9\x94\xc4\x28\x7a\x83\x7b\xc3\xf6\x4c\x2d\x89\x88\x57\xcd\xb3\x2a\xcd\x4b\xd1\x33\x67\x6e\x51\xf7\x7b\xc7\x11\x0e\x3c\xe5\x2d\x92\x04\xfd\x26\x91\xa6\xd3\x70\x78\xf6\x8e\x7b\xce\xf3\x0f\xc9\xc4\x83\x98\x58\x22\xb6\x61\x11\x92\x38\xe4\x0f\x9c\xfd\xca\xbe\xf2\xd7\xb1\x6b\x05\x9a\xb2\x4a\xdc\x05\x00\x37\x12\xbb\xb1\x28\x09\x6e\x37\xf9\x1b\xc4\xc5\xc8\x15\x08\xbe\x27\xfa\x0b\x84\x94\x0b\xe3\x6b\xce\xd2\xe6\x5c\xd3\x6b\x39\xfb\xdc\x5e\xa6\x86\x14\x15\x92\x28\xca\x65\xc5\xd8\x40\x7b\xaf\x66\x3b\x52\x8e\x7d\x87\x73\x4c\x7b\xc7\x7d\xc8\x43\x1a\x1d\xd6\x87\x3c\xfd\xdf\xc3\xe7\x57\xd9\xad\x1f\xed\xd3\xc7\x98\xf1\xfe\x60\xe7\x15\xee\x48\xa6\xbc\xbb\x13\xb6\x16\xa8\x9a\x38\xe3\x36\x48\x9d\x3d\x6c\xcb\x72\x69\x14\x11\x2a\x1b\xc5\xd9\x77\xc9\xb2\xa3\xfa\xc1\x07\xad\x09\x4b\x03\x8a\xb7\x54\x68\x26\x3c\x34\xbd\xa8\x17\xc0\x56\xe0\x7a\x6c\x56\x69\x7c\xb6\x4a\x0b\x1f\x96\x6f\x6d\xe0\xbb\x1c\x0a\x71\xc8\xa5\xfe\x13\x3b\xa2\x03\x6d\x24\xda\xcc\xad\x3f\xa0\x3b\x39\xcd\x27\xf8\x32\x75\x27\x51\x05\x5a\x81\x55\x91\x3d\x04\x0f\x51\xda\xe7\x8d\x71\x94\x6c\xa0\x4d\x83\xc7\xc8\x94\xc2\x80\xaa\xec\x28\x55\x43\xe5\xfd\x5e\x32\x7a\xcc\xca\x9a\xbe\xf1\x56\xa1\x3b\x95\x71\x44\x6b\xd8\x00\x7f\xf9\x2d\xbc\x0f\xba\xf2\x3a\x94\x41\xb5\x3c\x1c\xd7\x40\xc3\x4c\x28\x29\x29\x10\x1a\xd2\xea\x8b\x85\xd7\x00\x52\x99\x1b\x77\x4e\x92\xff\x75\xcc\x85\x11\x3e\x09\x00\xb5\x1b\x86\x3e\x1f\x2a\xda\xab\x2d\xbc\xf4\x6a\xf4\x79\xea\x24\x8e\xc2\x88\x9a\xfb\xfe\x73\x74\x08\x39\x3a\x2b\x1b\x33\x01\xf6\x5c\x1f\xac\x8b\x67\x67\x95\xab\x5b\xf4\x47\xf0\x5e\x0d\xaf\x67\x76"}, +{{0x65,0x73,0x22,0x78,0x41,0xf6,0xf9,0x28,0x31,0x14,0x6c,0x44,0xc0,0xe4,0x80,0xcd,0xf5,0x44,0xbb,0x87,0x65,0x52,0xcc,0x5f,0x9d,0x42,0xf1,0x5b,0xdc,0xc0,0x44,0xb8,},{0x19,0x22,0x57,0xa5,0x4c,0xe5,0xd0,0x4c,0x19,0x43,0x9f,0xdc,0x9e,0xde,0x18,0xec,0x85,0x6e,0x29,0x87,0x0e,0x24,0xd3,0x73,0x1f,0xe2,0x22,0x47,0x99,0x94,0x9b,0x7e,},{0x53,0x8e,0xac,0xe4,0x93,0xde,0x53,0x38,0x4b,0x1e,0x98,0x5b,0xb9,0x07,0xc0,0x94,0xf8,0x16,0x84,0x30,0xda,0xb1,0x4d,0x37,0x79,0x1b,0xe6,0xe7,0x8f,0xf3,0xf5,0xa3,0x06,0xec,0x70,0xdc,0xac,0x86,0xd9,0x93,0xa4,0xc1,0xf7,0x58,0x50,0x78,0x6d,0x79,0x5f,0x02,0x2b,0x79,0xbe,0x6a,0x54,0x77,0x69,0xe4,0x15,0x69,0xc5,0xa9,0xa3,0x0a,},"\x6e\x7c\x6b\x12\x2a\xb3\x6b\xd1\x35\xf6\x9e\x2b\x85\xe7\xfc\xce\xfb\x07\x2c\x12\xcf\x08\x8a\x32\x29\xd8\x76\xef\xf5\x32\x38\x9f\x05\x77\x11\x6f\x7a\xf2\x9f\x11\x95\xe3\x82\x88\x39\x38\x13\x80\x46\x71\x78\xb2\x29\xc5\xa1\x8d\x7c\x49\x43\xec\x97\x0d\xd1\x8b\xce\x72\x3b\xd0\xca\x91\xff\xa9\x55\x63\x54\x6a\x32\x4f\xe0\xb9\xbf\x6c\x04\x55\xd4\x27\x60\x39\xe8\xd2\x91\xfc\x72\x76\xaa\x55\xa1\xcd\x3e\xa0\x52\x82\x65\x4a\x7f\x97\x00\xad\xcb\xc7\x80\x77\xc5\xdd\x0f\xc8\x6e\xce\xd4\x8f\x4a\x60\xcc\xb7\x6b\xfb\x8b\x45\x62\xba\xc2\x2a\x02\xd1\x9e\x44\x89\x39\x4a\xb9\x71\x9f\xc1\x44\xf5\xdb\x2e\xf0\x39\xb3\x7f\x3b\x51\xd1\xd6\x57\xa0\xcf\x83\x5d\x71\xf1\xa4\xaf\x01\xeb\x9f\xd8\x85\xc6\x04\xa6\x24\xcb\xe9\x10\xbf\xde\x09\x3a\xd3\xf0\xcb\xfd\x9a\x48\x30\x73\x29\xd4\x42\x34\xbd\x01\x19\x1d\x56\xe5\x22\xd7\x2b\x54\xe1\xfe\x47\x33\xda\x3a\xec\x68\x27\xea\xb3\x55\x48\x98\xe0\x3e\x57\x7b\x4e\x7b\x9d\xd3\xf3\x08\xe6\x16\x80\x8d\x02\x94\x49\x9f\x28\x86\x29\x5e\x54\xc3\x60\x19\x9c\xa8\x3a\x83\xff\x46\x19\x5e\xa3\xc4\x84\xa6\x68\x38\xd5\x1a\xcb\xe9\x61\x1e\xee\x03\x6a\xe2\x81\xc6\x79\x3c\xbd\x45\x1f\x92\x71\xfb\x5d\x25\xea\x7c\x18\x99\xab\x5d\x43\xed\x8b\x9d\x06\x7b\xc5\x6d\x8d\x4a\x15\xf1\xda\xb8\xd8\xd9\x5d\x1b\x17\xaf\x64\xcb\x18\xc1\x14\x75\x51\x14\x7a\xdd\xcb\xdd\x53\xfb\xcc\xd9\x02\x6f\x85\x55\x47\x13\x1b\xee\x95\x07\x16\x39\xf6\x49\xf2\xd0\x35\xa2\x5a\x3e\x42\xe3\x8e\x22\xbb\xf0\x38\x10\x6c\xe8\xbc\x4a\xd6\x76\x8a\xb9\x2c\xd5\x7a\xfa\xcd\x04\xee\x55\xcf\x07\x14\xb7\x68\x95\x2d\xac\x24\x0b\x1e\x9b\x28\x35\xec\xf7\xb0\xd6\xc4\x07\xc8\x25\x24\xa9\x23\xb9\xf5\x4d\x1b\x8f\x12\x56\x4a\x87\x21\x44\xef\xad\x3f\x3a\x7d\x23\x97\xcd\x12\x17\xdc\x5a\x9c\x96\xe4\x3b\x29\x60\xa8\x42\x5e\x97\xe0\x7a\x02\xb0\xda\xc9\x0f\x34\x6b\x91\xa3\x46\xa2\x3e\xd2\xbb\x7f\xe6\x91\x9c\x22\xdf\xf0\x3f\x62\xda\x7d\xba\x17\x6e\x8d\xdb\x22\xf3\xf3\xa6\x68\x89\x1d\x3f\x4e\x69\x54\x8d\x0a\xc4\xe7\x1e\x6d\x28\xed\x5a\x67\xab\x5a\xc6\x11\xd4\x60\xb6\x7a\x20\x1f\x4f\x56\xa5\x00\x3c\xa7\xa7\xd1\xcd\x1d\xb6\xc1\x00\x75\xb0\x92\x27\xcb\x8c\x5d\xc1\x66\x6f\x8b\xe7\x10\xb4\xb7\xbc\x2b\x95\xae\x60\xda\x4f\x64\x17\x9a\x50\xd2\xf8\x87\x44\x36\x15\x91\x67\x1d\x36\xb7\x29\x63\x15\xf6\x99\x64\x39\xad\x79\x82\x1d\xa8\xe7\x72\xdf\xbf\x55\xa9\x0d\x5d\x52\xef\x7d\x76\xb3\x5f\xfe\xbd\x42\xe3\x52\x5f\x45\x30\xc5\x4a\x0f\x23\xb4\xd0\x7c\x5f\x59\x74\x47\x0e\x89\x40\x4d\x17\x6e\xef\xf9\xef\x23\x33\x61\x96\x91\xc5\x9b\x7a\xad\xd4\x2c\x29\x6b\x1d\x0d\x32\x8d\x9a\x3b\xd5\x9a\x54\xbb\xa9\x3a\x0c\x1f\x1d\x62\x41\x8c\x21\x90\xc3\x81\x74\xb6\xab\xea\x02\xdb\x66\xe8\x18\x32\x0e\xc4\xb8\xba\xc1\xc1\x2f\x18\xf3\x0d\xad\xe2\x7e\x63\xc5\x8f\x9e\x7c\xaf\x4b\xf6\x9b\x26\x5a\x2f\x9d\x91\x80\x08\x61\xac\xf4\x79\xe6\x5e\xc1\x7e\x68\x05\x77\xe0\x58\xcb\x16\xc1\x09\xbc\xf9\xb2\x90\x9f\xce\x33\x61\xa2\xc2\x68\x5c\x10\xbe\x85\x40\xa1\x22\x2d\xb5\xec\xf0\xcc\x4d\x53\xa4\x21\x4b\x7b\xf6\x24\x8a\xdc\x3a\x86\x1e\x34\x84\x1a\x37\x79\xc4\x60\x46\xc5\x36\x4f\x1e\xa9\x1a\x78\xc9\x70\x0d\x46\x2e\xcf\xaa\xe3\x6b\xa7\x60\xc1\xbd\x6a\x23\x7c\x96\x1e\xdf\x40\x22\xce\xde\xfe\x5e\x93\x7b\xbe\xd7\x05\x1a\xe6\x1b\x96\xd0\x8b\x04\x87\xce\x05\x68\xff\x0d\x32\x74\x0b\xbd\x49\xad\x0d\xb8\x6e\x09\x10\x2a\xb2\x1a\x91\x56\x16\xe9\xdf\xdd\xc8\x1e\xbf\xb3\x6c\x90\x3e\x07\xa4\x0c\xd2\xdd\x11\x9f\xf4\xa5\x0b\x93\xfc\x6f\xdf\xc0\xf3\x6e\x59\xe0\x14\x8f\xcf\xf3\xfe\x8e\x2c\xd6\xd3\x0a\x9e\x4b\x8f\x01\x55\x67\xd1\x18\xb6\x27\x4e\x1e\xd7\x5b\x22\xe4\x4c\xa9\xd9\xdb\xfc\x16\x07\x42\xcf\xac\x58\x1e\x1a\x0b\xf5\xff\x33\x26\xbc\x5f\x78\x96\xb9\xca\x05\xa8\x11\xd5\x5e\x97\xc8\x34\xd3\x7a\x64\x95\xcc\x26\xcf\x44\x2b\xd2\xd9\x01\x29\x89\x5e\x9c\xc0\xed\x01\xe2\x15\x52\x93\xf4\x7a\x07\xab\x58\x80\xc6\xca\x29\xed\x44\xd9\xcc\xbc\xaa\xda\x7f\x3e\xb6\x04\x02\x18\x14\x88\x65\x4e\x04\x91\x15\x78\xb1\xaa\x9c\xdd\x4b\x86\xb0\xdd\x24\x50\xdf\x3a\x43\x08\x1e\x41\x10\xab\x58\xde\x76\x39\x24\xd3\xc8\x91\x52\xe9\x92\x93\xe6\x38\xf9\xac\xd8\xd7"}, +{{0xa6,0x3c,0x1f,0x54,0xb2,0xca,0x05,0x8f,0xed,0x2e,0xe2,0x50,0x4b,0x98,0x3f,0xf3,0x3d,0x57,0x0a,0x9b,0xab,0xa5,0x83,0xc0,0x86,0xce,0xfe,0x19,0xf4,0x3e,0xc4,0x9d,},{0x32,0x9b,0x86,0x6b,0xca,0x41,0x94,0x29,0x7f,0xc1,0xad,0x5a,0x0e,0xba,0x0d,0xf9,0x56,0x69,0x9c,0x74,0xab,0x7d,0xa5,0xfa,0x54,0x62,0xbd,0x06,0x61,0x47,0x10,0x20,},{0x28,0x33,0x59,0xbe,0x41,0x29,0x0a,0x51,0xe6,0xa7,0xc5,0xd5,0x72,0x5c,0xa4,0xea,0x0a,0x68,0xf1,0x4a,0xca,0x14,0xb0,0xf0,0x25,0x66,0xde,0xe2,0x1f,0x49,0x0d,0xa3,0xc7,0xe9,0x5f,0x7a,0xb7,0x39,0xbc,0x35,0xa7,0xf4,0xf2,0x32,0xe9,0x71,0xaa,0x15,0x76,0x57,0xa6,0x33,0xeb,0xa0,0xe7,0x2d,0xc9,0x7a,0xf3,0x2c,0xdb,0x92,0x87,0x02,},"\x79\x1b\x86\xfd\x58\x77\x13\x47\x8f\x92\x34\xff\x30\xce\xfc\x12\x3c\xd7\xc3\xeb\x12\x5f\xa7\x4e\x4c\x6d\xb6\x4e\x78\x44\xf7\xc8\x5b\x16\x86\xe7\x1e\xd0\x8d\x1a\x6a\x04\xe0\xeb\xbd\xff\x4a\xb1\x60\xc9\x76\xc8\xab\x9b\x50\x5f\x6a\x7e\xb0\xa1\x84\x27\xe9\x99\xa8\x82\x8d\xf1\x06\x84\xf8\xc7\x5b\x6a\x6b\x0a\x64\xc0\xaf\xa4\xbb\x22\xbe\xd1\xcb\x93\x25\x35\x9c\xac\x3b\x8c\x50\x8d\x98\xbc\xb0\xeb\xcd\x74\x8d\xc1\x32\xf1\xd6\xa3\x60\xa4\x45\x0d\x12\x92\xa1\xfe\xfc\x4e\x57\xe4\x10\x7a\x22\x3f\x42\x1e\x7d\x14\xa3\x84\xb8\x5c\x18\x84\x4d\x0b\x9e\xed\x2e\xcb\x81\xbb\x74\xe8\xa1\x26\x52\xd9\x85\x05\x79\x5a\x01\x31\x16\xa7\x07\x6c\xcb\x54\x93\xd6\xa7\x11\xf7\x63\x7e\x97\xa7\x80\xe7\x4d\xa1\xb3\x9b\x15\xcc\x7b\xbd\xe2\xe6\xc4\xd0\xd3\xe8\x30\x05\x97\xc8\x36\xe8\x0b\xcb\x8d\x80\x81\xd9\x74\xe0\x24\x32\xea\xc8\x83\x68\x21\x1d\x3a\xaa\xe8\x9a\x14\x41\x71\x08\xe1\xff\x67\x37\x08\x38\x49\xc6\x25\xb4\x0d\x63\x1f\x6c\x83\x57\x22\x0c\x7f\x37\x38\x0b\x3b\x2c\xc5\xd0\xe2\xdf\x6b\x4d\x11\x96\x57\x9d\xbc\x57\xb6\xc9\xea\x0d\x41\xf4\xfa\x0e\x55\x6f\x94\x3c\x94\x48\xef\x42\xfc\x78\xdf\x59\x96\x64\x8c\xe2\xf3\xde\x04\xd8\xa6\x63\xf9\x67\xf3\xd9\x33\xd4\xf6\x53\x57\xab\x29\xba\x5b\x64\x05\xfb\x16\x29\x72\x57\x8d\xdb\xb2\x36\x7b\xed\x14\x3c\x85\x4c\x10\x88\xde\x92\x1d\x79\xf5\xa9\x2a\x85\x48\x37\xeb\x77\x02\xe1\xba\x92\x5c\x6e\xac\x23\xd1\x34\xba\x1b\xaf\xc5\xd4\x6d\xe2\xa1\x94\x2c\x7f\x36\x6f\x70\x1b\x0a\xfa\xbb\x75\xcb\x1d\x80\x8e\x1a\x1e\x4e\x3a\xe5\xde\x88\xe8\xe9\x98\x97\x57\x45\x8b\xdd\xd8\xa8\x06\xc1\x10\xcc\x3a\x73\x3d\x1d\x4a\xc5\x8a\x40\x5c\x4d\x81\x13\x4f\xbc\x24\xcc\xde\x7d\x5a\xfe\x42\x0f\x9f\x17\x85\xf0\xa5\x02\x0f\xaf\xbb\x22\x61\x22\x25\x08\xaa\x05\x28\xb7\xb4\x8b\x56\x72\x00\x95\x84\x25\xef\xcb\x42\x93\x4a\x88\x0b\x13\x34\x44\xbb\x10\x9f\x2a\x95\x4c\xfa\x35\xa2\xd1\x7c\xb0\x5e\xe3\xf1\x6d\x06\xb3\x21\xa1\x5f\x91\x33\x9a\xbe\xda\x24\x3a\xd6\xc0\x91\x9f\xac\x51\xe9\x07\xe0\x53\xfd\xee\xd1\xcf\x03\x00\x37\x34\x13\x77\x93\x94\x1b\x8a\xdf\x9a\xb6\xaf\x81\x9c\x24\x5d\x6d\x56\xf1\x69\x64\xc8\xa7\x5b\x07\x56\xa8\xcb\x0c\xa8\xc1\x2a\xc6\xe6\xb3\x94\x2e\xeb\xec\x2f\x86\x88\x35\xf8\x1b\x10\x9d\xb4\x98\xa4\xca\x2e\x02\x1f\xa7\x65\x60\x8d\x23\xd8\x03\xde\xdc\x9e\x51\x45\x3f\xc1\xd2\xa6\xa3\x8a\x4a\xab\x25\x7c\x0f\xe7\xd6\x7d\x32\xa5\x41\xe0\x14\xb6\x0e\x10\x13\xa9\x2c\x1b\x3a\xd9\xe6\xf1\x1b\xe2\x93\xb2\x46\xf9\xa0\xc6\x44\x0b\x0b\x54\xfe\xe7\x5f\xed\x2f\xb7\x5c\xc9\x1e\xcb\x32\x73\x8c\x49\x58\x31\x58\x6a\x11\x24\x2d\x87\xdc\xb4\x88\x3e\xdf\x67\x57\xa5\x0b\x18\x84\x37\x59\xb9\x8d\xd0\xce\xf4\xa3\xfe\x10\xd7\x63\x70\xec\xda\x8c\x83\xfa\xb8\x7e\xee\x26\x56\xc5\xf2\x61\xc3\x40\xea\x91\xa5\x60\xd0\xe2\xc6\x42\x89\x26\x7f\x00\x36\xba\x35\x94\x48\x00\xa5\xa0\xae\xf3\xf1\xdf\x83\x9a\x72\x4e\x18\x1d\x79\xb8\xa3\xc1\x6f\x65\xae\x27\x95\x3c\x4a\xae\x8c\xcd\x30\xff\x5a\xcc\x4b\x31\xe4\x76\x5c\x68\xfb\x38\x31\x9f\x10\xac\xf8\x92\x47\xb5\xa3\x9b\x3b\x08\xa1\x91\x75\x4a\x24\xac\xa9\x59\x6a\x1f\x8a\x70\xb6\xe4\xf0\x3a\x20\x04\xa9\x08\x6f\xf6\xed\x07\x65\x2a\x92\x6e\x1e\x2d\xf7\xbd\xcc\xd5\xbe\xc1\x6e\x5c\x4e\x96\x83\x64\xa0\x9a\xbf\x9d\xed\x93\xdf\x5f\xca\x0b\xcc\xa5\xc8\x12\x97\x6e\x5c\xfb\x3c\x34\x93\xfc\x17\x5d\x1d\x92\xee\x8d\x1c\x98\xfb\x33\x82\xb3\xab\x90\xc5\xc0\xe4\xbd\xf6\xa3\xac\x94\x76\x7b\x68\xd4\x7e\x6b\x9c\x24\x42\x65\xe3\xb1\xab\x06\x23\xa8\xf0\x10\x02\x73\xf2\xc6\x07\xde\x89\x61\x2c\x72\xd3\x9b\xe4\xc0\xb4\xd7\x7a\x3c\x61\x36\x8d\xf4\x0b\x36\x08\x65\x29\x89\xd1\xe1\x9c\x0a\xaf\x0e\x3c\x25\x3e\x56\x2c\x64\x09\xfe\x64\x48\x92\x9b\x33\x75\x3d\xe1\x62\xe6\xde\x5b\xd4\x66\xa5\x11\x4f\xc0\xe5\xf5\x71\x02\x75\x5e\x29\x54\x4f\x03\xb2\x8d\x4f\x78\xde\x9a\x02\x4d\xd4\xc4\xe8\xc3\xc2\xd4\x41\x15\xa7\xae\x15\xed\xb4\xf5\x58\xaa\x7d\xba\x64\x26\xe7\xe3\x72\xc5\x4f\x79\x40\xbd\x77\x14\x46\x7f\x8c\x3a\x1a\xdd\x3c\x64\x01\x89\xc3\x16\x60\xd8\xcc\x01\xd3\xc5\x38\x2e\x42\xab\xc1\x04\xc7\x23\xf9\x48\xa8\x04\xca\x85\x30\x47\xb6\xb8\x7b\x5b\x6e\xf4"}, +{{0x5b,0x67,0xa6,0xd7,0xc6,0x50,0xdd,0x92,0xdd,0xd0,0x36,0xce,0x7a,0x30,0x5b,0xc9,0x59,0xa4,0x97,0xc5,0xe5,0x15,0xa6,0x84,0x93,0x03,0x5c,0xb3,0x85,0x0e,0xe0,0x3d,},{0x4c,0x6f,0xc1,0x64,0x05,0x05,0xfb,0x46,0x66,0x9f,0x93,0x04,0x8f,0x8e,0xf5,0x57,0x09,0x9f,0x3f,0xd9,0x2a,0x53,0x06,0x4b,0x16,0x33,0x63,0xa3,0x1b,0x7f,0x00,0xaa,},{0x0f,0x07,0x3c,0x9a,0x58,0x6f,0x6f,0x5e,0x08,0x38,0x9a,0x2a,0x5e,0x18,0x08,0xe2,0x70,0xf0,0xed,0xb6,0xaf,0x10,0x44,0x96,0xf9,0x37,0x57,0x62,0x3f,0xea,0x53,0x13,0x3a,0x73,0x1c,0x44,0x5a,0xc2,0x35,0x78,0xcd,0x56,0xa3,0x88,0x3c,0x08,0x95,0x86,0x68,0x63,0x1f,0xed,0xf1,0x44,0x6c,0xe3,0x4f,0x85,0x7f,0x90,0x82,0x2b,0xa8,0x0a,},"\x62\xcc\xde\x31\x77\x2c\x57\xe4\x85\x3a\xaf\x2a\x81\x81\xfd\xb5\x3f\xb8\x27\x90\xea\x65\x01\xbf\xc8\xf5\xd4\xae\x8d\xbd\x52\xde\x42\xce\x2e\x89\x61\xac\x17\x31\xf4\xbc\x08\x5f\xb5\x61\xef\x09\xa2\x44\x29\x70\xb6\x29\x79\x01\xae\xaa\x2e\xe5\x55\xb7\xd5\xe3\x95\x1c\x7c\x35\x12\x39\xdd\xee\x95\xff\x54\xf9\x24\xda\x95\xca\xe7\xb1\x5b\xa6\xa9\xa1\x33\x7b\x8c\xe4\x92\x1e\xd9\x13\xcd\x79\x1c\x1c\x69\x41\x08\x0e\x54\x8f\x3c\x36\xe8\x45\xac\xbf\xd8\xd8\xce\x35\xe2\xfd\xc2\xa2\xad\x6c\x7e\x24\x61\xbf\xcb\xf1\xaa\xbc\x55\xcf\x0f\xae\x42\x88\x85\xbe\x5e\x86\x53\x33\x08\xc9\x75\x68\x05\x21\x9a\xbd\x7f\xfc\x16\x57\xb6\xf4\x63\x29\x20\xa0\xc1\x0e\x0e\x36\x33\x19\xd9\x00\xfc\xd6\x1e\x7d\xdb\xcd\x6e\x76\x2a\x7d\xb9\x24\x80\xc3\x63\xb2\xc0\x64\x0c\x6b\xf3\x2d\x69\x0d\xd8\x29\xd8\x40\x5f\xa6\x6e\x47\x83\xeb\xe1\xcb\xde\x95\x47\x95\x4a\x90\xba\xad\x9f\x77\x4e\x94\x54\x9a\xbb\xff\x2c\x1f\x5c\xae\xc2\xbf\xd2\x8e\x41\x5d\x36\x42\x9d\x58\x51\x8c\x3e\x17\xe8\x69\x9e\x19\x89\xd4\x7b\x8d\x62\x7e\xf9\xab\x4d\x1e\x7d\x12\x0b\x37\x2c\x21\x41\x30\x4f\x7f\xab\xd0\x26\x5b\x8b\xe4\x1f\x54\x67\xf4\xde\x9e\x65\xc1\x25\xee\x1f\x27\xa2\x89\xc4\xf7\xc9\xa1\xfb\xf2\x5b\xfc\x2f\x8d\x30\x8e\x7f\xf5\x21\x91\xcb\x76\x44\xc6\xaf\x20\x45\x22\xf2\xac\x87\xb5\xf4\x05\x25\xfd\x43\xd3\x08\xc8\xdb\xc6\xa8\x61\xd2\x5d\xb2\x3e\xe2\x76\x67\x8a\x1b\x6e\x8e\x91\x28\x3b\xe0\x24\x70\x48\x2e\xd6\xcc\x9f\x6e\x39\x63\x51\xd1\x1b\x1c\x7e\x22\x32\x9c\x09\x1f\xe7\xd3\x68\xf6\x06\x53\xf9\x3b\x0f\x6a\x3f\x71\x2c\x20\xf9\xd2\xd8\xa9\xa0\x81\x98\x72\xf0\xc7\x1d\x7b\x1c\x0b\xc1\x68\x3a\x15\x2b\x48\x4b\xc2\x1c\xf5\x56\x09\x3a\xb4\xc0\xac\x16\xd3\x22\xff\x0b\xf4\x52\xe5\x58\x1e\x1e\x72\x41\x67\x38\x84\x02\x3c\x7d\x6e\x17\xe2\xde\x80\x59\xf6\x0e\x4c\x18\xe1\x3b\xd5\x5f\xcf\xee\x62\x3f\xd0\x46\x9c\x0d\x09\x11\x61\x1d\x09\x9a\x25\x70\x20\xf2\xf3\x1b\xf5\x07\x8e\x6e\x65\xa1\x35\xd5\xbf\x40\x76\x20\x23\x6d\x6c\xc7\x59\x31\x0f\xa7\x28\xff\x8b\xb5\xec\x56\xab\xbe\x1a\x3c\xd1\x51\x53\xf8\x92\xd9\x58\xd3\x0d\x16\x2d\x01\xee\x66\x5f\x5b\x56\x27\x81\xd8\xdc\xf8\x42\x80\x59\xe5\xfd\x22\x5a\xd7\x8a\x99\xea\x76\x0f\xe5\xd9\xee\x82\x19\xc9\x5a\xcb\x18\xd0\x56\x22\xe1\x0a\x9b\x6c\x67\xf6\xd4\xf6\xed\x11\x63\x5c\x5e\x2e\x0f\x85\xdd\x5d\x3c\xbd\xa6\x5a\xa4\x23\xd5\x94\xa8\x0b\x40\x42\x7b\xc3\x21\xe0\xee\xf9\xaf\xd2\xbc\x87\x46\xab\x73\x99\xff\x6d\x0e\x12\x87\xb6\x61\xdd\xc4\x06\x2d\x07\x20\x18\xf4\xc1\x0e\x86\xcf\xae\xd7\x2d\x9e\x68\x6e\xd0\x9d\x52\x55\xd3\x60\xe3\xee\xa2\xc2\x9b\x9e\xae\xa0\x5f\xc7\x8c\x8c\xdb\x8c\x9d\x4a\xfc\x7a\xdc\x6d\x4a\xa0\x67\xb7\xab\xfb\x0a\x4e\x94\x0a\x77\x58\x0e\xc2\x06\x45\x6c\xb9\xe9\xf9\x5f\x6d\x56\x5d\x53\x6e\x53\x5a\x16\x7e\xde\x8e\x20\xec\x36\x08\x1e\x2f\xc5\x5a\xef\xaf\x24\xd2\x27\xff\xfe\x5e\x6c\xb0\x30\x93\xf4\x43\xb4\xc5\x16\x55\xd9\x1c\xa6\xf2\x75\x95\x9d\x1a\x80\x2a\xde\xab\x44\x70\x1b\x31\xe8\xb0\xfd\x02\x22\xc4\x99\x96\x6c\x72\xd1\x02\x0a\xd9\x37\x0e\x28\x02\xbe\x04\xc9\x93\x3f\x6b\x77\x4f\x6e\x8c\x69\xfc\x0b\xfd\x31\x59\x39\xa1\x27\xb4\xe0\x6d\x0f\x6f\x5e\xde\x67\x1c\xe1\x16\x12\x12\x6b\x51\x87\xb5\x33\x29\xb0\xa9\xcb\x7d\xa3\xb1\xcc\xd6\x7b\x8c\x07\xba\xb9\x9a\x66\x2d\xf8\xce\x85\x1f\x50\x2f\xc4\xe1\xed\x16\x32\xb6\xba\x55\x55\x44\x01\x8f\x75\x27\xe3\x62\xef\xc7\xe3\xb2\xba\x6f\x75\xa1\x25\x4f\x42\x8b\x3b\x7e\x0b\xea\x69\x54\x9e\x7f\x9c\x73\x62\x75\x55\x00\x80\xae\xe3\xaf\x59\x14\xe3\xa3\x4b\xe6\x56\xc7\x7f\x6b\x29\x42\x0e\x54\x33\xf3\xdf\xf3\x81\x1f\x35\x28\x20\x8e\x9d\x85\x0a\xa3\xc2\x9b\x0f\x77\x8a\x24\x27\xd5\xfd\xe3\x07\x32\xdf\xe5\x04\x43\xa9\xc1\xad\x55\xc7\x2a\x08\xab\x26\xff\xaf\x8e\xfb\x90\xbc\xaf\xd3\x72\x6b\x00\xc0\x05\xc8\xc0\xf0\xdb\xf2\xa1\x35\x30\x86\x72\x1e\x44\x65\x45\xb8\x13\x44\x11\x94\xa7\x55\xfd\x26\xb9\x63\xaf\xd9\x77\x27\x8d\x1b\x10\xf0\x90\x01\xc7\xed\x97\x54\x03\xc1\x5c\xbe\x7f\x99\x2a\xb0\x7b\x84\x70\xc9\x39\xf8\x66\xf4\x20\xf7\x7d\xb7\x79\xaf\x83\x97\x00\x32\x9e\x07\x77\xa6\x11\x63\x65\xd7\x6c\x36\xd0\x9d\x86\x04\x72\xa5"}, +{{0x26,0x31,0xc8,0xc3,0x4d,0x29,0x48,0xdd,0xd5,0x99,0x6b,0x41,0x49,0xce,0xfd,0x23,0x8e,0xa7,0x45,0x2e,0xc2,0x2e,0x24,0x61,0x24,0xdf,0xa2,0x79,0xcc,0xc2,0x7d,0xb8,},{0xc3,0x90,0x67,0x86,0xff,0xb8,0xa7,0xc2,0x7c,0x44,0xc2,0x44,0x7f,0x9d,0xde,0x7d,0x66,0x6d,0xfe,0x58,0x8c,0xfc,0x54,0xf2,0xd2,0x50,0x40,0x51,0x2a,0x37,0x1b,0xc1,},{0x0a,0xdc,0x6f,0xa4,0x0f,0xfb,0x81,0xf6,0xef,0x4e,0x41,0x87,0x55,0x49,0x17,0x77,0x5c,0xf4,0x65,0xe7,0xb5,0xe8,0x57,0xf2,0xe1,0xe7,0xf4,0x00,0x97,0x71,0x06,0xd2,0x37,0x7e,0xbc,0x76,0xab,0xb1,0xdb,0x92,0x4c,0x64,0x86,0x7e,0x3c,0x6f,0xe3,0x8c,0x0b,0x4f,0xcb,0x1d,0x0f,0x94,0x68,0xe8,0xfb,0x23,0x50,0x29,0xa8,0x1c,0xe6,0x04,},"\x6f\x9b\xdc\xe1\x44\x3f\x28\x56\xd4\xa2\xf2\x27\x82\x83\x50\x12\xb7\x81\x8a\x0e\x02\x0d\xbc\xc2\x2a\x82\x16\x58\x30\x5f\x13\x42\x34\xd1\x4c\xea\x63\x61\x00\xed\x89\x6c\x2a\x8f\xb0\xe8\x70\x48\xec\x6f\x8b\x31\x48\x4f\x78\xeb\x17\x10\x45\xad\xd7\x2c\x85\x71\x0e\xc9\xf9\xb5\xd4\x36\x23\x41\x7b\x56\x53\xbe\x86\xe7\xfb\xf8\xb4\xff\x91\x11\x0a\x80\x8c\xb4\x1a\xcf\x66\xd4\x36\xe8\x9a\x73\x7f\xae\xa4\xef\xf3\x54\x49\x60\xf1\x14\xb8\x33\xb0\xb4\xeb\xc2\xc1\x40\x70\xb0\xbf\xb7\xb0\x05\x7e\xeb\xb8\x42\xbd\x1c\x1e\xd4\x58\xad\x34\x28\xf8\xf7\x2a\x1d\x1d\xb3\xc4\xcb\x47\x97\xa3\x99\xd4\x7a\x1e\x6d\xb7\x4d\xcb\x2e\xe2\x4a\xe8\x15\x85\xcf\x66\xef\x6d\x9b\xd2\x23\xf0\xf5\x4b\xc8\xc1\xce\xc1\xbb\x44\x60\xbe\xf4\xff\xd3\x2e\xe8\x05\xc3\xca\x5e\xe9\x76\xff\x9c\x14\x55\x9f\x8d\x75\x66\x62\xa2\xbc\x19\xe4\xc5\x98\x54\x06\xa0\x73\x05\xc9\x95\x0d\x86\x6c\x9a\x79\xa3\xe5\xf6\xc5\x96\x97\x53\xa1\x70\xe0\xfc\x4c\xc0\x9c\x6d\x87\xa1\x2b\x44\xcd\xf3\xbe\x16\x23\x15\x9e\x90\xca\xb7\xa8\xa3\xe6\xf0\x1f\x26\x85\x95\xb0\x21\xb1\xef\x7d\x00\x76\x94\x77\x27\x0d\x55\x84\xc9\x12\xe2\x2a\x36\x74\x38\x27\x7f\x59\xdf\x20\xc5\x62\x0d\xd5\xbe\xaa\x9b\xb6\x0b\xee\x47\xf4\xaf\x52\x7d\x89\x29\x57\xb2\xd1\x2b\x67\x8b\x52\x79\xa3\xf8\x32\x64\x65\x4c\x0a\x0f\x8d\x21\xe7\x09\x66\x8f\x30\xfb\x6e\x68\xf0\x47\xd0\xd9\xa7\xc2\xae\x9a\x28\xf7\xcb\x9d\xbf\x18\xf6\x3f\xc1\x66\x1f\x07\xd3\x10\xe5\x40\xc7\x76\x31\xf5\xbd\xac\x58\x24\x68\x5d\x7c\x9a\xba\x0f\xe1\xd0\x94\x07\xa9\x66\x2e\xf1\x8e\xb3\xe2\x8f\xd1\xe8\xbc\x89\x26\x57\xbc\x38\x24\x3a\x2e\x64\x53\xbd\xae\xab\xb2\x79\x1f\xc5\x48\x95\x21\x29\x54\x57\xad\x04\x18\x0c\xa8\x71\xf6\x31\x87\x92\xbd\x15\xfd\x18\x00\xce\x59\xdd\x3e\xcc\x7e\x0b\x72\x97\x92\x67\xd8\x18\x3e\x80\x4f\xdd\x45\xda\xad\x84\xfc\x4c\xaf\xeb\x56\x1e\xa8\xd6\xa7\x4a\x7c\xde\x72\x2d\x96\x25\x3a\xb3\xe7\x5f\x0a\xdd\xe0\x2a\x61\xfd\x5e\x1f\x59\xcb\x1f\x5f\x1b\x2e\x05\x26\x43\x58\x9a\x9e\x4b\xe4\xdd\x6e\xe6\x45\x38\xcb\x0b\x10\x9a\x11\x3f\x30\xa5\x8b\x35\x65\x62\x40\x43\x66\x2a\xbe\x17\xf6\x0e\x31\xe8\x9c\x36\xc9\x95\xe0\x0a\xe0\x7f\x56\xa9\x11\x8a\x31\xae\xc2\x4a\xd5\x44\xbc\x96\x58\x11\x21\x8d\xf8\x27\xc1\x73\x0b\xb9\x04\xbb\x79\xb6\x86\x13\xf6\xc9\x94\x67\x9b\x69\x90\xd7\x75\xb5\xcb\x32\xdb\x97\x19\x4b\xd8\x10\x19\xbe\xa4\x1f\x3a\x7e\xef\x50\x1b\xf8\x49\x1b\x0e\xa8\x59\x38\x84\x52\xe3\xec\xbe\x16\xaa\x7d\x56\x91\x51\x0a\x66\x06\xc4\x93\xe4\xc2\x93\x96\x1b\xf4\x0b\x4c\xd3\x00\xd9\xd2\x2e\xa1\xa7\x72\x4c\x07\x8b\x8b\xab\x1f\xd1\x65\x04\xe9\x89\xb1\x36\xd9\x25\x1a\xc9\xf1\xed\x94\xa5\xe9\xac\xbd\x9c\x04\xf8\x05\x8a\xfe\x03\x04\x9a\xed\x8b\xa2\x9f\xa2\xe8\xfb\x44\xf8\xe8\xc0\x4e\x87\x27\xf3\x99\xe7\x35\xe6\xc1\x49\x6a\x91\xa9\xb2\xcd\x2a\xb0\x2d\x43\xb2\x85\xe9\xd7\x61\x02\x93\xb6\x74\x9d\xf1\x04\x4b\x30\xe2\xda\x99\xa5\x64\x42\x9a\x23\xe6\x8c\x96\xfc\xe9\x2b\x08\xa0\x0b\x7b\x74\x2b\xa9\x7a\x62\xee\x58\x77\x6d\x7d\xd5\x65\xa4\x90\x07\x1d\x4b\x19\xdc\x64\x8e\x03\x32\x9c\xc5\xc8\x25\xd3\x87\xeb\xa4\x9e\x2e\xff\x6c\x43\x41\x86\x5c\x46\x4f\x13\xf1\xbe\xb1\x82\x7a\x7f\x26\x8c\xc1\x5a\x98\x24\x80\xbf\x08\x4f\xe3\x65\x2c\x1b\x0e\x0b\x4a\xd2\x62\x55\x85\x9a\xbf\x1c\x8a\x7f\x9b\x3b\xef\x09\x8a\x94\x07\xfd\xea\x0a\x53\x9e\xb0\x08\xfd\xd7\x49\xfa\x01\x86\xcc\x01\x69\xd9\xd9\xe6\x8f\xe5\xe5\x4c\xac\x32\xce\x57\xb5\xc8\x4c\x2d\x80\x5e\xca\x39\xc2\xdb\xbd\xd2\xe0\x2f\x7d\x22\x88\x26\x71\x2f\xf4\xa6\x14\x11\xca\x0a\xeb\x6f\x01\xa1\xf8\x0e\xf2\x9e\xeb\x07\x1a\x43\x22\x2d\x94\x97\x18\x4b\xd8\x5d\x9e\x44\xb1\x66\xbe\x97\xcf\xd2\xa7\x32\xaf\x4a\x23\x34\x63\xd3\xab\x54\x3a\x7a\x3c\x7a\xec\x55\x56\x56\x56\x88\x40\xf4\xdf\xea\x21\x7f\x65\x53\xaa\x98\xaf\x32\x4c\x12\xb2\xc3\x21\x4e\xe7\x6e\xec\x70\x06\x70\xaf\x68\xc8\xc1\xf3\x69\x46\xef\xd7\xff\x09\x33\xe5\x45\x3f\x12\x8e\x97\x15\xfd\xb3\x34\x4a\xc1\x0c\x4b\xb7\xec\x8f\x10\xdd\xf5\xdb\x71\xf1\xcf\x0e\xfe\x40\xf7\x5e\x5b\x63\x34\xef\x8c\xf8\x42\x9b\x32\x91\xe6\xe4\xce\x37\x9c\x17\x8a\xff\xcb\xc6\x10\x30\xeb\x89\x6d\x74\x4d"}, +{{0x39,0x76,0x9a,0x66,0xf0,0xca,0x12,0x90,0xfd,0xa1,0x43,0x75,0xb3,0x5c,0x66,0x3f,0x6a,0x4b,0x2a,0xb3,0x60,0x71,0x79,0xab,0xd9,0x90,0x63,0xe2,0xef,0xa2,0xc6,0xa8,},{0xf9,0xfd,0x4c,0x19,0x1f,0x38,0xf1,0x21,0x90,0xd3,0x28,0x5e,0x20,0xc6,0xce,0xe5,0x4c,0xfd,0x6f,0xf3,0x15,0x30,0x0a,0x4e,0xfd,0xc8,0xa9,0x0e,0x80,0xaf,0x40,0x83,},{0x14,0x42,0xde,0xa2,0x80,0x7e,0x03,0x11,0x59,0xec,0x6a,0x41,0x2d,0x8e,0x07,0xbb,0x3e,0x29,0x93,0x08,0x09,0x0f,0x21,0x8f,0xa7,0xc1,0x0a,0x9c,0x50,0x68,0xef,0x9b,0x64,0xef,0x11,0xca,0x9f,0xb9,0x2b,0xe1,0xd0,0x21,0x6b,0x99,0x31,0x8f,0xf0,0xf0,0x3c,0xb8,0x71,0xcd,0x7d,0xd6,0x3a,0x38,0xae,0x17,0x02,0x31,0x3e,0x5b,0x25,0x0c,},"\xff\x4d\x89\x87\xe3\xfa\x36\x01\x2b\x75\x86\x73\x6b\x79\x3d\x65\x97\x54\x69\x8c\xd1\x2b\x65\xe5\xba\x9d\x75\x8c\xac\x16\x49\x28\x8d\x20\x22\x43\x77\x28\x3e\xa5\x42\x5d\xec\x10\xab\x99\x17\xd1\x8c\xd1\x3d\x1b\xdf\x4a\x76\x9f\x37\x04\x4c\x84\xfa\xa2\xa4\x49\xc6\x89\xe0\x04\xc1\x4e\x00\x5c\x49\xda\x41\x06\xff\x75\xce\x13\x03\x36\x1c\x6e\x3e\x34\xcc\xfe\xe7\x5e\xe9\xc3\x1c\xbd\x06\xa4\xbc\xdb\xb4\x2f\xd6\x49\xbe\x4d\xfc\xd6\x64\x00\x6d\x6a\x5f\x61\x07\x7c\x04\xa6\xa8\x1d\xb3\x6b\xe8\x6b\xa4\x2c\x29\x51\xf0\x51\xae\xda\x64\xac\xea\x49\x6c\xb9\x24\x98\x2b\x9f\x7d\x23\x4a\xc9\x72\x3f\xef\x98\xa8\xe1\x27\x55\xe3\x26\xa5\x2f\xbe\x35\x85\x1f\x41\x1e\xeb\x86\x76\x06\xd4\x5b\x51\x3f\x54\x52\x63\x91\xc5\x54\x63\x5c\x18\x0b\x8f\xd0\xee\x45\x1a\xfc\x96\xe4\xef\xd3\x60\xb6\x1e\x6b\xaf\x03\xdd\x6d\x19\xba\x51\x5c\x31\xec\x1c\xdd\x3a\xff\xff\xdb\x27\x35\x4e\x3e\x6b\x56\xe9\xe1\xa1\xa1\xb7\xd4\xb5\x7d\x9d\x76\x89\xbb\x2f\xea\x6c\x8d\x3f\x9c\xe0\xdf\x2d\x9e\xe9\x19\xc4\x23\x0a\x1f\x20\xb8\x5d\xfe\xfe\x1e\xa3\xd7\xf7\x7d\xb4\x70\xe4\x02\x24\x29\xef\x60\x9b\x0f\xf4\x49\x46\x44\x0a\xcb\x44\xcd\x13\x44\x5b\xcf\xa3\xf2\x05\x03\xc2\x6c\x2f\xb6\x63\xc8\x90\x65\xfb\x93\x34\xa6\x03\xeb\x9a\xb7\x15\x2e\x62\x62\x92\x33\xc4\x4c\xb0\x0e\x77\x71\x6d\x9b\x72\xc8\x4f\xd1\xb3\x40\x63\x4f\xf1\xce\xa3\x47\x50\x15\x76\x10\x0e\xcb\x0f\xd1\xbb\x76\xae\x0d\xff\x1c\x2b\x09\x48\xeb\x71\xee\x2c\xc3\x1e\x79\xd3\x01\x5d\x72\xdb\xee\x22\x4a\x98\x0e\x0f\x95\xa6\x9f\x79\x3d\xa8\x3a\x2d\xaa\x56\xef\xe5\x7b\x2f\x8c\xea\xac\x9e\x55\xf4\x43\xca\x9e\x73\x2b\x48\xc7\x5f\xac\x21\xc3\x6f\xa7\x72\x73\xc3\xf3\x48\x35\xff\xd8\x3c\x96\xf0\x0a\xc6\xe8\x6c\xff\xed\x08\x15\x36\x46\xc1\xce\xa2\x23\xda\x9c\xa3\x60\xca\xb9\x7e\x03\xb2\xb6\xc8\xfb\xa7\xc1\x95\xa3\x9a\xe5\x2e\xb2\xee\x86\x43\x00\xae\x56\xa1\x0f\x54\x7f\x99\xa3\x16\x98\x72\x24\x9f\x97\x77\x4b\x17\x98\x93\x55\x36\xf2\xf5\xf0\x11\xce\x57\x61\x3a\x94\xfc\xb7\xe7\x28\x6a\x6d\x49\xc1\x0f\xd9\x29\xd7\x67\x1c\xbb\x8c\xf1\x7d\xfc\xad\x4b\x24\x85\xc3\xd8\xfd\x79\x12\x87\x21\xe5\x5d\x84\x80\x87\x63\xc2\xaf\xa9\xc5\x5e\x3b\x0c\xd7\xbf\x2f\x0a\x66\xb5\xe4\x67\xbe\xc5\xee\x89\xad\x57\x0b\x60\xf1\x88\xb3\xf7\xb4\xa5\x11\xff\x85\x93\x12\xde\xd0\x78\xd8\xd0\x09\x11\x34\xfd\x49\xbc\x79\x2d\x2d\x7d\x60\xb3\x04\x94\x1c\x7f\x23\x20\x6f\x99\xe8\x63\xb1\xe2\xd8\xc9\xec\xff\xd2\xff\x0a\x3a\x3c\x75\x49\x85\x61\x5a\x9a\x92\xed\xce\xad\x00\xfe\x0e\x05\x49\x3b\x19\x8d\x1f\x7c\x90\x08\x84\x46\xbb\xa4\x60\x38\xa7\x1f\x32\x65\x3b\x59\x12\xb2\x4f\x43\x13\x77\x48\xb7\x5a\xec\x2c\x15\xfe\x4b\xf5\xa6\xf8\x6b\x8a\x6c\xdd\x9c\x74\x47\xf2\xeb\xb0\xf4\x3b\x01\xca\x15\x23\xe0\xd4\x96\x24\x00\x06\xad\x7f\xff\xfa\xfe\x0d\xf5\x75\x4b\x34\x2c\xaf\xf3\x55\x5d\x72\xa2\x7d\x0b\x92\xca\x16\x67\x66\x5c\xec\x43\xbf\xb5\x83\x07\x7a\x9c\x17\x41\xfa\x49\x2c\xe3\xdc\x2c\x75\x29\xcd\xed\x81\xb8\x28\x1a\x3f\x37\x59\x48\xb8\xa7\xce\xd0\x96\xb2\xfa\xcc\x25\xe3\x90\x29\xe2\x21\xb6\x6a\x53\xd3\x97\x9e\x1f\x40\x5f\xd8\x8a\xfc\x06\xec\x6e\x43\x09\xdc\x85\xe6\x9d\x6e\xf2\xb4\xb4\x92\x66\x16\x4a\x9d\x9d\x1c\x31\xee\x39\x21\x12\x7b\x13\x38\x1b\xfb\x74\x0d\xd3\x8d\xc1\xc7\x31\x59\x21\xf9\xc2\xfe\x58\xb6\x1b\x63\x1a\x7d\x9f\xde\x2d\xd8\xa4\xbe\x3d\xed\x04\x90\xae\x3b\x83\x76\x79\x19\x55\xc1\xc4\xb4\xfe\xd0\x0b\x9f\x4c\x38\xab\x73\x50\xfc\x2e\x37\xa3\x15\x0c\x18\x16\x2b\x1f\xaf\x03\x37\x89\x4b\xc2\x3e\x74\xf5\x95\xe4\xbe\x33\x46\x6d\xea\xb3\x54\x58\xbe\x97\xb4\xf7\x56\x58\x97\xf0\x68\x52\xf7\x1c\x60\xfe\xf9\x10\x1d\x72\x6b\x72\xe0\x10\x2a\x97\xb2\xca\x52\x11\xe3\x80\x68\x34\xb0\xac\x1a\x7d\xf8\x7c\x2a\x07\x8d\xf2\x63\xef\x8b\xa4\x57\xdc\x89\x1b\x7f\x2e\x62\x78\x11\xab\x62\x2b\x99\x46\xf8\xc6\xb7\x31\xf2\x40\x78\xd1\x7b\x06\xb2\x00\xc3\x44\x7f\x80\x32\xaa\x3e\x7a\x24\x3e\xe4\x22\xdd\xa2\xe6\x52\xfd\x75\x71\x3a\xfb\xce\x8a\x59\xef\x85\x36\x65\x3a\x48\xdc\xf4\x2a\x70\xe7\x62\x1f\x9b\x28\x02\x40\x9b\xe1\xc1\xa6\x1f\x32\xe3\x67\x89\xa5\xc5\x05\x5e\x1a\x82\x68\xe9\xdc\x43\x8c\x2e\x15\x27"}, +{{0x0c,0x80,0x8b,0x06,0x6f,0x0c,0x8e,0x8d,0xbb,0x1c,0x23,0xd6,0xc2,0xce,0xdd,0x0b,0xe8,0x66,0xd8,0x42,0x5f,0x24,0x1a,0x92,0x85,0x70,0x0e,0xa5,0x45,0x36,0xcf,0x6d,},{0x44,0xee,0x72,0x90,0x04,0x50,0xc5,0x6a,0xb2,0x1f,0x26,0x86,0xd2,0x95,0x25,0xd0,0x66,0x3e,0x0b,0xdd,0x87,0x72,0x5b,0xea,0xc5,0xd6,0x8b,0xac,0xeb,0x69,0xf1,0xd2,},{0x38,0xc6,0x82,0xce,0xde,0xfb,0x13,0xe4,0x6b,0x11,0xf7,0xb5,0xf8,0x00,0xcc,0x81,0x20,0xd4,0x5a,0x83,0xcd,0x8d,0x8d,0xec,0x10,0xc5,0x77,0xbb,0x01,0x53,0xd5,0x09,0xba,0x4f,0xdf,0x40,0x09,0x98,0x78,0x8b,0x70,0x60,0x07,0xce,0x16,0x2b,0x96,0x94,0x5c,0x71,0x40,0xbe,0xee,0x74,0xe1,0x9d,0x07,0x43,0xaf,0xa4,0xec,0xfd,0x25,0x0a,},"\xc9\x45\x71\x41\x00\x58\x1f\x4e\x24\xda\x11\xfc\x0f\x6c\x6d\x02\x10\x43\x3f\x97\x77\x52\x51\x24\xc5\x5e\xe0\x72\xd8\x5d\x79\x8b\x70\x5f\x9d\x31\xc8\xf9\x77\xdb\x6e\xdf\xb7\xa6\x5c\x78\xad\x2d\x7d\x31\xd6\xb7\xb5\xbe\x40\xff\x11\x78\xd3\x03\xb6\x83\x9b\xb0\xc6\x32\x10\xc1\xd3\x38\xc1\x03\xaf\xa0\xd4\x53\xec\xa1\xbc\xa2\x77\xd9\x30\x77\x8a\xd5\x08\x02\x27\x2f\x03\xdb\xe2\x18\x4f\xc3\x1e\xf8\xea\x6a\xbe\x21\x69\x97\x19\x9f\x7c\x1b\x33\x77\x37\x96\x89\x07\x27\x2a\xa5\x1b\xd4\x9c\x07\x38\x9c\x95\x46\x8c\xef\x4f\xd9\x9a\xe7\x8c\xa4\x54\x2a\x2b\xbc\x0e\x8a\xa9\x52\x14\xad\x1c\xff\xf9\xd5\x08\x5a\x43\x43\x94\x47\x3b\x84\xb7\x4b\xe9\xbf\x2f\x02\x02\xad\x1e\xe4\x61\x66\x04\xca\x1d\xd7\x5f\x4a\x19\x53\x42\xeb\xbf\x8f\xc5\x9f\x3f\x79\x61\x65\x54\xdc\x7b\xfd\xd5\x56\xbe\x43\x72\x21\xc1\x0b\xfa\xd3\x9e\x11\x9e\x06\x04\x5b\xe5\xfe\xd6\x83\xd3\x53\x4f\xb6\xcf\xed\x33\x89\x1c\x96\xf9\xc3\x30\xf2\x8b\x68\x4f\x8f\xba\xd4\x7c\x01\x41\x8e\xab\x6c\xee\xcc\x2e\xd7\x77\xf4\xc2\x18\xa2\x7a\xc2\x25\x82\x39\x23\x15\xc5\x3a\xa7\x30\x9e\xc5\x4c\x61\x75\x23\x6e\x44\x24\xdc\x97\x84\x65\xab\x62\x8d\x95\x44\xb0\xbe\x84\x10\x3e\xb5\x6f\x1b\xaf\xe5\xe5\xea\xed\x04\xc9\x8b\xfe\x2e\x8a\x24\x18\xc6\xc5\x2a\x61\xea\xce\x85\x23\x6b\x66\xc7\xb3\xb8\x70\x7e\xd5\x56\x41\xdd\x9d\x5d\xa9\x7c\x99\xc1\x1c\xbe\xb9\xaa\x2d\xb1\x47\x82\x0d\xc7\x24\x80\x0a\x9d\x80\xf5\x05\xfa\x5a\xf2\x09\x21\xca\xd2\x43\x56\x83\xbb\x4f\xc6\x0b\xdd\xd4\x75\xf8\x63\xe2\xf5\x95\x0d\x23\x63\x99\xd8\xd7\x5b\x40\x4b\x39\x4a\x54\x67\x37\xf9\x3a\x62\x40\x87\x00\xb3\xab\x3c\x1e\x92\x2b\x1a\x85\x9a\x29\x15\xc2\xd3\x53\x68\x81\x5c\xd4\x5b\x85\xb2\xac\x08\x31\x21\xff\x00\x0f\x05\x0d\xcd\xf4\x15\xe5\x27\x5a\x5c\x42\xda\xe3\xb1\x54\x00\xf3\xdd\xaf\x93\x39\xf2\x0a\x12\x61\xa8\x8c\xd9\x02\x05\x63\x97\x63\x21\x11\x52\xdf\x41\x4a\x9a\x6a\x62\x18\xf5\x6b\x35\xa2\xde\x9e\x84\x82\x44\x9f\x6d\xa7\x7c\x9e\x3d\x4a\xf0\x49\x30\x15\xa7\x26\x21\x7f\x82\xac\x58\x95\x4f\xe3\xe2\xe3\x44\x40\x35\x6b\x11\x2e\x06\xa6\xf6\x71\xfb\x5a\x6e\xf4\x61\x9a\x6e\xa7\xb4\xe0\x4d\xb3\x75\x7f\xb6\x64\xc3\x96\xb3\x41\xca\x89\x00\x1d\xc1\x60\x4b\x51\xfa\x91\x53\xf9\x13\x0c\x10\x20\xff\x88\x90\x92\x87\x82\x3a\xb3\x91\x5c\xcc\x85\xc4\xe3\x5d\xf6\xc2\xf8\xe6\xf9\x02\xbe\x82\xba\x21\x29\x7f\xd3\x83\x5a\xff\x5c\xe0\x2f\x3c\x07\xdc\x09\x3f\xcb\x1a\xba\x26\xe0\x6d\xfe\x6f\x02\xdf\x79\x29\x1a\xac\xa0\x69\xec\xab\x93\x81\x40\x4c\x9c\x3e\xa1\xad\x40\x9a\xdf\x29\x2a\x91\xe3\xa5\x82\xd5\xa7\xb6\x8f\xfb\xe1\x0a\x03\x05\x24\x8e\x09\x67\xe6\xdf\x37\x2f\x28\x1b\xd1\x92\xe1\x39\x97\x9c\x98\x66\xca\x8f\xe1\xe1\x0e\x06\x16\xdc\x2d\x4f\x85\xe1\x19\xe0\xcb\x4b\xfe\x8c\xc3\x1d\x9f\x5c\x01\x8b\x65\x40\x85\x24\x00\x0a\x30\x16\xa2\x3d\x99\x14\xd5\x7e\x95\x55\x76\xe2\x66\x0b\x0e\x0d\x96\xc8\x49\x5a\x12\xc3\xd7\x31\x22\xd2\x00\xb0\xf0\xe5\xeb\xd4\x46\x56\x2b\x08\xf4\x79\x34\xab\x49\x9a\x96\x99\x1d\xcf\x99\xc9\x6a\x62\x88\x07\x39\x84\x5d\x29\x82\x01\x50\x55\x3e\xae\x9b\xe0\xbb\x41\xd5\x3d\x3a\xf0\x1d\x98\x67\xbb\x47\x32\xc9\x0b\xf6\xe1\x37\x31\x6e\x3b\x1e\xdc\xc2\x09\xa8\xa0\x9f\xb0\x62\xa6\xef\x05\xf3\x7e\x57\xf2\xc5\xd1\xd0\xca\xba\xf0\x7a\x8e\xd7\xd4\x14\x55\x40\x7b\x09\x67\x54\x18\x0a\xa9\x6d\x3d\x96\x59\x19\x45\xdd\x7a\x10\x40\xa2\xde\x60\xd8\xe1\xc0\x54\xf7\x85\x46\x52\xb7\x32\xe7\xa8\xf5\xb6\x47\x4c\x3b\xaa\x18\x40\xfb\xe8\x1b\x1e\x6b\x54\xe2\x01\xef\x0b\xc8\xd0\xf2\x13\xd7\xce\xc1\xd8\x24\xd2\x22\x09\xac\x72\x52\x5a\x64\xb9\x03\xe7\x73\xb8\x3f\x1b\x68\xf6\x40\x27\x9f\x15\x05\x3d\x21\xec\x15\xce\x2f\xf7\x59\x22\x17\x6b\x75\x84\xa1\x6b\xf1\xa1\xf0\xd6\x36\xb7\x94\x2a\x3d\x61\x86\x2f\x6f\xd1\x30\x99\x72\xd3\x14\x1e\xb7\x69\x31\x4c\xa9\x75\xd0\x20\xbf\x02\xbf\xdd\xf1\x7d\x14\xb6\x0e\xb7\x86\xbf\x9f\x55\x98\x9f\xe4\x73\x32\x0d\x44\x29\x67\x7e\x30\x1c\x68\x26\x33\xf8\x13\xff\x26\xc0\xa3\xda\x92\xf6\xd0\x68\x06\x16\x10\x5b\x04\x25\xaf\x33\x8c\x2e\xa6\x15\x3b\xdd\x52\x16\xfa\xe2\xaf\xe4\x61\xe9\x24\x9c\x05\xe3\x2f\x76\xad\x7c\x42\x9d\x92\x53\x4b\x68\x6d\xd1"}, +{{0x04,0x9d,0xac,0x3c,0x97,0x7d,0x9d,0xf5,0x03,0x49,0x6b,0x43,0xd7,0x6e,0x55,0x40,0xe3,0x15,0x00,0x1a,0xd5,0x7f,0x15,0xea,0x9f,0x08,0x70,0xca,0xd2,0xd4,0xf9,0xe9,},{0xfc,0x6f,0x4b,0x7e,0xb3,0x9a,0x71,0x16,0x80,0xf9,0x66,0xd4,0x68,0xa6,0x1a,0xbb,0x13,0xa9,0xb6,0x44,0x9b,0xb9,0x9f,0xda,0x3d,0x12,0xce,0x1b,0x50,0x6d,0x1b,0x4b,},{0x75,0x32,0xd1,0xa6,0x1a,0x98,0x1f,0x30,0x3d,0x7c,0x24,0x54,0x35,0x4f,0x99,0x54,0x0c,0xd4,0x84,0xcd,0xe9,0xab,0x33,0x7d,0x6f,0x7b,0x51,0xf1,0x79,0x22,0x0f,0x7f,0xa2,0x07,0x34,0x76,0xb4,0x1c,0x71,0x52,0x9f,0x98,0x36,0xdb,0x6b,0x1d,0x0f,0x5a,0x48,0x2b,0xbb,0x4c,0x68,0x36,0x61,0x76,0xed,0x14,0xd4,0xd8,0xee,0xfa,0xde,0x0d,},"\x7f\x31\xe3\x46\xf6\x8d\xa7\x37\x16\xaa\xcb\x16\xee\xa1\x9b\xb2\x41\x42\xdc\x28\x3e\x72\x63\xff\xc3\xf7\x04\xa2\x2a\xe5\x27\x5a\x0e\xf9\x5f\x06\x69\xba\xe5\xa5\x4c\x7f\xeb\x84\xbc\x74\x87\x3c\xca\x0f\x33\x5d\x6c\xff\x3d\x8b\x4a\x20\x05\x6c\x64\xf5\xe8\x82\xcb\xbb\xd2\xac\x74\x20\x76\x76\x46\x7e\x54\x66\xdd\xd5\x6a\xed\xf5\x6e\x09\x7c\x7f\x59\xd9\x45\x91\x5e\xb0\xeb\xd0\xc3\xc8\x3d\x48\x88\x8d\x3e\x9e\xde\x51\xad\x2d\xd8\xa0\xee\x1e\xab\x4c\xf8\x7f\xfa\x78\x63\x5a\xfc\x4d\x6e\xf3\xe8\x7d\xda\x3b\x65\x56\x5c\x29\x85\xa4\xad\x0a\xcf\xdf\xb8\x1c\xb0\xe6\x1c\x67\x82\x6a\x6e\xa0\xbe\xd4\xc0\x8a\xa1\xa5\x41\xde\x60\x45\x87\x04\xac\x21\xca\x12\xf1\xc8\x11\x8b\xb3\x09\x2c\x35\xa4\x0c\x92\x1e\x68\x45\x64\x56\x2c\x2c\x10\x49\xdc\xdc\x2b\x8d\x6a\x97\xe3\x56\x7d\x35\x6b\xff\xb5\x69\x2a\x41\xd8\x9d\xdd\xa0\xec\x35\x52\x15\x2a\x27\x57\x7f\x1c\xce\x57\xd0\x09\x86\xdc\xa7\x7e\xdf\x5e\x25\x18\x15\x82\x00\xad\xf6\x90\xaf\xfb\x31\xaa\xf2\xb5\x74\x83\x68\x39\x44\x09\x99\xf1\x57\x91\xce\xa8\x53\x42\xac\x94\xa9\x6c\x7a\xf7\xa1\x9e\x49\x43\x10\xae\x26\x67\x5f\x43\xc3\x52\x58\xe8\x5b\x68\x40\xb9\x9c\x6b\x09\xcf\xa5\x8d\x19\xf1\xe4\x3a\x77\xe3\x97\xb0\x8c\x0d\xb1\x83\x0b\xca\x67\xb3\x9e\xcd\x87\x52\xda\x61\x1e\x08\x32\xc6\xca\xe7\xbb\x8c\xe7\x4a\x82\xe7\xe7\x33\x0b\xe5\x06\x2e\xd0\x5a\xa5\xc8\x44\x57\xb0\x07\xfb\x5c\xcd\xc2\x0a\x55\xd5\x4d\x8e\x04\x09\xc8\xbd\x83\x88\x3d\x2e\x02\x9d\xff\x26\xea\x5d\xb2\x75\xdc\xe0\x99\xe4\x18\x65\x9a\x04\x00\xf1\x3b\xe9\xff\xdc\x14\xe7\xd6\x45\xa9\x46\x77\xca\x84\x69\x70\xb7\xe6\xac\x52\x7f\xa0\x09\xa3\x59\x45\x4b\x3c\x49\x36\x49\x05\x18\x9f\xb4\x9c\x9b\xac\xb6\x50\xc0\x3c\xd8\x28\x75\x89\x4e\x35\x46\xba\x03\xc3\x2e\x33\x6f\xc6\x51\x6a\x87\x67\x6c\x50\xd5\xb8\x0b\x30\x54\x27\x3b\x15\x7c\x5d\x76\x75\x14\xe5\x45\x74\xb8\xa1\x01\x98\x5a\x8e\x96\x7e\x95\xda\x8f\x92\x98\x00\x26\x0e\x08\x14\x8b\xee\xe2\xd7\x78\x1e\x9e\x85\xd4\x63\xa9\x4f\xfe\xfd\xbb\x75\xc2\x8f\xa8\x89\x80\x15\x68\x09\x99\x42\x9c\xee\x79\x8b\x3f\xd2\xd9\x67\x37\x86\x8a\x26\x3f\xba\x9f\xb6\xf4\xaa\xd5\x6a\x15\xc6\x41\x2f\xf8\x5e\x7d\x37\x52\x10\x2d\xaa\xf2\x5e\x74\x5f\xa5\xf6\xf1\x74\xa2\x31\xfc\xce\x86\x24\xdd\x70\x85\x6f\x9b\xab\xcc\x20\x91\x44\xff\x68\x64\x64\x8d\xea\x0d\x68\x84\x56\x6a\x4c\x39\x14\x78\x05\xbe\x08\x4e\x47\x40\xbc\x50\x93\x09\xbc\xb1\x42\x96\x4b\xb0\xcf\xcf\x67\x26\xa0\xe0\x4b\xbf\x32\xae\x68\x34\x73\x2b\xda\x03\x84\xce\xa8\xf4\xa4\x84\x9b\xba\x0d\x18\x64\x6c\x1c\x34\x47\x18\x96\xb5\xbe\xf1\x49\xf8\xca\xb9\xec\x83\x72\x2b\x0f\xb2\x09\xef\xe8\xa0\x4c\x4a\x23\x5d\xc8\xdd\xb2\x0a\xcd\x92\x76\x5a\xfb\xf3\x05\x87\x40\xea\x70\xb9\xc1\x0d\x9c\x5a\xef\x86\x06\x29\x8f\xe4\x15\x15\x93\xb2\x1f\x79\x7d\x92\xae\x9f\x1e\x08\x81\xb0\xd2\x71\xb0\xd5\xb1\x0c\x6e\xd8\x3c\x34\x9e\xc2\x47\x3f\xbf\x2f\xf7\x80\xdc\xd0\x76\xd8\xcf\x0a\xea\xfa\x71\xfe\x2b\x8c\x51\x28\x01\x5f\x8f\xbb\xcf\xec\xd5\x28\x1c\xd5\xea\xcb\x6f\xe9\xac\x6e\xaa\x6e\x47\xd6\x67\xb9\xad\x4b\x7e\x41\x1e\x6c\xb7\x46\x3d\x56\x76\x07\xaf\xbf\xd0\x41\x8c\x4e\xb0\x6a\xfe\x84\x7f\x5e\x40\xb4\x99\x44\x38\x28\xd5\xa2\x73\xa4\xa8\x7e\x46\xde\xf2\x1a\x91\x9d\x73\x86\x3a\xf0\x05\x4a\x09\x9e\x3a\xdc\x54\x50\xb8\xe3\x2f\x51\xea\x52\xc5\x99\xa4\xa2\xa3\x53\x51\x78\x8a\xf7\xcb\x71\xe5\xc4\x4b\xcb\x8d\xf5\x4a\x60\x1e\x6e\xc2\xc1\x82\x8b\x48\xc4\xb1\xae\x44\x63\x10\x6f\x10\xef\xa5\xca\xf3\x09\x1a\xbf\x99\xaa\xba\x52\x52\xf4\x84\xd3\xbb\xc6\x2b\xfa\x6b\x2a\x80\x6d\x23\xc6\x33\x1a\x62\xfc\x46\xbc\x62\x76\x79\xe7\x3e\xc8\x2d\xcc\x08\xf7\x91\x43\xf4\xb7\x1e\xcf\x35\x7e\xa2\xf0\xd7\x4e\x6d\x30\x58\xe6\x06\x04\x3f\x6e\x8f\xed\x70\x42\x82\xc1\x6b\x1f\x98\x8f\xfa\x36\x5c\xfa\xe9\xa3\xcf\x79\x2e\x0c\x5b\xaa\xd7\x0c\xa7\xe2\x57\x76\x01\x8b\x5e\x7f\x0e\x95\x44\xe1\xd7\x3f\x3e\x5d\x1e\x41\x6a\x5e\x50\xfb\xed\x29\x6d\xc1\xbf\x4b\x29\xa3\xfb\xe3\x2e\xfb\xd7\xe9\x9c\x83\x01\x5d\x27\xf5\x35\xad\xec\xf1\x75\xfc\x36\xc1\xea\x4f\x44\x23\xb3\x6d\xcd\xc0\x54\xba\x99\x32\x78\xe8\x5a\xc3\x62\x2d\x43\x5f\x52\x37\xba\x61\xb4\x9a"}, +{{0xf0,0x7d,0x61,0xb5,0xca,0x1c,0x27,0x00,0xcb,0x50,0xf9,0x00,0xc2,0x6b,0x7c,0x28,0xf6,0xc6,0x94,0x08,0x08,0xc7,0xba,0xff,0xf7,0x4f,0xca,0x4b,0x11,0xf4,0x25,0xd4,},{0xeb,0x24,0x3d,0xfa,0xcc,0x2d,0xc6,0x43,0x57,0x76,0xd5,0x54,0xec,0xed,0x8b,0xf9,0x23,0x90,0x60,0x4b,0x35,0x55,0x7c,0xda,0x51,0xfd,0x20,0x3e,0xdd,0xb4,0x93,0xfa,},{0xc1,0x9b,0x53,0x2b,0x82,0x48,0x56,0x39,0x32,0x63,0x97,0x01,0xbf,0x15,0xbc,0x01,0x5f,0xae,0xbb,0x17,0xbb,0x98,0xd8,0x71,0x61,0x6e,0x10,0x48,0xd6,0x4c,0xa5,0xf9,0x55,0xf5,0x58,0xf6,0x3b,0x53,0x53,0xa1,0x57,0x6f,0xa1,0xac,0xae,0xf3,0x9b,0xcb,0xc9,0x02,0x17,0x56,0xdf,0x5d,0x1a,0xb3,0xbc,0x74,0x1a,0xcc,0xf9,0x05,0x9b,0x04,},"\xc1\xc6\x78\x43\xd6\x9a\x0e\x62\xe7\xbf\x71\xf9\x02\x06\xa3\xd5\x59\x5c\xa3\xc4\x82\xaa\xa7\x67\xe9\x31\xb0\xd6\xc2\xf4\x75\x2a\xb8\x69\x91\xf0\x35\x83\xbb\x13\x8e\x9f\x72\xfa\xb5\x8f\xd6\x02\xa4\xb6\xb2\x96\x02\xcf\x89\x14\x08\xaf\x5a\x1b\xfd\x33\x98\xc0\x17\x8c\x44\x14\x61\xe3\xf4\x9b\xc8\x1d\x64\xc0\xd9\x7f\x5d\xed\x69\x2c\x75\xd4\xd6\x4d\xac\x5d\x80\xd6\x3b\xd4\xdc\x52\x10\xc1\xd9\x35\x0b\x14\x2b\xa6\xe7\x68\xf1\x50\x80\x7a\xb8\xa8\x6c\xac\xdb\x59\xd8\x4d\xdf\x66\x0b\xe5\x62\x03\xc0\x14\xfb\xa1\xe0\xdc\x16\xfa\x6d\x32\x69\x4e\x14\xb1\x28\xed\xd1\xf6\xc6\xab\x44\x5a\x3a\xd3\x41\x74\xfa\x9e\x4b\x01\xf2\x5b\x1d\x5e\x6e\xb7\x69\x83\xb4\x29\x5c\xe4\x91\x4d\x3a\xe4\x8c\x70\x4a\x30\xe5\x54\xfc\x1f\x86\x8b\x62\x72\xef\xf0\x6d\xa2\x4b\xfe\x17\xe4\xe0\xf0\xfa\x46\xbb\x08\xff\xb9\x07\xcb\x61\xbe\xbe\x52\xdf\x31\x1a\x64\xcb\x57\x8b\x30\xfd\x62\x7d\xf1\x12\x21\xae\x40\x03\xa0\xb0\xc6\x8e\x3c\x6f\x95\xa2\x1c\x85\x00\xd4\x1b\x2c\x58\x9c\xc4\x6a\x13\x9c\xac\xff\x57\xdc\xf0\x07\x59\xf5\x2e\x9c\xa3\xda\xbd\xb1\x78\x8a\xb6\xb3\x8a\x50\x48\xf5\x8e\x08\xe0\x5c\x39\x4f\x9d\x3c\x72\x11\x3d\x45\x2b\x70\x84\xc5\x19\xf8\x6c\x16\x89\xff\xdb\xae\x50\x6e\xd8\x45\x05\x22\xcb\xe4\x3d\xe2\x7a\xa3\xbf\xdd\x92\xa9\x1b\x71\xe5\x2a\x3c\xbf\x77\xc1\xbd\x28\x93\xea\xbd\x40\x7a\x57\xfe\x5e\x14\x68\x73\xbf\xb2\x04\x3f\x4a\x61\x47\xdf\x08\x3e\x54\xa2\x20\x8d\x19\x25\x81\x3f\xa4\x04\xe4\xc4\x74\x06\xe7\x72\x86\x43\xeb\xfb\x0b\x10\x14\x2f\x90\x9e\xf8\x56\xfd\x3a\x91\x6b\xc0\x85\x15\x43\xb8\x2a\x55\xf8\xcd\x52\x9b\xd2\x1d\x9e\x29\x09\xd6\xd7\xe7\x7b\xdc\xea\x46\x73\xe5\x45\xff\x4a\x67\xfa\x37\xd6\x5f\x1f\x63\xf1\x1d\x5d\x0d\x55\x97\x4a\x30\xab\xe1\x88\x33\x5d\xb5\xdc\xbd\x35\x66\x58\xf9\xb7\x76\x82\xd9\x6d\xab\xb2\x58\xea\x95\x95\x1a\x05\x59\xae\xa4\x06\x4d\x5e\xa1\x68\x05\x01\xdc\xb4\x22\x8f\x2c\x95\x6f\x81\xd2\x10\x11\x44\xaf\x74\xc7\x16\xbc\x8b\xf4\x29\x6d\xc3\xb8\x31\x72\x5c\xc1\x7d\x3b\xfd\x90\x66\xa2\x99\x53\xb2\xec\xd7\x50\x59\x43\x5b\x49\xa2\x5a\xc5\x25\xb4\xfb\xab\x17\x79\x02\x2d\xfb\x6d\xe5\x25\x14\x9d\xcd\x90\x2a\xc8\xa7\xe2\x1f\x34\x4f\x5f\x01\x01\x48\x06\x92\xd6\x16\x08\x95\x2c\x71\x41\x3e\x30\x03\x79\x45\xe2\x06\xc5\xee\xad\xfc\x3e\xdc\x4b\xae\x0d\x79\x6c\xa0\xc5\xf5\x6d\x6f\xfb\x3f\x09\x69\xdf\x9d\xf8\xa7\x94\xf5\xdc\x83\xa3\xb2\xf5\xc3\xab\x36\xbb\x90\x1b\xcc\x31\x55\x1c\x55\x0c\x63\xfa\x41\xd6\xa8\xd5\x7b\xdb\x9b\x5c\x65\xbc\x61\x0c\x3a\x98\x97\x52\xab\x28\xa0\x15\xe7\xc2\xf6\xb2\xfb\xf1\x99\xa7\x6b\x97\x50\xc0\xd3\xd5\x92\x11\x9c\x8b\x40\x22\xfa\x45\xba\xde\x2f\xbb\x41\x43\x26\x79\xb5\x2a\xcb\x46\x08\xa9\x5c\x34\xaa\x40\xbf\xfe\xc1\x0b\xc9\x8f\x47\x29\xdf\xcc\xb6\x50\xb2\xa0\x52\xdf\xb0\x68\x95\x9e\x64\x8a\x92\xd5\xaa\x4d\xd2\xd1\x7d\xde\x67\xcd\xf2\xe6\x37\x7a\xf0\xd4\xae\x37\x96\x07\x38\x9d\x7e\x35\x96\x44\x1b\x9f\x42\x22\xcf\xf6\xaf\x73\xb3\x30\x02\x70\xce\x54\x80\x0b\xd9\x34\xa9\x10\x9a\x02\x56\x3a\xdc\x56\xae\x46\x58\x44\x51\xcd\xaf\x4a\x77\x53\x81\x57\xe5\x87\x0f\x4a\xe1\x2d\xbc\x81\x87\x0f\x5d\xb4\x1a\x2c\xb5\x5e\x00\xdb\x3d\x22\x31\x62\x8f\x17\x27\xc3\xac\xb9\x9e\xd3\xac\xd8\xb6\x71\x56\xa8\x00\x5a\x4c\xc8\xf3\xd3\x55\x5b\x79\xa0\x37\x73\xa9\x31\xf1\x4e\xeb\xce\x40\xb9\xfe\x46\xed\xe5\xda\x08\x81\xfb\x22\x07\x17\xe4\x18\xe8\xb5\xa0\xfe\x5e\x47\x7e\x72\x85\xc5\x54\xe8\x59\xe1\x64\x41\x67\x2b\x48\x99\x34\xa3\xa9\xee\xb8\x8d\x78\xfc\xc5\xc1\xdb\x2d\x1f\xbd\xde\x39\x27\x73\xf6\xc9\x39\x97\x2e\xe8\xfa\x31\x89\xf4\xe9\x87\x2b\x4a\xbd\xc8\x3b\x37\x9c\x0c\x10\xe8\x18\xdc\xff\x75\xc8\x3d\x68\x70\x72\x92\x84\xce\xd4\x1f\x2f\xf5\x5a\x87\xc9\x60\xe6\x3d\x12\x11\xf0\x80\x71\x29\x3f\x6a\xc6\x3f\x9b\xde\xf3\x8f\xd5\x91\x9c\xa9\x0b\x3f\x5e\x25\xa6\xc0\xc6\x64\xc4\xec\xf8\x31\xc6\x4e\x2d\x4c\x6e\x79\x8a\x98\xa3\xa0\xf7\xbe\x7a\x24\x63\xea\xda\xa6\xa2\xa3\x48\xf9\xa4\x94\x71\x71\x23\xcc\x0a\x28\xc0\xa5\xea\xe3\xf5\xb5\x85\xf2\xcb\x8c\xb2\x60\xc2\xc5\x03\xe4\x15\x78\x57\x3c\xd9\xb7\xcb\xa1\x40\x8d\xca\x9d\x86\x0a\xe4\xf8\xc3\xd3\xf3\x22\xa4\x5b\x58\xa2\xc4"}, +{{0x50,0x86,0x4a,0x75,0xaa,0x0c,0x69,0xb5,0x93,0x50,0x07,0x7c,0x20,0x4b,0x20,0x75,0x7f,0x2b,0x8b,0x68,0x55,0xc3,0x7e,0xd7,0x21,0xb4,0x9f,0x2a,0xc9,0x17,0xd6,0xb2,},{0xcf,0xf3,0xeb,0xd5,0xea,0x0c,0x8b,0x55,0x31,0xd9,0x21,0x1e,0x22,0x19,0xe4,0xcf,0xe5,0xde,0xd9,0x91,0xd8,0xec,0x42,0x4d,0xf5,0x4c,0xf5,0x3c,0x83,0x76,0xf9,0xbd,},{0x17,0x74,0x55,0xa7,0x16,0x94,0xf1,0x2b,0x76,0x2f,0xd1,0x7e,0x08,0xbd,0xf0,0x10,0xa7,0xfc,0x91,0xd1,0x91,0x41,0xd7,0xae,0x23,0x99,0xbd,0x24,0x1a,0x99,0x8a,0x6a,0x50,0xa9,0x72,0x2a,0xc1,0x23,0x2c,0x59,0xe4,0xe2,0xaa,0xa8,0x28,0x07,0x8b,0x2b,0x92,0xf4,0xa5,0x4c,0xdf,0x0e,0xfe,0xbb,0xa2,0xc1,0x6d,0xbe,0xaf,0x07,0x22,0x03,},"\xb3\x65\xf4\x76\xac\x92\xe7\x60\x12\xa7\xff\xd8\x78\x2a\xf1\x5a\x3f\x5e\xe1\x47\xf6\x03\xa3\x67\xad\xf2\xf9\x72\x46\x13\xe8\x76\x5b\x03\x7a\xc0\xeb\x1f\x67\x37\x36\xe1\x13\x63\xe3\x52\xed\x5a\xe9\xeb\x5a\x67\x12\x5e\xd8\x18\x90\x03\x42\xae\x93\x37\x1c\x43\x3b\x91\xf6\x02\x1d\x4b\xe2\xa0\x52\xb0\xda\x43\xb3\x68\x2e\x7f\x74\x0a\xe8\x01\xd0\x54\x10\x57\x85\x8e\xb0\xc9\xc2\x8d\x98\xf0\x3b\x45\xe1\x28\xaa\xa3\x42\xc6\xb6\x02\x77\x67\x92\xaa\x81\x24\x1c\xad\x06\xf1\x33\x8f\xa0\xc7\x17\x57\x18\x0f\x58\x8c\x83\x01\xd9\x1c\x27\x67\x9b\x50\x21\xcd\x75\xd7\xf6\x17\x1e\xe9\xf8\xd5\x6e\x43\x77\x67\x98\x12\xf6\xec\x5e\xd4\x65\x38\xca\xed\x50\x0c\x1d\x15\xf5\xfc\x86\xea\xf9\xed\x9c\xf9\xa0\x60\x6b\x22\x61\x4f\xaf\x67\x64\x62\x13\x4e\x3d\xb3\x58\x23\x32\xb4\x83\xdf\xa5\x4c\xa2\x9a\x5e\xb0\xd6\xba\xe3\x38\x0e\x19\xd0\x60\x11\x34\x53\xf3\x2b\xba\xb7\xe1\x18\x62\x7b\x40\xbc\xab\xf1\x71\x1b\xcf\xea\xb8\x95\x7d\xe3\x39\x43\x6c\x70\x88\xbb\x88\x31\x01\x53\x9a\x09\xd3\xbe\xf0\x88\xfc\x1f\x84\x07\x64\x03\x6f\xfb\xb3\x3d\xec\xd1\x2a\xac\x57\xfd\x26\xf8\x48\x23\xe1\x95\x53\xd4\xd6\x7e\x00\x0e\x94\x36\xca\x32\x3d\xe0\x99\xbc\x1c\xe7\x5e\xbf\x5d\xdc\xcb\x44\x8c\xd7\xa2\xe4\xbb\xd6\xb3\x2e\x3f\x20\x24\xf9\x6c\xc5\xc7\x15\x2b\x8b\xe8\xed\x0b\xd8\xe4\x36\xd3\x24\xd1\xce\x1d\xd3\xcf\xcc\x45\x2a\x28\xc7\x3a\x95\xaf\x84\x82\xaa\x77\x2a\xe5\x3d\x5b\xe1\x29\x2e\x39\xd1\x71\x6b\x43\x75\x8f\xe5\x63\xc8\xaa\x3b\x74\xbb\xa5\xc0\x2d\x04\x77\x8d\x91\xe3\xd4\x3d\xcc\x72\xbb\x7c\x7b\x04\x3c\x05\xc8\x74\x5b\x70\x5e\xe7\x5b\x5a\x4e\xc7\xb9\x5b\x65\x43\x59\xfb\x5e\x85\x33\x38\x21\x98\x51\xd4\x0a\x8a\xfb\xb4\xf9\x1e\xcb\xb4\x1e\xb8\x15\x34\x19\x6c\xc0\xcc\x9d\x3e\xb7\x14\x39\x6c\xaf\x04\x5b\x23\x17\x22\xd4\x48\x65\x03\x64\x04\x19\x98\x84\x80\xa7\x81\x58\x08\xbe\x97\x42\x87\x37\x2c\xfc\x48\x99\x65\xaa\xc5\xb8\x09\x5c\x63\x75\x81\xeb\x91\x0f\x90\x55\xcd\x1c\x0a\x0a\x3b\x0b\x33\xac\xa9\x0f\x7c\x5b\x8e\x6e\xf6\x83\xab\xf0\xce\x53\xae\xba\x51\xbe\xc4\xfc\x7b\x42\x7a\x23\x47\x36\x0f\xca\x86\x36\xd3\xf1\x46\x92\x84\xf2\x69\xa9\xab\xf0\xcb\x1a\x24\x4a\x15\xd6\xb4\x04\x65\xe7\x5c\xf8\x90\x92\x47\x4a\x8b\xed\xa0\x33\x39\x1d\xd3\x11\xc4\x99\x51\x9a\x08\xc4\xf0\x34\xe7\x19\x18\xd7\xca\xd4\x18\x45\x32\x7c\x89\xe7\xb1\xe9\x4a\xfb\x07\x23\x78\x2c\xe5\xc5\x53\xef\x36\x79\x1b\xba\x63\xde\x17\xd7\x46\x49\x18\x94\x01\x2c\xeb\xd8\x7b\x18\x37\xa8\x21\xef\x5c\x62\x4b\xbc\x84\xcc\x50\x35\xf5\xe7\x0c\xd9\xf2\x1b\x42\x21\x9a\x2d\xce\x30\xe0\xe6\x5c\x25\x0d\x0d\x19\x4d\x2b\x52\x48\x6b\x03\xee\x66\x33\x29\x81\xa5\x22\x51\x74\xdb\x17\xe5\xa8\xbb\x4a\x10\xed\x9c\x8a\x44\x5c\x41\x44\x2f\x3b\xcd\xb6\xb4\xf4\x9e\x4e\x1d\xc8\x76\x61\xa7\xb6\xe4\x1f\x35\xf5\x5d\xd6\x7b\xd4\xcb\xc6\xff\x58\xbf\xbf\xfa\xff\xd2\xc3\x82\xfc\xad\x0c\xae\x8f\x0d\xf9\xaf\x6a\xcf\x09\x40\x00\x76\x18\xa5\x4a\xee\x31\xd9\x32\xcb\xd8\xe8\xb4\x1c\xa0\x38\x21\xc4\x28\xa0\xef\x8e\x58\xd2\x43\x5e\xec\xd5\x03\xc5\x4d\xa9\xc1\x62\x8f\x3c\x74\x9b\x77\x05\x19\xf5\x3b\xf2\xd5\x7e\xd7\x12\xd0\x75\xd3\x73\x37\xb7\x7a\x2b\x10\xa7\x2d\x2d\x59\x0c\x20\xd5\xce\xc2\xca\xcc\x6c\x3a\x8d\xc1\x13\xe2\xd1\x6e\xf2\xd1\xb3\x90\xed\x96\xe4\x03\x6a\xcd\x30\x4e\x0c\x7c\xef\x9d\x43\x1f\x88\x21\x8a\xa1\xf8\x38\x28\xdd\xa6\x36\xb9\x4a\xa7\x61\xc7\x31\x7e\xcf\x11\x6c\xbf\xc6\x11\xe5\xba\x6d\x94\xc5\x0e\x99\x46\x93\x02\x3b\xdf\x2d\x24\x8e\xd6\x03\xf8\x5b\xe7\x3a\x00\x08\xb7\x5a\xde\xf9\x51\xdc\xcf\xa3\x0e\x42\xe9\xf5\xbb\x05\x02\x3a\xde\x79\x75\x06\xcb\xf9\x0b\xb6\xdc\xe4\x3c\xf3\xa1\xc3\x14\x1a\x5c\xc5\xfd\x9a\x4f\x3c\xc5\x57\xb9\x0e\x18\x04\x9b\x3c\x13\x0f\x46\x1e\x4f\x32\x29\x9f\xa1\xd1\xcf\x9c\x7f\x2e\xa2\x05\x35\x65\xe8\x16\x0a\x34\x1c\xdd\xf9\x9a\xcd\xdd\x49\x16\x97\xfa\x70\x51\x24\xab\xda\xb4\x2a\x5e\x8f\xcf\x04\x8d\xd9\xf1\x79\x38\x4e\xc9\x2a\x46\x9a\xeb\x11\xe8\xbc\x62\xb6\x9d\xbc\xfc\xec\x66\x81\x75\x47\x57\xe4\xc5\xd0\xfd\xd9\xb9\xcf\xda\x49\xaf\x09\xb8\x3a\x5a\x4a\x10\xae\xd9\xa4\xcf\x7d\xdf\xa2\x89\x20\x9d\x47\x5a\xb3\x31\x8c\xd4\xb9\x65\xe0\x07\xdc\xe1"}, +{{0xe5,0x5f,0x22,0x0f,0xff,0x80,0x79,0x14,0x8b,0x25,0x41,0x89,0xbb,0x29,0x41,0x74,0xf8,0xe2,0xc5,0x75,0xe5,0x7f,0x39,0xd4,0xba,0xc8,0x16,0x5c,0x5e,0x56,0xe7,0x69,},{0x7f,0xd5,0x07,0xd0,0x3f,0xe1,0xd6,0xe3,0xf9,0x11,0xf0,0x59,0x59,0x7b,0x0e,0x29,0x2e,0xa0,0x96,0xf5,0xbc,0x85,0x18,0x52,0x91,0x6b,0xf1,0x21,0x7c,0xaf,0xdc,0x6c,},{0xc1,0x02,0x3a,0x70,0x68,0x74,0x3e,0xc4,0x66,0x8f,0x49,0x5e,0xb7,0xbd,0x4d,0xb5,0x81,0x29,0xc1,0x1e,0x58,0x29,0x9e,0xa8,0x7d,0x6f,0xac,0xd3,0x02,0xbf,0x29,0x6a,0x98,0xe2,0x98,0xfd,0xb4,0x8e,0xdd,0xf9,0xc4,0x4e,0x79,0xae,0x86,0x41,0xf7,0x34,0x50,0x3b,0xb8,0x3d,0xc0,0xb3,0x1f,0x61,0x0d,0xf1,0xd1,0xe9,0xd6,0x19,0xa7,0x05,},"\x1e\x2c\xe8\xbf\x0e\xa7\x87\x5d\xf2\x85\xb1\xdb\xd3\x4b\xbe\x67\x30\x7f\x2e\x8a\xc8\xbc\x14\x2c\x3b\xa3\x14\xc1\x64\x2c\x65\xa2\xd6\x2e\xb2\xc7\x83\xf9\x16\x28\x3c\xa4\xec\x3e\x53\x6d\x3e\xeb\x65\xcf\xdc\xc0\x54\x9a\xc4\xf6\xa4\x5f\x53\x9a\xc5\xdf\x79\xa6\xd5\x76\x82\x19\x73\x9d\x0c\x9a\x0c\xdb\xb3\x12\x42\x29\x6c\x33\x12\xb7\xed\x56\x00\x43\xf5\x36\xcd\x1d\xe9\xa9\xc2\xb2\x89\x64\x1a\x1c\x2d\x84\xf9\xa6\x8b\x7c\x03\xb8\xb8\x56\x7e\x5d\xc7\x13\x8c\x2c\xb9\x67\xc6\x28\xaa\x25\xb2\xea\xb4\x34\xd4\x49\x0b\x23\x50\x74\x09\x71\x7c\xde\x94\xda\x59\xdc\x1d\xc2\x5c\x7b\xe4\x2a\x8a\xa0\x2e\xdc\xf4\xd9\x95\x36\x8e\x6b\xa0\xee\x1f\x95\x36\x00\xdb\x98\xd2\x2d\xe0\xf8\xd2\x57\x02\x0e\x0a\x40\x6e\xe1\x66\x9b\xd5\x27\xb9\xfe\x1c\x61\x1f\x9b\xe5\xa3\xd7\x52\x8e\x8b\x61\x51\x67\x0a\x86\x63\xd2\xed\x1a\x58\xd3\xe3\x69\xbb\x72\x2a\x63\x02\xd7\xc1\x72\xa1\x9b\xda\xf3\x57\xee\xdb\x02\x27\x91\x56\xe3\xb9\x03\x44\x31\xa7\xd6\x8a\x39\x52\x8e\xb4\x02\x35\x87\x57\x3e\xb8\x8f\x30\xf9\x4e\x83\x3e\x8a\x23\xb9\xd0\xac\x7b\x5c\xa8\x78\x24\x59\x6b\xbb\x0a\x3d\x0c\xa1\xb1\x6a\x68\x78\xfd\xf7\xe2\xce\xa3\x4a\x6f\xfb\x95\xa9\xff\x4e\x88\x8a\x97\x59\x37\x35\xb8\x68\xda\x75\xd8\x70\x7b\xbf\xdb\x1d\x93\xeb\x86\xa5\x1e\x2d\x21\x5f\x1d\xd9\xdc\xf7\x83\x88\x72\x9a\x3e\xb0\xf0\x66\xdd\xc9\x41\xe9\x50\xc9\x21\x27\x19\x8b\xce\x63\xa5\x48\x68\xd9\x97\x02\x95\x72\xff\xa6\xf6\xfe\xa1\xd3\xa6\x91\x64\xc9\x99\x69\x53\xdc\x8b\x6f\x9d\xad\x06\x35\xc9\xb0\x81\xf5\x5f\x98\x33\x40\xf0\x81\x4b\xf5\x47\x08\x03\x09\x0e\x79\x97\xf7\xab\x79\x6c\x2b\x15\xad\xaf\x40\x21\xd6\x7c\xff\xaf\x6e\x1e\xf6\x28\x67\x50\x39\x45\xc2\x1a\x32\x96\x64\xe0\x8a\x95\xa4\x15\x82\x30\x0d\xa9\xbe\xd2\x08\x44\x4c\xe6\xaa\x12\xb3\xf8\x67\x79\x5c\x6e\xe4\xc4\xc9\x25\x70\x18\x62\x73\x61\x29\x3b\xd5\x27\x82\x1a\x29\xa3\x39\xb4\x04\xa2\xda\x4b\xd9\x94\x4f\x87\x70\x40\x79\x8b\xb5\x4a\xbd\x2d\x76\xcb\xb1\x8d\xf4\x29\x7f\x4c\xe3\x33\x7f\x64\xd2\x05\x80\xaa\x64\xbd\xec\xac\x37\x6a\x6a\x4f\xf7\x4d\x01\x44\xb2\xfe\x74\xce\xf8\x2d\x50\xa5\xe6\xbd\xd7\x99\xe5\x5f\xf6\x96\x62\xba\xc5\x37\xad\xcb\x68\x81\x22\x8c\xb6\x37\x04\x50\x0c\x14\x3a\x4f\x4d\x1d\xb2\x8d\x45\x56\xbe\xe6\x04\xa3\x99\xff\xd2\x06\x54\x65\x97\xde\xe9\x22\x52\x54\x7f\x6c\x65\x7f\x36\x84\x1a\x87\xd5\x65\xf6\x55\x27\x16\xc2\x5a\x21\x15\x14\x77\xbe\xe9\xef\x96\x18\x55\xfb\x1a\xf2\xda\x80\x68\xf2\x8c\xe9\xff\x70\xd5\x25\x2c\x7a\x63\xa2\xe1\x4d\xed\x6b\x89\x77\xb1\xd7\x69\x1a\x77\xed\x2e\x57\xd2\x2f\xf2\xe1\xfc\x4c\xdb\xce\xb5\xe8\x05\x85\x8d\x90\x38\x96\xea\x67\x07\xe4\x8b\x34\x5f\x60\xe2\x81\x8b\x2f\xce\xc4\xdb\xa4\x8c\xae\xa9\xef\xa3\x82\x79\xfb\x83\xd5\xb0\xf4\x6a\x45\xe4\x2c\x41\x76\x5d\x01\x71\xba\xac\xd8\xd6\xdd\xa7\x99\x13\x14\xb3\x4e\x15\xfd\x36\x12\x7c\x46\x7d\x1d\xe0\x1c\x01\xa3\xa7\x8a\x8c\x1b\x10\x3b\xee\x17\xa7\xa0\xb7\xac\x55\x76\xfd\xc2\x26\xdd\x24\x59\x77\x31\x46\xcf\x38\x26\x14\x17\xca\x19\x13\x5d\xbd\xa9\xbd\xbe\x54\xcd\x17\xaa\x7d\xdd\x38\xfd\xca\xc2\xab\xa3\x96\xb3\x65\xce\xae\x98\x91\x9f\x6c\x51\x77\xfc\x58\x3f\x5b\xee\x3f\x48\x70\x49\x14\x30\x6a\xa1\x9e\xe9\x0e\x3f\xd0\xde\x55\x91\xc6\x69\xff\x35\xab\x16\xfe\xf3\x8d\xee\x18\x7b\xae\x1e\x5a\xaa\x56\x6d\xf1\x05\x44\xb7\xd6\xd4\xeb\x00\xda\x7e\xbe\xb4\xec\xdc\xc4\xd8\xe3\x2b\x49\xcb\xbd\xc6\xe6\x66\x40\xbd\xb0\xf7\x2e\x05\x91\x8a\x05\xc3\x5d\x9b\xff\x7e\x0e\x88\xf2\x41\xd7\xc6\xc8\xcb\x2f\xed\xcc\xdf\x65\x56\x0a\xf0\xe7\x83\x3e\xfe\x34\xaf\x79\x0d\xb6\x31\x89\x02\x2c\xfd\x71\xfc\x8a\xcf\x88\x86\x01\x27\xbd\x4f\xbf\x02\x6b\xcb\xe3\x60\xe3\x3a\x89\x95\xe6\x36\xd0\x3b\xb8\x6d\xfd\x01\x98\xad\xa9\x59\x34\x2d\x8e\x9c\x9e\xd9\x3e\x23\x29\x7d\xa9\x8d\x66\xa0\xd4\xfc\x96\x51\x62\x73\x3b\xc8\x65\x41\xb9\x5a\x6c\x90\x97\xcb\x55\xa9\x73\xc6\xfa\xc1\x94\xe8\xf8\xa1\x64\x27\x4c\x47\x9c\x51\x0e\x62\xd8\xa0\x35\xeb\x75\x11\x81\xb5\x02\xaf\xb6\x14\xd8\xc4\x46\x7b\x54\x45\xc2\x68\xdc\x3d\xd0\xab\xbd\x57\x70\x04\xc0\xbc\x47\xb1\x5f\xcb\x80\x1b\x79\x35\x97\x57\xb5\xea\x89\xcf\x8c\xf7\x7f\xc6\xd1\x60\xe6\xcd\x73\xc4"}, +{{0xd5,0xe3,0xa4,0x06,0x71,0xbd,0x45,0xf0,0x88,0x42,0xdd,0xc7,0x8a,0xbe,0x57,0xde,0x3b,0x9c,0xe5,0x64,0x6b,0x73,0x0d,0x2e,0x59,0xfe,0xcf,0x5a,0x7d,0xf8,0x0f,0x40,},{0x41,0x6c,0x37,0xae,0x1a,0xd1,0x5b,0x63,0x2b,0x0e,0xa4,0x39,0x32,0xc1,0x76,0x37,0x28,0x2c,0xd9,0x1d,0x59,0x79,0x55,0x2e,0x5e,0xeb,0xb9,0x9a,0x41,0x9d,0x5c,0x97,},{0x63,0xde,0x6a,0x98,0x11,0x42,0x36,0x5a,0x3e,0x59,0x26,0x31,0xc8,0x27,0x72,0x37,0x80,0x97,0x39,0xd1,0xc9,0x8f,0x5a,0x1c,0xb2,0xcc,0xcd,0x34,0x06,0x7d,0x1c,0xa5,0xdc,0x8f,0x2f,0xc6,0x3b,0x8a,0xe1,0xa6,0x89,0xdc,0xaa,0x29,0x1b,0xa6,0xb6,0x9b,0x1a,0x67,0x95,0xc5,0x79,0xa5,0xdb,0x6d,0xcc,0xee,0x73,0xf6,0xa4,0x20,0xac,0x0a,},"\x09\xfe\x6f\xfa\x8b\xf0\x94\x2a\x64\x92\x13\x57\x65\x9d\xbc\x6e\x4f\x8b\x63\xca\x3b\x9e\xa4\x75\xea\x39\xd7\x92\x52\x90\xa1\x48\xd8\x7b\xb1\x55\x74\x1d\xfa\x28\xae\x1b\xea\xdc\x1f\x3e\x1a\xb7\x67\x37\xeb\x5d\x5d\xda\xde\xd0\xbb\x38\x2d\x7e\x11\xea\x81\xa5\xe7\x80\x16\x12\x69\x62\x60\xba\x3b\xd0\x9c\x80\xb6\x23\xf6\x36\x38\x0a\xa0\x20\x8f\xee\x0a\xff\x70\x81\x2d\x53\x07\xb2\x71\x83\x83\x23\x43\xde\xba\xa3\x60\x5d\xda\xd1\x7d\xdd\x70\xd6\x11\x40\x0d\xdd\x10\xd6\x38\xaa\x3d\x6c\x68\xa2\x8c\xf0\xe9\x7c\x1d\xed\xf6\xcc\xd9\xc7\x31\xa8\x4f\xf0\x40\x5a\x3a\x22\xdc\xba\x00\xab\x44\xd5\xb2\x18\x44\xf1\x4d\x13\x74\xac\x0c\xb1\xe5\x8d\xf4\xa9\x0c\x41\x25\x63\xcf\xe6\x9d\x88\x2d\x35\x0f\x6a\xaf\xbf\xa6\x4f\xa2\xf9\xff\x82\x60\x32\x32\x67\x80\xae\xcf\x93\x05\xd8\x21\x7c\x17\x9d\xbb\x63\xc1\x51\x54\x12\x32\xeb\x65\x97\x92\x65\xd8\x76\xc4\xbc\x43\x05\xc0\x2f\x40\xbc\x1d\x05\xdb\xaf\x7d\xcf\x4f\x7d\xd9\x23\x2c\x17\xee\x0f\x7a\x05\x55\xf5\x04\xba\x37\x74\x54\x84\x88\x93\x3e\x75\x71\xeb\x3f\x71\xc4\xcb\xb2\x0c\xc4\xe4\xa7\x32\x2f\x35\xac\x0e\x79\xa5\x91\x55\x79\x8d\xd0\xf5\xb3\xc1\x13\x19\xb7\xd8\xf3\xea\x79\xee\x3a\xcc\x68\xbd\xb9\xf3\x7c\x7d\x4c\x8f\x9c\xab\xa1\xeb\xf8\xeb\x7f\x43\xb4\x62\xae\xfd\x38\xe8\xc0\xd4\xc6\x39\x79\xcf\x66\x31\xde\xc3\x1a\xb5\xce\xd3\x93\x7e\xf5\xb2\x36\x2c\xb0\x9c\x71\xdd\x09\x66\x57\x70\x0f\xd9\x6b\xda\x55\x5e\x22\x71\x2f\x71\xae\xc1\x1a\xe5\xe9\x1b\x24\xbd\x16\x49\x49\x8b\x8d\x9f\x86\x7f\xb6\xc4\x1e\x07\x60\x80\xf7\x40\xd0\x74\xc2\xa2\x55\x72\xd3\x4e\x66\x6b\x63\x67\xbf\x7c\xbb\x3d\xd4\x2a\x23\x82\xdc\x19\x73\x96\x12\x68\x60\x53\x96\x81\x0a\x45\x6a\xc0\x81\xbb\xfd\x3a\x54\xb4\x48\x81\xfc\xfc\x45\xb4\x24\x5e\xe7\x24\x65\xb4\x87\xd0\x7f\x2e\xf3\xf7\x4a\xdd\x71\xcd\xfd\xd1\x6e\x92\xfe\x25\x7d\x33\x46\x45\xb0\xa9\xbc\x7d\x07\x26\x13\xfb\x9c\x0c\xde\xa9\xdb\x4c\x72\xbc\x87\x10\x9e\x10\x2d\x7c\xba\xf3\x66\xec\xd6\x7f\xbe\x3d\xed\x32\x74\x73\x07\xa7\xae\xef\x61\x73\x5a\xd3\xaa\x5c\xe9\x5d\xee\xcc\x16\xa1\x6e\xb2\xa0\xbc\xc7\xad\xc0\xa1\x1d\x88\x80\x32\x26\x0e\x7c\x7e\xc9\xe5\x4f\x5a\x25\x31\x70\x2a\x7e\x5d\xfb\x87\xc3\x6c\xe3\x13\xa3\x14\x75\x88\xae\xf9\x62\xc7\x2f\xa9\x66\xd2\x41\x63\x7c\x38\x8b\x83\xdd\xec\x93\x43\xbb\x86\x34\x3e\x92\x0b\x12\xce\x1c\xc9\x15\xc8\x3b\x31\xe9\x98\x62\x69\x06\x74\xea\x49\x35\xa4\x88\x09\xd4\xd2\x79\x05\x41\x37\x54\x63\x92\xad\x9f\x08\xe7\xb8\xde\x61\xae\x73\xe8\x1e\x48\x3d\x3c\x63\xb5\xae\x73\x4e\x18\xe7\xa2\x2f\xee\xd1\x23\x3d\x0c\xa6\x33\x55\xf3\xa4\x8a\x33\x06\x7e\x1a\x0e\x19\x71\xf3\x6a\xa9\x29\xfe\x06\x13\xc2\x1c\x4a\xef\xf9\x41\x84\x29\xc3\xb0\x72\xa5\x98\x49\x59\x28\x7a\x5e\x5c\x40\xbe\x02\xbd\x22\xb9\xa7\x9c\x7f\x3f\x53\x59\xd2\xbb\xe4\x93\xf5\x56\xda\xcb\xb0\xcb\x4c\x29\x3c\x7d\x94\x12\x65\xe7\x77\x39\x2d\x14\x8d\x68\xc0\x7a\x13\xc8\xde\xc8\xe5\xd1\xe1\xc7\xf0\x41\xe8\x98\x3e\xdd\xda\xa4\x64\x9d\xac\x15\x72\xa3\x9a\xe4\xc6\x48\x0c\xa5\x50\xe2\xe4\x46\x2d\xcc\x84\x9c\x1b\xab\x78\x1d\x28\xa3\x55\x2b\x2d\x98\xe0\x2e\x15\x18\xe6\x55\x53\x40\xfb\x76\xd6\x8d\xb5\x89\x16\xd5\x56\xa7\xb8\x15\x63\xab\xa8\x1d\x9a\x57\xae\x50\xf0\x4c\xf5\x68\x60\x21\x84\x7d\x79\xb6\xbb\x3d\xa8\x01\x7a\x60\xb1\xc3\xbe\xef\xd4\x8d\x2b\x3c\xd3\x9c\x6f\x53\xc0\x8b\xcc\x96\x7d\x93\x06\x9f\x56\x2b\xb3\x6e\x0c\x4f\x4c\xa6\xbc\xcc\x5e\x57\xd3\x59\x03\xcd\x80\x0a\x61\x78\x5a\x93\x77\x0e\x37\x7f\x4f\xe8\xe9\xf4\xb6\x66\x80\x98\x49\x68\xf9\x64\x9e\x10\x5e\x7a\x11\x9d\x97\x63\x6f\x3a\x05\xca\xea\xb1\xd7\xea\x0b\xc8\x13\x34\xb4\x2d\x5c\xc0\x80\x83\x0e\xc2\x4d\x36\x9c\xf8\x67\x3a\x49\x0d\x59\xeb\x4c\xb0\x81\x81\xda\x39\xa4\x6d\x96\x6e\x23\xfe\xd8\xd3\x8a\x5f\xab\xc7\xe8\x43\xbc\xfb\x01\x5a\x44\x74\xbf\xd4\x6d\x4a\x43\xff\x4a\x51\xa9\x56\x76\x61\xe2\x69\x6d\xb8\x7c\x37\x58\xd3\xb5\x4c\xe7\x84\x6d\x13\x91\xd7\xf4\x65\x26\xef\x30\x84\x4d\x49\x32\x00\x18\xd7\x49\xb5\xd4\xdf\xd3\x0d\x38\x0c\x6e\x57\x3f\xc4\x14\xd8\xfe\xfc\x5d\x71\x04\x70\x75\x6b\xec\x00\xd8\x8a\xc4\xaf\xc9\x25\xd1\xed\xe3\x7e\xae\xe6\x00\x4a\x23\xea\x0e\xf8\xb6\x0e\x48"}, +{{0x4e,0xd7,0x04,0x8a,0xa1,0x28,0x4d,0xbb,0xcc,0x24,0x89,0x38,0xb4,0x0c,0x35,0x74,0x21,0x93,0x59,0x7a,0xdd,0xaf,0xdd,0xe0,0x64,0x13,0xb8,0xd4,0xcc,0xfb,0xe1,0x37,},{0xbf,0x84,0x1f,0xe4,0x44,0xad,0xd1,0xf7,0xc3,0xea,0xcd,0xfd,0x07,0x84,0xb4,0xe8,0x55,0xd2,0x40,0x5f,0x40,0x21,0xcd,0x9d,0x82,0x66,0x07,0x1c,0x32,0xc8,0xa2,0x73,},{0x10,0x6a,0x9d,0xeb,0x23,0x27,0xf3,0x38,0xcc,0xb7,0x1b,0xcc,0x94,0xe2,0xfe,0x3d,0x2e,0x97,0x3c,0xe6,0xdd,0x8f,0xa7,0xba,0xca,0x80,0x8b,0x41,0x11,0x81,0x3e,0x3b,0xc3,0xb4,0xd8,0x8e,0xfa,0x6a,0x00,0xc4,0x71,0x0b,0xbf,0xe5,0x31,0x96,0xf9,0xab,0x3a,0x15,0x0b,0x16,0x54,0xb9,0x08,0xfe,0xac,0xf9,0xc1,0x3d,0xf2,0xd6,0x38,0x02,},"\xdc\xff\x95\x87\xd6\x04\x6c\x11\x32\xbe\x07\xdf\x26\xdf\x63\x82\xff\x92\xcf\xc8\xeb\x53\x45\xc5\x1d\xd5\x0d\xd1\x88\xee\x76\x9f\x10\xa4\xde\x5e\x88\x83\xd1\x16\x96\x7b\xea\x97\xd3\xb3\x2b\xc8\xae\xbb\x9f\x01\x3d\x6d\xf9\x52\xf2\x51\xc1\xa3\x12\x34\x6e\x72\xce\xe1\x35\xa1\xbf\xd7\x6b\xf3\x08\x0a\x35\xc8\x38\xb4\x4d\x75\x5f\x26\x3d\x21\x03\x10\xfa\x8d\x28\xc4\xca\x52\xf0\x8c\xac\x5b\x83\xa8\xa3\xb1\xdf\xc4\x6d\x9b\x75\x2d\x9f\xc7\x36\x49\xd0\x0b\xb9\xee\x99\x26\x50\x63\x9c\x22\x5d\xea\xc1\xf3\x9b\x9e\x80\x36\x89\xd1\x9e\x6d\x9f\x8e\xf4\xf5\x1f\x1d\x11\x60\x1f\xac\xf4\x10\xdb\x64\x8b\xcc\x82\xbf\x64\x87\x69\xa7\xdd\x59\xc6\xe8\xa2\x37\xdb\x23\x9d\x3f\x66\x1d\x78\x52\xc4\x26\xd3\x94\xa9\x05\x09\x52\x6a\x85\x9b\x47\x64\x59\xde\xdb\xe6\xd8\x99\x36\xc0\xf3\x98\x99\x95\x51\x1d\x4a\x57\x6e\x54\x2c\xce\x5e\x0d\xd7\xee\xef\xeb\x03\x26\xd3\x3f\x25\xc2\x2a\xb6\xe7\x69\x06\x33\xf4\xc9\xed\x2a\xad\xf1\xd2\x4f\x94\x86\x21\x23\xa4\x64\x04\x2c\xea\x19\x3a\x2f\x04\x79\xd3\x9b\xcd\x1b\xbd\x1c\x7a\x0c\xa7\xe6\x25\x8e\xd3\x73\x23\x72\xf5\x4e\x0e\xd5\xe3\xf1\xe2\xe4\xd4\xa0\x4c\x51\x0b\xee\x08\xd1\xc6\xd5\x70\xcf\xd6\x3a\xbf\x14\xb4\xee\xf0\xb9\x6f\x39\xca\x29\xe4\x3c\x52\xf2\xca\x3d\xfd\x46\x0f\x66\xe3\x02\x35\xb1\x59\xaa\xef\x2c\xc1\x56\x01\x29\x69\xfd\x3d\x15\x99\x78\xd6\xca\xa0\xa9\x45\x22\x29\x1f\x79\x89\xd8\xaf\x10\x83\x19\x96\x13\x7b\x68\xd9\x7f\xc1\x7f\x6a\x9b\xc2\x84\x5e\xf3\xdd\x47\xcb\xc3\x86\xe8\x97\x7a\x86\x54\x36\x34\x12\xda\xc3\xac\x51\xc6\x38\x17\xb7\xc0\x51\x87\x8d\xcf\x45\x8a\xb3\x63\x0d\xd7\xae\xf6\x8d\x27\x0f\x8d\xa7\x88\x0a\x46\x7b\x33\x04\xf5\xba\xed\xfb\xa9\x17\x3e\x7e\xfd\x00\x7c\x41\x2d\x17\x20\x9c\x56\xd2\x39\x68\xe3\x40\xb8\xa0\xed\xb4\x1b\x7e\x2a\x40\x88\xbe\xc0\x1b\x53\x2d\xf8\x9b\x52\x15\x81\x31\x31\x10\x7b\x7b\x47\x4f\x03\xc2\xe4\x7d\x43\x17\xf1\x1c\x4f\x51\x60\x90\x43\x04\x99\x7e\x76\xa1\x21\xa9\x56\x02\x35\x20\x8d\x79\xb2\xda\xb4\xf7\xe1\x96\x79\x32\x02\xc0\x90\x2c\xe9\xc4\xbf\xc1\x0b\x8f\xe3\x97\xe3\x5c\xa0\x25\x64\x54\x66\x2a\xe8\x78\xef\xb0\xa0\xa6\x06\xfa\xc0\xa9\x52\xc9\xf6\xba\xae\xb2\xd4\x5b\x25\x8c\x61\x75\x59\xc0\xed\x25\x28\xa8\x8b\x49\xaa\x44\xee\x43\x03\x5b\x0d\x79\x3a\xad\x39\x53\xc1\xa5\xa3\x46\x38\x66\xbc\x81\x5b\x1f\xfc\xe2\xff\x2b\x65\xe0\xfd\x47\xdb\xc1\x5f\x4e\x7a\x06\xbf\xab\xc2\x90\xfc\x62\x09\x0b\xf7\xd9\x48\x53\xf7\x7c\x04\x44\xa9\xb9\x0e\xfe\x77\xd1\xce\xb4\xbd\x39\xe2\x03\xbc\x88\x40\x11\x62\x4e\x68\x46\xe2\xa3\x71\x05\x8d\xab\xa6\x3c\x23\xf8\x6c\x42\xc3\xe3\x1e\xaa\x4b\xd7\xd7\xa4\x2a\xf2\xd5\x24\x89\x6e\x31\xba\xa3\xe2\x07\x63\xf8\x5d\xcf\xd5\x27\x75\xf2\x80\x72\xd8\x9f\x0b\xd4\xfa\xe3\x0d\x0b\x13\x7e\xe3\x7a\xb0\x63\xba\x06\xfe\x9d\x4e\xc6\x2a\xbb\x2f\xea\x0f\x81\xb8\xcb\xee\xfc\x03\x00\x80\xb8\x02\x6a\x58\xfd\x18\x67\xf6\x6b\xe1\x15\x4e\x65\xbf\xea\x7d\xce\xc5\x5f\xe3\x2d\x51\xfb\x0b\x4a\x8a\x5a\x8a\x04\x42\x63\x94\x3d\x6a\xc8\x01\x1c\x6e\x67\x01\xbe\xec\x3a\x88\x65\x58\x40\xc4\x89\x2d\x45\x0d\x31\x2b\x76\x52\xd2\x51\x47\x69\xf2\x3b\xfd\x6e\x70\x46\x46\x7d\xf2\x9a\x28\x7f\xf3\xc4\xc9\xd0\xe6\x4e\x6d\x9e\x4e\xde\xe1\xb9\x35\xd0\x76\x81\xd4\x70\x04\x35\x28\x86\xe8\x47\xb0\xc6\xd5\x76\x2f\xd4\x5a\x81\xa5\x3c\xce\x94\x76\xc8\x87\x22\x1a\xea\x6c\x0c\x82\xbb\xf3\xb2\x97\x93\x2e\x5b\x11\xe5\x38\xa3\x24\x5d\x63\xd7\xb7\xb0\x91\xdf\xa1\xd7\xb9\xa0\xe2\xdb\x66\x98\xa4\xc5\xe9\xfe\x93\x16\x62\xd7\xc6\xec\x6d\x9d\x5b\x92\xbc\x7e\x04\x15\x55\xdf\x4d\xf0\xca\x11\xca\xbc\x48\x5f\x9c\x55\x61\x38\xa7\x17\x45\xf0\x3b\x97\x83\xbb\x20\x0b\x72\xd2\x33\x69\x7e\x8b\xcf\x6b\x41\x17\xee\x67\x63\xd7\x92\xd7\x42\x22\x64\x85\x2f\x4f\x30\xf8\xd1\x89\x0e\x2e\xa0\x80\x98\x04\x0f\x7f\x28\x8e\x4a\xbe\x90\xb6\x3c\xab\x2c\x14\x37\x30\x60\x84\x0e\xf8\x27\xec\xc8\x46\xcd\x56\x0e\x90\xa2\x0b\x83\x05\xf4\x63\xc3\x6e\xa0\x38\x84\xa5\xdf\x4c\x25\xf1\xba\x9e\xa1\x25\x95\x2d\xc0\x91\xb9\x75\x16\xde\x1d\x28\x7c\x0e\x2b\xf5\x29\x77\x5b\xa6\xd2\xf8\xed\xe0\x3c\xb4\x2c\x1e\x40\x0e\xc8\x04\xa9\xdf\x08\xe4\x6f\x44\xb5\x06\x63\x46\xe3\xf7\xc7\xa1\xa8"}, +{{0xc7,0xec,0xa8,0x3e,0x94,0x85,0x76,0xbd,0x9f,0x27,0x8f,0xd7,0xb8,0x28,0x00,0xa4,0x1d,0x92,0xda,0x9b,0x72,0xd5,0xa1,0xcc,0xdb,0xbc,0x65,0x58,0x10,0x52,0x56,0x8b,},{0x07,0x6b,0x83,0x52,0xdc,0xa8,0x03,0x1e,0x85,0x3c,0x8d,0x90,0x99,0xc2,0xef,0x57,0x93,0x37,0xcc,0x7b,0x2b,0x4c,0x75,0xd1,0xa0,0x63,0xea,0x3e,0xc7,0x25,0xb7,0xfd,},{0x86,0x99,0x6a,0x1b,0x8e,0x49,0x5d,0x42,0x52,0x77,0xe9,0x7c,0xc0,0x83,0x05,0x49,0x34,0x9b,0xc2,0xb6,0xf3,0xdc,0xda,0x60,0xf3,0xb7,0xd3,0x50,0x1b,0x8b,0x50,0xb5,0xb4,0x58,0xcd,0xa5,0x8b,0x43,0x6e,0x23,0xc0,0x2c,0xd4,0xa2,0x2b,0x23,0x48,0x13,0xaa,0x9b,0xcc,0x3c,0x61,0xf9,0x83,0xc0,0xb7,0xef,0xec,0xa0,0xf1,0xbe,0xc2,0x0d,},"\x8d\x8c\xef\xd6\x73\x85\x5c\xcd\x8e\xb8\x53\x4c\x31\x2d\x33\x80\x05\xbb\x05\xf5\xb9\x50\x7d\x58\x85\x9e\x1e\x95\x3b\x0a\x4d\x91\x3b\xe7\x59\xd8\xed\xfa\x92\x89\x8c\x6e\x70\xa5\x3f\x81\x95\x4f\xc3\x44\xb4\xad\x62\x46\xb0\x10\x94\x81\xba\x6f\x73\xae\x63\x31\xab\xf2\xdf\x10\x8e\xb2\xe8\x5c\xeb\x08\x7c\x1f\x6f\xcf\xc9\xde\x2c\x1f\x13\x9b\xa1\x77\x1b\x72\x68\x03\x02\xd8\x11\xcc\xd0\xcc\xd4\xe0\xc7\xfe\xb0\x13\x2e\xb2\x0b\x33\x4e\x5a\xab\xe5\xf6\x11\x9f\xd8\x94\x7d\x9e\x88\x52\xe1\xeb\x1b\x74\x10\x7e\x17\x41\x00\xe3\xe6\xdf\x0c\x3a\x68\x13\x0c\xa6\x30\x94\x02\x59\x4b\xb5\x0c\x1c\x8e\x27\x74\xf1\x32\x14\x49\x6a\x7b\x1f\x34\x83\x85\xea\xbf\xbc\xcb\xac\x16\x5a\x5a\x2e\x7d\x9d\xea\x5f\xfd\x58\xb0\xbd\x88\xb4\x9c\xb3\x31\xec\xb7\xf4\xe9\xd6\xba\xe9\x79\x1a\xd7\x88\xe6\xab\x89\x26\xc1\xcc\x16\x15\xde\xaf\x4c\xc4\x00\xc7\x7a\x31\x61\x97\xbc\xa1\x90\x49\x95\xe1\x36\x5d\x1b\x97\x02\x64\x83\x76\x11\x69\x30\xf6\xf9\x11\x66\xe6\x14\x86\x29\xe7\x5b\xe2\xd0\x68\x95\xf6\xa8\xd1\x5d\x5a\x94\xca\x69\xb7\x12\xf3\x3b\xcf\x95\xbe\x0c\x1b\xe6\x90\x2b\xb7\x8b\x8a\x23\x0d\x7a\x85\x60\xc4\xd8\x4e\x23\x89\x55\x2a\x81\x57\x1a\xa6\x65\xc1\x9c\x2e\x93\xb0\xd4\x3e\x8c\x2c\xbd\x9e\x88\x5d\x70\x52\x51\x8b\x77\xc4\x7e\x84\x1d\x11\x9d\xc2\x8b\x65\xa7\x50\x4f\x66\x42\x71\xf0\x6c\x7f\xf3\x93\xf8\x25\xb1\xe5\x93\x0d\x02\xb9\xc7\x00\x35\xe2\x92\x41\x1c\x4a\xed\xf6\x60\x47\x00\x69\x70\xe3\x49\xdf\xca\x7f\xb4\x1c\x10\xfd\x53\x7e\x35\x25\x2e\x10\x9e\x33\x36\xd7\xa8\x2a\x14\xde\x5d\x55\x40\xc6\xfc\x65\x71\xd5\x77\x4f\x39\xb7\xc4\x03\xe7\xb8\x87\x5e\xc2\x15\x87\x7e\xfc\x6c\xc8\xea\x48\xb1\x86\xb4\x68\x21\xea\x5e\xf2\xba\x8b\xac\xd4\x0d\x79\x7e\x6a\xdd\x06\x41\x32\x83\x14\x5b\x60\x46\x2b\x35\x03\xc5\xb8\x81\xd7\x9a\x59\x29\x55\xd1\x8a\xfa\x08\x96\x9e\x31\x45\x7f\x5b\x27\xda\xec\x01\x03\x38\xed\x86\x7f\x30\x08\x78\xfd\x87\xce\x32\x18\x80\xb8\x60\xa0\xc6\x42\x84\xca\x2d\xc1\x5f\x5e\x53\x10\xe1\x0e\x6a\x73\xa7\xea\x65\x0e\xa9\xd3\x73\x69\x4d\xa4\xdd\x42\x9a\xe7\x41\x2e\xf9\xb2\x9c\x83\xb3\xb0\x68\xc7\x47\x69\xf4\x31\xce\x06\x15\xf9\xff\x4f\x82\xba\xac\x47\xb4\xbc\xe9\x04\x49\xec\x41\xc2\xa2\xd5\x73\xd9\x2b\x92\xe0\x56\x31\x48\x61\x65\xbc\x71\x0e\xf5\x84\x0f\x80\xda\xe9\xf9\xdd\x5c\xff\xd4\xeb\xf5\xd1\x07\x46\x51\x0c\x5f\xcb\xfe\x62\xcb\x97\x03\xc0\xb1\x54\xc8\x6f\x10\x81\x66\x72\x49\x76\x70\xa3\xb0\x15\x0b\xb4\xe1\xb0\x3b\x3b\xd5\x44\xc1\x2a\x90\xc3\xed\xcc\xd7\x90\x0e\xbb\x5b\x31\xc9\x11\x17\xcc\x82\x81\xa3\xc4\xed\x04\x99\x8e\x99\xae\xd4\x1b\xb4\x1f\xce\x99\x90\xa4\x06\x48\x5b\x14\xdb\xe3\xbc\x1a\x5f\xcf\x77\x19\x50\x79\x90\xda\x3b\x0b\x3c\x68\xad\x40\xd8\x95\x0c\x0d\x49\xce\xd1\x01\x93\x19\xa3\xf3\x6a\xff\x6c\xaf\x75\xd7\xf9\xa0\x93\x3d\xd3\xab\xdd\x76\x92\xa1\x56\x2f\x06\x13\xfe\x4a\x27\x8d\x5c\xe4\xc8\xda\xfb\xb5\x5b\x2e\xc2\xaf\x2b\x24\xe8\x39\x6f\x58\x7b\x17\x0c\x9c\xa6\x54\x75\x08\xfa\xcd\xe7\x34\x90\xdf\xb0\x1e\xb6\x65\x7e\x3f\x4f\x27\x23\x04\xb7\x0b\xf0\x47\xa4\x3a\x2b\x58\xe5\x56\x8b\xc5\x2b\x2c\x8d\x4c\x03\x21\x9a\x5a\x8b\xd3\xdc\x06\x43\x18\x59\x13\xc0\xaf\x74\x11\xf8\x1b\x77\xbe\x2a\x9b\xfd\x5c\xb2\x69\x77\x11\x3d\x26\x58\xa9\x71\x92\xb4\x1c\xf6\xc7\x01\x1b\x0f\xf6\xa1\x1c\xbf\xf3\x50\x55\x46\x32\x2f\x0b\xef\x60\x97\xe4\x6b\x36\x49\x2b\x01\x6a\x45\x62\xe0\x92\xb6\x7c\x3f\xcc\xc7\x78\x0e\xa2\x74\xd9\x6d\x59\x58\x49\xf7\xe2\xa5\x6d\x79\xed\xcb\x32\xd7\x84\x04\x9f\xc1\x32\x4a\x5b\xee\xfc\x24\x19\x3a\x66\xe1\xca\xc4\xa1\x3a\x81\x1b\x90\x95\x83\xcc\x91\x0c\xf0\x8d\x4b\x10\x4d\xbd\xb8\xa6\xf2\xb2\x1f\xbc\x1d\xb1\x17\x5a\x1a\x23\x56\xa6\x3d\x3e\xea\x9d\xbb\x85\x37\xd2\xc6\x86\x27\x54\x3d\xf0\xd1\xf8\xfd\x8d\x57\xa1\x8b\x0d\xbd\x69\xb9\x20\xcb\x9b\x28\x6e\x3c\x07\xae\x44\xae\x2e\x1b\xee\xc0\x1c\xee\x6b\xa9\x88\xb5\xd1\xaf\xb9\x97\x90\xb1\xdd\x91\x06\x55\xc4\x3d\x7f\x2a\x3e\xd3\x75\x4b\xa4\x65\x16\xd2\x78\x70\x55\x59\xf5\x74\x16\x22\xa9\xab\xb5\xc8\xf2\x3f\xa9\x76\xa9\xd1\x46\x94\x8a\xde\x6b\xa6\x60\x8a\x35\xe4\xe0\xd3\x30\xe8\x2e\x96\xa2\xbe\x6c\x78\xad\x0c\xd4\xd8\x70\x4e\x57\xce\xa1\x46"}, +{{0x7b,0x46,0x9d,0xf9,0xc8,0xf7,0x84,0x89,0xab,0x47,0xcc,0x70,0xa8,0x85,0x03,0xf1,0xb8,0xf3,0xd9,0x29,0xc3,0x3f,0xea,0xb1,0xc5,0x03,0xf0,0x96,0x9a,0x3a,0xc3,0x7b,},{0xa8,0x14,0xc7,0xe3,0x73,0xd0,0x11,0x3b,0x90,0x62,0x4a,0x8a,0xb2,0xbc,0xa5,0xcf,0x53,0xbf,0x52,0x8e,0x39,0xfc,0x3d,0x36,0x7d,0xe1,0x54,0xb9,0x4b,0xb2,0x2f,0x1d,},{0x18,0xfa,0xf8,0x2d,0x08,0xe1,0x06,0x8e,0x9f,0x98,0x3d,0x81,0x2f,0x05,0xfd,0xb6,0x92,0x9d,0x27,0x23,0xdb,0x1f,0x77,0xc4,0x5a,0x74,0xbb,0x09,0xcf,0xf2,0x77,0x73,0xb5,0x4c,0xe8,0xf4,0x3b,0x30,0x15,0x41,0x91,0x12,0xe7,0x25,0xea,0x7a,0xcd,0xa4,0xb2,0x3b,0x81,0x20,0xe7,0xb0,0xcf,0x42,0x01,0x53,0xe5,0xb0,0x3d,0xd0,0x61,0x09,},"\x1c\x0f\xd7\x45\x0e\x29\x67\x5c\x93\x09\x16\x38\xc2\xac\x93\x3c\xa9\x97\x76\x6e\x38\x0e\xc3\x3a\x92\xb8\xa7\xe1\xa1\xed\x98\x21\xc7\x5f\xcc\xb5\xc5\xf3\x76\x0e\x76\xd0\xe8\x81\x03\x11\xdd\xc6\x24\xea\x87\x42\x13\x1c\x1c\x43\x08\xf4\x17\x8e\x04\xd0\x49\x60\x69\x3d\x84\x6c\x1f\x51\xd8\x77\x3b\x6d\xeb\x34\x43\xd8\x74\xb9\xe2\xde\x3b\x77\x78\x51\x85\x51\x8b\x2e\x9e\xe7\x36\xc6\x3a\x39\xc8\x21\x2c\xa8\x66\x9e\x16\x1d\x13\x1b\x1a\xb2\x26\x4f\xdd\x72\xdc\x56\x28\xb1\x1c\x06\xf2\xaf\x9f\x07\x89\x04\x7b\xdd\x4e\xbb\x5d\x55\x89\x9f\x74\xdc\x4e\x12\xe7\x97\x53\x63\xf6\x3a\x8d\xa7\x6b\x55\x85\xc1\x6b\xb6\xd5\x5b\x05\xfa\xde\x87\x13\xd1\x9c\xad\x1a\x21\x16\x40\x26\x26\x91\xaa\xc9\xb4\x37\xa9\xec\xf8\x9a\x92\x46\xec\xdb\xa1\xff\x0b\xea\x78\x49\x4c\xee\x15\x29\x62\x16\xea\x6b\xb8\x82\x47\x9d\x24\x37\xc9\x49\x4a\xc7\xfa\x4f\x30\x15\xd1\xd3\x14\x9d\x55\x64\xd7\xc1\x1a\x7e\x7b\x61\x4f\x7d\x3e\x9d\x45\x4f\x0a\x05\xb0\x40\xa1\xe0\x6f\xe7\x83\x7c\x2a\x9d\xa2\x79\x4d\x91\x8b\xff\xa9\xe6\x1a\x0c\x3f\x08\x9f\x6c\x9f\x7e\xea\xc5\x86\xe3\x4b\xf9\x44\x70\xd9\x13\xda\x41\x37\x1c\xac\xdf\xc7\xee\x8b\xd1\x13\x56\x55\x56\x69\x24\xea\xdf\x09\x6a\xc0\x30\xa6\x59\x02\xc1\x03\xb1\x72\xd1\x2e\x88\xf0\x53\xfc\x56\xee\x73\xf3\x18\x70\x81\x70\x83\xaf\xa8\x02\xf7\x66\x8b\x81\x5e\xe7\x90\xf7\xd4\x0b\x43\x7a\x2e\x6d\xb2\xf0\xfb\x26\x83\x6b\x4b\x23\x31\xeb\xa5\x55\x39\x61\x4c\x0f\xe1\x72\x40\x24\x2d\xd3\xaf\x73\x83\xbc\xff\x7d\x3f\x47\xd6\x54\x4b\x08\x72\x0c\x0a\x52\x44\x1f\x74\x11\x93\x5d\xd4\xa9\x52\xd3\x86\x51\xa8\x00\x05\xfa\x3e\xb0\xea\xec\xc7\x35\xd2\x90\xe8\xbd\x5e\x31\xb7\x40\x14\x0e\x13\x6b\x2c\x00\x25\x23\xd8\xeb\x2a\x0a\xb5\xbd\x68\x70\x02\xb3\xb9\x26\xf7\x5e\xb6\x90\xd1\xda\x73\xad\x23\x58\x92\xf3\xb2\x3a\x75\x6b\x60\x5a\x43\x7c\x00\xe0\x62\x13\x04\xe8\x10\xf9\x9e\x31\x4c\x4d\x63\xe3\x22\xd9\xb6\x98\x15\xf3\x82\xff\xa1\xec\x62\x80\xfc\x0e\x64\x1c\x8a\x6f\x6f\x7f\x61\x98\x5b\xd3\x56\x7e\x0f\x44\x0d\xe9\xf7\x62\x17\x15\xda\xcd\x07\x42\x8c\x00\x90\x15\x4d\x59\xce\x6d\xb4\x01\x69\xc6\x58\xac\x5b\xf4\x4b\x67\x67\x1f\xe1\x9e\x4b\x5b\x38\xaa\xd2\xd3\xd4\xe1\x90\xa5\x50\xaa\xd4\x18\x83\x52\xf7\x98\x1a\x6d\x88\x06\x25\x02\xdf\x86\x79\x13\x50\x39\x2d\x41\xce\xfa\xcb\x24\xe3\x7b\xc7\x00\xcb\x02\x91\x90\xc3\xb1\x82\x14\x77\xe1\x17\xd5\xa4\x62\xfb\x3e\x79\x13\x3b\x10\x73\x59\x89\x66\xf5\x2b\x63\x25\x6d\xbf\x32\x6a\xce\x14\xdb\x0c\x80\x05\x8c\xf0\x0d\x68\x9a\x0a\x58\x11\x1a\xf1\x69\x27\x44\xbf\x79\x1b\xcb\xb4\x27\xa3\x72\x24\x6e\x95\x01\xa8\x5c\xd5\x20\xc6\x1a\x1e\x59\xee\x18\x0e\x8c\x97\x19\x2f\x60\xfa\x5d\x3a\xb0\x5d\xf8\xd8\x55\x1c\x1a\xc6\xca\x0a\x9a\x01\x2f\xfe\xce\xb3\xc1\xf5\x21\x41\x1e\xdb\x65\x09\xbc\x27\x8a\x65\x1e\x12\x9e\x96\xb0\xad\xc7\xae\xd7\x07\x22\x1c\xae\xac\x22\x98\x84\x41\x3d\xaa\x10\x59\x5d\x22\xd1\xdb\x70\x82\x12\x5f\x4f\x96\x95\x00\xa1\xd4\x8d\xac\xda\xe8\x0f\x40\x29\xc1\x63\xdc\xd7\x9d\xdc\x64\x68\xfc\xda\x16\x37\xb8\x7d\xdc\xf2\xa3\xd9\xb4\xd2\x99\xa0\xe5\x39\x4d\xf9\x0e\xd0\x3b\x62\x13\x7b\xa6\x7b\x9f\xea\x8a\xe1\xf0\xd2\x2f\x91\xc6\x3a\x24\xb5\x93\x4f\x74\xc2\x65\xc4\x3f\x1b\x92\x3d\xb9\x80\xad\xfc\xee\x83\x13\xda\x52\x01\x76\x73\x0e\xf9\x73\x6b\x27\xe6\xba\x32\xd1\x7e\xa6\x9d\xca\xc6\xf4\xa0\x16\xed\xfe\x2d\xb5\xa5\xbb\x3b\x64\x93\x2f\x70\x11\xf1\xc4\x53\xbb\xe8\x8b\xba\xc8\xc7\x03\x5f\x93\xfe\x39\xb5\x81\xfc\xaa\x7a\xaf\x08\x2f\xbe\xd0\x04\xfd\x1f\xd5\xa4\xe2\xd9\xc1\x97\x16\x60\x4b\x19\xce\x19\x9e\x21\x69\xa7\xbe\x51\x8d\x5f\xad\xd2\xac\x31\xb9\x54\x78\x08\x2a\xc9\x13\x06\x00\x8d\xe4\xec\x0e\xf4\xc9\xf9\xd6\xf9\x6d\x2f\x66\xd6\x2f\xaf\xc2\x19\x40\x82\x80\x8a\xf0\xd6\x7b\x9f\xba\x0d\x18\x9b\x05\x5f\x06\x1c\xca\xc2\x4b\x27\x61\x0b\xfb\xd5\xa2\x23\x2d\xd6\xf3\xc8\x90\xa9\xb1\x26\x64\x71\xb3\x22\xe9\xe1\xbf\x97\x75\x7b\xef\x72\xab\xce\xe9\x3b\x05\x1f\xc9\x23\xcf\xd4\xe7\x23\xbe\x3e\x17\x14\x3f\x38\xee\xbb\x90\x0b\x5b\xbc\xf7\x30\x47\x32\xb9\xc0\xa1\xc5\xfc\x95\x09\xa6\x93\x58\x0a\xe7\x3a\x4c\xdf\xc5\xfb\xf2\x0c\xe8\x1e\xbc\x83\x5c\x6c\x90\x9d\x83\x11\x41\xb1\x94\xf6"}, +{{0xdf,0xec,0xde,0x7a,0x56,0xa1,0x8c,0x1f,0x19,0xd8,0x0a,0x19,0xa4,0xf1,0xda,0xdd,0xd0,0xbc,0xec,0xb0,0x1e,0xec,0xad,0x6d,0xfc,0xa0,0xf9,0x57,0xa9,0x14,0xed,0x7a,},{0xaf,0xba,0xa6,0xe7,0x3e,0x85,0xb0,0x2b,0x25,0xa4,0xb5,0x87,0xec,0xb8,0xc4,0xdf,0xb7,0x9a,0xa9,0x20,0x27,0x61,0xef,0xa8,0xd1,0xdf,0x2c,0xd0,0xaa,0x63,0x16,0xc4,},{0xb4,0xfd,0xe5,0x5b,0x91,0x6c,0xf6,0x00,0x68,0xf1,0x9b,0x25,0x35,0x1c,0x14,0x10,0xdc,0xf6,0x6b,0xfc,0x40,0xf9,0x6d,0x1b,0xa2,0x36,0x8b,0xc2,0xb9,0x11,0x5a,0xaa,0x5b,0x2d,0x1c,0xf0,0xe3,0xdf,0xca,0x02,0xac,0x90,0x2a,0x94,0x3e,0x24,0x89,0xa5,0x68,0x1b,0xba,0xfe,0xd3,0x9c,0x6e,0x33,0x21,0x1a,0x9c,0xb2,0xff,0x6e,0x54,0x09,},"\xae\x6e\x8f\xf6\x5c\xcd\xe6\xf2\x64\x84\x95\x08\x26\xb4\x36\x23\x05\x8a\x5e\xfe\x02\x0b\xb1\x9b\x7d\x8b\x4e\x25\x76\x8b\x69\x27\x34\xfe\x07\xc9\x13\xb9\xe8\x81\x26\xbe\xcb\xf1\x4a\x0f\xd0\x20\x5b\x39\xfc\xc2\xae\xc3\x73\xf8\xc1\x84\xc6\xa9\xbb\xbb\x84\x44\x9a\x7c\xa3\xb9\x20\xad\xa0\x88\x01\xdf\xc6\x6f\xf1\x9a\xeb\x92\xf2\x55\x53\x99\xa4\x30\x27\x7a\xe2\x2d\x23\x75\x4e\xaa\xce\x3c\x73\x84\x67\x97\x53\x6d\xd7\x1a\x56\xf4\xb5\x84\x2c\x0f\x41\x0d\x19\x89\xac\xac\x5d\x80\x5d\x26\x57\x2c\x0f\x3a\x64\xdd\x20\x71\x66\x22\x12\xd5\x2f\xe9\x9e\x59\xd9\x66\x04\x77\x77\xf9\x03\x0f\xa4\xfd\x2e\xe7\x4b\x7a\x7c\x9f\x7c\x34\xa6\xdc\x7e\x03\x59\x3a\x13\xd6\x4c\xe6\x24\x53\xee\x3c\xa3\x0d\x84\x67\x28\x39\xf1\x9f\x1c\x15\xd0\xc4\x5d\x27\x55\xbb\x39\x4a\xcf\x4d\xcb\x7f\x7f\x07\x11\xac\x40\xea\x46\x61\x2e\xa3\x7a\x76\x07\xad\x32\xe8\x18\x26\x5f\xab\x19\x33\xf5\x09\x4e\x2d\x03\xbc\xfa\xa5\xf6\x16\x67\xf3\xb3\x7f\x00\xc4\xc5\x8d\x9b\x41\xb9\xaf\x39\x00\x48\x2b\x0f\xfb\x4f\xa4\x37\x6a\xa0\x40\x00\x9d\xec\x2f\x45\x25\x79\x9c\xb0\x05\xf3\x9d\x74\xcb\x2d\x8d\xce\x8c\x20\xc2\xc3\xf5\x40\x97\x03\xaf\x15\x6c\xfb\xa2\x8a\x9d\x91\x64\x39\xcb\x29\xf8\x3d\x24\x29\xce\x62\x23\x51\x9e\x75\xe1\x5c\x7c\x7f\xa2\x15\x11\x9e\x07\x3f\xa7\x97\x4d\xb1\x4f\x7a\x01\x09\x3f\xaa\x94\xad\x52\xab\x1e\xad\xce\x1a\x89\x36\x6c\xa1\x3a\xdb\x89\x06\x64\x38\xa2\xbe\xb7\x30\x34\x17\x0a\xa4\x2d\x9c\x2d\xdb\x97\xc1\x4a\x17\xc3\x09\x43\x76\xd2\xa3\xff\xd8\x09\x5f\xc4\x05\x3d\x91\xd1\x6e\x06\xd2\x76\x93\xa1\x31\x0f\x01\xa7\x51\x11\xcf\xed\xa8\x92\xc3\x97\x2a\x13\x3a\x09\xad\xda\xa8\xf7\x41\x45\xf8\x86\x81\xb6\xd2\x77\x96\x4b\xfe\x38\x55\x1a\x2c\x61\x9f\xa3\xca\xe3\x94\xac\xb2\x9c\x94\x10\xb4\x5e\x10\x1b\x17\x40\xe8\xb2\xaa\x6f\xeb\xc3\xa4\x5d\xad\xb9\xd9\x58\x9d\x59\x7e\x57\xcd\x94\x7b\x68\x4c\xc3\x55\x24\x6c\xe6\xc3\x26\xdd\x98\xcf\x92\xb6\xee\xa3\xba\x5a\xb0\x37\x00\x62\x26\x36\x32\x4d\xc1\x22\x2c\xd7\x48\xfa\x07\xbf\xd3\x9a\x1e\x06\x98\x09\xe5\x67\x14\x1a\x61\x3e\x2e\x8b\xe9\xdd\x39\x8a\xb6\xbe\xaa\xfd\x85\xff\x36\x28\xee\x2a\xa3\x2d\x0a\x57\xbb\xac\xf9\x56\x19\x0b\x5c\x42\x42\xeb\x5b\x85\x87\xd2\xfd\xcb\x07\x41\xb9\x41\x6a\x05\xf5\xfe\xcb\x1f\xb2\xd6\x47\x88\xdc\xe7\x83\xc1\xf6\x3e\x60\x64\x1f\xce\x5e\x1d\x2b\x18\xa9\x50\x0c\xd6\xa1\xfd\x33\x5c\xc1\xdb\x46\xef\x04\x75\x2b\x2d\x22\x07\x2e\x6d\xfc\xfc\xfa\x56\x9b\xb2\x5e\x45\x7a\xfe\xb6\x3a\x4f\xbe\xdc\x29\x3a\xd9\xd1\xab\xa4\xe3\x94\xaa\x10\x97\xe1\x2b\x0f\xc9\x0c\x89\xf7\x6d\xf0\xd6\x44\x1f\xa9\x98\x08\xb6\x0b\xe0\x7d\xfc\xc7\xf9\x01\x0b\xbf\x90\x33\x55\x6d\x5e\xe2\xd4\x48\x93\x7b\x78\x34\x93\x92\x0f\x68\x1e\x4d\xa7\x08\x67\x10\x97\xe1\x99\x48\x1b\x8e\xf0\xe0\x15\x0d\x7c\x28\x51\xdf\x44\xc5\x45\x12\x2f\x9b\x0e\x5b\xa2\xee\xff\x2d\x98\x8d\x56\xd9\xbb\xb5\x5d\x98\x96\x11\x11\x51\xa4\x36\xaf\x06\x5e\x0c\xad\x17\x8a\x2c\x9f\xa8\xf6\x97\x4e\xcd\xf0\x9a\xdf\x01\x33\x00\xcf\xfe\xda\xf4\xb8\x79\x1b\x46\x7b\xa7\x93\x3a\xda\x5d\x63\x2d\xb4\x4e\xd6\xdc\xf2\xaa\x64\x89\x17\xbe\x63\x37\xd2\xe2\xd2\x06\x85\x6d\x08\xf9\xee\x7b\x5e\x2f\x14\xdd\xc6\xd3\xac\x42\x92\x15\xa8\x79\x23\xad\x32\xd5\xdc\xfe\xe3\x68\x63\x16\xdd\xd1\xb2\x7b\xb1\x93\xa5\xfc\x05\xc8\x93\xa9\x39\xa5\xb9\x89\x87\x36\x6c\x82\x9e\x39\x2f\x48\x5e\xa1\x5e\x22\xcd\x8f\x85\x7a\x13\x4a\xfa\x98\xf3\x72\x15\x57\x6d\xdc\x5a\xab\x4f\x2d\x10\xca\xaf\x05\x00\x59\xa3\x35\xf2\x4b\xcd\xcb\xac\x81\x9f\x66\xdb\x07\xaa\xbd\xfb\x76\x27\x1d\x17\xbc\xe2\x2c\xba\x46\x3a\x80\xaa\x89\x2d\x0d\x8e\x05\x5f\x94\x8d\xf7\xf6\xe6\xc3\x00\xda\xef\xfd\x3a\x23\x6d\xdd\xcf\x23\x8f\xe1\x06\x66\xa5\x7c\x6e\x3a\xe7\xe3\x67\x3d\x35\x57\x8f\x8b\x8e\xa6\x9d\x3c\x08\xe0\x14\x0a\xfd\x3e\xe0\x30\xb2\x2a\x37\x21\x60\xf9\x08\xa3\x78\xf8\x10\x1b\x5f\x59\x69\xfe\xa3\x10\xee\xd3\x7a\x00\xd9\x73\x02\xd5\xc2\xdb\xe8\xcc\x60\x00\x75\xdc\xcd\x33\xad\x63\xd2\x65\xaa\xf6\x0e\x24\x1c\xe3\x11\xbe\xd7\xdd\x5e\x27\x45\x24\x1a\xe0\x2a\xe5\x32\xd1\x5c\x18\x88\x6e\x81\x81\x38\x75\x1a\xfc\x51\x85\x0e\x50\x6c\x6d\x31\xa8\xee\xf4\x51\xad\xfd\x4b\x3d\x26\x6b\x41\x5a\x7e"}, +{{0x07,0x82,0x8c,0x58,0x0e,0xbf,0x9e,0x1d,0x82,0x5a,0x59,0xc3,0xbf,0x35,0xf0,0x72,0xae,0x12,0x33,0x55,0xbd,0xcc,0x24,0x9e,0xec,0x7f,0x2f,0xc5,0x75,0x5e,0x29,0xb5,},{0x58,0xe5,0xed,0x85,0x10,0x0b,0xbd,0x9b,0x22,0x21,0xaf,0xc9,0xc9,0x31,0x84,0x33,0x0a,0xd5,0x9e,0x13,0x85,0x60,0x62,0x44,0xbf,0x00,0x3b,0x8d,0x20,0x18,0x50,0x1b,},{0xbb,0x09,0x36,0x04,0x39,0xa8,0x2d,0xee,0x5c,0x7d,0x85,0x77,0x9e,0x54,0xc1,0x3f,0x88,0xe0,0x6d,0x38,0xf4,0xb9,0x49,0x60,0xfe,0x17,0xa1,0xeb,0xca,0xa3,0xee,0x2f,0x33,0x0c,0x64,0x91,0x54,0xbb,0xc8,0x75,0xa4,0x07,0x6c,0xf0,0xbb,0xf7,0xee,0xbf,0x7b,0x8d,0x08,0xd5,0xaa,0x4b,0xe7,0x41,0x38,0x81,0x24,0x5f,0xc2,0xd2,0xb6,0x01,},"\x0e\xda\xd5\xca\xe6\xed\x98\x43\xe9\x1c\x50\xd9\x34\xcf\x55\xdd\x65\x8f\x3d\x25\x20\x39\xcd\x6c\x75\xbe\x4f\x6b\x86\x6f\xb7\x5f\x35\xc8\xf9\x8f\x17\x21\xd7\xe6\xd9\xd9\x8a\x22\xe0\xb4\x93\x4d\xcc\x12\x92\x61\xbf\x67\x23\xb2\xfa\x7a\x99\x5e\x35\xc4\xbd\x79\xc5\x81\x6a\x32\x16\x07\xd9\xdc\xce\x39\xfe\xfa\x1d\x55\xde\x4e\x76\x17\x54\x8e\xc3\x85\xc3\xde\x01\xe3\x66\xbf\x50\xc4\x57\xa5\x55\xe9\x32\x07\x0e\x2a\x5a\x01\x97\xb7\x9e\xfb\xe7\x00\x6f\x0c\xec\x78\xb6\x0e\xbb\x8f\xa8\x78\x1d\x8e\xb7\x32\x6e\xdc\x30\xe6\x2d\x32\x97\xa1\xe0\xa1\x11\x71\x08\xc4\x6e\xe5\xdb\xef\xc6\x59\x42\x89\x33\x5e\x78\x0d\x55\xa0\x84\xf5\x52\xda\x3f\x36\xd3\xc4\xc6\x17\x8b\xa7\x4d\x4d\xec\xef\xc5\xa3\xb8\xc4\x7c\x16\xf5\x34\xbd\xb6\x08\x95\xd3\xd5\x4c\xd2\xbb\x26\x6b\x39\x9e\x4d\x4f\xb4\x8d\x7a\x8c\xde\x17\xf4\x24\x12\x56\x07\x37\xd3\xc0\x6e\x29\xdf\x52\x4d\x0c\xbd\x30\x93\xef\xca\x1c\x8f\xed\xca\xa1\x24\xab\xb2\x7a\xbd\xac\x6a\x29\xe0\xe8\x24\x6a\xbd\x6f\x5f\x53\x19\x50\x03\x7f\x76\x32\x3a\xa5\x6c\xc3\xfe\xfa\x60\x30\x41\xd5\x5f\x19\x29\xe2\x77\xe7\x2c\xda\x1f\x96\x54\x1d\x2a\xf3\xe9\x0c\x0f\x0e\x28\xbe\x19\x6d\x8f\x69\x21\xf3\xcd\x57\xa7\x92\x6b\x86\x0a\xa1\xbc\x40\x35\x76\x89\x2a\x96\xb9\x31\x90\xae\x38\x3f\x63\x1b\x72\x80\x26\x58\xb2\xe8\x45\x1d\x52\xa2\xf4\x5d\xb4\xf8\xbc\x3b\x0e\x4e\x50\xb6\xd6\x03\xa5\xbd\xd3\x0c\x23\x42\x00\xad\x7d\xeb\xb9\x63\xf5\x8a\x4f\xa2\x03\x30\xb3\x69\x64\x49\x44\x5a\xa3\x71\x82\x48\x42\xfb\xf3\x26\xd9\x01\xdf\xe3\xbe\x04\x54\x52\xa3\x74\x0d\xd1\x60\xe7\x27\x33\xf6\xe2\x73\x35\x25\xa2\x9a\x86\x5f\x6f\x50\xd5\x3b\xf7\x19\x1c\x59\x9c\x87\x6f\x5c\x9c\xa1\xe3\xfa\xd7\x96\x06\x48\xe0\xd4\x71\xf7\xd5\xc0\x1c\x67\x3f\x42\xd6\x59\xbc\x3d\x98\xdb\xf0\x7d\x8f\xeb\xfb\x99\x5d\x17\xf9\xa0\x2c\xd6\xc3\x9f\x2d\xdc\xd0\xf1\xd2\x22\xb9\xe1\x1f\x2d\xd7\xd3\xc7\x51\x82\x24\xbb\x6b\xfb\x8b\x7c\x58\xfe\x8a\xc1\x05\x40\x59\x03\xa1\xb9\xda\x75\x16\x71\x5b\x7a\xfc\x38\xa5\x55\xe6\xbb\xcd\xba\xd4\x6e\x34\xe5\x76\xfe\xa3\x4c\xe3\x57\x34\xed\x20\xaf\x5d\x88\xee\xb1\x04\x7a\x26\x60\x64\x8b\xbb\x11\x3a\xd9\xdb\x8c\x53\xed\xb6\xed\x98\x71\xa1\xe4\x4c\x9e\xd2\xdf\x56\x56\xfb\x2b\x28\x06\xec\xf0\x3b\x1e\xca\x9e\xab\x50\xa6\xea\xab\x55\xb9\x33\xb2\xdd\x1f\x21\xd4\x50\xde\x9d\x5c\xb2\x23\x2f\x07\xa3\x92\x08\x1b\x0b\x4b\x88\x5d\x54\x78\x9e\x2f\x75\xbf\x2c\x4c\xda\xd8\x78\x98\x9b\x1d\x6d\xab\xd9\xed\x23\xc7\xc5\xb0\x35\x6a\x7d\x9e\x73\x35\x29\x0d\x7c\x85\xb9\x66\xe8\x01\x84\xbd\x07\x99\x86\x02\x88\x6d\x70\x76\x19\x35\x65\xc8\x1c\xcc\xda\x4c\xc7\xd3\x3c\x85\xd9\x05\xb1\xbe\xb6\xe8\xe7\x41\x8e\x8a\xca\xed\xf0\xd9\xa3\x2a\x7d\x29\xd0\x7c\xf4\x4d\x31\x19\xd4\xe7\x89\x68\x20\xb7\x7d\xe6\x4b\x65\x5e\x4f\x14\x88\x00\x43\x4a\xf7\xbd\xb2\xa5\x6b\x25\xeb\x94\xea\x39\xf2\x16\x95\x96\xbb\x2b\x11\x76\x1f\x08\x2b\xae\xc0\x88\x85\xf4\xa0\xeb\x6c\x95\x76\x71\x35\xa7\xf7\xcd\x72\xe7\x43\xd2\xdf\xf1\x44\xdd\x8b\xaf\xb1\xb3\x18\x00\x6e\x58\x76\xf8\xe2\xcb\x44\xaa\x58\x8f\x90\x62\x66\xac\x67\x11\x9c\x17\xf5\xde\x11\x4e\x72\xe4\x2a\x1f\xb3\x99\x44\x32\x1a\x11\x1f\xa7\x95\xff\x70\x17\xf2\xfb\x8c\xaf\x48\x2f\x55\xd7\x7a\x80\x85\x54\x28\xde\xd7\xec\x20\xac\xec\xca\x83\xf8\xd1\xeb\x13\x7b\x58\x8c\xcb\x74\x5c\x10\x5f\x2b\x2c\xa4\x1c\x3a\x9f\x49\xd3\xc6\xe9\xd7\xc6\x48\xb0\x03\xb9\x70\x7c\x90\x64\x62\xed\xad\x61\x7a\x8c\xfb\xf9\xbc\xc6\xc5\xfb\x6f\xa9\x84\x32\x5d\x65\x82\xe2\x8f\x62\x00\x53\x83\xf3\x38\xdf\x5b\x38\xfa\x9d\x19\xc2\x2a\x2a\x7e\xa1\xd6\x8a\x92\xd1\xd9\x3b\x7f\xb0\xb8\xf3\x3b\xc8\x76\x0f\x28\xae\xb1\x43\x9a\x8b\x07\xf3\xda\x58\xdd\xb1\x55\xb4\x98\xcb\x09\xc7\x5a\x55\x96\x83\x8a\x65\x01\x3e\x24\xd5\x64\x0d\x08\x42\xa7\x69\x93\x22\xcf\x3f\xfc\xb5\x70\x3f\x41\x4f\xfd\x16\x88\x60\xba\xd3\xe3\x08\xb2\xb5\xbf\x3c\xdf\x7f\x36\x3b\xf9\xaa\xf4\xb3\xbc\x42\x4c\x14\x6c\x6f\x54\x21\x43\x0f\x9f\x47\x6a\xa3\x4a\x0c\x6e\xe8\x01\x31\xfc\x4d\x4d\x97\x07\x23\xa2\x18\x6a\xe3\x62\x5e\x28\x6d\x17\xdd\xdc\x43\x5c\xcb\x00\x83\x16\x78\xab\xa5\x84\xa6\x2d\xbf\xf0\x02\xbe\xad\x6e\x11\xe2\x3c\x54\xd3\x3c\xf3\xa4\xb2\x31\xa9\x08"}, +{{0xf0,0x8e,0xe8,0xda,0xa7,0x3e,0x1f,0xeb,0x61,0xa8,0x8e,0x06,0x2d,0xfb,0x10,0x03,0xc8,0x57,0x8a,0x0d,0x53,0xbd,0x3b,0xc9,0xe5,0x89,0xef,0xb9,0x2f,0x68,0xbe,0x14,},{0x76,0x69,0x2c,0xe8,0xd1,0x16,0xec,0xcb,0x89,0x70,0x77,0xed,0xca,0xaf,0xdd,0x3e,0xb4,0x4e,0xa1,0xa4,0x86,0xb9,0x0e,0x49,0xe9,0x7f,0x96,0x69,0x01,0x01,0x55,0x02,},{0x66,0xdf,0xa4,0xc1,0x57,0x5b,0xef,0xf2,0xf5,0xa2,0x30,0xb2,0x8c,0x58,0xc3,0xee,0xa0,0x73,0x6d,0xf3,0x79,0xd7,0x55,0x59,0xbc,0x9d,0x37,0xa9,0x57,0x9d,0x12,0x1c,0x05,0xc3,0x73,0xe8,0x48,0x4c,0x97,0x47,0xef,0x44,0x77,0xe8,0x0c,0x4b,0x2c,0xb4,0xdd,0xf1,0x6a,0xe9,0xfd,0xfa,0x08,0xa0,0x75,0x47,0xd1,0x07,0xdc,0xea,0x12,0x03,},"\x64\xde\x90\x04\x4d\x0e\x76\xbc\x02\xfc\xff\xcb\x75\x26\x36\x67\xb3\xbd\x73\x3b\x40\xbf\xb2\x6c\x6c\x52\xfd\xb4\xb0\x78\x22\x78\xca\xba\xe4\x1e\x21\x29\xea\x40\x17\xe9\x4d\xe8\x60\x87\x96\x4f\x66\xd8\x62\x07\x98\x74\x67\xa1\x68\x8f\x9f\xab\x3f\xfb\x2f\x1d\x00\x63\xbf\x62\x6c\x94\x13\x67\xc1\x2e\x31\x9a\xb7\xca\x30\x20\xc9\xb3\xa7\x21\x5a\x19\x30\x3e\x2d\x0e\x89\x88\x79\x1d\xe0\xd8\xe1\x63\x2d\xaa\x38\xc7\xf3\xe7\xf6\xe4\x8c\xe1\x22\x14\x3d\x1e\x2c\xb6\x61\xba\x77\xc6\x9e\x6a\x71\x09\x11\x64\x4b\xc1\x10\xff\x58\xbb\x00\xb5\x29\x08\x20\xce\x30\x97\x0e\x7f\xde\x18\x9e\x14\x0e\x5c\x70\xc7\x83\xee\xd5\x3f\x0e\x2a\xc7\xec\xae\x4f\x27\xdb\x81\xd1\x5b\x86\x46\xfa\xa9\xc5\xa3\xae\x2b\x7f\x47\xcd\x58\x0d\x77\x07\xb0\x02\x49\x9b\x4c\xfe\xb8\xc5\x91\xaf\xdf\x1c\xc6\x2a\xf2\x59\x5c\x18\x4a\xbc\xf0\xb2\x62\x3a\x1b\xae\x60\xaf\x70\x26\xb2\x8d\x05\x40\xb4\x15\x26\xe3\x02\x0f\x81\xb8\x94\xeb\x3f\xe3\x1b\x72\xb2\x1a\x32\x60\xda\xe3\x21\x0c\x4c\xe4\xfd\x69\xe2\xe5\xea\x0c\x86\x32\xa5\x83\x26\x2a\x12\xb3\xa8\xb1\x6c\x9c\x12\x06\xad\x73\x02\x30\x37\xcf\x30\x65\x3c\xb8\x0a\xa7\xdf\x83\x14\xb0\xf5\xbc\x6e\x9d\x5f\xa0\x0b\x00\x9d\x55\x52\xd8\x3b\x79\x70\xb5\xbc\x4b\x99\x84\xf6\x9d\x1c\xca\x9c\xe4\xcb\x74\xdd\xd2\xd8\x79\xd3\x73\x12\xa0\xe1\x59\xd7\xa6\xaf\xb7\x7a\xc5\x85\xe6\xb4\x59\xc5\x51\x30\x4e\x1e\xeb\xfb\xca\xb4\x3a\x10\xb5\x05\x92\x4e\x03\xea\x33\x2f\x5d\x02\x0a\x55\xc7\xaa\x68\x3c\x54\x1d\xcf\x77\x90\xa2\x40\xaf\x07\x9b\xab\xa9\x40\x96\xb4\x60\x60\xfd\x7a\xfe\x90\x56\xca\x99\xe6\x88\xdf\x28\x0a\x9b\xe8\xc8\xc7\x3e\x6e\x6f\xb0\x52\xa3\x3e\xb3\x32\x8a\x7f\x60\x25\x42\xfe\x28\x0c\x89\x0e\x3c\xca\xf2\x2c\x7f\x34\xf8\x7b\x5e\x5b\xa7\x84\xb4\x72\xb1\xe1\xa9\x93\x47\xa9\xe0\xd2\x40\x85\x8d\x12\x77\xa5\xc6\xb3\x49\x38\x3f\xe4\xfd\x55\xcf\x92\xe6\x9f\xaa\xd3\x26\xb8\xd6\xdb\x46\x23\x30\x26\x22\x1e\xe6\xd0\xa1\xc4\x24\x65\x33\xc4\xa0\xe5\xbd\x17\x2e\xb8\x93\x6a\x9c\x0d\x30\x06\x65\x38\xe3\xeb\x4a\xd5\xcb\x98\x77\xfd\x86\x1b\x48\x2b\x30\x15\x0a\x06\x10\x41\x61\x64\x7e\x01\xd0\x04\xd9\x97\x40\x3e\xe0\x67\x26\xcb\x97\xe2\xe2\x5f\x18\xc6\x68\xee\xe4\xc5\xbf\x72\x52\x98\x03\x18\x9e\xe6\xa7\xae\xc2\x38\xd5\x90\x6e\xa5\xae\x10\x72\x2c\x9a\x61\xa7\x8a\xea\x52\xaf\x33\xea\xac\x75\x40\x6b\x1a\x60\xbe\xfb\xaa\xd4\x84\x76\xd9\xff\x88\x7f\xd2\x83\xeb\x16\x55\xbc\xc0\x7c\xf7\x53\x33\x14\x36\xdb\x5b\x3b\x13\x03\x2f\xf9\xc3\xd6\x96\x38\x0e\x9f\x5a\xbf\x50\xd3\x55\x6f\xda\x0d\xf0\xb5\x38\x97\xa7\x37\xac\x7a\x3b\x87\xc2\xa8\x32\xb0\xc7\x27\x3e\xa9\xfc\x54\xa7\x67\xf1\xa8\x12\xbf\x01\x64\xbf\x75\x21\x63\x0b\x81\xb9\xdd\x93\x0d\x92\xee\x2c\xa2\x8e\x32\x03\xb7\x7b\xc0\x82\xce\xb3\x7d\x55\xed\xbc\xb7\x1d\xf0\xb7\x92\x36\x78\x9a\x25\xd4\x18\xcb\xb9\x55\x44\xe2\xce\xf3\x3b\xbd\xeb\x27\xa3\xf7\x90\x9c\x1f\x49\x8f\x47\x13\x5a\xe9\x03\x3a\xdf\x25\x0a\xd4\xf6\x57\x53\x61\xe4\xcf\xcc\x9b\xcf\x4b\x90\xc3\xad\x47\xa3\x44\x22\x97\xa2\x23\xcc\xa8\x43\xd7\x20\x5e\xd0\x8a\x9b\x87\x16\x0a\x6d\x01\xb4\x6a\x7d\x1c\x84\x4e\x8d\x1f\x18\xf6\x18\x68\x2b\xfb\x22\x95\x5f\x39\x5b\x2a\x57\x90\xa5\x1a\x69\x64\x99\xd9\xe7\x1a\x50\x1f\x3f\xa5\x46\xde\x9b\x10\xae\x47\xbc\xee\x42\xba\x7f\x86\x9f\xb9\xce\x4e\xd7\xc6\x45\x33\x26\xc0\x34\xcf\x05\xd9\xf1\xe3\xc2\x00\x70\x1b\xa7\x52\xda\xbb\xd8\x68\x52\x1c\x3d\x8f\x80\x67\x2d\x42\xf6\xcf\x45\x64\xf0\x8c\xd7\xb3\x90\xe6\xd4\x9d\xd9\x00\x90\xaf\xdb\x84\x48\x6f\xfc\xaa\x4e\x84\xd8\x86\x82\x74\x4d\xc0\xa8\x78\xfa\xa7\xcd\x44\x0a\x8b\x27\x67\x10\x90\x20\x81\xf4\xdc\x84\x17\x46\x19\xa6\x6e\xa3\xa3\x71\xf9\x55\x05\x40\x0d\x99\xfa\x99\x90\x17\x71\x0c\x8e\x27\x14\xbe\x60\x94\x9d\x46\x13\x10\xf7\xd4\x3a\x0d\xc1\x23\x51\x6d\x77\xd3\x62\x21\x3f\x9f\x75\xa5\xa1\xc3\x93\xaf\xfc\x49\xea\x15\x1d\x46\xa8\x1f\xfa\xd2\x39\xf2\x8c\x07\xf6\x5f\x59\xea\x07\x7d\x9a\x4d\x9c\x75\x2d\xe4\x9b\x9e\xf3\x6b\xe6\x0d\x11\x2d\x79\x5f\x58\x8b\x00\xef\x6e\x77\x30\xde\xa6\x5e\x10\x16\xda\x0d\xd4\x62\x37\x0e\x0b\xa5\xc6\x60\x00\x1e\x45\x7c\x08\xb4\x36\xda\x29\x03\xb6\x29\x06\x93\x20\x84\x72\x8c\x81\x67\x1c\xbf\xb0\x79\xbb\x29"}, +{{0x27,0x2d,0x64,0xde,0x50,0xb1,0x31,0x2b,0xee,0x23,0xd7,0xf4,0xce,0xa5,0x08,0xa8,0xfc,0xcf,0x3e,0x9b,0x32,0x4e,0x97,0xb1,0xc8,0xe7,0x25,0x02,0xf6,0x1f,0xbf,0x45,},{0x33,0x49,0x8c,0x3b,0x71,0x2a,0xb9,0xc0,0x1e,0xc7,0x6b,0x2e,0xfe,0x2b,0x83,0xad,0xd1,0xe1,0xf2,0xb5,0xeb,0x78,0xf2,0x16,0x92,0x32,0x34,0x51,0x82,0x0c,0xbe,0x10,},{0x33,0x81,0x4c,0x6e,0xf3,0x75,0xab,0x96,0x37,0x69,0xb2,0xde,0x4a,0x25,0xe7,0x02,0x0f,0xcd,0x97,0xf7,0x8f,0x8f,0xc9,0x34,0x55,0xc4,0xb1,0xc2,0xbd,0x45,0xd4,0xb0,0x1e,0x19,0x29,0x00,0xe3,0x12,0x22,0x65,0xfc,0x55,0x2c,0xd5,0xc5,0xf0,0x0e,0x93,0x1e,0x3a,0x18,0x3c,0xca,0x5b,0xa0,0x80,0x2d,0xaf,0xde,0xbb,0x79,0xeb,0xeb,0x03,},"\xd6\x26\x0d\x7e\xec\x5d\x43\x62\x08\xe7\xe7\x37\x65\x5e\x09\x71\x81\x42\x70\x19\x44\x05\xe3\x6e\x39\xf8\xf1\x7b\x64\x9f\xbc\x16\xc0\xf3\xd7\xf2\xbe\xf5\xeb\xc0\x2b\xb1\xc4\xdf\x48\xe8\x47\x0a\x3e\xae\x8a\x3c\xca\xf6\x40\xab\xcc\x09\x4a\xa9\x11\x50\xff\x1a\x8c\xf1\x16\x96\x93\xeb\xf5\xac\x00\x34\xb9\xb9\x19\xec\xf1\x7d\xb7\x91\xdf\xe5\xfe\xdc\x90\x91\x8b\x23\xe5\x4e\x90\x04\xa1\xae\x77\x1c\x21\x3e\xd7\xed\x73\x34\x43\x4e\x5b\xc0\x2c\x0d\xda\x2b\xd1\xa8\x76\xfb\x82\x4a\x19\x7b\xc9\x96\x13\xb1\x40\x9e\x70\x52\x31\x0b\x08\x20\xda\x71\x44\x69\x29\xae\x7c\xfd\x3a\xfb\xa0\x42\xde\x54\x57\x8a\x5b\xfd\x94\xc1\x54\x43\x91\xa3\xd9\xac\xbd\x56\x63\xef\x65\xc6\x92\x0d\x78\x51\x6d\xec\x1c\xd5\x5f\x6e\xb7\x29\x0b\xa0\xaa\xf9\xa1\x71\x65\x82\x00\xb2\x4a\x47\xa0\x71\xb9\x6f\xea\x03\xc6\xca\x7e\xd0\xd6\xfe\x67\x5d\xd6\x37\x61\x83\x3d\x75\xbc\x5e\x58\xa9\x58\x58\x2d\xb0\x2a\x60\xc6\xce\x0a\x63\xf4\x2b\xa8\x37\xae\x77\xc1\x7a\x32\x70\x5f\xd9\xca\xfa\x58\x7b\x55\x5d\xd4\x61\x98\x51\x07\x97\x94\xe2\x4e\xb4\x46\x08\x83\x5a\x6f\x48\x24\x92\x0d\x57\x7a\x27\x03\x96\xc9\x57\x3b\xc7\xd8\x2f\xe2\xaa\x04\x65\x95\x66\x13\xa2\xc5\x08\xcf\x24\x32\x33\x7a\x36\x5e\x6c\x98\x4c\xba\x91\x7f\x0c\xf8\x42\xaf\x12\x2d\xc8\x9d\xea\x95\x8d\x41\x8c\xae\x44\xa6\xe4\xed\x26\x3a\x41\x5f\xf9\x94\xa5\xff\xb2\xff\x13\x91\x3d\xf2\x14\xbb\xfe\x90\xa3\x4b\x24\x7e\x71\xab\x73\xf7\xff\x00\x4c\x23\xac\xfd\x90\xc7\x67\x61\x1a\xa5\x58\x14\xc6\x69\x64\x16\x8e\x56\x8b\xa7\x5b\xf3\x49\x03\x59\x7c\xdc\xac\x78\xc2\x4b\xb9\xf1\x4f\x5c\x86\xa5\x1f\x36\x4f\x9a\xb4\x1e\x46\x4a\xee\x64\xfa\x50\xa1\xc1\x59\xcb\xd8\x50\x83\x2c\x50\x4a\xb4\x2a\x58\x4a\x96\xd5\xae\xe0\x82\xd8\x2c\x1e\xdd\xa1\x93\x38\x16\x0b\x8d\xcf\xa3\x41\x9b\x3a\xf6\x4d\x9c\xfb\x10\x4f\x98\xf9\xd3\x5e\x53\x94\xe2\x32\x28\xe2\x75\xc8\x7d\xb5\x0c\xa8\x67\x54\x0b\x88\x0c\x7a\xf2\x9f\xbf\x53\x42\x94\x58\x1c\x22\x24\x0b\xcd\x4d\x7d\x2c\x20\xff\xc3\x67\x33\xad\xa2\x76\x53\xd3\xae\x1a\x8c\x22\x03\xea\xc6\x26\xe2\xe9\xbb\x4b\x52\xce\x52\x3e\x5a\xdb\x3b\x2c\x10\xdc\xf7\x8c\x2a\x1e\x62\x6a\x16\xeb\xfa\x1b\xdb\x8c\x16\x14\x93\xa5\xaa\xa2\xd8\x4b\xfa\xa0\xf2\x02\x7f\xfe\x4e\x9e\xae\xb3\x32\xeb\xda\x7c\xbb\xb6\x77\x76\x9d\x78\x51\x7a\xdf\x72\xf8\x23\xa7\xf8\x44\x16\x5a\x07\x98\x78\xd2\x58\xfd\x95\x22\x5c\x21\x17\x78\x37\xe6\x9c\x19\x68\x5a\x05\x1c\xa9\x2b\x12\x0b\x7d\x86\xd7\x85\x95\x47\x1f\xfc\x42\xa5\xe6\xe6\x43\x1b\xe7\xb6\x4f\x80\x76\x45\x8b\xac\xd6\xc7\x29\x03\xcc\x34\xfc\x63\xa4\x0c\xf3\xdf\x00\xef\xf9\xd6\xee\x9a\x8f\x39\xd2\x5e\xad\x81\xa8\x12\x88\x88\xb0\xa1\xac\x0e\x5e\x3a\xd9\x27\x71\x2c\x14\x14\x6a\xdf\x82\x87\x70\xff\x95\x87\x09\xeb\x19\x28\x8e\x77\xbb\x70\x73\x48\x81\xe9\xe0\x16\xcd\x29\xe7\xd0\x89\x93\x41\xff\x6b\x29\x7a\xc7\x96\xbb\xde\x48\x6e\xc3\x59\x49\xf6\xa3\x2b\x2c\xa6\x47\x38\x59\x15\xec\xba\x3b\x9f\x02\x25\x08\x71\x45\xc1\x8d\x65\x59\xd3\xa3\x1d\x6f\x22\xfc\x49\xf8\xa6\x31\x5f\x1d\x32\xab\xee\xb7\xcf\x2c\x2c\x77\x6e\xa7\x35\x0f\xd5\xeb\xc0\xe0\xf2\x65\xba\xcc\xc2\x69\x7a\x7c\x8c\xa4\x0c\x13\x5f\x6c\xfc\xb0\xb5\x8a\x61\x43\x19\x60\xff\xa9\x06\x57\x09\xa9\x61\xa6\x33\xd5\x70\xb7\x3f\xb4\x49\x1d\xe5\x2a\xd0\xd7\xb2\x04\xb6\xe9\x97\xb0\x37\xed\xe3\xf7\xec\xa8\x20\xa7\xcd\xb2\xc6\x9a\xc2\x91\x48\xbe\x35\x23\x50\x8a\xe7\xe4\xc3\xd1\xa7\x17\xf5\x5a\x82\x1d\x14\xc3\xb6\x4f\x08\xca\x9a\xe4\x96\x13\xb1\x15\x77\x3e\xf6\x18\xd3\x21\xc9\x08\xbd\x21\x56\x71\x7a\x43\x4e\x50\x89\xa5\x94\x8c\x04\x5c\x8d\xa8\xa4\xbd\x86\xed\x5f\xab\xc6\xb1\x34\x66\xe6\xde\xda\x58\x32\x07\xd2\xad\xa2\xb2\xab\x9c\xb1\x54\x3d\xf7\xa3\x73\x4d\xfb\xc6\xfc\x42\x81\x06\xd4\x84\x47\x24\xa1\x3d\xf4\x2f\xaa\xb1\x8c\xa8\x9d\xb2\x0a\xc9\xbc\x27\xb8\x53\x94\x66\x7c\x5a\x27\x79\xca\x63\xed\x7a\xc2\xb7\xc0\xd4\x12\x23\x91\xee\x46\x02\xd6\x1e\xa0\x38\x17\x64\xfb\x72\xdc\xc2\x24\xe6\x5e\xae\x2b\xc4\x50\x6b\x0f\x09\xe2\x32\x05\xd0\xbb\x21\xc7\x7d\x82\x87\xc1\x65\xe0\xb4\x2c\x55\x15\x79\x77\x8a\xcb\x72\x58\xa2\x47\x9d\x7c\xf2\x5b\x90\x2e\x8d\x0d\xa4\x29\xbd\xe3\x6b\x45\x90\xda\xe9\x6f\x52\x54\x81\xac\x83\x78"}, +{{0x0c,0x9f,0xe5,0x59,0xad,0x1e,0xd3,0xba,0x16,0x4d,0xac,0xea,0xcb,0x02,0x35,0x67,0xb2,0x43,0x03,0x20,0xb6,0x71,0x5d,0xe7,0x32,0xa0,0x3c,0x59,0xc7,0x30,0x31,0x30,},{0xe7,0x0f,0xc4,0x66,0xfb,0x2a,0xcd,0x74,0xe0,0x99,0xc3,0x6e,0x2c,0x22,0xfa,0x51,0x29,0x0b,0xdd,0xe9,0x6d,0xf9,0xc3,0x1b,0x6d,0xfb,0xfd,0xc2,0xe2,0xc1,0x4a,0x40,},{0x6c,0xd8,0xae,0xd9,0x7d,0x9c,0x62,0xd5,0xfd,0xae,0x59,0x7d,0x06,0x1c,0x0c,0x2b,0xc3,0x7e,0x42,0xdf,0x06,0xb8,0x32,0x7a,0x46,0x8f,0x92,0xb3,0xf4,0x38,0xa1,0xe6,0xb6,0xb1,0xef,0x2b,0xe7,0x85,0x49,0xa2,0x89,0xfd,0x3f,0xc1,0xa6,0x29,0x9e,0x5a,0x33,0xd5,0x39,0x6c,0xb4,0xfa,0xc1,0xe8,0xe9,0x98,0x2f,0x0c,0xb3,0xd2,0x0d,0x07,},"\x26\xeb\xc6\x48\xcf\x8c\x79\x65\xec\x6e\xbe\x96\x5d\x9c\x79\x2b\xed\x90\x65\x5a\xd4\x40\x18\x3c\x6d\x70\xea\x64\x67\xbb\x8e\x6f\x04\xec\x84\x3f\x33\x31\x56\x91\x7b\xf4\xc5\x1d\x0e\xd0\xf2\x8b\x7c\xd3\x1b\xc1\x2c\xf8\x40\x68\x6b\x82\xb0\xc2\xc3\x50\xbb\xda\xc8\x05\x33\x37\x25\xd6\xb6\x9c\x2a\xb7\xf3\x4e\xe5\x93\xfa\x1c\xcc\xed\xf3\xf0\x64\x2a\x68\x8f\xcc\x1c\xd9\x8b\x09\x87\xd0\x1f\x71\x3a\x2f\xa6\x41\x6c\x96\x19\x21\xde\x0c\xc2\xc9\xec\x7a\x55\x58\x55\xe7\xfc\xd4\xc7\xdd\xaa\x14\xfd\x91\xec\xb0\x42\x24\xe1\x76\x1b\x7d\x6b\x35\xf4\xaa\x56\x18\xa5\x00\xca\x00\xd1\xca\x24\x51\xb5\xd3\x68\xaf\xde\x3a\x40\x7e\x78\x31\x35\xf3\x90\x19\xa5\xb9\x84\xe8\x2a\xc2\x79\xc0\x5e\x48\xc2\x95\xeb\xd1\x56\x38\x21\xa0\x74\x3c\x52\x24\x6b\x5d\x2b\x20\x34\xe3\xae\xb6\xce\x7c\x5c\xf9\x19\xe7\x4a\x9c\x7b\xbc\x9e\x25\xda\x30\x43\x0e\xb1\x6e\xcf\x38\x37\xeb\x38\xa0\xf5\x59\x79\x2a\x72\x98\x90\xba\x83\x10\x26\x0f\x8a\xeb\x9b\x5a\xf0\x0e\xb6\x33\xc1\x2d\xee\x02\x26\x28\xba\x41\x8d\x75\xcf\x18\xde\x2f\x2e\x65\xe4\x9b\x1a\x69\x68\x4d\x61\x27\xef\x48\x1c\xa8\x61\xec\xbc\xe3\xbe\x86\x49\x7e\x65\xdf\x4c\x5f\xcd\x08\x17\xc9\x71\x6b\x59\xf2\xa2\x63\xd5\xe9\xeb\x60\x68\x39\xf8\x5c\x5a\x36\x58\x37\xb0\xfb\xe2\xc4\x27\x4d\x66\xcb\x2c\x65\xed\x36\x5f\xab\xf5\x8f\x15\xbe\x52\xb5\x1c\xb6\x01\x18\xca\x4f\x73\x0d\x44\x73\x59\xf7\xef\x34\x6b\x75\x02\x17\xd4\x7b\x2e\x79\xc8\x6c\x0c\x62\x81\x6a\x0c\x7c\x18\xa2\xce\x2b\x68\x8e\x0c\xce\x0d\x75\x23\x21\xe7\x9b\x42\x38\x57\xda\xc5\x9f\x8f\xbe\xb0\x94\x11\xe7\x16\x69\xef\x9a\x26\x43\xf2\xe9\x9f\x38\x7a\xc1\x83\xe0\xb0\xac\x72\xc5\x9a\x0c\x3c\x18\xc0\xde\x8b\x01\x08\x78\x07\x4a\xcc\x1a\x2b\x39\xf9\xdf\x99\xd9\xf8\xf8\xb5\x2f\xef\xe4\x94\x3c\x52\x5f\xd4\xd0\x6a\xd8\x78\xe4\x66\x08\xab\xf2\x7a\x54\xbc\x50\x06\xf6\x47\xdb\x72\x48\x51\xdb\x7c\x45\x78\xae\x66\x58\x3d\xc4\xbb\x51\x8e\xf0\x28\x89\x03\x47\xe8\xfc\xe0\x92\x7d\x7d\x9a\xf3\xab\x5d\x0d\x2d\x20\x2a\x40\x26\xaa\x2e\xa7\x48\x79\x62\x67\x6a\x60\x32\x98\xe7\xd2\xe7\xb9\x09\x21\xee\x1b\x52\x80\x6d\x71\xa7\x64\xe0\x3e\x25\xdd\xd6\x84\x8f\x61\xd4\x6f\xad\x3d\x00\x8e\x10\xee\x5c\xd5\xa3\x39\x0f\x9d\x15\x8a\x44\x37\xef\x61\x5f\xc9\x0a\xc5\xbf\x3a\x9d\x68\x2e\x12\xc3\x39\x8a\xc7\x76\x80\xd2\x2c\xd1\xa6\xa5\x6e\xc3\xb2\x5c\xed\xe8\x67\xed\xd3\x83\x15\x9c\x61\x64\xd6\x3e\x9c\xd1\xc9\x56\xac\x72\x35\xff\xfa\xe9\x36\x16\x6c\xcd\x35\x89\x8e\x29\xc9\xb4\xca\x4e\x29\x25\xda\x32\x3b\x6f\xbf\x67\xcf\xd5\x96\xc8\x8a\x1a\x35\xa8\x35\x98\x51\xdd\xcb\xa8\xf6\x13\x4a\x9f\xaa\x24\x4d\xcb\x47\xe6\x91\x27\x6e\xe6\x25\xcc\x20\xad\xce\xc2\x1c\xbe\x77\xa3\xac\xb9\xba\x72\xf0\xc9\xd3\xda\x7e\x9c\xd5\xbe\x3b\x95\x99\x0b\xa5\x4a\x9f\x31\xaf\x17\x1f\x95\xae\xea\xd3\x33\x1c\xb1\x88\xa5\xb2\xc6\xf5\x39\xac\xb4\x8b\x98\xb3\xf7\x34\x1f\x60\x25\x1c\xb6\x04\x29\xcc\xd9\xcf\x32\xf0\x09\x20\x5f\x27\x53\xfb\xbb\x26\xaa\x53\x17\x43\x42\xad\x18\x4d\xab\x68\x70\xc0\xfb\x52\x93\x01\x19\xd9\xf9\x7d\x84\x89\xa6\x00\x76\xaa\xdb\x2e\x96\x05\x4a\xc7\xcb\x7f\x84\xe1\x3c\x75\xbb\xf9\xe4\xd9\x24\xd2\x27\x2a\xfe\xf0\x87\x19\x15\xe2\x43\xce\x66\xfc\x2a\x88\x88\x51\x35\x35\xb1\x0b\xb4\x07\x9c\x80\x6b\xd9\x49\x28\x1e\x28\x28\x35\x23\xd0\xd2\x10\xb3\x1e\xf6\x2a\x95\xdc\xae\x0c\xd2\x52\x90\xc7\xed\xf2\xc2\x4b\x43\x28\x22\xde\xbe\x34\x7f\x1c\xae\x94\x5f\x57\x28\xc7\x1b\x54\x03\xef\x14\xe7\x2c\x3d\x83\x42\xe1\x98\xb3\x62\xee\x20\xf8\x09\xe4\x6a\xca\x01\x5f\x35\x47\x7f\xf8\x9a\xc4\xb3\x7e\x66\x15\x85\x6f\x7e\xa2\x51\xfb\xfe\x13\xf9\x06\x52\x59\xb0\x94\x6a\xae\xf2\x49\x43\x27\x0a\x85\x4d\xe8\x89\x78\x00\x33\xd6\x3d\xda\x54\x47\x99\x8a\x3e\xd7\xe5\x06\xae\xb5\x1e\xa3\x7b\x68\x1a\xc3\x07\x67\x97\xac\xdb\xfc\xc2\x78\x83\x63\x0a\xdb\x72\x26\x0a\x46\xaf\x0a\x60\xd5\x3f\x66\x54\x56\x6e\x20\xd6\x08\x8c\xd4\x8e\x23\xb2\x8d\x81\xf0\xee\xd2\x05\xb9\x2a\xaf\xd9\x61\x64\xd6\xd3\xca\x3f\xc8\xb1\x71\x80\x4e\xe9\xfc\xe7\xab\xae\xd2\xea\x4d\xdf\x9c\xb2\xb3\xae\x73\xa7\x0e\xd6\x3d\xe4\x5e\x14\x10\x14\x28\xd0\xa7\xa2\x26\xdb\x39\xab\x6c\xd0\x43\x74\x08\x0e\x69\x83\xf0\x18\xce\x93\xda\x4c\x89\xac"}, +{{0x15,0xd7,0x5a,0xd8,0xe4,0xaf,0xb1,0x26,0x34,0xcc,0x8e,0x60,0x0f,0x1a,0x42,0x67,0xef,0x95,0x84,0xf4,0xc4,0xac,0x44,0xff,0xfe,0x4b,0x9f,0xcb,0x88,0x5c,0x9d,0x2a,},{0x09,0xd1,0x26,0xf0,0x17,0xe0,0x16,0x97,0x74,0xe8,0xc3,0x7a,0xb3,0x79,0x26,0x3a,0x80,0x75,0x74,0x61,0x27,0xc2,0xd1,0x1e,0xcb,0x0e,0x4c,0xb4,0x54,0x70,0x9f,0xf1,},{0xa8,0xf2,0xf4,0xb9,0xe2,0x07,0x2c,0xa9,0xfa,0xde,0x37,0xfd,0xd6,0x2d,0x8d,0x02,0x42,0xfd,0x4d,0xaa,0x09,0xfd,0x85,0x6e,0x75,0xf4,0xe3,0x43,0xc7,0x26,0x0e,0xa6,0x77,0xf7,0x53,0xa6,0x27,0xae,0xd0,0x8c,0xb9,0x6c,0x44,0x4e,0x29,0xbd,0xb5,0xb5,0x38,0x5d,0x43,0x84,0x3b,0xbe,0x79,0xa3,0xdd,0xa3,0x6e,0x1e,0x11,0x01,0xc5,0x0f,},"\xd1\xce\xa2\xb7\xe9\xaf\xc1\xf0\xfa\xb8\x90\xd2\x70\x0a\x5a\xe4\x1e\x15\xe7\xd3\x4d\x3b\xf1\x9d\x0f\x34\xd9\xf9\xf0\xab\x98\x12\xdc\x7c\x2a\x8d\xc4\x4c\x8e\xe7\xf3\x78\x87\x61\xec\xd9\x88\xee\x72\xc7\x36\xb6\x2a\x7c\xac\x3c\xc9\xb7\x38\xe9\x38\xdf\x77\x87\x37\x7e\xb9\xff\xd1\x20\xd4\xff\x58\xcf\x1c\x06\x75\x63\x3f\x7e\x83\xc4\xb1\x15\x54\x8f\x14\xd2\xf7\x0c\x6d\x48\x22\x11\x44\x3a\x84\x99\x59\x95\x58\xc1\x42\x77\x98\x0f\xa4\x2a\x78\x42\x79\x07\xf7\x3a\x41\xf5\xf6\x69\x3b\x2f\x75\xfe\x5e\x7a\x6f\xf0\xa6\xc3\xa4\xe2\xed\x1d\x0d\x96\x8d\x5c\xc9\xd6\xf1\x3d\x41\xc3\xd2\x91\x39\x6a\xe7\xe4\x34\xe6\x64\xb2\xff\x24\x3e\x7f\x6d\x88\x01\x02\x10\x07\x8c\x39\xb5\xa5\x76\xca\xf4\x09\xbb\x47\x11\xb3\xee\xfc\x48\x6b\x67\xb7\xff\xea\xe0\xcb\xac\x6a\x0f\xbd\xf5\x34\x3f\xb2\xae\x4e\x05\x7e\xdc\x8c\x9d\x2e\xd3\x1e\xae\x9e\xc8\x3d\x2b\xed\xd2\x19\xeb\x98\x9b\x2d\x44\x19\x61\x8c\x2d\x3c\xe4\x49\x0e\x35\xfb\xca\xd4\x32\xb0\x12\x47\x95\xf9\xc5\xcb\xdc\x1e\xb0\xc3\x07\x2b\x4a\xa8\x01\xd2\x6f\xbc\xc7\xb0\x7b\x82\x57\xf5\xfe\x47\xac\xd9\xbc\x58\x7b\x56\x57\xcf\x07\xca\x54\x5b\xb5\x68\xc9\xe4\xe7\x3c\xdd\xf6\x25\x4e\x22\xf7\x8a\xb2\xf8\x06\x45\x19\xf8\xab\xfd\x16\xfc\xfa\x90\xf8\x76\x87\xdb\x0c\x42\x09\xbe\x2c\x6c\x79\xa5\x52\x1f\x44\x18\x96\x78\xd9\x32\xc5\x45\x85\x70\x0a\x24\x37\x70\x2e\x56\xaa\xb5\x88\xa1\x7c\xb2\xcc\x94\xc0\x0e\x87\x57\x0e\xf3\xac\x51\x33\xd7\x53\x03\x8a\xa4\x65\x10\xa2\x60\xc1\xfe\x80\x47\x9b\xc0\x2e\xed\x9a\x8d\x1d\xe9\x93\x54\xac\x26\x48\xb4\x8b\x96\xab\x1b\x80\xcc\xa6\xca\xe1\x87\x7f\x37\xd7\x04\x28\xbb\x50\x85\x0e\x03\x08\xdb\x0b\x42\x30\x87\xbf\x7d\xde\x27\x9e\x09\x67\x66\xf2\xab\x3a\xb2\x38\x5b\x04\x64\xa5\xbe\xd7\xbb\xd8\xd4\x57\xe9\x35\xe2\x00\xaa\xaa\x8d\x95\x15\x70\xe0\x53\x07\x6d\xb1\x8a\x6a\x62\xf7\x2b\x31\x95\x79\x88\x4a\x08\x26\xba\x2b\x43\x63\x71\xdd\x21\x8b\x01\xa0\xc5\xe5\x8d\x0c\xd5\xff\x98\x25\xe4\x46\x6f\xe9\x66\xdf\x05\xcc\x31\xc8\x03\xe5\x21\x21\x83\xdd\xf2\x9c\xef\x7f\xb9\x16\x48\xa4\xf8\xee\x19\xfd\x5f\x8d\xbd\x8a\x56\xbe\x7a\xbf\x33\x65\x9a\x92\x24\xa1\xe2\x7a\x10\x24\xef\xfd\xfb\x88\xe8\x80\x61\x48\xd0\xd1\x78\x09\x06\xaf\x1e\xbe\x3e\x5f\x14\x36\x31\x90\xd8\x8c\xc6\xe5\x08\x94\x44\xf1\x25\xd0\x63\x15\x5d\xcf\x86\xca\x92\x63\xf2\xf5\xf1\x83\xc2\x69\x74\xfe\x00\x0b\x93\x42\xd2\x4c\x78\x1e\x20\x58\x28\x7c\xb6\xf3\xf1\xe3\x27\x0c\x22\xb7\x70\x7b\x83\x23\xa5\xcc\x8d\xb8\x1a\xa9\x06\xbb\x59\xd6\x96\xcb\x97\xcc\x74\xe3\x59\x59\x5f\xfb\x83\x73\xca\xd3\x71\x0e\xa0\x9e\xa9\x74\x4c\x20\xe9\xa1\x2e\x05\xbe\x5a\x95\xf0\x85\xac\x56\x16\x78\xd7\xda\x43\x2e\x4c\x7c\xb5\x3e\x12\x71\xdf\x5c\xd5\xa3\x39\xd2\xd7\x52\x0f\x1c\x18\x48\xd1\x50\x71\xd8\xc6\x98\x46\xb2\x3c\x5d\x24\x32\xc7\x38\x90\xf2\xed\xed\x37\xc3\xd2\x96\x4a\x4b\x5b\x55\x22\x58\x88\xe8\x92\xf5\x26\xd1\xca\xc3\x1e\xac\x35\x6f\x36\x1c\x2b\xf3\x36\xc4\x62\xd6\x0c\x82\xe8\x2b\x61\x6f\x2a\x51\x9c\x2f\x67\xbf\x01\x29\x03\x69\xbe\x9b\x55\xe9\xf5\xc8\xce\xc4\xf2\xe1\xb2\xab\x30\x25\x06\xc9\x03\xdc\x3e\x7b\x9c\x97\x81\x41\xdc\x90\x4b\x01\xb1\xc2\x3d\x25\x00\x43\x99\xbf\x8b\x73\xd6\x9c\xd5\x39\xc7\x9a\xf5\xe9\xa0\xa5\x11\xec\xa2\x21\x07\x8a\x1f\xf7\xb0\xf6\x04\xae\xa8\x42\x46\xc3\xcb\x32\xdb\x93\x81\xbe\x12\x17\x67\xe0\x97\xbe\xa5\x17\xbf\xcd\x82\xdf\xe9\x21\x37\x98\x40\xef\xb4\xb6\xf0\x2a\x48\xec\xda\xf1\x2d\x2c\xd3\x89\x30\xd4\x47\x3a\xdf\x97\xcd\x71\xdc\x4e\xa1\x03\x82\xf4\xf5\xd1\xdd\x75\x62\xcd\x4b\xf5\x11\x59\x32\xf6\xc4\x70\x0a\xa8\xfe\x8d\xec\xa9\xd5\xe7\x27\x79\x02\xb8\xf8\x86\x52\x97\x65\xdb\x24\x86\x07\x4b\x23\xa1\x9f\xd4\xb0\x43\x56\xbf\xa6\x22\x6c\x82\xba\xf6\x9a\x08\x7d\x9c\xa1\x88\x23\xf8\xe3\xe6\x83\x08\xe1\x6b\x80\x4c\x36\x3d\xf5\xb6\x30\x7e\x76\x24\x0d\xb1\xed\x84\x1b\x61\x2d\x65\x54\x8d\xdf\xbe\x83\x67\xda\x60\x77\x2c\x6a\xff\x55\x4d\xc8\x5d\x04\x19\x48\x34\x5e\x56\x7d\xa9\x33\x31\x51\x85\x8f\xdf\x69\x93\x27\x39\x25\xbf\xdc\x71\x81\xb5\xf6\x46\xd0\x63\xa8\xc8\xf3\x10\x56\x9b\x0e\xd0\x93\xbd\x9d\xff\x04\xfe\xbf\x0b\x41\xc6\xdc\x55\x16\x9a\x14\xa3\xc8\x62\xe5\x41\x6f\x1e\x58\x2f\xde\xe8\xfe\x87\xdc"}, +{{0xbf,0x3c,0x0c,0xbb,0xbe,0x20,0xbe,0x2a,0xcf,0xaf,0xb2,0x7a,0x36,0x11,0xb4,0x89,0x21,0xa7,0x28,0xab,0x17,0x33,0x4b,0x8a,0xfd,0xee,0x83,0x05,0x17,0x8f,0x61,0x3b,},{0x45,0x00,0xa0,0x3c,0x3a,0x3f,0xc7,0x8a,0xc7,0x9d,0x0c,0x6e,0x03,0xdf,0xc2,0x7c,0xfc,0x36,0x16,0xa4,0x2e,0xd2,0xc8,0xc1,0x87,0x88,0x6d,0x4e,0x6e,0x0c,0x27,0xfd,},{0x8f,0x87,0x03,0xbc,0xf4,0xc0,0x32,0x94,0x17,0x33,0x9e,0xb0,0x26,0xf2,0xb7,0x2d,0x31,0x4d,0x92,0x2e,0x9a,0xcc,0xb5,0xd8,0xbb,0x7e,0xec,0x87,0xe0,0x7e,0x61,0x38,0x55,0x16,0x72,0xa6,0x13,0x2c,0xb4,0xf8,0x75,0x50,0x8e,0xd3,0x29,0x95,0x67,0xb4,0xa7,0x41,0x34,0xd2,0xbd,0xf0,0xd8,0x57,0xf9,0x80,0x86,0x1d,0x18,0xbe,0x7e,0x01,},"\x8f\x30\xba\x2f\x79\x2e\x9a\x97\xf6\xea\xfe\x29\xf9\x76\xa4\x80\x28\xcb\x88\x57\xb5\xc7\x98\xbc\x2b\x61\x68\xc4\x64\x44\xc0\xce\x69\x60\x70\x37\x4c\x5e\x6a\x40\xc3\xd1\x8a\x5d\xc7\x66\x9f\xc4\x1d\xb9\xa8\x1c\xff\x75\x9b\x8c\xa0\x15\x98\x71\xc3\x44\x2e\x8c\x75\x12\x69\x8f\xa4\x47\xb5\x78\x3e\xe0\x1d\x1b\x61\x14\x49\xab\xad\x23\x71\x62\x92\x2b\x02\xd1\xae\xc5\xde\x1d\x66\x6f\x17\xda\x16\x13\x10\x63\x01\xd3\x05\x86\xd1\x16\xe2\xac\x09\x00\x7d\xd7\x1e\x81\x23\xed\xe4\xc5\xa6\xa9\xac\x07\x7f\xe3\xd9\x39\x09\xda\x62\x8e\x86\x58\x70\xa4\xe2\x5c\xb3\x55\x91\x67\x5a\x06\x90\xbe\xc4\xaf\x02\x81\x71\x4f\xe6\x66\x1b\xd5\xc0\x0a\x27\xd7\x9f\x95\x9f\xb4\xd4\xfb\x16\x36\xa6\xa3\x57\x5f\x4f\x01\x47\x06\x63\x89\x9d\x73\x74\x72\xb0\x96\xbe\x4d\xb7\x23\x71\x53\x67\xa4\x1a\x3a\x4c\x13\xf7\x42\xd9\x08\xf4\xd9\x21\xcf\xdd\x15\x6e\x75\x86\x82\x61\xba\x9c\x10\xd8\x58\x74\xca\x2d\x6c\x0c\x9e\x72\x95\xe5\x66\x2b\xd9\x16\xa3\x63\xc7\xa7\x96\xea\xd6\x17\xc4\x25\x1e\x67\x94\xda\x06\xc3\xd0\x8f\x2f\xdc\x38\x86\x94\x4a\x75\x09\xe6\x40\x9c\x90\x6b\x59\x31\x13\xb4\xb1\xf9\x85\x01\x32\x96\x0d\x9f\x3a\x4e\xeb\x73\x86\xfa\x59\x2f\x61\x93\xbe\xab\x8e\x0f\xf0\xf2\x89\x08\xa0\xd5\x48\xdb\x87\xba\xe9\x78\xb0\x5a\xbb\xca\x9b\x3e\x96\xd8\x79\x5b\x88\x07\x7f\x62\x0f\x21\x24\xe3\x15\x90\xeb\x09\x9e\x94\xe0\xe6\xe3\xcd\x62\x0a\xe6\x29\x0f\x3e\x2d\x01\x46\x7e\x5b\xef\x4f\xab\xde\xf7\x9d\x9a\xb9\x23\x9e\x75\x3e\xc4\xfa\x0b\xb1\x10\xff\x1d\x39\x3f\xca\x02\x24\x35\x02\xd7\xe9\x87\x99\x1e\xb7\x6d\x08\xf8\xbe\x7e\xb2\xb1\xee\x00\xc3\xb6\x8b\xbf\x72\xa6\x23\xba\xa1\x5b\xe8\x96\xb3\x21\x5e\xbe\x8a\x82\x31\x31\x09\xfc\x62\x9b\x0c\xce\x64\x91\xf8\x13\xc2\x49\x70\xe4\xff\xe6\x86\x9e\x40\xb4\x6b\x4e\xd2\x29\x86\xd0\x04\x21\x55\x27\x6c\x23\x0d\xe4\xc0\x5d\x67\x85\x52\xf2\xe8\x51\xca\xcf\x5a\x47\x21\x57\xdb\xb1\xa9\x9a\x2b\x42\xff\x40\x37\xf0\xdc\x63\x80\x67\x29\x21\xc9\x09\x20\x6e\x80\x05\x0e\x61\xa6\xb3\x05\x6b\x17\xe3\xae\x83\x50\x09\xb2\x04\x19\xa3\xb9\x84\x6d\x37\x48\x92\xe7\x19\xf1\xb3\x5b\xc1\x25\x7d\xa9\x3c\xcc\x6d\x8f\x8f\xca\xa8\xe6\x09\xa8\xd2\x04\xdf\x10\x8b\xe7\x19\x34\x67\xe7\xf1\x05\x93\x52\x82\xc3\xfe\x66\x70\xa5\x32\x94\x42\xea\x3e\xdd\xa2\x37\x6a\x03\xa1\xcf\xe8\x72\x3a\x90\x9c\x06\x4d\x30\xfe\x9b\xb0\x21\x2c\x33\xaf\xe2\xbe\xa3\x0c\x91\x43\xc0\x01\xda\x01\xc7\xed\x50\x45\x59\xb9\x7f\xe2\xce\xa0\x9b\xeb\x9d\xb5\x19\x00\xdc\x13\x67\x05\x92\x1e\x20\x29\x78\x45\xba\x72\xa9\x7a\xa7\xc9\x53\x81\x45\x71\xbe\x3f\x08\xce\xf9\x68\x04\x5a\x5a\xc3\x40\x04\xf6\x7f\xbf\xa5\x4e\x99\x6b\x31\x1b\xd8\xdc\x52\x7d\x89\xe1\xd4\xf5\x34\x53\xa6\x71\x37\x20\x10\x1c\x45\xa6\x0e\xe3\xa0\x5c\x2e\xe6\x6f\x13\x4b\x5a\xf4\x0e\x4b\x70\xef\x37\xba\x3f\x0a\xfd\xef\xc0\x39\xf3\x42\xc2\x8a\xf9\x19\x82\x51\x38\x1a\x10\x79\xa5\xdd\x03\x5a\x8c\x28\x97\x6c\x6b\x7f\x4d\xb0\x9e\xa3\x83\xa3\xa8\x7f\x0f\x85\x1f\xd3\x31\xae\xa7\xfa\x4b\xfc\xd9\x56\x31\xd6\x52\xfa\x2f\x50\xf1\xc2\x3f\xf2\xbc\x13\x7a\x06\x04\xe3\xd9\xf3\x9c\xcb\x96\x51\x45\xbc\xa4\x8b\x06\xdc\x8a\x81\x75\x47\xb6\x25\xef\xfa\x79\x6d\x00\x0c\x37\x74\xba\xd1\x98\xdb\x12\x41\xbe\x7a\x2c\x0d\xc4\xa4\x64\x1b\x9a\x8c\xb9\xcb\x8c\x8c\x38\x87\x57\x6f\x52\x72\xc3\x3a\xaf\xfe\x45\x61\x5f\x51\xa9\x6f\xae\x76\xcf\x51\x25\xbc\x69\xad\x0a\x40\x38\x79\x07\x99\xb5\xc2\x62\x44\x21\xa6\x43\x3d\xba\xb3\x9c\xcc\xb0\xb1\x78\x7b\x5b\xce\x28\x95\x94\x48\x9d\x17\xed\xb5\xf9\x31\x03\x74\x80\x7d\x36\xc6\xe6\x73\x47\x26\xbb\x33\x00\x4e\xca\xe8\xbb\x69\x1d\xcd\x38\x76\x01\xf4\xea\x91\x1b\x4b\x90\xeb\xff\x75\x6d\x7d\x8d\x9e\xb4\x22\xcb\xb9\xaa\xf7\xf4\x77\x2e\x0a\x54\x36\x43\x06\x85\xe5\x7b\x69\x74\x54\xe8\x2e\xea\xdc\xe4\xab\xa0\x62\xb7\x76\x82\xcf\x21\x9b\xe1\xfd\x9b\x00\xf1\xcb\x11\x35\xa1\x02\x13\x49\x53\x9a\x4b\x93\xae\x21\x3f\x19\x3d\x29\x32\x73\x8e\xf7\x29\x20\x49\x9b\x7b\xe2\xa8\x1c\x9b\xaa\xed\x17\xc5\x46\x41\xa5\x97\x4d\x27\x22\x32\x41\xe3\xc6\xa0\x95\x22\x6b\xd2\x37\xe0\x59\x1e\x00\x2b\x3a\xf0\x56\x5d\xf3\xe9\x76\x42\x0f\x97\x64\xa0\x9a\xe8\xbf\xa2\x79\x5f\x8f\xad\x7f\xc6\x87\xbd\x2d\xe2\x3d\x14\x88\xf4\x49\xd8"}, +{{0x28,0x7f,0xaf,0xd2,0x13,0x74,0x57,0x2f,0x57,0x81,0x00,0x47,0xd0,0xd9,0x8c,0xb1,0xff,0x3d,0x01,0x20,0xfa,0xa4,0x88,0x61,0x32,0x24,0x57,0x32,0xc1,0xa6,0xab,0x78,},{0xe8,0x25,0x20,0x63,0xf5,0xad,0x7e,0x95,0xbd,0x05,0xc5,0x02,0xa8,0xbc,0x4a,0x17,0x55,0x63,0x60,0x86,0x9b,0x9d,0xe0,0xa3,0xb8,0x58,0x93,0x8e,0x11,0x11,0x76,0x19,},{0x62,0x01,0xe3,0x05,0x91,0xd3,0x6b,0x7b,0x22,0x6e,0x36,0xfd,0xf5,0x64,0x34,0xc4,0x7c,0xd3,0x05,0x18,0x37,0xaf,0x31,0x31,0x3a,0x99,0x17,0xfd,0x02,0xdd,0xed,0x2b,0x5b,0xbb,0x4b,0xbc,0x36,0x8b,0x3b,0xd1,0x5d,0x06,0x20,0x45,0xf1,0x05,0xb6,0xe7,0x34,0x1b,0x15,0x15,0x0d,0x36,0xf9,0x00,0x87,0x59,0x1d,0x83,0x99,0x01,0xb8,0x01,},"\xb3\xc4\x43\xe4\xe5\x89\x9c\x16\xd3\x9e\x81\xb4\xf8\x07\x40\x42\xa9\x04\xa7\x35\x07\x4b\x27\x95\xd9\xac\x06\xb1\x37\x9e\xf7\x61\x8d\x2a\x53\x4b\x6b\xef\x81\x56\x9e\x60\x71\x92\x67\xbf\x29\xcd\x9d\x16\xac\xc9\xa1\x74\xd8\x02\x6b\x14\xb1\x27\xd0\xd2\xd8\xb4\x58\x39\x98\x89\x5a\xd7\xef\x72\xfe\xdc\x53\xb8\xf0\x8a\x22\x50\x10\x0e\x1f\x1f\x0a\xab\x48\xbc\x70\x74\x64\x34\x88\xe6\xb6\x70\xe1\xb0\x72\x7c\x38\x5a\x34\xff\x65\xa0\xd7\xe8\x3b\xa8\x60\x83\xb8\x73\xdf\xf0\x55\x92\x09\xb1\x4b\x2a\xc4\x2b\xf7\xc5\x72\xd0\xc5\x91\x7a\xc4\x2e\x4a\xe4\xda\xe1\xdd\x42\x35\x79\x52\x76\xa0\x76\x13\x2c\xfe\x3e\x0c\x35\x0b\x26\x58\x0f\xbb\x3a\xf8\x17\x77\xb9\x3a\xd9\x5c\xb7\xff\x17\xc2\xd9\x80\xce\x0d\x49\x2f\x6d\x40\xfa\x90\xba\x3f\xca\xa2\x1b\xb6\x87\x35\xee\x1e\xf2\x08\x49\x5e\xbf\x7b\x02\x27\x6f\xfa\x1e\xfc\x08\x16\x58\xbb\x44\xcd\x27\x61\xef\x5e\x3e\x1c\xa6\x0e\xc8\xb5\xd8\x16\xd4\xab\xac\xd0\xbc\xc8\x02\x68\xd8\xf4\xdf\x8b\x3a\x52\x04\x9d\xb0\x15\x7e\x2b\x6e\x81\xac\xd6\xf3\xf2\x89\x47\xc0\x76\x27\x95\x5c\xda\xc9\xea\xa1\xde\x17\xd4\xb9\xda\xa3\x61\xfb\x49\x78\x26\x64\xd7\xd6\xd2\xca\x5c\xec\x6d\x14\x89\x3c\x3e\x80\xb6\xd1\x6d\xaa\xcf\xfc\xc0\xb7\x59\x37\xe8\xbe\xf6\xf9\xe1\x12\xa8\x7f\x4b\x03\x5f\x90\x36\x07\x0a\x2c\xcc\x55\xc2\xaa\xd9\x39\xdf\x67\x4f\x7e\x4e\x12\x68\x5e\x01\x6e\xa0\xe4\x90\x2a\xaa\xaf\xaf\xfe\x38\xdd\xb2\xf9\x0d\x9c\xf7\x85\x37\xf6\x13\x91\x69\x6f\xf0\x33\x0a\xe8\xf7\x9a\x1c\x1e\xd5\xd5\x2b\x4e\xe2\xa6\x2d\x90\xfb\x82\xd9\xa4\x83\x93\xfa\x33\x81\x0b\x40\xd0\x45\x59\x02\xd5\x74\xff\x05\x20\x03\xe0\x16\x0c\x0f\x47\xb5\xe5\x80\xa0\x78\xbc\xee\xf0\x60\x73\xdd\xa8\xb2\xd1\xf1\x04\xa5\x95\xe9\x0b\xb6\xa4\x8e\xdd\xd8\x65\xf1\xca\xe4\xf1\x78\xfe\x22\xe7\x5f\x2f\x61\x24\xa9\xda\x06\x82\x44\x71\x12\xb3\xdb\x5b\xe8\xc4\x24\x72\xb2\x41\xe9\x44\xfd\x23\x70\xc2\xdc\x27\x15\xc0\x5a\x41\xbd\xbc\x89\x0c\x41\xc6\x5f\xb0\x8c\x2f\x59\x31\x74\x39\x1a\xc8\x80\xf3\xcb\x67\xd1\xb7\x4f\xf8\x02\xef\x96\x2a\xfe\xf7\xb9\xf3\xea\x32\x6f\x95\x27\xe7\xfb\xa6\x98\x18\x79\x24\xb6\x4c\xcd\xd0\x86\x62\x48\xc7\x6e\xe6\x4c\x79\x06\x9b\xe0\xa0\x57\xb1\x0a\xe1\x90\xf3\x8f\xf5\xab\xa8\x44\xe3\x93\x31\xcf\x1d\xb1\x3c\x90\x09\x06\xbe\xe0\xd7\xe7\x54\x6e\xf5\x23\x24\xe3\x7c\x59\x06\x75\xf1\x39\xf5\x8f\x57\x3a\x49\x4f\x4a\xe8\x2c\x4e\xc8\x10\x66\xa6\x8e\x2d\x92\x90\x01\x91\xc4\x7d\x30\x62\xf0\xf9\xaa\xed\x19\x11\x37\xcd\xa9\xb8\x3c\xd1\x30\xe8\x26\x29\x60\xe6\x24\x4f\x8f\x6e\xf3\x9f\x15\xa4\xfe\xd1\x3c\xb6\x69\xed\xc1\x9f\x5c\xe1\x62\xce\xb8\xd2\x42\xb9\xad\xdb\xfb\xa8\x77\x2c\xe7\x49\x85\xa5\xf3\x72\x0d\x59\x0a\x92\x0e\x1d\xca\x75\xa8\x79\xb1\xaa\x45\x9f\x74\x62\xff\xf2\xe9\x50\x72\x76\x1b\x20\x92\x54\xfe\x38\xc5\x4d\x83\x3a\x8e\x2c\xb8\xfc\x40\xc5\x98\xf3\xc7\xf7\xd6\xc5\x70\x57\x15\xd0\x30\x8d\xc3\x0e\xaa\x84\x67\x6d\x20\x9d\x7b\x7b\x31\x34\x47\x56\xe6\x9a\x9a\x4c\xb4\xe4\xa2\x51\x81\x7a\x37\x86\xfe\xa6\x72\x8d\xd6\x08\x22\x33\x6b\x45\xae\x5d\x47\xc7\x04\xb4\x5c\x4c\xad\x38\xc1\xe0\x1a\xb9\x3d\x14\x16\x92\xd5\x5d\x12\xfd\xb9\x74\x0f\x1d\x18\x15\x82\xf1\xc4\x8c\xe5\x43\x48\x60\xd9\x30\xf0\xe7\xe7\x0e\xdc\xff\xb8\x55\x60\xa5\x3d\xba\x95\xd5\x7b\x31\xe8\x92\x41\x37\xbc\x2c\x19\xe3\x4b\xb9\xc9\x86\x68\x77\x17\x42\x80\xe8\x0c\x23\x97\x8d\x57\x79\x58\x64\xa7\x37\x4a\xef\x38\x3f\x3b\xf6\x37\x53\x59\xbf\x63\x56\x47\x40\x09\x84\x61\xa6\xc7\x6e\x8f\x23\x89\x13\x28\x87\x69\xa1\xcb\x1c\x95\xb2\x2c\x32\xa9\xeb\xb3\xec\xeb\x04\x8e\xe3\x24\xcf\x0d\x7e\x85\xa3\x89\xb0\x4d\xed\xbb\xcb\xee\xf2\x98\xd0\x52\x78\x16\x08\x5c\x0c\x83\xef\xaa\x29\x85\x46\xe8\x39\x0b\xd1\xbf\xe4\x65\xec\x1b\xaf\xae\x69\xee\x52\x18\xe7\x2c\xae\xdb\x9b\x64\x9c\xf7\x3e\xec\x45\x4a\x2b\x48\x49\x65\x17\x96\x72\xde\xbc\xf9\x44\x13\x63\x99\x5a\x8a\x90\x7d\xe1\x7d\xc0\x68\x4f\x2a\xea\x57\x9a\x2f\xb4\x48\x41\x95\xdb\x41\x15\xca\x32\xe9\x70\x52\x6d\xc0\x0a\x5c\xac\xaf\x58\x87\x11\xdb\xd4\x69\xce\x80\xbd\x29\x7c\x4f\x41\xd6\xfa\x28\xa5\x97\xc6\x37\x2c\x0d\x21\x49\x60\xb5\x45\x98\xcd\x8b\xc8\x49\xeb\xdc\xa3\x6d\x62\x25\xb2\x0d\xec\x0d\x03\x11\x69\xce\xbb\x36\xea\xdc\x3a"}, +{{0x9a,0xd0,0x49,0x10,0x08,0x51,0xd0,0xf7,0x9b,0x71,0x12,0x25,0xc9,0x88,0x47,0x79,0x5a,0xcf,0xc3,0x60,0x1c,0x14,0xb8,0xa9,0x77,0x8d,0x62,0x70,0xcd,0x4c,0x05,0xed,},{0xe7,0xca,0xcf,0x4f,0x37,0x14,0x54,0x3c,0x27,0xa3,0xe9,0xed,0x83,0x3b,0xaf,0x3b,0xde,0x4c,0x09,0x56,0x3b,0xef,0x59,0xe7,0x63,0xfa,0xb7,0x1f,0xb5,0xe4,0xff,0x56,},{0xfe,0xc0,0xaf,0x34,0xcb,0xc5,0xcf,0xfc,0x56,0xe9,0x6d,0xd5,0xed,0x59,0x68,0xe5,0x2c,0xbd,0x42,0x69,0x84,0x4f,0xc3,0x0e,0x3a,0xb0,0xd3,0x47,0x2b,0x5d,0x18,0x0c,0x8d,0x1b,0x76,0x90,0x51,0x8f,0x41,0xf1,0x44,0x38,0xe7,0xf3,0xa8,0x3d,0x5e,0x89,0x76,0xcb,0x9a,0x26,0x15,0x1f,0xc4,0x14,0x9a,0x32,0x98,0xd7,0xe4,0x2c,0x05,0x03,},"\xc2\x84\xbd\xd8\xf8\x27\x5b\x49\xac\x80\x8c\x39\x04\x5e\x50\xe1\xed\x50\xc8\xa1\xaf\xd0\x11\xaf\xe5\xdb\x3d\xda\x62\x0b\xe8\xae\xc3\x7f\x45\x60\x57\x62\xe2\x25\xd0\x41\x11\xf2\x1b\x49\xfc\xef\xca\x3f\x3d\x5f\x81\x3b\x20\x20\xa5\x2c\x49\xf9\x5c\x4a\xd6\x1c\xa2\x14\x61\x8a\xde\x7e\xed\x6c\xd8\xd3\x14\xdc\x4c\x63\x55\x95\x52\x77\xd4\x57\x46\x2f\x03\xb9\xfb\xa2\xe2\x25\xb1\xb5\x37\xcd\x4b\x52\x37\x50\x5c\x90\xd4\x32\x05\xe1\x71\x5c\x39\x63\xcc\xfb\xec\x37\x9e\x6c\x17\x05\xe0\x80\x34\xa3\x1a\xfc\xe6\x46\x72\x7e\x78\xa2\x0e\xed\x88\xae\xb0\xdc\xda\xbc\x5c\x86\xe8\x69\x79\xe6\x3a\x5c\x26\xc3\xe2\x17\x79\x73\xb6\x98\x3c\xeb\xfe\xda\x9f\x31\x47\x93\x61\xb6\x61\x76\x3a\xa7\x26\x1c\x09\x39\xca\xd4\x8b\x71\x90\x8e\xa9\x07\x68\xbb\x6c\x95\x83\xd8\xea\xeb\x9e\x03\x38\x51\x5a\xca\x12\x42\x62\x6d\xc6\xbe\x04\xec\xc4\x42\x9e\x4c\xbb\x4f\xf3\x36\x09\x61\x92\xf7\x50\x1e\xc4\x71\xb5\x96\xa9\x9d\x4c\x02\x75\x82\xcc\x69\xe2\x04\xb6\xfb\xcd\xdf\x59\xf5\xbf\x74\x62\xdd\xcd\x59\x89\x12\x1f\xd1\x0f\x11\xa0\x67\x5b\x6c\x4e\x4f\x65\x20\xd2\x7d\x7c\x61\x43\x1b\xa7\xd1\x74\xf5\x73\x95\xa0\xbf\x72\xd3\x8c\x11\x42\x73\x6d\xed\x6b\x91\xe4\x81\x1c\x0e\x85\x41\xa6\xc0\xd9\x96\xc5\xa1\x7d\xc9\x7d\xb3\x88\xf7\x21\xd2\x35\x7d\x3c\x6a\xf5\xc8\x6b\x1d\x5e\x47\x6e\xa0\xac\x0b\x1c\x11\xd4\x38\x7f\x76\x90\x39\xbd\xf5\x38\xa0\x21\x6e\xdd\x00\x45\xee\x6d\xd8\x9e\xef\x82\xa4\x25\xa8\x3f\xaa\x1b\x12\x80\x70\x38\xca\x19\xeb\xec\x00\x2e\x8b\x3c\x15\x34\x4c\x61\xcf\xd1\xe5\xf0\xe3\xb0\x27\x3d\xeb\x37\x27\x8c\xf1\x97\xd8\xa8\x3b\x13\xd9\x92\x30\x8a\x51\x37\x3e\xb3\x81\x14\xc9\xe4\x5b\x43\x87\x80\x27\x7d\x1e\x32\xf3\x97\x29\x62\xa3\xe1\x4a\x8d\x08\xdb\x9f\x09\xae\xc3\xdd\x32\xa5\xb9\x94\x23\xe6\x1f\x5e\x79\x94\x4a\xb5\x7a\x36\xf6\xec\x07\xcc\x32\x04\xf9\x16\x5e\xe0\x21\xad\xa9\x3e\x6f\xec\xb7\xec\x45\x6a\xa0\x28\x8c\x37\x8a\x75\xaf\xd6\xe9\xda\xd6\xc6\xf8\x8e\x95\x9a\x2c\xf2\x8b\xfe\x56\xd2\xe6\x1b\x2a\xda\xec\xf0\xd8\x6d\xd8\x92\x8b\xce\xda\x26\xb0\x54\x02\x46\xb7\x33\x7f\x5c\xdc\xec\x11\xfb\x0c\x1a\x59\xd6\x31\xfc\xca\x19\x40\x8f\x95\x22\xb6\x8a\x39\xf8\x6e\xf9\x70\xb8\x83\xa0\xf0\xbd\x6b\x7b\x14\x15\xec\x9a\xa0\x43\xb5\x2e\x19\xba\xc1\x76\xd6\x7b\x79\xe2\xa5\xdc\xa8\xbf\xd2\x91\x02\xac\x60\x8e\x47\x3e\x9f\x98\x2c\x3e\xc8\x93\x2d\x8a\xa8\xcd\x56\x52\x84\x49\x1d\xe5\x2f\x51\x6b\x9e\xbf\xb7\xdb\xe1\x29\x95\x11\xae\x73\x2c\x2a\xd1\xee\x49\x92\xb0\x77\xfa\xff\xc6\x5f\x48\x8f\x1b\xa2\x15\xda\x69\x79\x60\x09\x71\x19\x6d\x0f\xf3\xa0\x8a\xd9\xf0\x0e\x82\x9c\x1d\xe1\xaf\xca\x10\xca\x47\x6b\xe6\x64\xaa\xd2\x61\x88\x9b\x0e\xb7\xae\xb6\xed\x86\x37\x61\x89\x00\xac\xf4\x81\xe2\xd2\x24\xec\x64\xa6\xe6\xcf\x4f\xa4\xdf\x73\x1b\x7a\x4f\xee\xff\x25\x80\xc9\x9b\x6d\x75\xb4\xdc\xd0\x97\x69\x65\xcb\x2b\x0b\x56\x35\x22\x78\x42\xd0\x8a\x7d\x90\x7a\xae\xbc\x2f\xde\xd8\x00\x98\x11\xdc\xdd\x73\x35\x49\x21\x75\x3b\xc5\xde\xc0\x17\x68\x93\x35\xf5\x6d\x0f\xb7\xae\x21\x3b\x41\x79\x2b\x1f\x4e\xb1\x4a\x24\x53\x59\x77\xa3\x05\xb1\x9e\xb9\x83\x8d\xc6\xb5\x15\x28\xb9\x8a\x39\xbd\xa0\x60\x10\x71\x7a\x20\x8c\x34\x7a\xa1\x58\xee\xcd\xfd\x9a\x04\x72\xd3\xb8\xd9\x20\xf9\x69\xe1\x2b\x65\x91\x9b\xda\x38\xb4\x61\x94\x98\x50\xcc\x9c\xc1\x8d\x8e\x3b\xaa\x8c\x88\x6d\x93\xcd\x09\x6a\x20\x9d\x54\x3c\xa3\x37\x5f\xc4\xe7\xd6\x51\x03\xcb\x64\x24\xbe\xab\x44\xe8\xbc\x4a\x5b\x62\xc2\x9a\x01\xbc\xf4\x4d\xcc\x61\xe7\x67\x5c\x02\x5d\xec\x07\x24\x20\x01\x94\xbd\xe7\x4d\x72\xc0\x2e\x94\xa9\x46\xa7\x52\xf3\x60\x84\x57\xfd\x91\xf2\x92\x71\x57\x71\x48\x7d\x26\xca\xd4\xe5\xcf\x6e\xf7\xc6\xf7\x16\x27\xa4\xda\xf8\xa4\xc9\xb8\x91\xc1\xee\x8f\x04\xae\xaa\x99\xfe\x0c\x8b\x4e\x83\x3b\x76\x09\x06\x6b\x61\x32\xa9\x68\x89\x0e\x26\x95\xda\x22\xb2\xd8\x57\xc8\xc0\xad\x91\x87\xc9\x60\x69\xe4\x76\xe2\x7e\x46\x32\xc4\x47\xee\x76\x71\x4a\x31\xd1\xe5\x14\x9e\xcb\x33\x7e\xe1\x32\xf3\x55\x2d\xa3\x3a\xb2\xd6\xfa\x9d\x7e\x93\xf6\x8a\x77\xcb\xf1\x91\xcb\x06\xbc\x22\xf3\x47\x0a\xf6\xd7\x58\x1e\x3a\xcc\xbe\xca\x0b\x6f\xeb\x08\xa1\x4b\x9a\x80\xc1\xef\x59\x37\x4c\xcd\xc0\x52\x3c\x36\x84\x50\x4c\x01\x04\xbb\xa2\x2c\x10"}, +{{0xde,0x54,0xe1,0x3f,0x9e,0x2c,0xc7,0x54,0x54,0x6c,0x99,0xb3,0x3b,0x3d,0x72,0xf4,0xd1,0xf7,0x71,0x50,0x38,0xa9,0x65,0x9f,0x33,0x63,0x65,0x77,0xbb,0x52,0x6a,0xdb,},{0x36,0x33,0x8d,0xb3,0x32,0x6b,0x00,0x5e,0x5c,0x61,0xff,0x78,0x2b,0xe2,0xea,0xb1,0x66,0xd4,0xeb,0x72,0x34,0xa9,0x8e,0xa1,0xcd,0x85,0x5e,0x1a,0xd5,0x35,0xe9,0x4c,},{0x37,0xac,0xa8,0xf2,0x48,0x39,0x4a,0x9e,0x04,0xd0,0x6a,0x7d,0xa8,0x4a,0x7d,0xef,0xa3,0x9d,0xe4,0xda,0x2b,0xcb,0x18,0xd5,0xf6,0x4c,0xc3,0x4d,0xb0,0x86,0x51,0xaf,0x4a,0xbb,0x19,0xfa,0x2a,0x92,0xa7,0xdd,0xa5,0x6e,0xc9,0x93,0x0b,0x81,0xae,0xbd,0x23,0x99,0x05,0x11,0xf6,0x84,0xc6,0xd1,0x5b,0xa5,0x95,0xf7,0xd4,0xa2,0x74,0x0e,},"\xdc\x40\x41\xad\x61\x42\x3a\x12\xa0\x41\x13\x18\xa6\xe6\x2a\x5e\xf6\x4a\x19\xab\xe2\xd9\x85\x22\x97\xbe\x2d\x4a\x35\xeb\x86\x70\xca\x36\xc5\x21\x53\x1b\x30\x38\xac\xda\xee\xa2\xea\x01\xa0\xb6\x18\x78\x62\xa4\xe1\xa8\x9d\x4b\x81\xc5\x31\x8e\xd4\xd6\x71\x31\xbc\x38\xf8\x41\xa1\x42\xa2\xf6\xf3\x16\xdf\xf0\x76\x93\x9d\xc0\xeb\x81\xb2\x30\xfe\xa9\x88\x1f\x8f\x0f\xf7\xed\x0b\x29\x3f\x69\xb2\x89\xfe\x77\x08\x81\xfb\x37\x10\x80\x8e\x8e\x59\xe6\x4e\x19\x0c\x1e\x37\x9b\x9d\xd3\x48\xb0\x2c\x23\x47\xd7\xe2\x06\x96\x79\x0b\x62\x77\x6a\x2e\x82\x5b\xed\x69\x17\x03\x7c\xb6\x35\xc9\x2f\xbc\x76\xb4\xc5\x85\x10\x27\xe7\xf1\x38\x52\xee\x7e\x7c\x52\x57\x3a\x90\x30\xb7\x9f\x22\xb6\x0d\x58\x69\xef\xe6\x80\xc0\x16\x64\x92\x9f\xe9\xa0\x6f\xa3\x33\x05\x2b\xe1\xd6\xaf\x3a\x0b\x48\x2c\x33\x2e\x18\x05\x1e\x78\xb3\x33\x83\x9d\x6c\xb9\x3d\x93\xeb\xfb\x27\x7e\x42\x68\xfb\xee\xee\xba\x1e\x8f\x96\xa5\xc9\xe3\x28\xc4\x26\x72\x12\xca\xc2\x51\x21\x5b\xfa\xa7\x8f\xd8\x8a\x87\x41\x7a\x80\x60\x2d\xcd\x88\x28\xe8\x04\x00\xda\x30\x4e\x98\x98\x62\xd1\x32\x01\x08\x2d\xe3\x53\x09\x25\xe0\xed\xc2\xc1\x30\xa9\xa4\x19\x07\x1b\x31\x08\x8d\xa6\xf6\xff\x40\x56\x30\x1c\x12\x9f\xc2\x13\x52\x33\x62\x8d\x16\xd8\xbf\x16\x0f\x6c\xe8\x6d\x83\xcd\x4e\x29\xae\x0c\x73\x84\x3d\x70\xb5\x30\x56\xc5\xaf\x3f\x3d\xc5\x61\x27\x1c\xb5\xaf\xf3\x93\xf0\x80\x3a\xde\x07\x2d\x9c\xeb\x74\x5b\x61\x87\xb2\x8d\x24\x69\x67\x67\xd5\xc2\x1f\x4d\x4a\xc5\x8d\x5b\xb6\x6c\x5c\xad\xfe\xfb\x16\x26\xef\x93\xf7\x14\xc7\x82\xb6\xef\x3c\xcf\x4b\x44\xee\x75\xf0\xbb\x75\x7a\x25\xd9\xb4\x6a\x9d\x93\x1a\x03\x72\x7d\x49\x6a\x22\x81\x0c\x63\x4f\x5c\x1a\xe6\x0c\xbd\xf2\xf1\xea\x29\xb5\x46\x07\xcf\xf5\x0d\x9f\x8e\x03\xa0\xa4\x51\x3c\xf6\x8d\xfb\x61\x97\x73\x41\x1b\x61\x80\x95\x9a\x8a\xac\x30\xb2\xee\xe4\xad\x32\x79\x15\xf6\x0a\xe5\x2b\x90\xe0\x4a\x9b\xce\xf8\xdc\x67\xe7\x1e\xa1\x0a\xca\x55\x3d\xb9\x89\x5c\xd8\x00\x84\x57\xd7\x6f\x02\xce\xb5\x35\x00\x21\x11\x09\xe8\x96\x03\xf3\x04\xd8\x80\xaa\xf0\x28\x61\xfe\x37\xc9\x53\x4a\x9d\x67\x2d\x83\x71\x3c\xd3\x26\xc9\xab\x81\xc3\x53\x76\x4c\xa5\xad\x5a\xc0\xe7\xf1\xff\x88\x0f\xb4\x8a\xcd\x9c\xbb\x94\x90\x64\xe2\x11\x83\xbc\x38\xfb\x1d\x90\xcf\xe6\x19\xa8\xb8\xfb\xf5\x32\x18\x89\xbb\x15\xc0\x2a\x53\xe4\xd3\x67\xfc\x66\x88\x77\xb6\x62\x28\x1c\x4a\x2a\xf6\x78\xf8\x6e\x69\x1d\xaa\x8a\xfd\xca\xc1\xb8\x20\x18\x9f\xe5\xc2\x50\x8c\xe3\x6e\xdd\x9c\x6f\x8f\x51\x57\x50\x71\x83\x94\x39\xa0\x03\x35\x2c\x15\x73\xe1\x27\x68\xdd\x6d\xeb\xdf\x1e\xd4\xf9\x4a\xc7\x9d\xf1\xab\x6a\x0b\xc2\x50\x79\xc0\x93\x54\x77\xd9\x14\x99\x88\xec\x3b\x87\x93\xef\xcd\xa8\x59\xac\xc3\x92\xab\x3f\xa9\x94\x93\xd7\xae\x0a\x65\x75\xb6\x95\xa1\xce\x07\x65\x32\x86\x02\x87\xdd\x49\x89\x67\xc4\x6f\x7a\xdd\x49\x49\x4c\x02\xe7\x44\xc4\x02\x80\x19\x57\x82\xe2\x42\x44\x76\x16\x5e\x72\xce\xe2\x36\x42\xe5\x1c\xec\x43\x21\x91\x11\x6a\xec\x59\xb5\x9f\xcf\x0a\x36\x83\xb9\x5f\x76\x07\x60\xa2\x0b\xd6\x74\x54\xd8\xde\x64\x7c\x0f\x9f\xfc\x4f\x90\xf6\xe4\x5a\xc9\x3d\x80\x2f\x33\x82\x99\xef\x28\x0d\x3b\xb7\xa4\xa8\x9d\xb8\xc5\x9a\x12\x52\x6f\x27\x83\x02\x4c\x8a\xde\x90\x02\xf0\x0e\x3d\x52\x9b\x78\xdc\xdd\x49\x03\xda\xf5\x76\x7a\x2b\xed\x75\x14\x53\x96\xef\xb6\x97\x90\x71\x2d\xe6\xa5\x90\x1e\x6d\x8c\x15\x28\x01\x82\x38\x82\x85\x02\x1d\x0e\x70\x92\x92\x15\xd9\xf2\xb7\x99\xbb\x92\xf2\xca\x56\xf4\x8e\x8c\xbb\xa2\xf1\x9b\x08\x58\x45\x12\x65\x67\xcf\xaf\xa6\x03\xc2\x94\x6e\xa1\xe7\xd2\x74\x55\x4a\x38\xbf\x7d\x86\x51\x1f\x3e\x47\x4f\x9f\xa5\xcb\x11\x10\x5f\xb5\x2f\xc6\x81\x77\xf3\x38\x5f\xe1\x39\x7b\xe5\x84\xa7\x00\x89\xdc\x74\x1b\x4b\x00\x95\xbf\x7e\xb2\x99\x3b\x41\x8d\xf8\x7b\x14\xa1\xf9\x79\x26\xe8\x68\xdf\x6e\x56\x8b\xec\xa2\x21\x5f\x2d\xd7\xce\x8a\x3c\x9e\xe8\x49\xcb\x41\x34\x6c\x68\x4f\x7f\xfe\xf0\xa7\x92\xed\xf4\x33\xca\x99\xef\x34\xc7\x3f\x92\x72\xa7\xeb\x97\x58\x7c\x8f\xce\x4a\x51\x36\x44\x47\x37\x13\x8d\x53\xea\xdf\x3a\x84\xf5\x01\xbb\x10\x45\x6e\x8e\x4a\x40\x47\x08\x2c\x9e\x14\x35\xf5\x76\x52\x6c\x21\x64\x71\x4d\x70\xb3\xd0\xa6\xe9\xc0\x8a\x53\xe3\x23\x84\x0f\x4d\xcf\xe8\xf2\xd1\x9f\x0b\xe2\xc8\x8e"}, +{{0x85,0x04,0xfb,0xca,0xab,0xa6,0x76,0x83,0xf8,0x15,0x49,0x92,0x82,0xb6,0xeb,0xd4,0x97,0xa8,0x1a,0x91,0x56,0xf5,0x3e,0x02,0x5c,0x2d,0x3e,0xce,0xe0,0xdb,0x65,0x59,},{0xe6,0x2d,0xa8,0x64,0x93,0xa0,0xca,0xf5,0x29,0x21,0xd5,0x60,0x2f,0xbd,0xc3,0xdd,0x3a,0x84,0x36,0x94,0x1f,0x6b,0xe2,0x40,0xb3,0x15,0x09,0x68,0x12,0x38,0x74,0x6d,},{0xc0,0xea,0x07,0x4b,0xf9,0xad,0xde,0xe2,0xe3,0x35,0x0a,0x96,0x9e,0x7c,0x56,0x9e,0x3a,0xea,0x1a,0x41,0x88,0xee,0x5a,0xf3,0x4c,0xb7,0x3f,0x38,0x82,0x98,0x65,0x3d,0x29,0x9b,0x5d,0xbd,0x94,0x16,0x3f,0xba,0x20,0x9e,0x8f,0x7d,0xc2,0xe2,0x63,0x4d,0x3a,0x52,0xa0,0x28,0x10,0xa8,0x8c,0x61,0x52,0x94,0x5b,0xc1,0x6b,0xbd,0xfb,0x0c,},"\x6c\x63\xed\xbd\x40\xa0\x38\x74\xec\xae\xf8\x16\x02\xcd\x68\x50\xc0\x9f\x49\x15\xb7\xaa\xf4\x18\x25\x8c\x56\x83\x64\x53\x8e\x83\x92\xa8\xc3\x79\x83\x8b\x0c\x95\x34\x5b\xf6\x4c\x3d\xbc\x17\x58\x53\xfb\x64\x1f\x35\x0f\x0b\x53\xa0\x5a\x8e\xc2\x90\x28\x8c\x03\x26\xd4\x35\xff\x77\x6f\x86\x83\xa2\x73\x33\x3f\x9b\xb2\x80\x21\x84\xec\xc5\x3b\x06\xb2\x8c\x2c\x40\x2a\x54\xbf\x13\x4c\x1a\x23\x29\x97\x49\xa6\xce\x2b\x51\xa7\xba\x22\x23\x21\x48\x79\x7e\x99\x3f\xf2\x58\x28\x6e\x94\x77\x78\xa8\x74\x2d\x3f\x36\xcc\x78\x42\x97\x60\x43\xfc\x23\xda\x8a\x97\xec\xb9\x71\x5f\xc0\x5f\xb0\xf2\x3f\xa7\x32\x1d\xdc\x19\x32\x86\x16\x31\x60\x4e\xba\x2e\xf2\x5d\x8b\x75\x6c\xe4\x73\x36\x56\xbf\xd1\xe1\x47\x08\x92\x3a\xc7\xc6\x0a\x79\x84\x61\x36\xd7\x41\x97\x3b\xa5\x51\x41\x89\x72\x0b\xc0\xf7\x77\x4b\x7b\xd3\x57\x45\x95\xbd\xe2\x51\x50\x31\xb2\x5b\x62\x65\x4b\x16\x10\x35\x77\x80\x70\xac\xe1\x49\x71\xdf\x1f\xe0\xbe\x4e\xa1\xef\x55\xcf\x87\x47\xd3\x71\x6c\x1c\xe7\x07\xb1\xa7\xc8\x52\x0e\x6d\xeb\x33\x4e\xb1\x86\x33\x8f\xc9\x30\x00\x76\x8e\xb2\xbe\x40\xc6\xe0\xdc\x3f\x5d\xf8\x31\xb3\x2c\x3a\x2c\x33\xe2\x88\x98\xd6\x76\x2a\x15\x22\xd3\xd4\x8d\xae\xe5\x6a\x02\x69\xbd\xdf\x6c\xfc\x9d\x73\xf8\xd1\x78\xae\xcc\xbf\xfe\xf7\xce\x16\x4f\x98\xaf\xea\x22\x4a\x9b\x60\xed\xe4\x6a\x95\xfa\xdc\x9f\xc5\xd9\x4d\x20\x9c\x16\x6d\x9b\x8d\xe2\x53\x38\x1e\xa2\x24\x88\x62\x94\x6b\x9c\xf5\x34\x94\x74\x55\xc2\x44\x58\xcf\x56\x68\x3a\x0e\xc4\x7a\x2c\x65\x07\x5c\x69\x4c\x7c\x3d\x6a\xdf\x9a\xe5\xe8\xad\x31\xac\x76\x9f\x83\xaa\x26\xe3\x12\xc5\xb0\x1a\x9a\x09\x40\x4b\x15\xb8\x14\xba\xa7\x66\x6b\x3e\x03\xf0\x6a\x8d\x63\x48\xab\x8c\xcb\x9b\x60\xa4\xa4\xfa\xf8\x6f\x71\x35\xdf\x03\x9d\x95\x5c\x07\xbd\x92\xe7\xb8\xe3\x27\xee\x6c\x1b\x40\x19\x6a\x28\xb4\x44\x6a\xa5\xa9\xb2\xb9\x77\x3a\xb7\x6e\x3c\xe2\x11\x80\xf0\x9d\x6c\x08\xd2\x77\xc6\x77\x1d\x67\xe2\x2d\x84\x54\x0f\xa4\x3b\x38\xf6\x34\xcf\xc4\x6e\x5b\x8c\x33\xf1\x5a\x56\x8a\x77\xe4\x91\x4a\xad\x9a\xb8\xc9\xf7\xfe\xa4\x7f\x76\x77\xc0\x18\x80\xb3\xe8\x5d\x2d\x0e\x3f\xbd\x6d\xc6\xe9\x9e\x43\x7d\xdc\x73\x6f\x92\xb5\xa2\xff\x29\x27\xe0\xb4\x42\x14\x2f\x08\x97\xd0\xb8\xa1\x9a\xc2\x03\x63\x3d\xf4\x13\xfe\xaf\x8e\xf5\x0a\x5f\x76\x7b\xed\xaf\x20\xf1\xc1\x3f\x3b\x89\xd1\xe8\xb7\xbd\x18\xd5\x91\xf9\xde\x11\x6e\xe3\x4f\x98\x24\xe4\xea\xd1\xae\x9d\xa2\xe8\xca\xae\xf8\x8b\x29\x51\x6a\xa9\x42\xde\x77\xa7\x46\x7b\x6f\xb2\x6a\x66\x6f\x30\x64\x8c\x71\x5a\x2e\xe9\xf9\x46\x74\x3b\x54\x3a\x44\x28\xe0\xdf\xd0\x61\x78\xe7\xe9\x3e\xc6\xf2\x6e\x00\x3e\x05\x8b\xec\x14\xa4\xaa\x2e\x3b\x8d\xe1\x12\x95\xa7\x64\xca\xb3\x0b\x31\x3f\xcc\x57\x43\xb2\xfb\x89\x96\x2d\xdc\x5c\xdc\x6a\xa0\xd2\xe4\xa3\x06\xe7\x7a\xf7\x6a\x05\xa5\x98\x92\x3f\x62\x8a\x85\xdf\x1c\xc7\x3a\xd3\xbc\x01\xc4\xb9\x79\xbd\x7c\xb2\x96\x59\x0a\x88\xb0\xa4\x1b\x44\x5d\x50\xa0\x84\x23\xe4\xed\x80\xf1\x76\x3c\x71\x6b\x6c\x45\x7d\x84\x5d\xfa\xa6\x8d\x12\xb0\xd0\x3c\x55\xfd\xe8\xae\x6b\x2b\x92\xbc\x63\x22\x94\x3d\xbe\x54\xc7\x06\xbc\x8e\x5f\xce\xe7\x06\x54\xb2\x6f\x3b\xfd\x87\x7f\x5f\x53\x39\xac\x18\x2d\x54\x17\xbd\x4c\x07\x35\xd8\x25\xbf\x70\xe8\x5e\xab\x82\x16\xed\xda\x63\x2a\xe7\xe2\x2b\x3e\x53\xd0\x78\xa8\xb2\x0b\x5a\x7e\x23\x85\x33\x7c\xf9\x2b\x3c\x16\xb0\x23\x56\x3e\x11\xcb\x50\x43\xb7\x04\xd3\x7e\xb5\xed\x9e\x85\xfc\xdc\x95\xcf\x7a\x6e\xad\xe4\x08\x03\x17\x5a\x00\x8e\xf6\x53\xac\x61\x36\xf1\x61\x29\xab\xae\x11\x37\xc5\x82\x34\x00\x74\x8a\x81\x25\x62\x54\xd3\x17\xcf\xc9\x39\xe2\x6e\xa0\xce\xf9\xf6\x54\x8d\xb4\x28\x90\xc4\x8b\xeb\x04\x79\x10\x3b\xa0\x89\xe5\x14\x11\x80\x38\xb1\xb9\x09\x43\xd7\x16\xf7\xa8\xd4\xcd\xa5\x98\x3a\x67\x4b\x83\xa0\x02\xd8\xac\x9c\x65\x73\x4a\x28\xb7\x7b\x76\x0c\x8e\x38\x03\xf8\x78\x1e\xa9\x19\x9f\x79\x7c\xe7\x29\xe0\x6b\xff\xfe\x8c\x29\xb2\x0b\xc8\x52\x27\xc0\x9c\xc0\x52\x19\xff\x2b\xa3\x8e\x18\x05\x10\x83\x73\x2f\x83\xcb\xfc\xcc\x31\x07\x56\x45\x0b\x26\x1d\x5b\xe1\x83\xd9\xfb\x44\xec\x18\x52\x9f\x2c\xc9\x84\x8c\x40\x11\x9c\x60\x76\x76\xbc\x4d\x90\x15\xfd\x4b\xd2\xfc\x91\x8d\xc8\x03\x1e\xc1\x9a\x05\xff\x36\x2c\x18\x40\x43\xbe\x7f\xe0\x66\x01\x9a\xc5"}, +{{0xea,0xc0,0xf0,0x6c,0x2c,0x14,0xf3,0x7d,0x43,0x4b,0xc9,0x98,0x97,0x22,0x5d,0xd2,0xe3,0xf1,0xed,0x74,0xaa,0x74,0x42,0xc5,0x50,0x33,0x9d,0xf7,0x7d,0x0b,0x7b,0x32,},{0x43,0xe6,0x20,0x55,0xdb,0x6e,0x13,0x49,0xc9,0x4d,0x89,0x02,0x91,0x87,0x88,0x20,0x20,0xcb,0xcf,0x9d,0x75,0xe0,0x3e,0xb6,0x56,0xfa,0x0a,0x15,0xb1,0x90,0x02,0xd7,},{0x45,0xf2,0x80,0x3a,0xfe,0xb0,0xfc,0x44,0xd3,0xaa,0x96,0x5b,0x12,0x65,0x9b,0xf5,0x02,0xe4,0x72,0x95,0x70,0x61,0x84,0xb2,0xa1,0xc6,0xf1,0x6d,0x05,0x06,0x13,0xf5,0x96,0xa2,0x00,0x13,0x94,0xe0,0x0e,0x2a,0x44,0xc4,0x6c,0xf6,0x50,0x5d,0x5c,0xf5,0xb8,0xab,0x84,0x12,0xf0,0x7e,0xda,0x95,0x1a,0x15,0x00,0x5e,0x33,0x8f,0x3c,0x0e,},"\x27\xb7\xfd\x0e\x71\xad\xf1\x94\xcf\x54\x07\xb6\x77\x17\x93\x06\x0d\xe0\xfc\xa7\xca\x0a\xe6\x48\x35\xc4\x31\x87\x40\x8a\x70\x4f\x53\x3d\x5e\xa0\xc8\x3a\x65\x43\x87\xba\x7d\xb1\x6e\xd5\x8e\xc8\x37\x22\x6d\xf5\x7c\x1f\xe6\x38\x2c\x59\x19\xe9\x22\x13\xf6\xf1\x8c\xbb\x57\x35\xd1\x78\xa4\x76\xaf\x35\xd3\x90\xb7\xcd\x25\x56\x21\x7c\x53\x0f\x3a\x1f\x8a\xb2\x33\x9c\x1a\x5e\x8d\x96\x93\x87\xef\xd3\x94\x14\xb5\x6b\xb7\x84\xdf\xd5\xeb\x89\xb8\x59\xe1\xf4\x03\xa2\x38\xec\xa2\xa9\x41\xe6\xdb\x56\xac\x45\x6b\x73\x45\x06\x98\xd1\x45\x5e\xc1\xe9\xb3\x9a\x1e\x90\x7d\x6b\xc7\xe6\xcf\xf4\x24\xa2\x8e\xed\x57\x9a\xf1\x63\x10\x11\x5b\x67\xf5\xfc\xf7\xf8\x34\x6b\x3f\xa0\x26\x0c\x6d\xa2\xe2\x77\x55\xac\xa5\x70\xba\xbb\x3d\x30\x3c\xc8\x32\x46\x0c\x96\x3b\xfd\xd5\xc1\xff\xb2\xfc\x19\x92\x19\x29\xdd\xa2\xa7\x17\xfb\xcb\xeb\x2b\x85\x25\x76\x1b\xd6\x60\xce\x4a\x0f\x76\x85\x28\x5d\x7f\xad\x61\x15\xab\x09\xf8\xe6\x3f\x5f\x77\x39\x14\x49\x4e\x20\xbe\x1b\x51\x2d\x11\x14\xcc\xe3\xf0\xf6\x8c\x7d\x94\xf5\x48\x57\x69\x4f\x22\xaf\x4c\x69\x8d\x78\x2c\xe8\x37\xb0\xc1\x72\x2b\xb7\x31\x3b\xb2\xc4\x1f\x6d\x3d\xd1\xa0\x28\x77\xfb\x42\x96\xd8\x66\x2a\x9e\x86\x25\x98\x4d\xc1\xfd\x1a\x95\x10\xeb\xa9\xd6\x43\xac\x58\xa8\x86\xa0\x45\xcd\x0e\x53\xc0\x56\xa8\x33\xf9\x68\xb3\x5d\x01\x32\x0e\x9c\xc0\xb4\x35\xd3\xf6\xbf\xad\x26\xf9\xeb\x57\x54\xd3\x8d\xdf\x6d\x5c\x4b\xf6\x15\xa7\x64\x4a\x23\xf9\x82\x6b\xcc\x97\x60\x92\xd8\x2d\x81\xd5\x47\x00\x0d\xe0\x08\x1b\x7a\x40\xa9\x3f\xbd\xda\xc1\x3f\x7d\x99\x70\x8c\xcd\xee\xb9\x40\x5c\xd6\x34\xca\x07\x48\xca\xd2\xc1\xd8\xf1\x64\xf5\xd7\x7a\x4f\x36\x4a\xe4\x88\xbe\xdc\xf1\xf2\x0e\xb9\x54\xbc\x8a\x27\x8a\xf8\x14\x32\x41\x78\x56\xa9\x00\xf8\xf1\x52\x92\x1a\xfb\xe1\x79\x14\x22\x9a\x51\x3b\xd7\x1a\xb7\xe6\x61\xcd\xe1\x29\xaf\x93\xe2\x50\x94\xc5\x61\x18\xed\x1f\x22\xdb\x64\x44\x28\xb4\x74\x65\x1f\xe3\x6b\xe8\x2f\xa3\x69\x5c\x41\xfc\x86\x99\x66\x7e\x05\x37\x43\xb0\xa4\x11\x55\xc3\x1f\x1e\x26\x79\xc6\xe8\xcb\x9c\x9d\x1f\x5f\x4b\x40\xa3\x20\xa9\xfd\x9f\x47\xda\x9b\x94\x21\x1b\xa6\x01\xb2\x2a\x11\x52\x10\xd9\xf5\x59\xc4\x49\x6f\x01\x73\x24\x58\xf4\x9a\xc3\x4e\xb3\x86\x63\x6c\x8b\x6c\x68\xc7\xbb\xc0\x07\x8a\xb6\xf3\x98\xa6\x24\xb8\xba\xfb\x1c\x62\x29\x58\x56\x2d\x23\x1d\xff\xd4\xdb\x09\x61\x96\xbb\x87\x47\x9e\x42\xea\x22\xac\xbd\xcd\xe8\xde\xb1\x0e\x31\x16\x32\xf0\x2f\xca\x14\x78\x7f\xd3\x14\x05\x69\xb9\x42\x89\x91\x54\x3e\xc6\xe8\x34\xe1\x0b\x14\x9f\x23\xc7\x4b\xb9\x9a\xc7\xb3\x79\x9a\x20\x96\xd2\x2e\x38\x7a\x71\x2b\x6f\x90\x11\xea\x34\xc5\xbe\x4c\x46\x85\x81\xac\x62\xce\x66\x20\x63\x25\x2e\x06\x6a\x9a\x3b\x15\xc9\x57\x0d\x06\x5d\xc1\x61\x99\x29\xf0\x6b\xc7\x5a\x31\x79\x46\x8b\xc8\xa1\x6e\x3d\xdc\x4f\xe1\x85\xce\xba\x0a\x92\xa5\x46\xb8\x67\x5f\xc1\xad\xe5\x63\x07\x15\x0c\x7e\x4c\x84\x4f\x6a\xa5\xf1\xed\xbf\xb5\x4a\xc6\x32\xca\x2b\x25\x9c\x32\xa3\x3e\xe2\x86\x78\x56\xc3\x39\x0a\x67\x40\x36\x4c\xb0\xdf\xb9\x76\xe5\x3d\x0c\xc6\xc4\x2a\x10\x6a\x1c\x26\x91\x8c\x8a\x6a\x03\x3b\x2a\xa3\xc7\xf2\xe4\x39\x2e\x79\xf8\xec\xa5\xb3\x36\xba\xc5\x06\x1d\x76\x98\xa3\xbf\xe7\xc2\xc2\x92\x89\x25\x54\x03\x0d\xe6\xce\x7c\x0d\x06\xee\xfc\x54\x90\x6f\x81\xe0\x09\x7f\xcf\xf2\x7d\x14\xb9\xb7\x99\x4a\x79\x70\xe1\xa5\xf5\xc6\xb6\x40\x5d\xca\x22\x03\x3d\xff\x0e\xae\x13\x8a\xd8\x99\xf6\xee\x68\x12\x0b\x8f\x22\x74\x4b\x02\x69\xa9\xa8\x98\x9b\x6f\x7e\x08\xaf\xfa\xe7\x7b\xca\x21\x68\xad\xe2\x40\x58\xae\x68\xa7\xf8\x00\xe0\x2e\x7c\x38\x39\x1b\xaf\x56\x5d\xd4\x0b\x55\xfa\x3a\xb3\xc2\x47\xb9\xce\xb4\xd9\x67\x47\x17\x75\xe6\x63\xd6\xa1\xc6\xc7\xe1\x73\x50\xbb\xd6\xb9\xa3\xeb\x1e\x48\x4a\xc2\xe7\xa7\xa5\xc8\x4f\x50\x83\xe5\xac\xe8\x73\x0d\xe8\x9c\x47\xe8\xdc\xf8\x34\x1e\x40\xba\x34\x5d\xbd\x66\xba\xe0\xf7\xf0\x76\xa7\x05\xb1\xbb\x7f\x47\x0e\x3e\xdf\xb2\xb7\x8e\x4d\x63\x59\x41\x3d\x18\xd3\x32\x80\xb4\x54\xa0\xdb\xb8\x81\xd8\x60\x67\x26\xfa\x9b\xea\x27\x24\x75\xe7\x9f\xea\x6a\x54\xcb\x4c\x06\x19\x54\x1b\x4e\x77\xc1\x70\xc8\x61\x68\x74\xb9\x54\xbe\xb8\xd1\x05\xb8\x6b\xd1\x91\x7e\x25\xcf\xba\x92\x67\x18\x7e\xe2\x03\x8b\x3f\x00\x78\xf4\xc3\x18\xb5\x87\xcf\x44"}, +{{0xe6,0x08,0xd5,0xde,0x97,0x97,0x90,0x7d,0xb6,0xd9,0x8e,0x03,0x45,0xd5,0xca,0xf2,0xad,0x33,0xe0,0xed,0xde,0xbf,0x18,0xb8,0x1d,0x61,0xe8,0x37,0x3e,0xcf,0xb4,0x99,},{0x60,0xe0,0xc1,0x6a,0xda,0x58,0x6e,0x36,0x46,0x91,0x2a,0x5f,0x2b,0xb3,0x18,0xfb,0xc3,0xd5,0x0b,0x57,0xd3,0x6f,0xab,0xb6,0x37,0x69,0x6f,0x9d,0x8d,0x4d,0xc7,0x61,},{0x0d,0x8f,0x09,0x5e,0x42,0xa2,0x73,0x0a,0x3c,0x7b,0xed,0xf4,0x2d,0x5c,0x83,0x39,0x8b,0x5c,0x0e,0xe9,0xc7,0x7c,0x5a,0x61,0xd9,0x82,0x29,0x13,0x96,0xa9,0x18,0x2a,0x08,0x02,0xa3,0x7f,0x32,0x4b,0xc4,0xfb,0x5d,0x4a,0xa4,0xed,0x60,0x44,0x4b,0x66,0x14,0x4b,0xac,0xbc,0x86,0x51,0x05,0xd7,0x69,0x0f,0x14,0x06,0x50,0x69,0x1d,0x03,},"\xe6\x10\xfa\x7d\x83\x85\xc0\x9c\x78\x98\x9e\xd5\xef\x7a\x23\x05\x47\xf0\x13\xcb\x7e\x8d\xdf\x31\x74\x9f\xfc\x31\xce\xe1\x0a\xb3\xef\xac\xa3\xf1\x4e\xa1\x94\x51\x0f\x09\x85\xa8\x18\xef\x8b\x04\x0e\x10\xc3\xa5\x11\x4d\xe1\xac\x08\x0f\x14\xc3\xd6\x5d\x3c\x24\x4f\x92\x42\xf7\x54\x92\xca\xba\xe8\x00\xfc\xfc\x9b\xc2\x75\xea\x1f\x27\x72\x8c\x92\x0c\x25\x8f\xe7\xaa\x73\x94\x80\x60\x29\x9c\xb8\x78\x35\x79\x2e\xdc\xc0\x72\x15\x0b\x73\xce\xfe\xb0\xd5\x15\x62\xe5\x3b\x46\x81\x0e\x27\xa4\xd7\xf6\xab\xd3\x2e\x95\x9f\x7d\x73\x1d\xde\x01\xd9\x4b\xc4\x1e\xd8\x35\xef\xcd\x42\xc9\x22\x43\x70\x37\xa8\x7d\xd3\x66\xff\xad\x2e\xec\xab\x6a\xba\xeb\x4f\xcf\x07\x39\x2b\x3a\xb4\x0c\xfa\xef\xea\xa4\x26\x6b\xc5\x37\x67\x16\x93\xc9\x09\x3d\xab\xe8\xa0\x53\x8c\xaf\xd1\x2c\x63\x9a\x04\xbd\x2b\xa8\x0c\xe0\xf2\x9a\xdb\xfc\x66\xbd\x46\x37\xca\x05\x43\xa5\x3b\x0e\x37\x1d\x0e\x2e\x47\x0d\x31\xba\x36\x06\x42\xa4\x5a\xb4\xcf\xe3\xe7\x90\xf5\x87\xf6\xc5\xa5\x58\x3f\xd1\x5b\x18\x99\x78\x38\xa2\x00\x92\x1c\x1c\x39\x9c\x0b\x16\x27\x8b\x7d\xd6\xd3\xaa\xab\x6f\x32\x5b\x16\xaf\xdf\x76\x1a\x1b\xbf\x86\x7d\xe2\xbd\xd4\x86\x15\xf1\x5b\x52\x67\x70\xed\x20\xd7\x9f\x0f\x30\x71\x4b\xee\xed\xa5\x8f\x52\xa3\xcc\x0c\x5a\x61\x83\x15\xe5\x22\xb9\xeb\xe7\xcd\x99\xb6\x5e\xd5\x32\xa6\x2e\x0f\x0d\xf7\x27\x64\xd6\xec\x6d\x6d\x1b\xa4\x0e\xf4\x0e\x05\x42\x63\x60\x79\x5d\x6d\xd8\x5b\xb3\x9f\x73\x21\xd3\xfb\x06\x27\x5d\xe0\x96\xaa\xe4\xa2\xfa\x22\x93\xf3\x1b\x33\xf4\xad\x4d\x7c\x25\x1a\xc1\x3e\x8e\x15\xc2\xbf\xb1\xf9\x8f\x49\x62\xc5\x4b\x6c\xe0\x33\xb0\x8a\xa6\x26\xf2\x90\x5d\x46\x3f\x55\xb7\x1c\xbd\xad\xec\xdb\x3e\x0b\x36\x5d\xae\x07\xb1\x70\x30\x19\x83\xae\xb8\x3b\x1e\x9f\x2f\x28\xcf\x65\x41\x9f\xd6\xb0\xa1\xa9\xc2\x6c\xb5\x4b\x59\x49\xf4\xbc\x01\xa9\x86\x81\x84\x4b\x43\x03\x4c\x37\x2a\x45\x3d\x38\xf0\x47\x3d\x0d\xdc\x70\x9d\x9f\x49\xc8\x75\x3a\x75\xb8\x56\xc7\xe9\x77\x55\x17\xdf\x57\x4a\x09\xa3\x95\x3b\xde\x5d\xae\xdf\x8e\x4a\x8d\xa9\xd7\x73\xa2\x15\x12\x0e\x26\x9f\xa1\x86\x11\x33\xcd\x4c\xea\xeb\x91\xd5\xcc\xa2\x60\x63\x25\x45\x8e\x50\xcb\x96\x6d\x14\x05\x5b\x22\x44\x7e\xb6\x5d\xc1\x01\x18\xda\x08\x31\xdf\x28\xc3\xb4\xee\x8b\x11\xf0\x73\x2f\x15\x21\xbb\x94\x82\xb1\x1f\x5a\x86\xb2\x2f\x18\xe8\x3d\xd1\xd9\x67\xd3\x94\x42\x85\xe5\xd6\x3a\x5a\x98\x98\x17\xab\x24\x18\xbc\x7e\xd8\x91\xa3\x73\x84\x67\x47\xa1\x2b\x52\x7c\x2f\x44\xee\x01\x97\xb9\x46\xc6\x7e\x67\xfa\x4a\xa1\xc2\x9f\x33\x79\xd4\x6f\xe0\x7d\x3a\xab\x83\xda\x17\xf9\xd7\x6b\xed\xd3\x84\x36\xa0\x55\xe3\x4c\xa1\xd3\xaf\x5a\x87\x54\xd3\x8c\x17\xb9\xba\x4e\x64\x19\xcb\xab\x51\x5f\x43\x1a\x25\x95\x95\x4e\x42\x8c\x26\x70\xfa\xe3\xbe\xd6\x2b\x45\x96\x17\x9c\xb5\x9e\x21\x10\x87\x08\xd0\x71\xbc\xf9\xc6\x21\xc6\xdf\xf0\x3d\x3c\xdc\x92\x02\x02\x94\x54\x01\x3b\x9d\x13\x38\x47\xf2\x65\x44\x81\x1c\x01\x69\x77\x0f\xdc\x6f\xe5\x63\x8b\xfd\x7a\x72\x0d\x8b\x38\xf7\xe3\x0a\x7e\x68\x79\x06\x0b\x5f\x28\xc8\xab\x17\xb0\x02\x00\x71\x32\x07\xe8\x63\x7b\xff\x48\x44\xd8\x42\xd9\xca\x78\x83\x91\x34\x01\x98\xa3\xfe\x01\x72\xdf\xa7\x4d\xe1\xe5\x5a\xde\xfb\xc2\xe9\xbc\x7e\x88\x54\x76\xd1\xb9\xc0\x55\x81\x34\x08\xa4\x75\x28\x43\x43\x55\xbf\x03\xfd\xd4\xe2\x7d\x8b\x34\x61\xb0\xfb\x66\xab\x3e\x15\xa8\x79\xa1\x84\x45\x7e\x9e\xd9\xea\x6c\x51\xb6\x63\xb3\x1e\xdc\x8c\x4a\x3c\xd4\x54\xf6\x9d\x9c\xe5\x18\xd1\xb8\x78\x88\xee\x3d\x9d\xd5\x41\x6e\x43\xe1\x14\xac\x05\x72\x13\x52\xdf\xfc\x2c\xa8\x85\x97\x37\x7b\xbc\x41\x40\x09\xb0\xc2\xfd\x36\x9b\xe5\xba\x35\xa6\xdc\xe3\x47\x8b\x6c\x11\xb3\x3c\x0a\x33\x91\x8b\x6e\xe5\xac\x4c\xd4\xc2\xf1\xca\x6b\xd1\x90\xa0\x00\xa8\x38\xda\x38\xf5\x30\x77\x56\x03\x35\x59\x6d\x13\x58\x93\x77\x93\x96\x38\x10\xa7\x9a\x21\xb8\xd4\x61\x40\xe7\x68\x89\x8d\xcd\xa8\x8a\x0f\xaf\x8d\xdd\x0d\x63\x38\x47\xaa\xea\x0e\x03\x0b\xe6\x45\x5b\x41\xe3\xed\xe1\xe2\x87\x37\x30\xeb\x84\x81\xac\xaa\x7a\x51\x9c\xf9\x19\x58\x47\xa8\x6a\xfa\x57\xf9\x07\x1d\x44\xf4\xaf\x4c\xa0\xd3\x43\xc9\x0c\x0d\x22\xd9\x46\x14\x65\x85\xf0\x0e\xf3\xae\xf5\x7f\x0f\x9e\x55\xe8\x18\xc0\x12\x8a\xe2\x55\xdb\xc3\x11\x6c\xf0\xfe\x02\x16\x6d\x54\x85\x9d\xec\xbf\xdc\xcc"}, +{{0x0e,0x86,0x87,0x2c,0x78,0x62,0x0f,0x10,0xcb,0x6d,0xfc,0x46,0x3d,0x2c,0x28,0x72,0xc4,0xda,0x66,0x07,0x48,0xc9,0xcd,0xa0,0x1a,0xb1,0x45,0x69,0x58,0xaf,0xba,0x7f,},{0xde,0x49,0x89,0x98,0x92,0x69,0xca,0xbd,0x8f,0x4f,0x40,0x9c,0xf1,0xa4,0xd9,0x74,0x03,0x8b,0x27,0x55,0x02,0x27,0x35,0x57,0xf3,0x12,0xd5,0x55,0x3f,0xab,0x93,0xc3,},{0x20,0x37,0xe9,0x77,0x41,0xc3,0xe6,0x40,0x9c,0x66,0xfc,0x67,0x82,0xaa,0xb3,0x89,0xc5,0xd7,0x78,0x09,0x7a,0xc7,0x78,0x99,0x9e,0x85,0x76,0xe4,0x9e,0xf4,0xf6,0xa0,0xc7,0x73,0x0b,0xd9,0xe0,0x93,0xdd,0x3c,0x0a,0xe7,0xec,0x76,0x20,0x33,0x80,0xda,0x65,0x71,0x47,0xd3,0x3a,0x8d,0x9d,0xd6,0x5e,0xd0,0x0c,0xf7,0x62,0x24,0xd6,0x01,},"\xa9\x00\xf3\xe9\xc6\x43\xa5\x64\x9b\x07\x6f\xb6\x9c\x3b\x2a\xc0\x84\xd5\x2c\xcb\xaf\xcd\xca\x5a\x9d\xb1\xda\xa7\x05\x00\xde\x99\x33\xd2\x3d\x15\x3f\x74\x95\x4e\x1b\xd5\xf5\x7b\x89\x9f\xe8\xa4\xb1\x34\xc1\x95\x41\x2b\x49\x83\x3b\x6e\x50\x95\xa6\x55\x4e\xaa\x6d\x84\x4b\x11\xf1\x58\x4c\x85\x05\x5b\x87\xf4\x1c\x99\x96\x69\x04\x6c\x71\xae\xb5\xc0\x45\x3f\xd6\xa3\xc4\x37\xf8\x15\xf0\x68\x98\x7c\x38\x68\xcc\x07\xaa\x2a\xf6\x58\x19\x04\x6c\x30\x7b\xaf\xb7\x53\x0d\xe8\x4f\x71\x30\xae\xa7\x8e\xf0\x05\xd5\xff\xf5\x2f\x8d\xea\xf1\xd5\xe9\xc3\x26\xd3\x21\x7f\xc5\x5b\x94\xf6\x28\xaa\x10\x4f\x6a\x24\xa3\x95\xe6\x2d\x1b\x62\xbd\x9c\x0d\x82\x43\x63\x19\xc5\xd7\x3e\x57\x65\x43\x5f\x3b\xa8\x56\xa4\x73\x4f\xd6\x0a\xe6\x17\xf7\xf0\xc3\xba\x57\x22\xa7\x33\x66\xc8\x8a\x6d\xfe\xca\x85\xc4\x44\x63\x9f\x44\x1f\x2c\x55\xfd\xc4\x64\xec\xb2\x99\xee\xe3\x6d\x8e\xae\x06\x3b\xb9\x4b\xb2\x43\x9d\xa0\x4f\xa5\xeb\xc5\x09\x23\x38\xa5\x03\x5e\x48\x0f\x08\x34\xae\xee\x8d\x71\x1f\x28\xc4\x6d\xc9\x60\xde\x1b\xe9\xdf\x30\x7c\x18\xc5\xc1\x78\xb2\x62\x96\xdc\x56\x7f\x15\xbf\x60\x86\x3a\x36\x71\x08\x67\xe9\x2f\xd5\x10\x48\x86\x56\x74\xc2\xaf\x0c\x53\xb2\xe7\xa2\x48\xae\x5b\xd0\x9a\x49\xaa\x03\x06\x18\x49\x5f\x82\x48\x0c\x42\x0a\xe1\x06\x88\x9b\xec\x00\x62\x78\xb9\x22\x72\x07\x57\x09\xfe\xc9\x54\x87\xcf\xb1\x00\x61\xe6\x72\x2b\x93\xee\xbf\xc0\xbc\x58\x7b\xf7\xba\x5f\x66\x92\xb0\x74\xf5\x5a\x98\xd5\xc3\x02\x76\x0b\x1b\xf1\xd0\x9f\x7e\x86\x68\x47\x9c\xa6\xf0\x1e\xed\xa2\xfd\xaf\x58\x4a\xc2\x05\x8f\xbf\x7c\xf3\x10\x0d\x06\xb8\x09\x1b\xfe\xab\x51\xc0\xc0\xb1\xd4\xee\x3a\x82\x57\xf6\x9b\x16\x17\x60\x4f\xce\x95\x3b\xb5\xf7\xf2\x71\xc6\xa1\x88\x0e\xa1\xb3\xf6\x62\x67\xe2\x43\x9f\x34\x58\x06\x28\x91\x78\x77\xc6\x6e\xc0\xfe\xd7\x6e\x44\xe8\xbb\x2b\x91\xa8\x80\x6d\xf4\xba\xca\x6c\xc9\x28\x89\xb8\x80\x50\x70\xc9\xa6\x17\xf8\x07\x15\x75\x30\x75\x1c\xc1\x7c\x47\xb0\x9e\xeb\xa9\x4d\x22\xb4\xe5\x47\xc3\x70\xce\x7a\x49\x6f\xca\xa3\x41\x2a\xff\xff\xb8\xc9\xb4\xde\x89\xb9\xf1\x21\xaa\xec\x5f\x54\x4b\x0c\x72\x5e\xc5\xee\x9d\x4b\x34\x76\xad\xc9\xd0\x50\xed\xb0\xfd\xba\xf0\x2c\xa9\xe3\x8a\xf1\x5f\x51\x50\x15\xa2\x67\x29\x2e\xc9\xaa\x54\x44\xed\x1d\xec\xd9\xcd\x9e\x1e\xad\x64\x87\xa0\xcc\xef\x99\x5b\x1c\x60\x0a\x03\x69\x35\x83\x86\x60\xac\xab\x27\x6d\x8b\x0e\x5b\x07\xd9\xf3\x63\x53\x21\x4b\xf8\x0f\x94\x1a\xc8\x8c\xf4\x0a\x08\xaf\x91\x79\x26\x23\x41\x12\xec\xcd\xaa\x16\x2d\xc9\x9d\xe3\xe2\x5b\xaf\xf6\x5b\xb0\x1e\x49\x89\x89\x86\x33\x2b\xdc\x2d\x70\x5d\x5a\xea\x40\xf9\xbc\x4f\xbb\x28\x06\x89\x44\x96\x03\x8d\xa2\x36\xe9\xdc\x29\x60\x0c\x9c\xed\xea\xc3\xb6\x16\xcc\x56\xd8\x9e\xc2\xfa\x67\x38\x96\x66\xc6\xc4\xfe\x23\x3b\x63\x91\x05\x02\x3e\x10\x1b\x87\x4a\x63\x30\xfe\x57\x3f\x80\xac\xe5\x5d\x03\x7c\xc6\x12\xe6\xdf\xd5\xa6\xe6\x86\xf9\xa8\x30\x54\xfc\x46\xe1\x5b\xb6\xda\x45\x3d\x81\x0c\xf1\x38\xa1\x78\xbf\x03\x9d\x1e\x18\x16\x14\xff\x40\xcb\xe6\xbb\x3b\x47\x36\x63\x75\x2e\xa8\x02\x5f\xf7\xf7\x39\xee\x4b\x67\x11\x0f\x96\x80\x89\xb2\x47\x3c\xd0\x44\xd4\x8b\x00\x9d\x06\x77\xf7\x91\xf5\x4e\x2d\xf6\xaf\xdc\x3a\xcb\x9e\x99\xdd\x69\x58\xa4\x50\xc0\xe1\xb6\xdd\x5e\x97\xa2\xcc\x46\x29\x8b\x4f\x48\xac\x6a\xda\xf0\x13\xd7\x5b\x2c\x42\x07\x2d\x2e\xe1\x3f\x73\x36\x87\xee\x83\xc3\xf7\x0c\x4f\xdd\x97\x20\xfd\x17\x98\xc6\x62\xfe\xf3\xba\x01\x2b\xed\xd4\x45\xc4\x72\x9f\x21\x30\x48\x4f\xe7\x7a\xc1\xb4\xc4\xdd\xeb\x81\xfa\xf6\x0f\x76\xe3\xbd\x7d\x21\xa9\xa6\xc5\x7a\x69\xa9\xcd\x9c\xc2\x03\xfc\x63\xb5\x9e\xe8\x4b\x89\x15\xb3\xc1\x8a\x59\x54\xe2\x27\xc8\x6e\xbb\xb7\xd4\xc4\xc1\xa0\x8d\x0c\x5e\x46\x7c\x68\xa0\x69\x70\x75\x1e\xf5\x84\xbd\xd6\x11\xe1\xdd\x1b\x48\x90\x0a\xb3\x54\xb9\x9c\xec\x6e\x1d\xf3\xbd\x41\x46\xea\x07\x55\x35\x0d\xc1\x1c\x3a\x3f\x60\x0d\x47\x0a\x74\xf4\x75\xe4\xfe\xed\xaf\x08\x65\x27\x6f\xa8\xa9\x77\x13\x47\x1d\x0c\xa9\x95\x5c\x71\x35\x88\x33\x9d\xee\x79\x65\x6e\x56\x7e\x6a\xb1\xdb\xf9\x83\x07\x03\x81\x7a\xe6\x20\x92\x9a\x06\x84\xa5\xca\xf2\x0f\xef\x81\xa8\xee\x89\x7b\xe7\xe5\x05\xad\xe6\x49\x6b\x9a\xef\x02\x72\xbd\x8f\x35\x08\x60\x23\x3b\x33\x8c\x2e\x36\xd3\x13\x8d\xb6\x95\x38"}, +{{0x52,0x03,0x54,0xd8,0x5a,0x87,0xd7,0xc2,0x2c,0xa6,0xf7,0x84,0x71,0x44,0x10,0xec,0x98,0xbf,0x6a,0x65,0xf8,0x03,0xef,0x93,0x79,0xbd,0xc8,0x04,0x35,0x9b,0x23,0x49,},{0xd8,0x51,0x1c,0xea,0xc2,0xfd,0x66,0x1a,0xcb,0xff,0xb0,0x1b,0xa2,0x74,0x1c,0xad,0x88,0x99,0x34,0xde,0x63,0x92,0x96,0x1b,0xde,0xc6,0xfa,0x46,0x12,0x3b,0x7f,0x0f,},{0x75,0x4e,0x60,0xd3,0xf6,0xf4,0xab,0x4f,0x5d,0x0d,0xdb,0xb0,0x01,0x53,0x20,0x09,0x16,0x63,0x88,0x48,0x7f,0x78,0x0b,0x76,0xf6,0x0b,0xd0,0xbc,0x9f,0xef,0xab,0xfa,0xab,0x6b,0xe2,0xae,0x78,0x69,0x57,0x3a,0x64,0x79,0x6e,0xf2,0x84,0x6e,0x85,0xe5,0xcd,0xae,0x52,0xdb,0x10,0x44,0xfe,0xfa,0x79,0x6b,0xac,0xf4,0x8b,0x96,0x8b,0x0d,},"\xa1\xd4\xad\x48\x6e\xbb\x7c\x1a\x0a\xcb\x8f\x11\x70\x13\xe8\xe4\x74\x67\x89\xc6\x24\x4a\x56\xc9\xed\xfb\xf1\xef\x37\xac\x13\x09\xaa\xf5\x1c\x93\x75\xfc\x12\xca\xcd\x68\x97\xa4\x47\x95\x45\xf2\xbf\x39\x0a\xb7\xc0\xc0\xe5\xc5\x92\xf5\x50\x6e\x99\x38\x37\x8a\x11\xb6\x36\xbf\x85\x70\x29\xb9\x68\x54\x7a\xa5\x06\xc4\xa0\x82\x9a\x15\xfd\x39\x95\xfe\xad\x4f\x86\x0f\xd7\xc6\x23\xc6\x3e\x86\x95\x43\x6e\xae\x55\x81\x64\x14\x77\x83\x47\x09\x2f\x5f\x4d\x42\x2b\xb1\xb5\xe5\xa0\x69\x66\x24\x1e\xfe\xc1\x4f\x1e\x4f\xca\x06\x63\x91\x14\x71\x8c\x30\xeb\xca\xdd\x4c\x6d\x8a\xbe\x7f\xe9\x3b\x25\xd1\x71\x73\x53\x39\x54\x18\x8b\x1a\xb0\x3f\xcb\x77\x92\xcb\x63\x5c\xe3\x6e\x9b\xdb\xdd\xe7\xa5\x61\xc5\xf6\x69\x20\xd9\x10\xcb\x26\x9c\x8c\x1c\x3f\x59\x32\x65\x09\x00\x72\xc4\x89\x32\xe6\x92\xa9\xc7\x38\xc7\x04\x89\x74\x89\xa7\x15\xc2\xb3\x94\xd5\xa8\x6f\x70\x36\xa4\xca\xc5\xdc\xb5\xb8\x5c\xfa\x16\x21\x56\xe0\xbc\x6b\xfe\x02\xfb\x4c\x38\x60\x8c\xfb\x23\xc9\x2b\x8b\x6a\x3c\xb4\x6e\x48\x7d\x60\xe0\xdc\x97\xaa\x2e\x33\xe3\xda\xda\x92\x5e\x4e\x66\x12\xcc\x5a\xf1\x25\xe5\xac\xa4\x58\x17\xa2\xfd\x6c\x3f\xf1\x0b\x18\x93\x8b\x44\xbd\x4d\xd2\x0d\x7f\xcc\xf7\xf2\x6b\x40\xa6\x6f\x48\xaa\xff\xc9\xa5\x41\xe6\xd3\x71\x38\xfc\x55\x46\x98\x68\xe2\xd1\x03\x65\xef\xf3\x7f\xac\x36\x0f\xab\x3d\xc5\x54\x37\xac\x2d\x8f\xea\x74\x74\x40\x5f\xb3\x63\x0f\x79\x63\xd2\xd4\x59\x58\xf9\x09\xd1\x48\x30\x28\x6f\xf1\x52\xaa\x75\x2f\x51\x0c\xe9\x80\xbd\x57\x54\xe3\xfa\x32\xc6\x99\x24\xdd\x95\xd5\xc1\x52\xa7\x37\xa8\xfa\xdc\xfd\x0a\x45\x60\xe0\xb1\x14\xf8\xe8\xaa\xa6\x18\xd4\x38\xb9\x87\x71\x11\xda\x17\x40\xef\x81\x7c\x44\x19\x39\xec\xec\x79\x9b\xa1\x6b\x1b\x17\x1c\xa9\xb6\x49\xb7\xd7\x8f\xa0\x52\xd1\x49\x7a\x50\x76\x88\xbe\xde\x49\x00\xab\xc5\x3a\x96\x48\xda\x59\x17\x03\x5c\xef\xfe\x0d\xa2\x1c\x25\xc0\x9b\x06\xd6\x18\x5b\xdd\xa2\xd7\x78\xf7\xed\xe6\x15\x3e\x3e\xaf\xf4\x95\xc9\x79\x6d\x4d\x16\x6d\x2d\x2e\xa4\x18\xe4\xa4\xaa\x6e\x67\x8f\xaf\x06\x96\xe7\x52\xa0\x9e\x02\xea\xad\xe7\x63\x07\x0e\x08\x8e\x99\x64\x91\x9f\xf4\xaa\x4c\x82\xf8\x62\x9a\x3d\x5c\x79\x7c\x2a\x64\x59\x4d\x20\x68\x35\xda\x0b\xfa\x43\xcc\xd9\xdd\xfc\xdb\x6a\xac\x4d\x48\x6e\x03\xc8\x41\x22\x37\x59\x39\xa5\x27\x0b\xc1\x51\x9e\x07\x07\xe5\x1c\x3f\x46\xf1\xe5\xc5\x66\xb3\x3a\x24\x5f\xa0\xc2\x02\x83\x84\x72\x36\x3d\xe9\xf0\xed\xde\x2e\x79\x1d\x82\x29\x30\x95\xf7\x50\xbf\xf5\x45\xe6\xc3\x47\x39\xdc\xc5\x4d\xb0\xa3\x6a\xe2\xe2\xaa\x39\xb0\x7c\xb4\xf6\xa9\x64\x62\x40\xd2\xd3\x14\x88\xf6\x78\x15\xb2\x95\x45\xd2\x20\xbe\x92\x9e\x33\x39\xf8\x28\x1a\x93\x7e\x05\xa8\xc5\xc3\x88\x7e\x06\x04\x8e\xa7\xb1\x8a\x48\xf8\xd9\x1b\x1e\x3a\xf5\xca\xb5\xce\xda\x0e\xbd\x71\xbf\x54\xed\xec\x20\x3d\x37\x16\x5e\x4c\x9f\x9f\x80\x46\x1c\xd2\x9f\xcd\x99\xdd\xea\x43\x96\x93\x94\x1b\x5d\x53\xff\x94\x37\x9c\xf6\x42\x57\x1d\xd5\x59\xa1\x1f\x8f\x38\x3d\x94\x3f\x22\x55\xcf\x71\x58\x00\xaf\x77\x6b\x10\x45\xbf\x19\xa9\xc9\xbb\x09\x51\x55\xdf\xb6\x46\xb6\x5f\x4a\x28\x0f\x2a\x97\xef\x92\x7d\xda\xbe\x24\xa2\xf9\x71\xa8\x17\x0d\xd4\x2a\x08\x92\x76\x82\x5c\xb9\x14\x8c\x01\x5a\xae\x1e\x9d\xad\xf2\x2c\x10\xe7\x54\x8c\x59\xbf\x6b\x86\x8b\x20\xe8\x6c\x83\xa9\xe7\x34\x3a\xec\x27\x54\xee\x62\x25\xf9\xfd\xce\xaf\x8e\x51\xc4\x0e\x95\x5b\xda\x49\xc3\x5d\xed\x38\xfa\x8b\xcc\x1e\x6c\x8f\xc9\xc2\x41\x2e\x91\x04\xc5\xc2\x36\x8b\x1f\x99\x23\xe0\x10\xfa\x2e\xde\x91\x1d\x42\xb1\x39\xf4\x00\x7e\x34\x26\x92\x2f\xfb\x61\x58\xec\xa9\x7b\x47\xcf\xc9\x97\x85\x35\x12\xbb\x9d\x4c\xa2\xf0\x17\xc2\xc2\x63\xdc\x19\x9f\x3b\xf1\xeb\x4f\x15\x08\xef\x82\x8b\x0e\x00\xdb\x21\x00\x27\x36\xa7\xf2\x2e\xc9\x12\x98\x19\x45\x83\x13\x9a\xd7\x5f\x58\xe2\x1b\x51\x8d\xaa\x49\xa4\x07\x6c\x63\x75\xfa\xa6\x08\x91\xa6\x9e\x52\xa6\x56\x69\x9d\x80\x34\xa7\xab\x7f\xcb\xe4\x21\x75\x49\x14\x41\xfe\x61\xb1\x78\x3e\x83\x78\x57\x52\x22\x15\xa5\xfa\xc5\x59\x0b\xed\x2e\x9d\x20\x66\x06\x09\x6d\x3b\xe8\xee\x92\x87\x3b\xfc\x30\xca\xb1\x5c\xe9\xf9\x91\x0d\x01\xa1\x17\xf8\x99\x26\xcc\x3a\xfa\x8d\x10\x4f\x79\x9f\xf3\x80\x98\xde\x28\xb8\xff\x0f\x03\x87\x25\xc2\x90\x3b\x24\xc1\x42\x9c\xea\x49\x25\x24\x9d\x87\x81"}, +{{0x06,0x1b,0xcf,0x1a,0xa6,0xfd,0x98,0x98,0x97,0xb3,0x22,0xe5,0x91,0xcc,0xef,0x54,0x54,0xef,0x4a,0x5a,0xdb,0x1a,0x48,0x00,0xf3,0x26,0x11,0xcf,0xf2,0xb5,0xbc,0x78,},{0x73,0xc8,0x0b,0x73,0x4b,0xfc,0x94,0x17,0xd5,0x76,0x89,0x0c,0x20,0x16,0x6d,0xa5,0xc7,0xfa,0xbd,0x61,0x3f,0x75,0x47,0x4f,0x76,0x49,0x73,0x2e,0x00,0x29,0x5b,0xe2,},{0x5a,0xda,0xa9,0x43,0x30,0xa0,0x35,0x37,0x12,0xa3,0x4d,0xbe,0x97,0x3b,0x75,0x18,0xf9,0xa2,0xc7,0x13,0xf8,0xaa,0xd1,0x00,0x25,0x1b,0x08,0x6a,0xe8,0xde,0x26,0xf6,0xd2,0xb6,0xcc,0xf0,0x52,0x8c,0xc5,0xde,0xdc,0xa3,0x18,0xdf,0x19,0xcc,0x7e,0x45,0xde,0xae,0x28,0x1e,0x13,0x24,0xb9,0x6e,0x32,0xfe,0xf4,0x5a,0xaf,0x60,0xb1,0x0c,},"\xd6\x3b\xb9\x20\x8c\x1f\x4c\x7d\x43\x32\x6c\xf3\x5f\xa5\xd8\x39\x33\x15\x18\x04\xab\x89\x1d\x49\xb0\xbd\xaf\x42\x9e\x4c\x39\xa3\x21\x42\x8e\x0d\x90\xaa\x00\x31\x8b\x97\xe0\x8c\x70\x24\xc9\x12\xcf\x38\x88\x79\xf3\xcf\x97\x4b\xb2\x53\xa1\xe7\xa4\xc8\xee\xc1\x93\xbf\x4c\x14\xaf\x6f\xb9\x79\x4d\xf0\xd4\x97\x85\x0e\xdb\x04\xd5\x74\xc9\x7e\xd7\x6c\x70\x21\x39\x96\x84\x01\xb4\x0e\xb5\x43\x94\xef\x4c\xfa\xa7\xe5\xd3\xcd\x94\x3a\xf1\x21\x92\x53\x8d\xde\xe5\x93\xc2\xa2\x4a\x26\x7a\xfa\x13\x71\xfd\x77\xfe\xee\x20\x71\xf4\x36\x9f\xbe\xf8\x79\x76\xe7\xeb\xd8\x1d\x1e\x5b\x31\xd6\xe0\x9e\x02\xd8\x30\x35\x7d\x36\xbf\xf8\x59\x67\x03\xe4\x14\x6d\x08\x27\xbe\xc9\xc0\xf8\x7b\x26\xf3\x11\x95\xc9\x6c\x93\xb6\xd8\xc4\x67\x67\xec\x1b\xc6\xde\x39\xf0\x00\x8a\x41\xff\x87\x5d\xa0\x50\xa3\xf8\x65\xab\x92\xcb\xf2\x9c\x38\xa2\x80\xf3\xbf\x69\xf6\x8e\x92\xb5\xf4\x30\xcd\xee\x35\x01\x98\x1d\x0b\x3d\x18\x90\x96\xe0\xae\xac\xd6\x4c\x33\x10\x24\x21\x34\x88\x12\x15\x8b\xb6\x1e\x51\xae\x93\x65\x92\xb2\xf8\xf1\xb9\x10\x94\x9e\xf3\x72\x32\x58\xa9\xb4\x4e\x4e\x1b\xda\xdf\x1a\xe2\xcf\xc1\x8e\x37\xd2\xed\x0d\xd1\x73\x44\x04\xb8\xba\xa5\xf3\x93\xcd\x56\x06\x9e\xce\xbf\x7e\xdd\x7c\x06\xcf\x6c\x8a\xa3\xe8\xe1\x2f\xbf\x94\x6d\x7b\x32\xd8\x45\x3b\x6f\xbb\x65\x35\x52\x6c\x8f\xb8\xfc\x1d\x58\x15\x56\x0b\xb3\x1b\x99\x5d\xf2\xad\xbd\x83\x6a\xdd\x92\x9a\x56\xfd\xd9\x3a\x17\x47\xd9\x3a\x40\xc0\x5e\x12\x9e\xb6\xf8\x58\x3c\x29\x21\xcc\x9d\xbd\xda\x42\x25\xe1\x76\xdb\x38\x6a\x02\xec\x40\xaf\x10\x32\xc9\xb6\x2e\x95\x14\x70\x25\xf4\xac\x8d\xd5\x84\x33\xb6\x4a\xc0\x73\x15\x0c\x69\xb9\xc4\x15\x4d\xcb\xb0\x03\x44\xf3\x08\x11\x3c\xd9\x19\x9c\xcf\xb5\x07\x58\x01\xc7\x05\xb8\xfc\x43\xb7\xc8\xbc\x16\x73\x65\xe4\x62\x93\xd0\x6c\x4f\x48\x35\xc6\x4e\xe5\xd5\x38\x3f\x68\x90\xca\x35\xa8\x0a\xf9\x17\x74\x81\x62\xdf\x25\x18\xab\x14\x68\xf1\x53\x62\x98\x99\x40\x6c\xde\x66\xce\x07\xfa\x7d\x29\x93\xda\xbe\x0c\x60\x08\x9c\x91\x89\x24\x88\xf3\xbc\xaa\xec\x40\x8a\x0c\xd0\x8c\x9a\xa9\x8e\x09\x37\xe0\x2c\x41\xad\x52\xd2\x41\xa9\x98\x33\xe3\xb8\x3f\x7d\x3f\x1b\x07\x8c\x31\xd4\x5c\x34\xfa\x01\x75\xab\xbd\x0f\x32\x2b\x8f\xd2\xdc\x83\x49\x1d\xa2\x92\xad\x00\x76\x2e\x3e\x57\x7b\x9e\xee\x0a\xae\x08\x72\x90\x70\xac\x25\xe3\x3b\xc9\x45\x25\xbc\x0d\x2a\xb5\x97\x04\xef\xec\x5c\x01\x48\x42\x1a\x47\x92\x8d\x34\xb1\xe4\x5c\xe7\x21\xee\x64\x47\xfb\x08\x2a\xc4\x00\xb3\xe6\x84\x6d\x20\x4f\x7f\x9d\xb6\xf0\xa3\x2b\x2a\x69\x73\x8b\x3e\xe9\xdd\xbb\x0d\xbd\x7e\x0f\x04\x1d\x7e\xa5\x3a\x5d\x64\x7f\xb5\x0b\x39\xae\x24\xd7\x8c\x8b\x07\xcf\xc4\xe0\x52\x71\x1f\x0d\x46\x39\xe7\x21\xd5\xc3\x6f\x31\xb5\x88\x86\x67\x12\xb7\x57\x10\x8a\x40\xcc\x7a\xbb\xb9\x91\x30\x83\x30\x3a\xae\x05\xa0\xf1\xaf\x0e\xc6\x87\x84\x41\xa2\x5c\xf8\x72\x9a\xba\x42\xa3\xa9\x4c\xe9\xb7\x38\x88\xa0\xf5\xc9\xe4\x0c\x9f\xc4\x54\x10\xf0\x68\x1f\xa7\xf9\x08\x98\x56\x2c\xcb\x4b\xbc\x55\xf0\xab\x1f\xe9\xc7\x0e\xa6\x60\x26\xdd\xa8\xd7\x09\x0f\x7b\x38\xed\xb5\xae\xc1\x55\x7b\x11\x66\x98\x7c\xd4\x1a\x70\x59\xcd\xee\x60\x9b\x74\xd8\xfe\x06\xb7\x05\x9b\x77\x24\xbf\xf5\x30\x07\xf7\xe1\x10\x46\x2f\x06\xad\x14\xd0\x7e\xe1\xb4\xd6\x9a\xc8\x23\xbc\xf5\x76\xd2\xfa\x9e\x2e\x8e\xd7\xf3\x19\x80\x40\xd4\x71\x29\x60\x63\x13\x7c\x98\x1a\xdb\xf3\x64\xcb\x20\xf0\xa1\xad\x20\x54\x47\x2f\x7c\xee\x25\x27\xf9\x98\x09\x61\x5d\x2e\x4b\x73\x4b\x06\xf3\x5d\xee\xcb\xd6\x26\x19\x66\x3d\xde\x81\xd6\xe2\x35\x28\xb0\xc9\x71\x32\xaf\x0a\x23\xba\xd6\x3d\x9c\x08\x14\x2a\x26\xe2\x74\x3f\x86\x18\xec\xfe\x72\x3b\x19\xff\xdd\x0b\x19\xab\xd9\xa3\xf4\xfe\x21\x0b\x1e\x71\xac\xdf\xe3\x8a\xbe\xbe\x23\xf7\xfd\xef\x66\x38\x1c\xbc\x75\xf3\x07\xe5\x57\x72\x35\xb0\x2e\x4c\xd9\xcf\xaa\x15\x03\x08\x68\xed\x14\x53\xda\x58\xf7\x83\xb7\x35\x2b\x04\x65\x68\x44\xc0\x42\x44\x1e\xfe\x6a\x3b\x4f\x8f\xec\x8f\x7d\xe8\x07\x44\x54\x0c\x4f\xc7\xa1\x07\xf4\xe1\xbf\xcb\xd9\x9d\xa2\x5b\x97\x46\x09\x5d\xdf\x01\x25\xd5\x6d\xa7\xe7\xf8\x60\x3f\x04\xd3\x59\xa0\x88\xb4\xc0\x44\xf9\x36\xcc\xb7\xd8\xf8\x9e\xd5\x3c\xc9\x91\xa3\x49\x7c\xa9\x52\x09\x4f\xf3\xc3\x30\x46\xf2\x60\x9d\x07\xb2\x9b\x63\x39\x81\x36\x9c\xb2\xf0\xee\xcd"}, +{{0x2e,0x19,0xcd,0x44,0x2f,0x22,0xa4,0xa9,0x9d,0xff,0xc5,0x5e,0x7b,0xf6,0x25,0xf8,0x9d,0x13,0x44,0xb5,0x63,0xf6,0x78,0x53,0x13,0xa7,0xee,0xe9,0x73,0xb4,0xaa,0x36,},{0xee,0x3d,0xa7,0x6a,0x8f,0xcf,0x40,0x3a,0x29,0x58,0xd4,0x55,0x1d,0xa0,0xa7,0x2b,0x2e,0x73,0x85,0x22,0xb2,0xe6,0xb2,0x0f,0xba,0x6a,0xa2,0x6b,0x32,0x30,0x73,0x57,},{0x28,0x32,0x6b,0x5b,0x97,0x8e,0x0d,0xbd,0xab,0x5d,0xde,0x70,0x37,0x85,0xa6,0x67,0xa7,0xef,0x43,0x9d,0x81,0xea,0x47,0xe0,0x66,0xb0,0x89,0xd1,0x16,0xc2,0x5a,0x34,0xbb,0x63,0x3f,0x26,0x0d,0x55,0xf4,0x5b,0xdf,0x6b,0xcd,0xa7,0x48,0x03,0xd7,0x62,0x4b,0x19,0x27,0xce,0xc1,0x8e,0xb1,0x99,0x22,0x60,0xbe,0xef,0xc3,0x99,0xd9,0x0e,},"\x1b\xfc\x5c\x6a\xa6\xa5\x35\x4f\xbb\x86\x14\x69\x79\x63\x48\xac\x63\x19\x12\x4d\xa3\xf1\x0d\x20\xd5\x0b\xbd\xc7\x15\x9d\x41\xb5\xab\xb1\x36\xc7\x99\x6a\x77\x37\x97\x12\x2b\x52\x5e\x8e\x2d\xca\x19\x54\xf6\x39\x17\x07\x30\x1d\x90\xf2\x10\x1b\x46\xc7\xb0\x86\xef\xa1\x58\x77\xca\xdc\xd0\x58\x12\xdb\x34\xb9\x96\xcb\x4f\x53\x1a\xbc\xd1\xe9\x8d\xb0\x8a\x5c\xf1\x36\x8e\x8f\x4b\x11\x09\x14\x2e\x95\x62\xbd\x00\x85\xff\xae\x5e\x66\x0f\x59\xc9\x30\x79\x3e\xbd\xb6\xe8\x0b\x0a\x2f\x4f\x3f\x59\xbf\x9d\x39\x5c\x48\xd2\x6e\x0a\x72\xa6\x0f\x9d\x1f\xf8\x7f\xd2\xd7\xa3\xf5\x38\x3a\xa9\x02\xad\xed\xed\xeb\xc6\xcd\x1b\xef\xd0\x38\x33\x61\x62\x74\x9d\x91\xa9\x57\xca\x2e\x3d\xd4\x70\x91\xc5\x59\x31\x13\xda\x87\xc3\xd6\x6a\x02\xc8\x0a\x6e\xdd\xb5\x35\xc4\x8c\xa1\xf3\x4a\x97\xfd\x1c\x95\xeb\xc2\xe5\x70\xfc\x8f\xaf\xe6\xe5\xd6\x54\x6d\x1f\x3a\x9b\xa8\xda\xac\x33\x4c\xf4\x7b\xf1\x17\xe1\x28\x0d\x0e\xbd\xf1\x4b\x0f\xcd\xbb\x43\xb8\xd2\x48\xcc\x6b\x61\x32\x0f\xdb\x04\x49\xed\x5f\x5d\xe8\xba\xb1\x21\xaf\x0d\x85\x54\x95\x6e\x6a\x12\x01\x6b\x42\x67\x7b\x44\x36\x78\x92\xc3\xb2\x0a\xfc\xc2\xcb\x9c\xfb\x5b\x10\x0a\x95\xb5\x1e\x8b\x07\xda\x9f\x51\x41\x5f\x4c\xd7\x78\x1a\x31\x37\x65\xe2\x0d\xb2\x7f\x23\x43\xe0\xf7\x19\xec\xea\x9a\xf0\x26\x95\x6f\x33\x87\xe9\xea\x7e\xd0\xa2\x93\x75\x9b\x4a\x26\x22\x02\x80\x7b\x41\x30\x9f\xb8\x0f\x50\x18\x5d\xb6\xa5\xf8\xbd\xca\x17\x88\x41\xbe\xc0\x6a\xdd\xc7\x61\x0d\xf7\x60\x17\xb5\x14\xbc\x41\x42\xf2\x6a\x36\xbf\x5b\xac\xec\xb0\x12\xfa\x41\x71\x0d\xd8\x49\xbe\xf7\xa7\xe4\x51\x43\x28\x36\xfe\x9b\x32\x65\xfd\x5b\x59\xee\x40\xb0\x4d\xad\x85\xcf\x48\xf8\x91\x46\x5a\x84\x2c\xd4\x50\x0a\x10\x24\xee\xfd\xf0\xf5\x54\xf0\xca\x17\xec\x9f\x7b\x71\x52\x56\xa9\xb9\xdb\xe2\x79\x66\x38\x6d\x8a\xc3\x7d\x3c\x51\x58\x96\xde\x0f\x7c\xdf\x7c\xf5\xb3\x20\xff\x7a\x8e\xf6\xb3\x4b\xa8\x20\xab\xa9\x06\x6d\xd2\x53\xc5\xb7\x76\x37\x77\xf9\x4b\x2d\x6a\xd8\xc7\x10\x22\x1e\x11\x37\x53\x5d\xff\x8a\x1b\x75\x65\xec\x81\xbd\x8d\xde\xb5\x02\xe3\xd5\x8f\xf8\xf1\xfe\x6e\x86\xb8\xdc\x15\xa3\xaa\xec\x68\x8b\xbb\xec\xd4\x68\x82\x81\xdb\x0f\x81\x8d\xe0\xf7\x26\x1b\xa9\xcc\x58\xc8\xbc\x0d\x02\xe0\x66\x32\xef\xe7\x28\x7a\xd7\xa8\x43\x31\xa8\x24\xd9\x28\x73\x44\xef\xaa\xa7\x4f\x1f\xc5\x76\xd0\x26\x94\x30\xf8\x56\xa8\x56\x52\x65\xb9\xd6\xef\x71\xfe\x13\x4d\x25\x10\xab\x06\xb6\x0b\xf3\xc1\x53\xb5\x7e\xcf\xd2\xe6\x34\x24\x03\xfe\x67\x8b\x58\x86\xb6\xb7\x34\xb7\xd3\x69\x06\x62\xb6\xc8\xc6\xf6\xe2\x50\xe5\xaf\x6a\x81\x83\x16\x6d\xdc\xd0\xa1\x7f\x0c\xdd\xc8\x63\x6e\xf1\xa6\x84\x98\xbe\x50\xb6\x59\x95\x39\xd4\x6b\x4c\xea\x97\x13\x0e\x08\xf9\x4c\xa5\x3e\x88\x46\x44\xed\xa7\x5d\x23\xcd\x2c\x03\x8a\x5f\x17\xb5\x91\xe2\x13\x69\x37\x8c\xd3\xfb\x57\x62\xd1\xa7\xc3\xe6\x6a\x11\xae\x6e\x91\xcb\xae\x61\x6a\xd0\x55\xe3\x9d\xc4\x1e\x15\x4f\x4f\xce\xd7\xb2\x69\x6d\x9d\xc6\x73\x80\xbb\x8e\xef\x47\x4e\x9a\xa8\x3c\xec\x47\xfa\xfa\xfb\x94\x1d\x62\x65\x64\xb2\x07\x5b\xcc\x08\x56\xda\x8d\x6e\x1b\x0b\x8f\x18\xba\xf7\x51\x3b\xbd\x14\xe4\x91\xed\x51\x79\x68\xc4\xf7\x24\x1a\xf2\x50\x98\xee\x8d\xf1\x30\xb7\xa3\x4d\x59\x73\x6d\x78\x36\xd3\x23\xfe\x3f\x43\xf5\x08\xcd\xcb\x75\x58\x95\xf5\x9a\x00\xc8\x04\xed\x16\x4c\xc3\x39\x92\xf3\xae\xe9\x62\xae\x9e\x99\x0b\x74\x27\x2e\xb9\x87\xb1\x2d\x90\xb2\x73\x14\xd5\x74\x00\xe7\x37\xd1\x34\x3e\x97\x09\x85\xc4\x27\x10\x60\x87\x6a\xbc\xd7\x04\x9e\x7c\x9f\xe2\x44\xff\x3e\xf9\x85\x60\x99\x5b\x74\x82\xd3\x1b\xc7\xc0\x9d\x99\x69\xf7\xcd\x41\xf4\xe4\xe2\x52\x75\x0d\xc1\x6c\xcd\xb2\x9b\x98\x53\x14\xa0\xb6\xe7\x49\xc9\x5f\x9b\xd2\x83\x8d\x5a\xc4\x9e\xe0\x31\xfd\x07\x9b\xec\x30\x28\xdd\x9d\xd0\x7d\xb6\xfa\x62\x2a\xd6\x21\xb3\xb1\xe1\x27\xe8\xfc\xa3\x7b\xd1\x46\xe3\xcf\x70\x3e\x91\x17\x01\xb7\xa1\x6c\x2d\x30\x36\x9c\x94\x64\x8e\xcc\x03\xdf\x10\xd7\xdd\x5c\x05\x58\xfa\x95\x93\x42\x5d\x94\x87\x27\xd6\x86\x0c\x3a\x14\xf8\x11\x24\x51\x06\x61\x6d\x2a\x5f\xa9\x81\xc6\xb7\xf4\x7e\xc9\xde\xf6\x54\x12\xd1\x32\xac\xc6\x91\x9d\xa4\xe8\x85\x97\xaa\x91\x90\xca\x61\x4b\x21\x80\x66\xa0\xf7\xb1\x69\x97\xee\x74\x7c\x5a\x09\x78\x5e\x50\xd0\xa8\x91\xd9\x59\x37\x86\x3d\x61\x3c\xef\xf7"}, +{{0x82,0x10,0x90,0x99,0xd1,0xea,0xfe,0xed,0x5a,0x85,0x20,0x60,0x46,0x49,0x1b,0x34,0xd0,0x6d,0xcd,0xe3,0x3f,0x08,0x09,0x60,0x28,0x7b,0x10,0xfb,0x23,0xff,0x9f,0x78,},{0x08,0x1c,0xfd,0xf2,0xd7,0x58,0x65,0x4c,0x41,0xc4,0x47,0xe1,0xe6,0x27,0x38,0x10,0xf8,0xa7,0x38,0xa7,0x33,0xaf,0xc4,0x22,0x94,0xa2,0xb1,0xbb,0xb7,0x69,0xef,0xce,},{0xb3,0x98,0x7f,0x32,0x4b,0xc7,0xe7,0x76,0xc0,0xf2,0x87,0xfa,0x13,0xad,0x28,0x74,0x16,0x95,0xe2,0xe7,0xbc,0xe8,0xd1,0x43,0xe2,0x9f,0xad,0x5d,0x00,0x99,0x47,0x58,0xe2,0x25,0xfb,0x80,0x21,0x00,0xd2,0x3f,0xd6,0xcc,0xaf,0xee,0x8e,0x0a,0x95,0xbc,0x47,0x9b,0xe8,0xc2,0x3a,0x11,0x31,0x97,0x45,0x76,0x5b,0x7c,0xd4,0x7e,0x70,0x06,},"\x84\xf4\x7d\xd7\x94\x97\x7a\x6c\x15\x05\xac\x8c\x05\x68\x0c\x56\x15\xa2\xd5\xb0\x57\xe3\x9b\x04\xf8\x5e\x3f\x9f\xf0\x49\x60\xe0\xe0\x16\x68\x5a\x86\xee\xbc\xec\xf6\xfb\xce\x5f\xdd\xcd\xac\x1a\x47\x4c\x8a\x0d\x50\x2c\x40\xe1\x0f\x94\x86\x46\xfd\xac\x6c\x81\xf1\xff\xbb\x17\x7a\x2a\x49\x63\xb6\x78\x25\x90\x3c\xde\x65\xb5\xdb\xe0\xd8\x94\x1d\x54\x6c\xff\xa2\xbf\x8a\x8c\xa8\xd6\xc6\x40\x85\x30\xa6\x29\x0f\x5d\x08\x82\xf1\xa1\x67\x2d\xbf\x97\x8e\x10\xc5\xc8\xaf\x5e\x0a\x62\x39\xf0\x65\x5e\xe7\xfd\x9e\x66\x96\x30\x77\xa0\xe8\x47\x13\x73\x97\xd1\xf0\x69\x99\xdc\x6f\x8a\x94\x5c\x60\x03\xea\x4e\xa7\xfd\x58\x37\x8a\xcb\x44\xed\x57\x80\xea\xa3\x67\x79\x6b\xee\xa3\x7d\xdc\x23\x69\x99\xd0\x12\xd6\xa7\x16\xd7\x91\x56\x49\xcc\x28\xe5\x88\x75\x64\x7e\x9f\x5a\xc0\x55\x3c\x0f\x54\x4d\xf5\x64\x69\xc6\x70\x81\xd5\xe3\x03\x95\xf3\xe9\x60\xe6\xa5\x2f\x08\x33\x19\x2c\x54\x8c\xd5\x7c\x92\x6b\x82\xdb\x48\xc3\x61\xbd\xe7\x03\x33\xa3\x70\x08\x3e\xaa\xa0\x68\xdc\x2a\xe4\x52\xd2\x1e\xf1\x33\x1a\xed\x19\x0b\xd3\xe1\x28\x9a\x10\x4c\xf6\x67\x83\x43\x77\xcf\x7b\x5a\x29\x77\x48\x07\xc3\xf1\xea\x9e\x7b\x28\x83\x1d\x0f\x6c\x42\x94\x78\x58\x67\xb1\x37\xb6\x50\x28\xc1\x4f\x93\x2a\x1b\xa8\xe6\xf9\xf5\x96\x24\xfe\x0c\x39\x68\x43\xea\x19\xe4\x6f\xba\x09\x14\x2c\xf9\xd4\x24\x97\x31\x2f\x36\x02\x44\x03\x2f\x1e\x00\xf3\x8d\xd0\xde\x29\xf9\x63\xb5\xcc\xc1\xef\x12\xb2\xcc\x62\x04\xb9\x94\xaf\x1f\x3b\xaf\x19\x6d\x9e\x21\xe8\xfa\x4f\x09\x73\x20\xc6\x44\x04\xd0\xb7\xd5\xab\x38\x56\x0c\xa0\x65\x53\x64\xb0\xb0\x9c\xd6\xdc\x0f\x0e\x05\xb8\xc9\x11\x03\x64\xf1\x42\x4a\x96\x72\xb7\xef\xdf\x7e\x1f\x37\x8e\x23\x45\x50\x56\x6d\xbe\x13\xb0\x15\x78\xb0\x41\x53\xe9\xc3\x7b\x55\x3e\x32\xa4\x44\x1b\xc9\x7e\x29\x53\xbe\xc2\xe4\x14\x55\x51\x0f\x98\x02\xef\x94\x8d\xcb\xf1\x3f\xad\xdd\x72\x2e\xde\x57\x36\x27\xb2\x58\xd5\x5e\x83\xc0\x89\x5b\x22\x91\x9e\x4b\xe5\xce\x8d\x81\x9c\xe6\xad\x84\x3b\x2d\xd0\x9d\xf6\x40\x04\xc8\x26\xc1\xdd\xe7\xce\x64\x80\xa2\x71\xa8\x58\xa1\xdb\x16\x9e\x14\x94\xd4\x46\x90\x32\xbc\xc1\xcc\xd8\x96\x53\x19\x8b\x7c\x07\x3f\x76\xa2\x6a\x29\x99\xb5\x64\x8c\xba\xdc\x15\x74\xc7\x8e\xad\x8e\xec\xe8\x3b\x91\xe1\x29\xc4\x37\xf9\xee\xec\x04\xc8\x07\x45\x90\x02\xe6\x6d\xcc\xa9\xbf\xc2\xca\xed\x9e\x6c\x0b\xa2\x3d\x23\x55\xde\xf7\x56\x65\x74\x94\x30\xee\x92\xc5\x32\xa6\x95\x47\x9f\xec\x92\x91\x74\xf4\x40\xec\xb6\x1a\x5a\xe8\xb2\xb7\xe9\x58\x92\x05\x58\x26\x89\x78\xf7\xfb\x4d\xa1\xb3\x8b\x12\x01\x4f\x5d\x61\xb0\xfd\xd7\xf6\x13\x6b\xa4\x28\x1b\x41\xa3\xa3\xcd\x18\x80\x52\xb6\x98\x76\x5b\x6f\x05\xe4\x1e\x78\x37\x3e\xa8\x30\x46\x97\x87\xa3\x75\x10\x99\x3d\x12\xf9\x3e\x96\xc7\x2d\x72\xf4\x46\x19\x84\xf6\x91\xa4\x1c\x7d\x33\x97\xdd\xd5\xa1\xb3\x92\x37\xd1\x30\x88\x64\xd4\x15\xfc\x6c\x22\xb6\x3f\x37\x6c\xed\xde\x37\xf5\x25\x2b\x51\xec\x72\xe5\x15\x5f\x3b\xdb\x4f\xcd\x54\x12\x49\x8b\xd2\xe0\xc1\xf9\x85\x0b\x3a\x85\xd1\xdf\xd2\x51\x67\xa3\xcd\x77\x1e\x8e\x4c\x9d\x86\x8c\x95\xa7\x17\x5e\x37\x75\xf6\xce\xf1\x7e\x4e\x36\x49\x7c\xe9\xe4\x55\x32\xbd\x7f\x44\xb2\x77\x6e\x40\xf9\x1a\x07\xca\x4f\xa1\xb9\x5d\xbe\x81\xcf\x8f\x49\xe4\x6b\x6c\x82\xa6\xee\x43\x47\x91\x8a\x76\x43\xb0\xd9\xa3\x88\x57\x21\x2c\x69\x3e\xad\xac\xfd\x37\xa5\xf1\xd9\x15\x58\xf5\x45\x4d\xcd\xd0\x59\x35\xf2\x90\xe6\x2d\x7e\x65\x00\x6c\xd5\x49\xf6\x55\x3c\xe7\x41\xdf\x44\xd3\x96\x44\x00\x1e\xb4\x79\xca\x69\x56\x8a\xd1\xf2\x3b\xba\x09\x9a\x41\xa4\x72\x94\xdb\x93\x87\x31\xc5\x30\xaf\x1c\xeb\x92\x17\xd2\x9b\xc2\x70\x56\x13\xc1\xa1\xfe\x9c\x20\x8d\x0b\x01\xba\x6f\x4d\x9b\x4c\x7b\xa8\xf0\x21\xdf\x91\xea\x2d\x57\x8c\xe0\x83\x12\x3e\x83\xba\x4b\x9c\x50\x40\x7f\x66\x66\xfb\xe6\x11\x58\xb0\xd1\xb9\x57\x77\x72\xe3\xea\xff\x8f\xb4\x29\xd0\xf6\xd2\xe3\x84\x12\x61\x30\xf2\x1b\x44\x9f\xb1\xdc\x17\x0d\xb4\x5a\xf5\x05\xbd\x31\x82\x67\x8a\x9b\x5f\x9f\xdf\xf6\x5f\x04\x13\xb6\x72\xc4\x78\x63\x40\xfc\xf2\x52\x2e\xa7\xf3\xd8\xad\xe8\xa0\x59\x52\x96\x49\xdb\xda\x9c\xe5\x1f\xf0\x5a\x2a\x2a\x3d\x66\xd2\x16\x6b\xf2\xc9\xc6\x77\x2b\xa0\xef\x41\x05\xe6\x8c\x05\x5e\x02\x13\xd4\x2c\x1e\xe1\x23\xb3\xc1\x21\x78\x43\xe6\xec\x57\x5d\x75\x4d\xf3\xc9\x0a\x75"}, +{{0x65,0xfc,0xbd,0x62,0x6d,0x00,0x21,0x11,0x33,0x4b,0xaa,0xd4,0xe6,0xa8,0x00,0x6e,0x47,0xa1,0xf9,0x13,0x97,0xbe,0xe6,0xdd,0x6c,0xd7,0xda,0x5a,0x0e,0x02,0x48,0xa4,},{0x20,0x40,0x9a,0x14,0x6b,0x42,0xc9,0x6b,0xea,0xb0,0xb4,0x2e,0xa7,0xf2,0xc2,0x51,0x93,0x11,0x9d,0x0d,0xf4,0x4d,0xc2,0xbf,0x14,0xd1,0x1a,0x32,0xfd,0x73,0x36,0x15,},{0xbc,0x78,0xe1,0x6b,0xa6,0x74,0xe0,0xa7,0xdb,0xa5,0x7a,0x19,0x09,0x4f,0x97,0x33,0xc5,0x5d,0x74,0xb9,0xd1,0x5f,0x8a,0x44,0xd1,0xbb,0xc0,0xa0,0x23,0xf7,0x01,0x55,0xde,0x29,0x77,0x11,0x1a,0x41,0x7e,0xef,0xa8,0xcb,0x30,0xec,0x12,0xab,0xc8,0x38,0x42,0x28,0x16,0x7c,0x70,0x98,0x2a,0x82,0x06,0xb1,0xff,0xb7,0x21,0x74,0xaf,0x01,},"\xe4\xc0\x94\x7f\xc8\xca\x78\xfa\x88\x63\xf4\xd0\x44\x49\x9d\x03\x6e\x2e\x7e\xf8\xc1\x7e\x83\x8f\x2f\xac\x02\x67\x5b\x7b\x53\x81\xe5\xf9\xab\xce\xaf\xd0\xd8\x88\x6a\x92\x9d\x9d\x9b\x49\xfc\xb7\x38\x61\xb2\x9d\x15\x18\xac\x5f\x83\xf7\xf8\xfc\x26\xbd\x1c\xeb\xc2\x2d\x87\x3a\x9a\x08\x23\x14\x06\xfb\x03\x2e\x48\x66\xe5\xf5\x5c\x7c\x04\x41\xc5\x19\x04\x1b\xb2\xcc\x73\xf9\x22\x6d\xd5\xd0\x7e\xce\xb6\x60\xd6\xc9\x67\xdb\x23\x36\x55\x74\xbe\xe8\xfc\x10\x22\x29\x28\x76\x77\x13\x57\x1a\x71\xc9\x3a\x85\x27\x8d\x42\x29\x9a\x70\x59\x9c\xa9\x93\x26\xcc\x86\xf6\xd9\x8d\xaa\xc0\x00\xfd\xfa\x71\x05\x62\xf4\x81\xfa\xa0\x20\xc7\x2a\x76\xe2\x06\x7d\x15\x4c\x23\x5a\x7a\x4f\x29\x70\x8c\xc5\x44\x53\x3b\xd7\x99\xed\x63\x63\xeb\x3b\x56\xaa\x4a\x6d\x0e\x37\x9b\xbf\x07\x60\x05\x95\xc2\x3a\xb1\xf3\xf9\xf1\x70\x8e\x00\x70\x26\x1b\xbb\xf4\xbf\xea\xf6\xd6\xce\xd4\xd7\xff\x72\x2c\x9c\xc5\x2d\x91\x33\xea\x68\xd4\x95\xdc\x94\x89\xc3\xed\xf6\x83\x02\x31\x35\x1f\x65\xcb\x52\x72\xf5\x39\x6e\x2c\x4a\x1a\x5c\x88\x66\x1a\x10\x18\x92\x24\x9e\x23\xd6\xce\x9f\xdb\x6a\x9a\xbf\x74\x27\x2c\x2f\x59\xc3\xd8\xfd\x87\x43\xcc\xe4\x61\x12\x6c\xa0\xa8\xb8\x32\xb4\xb2\x18\x33\x6b\x1a\xe1\x4d\xa6\x77\xba\x7f\x1b\x2c\xc5\xca\x3c\x71\x58\xf7\x27\xa9\xe1\xb8\xfd\xd9\xed\xf5\xc2\x18\x7f\xcb\x83\xdb\x86\x2a\xd0\xc6\xb3\x92\x16\xde\x31\x16\x91\x95\x56\x46\x51\x00\xad\xe0\xa4\x2b\xd6\xba\x10\xd9\x54\x18\xb6\x9a\x3e\x00\x5e\x9f\x10\x45\x89\xea\x59\x48\xb2\xb5\x1b\xc7\xb1\xa9\xa0\x74\x9d\xa8\xf0\x13\x78\x1b\xc0\x5c\x80\x5b\xb5\x1e\x18\x77\x61\xac\x24\xc7\x64\x14\xf6\x68\xeb\x45\xfb\x0a\x50\x24\xdf\xe5\xa5\xca\x06\xf0\x40\x3a\x02\xe3\xb2\xfe\xf7\xa2\xc4\xbc\xfb\x1d\x07\x5d\x31\x0d\x51\x97\xe6\x59\xcd\x14\x02\x3f\xae\xc2\x0e\x04\x5c\xab\xcb\x86\xb2\x21\xa1\xd4\x82\x71\x13\xff\x32\x67\xa6\x4d\xeb\xe9\x93\x90\x04\xca\xba\xc8\x5e\x5c\x74\x61\xe7\xe8\x2a\x97\x5a\xcf\xae\x0b\x6c\x51\x6a\x1c\x60\x53\x74\xcf\xea\x7d\x81\x90\x44\xef\xd6\xd7\x46\x54\x42\x4f\xd5\xc9\x0f\xf2\x57\x4f\xcd\x8e\x00\x77\x40\xd9\x75\x86\x1d\x0d\xf5\x25\x9f\xe4\x3e\x43\x63\x9e\x36\xe5\x28\x95\x43\x9b\xa2\xc2\x7c\x1e\x88\x9c\x93\x09\x41\x04\xfe\x91\x49\x21\xbd\x6f\x25\xd3\x98\x5a\xb1\xf2\x2c\xa5\x57\xb0\xe4\x9a\xfc\x73\x75\x24\x3c\x52\x1c\x6d\x5f\xaf\xe0\x38\x1c\xce\xa8\x28\xe8\x8e\x64\x7f\xd9\x09\x76\xb3\xfb\xec\x19\xfe\x9a\xdb\x11\x3c\x64\x04\xbd\x35\x2b\xfc\x00\x04\x46\xd2\x10\x05\xb5\xf9\x50\xae\x07\xe5\x1c\x76\x8c\xa3\xff\x61\x77\xb2\xea\xc5\x0f\x10\xdd\x2e\x64\x61\x0f\xa8\xab\x57\x88\xfa\xee\xe2\x9d\x12\x90\x09\xd7\xfe\x46\xaa\x3d\xa6\xb9\xd8\x6c\x73\x06\x5e\xb5\x16\x1f\xbd\xbd\xfa\xc5\x77\x7c\x4e\x75\x45\x2e\x6e\x16\xae\x9f\xd6\x6b\xb7\xd9\xaa\xa4\x26\xbc\xb7\xa6\x91\x5f\x0f\xf4\x4a\x1f\x8e\xc7\x13\x94\xe9\x35\x2f\xdf\x20\xe0\x2f\xaf\xe1\xe0\xce\xfe\x50\x74\x4c\x31\x94\x95\x6f\x92\x8f\x82\x53\x37\x55\x37\x38\x38\xdc\xc1\x29\x6a\x89\x1a\xdf\x64\x1c\x73\x82\xd6\x9b\x4f\x5a\x43\xd4\xaf\x77\x72\xa4\xa1\xee\x87\x92\x92\xd7\xa4\xf3\x2a\xc3\x5e\xe1\x21\xc6\xc3\x4c\xa5\xf9\x84\x87\xa9\x41\xfc\xb1\xe6\x5b\x44\xd4\x45\x61\x27\xee\xdb\x2f\xcc\x1c\x3f\x48\xef\xf9\x30\x09\x81\xe5\x2a\xc3\x8b\x49\x6a\xb8\xbb\xce\x14\x4a\x85\xeb\x9c\x07\x63\x8b\x31\xfd\xaa\x78\x17\x44\xbc\xe1\x7e\x8d\x93\xdc\xdc\x60\xaf\xed\xa4\x88\x80\x76\x17\xf8\x8d\x6a\xa5\x44\x22\xfd\x34\x7d\xda\xdd\xef\xf3\x7a\x56\x3d\xbf\x19\x97\x4b\x2a\x23\xbe\x30\x0f\xbf\xa6\xc7\xfc\x41\xf8\x4c\x69\x05\x41\x52\x69\xf1\x95\x99\x0b\x5b\x4d\xe1\x26\x68\xc7\x1c\x87\xb5\x04\xf4\x11\x24\xbf\x94\x43\x6f\x33\x30\x45\x63\x15\x18\x15\x2c\x51\x62\xa2\x47\x5c\x40\xef\xb6\xcb\xda\xaf\x9a\xf4\x28\xfe\xd3\x25\xb3\xa7\xd9\x4c\x17\x52\x0f\xd8\x9e\x00\xdd\xf0\x8b\x22\xad\xf6\x61\xf0\xac\xd7\x23\xb3\x96\x9d\xc6\x43\x4e\xa6\xf9\x2e\xf5\x8e\x8d\xfa\xe5\xb0\xcc\x28\x85\xba\x98\x7e\xa1\xd1\x6c\x39\xb3\x4e\xf6\x50\x23\x00\x9d\x63\x45\xe4\x8e\x36\x91\xa4\x1f\x02\xa7\x7b\x7f\xe1\x33\xea\x9d\xe7\x56\x5f\x15\x7a\x20\x78\xae\x98\x8b\xbb\x26\x6d\x22\xd5\xfa\x91\xa7\xb2\x63\xe9\x8a\xd2\xdc\x07\x31\xfe\x5a\x29\x02\x5a\x0c\xb4\x36\x86\x4a\x5a\x60\xdb\x25\x7f\x1e\x76\xb5\xc6\x08\xf2\x5c\xde\xcc\x87\xea\xe6"}, +{{0xb5,0x00,0x76,0x8a,0x28,0x23,0x91,0x5c,0x4a,0x68,0x48,0xd3,0x5f,0x64,0x87,0xd4,0x3b,0xd7,0x66,0xd2,0xce,0x09,0x45,0xf8,0xa3,0xcc,0xdb,0x8d,0x82,0xa3,0x89,0x2b,},{0xb8,0xce,0xa2,0x15,0xa0,0x12,0x4e,0xed,0x27,0x00,0x57,0x25,0xd8,0x97,0x78,0x1e,0xa0,0x64,0xdc,0xef,0xb2,0x14,0x22,0xc8,0xbd,0x24,0x02,0xc5,0x6a,0x10,0x57,0x1c,},{0xe3,0xdb,0x47,0xa1,0x1e,0x10,0xe7,0x88,0x92,0x5d,0x14,0xb1,0xe2,0x8b,0x54,0xc9,0xfc,0xf9,0xb6,0xac,0xc1,0xdf,0x8c,0x14,0xf6,0x83,0xa5,0x67,0x2f,0xd5,0x04,0xdd,0x4a,0x47,0x5a,0x33,0x93,0xb3,0xef,0x8b,0xce,0xac,0x23,0x61,0xdb,0xba,0x35,0x30,0xaf,0x25,0xc2,0x46,0xc3,0xec,0x4c,0x05,0x89,0x9b,0x51,0x7f,0x6c,0xd3,0x4f,0x0a,},"\x0a\x9f\xda\x8b\x8c\xfc\xa7\xa5\xb0\x5d\x78\x11\x6f\xce\xe1\x9a\xb8\x03\xc1\xc6\x01\x0c\xe1\x1d\xaa\x8e\x93\xa6\x6d\x12\xc1\x2e\x47\x4e\xb9\x1c\x26\x40\xd9\x7a\x81\x3d\x9a\x83\x0d\x26\x88\x68\xeb\x2e\x37\x70\x42\x5f\x10\xc7\x58\x40\x46\x8e\x66\x9d\xc7\xf6\x1d\x3b\xe2\xde\x88\xae\x0e\x54\x2b\xc8\x09\x67\x91\x13\x95\x7a\x14\xda\x4e\xaf\xf5\x49\xbf\xde\x63\x7d\x7c\xaf\xdc\x6a\xa8\x39\x94\x83\x73\x97\xf8\x6e\x4f\xde\x86\xd4\x02\xfa\x9a\xef\x7f\x65\x54\x9a\x21\x43\x73\xe5\x60\xe6\xd7\xa1\xc2\x76\x9e\x0c\x7d\x5a\x01\x71\xe7\xcc\x00\xdf\xf3\x6e\x04\x29\x79\x8b\x53\xaa\x62\x16\x24\xbd\xa7\x4d\x6d\xf0\xbf\xff\xfb\xd8\xfd\x7b\xef\x1a\x64\xf3\x6c\x00\x07\x82\xf6\xed\x03\x1a\xf5\xc2\xa7\x4a\x18\x96\x35\x98\xc9\xba\x06\x23\x92\xde\x96\x02\x03\x67\x94\xb7\xb5\xe6\x8c\x25\xc9\x3f\xe7\xcf\xad\x47\xa7\xc5\xb9\x79\xd4\x76\xcd\x51\x3a\x12\xbf\x03\x07\xcb\x16\x31\x74\x00\x42\xa9\xfb\xf3\xeb\x0b\xe5\x17\x06\x20\xda\xfd\x5f\x16\xed\x89\x34\x2c\x26\x25\xd7\x83\xe7\x4e\xe0\xd7\x84\xbf\x05\x19\x43\x74\x0c\x88\xb0\xbe\xf7\xbc\x85\xe1\xa6\xa4\xa5\x17\xd4\x92\xfb\x73\x7e\x77\x66\x99\x59\x0c\x93\x22\x4c\xd4\xd9\x24\x5d\x4e\x93\x71\xa3\x67\xc0\x71\x2f\x87\x49\x0f\x92\x47\xc4\x9a\xdd\x93\x13\xf2\x77\xa4\xd9\xf2\x6b\x75\xaa\xe4\xde\xd6\xa3\xde\xf8\x5f\x83\xfc\x99\x59\x10\x40\x55\x48\xaf\x67\x0e\xd8\xaa\xa3\x05\x24\xab\x82\x9c\xcb\x56\xa5\x00\x5b\x58\xbc\xe8\x68\xc9\xe8\x07\x4f\x07\xdd\x7f\x38\x18\xf2\x99\xe4\xe0\x86\xbe\xd9\xea\xb9\x02\xcf\x11\xb3\x98\xd5\x31\xb8\x63\x2e\x7d\x52\x3a\x8f\x87\x76\x95\xf4\x6c\xcf\x9c\xe2\x4e\x62\xca\xb2\xc7\xcd\x0a\xae\xe1\x7d\xb5\x26\x76\xa4\xb5\x05\x8e\x9c\x1d\x7c\x47\xbf\xfc\xb6\x41\xb0\xea\x2b\x09\x44\xf3\x9a\x75\x66\x5a\x7e\xf2\x9b\x7f\x02\xa8\x78\xdb\x82\x38\x83\xbd\xac\xfb\x0f\xbe\x5d\xfe\x5a\x9b\xed\x9f\xda\xc7\xe4\x14\x2e\x3e\xb5\x0d\x5e\x84\x0b\xd0\xac\x0b\xec\xf4\xfa\x97\xe1\xfc\x48\x27\xc3\x97\xa5\x24\x65\xd9\x16\x88\x99\x54\xb3\x70\x1b\x0f\xac\x61\x15\x9b\x23\x09\x2f\x46\x85\xf4\x78\x8b\xad\x35\xd0\x0d\xa2\x67\x9e\xcc\x54\x92\x1f\x1a\x86\x47\x10\x16\x57\xab\x49\x47\x74\x20\x56\x7a\xed\x67\xc8\x60\x59\x30\x44\x4b\x5d\x07\x92\x7c\x17\xef\xf1\xf8\x57\x0c\xf2\xaf\x29\xe7\x19\xf8\x5c\xa7\x84\x9b\x89\x55\x49\xf1\x3d\xfe\xca\x68\xbb\xef\x71\xe3\xce\x8b\x6c\xed\xd2\xff\x68\xd3\x2b\x02\xca\xf5\x95\x1a\x0b\x3e\x6b\x0b\xae\x6a\x96\xc0\x20\x58\x19\x1f\x30\x5e\x09\x07\x11\xc4\x6d\xad\xdc\xd5\xae\xee\x76\x9c\x3a\x10\x5e\x9a\x82\x7b\xbd\x19\x5d\x32\x92\x31\xc2\x62\x38\x47\x9a\x9b\xb0\x07\x1a\xfb\x16\x0e\xf9\x55\xe8\x74\xd7\xa4\x20\xc5\x67\x85\xf4\x4a\xe0\xa1\x8c\x52\xd8\x28\x0c\x59\x98\xcf\x38\x88\xfe\xaf\x89\x89\x81\x34\xbc\x8d\x41\x1f\xc9\xf6\xc5\x76\x8e\xa7\xa2\x49\x72\x94\x13\x73\x9e\x53\x2b\x64\x39\x37\x15\x2c\xdf\xb8\xd2\xff\x87\xfd\x48\x08\x4d\xd8\xae\xeb\xea\xf0\xf7\xb1\x0d\x87\xb6\xe4\x42\x32\x28\xc9\xfc\x8d\xc5\xe3\x85\x2a\xa8\xb8\xac\xc5\x45\xd1\x8f\x25\xc5\x5d\x73\xda\x1b\xb8\x2e\x3e\xb3\x76\xf9\xef\x05\xb2\x74\xd7\xec\xb1\x84\x5d\x65\xca\x0c\xd2\x62\x9f\x03\x8a\x2d\x66\x4d\x7a\x69\x78\x1c\x84\xe9\x8d\xe2\xc2\x09\xc4\x6e\xfc\x51\x16\x21\x72\x85\x66\x49\x46\x9e\x67\x33\x08\xdc\xc1\x45\xea\xf7\x83\xf5\xcb\x5b\x4b\xe7\xd9\xfd\x58\xee\x09\x74\xc9\x81\xa3\x8f\xea\x8e\x31\x26\x7a\xbf\xa4\x10\xe6\x9e\x46\x48\x2f\x51\x34\xf3\xda\x1f\xfe\x38\x1b\xd6\x9d\x8d\x0b\x78\xea\x90\x9b\x4a\xf9\x39\x6d\xca\xff\x89\x96\x0a\x04\x9e\xda\x69\x46\x61\x6f\xc2\x7c\xcf\x9a\x9e\x5b\xa1\xa0\x13\x57\x64\xf3\x77\x19\xda\x4d\x28\x07\x81\x85\xd0\x4d\x72\x41\x9c\x2c\x70\xf2\x90\xd9\x7e\x1f\x82\xb8\x79\xf7\x1b\x9e\x19\xd5\x04\xd3\x64\xcd\x3b\xa2\x2c\xf9\x05\x25\x0f\xd3\x7d\x58\xe5\xfe\x40\x20\x9f\x60\x72\xa0\x6d\x8b\x5b\xa7\x01\x96\x23\x05\x77\x87\x7e\xc4\x61\x53\x16\x7a\x7c\x7a\xea\x27\x0f\xa1\x09\x8a\xba\x9e\x3a\x74\xac\xb3\x6a\x11\xb0\x9b\xd0\x7a\x3b\x88\xea\x65\x4e\x26\x83\x65\x62\x5b\x58\x9b\x22\x06\xc7\x10\xd9\x60\xf4\x2e\xa4\x19\xb7\xe4\xe3\xda\x47\x59\xfc\xbc\xa5\x0e\x4b\xf4\xcc\x55\xcf\x88\xf7\x0b\x31\x80\xc8\x05\xa7\x04\x50\x86\xaf\xa0\x4c\x6b\xe2\x32\x23\xec\xae\x5f\x82\xc1\x46\xd5\x43\x11\xd1\x80\x7c\x2e\x4a\x53\xf9\xe0\xa4\x48\x2b\x4e\x1e"}, +{{0x9e,0xb5,0xc9,0xef,0x13,0x53,0x5f,0x80,0x81,0x09,0xf4,0xa4,0x3c,0xfa,0xd5,0x68,0x4f,0x80,0xda,0xf0,0x2e,0xed,0x54,0x10,0xac,0x0b,0x0a,0x09,0xa6,0x08,0x2d,0x69,},{0x36,0x7e,0xea,0x1e,0xcb,0x4e,0x5e,0xec,0xdf,0x7e,0x47,0x1b,0x90,0xbb,0x34,0xf9,0xb7,0x98,0x2c,0x8c,0xd6,0x6d,0x42,0x55,0x5c,0x24,0x0b,0x41,0xcd,0x87,0x39,0xdb,},{0x42,0x9c,0xe1,0xfe,0x84,0x6d,0x25,0x08,0x49,0xec,0xa7,0xd4,0x56,0xf8,0xc5,0x9f,0x86,0x75,0xb1,0xf4,0xc1,0x3f,0x2b,0xe4,0x16,0x88,0xdf,0xb8,0xca,0x2a,0x3b,0x24,0xae,0x29,0xd5,0xb6,0xbf,0x47,0x11,0x57,0xbc,0xb6,0xe2,0xec,0x9d,0x4a,0x26,0xb0,0x38,0xe6,0xec,0x28,0x58,0x4c,0xc2,0x3f,0x2a,0x03,0x55,0x6d,0xbb,0x37,0xe9,0x00,},"\x2d\x7c\xb0\x5e\x61\xdb\xae\x26\x25\x8e\x38\x61\xc6\x39\xef\x0e\x1d\x17\xfc\x71\x1a\x00\xf3\x35\xba\x3c\x02\x71\x37\xe0\x07\x08\xd7\x08\xc1\xff\x45\x7f\xf2\xc6\x51\x12\xf7\xdc\xd7\xd0\x2f\x24\xd5\x6f\x07\x21\x58\xea\x1c\x71\x83\x25\x50\xa5\x83\x66\xfd\x91\x97\x29\x6b\xbe\x61\xaa\x4d\x00\xde\x18\xa4\x53\xef\x91\x74\xfa\x81\x96\x83\x05\xc4\x1c\x34\x55\xf4\x2d\x44\x7a\x92\x34\xf0\x6e\x13\xbf\x8b\xca\xa1\xba\xbb\x11\x69\x5f\xaf\xdc\x08\xf7\xa5\x84\xb2\xea\x1f\x61\xe9\x38\x92\x60\xce\x73\x35\xa0\x7d\xe7\x2c\x89\x11\xa5\x8a\x31\x3f\x10\x88\xdc\xdf\x5c\x8d\x4c\x45\x6c\xba\x2d\xcb\x4f\x2d\x15\x6b\x49\x43\xb9\x5b\xd4\x93\xea\x4f\xe1\xa8\x2d\x4e\x3e\xa0\x2a\xa0\x29\x72\x40\x0b\x5e\xe1\x78\x42\x83\x2d\x59\x97\x9f\xc1\x79\xf8\x43\xc4\x4b\x03\xeb\x3c\x30\x24\x16\xd0\xcd\xaf\x11\xc4\xca\x8a\x66\xcc\xbb\x69\x97\x39\x5e\xdf\x6f\xca\x2e\xa0\x04\xcf\x34\x86\x97\x10\x04\xa4\x20\x42\xaf\x8e\xce\x00\x5b\x94\x46\x1d\x86\xdc\xde\x21\x2a\x2e\xb1\xbe\x3b\x91\x4c\x78\x3e\x48\xac\x1a\xd4\x6c\xac\xd7\x3e\x1e\xb4\x48\x36\x83\x22\xd2\x67\x8e\xfc\xb2\xab\xff\x52\x09\x3d\xb0\xf2\x59\xdc\xe5\xc1\xe1\x9a\x51\x28\x20\xf2\x35\xd6\xae\xaf\x0e\x1a\x72\x3c\x2c\x65\x0c\xff\x1e\xe3\xb6\xb4\xf4\xcc\x98\x9c\x0b\x7d\x6d\xe3\xcd\x7e\x6d\xaa\x39\xbb\x69\x07\x10\xdf\x00\xa7\x19\x4c\x17\x20\x1f\x0e\x81\xbe\x64\xb6\x73\x9e\x1c\x1e\x81\x76\xb7\xe1\x2a\x35\x34\x27\xc0\x67\xc1\x93\x14\xdb\x64\x2e\x5c\x76\x26\x6b\x64\x0e\xb1\xcc\x0c\x73\xf8\x4f\xc0\x22\x7e\x5a\x96\x06\x0d\x81\x40\x71\xcd\xe2\xfe\xd9\x44\x76\x7b\x74\x66\xf9\x00\x1d\xfc\x22\x36\x85\x42\x9b\xc4\xe5\xe4\x8f\x5c\x13\xa6\x3a\x4e\x0d\x82\x61\x33\xad\x92\x0d\x11\x77\x21\x45\xad\x6e\x13\xc9\x38\x97\x39\x8a\x8a\x40\x1f\x93\xdb\xd1\x03\x00\x5c\x7d\xae\x44\x38\x7f\x3e\x80\xb7\x93\x60\x7d\x05\xd2\xd8\xbc\x0d\x03\x51\xa3\xa4\x52\xb8\xce\x75\x9c\x1a\xd4\x8d\xf7\xb9\xba\x9e\x4a\x17\xdf\x61\xfd\xab\xb9\xb5\x77\xb5\xce\xc3\xe9\x46\x1f\xbb\x5e\x12\x81\x55\xa3\xc9\xc8\x9f\x8f\x6b\xeb\xb7\x32\x2a\x16\x67\x8e\x8e\xcb\x98\x95\x3d\x95\x83\x10\xdb\x1b\x06\x34\x48\xc3\x49\xf3\x6e\x16\x8f\xac\x48\x4c\xb3\xc0\xd4\xcb\x2c\x25\x1b\xd9\x2e\xf8\xe9\x26\x2b\x44\x09\x3d\x7e\x65\x0a\x7d\x3b\xed\x37\x91\xfa\x88\x10\x0f\xee\x6e\xf0\xd5\xe2\x3d\x1e\x9a\x80\x99\xcc\x03\x35\x20\x2a\x4f\x10\x6c\x24\x77\x7e\x98\xf8\x1d\x26\xef\xba\x15\xc9\xad\x15\x41\xe0\xad\xbf\x1d\x1d\x76\x07\x6b\x0d\xfd\x7b\x7d\x6c\x8b\x82\xf9\xc0\x93\x46\x8c\xd1\x96\x67\x2d\xc5\x47\x8e\x91\xce\x70\x1c\xdd\x7b\x68\xb3\x53\xc9\x71\x11\xf0\x42\x97\x60\x63\x57\x62\xf8\x68\x3a\xe9\x70\x56\x4b\xce\xba\x91\x20\x51\x76\x42\xe8\xb3\xa2\xba\xaa\x85\xc2\x5b\x54\xa9\x43\x76\x61\x84\x90\x4c\x72\xd9\x29\x63\x4e\xc5\xf0\xc2\x84\x73\x41\x5f\x12\x53\x89\x06\xc6\x78\xfc\xa4\xe6\x82\xdb\x48\x79\x75\x84\x92\x53\x7e\x78\x50\xb9\xbf\xef\x3e\xb9\x05\x3b\x43\x92\x0d\x81\x0e\x55\xbe\x96\x6a\xec\x68\xc9\xdd\x3b\x62\xcc\xf5\x7e\x81\x78\xcb\x5e\xf6\xd1\x6d\x17\x2a\x56\xdd\x92\x4f\x00\xf2\xd3\xb5\xe9\x3a\xaa\x92\xb2\x9f\xb8\x33\x6d\x73\xe2\x9e\x59\xd1\xc4\x7e\xa6\x23\x0c\xda\x1d\x5b\x03\xbb\xa5\xdf\xdb\x33\x1f\xeb\x19\x44\x3f\x12\x3d\x2a\x03\xff\x4f\x10\xec\xa1\x66\xc2\x99\x85\x88\xf1\xe5\x84\xed\x19\x4d\xd6\xf7\x3c\x8a\xca\x84\x66\x31\x90\x4d\x9f\xe4\xa9\x8b\x36\x78\x23\xe4\x6e\xdb\xa2\x88\x51\x29\x87\x9e\x92\x77\xe1\x50\xf0\x29\xb8\xfa\x7b\xd1\x1e\xab\x9c\xe1\x33\x67\x77\xc8\x0b\x56\xb3\xa1\xf0\x81\x1a\xdb\xca\x0f\x5b\x40\x25\xa5\x50\x3c\x81\x96\x66\x1a\xee\x90\x00\x6e\x9c\x85\xbb\xfa\x4c\x5a\x0e\x90\x28\x85\xc8\xce\x51\x21\x2e\xe6\x7f\x0f\xe0\xb6\xaf\xbc\x8b\xad\x45\x37\x27\x54\x3b\x3c\x68\xb8\x90\xdd\xab\xa2\x69\xd2\x5f\xc1\x64\x3f\x54\x83\x51\x36\xa1\xa2\x5b\xa1\x8d\x91\x6c\xed\xd6\xa4\x7f\xc0\x7a\xdf\x6f\xc6\x9f\xa5\x08\x94\x9d\xc1\x0d\x9d\xc5\xe0\x26\x1b\x52\xf3\x65\x71\x70\x38\x4e\xcc\xd9\xc8\x05\x41\x35\x4b\x1c\xe0\xf6\xfb\x5e\xd3\xe8\xd5\x4a\xf0\xb5\xbf\x0a\x92\x83\x51\x25\xc7\xd9\xbc\x4f\x09\x2f\xf3\x80\xe5\xe8\x96\xfb\xf3\x02\x55\x2b\x14\xd5\xb6\x1a\x22\x4d\x86\xe3\x01\xc7\xa6\x6a\x66\xe4\xe4\x32\x9a\xac\x0a\x66\xb1\x56\x77\x23\x74\xdc\x1c\x71\x68\xd5\xb5\x61\x65\x2f\x8f\x43\x87\xe4\xf2\x89\xb6\x36\x6a"}, +{{0xef,0x09,0x48,0xe1,0x32,0x81,0xf3,0xcf,0x35,0x2c,0xbf,0xaf,0x8d,0x89,0xd1,0x17,0x76,0x85,0x52,0xd5,0xa1,0x54,0x8e,0xcb,0xaf,0x37,0x41,0x2e,0x97,0x67,0x0f,0xac,},{0x58,0xc2,0x45,0x7f,0x5a,0x5e,0x3c,0xfb,0xf4,0x71,0x19,0xa8,0x7f,0x2a,0xff,0x19,0x18,0xf1,0xe6,0x7a,0xe6,0xfa,0x91,0x71,0xd3,0xf4,0x1e,0xee,0x07,0xa8,0x68,0x72,},{0xcc,0x12,0xf6,0x9d,0xb6,0x3a,0x67,0x8e,0xc4,0x77,0xa6,0x05,0xa5,0x05,0xc5,0x7d,0xc2,0xb8,0x10,0xef,0x85,0xe3,0xe3,0x45,0x19,0xcb,0x25,0xc5,0x10,0x63,0xaa,0x66,0x35,0x5d,0x3f,0x1e,0x29,0x74,0x69,0x58,0x66,0xed,0xf6,0xf1,0x71,0x71,0xce,0x37,0x84,0x2f,0xba,0xb5,0x07,0x5f,0xc8,0x95,0xd1,0x8e,0xd7,0x43,0xc5,0x46,0x08,0x0c,},"\x7e\xc4\x7f\x2f\x1f\xe3\xb7\x0a\x6d\x1d\x82\xc7\xcd\x92\x4b\x4b\xf9\xb2\x02\x9f\xc1\x2c\x52\xa6\xe1\xcc\x06\xcf\x5a\xbf\xc0\xa4\x42\xe7\xcf\x14\x5c\x15\x42\xb9\xb1\x35\x04\x96\x65\x71\x10\x35\xe3\xc2\x9a\x91\xd4\xfd\xae\xd6\x12\x70\x57\xa8\x12\xc2\x2c\xd7\x5a\xd1\x87\x9b\xe1\xd2\xc6\x11\x0e\x79\xe9\x87\x52\x4e\x4e\x8f\x27\xf1\x6e\xda\x90\xcb\xd4\x73\x3f\x11\x18\x25\xb5\x16\xd1\x06\x7f\x81\xec\xa5\xe6\x94\x85\x76\xd5\xbf\xed\xb3\x27\x7c\x1a\xbc\x1e\x60\xf3\x74\xd0\x70\x1b\x32\xcc\xfd\x6a\x5e\x9c\x8d\x16\x59\xaa\xf3\xd0\x81\x86\x13\x61\x3b\x7e\x28\x8d\x84\x5e\x9a\xaa\xba\x2e\x3e\x9b\x41\x1d\x50\x1d\xff\xe8\x56\xfd\x31\x3e\x9f\xcc\x9e\x74\x30\xb9\x98\x3f\x20\xab\x4e\xbf\x4e\xb6\x16\xbd\x63\xe2\xc5\x77\x43\x65\x89\x95\xed\x0a\x14\x9a\xe6\x20\xa3\x95\x61\x37\x19\xb3\xed\x7c\xed\x45\x88\xd5\x91\x5d\x70\xa2\xf0\xc6\x87\x68\x0e\xc3\x4f\xe3\xe9\xf7\x23\x92\xe1\x89\xe1\x3a\x47\x49\xd5\xca\x9f\xac\x65\x1b\x92\xc0\x84\xc4\x06\x6f\xdf\x98\xa8\x69\x22\x3e\x4e\x0c\x9b\xec\x58\x12\xb5\xc1\x90\x0e\x6e\x60\xd3\xa1\x88\xd4\x8a\x74\xdf\xd4\x15\xb5\xca\xd2\xe9\x1f\xf7\x6d\xf7\x50\x89\xd2\x0a\x75\x5f\x26\x07\x56\xc8\xf1\x38\x2a\x29\xf7\xb9\x37\x26\xe7\x31\x07\x1c\xd4\x77\x45\x8c\x6f\x20\x22\xdf\xad\x7d\x4f\xc7\xab\x23\x80\x54\x18\x64\xf6\xb5\x87\x74\xf9\xae\x8e\x5f\x07\x7c\x1a\x8d\xa0\x73\xc3\x98\x53\xeb\x2f\xd4\x77\x22\x0b\x45\xa3\xd9\x22\x63\xdc\x7e\x14\xd3\xbb\x2b\x36\xfc\xa4\x66\xc7\xef\x8a\x24\x75\x38\x72\x5f\x2f\xce\x5c\x72\x21\xbc\x75\x1c\xde\x13\x94\x60\x4f\x59\x31\xd7\x33\x36\x0c\xcd\x47\xce\x08\x77\x12\x95\x81\x80\xad\x84\xfa\xe7\x13\xb5\x43\xf0\x5e\xef\x6a\xbc\x06\x61\x43\x31\x21\xed\x3b\x45\x06\xa1\x46\x50\x25\x31\x6f\xb8\xf9\xd6\x45\x35\xcc\x45\x38\xac\xd4\x06\x4d\xd5\x76\xb0\x74\x0e\x1b\xeb\x13\xbc\xea\xf1\x55\x54\x3d\xc8\x90\x97\xca\x5c\xa1\xcf\xfa\x0a\xd6\x5a\x10\xbc\xb7\x59\x35\x4e\xab\x8a\x42\xde\x73\x4a\xf9\x09\xc2\xfe\xba\x38\x0d\x66\x40\x9f\x32\x5d\x5f\x17\xaf\x9c\xa7\xf8\xcb\x41\x34\xfd\x6a\x2b\x6a\x52\x8d\x9e\x60\xd9\x61\x2b\x8e\x8b\x40\x62\xf8\xe0\xfa\xd1\xe7\xee\xb9\xcb\xfe\xf6\xe9\x73\x8e\xc7\x97\x3e\x1c\xb2\xba\x23\x27\xde\xca\x4e\xa4\x65\x68\xf3\x1e\x12\xf7\x30\xe2\x47\xc1\xd0\x70\x29\xfd\x44\x22\xb2\x98\xff\x23\x98\x02\x3b\x41\x20\xa3\xa4\x25\xff\xb6\x52\x88\x0c\x19\xea\x69\xf3\x63\x9e\x0f\x6d\xf4\xf0\x08\x76\xcc\x45\x28\xe2\x67\xe8\x1d\x59\x43\x19\x9d\x0f\xeb\x6c\xb4\xe1\xba\xf4\x04\xbb\x6f\x8b\x39\xb1\x2d\xbc\xe9\xfd\xc3\x5d\xc1\x58\x06\x6e\x99\x75\xae\x5b\xd3\xb5\x5f\x2a\x41\xa7\x91\xba\xf3\xe8\x35\x1e\xc6\x04\x94\x47\x90\xa2\x2c\x93\x3c\x80\xb1\x59\x0b\xa1\x97\xa4\x70\x6f\x7f\x51\x28\x68\x2e\xdc\xd7\x4d\xd7\x8d\x43\x5e\x78\x7c\x2b\x76\xa5\x7b\x3f\x4e\x7d\x7b\xe2\xef\xd2\x6d\xa5\xf9\xa8\x29\x11\x9b\x01\x50\x8b\x70\x72\xc7\x69\x9c\xe5\x2b\xb5\x78\xcc\x5b\x1b\x93\x66\x1b\x51\x72\xfb\x84\xda\xf1\xba\x36\x4d\x2c\xbd\x80\xe2\xc9\x9b\xca\x9c\xae\xa8\x73\xcc\x0a\x16\x29\xea\xc3\x84\xe9\xb2\x06\x84\x2a\x6e\x61\x83\x38\x75\x91\xb4\xaa\x34\xa9\x5f\xd8\x9b\x49\xd8\xd1\x5d\x91\xe2\x19\x40\xe1\x7d\xca\xf1\xef\xf8\xa0\xa4\x7a\x0d\x7a\x95\xda\xea\xd8\x2a\xa3\xdf\x82\x04\xa0\xcd\x20\x69\x24\xae\x51\x0f\xec\x8a\x9c\x4e\x8d\x85\xd4\x66\xfd\xb4\xdd\x36\x5d\xc9\x93\x36\xb2\x2c\xe0\xb9\x56\xb5\xee\x00\x17\xf2\x9d\x25\xee\x66\xfb\xdc\xec\xb0\xd9\x96\xff\xb9\x7c\x8d\xef\xde\x40\xa9\xff\x99\x93\x19\x3c\xa8\xf1\x68\x50\x67\xc1\x9c\x52\x6e\x0e\xfe\xd2\x36\xf8\xed\xb8\xde\xf6\xc2\xa0\x3e\x21\x95\x2c\x86\x12\xd6\x24\xe6\x88\x6a\x31\x1f\xfb\x9e\x2f\x15\xda\x44\xab\xe1\x80\xd2\x6a\x14\xb1\x5f\x63\x56\x1e\x09\x7a\x73\x0e\xca\xbb\x79\x2c\x7c\x23\x5f\xdd\x36\x0f\x57\x1f\x27\xef\x68\x67\x7a\x7d\x63\xbe\xb4\x97\x59\x82\xcb\x19\x9a\x56\x0f\x81\x6e\xe1\x29\x89\x44\x5f\x7f\x75\xb8\x3e\xb2\x78\xd6\x28\x25\x94\x7d\x84\x09\x9a\xf2\xa6\xff\x2e\xad\xbb\xf5\x89\xb5\xeb\x2f\x72\xed\x11\x4c\x73\x15\x11\x53\xae\x00\x22\xbc\x95\x64\xd1\x5c\x2d\x5c\xdb\xba\xab\xbe\xf6\x38\xf0\x30\x95\xf5\x3e\xeb\xac\x96\x83\x40\x9a\xd3\x06\x0c\xfb\x7c\x70\x37\xb9\xb0\xbe\xfe\x06\x9c\x92\xa0\x2b\xe9\x53\x38\x8e\x9e\xa4\x5d\x36\xdd\xf4\xf5\xa8\x38\x94\x32\xcc\xf5\x04\xc5\x08\x08\xb0\x7f\x69"}, +{{0x90,0x3f,0x3b,0x53,0x99,0x89,0x2e,0x29,0xcc,0xfa,0xfb,0xaf,0xbd,0x7c,0xc4,0x53,0x3c,0x15,0x4a,0x62,0x56,0x82,0x40,0x6c,0x89,0xbf,0x89,0x4c,0x88,0x9e,0x43,0xf4,},{0x8f,0xa5,0xff,0x5b,0x6b,0x26,0xbd,0x67,0xdf,0x86,0x40,0x46,0x42,0x9d,0xf1,0x24,0xb5,0x23,0x00,0x5d,0xd8,0x94,0x44,0x27,0x5c,0x8a,0xb7,0xeb,0xdd,0xb6,0xf4,0xdb,},{0x49,0x5a,0x8f,0x99,0x19,0x41,0xc6,0x29,0xbd,0x64,0x1a,0x67,0x47,0x1a,0xb8,0x60,0xbf,0xd3,0x9b,0x72,0xf2,0x33,0x55,0xf7,0x27,0x09,0x09,0xd5,0x30,0x7c,0x77,0xb1,0xb9,0x4b,0xae,0x3e,0xd1,0x94,0x50,0x78,0x0e,0x90,0x85,0x30,0x5f,0x31,0xb1,0xe1,0x68,0x3f,0xac,0xf0,0xd1,0xfc,0x88,0x40,0xae,0xc7,0x7d,0xf6,0x7a,0xea,0xb3,0x02,},"\xa2\xc1\x1b\x5f\xb8\x84\xa8\x22\xfa\xe6\x4d\xa8\xdc\xb4\x45\x2c\xfd\x7a\x04\xca\x6d\x7a\x5a\xbc\x8d\x82\x71\xe9\x3f\x93\x44\x9e\x1f\xeb\x8e\x02\x97\x5f\x49\x6b\x90\x34\x40\x0d\x35\x99\xab\x97\xaa\x39\x97\xda\xd1\xc9\xff\xab\x5b\x9f\x8d\xf4\xaa\xa5\xb8\x40\xd9\x0d\x86\x2f\xff\x7f\xf0\xcf\x73\xa6\x0c\x66\x15\x00\x09\xe0\x1c\x93\x7b\xd1\xaf\x68\x07\xb5\xba\x2e\xf6\x12\xee\x13\xd6\xde\xf4\x0b\xb0\x9c\x46\x81\x1a\x2d\x4e\x46\x8e\x03\x8b\x32\x30\x55\xf9\xdf\xbd\x01\x82\x9a\xe2\xf1\xa5\x35\xef\x02\x95\xca\x1e\xd1\x76\xe4\x6d\xe9\x96\xcc\x87\xba\xce\x45\x35\x62\x33\x21\x18\x35\xb6\xf4\x75\x7c\x99\xbd\x52\x7e\x76\x6a\x5f\x0b\x12\x7c\x8c\xff\x8e\x6d\x66\xf8\xba\xb8\x6d\x00\x00\x45\x2c\xd7\xf6\x7b\xe5\x57\x78\x85\x13\xec\x07\x09\xb5\x37\xb0\x07\xb4\x20\x16\xe7\xa8\x96\x83\x46\x9b\xd8\xff\x8d\x21\xeb\x10\xc1\x49\x17\xd4\x7f\x2d\xc4\xf8\x26\x32\x4f\x7c\x01\xb2\x4f\x8d\xcf\xf0\x4a\xa6\xd8\x50\x95\xd9\xab\x15\x4b\xa5\xc3\xbd\x91\x9c\x9d\x72\x8d\xbd\xc9\x90\xd1\x9c\xeb\x23\x7b\x45\x29\x07\xbd\xbe\x21\xf9\xf0\x8c\xdd\xae\x5b\xe4\x79\x27\x67\x09\xb8\xae\x73\xf8\x97\x4c\x4b\x11\x38\x41\xad\x53\x5d\x6f\xf6\x22\x3e\xea\x47\xd1\x85\xc8\xe8\xa6\x5f\xde\xe2\xc2\xd4\x58\x00\xc1\x7c\xb5\x56\xea\xfd\x67\x66\x47\xd9\x96\x8e\x55\xca\x9c\x59\x23\x2b\x97\x70\xad\x10\xf9\x55\xfc\xb5\x85\x8e\xdf\x0b\x74\x83\xad\xc1\x81\x7c\x0f\x8d\x02\x24\x04\x82\xca\xa7\x6f\x43\xc6\xd2\xe9\x6a\x4f\xf9\x59\x1c\xd7\xb8\x78\xea\x61\x9e\xa5\x6d\x1b\x58\x86\x31\xe7\x63\x3c\x5e\xcb\x2b\xa6\x99\x83\x98\xcb\x06\xe3\xcf\x75\xae\xb3\xe0\x8d\xab\x19\x63\x2d\x45\x4f\xf7\xdc\x0e\x2a\x41\xf0\x97\x37\xe8\xee\x82\x3d\x1b\x9e\x24\xdd\xa8\x4a\x2c\xe0\x31\x3c\xb9\xfc\xe3\x1c\xb6\x63\xc5\x5c\x05\x64\x5e\x63\x40\x17\x56\xe8\xad\x38\xf5\x17\x4c\x02\xa6\x63\xd8\x15\xad\x64\x42\x2f\xf7\x72\x7d\x4f\xda\x16\xe4\x8d\x4b\xf8\xf6\x60\x2e\x72\x60\xda\x62\x33\x0e\x68\x78\xc3\x47\x64\xe1\x29\xaf\xbd\x55\x22\x08\xf6\xbe\xd4\xf7\xce\xe9\xb6\x71\xf4\x88\x38\x88\x15\xd7\x4b\x49\x51\xb8\x68\x2c\xe7\x6c\xfe\x31\xe9\x38\xc4\x70\xb8\xf7\xa4\x5f\xd6\x3a\x96\x91\xf4\x26\xa7\x5c\x58\xed\x3d\xbc\xe3\xae\x8f\xd9\xd1\x0a\x83\x52\xe4\x7c\xc1\xb1\x2c\x91\x92\xac\x86\x26\xd1\xb3\x84\xb7\x7a\x18\xb9\x86\xe7\x1a\x99\x86\x46\xc1\x37\x99\x2b\x67\xc4\x81\x7e\x34\x63\x45\xfa\xf5\x0a\x26\x59\xfd\xc5\xca\xd5\xc7\x19\x64\x8e\xfe\xe3\x84\x7c\x0f\xf6\xbd\x70\x95\xc2\x8b\x4c\x51\x95\x96\x7c\x90\xcf\x84\xe1\xef\x68\xa1\xad\xa0\x1f\x62\x74\xed\xe3\x63\xfb\x82\xe0\xb5\x49\xa8\x70\x24\x5d\x60\x8c\xae\x82\x34\xf6\xd8\x4a\xbe\xb6\x1b\x71\x84\x66\x09\x36\x20\xd8\x5c\x58\x4a\xb0\x1e\xed\xa0\x91\xee\x8a\xff\x1c\xf6\x7a\x46\x75\x67\x9a\x1f\x40\x03\xe6\x6a\xaf\x43\x87\x1b\x88\xec\xda\x6a\x16\xdc\x5a\xcb\x05\x39\x5f\x2d\xa9\xdf\x70\xd3\xbd\xb6\x14\x38\xe1\xc3\xd4\x09\x81\xe0\x34\x62\x7d\x02\x6e\xe1\xd2\xe7\x9f\x65\xcb\xb8\x18\x9f\xcb\xb3\xcc\x8b\x5c\x2e\x7e\x79\x6b\x5d\x28\x89\x41\x1d\x56\x41\xfb\x86\x9c\x7b\x0a\x58\x9c\x43\x25\x4f\x8c\x54\x38\xaa\xf5\xac\x42\x38\x32\xf0\x18\xd7\x9a\x51\xb9\x6f\x24\x2e\x2d\xe0\xc8\x51\xcc\x5f\xc2\xb2\x06\xbc\xa4\xb5\xbe\x83\x61\x25\xac\xa1\x44\xbb\xc3\x8c\x8c\x63\x8b\xe0\xd3\xbb\xe0\x25\xa1\xbe\x8b\x3d\x03\xd5\x92\x9b\xaa\x64\x9c\x35\x44\xa3\x2a\x91\x5e\x92\x6a\x38\x79\x1b\x13\x4a\x97\x1b\xc5\x2d\x1b\x6c\xa6\x25\xef\xb7\xc2\xf3\xbb\x47\xab\x51\xd4\x3c\x8e\x37\x4d\x16\xcd\xa8\x82\x20\x4b\x71\xca\xfe\x90\x93\xcb\x60\x78\xef\x2b\xdf\xad\x59\xed\xea\xf3\x6d\x0c\x1a\x4d\xc4\x25\xb9\xe7\x18\xc4\x51\x85\x22\x5a\x9c\x30\x84\xb7\x82\xbf\xe1\x63\x49\x2f\x8e\x84\x82\xec\x9a\xa0\x73\xf6\x90\x1f\xf3\xd1\x11\x7c\xe9\x17\xe1\x91\x22\xfa\x67\x65\x0d\x85\x8f\x8f\x82\xb3\x76\x69\x72\x3c\x22\x6d\x72\x16\x97\xe7\xae\x33\x59\xf5\xa6\xb0\x24\x24\xee\x87\x94\xcb\xea\xa6\x41\xed\xbb\xf7\x53\xb1\x03\xa5\xfe\x15\x8b\xe0\xba\x60\xd8\xa2\x12\xd4\x2f\x8c\x5c\x2a\xf2\x54\xbf\x1b\x9c\x80\xdf\x6f\x1c\xf0\x9d\x70\x79\x3c\xae\x1a\xbb\x46\x27\xb1\x78\x0f\x1b\xce\x7f\x61\x7e\xe5\x0f\x6b\xd4\xb0\x83\xb2\xfc\x7c\xd8\x44\xaf\xb7\x23\x80\xd5\xcb\x6b\x25\x5b\xf4\x7e\xa7\x1c\xad\x6c\x6c\x4d\xf0\x21\xf8\x1b\x54\x8f\x43\x2c\x18\xac\x36\x6c\x6a\xec\xd0\x3b\x6c\x8c\xe2"}, +{{0xee,0x81,0xe0,0xfb,0x05,0x2e,0x23,0xad,0x75,0x9d,0xe6,0xaa,0x98,0x38,0xde,0x98,0xe3,0x6d,0x48,0x20,0xdc,0x0e,0x1b,0x7b,0x3e,0xf1,0x14,0x1a,0xb9,0xde,0x33,0x40,},{0x98,0xf3,0xc9,0x88,0x07,0x94,0xde,0x64,0xfa,0x26,0x9b,0xdf,0x33,0x60,0x95,0xe0,0xe0,0x1b,0x1a,0x3b,0x37,0x5f,0x96,0x5b,0x93,0x70,0x0b,0xbd,0xf4,0xb9,0x68,0x69,},{0xf0,0xd8,0x73,0xbe,0x15,0xcf,0x45,0x4c,0x74,0x34,0xde,0xab,0x71,0xde,0x25,0xcf,0xe9,0x9e,0x81,0xa4,0x8d,0x2d,0xce,0x6a,0x35,0xd1,0x63,0x37,0x14,0xdf,0x0f,0x8b,0x40,0x29,0xe0,0x58,0x25,0x11,0xef,0xc4,0xd0,0x68,0x92,0xf6,0x72,0x85,0x02,0x46,0xbc,0xf0,0x70,0xc4,0x6f,0xad,0xc2,0xfa,0xab,0x44,0xdc,0x43,0x50,0x45,0xde,0x00,},"\x28\xd9\x9e\x95\x18\xb8\x82\x83\xc2\x20\xe7\x6d\xe2\x05\xd7\xb6\x16\x23\x59\xb1\xdf\xec\x1f\xba\xab\x98\xec\x0e\xf1\xdf\x8d\xa4\x0b\x6b\x7a\x77\x5e\x97\x28\x45\x0a\xeb\x23\x51\xfe\x5c\x16\xaf\xda\x3a\xec\x0d\x71\x04\x9d\xa4\xcb\x7d\x4c\x63\x71\x3a\x24\x10\xab\xb0\x22\xf8\x16\x11\xcc\x06\x45\x87\xc8\x04\x7d\x43\x83\xc0\x0c\x3c\x56\x2e\x9c\xee\xa3\x57\x75\x09\x53\x91\xb5\xf3\xdd\xa0\xe3\x73\xc4\xa7\x7f\xf6\x18\xa2\x8e\xf6\x87\x87\xeb\xfc\x3e\xbc\xcc\xc5\xd1\xce\x32\xdd\xf4\x3b\xfc\xe5\x72\x03\xda\x76\xa8\x66\x4b\x3c\x61\x6a\x88\x69\x28\x2d\xb0\xb7\x28\x11\xb5\xfd\x5a\x2a\x03\xa4\xff\x66\x72\x4b\x04\x89\xea\x2e\x10\x73\xd7\x81\xc3\xf1\x89\x11\x5d\x79\xba\x20\xa4\x6d\x1d\xfa\xf5\xb1\xa5\x84\x7b\x2a\x2e\x31\xb2\x80\x87\x37\x56\x9e\x60\xb5\x72\x31\xe6\xa9\x9a\xf2\x6f\x58\xaf\xeb\x15\x77\x08\x10\x47\x48\x12\xfe\x4a\xfa\xcf\x88\x45\x06\xb8\xc3\x14\xbc\x67\x51\xbb\x42\xb4\xbd\x6e\x87\xd2\xe5\xde\x70\xfe\xc5\xf0\x01\x4c\x42\x57\xb1\x34\x72\xa3\xb0\x11\x1a\x7a\x8c\xf8\x3b\x1d\xc0\xcf\x96\x20\x22\xcd\x44\x46\x8a\x3a\xb1\xf0\x01\x6b\x70\xca\xfb\x1d\x02\x46\xac\xd7\x05\x39\x37\xc9\xac\x40\x20\x7c\xf1\x3b\x50\xdd\x15\xe2\xa2\xe1\x5f\x50\xa0\x5b\xca\x2f\x28\xe7\x70\x26\x23\x71\xda\xce\xe0\x2e\x25\xb2\xa5\x96\x58\xed\x90\xc0\x60\x0f\xa2\x65\xb7\xde\x3d\x44\xf8\xef\x07\x21\xbf\x39\xec\x4d\x4e\xca\x58\x88\x52\x7b\x77\x80\x67\xb1\xd6\x59\xc0\x05\x14\xc8\xd7\x05\x62\x73\xa2\x94\xcb\xaf\xe4\x50\x90\xd0\x69\xbb\xd0\x9f\x92\xf4\x61\xe6\x48\xf3\xe6\x82\x88\x2c\x71\x57\x6e\x97\x4d\xeb\xb0\xcb\x7e\x0e\x83\x16\x40\x66\x60\x15\x0d\xab\xb5\x8e\x76\x24\x66\x14\xa2\x91\xc1\x2c\xe9\xe0\x34\x6c\x02\x77\x4d\x4d\x09\xce\xcc\x23\x69\x67\x12\xfe\xe2\x50\xc0\xbb\x5d\xf7\xa2\xa4\xc4\x3a\x55\x63\x33\x1b\xcb\xbf\x84\xbe\x3f\x2e\xeb\x06\x54\x53\x2e\x85\xec\x59\x7b\x53\xb3\x2f\x39\x54\xcc\xaf\x0c\xd4\x26\xde\xf9\x1e\xc4\xb2\x08\x41\x69\x48\xaf\x27\xde\x04\xd8\x32\x70\x58\x97\xa0\x4c\x5e\x24\xa2\xe8\x8b\x20\x04\x0f\xd4\xec\xa3\x08\x9f\xdb\x91\x8a\x92\xe3\x5c\x4d\x31\xda\x26\x85\x0b\x9d\xd3\x41\x18\xc7\x44\x49\xa8\x55\xff\x4b\xc9\xff\xf0\xd1\x44\x78\x39\x65\x4b\x00\x41\x79\x99\xfa\x4e\xb8\x91\x02\x13\x3c\xd3\x20\x40\x91\x53\x58\x49\x57\xc1\x04\x89\xdb\x4b\x72\x44\xc9\x59\x07\x98\x8e\x83\xdc\x82\x12\x71\xdc\x1a\xb6\x43\xd6\x99\x2d\x0f\xd8\x20\x49\x2a\xe6\x42\xe2\x4d\x19\xa1\x79\xfa\x75\xd9\x36\x3b\x32\x16\x62\x60\x6f\xd9\x4a\x47\xfd\xb2\xe6\x8d\x3f\x30\xc0\x46\x73\xf8\x09\xde\x01\x44\x94\x5e\xa4\xd4\x18\x3d\x48\xf1\x75\x07\x9e\xed\x50\x32\x3c\x6b\x19\x2e\x02\x0e\x16\x2a\x35\x03\xaa\x58\x2f\xb0\x8b\x40\x36\x24\xa2\x3e\x35\x7e\xed\xa0\x8d\x90\x43\x86\xf3\x58\xc3\x6c\x64\xd3\x14\xc7\x7c\xd9\xd4\xd2\x3d\x58\x1e\xe5\x3d\x81\xff\x97\xad\xa0\x19\xcf\xcf\x04\xeb\x9d\xcc\x1d\xe9\xb7\x4c\x3d\xb6\xb8\x11\x57\x8b\xd4\xf2\x19\xc5\xca\x48\xef\x4c\x82\x6b\x09\xe6\xc9\x6d\x03\x1f\x65\xdd\x48\xb6\xe7\x3d\x0c\x10\x05\x86\xb2\x1d\xf0\x29\x3a\x03\xd2\xed\x7e\x50\x09\xad\x02\x53\x40\xc2\x1d\x09\x06\x06\x91\xf5\xcd\x8a\xf2\xab\x12\xf9\xb8\x60\xee\x87\x81\x5e\x1a\x9f\x40\x0c\x2a\x6f\x63\x4e\xa8\xf9\xb3\x42\x5a\x08\xd1\x0b\x3c\x81\x53\x67\x38\x8f\x4d\x1b\xe3\x56\x31\x8e\xcf\x90\x35\xd0\xee\x97\x5a\xff\xa8\x59\xca\xac\x28\xeb\xcc\xd0\x59\x9b\xb2\xf6\xf3\x52\x36\x61\xbd\x17\x8f\xc9\xe4\xca\xc3\x78\xbb\x9d\xd4\x71\x6b\xb0\x69\x23\xfd\x2b\xbd\x56\xc9\x59\xc4\x2b\x95\xd5\x01\x93\xf8\xbf\x29\x9f\xcc\xa3\xb2\xee\xa9\x4e\xc5\xf9\x85\x83\x92\x4c\x08\x04\x16\xe2\x8b\x54\xfe\x57\x65\x84\x58\xb0\x55\xce\x4d\xe8\xa7\x5f\xc8\x27\x15\xca\xe9\x1d\x37\x5c\xf6\x92\x81\x37\x80\x51\xbb\x61\xfd\xd7\xbb\x00\x68\xf6\x3e\xfa\x6d\x6e\x83\xd8\xfd\x42\x57\xaf\x80\x97\x0f\x4a\x9e\x69\x24\xb2\xde\x0a\xd9\x66\xdf\xfe\x6f\xa4\xa1\x13\xb0\xe7\x72\xf1\x76\x87\x85\xb3\xb4\x20\x49\xf7\x6c\x48\xad\x80\xf2\xc6\x7f\xb0\xf9\x1a\x5f\xc4\x10\x79\x12\x52\x0d\x8d\x68\x3c\x06\x2c\x3a\x22\x2b\xcd\xa7\xe7\x10\xba\xcd\x47\x8e\xe8\x83\x67\xb6\xa0\x59\xa4\x52\xfd\x26\xf1\x14\xa5\xac\xbd\x69\x79\xba\x01\x9f\x7d\xa6\x8a\xc0\x4a\x19\x30\x26\xbc\x1c\x27\xe4\x83\x7b\x1d\xe2\x9c\xce\x09\x0e\x33\x80\xd5\x05\x1a\x58\x64\x09\xe6\x28\xe3\x14\x56\x65\xbb\x1d\x84\xec\xd8"}, +{{0x69,0xd0,0x1d,0x82,0x91,0x13,0x08,0x1c,0xbf,0x5d,0x0c,0x6e,0xf7,0x7b,0x21,0x77,0x5c,0x8d,0x9b,0x68,0x00,0x00,0x05,0x6f,0x03,0xc7,0x5a,0x7d,0x0a,0x05,0x87,0xd2,},{0xee,0x84,0x69,0xdd,0x61,0xcf,0x5d,0xe4,0x00,0xda,0x7d,0x7a,0x47,0x9a,0x44,0x18,0xe6,0x77,0x2e,0x69,0xff,0x53,0x30,0xce,0x5c,0xa7,0x78,0x59,0xfe,0x27,0x17,0x55,},{0x40,0x8c,0xef,0xcf,0x01,0x41,0x7e,0x2d,0xc6,0xa8,0xa1,0x82,0x84,0xe4,0x11,0x65,0x7f,0x03,0x92,0x50,0xc3,0x12,0x78,0xdb,0x28,0x19,0xf9,0xea,0xea,0x42,0x93,0xfb,0xf6,0x83,0x1a,0x28,0x01,0xfc,0x1e,0xa6,0x87,0x16,0x57,0xb8,0x41,0xe1,0x73,0xf4,0x51,0xb0,0xd5,0x75,0xa9,0x37,0x9e,0x35,0x85,0x7e,0x8c,0x72,0x97,0xfa,0x14,0x04,},"\x0b\x9e\x11\x0f\x29\xd1\x98\x16\xa1\x7b\x2c\x75\x47\x8f\x13\xce\xe9\x53\x81\x1a\x19\x83\x01\x4c\xb7\xeb\x0f\x75\x52\x69\x12\x04\x4c\x3e\xa6\x82\x97\x80\xe6\x57\xf8\x17\xc5\x59\x7d\x46\x61\x08\x0d\x90\x34\xc9\x77\x87\x22\x41\x8f\x2c\x3a\xee\xca\xef\x6b\x69\x0c\x5b\xd3\xb5\x93\x70\x10\x86\x98\x8e\x43\x40\xae\xc3\x4e\x01\x72\x75\x8e\xb2\x40\x87\xd0\x3a\x8f\x76\xe7\xcb\xca\x53\xaa\xaf\xc4\xd2\x15\x5c\x75\x32\xab\x54\xbe\x48\x87\x26\x53\x06\x6f\xa1\xfd\xd5\x4a\xcf\xe9\xda\xae\xca\x35\x6c\x29\x0e\x6b\xe6\x33\x55\xb6\xd9\xfc\x52\xeb\x5e\x4f\xcc\xbb\xc6\x08\x35\x07\x13\x2d\xe4\x85\xbf\xae\x9f\x42\xe1\x97\x12\x23\x2b\x71\x64\x02\xc2\x3f\xea\x74\xef\xa6\x9d\x73\xc8\xc2\xe3\xa8\x66\x2b\x8b\x65\xb0\xfd\x00\x77\x41\x01\x3e\x1f\x6e\x3c\xfe\x43\x45\xd5\xc8\x30\x68\x2f\xe6\x00\x21\xd7\x08\xe1\x0a\x9e\x9f\x40\x52\xff\x7a\x6a\xbf\x28\xac\xb1\xd6\xb5\xfb\x03\x8e\xed\x3f\x72\x51\x3c\x35\x5b\xbf\xd5\xc2\x27\x4f\xa8\x5f\xc4\xf4\x46\x97\x4b\x2d\x1b\xc0\x36\x50\x7a\x1e\xb5\xfc\xf5\x5d\xbd\x44\x21\x0e\x53\x82\x74\xde\x80\x8b\x90\x0b\xf1\xc0\xfc\xc0\x24\x12\x70\xdb\x8d\xbd\xcd\x88\x34\x9d\x67\x22\x4f\x08\x7e\x5f\x07\xf6\x99\xb0\xba\xe6\x8b\x2e\xbc\x9a\x4e\x27\xc7\x0d\x3a\xc7\xd9\x96\xfa\x7d\x4d\xab\xd5\x68\x37\x8e\x3f\x93\x90\x5b\x1c\x89\xc6\x52\xd3\x84\xc1\x6c\x2b\xcb\x1c\x98\x44\xc3\x8f\x71\xbb\x13\xe0\xc6\xa2\xea\x95\xb6\x12\xe3\x90\xc5\xf8\x6d\x24\x8e\xa5\x31\xf2\xec\x6f\x63\x9a\x40\x2d\xfa\xcc\xf3\x72\x17\x00\x53\x44\x03\x07\x45\xd1\xf1\xe5\x20\xcc\x19\x5d\xaf\xdd\x7f\x29\x5f\x37\x7b\x8d\x61\x47\x16\x70\x38\x36\x21\x9b\xb7\xb0\x9f\xea\x7a\xae\x9a\xc3\x3e\x42\xdc\xab\x65\xcc\x61\x42\xfc\xd8\xce\x15\xe9\x77\x17\xfd\xb3\x3e\x95\x38\xc4\x4f\x6c\xd9\xc1\xc6\x5d\xb6\x27\x51\xf5\x52\xf8\x70\xf1\x01\x42\xc9\x6f\x9d\xf1\x85\x5a\xbb\x39\xe4\x27\x06\xa5\x63\xab\x15\x45\x11\xfd\xce\x68\x7c\x95\x76\xf9\xed\xc3\xb4\xba\x55\x34\x6c\xe6\x68\x02\xff\xfe\xf4\xb1\xb5\xe1\x20\x15\xce\x8b\x57\xde\x54\x58\xca\xa0\xda\xf3\x41\x96\x81\x28\x58\x42\x88\xc2\xf2\x7c\xbf\xb7\x6e\xab\x28\x6b\xac\x5f\x66\xaa\xd0\x04\x9e\x0c\xa6\x0a\x90\x14\xe1\x79\x01\xc4\x13\x0e\x83\xce\xae\xb4\xc2\x71\x3e\x97\x1a\x23\x5e\xff\x99\x5a\x81\x3a\xe4\xea\x64\xa5\x83\xff\xde\xfd\xac\x82\xac\x76\xea\xf4\xd4\x7c\x4a\xc8\x25\x0f\xcb\xaf\xd6\xb8\x8f\xae\xb4\x80\x15\xf5\xb4\x2b\x53\x34\xa5\x0b\x31\xd4\x50\x2e\xa4\x91\xda\x90\xdc\xe9\x3c\x08\xfd\x56\xf5\xc5\x8e\xed\xb3\x79\x16\x6a\x23\x76\x2b\xe5\xe4\xad\xea\xa6\xf4\xae\x1c\x24\xe0\xca\xc4\xdd\xca\x03\x83\x45\x85\x60\xcd\xc4\x8b\x8c\xd1\xf4\x2a\x3b\xa2\xf6\xff\xb6\x07\x79\x09\xfc\xb2\x94\xad\x1e\xf4\xa4\x4c\x22\xec\x4b\x39\x87\xdd\xbe\xef\x32\x5b\x98\xce\xd5\x68\x15\xea\x7d\x5f\xcc\xf5\xaf\xdf\xe9\x8e\x0e\x6d\x92\x0f\x7a\xda\x2e\xb5\xc9\x16\x24\xc7\x6c\xbb\xa2\x99\x3a\x9c\x7a\x55\x02\x1d\x12\x7a\x66\x7b\x39\xe2\x35\xdf\x4f\x81\xde\xe7\xdd\x14\x28\x98\x77\x8d\xbd\x92\x13\x5b\x70\xb3\xac\xf5\x9f\x6c\x29\xa2\xc9\xd4\xa7\x00\x6e\xf1\x1a\x91\x8b\x3a\x29\x06\x26\x4a\x15\xd6\xb5\x29\x30\x8c\xbc\x89\xf8\x56\x01\xfc\x1e\xa1\x31\x4d\x67\xf7\x56\x6c\xf1\x09\x16\x5c\x7f\x92\xde\x1a\x18\xd7\x0d\xeb\xe0\x24\x34\x9d\xb3\x56\x0a\x6e\x52\x7e\x2a\xc3\xe0\x67\x89\x46\x87\x04\xe6\xb8\xf1\x87\x1f\x16\xba\xe9\x82\x73\x92\xb4\x18\xf1\x08\x6c\xc4\x97\x08\x6c\xed\x14\xb1\x24\x9d\x6d\x87\x94\xf2\x3b\xb8\x77\x9d\x41\x86\x48\xf2\x15\x56\x56\xa6\xfd\xa7\x44\x0c\x56\x28\x4d\x9b\x21\x88\xfa\x7d\x17\x36\xbc\xcc\x9c\xff\x0b\xe5\xb1\xe1\xf5\x51\xff\x81\x37\xff\x59\x66\xed\x9d\x0f\x7f\x01\xc3\xdf\xf2\x98\xe9\x10\x2f\xfb\xd3\x24\xbf\xca\x5f\xfe\x09\x68\xe6\x6f\x9d\x82\xf4\x87\xd3\x03\x93\x4f\x27\xf7\x8b\x28\x37\x8e\xb7\x2c\x38\x27\x29\x62\xa5\xf7\x35\xd7\x39\x2e\x5d\x33\x3f\xd8\x6d\xe1\x67\x26\x9c\x17\xa1\x65\xb9\x2d\x31\xa4\x88\x0a\x41\xe1\x36\xf7\x18\x96\x0a\x91\x9b\x3d\x7c\x4e\x74\xcb\xd7\x3c\x73\xf9\x21\xbe\x51\x3f\x73\x9a\xff\xb2\xe4\x1f\x80\x42\x6b\xb8\xcf\xb4\x56\x4b\x98\xfc\x4d\xe5\x32\x55\xce\x3f\x98\xb4\xd2\x2a\xe6\xfc\xe9\x19\x0b\x55\xbf\x2c\x93\x86\x1c\x1d\xca\xc1\x01\xb5\xe1\x6c\xf0\x99\x91\xc5\xde\xfa\x33\xf8\xd5\x10\x56\xd9\x34\xbb\x4b\x47\x7b\x65\x20\xd4\xc7\xae\x22\xea\x7f\xb3\x10\x9d\xe7\xf4"}, +{{0x4b,0x8e,0xd2,0x97,0x31,0xf1,0x04,0x79,0x5e,0x97,0xde,0xe7,0xc8,0xb4,0x01,0xa0,0x2a,0xfa,0xa9,0xa7,0x95,0xe6,0x13,0x35,0x3d,0x2b,0x95,0x00,0x17,0x65,0x02,0x7a,},{0xf2,0x22,0x98,0x21,0x0b,0x09,0xfd,0x61,0x7f,0xc8,0xb3,0x50,0x74,0xca,0x18,0x01,0xe6,0x07,0x5d,0xc9,0x2a,0x8f,0x50,0x34,0x4b,0x80,0xe8,0x54,0x05,0xa0,0x38,0xf5,},{0x23,0x45,0x88,0x66,0x86,0xeb,0x39,0xb5,0x19,0x9c,0xaa,0xa9,0x61,0x5b,0xc6,0xb4,0x89,0x6f,0x07,0x6e,0x8b,0xd7,0x36,0xc0,0x03,0x8a,0x65,0x17,0xf9,0xc2,0xb1,0x67,0xe7,0x59,0xf3,0x73,0x72,0x26,0x8a,0x69,0x7e,0x9b,0x78,0x60,0x5f,0x2e,0xd9,0x47,0x25,0xf6,0x90,0x5a,0x79,0x00,0x15,0x3f,0xc9,0xe8,0xbe,0xed,0x31,0xff,0xae,0x05,},"\xcb\xb5\xf1\x3a\x0e\xf2\x83\x7b\x80\x5d\x3b\x78\x51\x09\xf9\xf2\xe0\xd0\xa0\x17\xbf\xe7\x69\x2d\x91\xec\x23\xdd\xab\x78\x17\x33\x0b\xef\x24\x7f\xd9\x1a\xb2\xc7\x7d\xd4\x41\x25\x19\xcb\xd3\x84\x75\xce\x0c\xb3\x9b\x14\x80\x09\x2b\xc7\x38\xd4\x15\x2b\x8a\x6d\x55\x24\x8e\x3b\x9f\x32\xcd\xcd\x15\xec\x5d\x05\x9e\xc3\xc8\x84\x75\x54\xee\x47\x00\x53\x94\x97\x4d\x8e\xb2\x35\x92\xd1\x7f\x5a\x39\x6e\x3c\x19\xf8\xe8\x98\x37\x06\x79\xfe\xf5\x31\x8c\x4d\xd2\x99\xc6\x21\x7d\x6a\xbc\xc9\xb6\x1a\x5b\x2d\x0c\xfe\xf6\x95\xd1\x70\xca\x20\xa8\x3d\x6f\xd3\xc6\x66\xc8\xfd\x1c\x10\xad\x97\x0e\x2f\xa6\xaf\x10\xff\x0e\xd0\xcb\xfe\x75\x22\x46\xd0\x3f\x3a\x3c\x60\x32\xdb\xb3\x19\xbc\xfd\xac\x4d\xaf\xc5\x0b\xc3\xe6\xbf\x59\x5f\x49\x1d\xec\x38\x8b\x34\x41\xb8\xce\xe0\xdf\x91\xf5\x5c\xc7\x80\x7d\x07\xf8\xf5\x41\xed\x73\x22\xff\xc3\x9d\x18\xf8\x95\x60\xe4\x12\x3a\xec\x1d\x77\x96\x9c\xf1\x87\x77\x86\xf4\xcf\x94\xb1\x77\x0b\x10\x90\x65\x5e\x8c\x72\xee\xce\xa4\x57\x2e\x46\xf5\x80\xf9\x63\x96\x6d\xb2\xa1\x08\x5e\xea\xbc\x57\xbf\x4a\x84\x72\x4b\x9c\x85\x99\xa4\x33\xab\xf5\x8b\xca\x80\x40\x91\xd3\xd5\xe6\xe5\x04\x8e\xc2\x7b\xf8\x12\x9b\x67\x0c\xc2\xc8\x8d\x9c\xac\x47\x18\x59\xf4\x69\xb9\x18\xf3\xf6\xd7\x0f\x7d\x66\x63\x50\x1f\xfb\xef\xef\x02\x6d\x79\xea\x70\x92\x7c\xcf\x60\x75\xee\x51\x05\x42\x33\x21\xe1\x1a\xee\x9a\xd1\x6f\x98\x7e\xfb\xdd\x00\xb6\x2a\xff\x69\x8e\x52\x1a\xdf\x92\x03\xb1\x5e\x9f\x0f\x3a\xd0\x7d\xca\xd9\xdd\xcc\xaa\xe9\xb4\x90\x24\x7f\x12\xc3\x11\xde\xe6\xb7\x3b\x8f\x91\x24\xfd\xce\x12\x99\xb4\x7f\xb1\x91\x4c\xee\x7e\x3a\x07\x81\x4e\x31\x2c\x3c\xe5\x69\x27\x67\x2c\x51\xb3\x18\x59\x80\xcd\xe5\x7f\x3a\x75\x9b\x50\xbc\xfc\x4c\xb0\x75\x3b\x95\x4d\x97\x13\x5d\xeb\x2a\x05\x32\xe9\x8b\x66\xf3\x9a\x7c\x08\xcf\x4d\x54\x85\x39\xe2\xeb\x9f\x42\x2f\x66\x49\x65\x88\x93\xa7\xc3\xc2\x5a\x4f\xc9\x01\xf8\xc3\x98\xb8\xc7\x27\x33\x91\x1a\x00\x72\xed\x6b\xd2\xf4\x18\x93\x89\xae\x10\xa8\x14\xf6\x48\xd7\x1f\x69\xc3\x7e\x82\x95\x78\x44\x28\x18\x3b\x93\xc8\x01\x3b\x96\x4a\x9f\xef\x86\xb4\x8f\x48\x93\x16\xbc\x22\x2e\x96\xb3\xbd\x15\xff\x14\x9b\x96\x82\x03\x29\x55\x1c\x15\xe0\xd0\x95\xd1\x56\x9b\x1e\x21\x31\xc7\x87\x51\x56\x5c\x30\x41\xf2\x97\x85\x39\x5b\x97\x15\x13\x17\xf6\x2e\x35\x82\xe4\x07\xb1\x64\x9e\x60\xd0\x3a\x85\x99\x12\x0a\x30\x2a\x46\x95\xfa\x86\x2b\x41\x20\xf9\x4d\x22\xec\xae\x72\x39\x8d\x20\x94\xd1\x08\xad\x2d\xbc\x1b\x95\x97\x35\x90\x21\x42\xaa\x5f\xe6\xe7\x99\x65\x59\xf6\xf6\x01\x44\x8a\xea\x02\xf3\x56\xf8\xdc\xdd\x14\x43\x40\xeb\x36\x19\xf9\x86\x5b\xf7\x67\x2a\xea\x32\x6c\x4e\x93\xc9\x9f\x0e\xd1\xf9\xed\x86\x6b\xe1\x5d\x3a\xf2\x67\x5f\x6d\xd6\xe2\x96\x60\x2c\xa3\x73\xa8\x15\xb0\xbe\x46\xbc\x2a\x3f\xbb\xa0\x6b\x88\x05\xc7\x31\xfe\x08\x00\x7d\xaa\x06\x05\x09\x61\xb2\x4d\x14\x69\x3a\x72\x89\x8c\xcf\xb8\xb8\xfe\xdc\x60\xa4\xee\xf8\xff\x79\xb6\xdd\x75\x92\x59\x18\x33\xb5\x76\xef\x48\x29\x4e\x5e\x04\x85\x94\x2e\x57\xc1\x19\x60\x2e\xdd\xf8\x8b\x1f\xae\xa5\x17\xf2\xfc\x2e\x3d\x14\xd2\x46\xa5\x2c\xbd\x71\xa1\x08\xc6\x6b\x6c\xc4\xf2\xd4\x58\x04\xa2\x82\xec\xed\xb1\xb0\xad\x3d\xc3\xb4\x88\x0a\xb2\xff\x78\xb8\xdd\xde\x48\xf7\x46\x6c\x14\xfe\xd3\x49\xe9\x5b\x50\x53\xab\xf1\xbf\x09\x91\x12\x60\x31\xd9\x75\x47\xd1\x43\xc2\xae\x16\x49\x28\xb6\x1c\x07\x08\xaf\x8c\xa3\xe4\xf5\x51\x54\xd1\x3d\x75\xe9\x7d\xb4\xba\x3e\x69\xd3\x6e\x9b\x37\x08\x23\x68\xc2\xf7\x21\xbd\x3f\x95\x12\x6a\x1e\x00\x4e\xb2\xa1\xbf\x26\x83\x43\xae\x21\xd2\x99\x50\x44\xa2\xca\xdd\x67\xff\xac\x9e\x15\x38\x17\x5b\x3c\xc4\x4d\xb5\xd2\x6f\x1d\x5c\xc8\x9c\xa0\xe1\xc1\xee\x85\x37\xa8\xa9\x1d\x32\x4c\x2e\x02\xe1\x8b\x9f\xb9\x73\x0d\x6d\xda\x55\xf7\x2d\x84\x33\x89\x69\x3e\xbf\xcb\xa7\xfb\xe1\xa0\xbc\xff\xb9\xaa\x28\x4f\x4a\xe6\x6f\x44\xa8\xb8\x93\x02\x98\x3b\x22\x73\x6d\x0c\x72\xd6\xa0\x44\xe4\x29\x16\x24\x24\x3a\x4e\x0c\xe6\x5d\x5e\x53\x46\xd6\x7f\xed\x37\x60\xdd\xb0\xc5\x10\xb5\x0f\xf3\xee\xf0\xa1\x8a\x26\x7d\xe7\x30\x47\x6d\xd8\x2d\xff\x70\x72\xcb\xa0\x98\x48\x25\xa0\x04\xdd\x4b\xcd\x8c\x37\xfd\xaf\x1f\x68\x3d\x1d\x93\x80\xe1\x35\xa9\x5d\x24\xb8\x9f\xad\x0b\xe9\x41\xc5\x48\x25\x1b\xec\x90\xcc\xae\x01\x5b\xc0\x56\x7d\xa8\x4b\x37\x1e\x50"}, +{{0x08,0x0d,0x7f,0x76,0x18,0x2e,0xe6,0xbc,0xea,0x89,0x4b,0x1e,0x00,0x60,0x55,0x8b,0x3b,0x12,0x5a,0x34,0x99,0xdf,0x39,0x73,0xb8,0xdd,0x66,0x93,0x40,0x8e,0xe4,0x69,},{0x41,0x24,0x71,0x3d,0x7c,0x2d,0xf5,0x0f,0x93,0x05,0x57,0x30,0xd1,0xb2,0x81,0xda,0xec,0x30,0x28,0xcf,0x2c,0x1e,0x48,0x58,0xd1,0x28,0x70,0x7a,0x23,0xd6,0xde,0xb0,},{0x18,0x5f,0xb1,0xb6,0xd8,0x6d,0xc4,0x44,0x48,0x10,0xcf,0x5e,0xc6,0xfe,0xf0,0xab,0xda,0xfa,0x2a,0x6f,0xcc,0xb4,0x5d,0x11,0xcf,0xb5,0x4b,0xa1,0x6a,0x68,0x43,0xf2,0x80,0xd3,0x80,0x47,0x10,0x02,0xae,0x0d,0x71,0x50,0x85,0x56,0xc7,0x8e,0xd5,0x41,0x5e,0x42,0x33,0x8c,0x16,0x1f,0x2b,0x62,0x1e,0x74,0xcb,0xa4,0xf6,0xa1,0xd4,0x02,},"\xab\x0a\x6d\xe2\x35\x1b\x9a\x84\x98\xf6\x82\x72\xd9\xa0\xa7\xa0\x57\x36\x5d\x34\xef\xa0\xfd\x34\xcc\x3b\xf8\x62\xe4\x9c\xdc\x30\x2b\x2b\xd5\xa3\x0d\x60\x1a\x13\x0e\xc4\x03\x2f\x54\x1a\xe6\xcb\x7b\xa9\x7f\x84\x18\x3d\x2d\x25\x81\x28\x7c\xa7\x01\xd7\xd7\xa9\xab\xa1\x10\xce\x58\xb9\x46\xac\x08\x24\x30\x5d\xf7\x92\x9f\x3d\xd7\xfc\x9c\x87\x32\x23\x86\x37\xe2\xb1\x81\xd6\xe1\x16\xc7\xf6\x6e\x32\x26\xaa\xe3\xce\xd1\x61\x02\x62\xda\x1a\x0a\x4a\xa5\x0a\x1b\x94\x43\xec\x82\x83\x29\xe4\x73\x4d\x28\xfc\x25\xab\x9c\x1d\xe9\xb8\x98\x7e\x5d\xc0\xc8\x13\x19\x16\xc5\xf1\x89\x28\x70\x4a\x71\xe8\x06\x22\xb1\x49\x2b\xf2\xfe\xc5\xd4\xb6\xdb\xe4\x15\xc8\xaf\x2c\xe3\xef\x10\x9b\x34\xdd\x5e\x64\xd5\x68\x46\xf0\x85\x93\x5a\x4a\x5d\x10\x73\x49\x7f\xb3\xfb\x8f\xb7\x7e\x8f\x5d\x5e\x3f\xd0\x0c\x30\x65\x2e\x3c\x5c\xde\x40\xa3\x35\xd1\x4e\x54\x25\xff\xba\x94\x28\x85\xed\x17\xbd\x36\xdf\x50\x69\x24\x23\x7e\x75\xbe\x84\xda\x82\x19\x50\xb9\x14\x24\xfd\x9f\x16\xc1\xb2\xc7\x83\xe9\x0f\x8c\xc2\xcc\xc7\x98\x0c\xe9\x15\xc7\x69\x6b\x06\xa5\x86\x73\x02\x59\xe6\xd1\x45\x88\x58\x2b\xab\x9d\x2a\x39\xf6\x9e\x98\xe7\xf2\xae\x9b\xc0\xc2\x61\x0d\x7e\x04\x57\xf2\x6a\x5d\x66\x54\x3b\xe1\xd6\x5b\x79\xc4\xb7\xc0\xd8\xee\x73\xd0\xc2\xb6\x7b\xf5\x0d\x80\x82\xf0\x06\xf9\x6d\x11\x95\x05\x87\x31\x93\xdf\xdb\xd4\x32\xbb\x1c\x9e\xe0\xd0\x3e\xe5\x4c\xf9\x5d\x20\xe9\x1f\x7f\x3a\x06\x9b\x62\x56\xf4\x21\x59\xcd\xc1\xe6\x00\xa9\xa1\xc2\xf5\xa8\xe4\x67\xd5\xc2\xa9\xdf\xf8\x73\x0e\x6b\xe8\x26\xfb\x2a\x1e\x64\x48\xbf\xc4\xfc\xaa\xaa\xcd\xaa\x76\x62\x35\x1f\xaa\xdc\x91\xf7\xca\xa7\x73\x7d\xc8\x2e\xc3\xd4\xb2\x19\x36\xbc\xa1\xbd\x7c\xe3\x73\xad\x66\x26\x4a\xf1\x32\x41\x16\x75\x49\x31\x8c\xdd\x78\xe5\x63\x82\x7f\x85\xea\xb2\x0e\x0b\x42\xbc\x55\x4a\x71\x2c\x00\x51\xa5\x01\x0d\xc2\xf2\xc7\xdb\x85\xac\xf6\x54\x9f\x9d\x10\x2c\x90\x3c\x1b\xe5\xa0\x52\x92\xc3\x0f\x21\xab\x1b\x2b\x8a\xbc\xbb\xf1\x04\x72\x3c\x63\xf0\xeb\xc5\x54\xfb\xee\x42\x02\x0c\xcb\x14\xf4\x43\x47\x8d\xf7\x7c\x6a\xa4\x4d\xb9\xa5\x7f\x8f\xd4\x4d\x97\xea\x09\x9e\x47\x74\x82\x3e\xbe\x12\x3f\xcf\x50\x16\xa6\x6e\x83\x7b\x2f\x65\xc1\x84\x5e\x68\x1e\xe2\xa7\x05\x9f\xb1\x29\x0c\xd0\xa9\x33\x12\x98\x55\xcc\x83\xc8\x7e\x0b\x3b\xb6\x1e\x44\x13\x4a\xdd\xd3\x63\x78\x50\x24\x6c\xdc\xda\xa2\x9f\x15\xc4\x1a\x3d\x4d\xd2\xc1\xd7\x60\x06\x21\x24\x33\x31\x24\xcf\x09\x14\x35\xfd\xce\x71\x1f\x52\x31\x63\x68\x99\x9b\xef\xa4\xc8\x0a\x39\xb3\x75\x0e\x4e\x38\x62\x89\xe4\xe2\x85\x5e\x97\xb6\x19\xb0\xa2\x57\x99\x91\x24\x08\xb7\xd5\x8a\x4d\xd9\x81\x95\x71\xe9\x01\x43\x0f\x6d\x55\x55\x29\xdd\x63\x0a\x18\x67\x45\x9b\x80\x22\xd0\xe0\xad\xd6\xab\x4f\x12\xf6\x0b\xaa\xc7\x59\x79\xbb\xff\x7f\x62\x58\xd2\x8d\x67\x60\xb1\xff\x24\x3c\x39\xe4\xbb\xd6\xcf\x9b\xea\x57\x2a\x9c\x08\x2d\x05\xad\xcf\xd4\xcc\xf9\xfa\x02\x6f\x2c\x90\x4b\x6e\x78\x2e\xd7\x09\xdf\x77\x48\xa3\x07\xcd\x2d\xc3\xa0\xfc\x41\x23\xdf\x58\x0c\xbf\x49\xe0\x5c\xee\xab\xc9\xf3\x9e\x57\xb7\xf3\x00\x90\x5d\x8b\x31\x00\x91\xfb\x95\x3f\x3d\xef\x36\xde\xb3\xe8\xbf\x37\x2f\x59\x16\xb5\x15\x97\xdf\x02\x4c\xe8\x5c\xc4\xc3\x6e\xab\xdc\x58\x0b\x5c\xf1\x52\x99\x46\x48\xf1\xd7\xf3\x5f\xed\x5c\xd1\x0f\x6e\x29\x49\x16\x1a\x33\x59\xb3\x03\x4d\x45\x0e\xa6\xf6\x1c\xdf\x1d\x5a\xf7\x6d\x40\x10\x2b\x60\x29\x4f\x4e\x49\x07\x82\x49\x02\x6d\x62\xfe\x35\xfd\xf2\x24\x92\x8b\x0c\x49\xba\x2b\x53\x39\xeb\xb1\x92\xc5\xab\x7f\x05\xcd\xb9\x46\xe3\x7d\x67\x1a\x4a\x5e\xf2\xa5\x82\x72\x20\xb4\x43\x8c\xbd\xa0\x57\x36\x29\x28\x06\x64\x8f\x5b\xdd\x52\x42\x0f\xa7\x6b\x84\xa6\xad\xdb\x12\x63\xeb\x0c\x50\x0e\x81\x56\x6d\x71\x8d\x50\x66\x02\x6d\xa0\x97\x05\x4a\x86\x63\x10\x16\xdd\xfb\x70\x6a\x56\x77\xd5\x02\xef\x84\xaa\x73\xb5\x86\x3b\xc4\x0f\xdc\x42\xcb\x73\x21\xac\x5f\x00\xe2\x92\x8f\xed\x7b\x04\x18\x59\x6d\xb4\xb6\x15\x1d\xd6\xbc\x6e\x81\x8f\x02\x53\x55\x2b\xf1\x37\x41\xe6\x96\x80\xe9\x66\xc9\x2c\x29\x3e\x13\xc9\x0f\x7c\x99\x99\xbd\x1e\xc6\xaf\xe3\xb4\xaf\xfb\x47\x34\x0c\x89\x85\x98\x29\xfe\xb5\x99\xdb\x3a\x8c\x3d\x33\xfc\x8d\x45\xfa\x53\x81\x07\x8a\xe9\xf7\x5d\x85\xc1\x49\x6f\x5f\xb5\xad\xdf\x4e\x40\x09\xb7\x64\xbc\xc9\x11\x8e\x92\x75\xdc\x72\x19\xf2\x81\xd0\xd1\xef\x71\x58"}, +{{0x49,0x84,0x6a,0xda,0x7a,0xe6,0x84,0x97,0x1d,0xd9,0x17,0x10,0x79,0x90,0x90,0xb3,0x7f,0xe5,0xad,0x56,0x1d,0x72,0xa3,0x5f,0x2e,0xfb,0x40,0x5f,0x19,0x6a,0xb0,0xec,},{0x4d,0x37,0x0a,0x81,0x94,0xa3,0x04,0x5b,0x09,0xb3,0xbd,0xaf,0xa2,0x7f,0xb9,0xac,0xd5,0x99,0x43,0xa5,0x4a,0xe1,0x4c,0xba,0xaa,0x22,0x00,0xeb,0x0f,0x3d,0xa7,0x1b,},{0xa5,0xc8,0x09,0xd1,0xca,0x4c,0xfb,0xb3,0xdc,0x70,0xa2,0xa3,0xa1,0xf2,0x67,0xc2,0x73,0x30,0x42,0x07,0x19,0xe3,0x60,0x62,0x18,0xa1,0x47,0x1c,0xac,0x57,0xcb,0x67,0x4b,0x9b,0x42,0x82,0x7c,0x5e,0x9a,0x7b,0x25,0xc8,0x13,0x9c,0x13,0xdf,0xf6,0x0b,0xde,0x6c,0x2d,0xba,0xd3,0xa8,0x36,0x11,0x97,0xc1,0xfb,0x19,0xd2,0xcd,0x52,0x0b,},"\xab\x39\x8d\x94\xf9\x28\xb1\xd4\x21\x02\xa3\xe5\x13\xcc\xd1\xcb\x10\x89\x90\x11\x03\x94\x10\xa8\x88\x8b\xba\x26\xdf\x1a\x03\x72\xbd\xba\x0c\xe8\xd8\x54\xaf\x51\xe9\x33\x0a\x8d\xaa\x93\xc1\x05\x80\x90\x6a\x8a\xc7\x2d\x29\x4a\xeb\x95\x66\xfe\x1c\x78\xba\x84\x71\xc0\x6c\x4a\x8a\x75\x11\x3b\x34\x89\x3f\x62\x76\xed\x81\x32\x92\x05\x3b\x95\x6a\x46\x5d\x84\x7d\x2e\xce\x86\xe2\xda\x8a\x9f\x0f\xe3\xdb\x52\xa5\xaa\xc7\x46\xef\x96\x48\x5e\xf8\x1f\x13\x62\xb5\xa4\x2e\xaa\xee\x1f\xbb\x06\x46\x70\x44\x71\xa2\x1b\xf7\x63\x67\xbe\xaa\x07\x81\x2b\x3d\x32\xad\xcd\xed\xde\xd7\x53\x9e\x3a\x50\x1b\x83\xc0\x5b\x19\xa4\x9b\x52\x0e\xde\xdc\x9a\x78\xa5\xfc\x2d\x50\x12\xf1\xd4\xe3\x81\x84\x4e\x79\x2e\xd9\x0b\x0f\x57\xbc\xe3\x75\xc7\x5a\x65\x8b\x2c\x78\xc6\xff\x7d\x9e\xfc\xd4\xbf\xa3\x5c\x47\x68\xcb\xb1\x95\xe4\x82\x3d\x9b\xbd\x83\x5a\x37\x4f\xa0\x4c\xa1\xea\xae\x9c\x56\x6d\x8f\xd5\xaa\x7c\xa5\xef\xe0\xdf\xc3\x17\xff\xfa\x40\x9e\xf1\x02\x2f\x1c\x3b\x37\x6a\x93\x5a\xf5\x57\x08\x3e\x95\x28\x7b\x07\xa9\x8a\xc6\xc1\xb7\xbd\x8b\xb2\x6b\x60\xfa\x7c\x4b\xc9\x19\x73\xb2\x01\xb2\x99\x22\xb4\xb9\xd0\x3d\xd6\x88\x2a\x0b\xd3\xb7\xd9\xe5\xb8\x1e\xe7\x4c\x36\xbe\xc6\x65\xe4\x34\x3c\x8c\x9a\xd3\x36\xda\x38\x50\xc9\xb2\x69\x7f\xe1\xcc\xe2\x9c\x37\x86\x22\xa3\x3c\x24\x8f\x44\x8c\x88\xf4\x8d\xf0\x26\x01\x43\xb2\xa3\x42\xf1\xdd\xee\x74\xd3\xb9\x7c\xa3\xe1\x16\x6b\x15\x69\x93\xda\xd3\x0c\x49\xd8\x10\xd7\x40\x48\xbc\x6d\x46\x76\x52\x00\x4d\x7e\xdb\x65\xc6\xda\xc3\xa2\xc5\xd3\x00\xb9\x7e\xe3\xa1\x0a\x9e\x14\xb6\x9f\x3c\xad\x67\x59\x72\x96\x2e\x1f\x8e\xd9\x75\x47\xad\xed\xc4\x7d\x1c\xf3\x47\x1e\xf3\xb2\x2f\xdb\xf7\x8e\x34\xf3\x1a\x3b\xb7\x66\x9c\x41\xbd\x92\x92\xc3\x80\xbc\xe9\xa4\x2d\x84\xbc\x27\xac\x92\x8b\x8b\xfc\x3c\x63\xd2\x0c\xcd\xb4\x78\xdf\x7d\xdf\x42\x1f\xb1\xcd\x90\x5f\xfc\x4c\x04\x78\x6f\xd9\xae\xf0\x6b\x89\x38\xab\x8e\xf5\x22\x21\x7b\x2c\x04\x51\x5f\x61\xa1\xc3\x12\xea\x83\x25\x3f\x84\x58\xc0\x91\x8f\xcf\xe8\x74\xe6\xe7\xfb\x11\x27\x5d\xb2\xa2\xec\x79\xa2\xd8\x68\x30\x32\x33\xc1\xb6\x97\x95\x2a\x3b\xfd\x3a\xd0\xa6\xf6\xcd\xd5\xe7\x2c\xc9\x40\x9f\x74\x10\xa4\x0d\x5b\x45\x36\xdd\x46\xeb\x16\x11\xae\x86\x70\x36\x71\xb3\xa0\x51\x5a\x03\x77\xbe\xa1\x56\x54\xba\x0a\x0d\x1e\x4e\x96\x02\x63\x28\x42\xf2\xac\xd4\xef\x99\x32\x36\xe9\x93\xf2\x65\x0d\x59\x92\x3f\x24\xe2\xcd\x30\x93\x2d\x8b\xf8\xae\xec\x64\x44\x72\xba\x46\xa0\x78\x81\x49\x6c\x92\xa0\x13\x5c\x67\x5a\xeb\x0c\xe6\x18\x10\x88\xdb\x8f\x15\x6c\xfe\x74\x35\xca\xc6\xc9\x7d\xa6\x37\xdb\x4a\x89\xf5\x13\x31\xda\x13\x73\x1e\x74\x1f\xcc\xc0\x35\x55\x42\xce\x11\xef\xa6\x9d\x05\x38\xd3\xef\x12\x7a\xa6\x87\x45\xed\x30\x85\xd2\x9d\xa9\x0d\xc5\x83\x70\x1b\x6b\x3a\x70\xa3\xef\x3e\x16\xa9\x24\xb3\x32\x03\xb9\x23\x96\xc4\xb9\x45\xf1\x27\xa7\x88\x8f\xa0\x50\x15\xc0\x60\x30\x07\x56\x67\x29\x23\x7c\xc0\x78\x2b\x30\xc0\x20\xd9\x95\x95\x47\xfe\xec\x9f\x4d\x67\x64\x60\xbf\xe0\xc5\xc1\x9c\xea\xba\xee\x06\x82\xdb\x8b\xe6\x91\x35\x18\x1e\xc0\xfd\xd9\xf7\xa6\x6d\x50\xbd\xc3\x79\xe4\xa2\xc5\x98\x17\x8f\x95\x93\x94\x6a\xca\x64\x05\xb1\x77\xfc\xad\xe0\xf8\x64\x21\x58\x3e\xd6\x7e\xba\x18\x72\x22\xa1\xe4\x44\x95\xb3\xae\x54\x4f\xdc\xa2\x8e\x2c\x14\x48\x5e\xab\x04\x71\xaa\xa8\x03\xc2\x9a\x9d\x8a\x48\x92\x67\x64\xfc\xa1\xdf\x51\x40\x7a\xd3\x3e\xc1\x7e\x94\x1e\x6e\x26\x17\x23\x7a\x84\x30\x98\x73\xdc\x71\x36\x55\x87\xbd\xe4\x27\x4b\x5d\xc3\x27\xcc\xb1\xe1\xe9\xc8\x57\xe0\x42\xcc\xca\x8d\x85\x52\xba\x28\x8c\x97\x8c\xfa\x0a\xf9\x9d\x67\xcd\x03\x40\x60\x62\x8e\x23\x52\x5d\xbc\xa2\x07\x67\x9c\xe2\x96\x90\x87\x84\x48\x55\x3c\xd3\x86\x75\xbc\xe0\x7b\xf9\x7b\x93\x17\xdc\x44\x46\x8b\x76\x8b\x15\x8b\x0c\x11\x1d\x63\xa5\x72\x23\x56\x55\xc4\x0e\x16\x59\x7c\xa0\x59\xf4\x0c\x3d\x8a\xc5\xbd\x61\xa4\x87\xc1\x53\x13\x84\x6a\x70\x4a\x78\x11\xb8\xbc\x0c\xee\x61\xe3\x47\x62\xb6\xc1\xb7\xce\xa1\xc4\x6e\x60\x87\xe9\xa3\x6f\x89\x91\x8a\x25\x8b\x3f\xa7\x76\x20\xbe\x10\xc1\x84\xc3\xfc\x39\x73\x90\x24\xe9\x82\x78\xfd\x65\xb8\x2c\xad\x83\x69\x9f\x3a\xd8\xc6\xec\xcb\xec\x8b\x7b\x1b\xd7\x91\x4d\x3f\x6c\x3d\x02\xbf\x40\x28\x3b\x1c\x1f\x1e\x98\xe3\x08\xbe\xae\xbb\xf8\x94\xb8\xf5\xe9\x1b\xbb\xc6\x25\x35\xf9\x23"}, +{{0x83,0x34,0x3e,0x37,0xad,0x09,0x1a,0x85,0xee,0xc3,0x70,0x70,0x1b,0x81,0xa5,0x8f,0x93,0x70,0xa4,0xb0,0x42,0x3a,0x07,0x0d,0x60,0xf9,0x2d,0x8d,0x18,0x09,0x84,0x4e,},{0x50,0xb6,0x8b,0xf7,0x26,0xea,0xbc,0xa5,0x3a,0xc6,0xc9,0x0d,0x4e,0xac,0x55,0x47,0x03,0x71,0x2d,0x22,0x10,0x55,0x54,0xf0,0x5b,0xf7,0x9f,0x9d,0x08,0xfc,0xc4,0x93,},{0x9c,0x69,0x89,0xcb,0xe1,0x7e,0x16,0xca,0xa2,0x53,0xff,0xb1,0xa6,0x4a,0x10,0x6f,0xb0,0x17,0x82,0xc9,0x9b,0x17,0x22,0xba,0xf1,0xac,0xaa,0x42,0xae,0x5b,0x36,0xb7,0x9b,0x2a,0x2c,0xd8,0xfc,0x91,0xf5,0xad,0x89,0x23,0x81,0x70,0x25,0xa7,0x78,0x25,0xa0,0x5d,0xf8,0xc4,0x17,0xec,0x53,0xc4,0xa3,0xaa,0x1c,0x0e,0xfd,0x5b,0xbe,0x0f,},"\xc7\xda\xdc\xac\x5d\x87\x95\xe1\x74\xb6\x91\x38\x91\x2e\x70\xff\x41\xe7\xa7\x25\xfa\xf3\x85\xb7\x73\xed\x15\x09\x89\x72\xb3\x0d\x9b\x73\x93\x72\xd9\x75\xb4\x80\xcc\xfd\xfc\x58\x0e\x2e\x2d\xdf\x5e\x3c\x27\xee\x79\x12\x79\xab\x95\xe4\x38\x2b\x14\x59\xdd\x8d\x41\xae\x36\x0d\x4a\x87\x88\x46\x69\x29\x24\xfe\xef\x39\x0c\x0d\xbb\xfa\x35\xe4\xb8\x2d\x7c\xbc\x33\xee\x15\x81\xc5\x2b\xd9\x49\x38\x5b\x2e\xe4\x02\x63\xa5\x7d\xa1\x17\x4b\xb4\xac\xad\x37\xcd\x8a\xe2\xa6\xb4\x5f\x7a\x6d\x6b\xbe\xf5\xa7\x98\xce\x85\xb9\xe0\x5e\x76\x47\xe3\x34\xec\xfc\x77\x63\x78\xde\x17\x4c\x49\x7c\x0f\x40\x75\xe6\x25\xaf\x7a\xed\x50\x2c\xd1\xcf\x7f\x58\x8d\x0d\x80\x7f\x02\xe3\x2f\x43\x00\xf2\x28\xa5\x0a\x66\x7b\x5a\xd1\xfb\xbc\x17\xe0\xb3\xc5\x70\x51\xdd\xc6\x02\xf5\x76\x07\x9f\x6f\xc5\x88\x9b\x7f\x29\x00\x71\x13\x34\x42\x0f\xc6\x66\xf6\x6d\xba\xff\x41\x26\x33\x6c\x35\x3f\x1e\x5b\x56\x4a\x66\x45\x37\xf8\x37\x86\xda\x5c\x56\x27\x74\x54\x06\xd7\xb2\xfe\x32\x33\xbf\xd5\x8e\xf4\x64\xa0\x6c\x95\xcf\xd0\xb9\x88\xa7\x6d\x05\x3a\x64\x4b\xcc\x15\x9c\xad\x53\xa7\xc5\xdb\xb4\x0e\xef\x5c\xd0\x47\x05\x6a\x3f\x09\x26\x5b\x13\x25\x69\x9c\x7d\x15\x9d\x5c\x90\x24\x40\x17\x33\x57\xff\xab\x8f\x7a\x5e\x38\x9f\x46\x8c\x33\x3b\x78\x2f\x80\x17\x0a\xe9\x09\x83\xaf\x15\x3f\x2e\x73\xbd\x2b\xef\x12\x5e\x3d\x38\x68\xc2\xab\x9e\xcf\x03\xaf\xf7\x6e\xcb\xeb\x18\x16\x7c\xa2\xf7\x11\xcd\x56\x58\x51\xd7\xf0\x4e\xe9\xd9\xb0\x1b\x6d\x83\xa7\x60\x57\x22\x62\x0d\x28\xc8\x4d\x6c\x1a\xf4\x2f\x6a\x76\x92\x58\xf5\x3c\x1f\x66\xda\x36\x66\x6d\xa5\xca\xa9\xbd\x9e\x8f\xbc\x16\x92\x11\xb1\xae\xd9\xc2\x55\x8f\x6a\xaf\x5b\x14\x5a\xbc\x72\x1a\xbb\x00\x72\x01\x94\xe0\x27\x03\x54\x68\xbd\xe3\xfe\x0b\x88\x88\x4f\x4e\x9b\x26\xe7\x71\xe6\xc7\xa0\xa5\x5e\xa3\x6f\xc5\x0d\xec\x8c\xef\x16\x2f\x9b\xba\x5b\x4b\x16\x10\x5a\xfd\x6e\x37\x4e\x03\x8d\x5c\x85\x87\xcf\xd7\xdd\x88\x29\x0b\x2c\x9c\xab\x45\xa2\x64\xd6\x54\x0e\xa1\x41\x6e\x6e\x4e\x74\xa1\x2f\x45\xa2\xef\x13\xcc\x8a\x36\xe7\xb0\xa2\x6b\x90\x2c\x3d\x96\xe2\xe2\x22\x92\x02\xe2\x57\x65\x69\x4b\x94\x33\x73\xd1\x6e\x60\x0b\xd7\x86\xd9\x55\xa4\xb3\xf1\x02\x16\x40\xc3\x9a\x0b\x6c\x69\x15\x00\x28\x1a\xe0\xd0\x98\xcc\x7f\x38\x5e\x18\xa0\x7e\x62\xfa\x4a\x10\x1e\xf5\xb7\x85\x51\xfa\x29\xbd\x15\xee\x03\x53\xa1\xa5\xef\x9b\x21\x6e\x8b\x0f\xa5\x07\x50\xa3\x41\x62\xb6\x35\xa0\xbc\x5e\x5d\x72\x30\xaa\x19\xaf\xa1\x28\xab\xa6\x42\x2d\x38\xeb\x77\xa3\xf0\xbb\x9d\xd8\xe4\x65\x2f\x12\x07\x0a\x37\x36\x1c\x37\x25\x50\x3c\x9d\x22\xe2\xfa\xce\x2e\xa7\x4a\x70\x02\x40\x62\x47\xdd\x86\x97\x5f\x07\x57\x5c\x9e\x7c\x6f\x41\xb5\x3b\x26\xd5\xcf\x52\xc5\xac\xc2\xc5\xd9\x82\x71\x43\x4e\x9f\xa5\x09\xc6\xdf\xbd\x72\x43\x72\xaa\x5c\x13\x45\x1a\xae\x39\x3d\xe0\xa1\x86\x46\x4f\x5d\x33\x7e\x9f\x62\x7b\x4f\x1c\x29\x09\x46\x70\x65\xe8\x9a\x42\x2e\xc4\x0e\xe1\xd8\x0a\x13\x39\x00\xa6\x2f\x4e\x4f\x7e\x94\xeb\x72\x61\x5e\x7e\xc2\x99\x6c\x6c\x24\x30\xc3\xe9\x57\xce\xae\x21\x05\xa1\xe9\x0e\xae\xac\x0d\x31\xaf\xfa\x9f\x57\x92\x6d\x71\xd9\x72\xa9\xa2\xde\x11\x25\x8c\xc1\xe7\x28\x59\x9c\x9f\xb3\x87\x24\x91\x84\x7e\x10\xc6\x7e\xfa\xef\x6b\x69\x6a\x03\x0f\xf0\x53\x3a\x58\x3b\xea\x1d\x04\xdf\x25\xf7\xee\xf3\xa1\x3b\x8e\x31\xaa\xd1\x33\x85\x7d\xf1\xb4\xe5\xff\xbd\xee\x37\xf4\x0f\x38\xd2\x24\xc7\x0a\xe0\x4e\xf3\x3b\x41\xb0\x2e\x71\x91\xa8\x66\x56\xb0\xd7\x2b\x2c\xbb\x53\xc4\x90\x8c\xa2\x06\xf7\x57\x34\xb2\x77\x08\x15\x4f\xcd\x8a\x97\x42\x9c\xfd\x1f\x2d\xa2\x42\x97\x78\x43\x80\x03\xf5\xb5\xb9\xc2\x1d\x9e\xd2\x3b\x8a\xd8\xa2\x28\xeb\x4f\x65\xc2\x4c\x1c\x59\x69\x9a\x5c\x90\xaf\xf7\x73\xe5\xc6\x76\xdb\x36\x2a\x19\x30\xba\x16\xab\xa7\x6e\xf8\xda\xa4\x2b\x3e\xb2\xcc\xc4\x5c\x93\x4d\x23\xd4\x92\x9a\x7a\xd9\xe3\xef\x46\x8b\x06\xa4\x99\x5c\x80\xdd\x23\x6a\x7b\xcf\x38\x79\xd8\xb7\x94\x67\xf7\x2b\x33\x84\xc1\x60\xcc\x18\x17\x14\xe9\x2f\x20\x35\xe7\xb9\x72\xa2\xcc\x52\x42\xd9\x32\x52\x5e\xae\x7c\x50\xbd\x26\x3b\x0f\xa0\x9c\xbd\x9d\x6f\x98\x4b\x9c\xf6\x15\x2d\x9a\x13\x3c\x27\x84\x32\x02\xd1\xe8\x7f\xa5\xa6\xe1\x23\x5d\x9c\x75\x6b\xb8\xe6\x8b\x05\xb9\x8d\xa5\x41\x95\x22\x3f\xdf\x02\x10\x25\x32\x50\x63\x3c\x11\xc5\xf6\x0b\x5e\x67\xd7\xee\xfc\xaa\x6c\x2d\xaa\x52\x31\x37"}, +{{0xda,0x01,0x32,0x21,0xb2,0xf5,0x88,0xaf,0x40,0xe2,0x11,0xa0,0xf9,0x75,0xd4,0x4f,0x9d,0x65,0x02,0x81,0x60,0x51,0x4c,0x39,0x61,0x89,0xf2,0x7c,0x7b,0x06,0x66,0xea,},{0x07,0x11,0x7c,0x6b,0x0d,0xb5,0xb6,0xfd,0xa1,0xed,0xc4,0x39,0x6c,0x47,0xc2,0x2b,0x54,0xee,0x0c,0xe5,0x37,0x5c,0x3e,0xc6,0x33,0xc8,0x3a,0xfc,0x53,0xad,0x6c,0xe4,},{0x10,0xcb,0x52,0xd6,0x10,0xe4,0xa8,0x1d,0x32,0x86,0x9b,0xff,0xce,0x38,0x07,0xe6,0x39,0x1f,0x78,0x2f,0xcd,0x53,0x8b,0x55,0x4d,0x09,0x03,0x7f,0xda,0x72,0x28,0x5b,0x96,0x62,0xb1,0xb1,0x10,0x7c,0x40,0x81,0x78,0xac,0x00,0x9f,0x05,0x25,0x96,0x73,0x88,0xa7,0xd8,0x5f,0xa1,0x23,0x59,0xd3,0xce,0x38,0x75,0x03,0x7d,0xcf,0x6a,0x04,},"\xbc\x93\xee\x1e\xc4\x72\x8a\xc6\x36\xa6\x24\x8f\xcc\x45\x51\xc9\xd1\x59\x80\xdb\x8e\x5f\x54\xb0\xef\x07\x5a\x71\x97\x0e\x17\x6a\x3c\xb9\x18\x2e\x32\xda\x7a\x8c\x2a\xc0\xcd\x7e\x59\x57\x74\x57\x5f\x9c\x83\x50\x6a\x60\x6f\xac\xe8\x95\x12\x13\x5d\x03\x2a\xb0\x5e\x39\xff\xf9\xc8\xca\x6c\x25\xcd\x5d\x78\xec\xc3\xac\x32\x32\x90\xc9\xc8\x16\x26\x73\x5e\x19\x0e\xb5\xae\x34\x5c\xa7\xa9\x58\x40\x9f\x77\x43\xb0\xb1\x61\x49\x16\x83\x22\x17\xc5\x7e\xee\x1b\x4f\x8e\x62\x2a\xc0\x52\xa9\x3d\xd5\xb3\x9d\x07\x61\xe4\x0e\x9f\xbd\x83\x96\xf6\x0a\x3b\xf6\x66\x0c\x5f\xa9\x9c\xd8\x13\x9f\x68\xcb\xe0\x89\x4e\x5c\x67\xe1\x68\xcc\x74\xb2\x72\x4e\x9d\x91\xd6\x00\x0a\x0c\xec\x58\x7a\x11\x46\x3f\x72\xee\x6e\xd2\x55\xbd\x87\xeb\x30\xfd\x45\x75\x96\xf6\x88\xca\x0e\xa7\x3f\x30\x49\x72\x38\xde\x21\xc9\x3f\xbb\x12\x94\xdb\x61\xe4\xa5\x60\x89\x10\x6d\x1c\xf7\xce\x5a\x65\xec\x3d\x12\x17\x0c\xe7\x84\x0f\x08\x8a\x8d\x0e\x3a\xef\x17\xe5\x31\xde\x47\x80\x03\x57\x02\x58\xe9\x27\xf1\x56\xe7\x96\x10\x65\xaf\xa6\x66\xaf\x38\x58\x2b\x35\x3c\xc4\x77\xba\x77\x5c\xae\x45\x94\x6d\x08\xdb\x75\x21\x59\x14\xda\x32\x61\xb6\x22\x94\xe9\x2a\xfb\x38\x14\x59\xc2\x1d\xda\x4e\xa6\xed\x79\x5f\x79\x25\x7c\x09\x4d\xd6\x08\xdc\x8e\x1b\x7c\x40\xcd\x29\xfe\xa2\x22\x08\x8f\x65\x69\x7e\xa8\x88\x95\xd1\x0a\xce\xa8\x79\x73\x60\xdc\xba\xce\xe2\x69\xc6\x06\x60\x0a\xdf\xfd\xcf\x9c\x7c\x38\x1d\x0a\xd6\x69\x69\x67\xd9\xff\x03\xe6\x1a\x24\x90\x65\x02\xb2\x95\xe7\x6f\x4d\x08\x75\x65\x5b\x01\xe6\xff\xca\xcc\x8e\xf0\x11\x29\xc7\x2a\x58\x46\xb6\x0e\xc8\x00\x17\x37\x4e\x75\xd3\x06\x40\x3d\x9e\xcc\xf2\x64\x95\xd2\x98\x12\x0a\x06\x33\x83\x5c\x5d\x1e\xff\x17\xc9\xc6\x24\x76\xf7\x52\xc8\x97\x10\xad\xfa\x4d\x51\x61\x7b\x59\x18\x17\x3c\xba\x72\x25\x40\xe3\x88\xff\xbf\xfb\x96\x68\x74\xdb\x00\x40\x4d\x06\xb0\xce\x11\x39\xba\x74\x14\x3c\x76\xb8\xf4\xd3\x3b\x21\x16\xe1\xcc\xe1\x75\x17\x3a\x96\xfc\x15\x1e\xa2\x39\xbf\xc2\x0d\x66\xfb\xb6\xf5\x2a\x66\x6c\x0e\x81\xcc\x2b\x80\x20\x91\x06\xe2\x48\x0e\x41\x11\xc7\x0e\x7b\xe4\xaa\xbb\x68\x42\x2f\x0b\x8c\x6b\xa1\x5c\x14\x2f\x82\xe6\xc7\xf3\x78\xd7\x80\x0a\x09\xea\xa4\xda\x25\x3c\x2f\xd9\x1e\x12\x63\xc6\xb6\x55\xbf\x70\x25\x5d\x7e\x3b\xb4\x77\x55\x23\xa0\xa9\xe7\xff\x03\x79\x7e\xe3\xff\xca\x8a\x50\xd1\x0f\x20\xd5\xe5\xa8\x89\xec\x5e\x33\x4e\xf2\x6c\xf7\x99\x8b\x08\x36\xf6\x56\x45\x68\x88\xe1\x37\xf3\x9d\x3e\x43\xe2\xce\x3c\x6e\xf5\x40\xd9\x5d\x9a\x20\xc4\x2c\xb8\xae\x2d\x9d\x0f\x25\xa8\x91\xc3\x63\xea\xd9\xcc\x42\x3f\x9a\x32\x3f\xe2\x32\x28\x1f\xb6\x7f\x5b\xe1\xc0\x78\x43\x61\x46\x04\x68\xa8\x7e\x95\xdf\xa3\x5d\x7f\x0f\xfa\x22\x11\xbe\x6b\x5f\xb3\x2d\x42\xba\x65\x18\xab\x6e\xa9\x37\x80\xf4\x31\xd3\x00\x67\x31\xbe\x44\x40\xe7\x12\x97\x4f\x74\xba\xea\x41\x9f\x40\x22\xfa\x25\x02\xe1\xb2\x39\x8e\x93\x86\x16\x7d\x93\xec\xa9\x2c\xa6\x0d\xd7\xd9\x1f\xe8\x23\x24\xf6\x82\xd9\x4a\xa7\xa8\x6a\xb0\x34\xf8\xa9\xe9\x52\xe8\xfc\x95\xbf\xf4\xdf\xed\x6a\x43\x31\x3a\xbb\x92\x40\x1b\x30\xc3\x3c\x79\xa7\xba\x3e\xfd\xbe\x16\x28\x04\x0f\xba\xf4\x43\xf3\xf9\x80\x84\x6f\xdb\x28\x3d\xcc\xd9\x3f\xab\x09\x70\x8b\x7d\x54\x86\x1d\x74\xb1\xfe\x8f\x10\x70\x1f\x21\x1b\xa3\xd3\x90\xe8\xa6\xae\x40\x77\x39\x64\x6a\x79\xa5\x83\x37\xa7\x17\xa8\x72\x00\x9c\x2d\xf6\x76\x1c\x24\x25\xa3\x2a\x00\x18\xaa\xf9\x64\x64\x70\xcb\xc8\x7c\x3a\x65\xc0\xe0\xef\xfb\xaa\x52\x8f\xe4\x78\x3c\x77\x2a\xb2\x66\xb8\xf2\x82\x68\xcf\x14\xaf\x23\x4b\x15\x81\x6d\x1a\x3a\x49\x1a\xf5\xf2\x97\xe3\x3d\x57\x29\x71\x5d\x51\x2c\x37\x3f\xef\x5e\xcc\x3f\x39\x54\xa6\x0a\x2a\x0f\x64\xd8\x29\x47\x41\x19\xca\x1a\x18\xf1\x05\x78\xd0\x4d\x63\x8d\x5e\xea\xfc\x37\x1a\x94\x6f\x6c\xe7\xef\xbd\x2a\xcc\xe3\x4e\x20\x44\x1c\xde\x9a\x37\xd5\xa8\x7d\xc6\x19\xb0\xa7\x27\x59\x6c\xd1\x2e\x15\xcd\x97\x84\xbb\x91\xf1\x39\x9a\x59\xfc\x0a\x7a\x4a\xf6\x8b\x0d\x57\x5d\x93\x38\x71\x72\x97\x33\x75\xc4\x65\xdf\x5d\x2d\x5e\x06\x1a\x2a\x9b\x23\xb4\x91\x5a\x0a\x8b\x8c\x1f\x09\x42\x09\x4a\xf7\x28\xc8\xc3\x11\x45\xfa\x7a\xaf\x74\xa2\x1a\x3b\x03\x2b\xb0\x9c\x39\x22\x05\xbf\x09\x5b\xda\x98\x6e\x5d\xd6\x62\x7c\x1e\x41\x7f\x65\x03\x26\xdf\xe3\xa9\xc9\x99\x4c\x6e\x0e\x01\x27\x6f\x91\xf2\x98\x7d\x2b\x85\xde\xda\x96\x54\x91"}, +{{0x5a,0x86,0x8f,0xb7,0x5e,0xa0,0x72,0x1f,0x7e,0x86,0xc7,0xbc,0x10,0x6d,0x74,0x13,0xc8,0xcf,0x4d,0x03,0x3c,0xe1,0x40,0x05,0xdf,0x23,0xce,0x4c,0x15,0x5b,0xbd,0x27,},{0x6d,0x1e,0x29,0xf3,0x9d,0xed,0xa2,0xbb,0xfb,0xb5,0x7c,0xb0,0x1c,0xb3,0x9e,0x58,0x80,0x82,0x78,0xe5,0x19,0x6a,0xda,0x1c,0x02,0x76,0x46,0xf2,0x04,0x87,0xd2,0x52,},{0x38,0xc4,0x8d,0xba,0x99,0xa6,0x52,0x4a,0x18,0x8d,0x5c,0xd7,0x8a,0x98,0xe6,0x77,0xdd,0x26,0x3e,0xf6,0xb4,0xdf,0x44,0x6b,0x31,0x0b,0x3d,0xd8,0x9c,0xaf,0xdd,0xb9,0xb1,0x7a,0x65,0xbb,0xa8,0xe1,0x39,0x68,0xbd,0xc2,0x5b,0x1d,0x84,0xb6,0xe2,0x43,0x6e,0xdf,0x31,0xaa,0x75,0x6e,0x3a,0x48,0x72,0x6d,0x6f,0x91,0xc8,0x08,0xee,0x0e,},"\xd5\xaa\x11\x82\x5b\x99\x44\x8c\x80\x63\x06\x23\xd8\xc7\x46\x01\x7c\xfe\x3d\xe6\xfa\x8a\x0c\x6e\xd6\x62\x71\x27\xcf\xc1\xf8\x4d\x4e\x0a\x54\xe6\xa7\xd9\x08\xd3\x71\x9f\x14\x21\xd1\xd4\xc7\x8b\x3c\xdd\x94\x76\x9a\xb6\x03\x3b\xce\x97\x9d\xd9\x0e\x10\x68\x02\xeb\xa9\xa0\x32\x95\xd4\x8f\x9b\x9a\x95\xd5\x7e\xe7\x74\x54\x02\xa4\x80\x23\xbf\x3b\xdd\xd5\xc6\xb9\x1c\x77\x3e\x49\x19\x13\xa3\x8a\xc3\x46\x26\x05\xcf\x28\x2d\xea\xc7\x57\x42\xfb\xd2\x75\x29\x27\x6e\x81\xdc\xce\x8d\xff\x96\x05\x03\x5e\x8c\xf0\x5d\xf6\xa4\x3d\xb1\x51\xf0\x41\x57\x65\xbc\xbd\x1f\x1b\xb6\x68\xad\x62\x73\xb8\x91\xc0\xdc\x4f\x3d\xba\x59\x0e\xa8\x2f\x83\x63\x76\x9b\x9c\x77\x51\x19\x47\x11\x73\x75\xdc\x49\x04\xd4\x8b\x88\xb6\x8a\x25\x5b\x28\x01\x1b\x11\x04\x81\x94\x09\x3e\x98\x20\x7a\xb1\xcf\x75\x6a\xb8\x33\x1f\x8d\x6f\x9d\x5b\xe2\xe1\x19\x05\x73\xe9\x5e\x71\x0f\x2a\x35\x01\xb5\x3a\xa0\x82\x5d\x6c\x12\xdc\xfb\x94\xac\x80\xdc\x10\x82\xcb\x4a\xd2\x62\xe6\xd4\x93\xad\xce\xb6\xbc\x19\x14\x5f\xbf\x73\x8d\xf7\x6f\x21\x34\xfa\x04\xcb\xbe\x44\xff\xc5\x5f\xfe\x5f\x9d\x3e\x9b\xeb\xd1\x59\xa0\x01\xaa\x9b\xf7\x88\x92\xa1\x65\x38\xa5\x20\x82\x3c\xde\x5d\x61\xe2\x9a\x56\xa7\x7a\xb9\x6e\x49\xe3\x00\xd9\x86\x59\x62\xc7\xe7\xfb\x8b\xcf\x5d\xe0\xb9\x38\x29\x7c\x3f\x4d\x6f\x60\x21\xe2\x4d\xfd\xad\x98\x61\x65\x2f\x34\x0f\x42\x1e\x7a\xf2\xc7\x1e\xd9\xa7\x15\x87\xfc\x75\x3b\x11\x55\x49\xb2\xf7\xf7\xcb\x29\x69\x0e\xa2\xb1\x58\xa9\x4c\xd2\xbc\x42\xe7\x06\x3d\x61\x9b\x93\x9d\x52\x3e\x3c\x23\x7e\xb1\xf4\x08\x10\xde\x0b\x44\xaa\x69\x37\x86\x3d\x62\x9e\xdd\x55\x75\xe6\xc0\x47\x52\x61\xb6\x27\x47\x30\x92\x77\x5c\x84\x36\x00\x11\xd5\x7c\x57\x20\x9c\x2e\x87\x5a\x3f\x89\x63\xe8\xb2\x41\xa7\xaa\x75\xef\x30\xc4\xa7\x18\xac\x4d\xd4\x66\xdc\x7a\x3e\x40\xe5\x87\x4f\x15\x7a\x84\x9e\xd3\xa3\xa9\xd4\xae\xb7\xd9\x4d\xf0\x9b\xb5\x5a\x0b\x2b\xc9\xf8\xb6\x95\xc3\x71\x79\x30\x23\x67\x60\x63\x67\xc5\xf3\x24\x82\x8c\xe7\x5a\x94\x4f\x50\x70\x3a\x47\x90\x6a\x80\x88\xf3\xa1\x1c\xfe\x4a\x85\x4e\x01\xf1\x74\x12\x52\xc4\x86\x33\x7d\x06\xb1\xcc\x6c\x6b\x9b\x12\x95\x43\x1e\xe0\x73\x59\x35\x7b\x3a\x78\xef\x50\x75\xb6\x5d\x7f\xed\x5e\xb7\x42\xe5\x10\x15\x98\x44\x4b\x46\x62\x3f\x89\xa3\x03\xac\xc1\x0c\x73\x24\x49\x51\x3b\x70\xdc\x45\x6a\x79\xd3\x7c\x48\xe5\xe7\x26\xc2\xf5\x58\xda\x0a\x1c\x46\xef\xbd\x2d\x92\x03\x26\xa6\x78\xb8\xa2\x2f\x09\x44\xbe\x4a\xf5\x5b\x6c\x71\xf4\x53\xfb\xae\x40\x0e\x6a\xcc\x04\xe0\xe9\x5c\xa2\x00\x16\x7e\x96\xee\x98\xea\x83\x93\x16\xda\x93\xa1\x2c\x2d\x76\xf1\x1a\xee\xbe\xb7\x8e\x65\xea\x48\xf7\xfe\xeb\xbb\x13\x7b\x2a\xc6\x7e\xae\xf0\x2a\x2d\x9e\x64\x71\xdd\x63\x4a\x03\x7d\x4f\x5d\x35\xa2\xf7\x8a\xf4\x1a\x8e\xa5\xaf\x5b\xc8\x15\x0a\x99\xed\x68\xa6\xa0\xcc\xff\x2b\x1d\x79\x65\xd8\xbc\x3e\xf9\x28\x5b\xa6\x42\x1d\x87\xc3\x3a\xad\x81\x03\xa5\x87\xbe\x01\x92\x68\x45\xbf\xbd\xdb\xaf\xc6\x9c\x4b\x92\x52\x88\x67\x20\xd4\x18\x50\x9f\x40\xf3\xdc\xf5\x57\x65\xdc\xcc\x3d\xee\xd8\x27\x72\x15\xe6\x9f\x05\x6b\xa3\x1b\x8a\x30\xb5\x00\x94\xea\x8f\x14\x47\x20\x76\x0c\x8f\x8c\x05\x5c\xf1\xa8\x69\x64\xff\xcb\xb8\xee\x1b\xb2\x18\x12\x76\xea\x99\xa7\xb8\xe7\x10\x67\xfa\x31\x0b\xa4\x47\x1e\x84\x27\x90\x37\xbc\x49\x2a\x55\xde\x20\x55\x48\xe7\x7b\x01\x45\x04\xee\x66\x64\xc4\x98\x8c\xbb\x9e\xd9\x1f\xf3\x2e\x22\x59\xed\x4c\xfd\x61\xa1\x97\xd0\xdb\xc3\x2c\x68\xf6\x54\x9c\x0d\x29\xfc\x45\xf3\x6a\xcb\x26\xb1\x64\xde\x97\xcc\xdc\x37\x90\x0d\x93\xcd\xbc\xf9\x68\x7e\xf5\x3f\x1f\x4d\xa1\xb1\xae\x42\x25\xb8\x84\x20\x9e\x81\xba\x43\x11\x52\x04\x77\xed\x42\x11\xb0\x92\x40\xbd\x7b\x82\x5e\x54\x73\x9f\xe2\x5d\x86\x24\xaf\x04\xb8\x6f\x6d\x11\x06\xd1\x81\x70\xe5\x06\x4d\x1a\x73\xc1\xfb\x1a\x27\xb2\x89\xa9\x48\xd7\x71\xa2\xf6\xb8\xb0\x9a\x63\x5d\xb9\x6c\x62\x51\xc3\x5a\x18\x76\xd3\x69\x62\x66\x99\x41\x6c\x0e\x40\x29\x8a\x68\x1f\xda\xf5\x25\x5f\x58\xc2\x55\x77\x59\xd8\xf5\xdf\x14\x8d\xec\x9d\xbe\x1c\xe6\xdf\x04\x1c\x36\xf8\x3e\x69\xcc\xfb\x4a\xac\xa5\xcb\x48\xfa\x6a\x85\xc8\xff\x66\x06\x15\x24\xd8\xb1\x1b\xd7\xff\xae\xd9\x9d\x0c\xd4\x5c\x42\x01\x0f\x21\xd3\x6c\xc3\x16\xca\x86\x09\x55\x63\x5b\xff\xaa\x7d\x9a\xac\x57\x2d\xcc\xf3\x15\x3d\x42\xee\x8a\x2b\x12\xba\xa5\x7c\x16\x0b\xd0\xad"}, +{{0xc5,0x4b,0xd3,0x43,0x1f,0x26,0x59,0x28,0x1d,0x31,0xe9,0x3b,0x30,0x78,0x76,0x68,0xbc,0xba,0x6e,0x5e,0xe4,0x7d,0xb4,0x6e,0x50,0xde,0xab,0xe3,0xf4,0x8c,0x9e,0xd8,},{0x1e,0xba,0x6e,0xb3,0xf7,0xf2,0x4c,0xdf,0x80,0xab,0xf8,0xa1,0x9d,0x30,0x8c,0x24,0xf1,0xe2,0x5b,0xa1,0x59,0x70,0xed,0xa7,0x11,0x67,0x07,0xb0,0xf1,0x2c,0xf9,0x32,},{0xdf,0x45,0x41,0xdf,0xf1,0xa9,0x79,0x7f,0xeb,0x61,0x7f,0x98,0xe4,0xb5,0x7a,0xa7,0x71,0x41,0x31,0xee,0x8f,0xf5,0x45,0xed,0x50,0x82,0xe3,0x56,0x8e,0xfd,0x1c,0x39,0x9c,0xdc,0x56,0xf5,0x58,0x29,0x91,0xeb,0x87,0x85,0xfb,0x33,0x86,0x4e,0xef,0x7f,0x55,0x3f,0x3e,0x24,0x82,0x62,0xed,0x54,0x8a,0x1a,0x68,0x88,0xf9,0x2e,0x92,0x0e,},"\x6f\x8c\xdd\x75\xe1\xb8\x56\xbb\xbe\x9c\xdc\x25\x53\x7f\xdf\x7e\x82\x36\xcb\x02\x9a\xcd\x39\x84\x49\x21\x10\xd0\xc3\x04\x41\xd4\x21\x84\xb5\xfb\x18\x3d\xa9\xf3\x14\x03\x78\xdf\xa7\xd7\x4c\xcc\x9e\xf5\x00\x19\x3c\xc9\x57\x9f\xff\xa6\x0b\xd2\xa8\xab\x9e\x09\x58\x15\x00\xcf\x06\xcd\x35\xab\xc1\x71\xd9\xd1\x2c\x65\x80\xd9\x68\x2f\x9f\x49\xfe\x36\xd0\xa3\x17\x72\x38\xfa\x50\xe7\xeb\x4c\x27\xe4\x60\xf5\xe4\x58\x0a\x56\x56\x8a\x19\xe0\x3d\x95\xb0\xff\x4f\x4a\x23\x18\x24\xcd\x2f\x34\x42\xe0\xba\x40\x0b\xc1\x1b\x7a\x98\x9d\x50\x1f\x5d\xf3\x5e\x43\x01\x50\x8f\x72\xa8\x52\x01\x4b\xfb\xf4\x00\x1e\x28\x09\x54\x73\xd9\x65\x9e\xed\x60\x67\xba\xf6\x8f\x92\xbe\xf3\x12\xc0\x9b\x19\xaa\xf7\xc4\xfb\xa3\xd9\x02\xb9\xf6\xcf\x95\x2e\xb9\xb9\xa5\x3c\xa8\xbc\xbd\x04\x2d\x84\x2e\x98\x53\xb6\x72\xa1\xd0\x09\xd8\x23\x83\x8b\xeb\xe5\x63\x7c\x4c\x07\xed\x1b\x19\x48\x55\x4b\x23\xb3\x2d\xe1\xd6\xc1\x16\xf9\x33\xb3\x54\xf2\x8b\xbb\x77\x9f\xa6\x54\x8c\x48\x29\x2b\x61\x2c\x7f\x55\x1a\x75\xfb\xc4\x6c\x02\x73\x6b\xf9\x9e\x9c\x8e\xad\x56\xf0\x5a\xb0\x42\x7a\x6e\xc6\x16\xe3\xdc\xc7\x75\x7e\xfd\xb7\x62\x8d\x4e\x96\x32\x5f\xe0\xae\x25\x4c\xef\x5c\xb7\xa7\x04\xb3\x5a\x92\x0c\xb3\xfa\x2a\x03\xe9\x61\xda\xf3\x71\x82\x1b\xe0\xb3\x0f\x19\xae\x49\x52\x44\x1e\x08\xa7\xd2\x2f\x54\x31\x39\x0a\x5b\xe8\x09\x7f\xd5\x79\x7a\x1a\x62\x97\x66\x4d\xa4\x2c\x20\x08\xd0\x32\x10\x60\xeb\xe3\x18\x1e\xb7\x95\xa7\x28\x92\x58\x08\xda\x78\x67\x29\x3b\x72\x08\xf3\x77\xd3\xa7\x71\x18\x5e\x6d\x2c\x1c\x8c\xe1\x83\x76\xfe\x3c\x0c\x14\x58\xc7\xf5\xbe\x34\xf4\x28\xa0\xd5\x75\x93\x10\x74\xc9\x7c\xbf\xce\x8a\xd8\x13\x13\xec\xca\x73\xa9\xf3\xdb\x43\x4f\xba\xd4\xbb\xbf\xf5\x02\xbf\x72\x97\xe1\x7a\x97\xa8\x86\x42\x11\xe6\x78\x9b\xa1\x92\x03\x6e\xa5\x9a\x34\xd8\x4f\xf2\xa1\x11\x07\x4c\x3f\x23\x73\xb1\x01\x11\xb5\xda\xa7\x89\x56\x0c\xb3\x54\x90\x95\x4c\x88\xea\x00\xc4\x10\xdf\x85\x0a\xd0\x0c\xae\x2f\x28\xe7\x19\xfb\x06\x71\x69\x88\xa9\xbb\x0b\xfc\x6c\x98\x9d\x58\x7e\x56\x85\xae\x88\x3c\x2c\x2e\x74\xdd\xbf\x91\x5c\x98\x56\xaa\xe8\xf3\x28\x8f\xc6\x25\xbf\xb2\xfe\x26\x8d\x74\xf5\x9f\x8b\x7d\x83\x63\x74\x97\x69\x16\x90\x07\xd5\xe6\x7b\x7d\x0b\x8c\x8f\x5a\x9d\x9f\x9c\x7b\x74\x5c\x0a\x42\x94\x76\x2c\xbe\xca\x42\xd5\x38\x49\x61\xe9\x21\xa7\xef\xb6\x5d\xa8\xd1\xe0\x3b\x67\x45\xcd\xf3\x08\x09\x7f\xb1\x3d\x64\xfd\x2f\x8c\x10\xfa\x95\x09\xeb\x2d\x91\x38\x7f\x00\x64\x5c\xa7\xd0\x48\x3b\x2c\xd1\x4c\x20\x6b\x8d\x7a\xe0\xa3\xfb\x7c\x09\xbc\x68\x43\xd1\x02\xad\xcd\xa1\x9f\x8b\xbd\x85\x1e\xb6\x83\xc4\x43\x5c\xeb\x4b\x3d\x23\xd3\x8f\x56\xd4\xd1\x11\x4e\xef\x0f\xc6\xf2\x4d\xf5\x27\x70\xd8\xf1\xf3\xf8\x2f\x47\x20\xe8\x92\xb3\x15\x24\x4e\xf5\x6c\x36\xb2\x3f\xcd\x40\x79\x78\x52\x41\x40\x38\x2e\x11\x74\x0f\xd4\x6f\xe4\x29\x99\x23\xf5\x2b\x88\xb4\xa9\xcf\xf4\xb2\xb4\xb2\x3a\x2e\x76\x0a\xd8\x1c\x78\xba\x87\x69\x31\xd9\xaa\xa4\xbe\xed\x40\xfb\x10\xa7\x99\xeb\x30\xd3\x7f\x75\x47\x78\xba\xc8\x5b\xf0\x63\x1d\x85\x2b\xe7\xd7\x4a\x64\x31\xf3\x84\xa4\x02\x5c\x10\x91\x42\x1d\x67\xa4\xe9\xc9\x4c\x1b\xe3\x69\x0c\x6b\xf8\x1d\x06\xbd\xaf\x32\xfe\xab\xba\xf1\xdc\x26\x3f\x27\x3a\x0b\x9e\xd6\x54\x60\xba\xef\xce\xfc\xf6\xac\xcc\xda\x0e\xdd\x23\xdf\x9e\x05\x12\x8e\x29\xd6\x61\xc4\xb4\x4b\xd9\x2d\x64\x0f\xaa\x85\x3a\xfd\x83\x70\xe5\x63\xb4\x0a\xe0\x14\x9a\x14\x28\xe0\x6e\x3d\xd8\xe6\x6b\x79\xda\x21\xcc\x75\x3d\xdc\x47\x6e\x3d\x76\xe2\xf3\x6f\x2b\x6c\x6b\xc1\xb6\x50\x87\xd5\xf8\x6c\x8a\xc3\x54\x71\x1a\x8c\x08\xf3\x48\x6e\x47\x9d\x6a\xe9\x43\xf8\x84\x63\x32\xd4\xe5\xb4\xbb\x2e\x82\x57\xe3\x08\x3d\xf4\xf8\x1d\xd4\xf0\xc1\xee\x1d\x97\x18\x21\x66\x16\x1a\x18\x59\x7e\xe0\xb9\x59\xde\x1c\x45\x59\x1a\xbf\x7c\x51\x03\x3d\x7c\x66\x35\x2d\xee\xb6\x82\xe7\x77\xae\xae\x2f\xa8\xd3\xa7\x7f\x47\x0d\xb7\x8d\xdc\x1b\x1f\xc8\x28\x40\xc4\x06\x57\x76\xd9\xbf\xca\x9d\x39\x2d\x92\x88\xee\x91\x32\xaa\x3e\x4f\x2d\x19\xd0\xd9\x3e\x01\xb6\x66\xf3\x64\x7a\xba\xf2\x25\xc2\x92\x41\x9c\x8a\x82\xeb\xa3\xe1\x1a\xb1\x03\x84\x6f\xcd\x49\x35\xf4\x12\x41\x47\x7c\x0f\x15\x2b\x79\x65\xad\x54\xbb\x72\xbc\x3d\xe2\xe0\xb7\x9d\x62\x25\xe8\xfa\x7a\x62\x86\xb5\xfc\xcb\xb3\x58\x22\xe8\x0c\x8b\xfe\xa7\x4c\xb4\x8a\x22\xd2\x41\x38\x53\x95\xc2"}, +{{0xea,0x60,0xda,0x01,0x79,0xbc,0xaf,0x6b,0x21,0x81,0x42,0xb1,0x11,0x90,0x46,0xff,0xe6,0xd8,0x5a,0x74,0x1b,0x0d,0x16,0x62,0x30,0xbc,0x6d,0xe3,0x30,0x4f,0x67,0x73,},{0x50,0x6b,0x2e,0xbb,0x49,0xbd,0x9b,0x9f,0xf6,0x6e,0x6b,0x7b,0x1f,0xab,0x96,0x68,0xcb,0x18,0x1b,0x4f,0xb5,0xe4,0x34,0x3d,0xdd,0xd3,0xf8,0xa9,0xd7,0x02,0x03,0x1c,},{0x27,0xfb,0x6b,0x5f,0x06,0x52,0x8a,0x64,0x19,0x8a,0x3e,0x7d,0x67,0xc7,0x38,0x84,0x0a,0x8c,0xff,0x4b,0x48,0x2b,0x4d,0x52,0x4b,0x12,0x2d,0x17,0xd2,0xae,0xbc,0xc0,0x38,0x9b,0xe2,0xc6,0xe2,0x8e,0x2c,0xdf,0xc4,0x84,0xc1,0x8d,0xe4,0x25,0xdb,0x56,0xcd,0xfa,0x56,0x1c,0x50,0x7c,0xd9,0x70,0x60,0x2d,0x3a,0x38,0x5d,0x3a,0xea,0x0f,},"\x61\x2d\x6e\xf6\xe4\x34\x9f\xfa\xe5\x16\xe9\x83\xe8\xfa\x7b\x52\xd9\xfd\x13\x42\x82\x24\x0d\x95\x14\x38\x24\xbd\x4a\xae\x03\x23\x4b\x76\xa8\xcd\x6d\x40\x68\xcf\x00\x9e\x48\x1c\x26\x85\x36\x1c\x75\x50\x42\xc4\xe6\xab\x87\x03\xec\xbf\x8f\x02\x0c\xf5\x73\x9a\x4c\x2a\x03\xc3\x73\x1e\x9c\xf7\x5a\xee\x25\x96\x61\x53\xb9\x71\x15\x15\xc6\xc3\x9a\xfa\x95\xf2\x21\xac\x33\x95\xb0\x89\xc9\x7a\xc9\xb5\x14\xe1\x7d\x55\xf7\x96\xa3\xec\xc1\x35\xfa\xaa\xee\x90\x7a\xab\x10\x29\x64\x7b\x48\xac\x81\x74\x9b\xab\x26\x62\x7c\xf7\x09\x5d\x74\xc2\xfc\xee\x35\x67\x1c\x8b\xb4\x60\x53\xf5\x15\x1b\x0c\x2e\x5d\xab\xe0\xf2\xd6\xaa\x20\x41\x33\x05\x02\x0b\x2a\xfd\x9e\xe3\x38\x7b\x2c\x9e\xd0\xbc\x3f\xe2\x90\x2a\xf4\x10\x0c\xec\x23\x32\x7b\x0f\x1e\x4c\xa3\x9e\xf6\xea\xf6\xfd\xf5\xd5\xac\xf9\x3f\xc8\x68\x53\x6d\x8c\xba\x40\x17\x69\x32\x9f\xbe\x93\xef\xfc\x7e\xe6\xbf\x93\xa6\xe5\x88\xbd\x55\x1e\xaa\x51\x28\x53\x95\x2c\x81\xb2\x45\xe5\xd2\x29\xd2\x94\xe4\x13\x70\xb8\x67\x80\x86\x67\x88\x7a\x6f\x9e\xba\x2a\x8d\x56\xa7\xa7\x04\xe6\x6b\x1c\x02\xf9\x6e\x73\x89\x5f\x48\x3e\x44\xa5\xc5\x66\xcb\x1a\xf2\x65\x73\xbf\xe2\xaf\xce\x06\xb1\xfb\x58\x77\xe5\x1e\xf3\x12\x6a\x3f\x21\x0f\xbf\x21\x3e\xd6\x5d\x5c\xa4\x6c\x46\xce\x4a\xa9\x45\xbd\x8c\xa6\x11\xe3\x83\x62\x50\xf5\x64\xf7\xea\x35\x42\x39\x82\xf9\x70\x5f\xcd\x6b\xef\x46\xae\x16\xcb\x0f\x6b\xc9\x12\xc3\xf2\x86\x42\xb8\xd8\x77\x75\xb8\x18\xe4\xe4\xe8\x06\x11\x67\x89\x9b\xd2\x7a\x7e\x2f\xb8\x18\x7e\xe9\x91\x7d\x2d\x58\x6b\xf9\xd4\x99\xe8\xfa\xbc\xa8\x3d\xdf\x58\xc7\x43\x7e\xaa\xce\xc4\xf4\x44\xfb\x2b\xf7\x45\xdc\xcd\x8c\xae\x38\x94\x45\x71\xde\xde\x20\x37\xdc\x41\xf0\x81\x8a\x3d\x91\xe3\x02\x0a\x72\x74\xc6\x67\x42\x47\x87\x60\x83\xd0\xe3\x97\x46\xc9\x68\x40\x61\xbf\x74\xad\x58\x84\x36\xce\x1b\x76\x3d\xbf\x4b\xfc\xf8\xde\x6e\x35\xc5\xa7\x62\x66\x75\xc1\x27\x29\x2b\x21\xdf\x3c\x16\xf8\x10\x63\x32\x2a\x75\xf3\x43\x88\x86\xf1\xf0\xce\xbf\xc1\xa9\x6f\x41\x38\x4c\xbd\xd8\x61\xb0\x4f\x51\x9f\xf6\xa9\x34\x4d\x94\xf3\xd3\xa0\xab\xa8\x40\x9d\xfc\xf1\x8d\x01\xf2\xb5\xb4\x55\x17\x16\x39\xee\xa7\x7d\xee\x70\x6e\xa8\x3d\xcd\x2b\x8b\x1f\xc5\xec\x0d\x74\x07\x61\xa5\xf0\x5f\x7e\xc8\xd8\x7a\xd1\xf2\x92\xa5\x0c\x8b\xae\x0a\xd3\x2b\x03\x41\x9a\x95\x0d\x9f\xe3\xb3\xec\xc4\xd8\xd3\xaa\x95\xe0\x2b\x51\xb1\x83\x1d\x83\xea\xde\xaa\x44\x23\x86\x35\xf9\xc6\x5e\xfe\x2f\x67\x44\xa7\x0b\x9a\xe4\x1e\xf1\x5d\x97\x90\x8c\x05\x33\x93\x44\x12\xf7\x95\x83\xd0\xe9\xb3\xd7\x06\xa1\x28\xe8\x8f\xb5\x1e\xed\xb6\x5e\x46\xd8\xa2\xb3\x8b\xbd\xd6\x45\x55\x54\x96\x7a\x8d\xc0\xc6\x8b\xdd\xfe\xae\x0f\x8f\x72\xf0\xb8\x86\xc3\xc7\x41\xfa\xc4\xf9\x1e\x5c\x49\x1d\xba\xe9\xda\x45\x94\x83\x6c\xf1\xd9\xfb\x6e\xe1\x30\x02\x50\x89\xae\xd3\x50\xef\x24\x7b\xc9\x88\x7a\x20\x50\x15\x9d\xde\xd1\x42\x8f\xfd\x9b\x07\xb9\xec\x2e\x3d\x4b\xbd\xc2\xdd\xb5\x4e\x87\x3b\x63\xf2\x47\x52\x33\xe1\x91\x33\xa1\x4b\x66\x58\x50\x94\x57\x00\x81\x86\xd6\x22\x59\x95\xa9\x67\x26\xb5\x29\xf4\x42\x81\xaa\x24\xfe\xfd\x1c\xff\x8f\x81\x5d\x93\xa5\x98\x69\x31\x66\x22\x90\xb3\xee\x16\x83\x3c\x60\xf0\xaf\xce\xf2\xcb\xc0\x00\x62\x3f\x39\x31\x90\x9c\xa9\x76\xa0\x94\xe2\xb0\xfd\xb7\xdc\xf7\xc4\x85\xe1\x49\x88\xa3\x6f\x19\xb6\x64\x25\x38\x5f\x56\x32\xce\xf6\x5d\x1d\x34\x14\x62\x3a\xe3\xee\x81\x6e\x76\x3a\x5f\x60\x64\x66\x62\x2b\xe6\x60\x21\x14\x50\x29\x51\xcf\x0c\x09\x7c\x16\x48\xa7\x2e\x2c\x43\xd9\xaf\xa9\x68\x9f\x2c\x3c\xfe\x02\x6c\xdc\xe3\xbd\x1b\xf9\xeb\xf7\x77\x56\x2e\xcd\x8f\xf1\xb0\xd7\x75\x30\x6d\x90\x04\x43\xf3\x0a\x84\x33\x10\xb8\xde\x6a\x38\xff\x10\x8b\x72\x39\x13\xd7\x89\x9b\x9f\xbe\x7c\x3d\x76\x6e\xf8\xbd\xfb\x6d\x8b\x0b\x52\x95\x6c\xb1\xce\xc9\x93\x6d\x70\xb4\x87\xc0\x14\x40\xa8\x42\xb2\xfa\xbe\x38\xe7\xb8\x85\x1a\x38\x7d\x35\x8b\xe7\xef\x12\xa7\xe4\xf2\xb5\x27\xe8\x30\x90\xd6\x7e\xb0\x13\xc9\xc2\xcf\xd3\xde\x5a\x1a\x3f\x99\x74\x8a\x41\xf4\x81\x9d\x90\x36\xe5\x00\xc5\x04\xc9\x88\xbf\xd2\x4f\x61\x7d\x6e\xbd\xca\xb2\xdd\xea\xa6\x15\x79\x41\x4f\x36\x0b\x46\x9a\x33\xa6\xde\xd9\x6b\xa1\xd8\xc1\x40\xc4\xff\xc9\x49\x90\xd8\xad\xf7\x8c\xd3\x87\x80\xbd\x68\x66\x3d\x1a\x0e\xe3\x3f\x53\x7c\xdf\x89\x2d\x56\x2e\x82\xdc\xd1\xd9\x12\xca\xd3\x8d\x65\x56\x7d\x29\x14\x06"}, +{{0xb6,0x2c,0x24,0x18,0x78,0x27,0x35,0x13,0xe0,0xbf,0x6f,0x33,0xd2,0x10,0x43,0x65,0xb2,0xce,0x9c,0x5a,0x1b,0x78,0x60,0x58,0xe9,0xc5,0xb4,0xd1,0xd1,0x92,0xf8,0x7f,},{0xbb,0xf6,0xfc,0x51,0x98,0xf3,0xfb,0xa5,0xab,0x00,0x7f,0x8a,0x63,0x2d,0x28,0xd1,0xaf,0x86,0x5d,0x29,0x0f,0xa0,0xa9,0x0f,0xaa,0x9a,0x9b,0x5b,0x9c,0x13,0xf3,0xfb,},{0xc5,0x90,0x39,0x58,0x7b,0x38,0xdc,0x14,0x1e,0x05,0x5a,0x93,0x85,0x01,0x04,0xd6,0x29,0xe3,0x80,0x70,0x5b,0x8f,0xc9,0x18,0x84,0x7c,0x5e,0x2a,0x35,0x2d,0xa3,0xa0,0x2f,0xce,0x7f,0x71,0x99,0xf4,0xae,0x2b,0x1e,0x2a,0x59,0x48,0x34,0x18,0x93,0x2e,0x18,0x5f,0x7e,0x45,0xb5,0x05,0x0c,0x64,0x2c,0xec,0xc7,0xe7,0x81,0x99,0x85,0x07,},"\x26\xa3\xc2\x6a\x5a\x18\x9c\xad\x40\x7c\xba\xa3\xa6\x86\x7a\xc0\xa2\x60\x88\xc7\x5f\x9d\x0f\xa1\x9b\xd5\x02\x74\xce\xc5\x75\x5a\x49\x71\x09\xa4\x73\x28\x4d\x6f\xc8\x1a\xd4\xb9\xec\x29\xfa\x7e\xc9\x76\x4f\xd3\x09\x9f\x06\x0e\x36\x83\x65\x52\xff\x24\x13\xe3\xd5\x09\x5f\xe0\xb1\xa8\xbf\xcf\x67\xee\x06\xaa\x90\x32\xe7\xbb\x32\x49\x69\x80\x47\x71\x4d\x28\x14\x15\x27\x3c\x98\x34\xad\x9e\xb6\x65\xa7\xd9\x72\x20\xe7\x2d\x9c\xa7\x3f\x31\xaf\xa7\x73\x86\x75\xba\x31\x62\xef\xef\xe7\x47\x9a\x5b\xc4\xbc\xe2\xe8\xb7\xaf\x47\x41\xd7\x03\xdc\x9b\xbd\x60\xb4\xcf\x4b\x90\x87\xf6\xcf\x86\xcf\x53\xae\xd0\x2b\xf4\xca\x6a\x18\xf6\x07\xcb\x52\xa3\x03\xd7\x8e\x85\xad\x88\xfd\xfc\x86\xdc\xb7\x18\x77\x27\xb0\x3b\xe2\x27\x74\x5b\xea\x74\x4f\xd0\x06\x52\x5b\xc5\x9a\x4d\xdd\xab\x91\x5c\xef\x40\xa8\xf3\x08\x02\x91\x3b\x79\x13\xea\xf9\x74\x33\x65\x52\xe2\xf1\x45\x6a\xd8\x03\xdc\x58\xc9\xb4\xb1\x8e\xfa\xf7\xf7\xe3\x57\xe2\xcd\x77\xd1\x38\xd9\x00\x80\xe2\x96\xd1\x36\x4a\x2f\x32\x4d\x3e\x0d\x6e\xdc\x20\xb8\xbd\xaa\x9d\x2e\x87\x1f\x5e\x7b\x05\x1f\xb6\xfc\xdb\x55\x95\xf2\x1d\x3f\x8d\xe2\x9f\xb7\x86\x78\xfa\x47\x9e\xaa\x32\x57\x9c\x78\x4d\x51\x3a\xc5\xf8\x36\xd9\x54\xd0\xd3\xfc\x0e\x5f\xc8\xa6\xee\xab\x90\x20\x2b\x4c\x4a\x2b\xec\x24\xcf\x63\xea\x67\xc4\x70\x09\x62\x18\xcd\x43\x1e\x88\x31\x05\xfc\x9c\x27\xf9\xea\x77\xc1\x8e\xda\x69\xbc\x00\xa2\x24\x2b\xd4\x20\xf0\x95\xc9\xb9\xa9\x2d\x95\x6c\xcc\x5a\x85\x72\xb0\x57\xa7\xfe\x17\x3e\xeb\x2a\x31\x66\xcb\x20\x89\xd1\x13\xa8\x16\x46\x2b\x25\x80\x5b\x8a\xba\xff\x5b\x0b\x22\x87\xc5\x08\xec\x2b\x8c\x34\xb2\x19\x5c\x33\x28\x70\xd3\xcc\x39\x60\x17\xa1\x6b\x9e\x0d\xa6\x18\x2d\x07\x1d\x3b\xf3\x63\xd3\xf1\xe7\xb7\xda\x11\xd7\x11\x25\x0a\x58\xaf\xd7\x4e\xd3\xe3\x15\x8d\x47\x18\xba\xd4\xd2\x74\xbb\x34\x44\xcf\xc3\x18\x07\x4b\x53\xbe\xba\x44\xa2\xa3\x4f\xf8\xeb\x72\x6e\x4a\x1d\xaa\x91\x10\x51\x62\x16\x51\x89\x8b\x88\x71\x69\xf6\x2b\x9c\x0f\x40\x20\x48\x3e\xf5\x44\xf8\xf5\x72\xfa\x6a\x66\x40\xa4\xcf\xfc\xe9\x76\xcb\x70\x24\xf8\x47\xbd\xc9\x5d\x1d\x7c\xe6\x53\x50\x5d\xeb\xfc\x69\x88\xed\x28\x9d\xd4\x7a\x9e\xb2\x61\x25\x9e\x3e\x65\xe4\x5f\xc9\xd7\x14\x94\x69\x35\xcd\x8e\xa1\x3b\xc6\xdb\x5e\xaa\xb9\xe8\xb1\x0d\xae\x0f\xdd\x69\x79\xc2\x03\x5c\xfb\x80\x98\x25\x2f\x22\x05\x44\x3b\x80\x88\x16\xbf\x77\x87\xb7\xf1\xe7\x8b\xc9\x8a\x72\x85\xe7\x33\xd4\x5f\xc4\x61\x0c\x20\x97\x7c\xa3\x22\x98\x89\xbb\x8c\xd2\xb6\x94\xce\x9e\x3f\xe7\x83\x03\xaf\x83\xe1\x06\x42\x25\x42\xfb\x79\x61\xd3\x2e\xb1\xd2\xc5\xfb\xe6\x07\x51\x67\x4b\x07\x47\x73\xee\x06\x16\xe0\x29\x73\xf6\xa7\x4a\x3a\xe4\x66\x4a\x26\x50\x91\x5a\x3e\x10\x49\x3b\x9e\x66\xa3\x9f\xa5\xc8\x9c\x61\xd4\x47\x35\xf1\x07\xd3\x37\x57\xae\x67\x9b\x43\xa8\xd4\x3a\x01\x75\x7a\xe1\xf3\x27\x9e\x86\x24\x42\xe1\x50\x71\x55\x50\xee\x82\xe4\x9c\x0d\x49\x43\xfa\xf1\x3f\x22\x79\x1f\x0e\x66\xf2\x4a\xc5\x0a\xb3\xc0\x03\x85\x2b\x21\xe1\x5b\x2f\x00\x6e\xdc\x2c\xd6\xa8\x79\xc4\x76\xab\x5b\x35\x2e\xb1\x09\x9d\xad\x4c\x50\x37\x24\x00\xfa\xa5\x49\x8d\x78\xc6\xb8\x57\x03\x4c\x25\xca\xf7\xb9\x33\xfa\xf6\xbd\x7c\x59\xfa\x3d\xa5\x73\x97\xb6\x03\xde\x9c\xb9\xd8\x0e\x51\xf7\x99\x7b\xaa\x46\x2a\xcd\x53\x7e\x2c\x41\x94\xc7\x6c\x7e\x0b\xe6\x51\x2b\xce\x4d\x63\x66\x0b\x36\xc7\xcc\x46\x63\x1f\xb9\x67\x1a\xd8\xc5\xd2\x8e\x2f\x2e\xe2\xed\xce\x81\x95\x44\x21\xb8\xa3\xd9\xff\x6f\x66\x69\x9f\x4b\xce\x88\xbc\xb8\xef\x19\x2c\x26\x2a\x74\xab\x7e\x19\x1e\xee\x91\x01\xa2\x8d\x4b\x66\x28\x2b\x51\x22\x09\x3d\x14\x1c\x64\x96\xc7\xab\xa4\xd3\x52\xe4\x72\xee\x74\x40\xe0\x5a\xf6\x0d\xa0\xcf\xc9\x3e\x30\x36\x42\xba\x8f\xb8\xe5\xc5\x68\x68\x7a\xbd\x63\xaf\xb3\xed\x6a\x32\xb6\xda\xe5\x6a\x7e\x5d\x73\xde\xba\xf4\x1d\x35\xca\x36\xad\xb9\x7a\x22\xc0\xad\xbe\x71\x8b\xec\x1f\xa5\x19\x98\xde\x9b\x4b\x96\xa7\x9c\x5b\x96\x55\xb0\x16\x5d\x5e\x1b\x9a\x8c\xc5\x52\xe8\xc9\x32\x9e\xde\x58\xdf\x74\xc6\x7b\x2b\xa1\xa8\x42\xfd\x3e\x81\x58\xc1\xfe\xa3\xa9\x9b\x56\xa2\xc2\xa9\x62\x07\x85\x3d\x26\x02\x2c\xec\x17\x0d\x7e\x79\x94\x4d\x2f\x56\xaa\xb1\xf1\x91\xbf\xd4\x8d\x72\x54\x90\xca\x82\xb8\xd9\x06\xf0\x68\x0e\x69\xee\xb9\x57\x57\x74\xfb\x9d\x60\x45\x13\xfb\xc2\x6f\x5d\x30\x3b\x68\x85\xca\xc0\xbf\x8e\xfe\xe0\x53\x8f\x92"}, +{{0x0f,0x77,0xf7,0x7a,0x1c,0x7e,0x04,0xbd,0xa8,0xe5,0x34,0xf4,0xe3,0xef,0xf9,0xa2,0x38,0xcc,0x14,0x87,0x6b,0x7e,0x3e,0xca,0x8b,0xed,0xe1,0x92,0x3a,0x33,0x64,0x06,},{0x10,0x45,0xea,0x9f,0xe2,0x14,0x58,0x3a,0x0c,0xdb,0xc4,0x94,0x93,0x2b,0xc4,0x4a,0xfe,0xeb,0x08,0x0b,0xec,0x48,0x5c,0xc2,0x34,0xfd,0xdc,0xff,0x13,0x9c,0xce,0x00,},{0xb2,0x0b,0x9c,0x42,0x46,0xf0,0xd2,0x97,0x01,0x38,0xaf,0x7d,0xc9,0xaf,0x62,0x9b,0x68,0xfb,0xc3,0x7d,0xf8,0x7a,0xfd,0xca,0xdc,0xb5,0x45,0xc1,0x76,0x83,0x76,0xa0,0x9c,0x3b,0xab,0xc3,0xeb,0x1a,0xf3,0xb7,0x51,0x98,0x52,0xf7,0x5f,0xab,0x1c,0x9c,0x11,0x9c,0x66,0x2c,0x58,0x77,0xfb,0x2f,0x72,0x99,0xca,0xb5,0x7f,0xad,0x3d,0x0e,},"\x0e\xcb\x74\x6d\xbd\xb0\x16\x14\x21\xaf\xeb\x7a\xde\xa7\xa3\x7c\x2e\xa4\x40\x8a\x59\x2c\x9d\x78\x1e\xd6\xac\x6f\x4e\xe5\xcc\x65\xd5\x27\x0e\x4c\xf2\x76\x32\xf7\xc5\xc1\x33\xd4\x39\xb7\x8d\x1f\x71\xaa\x6d\xd8\x07\x13\xd9\x0b\x15\x1e\x19\x12\x1b\xfa\x87\x71\x0e\x84\xa4\x85\x0a\x3b\x5b\x02\x65\xba\x26\x03\xd0\x71\x6e\x9b\x7e\x11\x22\x10\x9c\x39\xc6\xf1\x02\x7f\xce\x18\x79\x8c\xbb\x4f\x6b\xc5\xe4\xd7\xac\xa4\x70\x46\x90\xf5\xc9\x81\x51\x08\x71\xc3\x13\x59\x57\x98\x33\x86\x81\x10\x7f\x2b\x57\x94\xd4\x6f\x6e\x0b\xde\x2c\xd0\x64\xb3\xb1\xfc\x00\xca\x47\x18\x8b\xbb\xc1\xf4\xa0\xce\x30\x5c\xc6\xd8\xa8\x96\x92\x0e\xb9\xeb\xae\x57\x9f\xd3\x38\x5f\x8f\x1f\x35\x97\x62\x88\xf4\xc5\x8f\xfc\x47\x60\xf3\x59\xb0\x03\xc8\x72\xe9\xa2\x40\x55\x35\x5e\xa9\x58\x5e\x95\x10\x69\xdc\xa2\x5f\xd0\xcc\x0b\x9d\xb5\x2a\xae\xaf\x19\xd4\x3f\x2e\xab\x4f\x83\x56\x03\xad\x12\xd2\xdc\x49\xb3\x10\x25\x6b\x94\xbe\xd5\x48\x96\xa1\x6b\x69\xb0\x9c\xb4\xc8\xff\x5c\x23\xcc\xe5\x59\x3d\x87\xad\xe2\xa8\x2a\xda\x50\x85\x9e\x15\x44\xc1\x86\x18\xa6\x5c\x00\x7e\xf4\x24\xc9\x85\x4a\x17\x5b\x6e\x6c\x0e\x64\xb2\xc8\xeb\x8a\xd4\xd2\x8b\x97\x7d\x68\xe7\x81\x69\x91\x51\x98\x97\x53\x94\xd3\xb9\xb2\x69\xca\xb0\xd3\x26\x1b\x2b\x56\xcd\x2c\xc4\xbd\xdb\xd4\xf1\x43\x9e\x0d\xbe\x2c\x9b\x3f\x3f\x75\x14\xed\xac\x5e\xbb\x46\x22\xb9\x2a\x69\xa8\x40\xa9\x02\x85\x50\xb2\x21\xdb\x59\xdd\xfb\x00\x13\x96\xf8\x63\x92\xa1\x7f\x08\xcc\xb1\x94\xcd\x9e\x1a\x00\x81\xd7\xdd\x9c\xca\x23\x57\xfe\xb8\xb7\x95\xe5\x17\x02\x9f\x79\xc8\x2a\x3b\xe6\xf9\xa0\x31\xdd\x1a\xf1\xe7\x9e\x49\x82\xbf\x8e\x76\xb3\x10\xf9\xd3\x55\xef\xcd\x5b\x1e\xfa\x9f\x35\x9c\x17\xcf\x3b\x51\x0d\x51\x3e\x8c\xd5\x78\x6a\x0d\x34\x45\xdc\x59\xa8\x43\x3a\x46\x48\x86\x87\xb0\xf5\x8b\x1b\xd6\x56\x7c\x2a\xf4\x87\x3b\x51\xfc\x84\x5e\x76\x7e\x24\x30\x05\x19\x2f\x8f\x06\x74\xf2\x81\x26\x5a\x55\xd7\x6c\xea\x32\x22\x60\xc9\x32\xce\xa6\x71\x7a\xdb\x98\xa2\xdd\xa8\xc6\x98\xe2\xe8\x92\x55\xfe\xb7\x7d\xa7\x64\x81\x67\xbc\x1e\x58\x87\x7f\xeb\x72\xd1\xd1\x4b\x0c\x30\x4f\x07\x37\x2d\x95\x56\x75\x23\x7c\x49\xf7\xa6\xdb\xc9\x15\xe6\x81\x4a\xba\xe6\xcc\xe4\xca\xf9\xf4\x80\x87\xe9\xdf\xb2\x82\xd8\xf3\x40\x37\x7c\x1e\x29\xc6\x73\x1c\xcc\x26\x67\xda\x66\x95\xb7\x12\xbe\x03\x12\xd8\x65\x11\x19\x34\xf1\x68\xd5\x54\x43\x65\xdd\xae\x27\xab\xc6\x4a\xef\xbc\xb3\x22\xdb\x7d\x97\xd9\x0d\x95\x7a\x63\x7b\xd8\x26\xc2\x27\xe9\xeb\x18\x0b\x45\xa4\x31\x62\x6a\x6f\xd8\x90\xc0\xe5\xf4\xed\x7e\x85\x64\x74\x75\x2f\x80\xb5\xae\xf6\xe7\x3e\xfd\xaa\x6c\x2c\x45\x1b\xd7\x4c\x1e\xf4\x66\xca\x3a\xaa\x25\x73\xbb\x52\xcb\x2b\x1c\xa9\x6a\x1b\x57\x44\x03\xce\xae\x1c\xf0\x5f\xfc\x53\x43\x0e\x1e\x4c\xd5\x59\x3b\xd1\xef\x84\xbc\xbf\xe2\x19\xf0\x81\x60\xd1\x66\xf2\x73\x1d\x99\xb8\xd7\xa3\x2b\x12\x99\x1f\x77\x77\x5a\x26\x7e\xc0\x82\x97\xec\x51\x2d\x7b\x72\x43\x56\x32\x52\x5c\x04\x00\x0f\xb0\x0a\x79\x3f\x8b\x5f\x8f\x37\x47\xb5\x53\x59\xdf\x21\xb7\xe2\xc4\x9f\x2b\x0b\x9a\xe0\x82\xaf\xc7\x0a\x14\x68\x71\x37\x0b\x8d\x50\x08\x6d\xe0\x0f\x94\x48\xbe\x89\x02\x17\x4b\xa2\xcc\x85\x1f\xa3\x79\xdd\x70\x31\xca\x45\x7a\x88\x69\xaf\x4b\x6c\x27\x29\xda\xc5\x19\x55\x6b\x8b\xb4\xab\x51\x9e\xf1\xbb\x02\x4e\xa8\xb7\xf0\x17\x71\xc9\xaa\xb7\x48\xe5\x73\x81\xa0\x19\x2a\x6e\x39\x8c\xbe\x6d\xd9\xf3\x67\xcc\x7b\x33\x54\xf8\x3b\x79\xbc\xda\x46\xb7\x93\xa4\xad\xa8\x55\x49\xc8\xd6\xbd\xd6\x16\x81\x24\x36\x2f\xf9\x08\xaa\x1a\x0c\xb7\x8a\xa3\x30\xc4\x2d\x5a\x5d\x48\x12\x35\xac\xac\x3a\x91\x9b\x96\x9c\x50\x98\x72\x66\xd4\x04\xd1\x5d\x0e\x70\x6f\xd9\x00\x76\x34\xf6\x9e\x13\xc5\x6e\xc4\x71\x33\x88\x4f\xca\xdd\xc1\x6b\xee\xee\xd1\x9e\x0c\xd9\x17\xaa\x49\x63\x67\x86\x7d\xfc\xea\x27\x4e\x1a\x47\xda\x77\x4f\x3c\x93\x63\x02\x1e\x7c\x8d\x6b\xf8\xf0\x00\x53\xfa\xcc\x11\xcb\x68\xa9\xd6\xe1\xfc\x2d\x6d\x19\x17\x5d\x63\x24\xff\x7c\xa6\xc2\x30\x58\xb8\xb6\x93\xd8\xfd\x4e\x0b\x51\xdc\xbb\x11\x35\x43\xf2\xfc\xc0\x45\x2e\xb9\xd9\x67\xac\x0f\xa9\xb2\x3e\x9e\x0b\x1d\xa8\xd8\x3a\x3c\x1f\xc9\xe9\xec\x97\x1f\x0f\x67\xfc\x74\x5b\xb1\x73\x76\xbc\x46\x24\x5f\x52\x8c\xb6\xe5\xfe\xe1\x1b\xcd\xda\x86\x7b\x7f\x79\x01\x9c\xf9\xdb\x59\x18\x58\x23\x0a\xec\xb4\xd1\xe9\x3d\x16\x7c\xd8\x6b\x42\xdd\x87\x9a\x13\xfa\x0e"}, +{{0xc5,0xa5,0x05,0x34,0x77,0xae,0x31,0x15,0x8e,0x74,0x69,0xdd,0x15,0x04,0x86,0x76,0x50,0xd4,0x6f,0x15,0x89,0x06,0x7f,0x5c,0xd8,0x81,0xca,0xf2,0x5c,0x26,0xcb,0x21,},{0x70,0xf8,0x5d,0xb9,0x80,0x7b,0x26,0xfc,0xf3,0xe6,0x69,0x0b,0x91,0x72,0x4f,0x7a,0xe3,0xd2,0x0e,0xc3,0x60,0x4a,0xb7,0xd6,0x30,0x8d,0x90,0x94,0x30,0x8b,0x2d,0x59,},{0xf5,0x19,0x1b,0x44,0xbd,0x6c,0xc3,0xea,0x28,0x17,0x71,0xdf,0x12,0x54,0x9b,0xa2,0xbe,0x22,0x8b,0x51,0xeb,0x79,0x1b,0x9e,0x5e,0xd2,0x81,0x5f,0x86,0x2a,0xa6,0x30,0xb5,0x69,0x67,0xcd,0xef,0x8b,0x6a,0xf0,0xb9,0xd2,0x1a,0xb8,0xc9,0x7a,0x6d,0xff,0x68,0x1c,0xce,0xd9,0xf5,0x01,0x97,0x13,0xd4,0x35,0x7c,0xb3,0xe5,0x4c,0x0d,0x08,},"\x85\x71\xff\x39\x03\x48\x6a\x43\xa6\x12\x6c\x32\x3e\x7b\x3a\x74\x14\x1d\x13\x85\xd4\xbd\x70\x3f\x19\xe2\xd1\xb6\x4b\x50\x28\x1d\x27\x16\x8a\xe3\xe7\x69\xc6\xdd\x9d\xf7\xd9\x78\x64\xfb\x37\x82\x2f\x00\x21\x85\x2e\x31\x68\xab\x7d\x84\x5a\x65\x45\xed\x0c\x37\x7d\x9f\x7c\x04\x8a\x2b\x96\xe8\xdc\xf4\x45\x77\x96\x84\xa0\x58\xc2\xb9\xc2\x1a\xc6\x8a\x0c\x34\x1d\x1d\x6c\x09\x81\x45\x64\x57\x45\x8e\xb7\xce\xbf\x66\x67\x87\x40\x77\x7e\xca\x26\xe0\x1e\x1c\x8f\x53\xb5\xd4\x75\x6c\xc5\xf0\xb9\x0f\x0c\x5d\xb0\x53\x93\xcd\x4b\x8e\x44\xf6\x81\x0c\xaa\x5a\x11\x6a\x33\x57\x77\x24\x39\x5d\x41\x3a\xf6\x19\x63\x2a\x6f\xed\x14\xe2\x15\xc2\xf1\x9d\x10\x5c\xe2\xbf\x14\x98\xe6\xd2\xab\x4f\x65\x0f\x61\xba\x5c\xf6\xd0\xc7\x3b\xbb\xde\x98\xe3\x04\x29\x91\x0a\x4e\x67\xdf\xbc\x71\x7c\xb0\x91\x18\x2d\x59\x70\x58\xb5\xd7\x65\xd0\x97\xe6\x87\x58\x31\xb5\x88\xaa\xeb\x3e\x73\x27\xe8\x56\xb4\x2f\xa9\x83\xfd\x25\x4e\xf1\xf9\x18\xb0\x43\xd1\xdd\x3d\x7b\x7e\x30\xb3\x15\x38\x6e\xec\x91\xe7\xf9\x4d\x59\x8f\x4b\xeb\x3b\x27\xb4\x2f\x4e\xe1\xfb\xf7\xaf\xb4\x86\xbd\xcc\x60\x81\xcc\xb8\x67\xf0\x41\x11\x04\x4f\x4b\xbb\xe3\xc8\x12\x2e\xde\xad\xef\xa9\xd6\x93\x90\x6e\x0d\x6e\x13\x3b\xf6\xf2\xda\x61\x58\xfe\xed\xbd\xa0\x24\x41\x0f\x12\x08\x6e\x7a\xcc\xf1\xc6\x8e\x15\x57\xf0\x0c\x14\xe9\xc7\xea\x76\xa5\xed\x13\x37\xa0\x54\xac\x2c\x94\x9c\x05\x97\x7e\x03\x02\x74\xf6\xa4\xf2\xa6\xb3\x0a\x15\xc5\x70\xec\x94\x33\xf7\x4f\x47\x52\x80\x87\xc9\xce\x9a\x62\x92\x95\x1c\x54\x35\x49\x96\xfb\x28\x3c\x0d\xc4\xcf\x33\xc0\x01\xbc\x96\x87\x5e\xa6\xe1\xf4\x6f\x83\x7f\xf1\x8d\xd9\x54\x5f\xb9\x93\x46\x55\x34\x2b\x12\xc2\x99\x0b\x9f\x1c\x6f\xf4\xd6\x64\x89\xd6\xae\xdc\xe7\x5c\x7c\xb0\x3a\xc1\x34\xbf\xd3\x9b\x18\x1d\xfb\x7f\x9a\x97\xce\x73\x7f\xe5\x70\xad\x5f\x81\x34\x59\x39\xa6\xde\x5a\x40\xa3\x3a\x0e\x44\xbf\x95\x75\x03\xd5\xca\x02\x83\x51\x2e\x57\xfb\xa8\xa3\xa6\xf2\xc3\x90\x68\x7b\x1b\x77\x08\x67\x6e\x0f\xd0\x3b\x7c\x18\x8d\x45\x61\xc1\x87\x91\x63\xea\xf2\xb5\x96\xdd\xd5\xf3\xc1\xf4\xda\xdb\xc1\x39\xc2\x16\x48\x92\x82\x0b\x2f\xe0\x9c\xbc\x3d\x19\x08\x80\x76\x36\x45\x10\x25\x4f\x2b\x6d\x41\x03\x29\xe7\x0f\x2e\x5a\x94\x5b\xba\xcd\x2c\xa8\x9b\xd4\xb6\xe1\xf5\xe2\xe1\xd4\xf4\xed\x2f\xe0\x11\x3b\xcf\x32\x96\x2f\x00\xd5\xc3\x3b\x1d\xf9\x88\x40\x2b\xa0\xdc\x88\x04\xc1\xaf\x66\xcc\xae\x26\x70\xef\xa3\x13\x4c\x67\xfc\x90\xfe\xed\x8d\x8d\xee\xdc\xcf\x6a\x46\xf2\x29\x40\x45\x4a\xf2\xbb\x67\x54\xcf\x23\x5d\xdb\xb0\x00\x1c\x6c\x74\x1b\xf8\x74\xbc\xd8\xd4\x1d\x9d\xba\x81\x62\x58\x1c\x37\x46\xd7\xf3\x0e\x73\xde\xf6\x94\x15\xaf\x51\x81\xc1\x49\x91\x42\x95\x12\x2d\x45\x98\x2f\x94\x94\x3e\x20\xb0\xff\xc7\xfe\x6d\xdf\x19\xa0\x22\xe8\x7a\x52\x13\x33\x57\xa1\xe8\x0f\x37\xf2\x8a\x4c\x4a\x8a\x61\xc1\x48\xdd\x87\x5c\x1e\x8e\xcd\xcd\x84\x0d\xd8\x63\xe4\x4d\x9b\xcb\x16\xb6\xe5\xaf\x01\x47\xb3\x4a\x7a\x90\x52\xc8\xd3\xf4\x52\x01\x3d\x2d\x35\x4f\x68\x03\xf9\xea\xf6\x05\x6f\x3b\x01\x3c\x61\x6e\x47\xf3\x98\x81\x91\x46\x32\x0a\x5e\x3d\xbd\xf1\x68\x43\xea\x29\xde\xf2\x62\xcc\x9a\x34\x36\x72\xcf\x96\xbc\xcc\x6e\x87\xe6\xa6\xba\xf0\x71\x2e\x6e\xe8\x9a\xa6\x04\x89\xf1\x7c\xb7\x2d\xdc\x44\xba\xd1\x61\x58\x7d\x87\xf5\x4d\x67\xcc\x0a\x27\x78\x49\x7d\x83\x10\x88\x31\x5f\xfe\xee\x3d\x26\x8c\x59\xbe\xfe\x88\x4c\x3a\xa0\xe0\xae\x22\x96\xbb\xb6\x0e\xac\x90\x97\xcd\xf8\xdc\x09\x87\xce\xb1\x74\x2b\x05\x86\xdf\xce\x79\xec\x10\x42\x5b\x28\xf4\xe6\x45\x20\xd7\x12\xe3\xf4\x6e\xa8\x3b\xe2\xde\x6a\x15\x74\x07\x3b\xc5\xc7\x55\x7b\x8e\x25\xb6\x41\x11\x84\xea\x28\x3d\x88\x00\x23\x2c\x79\x06\x94\x21\x81\x1f\x88\x3c\x29\x94\xe7\xb7\xe2\xad\x9f\x8d\xc4\x89\xc9\x34\x77\x24\x39\x46\x09\xc9\x89\x09\xa6\xc2\x60\x17\xb5\x0f\x20\xd5\x0c\xca\xcb\xde\x36\xb7\x6b\xa6\x46\xa7\x6d\xc6\xa5\xb0\xf5\x06\x49\xc5\x65\x8b\xbd\xfd\xd3\xb5\xca\xfc\x54\x79\xa2\xf4\x8e\xe5\x15\x42\xf2\x3e\x9f\xc9\x21\x32\x06\x0f\xd6\x35\xef\xf4\x52\x11\x1c\xda\xf3\xef\xbd\xb7\xdb\x9e\x7d\x47\x16\xd0\xd6\x01\x1c\x29\x11\x8a\x55\xd4\xc1\xa4\x36\xab\xe2\x4e\x3c\xbf\x40\x23\x5b\x76\xdd\x19\x23\x50\x3c\x5f\x35\x98\x12\x4e\x2d\xf5\x5a\x2d\x1f\x24\x6e\x90\xde\x4b\x71\x64\x5d\x51\x75\xb6\x1b\x01\x74\xe7\xe5\x7d\xf1\x28\x5c\xcf\x8c\x86\xb8\x38\x2c\x25\x80\x79"}, +{{0x05,0xc7,0x19,0xca,0xe0,0x6e,0x2b,0xb7,0xd8,0x78,0x63,0xab,0x31,0x50,0x27,0x2c,0xb2,0xf8,0xc3,0xaa,0x24,0x21,0x91,0x2d,0x87,0xf9,0x8e,0x75,0x89,0x63,0x8c,0xe9,},{0x90,0x21,0x17,0x96,0xfe,0xd3,0xd5,0x3b,0x81,0xf8,0xfe,0xeb,0x1b,0xad,0x1f,0xfc,0x93,0x3e,0x5f,0x10,0xd3,0xbc,0x1b,0x36,0xdd,0xf2,0x10,0xa4,0x79,0x23,0xdf,0x03,},{0xba,0x6e,0xb7,0x51,0x37,0x1d,0xf7,0x21,0xb7,0x70,0x7a,0x5b,0x33,0x39,0xed,0xb5,0x5f,0x13,0x86,0x40,0xb9,0x7b,0xe6,0x33,0x4d,0x6c,0xda,0x51,0x91,0xa3,0xff,0x63,0x67,0x91,0x17,0x61,0x88,0x2a,0x4a,0x00,0x7f,0x16,0x1b,0x74,0x8c,0xec,0x95,0xb1,0x9e,0x99,0x5f,0x28,0x58,0xc2,0x57,0xcd,0x61,0x69,0x25,0x66,0x62,0x30,0x11,0x02,},"\xec\x24\x19\x18\x41\x8e\x60\x52\x20\x42\xe6\x73\x39\xe6\x64\x94\x99\xf3\x1a\x6c\x7c\xf8\x92\x5f\x1f\x61\xdd\xe8\x94\x60\x36\x02\xae\x8b\xb5\xf5\x88\x09\x82\x1f\x83\x34\x4f\x23\xcd\x31\xe6\x4e\xc9\xff\xe7\x9a\x98\x6b\x7e\x29\xe4\x31\x9a\x63\x41\x43\x16\xbd\x6e\xe2\x0e\x02\xa5\x0d\xa4\x40\x12\xbd\x2d\x6f\x9f\x67\x9e\x88\xed\x0c\x8b\xb1\xe2\xca\xd5\x5e\x56\x57\x89\x88\x33\x45\xb7\x54\x6f\x3d\x54\xb1\xb3\x62\xb1\xc6\x50\x50\x2c\x01\x9d\x73\x13\xaf\xbc\x82\x68\x9b\x23\xa3\xa5\x2d\x8f\x1a\xf9\xf8\x1e\x18\x8d\xbd\xf2\x03\xfb\x53\x00\xb4\x22\x5b\xfb\x67\x73\x33\x7b\xe6\x75\x0b\x3d\xb8\x8c\xe0\x97\x34\x3f\x62\xee\x2c\x11\x85\x74\xef\x15\x0c\xbd\x4c\x62\x76\x0c\x3e\x43\xdc\xbc\x39\x21\x8b\xd6\xd9\x85\x65\xfa\x38\x98\x11\xb1\xa6\x74\xf6\x17\xfd\x75\x67\x33\xdc\xb5\x67\xa9\x2d\xbf\x38\x55\xb5\x7b\x1f\x4a\x46\xd5\xb8\x97\x4b\x39\xac\x0d\x0e\x24\xd9\x9d\x20\x37\xc0\x4f\x60\xd9\x14\x0f\x64\xb0\x7a\x77\xd7\xea\xa1\xce\x8a\x78\xe8\x44\xb1\xdc\xf0\xe3\x74\x24\xf3\xf9\xd2\x53\xa5\x48\x56\x1a\x03\x75\xa8\xd4\x34\x12\x97\xbf\xed\xb7\x04\x8c\x79\x35\xe1\x48\x14\x18\xf9\xbb\xa9\x27\x1f\x9f\xd6\x02\x62\x24\xe7\x8e\x05\x5d\x8a\x09\x39\xfa\x2f\xe1\xdb\xc0\xfc\x7b\x58\x3e\x4c\xff\x34\x90\xe1\xd0\xf6\x10\xb2\x52\xe3\x0d\x84\x97\xd0\x0e\x4a\xac\xb3\x75\xf1\x9a\x47\x19\xf7\x9c\xa1\xea\x58\x3a\x2f\x8b\x14\x06\xa4\xaa\x5c\xb5\x5c\x08\xb6\x59\x3b\x67\x6e\xb5\xc3\x4a\xbe\x89\x39\x2d\x62\xd2\x33\x08\xa3\x34\x8b\x57\xaf\xfb\xba\x77\x39\xcd\xe8\xe1\x90\x9d\x34\x25\xee\xb2\x09\x26\xa9\x77\xd3\xa9\x4a\x86\xe0\xba\x10\xb3\x86\x92\x66\x98\x82\x7e\x86\xb4\xfd\x6c\x61\x80\x04\x7c\x87\xec\x3b\x31\x61\x9d\x05\xa9\xdf\x34\xef\xd3\xd7\x6a\x83\x69\x62\xb2\xef\x60\x4d\x07\xaf\x09\x75\xeb\x8f\x3d\xd2\x25\x94\x32\x38\x02\x56\x4c\x92\x9b\x3f\x65\xda\xcb\x57\x2b\x32\x55\x3d\x69\xb3\x1a\x19\x76\x90\xa9\xbb\x86\x0b\x08\x0a\x77\xcf\xbb\x3c\x17\x5a\xaf\xce\x01\x46\xa8\x2a\x4d\x06\xe8\xc7\x50\x52\x1b\x72\x6e\xf1\xcb\x29\xd0\x21\xe5\x91\x5e\x5e\x84\x62\xed\xe5\x39\x54\x45\x24\x5c\x9a\xe8\x82\xee\xc4\xb1\x74\x5e\x11\x79\x1f\x76\x21\xd3\xfe\x70\x2c\xac\x15\x25\xe1\xf7\xb4\x6e\x11\x05\xcd\xd0\x6d\xa2\xaf\xde\x26\x47\x5d\xc1\xf7\x8d\xf8\xe2\xd7\x2b\x0e\xc3\xef\x7d\xd9\x56\x19\x3c\x99\x68\x42\xa4\x32\x69\x65\x38\xcf\x12\x3d\x76\x87\x21\x1f\xfc\xd0\x90\xb9\x38\x1e\xab\xec\x87\x9f\x76\x9a\xac\x0d\x35\x64\xe1\x6d\xf7\x94\xfa\x24\x72\x8d\x71\x72\xfd\x07\x73\x2e\xab\x07\x7e\xd8\x1c\x22\x08\x4f\x6f\x78\x1b\x62\x6d\xac\x67\x42\x8a\x9d\xdf\x3b\x0d\xb0\x46\x52\x51\x22\x0d\x18\xb8\xbf\x62\x04\x64\xc5\x1a\x57\x8d\xec\xcc\xbb\xab\xa5\x45\xed\x44\x2c\xf1\x2c\x4c\x66\xf6\xcb\x6e\x69\x01\xea\x54\xae\xda\x23\x6e\xc4\x5e\xef\x88\x6a\x7d\xdd\x2c\x04\x1c\xab\xa3\xa6\xce\xe3\x39\x71\x5b\x6c\xe9\x7e\x76\x5e\xc3\x47\x9f\x3d\x52\x82\x4a\x81\x94\xbe\xc2\xa8\x96\x47\xe8\xc6\x3f\xf7\x64\x5f\xf6\xd0\x53\x67\xc7\x67\xbc\x48\xcc\x96\xba\xf0\x5d\x6a\x41\x5b\x2a\x5a\xff\x9b\xfb\x21\x79\x48\xfa\xd3\x57\xb9\x8f\x47\xdf\xed\x62\xff\x12\x85\xeb\x9f\x46\x8f\x0f\x29\xed\xd7\x5a\xdc\x0c\x8c\x2f\xf6\xa5\x65\xed\xb8\xed\xfb\x48\xbe\xa0\x3b\x70\xc4\x47\x36\x9c\x52\xd8\x81\xee\xa0\xee\xdb\x08\xc3\x15\xcd\xf0\xbf\xeb\x97\x9c\x1c\x02\x50\x94\x6b\xb1\x00\xc2\x86\x6b\x41\x69\xb8\xcb\xd4\x4d\x65\x8f\x02\x36\xe1\xe9\xf3\xaa\x13\xbb\x8e\x80\x22\xa3\x8c\xe9\x97\xc9\x4b\x5b\xaf\x97\xe0\xba\x62\x1f\x7e\x09\x67\x1c\xe6\x38\xc2\xa3\x9e\xe6\xc6\xe2\x5a\x68\x80\x19\xdd\x16\x76\x75\xce\xae\xc2\x1c\x6b\x42\xa7\xc8\xc4\x76\xd1\x29\xdc\xc6\x93\xc3\x92\xa0\x2b\xe9\x1b\x87\x43\x7a\x08\xa0\xeb\xf1\xa7\xbd\x97\x6b\xa2\x37\x74\x76\x68\x38\xb8\xd6\x02\x4f\x5b\xb9\xb0\x7f\x3c\x6b\x71\x9b\x4d\xe1\x5b\x72\x44\x80\x48\xab\x70\xdb\x3d\x4b\xea\x77\xba\x35\x9b\x51\xb1\xec\x17\xdb\xe8\x01\x0a\xef\x02\x44\xa8\x07\x9c\xa8\xb9\xa2\xa7\x97\xf3\xb1\xfe\x04\x7c\x8d\xd5\xca\xb7\xfb\x48\x68\x29\x23\x9c\x4e\xf6\xd9\xa3\x83\x70\xd4\x88\xc4\x7b\x7c\x03\x0e\x49\xa5\x50\x0c\x9a\xbb\x39\xa9\xa5\xab\xfe\x72\xe9\x18\xb7\x63\x84\xec\xaa\xfe\x16\x27\x26\x6c\xd1\x4e\x69\x6c\x09\xd2\x51\x2e\x31\x25\x82\xa8\xa9\x11\xe7\xb7\xbf\xa0\x4c\x21\x81\x9a\xf6\x87\xf0\x4c\x5e\x0c\xbe\x9a\x2c\xe2\x4d\x4d\x3f\xd1\x21\x90\xb2\x53\xda\xbc\x12\xc6\x3c\xab\xfa\x94"}, +{{0x53,0x11,0xf3,0xc9,0x61,0x01,0xcb,0x8b,0x7a,0xbc,0x62,0x2b,0xb9,0x32,0x6b,0x8f,0x51,0x3c,0x2b,0x16,0xd2,0x94,0xdf,0x79,0x7f,0x56,0xdf,0xd8,0x20,0x3d,0xda,0x27,},{0x23,0x0b,0x70,0x02,0xf5,0x7c,0x79,0xae,0x2e,0x6b,0xfd,0xb8,0xdf,0x30,0xdb,0x3e,0x90,0x07,0x56,0xb5,0x4a,0xf3,0x96,0x8c,0x67,0x0e,0xe2,0xf3,0x2b,0xb1,0x1e,0x0a,},{0x3c,0xbb,0xb2,0x60,0x88,0x70,0xde,0xa1,0xef,0xee,0xbb,0x3f,0xbf,0x68,0x1e,0x27,0x70,0x5c,0x35,0xe4,0xdd,0xee,0xa8,0x6c,0x1b,0x34,0x2a,0x77,0xdc,0x29,0x6b,0x49,0x84,0x19,0x80,0x8e,0xac,0xbc,0x78,0x85,0x56,0x11,0xff,0xbc,0x92,0x65,0xa7,0x47,0x98,0xe5,0x18,0x27,0xe6,0xe5,0xd8,0x11,0x81,0x6d,0x3c,0xa2,0x1e,0x8b,0x9c,0x06,},"\x61\xb1\x5b\xe3\x7c\x4e\xb3\x97\xd9\xe7\x7e\x00\x15\x1a\x28\xed\x3e\x86\xd5\x0a\x95\x52\xbb\x48\x50\xb6\x21\x76\x3f\x01\x2e\x7e\x77\xbb\x5d\xb8\xf3\xdf\x7d\xcf\x76\x9f\x2d\x1d\x46\xd8\xd6\x0b\xae\x40\xc8\xca\x6e\x25\xc6\x41\x0b\x60\x07\x8a\x93\xfd\x05\x90\x21\x14\xbd\x91\x04\x5c\x06\x19\x2c\x70\xc4\x2c\x9f\x41\xf8\x16\x1c\xa4\x65\x64\xeb\xc2\x1a\x4b\xdd\x81\x90\xeb\xa2\xae\xb3\x09\x82\x30\x72\xec\x2c\x02\x00\xce\x64\x98\xf9\xd7\x2b\x37\xb3\xfb\x46\x67\x74\x32\x6d\xf3\x7a\xd8\x80\xd8\xed\xdb\x32\xaf\x67\x3e\x45\xd8\x8e\xec\x49\xb1\x57\x7b\x43\xb8\x63\x91\x11\xc2\xe0\xb9\x41\x87\xd2\xd4\xe0\x17\x3c\x00\x0f\x4c\x37\xbe\x84\x5d\x68\x81\x0b\x78\x89\xff\x2a\x04\x9f\x3f\x9f\x24\x5e\xc7\x0f\x21\xde\xf9\x77\x80\xb6\x11\x40\x0a\x83\xc3\x1a\x79\xd9\x3a\x8e\x98\xb6\x08\xfd\xcf\x24\x88\xb0\x68\xfe\x1a\xe4\x21\x72\x93\xa9\x36\x7b\xb7\x34\xb5\xbc\x7b\xd8\x81\x9b\x37\x7f\x09\x0b\x4f\x8f\xdb\xff\x50\x79\x9c\x76\x88\x0d\x19\x13\x35\x80\xe1\xdd\xfc\x2b\x9b\xaa\xdd\xba\xb3\x4f\xc6\xfd\xc0\x78\x01\x4b\xd1\xff\x73\x9d\xaa\xfe\x54\x76\xf3\xf7\x9d\x4d\xbe\xc2\x16\xfa\x76\x80\xee\x8e\x84\x00\x2d\xcb\x9d\xdb\xc7\xfc\x1e\x1c\x8e\xf4\xf1\xb2\xa2\x08\x1b\x92\x82\x24\x3d\xa6\x15\x3c\x1f\xce\x09\x05\xcf\x35\xf8\x3a\x68\x4c\x01\xb0\x45\x57\xec\x84\xf7\xe9\xa9\x4f\xc2\x88\x2e\x2f\xf1\x9f\xea\x21\xd2\xce\x61\x67\x86\x1c\xe0\x1d\xf8\xb8\xd3\xc3\xe8\xd2\x55\x61\x0b\x7a\xf2\x59\x6c\xd5\xcf\x00\x16\x73\x49\x42\xcc\x71\x4c\x27\x2c\x05\xfd\xa9\xd3\x47\x23\x62\x66\x46\xa4\x61\x30\x18\x2c\xeb\xcf\x17\x9e\xc0\x0a\x6a\x17\x3b\xd8\x57\x7f\xa8\x45\xc4\x4d\x19\xc6\x99\x79\x44\x75\x5f\x2b\x4e\x46\x85\x63\xa7\x5e\x90\x16\x52\x3b\x87\xdd\xac\x3e\xee\x21\xbc\xbc\xa0\x8f\xcc\x29\x54\x6a\x43\xcb\xe0\xd8\xd1\x0a\x0e\x8d\xdc\xba\x17\x2d\x1d\xed\x15\x03\x78\xe1\x8b\x36\x8c\x77\x63\x91\x3e\x4b\x40\x70\x12\xfd\x76\xa8\x72\xd2\xcb\x04\x93\x0b\x8e\x22\xb3\x08\x24\x3d\x4c\xc2\x78\xfd\xf2\xe1\xf9\x40\xae\x89\xac\x89\x1b\x9e\x06\x61\xae\xe5\x53\x93\x7b\xf3\x50\xb4\x07\x07\x0a\x1b\xdf\xc4\xf7\xa3\x78\x7e\xf3\x99\xd2\xca\xf4\xec\x74\x43\x9c\x58\x73\x76\xc7\x7b\xe0\xc3\xde\x53\x9d\x3a\xc2\x60\x89\x76\x5b\x9b\xe1\x0b\x90\x38\x69\x46\x36\xe2\x62\xd7\xba\xa0\xb3\xa8\x94\x1a\x20\x15\x96\x76\x39\xf6\x04\x4c\x67\xe5\x9b\xc8\x1c\xf2\xfb\xa7\x04\xac\x0d\xf4\x8d\xa6\x03\x74\x05\xa8\xe8\xb8\xa7\xce\x3c\x58\xef\x38\xa8\x83\x53\x8b\x24\x7f\xfe\x18\x09\x7a\xf0\x95\x24\x2b\x05\x8b\xdd\x1e\x3e\x24\x5e\xec\xe0\xa7\x1b\x75\xb9\x7d\x52\xf2\x0d\x6d\x51\xbb\x97\x66\xb0\xda\x0f\xc0\x9c\x8a\xc2\xa3\x0f\xb6\xe7\xb3\x2e\xe0\x6d\xad\xf4\x6d\x73\x59\xcc\x06\x6a\xa9\x47\x85\xd8\xa8\x82\xff\x09\x7d\x78\xa8\x6b\xe2\xd4\x56\x00\xdd\x3d\x30\x60\x12\x5f\x01\xc0\x63\xe4\x88\xd5\xc3\xef\xee\x1b\xca\x1e\x58\x51\x64\x55\xff\xca\xec\x1b\x81\xef\x43\x38\x76\xbf\x09\xff\xa5\x1d\x6f\x50\x18\x58\x52\x24\x57\x9c\xb6\x7b\x56\xce\x1c\x21\x6e\xc0\xa8\x83\xe0\x6c\x8e\x15\x63\x42\x1e\xa7\x2b\x0c\x10\xd4\xbb\x31\xe4\x91\xc2\xae\x2f\xe8\x13\x9f\x24\x9e\xc9\x27\xd8\x06\xba\x08\xdb\x52\xb1\xb5\x06\x66\x90\x47\xf0\xc1\x16\xff\x37\xac\x5b\xa6\xcd\xb1\xea\xaf\x33\xfd\xad\xb0\x70\x5c\x79\x9d\x35\xac\x6d\x9c\x80\xda\x90\xc1\x43\x8b\x58\x5f\xfd\x59\x35\x0a\x26\x86\xb1\xec\x35\x16\x6c\xb9\xb6\x9a\xd0\xf5\x65\x86\xaa\x03\x27\x4d\x78\x2e\x3f\x85\x8d\xb6\x4a\xdf\xbf\x04\xd5\x22\x8a\x7b\x1c\x4a\x20\x48\xbb\xcd\xb9\x41\x15\x3a\x43\x6d\x74\x2c\x38\xb5\x8b\x4d\x7d\x13\xc9\xf1\xd6\x0e\x15\x2a\xa2\x79\x23\x49\xa3\xd9\x4e\x7e\x6b\x11\x04\xaa\x1b\x87\x09\x98\xc1\x8d\xd7\x06\x56\x54\xa8\x52\x81\xbb\x6f\x02\x7f\xaa\xd5\x56\xb1\xf5\x32\xe7\xa1\xe2\x2d\x56\x40\x69\x28\x95\x87\xa0\xef\xc9\xc1\x58\x5d\x13\x5f\x31\x23\x3c\x41\xf4\x40\x46\x6e\x71\xfe\x90\x12\xe5\xf9\xa0\xd7\x4a\x72\x82\xee\x39\x2f\xb0\x16\x5d\xb7\x9f\xf1\xd3\x17\x6e\xd0\x8a\xfe\x1d\xaa\x66\xcf\xbf\x43\x05\xae\x16\xac\x17\x92\x33\x43\x99\xf7\x1b\x19\x17\xdd\xec\x27\x0a\xcf\xf6\x65\xea\x05\xd1\x84\xc2\xc5\xcd\x2c\xcd\x90\x2b\x22\xf9\xb7\x19\x5e\x66\xa6\x55\x56\xca\x88\x4b\xa6\xf5\xda\x04\xdc\xd4\x61\x7f\x33\xdc\x2b\x44\xa0\xea\x74\x2a\xeb\x2b\x93\xf3\xa4\x1d\xf7\x95\x7a\x02\x67\x97\xa5\x85\xce\xee\x81\x4b\x19\x75\xf5\x23\xd2\xdb\x5d\xbb\x9b\xe0\xca\x64\x9d\x1d\x45\xdc\xfd"}, +{{0xd2,0x90,0xff,0xd9,0x33,0x95,0xbd,0x5f,0xc5,0x87,0xd1,0xab,0x51,0x18,0x66,0xe7,0x2b,0x37,0x1a,0x17,0x35,0x73,0x2d,0x9d,0x5c,0x6a,0x18,0xdd,0x46,0x5e,0x93,0x63,},{0xfd,0x4a,0xad,0x73,0xb0,0x32,0x46,0x1c,0xa0,0xaa,0xe8,0x71,0xca,0x70,0x16,0x38,0x3b,0x2b,0xe0,0x16,0x90,0x53,0xfd,0xbf,0x6c,0x59,0x14,0xfd,0xd6,0xdd,0x6f,0x92,},{0x21,0x70,0x4d,0x5e,0x62,0x6d,0xcf,0x6a,0x9d,0xcd,0xef,0x93,0x54,0x29,0xeb,0x7f,0xb5,0xb2,0x57,0xee,0xcd,0x7b,0xf7,0x4a,0xcb,0x0c,0xd3,0x0e,0xcf,0xcf,0x60,0x8d,0x0c,0x5b,0x63,0x3a,0x4a,0x8a,0x9b,0xa2,0xcc,0x82,0xa2,0x1e,0x03,0x35,0x5e,0x01,0xd8,0x5d,0xae,0x7e,0xca,0xc8,0x89,0x6d,0xc1,0x5d,0xae,0x04,0x85,0x70,0x71,0x04,},"\xeb\xd9\x00\xbc\x91\x0c\x5e\xcc\x4d\x97\xda\xf7\xcb\x5e\xbb\x54\x91\x50\x0b\x7a\xd1\x16\xe3\x06\x60\x95\x07\x09\xd8\x08\x4b\xb6\x43\x4c\x5b\xea\x4a\x8c\xcc\x1e\xd5\xa8\x01\xbe\xbb\x1a\x11\x78\x78\xc0\x37\x47\x00\x3e\x14\x8e\xd9\x14\x34\x83\x2e\x89\x66\x24\x1a\x7f\xff\x22\xfe\x1d\x6d\x8c\x3c\x3d\xdd\x72\x15\xa1\xef\xaf\x4b\x07\xaf\xee\x1b\x25\x67\x3a\x14\x39\xea\xac\x32\x4e\x89\x5d\x4b\xe8\x39\xe9\x76\xc0\x3a\xc0\x01\x25\x48\x76\x88\x8c\xca\xaf\x39\x12\x72\x7a\x60\x10\x6a\x87\xbe\x69\x24\x7c\x9e\x43\x8c\x31\xfc\xa8\xd9\xc6\x1b\xae\x36\x8c\x83\xe4\x09\x01\xa9\x97\x00\xdf\xf8\x39\xb5\x13\xba\x8d\xc4\x2d\x93\xce\x09\x87\xa2\x33\x34\x70\xa9\xf9\x83\x31\x3f\x91\x98\x86\x59\xda\x54\x03\x9e\x49\x9c\xd1\xaf\x2b\x8f\xa0\xeb\xe7\x50\xe2\x4d\x55\xc2\xa5\xbd\x1a\xde\x3f\x68\x00\x92\x54\x2b\xd1\xbe\x0b\x97\x35\xba\x39\x3a\xd5\x69\x7d\x24\x1e\x8e\x8b\x28\x64\x6d\xb2\x7d\x2f\xb5\xa9\x40\xe8\xfa\xea\xf0\xb6\xc9\xef\xda\x88\x61\x5d\xec\x89\x1c\xe7\x32\x93\x08\x13\xbf\xbb\xd0\xbc\x5f\x82\x10\xab\xe8\x43\xbe\xb5\xe4\xf0\x28\xf4\x9b\xea\x34\xf1\xe5\xb0\x9e\xac\x4c\x66\x62\xc7\x4f\xba\x39\xde\x4a\x96\x02\xa9\x69\x4a\x85\xc7\xc1\x37\x5f\xda\xdf\xda\x6a\x19\x57\xfc\x5b\x59\x87\xa6\x87\xb0\x39\x95\xe5\x16\x97\xa1\xab\x5b\xb6\xcb\x11\xb6\x63\xc1\x37\x2f\xad\xe4\xc0\xac\xa8\xfb\xeb\xb4\xeb\x54\xce\x7c\xe3\x6c\x69\x04\xea\xf6\xea\xb2\xf3\x4f\xac\xd8\xc7\x68\xc8\xd3\x6d\xa2\x39\x7b\x1a\x02\x73\x5a\xea\x72\xcf\xaa\xd0\x39\x34\x10\xdb\x52\x7a\x8a\xb2\x36\xd4\xcd\xab\xdc\x88\x8f\xac\x6f\x18\x21\x48\xb1\x32\x61\x44\x25\xd3\x90\xff\x03\x6e\x54\x85\x5e\x42\x03\xc5\x12\x03\xc1\xf4\x3e\x37\xbb\xf6\xb9\xbf\x27\xf5\xb7\xe7\xc6\x65\x15\x14\x65\x40\x1a\xc3\x2c\xbe\x9e\x33\x50\x53\x5e\xdf\x48\xa7\xbc\x36\x03\xe2\x23\x2e\x93\x8f\x9a\x81\x5a\xc4\xd1\xde\xec\x99\x1e\xf9\x62\x09\x48\x44\x1f\x7a\x2f\x4a\x46\xe2\xc4\x00\xab\x91\x4c\x4b\xe5\x1d\xca\xad\x8e\xd8\x23\x9c\xbb\xe9\x77\xa9\xf0\x9c\x02\x69\x83\x19\xd9\xfe\x2a\x8c\x6e\xb6\x0b\x79\x9f\x29\xae\x76\x59\x97\x0d\x2e\xbd\xff\x3c\x6c\xf7\x09\xbb\xf6\xf4\xbb\x55\xb9\xdf\x4f\x61\xa2\x41\xde\xc1\x44\xb5\x99\x3f\x08\x7e\x78\x4b\x97\xbe\x1e\x53\x60\x8c\x2e\x81\x7c\xe3\xd9\xaa\xf9\x14\xe6\xb7\x23\xf5\xb4\xaf\xff\xd2\xa6\xb9\xfe\x9d\x2d\x73\x91\x5c\x7a\xd1\xff\xb1\x3e\xfc\xb7\x3c\x56\x23\x81\x95\x64\x52\x03\x98\x4c\x99\xaa\xfd\x02\x35\xf7\x3b\x3f\x88\x2e\x07\x39\x39\xbf\x78\x66\x57\x28\x01\x38\xdb\x05\xb8\x6f\xcc\x94\x60\xb3\x85\xef\x45\x59\x20\x4e\xcd\x81\xe2\xf1\x2f\x5f\x06\x2a\xa4\x48\xdc\xcc\x82\xea\x8d\x89\x46\x6d\xd1\xbe\x46\xf8\x2c\x4f\x87\xbf\x0d\xb2\xb8\x78\xac\xbb\x0d\x91\x12\xc8\xdb\x6f\x51\xd3\x5f\x6d\x42\xf7\x49\x85\x6b\x99\xe5\x50\xb6\xc4\x54\xe9\xe8\xbe\x4d\xa1\x75\xf0\xb5\xe8\x6b\xe6\x6c\x97\x9f\xd8\x78\x23\x7e\x57\xf6\x91\xf0\xd2\xac\xd0\x28\xfb\xff\xa5\xb0\x66\x87\x75\x03\x4d\xb1\xf2\x1d\xdb\xe7\x11\x4e\xe3\xdc\x0b\x44\xda\xca\x64\xc5\xa0\x3a\x2f\xee\xae\xab\xeb\x70\x63\xbf\xcc\xcc\x55\x9b\xaf\x27\xf1\xcc\xb2\x20\x2f\xa4\xd1\xb2\xbf\x44\xc0\x4b\x2c\x2f\x81\xf9\x4e\x28\x1b\x1a\x5a\xdc\x85\x0d\xa1\xb9\x47\x9f\xca\xbd\xda\xde\xa5\x6a\x11\x5b\xb5\xf0\x6c\xc0\x16\xf1\x41\xc0\xfc\xb5\xe8\x3a\xb2\x48\xea\xec\x90\x15\x8d\x8b\xe6\x47\xaf\xf1\x2e\x7e\xeb\x5e\x57\xdb\xcc\x29\x3c\xb3\xb6\xaa\xcb\x55\x23\x6d\x4a\x83\x9a\x06\x20\xf4\x76\x23\x87\xdd\x17\x14\xdf\x5c\x13\x5e\x3d\x9d\x68\x24\xf9\x3b\x7c\x90\xd3\xae\x38\xc5\x18\xd6\x07\x12\x0c\x83\x95\x70\x41\x3b\x46\xb8\xcc\xd7\x37\x04\x92\xd8\xae\x5c\x60\x9e\x00\xcf\x82\x51\xe2\xe7\xdf\x81\xe5\xb4\xf9\xc1\x6a\x5a\x53\x9f\x0a\xfc\xce\x41\xbb\x43\x62\xe5\xea\xa5\xf9\x40\xa1\x70\x6f\x4a\xfb\x6b\x14\x43\x2c\x81\xd4\xba\x1a\x33\xd3\x22\xdb\xf1\x06\x45\xab\x63\x73\x7e\xad\xc8\x6f\xe6\xe0\x97\x6f\x76\x33\x97\xfb\x89\x86\x37\x59\x5d\xfd\x36\x93\x47\x92\xd7\x79\xe2\x4c\x2a\x3f\x0b\xac\xf5\x3e\x04\x73\xc5\xfd\xa9\xc6\x12\x84\xe4\x41\x9b\xdc\x0e\xef\x5d\x22\xf4\xd9\xbf\x42\xe8\xc0\x49\x33\xbb\x93\xb5\x3c\x29\x5d\x7a\xc9\x39\x5a\xbb\x6d\xcb\xd7\x42\xb1\xe1\xbc\x3b\x0e\xa4\x43\x4e\xa2\x1b\x8e\xca\x9a\xe6\x82\xd3\x31\x5a\x41\xe9\xc3\xc3\x37\x18\x40\x76\x1d\xc5\x9c\xac\x45\xda\x7e\x38\x13\xe2\x87\x88\xdc\x89\xde\x35\x5b\x5a\xee\x08\x80\x90\xa3\x8d\xd3\x9d\x83\xe5\xe4"}, +{{0xd7,0xfd,0x73,0xd1,0xd2,0x29,0xa6,0x58,0x94,0x42,0x0e,0x4b,0xa7,0x34,0x27,0x0d,0x5a,0x20,0x75,0x83,0x64,0xde,0x89,0x7d,0x85,0x55,0xe2,0x41,0x97,0x45,0x3c,0x19,},{0x3c,0x22,0x77,0x2a,0xec,0x0a,0x0c,0x15,0x59,0x07,0x7f,0x2c,0xfd,0x1f,0x24,0x65,0xd4,0xb4,0x84,0x95,0xc5,0xd0,0x5f,0x1f,0x83,0x7c,0x31,0x84,0x5f,0x34,0xca,0xd1,},{0x40,0x0c,0x35,0x05,0xf1,0xdf,0xa8,0x0d,0xf4,0xb2,0x6d,0xb2,0x4c,0x02,0x7e,0xb8,0x19,0x77,0xf0,0xfb,0x9b,0x5a,0xca,0x52,0x4a,0xd5,0x12,0x00,0xf4,0xbf,0xb1,0x33,0xdb,0x83,0x48,0x23,0x31,0x41,0x95,0xf4,0xed,0xc2,0x92,0xd5,0xf5,0x30,0xd0,0x85,0x56,0xe7,0x80,0x9c,0xaf,0x23,0x39,0x76,0x8a,0xa3,0x80,0x29,0xfd,0xbc,0x28,0x0f,},"\xc9\x22\x58\x59\xd5\x55\xbc\x42\x01\x1a\xf1\xb4\xf1\x49\x98\xe6\xe9\xb0\xa6\x5e\x21\x72\x71\x3e\x96\x83\x80\xfb\x6c\xee\xdd\xa2\x2e\x02\x2c\x51\x30\x30\x31\xd9\x93\x1c\xce\xf2\xf7\xbc\x70\x5c\x9e\x21\x5c\x1d\x08\x9d\x48\x8d\xad\xda\xee\x15\x5c\x93\x9b\x62\x02\xca\x53\xbf\xc7\xf6\xe8\x8e\x15\x29\xd8\x2f\xb4\x5e\x02\xb5\xd0\x5a\x82\xbb\xb9\xdb\x5f\x41\x5c\x58\xba\x8b\xd5\x6c\xff\xd9\x22\x70\xb2\x47\x49\xe5\x6d\x12\xc9\x9a\xe9\x0c\x78\x00\xf5\x4f\x55\x25\x4e\xa4\x2d\xa5\xdc\xfb\xe0\xe1\xd9\x89\xcd\x2f\x68\x97\xe2\x32\xdf\x04\x70\x7b\x34\xaf\x75\xfa\x7f\xec\x33\xe5\x5e\xd5\x6a\xee\x39\xc2\x2b\x04\x5b\xed\xd1\x61\x08\x3b\xc5\x51\x4c\x1f\x81\xca\x90\x7b\x7c\x76\x03\x17\xa7\xfd\x5a\x5a\x02\xa5\xd4\x0e\x2e\x82\x3e\x24\xad\x96\xae\xf6\xda\x8e\xa9\x82\xb5\x16\x1c\xc3\x9d\x84\xaa\x2f\xfd\x95\x44\xc1\x1b\x63\x40\x37\xab\x0a\x1c\x8e\x36\xac\x63\x01\x9d\xa1\xb2\xd9\x95\xcb\x7b\xd3\xd6\x2f\xe5\x74\xde\xab\xcc\xbd\x0d\x3a\xe7\xa5\x6e\x5b\xec\x91\xe4\xba\x3f\x3d\xb8\xbf\xea\x88\xe6\x7d\xa6\x2e\x88\x27\x8a\x6e\x3b\x41\x8d\xce\xea\x05\x89\xf2\x5f\x7d\xd8\xad\x19\xdd\x84\x50\x89\x41\x9b\x47\x2e\xfc\xcc\x87\x9c\x17\x2b\x32\xee\x4a\x4d\xbc\x2e\x6c\x2e\x86\x5b\xb3\xb8\xca\x0a\xdc\xb7\x1f\xdf\x89\xe1\x97\x39\x10\xef\x24\x29\x15\xf3\x3e\x23\x6d\x2f\x7c\x8e\x9f\x1e\xe5\xb0\x7c\x6e\x3c\x25\x36\x0f\x8c\xb1\x46\x0b\xe8\x7d\xb3\x1a\x29\x1d\x4d\xee\x34\x95\x3e\x75\xc6\x75\xbf\x18\x1b\xb7\xa0\xb7\xb5\xc1\xbe\xfd\xc8\x6a\xda\x07\x2a\x48\xf6\xac\x75\x5d\x49\x9b\xd6\x8d\x62\x5d\x85\x14\x52\x5c\xc3\xab\x8f\x54\xce\x15\xa8\x71\x29\x17\x78\xde\x13\x05\xd2\x21\x93\x61\xaa\x30\xe3\x32\xa2\xe0\x69\x07\x7c\x5c\x53\x45\x75\x20\x37\x9d\x8b\x90\xd2\x4b\xd8\xa3\xa7\x70\x0f\xf7\x66\x23\x1c\xb5\x69\x7f\x9a\xce\x52\x1a\x99\xe8\x96\xda\x54\xc4\x07\x93\xbc\x7c\x1f\xb1\x58\x4b\xb1\xc8\x61\x94\xd2\xfb\x7a\x4b\x80\x2f\x30\x88\x5e\x0e\xe8\xaf\x88\xd6\x88\x6e\x3a\x3a\x4d\x4c\x85\x46\x49\xcc\x01\xab\xdf\x35\x31\x9a\x08\x56\xcc\x65\xd0\x92\xa3\x86\xf8\x86\x96\x25\xcd\x0a\xca\xc0\x87\xe9\x35\x17\x90\xcc\xb4\xa8\x65\xf6\x51\xa8\x81\xc3\xeb\xf1\x09\x07\x27\x74\xf9\x40\xf5\xaa\x98\xa2\xa2\xaa\x3d\xd3\x66\x47\xd0\xde\x83\x00\x1a\xa7\xcd\xc0\x31\xcc\x4a\x4d\x75\xdc\x11\xce\x55\x16\x76\xa2\xad\x43\xa3\xf6\xa1\x6a\x4b\xc5\xae\xe8\x0e\x53\x64\x20\x60\x87\x36\x4e\xb8\xb2\xb1\x5f\xb7\x05\x38\x0a\x07\x2d\x7c\x8b\x51\x99\x59\x43\xaa\x76\x2e\x8d\xeb\x4c\x56\x8c\xda\xa1\x41\x1a\xb6\x8f\x28\x48\x9e\x13\x23\xbb\x61\x56\xce\x25\x00\xb0\x6e\x77\x93\xc5\x10\xa3\xde\x29\x15\x08\x40\xbf\xdb\x0b\x2b\x7b\x21\xc2\xbb\x8a\x77\x46\x16\x7c\x92\x9d\xd0\xad\xad\x44\xfe\xd8\xf3\x6e\x83\x81\xb3\x42\x08\x0b\x2a\x7d\x82\xa3\xf8\x1f\xf7\x26\x30\xcb\x78\xdf\x91\xf7\xb6\x5a\x44\xef\xf6\xed\x64\xd4\x8a\xfe\xd1\x09\xdd\x7a\x69\x3a\x1b\xa8\xc3\x7e\x00\x8f\xcb\x15\x7e\x37\x29\x7d\x32\xeb\xa7\x65\xa6\xc7\x19\x3e\x73\xbd\x97\x64\x79\x85\xb1\x60\x38\xc7\x4a\x08\x4a\x8f\x25\x65\x4c\xd8\xcd\x2c\xdd\x27\xff\x17\x33\x4e\x06\xad\xaa\x05\x82\x64\x01\x7a\x3b\x2d\xa7\x8e\x57\x38\xa2\x7e\x35\x0d\x88\x2f\x5f\xae\x19\x92\x78\xd4\xe5\x0b\x8b\xad\xf5\x7c\x21\x41\xdf\xdc\x3c\xff\x99\xdf\x5d\xe8\x6f\xec\x29\x3c\x76\xcb\x94\xb6\xb1\x9b\xa3\x03\x4e\x46\x0f\x84\xc2\x80\xa2\xe6\x41\x2f\xab\x56\x98\xce\x89\x02\x07\xca\xba\xbc\xa0\xa9\x5b\x5a\xd5\x33\xce\x11\x4b\xf7\x1a\x40\x4a\x87\x59\x0d\x35\xfa\x7c\xed\xba\x43\x13\x1c\x4e\xe9\x23\x44\x83\x9f\x25\xcb\xfa\xeb\x12\xae\xeb\xc8\x04\x08\x93\x95\x1a\x34\x6b\xd2\x8f\xdd\x16\x7b\xd2\x0f\x71\xa1\xe5\x9f\xb6\x0d\x55\xe1\xc5\x67\xf4\x78\xf0\x27\xcf\x67\x9a\x37\xd1\xd9\xdb\x86\x7e\x17\xbf\xdd\x60\xb3\x47\xd8\x9d\x32\x26\x39\xd3\x15\xbb\x7a\x2c\x91\x34\xf0\x0e\xa0\x3a\x36\x7f\x30\x5e\xa4\xd6\x0d\xc9\xd5\x67\xcf\x92\x48\x51\xe4\x69\xea\x95\x4e\xd3\xea\x63\xea\x86\x06\xf7\x9f\x07\x73\x39\xbf\xa2\xb5\x1a\xe4\x9b\xaa\x0f\xb2\x53\x77\x82\x1d\x7c\x11\xef\x9a\xd4\xbb\x4c\x0f\xe4\x89\xac\xba\xb0\xef\x00\x0d\x61\x8c\x7a\xf5\xef\xd2\x05\xd6\x85\x99\xfc\xbd\xd9\x5e\x28\xf8\x36\xe0\x91\x6f\x9f\xf5\x48\xd0\xba\x17\xda\x62\x53\x6e\x74\x64\x68\x01\xee\xb6\x12\x2b\xa3\x2c\x41\x07\x3a\xe0\x4e\x42\xc6\xc1\xd5\xd8\xd2\x29\x76\xa5\x62\x26\xdd\xf4\xb6\xac\x95\x45\x5f\xb5\x30\x99\xf2\x02\x15\xb2\xeb\xc9\x07"}, +{{0xfd,0xa7,0xcb,0x08,0x40,0x16,0xba,0x51,0x3c,0x7c,0x4f,0x8f,0x71,0x80,0x48,0x0b,0xb1,0x81,0xe9,0x56,0x95,0xea,0x68,0x73,0x7f,0xa3,0x4a,0x40,0xec,0xbd,0xf3,0xef,},{0xa2,0xde,0x3a,0x0e,0xf9,0x72,0x98,0xfd,0x71,0x61,0x06,0xe2,0xf3,0xf5,0x45,0x13,0x05,0x7a,0x40,0x07,0x2d,0x23,0x4c,0x35,0x18,0x15,0x4c,0x1b,0xd1,0x2d,0xe0,0x37,},{0x33,0x61,0x4b,0x7a,0x94,0xf7,0x5e,0x03,0x65,0x34,0xd7,0x6e,0x30,0x14,0x7e,0xcc,0xdd,0x2a,0x04,0xe0,0x0c,0xd4,0x70,0x4a,0xb6,0xe8,0x07,0xd6,0xa2,0xac,0xc1,0xe1,0xd9,0x63,0xb8,0xee,0xe0,0x81,0x0d,0x41,0x2d,0x9d,0x56,0xe5,0x45,0x56,0x30,0x2b,0x10,0x73,0x0c,0x15,0xab,0xf8,0x9c,0x29,0xa0,0x27,0x30,0x3e,0xa8,0x8a,0xe7,0x01,},"\xc2\x1b\xb3\xf8\xe3\x7b\xef\xa3\x67\xc9\x13\x67\x31\x01\xba\x30\xd3\xb5\xc7\x4b\xd8\xbd\xb0\x9c\xd2\x86\x40\x01\x2d\xb4\x11\x20\xc2\xbc\xc4\x08\x5d\xe2\xa0\xf9\x5c\x92\x15\xdd\xef\x8c\xb5\xfc\x8d\x8b\x12\x51\xb4\x15\x27\xc6\x7d\xfa\xa3\xf9\x5b\xa3\x57\x83\x91\xea\x5a\x66\x29\xa7\x33\x09\x5f\xd0\xa4\x3f\xdb\xa4\x0f\xfe\x26\x0f\xff\x82\xac\xee\x2e\xbe\x98\x0e\x9e\xce\xcc\xfe\x7e\x10\xb2\xed\x8c\x2e\x6b\x41\x0d\x54\x7a\x12\x86\x57\x1d\xf3\xd7\x01\x17\x4e\x57\x9f\xcf\x19\xd3\xbd\x80\x86\xc0\x42\x3f\x37\x11\x77\x89\xf3\x05\xd9\x67\x0a\xd2\x8c\x99\x67\x4f\x52\xcf\x64\x21\x1a\x08\x1d\x0c\x6c\x30\x96\xda\x2c\x71\xbf\x5f\x57\x99\xa7\x91\x0e\x6f\x38\x10\x4a\x37\xa6\x55\x7c\x2d\xae\xf3\x40\x81\x4a\x1f\x83\x0d\x59\x37\x73\xc6\xcf\x48\xd8\x3e\xa0\x72\x94\xb9\x4e\xb0\x80\xb8\x5d\x69\x70\xe2\x8f\x40\x51\xd5\x06\x6d\xb1\x0e\x96\x19\x73\xa6\x26\xa8\x26\xae\xaf\x8a\x06\xec\x0d\x56\x6b\x7e\x0c\x4e\xf6\x0f\x0c\x56\x78\xfc\xbb\x5b\x2a\xc6\x3f\x7b\xed\x06\x44\x8a\x24\x7b\x3d\x42\x7b\x87\x08\x6d\x33\x57\x3f\xb2\xd7\x22\x8c\x5c\x34\xea\x66\x40\xee\xfa\x95\x64\x48\x5a\x79\x63\x8e\x9c\x97\xc0\xaf\x84\xcf\xee\x7c\xe4\xa7\x39\x22\x0c\x84\x29\xe0\x67\x14\x39\x53\xd5\x50\x66\x8d\xad\xc8\x4e\x7b\xed\x9a\xb0\x70\xa5\x94\x33\x90\xc6\x11\xd7\x5b\x1c\xb1\x28\x73\xa3\x7d\x98\x50\x66\x1a\x00\x77\xbf\xa9\xca\x9b\x8b\x26\x37\x66\xc1\x49\xff\x0e\xe4\xb4\xad\xba\x25\xea\xf7\xd7\xf5\x01\xf3\x62\x45\x42\x56\xbc\x12\x69\x37\x8e\xf3\x35\x9a\x8e\xd6\xb9\x60\xb8\x66\x21\xfa\x3b\x61\x3e\xb1\x32\x12\x2f\x49\xf2\xeb\x2c\xeb\x68\x32\xa3\x99\x1e\x96\x1c\xb0\xe7\x8b\x74\x2e\xf4\xd6\x5e\x8d\xe3\x46\x96\x66\xfe\xc7\xc5\xb8\x74\x78\x95\x71\xc5\xc9\x9a\x2c\x02\xa0\x53\xff\x7d\x2f\xc9\x00\x76\xba\xfe\x1f\x26\x7f\xa8\x1a\x39\x90\xf2\x7f\xf1\x4f\x03\x00\x0a\xf0\x0c\x59\x28\x6c\xb9\xbb\x98\xe2\x04\xe9\x01\x90\xae\x2a\x50\xed\xef\x04\x9e\xa9\x2a\x1f\x78\x50\x88\xf9\x4a\xdf\x65\x88\xfb\x43\xbb\x40\xfb\xe2\x32\x42\x35\xcc\x7e\x16\x8b\x80\x26\x4b\x06\x9f\x94\x4f\x50\x36\x92\xc9\x49\x23\x4d\x5b\x76\xbc\xff\xab\xe2\x9f\xf9\x06\x4b\xd7\xcb\xed\x9e\x00\xe5\xb7\xfd\xda\x43\x12\xeb\x80\x14\x65\xf1\x27\xd0\xca\x68\x83\x2a\x7f\x4e\xd0\xea\xed\x8f\x55\x9c\x16\x31\xcd\x4d\x34\xf0\xdc\x41\x4d\x9f\xcf\xe8\x49\xa9\x1e\x25\xf3\xe0\xff\x01\x3a\x8c\xff\xa8\x06\xed\x8e\x93\xd0\x8a\x1e\x5a\x75\x76\x82\xca\x3d\x26\xab\xc8\x69\xc7\x6f\x1c\x79\x00\x7d\x55\x9d\xfe\x67\xe7\x8d\x8a\xf0\x19\x58\x08\xb0\xe7\x71\xc7\x1e\x64\xb5\x71\x6f\xb3\x63\x09\xc2\x50\x25\xfa\xe6\x41\x4c\x28\xbb\xdb\xd4\xde\x59\x7a\x74\x99\x6c\x9d\xa9\x74\x92\x0d\x59\xe6\xf4\xc2\xed\xfe\x11\x0f\xf8\x17\xfd\x48\x0a\x50\x80\x97\x80\x48\x86\x57\x12\x05\x8c\x5f\xe7\xb5\x60\xb1\x2b\x67\xf7\x37\xea\x6e\x2a\xf9\x24\x2c\xf0\x7a\xd0\xa8\xa6\x79\xf2\x64\x30\x04\x6a\xdc\x3e\x70\x66\x4c\xc9\xc0\xee\x5a\xbc\xef\x6d\x72\x6b\x4e\x04\x17\x60\x48\xb7\x95\xbe\x12\x85\x1b\xdb\x74\x00\x3a\x13\x20\x41\x19\xb8\x68\x64\xd6\x53\x5b\xa0\x95\x04\x0a\x85\xd9\x78\x1c\xf4\xf3\x48\x0a\x30\x4e\x22\x7f\x78\x7a\xd5\x38\xe6\x8f\x4b\xab\x01\x41\x79\xe3\x0d\x3f\xde\xf9\xef\xf1\x1b\xcf\x47\x1f\xa3\xa0\xbc\x74\xb5\x57\x6f\x30\x2d\x3a\x6b\x49\x9f\x11\xf2\xef\x32\x6a\xc0\x26\xc9\x8d\xb1\x0e\x27\x41\x41\x3f\x32\x22\x28\xb3\xcf\xf0\xf3\x37\xba\x2f\x29\x4c\x78\xef\x73\xf0\xe8\x77\x87\x8f\x8f\xc7\xff\x6d\x10\xbc\xe6\x6a\xd6\x28\x43\x79\xb8\x0c\xa8\x93\x27\xd4\xdb\x0b\xf1\x4e\x6d\x8f\x01\xb2\x2a\xb2\x02\xb7\x16\xcc\x07\xe3\xc8\x86\x6d\x16\x8a\x50\x94\xba\xc5\xa4\x95\xe7\x38\x68\xee\xdc\x27\x22\x2e\x64\x44\xf8\x3b\xcf\x65\xac\xdc\x3e\xc8\x91\x20\xbb\x50\xe8\xab\xfc\x28\xb7\x8e\x6d\x98\x0c\x77\x5f\x48\x49\xa0\xe8\xca\xda\x80\x24\x0b\xca\x24\x5e\x39\x96\x6e\x89\xa0\x34\x4d\xf8\x36\x3a\x7d\xcc\x81\xb2\x01\xce\x9c\x75\x3a\xd5\x44\xe1\x12\x4e\x21\x02\x0d\x4c\x62\xde\xda\x9e\xd9\xb9\xd1\xf2\xfb\x7c\x54\xca\x7a\xb0\x9f\x38\x3b\xef\x48\xcf\xc6\x84\x8c\x27\x13\x02\xa1\x0f\xa6\x87\xf5\x6e\x00\xe0\xa7\xd0\x93\xc9\x27\xb4\xfd\xd8\xf1\xbe\xdf\x62\x88\xa0\xe3\x02\x84\x8a\x80\x12\xf1\x27\xa7\x9d\x2d\x30\xa0\x6c\xe1\x7d\x94\xaa\x6f\x7f\x8a\x1e\x6e\xb9\xd0\x68\x1c\x37\x74\xf6\x14\xcc\x6d\xbc\xb2\xa8\x13\xf9\x25\xc6\x30\x6a\x63\x05\x72\xa8\x3e\xc1\x09\xd5\xf5\x33\xc0\x58\x4c\xb4\x21\xd9\x19"}, +{{0xa1,0xac,0x48,0xaa,0x5f,0xfa,0x3d,0x80,0x08,0x19,0xd0,0x3b,0x7f,0x62,0xba,0xbf,0x29,0x1f,0x20,0x90,0x4c,0x11,0xa6,0x40,0x0e,0x4f,0x45,0x20,0x5f,0x10,0x3e,0x38,},{0x08,0x54,0xe0,0x34,0x0f,0x81,0x49,0x85,0xfb,0x12,0x2b,0x78,0x72,0x94,0x79,0xe3,0xfd,0xe8,0x55,0xc2,0x11,0xca,0xde,0xae,0x56,0xf0,0xd4,0xdc,0x08,0x28,0xd5,0xfa,},{0xc5,0x7e,0x3c,0x09,0x1e,0xd2,0x4e,0x5e,0x84,0x66,0x5b,0xd9,0xbb,0x10,0x2d,0xb4,0x97,0x97,0xdf,0x90,0x08,0xf0,0x55,0x57,0xfa,0x0d,0x5a,0xd7,0xa2,0x95,0xe5,0xe4,0xd2,0xa4,0x71,0x6b,0x17,0xf8,0xc9,0x1c,0xb1,0x2f,0x5a,0xbf,0xb1,0xaf,0x02,0x7f,0xb0,0x41,0x11,0x99,0xac,0xc5,0xd2,0x85,0xd8,0x42,0xa4,0xb6,0x5b,0xde,0x49,0x02,},"\xd6\xf1\x24\xed\x75\x20\x21\xc1\x09\x26\x97\x2a\x0c\x26\xf3\xb1\x83\x8b\x3c\x7a\xf2\x47\xc1\x80\x09\xa2\x31\xec\xce\x96\x4b\xf6\x69\x86\x37\x83\x3f\x60\x7d\xca\x83\x6f\x8a\x60\x6c\x72\xae\x3c\xb1\x70\x17\x44\x47\xa2\xcc\xe5\x83\xf6\xe2\x44\xdb\xc1\x63\xe2\x15\xb9\x82\x0d\xe7\x49\x6f\xfc\x5b\x70\x50\xc4\x8f\x28\x30\x24\x66\x78\xcb\xa4\xdc\x5c\xaa\x07\xc1\x45\x85\x63\xaa\x2d\x10\xdc\xb7\x77\x0e\xf8\xfe\xde\x02\x7d\xd7\xf2\x0d\xdc\x8c\xc7\x8c\x3a\x2e\x2e\x95\x8b\xd1\x8c\x00\x06\xcf\x8f\xb8\x2d\x44\xe5\x3e\x1d\xa7\xaa\x80\xfd\x10\x06\xf3\xb2\x30\x0c\x9b\x07\x9d\x8a\x66\xf1\xe4\xa3\xf4\x70\x61\xf9\xe2\xf4\x5d\xae\x35\xdc\x29\x52\x04\xb1\x94\x60\xca\x57\x07\xab\x57\xce\x21\x5a\x24\xc1\x0f\xaa\xb3\xfa\x20\xbc\xcd\x10\x1e\x7a\x7d\x70\x07\x75\x99\xf3\xd6\x72\x57\x07\x55\x21\x29\xca\xd7\x57\xd6\x51\x4c\x1b\x28\x99\x7e\x47\x1f\x94\xb0\xfd\xed\x8f\xbb\xd0\x65\xde\xad\x19\x6d\x2c\x07\xd3\xdf\xa7\xb9\xfb\x3b\xae\x76\x80\xf7\x66\x21\x20\x0d\x09\x9e\xeb\xeb\xbe\xa0\xe8\x95\x7d\xf5\xb5\xe2\x04\xca\x3e\x9e\x29\x52\xb8\xa3\x0f\x0a\x13\x1a\x68\x67\xb1\x38\x1e\x39\x4b\x1b\x44\x43\x10\xf0\x76\x32\x66\x56\xcf\x93\x41\x67\x80\x08\xe9\x52\x51\x47\xd8\xd6\x1c\xe9\x3d\x3b\xf5\x39\x00\xca\xb9\x12\x66\x37\x17\xe0\x98\x72\x93\x83\x3d\x19\x02\xd7\xfb\x04\x7b\x99\x7b\x86\x02\x6c\x46\x7d\x7b\xb1\x7c\xf4\x57\x96\x73\x8f\x7a\x77\x4a\xc1\x26\x76\x4e\xd4\xeb\x45\x12\x43\x09\xf4\x58\x62\x60\x17\x6b\xa4\x65\x91\x8d\x48\x33\x0a\x9c\xc1\x8c\x4e\xce\xa0\xdd\xaf\x38\x94\x6a\xcc\x0e\x36\x1d\xd4\x0a\x7e\x91\x33\xce\xb5\x0e\x1c\x31\x7e\xa4\x2b\xd0\x98\x0a\x72\xb8\xba\x3d\x8a\x6c\x76\x93\xdd\x56\x02\xf3\x74\xf2\x66\x4d\xf4\xba\x56\xdf\x01\xe8\x82\xfc\xa4\x2c\xb4\xdb\x62\x1f\x47\x6c\x76\xe1\xea\x9f\xd1\x05\x91\x1a\x74\xb7\x79\x52\xd9\x91\x4a\x5a\xc0\xf9\x8a\x90\x0c\x1b\x2e\x1a\x56\xc4\xea\x85\x18\xa9\xee\x47\xc4\xed\x14\xd0\xbd\x35\xec\xa5\x60\x31\x9c\x8e\xa2\x47\x55\xd7\x1a\x4e\x03\x08\x50\xbc\x4d\xc6\x03\x89\xf3\x25\x80\x40\x21\x20\x4c\xce\xbc\x25\xfe\xdb\xd3\x2e\xdd\x8d\x84\x46\xaa\x23\xce\x56\xa8\x5f\x77\x9e\x85\x8d\x36\xaf\x7c\x07\x3c\x11\x5e\x34\x1f\x41\x2c\x66\x0f\xab\x80\x0f\xe7\x4c\x50\xe7\x14\xee\x08\x6e\x2f\xbc\x8d\x7a\xbb\xf3\xe9\x8f\xb4\x0c\xa2\x7f\x1f\x01\xa9\xaa\xdd\x8c\xc2\x27\x5c\x2d\xd3\xf7\x6e\x4c\x1d\x81\xc4\xb7\x92\xda\xec\xc9\xfe\x66\x04\x49\x41\xb8\xb2\x91\x84\x86\xdd\x4a\xcb\x56\x2a\x7b\x58\xad\x8c\x60\xc2\x1b\x83\xcf\x48\xae\xfa\x72\x56\xa1\xed\x80\x9e\x66\x98\x11\xf4\x84\x36\x49\x70\xbc\x56\x95\x08\x99\x19\xbc\x32\xd2\x8e\xa7\x52\xe8\xe3\x18\xce\xff\x46\x7f\x77\xae\x19\x77\xc5\xff\xd7\x9c\x17\xc2\xda\x8b\xc7\xf8\x23\xdd\x94\x39\x86\x83\x18\x99\x45\xf8\xb7\x92\x38\xa4\xe8\x15\xb1\x42\xb8\x66\xac\xbd\xbc\xb7\xae\xa7\xf1\x43\xff\xfb\x7c\xc2\xb4\xb5\x4b\xbf\x36\x1a\xfd\xa9\x13\xad\x6d\xf1\xe4\x9d\xfd\x6b\x53\x26\x42\xe6\x3f\x55\xd8\x93\xa4\x70\xd4\x03\x70\x66\x5c\xfb\x74\xef\xd3\xf5\x9c\xb0\xff\x60\x06\x17\x4c\xa3\x5f\x53\xb9\x7c\x54\x3e\x08\xaf\x4b\xf5\xbb\x75\xff\x90\x31\x61\x06\x52\xa3\xf6\xf2\xa0\xcf\xe9\x7e\x7a\x52\x1f\x3d\x2a\x28\x91\x14\xde\xd3\x47\x72\xb0\xe4\x98\x17\xbd\xe1\xcb\x92\x4f\xf5\x14\xe2\x86\x6a\x09\xe3\xed\xe0\x78\x2d\x2c\x0c\x98\xe6\x81\x4b\x8c\x1e\x77\x8c\xf8\x30\x63\x48\xc9\x33\xad\xb2\xe4\x72\xdb\xa0\x9d\xb9\x54\xff\x49\x64\x83\x73\x39\x5a\x2f\x01\x81\x95\x8f\xeb\x1e\xa2\x83\x4c\x99\x53\x28\x73\xdb\x5c\x88\xeb\x52\x89\xc7\x7e\x90\x01\x52\x03\xef\x50\x2a\xc8\xe1\xc4\x8f\xa1\xa0\x6d\xaf\xa6\x51\x9d\x52\xda\xe3\xc5\x56\x75\x70\xdd\x24\x34\xe6\x71\x92\x7c\x66\x36\x3f\x78\x31\x56\x89\x3f\x13\x8a\x84\xc7\x56\x64\xb3\x0a\xe4\x27\x51\x12\x73\x6d\x53\xd4\xf3\x99\xdd\xda\x3d\x23\x06\x7c\x07\x3f\x52\x1a\xfb\xa1\xf7\xbe\x58\x55\x13\xc2\xce\xc9\xc8\xf0\x8d\x2a\x22\xc3\xc8\x53\x92\xcd\x2a\xe5\x0f\x39\x28\x25\x1f\x86\xb3\x10\xc6\x9a\x0f\x8c\x4e\x85\x3a\xb3\xf3\xe8\x12\x9b\x05\x66\xef\x4b\xbb\xe8\x0b\x8c\x02\xc8\x92\x8a\x4d\xe5\x6c\x0d\x11\x9a\x45\xbb\xf5\xaf\x18\x08\xd4\x88\x85\x2d\x8a\x45\xbe\xb0\xd6\x83\x24\x8a\x4d\x65\xde\x15\x26\xb3\xd1\xd2\xff\xc1\xf2\x22\x15\xb6\x08\x46\x8c\xbc\x3b\xd3\x95\x14\xb3\x97\xfc\x0d\xb0\xf1\x13\xdb\xe6\xfc\xe4\x65\x2e\x82\xff\x89\x5b\x2b\x43\x87\xe0\x41\xd7\xe4\xe7\xbd\xe4\x69\x47\x69\x66\x5e\x81"}, +{{0xf5,0xe5,0x76,0x7c,0xf1,0x53,0x31,0x95,0x17,0x63,0x0f,0x22,0x68,0x76,0xb8,0x6c,0x81,0x60,0xcc,0x58,0x3b,0xc0,0x13,0x74,0x4c,0x6b,0xf2,0x55,0xf5,0xcc,0x0e,0xe5,},{0x27,0x81,0x17,0xfc,0x14,0x4c,0x72,0x34,0x0f,0x67,0xd0,0xf2,0x31,0x6e,0x83,0x86,0xce,0xff,0xbf,0x2b,0x24,0x28,0xc9,0xc5,0x1f,0xef,0x7c,0x59,0x7f,0x1d,0x42,0x6e,},{0x0a,0xab,0x4c,0x90,0x05,0x01,0xb3,0xe2,0x4d,0x7c,0xdf,0x46,0x63,0x32,0x6a,0x3a,0x87,0xdf,0x5e,0x48,0x43,0xb2,0xcb,0xdb,0x67,0xcb,0xf6,0xe4,0x60,0xfe,0xc3,0x50,0xaa,0x53,0x71,0xb1,0x50,0x8f,0x9f,0x45,0x28,0xec,0xea,0x23,0xc4,0x36,0xd9,0x4b,0x5e,0x8f,0xcd,0x4f,0x68,0x1e,0x30,0xa6,0xac,0x00,0xa9,0x70,0x4a,0x18,0x8a,0x03,},"\x08\xb8\xb2\xb7\x33\x42\x42\x43\x76\x0f\xe4\x26\xa4\xb5\x49\x08\x63\x21\x10\xa6\x6c\x2f\x65\x91\xea\xbd\x33\x45\xe3\xe4\xeb\x98\xfa\x6e\x26\x4b\xf0\x9e\xfe\x12\xee\x50\xf8\xf5\x4e\x9f\x77\xb1\xe3\x55\xf6\xc5\x05\x44\xe2\x3f\xb1\x43\x3d\xdf\x73\xbe\x84\xd8\x79\xde\x7c\x00\x46\xdc\x49\x96\xd9\xe7\x73\xf4\xbc\x9e\xfe\x57\x38\x82\x9a\xdb\x26\xc8\x1b\x37\xc9\x3a\x1b\x27\x0b\x20\x32\x9d\x65\x86\x75\xfc\x6e\xa5\x34\xe0\x81\x0a\x44\x32\x82\x6b\xf5\x8c\x94\x1e\xfb\x65\xd5\x7a\x33\x8b\xbd\x2e\x26\x64\x0f\x89\xff\xbc\x1a\x85\x8e\xfc\xb8\x55\x0e\xe3\xa5\xe1\x99\x8b\xd1\x77\xe9\x3a\x73\x63\xc3\x44\xfe\x6b\x19\x9e\xe5\xd0\x2e\x82\xd5\x22\xc4\xfe\xba\x15\x45\x2f\x80\x28\x8a\x82\x1a\x57\x91\x16\xec\x6d\xad\x2b\x3b\x31\x0d\xa9\x03\x40\x1a\xa6\x21\x00\xab\x5d\x1a\x36\x55\x3e\x06\x20\x3b\x33\x89\x0c\xc9\xb8\x32\xf7\x9e\xf8\x05\x60\xcc\xb9\xa3\x9c\xe7\x67\x96\x7e\xd6\x28\xc6\xad\x57\x3c\xb1\x16\xdb\xef\xef\xd7\x54\x99\xda\x96\xbd\x68\xa8\xa9\x7b\x92\x8a\x8b\xbc\x10\x3b\x66\x21\xfc\xde\x2b\xec\xa1\x23\x1d\x20\x6b\xe6\xcd\x9e\xc7\xaf\xf6\xf6\xc9\x4f\xcd\x72\x04\xed\x34\x55\xc6\x8c\x83\xf4\xa4\x1d\xa4\xaf\x2b\x74\xef\x5c\x53\xf1\xd8\xac\x70\xbd\xcb\x7e\xd1\x85\xce\x81\xbd\x84\x35\x9d\x44\x25\x4d\x95\x62\x9e\x98\x55\xa9\x4a\x7c\x19\x58\xd1\xf8\xad\xa5\xd0\x53\x2e\xd8\xa5\xaa\x3f\xb2\xd1\x7b\xa7\x0e\xb6\x24\x8e\x59\x4e\x1a\x22\x97\xac\xbb\xb3\x9d\x50\x2f\x1a\x8c\x6e\xb6\xf1\xce\x22\xb3\xde\x1a\x1f\x40\xcc\x24\x55\x41\x19\xa8\x31\xa9\xaa\xd6\x07\x9c\xad\x88\x42\x5d\xe6\xbd\xe1\xa9\x18\x7e\xbb\x60\x92\xcf\x67\xbf\x2b\x13\xfd\x65\xf2\x70\x88\xd7\x8b\x7e\x88\x3c\x87\x59\xd2\xc4\xf5\xc6\x5a\xdb\x75\x53\x87\x8a\xd5\x75\xf9\xfa\xd8\x78\xe8\x0a\x0c\x9b\xa6\x3b\xcb\xcc\x27\x32\xe6\x94\x85\xbb\xc9\xc9\x0b\xfb\xd6\x24\x81\xd9\x08\x9b\xec\xcf\x80\xcf\xe2\xdf\x16\xa2\xcf\x65\xbd\x92\xdd\x59\x7b\x07\x07\xe0\x91\x7a\xf4\x8b\xbb\x75\xfe\xd4\x13\xd2\x38\xf5\x55\x5a\x7a\x56\x9d\x80\xc3\x41\x4a\x8d\x08\x59\xdc\x65\xa4\x61\x28\xba\xb2\x7a\xf8\x7a\x71\x31\x4f\x31\x8c\x78\x2b\x23\xeb\xfe\x80\x8b\x82\xb0\xce\x26\x40\x1d\x2e\x22\xf0\x4d\x83\xd1\x25\x5d\xc5\x1a\xdd\xd3\xb7\x5a\x2b\x1a\xe0\x78\x45\x04\xdf\x54\x3a\xf8\x96\x9b\xe3\xea\x70\x82\xff\x7f\xc9\x88\x8c\x14\x4d\xa2\xaf\x58\x42\x9e\xc9\x60\x31\xdb\xca\xd3\xda\xd9\xaf\x0d\xcb\xaa\xaf\x26\x8c\xb8\xfc\xff\xea\xd9\x4f\x3c\x7c\xa4\x95\xe0\x56\xa9\xb4\x7a\xcd\xb7\x51\xfb\x73\xe6\x66\xc6\xc6\x55\xad\xe8\x29\x72\x97\xd0\x7a\xd1\xba\x5e\x43\xf1\xbc\xa3\x23\x01\x65\x13\x39\xe2\x29\x04\xcc\x8c\x42\xf5\x8c\x30\xc0\x4a\xaf\xdb\x03\x8d\xda\x08\x47\xdd\x98\x8d\xcd\xa6\xf3\xbf\xd1\x5c\x4b\x4c\x45\x25\x00\x4a\xa0\x6e\xef\xf8\xca\x61\x78\x3a\xac\xec\x57\xfb\x3d\x1f\x92\xb0\xfe\x2f\xd1\xa8\x5f\x67\x24\x51\x7b\x65\xe6\x14\xad\x68\x08\xd6\xf6\xee\x34\xdf\xf7\x31\x0f\xdc\x82\xae\xbf\xd9\x04\xb0\x1e\x1d\xc5\x4b\x29\x27\x09\x4b\x2d\xb6\x8d\x6f\x90\x3b\x68\x40\x1a\xde\xbf\x5a\x7e\x08\xd7\x8f\xf4\xef\x5d\x63\x65\x3a\x65\x04\x0c\xf9\xbf\xd4\xac\xa7\x98\x4a\x74\xd3\x71\x45\x98\x67\x80\xfc\x0b\x16\xac\x45\x16\x49\xde\x61\x88\xa7\xdb\xdf\x19\x1f\x64\xb5\xfc\x5e\x2a\xb4\x7b\x57\xf7\xf7\x27\x6c\xd4\x19\xc1\x7a\x3c\xa8\xe1\xb9\x39\xae\x49\xe4\x88\xac\xba\x6b\x96\x56\x10\xb5\x48\x01\x09\xc8\xb1\x7b\x80\xe1\xb7\xb7\x50\xdf\xc7\x59\x8d\x5d\x50\x11\xfd\x2d\xcc\x56\x00\xa3\x2e\xf5\xb5\x2a\x1e\xcc\x82\x0e\x30\x8a\xa3\x42\x72\x1a\xac\x09\x43\xbf\x66\x86\xb6\x4b\x25\x79\x37\x65\x04\xcc\xc4\x93\xd9\x7e\x6a\xed\x3f\xb0\xf9\xcd\x71\xa4\x3d\xd4\x97\xf0\x1f\x17\xc0\xe2\xcb\x37\x97\xaa\x2a\x2f\x25\x66\x56\x16\x8e\x6c\x49\x6a\xfc\x5f\xb9\x32\x46\xf6\xb1\x11\x63\x98\xa3\x46\xf1\xa6\x41\xf3\xb0\x41\xe9\x89\xf7\x91\x4f\x90\xcc\x2c\x7f\xff\x35\x78\x76\xe5\x06\xb5\x0d\x33\x4b\xa7\x7c\x22\x5b\xc3\x07\xba\x53\x71\x52\xf3\xf1\x61\x0e\x4e\xaf\xe5\x95\xf6\xd9\xd9\x0d\x11\xfa\xa9\x33\xa1\x5e\xf1\x36\x95\x46\x86\x8a\x7f\x3a\x45\xa9\x67\x68\xd4\x0f\xd9\xd0\x34\x12\xc0\x91\xc6\x31\x5c\xf4\xfd\xe7\xcb\x68\x60\x69\x37\x38\x0d\xb2\xea\xaa\x70\x7b\x4c\x41\x85\xc3\x2e\xdd\xcd\xd3\x06\x70\x5e\x4d\xc1\xff\xc8\x72\xee\xee\x47\x5a\x64\xdf\xac\x86\xab\xa4\x1c\x06\x18\x98\x3f\x87\x41\xc5\xef\x68\xd3\xa1\x01\xe8\xa3\xb8\xca\xc6\x0c\x90\x5c\x15\xfc\x91\x08\x40\xb9\x4c\x00\xa0\xb9\xd0"}, + +{{0xf5,0xe5,0x76,0x7c,0xf1,0x53,0x31,0x95,0x17,0x63,0x0f,0x22,0x68,0x76,0xb8,0x6c,0x81,0x60,0xcc,0x58,0x3b,0xc0,0x13,0x74,0x4c,0x6b,0xf2,0x55,0xf5,0xcc,0x0e,0xe5,},{0x27,0x81,0x17,0xfc,0x14,0x4c,0x72,0x34,0x0f,0x67,0xd0,0xf2,0x31,0x6e,0x83,0x86,0xce,0xff,0xbf,0x2b,0x24,0x28,0xc9,0xc5,0x1f,0xef,0x7c,0x59,0x7f,0x1d,0x42,0x6e,},{0x0a,0xab,0x4c,0x90,0x05,0x01,0xb3,0xe2,0x4d,0x7c,0xdf,0x46,0x63,0x32,0x6a,0x3a,0x87,0xdf,0x5e,0x48,0x43,0xb2,0xcb,0xdb,0x67,0xcb,0xf6,0xe4,0x60,0xfe,0xc3,0x50,0xaa,0x53,0x71,0xb1,0x50,0x8f,0x9f,0x45,0x28,0xec,0xea,0x23,0xc4,0x36,0xd9,0x4b,0x5e,0x8f,0xcd,0x4f,0x68,0x1e,0x30,0xa6,0xac,0x00,0xa9,0x70,0x4a,0x18,0x8a,0x03,},"\x08\xb8\xb2\xb7\x33\x42\x42\x43\x76\x0f\xe4\x26\xa4\xb5\x49\x08\x63\x21\x10\xa6\x6c\x2f\x65\x91\xea\xbd\x33\x45\xe3\xe4\xeb\x98\xfa\x6e\x26\x4b\xf0\x9e\xfe\x12\xee\x50\xf8\xf5\x4e\x9f\x77\xb1\xe3\x55\xf6\xc5\x05\x44\xe2\x3f\xb1\x43\x3d\xdf\x73\xbe\x84\xd8\x79\xde\x7c\x00\x46\xdc\x49\x96\xd9\xe7\x73\xf4\xbc\x9e\xfe\x57\x38\x82\x9a\xdb\x26\xc8\x1b\x37\xc9\x3a\x1b\x27\x0b\x20\x32\x9d\x65\x86\x75\xfc\x6e\xa5\x34\xe0\x81\x0a\x44\x32\x82\x6b\xf5\x8c\x94\x1e\xfb\x65\xd5\x7a\x33\x8b\xbd\x2e\x26\x64\x0f\x89\xff\xbc\x1a\x85\x8e\xfc\xb8\x55\x0e\xe3\xa5\xe1\x99\x8b\xd1\x77\xe9\x3a\x73\x63\xc3\x44\xfe\x6b\x19\x9e\xe5\xd0\x2e\x82\xd5\x22\xc4\xfe\xba\x15\x45\x2f\x80\x28\x8a\x82\x1a\x57\x91\x16\xec\x6d\xad\x2b\x3b\x31\x0d\xa9\x03\x40\x1a\xa6\x21\x00\xab\x5d\x1a\x36\x55\x3e\x06\x20\x3b\x33\x89\x0c\xc9\xb8\x32\xf7\x9e\xf8\x05\x60\xcc\xb9\xa3\x9c\xe7\x67\x96\x7e\xd6\x28\xc6\xad\x57\x3c\xb1\x16\xdb\xef\xef\xd7\x54\x99\xda\x96\xbd\x68\xa8\xa9\x7b\x92\x8a\x8b\xbc\x10\x3b\x66\x21\xfc\xde\x2b\xec\xa1\x23\x1d\x20\x6b\xe6\xcd\x9e\xc7\xaf\xf6\xf6\xc9\x4f\xcd\x72\x04\xed\x34\x55\xc6\x8c\x83\xf4\xa4\x1d\xa4\xaf\x2b\x74\xef\x5c\x53\xf1\xd8\xac\x70\xbd\xcb\x7e\xd1\x85\xce\x81\xbd\x84\x35\x9d\x44\x25\x4d\x95\x62\x9e\x98\x55\xa9\x4a\x7c\x19\x58\xd1\xf8\xad\xa5\xd0\x53\x2e\xd8\xa5\xaa\x3f\xb2\xd1\x7b\xa7\x0e\xb6\x24\x8e\x59\x4e\x1a\x22\x97\xac\xbb\xb3\x9d\x50\x2f\x1a\x8c\x6e\xb6\xf1\xce\x22\xb3\xde\x1a\x1f\x40\xcc\x24\x55\x41\x19\xa8\x31\xa9\xaa\xd6\x07\x9c\xad\x88\x42\x5d\xe6\xbd\xe1\xa9\x18\x7e\xbb\x60\x92\xcf\x67\xbf\x2b\x13\xfd\x65\xf2\x70\x88\xd7\x8b\x7e\x88\x3c\x87\x59\xd2\xc4\xf5\xc6\x5a\xdb\x75\x53\x87\x8a\xd5\x75\xf9\xfa\xd8\x78\xe8\x0a\x0c\x9b\xa6\x3b\xcb\xcc\x27\x32\xe6\x94\x85\xbb\xc9\xc9\x0b\xfb\xd6\x24\x81\xd9\x08\x9b\xec\xcf\x80\xcf\xe2\xdf\x16\xa2\xcf\x65\xbd\x92\xdd\x59\x7b\x07\x07\xe0\x91\x7a\xf4\x8b\xbb\x75\xfe\xd4\x13\xd2\x38\xf5\x55\x5a\x7a\x56\x9d\x80\xc3\x41\x4a\x8d\x08\x59\xdc\x65\xa4\x61\x28\xba\xb2\x7a\xf8\x7a\x71\x31\x4f\x31\x8c\x78\x2b\x23\xeb\xfe\x80\x8b\x82\xb0\xce\x26\x40\x1d\x2e\x22\xf0\x4d\x83\xd1\x25\x5d\xc5\x1a\xdd\xd3\xb7\x5a\x2b\x1a\xe0\x78\x45\x04\xdf\x54\x3a\xf8\x96\x9b\xe3\xea\x70\x82\xff\x7f\xc9\x88\x8c\x14\x4d\xa2\xaf\x58\x42\x9e\xc9\x60\x31\xdb\xca\xd3\xda\xd9\xaf\x0d\xcb\xaa\xaf\x26\x8c\xb8\xfc\xff\xea\xd9\x4f\x3c\x7c\xa4\x95\xe0\x56\xa9\xb4\x7a\xcd\xb7\x51\xfb\x73\xe6\x66\xc6\xc6\x55\xad\xe8\x29\x72\x97\xd0\x7a\xd1\xba\x5e\x43\xf1\xbc\xa3\x23\x01\x65\x13\x39\xe2\x29\x04\xcc\x8c\x42\xf5\x8c\x30\xc0\x4a\xaf\xdb\x03\x8d\xda\x08\x47\xdd\x98\x8d\xcd\xa6\xf3\xbf\xd1\x5c\x4b\x4c\x45\x25\x00\x4a\xa0\x6e\xef\xf8\xca\x61\x78\x3a\xac\xec\x57\xfb\x3d\x1f\x92\xb0\xfe\x2f\xd1\xa8\x5f\x67\x24\x51\x7b\x65\xe6\x14\xad\x68\x08\xd6\xf6\xee\x34\xdf\xf7\x31\x0f\xdc\x82\xae\xbf\xd9\x04\xb0\x1e\x1d\xc5\x4b\x29\x27\x09\x4b\x2d\xb6\x8d\x6f\x90\x3b\x68\x40\x1a\xde\xbf\x5a\x7e\x08\xd7\x8f\xf4\xef\x5d\x63\x65\x3a\x65\x04\x0c\xf9\xbf\xd4\xac\xa7\x98\x4a\x74\xd3\x71\x45\x98\x67\x80\xfc\x0b\x16\xac\x45\x16\x49\xde\x61\x88\xa7\xdb\xdf\x19\x1f\x64\xb5\xfc\x5e\x2a\xb4\x7b\x57\xf7\xf7\x27\x6c\xd4\x19\xc1\x7a\x3c\xa8\xe1\xb9\x39\xae\x49\xe4\x88\xac\xba\x6b\x96\x56\x10\xb5\x48\x01\x09\xc8\xb1\x7b\x80\xe1\xb7\xb7\x50\xdf\xc7\x59\x8d\x5d\x50\x11\xfd\x2d\xcc\x56\x00\xa3\x2e\xf5\xb5\x2a\x1e\xcc\x82\x0e\x30\x8a\xa3\x42\x72\x1a\xac\x09\x43\xbf\x66\x86\xb6\x4b\x25\x79\x37\x65\x04\xcc\xc4\x93\xd9\x7e\x6a\xed\x3f\xb0\xf9\xcd\x71\xa4\x3d\xd4\x97\xf0\x1f\x17\xc0\xe2\xcb\x37\x97\xaa\x2a\x2f\x25\x66\x56\x16\x8e\x6c\x49\x6a\xfc\x5f\xb9\x32\x46\xf6\xb1\x11\x63\x98\xa3\x46\xf1\xa6\x41\xf3\xb0\x41\xe9\x89\xf7\x91\x4f\x90\xcc\x2c\x7f\xff\x35\x78\x76\xe5\x06\xb5\x0d\x33\x4b\xa7\x7c\x22\x5b\xc3\x07\xba\x53\x71\x52\xf3\xf1\x61\x0e\x4e\xaf\xe5\x95\xf6\xd9\xd9\x0d\x11\xfa\xa9\x33\xa1\x5e\xf1\x36\x95\x46\x86\x8a\x7f\x3a\x45\xa9\x67\x68\xd4\x0f\xd9\xd0\x34\x12\xc0\x91\xc6\x31\x5c\xf4\xfd\xe7\xcb\x68\x60\x69\x37\x38\x0d\xb2\xea\xaa\x70\x7b\x4c\x41\x85\xc3\x2e\xdd\xcd\xd3\x06\x70\x5e\x4d\xc1\xff\xc8\x72\xee\xee\x47\x5a\x64\xdf\xac\x86\xab\xa4\x1c\x06\x18\x98\x3f\x87\x41\xc5\xef\x68\xd3\xa1\x01\xe8\xa3\xb8\xca\xc6\x0c\x90\x5c\x15\xfc\x91\x08\x40\xb9\x4c\x00\xa0\xb9\xd0"}, +}; + + + +// Test vector according to : "Taming the many EdDSAs" white paper +#define EDGE_CASES_SIZE 12 +static const char edge_cases_signatures[EDGE_CASES_SIZE][3][500]= +{ +{"8c93255d71dcab10e8f379c26200f3c7bd5f09d9bc3068d3ef4edeb4853022b6" , +"c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa", +"c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a0000000000000000000000000000000000000000000000000000000000000000"} , +{"9bd9f44f4dcc75bd531b56b2cd280b0bb38fc1cd6d1230e14861d861de092e79", +"c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa", +"f7badec5b8abeaf699583992219b7b223f1df3fbbea919844e3f7c554a43dd43a5bb704786be79fc476f91d3f3f89b03984d8068dcf1bb7dfc6637b45450ac04"} , +{"aebf3f2601a0c8c5d39cc7d8911642f740b78168218da8471772b35f9d35b9ab", +"f7badec5b8abeaf699583992219b7b223f1df3fbbea919844e3f7c554a43dd43", +"c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa8c4bd45aecaca5b24fb97bc10ac27ac8751a7dfe1baff8b953ec9f5833ca260e"} , +{"9bd9f44f4dcc75bd531b56b2cd280b0bb38fc1cd6d1230e14861d861de092e79", +"cdb267ce40c5cd45306fa5d2f29731459387dbf9eb933b7bd5aed9a765b88d4d", +"9046a64750444938de19f227bb80485e92b83fdb4b6506c160484c016cc1852f87909e14428a7a1d62e9f22f3d3ad7802db02eb2e688b6c52fcd6648a98bd009"} , +{"e47d62c63f830dc7a6851a0b1f33ae4bb2f507fb6cffec4011eaccd55b53f56c" , +"cdb267ce40c5cd45306fa5d2f29731459387dbf9eb933b7bd5aed9a765b88d4d", +"160a1cb0dc9c0258cd0a7d23e94d8fa878bcb1925f2c64246b2dee1796bed5125ec6bc982a269b723e0668e540911a9a6a58921d6925e434ab10aa7940551a09"} , +{"e47d62c63f830dc7a6851a0b1f33ae4bb2f507fb6cffec4011eaccd55b53f56c" , +"cdb267ce40c5cd45306fa5d2f29731459387dbf9eb933b7bd5aed9a765b88d4d", +"21122a84e0b5fca4052f5b1235c80a537878b38f3142356b2c2384ebad4668b7e40bc836dac0f71076f9abe3a53f9c03c1ceeeddb658d0030494ace586687405"} , +{"85e241a07d148b41e47d62c63f830dc7a6851a0b1f33ae4bb2f507fb6cffec40", +"442aad9f089ad9e14647b1ef9099a1ff4798d78589e66f28eca69c11f582a623", +"e96f66be976d82e60150baecff9906684aebb1ef181f67a7189ac78ea23b6c0e547f7690a0e2ddcd04d87dbc3490dc19b3b3052f7ff0538cb68afb369ba3a514"} , +{"85e241a07d148b41e47d62c63f830dc7a6851a0b1f33ae4bb2f507fb6cffec40", +"442aad9f089ad9e14647b1ef9099a1ff4798d78589e66f28eca69c11f582a623", +"8ce5b96c8f26d0ab6c47958c9e68b937104cd36e13c33566acd2fe8d38aa19427e71f98a4734e74f2f13f06f97c20d58cc3f54b8bd0d272f42b695dd7e89a8c22"} , +{"9bedc267423725d473888631ebf45988bad3db83851ee85c85e241a07d148b41", +"f7badec5b8abeaf699583992219b7b223f1df3fbbea919844e3f7c554a43dd43", +"ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03be9678ac102edcd92b0210bb34d7428d12ffc5df5f37e359941266a4e35f0f"} , +{"9bedc267423725d473888631ebf45988bad3db83851ee85c85e241a07d148b41", +"f7badec5b8abeaf699583992219b7b223f1df3fbbea919844e3f7c554a43dd43", +"ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffca8c5b64cd208982aa38d4936621a4775aa233aa0505711d8fdcfdaa943d4908"} , +{"e96b7021eb39c1a163b6da4e3093dcd3f21387da4cc4572be588fafae23c155b", +"ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", +"a9d55260f765261eb9b84e106f665e00b867287a761990d7135963ee0a7d59dca5bb704786be79fc476f91d3f3f89b03984d8068dcf1bb7dfc6637b45450ac04"} , +{"39a591f5321bbe07fd5a23dc2f39d025d74526615746727ceefd6e82ae65c06f", +"ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", +"a9d55260f765261eb9b84e106f665e00b867287a761990d7135963ee0a7d59dca5bb704786be79fc476f91d3f3f89b03984d8068dcf1bb7dfc6637b45450ac04"} +}; + + + +static int test_data_expected_results[SAMPLE_SIZE]; + +static int edge_cases_expected_results[EDGE_CASES_SIZE] = {0,0,1,1,1,1,0,0,0,0,0,0}; + +void check_valid_array(const int* is_valid_array, const int size, const int * expected_result) +{ + for (int i=0; i crypto_sign_BYTES) { + printf("detached signature has an unexpected length: [%u]\n", i); + continue; + } + if (memcmp(test_data[i].sig, sig, crypto_sign_BYTES) != 0) { + printf("detached signature failure: [%u]\n", i); + continue; + } + if (crypto_sign_bv_compatible_verify_detached(sig, + (const unsigned char *)test_data[i].m, + i, test_data[i].pk) != 0) { + printf("detached signature verification failed: [%u]\n", i); + continue; + } + } + printf("%u tests\n", i); + + i--; + + memcpy(sm, test_data[i].m, i); + if (crypto_sign(sm, &smlen, sm, i, skpk) != 0) { + printf("crypto_sign() with overlap failed\n"); + } + if (crypto_sign_open(sm, &mlen, sm, smlen, test_data[i].pk) != 0) { + printf("crypto_sign_open() with overlap failed\n"); + } + if (memcmp(test_data[i].m, sm, (size_t)mlen) != 0) { + printf("crypto_sign_open() with overlap failed (content)\n"); + } + + for (j = 1U; j < 8U; j++) { + sig[63] ^= (j << 5); + if (crypto_sign_bv_compatible_verify_detached(sig, + (const unsigned char *)test_data[i].m, + i, test_data[i].pk) != -1) { + printf("detached signature verification should have failed\n"); + continue; + } + sig[63] ^= (j << 5); + } + +#ifndef ED25519_COMPAT + if (crypto_sign_bv_compatible_verify_detached(sig, + (const unsigned char *)test_data[i].m, + i, non_canonical_p) != -1) { + printf("detached signature verification with non-canonical key should have failed\n"); + } +#endif + memset(pk, 0, sizeof pk); + if (crypto_sign_bv_compatible_verify_detached(sig, + (const unsigned char *)test_data[i].m, + i, pk) != -1) { + printf("detached signature verification should have failed\n"); + } + + memset(sig, 0xff, 32); + sig[0] = 0xdb; + if (crypto_sign_bv_compatible_verify_detached(sig, + (const unsigned char *)test_data[i].m, + i, pk) != -1) { + printf("detached signature verification should have failed\n"); + } + assert(crypto_sign_detached(sig, NULL, + (const unsigned char *)test_data[i].m, i, skpk) == 0); + + sodium_hex2bin(pk, crypto_sign_PUBLICKEYBYTES, + "3eee494fb9eac773144e34b0c755affaf33ea782c0722e5ea8b150e61209ab36", + crypto_sign_PUBLICKEYBYTES * 2, NULL, NULL, NULL); + if (crypto_sign_bv_compatible_verify_detached(sig, + (const unsigned char *)test_data[i].m, + i, pk) != -1) { + printf("signature with an invalid public key should have failed\n"); + } + + sodium_hex2bin(pk, crypto_sign_PUBLICKEYBYTES, + "0200000000000000000000000000000000000000000000000000000000000000", + crypto_sign_PUBLICKEYBYTES * 2, NULL, NULL, NULL); + if (crypto_sign_bv_compatible_verify_detached(sig, + (const unsigned char *)test_data[i].m, + i, pk) != -1) { + printf("signature with an invalid public key should have failed\n"); + } + + sodium_hex2bin(pk, crypto_sign_PUBLICKEYBYTES, + "0500000000000000000000000000000000000000000000000000000000000000", + crypto_sign_PUBLICKEYBYTES * 2, NULL, NULL, NULL); + if (crypto_sign_bv_compatible_verify_detached(sig, + (const unsigned char *)test_data[i].m, + i, pk) != -1) { + printf("signature with an invalid public key should have failed\n"); + } + + if (crypto_sign_seed_keypair(pk, sk, keypair_seed) != 0) { + printf("crypto_sign_seed_keypair() failure\n"); + return -1; + } + crypto_sign_init(&st); + crypto_sign_update(&st, (const unsigned char *)test_data[i].m, i); + crypto_sign_final_create(&st, sig, NULL, sk); + sodium_bin2hex(sig_hex, sizeof sig_hex, sig, sizeof sig); + printf("ed25519ph sig: [%s]\n", sig_hex); + + crypto_sign_init(&st); + crypto_sign_update(&st, (const unsigned char *)test_data[i].m, i); + if (crypto_sign_final_bv_compatible_verify(&st, sig, pk) != 0) { + printf("ed5519ph verification failed\n"); + } + crypto_sign_init(&st); + crypto_sign_update(&st, (const unsigned char *)test_data[i].m, 0); + crypto_sign_update(&st, (const unsigned char *)test_data[i].m, i / 2); + crypto_sign_update(&st, ((const unsigned char *)test_data[i].m) + i / 2, + i - i / 2); + if (crypto_sign_final_bv_compatible_verify(&st, sig, pk) != 0) { + printf("ed5519ph verification failed\n"); + } + sig[0]++; + if (crypto_sign_final_bv_compatible_verify(&st, sig, pk) != -1) { + printf("ed5519ph verification could be forged\n"); + } + sig[0]--; + pk[0]++; + if (crypto_sign_final_bv_compatible_verify(&st, sig, pk) != -1) { + printf("ed5519ph verification could be forged\n"); + } + sodium_hex2bin(sk, crypto_sign_SECRETKEYBYTES, + "833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42", + 2 * crypto_sign_SECRETKEYBYTES / 2, NULL, NULL, NULL); + sodium_hex2bin(pk, crypto_sign_PUBLICKEYBYTES, + "ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf", + 2 * crypto_sign_PUBLICKEYBYTES, NULL, NULL, NULL); + memcpy(sk + crypto_sign_SECRETKEYBYTES - crypto_sign_PUBLICKEYBYTES, + pk, crypto_sign_PUBLICKEYBYTES); + crypto_sign_init(&st); + crypto_sign_update(&st, (const unsigned char *) "abc", 3); + crypto_sign_final_create(&st, sig, &siglen, sk); + if (siglen == 0U || siglen > crypto_sign_BYTES) { + printf("ed25519ph signature has an unexpected length\n"); + } + sodium_bin2hex(sig_hex, sizeof sig_hex, sig, sizeof sig); + printf("ed25519ph tv sig: [%s]\n", sig_hex); + + crypto_sign_init(&st); + crypto_sign_update(&st, (const unsigned char *) "abc", 3); + if (crypto_sign_final_bv_compatible_verify(&st, sig, pk) != 0) { + printf("ed25519ph verification failed\n"); + } + if (crypto_sign_keypair(pk, sk) != 0) { + printf("crypto_sign_keypair() failure\n"); + } + if (crypto_sign_seed_keypair(pk, sk, keypair_seed) != 0) { + printf("crypto_sign_seed_keypair() failure\n"); + return -1; + } + crypto_sign_ed25519_sk_to_seed(extracted_seed, sk); + if (memcmp(extracted_seed, keypair_seed, crypto_sign_ed25519_SEEDBYTES) + != 0) { + printf("crypto_sign_ed25519_sk_to_seed() failure\n"); + } + crypto_sign_ed25519_sk_to_pk(extracted_pk, sk); + if (memcmp(extracted_pk, pk, crypto_sign_ed25519_PUBLICKEYBYTES) != 0) { + printf("crypto_sign_ed25519_sk_to_pk() failure\n"); + } + sodium_bin2hex(pk_hex, sizeof pk_hex, pk, sizeof pk); + sodium_bin2hex(sk_hex, sizeof sk_hex, sk, sizeof sk); + + printf("pk: [%s]\n", pk_hex); + printf("sk: [%s]\n", sk_hex); + + assert(crypto_sign_bytes() > 0U); + assert(crypto_sign_seedbytes() > 0U); + assert(crypto_sign_publickeybytes() > 0U); + assert(crypto_sign_secretkeybytes() > 0U); + assert(crypto_sign_messagebytes_max() > 0U); + assert(strcmp(crypto_sign_primitive(), "ed25519") == 0); + assert(crypto_sign_bytes() == crypto_sign_ed25519_bytes()); + assert(crypto_sign_seedbytes() == crypto_sign_ed25519_seedbytes()); + assert(crypto_sign_messagebytes_max() == crypto_sign_ed25519_messagebytes_max()); + assert(crypto_sign_publickeybytes() + == crypto_sign_ed25519_publickeybytes()); + assert(crypto_sign_secretkeybytes() + == crypto_sign_ed25519_secretkeybytes()); + assert(crypto_sign_statebytes() == crypto_sign_ed25519ph_statebytes()); + +#ifdef ED25519_NONDETERMINISTIC + exit(0); +#endif + + test_inputs(); + test_edge_cases(); + return 0; +} diff --git a/crypto/libsodium-fork/test/default/sign_bv_compat.exp b/crypto/libsodium-fork/test/default/sign_bv_compat.exp new file mode 100644 index 0000000000..549aa08146 --- /dev/null +++ b/crypto/libsodium-fork/test/default/sign_bv_compat.exp @@ -0,0 +1,17 @@ +1024 tests +ed25519ph sig: [10c5411e40bd10170fb890d4dfdb6d338c8cb11d2764a216ee54df10977dcdefd8ff755b1eeb3f16fce80e40e7aafc99083dbff43d5031baf04157b48423960d] +ed25519ph tv sig: [98a70222f0b8121aa9d30f813d683f809e462b469c7ff87639499bb94e6dae4131f85042463c2a355a2003d062adf5aaa10b8c61e636062aaad11c2a26083406] +pk: [b5076a8474a832daee4dd5b4040983b6623b5f344aca57d4d6ee4baf3f259e6e] +sk: [421151a459faeade3d247115f94aedae42318124095afabe4d1451a559faedeeb5076a8474a832daee4dd5b4040983b6623b5f344aca57d4d6ee4baf3f259e6e] +---- testing: non canonical public key - all should be rejected +success +---- testing: non canonical public key greater than field element - all should be rejected +success +---- testing: non canonical R - all should be rejected +success +---- testing: non canonical greater than field element R - all should be rejected +success +---- testing: white paper edge cases + expecting the following result: +-1 |-1 |0 |0 |0 |0 |-1 |-1 |-1 |-1 |-1 |-1 | +success diff --git a/crypto/memcpy_chk_windows.c b/crypto/memcpy_chk_windows.c index 68302263e4..f14eee0fe0 100644 --- a/crypto/memcpy_chk_windows.c +++ b/crypto/memcpy_chk_windows.c @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/crypto/merklearray/array.go b/crypto/merklearray/array.go index b8e281a8ec..6b783d8601 100644 --- a/crypto/merklearray/array.go +++ b/crypto/merklearray/array.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -16,14 +16,19 @@ package merklearray -import ( - "github.com/algorand/go-algorand/crypto" -) +import "github.com/algorand/go-algorand/crypto" // An Array represents a dense array of leaf elements that are -// combined into a Merkle tree. The GetHash method returns the -// hash of a particular element in the array. +// combined into a Merkle tree. The Marshal method returns a byte slice that represents the object +// that the Tree will use to hash the leaves. + +// An Array is an interface that is being using when creating Merkle trees. +// It represents a dense array of n (n is given by the Length() method) elements, +// and returns a hash representation for each leaf (in the range) type Array interface { + // Length returns number of elements in the array. Length() uint64 - GetHash(pos uint64) (crypto.Digest, error) + + // Marshal Returns a hash representation of the element located in position pos + Marshal(pos uint64) (crypto.Hashable, error) } diff --git a/crypto/merklearray/layer.go b/crypto/merklearray/layer.go index 614516e854..b1a9281fc0 100644 --- a/crypto/merklearray/layer.go +++ b/crypto/merklearray/layer.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -17,39 +17,38 @@ package merklearray import ( + "hash" + "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/protocol" ) -// A layer of the Merkle tree consists of a dense array of hashes at that +// A Layer of the Merkle tree consists of a dense array of hashes at that // level of the tree. Hashes beyond the end of the array (e.g., if the // number of leaves is not an exact power of 2) are implicitly zero. -type layer []crypto.Digest +//msgp:allocbound Layer MaxNumLeavesOnEncodedTree +type Layer []crypto.GenericDigest // A pair represents an internal node in the Merkle tree. type pair struct { - l crypto.Digest - r crypto.Digest + l crypto.GenericDigest + r crypto.GenericDigest + hashDigestSize int } func (p *pair) ToBeHashed() (protocol.HashID, []byte) { - var buf [2 * crypto.DigestSize]byte - copy(buf[:crypto.DigestSize], p.l[:]) - copy(buf[crypto.DigestSize:], p.r[:]) + // hashing of internal node will always be fixed length. + // If one of the children is missing we use [0...0]. + // The size of the slice is based on the relevant hash function output size + buf := make([]byte, 2*p.hashDigestSize) + copy(buf[:], p.l[:]) + copy(buf[len(p.l):], p.r[:]) return protocol.MerkleArrayNode, buf[:] } -// Hash implements an optimized version of crypto.HashObj(p). -func (p *pair) Hash() crypto.Digest { - var buf [len(protocol.MerkleArrayNode) + 2*crypto.DigestSize]byte - s := buf[:0] - s = append(s, protocol.MerkleArrayNode...) - s = append(s, p.l[:]...) - s = append(s, p.r[:]...) - return crypto.Hash(s) -} +func upWorker(ws *workerState, in Layer, out Layer, h hash.Hash) { + defer ws.wg.Done() -func upWorker(ws *workerState, in layer, out layer) { ws.started() batchSize := uint64(2) @@ -61,31 +60,17 @@ func upWorker(ws *workerState, in layer, out layer) { for i := off; i < off+batchSize && i < ws.maxidx; i += 2 { var p pair + // we set the output size of the relevant hash function to the pair struct. + // This will allow us to allocate the hash input buffer for the internal node + p.hashDigestSize = h.Size() p.l = in[i] if i+1 < ws.maxidx { p.r = in[i+1] } - out[i/2] = p.Hash() + + out[i/2] = crypto.GenericHashObj(h, &p) } batchSize += 2 } - - ws.done() -} - -// up takes a layer representing some level in the tree, -// and returns the next-higher level in the tree, -// represented as a layer. -func (l layer) up() layer { - n := len(l) - res := make(layer, (uint64(n)+1)/2) - - ws := newWorkerState(uint64(n)) - for ws.nextWorker() { - go upWorker(ws, l, res) - } - ws.wait() - - return res } diff --git a/crypto/merklearray/merkle.go b/crypto/merklearray/merkle.go index 06be1bdac0..4855a4c825 100644 --- a/crypto/merklearray/merkle.go +++ b/crypto/merklearray/merkle.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -17,63 +17,122 @@ package merklearray import ( + "bytes" + "errors" "fmt" + "hash" "sort" "github.com/algorand/go-algorand/crypto" ) +const ( + // MaxEncodedTreeDepth is the maximum tree depth (root only depth 0) for a tree which + // is being encoded (either by msbpack or by the fixed length encoding) + MaxEncodedTreeDepth = 16 + + // MaxNumLeavesOnEncodedTree is the maximum number of leaves allowed for a tree which + // is being encoded (either by msbpack or by the fixed length encoding) + MaxNumLeavesOnEncodedTree = 1 << MaxEncodedTreeDepth +) + +// Merkle tree errors +var ( + ErrRootMismatch = errors.New("root mismatch") + ErrProvingZeroCommitment = errors.New("proving in zero-length commitment") + ErrProofIsNil = errors.New("proof should not be nil") + ErrNonEmptyProofForEmptyElements = errors.New("non-empty proof for empty set of elements") + ErrUnexpectedTreeDepth = errors.New("unexpected tree depth") + ErrPosOutOfBound = errors.New("pos out of bound") +) + // Tree is a Merkle tree, represented by layers of nodes (hashes) in the tree // at each height. type Tree struct { - // Level 0 is the leaves. - levels []layer + _struct struct{} `codec:",omitempty,omitemptyarray"` + + // Levels represents the tree in layers. layer[0] contains the leaves. + Levels []Layer `codec:"lvls,allocbound=MaxEncodedTreeDepth+1"` + + // NumOfElements represents the number of the elements in the array which the tree is built on. + // notice that the number of leaves might be larger in case of a vector commitment + // In addition, the code will not generate proofs on indexes larger than NumOfElements. + NumOfElements uint64 `codec:"nl"` + + // Hash represents the hash function which is being used on elements in this tree. + Hash crypto.HashFactory `codec:"hsh"` + + // IsVectorCommitment determines whether the tree was built as a vector commitment + IsVectorCommitment bool `codec:"vc"` } -func (tree *Tree) topLayer() layer { - return tree.levels[len(tree.levels)-1] +func (tree *Tree) topLayer() Layer { + return tree.Levels[len(tree.Levels)-1] } -func buildWorker(ws *workerState, array Array, leaves layer, errs chan error) { +type errorChannel chan error + +func (ch errorChannel) nonBlockingSend(e error) { + select { + case ch <- e: + default: + } +} + +func buildWorker(ws *workerState, array Array, leaves Layer, h crypto.HashFactory, errs errorChannel) { + defer ws.wg.Done() + ws.started() batchSize := uint64(1) + hash := h.NewHash() for { off := ws.next(batchSize) if off >= ws.maxidx { - goto done + return } for i := off; i < off+batchSize && i < ws.maxidx; i++ { - hash, err := array.GetHash(i) + m, err := array.Marshal(i) if err != nil { - select { - case errs <- err: - default: - } - - goto done + errs.nonBlockingSend(err) + return } - - leaves[i] = hash + leaves[i] = crypto.GenericHashObj(hash, m) } batchSize++ } +} -done: - ws.done() +// BuildVectorCommitmentTree constructs a Merkle tree given an array. +// the tree returned from this function can function as a vector commitment which has position binding property. +// (having a position binding means that an adversary can not create a commitment and open +// its entry i = 1 in two different ways, using proofs of different ‘depths.’) +// +// In addition, the tree will also extend the array to have a length of 2^X leaves. +// i.e we always create a full tree +func BuildVectorCommitmentTree(array Array, factory crypto.HashFactory) (*Tree, error) { + t, err := Build(generateVectorCommitmentArray(array), factory) + if err != nil { + return nil, err + } + t.IsVectorCommitment = true + t.NumOfElements = array.Length() + return t, nil } -// Build constructs a Merkle tree given an array. -func Build(array Array) (*Tree, error) { +// Build constructs a Merkle tree given an array. The tree can be used to generate +// proofs of membership on element. If a proof of position is require, a Vector Commitments +// is required +func Build(array Array, factory crypto.HashFactory) (*Tree, error) { arraylen := array.Length() - leaves := make(layer, arraylen) + leaves := make(Layer, arraylen) errs := make(chan error, 1) ws := newWorkerState(arraylen) for ws.nextWorker() { - go buildWorker(ws, array, leaves, errs) + go buildWorker(ws, array, leaves, factory, errs) } ws.wait() @@ -83,52 +142,94 @@ func Build(array Array) (*Tree, error) { default: } - tree := &Tree{} - - if arraylen > 0 { - tree.levels = []layer{leaves} - - for len(tree.topLayer()) > 1 { - tree.levels = append(tree.levels, tree.topLayer().up()) - } + tree := &Tree{ + Levels: nil, + NumOfElements: array.Length(), + Hash: factory, + IsVectorCommitment: false, } + tree.buildLayers(leaves) return tree, nil } +func (tree *Tree) buildLayers(leaves Layer) { + if len(leaves) == 0 { + return + } + tree.Levels = []Layer{leaves} + for len(tree.topLayer()) > 1 { + tree.buildNextLayer() + } +} + // Root returns the root hash of the tree. -func (tree *Tree) Root() crypto.Digest { +// In case the tree is empty, the return value is an empty GenericDigest. +func (tree *Tree) Root() crypto.GenericDigest { // Special case: commitment to zero-length array - if len(tree.levels) == 0 { - var zero crypto.Digest - return zero + if len(tree.Levels) == 0 { + return crypto.GenericDigest{} } return tree.topLayer()[0] } +// TODO: change into something global and more configurable const validateProof = false +// ProveSingleLeaf constructs a proof for a leaf in a specific position in the array that was +// used to construct the tree. +func (tree *Tree) ProveSingleLeaf(idx uint64) (*SingleLeafProof, error) { + proof, err := tree.Prove([]uint64{idx}) + if err != nil { + return nil, err + } + return &SingleLeafProof{Proof: *proof}, err +} + // Prove constructs a proof for some set of positions in the array that was // used to construct the tree. -func (tree *Tree) Prove(idxs []uint64) ([]crypto.Digest, error) { +// +// this function defines the following behavior: +// Tree is empty AND idxs list is empty results with an empty proof +// Tree is not empty AND idxs list is empty results with an empty proof +// Tree is empty AND idxs list not is empty results with an error +// Tree is not empty AND idxs list is not empty results with a proof +func (tree *Tree) Prove(idxs []uint64) (*Proof, error) { + // Special case: empty proof when trying to prove on 0 elements (nothing) if len(idxs) == 0 { - return nil, nil + return tree.createEmptyProof() } - // Special case: commitment to zero-length array - if len(tree.levels) == 0 { - return nil, fmt.Errorf("proving in zero-length commitment") + // Special case: error when trying to prove on elements when the tree is empty + // (i.e no elements in the underlying array) + if tree.NumOfElements == 0 { + return nil, ErrProvingZeroCommitment + } + + // verify that all positions where part of the original array + for i := 0; i < len(idxs); i++ { + if idxs[i] >= tree.NumOfElements { + return nil, fmt.Errorf("idxs[i] %d >= tree.NumOfElements %d: %w", idxs[i], tree.NumOfElements, ErrPosOutOfBound) + } + } + + if tree.IsVectorCommitment { + VcIdxs, err := tree.convertLeavesIndexes(idxs) + if err != nil { + return nil, err + } + idxs = VcIdxs } sort.Slice(idxs, func(i, j int) bool { return idxs[i] < idxs[j] }) + return tree.createProof(idxs) +} + +func (tree *Tree) createProof(idxs []uint64) (*Proof, error) { pl := make(partialLayer, 0, len(idxs)) for _, pos := range idxs { - if pos >= uint64(len(tree.levels[0])) { - return nil, fmt.Errorf("pos %d larger than leaf count %d", pos, len(tree.levels[0])) - } - // Discard duplicates if len(pl) > 0 && pl[len(pl)-1].pos == pos { continue @@ -136,17 +237,18 @@ func (tree *Tree) Prove(idxs []uint64) ([]crypto.Digest, error) { pl = append(pl, layerItem{ pos: pos, - hash: tree.levels[0][pos], + hash: tree.Levels[0][pos], }) } s := &siblings{ tree: tree, } + hs := tree.Hash.NewHash() - for l := uint64(0); l < uint64(len(tree.levels)-1); l++ { + for l := uint64(0); l < uint64(len(tree.Levels)-1); l++ { var err error - pl, err = pl.up(s, l, validateProof) + pl, err = pl.up(s, l, validateProof, hs) if err != nil { return nil, err } @@ -154,61 +256,155 @@ func (tree *Tree) Prove(idxs []uint64) ([]crypto.Digest, error) { // Confirm that we got the same root hash if len(pl) != 1 { - return nil, fmt.Errorf("internal error: partial layer produced %d hashes", len(pl)) + return nil, fmt.Errorf("internal error: partial Layer produced %d hashes", len(pl)) } if validateProof { - computedroot := pl[0] - if computedroot.pos != 0 || computedroot.hash != tree.topLayer()[0] { - return nil, fmt.Errorf("internal error: root mismatch during proof") + if err := inspectRoot(tree.topLayer()[0], pl); err != nil { + return nil, err } } - return s.hints, nil + return &Proof{ + Path: s.hints, + HashFactory: tree.Hash, + TreeDepth: uint8(len(tree.Levels) - 1), + }, nil +} + +func (tree *Tree) convertLeavesIndexes(idxs []uint64) ([]uint64, error) { + vcIdxs := make([]uint64, len(idxs)) + for i := 0; i < len(idxs); i++ { + idx, err := merkleTreeToVectorCommitmentIndex(idxs[i], uint8(len(tree.Levels)-1)) + if err != nil { + return nil, err + } + vcIdxs[i] = idx + } + return vcIdxs, nil +} + +func (tree *Tree) createEmptyProof() (*Proof, error) { + treeDepth := uint8(0) + if len(tree.Levels) != 0 { + treeDepth = uint8(len(tree.Levels)) - 1 + } + return &Proof{ + HashFactory: tree.Hash, + TreeDepth: treeDepth, + }, nil +} + +func (tree *Tree) buildNextLayer() { + l := tree.topLayer() + n := len(l) + newLayer := make(Layer, (uint64(n)+1)/2) + + ws := newWorkerState(uint64(n)) + for ws.nextWorker() { + go upWorker(ws, l, newLayer, tree.Hash.NewHash()) + } + ws.wait() + tree.Levels = append(tree.Levels, newLayer) +} + +// VerifyVectorCommitment verifies a vector commitment proof against a given root. +func VerifyVectorCommitment(root crypto.GenericDigest, elems map[uint64]crypto.Hashable, proof *Proof) error { + if proof == nil { + return ErrProofIsNil + } + + msbIndexedElements, err := convertIndexes(elems, proof.TreeDepth) + if err != nil { + return err + } + + return Verify(root, msbIndexedElements, proof) } // Verify ensures that the positions in elems correspond to the respective hashes // in a tree with the given root hash. The proof is expected to be the proof // returned by Prove(). -func Verify(root crypto.Digest, elems map[uint64]crypto.Digest, proof []crypto.Digest) error { +func Verify(root crypto.GenericDigest, elems map[uint64]crypto.Hashable, proof *Proof) error { + if proof == nil { + return ErrProofIsNil + } + if len(elems) == 0 { - if len(proof) != 0 { - return fmt.Errorf("non-empty proof for empty set of elements") + if len(proof.Path) != 0 { + return ErrNonEmptyProofForEmptyElements } - return nil } - pl := make(partialLayer, 0, len(elems)) - for pos, elem := range elems { - pl = append(pl, layerItem{ - pos: pos, - hash: elem, - }) + hashedLeaves, err := hashLeaves(elems, proof.TreeDepth, proof.HashFactory.NewHash()) + if err != nil { + return err } - sort.Slice(pl, func(i, j int) bool { return pl[i].pos < pl[j].pos }) + pl := buildFirstPartialLayer(hashedLeaves) + return verifyPath(root, proof, pl) +} + +func verifyPath(root crypto.GenericDigest, proof *Proof, pl partialLayer) error { + hints := proof.Path s := &siblings{ - hints: proof, + hints: hints, } + hsh := proof.HashFactory.NewHash() + var err error for l := uint64(0); len(s.hints) > 0 || len(pl) > 1; l++ { - var err error - pl, err = pl.up(s, l, true) - if err != nil { + if pl, err = pl.up(s, l, true, hsh); err != nil { return err } + } + + return inspectRoot(root, pl) +} - if l > 64 { - return fmt.Errorf("Verify exceeded 64 levels, more than 2^64 leaves not supported") +func hashLeaves(elems map[uint64]crypto.Hashable, treeDepth uint8, hash hash.Hash) (map[uint64]crypto.GenericDigest, error) { + hashedLeaves := make(map[uint64]crypto.GenericDigest, len(elems)) + for i, element := range elems { + if i >= (1 << treeDepth) { + return nil, fmt.Errorf("pos %d >= 1^treeDepth %d: %w", i, 1<= uint64(len(a)) { - return crypto.Digest{}, fmt.Errorf("pos %d larger than length %d", pos, len(a)) + return nil, fmt.Errorf("pos %d larger than length %d", pos, len(a)) } - return crypto.HashObj(a[pos]), nil + return a[pos], nil } type TestRepeatingArray struct { @@ -66,109 +75,996 @@ func (a TestRepeatingArray) Length() uint64 { return a.count } -func (a TestRepeatingArray) GetHash(pos uint64) (crypto.Digest, error) { +func (a TestRepeatingArray) Marshal(pos uint64) (crypto.Hashable, error) { if pos >= a.count { - return crypto.Digest{}, fmt.Errorf("pos %d larger than length %d", pos, a.count) + return nil, fmt.Errorf("pos %d larger than length %d", pos, a.count) } - return crypto.HashObj(a.item), nil + return a.item, nil } func TestMerkle(t *testing.T) { partitiontest.PartitionTest(t) + increment := uint64(1) + // with -race this will take a very long time + // run a shorter version for Short testing + if testing.Short() { + increment = uint64(16) + } + + for i := uint64(1); i < 1024; i = i + increment { + t.Run(fmt.Sprintf("hash#%s/Size#%d", crypto.Sha512_256.String(), i), func(t *testing.T) { + testMerkle(t, crypto.Sha512_256, i) + }) + } + + if !testing.Short() { + for i := uint64(1); i < 10; i++ { + t.Run(fmt.Sprintf("hash#%s/Size#%d", crypto.Sumhash.String(), i), func(t *testing.T) { + testMerkle(t, crypto.Sumhash, i) + }) + } + } else { + t.Run(fmt.Sprintf("hash#%s/Size#%d", crypto.Sha512_256.String(), 10), func(t *testing.T) { + testMerkle(t, crypto.Sumhash, 10) + }) + + } +} + +func testMerkle(t *testing.T, hashtype crypto.HashType, size uint64) { var junk TestData crypto.RandBytes(junk[:]) - for sz := uint64(0); sz < 1024; sz++ { - a := make(TestArray, sz) - for i := uint64(0); i < sz; i++ { - crypto.RandBytes(a[i][:]) - } + a := make(TestArray, size) + for i := uint64(0); i < size; i++ { + crypto.RandBytes(a[i][:]) + } - tree, err := Build(a) - if err != nil { - t.Error(err) - } + tree, err := Build(a, crypto.HashFactory{HashType: hashtype}) + require.NoError(t, err) - root := tree.Root() + root := tree.Root() - var allpos []uint64 - allmap := make(map[uint64]crypto.Digest) + var allpos []uint64 + allmap := make(map[uint64]crypto.Hashable) - for i := uint64(0); i < sz; i++ { - proof, err := tree.Prove([]uint64{i}) - if err != nil { - t.Error(err) - } + for i := uint64(0); i < size; i++ { + proof, err := tree.Prove([]uint64{i}) + require.NoError(t, err) - err = Verify(root, map[uint64]crypto.Digest{i: crypto.HashObj(a[i])}, proof) - if err != nil { - t.Error(err) - } + err = Verify(root, map[uint64]crypto.Hashable{i: a[i]}, proof) + require.NoError(t, err) - err = Verify(root, map[uint64]crypto.Digest{i: crypto.HashObj(junk)}, proof) - if err == nil { - t.Errorf("no error when verifying junk") - } + err = Verify(root, map[uint64]crypto.Hashable{i: junk}, proof) + require.ErrorIs(t, err, ErrRootMismatch) - allpos = append(allpos, i) - allmap[i] = crypto.HashObj(a[i]) - } + allpos = append(allpos, i) + allmap[i] = a[i] + } - proof, err := tree.Prove(allpos) - if err != nil { - t.Error(err) - } + proof, err := tree.Prove(allpos) + require.NoError(t, err) - err = Verify(root, allmap, proof) - if err != nil { - t.Error(err) + err = Verify(root, allmap, proof) + require.NoError(t, err) + + err = Verify(root, map[uint64]crypto.Hashable{0: junk}, proof) + require.ErrorIs(t, err, ErrRootMismatch) + + var somepos []uint64 + somemap := make(map[uint64]crypto.Hashable) + for i := 0; i < 10; i++ { + pos := crypto.RandUint64() % size + somepos = append(somepos, pos) + somemap[pos] = a[pos] + } + + proof, err = tree.Prove(somepos) + require.NoError(t, err) + + err = Verify(root, somemap, proof) + require.NoError(t, err) +} + +type nonmarshalable []int + +func (n nonmarshalable) Length() uint64 { + return uint64(len(n)) +} + +func (n nonmarshalable) Marshal(pos uint64) (crypto.Hashable, error) { + return nil, fmt.Errorf("can't be marshaled") +} + +func TestErrorInMarshal(t *testing.T) { + partitiontest.PartitionTest(t) + + a := nonmarshalable{1} + _, err := Build(&a, crypto.HashFactory{}) + require.Error(t, err) +} + +func TestMerkleBuildEdgeCases(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + arr := make(TestArray, 0) + tree, err := Build(arr, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + a.Len(tree.Levels, 0) + a.Equal(tree.NumOfElements, uint64(0)) + + root := tree.Root() + + a.Equal(root, crypto.GenericDigest([]byte{})) +} + +func TestMerkleVCBuildEdgeCases(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + h := crypto.HashFactory{HashType: crypto.Sha512_256}.NewHash() + h.Reset() + h.Write([]byte(protocol.MerkleVectorCommitmentBottomLeaf)) + root2 := h.Sum(nil) + + arr := make(TestArray, 0) + tree, err := BuildVectorCommitmentTree(arr, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + a.Len(tree.Levels, 1) + a.Equal(tree.NumOfElements, uint64(0)) + + rootHash := tree.Root() + require.Equal(t, []byte(rootHash), root2) +} + +func TestMerkleProveEdgeCases(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + arr := make(TestArray, 4) + for i := uint64(0); i < 4; i++ { + crypto.RandBytes(arr[i][:]) + } + + tree, err := Build(arr, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + + _, err = tree.Prove([]uint64{4}) + a.Error(err) + require.ErrorIs(t, err, ErrPosOutOfBound) + + // prove on nothing + proof, err := tree.Prove(nil) + a.NoError(err) + a.Equal(proof.Path, []crypto.GenericDigest(nil)) + a.Equal(proof.TreeDepth, uint8(2)) + + arr = make(TestArray, 0) + tree, err = Build(arr, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + + _, err = tree.Prove([]uint64{0}) + a.Error(err) + require.ErrorIs(t, err, ErrProvingZeroCommitment) + + // prove on nothing - now the tree is empty as well + proof, err = tree.Prove(nil) + a.NoError(err) + a.Equal(proof.Path, []crypto.GenericDigest(nil)) + a.Equal(proof.TreeDepth, uint8(0)) +} + +func TestMerkleVCProveEdgeCases(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + arr := make(TestArray, 5) + for i := uint64(0); i < 5; i++ { + crypto.RandBytes(arr[i][:]) + } + tree, err := BuildVectorCommitmentTree(arr, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + + // element in the out of the inner array + _, err = tree.Prove([]uint64{5}) + a.Error(err) + require.ErrorIs(t, err, ErrPosOutOfBound) + + // element in the padded array - bottom leaf + _, err = tree.Prove([]uint64{8}) + a.Error(err) + require.ErrorIs(t, err, ErrPosOutOfBound) + + // prove on nothing + proof, err := tree.Prove(nil) + a.NoError(err) + a.Equal(proof.Path, []crypto.GenericDigest(nil)) + a.Equal(proof.TreeDepth, uint8(3)) + + arr = make(TestArray, 0) + tree, err = BuildVectorCommitmentTree(arr, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + + _, err = tree.Prove([]uint64{0}) + a.Error(err) + require.ErrorIs(t, err, ErrProvingZeroCommitment) + + // prove on nothing - now the tree is empty as well + proof, err = tree.Prove(nil) + a.NoError(err) + a.Equal(proof.Path, []crypto.GenericDigest(nil)) + a.Equal(proof.TreeDepth, uint8(0)) +} + +func TestMerkleVerifyEdgeCases(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + arr := make(TestArray, 4) + for i := uint64(0); i < 4; i++ { + crypto.RandBytes(arr[i][:]) + } + tree, err := Build(arr, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + + proof, err := tree.Prove([]uint64{3}) + a.NoError(err) + + root := tree.Root() + + err = Verify(root, map[uint64]crypto.Hashable{4: arr[3]}, proof) + a.Error(err) + require.ErrorIs(t, err, ErrPosOutOfBound) + + err = Verify(root, map[uint64]crypto.Hashable{3: arr[3], 4: arr[3]}, proof) + a.Error(err) + require.ErrorIs(t, err, ErrPosOutOfBound) + + err = Verify(root, nil, nil) + a.Error(err) + a.ErrorIs(ErrProofIsNil, err) + + trivialProof := Proof{TreeDepth: 2, HashFactory: crypto.HashFactory{HashType: crypto.Sha512_256}} + err = Verify(root, nil, &trivialProof) + a.NoError(err) + + err = Verify(root, nil, proof) + a.Error(err) + a.ErrorIs(ErrNonEmptyProofForEmptyElements, err) + + err = Verify(root, nil, &trivialProof) + a.NoError(err) + + arr = make(TestArray, 1) + for i := uint64(0); i < 1; i++ { + crypto.RandBytes(arr[i][:]) + } + + tree, err = Build(arr, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + proof, err = tree.Prove([]uint64{0}) + a.NoError(err) + a.Equal(trivialProof.Path, []crypto.GenericDigest(nil)) + err = Verify(tree.Root(), map[uint64]crypto.Hashable{0: arr[0]}, proof) + a.NoError(err) +} + +func TestProveDuplicateLeaves(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + arr := make(TestArray, 4) + for i := uint64(0); i < 4; i++ { + crypto.RandBytes(arr[i][:]) + } + tree, err := Build(arr, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + + proof, err := tree.Prove([]uint64{3, 3}) + a.NoError(err) + + root := tree.Root() + + err = Verify(root, map[uint64]crypto.Hashable{3: arr[3]}, proof) + a.NoError(err) + + tree, err = BuildVectorCommitmentTree(arr, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + + proof, err = tree.Prove([]uint64{3, 3}) + a.NoError(err) + + root = tree.Root() + + err = VerifyVectorCommitment(root, map[uint64]crypto.Hashable{3: arr[3]}, proof) + a.NoError(err) +} + +func TestMerkleVCVerifyEdgeCases(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + arr := make(TestArray, 4) + for i := uint64(0); i < 4; i++ { + crypto.RandBytes(arr[i][:]) + } + tree, err := BuildVectorCommitmentTree(arr, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + + proof, err := tree.Prove([]uint64{3}) + a.NoError(err) + + root := tree.Root() + + err = VerifyVectorCommitment(root, map[uint64]crypto.Hashable{4: arr[3]}, proof) + a.Error(err) + require.ErrorIs(t, err, ErrPosOutOfBound) + + err = VerifyVectorCommitment(root, map[uint64]crypto.Hashable{3: arr[3], 4: arr[3]}, proof) + a.Error(err) + require.ErrorIs(t, err, ErrPosOutOfBound) + + err = VerifyVectorCommitment(root, nil, nil) + a.Error(err) + a.ErrorIs(ErrProofIsNil, err) + + trivialProof := Proof{TreeDepth: 2, HashFactory: crypto.HashFactory{HashType: crypto.Sha512_256}} + err = VerifyVectorCommitment(root, nil, &trivialProof) + a.NoError(err) + + err = VerifyVectorCommitment(root, nil, proof) + a.Error(err) + a.ErrorIs(ErrNonEmptyProofForEmptyElements, err) + + err = VerifyVectorCommitment(root, nil, &trivialProof) + a.NoError(err) + + arr = make(TestArray, 1) + for i := uint64(0); i < 1; i++ { + crypto.RandBytes(arr[i][:]) + } + + tree, err = Build(arr, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + proof, err = tree.Prove([]uint64{0}) + a.NoError(err) + a.Equal(trivialProof.Path, []crypto.GenericDigest(nil)) + err = VerifyVectorCommitment(tree.Root(), map[uint64]crypto.Hashable{0: arr[0]}, proof) + a.NoError(err) +} + +// TestGenericDigest makes sure GenericDigest will not decoded sizes +// greater than the max allowd. +func TestGenericDigest(t *testing.T) { + partitiontest.PartitionTest(t) + + err := testWithSize(t, crypto.MaxHashDigestSize) + require.NoError(t, err) + + err = testWithSize(t, crypto.MaxHashDigestSize+1) + require.Error(t, err) +} + +func testWithSize(t *testing.T, size int) error { + gd := make(crypto.GenericDigest, size) + gd[8] = 88 + + var wgd Proof + wgd.Path = make([]crypto.GenericDigest, 1000) + wgd.Path[0] = gd + + bytes := protocol.Encode(&wgd) + + var out Proof + err := protocol.Decode(bytes, &out) + + if err == nil { + require.Equal(t, wgd, out) + } + return err +} + +func TestSizeLimitsMerkle(t *testing.T) { + partitiontest.PartitionTest(t) + + // The next operations are heavy on the memory. + // Garbage collection helps prevent trashing + runtime.GC() + + increment := uint64(1) + // with -race this will take a very long time + // run a shorter version for Short testing + if testing.Short() { + increment = 8 + } + for depth := uint64(0); depth < uint64(18); depth = depth + increment { + size := uint64(1) << depth + + // eltCoefficient is the coefficent to determine how many elements are in the proof. + // There will be 1/eltCoefficient elements of all possible element (2^treeDepth) + // numElts = 2^(depth-eltCoefficient) + + // When the positions are regularly positioned then, the number of paths will be maximum, bounded by: + // 2^(depth-eltCoefficient)*eltCoefficient + + // regular spaced elets + for eltCoefficient := uint64(0); eltCoefficient <= depth; { + t.Run(fmt.Sprintf("regular-elemetns/Depth#%d/Coefficient#%d", depth, eltCoefficient), func(t *testing.T) { + numElts := uint64(1) << (depth - eltCoefficient) + positions := getRegularPositions(numElts, uint64(1)< MaxEncodedTreeDepth && (eltCoefficient == 1 || eltCoefficient == 2) { + errmsg := fmt.Sprintf("%d > %d at Path", len(proof.Path), MaxNumLeavesOnEncodedTree/2) + require.Contains(t, err.Error(), errmsg) + } else { + require.NoError(t, err) + require.Equal(t, *proof, outProof) + } + + bytes = protocol.Encode(tree) + var outTree Tree + err = protocol.Decode(bytes, &outTree) + if depth > MaxEncodedTreeDepth { + require.Contains(t, err.Error(), "> 17 at Levels") + } else { + require.NoError(t, err) + require.Equal(t, *tree, outTree) + } + + if eltCoefficient == 0 { + eltCoefficient = 1 + } else { + eltCoefficient = eltCoefficient << increment + } + }) } - err = Verify(root, map[uint64]crypto.Digest{0: crypto.HashObj(junk)}, proof) - if err == nil { - t.Errorf("no error when verifying junk batch") + // randomly positioned elts + for eltCoefficient := uint64(1); eltCoefficient <= depth; eltCoefficient = eltCoefficient << increment { + t.Run(fmt.Sprintf("random-elemetns/Depth#%d/Coefficient#%d", depth, eltCoefficient), func(t *testing.T) { + numElts := uint64(1) << (depth - eltCoefficient) + positions := getRandomPositions(numElts, numElts) + + _, proof := testMerkelSizeLimits(t, crypto.Sha512_256, size, positions) + require.GreaterOrEqual(t, (uint64(1)<<(depth-eltCoefficient))*eltCoefficient, uint64(len(proof.Path))) + + if len(proof.Path) > MaxNumLeavesOnEncodedTree { + // encode/decode + bytes := protocol.Encode(proof) + var outProof Proof + err := protocol.Decode(bytes, &outProof) + errmsg := fmt.Sprintf("%d > %d at Path", len(proof.Path), MaxNumLeavesOnEncodedTree) + require.Contains(t, err.Error(), errmsg) + } + + }) } + } + + // case of a tree with leaves 2^16 + 1 + size := (uint64(1) << MaxEncodedTreeDepth) + 1 + tree, _ := testMerkelSizeLimits(t, crypto.Sha512_256, size, []uint64{}) + bytes := protocol.Encode(tree) + var outTree Tree + err := protocol.Decode(bytes, &outTree) + require.Contains(t, err.Error(), "> 17 at Levels") + + // Garbage collection helps prevent trashing + // for next tests + runtime.GC() +} + +func testMerkelSizeLimits(t *testing.T, hashtype crypto.HashType, size uint64, positions []uint64) (*Tree, *Proof) { + a := make(TestArray, size) + for i := uint64(0); i < size; i++ { + crypto.RandBytes(a[i][:]) + } + + tree, err := Build(a, crypto.HashFactory{HashType: hashtype}) + require.NoError(t, err) + + root := tree.Root() + + posMap := make(map[uint64]crypto.Hashable) + for _, j := range positions { + posMap[j] = a[j] + } + + proof, err := tree.Prove(positions) + require.NoError(t, err) + + err = Verify(root, posMap, proof) + require.NoError(t, err) - err = Verify(root, map[uint64]crypto.Digest{0: crypto.HashObj(junk)}, nil) - if err == nil { - t.Errorf("no error when verifying junk batch") + return tree, proof +} + +var KATs = []KATElement{ + { + []byte{223, 165, 76, 43, 118, 131, 205, 83, 151, 176, 50, 187, 236, 17, 236, 27, 119, 185, 251, 236, 90, 86, 201, 233, 66, 15, 107, 153, 128, 120, 64, 52}, + [][]byte{{212, 60, 103, 72, 82, 10, 118, 248, 31, 184, 37, 10, 169, 225, 166, 86, 240, 115, 255, 241, 229, 81, 86, 47, 173, 67, 233, 255, 251, 26, 184, 139}}, + }, + { + []byte{117, 207, 58, 54, 89, 80, 47, 147, 38, 223, 250, 114, 218, 81, 102, 235, 222, 29, 19, 246, 82, 156, 146, 35, 36, 135, 70, 68, 244, 183, 97, 110}, + [][]byte{ + {39, 169, 1, 19, 53, 252, 150, 220, 9, 95, 52, 138, 108, 147, 71, 211, 199, 205, 213, 108, 87, 198, 80, 41, 125, 135, 223, 149, 209, 63, 119, 11}, + {88, 120, 69, 62, 77, 91, 206, 2, 75, 78, 224, 127, 108, 87, 24, 104, 104, 243, 65, 3, 72, 245, 167, 214, 1, 192, 217, 206, 30, 254, 210, 57}, + }, + }, + { + []byte{7, 177, 51, 83, 39, 122, 156, 203, 107, 66, 79, 87, 58, 180, 252, 158, 38, 138, 1, 39, 206, 188, 73, 150, 82, 146, 64, 181, 226, 155, 109, 233}, + [][]byte{ + {68, 181, 96, 106, 228, 157, 129, 188, 127, 52, 81, 196, 255, 128, 57, 152, 168, 254, 0, 87, 226, 45, 99, 103, 8, 14, 90, 21, 91, 102, 16, 8}, + {112, 206, 125, 248, 189, 164, 41, 32, 245, 231, 90, 231, 136, 238, 123, 152, 9, 130, 106, 146, 112, 26, 78, 14, 73, 1, 56, 56, 14, 166, 15, 68}, + {119, 180, 57, 233, 159, 118, 74, 31, 103, 73, 230, 105, 177, 54, 31, 227, 187, 92, 228, 27, 234, 196, 181, 205, 85, 254, 81, 170, 158, 254, 60, 103}, + }, + }, + { + []byte{50, 251, 85, 206, 75, 56, 190, 244, 154, 96, 138, 178, 226, 117, 12, 255, 22, 50, 26, 246, 34, 43, 225, 20, 151, 233, 26, 249, 252, 146, 165, 63}, + [][]byte{ + {250, 174, 33, 61, 215, 33, 81, 114, 138, 36, 195, 111, 154, 163, 224, 126, 251, 227, 38, 192, 88, 248, 95, 104, 34, 193, 220, 33, 117, 224, 157, 153}, + {41, 233, 15, 204, 75, 28, 149, 19, 188, 21, 92, 1, 141, 183, 150, 208, 126, 151, 199, 165, 0, 155, 215, 165, 238, 212, 40, 30, 147, 222, 148, 19}, + {249, 60, 52, 8, 71, 52, 73, 153, 101, 28, 27, 215, 25, 73, 203, 151, 76, 124, 173, 123, 212, 33, 204, 198, 119, 103, 15, 104, 106, 229, 32, 204}, + {118, 168, 235, 254, 38, 163, 53, 60, 39, 2, 147, 113, 145, 221, 118, 98, 21, 104, 158, 90, 7, 189, 166, 15, 255, 212, 142, 207, 194, 32, 132, 212}, + }, + }, + { + []byte{23, 88, 226, 198, 37, 223, 43, 60, 98, 133, 183, 139, 102, 123, 221, 123, 0, 86, 205, 53, 28, 245, 228, 182, 120, 52, 206, 148, 27, 1, 84, 194}, + [][]byte{ + {252, 45, 96, 11, 46, 67, 69, 114, 33, 227, 95, 207, 66, 117, 34, 31, 102, 214, 206, 37, 11, 134, 150, 135, 157, 124, 231, 164, 151, 79, 151, 93}, + {163, 250, 12, 46, 19, 21, 31, 211, 195, 208, 2, 165, 69, 8, 25, 174, 113, 80, 161, 23, 45, 236, 173, 69, 226, 170, 147, 5, 106, 178, 69, 182}, + {235, 14, 67, 121, 148, 161, 107, 28, 59, 141, 254, 233, 155, 110, 134, 48, 199, 187, 177, 47, 136, 117, 158, 183, 116, 180, 227, 147, 92, 85, 17, 6}, + {58, 68, 220, 226, 251, 163, 242, 111, 14, 10, 226, 196, 116, 131, 232, 203, 29, 129, 95, 157, 153, 129, 240, 48, 237, 195, 128, 212, 239, 172, 79, 87}, + {82, 196, 7, 144, 85, 233, 108, 62, 243, 17, 76, 169, 49, 136, 65, 14, 138, 138, 8, 170, 126, 83, 223, 178, 187, 24, 195, 1, 117, 111, 175, 158}, + }, + }, +} + +var VCKATs = []KATElement{ + { + []byte{223, 165, 76, 43, 118, 131, 205, 83, 151, 176, 50, 187, 236, 17, 236, 27, 119, 185, 251, 236, 90, 86, 201, 233, 66, 15, 107, 153, 128, 120, 64, 52}, + [][]byte{{212, 60, 103, 72, 82, 10, 118, 248, 31, 184, 37, 10, 169, 225, 166, 86, 240, 115, 255, 241, 229, 81, 86, 47, 173, 67, 233, 255, 251, 26, 184, 139}}, + }, + { + []byte{117, 207, 58, 54, 89, 80, 47, 147, 38, 223, 250, 114, 218, 81, 102, 235, 222, 29, 19, 246, 82, 156, 146, 35, 36, 135, 70, 68, 244, 183, 97, 110}, + [][]byte{ + {39, 169, 1, 19, 53, 252, 150, 220, 9, 95, 52, 138, 108, 147, 71, 211, 199, 205, 213, 108, 87, 198, 80, 41, 125, 135, 223, 149, 209, 63, 119, 11}, + {88, 120, 69, 62, 77, 91, 206, 2, 75, 78, 224, 127, 108, 87, 24, 104, 104, 243, 65, 3, 72, 245, 167, 214, 1, 192, 217, 206, 30, 254, 210, 57}, + }, + }, + { + []byte{56, 245, 10, 65, 222, 10, 236, 127, 224, 228, 244, 247, 143, 31, 84, 13, 93, 198, 17, 209, 144, 160, 206, 206, 111, 1, 40, 234, 42, 2, 127, 94}, + [][]byte{ + {68, 181, 96, 106, 228, 157, 129, 188, 127, 52, 81, 196, 255, 128, 57, 152, 168, 254, 0, 87, 226, 45, 99, 103, 8, 14, 90, 21, 91, 102, 16, 8}, + {112, 206, 125, 248, 189, 164, 41, 32, 245, 231, 90, 231, 136, 238, 123, 152, 9, 130, 106, 146, 112, 26, 78, 14, 73, 1, 56, 56, 14, 166, 15, 68}, + {119, 180, 57, 233, 159, 118, 74, 31, 103, 73, 230, 105, 177, 54, 31, 227, 187, 92, 228, 27, 234, 196, 181, 205, 85, 254, 81, 170, 158, 254, 60, 103}, + }, + }, + { + []byte{149, 179, 79, 29, 252, 65, 254, 212, 129, 21, 202, 49, 189, 67, 34, 93, 255, 147, 245, 64, 56, 124, 35, 10, 207, 166, 67, 226, 103, 248, 141, 120}, + [][]byte{ + {250, 174, 33, 61, 215, 33, 81, 114, 138, 36, 195, 111, 154, 163, 224, 126, 251, 227, 38, 192, 88, 248, 95, 104, 34, 193, 220, 33, 117, 224, 157, 153}, + {41, 233, 15, 204, 75, 28, 149, 19, 188, 21, 92, 1, 141, 183, 150, 208, 126, 151, 199, 165, 0, 155, 215, 165, 238, 212, 40, 30, 147, 222, 148, 19}, + {249, 60, 52, 8, 71, 52, 73, 153, 101, 28, 27, 215, 25, 73, 203, 151, 76, 124, 173, 123, 212, 33, 204, 198, 119, 103, 15, 104, 106, 229, 32, 204}, + {118, 168, 235, 254, 38, 163, 53, 60, 39, 2, 147, 113, 145, 221, 118, 98, 21, 104, 158, 90, 7, 189, 166, 15, 255, 212, 142, 207, 194, 32, 132, 212}, + }, + }, + { + []byte{151, 119, 38, 117, 253, 236, 112, 179, 1, 14, 240, 139, 87, 243, 203, 241, 230, 247, 178, 63, 65, 17, 80, 118, 188, 195, 74, 221, 141, 140, 10, 27}, + [][]byte{ + {252, 45, 96, 11, 46, 67, 69, 114, 33, 227, 95, 207, 66, 117, 34, 31, 102, 214, 206, 37, 11, 134, 150, 135, 157, 124, 231, 164, 151, 79, 151, 93}, + {163, 250, 12, 46, 19, 21, 31, 211, 195, 208, 2, 165, 69, 8, 25, 174, 113, 80, 161, 23, 45, 236, 173, 69, 226, 170, 147, 5, 106, 178, 69, 182}, + {235, 14, 67, 121, 148, 161, 107, 28, 59, 141, 254, 233, 155, 110, 134, 48, 199, 187, 177, 47, 136, 117, 158, 183, 116, 180, 227, 147, 92, 85, 17, 6}, + {58, 68, 220, 226, 251, 163, 242, 111, 14, 10, 226, 196, 116, 131, 232, 203, 29, 129, 95, 157, 153, 129, 240, 48, 237, 195, 128, 212, 239, 172, 79, 87}, + {82, 196, 7, 144, 85, 233, 108, 62, 243, 17, 76, 169, 49, 136, 65, 14, 138, 138, 8, 170, 126, 83, 223, 178, 187, 24, 195, 1, 117, 111, 175, 158}, + }, + }, +} + +func TestMerkleTreeKATs(t *testing.T) { + partitiontest.PartitionTest(t) + + for j := 0; j < len(KATs); j++ { + a := make(TestArray, len(KATs[j].elements)) + for i := 0; i < len(KATs[j].elements); i++ { + copy(a[i][:], KATs[j].elements[i]) } + root := KATs[j].expectedRoot + tree, err := Build(a, crypto.HashFactory{HashType: crypto.Sha512_256}) + require.NoError(t, err) + root2 := tree.Root() + require.Equal(t, root, []byte(root2), "mismatched roots on KATs index %d", j) + } +} - _, err = tree.Prove([]uint64{sz}) - if err == nil { - t.Errorf("no error when proving past the end") +func TestVCKATs(t *testing.T) { + partitiontest.PartitionTest(t) + + for j := 0; j < len(VCKATs); j++ { + a := make(TestArray, len(VCKATs[j].elements)) + for i := 0; i < len(VCKATs[j].elements); i++ { + copy(a[i][:], VCKATs[j].elements[i]) } + root := VCKATs[j].expectedRoot + tree, err := BuildVectorCommitmentTree(a, crypto.HashFactory{HashType: crypto.Sha512_256}) + require.NoError(t, err) + root2 := tree.Root() + require.Equal(t, root, []byte(root2), "mismatched roots on KATs index %d", j) + } +} + +func TestMerkleTreeInternalNodeWithOneChild(t *testing.T) { + partitiontest.PartitionTest(t) + + a := make(TestArray, 5) + for i := uint64(0); i < 5; i++ { + crypto.RandBytes(a[i][:]) + } + h := crypto.HashFactory{HashType: crypto.Sha512_256}.NewHash() + leaf0Hash := crypto.GenericHashObj(h, a[0]) + leaf1Hash := crypto.GenericHashObj(h, a[1]) + leaf2Hash := crypto.GenericHashObj(h, a[2]) + leaf3Hash := crypto.GenericHashObj(h, a[3]) + leaf4Hash := crypto.GenericHashObj(h, a[4]) + + internalNode0Hash := hashInternalNode(h, leaf0Hash, leaf1Hash) + internalNode1Hash := hashInternalNode(h, leaf2Hash, leaf3Hash) + internalNode2Hash := hashInternalNode(h, leaf4Hash, nil) + internalNode00Hash := hashInternalNode(h, internalNode0Hash, internalNode1Hash) + internalNode01Hash := hashInternalNode(h, internalNode2Hash, nil) + rootHash := hashInternalNode(h, internalNode00Hash, internalNode01Hash) + + tree, err := Build(a, crypto.HashFactory{HashType: crypto.Sha512_256}) + require.NoError(t, err) + + root2 := tree.Root() + require.Equal(t, rootHash, []byte(root2)) +} + +func TestMerkleTreeInternalNodeFullTree(t *testing.T) { + partitiontest.PartitionTest(t) + + a := make(TestArray, 4) + for i := uint64(0); i < 4; i++ { + crypto.RandBytes(a[i][:]) + } + h := crypto.HashFactory{HashType: crypto.Sha512_256}.NewHash() + leaf0Hash := crypto.GenericHashObj(h, a[0]) + leaf1Hash := crypto.GenericHashObj(h, a[1]) + leaf2Hash := crypto.GenericHashObj(h, a[2]) + leaf3Hash := crypto.GenericHashObj(h, a[3]) + + internalNode0Hash := hashInternalNode(h, leaf0Hash, leaf1Hash) + internalNode1Hash := hashInternalNode(h, leaf2Hash, leaf3Hash) + rootHash := hashInternalNode(h, internalNode0Hash, internalNode1Hash) + + tree, err := Build(a, crypto.HashFactory{HashType: crypto.Sha512_256}) + require.NoError(t, err) + + root2 := tree.Root() + require.Equal(t, rootHash, []byte(root2)) - err = Verify(root, map[uint64]crypto.Digest{sz: crypto.HashObj(junk)}, nil) - if err == nil { - t.Errorf("no error when verifying past the end") +} + +func hashInternalNode(h hash.Hash, firstLeafHash []byte, secondLeafHash []byte) []byte { + internalNode := make([]byte, 2*h.Size()+len(protocol.MerkleArrayNode)) + copy(internalNode, protocol.MerkleArrayNode) + copy(internalNode[len(protocol.MerkleArrayNode):], firstLeafHash) + copy(internalNode[len(protocol.MerkleArrayNode)+h.Size():], secondLeafHash) + h.Reset() + h.Write(internalNode) + internalNodeHash := h.Sum(nil) + return internalNodeHash +} + +func getRegularPositions(numElets, max uint64) (res []uint64) { + skip := max / numElets + pos := uint64(0) + for i := uint64(0); i < numElets; i++ { + res = append(res, pos) + pos += skip + } + return +} + +func getRandomPositions(numElets, max uint64) (res []uint64) { + used := make([]bool, max) + for i := uint64(0); i < numElets; i++ { + + pos := crypto.RandUint64() % max + for used[pos] { + pos = (pos + 1) % max } + used[pos] = true + res = append(res, pos) + } + return +} + +func TestMerkleVC(t *testing.T) { + partitiontest.PartitionTest(t) + + for i := uint64(1); i < 32; i++ { + t.Run(fmt.Sprintf("hash#%s/Size#%d", crypto.Sha512_256.String(), i), func(t *testing.T) { + testMerkleVC(t, crypto.Sha512_256, i) + }) + } + + for i := uint64(1); i < 8; i++ { + t.Run(fmt.Sprintf("hash#%s/Size#%d", crypto.Sumhash.String(), i), func(t *testing.T) { + testMerkleVC(t, crypto.Sumhash, i) + }) + } + +} + +func testMerkleVC(t *testing.T, hashtype crypto.HashType, size uint64) { + var junk TestData + crypto.RandBytes(junk[:]) + + a := make(TestArray, size) + for i := uint64(0); i < size; i++ { + crypto.RandBytes(a[i][:]) + } + + tree, err := BuildVectorCommitmentTree(a, crypto.HashFactory{HashType: hashtype}) + require.NoError(t, err) + + root := tree.Root() + + var allpos []uint64 + allmap := make(map[uint64]crypto.Hashable) + + for i := uint64(0); i < size; i++ { + proof, err := tree.Prove([]uint64{i}) + require.NoError(t, err) + + err = VerifyVectorCommitment(root, map[uint64]crypto.Hashable{i: a[i]}, proof) + require.NoError(t, err) + + err = VerifyVectorCommitment(root, map[uint64]crypto.Hashable{i: junk}, proof) + require.ErrorIs(t, err, ErrRootMismatch) + + allpos = append(allpos, i) + allmap[i] = a[i] + } + + proof, err := tree.Prove(allpos) + require.NoError(t, err) + + err = VerifyVectorCommitment(root, allmap, proof) + require.NoError(t, err) + + err = VerifyVectorCommitment(root, map[uint64]crypto.Hashable{0: junk}, proof) + require.ErrorIs(t, err, ErrRootMismatch) + + var somepos []uint64 + somemap := make(map[uint64]crypto.Hashable) + for i := 0; i < 10; i++ { + pos := crypto.RandUint64() % size + somepos = append(somepos, pos) + somemap[pos] = a[pos] + } + + proof, err = tree.Prove(somepos) + require.NoError(t, err) + + err = VerifyVectorCommitment(root, somemap, proof) + require.NoError(t, err) - if sz > 0 { - var somepos []uint64 - somemap := make(map[uint64]crypto.Digest) - for i := 0; i < 10; i++ { - pos := crypto.RandUint64() % sz - somepos = append(somepos, pos) - somemap[pos] = crypto.HashObj(a[pos]) - } - - proof, err = tree.Prove(somepos) - if err != nil { - t.Error(err) - } - - err = Verify(root, somemap, proof) - if err != nil { - t.Error(err) - } +} + +func TestMerkleTreeOneLeaf(t *testing.T) { + partitiontest.PartitionTest(t) + + a := make(TestArray, 1) + + copy(a[0][:], []byte{0x1, 0x2}) + + h := crypto.HashFactory{HashType: crypto.Sha512_256}.NewHash() + rootHash := crypto.GenericHashObj(h, a[0]) + + tree, err := Build(a, crypto.HashFactory{HashType: crypto.Sha512_256}) + require.NoError(t, err) + + root2 := tree.Root() + require.Equal(t, rootHash, []byte(root2)) +} + +func TestVCOneLeaf(t *testing.T) { + partitiontest.PartitionTest(t) + + a := make(TestArray, 1) + + copy(a[0][:], []byte{0x1, 0x2}) + + h := crypto.HashFactory{HashType: crypto.Sha512_256}.NewHash() + rootHash := crypto.GenericHashObj(h, a[0]) + + tree, err := BuildVectorCommitmentTree(a, crypto.HashFactory{HashType: crypto.Sha512_256}) + require.NoError(t, err) + + root2 := tree.Root() + require.Equal(t, rootHash, []byte(root2)) +} + +func TestTreeDepthField(t *testing.T) { + partitiontest.PartitionTest(t) + + var sizes = []int{1, 2, 3} + var expectedDepth = []int{0, 1, 2} + + // array with 0 elements + a := require.New(t) + size := uint64(0) + arr := make(TestArray, size) + for i := uint64(0); i < size; i++ { + crypto.RandBytes(arr[i][:]) + } + + tree, err := BuildVectorCommitmentTree(arr, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + p, err := tree.Prove([]uint64{}) + require.NoError(t, err) + require.Equal(t, p.TreeDepth, uint8(0)) + + tree, err = Build(arr, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + p, err = tree.Prove([]uint64{}) + require.NoError(t, err) + require.Equal(t, p.TreeDepth, uint8(0)) + + for i := 0; i < len(sizes); i++ { + a = require.New(t) + size = uint64(sizes[i]) + arr = make(TestArray, size) + for i := uint64(0); i < size; i++ { + crypto.RandBytes(arr[i][:]) } + + tree, err = BuildVectorCommitmentTree(arr, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + p, err = tree.Prove([]uint64{}) + require.NoError(t, err) + require.Equal(t, p.TreeDepth, uint8(expectedDepth[i])) + + tree, err = Build(arr, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + p, err = tree.Prove([]uint64{}) + require.NoError(t, err) + require.Equal(t, p.TreeDepth, uint8(expectedDepth[i])) + + p, err = tree.Prove([]uint64{uint64(i)}) + require.NoError(t, err) + require.Equal(t, p.TreeDepth, uint8(expectedDepth[i])) + + tree, err = Build(arr, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + p, err = tree.Prove([]uint64{uint64(i)}) + require.NoError(t, err) + require.Equal(t, p.TreeDepth, uint8(expectedDepth[i])) + } +} + +func TestTreeNumOfLeavesField(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + arr := make(TestArray, 1) + crypto.RandBytes(arr[0][:]) + tree, err := Build(arr, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + a.Equal(tree.NumOfElements, uint64(1)) + + arr = make(TestArray, 2) + crypto.RandBytes(arr[0][:]) + crypto.RandBytes(arr[1][:]) + tree, err = Build(arr, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + a.Equal(tree.NumOfElements, uint64(2)) + + arr = make(TestArray, 3) + crypto.RandBytes(arr[0][:]) + crypto.RandBytes(arr[1][:]) + crypto.RandBytes(arr[2][:]) + tree, err = Build(arr, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + a.Equal(tree.NumOfElements, uint64(3)) + + arr = make(TestArray, 1) + crypto.RandBytes(arr[0][:]) + tree, err = BuildVectorCommitmentTree(arr, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + a.Equal(tree.NumOfElements, uint64(1)) + + arr = make(TestArray, 2) + crypto.RandBytes(arr[0][:]) + crypto.RandBytes(arr[1][:]) + tree, err = BuildVectorCommitmentTree(arr, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + a.Equal(tree.NumOfElements, uint64(2)) + + arr = make(TestArray, 3) + crypto.RandBytes(arr[0][:]) + crypto.RandBytes(arr[1][:]) + crypto.RandBytes(arr[2][:]) + tree, err = BuildVectorCommitmentTree(arr, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + a.Equal(tree.NumOfElements, uint64(3)) +} + +func TestProveSingleLeaf(t *testing.T) { + partitiontest.PartitionTest(t) + + size := uint64(15) + a := make(TestArray, size) + for i := uint64(0); i < size; i++ { + crypto.RandBytes(a[i][:]) + } + + tree, err := Build(a, crypto.HashFactory{HashType: crypto.Sha512_256}) + require.NoError(t, err) + + root := tree.Root() + + for i := uint64(0); i < size; i++ { + proof, err := tree.Prove([]uint64{i}) + require.NoError(t, err) + + singleLeafproof, err := tree.ProveSingleLeaf(i) + require.NoError(t, err) + + require.Equal(t, singleLeafproof.ToProof(), proof) + + err = Verify(root, map[uint64]crypto.Hashable{i: a[i]}, singleLeafproof.ToProof()) + require.NoError(t, err) + } +} + +func TestVCProveSingleLeaf(t *testing.T) { + partitiontest.PartitionTest(t) + + size := uint64(15) + a := make(TestArray, size) + for i := uint64(0); i < size; i++ { + crypto.RandBytes(a[i][:]) + } + + tree, err := BuildVectorCommitmentTree(a, crypto.HashFactory{HashType: crypto.Sha512_256}) + require.NoError(t, err) + + root := tree.Root() + + for i := uint64(0); i < size; i++ { + proof, err := tree.Prove([]uint64{i}) + require.NoError(t, err) + + singleLeafproof, err := tree.ProveSingleLeaf(i) + require.NoError(t, err) + + require.Equal(t, singleLeafproof.ToProof(), proof) + + err = VerifyVectorCommitment(root, map[uint64]crypto.Hashable{i: a[i]}, singleLeafproof.ToProof()) + require.NoError(t, err) } } func BenchmarkMerkleCommit(b *testing.B) { + b.Run("sha512_256", func(b *testing.B) { merkleCommitBench(b, crypto.Sha512_256) }) + b.Run("sumhash", func(b *testing.B) { merkleCommitBench(b, crypto.Sumhash) }) +} + +func merkleCommitBench(b *testing.B, hashType crypto.HashType) { for sz := 10; sz <= 100000; sz *= 100 { msg := make(TestBuf, sz) crypto.RandBytes(msg[:]) @@ -180,10 +1076,8 @@ func BenchmarkMerkleCommit(b *testing.B) { b.Run(fmt.Sprintf("Item%d/Count%d", sz, cnt), func(b *testing.B) { for i := 0; i < b.N; i++ { - tree, err := Build(a) - if err != nil { - b.Error(err) - } + tree, err := Build(a, crypto.HashFactory{HashType: hashType}) + require.NoError(b, err) tree.Root() } }) @@ -192,16 +1086,19 @@ func BenchmarkMerkleCommit(b *testing.B) { } func BenchmarkMerkleProve1M(b *testing.B) { + b.Run("sha512_256", func(b *testing.B) { benchmarkMerkleProve1M(b, crypto.Sha512_256) }) + b.Run("sumhash", func(b *testing.B) { benchmarkMerkleProve1M(b, crypto.Sumhash) }) +} + +func benchmarkMerkleProve1M(b *testing.B, hashType crypto.HashType) { msg := TestMessage("Hello world") var a TestRepeatingArray a.item = msg a.count = 1024 * 1024 - tree, err := Build(a) - if err != nil { - b.Error(err) - } + tree, err := Build(a, crypto.HashFactory{HashType: hashType}) + require.NoError(b, err) b.ResetTimer() @@ -214,32 +1111,31 @@ func BenchmarkMerkleProve1M(b *testing.B) { } func BenchmarkMerkleVerify1M(b *testing.B) { + b.Run("sha512_256", func(b *testing.B) { benchmarkMerkleVerify1M(b, crypto.Sha512_256) }) + b.Run("sumhash", func(b *testing.B) { benchmarkMerkleVerify1M(b, crypto.Sumhash) }) +} + +func benchmarkMerkleVerify1M(b *testing.B, hashType crypto.HashType) { msg := TestMessage("Hello world") var a TestRepeatingArray a.item = msg a.count = 1024 * 1024 - tree, err := Build(a) - if err != nil { - b.Error(err) - } + tree, err := Build(a, crypto.HashFactory{HashType: hashType}) + require.NoError(b, err) root := tree.Root() - proofs := make([][]crypto.Digest, a.count) + proofs := make([]*Proof, a.count) for i := uint64(0); i < a.count; i++ { proofs[i], err = tree.Prove([]uint64{i}) - if err != nil { - b.Error(err) - } + require.NoError(b, err) } b.ResetTimer() for i := uint64(0); i < uint64(b.N); i++ { - err := Verify(root, map[uint64]crypto.Digest{i % a.count: crypto.HashObj(msg)}, proofs[i]) - if err != nil { - b.Error(err) - } + err := Verify(root, map[uint64]crypto.Hashable{i % a.count: msg}, proofs[i]) + require.NoError(b, err) } } diff --git a/crypto/merklearray/msgp_gen.go b/crypto/merklearray/msgp_gen.go new file mode 100644 index 0000000000..344e7b86d2 --- /dev/null +++ b/crypto/merklearray/msgp_gen.go @@ -0,0 +1,805 @@ +package merklearray + +// Code generated by github.com/algorand/msgp DO NOT EDIT. + +import ( + "github.com/algorand/go-algorand/crypto" + "github.com/algorand/msgp/msgp" +) + +// The following msgp objects are implemented in this file: +// Layer +// |-----> MarshalMsg +// |-----> CanMarshalMsg +// |-----> (*) UnmarshalMsg +// |-----> (*) CanUnmarshalMsg +// |-----> Msgsize +// |-----> MsgIsZero +// +// Proof +// |-----> (*) MarshalMsg +// |-----> (*) CanMarshalMsg +// |-----> (*) UnmarshalMsg +// |-----> (*) CanUnmarshalMsg +// |-----> (*) Msgsize +// |-----> (*) MsgIsZero +// +// SingleLeafProof +// |-----> (*) MarshalMsg +// |-----> (*) CanMarshalMsg +// |-----> (*) UnmarshalMsg +// |-----> (*) CanUnmarshalMsg +// |-----> (*) Msgsize +// |-----> (*) MsgIsZero +// +// Tree +// |-----> (*) MarshalMsg +// |-----> (*) CanMarshalMsg +// |-----> (*) UnmarshalMsg +// |-----> (*) CanUnmarshalMsg +// |-----> (*) Msgsize +// |-----> (*) MsgIsZero +// + +// MarshalMsg implements msgp.Marshaler +func (z Layer) MarshalMsg(b []byte) (o []byte) { + o = msgp.Require(b, z.Msgsize()) + if z == nil { + o = msgp.AppendNil(o) + } else { + o = msgp.AppendArrayHeader(o, uint32(len(z))) + } + for za0001 := range z { + o = z[za0001].MarshalMsg(o) + } + return +} + +func (_ Layer) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(Layer) + if !ok { + _, ok = (z).(*Layer) + } + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *Layer) UnmarshalMsg(bts []byte) (o []byte, err error) { + var zb0002 int + var zb0003 bool + zb0002, zb0003, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0002 > MaxNumLeavesOnEncodedTree { + err = msgp.ErrOverflow(uint64(zb0002), uint64(MaxNumLeavesOnEncodedTree)) + err = msgp.WrapError(err) + return + } + if zb0003 { + (*z) = nil + } else if (*z) != nil && cap((*z)) >= zb0002 { + (*z) = (*z)[:zb0002] + } else { + (*z) = make(Layer, zb0002) + } + for zb0001 := range *z { + bts, err = (*z)[zb0001].UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, zb0001) + return + } + } + o = bts + return +} + +func (_ *Layer) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*Layer) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z Layer) Msgsize() (s int) { + s = msgp.ArrayHeaderSize + for za0001 := range z { + s += z[za0001].Msgsize() + } + return +} + +// MsgIsZero returns whether this is a zero value +func (z Layer) MsgIsZero() bool { + return len(z) == 0 +} + +// MarshalMsg implements msgp.Marshaler +func (z *Proof) MarshalMsg(b []byte) (o []byte) { + o = msgp.Require(b, z.Msgsize()) + // omitempty: check for empty values + zb0002Len := uint32(3) + var zb0002Mask uint8 /* 4 bits */ + if (*z).HashFactory.MsgIsZero() { + zb0002Len-- + zb0002Mask |= 0x2 + } + if len((*z).Path) == 0 { + zb0002Len-- + zb0002Mask |= 0x4 + } + if (*z).TreeDepth == 0 { + zb0002Len-- + zb0002Mask |= 0x8 + } + // variable map header, size zb0002Len + o = append(o, 0x80|uint8(zb0002Len)) + if zb0002Len != 0 { + if (zb0002Mask & 0x2) == 0 { // if not empty + // string "hsh" + o = append(o, 0xa3, 0x68, 0x73, 0x68) + o = (*z).HashFactory.MarshalMsg(o) + } + if (zb0002Mask & 0x4) == 0 { // if not empty + // string "pth" + o = append(o, 0xa3, 0x70, 0x74, 0x68) + if (*z).Path == nil { + o = msgp.AppendNil(o) + } else { + o = msgp.AppendArrayHeader(o, uint32(len((*z).Path))) + } + for zb0001 := range (*z).Path { + o = (*z).Path[zb0001].MarshalMsg(o) + } + } + if (zb0002Mask & 0x8) == 0 { // if not empty + // string "td" + o = append(o, 0xa2, 0x74, 0x64) + o = msgp.AppendUint8(o, (*z).TreeDepth) + } + } + return +} + +func (_ *Proof) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(*Proof) + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *Proof) UnmarshalMsg(bts []byte) (o []byte, err error) { + var field []byte + _ = field + var zb0002 int + var zb0003 bool + zb0002, zb0003, bts, err = msgp.ReadMapHeaderBytes(bts) + if _, ok := err.(msgp.TypeError); ok { + zb0002, zb0003, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0002 > 0 { + zb0002-- + var zb0004 int + var zb0005 bool + zb0004, zb0005, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Path") + return + } + if zb0004 > MaxNumLeavesOnEncodedTree/2 { + err = msgp.ErrOverflow(uint64(zb0004), uint64(MaxNumLeavesOnEncodedTree/2)) + err = msgp.WrapError(err, "struct-from-array", "Path") + return + } + if zb0005 { + (*z).Path = nil + } else if (*z).Path != nil && cap((*z).Path) >= zb0004 { + (*z).Path = ((*z).Path)[:zb0004] + } else { + (*z).Path = make([]crypto.GenericDigest, zb0004) + } + for zb0001 := range (*z).Path { + bts, err = (*z).Path[zb0001].UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Path", zb0001) + return + } + } + } + if zb0002 > 0 { + zb0002-- + bts, err = (*z).HashFactory.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "HashFactory") + return + } + } + if zb0002 > 0 { + zb0002-- + (*z).TreeDepth, bts, err = msgp.ReadUint8Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "TreeDepth") + return + } + } + if zb0002 > 0 { + err = msgp.ErrTooManyArrayFields(zb0002) + if err != nil { + err = msgp.WrapError(err, "struct-from-array") + return + } + } + } else { + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0003 { + (*z) = Proof{} + } + for zb0002 > 0 { + zb0002-- + field, bts, err = msgp.ReadMapKeyZC(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + switch string(field) { + case "pth": + var zb0006 int + var zb0007 bool + zb0006, zb0007, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err, "Path") + return + } + if zb0006 > MaxNumLeavesOnEncodedTree/2 { + err = msgp.ErrOverflow(uint64(zb0006), uint64(MaxNumLeavesOnEncodedTree/2)) + err = msgp.WrapError(err, "Path") + return + } + if zb0007 { + (*z).Path = nil + } else if (*z).Path != nil && cap((*z).Path) >= zb0006 { + (*z).Path = ((*z).Path)[:zb0006] + } else { + (*z).Path = make([]crypto.GenericDigest, zb0006) + } + for zb0001 := range (*z).Path { + bts, err = (*z).Path[zb0001].UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Path", zb0001) + return + } + } + case "hsh": + bts, err = (*z).HashFactory.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "HashFactory") + return + } + case "td": + (*z).TreeDepth, bts, err = msgp.ReadUint8Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "TreeDepth") + return + } + default: + err = msgp.ErrNoField(string(field)) + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + } + o = bts + return +} + +func (_ *Proof) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*Proof) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *Proof) Msgsize() (s int) { + s = 1 + 4 + msgp.ArrayHeaderSize + for zb0001 := range (*z).Path { + s += (*z).Path[zb0001].Msgsize() + } + s += 4 + (*z).HashFactory.Msgsize() + 3 + msgp.Uint8Size + return +} + +// MsgIsZero returns whether this is a zero value +func (z *Proof) MsgIsZero() bool { + return (len((*z).Path) == 0) && ((*z).HashFactory.MsgIsZero()) && ((*z).TreeDepth == 0) +} + +// MarshalMsg implements msgp.Marshaler +func (z *SingleLeafProof) MarshalMsg(b []byte) (o []byte) { + o = msgp.Require(b, z.Msgsize()) + // omitempty: check for empty values + zb0002Len := uint32(3) + var zb0002Mask uint8 /* 5 bits */ + if (*z).Proof.HashFactory.MsgIsZero() { + zb0002Len-- + zb0002Mask |= 0x4 + } + if len((*z).Proof.Path) == 0 { + zb0002Len-- + zb0002Mask |= 0x8 + } + if (*z).Proof.TreeDepth == 0 { + zb0002Len-- + zb0002Mask |= 0x10 + } + // variable map header, size zb0002Len + o = append(o, 0x80|uint8(zb0002Len)) + if zb0002Len != 0 { + if (zb0002Mask & 0x4) == 0 { // if not empty + // string "hsh" + o = append(o, 0xa3, 0x68, 0x73, 0x68) + o = (*z).Proof.HashFactory.MarshalMsg(o) + } + if (zb0002Mask & 0x8) == 0 { // if not empty + // string "pth" + o = append(o, 0xa3, 0x70, 0x74, 0x68) + if (*z).Proof.Path == nil { + o = msgp.AppendNil(o) + } else { + o = msgp.AppendArrayHeader(o, uint32(len((*z).Proof.Path))) + } + for zb0001 := range (*z).Proof.Path { + o = (*z).Proof.Path[zb0001].MarshalMsg(o) + } + } + if (zb0002Mask & 0x10) == 0 { // if not empty + // string "td" + o = append(o, 0xa2, 0x74, 0x64) + o = msgp.AppendUint8(o, (*z).Proof.TreeDepth) + } + } + return +} + +func (_ *SingleLeafProof) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(*SingleLeafProof) + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *SingleLeafProof) UnmarshalMsg(bts []byte) (o []byte, err error) { + var field []byte + _ = field + var zb0002 int + var zb0003 bool + zb0002, zb0003, bts, err = msgp.ReadMapHeaderBytes(bts) + if _, ok := err.(msgp.TypeError); ok { + zb0002, zb0003, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0002 > 0 { + zb0002-- + var zb0004 int + var zb0005 bool + zb0004, zb0005, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Path") + return + } + if zb0004 > MaxNumLeavesOnEncodedTree/2 { + err = msgp.ErrOverflow(uint64(zb0004), uint64(MaxNumLeavesOnEncodedTree/2)) + err = msgp.WrapError(err, "struct-from-array", "Path") + return + } + if zb0005 { + (*z).Proof.Path = nil + } else if (*z).Proof.Path != nil && cap((*z).Proof.Path) >= zb0004 { + (*z).Proof.Path = ((*z).Proof.Path)[:zb0004] + } else { + (*z).Proof.Path = make([]crypto.GenericDigest, zb0004) + } + for zb0001 := range (*z).Proof.Path { + bts, err = (*z).Proof.Path[zb0001].UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Path", zb0001) + return + } + } + } + if zb0002 > 0 { + zb0002-- + bts, err = (*z).Proof.HashFactory.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "HashFactory") + return + } + } + if zb0002 > 0 { + zb0002-- + (*z).Proof.TreeDepth, bts, err = msgp.ReadUint8Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "TreeDepth") + return + } + } + if zb0002 > 0 { + err = msgp.ErrTooManyArrayFields(zb0002) + if err != nil { + err = msgp.WrapError(err, "struct-from-array") + return + } + } + } else { + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0003 { + (*z) = SingleLeafProof{} + } + for zb0002 > 0 { + zb0002-- + field, bts, err = msgp.ReadMapKeyZC(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + switch string(field) { + case "pth": + var zb0006 int + var zb0007 bool + zb0006, zb0007, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err, "Path") + return + } + if zb0006 > MaxNumLeavesOnEncodedTree/2 { + err = msgp.ErrOverflow(uint64(zb0006), uint64(MaxNumLeavesOnEncodedTree/2)) + err = msgp.WrapError(err, "Path") + return + } + if zb0007 { + (*z).Proof.Path = nil + } else if (*z).Proof.Path != nil && cap((*z).Proof.Path) >= zb0006 { + (*z).Proof.Path = ((*z).Proof.Path)[:zb0006] + } else { + (*z).Proof.Path = make([]crypto.GenericDigest, zb0006) + } + for zb0001 := range (*z).Proof.Path { + bts, err = (*z).Proof.Path[zb0001].UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Path", zb0001) + return + } + } + case "hsh": + bts, err = (*z).Proof.HashFactory.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "HashFactory") + return + } + case "td": + (*z).Proof.TreeDepth, bts, err = msgp.ReadUint8Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "TreeDepth") + return + } + default: + err = msgp.ErrNoField(string(field)) + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + } + o = bts + return +} + +func (_ *SingleLeafProof) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*SingleLeafProof) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *SingleLeafProof) Msgsize() (s int) { + s = 1 + 4 + msgp.ArrayHeaderSize + for zb0001 := range (*z).Proof.Path { + s += (*z).Proof.Path[zb0001].Msgsize() + } + s += 4 + (*z).Proof.HashFactory.Msgsize() + 3 + msgp.Uint8Size + return +} + +// MsgIsZero returns whether this is a zero value +func (z *SingleLeafProof) MsgIsZero() bool { + return (len((*z).Proof.Path) == 0) && ((*z).Proof.HashFactory.MsgIsZero()) && ((*z).Proof.TreeDepth == 0) +} + +// MarshalMsg implements msgp.Marshaler +func (z *Tree) MarshalMsg(b []byte) (o []byte) { + o = msgp.Require(b, z.Msgsize()) + // omitempty: check for empty values + zb0003Len := uint32(4) + var zb0003Mask uint8 /* 5 bits */ + if (*z).Hash.MsgIsZero() { + zb0003Len-- + zb0003Mask |= 0x2 + } + if len((*z).Levels) == 0 { + zb0003Len-- + zb0003Mask |= 0x4 + } + if (*z).NumOfElements == 0 { + zb0003Len-- + zb0003Mask |= 0x8 + } + if (*z).IsVectorCommitment == false { + zb0003Len-- + zb0003Mask |= 0x10 + } + // variable map header, size zb0003Len + o = append(o, 0x80|uint8(zb0003Len)) + if zb0003Len != 0 { + if (zb0003Mask & 0x2) == 0 { // if not empty + // string "hsh" + o = append(o, 0xa3, 0x68, 0x73, 0x68) + o = (*z).Hash.MarshalMsg(o) + } + if (zb0003Mask & 0x4) == 0 { // if not empty + // string "lvls" + o = append(o, 0xa4, 0x6c, 0x76, 0x6c, 0x73) + if (*z).Levels == nil { + o = msgp.AppendNil(o) + } else { + o = msgp.AppendArrayHeader(o, uint32(len((*z).Levels))) + } + for zb0001 := range (*z).Levels { + if (*z).Levels[zb0001] == nil { + o = msgp.AppendNil(o) + } else { + o = msgp.AppendArrayHeader(o, uint32(len((*z).Levels[zb0001]))) + } + for zb0002 := range (*z).Levels[zb0001] { + o = (*z).Levels[zb0001][zb0002].MarshalMsg(o) + } + } + } + if (zb0003Mask & 0x8) == 0 { // if not empty + // string "nl" + o = append(o, 0xa2, 0x6e, 0x6c) + o = msgp.AppendUint64(o, (*z).NumOfElements) + } + if (zb0003Mask & 0x10) == 0 { // if not empty + // string "vc" + o = append(o, 0xa2, 0x76, 0x63) + o = msgp.AppendBool(o, (*z).IsVectorCommitment) + } + } + return +} + +func (_ *Tree) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(*Tree) + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *Tree) UnmarshalMsg(bts []byte) (o []byte, err error) { + var field []byte + _ = field + var zb0003 int + var zb0004 bool + zb0003, zb0004, bts, err = msgp.ReadMapHeaderBytes(bts) + if _, ok := err.(msgp.TypeError); ok { + zb0003, zb0004, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0003 > 0 { + zb0003-- + var zb0005 int + var zb0006 bool + zb0005, zb0006, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Levels") + return + } + if zb0005 > MaxEncodedTreeDepth+1 { + err = msgp.ErrOverflow(uint64(zb0005), uint64(MaxEncodedTreeDepth+1)) + err = msgp.WrapError(err, "struct-from-array", "Levels") + return + } + if zb0006 { + (*z).Levels = nil + } else if (*z).Levels != nil && cap((*z).Levels) >= zb0005 { + (*z).Levels = ((*z).Levels)[:zb0005] + } else { + (*z).Levels = make([]Layer, zb0005) + } + for zb0001 := range (*z).Levels { + var zb0007 int + var zb0008 bool + zb0007, zb0008, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Levels", zb0001) + return + } + if zb0007 > MaxNumLeavesOnEncodedTree { + err = msgp.ErrOverflow(uint64(zb0007), uint64(MaxNumLeavesOnEncodedTree)) + err = msgp.WrapError(err, "struct-from-array", "Levels", zb0001) + return + } + if zb0008 { + (*z).Levels[zb0001] = nil + } else if (*z).Levels[zb0001] != nil && cap((*z).Levels[zb0001]) >= zb0007 { + (*z).Levels[zb0001] = ((*z).Levels[zb0001])[:zb0007] + } else { + (*z).Levels[zb0001] = make(Layer, zb0007) + } + for zb0002 := range (*z).Levels[zb0001] { + bts, err = (*z).Levels[zb0001][zb0002].UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Levels", zb0001, zb0002) + return + } + } + } + } + if zb0003 > 0 { + zb0003-- + (*z).NumOfElements, bts, err = msgp.ReadUint64Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "NumOfElements") + return + } + } + if zb0003 > 0 { + zb0003-- + bts, err = (*z).Hash.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Hash") + return + } + } + if zb0003 > 0 { + zb0003-- + (*z).IsVectorCommitment, bts, err = msgp.ReadBoolBytes(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "IsVectorCommitment") + return + } + } + if zb0003 > 0 { + err = msgp.ErrTooManyArrayFields(zb0003) + if err != nil { + err = msgp.WrapError(err, "struct-from-array") + return + } + } + } else { + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0004 { + (*z) = Tree{} + } + for zb0003 > 0 { + zb0003-- + field, bts, err = msgp.ReadMapKeyZC(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + switch string(field) { + case "lvls": + var zb0009 int + var zb0010 bool + zb0009, zb0010, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err, "Levels") + return + } + if zb0009 > MaxEncodedTreeDepth+1 { + err = msgp.ErrOverflow(uint64(zb0009), uint64(MaxEncodedTreeDepth+1)) + err = msgp.WrapError(err, "Levels") + return + } + if zb0010 { + (*z).Levels = nil + } else if (*z).Levels != nil && cap((*z).Levels) >= zb0009 { + (*z).Levels = ((*z).Levels)[:zb0009] + } else { + (*z).Levels = make([]Layer, zb0009) + } + for zb0001 := range (*z).Levels { + var zb0011 int + var zb0012 bool + zb0011, zb0012, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err, "Levels", zb0001) + return + } + if zb0011 > MaxNumLeavesOnEncodedTree { + err = msgp.ErrOverflow(uint64(zb0011), uint64(MaxNumLeavesOnEncodedTree)) + err = msgp.WrapError(err, "Levels", zb0001) + return + } + if zb0012 { + (*z).Levels[zb0001] = nil + } else if (*z).Levels[zb0001] != nil && cap((*z).Levels[zb0001]) >= zb0011 { + (*z).Levels[zb0001] = ((*z).Levels[zb0001])[:zb0011] + } else { + (*z).Levels[zb0001] = make(Layer, zb0011) + } + for zb0002 := range (*z).Levels[zb0001] { + bts, err = (*z).Levels[zb0001][zb0002].UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Levels", zb0001, zb0002) + return + } + } + } + case "nl": + (*z).NumOfElements, bts, err = msgp.ReadUint64Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "NumOfElements") + return + } + case "hsh": + bts, err = (*z).Hash.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Hash") + return + } + case "vc": + (*z).IsVectorCommitment, bts, err = msgp.ReadBoolBytes(bts) + if err != nil { + err = msgp.WrapError(err, "IsVectorCommitment") + return + } + default: + err = msgp.ErrNoField(string(field)) + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + } + o = bts + return +} + +func (_ *Tree) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*Tree) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *Tree) Msgsize() (s int) { + s = 1 + 5 + msgp.ArrayHeaderSize + for zb0001 := range (*z).Levels { + s += msgp.ArrayHeaderSize + for zb0002 := range (*z).Levels[zb0001] { + s += (*z).Levels[zb0001][zb0002].Msgsize() + } + } + s += 3 + msgp.Uint64Size + 4 + (*z).Hash.Msgsize() + 3 + msgp.BoolSize + return +} + +// MsgIsZero returns whether this is a zero value +func (z *Tree) MsgIsZero() bool { + return (len((*z).Levels) == 0) && ((*z).NumOfElements == 0) && ((*z).Hash.MsgIsZero()) && ((*z).IsVectorCommitment == false) +} diff --git a/crypto/merklearray/msgp_gen_test.go b/crypto/merklearray/msgp_gen_test.go new file mode 100644 index 0000000000..fbcc81970a --- /dev/null +++ b/crypto/merklearray/msgp_gen_test.go @@ -0,0 +1,253 @@ +// +build !skip_msgp_testing + +package merklearray + +// Code generated by github.com/algorand/msgp DO NOT EDIT. + +import ( + "testing" + + "github.com/algorand/go-algorand/protocol" + "github.com/algorand/go-algorand/test/partitiontest" + "github.com/algorand/msgp/msgp" +) + +func TestMarshalUnmarshalLayer(t *testing.T) { + partitiontest.PartitionTest(t) + v := Layer{} + bts := v.MarshalMsg(nil) + left, err := v.UnmarshalMsg(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) + } + + left, err = msgp.Skip(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after Skip(): %q", len(left), left) + } +} + +func TestRandomizedEncodingLayer(t *testing.T) { + protocol.RunEncodingTest(t, &Layer{}) +} + +func BenchmarkMarshalMsgLayer(b *testing.B) { + v := Layer{} + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.MarshalMsg(nil) + } +} + +func BenchmarkAppendMsgLayer(b *testing.B) { + v := Layer{} + bts := make([]byte, 0, v.Msgsize()) + bts = v.MarshalMsg(bts[0:0]) + b.SetBytes(int64(len(bts))) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + bts = v.MarshalMsg(bts[0:0]) + } +} + +func BenchmarkUnmarshalLayer(b *testing.B) { + v := Layer{} + bts := v.MarshalMsg(nil) + b.ReportAllocs() + b.SetBytes(int64(len(bts))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := v.UnmarshalMsg(bts) + if err != nil { + b.Fatal(err) + } + } +} + +func TestMarshalUnmarshalProof(t *testing.T) { + partitiontest.PartitionTest(t) + v := Proof{} + bts := v.MarshalMsg(nil) + left, err := v.UnmarshalMsg(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) + } + + left, err = msgp.Skip(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after Skip(): %q", len(left), left) + } +} + +func TestRandomizedEncodingProof(t *testing.T) { + protocol.RunEncodingTest(t, &Proof{}) +} + +func BenchmarkMarshalMsgProof(b *testing.B) { + v := Proof{} + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.MarshalMsg(nil) + } +} + +func BenchmarkAppendMsgProof(b *testing.B) { + v := Proof{} + bts := make([]byte, 0, v.Msgsize()) + bts = v.MarshalMsg(bts[0:0]) + b.SetBytes(int64(len(bts))) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + bts = v.MarshalMsg(bts[0:0]) + } +} + +func BenchmarkUnmarshalProof(b *testing.B) { + v := Proof{} + bts := v.MarshalMsg(nil) + b.ReportAllocs() + b.SetBytes(int64(len(bts))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := v.UnmarshalMsg(bts) + if err != nil { + b.Fatal(err) + } + } +} + +func TestMarshalUnmarshalSingleLeafProof(t *testing.T) { + partitiontest.PartitionTest(t) + v := SingleLeafProof{} + bts := v.MarshalMsg(nil) + left, err := v.UnmarshalMsg(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) + } + + left, err = msgp.Skip(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after Skip(): %q", len(left), left) + } +} + +func TestRandomizedEncodingSingleLeafProof(t *testing.T) { + protocol.RunEncodingTest(t, &SingleLeafProof{}) +} + +func BenchmarkMarshalMsgSingleLeafProof(b *testing.B) { + v := SingleLeafProof{} + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.MarshalMsg(nil) + } +} + +func BenchmarkAppendMsgSingleLeafProof(b *testing.B) { + v := SingleLeafProof{} + bts := make([]byte, 0, v.Msgsize()) + bts = v.MarshalMsg(bts[0:0]) + b.SetBytes(int64(len(bts))) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + bts = v.MarshalMsg(bts[0:0]) + } +} + +func BenchmarkUnmarshalSingleLeafProof(b *testing.B) { + v := SingleLeafProof{} + bts := v.MarshalMsg(nil) + b.ReportAllocs() + b.SetBytes(int64(len(bts))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := v.UnmarshalMsg(bts) + if err != nil { + b.Fatal(err) + } + } +} + +func TestMarshalUnmarshalTree(t *testing.T) { + partitiontest.PartitionTest(t) + v := Tree{} + bts := v.MarshalMsg(nil) + left, err := v.UnmarshalMsg(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) + } + + left, err = msgp.Skip(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after Skip(): %q", len(left), left) + } +} + +func TestRandomizedEncodingTree(t *testing.T) { + protocol.RunEncodingTest(t, &Tree{}) +} + +func BenchmarkMarshalMsgTree(b *testing.B) { + v := Tree{} + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.MarshalMsg(nil) + } +} + +func BenchmarkAppendMsgTree(b *testing.B) { + v := Tree{} + bts := make([]byte, 0, v.Msgsize()) + bts = v.MarshalMsg(bts[0:0]) + b.SetBytes(int64(len(bts))) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + bts = v.MarshalMsg(bts[0:0]) + } +} + +func BenchmarkUnmarshalTree(b *testing.B) { + v := Tree{} + bts := v.MarshalMsg(nil) + b.ReportAllocs() + b.SetBytes(int64(len(bts))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := v.UnmarshalMsg(bts) + if err != nil { + b.Fatal(err) + } + } +} diff --git a/crypto/merklearray/partial.go b/crypto/merklearray/partial.go index d40d6f1d2d..c8e62f4dd0 100644 --- a/crypto/merklearray/partial.go +++ b/crypto/merklearray/partial.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -18,6 +18,7 @@ package merklearray import ( "fmt" + "hash" "github.com/algorand/go-algorand/crypto" ) @@ -28,15 +29,15 @@ import ( // or use the set of sibling hints, if tree is nil. type siblings struct { tree *Tree - hints []crypto.Digest + hints []crypto.GenericDigest } // get returns the sibling from tree level l (0 being the leaves) // position i. -func (s *siblings) get(l uint64, i uint64) (res crypto.Digest, err error) { +func (s *siblings) get(l uint64, i uint64) (res crypto.GenericDigest, err error) { if s.tree == nil { if len(s.hints) > 0 { - res = s.hints[0] + res = s.hints[0].ToSlice() s.hints = s.hints[1:] return } @@ -45,31 +46,32 @@ func (s *siblings) get(l uint64, i uint64) (res crypto.Digest, err error) { return } - if l >= uint64(len(s.tree.levels)) { - err = fmt.Errorf("level %d beyond tree height %d", l, len(s.tree.levels)) + if l >= uint64(len(s.tree.Levels)) { + err = fmt.Errorf("level %d beyond tree height %d", l, len(s.tree.Levels)) return } - if i < uint64(len(s.tree.levels[l])) { - res = s.tree.levels[l][i] + if i < uint64(len(s.tree.Levels[l])) { + res = s.tree.Levels[l][i] } s.hints = append(s.hints, res) return } -// partialLayer represents a subset of a layer (i.e., nodes at some +// partialLayer represents a subset of a Layer (i.e., nodes at some // level in the Merkle tree). layerItem represents one element in the -// partial layer. +// partial Layer. +//msgp:ignore partialLayer type partialLayer []layerItem type layerItem struct { pos uint64 - hash crypto.Digest + hash crypto.GenericDigest } -// up takes a partial layer at level l, and returns the next-higher (partial) -// level in the tree. Since the layer is partial, up() requires siblings. +// up takes a partial Layer at level l, and returns the next-higher (partial) +// level in the tree. Since the Layer is partial, up() requires siblings. // // The implementation is deterministic to ensure that up() asks for siblings // in the same order both when generating a proof, as well as when checking @@ -77,7 +79,7 @@ type layerItem struct { // // If doHash is false, fill in zero hashes, which suffices for constructing // a proof. -func (pl partialLayer) up(s *siblings, l uint64, doHash bool) (partialLayer, error) { +func (pl partialLayer) up(s *siblings, l uint64, doHash bool, hsh hash.Hash) (partialLayer, error) { var res partialLayer for i := 0; i < len(pl); i++ { item := pl[i] @@ -85,9 +87,9 @@ func (pl partialLayer) up(s *siblings, l uint64, doHash bool) (partialLayer, err posHash := item.hash siblingPos := pos ^ 1 - var siblingHash crypto.Digest + var siblingHash crypto.GenericDigest if i+1 < len(pl) && pl[i+1].pos == siblingPos { - // If our sibling is also in the partial layer, use its + // If our sibling is also in the partial Layer, use its // hash (and skip over its position). siblingHash = pl[i+1].hash i++ @@ -101,10 +103,11 @@ func (pl partialLayer) up(s *siblings, l uint64, doHash bool) (partialLayer, err } nextLayerPos := pos / 2 - var nextLayerHash crypto.Digest + var nextLayerHash crypto.GenericDigest if doHash { var p pair + p.hashDigestSize = hsh.Size() if pos&1 == 0 { // We are left p.l = posHash @@ -114,7 +117,7 @@ func (pl partialLayer) up(s *siblings, l uint64, doHash bool) (partialLayer, err p.l = siblingHash p.r = posHash } - nextLayerHash = p.Hash() + nextLayerHash = crypto.GenericHashObj(hsh, &p) } res = append(res, layerItem{ diff --git a/crypto/merklearray/proof.go b/crypto/merklearray/proof.go new file mode 100644 index 0000000000..ed05b76e66 --- /dev/null +++ b/crypto/merklearray/proof.go @@ -0,0 +1,98 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package merklearray + +import ( + "github.com/algorand/go-algorand/crypto" +) + +// Proof is used to convince a verifier about membership of leaves: h0,h1...hn +// at indexes i0,i1...in on a tree. The verifier has a trusted value of the tree +// root hash. +type Proof struct { + _struct struct{} `codec:",omitempty,omitemptyarray"` + + // Path is bounded by MaxNumLeavesOnEncodedTree since there could be multiple reveals, and + // given the distribution of the elt positions and the depth of the tree, + // the path length can increase up to 2^MaxEncodedTreeDepth / 2 + Path []crypto.GenericDigest `codec:"pth,allocbound=MaxNumLeavesOnEncodedTree/2"` + HashFactory crypto.HashFactory `codec:"hsh"` + // TreeDepth represents the depth of the tree that is being proven. + // It is the number of edges from the root to a leaf. + TreeDepth uint8 `codec:"td"` +} + +// SingleLeafProof is used to convince a verifier about membership of a specific +// leaf h at index i on a tree. The verifier has a trusted value of the tree +// root hash. it corresponds to merkle verification path. +type SingleLeafProof struct { + _struct struct{} `codec:",omitempty,omitemptyarray"` + + Proof +} + +// GetFixedLengthHashableRepresentation serializes the proof into a sequence of bytes. +// it basically concatenates the elements of the verification path one after another. +// The function returns a fixed length array for each hash function. which is 1 + MaxEncodedTreeDepth * digestsize +// +// the path is guaranteed to be less than MaxEncodedTreeDepth and if the path length is less +// than MaxEncodedTreeDepth, array will have leading zeros (to fill the array to MaxEncodedTreeDepth * digestsize). +// more details could be found in the Algorand's spec. +func (p *SingleLeafProof) GetFixedLengthHashableRepresentation() []byte { + hash := p.HashFactory.NewHash() + + var binProof = make([]byte, 0, 1+(MaxEncodedTreeDepth*hash.Size())) + + proofLenByte := p.TreeDepth + binProof = append(binProof, proofLenByte) + + zeroDigest := make([]byte, hash.Size()) + + for i := uint8(0); i < (MaxEncodedTreeDepth - proofLenByte); i++ { + binProof = append(binProof, zeroDigest...) + } + + for i := uint8(0); i < proofLenByte; i++ { + if i < proofLenByte && p.Path[i] != nil { + binProof = append(binProof, p.Path[i]...) + } else { + binProof = append(binProof, zeroDigest...) + } + } + + return binProof +} + +// ToProof export a Proof from a SingleProof. The result is +// used as an input for merklearray.Verify or merklearray.VerifyVectorCommitment +func (p *SingleLeafProof) ToProof() *Proof { + return &p.Proof +} + +// GetConcatenatedProof concats the verification path to a single slice +// This function converts an empty element in the path (i.e occurs when the tree is not a full tree) +// into a sequence of digest result of zero. +func (p *SingleLeafProof) GetConcatenatedProof() []byte { + digestSize := p.HashFactory.NewHash().Size() + proofconcat := make([]byte, digestSize*int(p.TreeDepth)) + for i := 0; i < int(p.TreeDepth); i++ { + if p.Path[i] != nil { + copy(proofconcat[i*digestSize:(i+1)*digestSize], p.Path[i]) + } + } + return proofconcat +} diff --git a/crypto/merklearray/proof_test.go b/crypto/merklearray/proof_test.go new file mode 100644 index 0000000000..547268515a --- /dev/null +++ b/crypto/merklearray/proof_test.go @@ -0,0 +1,216 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package merklearray + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/test/partitiontest" +) + +func TestProofSerialization(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + array := make(TestArray, 3) + for i := uint64(0); i < 3; i++ { + crypto.RandBytes(array[i][:]) + } + + tree, err := Build(array, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + + // creates a proof with missing child + p, err := tree.ProveSingleLeaf(2) + a.NoError(err) + + data := p.GetFixedLengthHashableRepresentation() + a.Equal(len(data), 1+(MaxEncodedTreeDepth*crypto.Sha512_256Size)) + + // check the padded results + zeroDigest := make([]byte, crypto.Sha512_256Size) + i := 0 + proofData := data[1:] + for ; i < (MaxEncodedTreeDepth - 2); i++ { + a.Equal(zeroDigest, proofData[crypto.Sha512_256Size*i:crypto.Sha512_256Size*(i+1)]) + } + + // first proof digest is nil -> so the HashableRepresentation is zeros + a.Equal(crypto.GenericDigest(nil), p.Path[0]) + a.Equal(zeroDigest, proofData[crypto.Sha512_256Size*i:crypto.Sha512_256Size*(i+1)]) + i++ + + a.Equal([]byte(p.Path[1]), proofData[crypto.Sha512_256Size*i:crypto.Sha512_256Size*(i+1)]) + + //VC + tree, err = BuildVectorCommitmentTree(array, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + + // creates a proof with missing child + p, err = tree.ProveSingleLeaf(2) + a.NoError(err) + + data = p.GetFixedLengthHashableRepresentation() + a.Equal(len(data), 1+(MaxEncodedTreeDepth*crypto.Sha512_256Size)) + + // check the padded results + zeroDigest = make([]byte, crypto.Sha512_256Size) + i = 0 + proofData = data[1:] + for ; i < (MaxEncodedTreeDepth - 2); i++ { + a.Equal(zeroDigest, proofData[crypto.Sha512_256Size*i:crypto.Sha512_256Size*(i+1)]) + } + + a.Equal([]byte(p.Path[0]), proofData[crypto.Sha512_256Size*i:crypto.Sha512_256Size*(i+1)]) + i++ + a.Equal([]byte(p.Path[1]), proofData[crypto.Sha512_256Size*i:crypto.Sha512_256Size*(i+1)]) + +} + +func TestProofSerializationMaxTree(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + array := make(TestArray, MaxNumLeavesOnEncodedTree) + for i := uint64(0); i < MaxNumLeavesOnEncodedTree; i++ { + crypto.RandBytes(array[i][:]) + } + + tree, err := BuildVectorCommitmentTree(array, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + + p, err := tree.ProveSingleLeaf(2) + a.NoError(err) + + data := p.GetFixedLengthHashableRepresentation() + a.Equal(len(data), 1+(MaxEncodedTreeDepth*crypto.Sha512_256Size)) + + proofData := data[1:] + for i := 0; i < MaxEncodedTreeDepth; i++ { + a.Equal([]byte(p.Path[i]), proofData[crypto.Sha512_256Size*i:crypto.Sha512_256Size*(i+1)]) + } +} + +func TestProofSerializationOneLeafTree(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + array := make(TestArray, 1) + crypto.RandBytes(array[0][:]) + + tree, err := BuildVectorCommitmentTree(array, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + + p, err := tree.ProveSingleLeaf(0) + a.NoError(err) + + data := p.GetFixedLengthHashableRepresentation() + a.Equal(len(data), 1+(MaxEncodedTreeDepth*crypto.Sha512_256Size)) + + zeroDigest := make([]byte, crypto.Sha512_256Size) + + proofData := data[1:] + for i := 0; i < MaxEncodedTreeDepth; i++ { + a.Equal(zeroDigest, proofData[crypto.Sha512_256Size*i:crypto.Sha512_256Size*(i+1)]) + } + +} + +func TestConcatenatedProofsMissingChild(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + array := make(TestArray, 7) + for i := 0; i < 7; i++ { + crypto.RandBytes(array[i][:]) + } + + tree, err := Build(array, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + + p, err := tree.ProveSingleLeaf(6) + a.NoError(err) + + newP := SingleLeafProof{Proof: Proof{TreeDepth: p.TreeDepth, Path: []crypto.GenericDigest{}, HashFactory: p.HashFactory}} + + computedPath := recomputePath(p) + + newP.Path = computedPath + err = Verify(tree.Root(), map[uint64]crypto.Hashable{6: array[6]}, newP.ToProof()) + a.NoError(err) +} + +func TestConcatenatedProofsFullTree(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + array := make(TestArray, 8) + for i := 0; i < 8; i++ { + crypto.RandBytes(array[i][:]) + } + + tree, err := Build(array, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + + p, err := tree.ProveSingleLeaf(6) + a.NoError(err) + + newP := SingleLeafProof{Proof: Proof{TreeDepth: p.TreeDepth, Path: []crypto.GenericDigest{}, HashFactory: p.HashFactory}} + + computedPath := recomputePath(p) + + newP.Path = computedPath + err = Verify(tree.Root(), map[uint64]crypto.Hashable{6: array[6]}, newP.ToProof()) + a.NoError(err) +} + +func TestConcatenatedProofsOneLeaf(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + array := make(TestArray, 1) + crypto.RandBytes(array[0][:]) + + tree, err := Build(array, crypto.HashFactory{HashType: crypto.Sha512_256}) + a.NoError(err) + + p, err := tree.ProveSingleLeaf(0) + a.NoError(err) + + newP := SingleLeafProof{Proof: Proof{TreeDepth: p.TreeDepth, Path: []crypto.GenericDigest{}, HashFactory: p.HashFactory}} + + computedPath := recomputePath(p) + + newP.Path = computedPath + err = Verify(tree.Root(), map[uint64]crypto.Hashable{0: array[0]}, newP.ToProof()) + a.NoError(err) +} + +func recomputePath(p *SingleLeafProof) []crypto.GenericDigest { + var computedPath []crypto.GenericDigest + proofconcat := p.GetConcatenatedProof() + for len(proofconcat) > 0 { + var d crypto.Digest + copy(d[:], proofconcat) + computedPath = append(computedPath, d[:]) + proofconcat = proofconcat[len(d):] + } + return computedPath +} diff --git a/crypto/merklearray/vectorCommitmentArray.go b/crypto/merklearray/vectorCommitmentArray.go new file mode 100644 index 0000000000..a9f9b3580c --- /dev/null +++ b/crypto/merklearray/vectorCommitmentArray.go @@ -0,0 +1,83 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package merklearray + +import ( + "errors" + "fmt" + "math/bits" + + "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/protocol" +) + +// ErrGetOutOfBound returned when trying to retrieve an element which is out of the padded array bound. +var ( + ErrGetOutOfBound = errors.New("can't get element out of padded array bound") +) + +type vectorCommitmentArray struct { + array Array + pathLen uint8 + paddedLen uint64 +} + +type bottomElement struct{} + +func (b *bottomElement) ToBeHashed() (protocol.HashID, []byte) { + return protocol.MerkleVectorCommitmentBottomLeaf, []byte{} +} + +func generateVectorCommitmentArray(innerArray Array) *vectorCommitmentArray { + arrayLen := innerArray.Length() + if arrayLen == 0 || arrayLen == 1 { + return &vectorCommitmentArray{array: innerArray, pathLen: 1, paddedLen: 1} + } + + path := uint8(bits.Len64(arrayLen - 1)) + fullSize := uint64(1 << path) + return &vectorCommitmentArray{array: innerArray, pathLen: path, paddedLen: fullSize} +} + +func (vc *vectorCommitmentArray) Length() uint64 { + return vc.paddedLen +} + +func (vc *vectorCommitmentArray) Marshal(pos uint64) (crypto.Hashable, error) { + lsbIndex, err := merkleTreeToVectorCommitmentIndex(pos, vc.pathLen) + if err != nil { + return nil, err + } + if lsbIndex >= vc.paddedLen { + return nil, fmt.Errorf("vectorCommitmentArray.Get(%d): out of bounds, full size %d: %w", pos, vc.paddedLen, ErrGetOutOfBound) + } + + if lsbIndex < vc.array.Length() { + return vc.array.Marshal(lsbIndex) + } + + return &bottomElement{}, nil +} + +// merkleTreeToVectorCommitmentIndex Translate an index of an element on a merkle tree to an index on the vector commitment. +// The given index must be within the range of the elements in the tree (assume this number is 1^pathLen) +func merkleTreeToVectorCommitmentIndex(msbIndex uint64, pathLen uint8) (uint64, error) { + if msbIndex >= (1 << pathLen) { + return 0, fmt.Errorf("msbIndex %d >= 1^pathLen %d: %w", msbIndex, 1<> (64 - pathLen), nil +} diff --git a/crypto/merklearray/vectorCommitmentArray_test.go b/crypto/merklearray/vectorCommitmentArray_test.go new file mode 100644 index 0000000000..d3a4ae0652 --- /dev/null +++ b/crypto/merklearray/vectorCommitmentArray_test.go @@ -0,0 +1,206 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package merklearray + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/protocol" + "github.com/algorand/go-algorand/test/partitiontest" +) + +func indexTranslate(t *testing.T, from, to uint64, pathLen uint8) { + lsbIndex, err := merkleTreeToVectorCommitmentIndex(from, pathLen) + require.NoError(t, err) + require.Equal(t, to, lsbIndex) +} + +func TestIndexing(t *testing.T) { + partitiontest.PartitionTest(t) + + var pathLen uint8 + + pathLen = 1 + indexTranslate(t, 0, 0, pathLen) + indexTranslate(t, 1, 1, pathLen) + + pathLen = 2 + indexTranslate(t, 0, 0, pathLen) + indexTranslate(t, 1, 2, pathLen) + indexTranslate(t, 2, 1, pathLen) + indexTranslate(t, 3, 3, pathLen) + + pathLen = 3 + indexTranslate(t, 0, 0, pathLen) + indexTranslate(t, 1, 4, pathLen) + indexTranslate(t, 2, 2, pathLen) + indexTranslate(t, 3, 6, pathLen) + indexTranslate(t, 4, 1, pathLen) + indexTranslate(t, 5, 5, pathLen) + indexTranslate(t, 6, 3, pathLen) + indexTranslate(t, 7, 7, pathLen) + + pathLen = 4 + indexTranslate(t, 0, 0, pathLen) + indexTranslate(t, 1, 8, pathLen) + indexTranslate(t, 2, 4, pathLen) + indexTranslate(t, 3, 12, pathLen) + indexTranslate(t, 4, 2, pathLen) + indexTranslate(t, 5, 10, pathLen) + indexTranslate(t, 6, 6, pathLen) + indexTranslate(t, 7, 14, pathLen) + indexTranslate(t, 8, 1, pathLen) + indexTranslate(t, 9, 9, pathLen) + indexTranslate(t, 10, 5, pathLen) + indexTranslate(t, 11, 13, pathLen) + indexTranslate(t, 12, 3, pathLen) + indexTranslate(t, 13, 11, pathLen) + indexTranslate(t, 14, 7, pathLen) + indexTranslate(t, 15, 15, pathLen) + + pathLen = 63 + indexTranslate(t, 0, 0, pathLen) + indexTranslate(t, (1<<63)/2, 1, pathLen) + indexTranslate(t, 1, (1<<63)/2, pathLen) + indexTranslate(t, 1<<63-1, 1<<63-1, pathLen) + +} + +func vcSizeInnerTest(size uint64) *vectorCommitmentArray { + testArray := make(TestArray, size) + for i := uint64(0); i < size; i++ { + crypto.RandBytes(testArray[i][:]) + } + return generateVectorCommitmentArray(testArray) +} + +func TestIndexOutOfBounds(t *testing.T) { + partitiontest.PartitionTest(t) + + var pathLen uint8 + + pathLen = 1 + lsbIndex, err := merkleTreeToVectorCommitmentIndex(0, pathLen) + require.NoError(t, err) + require.Equal(t, uint64(0), lsbIndex) + + lsbIndex, err = merkleTreeToVectorCommitmentIndex(1, pathLen) + require.NoError(t, err) + require.Equal(t, uint64(1), lsbIndex) + + lsbIndex, err = merkleTreeToVectorCommitmentIndex(2, pathLen) + require.Error(t, err) + require.ErrorIs(t, err, ErrPosOutOfBound) + + pathLen = 4 + lsbIndex, err = merkleTreeToVectorCommitmentIndex(15, pathLen) + require.NoError(t, err) + require.Equal(t, uint64(15), lsbIndex) + + lsbIndex, err = merkleTreeToVectorCommitmentIndex(16, pathLen) + require.Error(t, err) + require.ErrorIs(t, err, ErrPosOutOfBound) + +} + +func TestVcSizes(t *testing.T) { + partitiontest.PartitionTest(t) + + var vc *vectorCommitmentArray + vc = vcSizeInnerTest(0) + require.Equal(t, uint8(1), vc.pathLen) + require.Equal(t, uint64(1), vc.paddedLen) + require.Equal(t, uint64(1), vc.Length()) + + vc = vcSizeInnerTest(1) + require.Equal(t, uint8(1), vc.pathLen) + require.Equal(t, uint64(1), vc.paddedLen) + require.Equal(t, uint64(1), vc.Length()) + + vc = vcSizeInnerTest(2) + require.Equal(t, uint8(1), vc.pathLen) + require.Equal(t, uint64(2), vc.paddedLen) + require.Equal(t, uint64(2), vc.Length()) + + vc = vcSizeInnerTest(3) + require.Equal(t, uint8(2), vc.pathLen) + require.Equal(t, uint64(4), vc.paddedLen) + require.Equal(t, uint64(4), vc.Length()) + + vc = vcSizeInnerTest(4) + require.Equal(t, uint8(2), vc.pathLen) + require.Equal(t, uint64(4), vc.paddedLen) + require.Equal(t, uint64(4), vc.Length()) + + vc = vcSizeInnerTest(5) + require.Equal(t, uint8(3), vc.pathLen) + require.Equal(t, uint64(8), vc.paddedLen) + require.Equal(t, uint64(8), vc.Length()) + + vc = vcSizeInnerTest(9) + require.Equal(t, uint8(4), vc.pathLen) + require.Equal(t, uint64(16), vc.paddedLen) + require.Equal(t, uint64(16), vc.Length()) + + vc = vcSizeInnerTest(15) + require.Equal(t, uint8(4), vc.pathLen) + require.Equal(t, uint64(16), vc.paddedLen) + require.Equal(t, uint64(16), vc.Length()) + + vc = vcSizeInnerTest(16) + require.Equal(t, uint8(4), vc.pathLen) + require.Equal(t, uint64(16), vc.paddedLen) + require.Equal(t, uint64(16), vc.Length()) + + vc = vcSizeInnerTest(17) + require.Equal(t, uint8(5), vc.pathLen) + require.Equal(t, uint64(32), vc.paddedLen) + require.Equal(t, uint64(32), vc.Length()) +} + +func TestVcArrayPadding(t *testing.T) { + partitiontest.PartitionTest(t) + + testArray := make(TestArray, 11) + for i := uint64(0); i < 11; i++ { + crypto.RandBytes(testArray[i][:]) + } + vc := generateVectorCommitmentArray(testArray) + + h := crypto.HashFactory{HashType: crypto.Sha512_256}.NewHash() + leafBytes := make([]byte, len(protocol.Message)+h.Size()) + copy(leafBytes, protocol.Message) + copy(leafBytes[len(protocol.Message):], testArray[1][:]) + h.Reset() + h.Write(leafBytes) + leafHash := h.Sum(nil) + + idx, err := merkleTreeToVectorCommitmentIndex(1, 4) + require.NoError(t, err) + leafVc, err := vc.Marshal(idx) + hashID, leafData := leafVc.ToBeHashed() + h.Reset() + h.Write([]byte(hashID)) + h.Write(leafData) + leafVcHash := h.Sum(nil) + + require.NoError(t, err) + require.Equal(t, leafHash, leafVcHash) +} diff --git a/crypto/merklearray/worker.go b/crypto/merklearray/worker.go index 67f6aa0c50..e7a4dc2228 100644 --- a/crypto/merklearray/worker.go +++ b/crypto/merklearray/worker.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -68,11 +68,6 @@ func (ws *workerState) next(delta uint64) uint64 { return atomic.AddUint64(&ws.nextidx, delta) - delta } -// When a worker is about to exit, it should call done. -func (ws *workerState) done() { - ws.wg.Done() -} - // wait waits for all of the workers to finish. func (ws *workerState) wait() { ws.wg.Wait() diff --git a/crypto/merklesignature/committablePublicKeys.go b/crypto/merklesignature/committablePublicKeys.go new file mode 100644 index 0000000000..1c2c44736d --- /dev/null +++ b/crypto/merklesignature/committablePublicKeys.go @@ -0,0 +1,87 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package merklesignature + +import ( + "encoding/binary" + "errors" + "fmt" + + "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/protocol" +) + +type ( + // committablePublicKeyArray used to arrange the keys so a merkle tree could be build on them. + //msgp:ignore committablePublicKeyArray + committablePublicKeyArray struct { + keys []crypto.FalconSigner + firstValid uint64 + interval uint64 + } + + // CommittablePublicKey is used to create a binary representation of public keys in the merkle + // signature scheme. + CommittablePublicKey struct { + VerifyingKey crypto.FalconVerifier + Round uint64 + } +) + +// ErrIndexOutOfBound returned when an index is out of the array's bound +var ErrIndexOutOfBound = errors.New("index is out of bound") + +// Length returns the number of elements in the key array +func (k *committablePublicKeyArray) Length() uint64 { + return uint64(len(k.keys)) +} + +// Marshal Gets []byte to represent a GenericVerifyingKey tied to the signatureAlgorithm in a pos. +// used to implement the merklearray.Array interface needed to build a tree. +func (k *committablePublicKeyArray) Marshal(pos uint64) (crypto.Hashable, error) { + if pos >= uint64(len(k.keys)) { + return nil, fmt.Errorf("%w: pos %d past end %d", ErrIndexOutOfBound, pos, len(k.keys)) + } + + ephPK := CommittablePublicKey{ + VerifyingKey: *k.keys[pos].GetVerifyingKey(), + Round: indexToRound(k.firstValid, k.interval, pos), + } + + return &ephPK, nil +} + +// ToBeHashed returns the sequence of bytes that would be used as an input for the hash function when creating a merkle tree. +// In order to create a more SNARK-friendly commitment we must avoid using the msgpack infrastructure. +// msgpack creates a compressed representation of the struct which might be varied in length, this will +// be bad for creating SNARK +func (e *CommittablePublicKey) ToBeHashed() (protocol.HashID, []byte) { + verifyingRawKey := e.VerifyingKey.GetFixedLengthHashableRepresentation() + + roundAsBytes := make([]byte, 8) + binary.LittleEndian.PutUint64(roundAsBytes, e.Round) + + schemeAsBytes := make([]byte, 2) + binary.LittleEndian.PutUint16(schemeAsBytes, CryptoPrimitivesID) + + keyCommitment := make([]byte, 0, len(schemeAsBytes)+len(verifyingRawKey)+len(roundAsBytes)) + keyCommitment = append(keyCommitment, schemeAsBytes...) + keyCommitment = append(keyCommitment, roundAsBytes...) + keyCommitment = append(keyCommitment, verifyingRawKey...) + + return protocol.KeysInMSS, keyCommitment +} diff --git a/crypto/merklesignature/committablePublicKeys_test.go b/crypto/merklesignature/committablePublicKeys_test.go new file mode 100644 index 0000000000..b2718f3e14 --- /dev/null +++ b/crypto/merklesignature/committablePublicKeys_test.go @@ -0,0 +1,96 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package merklesignature + +import ( + "encoding/binary" + "hash" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/protocol" + "github.com/algorand/go-algorand/test/partitiontest" +) + +func hashBytes(hash hash.Hash, m []byte) []byte { + hash.Reset() + hash.Write(m) + outhash := hash.Sum(nil) + return outhash +} + +func calculateHashOnKeyLeaf(key *crypto.FalconSigner, round uint64) []byte { + binaryRound := make([]byte, 8) + binary.LittleEndian.PutUint64(binaryRound, round) + + schemeBytes := make([]byte, 2) + binary.LittleEndian.PutUint16(schemeBytes, CryptoPrimitivesID) + + verifyingRawKey := key.GetVerifyingKey().GetFixedLengthHashableRepresentation() + keyCommitment := make([]byte, 0, len(protocol.KeysInMSS)+len(verifyingRawKey)+len(binaryRound)) + + keyCommitment = append(keyCommitment, protocol.KeysInMSS...) + keyCommitment = append(keyCommitment, schemeBytes...) + keyCommitment = append(keyCommitment, binaryRound...) + keyCommitment = append(keyCommitment, verifyingRawKey...) + + factory := crypto.HashFactory{HashType: MerkleSignatureSchemeHashFunction} + + hashValue := hashBytes(factory.NewHash(), keyCommitment) + return hashValue +} + +func calculateHashOnInternalNode(leftNode, rightNode []byte) []byte { + buf := make([]byte, len(leftNode)+len(rightNode)+len(protocol.MerkleArrayNode)) + copy(buf[:], protocol.MerkleArrayNode) + copy(buf[len(protocol.MerkleArrayNode):], leftNode[:]) + copy(buf[len(protocol.MerkleArrayNode)+len(leftNode):], rightNode[:]) + + factory := crypto.HashFactory{HashType: MerkleSignatureSchemeHashFunction} + hashValue := hashBytes(factory.NewHash(), buf) + return hashValue +} + +func TestEphemeralPublicKeysCommitmentBinaryFormat(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + signer := generateTestSigner(1, 9, 2, a) + a.Equal(4, length(signer, a)) + + k0 := signer.GetSigner(2).SigningKey + + k0hash := calculateHashOnKeyLeaf(k0, 2) + + k1 := signer.GetSigner(4).SigningKey + k1hash := calculateHashOnKeyLeaf(k1, 4) + + k2 := signer.GetSigner(6).SigningKey + k2hash := calculateHashOnKeyLeaf(k2, 6) + + k3 := signer.GetSigner(8).SigningKey + k3hash := calculateHashOnKeyLeaf(k3, 8) + + // hash internal node according to the vector commitment indices + internal1 := calculateHashOnInternalNode(k0hash, k2hash) + internal2 := calculateHashOnInternalNode(k1hash, k3hash) + + root := calculateHashOnInternalNode(internal1, internal2) + a.Equal(root, signer.GetVerifier()[:]) +} diff --git a/network/wsNetwork_windows.go b/crypto/merklesignature/const.go similarity index 69% rename from network/wsNetwork_windows.go rename to crypto/merklesignature/const.go index eef416d3ec..d8457ad7b2 100644 --- a/network/wsNetwork_windows.go +++ b/crypto/merklesignature/const.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -14,10 +14,12 @@ // You should have received a copy of the GNU Affero General Public License // along with go-algorand. If not, see . -// +build windows +package merklesignature -package network +import "github.com/algorand/go-algorand/crypto" -func (wn *WebsocketNetwork) rlimitIncomingConnections() error { - return nil -} +// HashType/ hashSize relate to the type of hash this package uses. +const ( + MerkleSignatureSchemeHashFunction = crypto.Sumhash + MerkleSignatureSchemeRootSize = crypto.SumhashDigestSize +) diff --git a/crypto/merklesignature/keysBuilder.go b/crypto/merklesignature/keysBuilder.go new file mode 100644 index 0000000000..93553e7d5e --- /dev/null +++ b/crypto/merklesignature/keysBuilder.go @@ -0,0 +1,96 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package merklesignature + +import ( + "context" + "runtime" + "sync" + + "github.com/algorand/go-algorand/crypto" +) + +// KeysBuilder Responsible for generate slice of falcon keys +func KeysBuilder(numberOfKeys uint64) ([]crypto.FalconSigner, error) { + numOfKeysPerRoutine, _ := calculateRanges(numberOfKeys) + + ctx, ctxCancel := context.WithCancel(context.Background()) + defer ctxCancel() + + errors := make(chan error, 1) + defer close(errors) + + var wg sync.WaitGroup + var endIdx uint64 + keys := make([]crypto.FalconSigner, numberOfKeys) + + for i := uint64(0); i < numberOfKeys; i = endIdx { + endIdx = i + numOfKeysPerRoutine + // in case the number of workers is not equally divides the number of keys + // we want the last worker take care of them. + if endIdx+numOfKeysPerRoutine > numberOfKeys { + endIdx = numberOfKeys + } + + wg.Add(1) + go func(startIdx, endIdx uint64, keys []crypto.FalconSigner) { + defer wg.Done() + if err := generateKeysForRange(ctx, startIdx, endIdx, keys); err != nil { + // write to the error channel, if it's not full already. + select { + case errors <- err: + default: + } + ctxCancel() + } + }(i, endIdx, keys) + } + // wait until all the go-routines are over. + wg.Wait() + + select { + case err := <-errors: + return []crypto.FalconSigner{}, err + default: + } + return keys, nil +} + +func calculateRanges(numberOfKeys uint64) (numOfKeysPerRoutine uint64, numOfRoutines uint64) { + numOfRoutines = uint64(runtime.NumCPU() * 2) + + if numberOfKeys > numOfRoutines { + numOfKeysPerRoutine = numberOfKeys / numOfRoutines + } else { + numOfKeysPerRoutine = 1 + } + return +} + +func generateKeysForRange(ctx context.Context, startIdx uint64, endIdx uint64, keys []crypto.FalconSigner) error { + for k := startIdx; k < endIdx; k++ { + if ctx.Err() != nil { + break + } + sigAlgo, err := crypto.NewFalconSigner() + if err != nil { + return err + } + keys[k] = *sigAlgo + } + return nil +} diff --git a/crypto/merklesignature/keysBuilder_test.go b/crypto/merklesignature/keysBuilder_test.go new file mode 100644 index 0000000000..29b96b598e --- /dev/null +++ b/crypto/merklesignature/keysBuilder_test.go @@ -0,0 +1,76 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package merklesignature + +import ( + "runtime" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/algorand/go-algorand/test/partitiontest" +) + +func TestBuilderSanity(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + numOfKeys := uint64(100) + keys, err := KeysBuilder(numOfKeys) + a.NoError(err) + a.Equal(uint64(len(keys)), numOfKeys) + + s, err := keys[0].SignBytes([]byte{0}) + v := keys[0].GetVerifyingKey() + err = v.VerifyBytes([]byte{0}, s) + a.NoError(err) +} + +func TestBuilderFitsToCPUs(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + numOfKeys := uint64(runtime.NumCPU() * 2) + keys, err := KeysBuilder(numOfKeys) + a.NoError(err) + a.Equal(numOfKeys, uint64(len(keys))) + +} + +func TestBuilderOneKey(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + numOfKeys := uint64(1) + keys, err := KeysBuilder(numOfKeys) + a.NoError(err) + a.Equal(numOfKeys, uint64(len(keys))) +} + +func TestBuilderZeroKeys(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + numOfKeys := uint64(0) + keys, err := KeysBuilder(numOfKeys) + a.NoError(err) + a.Equal(numOfKeys, uint64(len(keys))) +} + +func BenchmarkMerkleSignatureSchemeGenerate(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + New(0, 3000000, 256) + } +} diff --git a/crypto/merklesignature/merkleSignatureScheme.go b/crypto/merklesignature/merkleSignatureScheme.go new file mode 100644 index 0000000000..983cd859d1 --- /dev/null +++ b/crypto/merklesignature/merkleSignatureScheme.go @@ -0,0 +1,278 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package merklesignature + +import ( + "encoding/binary" + "errors" + "fmt" + + "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/crypto/merklearray" +) + +type ( + // Signature represents a signature in the merkle signature scheme using falcon signatures as an underlying crypto scheme. + // It consists of an ephemeral public key, a signature, a merkle verification path and an index. + // The merkle signature considered valid only if the Signature is verified under the ephemeral public key and + // the Merkle verification path verifies that the ephemeral public key is located at the given index of the tree + // (for the root given in the long-term public key). + // More details can be found on Algorand's spec + Signature struct { + _struct struct{} `codec:",omitempty,omitemptyarray"` + + Signature crypto.FalconSignature `codec:"sig"` + MerkleArrayIndex uint64 `codec:"idx"` + Proof merklearray.SingleLeafProof `codec:"prf"` + VerifyingKey crypto.FalconVerifier `codec:"vkey"` + } + + // Secrets contains the private data needed by the merkle signature scheme. + Secrets struct { + _struct struct{} `codec:",omitempty,omitemptyarray"` + + // these keys should be temporarily stored in memory until Persist is called, + // in which they will be dumped into database and disposed of. + // non-exported fields to prevent msgpack marshalling + ephemeralKeys []crypto.FalconSigner + + SignerContext + } + + // Signer represents the StateProof signer for a specified round. + //msgp:ignore Signer + Signer struct { + SigningKey *crypto.FalconSigner + + // The round for which this SigningKey is related to + Round uint64 + + SignerContext + } + + // SignerContext contains all the immutable data and metadata related to merklesignature.Secrets (without the secret keys) + SignerContext struct { + _struct struct{} `codec:",omitempty,omitemptyarray"` + + FirstValid uint64 `codec:"fv"` + Interval uint64 `codec:"iv"` + Tree merklearray.Tree `codec:"tree"` + } + + // Verifier is used to verify a merklesignature.Signature produced by merklesignature.Secrets. + Verifier [MerkleSignatureSchemeRootSize]byte + + //KeyRoundPair represents an ephemeral signing key with it's corresponding round + KeyRoundPair struct { + _struct struct{} `codec:",omitempty,omitemptyarray"` + + Round uint64 `codec:"rnd"` + Key *crypto.FalconSigner `codec:"key"` + } +) + +// CryptoPrimitivesID is an identification that the Merkle Signature Scheme uses a subset sum hash function +// and a falcon signature scheme. +var CryptoPrimitivesID = uint16(0) + +// Errors for the merkle signature scheme +var ( + ErrStartBiggerThanEndRound = errors.New("cannot create Merkle Signature Scheme because end round is smaller then start round") + ErrDivisorIsZero = errors.New("received zero Interval") + ErrNoStateProofKeyForRound = errors.New("no stateproof key exists for this round") + ErrSignatureSchemeVerificationFailed = errors.New("merkle signature verification failed") +) + +// New creates secrets needed for the merkle signature scheme. +// This function generates one key for each round within the participation period [firstValid, lastValid] (inclusive bounds) +// which holds round % interval == 0. +// In case firstValid equals zero then signer will generate all keys from (0,Z], i.e will not generate key for round zero. +func New(firstValid, lastValid, interval uint64) (*Secrets, error) { + if firstValid > lastValid { + return nil, ErrStartBiggerThanEndRound + } + if interval == 0 { + return nil, ErrDivisorIsZero + } + + if firstValid == 0 { + firstValid = 1 + } + + // calculates the number of indices from first valid round and up to lastValid. + // writing this explicit calculation to avoid overflow. + numberOfKeys := lastValid/interval - ((firstValid - 1) / interval) + + keys, err := KeysBuilder(numberOfKeys) + if err != nil { + return nil, err + } + tree, err := merklearray.BuildVectorCommitmentTree(&committablePublicKeyArray{keys, firstValid, interval}, crypto.HashFactory{HashType: MerkleSignatureSchemeHashFunction}) + if err != nil { + return nil, err + } + + return &Secrets{ + ephemeralKeys: keys, + SignerContext: SignerContext{ + FirstValid: firstValid, + Interval: interval, + Tree: *tree, + }, + }, nil +} + +// GetVerifier can be used to store the commitment and verifier for this signer. +func (s *Secrets) GetVerifier() *Verifier { + return s.SignerContext.GetVerifier() +} + +// GetVerifier can be used to store the commitment and verifier for this signer. +func (s *SignerContext) GetVerifier() *Verifier { + var ver Verifier + copy(ver[:], s.Tree.Root()) + return &ver +} + +// Sign signs a hash of a given message. The signature is valid on a specific round +func (s *Signer) Sign(hashable crypto.Hashable) (Signature, error) { + key := s.SigningKey + // Possible since there may not be a StateProof key for this specific round + if key == nil { + return Signature{}, ErrNoStateProofKeyForRound + } + + if err := checkMerkleSignatureSchemeParams(s.FirstValid, s.Round, s.Interval); err != nil { + return Signature{}, err + } + + index := s.getMerkleTreeIndex(s.Round) + proof, err := s.Tree.ProveSingleLeaf(index) + if err != nil { + return Signature{}, err + } + + sig, err := s.SigningKey.Sign(hashable) + if err != nil { + return Signature{}, err + } + + return Signature{ + Signature: sig, + Proof: *proof, + VerifyingKey: *s.SigningKey.GetVerifyingKey(), + MerkleArrayIndex: index, + }, nil +} + +// expects valid rounds, i.e round that are bigger than FirstValid. +func (s *Signer) getMerkleTreeIndex(round uint64) uint64 { + return roundToIndex(s.FirstValid, round, s.Interval) +} + +// GetAllKeys returns all stateproof secrets. +// An empty array will be return if no stateproof secrets are found +func (s *Secrets) GetAllKeys() []KeyRoundPair { + NumOfKeys := uint64(len(s.ephemeralKeys)) + keys := make([]KeyRoundPair, NumOfKeys) + for i := uint64(0); i < NumOfKeys; i++ { + keyRound := KeyRoundPair{ + Round: indexToRound(s.SignerContext.FirstValid, s.SignerContext.Interval, i), + Key: &s.ephemeralKeys[i], + } + keys[i] = keyRound + } + return keys +} + +// GetKey retrieves key from memory +// the function return nil if the key does not exists +func (s *Secrets) GetKey(round uint64) *crypto.FalconSigner { + idx := roundToIndex(s.FirstValid, round, s.Interval) + if idx >= uint64(len(s.ephemeralKeys)) || (round%s.Interval) != 0 { + return nil + } + + return &s.ephemeralKeys[idx] +} + +// GetSigner returns the secret keys required for the specified round as well as the rest of the required state proof immutable data +func (s *Secrets) GetSigner(round uint64) *Signer { + return &Signer{ + SigningKey: s.GetKey(round), + Round: round, + SignerContext: s.SignerContext, + } +} + +// IsEmpty returns true if the verifier contains an empty key +func (v *Verifier) IsEmpty() bool { + return *v == [MerkleSignatureSchemeRootSize]byte{} +} + +// Verify verifies that a merklesignature sig is valid, on a specific round, under a given public key +func (v *Verifier) Verify(round uint64, msg crypto.Hashable, sig Signature) error { + + ephkey := CommittablePublicKey{ + VerifyingKey: sig.VerifyingKey, + Round: round, + } + + // verify the merkle tree verification path using the ephemeral public key, the + // verification path and the index. + err := merklearray.VerifyVectorCommitment( + v[:], + map[uint64]crypto.Hashable{sig.MerkleArrayIndex: &ephkey}, + sig.Proof.ToProof(), + ) + if err != nil { + return fmt.Errorf("%w - %v", ErrSignatureSchemeVerificationFailed, err) + } + + // verify that the signature is valid under the ephemeral public key + err = sig.VerifyingKey.Verify(msg, sig.Signature) + if err != nil { + return fmt.Errorf("%w - %v", ErrSignatureSchemeVerificationFailed, err) + } + return nil +} + +// GetFixedLengthHashableRepresentation returns the signature as a hashable byte sequence. +// the format details can be found in the Algorand's spec. +func (s *Signature) GetFixedLengthHashableRepresentation() ([]byte, error) { + schemeType := make([]byte, 2) + binary.LittleEndian.PutUint16(schemeType, CryptoPrimitivesID) + sigBytes, err := s.VerifyingKey.GetSignatureFixedLengthHashableRepresentation(s.Signature) + if err != nil { + return nil, err + } + + verifierBytes := s.VerifyingKey.GetFixedLengthHashableRepresentation() + + binaryMerkleIndex := make([]byte, 8) + binary.LittleEndian.PutUint64(binaryMerkleIndex, s.MerkleArrayIndex) + + proofBytes := s.Proof.GetFixedLengthHashableRepresentation() + + merkleSignatureBytes := make([]byte, 0, len(schemeType)+len(sigBytes)+len(verifierBytes)+len(binaryMerkleIndex)+len(proofBytes)) + merkleSignatureBytes = append(merkleSignatureBytes, schemeType...) + merkleSignatureBytes = append(merkleSignatureBytes, sigBytes...) + merkleSignatureBytes = append(merkleSignatureBytes, verifierBytes...) + merkleSignatureBytes = append(merkleSignatureBytes, binaryMerkleIndex...) + merkleSignatureBytes = append(merkleSignatureBytes, proofBytes...) + return merkleSignatureBytes, nil +} diff --git a/crypto/merklesignature/merkleSignatureScheme_test.go b/crypto/merklesignature/merkleSignatureScheme_test.go new file mode 100644 index 0000000000..ff51639bda --- /dev/null +++ b/crypto/merklesignature/merkleSignatureScheme_test.go @@ -0,0 +1,517 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package merklesignature + +import ( + "crypto/rand" + "errors" + "math" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/crypto/merklearray" + "github.com/algorand/go-algorand/protocol" + "github.com/algorand/go-algorand/test/partitiontest" +) + +type TestingHashable struct { + data []byte +} + +func (s TestingHashable) ToBeHashed() (protocol.HashID, []byte) { + return protocol.TestHashable, s.data +} + +func TestSignerCreation(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + var err error + + h := genHashableForTest() + for i := uint64(1); i < 20; i++ { + signer := generateTestSigner(i, i+1, 1, a) + _, err = signer.GetSigner(i).Sign(h) + a.NoError(err) + } + + testSignerNumKeysLimits := func(firstValid uint64, lastValid uint64, interval uint64, expectedLen int) { + signer := generateTestSigner(firstValid, lastValid, interval, a) + a.Equal(expectedLen, length(signer, a)) + } + + testSignerNumKeysLimits(0, 0, 1, 0) + testSignerNumKeysLimits(0, 1, 1, 1) + testSignerNumKeysLimits(2, 2, 2, 1) + testSignerNumKeysLimits(8, 21, 10, 2) + testSignerNumKeysLimits(8, 20, 10, 2) + testSignerNumKeysLimits(10, 21, 10, 2) + testSignerNumKeysLimits(10, 20, 10, 2) + testSignerNumKeysLimits(11, 20, 10, 1) + + signer := generateTestSigner(2, 2, 2, a) + a.Equal(1, length(signer, a)) + + sig, err := signer.GetSigner(2).Sign(genHashableForTest()) + a.NoError(err) + a.NoError(signer.GetVerifier().Verify(2, genHashableForTest(), sig)) + + signer = generateTestSigner(2, 2, 3, a) + a.Equal(0, length(signer, a)) + _, err = signer.GetSigner(2).Sign(genHashableForTest()) + a.Error(err) + a.ErrorIs(err, ErrNoStateProofKeyForRound) + + signer = generateTestSigner(11, 19, 10, a) + a.Equal(0, length(signer, a)) + _, err = signer.GetSigner(2).Sign(genHashableForTest()) + a.Error(err) + a.ErrorIs(err, ErrNoStateProofKeyForRound) +} + +func TestSignerCreationOutOfBounds(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + _, err := New(8, 4, 1) + a.Error(err) + a.ErrorIs(err, ErrStartBiggerThanEndRound) + + _, err = New(1, 8, 0) + a.Error(err) + a.ErrorIs(err, ErrDivisorIsZero) +} + +func TestEmptyVerifier(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + signer := generateTestSigner(8, 9, 5, a) + // even if there are no keys for that period, the root is not empty + // (part of the vector commitment property). + a.Equal(false, signer.GetVerifier().IsEmpty()) +} + +func TestEmptySigner(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + var err error + + h := genHashableForTest() + signer := generateTestSigner(8, 9, 5, a) + a.Equal(0, length(signer, a)) + + _, err = signer.GetSigner(8).Sign(h) + a.Error(err) + a.ErrorIs(err, ErrNoStateProofKeyForRound) + + _, err = signer.GetSigner(9).Sign(h) + a.Error(err) + a.ErrorIs(err, ErrNoStateProofKeyForRound) +} + +func TestDisposableKeysGeneration(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + signer := generateTestSigner(0, 100, 1, a) + for i := uint64(1); i < 100; i++ { + k := signer.GetKey(i) + a.NotNil(k) + } + + k := signer.GetKey(101) + a.Nil(k) + + signer = generateTestSigner(1000, 1100, 1, a) + for i := uint64(1000); i < 1100; i++ { + k = signer.GetKey(i) + a.NotNil(k) + } + + k = signer.GetKey(999) + a.Nil(k) + + signer = generateTestSigner(1000, 1100, 101, a) + intervalRounds := make([]uint64, 0) + for i := uint64(1000); i <= 1100; i++ { + if i%101 == 0 { + intervalRounds = append(intervalRounds, i) + continue + } + k := signer.GetKey(i) + a.Nil(k) + } +} + +func TestNonEmptyDisposableKeys(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + signer := generateTestSigner(0, 100, 1, a) + + s := crypto.FalconSigner{} + for i := uint64(1); i <= 100; i++ { + key := signer.GetKey(i) + a.NotNil(key) + a.NotEqual(s, key) + } + + signer = generateTestSigner(0, 100, 1, a) + + s = crypto.FalconSigner{} + for i := uint64(1); i <= 100; i++ { + key := signer.GetKey(i) + a.NotNil(key) + a.NotEqual(s, key) + } +} + +func TestSignatureStructure(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + signer := generateTestSigner(50, 100, 1, a) + + hashable := genHashableForTest() + sig, err := signer.GetSigner(51).Sign(hashable) + a.NoError(err) + + key := signer.GetKey(51) + a.NotNil(key) + + a.Equal(sig.VerifyingKey, *key.GetVerifyingKey()) + + proof, err := signer.Tree.ProveSingleLeaf(1) + a.NoError(err) + a.Equal(*proof, sig.Proof) + + a.NotEqual(nil, sig.Signature) +} + +func genHashableForTest() crypto.Hashable { + hashable := TestingHashable{[]byte("test msg")} + + return hashable +} + +func TestSigning(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + start, end := uint64(50), uint64(100) + signer := generateTestSigner(start, end, 1, a) + + hashable := genHashableForTest() + + sig, err := signer.GetSigner(start).Sign(hashable) + a.NoError(err) + a.NoError(signer.GetVerifier().Verify(start, hashable, sig)) + + _, err = signer.GetSigner(start - 1).Sign(hashable) + a.Error(err) + a.ErrorIs(err, ErrNoStateProofKeyForRound) + + _, err = signer.GetSigner(end + 1).Sign(hashable) + a.Error(err) + a.ErrorIs(err, ErrNoStateProofKeyForRound) + + signer = generateTestSigner(start, end, 10, a) + + sig, err = signer.GetSigner(start).Sign(hashable) + a.NoError(err) + a.NoError(signer.GetVerifier().Verify(start, hashable, sig)) + + sig, err = signer.GetSigner(start + 5).Sign(hashable) + a.Error(err) + + err = signer.GetVerifier().Verify(start+5, hashable, sig) + a.Error(err) + a.ErrorIs(err, ErrSignatureSchemeVerificationFailed) + + signer = generateTestSigner(50, 100, 12, a) + a.Equal(4, length(signer, a)) + + for i := uint64(50); i < 100; i++ { + if i%12 != 0 { + _, err = signer.GetSigner(i).Sign(hashable) + a.Error(err) + } else { + sig, err = signer.GetSigner(i).Sign(hashable) + a.NoError(err) + a.NoError(signer.GetVerifier().Verify(i, hashable, sig)) + } + } + + signer = generateTestSigner(234, 4634, 256, a) + key := signer.GetKey(512) + a.NotNil(key) + key = signer.GetKey(4096) + a.NotNil(key) + key = signer.GetKey(234 + 256) + a.Nil(key) +} + +func TestBadRound(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + start, _, signer := generateTestSignerAux(a) + hashable, sig := makeSig(signer, start, a) + + err := signer.GetVerifier().Verify(start+1, hashable, sig) + a.Error(err) + a.ErrorIs(err, ErrSignatureSchemeVerificationFailed) + + hashable, sig = makeSig(signer, start+1, a) + err = signer.GetVerifier().Verify(start, hashable, sig) + a.Error(err) + a.ErrorIs(err, ErrSignatureSchemeVerificationFailed) + + err = signer.GetVerifier().Verify(start+2, hashable, sig) + a.Error(err) + a.ErrorIs(err, ErrSignatureSchemeVerificationFailed) + a.True(errors.Is(err, ErrSignatureSchemeVerificationFailed)) +} + +func TestBadMerkleProofInSignature(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + start, _, signer := generateTestSignerAux(a) + hashable, sig := makeSig(signer, start, a) + + sig2 := copySig(sig) + sig2.Proof.Path = sig2.Proof.Path[:len(sig2.Proof.Path)-1] + err := signer.GetVerifier().Verify(start, hashable, sig2) + a.Error(err) + a.ErrorIs(err, ErrSignatureSchemeVerificationFailed) + + sig3 := copySig(sig) + someDigest := crypto.Digest{} + rand.Read(someDigest[:]) + sig3.Proof.Path[0] = someDigest[:] + err = signer.GetVerifier().Verify(start, hashable, sig3) + a.Error(err) + a.ErrorIs(err, ErrSignatureSchemeVerificationFailed) +} + +func copySig(sig Signature) Signature { + bsig := make([]byte, len(sig.Signature)) + copy(bsig, sig.Signature) + + return Signature{ + Signature: bsig, + Proof: copyProof(sig.Proof), + VerifyingKey: sig.VerifyingKey, + } +} + +func TestIncorrectByteSignature(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + start, _, signer := generateTestSignerAux(a) + hashable, sig := makeSig(signer, start, a) + + sig2 := sig + bs := make([]byte, len(sig.Signature)) + copy(bs, sig2.Signature) + bs[0]++ + sig2.Signature = bs + + err := signer.GetVerifier().Verify(start, hashable, sig2) + a.Error(err) + a.ErrorIs(err, ErrSignatureSchemeVerificationFailed) +} + +func TestIncorrectMerkleIndex(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + var err error + + h := genHashableForTest() + signer := generateTestSigner(8, 100, 5, a) + a.NoError(err) + + sig, err := signer.GetSigner(20).Sign(h) + a.NoError(err) + + sig.MerkleArrayIndex = 0 + err = signer.GetVerifier().Verify(20, h, sig) + a.Error(err) + a.ErrorIs(err, ErrSignatureSchemeVerificationFailed) + + sig.MerkleArrayIndex = math.MaxUint64 + err = signer.GetVerifier().Verify(20, h, sig) + a.Error(err) + a.ErrorIs(err, ErrSignatureSchemeVerificationFailed) + + err = signer.GetVerifier().Verify(20, h, sig) + a.Error(err) + a.ErrorIs(err, ErrSignatureSchemeVerificationFailed) +} + +func TestAttemptToUseDifferentKey(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + start, _, signer := generateTestSignerAux(a) + hashable, sig := makeSig(signer, start+1, a) + // taking signature for specific round and changing the round + + // taking signature and changing the key to match different round + sig2 := sig + key := signer.GetKey(start) + a.NotNil(key) + + sig2.VerifyingKey = *(key.GetVerifyingKey()) + + err := signer.GetVerifier().Verify(start+1, hashable, sig2) + a.Error(err) + a.ErrorIs(err, ErrSignatureSchemeVerificationFailed) +} + +func TestMarshal(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + signer := generateTestSigner(0, 10, 1, a) + + out := protocol.Encode(&signer.SignerContext) + decodeInto := SignerContext{} + a.NoError(protocol.Decode(out, &decodeInto)) + a.Equal(signer.SignerContext, decodeInto) + + verifier := signer.GetVerifier() + bs := protocol.Encode(verifier) + verifierToDecodeInto := Verifier{} + protocol.Decode(bs, &verifierToDecodeInto) + a.Equal(*verifier, verifierToDecodeInto) +} + +func TestNumberOfGeneratedKeys(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + interval := uint64(256) + numberOfKeys := uint64(1 << 6) + validPeriod := numberOfKeys*interval - 1 + + firstValid := uint64(1000) + lastValid := validPeriod + 1000 + s, err := New(firstValid, lastValid, interval) + a.NoError(err) + a.Equal(numberOfKeys, uint64(length(s, a))) + + firstValid = uint64(0) + lastValid = validPeriod + s, err = New(firstValid, lastValid, interval) + a.NoError(err) + a.Equal(numberOfKeys-1, uint64(length(s, a))) + + firstValid = uint64(1000) + lastValid = validPeriod + 1000 - (interval * 50) + s, err = New(firstValid, lastValid, interval) + a.NoError(err) + + a.Equal(numberOfKeys-50, uint64(length(s, a))) +} + +func TestGetAllKeys(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + interval := uint64(256) + numOfKeys := uint64(1 << 8) + validPeriod := numOfKeys*interval - 1 + + firstValid := uint64(1000) + lastValid := validPeriod + 1000 + s, err := New(firstValid, lastValid, interval) + a.NoError(err) + a.Equal(numOfKeys, uint64(len(s.ephemeralKeys))) + + keys := s.GetAllKeys() + for i := uint64(0); i < uint64(len(s.ephemeralKeys)); i++ { + a.Equal(s.ephemeralKeys[i], *keys[i].Key) + a.Equal(indexToRound(firstValid, interval, i), keys[i].Round) + } + + s, err = New(1, 2, 100) + a.NoError(err) + a.Equal(0, length(s, a)) + + keys = s.GetAllKeys() + a.Equal(0, len(keys)) +} + +//#region Helper Functions +func makeSig(signer *Secrets, sigRound uint64, a *require.Assertions) (crypto.Hashable, Signature) { + hashable := genHashableForTest() + + sig, err := signer.GetSigner(sigRound).Sign(hashable) + a.NoError(err) + a.NoError(signer.GetVerifier().Verify(sigRound, hashable, sig)) + return hashable, sig +} + +func generateTestSignerAux(a *require.Assertions) (uint64, uint64, *Secrets) { + start, end := uint64(50), uint64(100) + signer := generateTestSigner(start, end, 1, a) + return start, end, signer +} + +func generateTestSigner(firstValid, lastValid, interval uint64, a *require.Assertions) *Secrets { + signer, err := New(firstValid, lastValid, interval) + a.NoError(err) + + return signer +} + +func length(s *Secrets, a *require.Assertions) int { + return len(s.ephemeralKeys) +} + +func copyProof(proof merklearray.SingleLeafProof) merklearray.SingleLeafProof { + path := make([]crypto.GenericDigest, len(proof.Path)) + for i, digest := range proof.Path { + path[i] = make([]byte, len(digest)) + copy(path[i], digest) + } + p := merklearray.Proof{ + Path: path, + HashFactory: proof.HashFactory} + return merklearray.SingleLeafProof{Proof: p} +} + +//#endregion + +func TestTreeRootHashLength(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + interval := uint64(256) + numOfKeys := uint64(1 << 8) + validPeriod := numOfKeys*interval - 1 + + firstValid := uint64(1000) + lastValid := validPeriod + 1000 + s, err := New(firstValid, lastValid, interval) + a.NoError(err) + a.Equal(numOfKeys, uint64(len(s.ephemeralKeys))) + + a.Equal(MerkleSignatureSchemeRootSize, len(s.Tree.Root())) + a.Equal(MerkleSignatureSchemeRootSize, len(Verifier{})) +} diff --git a/crypto/merklesignature/msgp_gen.go b/crypto/merklesignature/msgp_gen.go new file mode 100644 index 0000000000..c97e0df408 --- /dev/null +++ b/crypto/merklesignature/msgp_gen.go @@ -0,0 +1,728 @@ +package merklesignature + +// Code generated by github.com/algorand/msgp DO NOT EDIT. + +import ( + "github.com/algorand/go-algorand/crypto" + "github.com/algorand/msgp/msgp" +) + +// The following msgp objects are implemented in this file: +// KeyRoundPair +// |-----> (*) MarshalMsg +// |-----> (*) CanMarshalMsg +// |-----> (*) UnmarshalMsg +// |-----> (*) CanUnmarshalMsg +// |-----> (*) Msgsize +// |-----> (*) MsgIsZero +// +// Secrets +// |-----> (*) MarshalMsg +// |-----> (*) CanMarshalMsg +// |-----> (*) UnmarshalMsg +// |-----> (*) CanUnmarshalMsg +// |-----> (*) Msgsize +// |-----> (*) MsgIsZero +// +// Signature +// |-----> (*) MarshalMsg +// |-----> (*) CanMarshalMsg +// |-----> (*) UnmarshalMsg +// |-----> (*) CanUnmarshalMsg +// |-----> (*) Msgsize +// |-----> (*) MsgIsZero +// +// SignerContext +// |-----> (*) MarshalMsg +// |-----> (*) CanMarshalMsg +// |-----> (*) UnmarshalMsg +// |-----> (*) CanUnmarshalMsg +// |-----> (*) Msgsize +// |-----> (*) MsgIsZero +// +// Verifier +// |-----> (*) MarshalMsg +// |-----> (*) CanMarshalMsg +// |-----> (*) UnmarshalMsg +// |-----> (*) CanUnmarshalMsg +// |-----> (*) Msgsize +// |-----> (*) MsgIsZero +// + +// MarshalMsg implements msgp.Marshaler +func (z *KeyRoundPair) MarshalMsg(b []byte) (o []byte) { + o = msgp.Require(b, z.Msgsize()) + // omitempty: check for empty values + zb0001Len := uint32(2) + var zb0001Mask uint8 /* 3 bits */ + if (*z).Key == nil { + zb0001Len-- + zb0001Mask |= 0x2 + } + if (*z).Round == 0 { + zb0001Len-- + zb0001Mask |= 0x4 + } + // variable map header, size zb0001Len + o = append(o, 0x80|uint8(zb0001Len)) + if zb0001Len != 0 { + if (zb0001Mask & 0x2) == 0 { // if not empty + // string "key" + o = append(o, 0xa3, 0x6b, 0x65, 0x79) + if (*z).Key == nil { + o = msgp.AppendNil(o) + } else { + o = (*z).Key.MarshalMsg(o) + } + } + if (zb0001Mask & 0x4) == 0 { // if not empty + // string "rnd" + o = append(o, 0xa3, 0x72, 0x6e, 0x64) + o = msgp.AppendUint64(o, (*z).Round) + } + } + return +} + +func (_ *KeyRoundPair) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(*KeyRoundPair) + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *KeyRoundPair) UnmarshalMsg(bts []byte) (o []byte, err error) { + var field []byte + _ = field + var zb0001 int + var zb0002 bool + zb0001, zb0002, bts, err = msgp.ReadMapHeaderBytes(bts) + if _, ok := err.(msgp.TypeError); ok { + zb0001, zb0002, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0001 > 0 { + zb0001-- + (*z).Round, bts, err = msgp.ReadUint64Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Round") + return + } + } + if zb0001 > 0 { + zb0001-- + if msgp.IsNil(bts) { + bts, err = msgp.ReadNilBytes(bts) + if err != nil { + return + } + (*z).Key = nil + } else { + if (*z).Key == nil { + (*z).Key = new(crypto.FalconSigner) + } + bts, err = (*z).Key.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Key") + return + } + } + } + if zb0001 > 0 { + err = msgp.ErrTooManyArrayFields(zb0001) + if err != nil { + err = msgp.WrapError(err, "struct-from-array") + return + } + } + } else { + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0002 { + (*z) = KeyRoundPair{} + } + for zb0001 > 0 { + zb0001-- + field, bts, err = msgp.ReadMapKeyZC(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + switch string(field) { + case "rnd": + (*z).Round, bts, err = msgp.ReadUint64Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "Round") + return + } + case "key": + if msgp.IsNil(bts) { + bts, err = msgp.ReadNilBytes(bts) + if err != nil { + return + } + (*z).Key = nil + } else { + if (*z).Key == nil { + (*z).Key = new(crypto.FalconSigner) + } + bts, err = (*z).Key.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Key") + return + } + } + default: + err = msgp.ErrNoField(string(field)) + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + } + o = bts + return +} + +func (_ *KeyRoundPair) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*KeyRoundPair) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *KeyRoundPair) Msgsize() (s int) { + s = 1 + 4 + msgp.Uint64Size + 4 + if (*z).Key == nil { + s += msgp.NilSize + } else { + s += (*z).Key.Msgsize() + } + return +} + +// MsgIsZero returns whether this is a zero value +func (z *KeyRoundPair) MsgIsZero() bool { + return ((*z).Round == 0) && ((*z).Key == nil) +} + +// MarshalMsg implements msgp.Marshaler +func (z *Secrets) MarshalMsg(b []byte) (o []byte) { + o = msgp.Require(b, z.Msgsize()) + // omitempty: check for empty values + zb0002Len := uint32(3) + var zb0002Mask uint8 /* 6 bits */ + if (*z).SignerContext.FirstValid == 0 { + zb0002Len-- + zb0002Mask |= 0x8 + } + if (*z).SignerContext.Interval == 0 { + zb0002Len-- + zb0002Mask |= 0x10 + } + if (*z).SignerContext.Tree.MsgIsZero() { + zb0002Len-- + zb0002Mask |= 0x20 + } + // variable map header, size zb0002Len + o = append(o, 0x80|uint8(zb0002Len)) + if zb0002Len != 0 { + if (zb0002Mask & 0x8) == 0 { // if not empty + // string "fv" + o = append(o, 0xa2, 0x66, 0x76) + o = msgp.AppendUint64(o, (*z).SignerContext.FirstValid) + } + if (zb0002Mask & 0x10) == 0 { // if not empty + // string "iv" + o = append(o, 0xa2, 0x69, 0x76) + o = msgp.AppendUint64(o, (*z).SignerContext.Interval) + } + if (zb0002Mask & 0x20) == 0 { // if not empty + // string "tree" + o = append(o, 0xa4, 0x74, 0x72, 0x65, 0x65) + o = (*z).SignerContext.Tree.MarshalMsg(o) + } + } + return +} + +func (_ *Secrets) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(*Secrets) + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *Secrets) UnmarshalMsg(bts []byte) (o []byte, err error) { + var field []byte + _ = field + var zb0002 int + var zb0003 bool + zb0002, zb0003, bts, err = msgp.ReadMapHeaderBytes(bts) + if _, ok := err.(msgp.TypeError); ok { + zb0002, zb0003, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0002 > 0 { + zb0002-- + (*z).SignerContext.FirstValid, bts, err = msgp.ReadUint64Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "FirstValid") + return + } + } + if zb0002 > 0 { + zb0002-- + (*z).SignerContext.Interval, bts, err = msgp.ReadUint64Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Interval") + return + } + } + if zb0002 > 0 { + zb0002-- + bts, err = (*z).SignerContext.Tree.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Tree") + return + } + } + if zb0002 > 0 { + err = msgp.ErrTooManyArrayFields(zb0002) + if err != nil { + err = msgp.WrapError(err, "struct-from-array") + return + } + } + } else { + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0003 { + (*z) = Secrets{} + } + for zb0002 > 0 { + zb0002-- + field, bts, err = msgp.ReadMapKeyZC(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + switch string(field) { + case "fv": + (*z).SignerContext.FirstValid, bts, err = msgp.ReadUint64Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "FirstValid") + return + } + case "iv": + (*z).SignerContext.Interval, bts, err = msgp.ReadUint64Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "Interval") + return + } + case "tree": + bts, err = (*z).SignerContext.Tree.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Tree") + return + } + default: + err = msgp.ErrNoField(string(field)) + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + } + o = bts + return +} + +func (_ *Secrets) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*Secrets) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *Secrets) Msgsize() (s int) { + s = 1 + 3 + msgp.Uint64Size + 3 + msgp.Uint64Size + 5 + (*z).SignerContext.Tree.Msgsize() + return +} + +// MsgIsZero returns whether this is a zero value +func (z *Secrets) MsgIsZero() bool { + return ((*z).SignerContext.FirstValid == 0) && ((*z).SignerContext.Interval == 0) && ((*z).SignerContext.Tree.MsgIsZero()) +} + +// MarshalMsg implements msgp.Marshaler +func (z *Signature) MarshalMsg(b []byte) (o []byte) { + o = msgp.Require(b, z.Msgsize()) + // omitempty: check for empty values + zb0001Len := uint32(4) + var zb0001Mask uint8 /* 5 bits */ + if (*z).MerkleArrayIndex == 0 { + zb0001Len-- + zb0001Mask |= 0x2 + } + if (*z).Proof.MsgIsZero() { + zb0001Len-- + zb0001Mask |= 0x4 + } + if (*z).Signature.MsgIsZero() { + zb0001Len-- + zb0001Mask |= 0x8 + } + if (*z).VerifyingKey.MsgIsZero() { + zb0001Len-- + zb0001Mask |= 0x10 + } + // variable map header, size zb0001Len + o = append(o, 0x80|uint8(zb0001Len)) + if zb0001Len != 0 { + if (zb0001Mask & 0x2) == 0 { // if not empty + // string "idx" + o = append(o, 0xa3, 0x69, 0x64, 0x78) + o = msgp.AppendUint64(o, (*z).MerkleArrayIndex) + } + if (zb0001Mask & 0x4) == 0 { // if not empty + // string "prf" + o = append(o, 0xa3, 0x70, 0x72, 0x66) + o = (*z).Proof.MarshalMsg(o) + } + if (zb0001Mask & 0x8) == 0 { // if not empty + // string "sig" + o = append(o, 0xa3, 0x73, 0x69, 0x67) + o = (*z).Signature.MarshalMsg(o) + } + if (zb0001Mask & 0x10) == 0 { // if not empty + // string "vkey" + o = append(o, 0xa4, 0x76, 0x6b, 0x65, 0x79) + o = (*z).VerifyingKey.MarshalMsg(o) + } + } + return +} + +func (_ *Signature) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(*Signature) + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *Signature) UnmarshalMsg(bts []byte) (o []byte, err error) { + var field []byte + _ = field + var zb0001 int + var zb0002 bool + zb0001, zb0002, bts, err = msgp.ReadMapHeaderBytes(bts) + if _, ok := err.(msgp.TypeError); ok { + zb0001, zb0002, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0001 > 0 { + zb0001-- + bts, err = (*z).Signature.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Signature") + return + } + } + if zb0001 > 0 { + zb0001-- + (*z).MerkleArrayIndex, bts, err = msgp.ReadUint64Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "MerkleArrayIndex") + return + } + } + if zb0001 > 0 { + zb0001-- + bts, err = (*z).Proof.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Proof") + return + } + } + if zb0001 > 0 { + zb0001-- + bts, err = (*z).VerifyingKey.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "VerifyingKey") + return + } + } + if zb0001 > 0 { + err = msgp.ErrTooManyArrayFields(zb0001) + if err != nil { + err = msgp.WrapError(err, "struct-from-array") + return + } + } + } else { + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0002 { + (*z) = Signature{} + } + for zb0001 > 0 { + zb0001-- + field, bts, err = msgp.ReadMapKeyZC(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + switch string(field) { + case "sig": + bts, err = (*z).Signature.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Signature") + return + } + case "idx": + (*z).MerkleArrayIndex, bts, err = msgp.ReadUint64Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "MerkleArrayIndex") + return + } + case "prf": + bts, err = (*z).Proof.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Proof") + return + } + case "vkey": + bts, err = (*z).VerifyingKey.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "VerifyingKey") + return + } + default: + err = msgp.ErrNoField(string(field)) + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + } + o = bts + return +} + +func (_ *Signature) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*Signature) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *Signature) Msgsize() (s int) { + s = 1 + 4 + (*z).Signature.Msgsize() + 4 + msgp.Uint64Size + 4 + (*z).Proof.Msgsize() + 5 + (*z).VerifyingKey.Msgsize() + return +} + +// MsgIsZero returns whether this is a zero value +func (z *Signature) MsgIsZero() bool { + return ((*z).Signature.MsgIsZero()) && ((*z).MerkleArrayIndex == 0) && ((*z).Proof.MsgIsZero()) && ((*z).VerifyingKey.MsgIsZero()) +} + +// MarshalMsg implements msgp.Marshaler +func (z *SignerContext) MarshalMsg(b []byte) (o []byte) { + o = msgp.Require(b, z.Msgsize()) + // omitempty: check for empty values + zb0001Len := uint32(3) + var zb0001Mask uint8 /* 4 bits */ + if (*z).FirstValid == 0 { + zb0001Len-- + zb0001Mask |= 0x2 + } + if (*z).Interval == 0 { + zb0001Len-- + zb0001Mask |= 0x4 + } + if (*z).Tree.MsgIsZero() { + zb0001Len-- + zb0001Mask |= 0x8 + } + // variable map header, size zb0001Len + o = append(o, 0x80|uint8(zb0001Len)) + if zb0001Len != 0 { + if (zb0001Mask & 0x2) == 0 { // if not empty + // string "fv" + o = append(o, 0xa2, 0x66, 0x76) + o = msgp.AppendUint64(o, (*z).FirstValid) + } + if (zb0001Mask & 0x4) == 0 { // if not empty + // string "iv" + o = append(o, 0xa2, 0x69, 0x76) + o = msgp.AppendUint64(o, (*z).Interval) + } + if (zb0001Mask & 0x8) == 0 { // if not empty + // string "tree" + o = append(o, 0xa4, 0x74, 0x72, 0x65, 0x65) + o = (*z).Tree.MarshalMsg(o) + } + } + return +} + +func (_ *SignerContext) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(*SignerContext) + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *SignerContext) UnmarshalMsg(bts []byte) (o []byte, err error) { + var field []byte + _ = field + var zb0001 int + var zb0002 bool + zb0001, zb0002, bts, err = msgp.ReadMapHeaderBytes(bts) + if _, ok := err.(msgp.TypeError); ok { + zb0001, zb0002, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0001 > 0 { + zb0001-- + (*z).FirstValid, bts, err = msgp.ReadUint64Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "FirstValid") + return + } + } + if zb0001 > 0 { + zb0001-- + (*z).Interval, bts, err = msgp.ReadUint64Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Interval") + return + } + } + if zb0001 > 0 { + zb0001-- + bts, err = (*z).Tree.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Tree") + return + } + } + if zb0001 > 0 { + err = msgp.ErrTooManyArrayFields(zb0001) + if err != nil { + err = msgp.WrapError(err, "struct-from-array") + return + } + } + } else { + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0002 { + (*z) = SignerContext{} + } + for zb0001 > 0 { + zb0001-- + field, bts, err = msgp.ReadMapKeyZC(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + switch string(field) { + case "fv": + (*z).FirstValid, bts, err = msgp.ReadUint64Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "FirstValid") + return + } + case "iv": + (*z).Interval, bts, err = msgp.ReadUint64Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "Interval") + return + } + case "tree": + bts, err = (*z).Tree.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Tree") + return + } + default: + err = msgp.ErrNoField(string(field)) + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + } + o = bts + return +} + +func (_ *SignerContext) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*SignerContext) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *SignerContext) Msgsize() (s int) { + s = 1 + 3 + msgp.Uint64Size + 3 + msgp.Uint64Size + 5 + (*z).Tree.Msgsize() + return +} + +// MsgIsZero returns whether this is a zero value +func (z *SignerContext) MsgIsZero() bool { + return ((*z).FirstValid == 0) && ((*z).Interval == 0) && ((*z).Tree.MsgIsZero()) +} + +// MarshalMsg implements msgp.Marshaler +func (z *Verifier) MarshalMsg(b []byte) (o []byte) { + o = msgp.Require(b, z.Msgsize()) + o = msgp.AppendBytes(o, (*z)[:]) + return +} + +func (_ *Verifier) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(*Verifier) + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *Verifier) UnmarshalMsg(bts []byte) (o []byte, err error) { + bts, err = msgp.ReadExactBytes(bts, (*z)[:]) + if err != nil { + err = msgp.WrapError(err) + return + } + o = bts + return +} + +func (_ *Verifier) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*Verifier) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *Verifier) Msgsize() (s int) { + s = msgp.ArrayHeaderSize + (MerkleSignatureSchemeRootSize * (msgp.ByteSize)) + return +} + +// MsgIsZero returns whether this is a zero value +func (z *Verifier) MsgIsZero() bool { + return (*z) == (Verifier{}) +} diff --git a/crypto/merklesignature/msgp_gen_test.go b/crypto/merklesignature/msgp_gen_test.go new file mode 100644 index 0000000000..9c73788c54 --- /dev/null +++ b/crypto/merklesignature/msgp_gen_test.go @@ -0,0 +1,313 @@ +// +build !skip_msgp_testing + +package merklesignature + +// Code generated by github.com/algorand/msgp DO NOT EDIT. + +import ( + "testing" + + "github.com/algorand/go-algorand/protocol" + "github.com/algorand/go-algorand/test/partitiontest" + "github.com/algorand/msgp/msgp" +) + +func TestMarshalUnmarshalKeyRoundPair(t *testing.T) { + partitiontest.PartitionTest(t) + v := KeyRoundPair{} + bts := v.MarshalMsg(nil) + left, err := v.UnmarshalMsg(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) + } + + left, err = msgp.Skip(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after Skip(): %q", len(left), left) + } +} + +func TestRandomizedEncodingKeyRoundPair(t *testing.T) { + protocol.RunEncodingTest(t, &KeyRoundPair{}) +} + +func BenchmarkMarshalMsgKeyRoundPair(b *testing.B) { + v := KeyRoundPair{} + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.MarshalMsg(nil) + } +} + +func BenchmarkAppendMsgKeyRoundPair(b *testing.B) { + v := KeyRoundPair{} + bts := make([]byte, 0, v.Msgsize()) + bts = v.MarshalMsg(bts[0:0]) + b.SetBytes(int64(len(bts))) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + bts = v.MarshalMsg(bts[0:0]) + } +} + +func BenchmarkUnmarshalKeyRoundPair(b *testing.B) { + v := KeyRoundPair{} + bts := v.MarshalMsg(nil) + b.ReportAllocs() + b.SetBytes(int64(len(bts))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := v.UnmarshalMsg(bts) + if err != nil { + b.Fatal(err) + } + } +} + +func TestMarshalUnmarshalSecrets(t *testing.T) { + partitiontest.PartitionTest(t) + v := Secrets{} + bts := v.MarshalMsg(nil) + left, err := v.UnmarshalMsg(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) + } + + left, err = msgp.Skip(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after Skip(): %q", len(left), left) + } +} + +func TestRandomizedEncodingSecrets(t *testing.T) { + protocol.RunEncodingTest(t, &Secrets{}) +} + +func BenchmarkMarshalMsgSecrets(b *testing.B) { + v := Secrets{} + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.MarshalMsg(nil) + } +} + +func BenchmarkAppendMsgSecrets(b *testing.B) { + v := Secrets{} + bts := make([]byte, 0, v.Msgsize()) + bts = v.MarshalMsg(bts[0:0]) + b.SetBytes(int64(len(bts))) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + bts = v.MarshalMsg(bts[0:0]) + } +} + +func BenchmarkUnmarshalSecrets(b *testing.B) { + v := Secrets{} + bts := v.MarshalMsg(nil) + b.ReportAllocs() + b.SetBytes(int64(len(bts))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := v.UnmarshalMsg(bts) + if err != nil { + b.Fatal(err) + } + } +} + +func TestMarshalUnmarshalSignature(t *testing.T) { + partitiontest.PartitionTest(t) + v := Signature{} + bts := v.MarshalMsg(nil) + left, err := v.UnmarshalMsg(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) + } + + left, err = msgp.Skip(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after Skip(): %q", len(left), left) + } +} + +func TestRandomizedEncodingSignature(t *testing.T) { + protocol.RunEncodingTest(t, &Signature{}) +} + +func BenchmarkMarshalMsgSignature(b *testing.B) { + v := Signature{} + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.MarshalMsg(nil) + } +} + +func BenchmarkAppendMsgSignature(b *testing.B) { + v := Signature{} + bts := make([]byte, 0, v.Msgsize()) + bts = v.MarshalMsg(bts[0:0]) + b.SetBytes(int64(len(bts))) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + bts = v.MarshalMsg(bts[0:0]) + } +} + +func BenchmarkUnmarshalSignature(b *testing.B) { + v := Signature{} + bts := v.MarshalMsg(nil) + b.ReportAllocs() + b.SetBytes(int64(len(bts))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := v.UnmarshalMsg(bts) + if err != nil { + b.Fatal(err) + } + } +} + +func TestMarshalUnmarshalSignerContext(t *testing.T) { + partitiontest.PartitionTest(t) + v := SignerContext{} + bts := v.MarshalMsg(nil) + left, err := v.UnmarshalMsg(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) + } + + left, err = msgp.Skip(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after Skip(): %q", len(left), left) + } +} + +func TestRandomizedEncodingSignerContext(t *testing.T) { + protocol.RunEncodingTest(t, &SignerContext{}) +} + +func BenchmarkMarshalMsgSignerContext(b *testing.B) { + v := SignerContext{} + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.MarshalMsg(nil) + } +} + +func BenchmarkAppendMsgSignerContext(b *testing.B) { + v := SignerContext{} + bts := make([]byte, 0, v.Msgsize()) + bts = v.MarshalMsg(bts[0:0]) + b.SetBytes(int64(len(bts))) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + bts = v.MarshalMsg(bts[0:0]) + } +} + +func BenchmarkUnmarshalSignerContext(b *testing.B) { + v := SignerContext{} + bts := v.MarshalMsg(nil) + b.ReportAllocs() + b.SetBytes(int64(len(bts))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := v.UnmarshalMsg(bts) + if err != nil { + b.Fatal(err) + } + } +} + +func TestMarshalUnmarshalVerifier(t *testing.T) { + partitiontest.PartitionTest(t) + v := Verifier{} + bts := v.MarshalMsg(nil) + left, err := v.UnmarshalMsg(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) + } + + left, err = msgp.Skip(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after Skip(): %q", len(left), left) + } +} + +func TestRandomizedEncodingVerifier(t *testing.T) { + protocol.RunEncodingTest(t, &Verifier{}) +} + +func BenchmarkMarshalMsgVerifier(b *testing.B) { + v := Verifier{} + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.MarshalMsg(nil) + } +} + +func BenchmarkAppendMsgVerifier(b *testing.B) { + v := Verifier{} + bts := make([]byte, 0, v.Msgsize()) + bts = v.MarshalMsg(bts[0:0]) + b.SetBytes(int64(len(bts))) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + bts = v.MarshalMsg(bts[0:0]) + } +} + +func BenchmarkUnmarshalVerifier(b *testing.B) { + v := Verifier{} + bts := v.MarshalMsg(nil) + b.ReportAllocs() + b.SetBytes(int64(len(bts))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := v.UnmarshalMsg(bts) + if err != nil { + b.Fatal(err) + } + } +} diff --git a/crypto/merklesignature/persistentMerkleSignatureScheme.go b/crypto/merklesignature/persistentMerkleSignatureScheme.go new file mode 100644 index 0000000000..1ce67c8d55 --- /dev/null +++ b/crypto/merklesignature/persistentMerkleSignatureScheme.go @@ -0,0 +1,168 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +/* This file contains every database and persistence related method for the merkle Secrets. + * It is used when generating the State Proof keys (storing them into a database), and for + * importing those keys from the created database file into the algod participation registry. + */ + +package merklesignature + +import ( + "context" + "database/sql" + "errors" + "fmt" + + "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/protocol" + "github.com/algorand/go-algorand/util/db" +) + +const merkleSignatureSchemaVersion = 1 +const merkleSignatureTableSchemaName = "merklesignaturescheme" + +// Errors for the persistent merkle signature scheme +var ( + errSelectKeysError = errors.New("failed to fetch stateproof keys from DB") + errKeyDecodeError = errors.New("failed to decode stateproof key") +) + +// InstallStateProofTable creates (or migrates if exists already) the StateProofKeys database table +func InstallStateProofTable(tx *sql.Tx) error { + var schemaVersion sql.NullInt32 + err := tx.QueryRow("SELECT version FROM schema where tablename = ?", merkleSignatureTableSchemaName).Scan(&schemaVersion) + switch err { + case sql.ErrNoRows: + // proceed with the installation of the StateProofKeys table. + case nil: + // we were able to read from the schema successfully. + if schemaVersion.Valid { + switch schemaVersion.Int32 { + case merkleSignatureSchemaVersion: + // we're already at the desired version. + return nil + default: + // we're not at the desired version, proceed with update. + } + } + default: + // we hit some unexpected error + return fmt.Errorf("unable to query version from schema table : %w", err) + } + + _, err = tx.Exec(`CREATE TABLE IF NOT EXISTS StateProofKeys ( + id INTEGER PRIMARY KEY, + round INTEGER, --* committed round for this key + key BLOB --* msgpack encoding of ParticipationAccount.StateProof.GenericSigningKey + );`) + if err != nil { + return err + } + + _, err = tx.Exec(`CREATE UNIQUE INDEX IF NOT EXISTS roundIdx ON StateProofKeys (round);`) + if err != nil { + return err + } + + // drop existing value from the schema and insert updated value. + _, err = tx.Exec("DELETE FROM schema WHERE tablename = ?", merkleSignatureTableSchemaName) + if err != nil { + return err + } + + _, err = tx.Exec("INSERT INTO schema (tablename, version) VALUES (?, ?)", merkleSignatureTableSchemaName, merkleSignatureSchemaVersion) + + return err +} + +// Persist dumps the keys into the database and deletes the reference to them in Secrets +func (s *Secrets) Persist(store db.Accessor) error { + if s.ephemeralKeys == nil { + return fmt.Errorf("no keys provided (nil)") + } + if s.Interval == 0 { + return fmt.Errorf("Secrets.Persist: %w", errIntervalZero) + } + round := indexToRound(s.FirstValid, s.Interval, 0) + encodedKey := protocol.GetEncodingBuf() + err := store.Atomic(func(ctx context.Context, tx *sql.Tx) error { + err := InstallStateProofTable(tx) // assumes schema table already exists (created by partInstallDatabase) + if err != nil { + return err + } + + insertStmt, err := tx.PrepareContext(ctx, "INSERT INTO StateProofKeys (id, round, key) VALUES (?,?,?)") + if err != nil { + return fmt.Errorf("unable to prepare insert stateproofkeys statement: %w", err) + } + defer insertStmt.Close() + + for i, key := range s.ephemeralKeys { + // reset the slice + encodedKey = encodedKey[:0] + // store the encoded key into the slice + encodedKey = key.MarshalMsg(encodedKey) + _, err := insertStmt.ExecContext(ctx, i, round, encodedKey) + + if err != nil { + return fmt.Errorf("failed to insert StateProof key number %v round %d. SQL Error: %w", i, round, err) + } + round += s.Interval + } + + return nil + }) + protocol.PutEncodingBuf(encodedKey) + if err != nil { + return fmt.Errorf("Secrets.Persist: %w", err) + } + + return nil // Success +} + +// RestoreAllSecrets fetch all stateproof secrets from a persisted storage into memory +func (s *Secrets) RestoreAllSecrets(store db.Accessor) error { + var keys []crypto.FalconSigner + + err := store.Atomic(func(ctx context.Context, tx *sql.Tx) error { + rows, err := tx.Query("SELECT key FROM StateProofKeys") + if err != nil { + return fmt.Errorf("%w - %v", errSelectKeysError, err) + } + defer rows.Close() + for rows.Next() { + var keyB []byte + key := crypto.FalconSigner{} + err := rows.Scan(&keyB) + if err != nil { + return fmt.Errorf("%w - %v", errKeyDecodeError, err) + } + err = protocol.Decode(keyB, &key) + if err != nil { + return err + } + keys = append(keys, key) + } + return nil + }) + if err != nil { + return err + } + + s.ephemeralKeys = keys + return nil +} diff --git a/crypto/merklesignature/persistentMerkleSignatureScheme_test.go b/crypto/merklesignature/persistentMerkleSignatureScheme_test.go new file mode 100644 index 0000000000..12aa8a02df --- /dev/null +++ b/crypto/merklesignature/persistentMerkleSignatureScheme_test.go @@ -0,0 +1,134 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package merklesignature + +import ( + "context" + "database/sql" + "testing" + + uuid "github.com/satori/go.uuid" + "github.com/stretchr/testify/require" + + "github.com/algorand/go-algorand/test/partitiontest" + "github.com/algorand/go-algorand/util/db" +) + +func TestSecretsDatabaseUpgrade(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + store := createTestDB(a) + defer store.Close() + + firstValid := uint64(1) + LastValid := uint64(5000) + + interval := uint64(256) + mss, err := New(firstValid, LastValid, interval) + a.NoError(err) + a.NoError(mss.Persist(*store)) + + newMss := Secrets{} + newMss.SignerContext = mss.SignerContext + err = newMss.RestoreAllSecrets(*store) + a.NoError(err) + + err = store.Atomic(func(ctx context.Context, tx *sql.Tx) error { + err := InstallStateProofTable(tx) // assumes schema table already exists (created by partInstallDatabase) + if err != nil { + return err + } + return nil + }) + + a.NoError(err) + version, err := getStateProofTableSchemaVersions(*store) + a.NoError(err) + a.Equal(merkleSignatureSchemaVersion, version) +} + +func TestFetchRestoreAllSecrets(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + store := createTestDB(a) + defer store.Close() + + firstValid := uint64(1) + LastValid := uint64(5000) + + interval := uint64(256) + mss, err := New(firstValid, LastValid, interval) + a.NoError(err) + a.NoError(mss.Persist(*store)) + + newMss := Secrets{} + newMss.SignerContext = mss.SignerContext + err = newMss.RestoreAllSecrets(*store) + a.NoError(err) + + for i := uint64(1); i < LastValid; i++ { + key1 := mss.GetKey(i) + key2 := newMss.GetKey(i) + if i%interval == 0 { + a.NotNil(key1) + a.NotNil(key2) + a.Equal(*key1, *key2) + continue + } + a.Nil(key1) + a.Nil(key2) + } + + // make sure we exercise the path of the database being upgraded, but then + // we would also expect to fail the Persist since the entries are already there. + // this is an expected failure since the Persist is only called on freshly created + // databases. + a.Contains(mss.Persist(*store).Error(), "failed to insert StateProof key number") +} + +func createTestDB(a *require.Assertions) *db.Accessor { + tmpname := uuid.NewV4().String() // could this just be a constant string instead? does it even matter? + store, err := db.MakeAccessor(tmpname, false, true) + a.NoError(err) + a.NotNil(store) + + err = store.Atomic(func(ctx context.Context, tx *sql.Tx) error { + _, err = tx.Exec(`CREATE TABLE schema ( + tablename TEXT PRIMARY KEY, + version INTEGER + );`) + return err + }) + a.NoError(err) + + return &store +} + +func getStateProofTableSchemaVersions(db db.Accessor) (int, error) { + var version int + err := db.Atomic(func(ctx context.Context, tx *sql.Tx) (err error) { + row := tx.QueryRow("SELECT version FROM schema where tablename = ?", merkleSignatureTableSchemaName) + return row.Scan(&version) + }) + if err == sql.ErrNoRows { + return 0, nil + } + if err != nil { + return 0, err + } + return version, nil +} diff --git a/crypto/merklesignature/posdivs.go b/crypto/merklesignature/posdivs.go new file mode 100644 index 0000000000..6ac430acea --- /dev/null +++ b/crypto/merklesignature/posdivs.go @@ -0,0 +1,55 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package merklesignature + +import ( + "errors" +) + +var errRoundMultipleOfInterval = errors.New("the round should be a multiple of the interval") +var errRoundFirstValid = errors.New("the round cannot be less than firstValid") +var errIntervalZero = errors.New("the interval should not be zero") +var errRoundNotZero = errors.New("the round should not be zero") + +func checkMerkleSignatureSchemeParams(firstValid, round, interval uint64) error { + if interval == 0 { + return errIntervalZero + } + if round == 0 { + return errRoundNotZero + } + if round%interval != 0 { + return errRoundMultipleOfInterval + } + if round < firstValid { + return errRoundFirstValid + } + return nil +} + +func roundToIndex(firstValid, currentRound, interval uint64) uint64 { + rofi := roundOfFirstIndex(firstValid, interval) + return (currentRound - rofi) / interval +} + +func indexToRound(firstValid, interval, pos uint64) uint64 { + return roundOfFirstIndex(firstValid, interval) + pos*interval +} + +func roundOfFirstIndex(firstValid, interval uint64) uint64 { + return ((firstValid + interval - 1) / interval) * interval +} diff --git a/crypto/merklesignature/posdivs_test.go b/crypto/merklesignature/posdivs_test.go new file mode 100644 index 0000000000..8a48d1c32c --- /dev/null +++ b/crypto/merklesignature/posdivs_test.go @@ -0,0 +1,116 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package merklesignature + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/algorand/go-algorand/test/partitiontest" +) + +func TestRoundToIndex(t *testing.T) { + partitiontest.PartitionTest(t) + + count := uint64(200) + + // firstValid <= interval + firstValid := uint64(100) + interval := uint64(101) + ic := uint64(1) + checkRoundToIndex(count, ic, firstValid, interval, t) + + // firstValid > interval + firstValid = uint64(100) + interval = uint64(99) + ic = uint64(2) + checkRoundToIndex(count, ic, firstValid, interval, t) + + // firstValid >> interval + firstValid = uint64(100) + interval = uint64(20) + ic = uint64(5) + checkRoundToIndex(count, ic, firstValid, interval, t) +} + +func TestIndexToRoundToIndex(t *testing.T) { + partitiontest.PartitionTest(t) + + count := uint64(200) + firstValid := uint64(100) + interval := uint64(101) + checkIndexToRoundToIndex(count, firstValid, interval, t) + + firstValid = uint64(100) + interval = uint64(99) + checkIndexToRoundToIndex(count, firstValid, interval, t) + + firstValid = uint64(100) + interval = uint64(20) + checkIndexToRoundToIndex(count, firstValid, interval, t) +} + +func TestErrors(t *testing.T) { + partitiontest.PartitionTest(t) + + firstValid := uint64(100) + interval := uint64(101) + round := uint64(0) + require.Equal(t, errRoundNotZero, checkMerkleSignatureSchemeParams(firstValid, round, interval)) + + round = interval - 1 + require.Equal(t, errRoundMultipleOfInterval, checkMerkleSignatureSchemeParams(firstValid, round, interval)) + + round = interval + 1 + require.Equal(t, errRoundMultipleOfInterval, checkMerkleSignatureSchemeParams(firstValid, round, interval)) + + firstValid = uint64(101) + round = firstValid - 1 + interval = round / 2 + require.Equal(t, errRoundFirstValid, checkMerkleSignatureSchemeParams(firstValid, round, interval)) + + interval = 0 + require.Equal(t, errIntervalZero, checkMerkleSignatureSchemeParams(firstValid, round, interval)) + + interval = 107 + round = 107 + firstValid = 107 + require.NoError(t, checkMerkleSignatureSchemeParams(firstValid, round, interval)) +} + +func checkIndexToRoundToIndex(count, firstValid, interval uint64, t *testing.T) { + for pos := uint64(0); pos < count; pos++ { + round := indexToRound(firstValid, interval, uint64(pos)) + index := roundToIndex(firstValid, round, interval) + require.Equal(t, uint64(pos), index) + } + +} + +func checkRoundToIndex(count, initC, firstValid, interval uint64, t *testing.T) { + expIndex := uint64(0) + for c := initC; c < count; c++ { + round := interval * c + index := roundToIndex(firstValid, round, interval) + require.Equal(t, expIndex, index) + expIndex++ + round2 := indexToRound(firstValid, interval, index) + require.Equal(t, round, round2) + } + +} diff --git a/crypto/merkletrie/bitset.go b/crypto/merkletrie/bitset.go index 87e90f6690..f7f2d78d09 100644 --- a/crypto/merkletrie/bitset.go +++ b/crypto/merkletrie/bitset.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/crypto/merkletrie/bitset_test.go b/crypto/merkletrie/bitset_test.go index c722ff4536..758c3299e3 100644 --- a/crypto/merkletrie/bitset_test.go +++ b/crypto/merkletrie/bitset_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/crypto/merkletrie/cache.go b/crypto/merkletrie/cache.go index 8c41a05b4e..4375825a28 100644 --- a/crypto/merkletrie/cache.go +++ b/crypto/merkletrie/cache.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/crypto/merkletrie/cache_test.go b/crypto/merkletrie/cache_test.go index 07819644ec..15b14e6767 100644 --- a/crypto/merkletrie/cache_test.go +++ b/crypto/merkletrie/cache_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/crypto/merkletrie/committer.go b/crypto/merkletrie/committer.go index f2a253c428..ac6fcd72c2 100644 --- a/crypto/merkletrie/committer.go +++ b/crypto/merkletrie/committer.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/crypto/merkletrie/committer_test.go b/crypto/merkletrie/committer_test.go index 04a43a1b22..8152743023 100644 --- a/crypto/merkletrie/committer_test.go +++ b/crypto/merkletrie/committer_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/crypto/merkletrie/node.go b/crypto/merkletrie/node.go index 8d6d05d5bb..e4d3a18f3f 100644 --- a/crypto/merkletrie/node.go +++ b/crypto/merkletrie/node.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/crypto/merkletrie/node_test.go b/crypto/merkletrie/node_test.go index db4f02bdf9..76121b5ae3 100644 --- a/crypto/merkletrie/node_test.go +++ b/crypto/merkletrie/node_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/crypto/merkletrie/trie.go b/crypto/merkletrie/trie.go index 9cb855ccc7..22c03e1cec 100644 --- a/crypto/merkletrie/trie.go +++ b/crypto/merkletrie/trie.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/crypto/merkletrie/trie_test.go b/crypto/merkletrie/trie_test.go index 82f86b2d19..fd9b38d989 100644 --- a/crypto/merkletrie/trie_test.go +++ b/crypto/merkletrie/trie_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/crypto/msgp_gen.go b/crypto/msgp_gen.go index 84fe8622e6..fc7539b825 100644 --- a/crypto/msgp_gen.go +++ b/crypto/msgp_gen.go @@ -6,6 +6,7 @@ import ( _ "runtime/cgo" _ "unsafe" + cfalcon "github.com/algorand/falcon" "github.com/algorand/msgp/msgp" ) @@ -18,6 +19,78 @@ import ( // |-----> (*) Msgsize // |-----> (*) MsgIsZero // +// FalconPrivateKey +// |-----> (*) MarshalMsg +// |-----> (*) CanMarshalMsg +// |-----> (*) UnmarshalMsg +// |-----> (*) CanUnmarshalMsg +// |-----> (*) Msgsize +// |-----> (*) MsgIsZero +// +// FalconPublicKey +// |-----> (*) MarshalMsg +// |-----> (*) CanMarshalMsg +// |-----> (*) UnmarshalMsg +// |-----> (*) CanUnmarshalMsg +// |-----> (*) Msgsize +// |-----> (*) MsgIsZero +// +// FalconSeed +// |-----> (*) MarshalMsg +// |-----> (*) CanMarshalMsg +// |-----> (*) UnmarshalMsg +// |-----> (*) CanUnmarshalMsg +// |-----> (*) Msgsize +// |-----> (*) MsgIsZero +// +// FalconSignature +// |-----> MarshalMsg +// |-----> CanMarshalMsg +// |-----> (*) UnmarshalMsg +// |-----> (*) CanUnmarshalMsg +// |-----> Msgsize +// |-----> MsgIsZero +// +// FalconSigner +// |-----> (*) MarshalMsg +// |-----> (*) CanMarshalMsg +// |-----> (*) UnmarshalMsg +// |-----> (*) CanUnmarshalMsg +// |-----> (*) Msgsize +// |-----> (*) MsgIsZero +// +// FalconVerifier +// |-----> (*) MarshalMsg +// |-----> (*) CanMarshalMsg +// |-----> (*) UnmarshalMsg +// |-----> (*) CanUnmarshalMsg +// |-----> (*) Msgsize +// |-----> (*) MsgIsZero +// +// GenericDigest +// |-----> MarshalMsg +// |-----> CanMarshalMsg +// |-----> (*) UnmarshalMsg +// |-----> (*) CanUnmarshalMsg +// |-----> Msgsize +// |-----> MsgIsZero +// +// HashFactory +// |-----> (*) MarshalMsg +// |-----> (*) CanMarshalMsg +// |-----> (*) UnmarshalMsg +// |-----> (*) CanUnmarshalMsg +// |-----> (*) Msgsize +// |-----> (*) MsgIsZero +// +// HashType +// |-----> MarshalMsg +// |-----> CanMarshalMsg +// |-----> (*) UnmarshalMsg +// |-----> (*) CanUnmarshalMsg +// |-----> Msgsize +// |-----> MsgIsZero +// // MasterDerivationKey // |-----> (*) MarshalMsg // |-----> (*) CanMarshalMsg @@ -250,6 +323,633 @@ func (z *Digest) MsgIsZero() bool { return (*z) == (Digest{}) } +// MarshalMsg implements msgp.Marshaler +func (z *FalconPrivateKey) MarshalMsg(b []byte) (o []byte) { + o = msgp.Require(b, z.Msgsize()) + o = msgp.AppendBytes(o, (*z)[:]) + return +} + +func (_ *FalconPrivateKey) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(*FalconPrivateKey) + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *FalconPrivateKey) UnmarshalMsg(bts []byte) (o []byte, err error) { + bts, err = msgp.ReadExactBytes(bts, (*z)[:]) + if err != nil { + err = msgp.WrapError(err) + return + } + o = bts + return +} + +func (_ *FalconPrivateKey) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*FalconPrivateKey) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *FalconPrivateKey) Msgsize() (s int) { + s = msgp.ArrayHeaderSize + (cfalcon.PrivateKeySize * (msgp.ByteSize)) + return +} + +// MsgIsZero returns whether this is a zero value +func (z *FalconPrivateKey) MsgIsZero() bool { + return (*z) == (FalconPrivateKey{}) +} + +// MarshalMsg implements msgp.Marshaler +func (z *FalconPublicKey) MarshalMsg(b []byte) (o []byte) { + o = msgp.Require(b, z.Msgsize()) + o = msgp.AppendBytes(o, (*z)[:]) + return +} + +func (_ *FalconPublicKey) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(*FalconPublicKey) + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *FalconPublicKey) UnmarshalMsg(bts []byte) (o []byte, err error) { + bts, err = msgp.ReadExactBytes(bts, (*z)[:]) + if err != nil { + err = msgp.WrapError(err) + return + } + o = bts + return +} + +func (_ *FalconPublicKey) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*FalconPublicKey) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *FalconPublicKey) Msgsize() (s int) { + s = msgp.ArrayHeaderSize + (cfalcon.PublicKeySize * (msgp.ByteSize)) + return +} + +// MsgIsZero returns whether this is a zero value +func (z *FalconPublicKey) MsgIsZero() bool { + return (*z) == (FalconPublicKey{}) +} + +// MarshalMsg implements msgp.Marshaler +func (z *FalconSeed) MarshalMsg(b []byte) (o []byte) { + o = msgp.Require(b, z.Msgsize()) + o = msgp.AppendBytes(o, (*z)[:]) + return +} + +func (_ *FalconSeed) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(*FalconSeed) + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *FalconSeed) UnmarshalMsg(bts []byte) (o []byte, err error) { + bts, err = msgp.ReadExactBytes(bts, (*z)[:]) + if err != nil { + err = msgp.WrapError(err) + return + } + o = bts + return +} + +func (_ *FalconSeed) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*FalconSeed) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *FalconSeed) Msgsize() (s int) { + s = msgp.ArrayHeaderSize + (FalconSeedSize * (msgp.ByteSize)) + return +} + +// MsgIsZero returns whether this is a zero value +func (z *FalconSeed) MsgIsZero() bool { + return (*z) == (FalconSeed{}) +} + +// MarshalMsg implements msgp.Marshaler +func (z FalconSignature) MarshalMsg(b []byte) (o []byte) { + o = msgp.Require(b, z.Msgsize()) + o = msgp.AppendBytes(o, []byte(z)) + return +} + +func (_ FalconSignature) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(FalconSignature) + if !ok { + _, ok = (z).(*FalconSignature) + } + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *FalconSignature) UnmarshalMsg(bts []byte) (o []byte, err error) { + { + var zb0001 []byte + var zb0002 int + zb0002, err = msgp.ReadBytesBytesHeader(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0002 > FalconMaxSignatureSize { + err = msgp.ErrOverflow(uint64(zb0002), uint64(FalconMaxSignatureSize)) + return + } + zb0001, bts, err = msgp.ReadBytesBytes(bts, []byte((*z))) + if err != nil { + err = msgp.WrapError(err) + return + } + (*z) = FalconSignature(zb0001) + } + o = bts + return +} + +func (_ *FalconSignature) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*FalconSignature) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z FalconSignature) Msgsize() (s int) { + s = msgp.BytesPrefixSize + len([]byte(z)) + return +} + +// MsgIsZero returns whether this is a zero value +func (z FalconSignature) MsgIsZero() bool { + return len(z) == 0 +} + +// MarshalMsg implements msgp.Marshaler +func (z *FalconSigner) MarshalMsg(b []byte) (o []byte) { + o = msgp.Require(b, z.Msgsize()) + // omitempty: check for empty values + zb0003Len := uint32(2) + var zb0003Mask uint8 /* 3 bits */ + if (*z).PublicKey == (FalconPublicKey{}) { + zb0003Len-- + zb0003Mask |= 0x2 + } + if (*z).PrivateKey == (FalconPrivateKey{}) { + zb0003Len-- + zb0003Mask |= 0x4 + } + // variable map header, size zb0003Len + o = append(o, 0x80|uint8(zb0003Len)) + if zb0003Len != 0 { + if (zb0003Mask & 0x2) == 0 { // if not empty + // string "pk" + o = append(o, 0xa2, 0x70, 0x6b) + o = msgp.AppendBytes(o, ((*z).PublicKey)[:]) + } + if (zb0003Mask & 0x4) == 0 { // if not empty + // string "sk" + o = append(o, 0xa2, 0x73, 0x6b) + o = msgp.AppendBytes(o, ((*z).PrivateKey)[:]) + } + } + return +} + +func (_ *FalconSigner) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(*FalconSigner) + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *FalconSigner) UnmarshalMsg(bts []byte) (o []byte, err error) { + var field []byte + _ = field + var zb0003 int + var zb0004 bool + zb0003, zb0004, bts, err = msgp.ReadMapHeaderBytes(bts) + if _, ok := err.(msgp.TypeError); ok { + zb0003, zb0004, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0003 > 0 { + zb0003-- + bts, err = msgp.ReadExactBytes(bts, ((*z).PublicKey)[:]) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "PublicKey") + return + } + } + if zb0003 > 0 { + zb0003-- + bts, err = msgp.ReadExactBytes(bts, ((*z).PrivateKey)[:]) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "PrivateKey") + return + } + } + if zb0003 > 0 { + err = msgp.ErrTooManyArrayFields(zb0003) + if err != nil { + err = msgp.WrapError(err, "struct-from-array") + return + } + } + } else { + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0004 { + (*z) = FalconSigner{} + } + for zb0003 > 0 { + zb0003-- + field, bts, err = msgp.ReadMapKeyZC(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + switch string(field) { + case "pk": + bts, err = msgp.ReadExactBytes(bts, ((*z).PublicKey)[:]) + if err != nil { + err = msgp.WrapError(err, "PublicKey") + return + } + case "sk": + bts, err = msgp.ReadExactBytes(bts, ((*z).PrivateKey)[:]) + if err != nil { + err = msgp.WrapError(err, "PrivateKey") + return + } + default: + err = msgp.ErrNoField(string(field)) + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + } + o = bts + return +} + +func (_ *FalconSigner) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*FalconSigner) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *FalconSigner) Msgsize() (s int) { + s = 1 + 3 + msgp.ArrayHeaderSize + (cfalcon.PublicKeySize * (msgp.ByteSize)) + 3 + msgp.ArrayHeaderSize + (cfalcon.PrivateKeySize * (msgp.ByteSize)) + return +} + +// MsgIsZero returns whether this is a zero value +func (z *FalconSigner) MsgIsZero() bool { + return ((*z).PublicKey == (FalconPublicKey{})) && ((*z).PrivateKey == (FalconPrivateKey{})) +} + +// MarshalMsg implements msgp.Marshaler +func (z *FalconVerifier) MarshalMsg(b []byte) (o []byte) { + o = msgp.Require(b, z.Msgsize()) + // omitempty: check for empty values + zb0002Len := uint32(1) + var zb0002Mask uint8 /* 2 bits */ + if (*z).PublicKey == (FalconPublicKey{}) { + zb0002Len-- + zb0002Mask |= 0x2 + } + // variable map header, size zb0002Len + o = append(o, 0x80|uint8(zb0002Len)) + if zb0002Len != 0 { + if (zb0002Mask & 0x2) == 0 { // if not empty + // string "k" + o = append(o, 0xa1, 0x6b) + o = msgp.AppendBytes(o, ((*z).PublicKey)[:]) + } + } + return +} + +func (_ *FalconVerifier) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(*FalconVerifier) + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *FalconVerifier) UnmarshalMsg(bts []byte) (o []byte, err error) { + var field []byte + _ = field + var zb0002 int + var zb0003 bool + zb0002, zb0003, bts, err = msgp.ReadMapHeaderBytes(bts) + if _, ok := err.(msgp.TypeError); ok { + zb0002, zb0003, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0002 > 0 { + zb0002-- + bts, err = msgp.ReadExactBytes(bts, ((*z).PublicKey)[:]) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "PublicKey") + return + } + } + if zb0002 > 0 { + err = msgp.ErrTooManyArrayFields(zb0002) + if err != nil { + err = msgp.WrapError(err, "struct-from-array") + return + } + } + } else { + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0003 { + (*z) = FalconVerifier{} + } + for zb0002 > 0 { + zb0002-- + field, bts, err = msgp.ReadMapKeyZC(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + switch string(field) { + case "k": + bts, err = msgp.ReadExactBytes(bts, ((*z).PublicKey)[:]) + if err != nil { + err = msgp.WrapError(err, "PublicKey") + return + } + default: + err = msgp.ErrNoField(string(field)) + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + } + o = bts + return +} + +func (_ *FalconVerifier) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*FalconVerifier) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *FalconVerifier) Msgsize() (s int) { + s = 1 + 2 + msgp.ArrayHeaderSize + (cfalcon.PublicKeySize * (msgp.ByteSize)) + return +} + +// MsgIsZero returns whether this is a zero value +func (z *FalconVerifier) MsgIsZero() bool { + return ((*z).PublicKey == (FalconPublicKey{})) +} + +// MarshalMsg implements msgp.Marshaler +func (z GenericDigest) MarshalMsg(b []byte) (o []byte) { + o = msgp.Require(b, z.Msgsize()) + o = msgp.AppendBytes(o, []byte(z)) + return +} + +func (_ GenericDigest) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(GenericDigest) + if !ok { + _, ok = (z).(*GenericDigest) + } + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *GenericDigest) UnmarshalMsg(bts []byte) (o []byte, err error) { + { + var zb0001 []byte + var zb0002 int + zb0002, err = msgp.ReadBytesBytesHeader(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0002 > MaxHashDigestSize { + err = msgp.ErrOverflow(uint64(zb0002), uint64(MaxHashDigestSize)) + return + } + zb0001, bts, err = msgp.ReadBytesBytes(bts, []byte((*z))) + if err != nil { + err = msgp.WrapError(err) + return + } + (*z) = GenericDigest(zb0001) + } + o = bts + return +} + +func (_ *GenericDigest) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*GenericDigest) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z GenericDigest) Msgsize() (s int) { + s = msgp.BytesPrefixSize + len([]byte(z)) + return +} + +// MsgIsZero returns whether this is a zero value +func (z GenericDigest) MsgIsZero() bool { + return len(z) == 0 +} + +// MarshalMsg implements msgp.Marshaler +func (z *HashFactory) MarshalMsg(b []byte) (o []byte) { + o = msgp.Require(b, z.Msgsize()) + // omitempty: check for empty values + zb0001Len := uint32(1) + var zb0001Mask uint8 /* 2 bits */ + if (*z).HashType == 0 { + zb0001Len-- + zb0001Mask |= 0x2 + } + // variable map header, size zb0001Len + o = append(o, 0x80|uint8(zb0001Len)) + if zb0001Len != 0 { + if (zb0001Mask & 0x2) == 0 { // if not empty + // string "t" + o = append(o, 0xa1, 0x74) + o = msgp.AppendUint16(o, uint16((*z).HashType)) + } + } + return +} + +func (_ *HashFactory) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(*HashFactory) + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *HashFactory) UnmarshalMsg(bts []byte) (o []byte, err error) { + var field []byte + _ = field + var zb0001 int + var zb0002 bool + zb0001, zb0002, bts, err = msgp.ReadMapHeaderBytes(bts) + if _, ok := err.(msgp.TypeError); ok { + zb0001, zb0002, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0001 > 0 { + zb0001-- + { + var zb0003 uint16 + zb0003, bts, err = msgp.ReadUint16Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "HashType") + return + } + (*z).HashType = HashType(zb0003) + } + } + if zb0001 > 0 { + err = msgp.ErrTooManyArrayFields(zb0001) + if err != nil { + err = msgp.WrapError(err, "struct-from-array") + return + } + } + } else { + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0002 { + (*z) = HashFactory{} + } + for zb0001 > 0 { + zb0001-- + field, bts, err = msgp.ReadMapKeyZC(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + switch string(field) { + case "t": + { + var zb0004 uint16 + zb0004, bts, err = msgp.ReadUint16Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "HashType") + return + } + (*z).HashType = HashType(zb0004) + } + default: + err = msgp.ErrNoField(string(field)) + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + } + o = bts + if err = z.Validate(); err != nil { + return + } + return +} + +func (_ *HashFactory) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*HashFactory) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *HashFactory) Msgsize() (s int) { + s = 1 + 2 + msgp.Uint16Size + return +} + +// MsgIsZero returns whether this is a zero value +func (z *HashFactory) MsgIsZero() bool { + return ((*z).HashType == 0) +} + +// MarshalMsg implements msgp.Marshaler +func (z HashType) MarshalMsg(b []byte) (o []byte) { + o = msgp.Require(b, z.Msgsize()) + o = msgp.AppendUint16(o, uint16(z)) + return +} + +func (_ HashType) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(HashType) + if !ok { + _, ok = (z).(*HashType) + } + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *HashType) UnmarshalMsg(bts []byte) (o []byte, err error) { + { + var zb0001 uint16 + zb0001, bts, err = msgp.ReadUint16Bytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + (*z) = HashType(zb0001) + } + o = bts + return +} + +func (_ *HashType) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*HashType) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z HashType) Msgsize() (s int) { + s = msgp.Uint16Size + return +} + +// MsgIsZero returns whether this is a zero value +func (z HashType) MsgIsZero() bool { + return z == 0 +} + // MarshalMsg implements msgp.Marshaler func (z *MasterDerivationKey) MarshalMsg(b []byte) (o []byte) { o = msgp.Require(b, z.Msgsize()) diff --git a/crypto/msgp_gen_test.go b/crypto/msgp_gen_test.go index 8a80c972f4..21be375fad 100644 --- a/crypto/msgp_gen_test.go +++ b/crypto/msgp_gen_test.go @@ -72,6 +72,366 @@ func BenchmarkUnmarshalDigest(b *testing.B) { } } +func TestMarshalUnmarshalFalconPrivateKey(t *testing.T) { + partitiontest.PartitionTest(t) + v := FalconPrivateKey{} + bts := v.MarshalMsg(nil) + left, err := v.UnmarshalMsg(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) + } + + left, err = msgp.Skip(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after Skip(): %q", len(left), left) + } +} + +func TestRandomizedEncodingFalconPrivateKey(t *testing.T) { + protocol.RunEncodingTest(t, &FalconPrivateKey{}) +} + +func BenchmarkMarshalMsgFalconPrivateKey(b *testing.B) { + v := FalconPrivateKey{} + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.MarshalMsg(nil) + } +} + +func BenchmarkAppendMsgFalconPrivateKey(b *testing.B) { + v := FalconPrivateKey{} + bts := make([]byte, 0, v.Msgsize()) + bts = v.MarshalMsg(bts[0:0]) + b.SetBytes(int64(len(bts))) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + bts = v.MarshalMsg(bts[0:0]) + } +} + +func BenchmarkUnmarshalFalconPrivateKey(b *testing.B) { + v := FalconPrivateKey{} + bts := v.MarshalMsg(nil) + b.ReportAllocs() + b.SetBytes(int64(len(bts))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := v.UnmarshalMsg(bts) + if err != nil { + b.Fatal(err) + } + } +} + +func TestMarshalUnmarshalFalconPublicKey(t *testing.T) { + partitiontest.PartitionTest(t) + v := FalconPublicKey{} + bts := v.MarshalMsg(nil) + left, err := v.UnmarshalMsg(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) + } + + left, err = msgp.Skip(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after Skip(): %q", len(left), left) + } +} + +func TestRandomizedEncodingFalconPublicKey(t *testing.T) { + protocol.RunEncodingTest(t, &FalconPublicKey{}) +} + +func BenchmarkMarshalMsgFalconPublicKey(b *testing.B) { + v := FalconPublicKey{} + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.MarshalMsg(nil) + } +} + +func BenchmarkAppendMsgFalconPublicKey(b *testing.B) { + v := FalconPublicKey{} + bts := make([]byte, 0, v.Msgsize()) + bts = v.MarshalMsg(bts[0:0]) + b.SetBytes(int64(len(bts))) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + bts = v.MarshalMsg(bts[0:0]) + } +} + +func BenchmarkUnmarshalFalconPublicKey(b *testing.B) { + v := FalconPublicKey{} + bts := v.MarshalMsg(nil) + b.ReportAllocs() + b.SetBytes(int64(len(bts))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := v.UnmarshalMsg(bts) + if err != nil { + b.Fatal(err) + } + } +} + +func TestMarshalUnmarshalFalconSeed(t *testing.T) { + partitiontest.PartitionTest(t) + v := FalconSeed{} + bts := v.MarshalMsg(nil) + left, err := v.UnmarshalMsg(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) + } + + left, err = msgp.Skip(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after Skip(): %q", len(left), left) + } +} + +func TestRandomizedEncodingFalconSeed(t *testing.T) { + protocol.RunEncodingTest(t, &FalconSeed{}) +} + +func BenchmarkMarshalMsgFalconSeed(b *testing.B) { + v := FalconSeed{} + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.MarshalMsg(nil) + } +} + +func BenchmarkAppendMsgFalconSeed(b *testing.B) { + v := FalconSeed{} + bts := make([]byte, 0, v.Msgsize()) + bts = v.MarshalMsg(bts[0:0]) + b.SetBytes(int64(len(bts))) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + bts = v.MarshalMsg(bts[0:0]) + } +} + +func BenchmarkUnmarshalFalconSeed(b *testing.B) { + v := FalconSeed{} + bts := v.MarshalMsg(nil) + b.ReportAllocs() + b.SetBytes(int64(len(bts))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := v.UnmarshalMsg(bts) + if err != nil { + b.Fatal(err) + } + } +} + +func TestMarshalUnmarshalFalconSigner(t *testing.T) { + partitiontest.PartitionTest(t) + v := FalconSigner{} + bts := v.MarshalMsg(nil) + left, err := v.UnmarshalMsg(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) + } + + left, err = msgp.Skip(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after Skip(): %q", len(left), left) + } +} + +func TestRandomizedEncodingFalconSigner(t *testing.T) { + protocol.RunEncodingTest(t, &FalconSigner{}) +} + +func BenchmarkMarshalMsgFalconSigner(b *testing.B) { + v := FalconSigner{} + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.MarshalMsg(nil) + } +} + +func BenchmarkAppendMsgFalconSigner(b *testing.B) { + v := FalconSigner{} + bts := make([]byte, 0, v.Msgsize()) + bts = v.MarshalMsg(bts[0:0]) + b.SetBytes(int64(len(bts))) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + bts = v.MarshalMsg(bts[0:0]) + } +} + +func BenchmarkUnmarshalFalconSigner(b *testing.B) { + v := FalconSigner{} + bts := v.MarshalMsg(nil) + b.ReportAllocs() + b.SetBytes(int64(len(bts))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := v.UnmarshalMsg(bts) + if err != nil { + b.Fatal(err) + } + } +} + +func TestMarshalUnmarshalFalconVerifier(t *testing.T) { + partitiontest.PartitionTest(t) + v := FalconVerifier{} + bts := v.MarshalMsg(nil) + left, err := v.UnmarshalMsg(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) + } + + left, err = msgp.Skip(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after Skip(): %q", len(left), left) + } +} + +func TestRandomizedEncodingFalconVerifier(t *testing.T) { + protocol.RunEncodingTest(t, &FalconVerifier{}) +} + +func BenchmarkMarshalMsgFalconVerifier(b *testing.B) { + v := FalconVerifier{} + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.MarshalMsg(nil) + } +} + +func BenchmarkAppendMsgFalconVerifier(b *testing.B) { + v := FalconVerifier{} + bts := make([]byte, 0, v.Msgsize()) + bts = v.MarshalMsg(bts[0:0]) + b.SetBytes(int64(len(bts))) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + bts = v.MarshalMsg(bts[0:0]) + } +} + +func BenchmarkUnmarshalFalconVerifier(b *testing.B) { + v := FalconVerifier{} + bts := v.MarshalMsg(nil) + b.ReportAllocs() + b.SetBytes(int64(len(bts))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := v.UnmarshalMsg(bts) + if err != nil { + b.Fatal(err) + } + } +} + +func TestMarshalUnmarshalHashFactory(t *testing.T) { + partitiontest.PartitionTest(t) + v := HashFactory{} + bts := v.MarshalMsg(nil) + left, err := v.UnmarshalMsg(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) + } + + left, err = msgp.Skip(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after Skip(): %q", len(left), left) + } +} + +func TestRandomizedEncodingHashFactory(t *testing.T) { + protocol.RunEncodingTest(t, &HashFactory{}) +} + +func BenchmarkMarshalMsgHashFactory(b *testing.B) { + v := HashFactory{} + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.MarshalMsg(nil) + } +} + +func BenchmarkAppendMsgHashFactory(b *testing.B) { + v := HashFactory{} + bts := make([]byte, 0, v.Msgsize()) + bts = v.MarshalMsg(bts[0:0]) + b.SetBytes(int64(len(bts))) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + bts = v.MarshalMsg(bts[0:0]) + } +} + +func BenchmarkUnmarshalHashFactory(b *testing.B) { + v := HashFactory{} + bts := v.MarshalMsg(nil) + b.ReportAllocs() + b.SetBytes(int64(len(bts))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := v.UnmarshalMsg(bts) + if err != nil { + b.Fatal(err) + } + } +} + func TestMarshalUnmarshalMasterDerivationKey(t *testing.T) { partitiontest.PartitionTest(t) v := MasterDerivationKey{} diff --git a/crypto/multisig.go b/crypto/multisig.go index 6c9a1ca668..c97e3ce356 100644 --- a/crypto/multisig.go +++ b/crypto/multisig.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -217,7 +217,7 @@ func MultisigAssemble(unisig []MultisigSig) (msig MultisigSig, err error) { // MultisigVerify verifies an assembled MultisigSig func MultisigVerify(msg Hashable, addr Digest, sig MultisigSig) (verified bool, err error) { - batchVerifier := MakeBatchVerifierDefaultSize() + batchVerifier := MakeBatchVerifierWithAlgorithmDefaultSize() if verified, err = MultisigBatchVerify(msg, addr, sig, batchVerifier); err != nil { return diff --git a/crypto/multisig_test.go b/crypto/multisig_test.go index 8636331bf6..b4439f8c54 100644 --- a/crypto/multisig_test.go +++ b/crypto/multisig_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -141,7 +141,7 @@ func TestMultisig(t *testing.T) { require.True(t, verify, "Multisig: verification failed, verify flag was false") //test3: use the batch verification - br := MakeBatchVerifier(1) + br := MakeBatchVerifierWithAlgorithmDefaultSize() verify, err = MultisigBatchVerify(txid, addr, msig, br) require.NoError(t, err, "Multisig: unexpected verification failure with err") require.True(t, verify, "Multisig: verification failed, verify flag was false") @@ -257,7 +257,7 @@ func TestEmptyMultisig(t *testing.T) { verify, err := MultisigVerify(txid, addr, emptyMutliSig) require.False(t, verify, "Multisig: verification succeeded, it should failed") require.Error(t, err, "Multisig: did not return error as expected") - br := MakeBatchVerifier(1) + br := MakeBatchVerifierWithAlgorithmDefaultSize() verify, err = MultisigBatchVerify(txid, addr, emptyMutliSig, br) require.False(t, verify, "Multisig: verification succeeded, it should failed") require.Error(t, err, "Multisig: did not return error as expected") @@ -285,7 +285,7 @@ func TestIncorrectAddrresInMultisig(t *testing.T) { verify, err := MultisigVerify(txid, addr, MutliSig) require.False(t, verify, "Multisig: verification succeeded, it should failed") require.Error(t, err, "Multisig: did not return error as expected") - br := MakeBatchVerifier(1) + br := MakeBatchVerifierWithAlgorithmDefaultSize() verify, err = MultisigBatchVerify(txid, addr, MutliSig, br) require.False(t, verify, "Multisig: verification succeeded, it should failed") require.Error(t, err, "Multisig: did not return error as expected") @@ -324,7 +324,7 @@ func TestMoreThanMaxSigsInMultisig(t *testing.T) { verify, err := MultisigVerify(txid, addr, msig) require.False(t, verify, "Multisig: verification succeeded, it should failed") require.Error(t, err, "Multisig: did not return error as expected") - br := MakeBatchVerifier(1) + br := MakeBatchVerifierWithAlgorithmDefaultSize() verify, err = MultisigBatchVerify(txid, addr, msig, br) require.False(t, verify, "Multisig: verification succeeded, it should failed") require.Error(t, err, "Multisig: did not return error as expected") @@ -363,7 +363,7 @@ func TestOneSignatureIsEmpty(t *testing.T) { verify, err := MultisigVerify(txid, addr, msig) require.False(t, verify, "Multisig: verification succeeded, it should failed") require.Error(t, err, "Multisig: did not return error as expected") - br := MakeBatchVerifier(1) + br := MakeBatchVerifierWithAlgorithmDefaultSize() verify, err = MultisigBatchVerify(txid, addr, msig, br) require.False(t, verify, "Multisig: verification succeeded, it should failed") require.Error(t, err, "Multisig: did not return error as expected") @@ -404,7 +404,7 @@ func TestOneSignatureIsInvalid(t *testing.T) { verify, err := MultisigVerify(txid, addr, msig) require.False(t, verify, "Multisig: verification succeeded, it should failed") require.Error(t, err, "Multisig: did not return error as expected") - br := MakeBatchVerifier(1) + br := MakeBatchVerifierWithAlgorithmDefaultSize() verify, err = MultisigBatchVerify(txid, addr, msig, br) require.NoError(t, err, "Multisig: did not return error as expected") require.True(t, verify, "Multisig: verification succeeded, it should failed") diff --git a/crypto/onetimesig.go b/crypto/onetimesig.go index 435e856607..3f003719ae 100644 --- a/crypto/onetimesig.go +++ b/crypto/onetimesig.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -20,11 +20,9 @@ import ( "encoding/binary" "fmt" - "github.com/algorand/go-deadlock" - - "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/protocol" + "github.com/algorand/go-deadlock" ) // A OneTimeSignature is a cryptographic signature that is produced a limited @@ -162,7 +160,7 @@ type OneTimeSignatureSecretsPersistent struct { // FirstOffset denotes the first offset whose subkey appears in Offsets. // These subkeys correspond to batch FirstBatch-1. FirstOffset uint64 `codec:"firstoff"` - Offsets []ephemeralSubkey `codec:"offkeys,allocbound=-"` + Offsets []ephemeralSubkey `codec:"offkeys,allocbound=-"` // the bound is keyDilution // When Offsets is non-empty, OffsetsPK2 is the intermediate-level public // key that can be used to verify signatures on the subkeys in Offsets, and @@ -213,7 +211,7 @@ func GenerateOneTimeSignatureSecretsRNG(startBatch uint64, numBatches uint64, rn batchnum := startBatch + i newid := OneTimeSignatureSubkeyBatchID{SubKeyPK: pk, Batch: batchnum} - newsig := ed25519Sign(ephemeralSec, hashRep(newid)) + newsig := ed25519Sign(ephemeralSec, HashRep(newid)) subkeys[i] = ephemeralSubkey{ PK: pk, @@ -255,7 +253,7 @@ func (s *OneTimeSignatureSecrets) Sign(id OneTimeSignatureIdentifier, message Ha // Check if we already have a partial batch of subkeys. if id.Batch+1 == s.FirstBatch && id.Offset >= s.FirstOffset && id.Offset-s.FirstOffset < uint64(len(s.Offsets)) { offidx := id.Offset - s.FirstOffset - sig := ed25519Sign(s.Offsets[offidx].SK, hashRep(message)) + sig := ed25519Sign(s.Offsets[offidx].SK, HashRep(message)) return OneTimeSignature{ Sig: sig, PK: s.Offsets[offidx].PK, @@ -270,7 +268,7 @@ func (s *OneTimeSignatureSecrets) Sign(id OneTimeSignatureIdentifier, message Ha // Since we have not yet broken out this batch into per-offset keys, // generate a fresh subkey right away, sign it, and use it. pk, sk := ed25519GenerateKeyRNG(s.getRNG()) - sig := ed25519Sign(sk, hashRep(message)) + sig := ed25519Sign(sk, HashRep(message)) batchidx := id.Batch - s.FirstBatch pksig := s.Batches[batchidx].PKSigNew @@ -283,7 +281,7 @@ func (s *OneTimeSignatureSecrets) Sign(id OneTimeSignatureIdentifier, message Ha return OneTimeSignature{ Sig: sig, PK: pk, - PK1Sig: ed25519Sign(s.Batches[batchidx].SK, hashRep(pk1id)), + PK1Sig: ed25519Sign(s.Batches[batchidx].SK, HashRep(pk1id)), PK2: s.Batches[batchidx].PK, PK2Sig: pksig, } @@ -310,7 +308,7 @@ func (s *OneTimeSignatureSecrets) Sign(id OneTimeSignatureIdentifier, message Ha // OneTimeSignatureVerifier and some OneTimeSignatureIdentifier. // // It returns true if this is the case; otherwise, it returns false. -func (v OneTimeSignatureVerifier) Verify(id OneTimeSignatureIdentifier, message Hashable, sig OneTimeSignature) bool { +func (v OneTimeSignatureVerifier) Verify(id OneTimeSignatureIdentifier, message Hashable, sig OneTimeSignature, batchVersionCompatible bool) bool { offsetID := OneTimeSignatureSubkeyOffsetID{ SubKeyPK: sig.PK, Batch: id.Batch, @@ -321,13 +319,13 @@ func (v OneTimeSignatureVerifier) Verify(id OneTimeSignatureIdentifier, message Batch: id.Batch, } - if !ed25519Verify(ed25519PublicKey(v), hashRep(batchID), sig.PK2Sig) { + if !ed25519Verify(ed25519PublicKey(v), HashRep(batchID), sig.PK2Sig, batchVersionCompatible) { return false } - if !ed25519Verify(batchID.SubKeyPK, hashRep(offsetID), sig.PK1Sig) { + if !ed25519Verify(batchID.SubKeyPK, HashRep(offsetID), sig.PK1Sig, batchVersionCompatible) { return false } - if !ed25519Verify(offsetID.SubKeyPK, hashRep(message), sig.Sig) { + if !ed25519Verify(offsetID.SubKeyPK, HashRep(message), sig.Sig, batchVersionCompatible) { return false } return true @@ -393,7 +391,7 @@ func (s *OneTimeSignatureSecrets) DeleteBeforeFineGrained(current OneTimeSignatu s.FirstOffset = current.Offset for off := current.Offset; off < numKeysPerBatch; off++ { pk, sk := ed25519GenerateKeyRNG(s.getRNG()) - pksig := ed25519Sign(s.Batches[0].SK, hashRep(OneTimeSignatureSubkeyOffsetID{ + pksig := ed25519Sign(s.Batches[0].SK, HashRep(OneTimeSignatureSubkeyOffsetID{ SubKeyPK: pk, Batch: current.Batch, Offset: off, @@ -432,10 +430,10 @@ type OneTimeSigner struct { } // KeyDilution returns the appropriate key dilution value for a OneTimeSigner. -func (ots OneTimeSigner) KeyDilution(params config.ConsensusParams) uint64 { +func (ots OneTimeSigner) KeyDilution(defaultKeyDilution uint64) uint64 { if ots.OptionalKeyDilution != 0 { return ots.OptionalKeyDilution } - return params.DefaultKeyDilution + return defaultKeyDilution } diff --git a/crypto/onetimesig_test.go b/crypto/onetimesig_test.go index 9f1b85f061..30ba0554f6 100644 --- a/crypto/onetimesig_test.go +++ b/crypto/onetimesig_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -44,44 +44,44 @@ func testOneTimeSignVerifyNewStyle(t *testing.T, c *OneTimeSignatureSecrets, c2 s2 := randString() sig := c.Sign(id, s) - if !c.Verify(id, s, sig) { + if !c.Verify(id, s, sig, true) { t.Errorf("correct signature failed to verify (ephemeral)") } - if c.Verify(id, s2, sig) { + if c.Verify(id, s2, sig, true) { t.Errorf("signature verifies on wrong message") } sig2 := c2.Sign(id, s) - if c.Verify(id, s, sig2) { + if c.Verify(id, s, sig2, true) { t.Errorf("wrong master key incorrectly verified (ephemeral)") } otherID := randID() - if c.Verify(otherID, s, sig) { + if c.Verify(otherID, s, sig, true) { t.Errorf("signature verifies for wrong ID") } nextOffsetID := id nextOffsetID.Offset++ - if c.Verify(nextOffsetID, s, sig) { + if c.Verify(nextOffsetID, s, sig, true) { t.Errorf("signature verifies after changing offset") } c.DeleteBeforeFineGrained(nextOffsetID, 256) sigAfterDelete := c.Sign(id, s) - if c.Verify(id, s, sigAfterDelete) { // TODO(adam): Previously, this call to Verify was verifying old-style coarse-grained one-time signatures. Now it's verifying new-style fine-grained one-time signatures. Is this correct? + if c.Verify(id, s, sigAfterDelete, true) { // TODO(adam): Previously, this call to Verify was verifying old-style coarse-grained one-time signatures. Now it's verifying new-style fine-grained one-time signatures. Is this correct? t.Errorf("signature verifies after delete offset") } sigNextAfterDelete := c.Sign(nextOffsetID, s) - if !c.Verify(nextOffsetID, s, sigNextAfterDelete) { + if !c.Verify(nextOffsetID, s, sigNextAfterDelete, true) { t.Errorf("signature fails to verify after deleting up to this offset") } nextOffsetID.Offset++ sigNext2AfterDelete := c.Sign(nextOffsetID, s) - if !c.Verify(nextOffsetID, s, sigNext2AfterDelete) { + if !c.Verify(nextOffsetID, s, sigNext2AfterDelete, true) { t.Errorf("signature fails to verify after deleting up to previous offset") } @@ -92,18 +92,18 @@ func testOneTimeSignVerifyNewStyle(t *testing.T, c *OneTimeSignatureSecrets, c2 nextBatchOffsetID.Offset++ c.DeleteBeforeFineGrained(nextBatchOffsetID, 256) sigAfterDelete = c.Sign(nextBatchID, s) - if c.Verify(nextBatchID, s, sigAfterDelete) { + if c.Verify(nextBatchID, s, sigAfterDelete, true) { t.Errorf("signature verifies after delete") } sigNextAfterDelete = c.Sign(nextBatchOffsetID, s) - if !c.Verify(nextBatchOffsetID, s, sigNextAfterDelete) { + if !c.Verify(nextBatchOffsetID, s, sigNextAfterDelete, true) { t.Errorf("signature fails to verify after delete up to this offset") } nextBatchOffsetID.Offset++ sigNext2AfterDelete = c.Sign(nextBatchOffsetID, s) - if !c.Verify(nextBatchOffsetID, s, sigNext2AfterDelete) { + if !c.Verify(nextBatchOffsetID, s, sigNext2AfterDelete, true) { t.Errorf("signature fails to verify after delete up to previous offset") } @@ -114,27 +114,27 @@ func testOneTimeSignVerifyNewStyle(t *testing.T, c *OneTimeSignatureSecrets, c2 preBigJumpID := bigJumpID preBigJumpID.Batch-- - if c.Verify(preBigJumpID, s, c.Sign(preBigJumpID, s)) { + if c.Verify(preBigJumpID, s, c.Sign(preBigJumpID, s), true) { t.Errorf("preBigJumpID verifies") } preBigJumpID.Batch++ preBigJumpID.Offset-- - if c.Verify(preBigJumpID, s, c.Sign(preBigJumpID, s)) { + if c.Verify(preBigJumpID, s, c.Sign(preBigJumpID, s), true) { t.Errorf("preBigJumpID verifies") } - if !c.Verify(bigJumpID, s, c.Sign(bigJumpID, s)) { + if !c.Verify(bigJumpID, s, c.Sign(bigJumpID, s), true) { t.Errorf("bigJumpID does not verify") } bigJumpID.Offset++ - if !c.Verify(bigJumpID, s, c.Sign(bigJumpID, s)) { + if !c.Verify(bigJumpID, s, c.Sign(bigJumpID, s), true) { t.Errorf("bigJumpID.Offset++ does not verify") } bigJumpID.Batch++ - if !c.Verify(bigJumpID, s, c.Sign(bigJumpID, s)) { + if !c.Verify(bigJumpID, s, c.Sign(bigJumpID, s), true) { t.Errorf("bigJumpID.Batch++ does not verify") } } diff --git a/crypto/passphrase/errors.go b/crypto/passphrase/errors.go index ececfa67b1..7785ca256d 100644 --- a/crypto/passphrase/errors.go +++ b/crypto/passphrase/errors.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/crypto/passphrase/passphrase.go b/crypto/passphrase/passphrase.go index d57eeff8f3..f90593ce53 100644 --- a/crypto/passphrase/passphrase.go +++ b/crypto/passphrase/passphrase.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/crypto/passphrase/passphrase_test.go b/crypto/passphrase/passphrase_test.go index fc4b399d13..3874f57e0c 100644 --- a/crypto/passphrase/passphrase_test.go +++ b/crypto/passphrase/passphrase_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/crypto/passphrase/wordlist.go b/crypto/passphrase/wordlist.go index 77a20b2fc0..4da8591359 100644 --- a/crypto/passphrase/wordlist.go +++ b/crypto/passphrase/wordlist.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/crypto/rand.go b/crypto/rand.go index 905917f1d6..729e01c17b 100644 --- a/crypto/rand.go +++ b/crypto/rand.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/crypto/rand_test.go b/crypto/rand_test.go index b36cb6a5bc..5f69fd55ce 100644 --- a/crypto/rand_test.go +++ b/crypto/rand_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/crypto/secp256k1/secp256_test.go b/crypto/secp256k1/secp256_test.go index ef2a3a3790..3ee7d2c0b1 100644 --- a/crypto/secp256k1/secp256_test.go +++ b/crypto/secp256k1/secp256_test.go @@ -12,6 +12,8 @@ import ( "encoding/hex" "io" "testing" + + "github.com/algorand/go-algorand/test/partitiontest" ) const TestCount = 1000 @@ -84,6 +86,8 @@ func TestSignatureValidity(t *testing.T) { } func TestInvalidRecoveryID(t *testing.T) { + partitiontest.PartitionTest(t) + _, seckey := generateKeyPair() msg := csprngEntropy(32) sig, _ := Sign(msg, seckey) @@ -95,6 +99,8 @@ func TestInvalidRecoveryID(t *testing.T) { } func TestSignAndRecover(t *testing.T) { + partitiontest.PartitionTest(t) + pubkey1, seckey := generateKeyPair() msg := csprngEntropy(32) sig, err := Sign(msg, seckey) @@ -111,6 +117,8 @@ func TestSignAndRecover(t *testing.T) { } func TestSignDeterministic(t *testing.T) { + partitiontest.PartitionTest(t) + _, seckey := generateKeyPair() msg := make([]byte, 32) copy(msg, "hi there") @@ -129,6 +137,8 @@ func TestSignDeterministic(t *testing.T) { } func TestRandomMessagesWithSameKey(t *testing.T) { + partitiontest.PartitionTest(t) + pubkey, seckey := generateKeyPair() keys := func() ([]byte, []byte) { return pubkey, seckey @@ -137,6 +147,8 @@ func TestRandomMessagesWithSameKey(t *testing.T) { } func TestRandomMessagesWithRandomKeys(t *testing.T) { + partitiontest.PartitionTest(t) + keys := func() ([]byte, []byte) { pubkey, seckey := generateKeyPair() return pubkey, seckey @@ -174,6 +186,8 @@ func signAndRecoverWithRandomMessages(t *testing.T, keys func() ([]byte, []byte) } func TestRecoveryOfRandomSignature(t *testing.T) { + partitiontest.PartitionTest(t) + pubkey1, _ := generateKeyPair() msg := csprngEntropy(32) @@ -187,6 +201,8 @@ func TestRecoveryOfRandomSignature(t *testing.T) { } func TestRandomMessagesAgainstValidSig(t *testing.T) { + partitiontest.PartitionTest(t) + pubkey1, seckey := generateKeyPair() msg := csprngEntropy(32) sig, _ := Sign(msg, seckey) @@ -204,6 +220,8 @@ func TestRandomMessagesAgainstValidSig(t *testing.T) { // Useful when the underlying libsecp256k1 API changes to quickly // check only recover function without use of signature function func TestRecoverSanity(t *testing.T) { + partitiontest.PartitionTest(t) + msg, _ := hex.DecodeString("ce0677bb30baa8cf067c88db9811f4333d131bf8bcf12fe7065d211dce971008") sig, _ := hex.DecodeString("90f27b8b488db00b00606796d2987f6a5f59ae62ea05effe84fef5b8b0e549984a691139ad57a3f0b906637673aa2f63d1f55cb1a69199d4009eea23ceaddc9301") pubkey1, _ := hex.DecodeString("04e32df42865e97135acfb65f3bae71bdc86f4d49150ad6a440b6f15878109880a0a2b2667f7e725ceea70c673093bf67663e0312623c8e091b13cf2c0f11ef652") diff --git a/crypto/util.go b/crypto/util.go index 568570928c..2ee4ee7941 100644 --- a/crypto/util.go +++ b/crypto/util.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -34,7 +34,8 @@ type Hashable interface { ToBeHashed() (protocol.HashID, []byte) } -func hashRep(h Hashable) []byte { +// HashRep appends the correct hashid before the message to be hashed. +func HashRep(h Hashable) []byte { hashid, data := h.ToBeHashed() return append([]byte(hashid), data...) } @@ -45,6 +46,11 @@ const DigestSize = sha512.Size256 // Digest represents a 32-byte value holding the 256-bit Hash digest. type Digest [DigestSize]byte +// ToSlice converts Digest to slice, is used by bookkeeping.PaysetCommit +func (d Digest) ToSlice() []byte { + return d[:] +} + // String returns the digest in a human-readable Base32 string func (d Digest) String() string { return base32.StdEncoding.WithPadding(base32.NoPadding).EncodeToString(d[:]) @@ -81,7 +87,7 @@ func Hash(data []byte) Digest { // HashObj computes a hash of a Hashable object and its type func HashObj(h Hashable) Digest { - return Hash(hashRep(h)) + return Hash(HashRep(h)) } // NewHash returns a sha512-256 object to do the same operation as Hash() diff --git a/crypto/util_test.go b/crypto/util_test.go index 0488dcadbe..281d78a1de 100644 --- a/crypto/util_test.go +++ b/crypto/util_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/crypto/vrf.go b/crypto/vrf.go index 88e3144854..dfc2fbf1c6 100644 --- a/crypto/vrf.go +++ b/crypto/vrf.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -108,7 +108,7 @@ func (sk VrfPrivkey) proveBytes(msg []byte) (proof VrfProof, ok bool) { // Prove constructs a VRF Proof for a given Hashable. // ok will be false if the private key is malformed. func (sk VrfPrivkey) Prove(message Hashable) (proof VrfProof, ok bool) { - return sk.proveBytes(hashRep(message)) + return sk.proveBytes(HashRep(message)) } // Hash converts a VRF proof to a VRF output without verifying the proof. @@ -134,5 +134,5 @@ func (pk VrfPubkey) verifyBytes(proof VrfProof, msg []byte) (bool, VrfOutput) { // However, given a public key and message, all valid proofs will yield the same output. // Moreover, the output is indistinguishable from random to anyone without the proof or the secret key. func (pk VrfPubkey) Verify(p VrfProof, message Hashable) (bool, VrfOutput) { - return pk.verifyBytes(p, hashRep(message)) + return pk.verifyBytes(p, HashRep(message)) } diff --git a/crypto/vrf_test.go b/crypto/vrf_test.go index 42e8dc7cc3..72c7f68b3a 100644 --- a/crypto/vrf_test.go +++ b/crypto/vrf_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/algod/api/algod.oas2.json b/daemon/algod/api/algod.oas2.json index 57b719d5a8..17b59d71a8 100644 --- a/daemon/algod/api/algod.oas2.json +++ b/daemon/algod/api/algod.oas2.json @@ -463,13 +463,10 @@ } }, "/v2/participation": { - "get": { - "tags": [ "private" ], - "description": "Return a list of participation keys", "produces": [ "application/json" @@ -497,7 +494,7 @@ } }, "404": { - "description": "Application Not Found", + "description": "Participation Key Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } @@ -513,14 +510,10 @@ } } }, - - "post": { - "tags": [ "private" ], - "consumes": [ "application/msgpack" ], @@ -544,7 +537,6 @@ } } ], - "responses": { "200": { "$ref": "#/responses/PostParticipationResponse" @@ -561,6 +553,12 @@ "$ref": "#/definitions/ErrorResponse" } }, + "404": { + "description": "Participation Key Not Found", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, "500": { "description": "Internal Error", "schema": { @@ -577,30 +575,25 @@ "description": "Unknown Error" } } - } - }, "/v2/participation/{participation-id}": { "delete": { - "tags": [ "private" ], - - "description": "Delete a given participation key by id", + "description": "Delete a given participation key by ID", "produces": [ "application/json" ], - "schemes": [ "http" ], - "summary": "Delete a given participation key by id", + "summary": "Delete a given participation key by ID", "operationId": "DeleteParticipationKeyByID", "responses": { "200": { - "$ref": "#/responses/DeleteParticipationIdResponse" + "description": "Participation key got deleted by ID" }, "400": { "description": "Bad Request", @@ -614,6 +607,12 @@ "$ref": "#/definitions/ErrorResponse" } }, + "404": { + "description": "Participation Key Not Found", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, "500": { "description": "Internal Error", "schema": { @@ -624,23 +623,19 @@ "description": "Unknown Error" } } - }, - "get": { - "tags": [ "private" ], - - "description": "Given a participation id, return information about that participation key", + "description": "Given a participation ID, return information about that participation key", "produces": [ "application/json" ], "schemes": [ "http" ], - "summary": "Get participation key info by id", + "summary": "Get participation key info given a participation ID", "operationId": "GetParticipationKeyByID", "responses": { "200": { @@ -660,7 +655,69 @@ } }, "404": { - "description": "Application Not Found", + "description": "Participation Key Not Found", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "500": { + "description": "Internal Error", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "default": { + "description": "Unknown Error" + } + } + }, + "post": { + "tags": [ + "private" + ], + "description": "Given a participation ID, append state proof keys to a particular set of participation keys", + "consumes": [ + "application/msgpack" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "description": "The state proof keys to add to an existing participation ID", + "name": "keymap", + "in": "body", + "required": true, + "schema": { + "type": "string", + "format": "binary" + } + } + ], + "schemes": [ + "http" + ], + "summary": "Append state proof keys to a participation key", + "operationId": "AppendKeys", + "responses": { + "200": { + "description": "OK", + "$ref": "#/responses/ParticipationKeyResponse" + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "401": { + "description": "Invalid API Token", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "404": { + "description": "Participation Key Not Found", "schema": { "$ref": "#/definitions/ErrorResponse" } @@ -951,7 +1008,7 @@ }, "/v2/transactions/pending/{txid}": { "get": { - "description": "Given a transaction id of a recently submitted transaction, it returns information about it. There are several cases when this might succeed:\n- transaction committed (committed round \u003e 0)\n- transaction still in the pool (committed round = 0, pool error = \"\")\n- transaction removed from pool due to error (committed round = 0, pool error != \"\")\nOr the transaction may have happened sufficiently long ago that the node no longer remembers it, and this will return an error.\n", + "description": "Given a transaction ID of a recently submitted transaction, it returns information about it. There are several cases when this might succeed:\n- transaction committed (committed round \u003e 0)\n- transaction still in the pool (committed round = 0, pool error = \"\")\n- transaction removed from pool due to error (committed round = 0, pool error != \"\")\nOr the transaction may have happened sufficiently long ago that the node no longer remembers it, and this will return an error.\n", "produces": [ "application/json", "application/msgpack" @@ -965,7 +1022,7 @@ { "pattern": "[A-Z0-9]+", "type": "string", - "description": "A transaction id", + "description": "A transaction ID", "name": "txid", "in": "path", "required": true @@ -976,7 +1033,7 @@ ], "responses": { "200": { - "description": "Given a transaction id of a recently submitted transaction, it returns information about it. There are several cases when this might succeed:\n- transaction committed (committed round \u003e 0)\n- transaction still in the pool (committed round = 0, pool error = \"\")\n- transaction removed from pool due to error (committed round = 0, pool error != \"\")\n\nOr the transaction may have happened sufficiently long ago that the node no longer remembers it, and this will return an error.", + "description": "Given a transaction ID of a recently submitted transaction, it returns information about it. There are several cases when this might succeed:\n- transaction committed (committed round \u003e 0)\n- transaction still in the pool (committed round = 0, pool error = \"\")\n- transaction removed from pool due to error (committed round = 0, pool error != \"\")\n\nOr the transaction may have happened sufficiently long ago that the node no longer remembers it, and this will return an error.", "schema": { "$ref": "#/definitions/PendingTransactionResponse" } @@ -1015,7 +1072,7 @@ }, "/v2/applications/{application-id}": { "get": { - "description": "Given a application id, it returns application information including creator, approval and clear programs, global and local schemas, and global state.", + "description": "Given a application ID, it returns application information including creator, approval and clear programs, global and local schemas, and global state.", "produces": [ "application/json" ], @@ -1078,7 +1135,7 @@ }, "/v2/assets/{asset-id}": { "get": { - "description": "Given a asset id, it returns asset information including creator, name, total supply and special addresses.", + "description": "Given a asset ID, it returns asset information including creator, name, total supply and special addresses.", "produces": [ "application/json" ], @@ -1371,7 +1428,8 @@ "pending-rewards", "amount-without-pending-rewards", "rewards", - "status" + "status", + "min-balance" ], "properties": { "address": { @@ -1382,6 +1440,10 @@ "description": "\\[algo\\] total number of MicroAlgos in the account", "type": "integer" }, + "min-balance": { + "description": "MicroAlgo balance required by the account.\n\nThe requirement grows based on asset and application usage.", + "type": "integer" + }, "amount-without-pending-rewards": { "description": "specifies the amount of MicroAlgos in the account, without the pending rewards.", "type": "integer" @@ -1493,6 +1555,11 @@ "description": "\\[vote\\] root participation public key (if any) currently registered for this round.", "type": "string", "format": "byte" + }, + "state-proof-key": { + "description": "\\[stprf\\] Root of the state proof key (if any)", + "type": "string", + "format": "byte" } } }, @@ -1926,6 +1993,13 @@ "type": "string" } }, + "logic-sig-disassembly": { + "description": "Disassembled lsig program line by line.", + "type": "array", + "items": { + "type": "string" + } + }, "logic-sig-trace": { "type": "array", "items": { @@ -2418,7 +2492,9 @@ "required": [ "proof", "stibhash", - "idx" + "idx", + "treedepth", + "hashtype" ], "properties": { "proof": { @@ -2431,9 +2507,21 @@ "type": "string", "format": "byte" }, + "treedepth": { + "description": "Represents the depth of the tree that is being proven, i.e. the number of edges from a leaf to the root.", + "type": "integer" + }, "idx": { "description": "Index of the transaction in the block's payset.", "type": "integer" + }, + "hashtype": { + "enum": [ + "sumhash", + "sha512_256" + ], + "type": "string", + "description": "The type of hash function used to create the proof, must be one of:\n* sumhash \n* sha512_256" } } } @@ -2577,7 +2665,6 @@ } } }, - "ParticipationKeysResponse": { "description": "A list of participation keys", "schema": { @@ -2588,23 +2675,11 @@ } }, "ParticipationKeyResponse": { - "description": "A detailed description of a participation id", + "description": "A detailed description of a participation ID", "schema": { - "type": "object", - "required": [ - "participationKey" - ], - "properties": { - "participationKey": { - "description": "Detailed description of a participation key", - "type": "string" - } - } + "$ref": "#/definitions/ParticipationKey" } }, - "DeleteParticipationIdResponse" : { - "description": "Participation key got deleted by ID" - }, "PostParticipationResponse" : { "description": "Participation ID of the submission", "schema": { @@ -2614,7 +2689,7 @@ ], "properties": { "partId": { - "description": "encoding of the participation id.", + "description": "encoding of the participation ID.", "type": "string" } } diff --git a/daemon/algod/api/algod.oas3.yml b/daemon/algod/api/algod.oas3.yml index a8a4d9ea8b..a5af364aff 100644 --- a/daemon/algod/api/algod.oas3.yml +++ b/daemon/algod/api/algod.oas3.yml @@ -341,10 +341,6 @@ }, "description": "Teal compile Result" }, - "DeleteParticipationIdResponse": { - "content": {}, - "description": "Participation key got deleted by ID" - }, "DryrunResponse": { "content": { "application/json": { @@ -461,20 +457,11 @@ "content": { "application/json": { "schema": { - "properties": { - "participationKey": { - "description": "Detailed description of a participation key", - "type": "string" - } - }, - "required": [ - "participationKey" - ], - "type": "object" + "$ref": "#/components/schemas/ParticipationKey" } } }, - "description": "A detailed description of a participation id" + "description": "A detailed description of a participation ID" }, "ParticipationKeysResponse": { "content": { @@ -525,7 +512,7 @@ "schema": { "properties": { "partId": { - "description": "encoding of the participation id.", + "description": "encoding of the participation ID.", "type": "string" } }, @@ -562,6 +549,14 @@ "application/json": { "schema": { "properties": { + "hashtype": { + "description": "The type of hash function used to create the proof, must be one of:\n* sumhash \n* sha512_256", + "enum": [ + "sumhash", + "sha512_256" + ], + "type": "string" + }, "idx": { "description": "Index of the transaction in the block's payset.", "type": "integer" @@ -577,12 +572,18 @@ "format": "byte", "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string" + }, + "treedepth": { + "description": "Represents the depth of the tree that is being proven, i.e. the number of edges from a leaf to the root.", + "type": "integer" } }, "required": [ + "hashtype", "idx", "proof", - "stibhash" + "stibhash", + "treedepth" ], "type": "object" } @@ -735,6 +736,10 @@ }, "type": "array" }, + "min-balance": { + "description": "MicroAlgo balance required by the account.\n\nThe requirement grows based on asset and application usage.", + "type": "integer" + }, "participation": { "$ref": "#/components/schemas/AccountParticipation" }, @@ -772,6 +777,7 @@ "address", "amount", "amount-without-pending-rewards", + "min-balance", "pending-rewards", "rewards", "round", @@ -788,6 +794,12 @@ "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string" }, + "state-proof-key": { + "description": "\\[stprf\\] Root of the state proof key (if any)", + "format": "byte", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type": "string" + }, "vote-first-valid": { "description": "\\[voteFst\\] First round for which this participation is valid.", "type": "integer" @@ -1246,6 +1258,13 @@ }, "type": "array" }, + "logic-sig-disassembly": { + "description": "Disassembled lsig program line by line.", + "items": { + "type": "string" + }, + "type": "array" + }, "logic-sig-messages": { "items": { "type": "string" @@ -1902,7 +1921,7 @@ }, "/v2/applications/{application-id}": { "get": { - "description": "Given a application id, it returns application information including creator, approval and clear programs, global and local schemas, and global state.", + "description": "Given a application ID, it returns application information including creator, approval and clear programs, global and local schemas, and global state.", "operationId": "GetApplicationByID", "parameters": [ { @@ -1976,7 +1995,7 @@ }, "/v2/assets/{asset-id}": { "get": { - "description": "Given a asset id, it returns asset information including creator, name, total supply and special addresses.", + "description": "Given a asset ID, it returns asset information including creator, name, total supply and special addresses.", "operationId": "GetAssetByID", "parameters": [ { @@ -2235,6 +2254,14 @@ "application/json": { "schema": { "properties": { + "hashtype": { + "description": "The type of hash function used to create the proof, must be one of:\n* sumhash \n* sha512_256", + "enum": [ + "sumhash", + "sha512_256" + ], + "type": "string" + }, "idx": { "description": "Index of the transaction in the block's payset.", "type": "integer" @@ -2250,12 +2277,18 @@ "format": "byte", "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string" + }, + "treedepth": { + "description": "Represents the depth of the tree that is being proven, i.e. the number of edges from a leaf to the root.", + "type": "integer" } }, "required": [ + "hashtype", "idx", "proof", - "stibhash" + "stibhash", + "treedepth" ], "type": "object" } @@ -2586,7 +2619,7 @@ } } }, - "description": "Application Not Found" + "description": "Participation Key Not Found" }, "500": { "content": { @@ -2629,7 +2662,7 @@ "schema": { "properties": { "partId": { - "description": "encoding of the participation id.", + "description": "encoding of the participation ID.", "type": "string" } }, @@ -2662,6 +2695,16 @@ }, "description": "Invalid API Token" }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Participation Key Not Found" + }, "500": { "content": { "application/json": { @@ -2696,7 +2739,7 @@ }, "/v2/participation/{participation-id}": { "delete": { - "description": "Delete a given participation key by id", + "description": "Delete a given participation key by ID", "operationId": "DeleteParticipationKeyByID", "parameters": [ { @@ -2733,6 +2776,16 @@ }, "description": "Invalid API Token" }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Participation Key Not Found" + }, "500": { "content": { "application/json": { @@ -2748,13 +2801,13 @@ "description": "Unknown Error" } }, - "summary": "Delete a given participation key by id", + "summary": "Delete a given participation key by ID", "tags": [ "private" ] }, "get": { - "description": "Given a participation id, return information about that participation key", + "description": "Given a participation ID, return information about that participation key", "operationId": "GetParticipationKeyByID", "parameters": [ { @@ -2771,20 +2824,11 @@ "content": { "application/json": { "schema": { - "properties": { - "participationKey": { - "description": "Detailed description of a participation key", - "type": "string" - } - }, - "required": [ - "participationKey" - ], - "type": "object" + "$ref": "#/components/schemas/ParticipationKey" } } }, - "description": "A detailed description of a participation id" + "description": "A detailed description of a participation ID" }, "400": { "content": { @@ -2814,7 +2858,7 @@ } } }, - "description": "Application Not Found" + "description": "Participation Key Not Found" }, "500": { "content": { @@ -2831,10 +2875,97 @@ "description": "Unknown Error" } }, - "summary": "Get participation key info by id", + "summary": "Get participation key info given a participation ID", "tags": [ "private" ] + }, + "post": { + "description": "Given a participation ID, append state proof keys to a particular set of participation keys", + "operationId": "AppendKeys", + "parameters": [ + { + "in": "path", + "name": "participation-id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/msgpack": { + "schema": { + "format": "binary", + "type": "string" + } + } + }, + "description": "The state proof keys to add to an existing participation ID", + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ParticipationKey" + } + } + }, + "description": "A detailed description of a participation ID" + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Bad Request" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Invalid API Token" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Participation Key Not Found" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Internal Error" + }, + "default": { + "content": {}, + "description": "Unknown Error" + } + }, + "summary": "Append state proof keys to a participation key", + "tags": [ + "private" + ], + "x-codegen-request-body-name": "keymap" } }, "/v2/shutdown": { @@ -3617,11 +3748,11 @@ }, "/v2/transactions/pending/{txid}": { "get": { - "description": "Given a transaction id of a recently submitted transaction, it returns information about it. There are several cases when this might succeed:\n- transaction committed (committed round > 0)\n- transaction still in the pool (committed round = 0, pool error = \"\")\n- transaction removed from pool due to error (committed round = 0, pool error != \"\")\nOr the transaction may have happened sufficiently long ago that the node no longer remembers it, and this will return an error.\n", + "description": "Given a transaction ID of a recently submitted transaction, it returns information about it. There are several cases when this might succeed:\n- transaction committed (committed round > 0)\n- transaction still in the pool (committed round = 0, pool error = \"\")\n- transaction removed from pool due to error (committed round = 0, pool error != \"\")\nOr the transaction may have happened sufficiently long ago that the node no longer remembers it, and this will return an error.\n", "operationId": "PendingTransactionInformation", "parameters": [ { - "description": "A transaction id", + "description": "A transaction ID", "in": "path", "name": "txid", "required": true, @@ -3657,7 +3788,7 @@ } } }, - "description": "Given a transaction id of a recently submitted transaction, it returns information about it. There are several cases when this might succeed:\n- transaction committed (committed round > 0)\n- transaction still in the pool (committed round = 0, pool error = \"\")\n- transaction removed from pool due to error (committed round = 0, pool error != \"\")\n\nOr the transaction may have happened sufficiently long ago that the node no longer remembers it, and this will return an error." + "description": "Given a transaction ID of a recently submitted transaction, it returns information about it. There are several cases when this might succeed:\n- transaction committed (committed round > 0)\n- transaction still in the pool (committed round = 0, pool error = \"\")\n- transaction removed from pool due to error (committed round = 0, pool error != \"\")\n\nOr the transaction may have happened sufficiently long ago that the node no longer remembers it, and this will return an error." }, "400": { "content": { diff --git a/daemon/algod/api/client/encoding.go b/daemon/algod/api/client/encoding.go index 36d034d22d..036948c1d0 100644 --- a/daemon/algod/api/client/encoding.go +++ b/daemon/algod/api/client/encoding.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/algod/api/client/restClient.go b/daemon/algod/api/client/restClient.go index f57c0d0bef..acfa0da140 100644 --- a/daemon/algod/api/client/restClient.go +++ b/daemon/algod/api/client/restClient.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/algod/api/server/common/handlers.go b/daemon/algod/api/server/common/handlers.go index d3cd32faa2..c0d2f43a99 100644 --- a/daemon/algod/api/server/common/handlers.go +++ b/daemon/algod/api/server/common/handlers.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/algod/api/server/common/metrics.go b/daemon/algod/api/server/common/metrics.go index df28d091bf..4920acfb69 100644 --- a/daemon/algod/api/server/common/metrics.go +++ b/daemon/algod/api/server/common/metrics.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/algod/api/server/common/responses.go b/daemon/algod/api/server/common/responses.go index 1667edf46e..452ed5808b 100644 --- a/daemon/algod/api/server/common/responses.go +++ b/daemon/algod/api/server/common/responses.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/algod/api/server/common/routes.go b/daemon/algod/api/server/common/routes.go index 995f16e1d9..153a685bf9 100644 --- a/daemon/algod/api/server/common/routes.go +++ b/daemon/algod/api/server/common/routes.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/algod/api/server/lib/common.go b/daemon/algod/api/server/lib/common.go index 1b71337d85..8e002d26af 100644 --- a/daemon/algod/api/server/lib/common.go +++ b/daemon/algod/api/server/lib/common.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/algod/api/server/lib/middlewares/auth.go b/daemon/algod/api/server/lib/middlewares/auth.go index c3c15c2b19..168afdc844 100644 --- a/daemon/algod/api/server/lib/middlewares/auth.go +++ b/daemon/algod/api/server/lib/middlewares/auth.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/algod/api/server/lib/middlewares/auth_test.go b/daemon/algod/api/server/lib/middlewares/auth_test.go index b0dd0fe260..7e00b66c3d 100644 --- a/daemon/algod/api/server/lib/middlewares/auth_test.go +++ b/daemon/algod/api/server/lib/middlewares/auth_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/algod/api/server/lib/middlewares/connectionLimiter.go b/daemon/algod/api/server/lib/middlewares/connectionLimiter.go new file mode 100644 index 0000000000..bf27ef2b60 --- /dev/null +++ b/daemon/algod/api/server/lib/middlewares/connectionLimiter.go @@ -0,0 +1,48 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package middlewares + +import ( + "net/http" + + "github.com/labstack/echo/v4" +) + +// MakeConnectionLimiter makes an echo middleware that limits the number of +// simultaneous connections. All connections above the limit will be returned +// the 429 Too Many Requests http error. +func MakeConnectionLimiter(limit uint64) echo.MiddlewareFunc { + sem := make(chan struct{}, limit) + + return func(next echo.HandlerFunc) echo.HandlerFunc { + return func(ctx echo.Context) error { + select { + case sem <- struct{}{}: + defer func() { + // If we fail to read from `sem`, just continue. + select { + case <-sem: + default: + } + }() + return next(ctx) + default: + return ctx.NoContent(http.StatusTooManyRequests) + } + } + } +} diff --git a/daemon/algod/api/server/lib/middlewares/connectionLimiter_test.go b/daemon/algod/api/server/lib/middlewares/connectionLimiter_test.go new file mode 100644 index 0000000000..6de0a3c207 --- /dev/null +++ b/daemon/algod/api/server/lib/middlewares/connectionLimiter_test.go @@ -0,0 +1,100 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package middlewares_test + +import ( + "errors" + "net/http" + "net/http/httptest" + "testing" + + "github.com/labstack/echo/v4" + "github.com/stretchr/testify/assert" + + "github.com/algorand/go-algorand/daemon/algod/api/server/lib/middlewares" + "github.com/algorand/go-algorand/test/partitiontest" +) + +func TestConnectionLimiterBasic(t *testing.T) { + partitiontest.PartitionTest(t) + + e := echo.New() + + handlerCh := make(chan struct{}) + limit := 5 + handler := func(c echo.Context) error { + <-handlerCh + return c.String(http.StatusOK, "test") + } + middleware := middlewares.MakeConnectionLimiter(uint64(limit)) + + numConnections := 13 + for i := 0; i < 3; i++ { + var recorders []*httptest.ResponseRecorder + doneCh := make(chan int) + errCh := make(chan error) + + for index := 0; index < numConnections; index++ { + req := httptest.NewRequest(http.MethodGet, "/", nil) + rec := httptest.NewRecorder() + ctx := e.NewContext(req, rec) + + recorders = append(recorders, rec) + + go func(index int) { + err := middleware(handler)(ctx) + doneCh <- index + errCh <- err + }(index) + } + + // Check http 429 code. + for j := 0; j < numConnections-limit; j++ { + index := <-doneCh + assert.Equal(t, http.StatusTooManyRequests, recorders[index].Code) + } + + // Let handlers finish. + for j := 0; j < limit; j++ { + handlerCh <- struct{}{} + } + + // All other connections must return 200. + for j := 0; j < limit; j++ { + index := <-doneCh + assert.Equal(t, http.StatusOK, recorders[index].Code) + } + + // Check that no errors were returned by the middleware. + for i := 0; i < numConnections; i++ { + assert.NoError(t, <-errCh) + } + } +} + +func TestConnectionLimiterForwardsError(t *testing.T) { + partitiontest.PartitionTest(t) + + handlerError := errors.New("handler error") + handler := func(c echo.Context) error { + return handlerError + } + middleware := middlewares.MakeConnectionLimiter(1) + + err := middleware(handler)(nil) + assert.ErrorIs(t, err, handlerError) +} diff --git a/daemon/algod/api/server/lib/middlewares/cors.go b/daemon/algod/api/server/lib/middlewares/cors.go index dcf38bad33..71cacb280e 100644 --- a/daemon/algod/api/server/lib/middlewares/cors.go +++ b/daemon/algod/api/server/lib/middlewares/cors.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/algod/api/server/lib/middlewares/logger.go b/daemon/algod/api/server/lib/middlewares/logger.go index 7ccfaed193..94559abd09 100644 --- a/daemon/algod/api/server/lib/middlewares/logger.go +++ b/daemon/algod/api/server/lib/middlewares/logger.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/algod/api/server/router.go b/daemon/algod/api/server/router.go index 04cfa4ac2d..57e56f817a 100644 --- a/daemon/algod/api/server/router.go +++ b/daemon/algod/api/server/router.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -81,6 +81,8 @@ import ( const ( apiV1Tag = "/v1" + // TokenHeader is the header where we put the token. + TokenHeader = "X-Algo-API-Token" ) // wrapCtx passes a common context to each request without a global variable. @@ -99,11 +101,8 @@ func registerHandlers(router *echo.Echo, prefix string, routes lib.Routes, ctx l } } -// TokenHeader is the header where we put the token. -const TokenHeader = "X-Algo-API-Token" - // NewRouter builds and returns a new router with our REST handlers registered. -func NewRouter(logger logging.Logger, node *node.AlgorandFullNode, shutdown <-chan struct{}, apiToken string, adminAPIToken string, listener net.Listener) *echo.Echo { +func NewRouter(logger logging.Logger, node *node.AlgorandFullNode, shutdown <-chan struct{}, apiToken string, adminAPIToken string, listener net.Listener, numConnectionsLimit uint64) *echo.Echo { if err := tokens.ValidateAPIToken(apiToken); err != nil { logger.Errorf("Invalid apiToken was passed to NewRouter ('%s'): %v", apiToken, err) } @@ -118,9 +117,12 @@ func NewRouter(logger logging.Logger, node *node.AlgorandFullNode, shutdown <-ch e.Listener = listener e.HideBanner = true - e.Pre(middleware.RemoveTrailingSlash()) - e.Use(middlewares.MakeLogger(logger)) - e.Use(middlewares.MakeCORS(TokenHeader)) + e.Pre( + middlewares.MakeConnectionLimiter(numConnectionsLimit), + middleware.RemoveTrailingSlash()) + e.Use( + middlewares.MakeLogger(logger), + middlewares.MakeCORS(TokenHeader)) // Request Context ctx := lib.ReqContext{Node: node, Log: logger, Shutdown: shutdown} diff --git a/daemon/algod/api/server/router_test.go b/daemon/algod/api/server/router_test.go index 7474165a94..edc5933d7b 100644 --- a/daemon/algod/api/server/router_test.go +++ b/daemon/algod/api/server/router_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/algod/api/server/v1/handlers/errors.go b/daemon/algod/api/server/v1/handlers/errors.go index 5ae037969c..ae70a52e96 100644 --- a/daemon/algod/api/server/v1/handlers/errors.go +++ b/daemon/algod/api/server/v1/handlers/errors.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/algod/api/server/v1/handlers/handlers.go b/daemon/algod/api/server/v1/handlers/handlers.go index 9d2d34934a..e4b6d94cef 100644 --- a/daemon/algod/api/server/v1/handlers/handlers.go +++ b/daemon/algod/api/server/v1/handlers/handlers.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -508,7 +508,7 @@ func blockEncode(b bookkeeping.Block, c agreement.Certificate) (v1.Block, error) CompactCertNextRound: uint64(b.CompactCert[protocol.CompactCertBasic].CompactCertNextRound), } - if !b.CompactCert[protocol.CompactCertBasic].CompactCertVoters.IsZero() { + if !b.CompactCert[protocol.CompactCertBasic].CompactCertVoters.IsEmpty() { voters := b.CompactCert[protocol.CompactCertBasic].CompactCertVoters block.CompactCertVoters = voters[:] } diff --git a/daemon/algod/api/server/v1/handlers/handlers_test.go b/daemon/algod/api/server/v1/handlers/handlers_test.go index 8649efc4fa..6e54c9118b 100644 --- a/daemon/algod/api/server/v1/handlers/handlers_test.go +++ b/daemon/algod/api/server/v1/handlers/handlers_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/algod/api/server/v1/handlers/responses.go b/daemon/algod/api/server/v1/handlers/responses.go index 33a8b75f4f..16f8a51b09 100644 --- a/daemon/algod/api/server/v1/handlers/responses.go +++ b/daemon/algod/api/server/v1/handlers/responses.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/algod/api/server/v1/routes/routes.go b/daemon/algod/api/server/v1/routes/routes.go index 6f79d18018..94496e294d 100644 --- a/daemon/algod/api/server/v1/routes/routes.go +++ b/daemon/algod/api/server/v1/routes/routes.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/algod/api/server/v2/account.go b/daemon/algod/api/server/v2/account.go index 2187a1068b..57bb07e64e 100644 --- a/daemon/algod/api/server/v2/account.go +++ b/daemon/algod/api/server/v2/account.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -22,6 +22,7 @@ import ( "math" "sort" + "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/daemon/algod/api/server/v2/generated" "github.com/algorand/go-algorand/data/basics" @@ -30,7 +31,8 @@ import ( // AccountDataToAccount converts basics.AccountData to v2.generated.Account func AccountDataToAccount( address string, record *basics.AccountData, assetsCreators map[basics.AssetIndex]string, - lastRound basics.Round, amountWithoutPendingRewards basics.MicroAlgos, + lastRound basics.Round, consensus *config.ConsensusParams, + amountWithoutPendingRewards basics.MicroAlgos, ) (generated.Account, error) { assets := make([]generated.AssetHolding, 0, len(record.Assets)) @@ -63,11 +65,15 @@ func AccountDataToAccount( var apiParticipation *generated.AccountParticipation if record.VoteID != (crypto.OneTimeSignatureVerifier{}) { apiParticipation = &generated.AccountParticipation{ - VoteParticipationKey: record.VoteID[:], SelectionParticipationKey: record.SelectionID[:], VoteFirstValid: uint64(record.VoteFirstValid), - VoteLastValid: uint64(record.VoteLastValid), VoteKeyDilution: uint64(record.VoteKeyDilution), + VoteLastValid: uint64(record.VoteLastValid), + VoteParticipationKey: record.VoteID[:], + } + if !record.StateProofID.IsEmpty() { + tmp := record.StateProofID[:] + apiParticipation.StateProofKey = &tmp } } @@ -108,6 +114,8 @@ func AccountDataToAccount( return generated.Account{}, errors.New("overflow on pending reward calculation") } + minBalance := record.MinBalance(consensus) + return generated.Account{ SigType: nil, Round: uint64(lastRound), @@ -126,6 +134,7 @@ func AccountDataToAccount( AppsLocalState: &appsLocalState, AppsTotalSchema: &totalAppSchema, AppsTotalExtraPages: numOrNil(totalExtraPages), + MinBalance: minBalance.Raw, }, nil } diff --git a/daemon/algod/api/server/v2/account_test.go b/daemon/algod/api/server/v2/account_test.go index f7dd96d807..9483bcc413 100644 --- a/daemon/algod/api/server/v2/account_test.go +++ b/daemon/algod/api/server/v2/account_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -102,7 +102,7 @@ func TestAccount(t *testing.T) { b := a.WithUpdatedRewards(proto, 100) addr := basics.Address{}.String() - conv, err := AccountDataToAccount(addr, &b, map[basics.AssetIndex]string{}, round, a.MicroAlgos) + conv, err := AccountDataToAccount(addr, &b, map[basics.AssetIndex]string{}, round, &proto, a.MicroAlgos) require.NoError(t, err) require.Equal(t, addr, conv.Address) require.Equal(t, b.MicroAlgos.Raw, conv.Amount) @@ -196,7 +196,7 @@ func TestAccount(t *testing.T) { // convert the same account a few more times to make sure we always // produce the same generated.Account for i := 0; i < 10; i++ { - anotherConv, err := AccountDataToAccount(addr, &b, map[basics.AssetIndex]string{}, round, a.MicroAlgos) + anotherConv, err := AccountDataToAccount(addr, &b, map[basics.AssetIndex]string{}, round, &proto, a.MicroAlgos) require.NoError(t, err) require.Equal(t, protocol.EncodeJSON(conv), protocol.EncodeJSON(anotherConv)) diff --git a/daemon/algod/api/server/v2/dryrun.go b/daemon/algod/api/server/v2/dryrun.go index 04279ce676..5ecbe1bc49 100644 --- a/daemon/algod/api/server/v2/dryrun.go +++ b/daemon/algod/api/server/v2/dryrun.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -263,11 +263,9 @@ func (dl *dryrunLedger) CheckDup(config.ConsensusParams, basics.Round, basics.Ro func (dl *dryrunLedger) LookupWithoutRewards(rnd basics.Round, addr basics.Address) (basics.AccountData, basics.Round, error) { // check accounts from debug records uploaded - any := false out := basics.AccountData{} accti, ok := dl.accountsIn[addr] if ok { - any = true acct := dl.dr.Accounts[accti] var err error if out, err = AccountToAccountData(&acct); err != nil { @@ -280,7 +278,6 @@ func (dl *dryrunLedger) LookupWithoutRewards(rnd basics.Round, addr basics.Addre } appi, ok := dl.accountApps[addr] if ok { - any = true app := dl.dr.Apps[appi] params, err := ApplicationParamsToAppParams(&app.Params) if err != nil { @@ -299,9 +296,9 @@ func (dl *dryrunLedger) LookupWithoutRewards(rnd basics.Round, addr basics.Addre } } } - if !any { - return basics.AccountData{}, 0, fmt.Errorf("no account for addr %s", addr.String()) - } + // Returns a 0 account for account that wasn't supplied. This is new as of + // AVM 1.1 timeframe, but seems correct (allows using app accounts, and the + // fee sink without supplying them) return out, rnd, nil } @@ -366,41 +363,37 @@ func doDryrunRequest(dr *DryrunRequest, response *generated.DryrunResponse) { return } proto := config.Consensus[protocol.ConsensusVersion(dr.ProtocolVersion)] + txgroup := transactions.WrapSignedTxnsWithAD(dr.Txns) + specials := transactions.SpecialAddresses{} + ep := logic.NewEvalParams(txgroup, &proto, &specials) + origEnableAppCostPooling := proto.EnableAppCostPooling // Enable EnableAppCostPooling so that dryrun // 1) can determine cost 2) reports actual cost for large programs that fail proto.EnableAppCostPooling = true // allow a huge execution budget - maxCurrentBudget := uint64(proto.MaxAppProgramCost * 100) + maxCurrentBudget := proto.MaxAppProgramCost * 100 pooledAppBudget := maxCurrentBudget - allowedBudget := uint64(0) - cumulativeCost := uint64(0) + allowedBudget := 0 + cumulativeCost := 0 for _, stxn := range dr.Txns { if stxn.Txn.Type == protocol.ApplicationCallTx { - allowedBudget += uint64(proto.MaxAppProgramCost) + allowedBudget += proto.MaxAppProgramCost } } + ep.PooledApplicationBudget = &pooledAppBudget response.Txns = make([]generated.DryrunTxnResult, len(dr.Txns)) for ti, stxn := range dr.Txns { - pse := logic.MakePastSideEffects(len(dr.Txns)) - ep := logic.EvalParams{ - Txn: &stxn, - Proto: &proto, - TxnGroup: dr.Txns, - GroupIndex: uint64(ti), - PastSideEffects: pse, - PooledApplicationBudget: &pooledAppBudget, - Specials: &transactions.SpecialAddresses{}, - } var result generated.DryrunTxnResult if len(stxn.Lsig.Logic) > 0 { var debug dryrunDebugReceiver ep.Debugger = &debug - pass, err := logic.Eval(stxn.Lsig.Logic, ep) + pass, err := logic.EvalSignature(ti, ep) var messages []string - result.Disassembly = debug.lines + result.Disassembly = debug.lines // Keep backwards compat + result.LogicSigDisassembly = &debug.lines // Also add to Lsig specific result.LogicSigTrace = &debug.history if pass { messages = append(messages, "PASS") @@ -489,7 +482,7 @@ func doDryrunRequest(dr *DryrunRequest, response *generated.DryrunResponse) { program = app.ApprovalProgram messages[0] = "ApprovalProgram" } - pass, delta, err := ba.StatefulEval(ep, appIdx, program) + pass, delta, err := ba.StatefulEval(ti, ep, appIdx, program) result.Disassembly = debug.lines result.AppCallTrace = &debug.history result.GlobalDelta = StateDeltaToStateDelta(delta.GlobalDelta) @@ -512,7 +505,7 @@ func doDryrunRequest(dr *DryrunRequest, response *generated.DryrunResponse) { cost := maxCurrentBudget - pooledAppBudget if pass { if !origEnableAppCostPooling { - if cost > uint64(proto.MaxAppProgramCost) { + if cost > proto.MaxAppProgramCost { pass = false err = fmt.Errorf("cost budget exceeded: budget is %d but program cost was %d", proto.MaxAppProgramCost, cost) } @@ -521,7 +514,8 @@ func doDryrunRequest(dr *DryrunRequest, response *generated.DryrunResponse) { err = fmt.Errorf("cost budget exceeded: budget is %d but program cost was %d", allowedBudget-cumulativeCost, cost) } } - result.Cost = &cost + cost64 := uint64(cost) + result.Cost = &cost64 maxCurrentBudget = pooledAppBudget cumulativeCost += cost diff --git a/daemon/algod/api/server/v2/dryrun_test.go b/daemon/algod/api/server/v2/dryrun_test.go index abb28143df..0ca7d882fb 100644 --- a/daemon/algod/api/server/v2/dryrun_test.go +++ b/daemon/algod/api/server/v2/dryrun_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -33,6 +33,7 @@ import ( "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/transactions" "github.com/algorand/go-algorand/data/transactions/logic" + "github.com/algorand/go-algorand/data/txntest" "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" ) @@ -381,9 +382,14 @@ func checkAppCallPass(t *testing.T, response *generated.DryrunResponse) { } else if response.Txns[0].AppCallMessages == nil || len(*response.Txns[0].AppCallMessages) < 1 { t.Error("no response app msg") } else { - messages := *response.Txns[0].AppCallMessages - assert.GreaterOrEqual(t, len(messages), 1) - assert.Equal(t, "PASS", messages[len(messages)-1]) + assert.NotNil(t, response.Txns[0].AppCallMessages) + for idx := range response.Txns { + if response.Txns[idx].AppCallMessages != nil { + messages := *response.Txns[idx].AppCallMessages + assert.GreaterOrEqual(t, len(messages), 1) + assert.Equal(t, "PASS", messages[len(messages)-1]) + } + } } } @@ -1365,35 +1371,24 @@ int 1` sender, err := basics.UnmarshalChecksumAddress("47YPQTIGQEO7T4Y4RWDYWEKV6RTR2UNBQXBABEEGM72ESWDQNCQ52OPASU") a.NoError(err) - app, err := basics.UnmarshalChecksumAddress("6BPQU5WNZMTO4X72A2THZCGNJNTTE7YL6AWCYSUUTZEIYMJSEPJCQQ6DQI") - a.NoError(err) // make balance records appIdx := basics.AppIndex(100) dr := DryrunRequest{ - Txns: []transactions.SignedTxn{{ - Txn: transactions.Transaction{ - Type: protocol.ApplicationCallTx, - Header: transactions.Header{ - Sender: sender, - Fee: basics.MicroAlgos{Raw: 100}, - Note: []byte{1, 2, 3}, - }, - ApplicationCallTxnFields: transactions.ApplicationCallTxnFields{ - ApplicationID: appIdx, - }, + ProtocolVersion: string(dryrunProtoVersion), + Txns: []transactions.SignedTxn{txntest.Txn{ + Type: protocol.ApplicationCallTx, + Sender: sender, + ApplicationID: appIdx, + }.SignedTxn()}, + Apps: []generated.Application{{ + Id: uint64(appIdx), + Params: generated.ApplicationParams{ + Creator: sender.String(), + ApprovalProgram: approval, + ClearStateProgram: clst, }, }}, - Apps: []generated.Application{ - { - Id: uint64(appIdx), - Params: generated.ApplicationParams{ - Creator: sender.String(), - ApprovalProgram: approval, - ClearStateProgram: clst, - }, - }, - }, Accounts: []generated.Account{ { Address: sender.String(), @@ -1402,23 +1397,16 @@ int 1` AmountWithoutPendingRewards: 10000000, }, { - Address: app.String(), + Address: appIdx.Address().String(), Status: "Offline", Amount: 10000000, AmountWithoutPendingRewards: 10000000, }, - { - Address: basics.Address{}.String(), - Status: "Offline", - }, }, } - dr.ProtocolVersion = string(dryrunProtoVersion) - var response generated.DryrunResponse doDryrunRequest(&dr, &response) - require.NoError(t, err) checkAppCallPass(t, &response) if t.Failed() { logResponse(t, &response) @@ -1485,3 +1473,128 @@ int 0 logResponse(t, &response) } } + +func TestDryrunInnerPay(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + paySender, err := logic.AssembleString(` +#pragma version 5 +itxn_begin +int pay +itxn_field TypeEnum +txn Sender +itxn_field Receiver +int 10 +itxn_field Amount +itxn_submit +int 1 +`) + require.NoError(t, err) + + ops, err := logic.AssembleString("int 1") + clst := ops.Program + require.NoError(t, err) + + sender, err := basics.UnmarshalChecksumAddress("47YPQTIGQEO7T4Y4RWDYWEKV6RTR2UNBQXBABEEGM72ESWDQNCQ52OPASU") + a.NoError(err) + + appIdx := basics.AppIndex(7) + dr := DryrunRequest{ + ProtocolVersion: string(dryrunProtoVersion), + Txns: []transactions.SignedTxn{txntest.Txn{ + Type: protocol.ApplicationCallTx, + Sender: sender, + ApplicationID: appIdx, + }.SignedTxn()}, + Apps: []generated.Application{{ + Id: uint64(appIdx), + Params: generated.ApplicationParams{ + ApprovalProgram: paySender.Program, + ClearStateProgram: clst, + }, + }}, + // Sender must exist (though no fee is ever taken) + // AppAccount must exist and be able to pay the inner fee and the pay amount (but min balance not checked) + Accounts: []generated.Account{ + {Address: sender.String(), Status: "Offline"}, // sender + {Address: appIdx.Address().String(), Status: "Offline", AmountWithoutPendingRewards: 1_010}}, // app account + } + var response generated.DryrunResponse + doDryrunRequest(&dr, &response) + checkAppCallPass(t, &response) + if t.Failed() { + logResponse(t, &response) + } +} + +func TestDryrunScratchSpace(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + approvalOps, err := logic.AssembleString(` +#pragma version 5 +txn GroupIndex +int 3 +== +bnz checkgload +txn GroupIndex +store 254 +b exit +checkgload: +int 0 +gloads 254 +int 0 +== +int 1 +gloads 254 +int 1 +== +&& +int 2 +gloads 254 +int 2 +== +&& +assert +exit: +int 1`) + require.NoError(t, err) + + ops, err := logic.AssembleString("int 1") + clst := ops.Program + require.NoError(t, err) + + sender, err := basics.UnmarshalChecksumAddress("47YPQTIGQEO7T4Y4RWDYWEKV6RTR2UNBQXBABEEGM72ESWDQNCQ52OPASU") + a.NoError(err) + + txns := make([]transactions.SignedTxn, 0, 4) + apps := make([]generated.Application, 0, 4) + for appIdx := basics.AppIndex(1); appIdx <= basics.AppIndex(4); appIdx++ { + txns = append(txns, txntest.Txn{ + Type: protocol.ApplicationCallTx, + Sender: sender, + ApplicationID: appIdx}.SignedTxn()) + apps = append(apps, generated.Application{ + Id: uint64(appIdx), + Params: generated.ApplicationParams{ + ApprovalProgram: approvalOps.Program, + ClearStateProgram: clst, + }, + }) + } + dr := DryrunRequest{ + ProtocolVersion: string(dryrunProtoVersion), + Txns: txns, + Apps: apps, + Accounts: []generated.Account{ + {Address: sender.String(), Status: "Offline", Amount: 100_000_000}, // sender + }, + } + var response generated.DryrunResponse + doDryrunRequest(&dr, &response) + checkAppCallPass(t, &response) + if t.Failed() { + logResponse(t, &response) + } +} diff --git a/daemon/algod/api/server/v2/errors.go b/daemon/algod/api/server/v2/errors.go index 3123e5d7ca..e711968fa8 100644 --- a/daemon/algod/api/server/v2/errors.go +++ b/daemon/algod/api/server/v2/errors.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/algod/api/server/v2/generated/private/routes.go b/daemon/algod/api/server/v2/generated/private/routes.go index a061b310cf..9557213497 100644 --- a/daemon/algod/api/server/v2/generated/private/routes.go +++ b/daemon/algod/api/server/v2/generated/private/routes.go @@ -29,12 +29,15 @@ type ServerInterface interface { // Add a participation key to the node // (POST /v2/participation) AddParticipationKey(ctx echo.Context) error - // Delete a given participation key by id + // Delete a given participation key by ID // (DELETE /v2/participation/{participation-id}) DeleteParticipationKeyByID(ctx echo.Context, participationId string) error - // Get participation key info by id + // Get participation key info given a participation ID // (GET /v2/participation/{participation-id}) GetParticipationKeyByID(ctx echo.Context, participationId string) error + // Append state proof keys to a participation key + // (POST /v2/participation/{participation-id}) + AppendKeys(ctx echo.Context, participationId string) error // (POST /v2/shutdown) ShutdownNode(ctx echo.Context, params ShutdownNodeParams) error @@ -211,6 +214,36 @@ func (w *ServerInterfaceWrapper) GetParticipationKeyByID(ctx echo.Context) error return err } +// AppendKeys converts echo context to params. +func (w *ServerInterfaceWrapper) AppendKeys(ctx echo.Context) error { + + validQueryParams := map[string]bool{ + "pretty": true, + } + + // Check for unknown query parameters. + for name, _ := range ctx.QueryParams() { + if _, ok := validQueryParams[name]; !ok { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Unknown parameter detected: %s", name)) + } + } + + var err error + // ------------- Path parameter "participation-id" ------------- + var participationId string + + err = runtime.BindStyledParameter("simple", false, "participation-id", ctx.Param("participation-id"), &participationId) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter participation-id: %s", err)) + } + + ctx.Set("api_key.Scopes", []string{""}) + + // Invoke the callback with all the unmarshalled arguments + err = w.Handler.AppendKeys(ctx, participationId) + return err +} + // ShutdownNode converts echo context to params. func (w *ServerInterfaceWrapper) ShutdownNode(ctx echo.Context) error { @@ -270,6 +303,7 @@ func RegisterHandlers(router interface { router.POST("/v2/participation", wrapper.AddParticipationKey, m...) router.DELETE("/v2/participation/:participation-id", wrapper.DeleteParticipationKeyByID, m...) router.GET("/v2/participation/:participation-id", wrapper.GetParticipationKeyByID, m...) + router.POST("/v2/participation/:participation-id", wrapper.AppendKeys, m...) router.POST("/v2/shutdown", wrapper.ShutdownNode, m...) } @@ -277,142 +311,147 @@ func RegisterHandlers(router interface { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "H4sIAAAAAAAC/+x9/3PbNrL4v4LR3UyafETJSZxe45nOfdwkbf2appnY7b13cV4LkSsJNQmwAGhJzfP/", - "/gYLgARJUJK/nPsy158Si8Bisdhd7C4Wi4+jVBSl4MC1Gh19HJVU0gI0SPyLpqmouE5YZv7KQKWSlZoJ", - "Pjry34jSkvHFaDxi5teS6uVoPOK0gKaN6T8eSfitYhKy0ZGWFYxHKl1CQQ1gvSlN6xrSOlmIxIE4tiBO", - "Xo6utnygWSZBqT6WP/B8QxhP8yoDoiXliqbmkyIrppdEL5kirjNhnAgORMyJXrYakzmDPFMTP8nfKpCb", - "YJZu8OEpXTUoJlLk0MfzhShmjIPHCmqk6gUhWpAM5thoSTUxIxhcfUMtiAIq0yWZC7kDVYtEiC/wqhgd", - "vR8p4BlIXK0U2CX+dy4BfodEU7kAPfowjk1urkEmmhWRqZ046ktQVa4VwbY4xwW7BE5Mrwn5vlKazIBQ", - "Tt59/YI8ffr0uZlIQbWGzDHZ4Kya0cM52e6jo1FGNfjPfV6j+UJIyrOkbv/u6xc4/qmb4L6tqFIQF5Zj", - "84WcvByagO8YYSHGNSxwHVrcb3pEhKL5eQZzIWHPNbGN73RRwvH/0FVJqU6XpWBcR9aF4FdiP0d1WNB9", - "mw6rEWi1Lw2lpAH6/iB5/uHj4/Hjg6u/vD9O/un+fPb0as/pv6jh7qBAtGFaSQk83SQLCRSlZUl5nx7v", - "HD+opajyjCzpJS4+LVDVu77E9LWq85LmleETlkpxnC+EItSxUQZzWuWa+IFJxXOjpgw0x+2EKVJKccky", - "yMZG+66WLF2SlCoLAtuRFctzw4OVgmyI1+Kz2yJMVyFJDF43ogdO6P8uMZp57aAErFEbJGkuFCRa7Nie", - "/I5DeUbCDaXZq9T1NitytgSCg5sPdrNF2nHD03m+IRrXNSNUEUr81jQmbE42oiIrXJycXWB/NxtDtYIY", - "ouHitPZRI7xD5OsRI0K8mRA5UI7E83LXJxmfs0UlQZHVEvTS7XkSVCm4AiJmv0KqzbL/x+kPb4iQ5HtQ", - "ii7gLU0vCPBUZMNr7AaN7eC/KmEWvFCLkqYX8e06ZwWLoPw9XbOiKgivihlIs15+f9CCSNCV5EMIWYg7", - "+Kyg6/6gZ7LiKS5uM2zLUDOsxFSZ082EnMxJQddfHowdOorQPCcl8IzxBdFrPmikmbF3o5dIUfFsDxtG", - "mwULdk1VQsrmDDJSQ9mCiRtmFz6MXw+fxrIK0PFABtGpR9mBDod1hGeM6JovpKQLCFhmQn50mgu/anEB", - "vFZwZLbBT6WESyYqVXcawBGH3m5ec6EhKSXMWYTHTh05jPawbZx6LZyBkwquKeOQGc2LSAsNVhMN4hQM", - "uN2Z6W/RM6rg88OhDbz5uufqz0V31beu+F6rjY0SK5KRfdF8dQIbN5ta/fdw/sKxFVsk9ufeQrLFmdlK", - "5izHbeZXs36eDJVCJdAihN94FFtwqisJR+f8kfmLJORUU55RmZlfCvvT91Wu2SlbmJ9y+9NrsWDpKVsM", - "ELPGNepNYbfC/mPgxdWxXkedhtdCXFRlOKG05ZXONuTk5dAiW5jXZczj2pUNvYqztfc0rttDr+uFHEBy", - "kHYlNQ0vYCPBYEvTOf6zniM/0bn83fxTlnmMpoaB3UaLQQEXLHjnfjM/GZEH6xMYKCylhqhT3D6PPgYI", - "/VXCfHQ0+su0iZRM7Vc1dXDNiFfj0XED5+5Hanra+XUcmeYzYdyuDjYdW5/w7vExUKOYoKHaweGrXKQX", - "N8KhlKIEqZldx5mB05cUBE+WQDOQJKOaThqnytpZA/yOHb/FfuglgYxscT/gf2hOzGcjhVR7882YrkwZ", - "I04EgabMWHx2H7EjmQZoiQpSWCOPGOPsWli+aAa3CrrWqO8dWT50oUVW55W1Kwn28JMwU2+8xuOZkDfj", - "lw4jcNL4woQaqLX1a2beXllsWpWJo0/EnrYNOoCa8GNfrYYU6oKP0apFhVNN/wVUUAbqXVChDeiuqSCK", - "kuVwB/K6pGrZn4QxcJ4+IaffHj97/OTnJ88+Nzt0KcVC0oLMNhoU+cztK0TpTQ4P+zNDBV/lOg7980Pv", - "QbXh7qQQIlzD3keizsBoBksxYuMFBruXkIOGt1RqlrISqXWShRRtQ2k1JBewIQuhSYZAMrvTI1S5kRW/", - "g4UBKYWMWNLIkFqkIk8uQSomIkGRt64FcS2MdrPWfOd3iy1ZUUXM2OjkVTwDOYmtp/He0FDQUKhd248F", - "fbbmDcUdQCol3fTW1c43Mjs37j4r3Sa+9xkUKUEmes1JBrNqEe58ZC5FQSjJsCOq2Tcig1NNdaXuQLc0", - "wBpkzEKEKNCZqDShhIvMqAnTOK51BiKkGJrBiJIOFZle2l1tBsbmTmm1WGpijFURW9qmY0JTuygJ7kBq", - "wKGsIwG2lR3ORt9yCTTbkBkAJ2LmvDbnT+IkKQZ7tD/HcTqvQav2NFp4lVKkoBRkiTu02omab2dXWW+h", - "EyKOCNejECXInMobIquFpvkORLFNDN3aSHGubh/r/YbftoDdwcNlpNJ4rpYLjEVkpNuouSES7kmTS5Do", - "8v1L188PctPlq8qBAxm3r5+xwogv4ZQLBangmYoCy6nSyS6xNY1axoeZQSApMUlFwANhh9dUaev4M56h", - "IWrVDY6DfXCIYYQHdxQD+Se/mfRhp0ZPclWpemdRVVkKqSGLzYHDestYb2BdjyXmAex6+9KCVAp2QR6i", - "UgDfEcvOxBKIahd5qiNj/clhkN/sA5soKVtINITYhsipbxVQNwxKDyBivJa6JzIOUx3OqSPh45HSoiyN", - "/Omk4nW/ITKd2tbH+sembZ+5qG70eibAjK49Tg7zlaWsPY5YUmMxImRS0AuzN6H9ZyMUfZyNMCaK8RSS", - "bZxvxPLUtApFYIeQDpje7sAzGK0jHB3+jTLdIBPsWIWhCQ/4AS2j9DvY3IHdWXZA9mn9EjRlOWQk+BnV", - "NSm7NvJOa7432j5m3jHJ9kSBZaMIlW5m2e1l9XaHipi9kenkTOEO1aOfQvTt4clZcORyB6ZpBKpRJ5QT", - "RNSHZI0FEDaBNU11vjH7ql7ChqxAAlHVrGBa29OwNjtpUSYhgKj/vWVEFwGxBw9+BfYJyZwiqGB6/aUY", - "j6ydtB2/s46l1CKHs9BKIfLJbhXTI0YUg/1EoBRm1Zk7fPUndJ6TWkg6qwnDX7W2fqBaZMYZkP8SFUkp", - "R4uv0lBvQUKiXsf93oxgdsx6TGZNq4ZCkEMB1pDFL48edSf+6JFbc6bIHFY+Y8E07JLj0SN0y94KpVvC", - "dUeq7iSymWBgwuxMzmjs6pTJXmrtJNtrJdtxhZOXflCUKaUc45rp31oBdCRzvc/cQx5ZUrXcPXeEu1dc", - "JgAdm7dddynE/A5my7J17Jgug3Vspo5x0Sl6YDyIjQI9iRp7pUEwclIP8iLHiIuYdwSSFGAkRS1ZaUA2", - "p4obDa2MpP/+7O9H74+Tf9Lk94Pk+f+bfvh4ePXwUe/HJ1dffvk/7Z+eXn358O9/jRnISrNZPOb3LVVL", - "g6lTnGt+wm3Ufi6kdas2zloT8/vGu8NiZjE95YMp7SVusQVhnFC72MhzxhjPN3ewx1pAREIpQaFGDJ1Y", - "Zb+KeZiQ5DhPbZSGoh8Hsl1/HrCC33kbsselgueMQ1IIHrPofsCv3+PHWG+rlQc64/441LdrY7fw76DV", - "HmefxbwtfXG1AzX0tk6PuoPF78LthADDVCwMYUBeEkrSnGGAQ3ClZZXqc07RhQrYNXIo4R3DYaf6hW8S", - "9+IjTrYDdc6pMjSsHatoaHgOkZDJ1wDet1bVYgFKd2y7OcA5d60YJxVnGscqzHoldsFKkHgyMLEtC7oh", - "c5pjDOB3kILMKt22djBjRGnjott4pBmGiPk5p5rkQJUm3zN+tkZwPjHD8wwHvRLyoqZCXOcvgINiKokr", - "0m/sV9SnbvpLp1sxfdd+9vrmvjcAj3ssn8FhfvLSeQInL9HcayKRPdzvLTxVMJ5EmexsCaRgHNPiOrxF", - "PjNGq2egh01M0636OddrbhjpkuYso/pm7NBVcT1ZtNLR4ZrWQnSiDX6uH2KHzwuRlDS9wLPH0YLpZTWb", - "pKKYeg9ouhC1NzTNKBSC47dsSks2VSWk08vHO8yxW+grElFXV+OR0zrqzrMcHODYhLpj1nE+/7cW5ME3", - "r87I1K2UemCTmyzoICsl4rS6uzWtgxwzeZucb7O7zvk5fwlzxpn5fnTOM6rpdEYVS9W0UiC/ojnlKUwW", - "ghwRB/Il1fSc91T84P0ZTD122JTVLGdpPPAyHtmc6D6E8/P3hkHOzz/0TgX6G6cbKiqjdoBkxfRSVDpx", - "SZ+JhBWVWQR1VSf9IWSbsr1t1DFxsC1HuqRSBz+uqmlZqiQXKc0TpamG+PTLMjfTD9hQEeyEuSpEaSG9", - "EjSa0WKD6/tGuHMRSVc+Y7hSoMgvBS3fM64/kOS8Ojh4CuS4LF8bmKcGj1+crjE8uSmhFd7YM8uoARYL", - "beDErUEFay1pUtIFqOj0NdASVx836gIDaXlOsFtIk/qkHkE1E/D0GF4Ai8e186hwcqe2l7+9E58CfsIl", - "xDZGOzUB8ZuulwH1rcgNk914uQIY0VWq9DIxsh2dlTIs7lemTupfGJ3sTykUW3AjBO7+wwxIuoT0AjJM", - "xYai1Jtxq7s/CHM7nFcdTNkrCzZdCvNqMRI0A1KVGXU2AOWbboKjAq19Vuc7uIDNmWjScq+T0Xg1HqX2", - "EkFieGZIUJFTg83IMGsotg5Gd/HdoarBlJYlWeRi5qS7Zoujmi98n2FBtjvkHQhxjClqMmzh95LKCCEs", - "8w+Q4AYTNfBuxfqx6bXCaXvmb7aiZAhk1+YS3U7EvLtr9JR6VInZxsmMqvgGAuaLWQ8jQ90zZz+SDari", - "DCYEr706xp3laIvUx91WsqlsRR7tPb4h1OJcApI3u7pHo02R0HxYUuWv7uANJy8we220Qwdz9cGq4SJ/", - "sor+XmM5MTNuDpd0iP7D+eYnwXFpcI2pzib3iq0rDOP6ZoG9Ueyzzn2quc8vH42vlSs+HrkMnthyCI5W", - "RgY5LOzEbWPPKA61BypYIIPHD/N5zjiQJHbySpUSKbN3rxpd7sYAY4Q+IsQGeMjeEGJsHKCNhwUImLwR", - "oWzyxXWQ5MDwdIF62HjMEPwNu6PNzdVuZ97uNEP7uqMRonFz9cIuYz8KNR5FVdKQh9AO79smM+i5VDEW", - "NaqpH5fpR38U5IDbcdLSrMlFLFpnrApANjz13QK3gXzG5maTfxicGUlYMKWh8ZuNtPpA0P3GLi6FhmTO", - "pNIJuuzR6ZlGXys0Br82TePqp3Omo2wMIK59cNgL2CQZy6v4artxv3tphn1T+0+qml3ABjcZoOmSzPAu", - "c/Skd8vQNvtg64Rf2wm/pnc23/14yTQ1A0shdGeMT4SrOvpkmzBFGDDGHP1VGyTpFvWCvs9LyHUsZT3w", - "ydCrNQrT3qkYjBr0hCnzsLeZXwEWw5rXQorOJTB0t86C4Ukc5RlhOrgK3M+EHZABWpYsW3d8eAt14NgO", - "DfhrGOrW4o8cRY1qYDsoEPjrsWQrCT7mYJc02DPtpW4ezm2yF2WM9RUSJFAI4VBM+ZIkfUIZ1sZ787to", - "dQY0/w42P5m2OJ3R1Xh0O5c/RmsHcQet39bLG6UzxrKtC9iK4F2T5LQspbikeeICI0OsKcWlY01s7uMo", - "96zq4u732avj128d+sb3zIFKGyrbOitsV34yszIesZADAuJLHhhr1fvO1hALFr++RxYGU1ZLcNfLA1vO", - "aDHHXFa8mkBZIIouuDKPH6ntDJW4mJ6d4pbYHpR1aK/xiG1krx3No5eU5d4V9dgOHH/h5Jp46rW1Qgjg", - "1lHBILib3Km66Ul3XDoa7tqhk8KxtlyAL2yNB0UE7+ZVGRMSPVxk1YJuDAfZ4HRfOfGqSIz4JSpnaTxs", - "wWfKMAe3MV/TmGDjAWPUQKzYwBECr1gAyzRTe5yWdZAMxogSE0NKW2g3E644V8XZbxUQlgHX5pNEqewI", - "qpFLX+Clv50a26E/lgNsi7004G9jYxhQQ9YFIrHdwAgjzJFcXe9w+onWoXHzQxAYvMZBVThib0vccsjk", - "+MNxsz3tX7YjxWEtrb7+M4xh6y7sLuTlwxZLi+jAGNHCXIO7xfHwTmF6X2OPaLYERDfcDMa2bE+uRARM", - "xVeU2zo7pp+loeutwMYMTK+VkHi1REH0lJ6pZC7F7xD3ZOdmoSKpn46UaC5i70kkZb+rROuoTFNBzdM3", - "xGOQtYcsueAjaR8kDkg4cnkQOscb4D7ARblla1sTqHV8HReOMOVkauE3wuFw7qXp5HQ1o7Hr8cagMjgd", - "N4c0rVCcFsR39qvgooYN7wXnPXVbZu9jlCCb/Oz+3b8bGkefFstnkLKC5nErKUPqt2+fZWzBbGGlSkFQ", - "uccBshXpLBe56kf2GKwhzcmcHIyD2mBuNTJ2yRSb5YAtHtsWM6pw16rDrXUXMz3geqmw+ZM9mi8rnknI", - "9FJZwipBagMWXbk69j0DvQLg5ADbPX5OPsOov2KX8NBQ0dkio6PHzzEtxf5xENvsXAW1bXolQ8XyD6dY", - "4nyMxx4WhtmkHNRJ9G6QLXs5rMK2SJPtuo8sYUun9XbLUkE5XUD8NLfYgZPti6uJQcMOXXhma7YpLcWG", - "MB0fHzQ1+mkgNc2oP4sGSUVRMF0YAdKCKFEYfmrK8thBPThbAM6VyvB4+Y94xFJatwG6DvP9BojtXh6b", - "NR6EvaEFtMk6JtReoctZc0nZKcQJOfEXcbF2SF0yxNLGjGWmjiadWUIskcC4Rieq0vPkC5IuqaSpUX+T", - "IXST2eeHkXop7RIJ/HqI3zvdJSiQl3HSywG299aE60s+44InhdEo2cMmFTSQymhJAqFpHk9q8Rq9m9O0", - "HfS+BqiBkgyyW9ViNxpo6lsxHt8C8JasWM/nWvx47ZndO2dWMs4etDIr9OO7187KKISMlWVoxN1ZHBK0", - "ZHCJ+TXxRTIwb7kWMt9rFW6D/R97ytJ4ALVZ5mU55gh8VbE8+6lJbe+UnJKUp8voGcfMdPy5qZFXT9nK", - "cbQKwJJyDnkUnN0zf/Z7a2T3/1XsO07B+J5tu6Wk7HQ7k2sQb6PpkfIDGvIynZsBQqq2c33r5LB8ITKC", - "4zRXzhsu61fHCgrg/FaB0rF6vfjB5lViLMv4Bbb+CgGeoVU9Id/YGtdLIK0LqmjNsqLK7WVHyBYgXZC1", - "KnNBszExcM5eHb8mdlTbx9YitfVfFmjMtWfRiWEE9Sn2S3XyRebiaZj7w9meF2ZmrTReUFeaFmUsw960", - "OPMNMI0/jOuimRdSZ0JeWgtbefvNDmL4Yc5kYSzTGprV8cgT5j9a03SJpmtLmwyz/P6FizxXqqAsaF1h", - "sS4xgXJn8Ha1i2zpojERxr9YMWVLG8MltJP66xsuznXySf7t6cmKc8spUR297QbWTcjukbOH9z70G8Ws", - "Q/hrGi5KVDKF69ZxOsVe0SvU3aJQvXqg9jZhXY/Pl6xPKRecpXiBOSimXKPsyiTvcy6yx13vbljKi7iT", - "0IhwRUtR1elBjoqDxam8InSE6wdmg69mUS132D811uNdUk0WoJXTbJCNfREzFy9hXIErGYIVswM9KWTr", - "rAk1ZPT4MqnD3NdkI0zxHTCAvzbf3jj3CNPyLhhHQ8iRzWUA2ogGVnHVxnpimiwEKDef9pVc9d70meC1", - "1AzWHya+6ivCsEc1Ztr2XLIP6tifUrpTQdP2hWlL8Fim+bmVTmwHPS5LN2j0Rm29wrGCaYMEjpw2JT7c", - "HxC3hh9C28JuW9MLcD81jAaXeDgJJe7DPcaoa891SlNe0ryyHIUtiE3riV4DYzyCxmvGoalJHNkg0uiW", - "gAuD8jrQT6WSamsC7qXTzoDmeCIZU2hKuxDtbUF1FhhJgnP0YwwvY1M2b0Bx1A0aw43yTV0K2XB3YEy8", - "wBrsjpD9InhoVTkjKsPEzU5ZvJjiMIrbl6lsbwB9MejbRLa7ltRKznV2oqELL6mI2Zuv1pBW9sBd2NIY", - "tCxJijdIg/0iGtFkyjhPxSyPFcGpPwYVLDHJdrbBf2MFS4ZJ4k7Er52T5Y+/seO1DdY2pJ65aZgpUWxx", - "w2Vu+t/pOudi0UbkfgMKW2U8ZJmYdL8yanO4xuixV6z1FUVMQxK+vDE6TfXlmrZMoiKPOqVNpdrtTvlw", - "zdkxqv6BZMR3ze17ancXe8YwlJKYDmbQUu3S4zUlzVX3vmDaQrExCDafwRaotY+9ROMrQzkMNoXBfO71", - "3s8u6lmZCHsrQX1yTB+h73zmHSkpcwdojcT2KetydPtZ0/tk7zUL3J2Ey3xFILGZvN1ZMKzFIb3M5yD3", - "3VYmmux/+bU5kMczEyxkuwDuKtm2cxr3zqyazyHV7HJHpvk/jMXaZDGPvU1ri4oHieesztTxbwJd09Ru", - "ENqWCL4Vn+CG/a3RGcozvYDNA0Xa9ZRfRuXPMepNrn0hBbD6QGJYRKhY9N864S4gy1TNGUgFf9pmu0NT", - "+GWwKGad7hWr87PXWJ4lCXV2Vl1EZ6gOp4hZ8XuNZbrukXjVZG9jSsZQMnq/Stzw7mXrAqq6oHH96E+Q", - "TGGctW6xpZW7dob3Auq4k7+ABsr/5q/Q2FHsY1JN2U6M8q2ozHyLqNnqLeJkIL2rmzBt89JZHOl5PTJr", - "ciP6OcORO9GYC5PmQjG+SIZSptrpCHUs/4Gyhy4YIMDye4jXHKQr16v9W12JFj6XYhse20jhnoq4CRHU", - "YMksi9zgxcV3zc1MLARD7Utt7kApnCCRUFCDnQzuTw6PuY3YL+x3nyTrC4F0yu5E4Hp+TXZegPRZMUz1", - "iBhy/Zy43XJ38u1N/AXGua2GrmKXKbkhZRhJKqXIqtRu0KFggPer9r4PvEWVRK38tD/LnsGW4+3418FV", - "hgvYTK3RlC4pb8oUtMXaFkW3cwgu3nVW+05dqbjBmi/sBBZ3gucf6QmNR6UQeTIQOjrp3wntysAFSy8g", - "I2bv8OfJA3UqyWcYsajPBlbLjS8DXpbAIXs4IcT4UkWpN/6YoF1yqDM4f6C3jb/GUbPKXtN2TtrknMdT", - "Iezbh7fUbx7Mdq1mHwO+5VAWyPaB9JoPqDa6ilRt3ffdnEjgvltJs2Eqi0XMSrnhXbm95LvvqEVYP7zl", - "sMP/uWh5dbaoRidYLyTcsXcXRCmv6d3172/sOz2cB2q1SkF/nnsvQIu2A7Tfh/BNaKJP3OGIgp7tE1GI", - "1yYw3TGkYQmC1TMIokp+efwLkTB3D7E+eoQDPHo0dk1/edL+bLyvR4+iknlvwYzW8zxu3BjH/DR0uGsP", - "MAfyCDrrUbE828UYrayQprId5j387PJn/pDaej9bF7kvqq7M2HXCqN1FQMJE5toaPBgqyPfYI9XDdYsk", - "duBmk1aS6Q1eYfIeFfs5ejX8mzoI4958qxPBXR6yfW7UpSU1IZvmhchvhH21qTB7PQbWNZaofrWmRZmD", - "E5QvH8z+Bk+/OMwOnj7+2+yLg2cHKRw+e35wQJ8f0sfPnz6GJ188OzyAx/PPn8+eZE8On8wOnxx+/ux5", - "+vTw8ezw8+d/e+CfZ7SINk8f/icWoEyO354kZwbZhia0ZFja/QrN6bnwxexoipJofJJ8dOR/+v9ewiap", - "KIIX5d2vI5ejNlpqXaqj6XS1Wk3CLtMF+miJFlW6nPpx+hXB357U+TP23gOuqE2NMKyAi+pY4Ri/vXt1", - "ekaO355MGoYZHY0OJgeTx1gztgROSzY6Gj3Fn1B6lrjuU8dso6OPV+PRdAk010v3RwFastR/Uiu6WICc", - "uKp+5qfLJ1N//D796PzTq23f2pctXFgh6BCUf5p+bDn5WQgXiyNNP/qLKMEn+/jN9CP6aYO/t9H4qNcs", - "u5r6sJDr4R6RmH5sXnW5stKRQyykY/OcaPAIzNj40fiEnrK/GoHw6dVMtR8Bqlf3JDOranq9qF+4CW7R", - "H73/N31X/0PnmdEnBwf/Zg8mHl5zxltt4dbxVaTk5lc0Iz71D8d+fH9jn3CMjBuFRqzCvhqPnt3n7E+4", - "YXmaE2wZXIrpL/2P/IKLFfctze5aFQWVGy/GqqUU/LtVqMPpQqFnJNkl1TD6gK537Ox7QLngy5TXVi74", - "3OafyuW+lMun8Q7pk2sK+Kc/4z/V6aemTk+tuttfnTpTzmaXT+0rAo2F16teuYBomjsmnNNtTzt1New3", - "oHsvVY1uqWL+sEer/r3l5PDg8P4wCCOcb4QmX+NB1CcqrfsJzjYbqOMTZVmPva3iB6W/EtlmC4UKtShd", - "LmjEIpkxblDu7yv9yvq9N6QuYEPs4awPwrtHG9uW0NUtpf+Tfe7qz132D5TbZwdP72/4U5CXLAVyBkUp", - "JJUs35AfeX175uZOVJZFk83a4tbTI8b2T0UGC+CJUxLJTGQbXyWmBfACbIC2ZxZMP7ZLPdpg02AQyL5E", - "Xz8e0Ud6tiEY1W2rtsgD9t/B5qvNycu+fxbxwLoobvXDuvI/4Prc6Mn8P4X9U9uk92bY2D4dtZd9qKK7", - "94z91c3Y5Waqoy/O7rSq/1AR+fNZXv8s758uwp8uwk20zzcQkXtUEFv0jtum1bLSmVjZKgLRoCkWE6S5", - "q8aD9XHqYzUtiAfQZKuTH9z1jHxDSikuWWY0o2YFGC1VKxnT2ecgdd5Nr99uWTCOA2AhfRzFlp2iQR6o", - "e8980g/QOszeWNMmpt1+qwA9FqfeHI6jcStC51YkUuTp1iqtH1C72rZW/iWF1t/TFWU6mQvp0sCRQv2j", - "Ow00n7r7sp1f7a224Mf288+RX6d1Jcfox+6BZOyrOy/0jZpMgPBkHVeqPlN//8EQHIvjuEVsDoqPplPM", - "kFwKpaejq/HHziFy+PFDTeOP9cbmaH314ep/AwAA//+cgLi/YKAAAA==", + "H4sIAAAAAAAC/+x9f3PbtrLoV8Ho3Jk0eaJkJ07PiWc697lx2uPXNM3Ebu97N85rIXIloSYBFgBtqX7+", + "7m+wAEiQBCX5x3Vv5uSvxCKwWCwWi/2FxfUoFUUpOHCtRofXo5JKWoAGiX/RNBUV1wnLzF8ZqFSyUjPB", + "R4f+G1FaMr4YjUfM/FpSvRyNR5wW0LQx/ccjCX9UTEI2OtSygvFIpUsoqAGs16VpXUNaJQuROBBHFsTJ", + "8ehmwweaZRKU6mP5E8/XhPE0rzIgWlKuaGo+KXLF9JLoJVPEdSaME8GBiDnRy1ZjMmeQZ2riJ/lHBXId", + "zNINPjylmwbFRIoc+ni+FsWMcfBYQY1UvSBEC5LBHBstqSZmBIOrb6gFUUBluiRzIbegapEI8QVeFaPD", + "jyMFPAOJq5UCu8T/ziXAn5BoKhegR5/GscnNNchEsyIytRNHfQmqyrUi2BbnuGCXwInpNSE/VkqTGRDK", + "yYfvXpMXL168MhMpqNaQOSYbnFUzejgn2310OMqoBv+5z2s0XwhJeZbU7T989xrHP3UT3LUVVQrim+XI", + "fCEnx0MT8B0jLMS4hgWuQ4v7TY/Ipmh+nsFcSNhxTWzjB12UcPy/dFVSqtNlKRjXkXUh+JXYz1EZFnTf", + "JMNqBFrtS0MpaYB+3EtefbreH+/v3fzt41Hyn+7Ply9udpz+6xruFgpEG6aVlMDTdbKQQHG3LCnv0+OD", + "4we1FFWekSW9xMWnBYp615eYvlZ0XtK8MnzCUimO8oVQhDo2ymBOq1wTPzCpeG7ElIHmuJ0wRUopLlkG", + "2dhI36slS5ckpcqCwHbkiuW54cFKQTbEa/HZbdhMNyFJDF53ogdO6L8vMZp5baEErFAaJGkuFCRabDme", + "/IlDeUbCA6U5q9TtDitytgSCg5sP9rBF2nHD03m+JhrXNSNUEUr80TQmbE7WoiJXuDg5u8D+bjaGagUx", + "RMPFaZ2jZvMOka9HjAjxZkLkQDkSz++7Psn4nC0qCYpcLUEv3ZknQZWCKyBi9juk2iz7/zr96R0RkvwI", + "StEFvKfpBQGeimx4jd2gsRP8dyXMghdqUdL0In5c56xgEZR/pCtWVAXhVTEDadbLnw9aEAm6knwIIQtx", + "C58VdNUf9ExWPMXFbYZtKWqGlZgqc7qekJM5Kejqm72xQ0cRmuekBJ4xviB6xQeVNDP2dvQSKSqe7aDD", + "aLNgwampSkjZnEFGaigbMHHDbMOH8dvh02hWAToeyCA69Shb0OGwivCM2brmCynpAgKWmZCfneTCr1pc", + "AK8FHJmt8VMp4ZKJStWdBnDEoTer11xoSEoJcxbhsVNHDiM9bBsnXgun4KSCa8o4ZEbyItJCg5VEgzgF", + "A242ZvpH9Iwq+Ppg6ABvvu64+nPRXfWNK77TamOjxG7JyLlovroNG1ebWv13MP7CsRVbJPbn3kKyxZk5", + "SuYsx2Pmd7N+ngyVQiHQIoQ/eBRbcKorCYfn/Jn5iyTkVFOeUZmZXwr7049VrtkpW5ifcvvTW7Fg6Slb", + "DBCzxjVqTWG3wv5j4MXFsV5FjYa3QlxUZTihtGWVztbk5HhokS3M2zLmUW3KhlbF2cpbGrftoVf1Qg4g", + "OUi7kpqGF7CWYLCl6Rz/Wc2Rn+hc/mn+Kcs8RlPDwO6gRaeAcxZ8cL+Zn8yWB2sTGCgspYaoUzw+D68D", + "hP5Nwnx0OPrbtPGUTO1XNXVwzYg349FRA+fhR2p62vl1DJnmM2Hcrg42HVub8OHxMVCjmKCi2sHh21yk", + "F3fCoZSiBKmZXceZgdPfKQieLIFmIElGNZ00RpXVswb4HTv+E/uhlQQycsT9hP+hOTGfzS6k2qtvRnVl", + "yihxInA0ZUbjs+eIHck0QE1UkMIqecQoZ7fC8nUzuBXQtUT96MjyqQstsjpvrF5JsIefhJl6YzUezYS8", + "G790GIGTxhYm1ECttV8z8/bKYtOqTBx9Ivq0bdAB1Lgf+2I1pFAXfIxWLSqcavpfQAVloD4EFdqAHpoK", + "oihZDg+wX5dULfuTMArOi+fk9J9HL/ef//r85dfmhC6lWEhakNlagyJfuXOFKL3O4Wl/Zijgq1zHoX99", + "4C2oNtytFEKEa9i77KgzMJLBUoxYf4HB7liuZcUfgIQgpZARnRdZR4tU5MklSMVExH3x3rUgroWRQ1bv", + "7vxusSVXVBEzNppjFc9ATmKUN3YWHukaCrXtoLCgz1a8oY0DSKWk694K2PlGZufG3WVN2sT32r0iJchE", + "rzjJYFYtwjOKzKUoCCUZdkSB+E5kcKqprtQDSIEGWIOMWYgQBToTlSaUcJGZDW0ax+XDgC8TnSjo+9Gh", + "yNFLe/7MwGjHKa0WS02MWiliS9t0TGhqFyXBs0INmH61zW5b2eGsnyyXQLM1mQFwImbOvnKWH06SoltG", + "+4iLk04NWrVN0MKrlCIFpSBLXHhpK2q+nV1lvYFOiDgiXI9ClCBzKu+IrBaa5lsQxTYxdGt1whmlfax3", + "G37TAnYHD5eRSmNjWi4wuovZ3TloGCLhjjS5BInG2X/p+vlB7rp8VTkQOnEn8BkrzPYlnHKhIBU8U1Fg", + "OVU62bZtTaOWmmBmEOyU2E5FwAMOgrdUaWuiM56hymjFDY6DfXCIYYQHTxQD+Rd/mPRhp0ZOclWp+mRR", + "VVkKqSGLzYHDasNY72BVjyXmAez6+NKCVAq2QR6iUgDfEcvOxBKIaucjqn1Y/cmhO96cA+soKVtINITY", + "hMipbxVQN3QfDyBi7Iu6JzIOUx3OqX3W45HSoizN/tNJxet+Q2Q6ta2P9M9N2z5zUd3I9UyAGV17nBzm", + "V5ayNnCwpEa3Q8ikoBfmbEJNzfoS+jibzZgoxlNINnG+2ZanplW4BbZs0gEl2YUmg9E6m6PDv1GmG2SC", + "LaswNOEBjf09lZqlrERN4gdYP7i53x0gavmTDDRlOWQk+IACHGVv3Z9Y51AX5t0UrZ2U0D76PS00Mp2c", + "KTww2shfwFoh+jbqcBbEKh5AU4xANbubcoKIel+mOZDDJrCiqc7X5pjTS1iTK5BAVDUrmNY2jNRWJLUo", + "kxBA1HDdMKJzHViPvV+BXXwZpwgqmF5/KcYjq7Zsxu+so7i0yOEUplKIfLJ9x/eIEcVgF8PjiJTCrDpz", + "UUsf2vKc1ELSKTHoN6qF5xPVIjPOgPwfUZGUclTAKg31iSAkilk8fs0I5gCrx2RW02koBDkUYPVK/PLs", + "WXfiz565NWeKzOHKh/pNwy45nj1DK+m9ULq1uR7A4jXb7SQi29GiNweF0+G6MmWy1bp3kHdZyfcd4H5Q", + "3FNKOcY107+3AOjszNUucw95ZEnVcvvcEe5ODo0AdGzedt2lEPMHchDFQz1onLjojWlF5hW3SFXKmSOY", + "FOAdGmI+rsN5No3PhnqqAnvj/5fUOZxG4yZGYxuYA7n5/CmiUrJsFQvFZbCKLYrbY2hOPTG2x1qBnkTV", + "REQ+Eo0HeZG7qXVkBynAbGq1ZKUB2UQO1xpaWUf/96t/P/x4lPwnTf7cS179j+mn64Obp896Pz6/+eab", + "/9f+6cXNN0///d9iqrXSbBb36/3TEFrMiZPxK37CrWd+LqQ1yNZOzxPzx8dbS4AMSr2MpfmUEhTKRpuu", + "U+pls6gAHSdKKcUl8DFhE5h0ZWy2AOW9STnQOaaboFEh9A5HUb0fLL955gioHk5kJ0EW4x/GCbW8ibvZ", + "WB35+gG0FwuIyDY9vbWu7FcxD3Ok3EZRa6Wh6Du8bNdfB9T9D15Z7m0qwXPGISkEh3U0LZhx+BE/xnrb", + "826gM2oeQ327xkQL/w5a7XF2Wcz70hdXOxDw7+uMrQdY/C7cjq8zzA5DXw3kJaEkzRl6cgRXWlapPucU", + "bcWAXSNxEm8BD3sPXvsmcXdFxJvgQJ1zqgwNawsy6gOfQ+TM+g7AOxFUtViA0h2teQ5wzl0rxknFmcax", + "CrNeiV2wEiQGKya2ZUHXZE5zdHb8CVKQWaXbeiSeekqzPHeOVzMMEfNzTrWRQUqTHxk/WyE4nyvieYaD", + "vhLyoqZC/IhaAAfFVBKX+9/bryj+3fSX7ijAjGL72cubx5b7HvdYioXD/OTY2Vgnx6hINy7XHu6P5ocr", + "GE+iTGYUo4JxzNTr8Bb5ypgDnoGeNs5bt+rnXK+4YaRLmrPMKE93YYeuiOvtRbs7OlzTWoiOW8XP9VMs", + "Hr4QSUnTCwyHjhZML6vZJBXF1NuW04Wo7cxpRqEQHL9lU1qyqSohnV7ub1F07yGvSERc3YxHTuqoB/fE", + "OMCxCXXHrB2a/m8tyJPv35yRqVsp9cTmW1nQQaJMxB3grvu0IlZm8va+gE04O+fn/BjmjDPz/fCcZ1TT", + "6YwqlqpppUB+S3PKU5gsBDkkDuQx1fSc90T84JUezIZ22JTVLGcpuQiP4mZr2jTtPoTz84+GQc7PP/XC", + "H/2D0w0V3aN2gOSK6aWodOLyUBMJV1RmEdRVnYeIkG0W+aZRx8TBthzp8lwd/LiopmWpklykNE+Uphri", + "0y/L3Ew/YENFsBOmzxClhfRC0EhGiw2u7zvhbC5Jr3wSc6VAkd8KWn5kXH8iyXm1t/cCyFFZvjUwTw0e", + "vzlZY3hyXULLcbRj4lMDLOY0wolbhQpWWtKkpAtQ0elroCWuPh7UBboo85xgt5AmdfIAgmom4OkxvAAW", + "j1unduHkTm0vf6EoPgX8hEuIbYx0ajz/d10vA+qfIjdMduflCmBEV6nSy8Ts7eislGFxvzL1PYOFkck+", + "HKPYgptN4K5kzICkS0gvIMPscChKvR63uvuInzvhvOhgyt6isBlcmOqLPrYZkKrMqNMBKF93cy4VaO0T", + "TT/ABazPRJMpfJsky5vxyLowssTwzNBGRU4NDiPDrOG2dTC6i++ixwZTWpZkkYuZ2901WxzWfOH7DG9k", + "e0I+wCaOMUVNhg38XlIZIYRl/gES3GGiBt69WD82PaPezOzJF3HzeNlPXJNGa3MR4HA2Z8v6ewF4JUtc", + "KTKjCjIi3G0iezEnkGKVogsY8D2Fbs4ds11brlEEsu3ci550Yt490HrnTRRl2zgxc45yCpgvhlXQT9iJ", + "+/uRrCcdZzAheEnYEWyWo5pUpxxYoUNly91sbz0OoRZnYJC8UTg8Gm2KhJrNkip/0Qnvg/m9vJMOMBQc", + "rYPbhsF9dBtN0UapY2bcHC7pEP2Hs/NPgpB1cOmrzr33Mre7T+OOW5uFX6gmGz/02u6QWT8euSyq2HII", + "jgpQBjks7MRtY88oDrUnKlggg8dP83nOOJAkFv2mSomU2ZtqzTHjxgCjHz8jxPqeyM4QYmwcoI0RIgRM", + "3olwb/LFbZDkwDCkRD1sjC0Ff8P2EENzEd5p3ls15LZs7EuSZkuNm2srdlH77rLxKCqghkyZdoTHNplB", + "z/aLMawRVH0HUt9NpSAH1BuSlpxNLmJuRaP+ADLlqe8W2DfkKzY32sjTIGwoYcGUhsbAN3vXe6weOyhA", + "8TqUEPPh2elSzs38PghRczJ2dEGOcJqPPoNLoSGZM6l0gt6R6BRMo+8U6t3fmaZxcdoOTNqbwSyLS1Mc", + "9gLWScbyKs6vbtwfjs2w72pTVVWzC1jjoQk0XZIZ3mSPpitsGNpmtGyc8Fs74bf0wea7224wTc3A0rBL", + "e4zPZF905OMmcRBhwBhz9FdtkKQbBCSamceQ69iFhUBxtJszMw0nmxw0vc2Uedib1MkAi+GTxEKKziWw", + "KTbOgmGM1ijFTAcXwfvZ1QN7gJYly1Ydd4mFOqhU01vZRNa46lEBV9cB20KBwDUSS+CT4N07dkkDHcBe", + "6efh3CY7UcZokyFBAoEQDsWUL0jTJ5RhbayasI1WZ0DzH2D9i2mL0xndjEf3867EaO0gbqH1+3p5o3TG", + "sIG1tlvO0luSnJalFJc0T5wPaog1pbh0rInNvcvqkUVd3NNx9ubo7XuHvjHzc6AyqVWFwVlhu/KzmZUE", + "oy0PbBBf8MJo395NYVXJYPHrW4Sh3+pqCa64QKCNGinmmMtur8YnGWxF58eax6OXW71Szn1qp7jBjQpl", + "7UVtLHzrRG07TuklZbk3rT22A5FGnFzjur61VAgB3NsBG/jRkwcVN73dHd8dDXdtkUnhWBvKHxS2woci", + "gncTV4wKiRY7smpB14aDbBygL5x4VSRm+yUqZ2ncDcNnyjAHt+5105hg4wFl1ECs2EC0hlcsgGWaqR0C", + "kx0kgzGixETv3QbazYQrzVZx9kcFhGXAtfkkcVd2NqrZl768T/84NbpDfywH2DrxGvD30TEMqCHtApHY", + "rGCEzvweuse1yewnWkchzA+B1/IWMcFwxN6RuCGe5/jDcbNNrFi2nfJhJbW+/DOMYatubC/j5o3XpUV0", + "YIxoWbbB0+Jo+KQwvW9xRjRHAqIbHgZj6xvOlYiAqfgV5bbKkulnaeh6K7BeD9PrSki8rqQgmhDBVDKX", + "4k+IW7LoAIjkLztSorqIvSeRayBdIVp7mZr6eZ6+IR6DrD2kyQUfSTtmO7DDkcuDKAXe//cOO8otW9uK", + "UK1MgfjmCLN7phZ+szkczr2MqJxezWisOIJRqAxOR008rOVa1IL4zn4VnBe04b0gtFa3ZfaOTwmyuWTQ", + "v096R+Xo82L5DFJW0DyuJWVI/faNxowtmC2rVSkI6jY5QLYeoeUiV/vKRhwb0pzMyd44qAznViNjl0yx", + "WQ7YYt+2mFGFp1btdKu7mOkB10uFzZ/v0HxZ8UxCppfKElYJUiuwaMrVvvwZ6CsATvaw3f4r8hVGMRS7", + "hKeGik4XGR3uv0I3sP1jL3bYufp5m+RKhoLlP5xgifMxhnEsDHNIOaiT6H0zW/R0WIRt2E226y57CVs6", + "qbd9LxWU0wXEA+fFFpxsX1xNdBp26MIzW7FPaSnWhOn4+KCpkU8DWYBG/Fk0SCqKgmkMUGpBlCgMPzVF", + "meygHpwt/+cKpXi8/EcMGZU+ibpjMD+ug9ie5bFZY2DvHS2gTdYxofZaZs6aYK4TiBNy4i93Y+WYumCM", + "pY0Zy0wdVTqM7c5JKRnXaERVep78g6RLKmlqxN9kCN1k9vVBpFpOu0AGvx3ij053CQrkZZz0coDtvTbh", + "+pKvuOBJYSRK9rTJug12ZfTCgNA0j+cPeYneTR/bDHpXBdRASQbZrWqxGw0k9b0Yj28AeE9WrOdzK368", + "9cwenTMrGWcPWpkV+vnDW6dlFELGSn00291pHBK0ZHCJqUzxRTIw77kWMt9pFe6D/V8bZWksgFot83s5", + "Zgh8W7E8+6W5RdApOCYpT5fRGMfMdPy1qZBYT9nu42hliSXlHPIoOHtm/urP1sjp/7vYdZyC8R3bdguJ", + "2el2Jtcg3kbTI+UHNORlOjcDhFRtp1XXeXj5QmQEx2nKGDRc1q+NFhRV+qMCpWPXuPCDTWFFX5axC2xN", + "HwI8Q616Qr63Fc6XQFq3rFGbZUWV2xu7kC1AOidrVeaCZmNi4Jy9OXpL7Ki2j61Ea2sKLVCZa8+i48MI", + "ap7sllXmSwzGM153h7M5Bc/MWmkseqA0LcrYZQbT4sw3wBsToV8X1byQOhNybDVs5fU3O4jhhzmThdFM", + "a2hWxiNPmP9oTdMlqq4taTLM8rsXw/JcqYKisHV9zbpsCe47g7erh2XLYY2JMPbFFVO2sDVcQvv+RH2Z", + "yJlO/j5Fe3qy4txySlRGb7rsdheye+Rs8N67fqOYdQh/S8VFiUqmcNvaYKfYK1oHoFtorFcN1t4zrasx", + "+gcLUsoFZynewg9KadcouyLZu8RFdihY0HVL+S3udmhkc0XLm9UJTo6KgwXPvCB0hOs7ZoOvZlEtd9g/", + "NVZjXlJNFqCVk2yQjX0JO+cvYVyBK0OD9dIDOSlkK9aEEjIavkxqN/ct2QizqQcU4O/Mt3fOPMI0wwvG", + "URFyZHMZjdajgTV8tdGemCYLAcrNp31ZW300fSZ4YTmD1aeJr/mLMGyoxkzbxiX7oI58lNJFBU3b16Yt", + "wbBM83Mrc9sOelSWbtBoWlW9wrEifIMEjkSbEu/uD4hbww+hbWC3jekFeJ4aRoNLDE5CiedwjzHqeoad", + "wqSXNK8sR2ELYtN6ojfuGI+g8ZZxaCpSRw6INHok4MLgfh3op1JJtVUBd5JpZ0BzjEjGBJrSzkV7X1Cd", + "BUaS4Bz9GMPL2JRiHBAcdYNGcaN8XRfCNtwdKBOvsQK/I2S/sCJqVU6JyjARtVNqMSY4jOD2RUrbB0B/", + "G/R1IttdS2p3zm1OoqG7RamI6ZtvVpBWNuAubH0XWpYkxcu6wXkR9WgyZYynYpZHct+O649B/VJMGp6t", + "8d9Y1Z1hkriI+K1zsnz4GzveWmFtQ+qpm4aZEsUWye6UQGF+f3I0Q9+Nw5r+D8piuVi0EXnk6hibxEu4", + "RjHB8sZI7PCma6+UlJXp9UVUzIASvq422mv1Faq2OMAzJGoPNyWSN/sDhosdj/HUGciDDGqCUHuw2fDG", + "UDZkOpi8S7W7aaApaQoa9GWCrVAcg2BTKWxlZPvKUNS1M5Q+YbMnzOde791Usp6Ci7A3EtTn5fQR+sEn", + "/ZGSMhe7a4RFn7IuPbifsL1L4mCzwN1JuKRbBBKbSa9k3GYO6SVdBxcHbGWvye5XnJtcAAzXYF3mBXBX", + "mLmdTrlzUtd8Dqlml1uS3P/DKMtNAvXYq9O2mn2Q887qJCH/GNUttfwGoU056BvxCeoo3BudoRTXC1g/", + "UaTFDdFSY2PPqHe5QYcUwBoTiWERoWKBB2v/O18wUzVnIBV8oM92h6a8z2CN1+DKxh3H8ixJaHiNY8OQ", + "lyJmQOw0lum6Q85XkziO2SBDefD9KovDp9cxFrVUdX3u+rWpII/D2IndCmBX7gYfXkmoXV7+Lh8o/5u/", + "f2RHsa+YNVVo0cF4RWXmW0Q1Zq+MJwOZZd1cbZsSz+JIz+uRWZOW0U9Xjtx8xzScNBeK8UUylK3VzoSo", + "wwhPlI33oG8Cy1ciXnOQrvq09o/EJVr4NI5NeGwihXuj5C5EUIN13Cxyg3dAPzSXXLHcD7VPBLpYVjhB", + "IqGgBjsZXEUdHnMTsV/b7z4/15d76RRXisD1/JpsvUvqE3KY6hEx5Po5cafl9rzfu5gqjHNb3F/F7qVy", + "Q8rQiVVKkVWpPaDDjQHepNv51vcGURLV8tP+LHsKW441EN4GtyguYD21SlO6pLwpRtHe1rY8nZ1DcGux", + "s9oPasXFFdZ8YSeweBA8/0pLaDwqhciTAa/VSf96bXcPXLD0AjJizg4fyh6o80q+QmdJHZa4Wq59Vfuy", + "BA7Z0wkhxpYqSr32EYp2YanO4PyJ3jT+CkfNKnvj3Rlpk3Mez8Kwj27eU755MJulmn2F+p5DWSCbB9Ir", + "PiDa6FWk6vGuDzZFYgbdSrQNU1ksYlrKHa/p7bS/+4ZahPXDCxZb7J+LllVnS6d04gRCwgNbd4GD9JbW", + "Xf/qyK7Tw3mgVKsU9Oe58wK0aDtA+10I37gm+sQd9ijo2S4ehXiZB9MdXRqWIFgjhSCq5Lf934iEuXsB", + "+NkzHODZs7Fr+tvz9mdjfT17Ft2Zj+bMaL0L5caNccwvQ3FlGzsdSGHorEfF8mwbY7QSUpr6hZhy8atL", + "3flLKij+ak3k/lZ1xeRu40btLgISJjLX1uDBUEGqyQ5ZJq5bJKcED5u0kkyv8faUt6jYr9Fb6d/XThj3", + "2GCdg+5SoO07ty4jqnHZNE+Tfi/sc2GFOevRia2xxPubFS3KHNxG+ebJ7O/w4h8H2d6L/b/P/rH3ci+F", + "g5ev9vboqwO6/+rFPjz/x8uDPdiff/1q9jx7fvB8dvD84OuXr9IXB/uzg69f/f2JfxfUItq8ufm/scxo", + "cvT+JDkzyDY0oSWrX3YwbOxLFtIUd6KxSfLRof/pf/odNklF0YD3v45cetxoqXWpDqfTq6urSdhlukAb", + "LdGiSpdTP06/ov77kzp1x165wBW1WRmGFXBRHSsc4bcPb07PyNH7k0nDMKPD0d5kb7KPlYFL4LRko8PR", + "C/wJd88S133qmG10eH0zHk2XQHMsF23+KEBLlvpP6oouFiAnrnaj+eny+dRH/qfXzj692fStfc/DuRWC", + "DkGRr+l1y8jPQrhYAmt67e/ABJ/sW07Ta7TTBn9vo3GtVyy7mXq3kOvh3kSZXjePFN3Y3ZFDzKVjU6xo", + "8KbR2NjR+Hajsr+aDeEzu5lqv2lVr+5JZlbV9HpdP9gUXOA//NhTiywg4iFFXiZujTT8LnEtYlvtG0H7", + "cS959el6f7y/d/M3I0jdny9f3Ozom23emiSntZTcseGnzvu2z/f2/sVe6jy45Yw36sKt8FWksOq3NCM+", + "6xDH3n+8sU84esaNQCNWYN+MRy8fc/Yn3LA8zQm2DO7j9Jf+Z37BxRX3Lc3pWhUFlWu/jVVLKPhn2FCG", + "04VCy0iyS6ph9AlN71jYfUC44JOotxYu+M7rF+HyWMLl83gA9/ktN/jnP+Mv4vRzE6enVtztLk6dKmcT", + "26f2rYhGw+sVAl1ANMMec93ppqfRuhL2e9C9l95G9xQxf9mjb//a++Rg7+DxMGjXZ/wB1uSd0OQ7DEd9", + "pnt2t+2zSRPqWEZZ1mNyK/5B6W9Ftt5AoUItSpeMGtFLZowblPunS/8Vhd5LbBewJjZE613x7iXStj50", + "c08Z8Nk+GvdFhnyRIdIO/+Lxhj8FeclSIGdQlEJSyfI1+ZnXV4nubtZlWTT9rb31ezLNWCOpyGABPHEC", + "K5mJbO1L5rQAXoB1GfcUlel1u+6ldX8NuqWO8ff60ZI+0rM1OTnuaTC2W1fSfrvGph2LMWITdlHcaBl2", + "ZdGAMbaJzc1EFkITS4XMTeqL4PkieO6lvOy8eWL6S9Sa8I6c7pk89ndqY7fOqe4PvYvN8Zdu1/+2b3B/", + "EQlfRMLdRcL3ENmMuGudkIgw3V08vX0BgRlRWbd6PKYV+OZVTiVRsKub4gghOufEY0iJxzbSorSyNhrl", + "BFZM4ZsRkQV7WLvti4j7IuI+o6jVdkHTVkRubelcwLqgZW3fqGWlM3Fla9FEpSKWpKW5q+mGVdbqDAkt", + "iAfQXDwiP7mbdvka365mmVHjNCvAqFS1rDOdfTppk89qIDSPrS0YxwFQVOAotnghDVL6FaSC26eJOrE2", + "h9k7axPGhOwfFaBEc7RxOI7GrWCLW8ZIqcB761/92MjNBl96/b5Q6+/pFWU6mQvpbvQghfpZGBpoPnVV", + "Fzq/2rvRwY9Bhkb812ldDzj6sZtbEvvqUj98oyapK0ySwpWq06M+fjIExxJrbhGbnJ/D6RST3ZdC6eno", + "ZnzdyQcKP36qaXxdn6+O1jefbv5/AAAA///sVSP/pKgAAA==", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/daemon/algod/api/server/v2/generated/private/types.go b/daemon/algod/api/server/v2/generated/private/types.go index e8ba9221e9..ff1c666138 100644 --- a/daemon/algod/api/server/v2/generated/private/types.go +++ b/daemon/algod/api/server/v2/generated/private/types.go @@ -49,6 +49,11 @@ type Account struct { // Note: the raw account uses `map[int] -> Asset` for this type. CreatedAssets *[]Asset `json:"created-assets,omitempty"` + // MicroAlgo balance required by the account. + // + // The requirement grows based on asset and application usage. + MinBalance uint64 `json:"min-balance"` + // AccountParticipation describes the parameters used by this account in consensus protocol. Participation *AccountParticipation `json:"participation,omitempty"` @@ -83,6 +88,9 @@ type AccountParticipation struct { // \[sel\] Selection public key (if any) currently registered for this round. SelectionParticipationKey []byte `json:"selection-participation-key"` + // \[stprf\] Root of the state proof key (if any) + StateProofKey *[]byte `json:"state-proof-key,omitempty"` + // \[voteFst\] First round for which this participation is valid. VoteFirstValid uint64 `json:"vote-first-valid"` @@ -306,11 +314,14 @@ type DryrunTxnResult struct { Disassembly []string `json:"disassembly"` // Application state delta. - GlobalDelta *StateDelta `json:"global-delta,omitempty"` - LocalDeltas *[]AccountStateDelta `json:"local-deltas,omitempty"` - LogicSigMessages *[]string `json:"logic-sig-messages,omitempty"` - LogicSigTrace *[]DryrunState `json:"logic-sig-trace,omitempty"` - Logs *[][]byte `json:"logs,omitempty"` + GlobalDelta *StateDelta `json:"global-delta,omitempty"` + LocalDeltas *[]AccountStateDelta `json:"local-deltas,omitempty"` + + // Disassembled lsig program line by line. + LogicSigDisassembly *[]string `json:"logic-sig-disassembly,omitempty"` + LogicSigMessages *[]string `json:"logic-sig-messages,omitempty"` + LogicSigTrace *[]DryrunState `json:"logic-sig-trace,omitempty"` + Logs *[][]byte `json:"logs,omitempty"` } // ErrorResponse defines model for ErrorResponse. @@ -617,11 +628,7 @@ type NodeStatusResponse struct { } // ParticipationKeyResponse defines model for ParticipationKeyResponse. -type ParticipationKeyResponse struct { - - // Detailed description of a participation key - ParticipationKey string `json:"participationKey"` -} +type ParticipationKeyResponse ParticipationKey // ParticipationKeysResponse defines model for ParticipationKeysResponse. type ParticipationKeysResponse []ParticipationKey @@ -639,7 +646,7 @@ type PendingTransactionsResponse struct { // PostParticipationResponse defines model for PostParticipationResponse. type PostParticipationResponse struct { - // encoding of the participation id. + // encoding of the participation ID. PartId string `json:"partId"` } @@ -653,6 +660,11 @@ type PostTransactionsResponse struct { // ProofResponse defines model for ProofResponse. type ProofResponse struct { + // The type of hash function used to create the proof, must be one of: + // * sumhash + // * sha512_256 + Hashtype string `json:"hashtype"` + // Index of the transaction in the block's payset. Idx uint64 `json:"idx"` @@ -661,6 +673,9 @@ type ProofResponse struct { // Hash of SignedTxnInBlock for verifying proof. Stibhash []byte `json:"stibhash"` + + // Represents the depth of the tree that is being proven, i.e. the number of edges from a leaf to the root. + Treedepth uint64 `json:"treedepth"` } // SupplyResponse defines model for SupplyResponse. diff --git a/daemon/algod/api/server/v2/generated/routes.go b/daemon/algod/api/server/v2/generated/routes.go index 80a74df416..295b9a5066 100644 --- a/daemon/algod/api/server/v2/generated/routes.go +++ b/daemon/algod/api/server/v2/generated/routes.go @@ -616,179 +616,185 @@ func RegisterHandlers(router interface { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "H4sIAAAAAAAC/+y9e3fbOJIo/lXw0+45eawoOa+eic/psz93nO72nSSdE7tn526c2w2RJQljEuAAoC11", - "rr/7PSgAJEiCkvzIq9d/JRbxKBQKhUI9P45SUZSCA9dqtP9xVFJJC9Ag8S+apqLiOmGZ+SsDlUpWaib4", - "aN9/I0pLxhej8YiZX0uql6PxiNMCmjam/3gk4V8Vk5CN9rWsYDxS6RIKagbW69K0rkdaJQuRuCEO7BBH", - "h6PLDR9olklQqg/lLzxfE8bTvMqAaEm5oqn5pMgF00uil0wR15kwTgQHIuZEL1uNyZxBnqmJX+S/KpDr", - "YJVu8uElXTYgJlLk0IfzhShmjIOHCmqg6g0hWpAM5thoSTUxMxhYfUMtiAIq0yWZC7kFVAtECC/wqhjt", - "vx8p4BlI3K0U2Dn+dy4B/oBEU7kAPfowji1urkEmmhWRpR057EtQVa4Vwba4xgU7B05Mrwl5XSlNZkAo", - "J+9+fEGePHny3CykoFpD5ohscFXN7OGabPfR/iijGvznPq3RfCEk5VlSt3/34wuc/9gtcNdWVCmIH5YD", - "84UcHQ4twHeMkBDjGha4Dy3qNz0ih6L5eQZzIWHHPbGNb3VTwvm/6K6kVKfLUjCuI/tC8Cuxn6M8LOi+", - "iYfVALTalwZT0gz6fi95/uHjo/Gjvct/e3+Q/Lf789mTyx2X/6IedwsGog3TSkrg6TpZSKB4WpaU9/Hx", - "ztGDWooqz8iSnuPm0wJZvetLTF/LOs9pXhk6YakUB/lCKEIdGWUwp1WuiZ+YVDw3bMqM5qidMEVKKc5Z", - "BtnYcN+LJUuXJKXKDoHtyAXLc0ODlYJsiNbiq9twmC5DlBi4roUPXNDXi4xmXVswASvkBkmaCwWJFluu", - "J3/jUJ6R8EJp7ip1tcuKnCyB4OTmg71sEXfc0HSer4nGfc0IVYQSfzWNCZuTtajIBW5Ozs6wv1uNwVpB", - "DNJwc1r3qDm8Q+jrISOCvJkQOVCOyPPnro8yPmeLSoIiF0vQS3fnSVCl4AqImP0TUm22/X8d//KGCEle", - "g1J0AW9pekaApyIb3mM3aewG/6cSZsMLtShpeha/rnNWsAjIr+mKFVVBeFXMQJr98veDFkSCriQfAsiO", - "uIXOCrrqT3oiK57i5jbTtgQ1Q0pMlTldT8jRnBR09f3e2IGjCM1zUgLPGF8QveKDQpqZezt4iRQVz3aQ", - "YbTZsODWVCWkbM4gI/UoGyBx02yDh/GrwdNIVgE4fpBBcOpZtoDDYRWhGXN0zRdS0gUEJDMhvzrOhV+1", - "OANeMzgyW+OnUsI5E5WqOw3AiFNvFq+50JCUEuYsQmPHDh2Ge9g2jr0WTsBJBdeUccgM50WghQbLiQZh", - "Cibc/JjpX9EzquC7p0MXePN1x92fi+6ub9zxnXYbGyX2SEbuRfPVHdi42NTqv8PjL5xbsUVif+5tJFuc", - "mKtkznK8Zv5p9s+joVLIBFqI8BePYgtOdSVh/5Q/NH+RhBxryjMqM/NLYX96XeWaHbOF+Sm3P70SC5Ye", - "s8UAMmtYo68p7FbYf8x4cXasV9FHwyshzqoyXFDaepXO1uTocGiT7ZhXJcyD+ikbvipOVv6lcdUeelVv", - "5ACQg7grqWl4BmsJBlqazvGf1Rzpic7lH+afssxjODUE7C5aVAo4ZcE795v5yRx5sG8CMwpLqUHqFK/P", - "/Y8BQP8uYT7aH/3btNGUTO1XNXXjmhkvx6ODZpzbn6npadfXecg0nwnjdnew6di+CW8fHjNqFBIUVDsw", - "/JCL9OxaMJRSlCA1s/s4M+P0TwoOT5ZAM5Ako5pOmkeVlbMG6B07/oz98JUEMnLF/YL/oTkxn80ppNqL", - "b0Z0ZcoIcSJQNGVG4rP3iJ3JNEBJVJDCCnnECGdXgvJFM7ll0DVHfe/Q8qE7WmR3Xlq5kmAPvwiz9ObV", - "eDAT8nr00iEETpq3MKFm1Fr6NStv7yw2rcrE4SciT9sGnYEa9WOfrYYY6g4fw1ULC8eafgIsKDPqbWCh", - "PdBtY0EUJcvhFs7rkqplfxFGwHnymBz/fPDs0ePfHj/7ztzQpRQLSQsyW2tQ5L67V4jS6xwe9FeGDL7K", - "dXz07576F1R73K0YQoDrsXc5USdgOIPFGLH6AgPdIeSg4S2VmqWsRGwdZSFG26O0GpIzWJOF0CTDQTJ7", - "0+Ooci0rfgsbA1IKGZGkkSC1SEWenINUTESUIm9dC+JaGO5mpfnO7xZackEVMXPjI6/iGchJbD/N6w0F", - "BQ2F2nb92KFPVrzBuBuQSknXvX21642szs27y063ke/fDIqUIBO94iSDWbUIbz4yl6IglGTYEdnsG5HB", - "saa6UrfAW5rBGmDMRoQg0JmoNKGEi8ywCdM4znUGNKSomkGNkg4ZmV7aW20GRuZOabVYamKEVRHb2qZj", - "QlO7KQneQGrgQVlrAmwrO53VvuUSaLYmMwBOxMy92tx7EhdJUdmjvR3H8bwGrPql0YKrlCIFpSBLnNFq", - "K2i+nd1lvQFPCDgCXM9ClCBzKq8JrBaa5lsAxTYxcGshxT11+1DvNv2mDexOHm4jleblaqnASETmdBs2", - "N4TCHXFyDhKffJ90//wk192+qhwwyLh7/YQV5vgSTrlQkAqeqehgOVU62XZsTaOW8GFWEJyU2EnFgQfU", - "Dq+o0vbhz3iGgqhlNzgP9sEphgEevFHMyH/3l0l/7NTwSa4qVd8sqipLITVksTVwWG2Y6w2s6rnEPBi7", - "vr60IJWCbSMPYSkY3yHLrsQiiGqneao1Y/3FoZLf3APrKCpbQDSI2ATIsW8VYDdUSg8AYl4tdU8kHKY6", - "lFNrwscjpUVZmvOnk4rX/YbQdGxbH+hfm7Z94qK64euZADO79jA5yC8sZq05YkmNxIgjk4KembsJ5T+r", - "oejDbA5johhPIdlE+eZYHptW4RHYckgHRG9n8Axm6xyODv1GiW6QCLbswtCCB94BLaH0b7C+Bbmz7AzZ", - "x/UhaMpyyEjwM7JrUnZl5K3SfG+2XcS8A5LtCALLRhEsXU+y20nq7U4VEXsjy8mZwhuqhz+F4FvjyUlg", - "crkF0TQyqmEnlBME1KtkjQQQNoEVTXW+NveqXsKaXIAEoqpZwbS21rA2OWlRJuEA0ff3hhmdBsQaHvwO", - "7KKSOcahguX1t2I8snLSZvhOOpJSCx1OQiuFyCfbWUwPGVEIdjsCpTC7zpzx1VvoPCW1gHRSE6q/am59", - "T7XQjCsg/1tUJKUcJb5KQ30FCYl8He97M4O5Mes5mRWtGgxBDgVYQRa/PHzYXfjDh27PmSJzuPAeC6Zh", - "Fx0PH+Kz7K1QunW4bonVHUUuE1RMmJvJCY1dnjLZia0dZTvtZFuvcHToJ8UzpZQjXLP8GzOAzslc7bL2", - "kEaWVC23rx3H3UkvEwwdW7fddynE/BZWy7JVzEyXwSq2Uke4+Ci6Z14QawV6EhX2SgNgxFIP8ixHjYuY", - "dw4kKcCcFLVkpRmysSquNbQ8kv7P/f/cf3+Q/DdN/thLnv/H9MPHp5cPHvZ+fHz5/ff/t/3Tk8vvH/zn", - "v8cEZKXZLK7z+5mqpYHUMc4VP+JWaz8X0j6r1k5aE/PPDXeHxMxmeswHS9rpuMU2hHFC7WYjzRlhPF/f", - "wh1rByISSgkKOWL4iFX2q5iHDkmO8tRaaSj6eiDb9bcBKfidlyF7VCp4zjgkheAxie4X/PoaP8Z6W648", - "0Bnvx6G+XRm7BX8HrPY8u2zmTfGLux2wobe1e9QtbH533I4KMHTFQhUG5CWhJM0ZKjgEV1pWqT7lFJ9Q", - "AblGjBL+YTj8qH7hm8Rf8ZFHthvqlFNlcFg/rKKq4TlEVCY/Avi3taoWC1C6I9vNAU65a8U4qTjTOFdh", - "9iuxG1aCRMvAxLYs6JrMaY46gD9ACjKrdFvaQY8Rpc0T3eojzTREzE851SQHqjR5zfjJCofzjhmeZjjo", - "CyHPaizEef4COCimkjgj/cl+RX7qlr90vBXdd+1nz28+9wXgYY/5MzjIjw7dS+DoEMW9RhPZg/2zqacK", - "xpMokZ0sgRSMo1tch7bIfSO0egJ60Og03a6fcr3ihpDOac4yqq9HDl0W1zuL9nR0qKa1ER1tg1/rh5jx", - "eSGSkqZnaHscLZheVrNJKoqpfwFNF6J+DU0zCoXg+C2b0pJNVQnp9PzRFnHsBvyKRNjV5XjkuI66dS8H", - "N3BsQd05az2f/1sLcu+nlydk6nZK3bPOTXbowCsl8mh1sTUtQ45ZvHXOt95dp/yUH8KccWa+75/yjGo6", - "nVHFUjWtFMgfaE55CpOFIPvEDXlINT3lPRY/GD+DrscOmrKa5SyNK17GI+sT3R/h9PS9IZDT0w89q0D/", - "4nRTRc+onSC5YHopKp04p89EwgWVWQR0VTv94cjWZXvTrGPixrYU6ZxK3fhxVk3LUiW5SGmeKE01xJdf", - "lrlZfkCGimAn9FUhSgvpmaDhjBYa3N83wtlFJL3wHsOVAkV+L2j5nnH9gSSn1d7eEyAHZfnKjHls4Pjd", - "8RpDk+sSWuqNHb2MmsFiqg1cuBWoYKUlTUq6ABVdvgZa4u7jRV2gIi3PCXYLcVJb6nGoZgEeH8MbYOG4", - "sh8VLu7Y9vLRO/El4CfcQmxjuFOjEL/ufpmhfha5IbJrb1cwRnSXKr1MzNmOrkoZEvc7Uzv1LwxP9lYK", - "xRbcHAIX/zADki4hPYMMXbGhKPV63OruDWHuhvOsgykbsmDdpdCvFjVBMyBVmVEnA1C+7jo4KtDae3W+", - "gzNYn4jGLfcqHo2X41FqgwgSQzNDBxUpNbiMDLGGx9aN0d18Z1Q1kNKyJItczNzprsliv6YL32f4INsb", - "8hYOcYwoajRsoPeSyggiLPEPoOAaCzXj3Yj0Y8trqdN29N9saclwkG2XS/Q6EfPurdFj6lEmZhsnM6ri", - "FwiYL2Y/zBnq2pz9TFapiiuYEAx7dYQ7y1EWqc3d9mRT2dI82ji+IdDiVAKSN7e6B6ONkVB8WFLlQ3cw", - "wskfmJ0u2iHDXG1YNVTkLav43mskJ2bmzeGcDuF/2N/8KDCXBmFMtTe5Z2zdwzCuIwtsRLH3Oveu5t6/", - "fDS+kq/4eOQ8eGLbIThKGRnksLALt409oTjQ7qlggwwcv8znOeNAkpjllSolUmZjrxpe7uYAI4Q+JMQq", - "eMjOI8TIOAAbjQU4MHkjwrPJF1cBkgND6wL1Y6OZIfgbtmubm9BuJ95uFUP7vKM5ROMm9MJuY18LNR5F", - "WdLQC6Gt3rdNZtB7UsVI1LCmvl6mr/1RkANex0mLsyZnMW2dkSoAyfDYdwueDeQ+m5tL/kFgM5KwYEpD", - "8242p9Urgj6v7uJcaEjmTCqd4JM9ujzT6EeFwuCPpmmc/XRsOsrqAOLcB6c9g3WSsbyK77ab92+HZto3", - "9ftJVbMzWOMlAzRdkhnGMkctvRumtt4HGxf8yi74Fb219e5GS6apmVgKoTtzfCNU1eEnmw5ThABjxNHf", - "tUGUbmAv+PY5hFzHXNaDNxm+ag3DtDEVg1qD3mHK/NibxK8AimHOa0eKriUQdDeugqEljvKMMB2EAvc9", - "YQfOAC1Llq06b3g76oDZDgX4KwjqVuKPmKJG9WBbMBC812POVhK8zsFuaXBn2qBuHq5tshNmjPQVIiRg", - "COFUTPmUJH1EGdLGuPltuDoBmv8N1n83bXE5o8vx6GZP/hiu3YhbcP223t4onlGXbZ+ALQ3eFVFOy1KK", - "c5onTjEyRJpSnDvSxOZej/KZWV38+X3y8uDVWwe+eXvmQKVVlW1cFbYrv5lVmRexkAMHxKc8MNKqfztb", - "QSzY/DqOLFSmXCzBhZcHspzhYo647PFqFGXBUXTKlXncpLZVVeJ0enaJG3R7UNaqveZFbDV7bW0ePacs", - "909RD+2A+QsX1+hTr8wVwgFurBUMlLvJrbKb3umOn46GurbwpHCuDQHwhc3xoIjgXb8qI0LiCxdJtaBr", - "Q0FWOd1nTrwqEnP8EpWzNK624DNliINbna9pTLDxgDBqRqzYgAmBVywYyzRTO1jLOkAGc0SRiSqlDbib", - "CZecq+LsXxUQlgHX5pPEU9k5qOZc+gQv/evUyA79udzANtlLM/xNZAwz1JB0gUBsFjBCDXPEV9c/OP1C", - "a9W4+SFQDF7BUBXO2LsSNxiZHH04arbW/mVbUxzm0urzP0MYNu/C9kReXm2xtIAOzBFNzDV4WxwM3xSm", - "9xXuiOZKQHDDy2Bs0/bkSkSGqfgF5TbPjulnceh6K7A6A9PrQkgMLVEQtdIzlcyl+APiL9m52aiI66dD", - "JYqL2HsScdnvMtFaK9NkUPP4DeEYJO0hSS74SNqGxIETjlQeqM4xAtwruCi3ZG1zArXM1/HDEbqcTO34", - "zeFwMPfcdHJ6MaOx8HgjUBmYDhojTUsVpwXxnf0uOK1hQ3uBvaduy2w8Rgmy8c/ux/5dUzj6tkg+g5QV", - "NI9LSRlivx19lrEFs4mVKgVB5h43kM1IZ6nIZT+yZrAGNUdzsjcOcoO53cjYOVNslgO2eGRbzKjCW6tW", - "t9ZdzPKA66XC5o93aL6seCYh00tlEasEqQVYfMrVuu8Z6AsATvaw3aPn5D5q/RU7hwcGi04WGe0/eo5u", - "KfaPvdhl5zKobeIrGTKW/3KMJU7HaPawY5hLyo06icYG2bSXwyxsw2myXXc5S9jScb3tZ6mgnC4gbs0t", - "tsBk++JuotKwgxee2ZxtSkuxJkzH5wdNDX8acE0z7M+CQVJRFEwX5gBpQZQoDD01aXnspH44mwDOpcrw", - "cPmPaGIp7bMBug/mz6sgtnd5bNVoCHtDC2ijdUyoDaHLWROk7BjihBz5QFzMHVKnDLG4MXOZpaNIZ7YQ", - "UyQwrvERVel58leSLqmkqWF/kyFwk9l3TyP5UtopEvjVAP/seJegQJ7HUS8HyN5LE64vuc8FTwrDUbIH", - "jStocCqjKQmEpnncqcVz9K5P0+ahdxVAzSjJILlVLXKjAae+EeHxDQPekBTr9VyJHq+8ss9OmZWMkwet", - "zA79+u6VkzIKIWNpGZrj7iQOCVoyOEf/mvgmmTFvuBcy32kXbgL9l7WyNC+AWizzZzn2EPihYnn298a1", - "vZNySlKeLqM2jpnp+FuTI69esj3H0SwAS8o55NHh7J35m79bI7f/P8Wu8xSM79i2m0rKLrezuAbwNpge", - "KD+hQS/TuZkgxGrb17d2DssXIiM4TxNy3lBZPztWkADnXxUoHcvXix+sXyXqssy7wOZfIcAzlKon5Ceb", - "43oJpBWgitIsK6rcBjtCtgDplKxVmQuajYkZ5+TlwStiZ7V9bC5Sm/9lgcJcexUdHUaQn2I3VyefZC7u", - "hrn7OJv9wsyqlcYAdaVpUcY87E2LE98A3fhDvS6KeSF2JuTQStjKy292EkMPcyYLI5nWo1kejzRh/qM1", - "TZcoura4yTDJ7564yFOlCtKC1hkW6xQTeO4M3C53kU1dNCbCvC8umLKpjeEc2k79dYSLezp5J//28mTF", - "uaWUKI/eFIF1HbR74Kzx3qt+o5B1EH9FwUWJSqZw1TxOx9grGkLdTQrVywdqownrfHw+ZX1KueAsxQDm", - "IJlyDbJLk7yLXWSHWO+uWsofcXdCI4crmoqqdg9yWBxMTuUZoUNcXzEbfDWbaqnD/qkxH++SarIArRxn", - "g2zsk5g5fQnjClzKEMyYHfBJIVu2JuSQUfNlUqu5r0hG6OI7IAD/aL69cc8jdMs7YxwFIYc25wFoNRqY", - "xVUb6YlpshCg3HraIbnqvekzwbDUDFYfJj7rK45hTTVm2dYu2R/qwFspnVXQtH1h2hI0yzQ/t9yJ7aQH", - "ZekmjUbU1jscS5g2iOCItSnx6v4AufX44WgbyG2jewHep4bQ4ByNk1DiPdwjjDr3XCc15TnNK0tR2IJY", - "t55oGBjjETBeMQ5NTuLIBZFGrwTcGDyvA/1UKqm2IuBOPO0EaI4WyRhDU9qpaG86VGeDESW4Rj/H8DY2", - "afMGGEfdoBHcKF/XqZANdQfCxAvMwe4Q2U+Ch1KVE6IydNzspMWLMQ7DuH2ayvYF0D8GfZnIdteS2pNz", - "lZtoKOAlFTF58+UK0soa3IVNjUHLkqQYQRrcF1GNJlPm8VTM8lgSnPpjkMESnWxna/w3lrBkGCXOIn5l", - "nyxv/saOVxZY2yP1xE1DTIlii2tuc9P/Vvc5F4s2IJ9XobDxjIckEzvdLw3bHM4xeuAZax2iiG5Iwqc3", - "xkdTHVzTPpPIyKOP0iZT7eZH+XDO2TGy/gFnxHdN9D21t4u1MQy5JKaDHrRUO/d4TUkT6t4/mDZRbGwE", - "689gE9TaYi9R/cqQD4N1YTCfe713k4t6UiaOvRGh3jmmD9DfvOcdKSlzBrTmxPYx63x0+17Tu3jvNRvc", - "XYTzfMVBYit5uzVhWItCep7Pge+7zUw02T34tTHIo80EE9kugLtMtm2fxp09q+ZzSDU73+Jp/l9GYm28", - "mMdeprVJxQPHc1Z76viaQFcUtRuANjmCb4QniLC/MThDfqZnsL6nSDuf8mH0/DlCvU7YF2IAsw8khkSE", - "imn/7SPcKWSZqikDseCtbbY7NIlfBpNi1u5esTw/O83lSZJQJ2fVSXSG8nCKmBS/01ym6w6OV433Nrpk", - "DDmj97PEDd9eNi+gqhMa10V/AmcK81jrJlu6cGFnGBdQ6518ABoo/5sPobGz2GJSTdpO1PJdUJn5FlGx", - "1UvEyYB7V9dh2vqlszjQ83pm1vhG9H2GIzHR6AuT5kIxvkiGXKba7gi1Lv+eskYXVBBg+j2Eaw7SpevV", - "vlZXooX3pdgExyZUuFIR10GCGkyZZYEbDFx810RmYiIYaiu1OYNSuEAioaAGOhnETw7PuQnZL+x37yTr", - "E4F00u5ExvX0mmwNgPReMUz1kBhS/Zy423K78+113guMc5sNXcWCKblBZahJKqXIqtRe0OHBAP+u2jke", - "eAMriUr5aX+VPYEtx+j4V0Eowxmsp1ZoSpeUN2kK2sfaJkW3awgC7zq7fatPqbjAmi/sAha3AueXfAmN", - "R6UQeTKgOjrqx4R2z8AZS88gI+bu8PbkgTyV5D5qLGrbwMVy7dOAlyVwyB5MCDFvqaLUa28maKcc6kzO", - "7+lN869w1qyyYdrukTY55XFXCFv78Ib8zQ+zmavZYsA3nMoOsnkiveIDrI1eRLK27lo3J6K472bSbIjK", - "QhGTUq4ZK7fT+e4/1CKkH0Y5bHn/nLVedTapRkdZLyTc8usu0FJe8XXXj9/YdXm4DuRqlYL+OnfegBZu", - "B3C/C+Ib1UQfucMaBT3bRaMQz01guqNKwyIEs2cQBJX8/uh3ImHuCrE+fIgTPHw4dk1/f9z+bF5fDx9G", - "T+ZnU2a0yvO4eWMU8/ch4641YA74EXT2o2J5to0wWl4hTWY79Hv4zfnPfJHcer/ZJ3L/qLo0Y1dRo3Y3", - "ARETWWtr8mCqwN9jB1cP1y3i2IGXTVpJptcYwuRfVOy3aGj4T7USxtV8qx3BnR+yLTfq3JIalU1TIfIn", - "Yas2FeauR8W6xhTVL1e0KHNwB+X7e7O/wJO/Ps32njz6y+yve8/2Unj67PneHn3+lD56/uQRPP7rs6d7", - "8Gj+3fPZ4+zx08ezp4+ffvfsefrk6aPZ0++e/+WeL89oAW1KH/4DE1AmB2+PkhMDbIMTWjJM7X6J4vRc", - "+GR2NMWTaN4k+Wjf//T/+xM2SUURVJR3v46cj9poqXWp9qfTi4uLSdhlusA3WqJFlS6nfp5+RvC3R7X/", - "jI17wB21rhGGFHBTHSkc4Ld3L49PyMHbo0lDMKP90d5kb/IIc8aWwGnJRvujJ/gTnp4l7vvUEdto/+Pl", - "eDRdAs310v1RgJYs9Z/UBV0sQE5cVj/z0/njqTe/Tz+69+mlGXURC+6ynkCB+0c/2Z3TdaFRx1cdDvKp", - "KJdmZUxmNoyJOPGRZ+igYZ98hrXVyDrKmgweR0GhRBeJZUPT999/QxWlY1n3Y1kDI4ViG1XRcI3YoIy+", - "L53/7K+XET/AD526n4/39j5Brc9xaxSPl2sWDX16iyC2DUA3BrQ7XI8rvKa5oRuo68CPcEGPvtkFHXHU", - "fxu2RSxbvhyPnn3DO3TEzcGhOcGWQSRNnxX+ys+4uOC+pbmSq6Kgco0XbpDLLxStLgdZbjuGzWlrh/kw", - "BPUfgjxqLW3RbO3pbExUXZWolEwYwWFsXgEZpBIoXvNCorteU0nCaQbAlmF6ffAP1Be/PvgH+Z4MVZQP", - "prcv8jYT/wl0pNLJD+umKvJGjv6l2OT4qy3C/+3ceTe9au7q5Xyz9XJ2YNp3u3tXDembrYb0bYukqzr+", - "mBIueMIxr+Q5kECtdSejftUy6rO9J9/sao5BnrMUyAkUpZBUsnxNfuV1wMbNRPCa51Q8CKHZyH965q1G", - "ig7E9yDH9fRjy5Mh2648abk0ZGPCdCMZtrwdgpy8dfpfF6w3bjJ9UZ5ZR3vv+arGPuMVauusPdbux7iX", - "D2sSE9IDM80P66PDXeTy1pqCRDwx2byFr40ieu/S+qQaizDgK3KvxffmU98APTh+oBnxEX2fmDfvxkyf", - "7j39fBCEu/BGaPIjOnp8Ypb+SfUEcbIKmA3mkZ9+9Dl7dmAwLh9Wm7U476GNTMWc0LEL0ncVu2rrvuEn", - "lhHalGR9rmFm2JVf9FN2xThFk6boa+ERNo9+hC676L3jC3d84UZ8oUtQDUdAH1k1/YiebCE76B1JrBn5", - "JzKUBAUMpCh8Bl1B5qDTpfUd7tqyI2zFx40O85RN2ZVuzF861nXcon52CVyLs9di1p8dvXiw48/WfHo5", - "HqUgI8T3iw9iMZ/ZHH2x6phgn0QMM2kwn1ejTqnhEg8xRQyBakFcqAoxu3glKF80k/dt64iW62mT7hB8", - "EwT3mNpLl+HEHi+3iG9d8RHcliQhb1AcwgPuQ2L/jGqPT3kjf+oFvREcCKyYwsImlhbvzI21uFBXyK5d", - "l8PihwOiQ9vo+FGvWHY5rWNrhoSKt67U80ahormpWZPpvq1eoWUJVKprX9LbzWEnnRmPDsNKHK1QoDoI", - "KAKKwcsVLYn/sYsZ8c9rrbsr935X7v165d4/65O5ccixrMrbiWSHa3zR97T+Iu/pN4IneNsC117ya6Hl", - "y72tMQChVRLP55DiwhaaFxKFhJAPqMlO1ysMmhJaTAVdOofJ2F22KdXpsiqnH/E/6Ax62bhd2oRpU6tm", - "23Tf2sL6o1t1oLhpsf5+Om3b9bdNqbiiPFxgNbykEDzmumxr5b3Gj9FQGDTKDnRG8/hQ324SxBb8HbDa", - "8+zC6m6K38nXocK7kTjaWa2EsnZCQ2s90n9zWrqVSGM/Tz+2y3ZZbbhrqZaVzsRF0Lcp/zh4tmyLWz1b", - "b0QGdty2d38/JShFdwfnEd0/UjXXiEd7efw27WzgHVMuVDGl1WKpbTroaK75umNCU3sUbDi/2hb/bFv5", - "OL9zIDSXQLM1mQFwImZm0e08Et0Clo43xsN4G7hKKVJQCrIkzAO5CbTazxw1hHoDnhBwBLiehShB5lRe", - "E1jLJDYD2k2AXINb64EcH+hDvdv0mzawO3m4jVSal4elAixxIIoyB1efO4LCHXGCwiv7xPvnJ7nu9lUl", - "phqMBKLbryeswKA5TrlQkAqeqeF0EduOLSaICNaiwGbX9yclmsHNDDxwtb6iSrtMl62o2iDNiJliQ36L", - "oRgxM/Lf6wix3thNOdQ6CaiVvSCL5leH1Ya53sCqnkvMI6VWXe2HbSMPYSkYv04LGiSs0IGOwgwXWdwF", - "y3O01sYlkRYQDSI2AXLsWwXYDRUBA4Aw1SC6jkJvU05Ql0FpUZbm/Omk4nW/ITQd29YH+tembZ+4nGs4", - "8vVMgAoFbwf5hcWszfi7pIo4OEhBz5zMvnAe2n2YzWFMFOOpy7IzlM2BFXBsWoVHYMsh7Yp94fFvnbPO", - "4ejQb5ToBolgyy4MLTgmaH4VYuFV331djcInVIS2Be1AvGoETfv39IIyncyFdBmMsKZMxKbaSexEmXaV", - "jNyrWAunyHRVaSxDceME+a5V6N7qSo375AusiPhhmal+FHInE26jbdWCmIWRimvmA/DMeatlzK/PHnon", - "Pd9Jz3fS8530fCc930nPd9LznfT8qaXnL+OTSZLE82kfcBMLtyGjb1LC/4YiWj5nCEoj9NciPz4SjIhu", - "zvFGXw0NNJ+6KhNoVI/mVLdO32HFitRMxzgpc4rlKlfahx5jpcqgZpVPlW4zKhleYxo8eUyOfz549ujx", - "b4+ffWe4z9KWzQrb3vfJfpVe5/DA+bTVKU+8cxtwijnZ0beN+tdP6v0erDQ/ZzkQZZD1EpsfwjnkRpS3", - "1k9iHiP959EJ0PyFQ47lSqD0DyJbdwjHrH+KqGiTTGNCZ5zKSN2EPqH0kKwF1k5xhUB6L6jLW/WiiHsO", - "9Dds214NlAyMkvcmetnqKeBKXrmxd7GamT316CSu5sIXZdkEIXJk1rCnr8a3vpvz1x0cbGukCnf+vlU/", - "eI/46MHDYzv2OVEJ1i+3FLdKTKMF8MSxhWQmsrWvLe5KuLS4rK2tMcxkbeEKcJWB3DG4rx4YNosYXemW", - "qida2yyoA9gkbP0yjNNWddjIN69PHe2iczf2ouwO1+cagRvGfSHJQoqqfGCrWPM1PomLkvK1V4MZWRGr", - "1mEGa/T8vl1OXadd7fHZ3Yuuhe8VDOPv/m7RgslaXcW1zJZci+dE7BYG247xpuzNtjx4PiNopETXQEGu", - "/ib6XXauj7Xqr7T5kSOFcjplce7Crf5HXAlvpThn5uEc5bB9v6yGIUy23gwyYFl4NXSSb/i7oc1P39GL", - "k1bxot146ipxgueNpdIloEBWS2mRTCXmvpSCZilVGFHiahl+YolVr44iegcEEzNO9X1/zQU+2SpY4rg7", - "yZNt3283IaaEUTa15peVLhv/0wMXwNPCxp0q4M+iCvjBHz5FKGbp7hzOoL7oDmyKXugVj3KpKVoJhz3e", - "ggPx1ra8Vdtdb/i2Ca8xYToTBOQloSTNGRooBFdaVqk+5RRVoJ0U5h3znlfsDotSL3yTuBY+oiR3Q51y", - "ijXpa8VoVKSaQ6zaJoCX2FS1WIDSHU48BzjlrhXjTf17zAifWE9Qc10bjj6xLQu6JnOskSfIHyAFmZlX", - "RJjFBBWKSrM8d/ZEMw0R81NONcnBMP3XzAh0Zjivc6pt5K6urcfCQKULm2M2iWshfrJfMYzBLd/rjVC9", - "ZT83xX2+SCboJFYsyUF+dOgyjB0dYtKYxpLYg/2zmZcKxpMokZkb31nku7RF7hsZzxPQg8Ym6Xb9lBth", - "WguCjJ7q65FD1wzQO4v2dHSoprURHWuBX+uHWHTrQiTmyYh180YLppfVDHMx+6jX6ULUEbDTjEIhOH7L", - "prRkU1VCOj1/tEU+uAG/IhF2dXdz/3mU+CEdmNNSbzyWKOru/cC9fAsJXb/uLK5bXZTucqbe5Uy9y6p5", - "lzP1bnfvcqbeZRS9yyj6PzWj6GSjhOiycGzN8deKPc7Q9bOp21oz8LBZKxtg3yzJ9ISQE6yKSc0dAOcg", - "aU5Sqqxg5MrcFmyx1ERVaQqQ7Z/ypAVJKgo38f3mv/aZe1rt7T0Bsveg28fqLQLO2++Loip+shXZvyen", - "o9NRbyQJhTgHlxssrBJoe20d9v+rx/2lV3AUtTCoXPF1DYmq5nOWMovyXJjHwEJ0/Pu4wC8gDXA29QRh", - "2qZhRXyiX6TzzmkXM2wL3f37/QqlcA465HKX5uTT17/ZVGH1pjxw49g9hnjHMj4Hy/jiTONPlJHtLvna", - "V7ag0JDayq56A0mqriEXK03vZKSmRmNY8xBvuLra4fsPho8rkOf+8mtK+O1Pp5j/fCmUno7M1dQu7xd+", - "NPcDXdgR3OVSSnaOuRM/XP6/AAAA//9Gwo6X+vEAAA==", + "H4sIAAAAAAAC/+y9e3fbtrIo/lXw0zlr5XFEyXl1N16r6/zcOG19d5JmxW7PvifObSFyJGGbBLgB0Jaa", + "6+9+FwYACZKgJD+SND3+K7GIx2AwGAzm+XGUiqIUHLhWo/2Po5JKWoAGiX/RNBUV1wnLzF8ZqFSyUjPB", + "R/v+G1FaMr4YjUfM/FpSvRyNR5wW0LQx/ccjCf+qmIRstK9lBeORSpdQUDOwXpemdT3SKlmIxA1xYIc4", + "OhxdbvhAs0yCUn0of+b5mjCe5lUGREvKFU3NJ0UumF4SvWSKuM6EcSI4EDEnetlqTOYM8kxN/CL/VYFc", + "B6t0kw8v6bIBMZEihz6cL0QxYxw8VFADVW8I0YJkMMdGS6qJmcHA6htqQRRQmS7JXMgtoFogQniBV8Vo", + "//1IAc9A4m6lwM7xv3MJ8AckmsoF6NGHcWxxcw0y0ayILO3IYV+CqnKtCLbFNS7YOXBiek3I60ppMgNC", + "OXn3wwvy5MmT52YhBdUaMkdkg6tqZg/XZLuP9kcZ1eA/92mN5gshKc+Suv27H17g/Mdugbu2okpB/LAc", + "mC/k6HBoAb5jhIQY17DAfWhRv+kRORTNzzOYCwk77oltfKubEs7/RXclpTpdloJxHdkXgl+J/RzlYUH3", + "TTysBqDVvjSYkmbQ93vJ8w8fH40f7V3+2/uD5L/dn8+eXO64/Bf1uFswEG2YVlICT9fJQgLF07KkvI+P", + "d44e1FJUeUaW9Bw3nxbI6l1fYvpa1nlO88rQCUulOMgXQhHqyCiDOa1yTfzEpOK5YVNmNEfthClSSnHO", + "MsjGhvteLFm6JClVdghsRy5YnhsarBRkQ7QWX92Gw3QZosTAdS184IL+vMho1rUFE7BCbpCkuVCQaLHl", + "evI3DuUZCS+U5q5SV7usyMkSCE5uPtjLFnHHDU3n+Zpo3NeMUEUo8VfTmLA5WYuKXODm5OwM+7vVGKwV", + "xCANN6d1j5rDO4S+HjIiyJsJkQPliDx/7voo43O2qCQocrEEvXR3ngRVCq6AiNk/IdVm2//X8c9viJDk", + "NShFF/CWpmcEeCqy4T12k8Zu8H8qYTa8UIuSpmfx6zpnBYuA/JquWFEVhFfFDKTZL38/aEEk6EryIYDs", + "iFvorKCr/qQnsuIpbm4zbUtQM6TEVJnT9YQczUlBV9/tjR04itA8JyXwjPEF0Ss+KKSZubeDl0hR8WwH", + "GUabDQtuTVVCyuYMMlKPsgESN802eBi/GjyNZBWA4wcZBKeeZQs4HFYRmjFH13whJV1AQDIT8ovjXPhV", + "izPgNYMjszV+KiWcM1GputMAjDj1ZvGaCw1JKWHOIjR27NBhuIdt49hr4QScVHBNGYfMcF4EWmiwnGgQ", + "pmDCzY+Z/hU9owq+eTp0gTdfd9z9ueju+sYd32m3sVFij2TkXjRf3YGNi02t/js8/sK5FVsk9ufeRrLF", + "iblK5izHa+afZv88GiqFTKCFCH/xKLbgVFcS9k/5Q/MXScixpjyjMjO/FPan11Wu2TFbmJ9y+9MrsWDp", + "MVsMILOGNfqawm6F/ceMF2fHehV9NLwS4qwqwwWlrVfpbE2ODoc22Y55VcI8qJ+y4aviZOVfGlftoVf1", + "Rg4AOYi7kpqGZ7CWYKCl6Rz/Wc2Rnuhc/mH+Kcs8hlNDwO6iRaWAUxa8c7+Zn8yRB/smMKOwlBqkTvH6", + "3P8YAPTvEuaj/dG/TRtNydR+VVM3rpnxcjw6aMa5/ZmannZ9nYdM85kwbncHm47tm/D24TGjRiFBQbUD", + "w/e5SM+uBUMpRQlSM7uPMzNO/6Tg8GQJNANJMqrppHlUWTlrgN6x40/YD19JICNX3M/4H5oT89mcQqq9", + "+GZEV6aMECcCRVNmJD57j9iZTAOURAUprJBHjHB2JShfNJNbBl1z1PcOLR+6o0V256WVKwn28IswS29e", + "jQczIa9HLx1C4KR5CxNqRq2lX7Py9s5i06pMHH4i8rRt0BmoUT/22WqIoe7wMVy1sHCs6SfAgjKj3gYW", + "2gPdNhZEUbIcbuG8Lqla9hdhBJwnj8nxTwfPHj3+7fGzb8wNXUqxkLQgs7UGRe67e4Uovc7hQX9lyOCr", + "XMdH/+apf0G1x92KIQS4HnuXE3UChjNYjBGrLzDQHcq1rPgtoBCkFDIi8yLpaJGKPDkHqZiIqC/euhbE", + "tTB8yMrdnd8ttOSCKmLmxudYxTOQkxjmzTsLr3QNhdp2UdihT1a8wY0bkEpJ170dsOuNrM7Nu8uetJHv", + "pXtFSpCJXnGSwaxahHcUmUtREEoy7IgM8Y3I4FhTXalb4ALNYA0wZiNCEOhMVJpQwkVmDrRpHOcPA7pM", + "VKKg7keHLEcv7f0zAyMdp7RaLDUxYqWIbW3TMaGp3ZQE7wo18PSr3+y2lZ3O6slyCTRbkxkAJ2Lm3lfu", + "5YeLpKiW0d7i4rhTA1b9JmjBVUqRglKQJc68tBU0387ust6AJwQcAa5nIUqQOZXXBFYLTfMtgGKbGLi1", + "OOEepX2od5t+0wZ2Jw+3kUrzxrRUYGQXc7pz0DCEwh1xcg4SH2efdP/8JNfdvqocMJ24G/iEFeb4Ek65", + "UJAKnqnoYDlVOtl2bE2jlphgVhCclNhJxYEHFASvqNL2ic54hiKjZTc4D/bBKYYBHrxRzMi/+sukP3Zq", + "+CRXlapvFlWVpZAastgaOKw2zPUGVvVcYh6MXV9fWpBKwbaRh7AUjO+QZVdiEUS10xHVOqz+4lAdb+6B", + "dRSVLSAaRGwC5Ni3CrAbqo8HADHvi7onEg5THcqpddbjkdKiLM3500nF635DaDq2rQ/0L03bPnFR3fD1", + "TICZXXuYHOQXFrPWcLCkRrbDkUlBz8zdhJKa1SX0YTaHMVGMp5BsonxzLI9Nq/AIbDmkA0KyM00Gs3UO", + "R4d+o0Q3SARbdmFowQMS+1sqNUtZiZLE32F968/97gTRlz/JQFOWQ0aCD8jAkffW/YlVDnXHvJ6gtZMQ", + "2ge/J4VGlpMzhRdGG/gzWCsE31odTgJbxS1IipFRzemmnCCgXpdpLuSwCaxoqvO1ueb0EtbkAiQQVc0K", + "prU1I7UFSS3KJBwg+nDdMKNTHViNvd+BXXQZxzhUsLz+VoxHVmzZDN9JR3BpocMJTKUQ+WT7ie8hIwrB", + "Lg+PA1IKs+vMWS29actTUgtIJ8Sg3qhmnvdUC824AvK/RUVSylEAqzTUN4KQyGbx+jUzmAusnpNZSafB", + "EORQgJUr8cvDh92FP3zo9pwpMocLb+o3DbvoePgQX0lvhdKtw3ULL15z3I4ivB1f9OaicDJcl6dMtr7u", + "3ci77OTbzuB+UjxTSjnCNcu/MQPonMzVLmsPaWRJ1XL72nHcnRQawdCxddt9l0LMb0lBFDf14OPEWW9M", + "KzKvuAWqUu45gk4BXqEh5uPanGfd+KyppyqwN/5/SZ3CaTRubDS2gbmQm88fIiIly1YxU1wGq9imuDOG", + "z6l75u2xVqAnUTERgY9Y40Ge5W5pHd5BCjCHWi1ZaYZsLIdrDS2vo/9z/z/33x8k/02TP/aS5/8x/fDx", + "6eWDh70fH19+993/bf/05PK7B//57zHRWmk2i+v1fjKIFnPiePyKH3GrmZ8LaR9kayfnifnnh1tLgAxK", + "vYy5+ZQSFPJG665T6mWzqQAdJUopxTnwMWETmHR5bLYA5bVJOdA5upvgo0LoHa6i+jxYevPEEWA9XMhO", + "jCxGP4wTamkTT7N5deTrW5Be7EBEtvHpX+vKfhXz0EfKHRS1VhqKvsLLdv1tQNx/54Xl3qESPGcckkJw", + "WEfdghmH1/gx1tvedwOdUfIY6tt9TLTg74DVnmeXzbwpfnG3Awb/tvbYuoXN747b0XWG3mGoq4G8JJSk", + "OUNNjuBKyyrVp5ziWzEg14idxL+Ah7UHL3yTuLoiok1wQ51yqgwO6xdkVAc+h8id9QOAVyKoarEApTtS", + "8xzglLtWjJOKM41zFWa/ErthJUg0Vkxsy4KuyZzmqOz4A6Qgs0q35Ui89ZRmee4Ur2YaIuannGrDg5Qm", + "rxk/WeFw3lfE0wwHfSHkWY2F+BW1AA6KqSTO93+0X5H9u+Uv3VWAHsX2s+c3n5vve9hjLhYO8qND98Y6", + "OkRBulG59mD/bHq4gvEkSmRGMCoYR0+9Dm2R++Y54AnoQaO8dbt+yvWKG0I6pznLjPB0HXLosrjeWbSn", + "o0M1rY3oqFX8Wj/E7OELkZQ0PUNz6GjB9LKaTVJRTP3bcroQ9TtzmlEoBMdv2ZSWbKpKSKfnj7YIujfg", + "VyTCri7HI8d11K1rYtzAsQV156wVmv5vLci9H1+ekKnbKXXP+lvZoQNHmYg6wIX7tCxWZvE2XsA6nJ3y", + "U34Ic8aZ+b5/yjOq6XRGFUvVtFIgv6c55SlMFoLsEzfkIdX0lPdY/GBID3pDO2jKapazlJyFV3FzNK2b", + "dn+E09P3hkBOTz/0zB/9i9NNFT2jdoLkgumlqHTi/FATCRdUZhHQVe2HiCNbL/JNs46JG9tSpPNzdePH", + "WTUtS5XkIqV5ojTVEF9+WeZm+QEZKoKd0H2GKC2kZ4KGM1pocH/fCPfmkvTCOzFXChT5vaDle8b1B5Kc", + "Vnt7T4AclOUrM+axgeN3x2sMTa5LaCmOdnR8agaLKY1w4VaggpWWNCnpAlR0+RpoibuPF3WBKso8J9gt", + "xEntPIBDNQvw+BjeAAvHlV27cHHHtpcPKIovAT/hFmIbw50azf9198sM9ZPIDZFde7uCMaK7VOllYs52", + "dFXKkLjfmTrOYGF4sjfHKLbg5hC4kIwZkHQJ6Rlk6B0ORanX41Z3b/FzN5xnHUzZKArrwYWuvqhjmwGp", + "yow6GYDyddfnUoHW3tH0HZzB+kQ0nsJXcbK8HI+sCiNLDM0MHVSk1OAyMsQaHls3RnfznfXYQErLkixy", + "MXOnuyaL/ZoufJ/hg2xvyFs4xDGiqNGwgd5LKiOIsMQ/gIJrLNSMdyPSjy3PiDcze/NF1Dye9xPXpJHa", + "nAU4XM3Jsv5eAIZkiQtFZlRBRoSLJrKBOQEXqxRdwIDuKVRz7ujt2lKN4iDb7r3oTSfm3Qutd99EQbaN", + "E7PmKKWA+WJIBfWEHbu/n8lq0nEFE4JBwg5hsxzFpNrlwDIdKlvqZhv1OARanIBB8kbg8GC0MRJKNkuq", + "fKATxoP5s7yTDDBkHK2N24bAvXUbn6KNUMfMvDmc0yH8D3vnHwUm6yDoq/a99zy3e07jilvrhV+oxhs/", + "1Nru4Fk/Hjkvqth2CI4CUAY5LOzCbWNPKA60eyrYIAPHz/N5zjiQJGb9pkqJlNlIteaacXOAkY8fEmJ1", + "T2TnEWJkHICNFiIcmLwR4dnki6sAyYGhSYn6sdG2FPwN200MTSC8k7y3Ssht3tjnJM2RGjdhK3ZT++qy", + "8SjKoIaeMm0Lj20yg97bL0awhlH1FUh9NZWCHFBuSFp8NjmLqRWN+ANIlMe+W/C+IffZ3EgjDwKzoYQF", + "UxqaB745u15j9bmNAhTDoYSYD69Ol3Ju1vdOiJqSsaMzcoTL/OwrOBcakjmTSieoHYkuwTT6QaHc/YNp", + "GmenbcOkjQxmWZyb4rRnsE4ylldxenXz/v3QTPumfqqqanYGa7w0gaZLMsNI9qi7woaprUfLxgW/sgt+", + "RW9tvbudBtPUTCwNubTn+ErORYc/bmIHEQKMEUd/1wZRuoFB4jPzEHIdC1gIBEd7ODPTcLJJQdM7TJkf", + "e5M4GUAxfJPYkaJrCd4UG1fB0EZrhGKmg0Dwvnf1wBmgZcmyVUddYkcdFKrpld5E9nHVwwLurhtsCwYC", + "1UjMgU+CV+/YLQ1kABvSz8O1TXbCjJEmQ4QEDCGciimfkKaPKEPamDVhG65OgOZ/h/Wvpi0uZ3Q5Ht1M", + "uxLDtRtxC67f1tsbxTOaDexru6UsvSLKaVlKcU7zxOmghkhTinNHmtjcq6w+M6uLazpOXh68euvAN8/8", + "HKhMalFhcFXYrvxqViXBSMsDB8QnvDDSt1dTWFEy2Pw6ijDUW10swSUXCKRRw8Uccdnj1egkg6Po9Fjz", + "uPVyq1bKqU/tEjeoUaGstajNC98qUduKU3pOWe6f1h7aAUsjLq5RXV+ZK4QD3FgBG+jRk1tlN73THT8d", + "DXVt4UnhXBvSHxQ2w4cigncdV4wIiS92JNWCrg0FWTtAnznxqkjM8UtUztK4GobPlCEObtXrpjHBxgPC", + "qBmxYgPWGl6xYCzTTO1gmOwAGcwRRSZq7zbgbiZcaraKs39VQFgGXJtPEk9l56Cac+nT+/SvUyM79Ody", + "A1slXjP8TWQMM9SQdIFAbBYwQmV+D9zD+snsF1pbIcwPgdbyCjbBcMbelbjBnufow1GzdaxYtpXyYSa1", + "Pv8zhGGzbmxP4+Yfr0sL6MAc0bRsg7fFwfBNYXpf4Y5orgQEN7wMxlY3nCsRGabiF5TbLEumn8Wh663A", + "aj1MrwshMVxJQdQhgqlkLsUfEH/JogIg4r/sUIniIvaeRMJAuky01jI1+fM8fkM4Bkl7SJILPpK2zXbg", + "hCOVB1YKjP/3CjvKLVnbjFAtT4H44Qi9e6Z2/OZwOJh7HlE5vZjRWHIEI1AZmA4ae1hLtagF8Z39Ljgt", + "aEN7gWmtbstsjE8Jsgky6MeTXlM4+rpIPoOUFTSPS0kZYr8d0ZixBbNptSoFQd4mN5DNR2ipyOW+shbH", + "BjVHc7I3DjLDud3I2DlTbJYDtnhkW8yowlurVrrVXczygOulwuaPd2i+rHgmIdNLZRGrBKkFWHzK1br8", + "GegLAE72sN2j5+Q+WjEUO4cHBotOFhntP3qOamD7x17ssnP58zbxlQwZy385xhKnYzTj2DHMJeVGnUTj", + "zWzS02EWtuE02a67nCVs6bje9rNUUE4XEDecF1tgsn1xN1Fp2MELz2zGPqWlWBOm4/ODpoY/DXgBGvZn", + "wSCpKAqm0UCpBVGiMPTUJGWyk/rhbPo/lyjFw+U/osmo9E7UnQfz51UQ27s8tmo07L2hBbTROibUhmXm", + "rDHmOoY4IUc+uBszx9QJYyxuzFxm6SjSoW13TkrJuMZHVKXnybckXVJJU8P+JkPgJrNvnkay5bQTZPCr", + "Af7Z8S5BgTyPo14OkL2XJlxfcp8LnhSGo2QPGq/b4FRGAwaEpnncf8hz9K772OahdxVAzSjJILlVLXKj", + "Aae+EeHxDQPekBTr9VyJHq+8ss9OmZWMkwetzA798u6VkzIKIWOpPprj7iQOCVoyOEdXpvgmmTFvuBcy", + "32kXbgL9l7WyNC+AWizzZzn2EPi+Ynn2axNF0Ek4JilPl1Ebx8x0/K3JkFgv2Z7jaGaJJeUc8uhw9s78", + "zd+tkdv/n2LXeQrGd2zbTSRml9tZXAN4G0wPlJ/QoJfp3EwQYrXtVl374eULkRGcp0lj0FBZPzdakFTp", + "XxUoHQvjwg/WhRV1WeZdYHP6EOAZStUT8qPNcL4E0oqyRmmWFVVuI3YhW4B0StaqzAXNxsSMc/Ly4BWx", + "s9o+NhOtzSm0QGGuvYqODiPIebKbV5lPMRj3eN19nM0ueGbVSmPSA6VpUcaCGUyLE98AIyZCvS6KeSF2", + "JuTQStjKy292EkMPcyYLI5nWo1kejzRh/qM1TZcoura4yTDJ754My1OlCpLC1vk167QleO4M3C4flk2H", + "NSbCvC8umLKJreEc2vETdTCRezr5eIr28mTFuaWUKI/eFOx2HbR74Kzx3qt+o5B1EH9FwUWJSqZw1dxg", + "x9grmgegm2islw3WxpnW2Rh9wYKUcsFZilH4QSrtGmSXJHsXu8gOCQu6ail/xN0JjRyuaHqz2sHJYXEw", + "4ZlnhA5xfcVs8NVsqqUO+6fGbMxLqskCtHKcDbKxT2Hn9CWMK3BpaDBfesAnhWzZmpBDRs2XSa3mviIZ", + "oTf1gAD8g/n2xj2P0M3wjHEUhBzanEej1WhgDl9tpCemyUKAcutpB2ur96bPBAOWM1h9mPicvziGNdWY", + "ZVu7ZH+oA2+ldFZB0/aFaUvQLNP83PLctpMelKWbNOpWVe9wLAnfIIIj1qbEq/sD5Nbjh6NtILeN7gV4", + "nxpCg3M0TkKJ93CPMOp8hp3EpOc0ryxFYQti3XqiEXeMR8B4xTg0GakjF0QavRJwY/C8DvRTqaTaioA7", + "8bQToDlaJGMMTWmnor3pUJ0NRpTgGv0cw9vYpGIcYBx1g0Zwo3xdJ8I21B0IEy8wA79DZD+xIkpVTojK", + "0BG1k2oxxjgM4/ZJStsXQP8Y9GUi211Lak/OVW6iodiiVMTkzZcrSCtrcBc2vwstS5JisG5wX0Q1mkyZ", + "x1MxyyO+b4f1xyB/KToNz9b4byzrzjBKnEX8yj5Z3vyNHa8ssLZH6ombhpgSxRbJ7phAZn5zdDRTX4/C", + "mv63SmK5WLQB+czZMTaxl3CPYozlpeHYYaRrL5WU5el1ICp6QAmfVxvfa3UIVZsd4B0SfQ83KZI36wOG", + "kx2P8dYZ8IMMcoJQe7FZ88aQN2Q66LxLtYs00JQ0CQ36PMFmKI6NYF0pbGZkW2UoqtoZcp+w3hPmc6/3", + "biJZT8DFsTci1Pvl9AH6u3f6IyVlznbXMIs+Zp17cN9hexfHwWaDu4twTrc4SGwlvZRxmymk53QdBA7Y", + "zF6T3UOcG18ANNdgXuYFcJeYue1OubNT13wOqWbnW5zc/8sIy40D9diL0zabfeDzzmonIV+M6opSfgPQ", + "Jh/0jfAEeRRuDM6Qi+sZrO8p0qKGaKqxsSfU60TQIQYwx0RiSESomOHBvv+dLpipmjIQC97QZ7tDk95n", + "MMdrELJxzbk8SRIahnFsmPJcxB4QO81luu7g89U4jqM3yJAffD/L4vDtdYhJLVWdn7uuNhX4cZh3YjcD", + "2IWL4MOQhFrl5WP5QPnffPyRncVWMWuy0KKC8YLKzLeISsxeGE8GPMu6vtrWJZ7FgZ7XM7PGLaPvrhyJ", + "fEc3nDQXivFFMuSt1faEqM0I95S196BuAtNXIlxzkC77tPZF4hItvBvHJjg2ocLVKLkOEtRgHjcL3GAM", + "6LsmyBXT/VBbItDZssIFEgkFNdDJIBR1eM5NyH5hv3v/XJ/upZNcKTKup9dkayypd8hhqofEkOrnxN2W", + "2/1+r/NUYZzb5P4qFpfKDSpDJVYpRVal9oIODwb4J93OUd8bWElUyk/7q+wJbDnmQHgVRFGcwXpqhaZ0", + "SXmTjKJ9rG16OruGIGqxs9u3+oqLC6z5wi5gcStwfsmX0HhUCpEnA1qro354bfcMnLH0DDJi7g5vyh7I", + "80ruo7KkNktcLNc+q31ZAofswYQQ85YqSr32Fop2YqnO5Pye3jT/CmfNKhvx7h5pk1Me98KwRTdvyN/8", + "MJu5mq1CfcOp7CCbJ9IrPsDa6EUk6/GuBZsiNoNuJtqGqCwUMSnlmmF6O53v/kMtQvphgMWW989Z61Vn", + "U6d07ARCwi2/7gIF6RVfd/3QkV2Xh+tArlYp6K9z5w1o4XYA97sgvlFN9JE7rFHQs100CvE0D6Y7qjQs", + "QjBHCkFQye+PficS5q4C8MOHOMHDh2PX9PfH7c/m9fXwYfRkfjZlRqsulJs3RjG/DtmVre10wIWhsx8V", + "y7NthNFySGnyF6LLxW/OdeeLZFD8zT6R+0fVJZO7ihq1uwmImMhaW5MHUwWuJjt4mbhuEZ8SvGzSSjK9", + "xugp/6Jiv0Wj0n+slTCu2GDtg+5coG2dW+cR1ahsmtKkPwpbLqwwdz0qsTWmeH+5okWZgzso392b/Q2e", + "fPs023vy6G+zb/ee7aXw9NnzvT36/Cl99PzJI3j87bOne/Bo/s3z2ePs8dPHs6ePn37z7Hn65Omj2dNv", + "nv/tnq8LagFtam7+A9OMJgdvj5ITA2yDE1qyurKDIWOfspCmeBLNmyQf7fuf/n9/wiapKJrh/a8j5x43", + "Wmpdqv3p9OLiYhJ2mS7wjZZoUaXLqZ+nn1H/7VHtumNDLnBHrVeGIQXcVEcKB/jt3cvjE3Lw9mjSEMxo", + "f7Q32Zs8wszAJXBastH+6An+hKdnifs+dcQ22v94OR5Nl0BzTBdt/ihAS5b6T+qCLhYgJy53o/np/PHU", + "W/6nH9379NKMuojFlVknpMDzpJ/S0Om60J7ky10HqWmUy1gzrhNHOfGRZ+gbYp98hrXVyDrKmvQnR0GF", + "ThcEZqPi999/RaXMY1UrYrkhIxWKG1XRcHHihq8aXrmXPP/w8dm3lxEXxA+dgrOP9/Y+QZHZcWsUj5dr", + "Vqt9eosgtg1ANwa0O1yPK7ymuaEbyLwiaIQLevTVLuiIo/7bsC1i2fLlePTsK96hI24ODs0JtgyCePqs", + "8Bd+xsUF9y3NlVwVBZVrvHCDjI2haHU5yHLb4XNOWzvMhyGonxKkpGtpi2ZrT2djouoiW6VkwggOY/MK", + "yCCVQPGaFxI9BZtKLE4zALaq2OuDf6C++PXBP8h3ZG9c83Z0pIhMb1/kbSb+I+hIpaDv10057o0c/Uux", + "yXE/Z7xH0kAlHy18BBwiraCr74ZQtrLCQOySKehqS8H7r+fOu+lVc1dv6qutN7UD077b3btqYl9tNbGv", + "WyRd1aHPlHDBE44pOs+BBGqtOxn1Ty2jPtt78tWu5hjkOUuBnEBRCkkly9fkF17HitxMBK95TsWD6J2N", + "/Kdn3mqk6EB8DzKZTz+2PBmy7cqT0L5wdDgmTDeSYcvbIUhvXGdSdnGC4ybJGOWZ9fH3XqZq7JNtobbO", + "2mPtfox7qbgmMSE9MNN8vz463EUuDwEPcwDFZPMWvjaK6L1L65NqLMJYs8i9Ft+bT30D9OD4nmbEBxN+", + "Yt68GzN9uvf080EQ7sIbockP6OjxiVn6J9UTxMkqYDZYLWD60acL2oHBuIRPbdbivIc2MhVzQscuP4Cr", + "y1Zb9w0/sYzQZkPrcw0zw678op8tLMYpmgxJfxYeYaslROiyi947vnDHF27EF7oE1XAE9JFV04/oyRay", + "g96RxEKmfyFDSVALQorCJ+8VZA46XVrf4a4tO8JWfMjqME/ZlNjpxvylY13HLeontsC1OHstJhza0YsH", + "O/5kzaeX41EKMkJ8P/sgFvOZzdEXqw5H9vnLMIkH8yk96mweLucRU8QQqBbEhaoQs4tXgvJFM3nfto5o", + "uZ426Q7BN0Fwj6m9dMlV7PFyi/jaFR/BbUkS8gbFITzgPhr3r6j2+JQ38qde0BvBgcCKKawRY2nxztxY", + "iwt12fbadTkscTkgOrSNjh/1imWX0zq2ZkioeOuKe28UKpqbmjVJ9tvqFVqWQKW69iW93Rx20pnx6DAs", + "AtIKBaqDgCKgGLxc0ZL4H7uYEf+61rr2DVyXh486LfuCW1h8eV7x1FV/c0leMYjFWjLMFsWrblUF9sb/", + "L+mzR49/e/zsm7Dwlm1gsNF8jtXeYtkq6i8Pq6ayfqsgfX3u7ilS0vVgmM1AxNprkGe5ryTUKXdfgLmI", + "1JKVX6Iykivc34P4J1cju05jc8S/r/nOOUg2x6yv9Xn6zGEQEiCDUi83+h/bpLWlXjabCi6FPFMuzqOU", + "4hz4mLAJTLpGpGzRZITIgc7rOAEh9A62tvo8WHrzxBFgPVzILiLa2xj9MN7EU35uZUTj6mQvAY882eHH", + "X1RTob+IpuKN4AnKMcC1l6lbaPlyWgsM7WjVbfSJwbjQqBAUEsWvkG2pyU6CCwwaaVo8EJ1lh8nYiTEp", + "1emyKqcf8T/oZnvZOLTaLHhTq8DcJMkc2xa36ppixySyzW28Z7dTqkarZ6u10lD0c6Tbrr9tyq8WvXIE", + "lmxMCsFjTuG2oONr/BgNMkJz90BndDwY6tvNbNmCvwNWe55dWN1N8Tv5cyhHbyTod1Yroazd+9APAum/", + "OS3dcrmxn6cf27XYrJ3BtVTLSmfiIujb1CgdPFu2xa2erTciAztuO26in+eVoiOJ8zXvH6maa8RFUo/f", + "pl1HOEhptVhqm+M7WkCg7pjQ1B4FmyhBbYsst618BOU5EJpLoNmazAA4ETOz6HaGjm6VVccb4wHSDVyl", + "FCkoBVkSJvfcBFrtwY+Sj96AJwQcAa5nIUqQOZXXBNYyic2AdrNa1+DWGjbHB/pQ7zb9pg3sTh5uI5VB", + "dWzzpBFFmYN71ERQuCNOUNZmn3j//CTX3b6qxPyRkRB/+/WEFRiOyCkXClLBMzWciGPbscXUG8FaFNiS", + "Cf6kRNPymYEHrtZXVGmXvrQVrxwkcDFTbMgcMhR9Z0b+tY69643dVOmtM7ta2QuyaNJ8WG2Y6w2s6rnE", + "PFIB2BX02DbyEJaC8etcr0EqEB1of8xwkcVdsDxHO3hcEmkB0SBiEyDHvlWA3VDFMgAIUw2i6/j+NuUE", + "xTaUFmVpzp9OKl73G0LTsW19oH9p2vaJyzndI1/PBKhQ8HaQX1jM2jTOS6qIg4MU9MzJ7Avn+96H2RzG", + "RDGeuvxFQ3kyWAHHplV4BLYc0q7YFx7/1jnrHI4O/UaJbpAItuzC0IJjguafQiy86ruvq7j7hCrmtqAd", + "iFeNoGn/nl5QppO5kC43FBYKilirOymzKNOuPJV7FWvhVMSu1JBlKG6cIIm5Ch2HXT18n9aCFREPNzPV", + "D0LuZBxv9NhaELMwUnHNfGijOW+1jPnnszTfSc930vOd9HwnPd9Jz3fS8530fCc9f2rp+ct4u5Ik8Xza", + "24ZjgUxk9FVK+F9RrNDnDO5phP5a5MdHghHRzTne6AWjgeZTVzoE3RWiifKtO31YhiQ10zFOypxiDdKV", + "9kHdWH40KETmE77bXFWG15gGTx6T458OnP+BdXjAWmhh2/s+jbLS6xweOG/BOpmMdxsETjG9PHoNUv/6", + "Sb1HiZXm5ywHogyyXmLzQziH3Ijy1vpJzGOk/zw6AZq/cMixXAmU/l5k6w7hmPVPERVtkmks/oxTGSmG", + "0SeUHpK1wII4rrpL7wV1eev+Kf3t72/Ytr0aqAMZJe9N9LK1WJzzEXBj72I1M3vq0UlcIY0vyrIJQuTI", + "rGFPf5qohW42ZXdwsK2RKtz5+1ojDDziowcPj+3YZ5slWJTeUtwqMY0WwBPHFpKZyNa+YLyry9PisrZg", + "yjCTtdVIwJV7csfgvnpg2CxidKVbqp5owbqguGOTCvfLME5bL2Mj37w+dbQrCd7YP7U7XJ9rBG4Y94Uk", + "Cymq8oEtTc7X+CQuSsrXXg1mZEUsRYi5wdGn/nY5dZ3Qtsdnd6+kF75XnFth+3eLFkyD68roZbaOXjzb", + "ZLfa23aMN7WMtmUY9LlWI3XXBqqs9TfR77JzKq1Vf6XNPB2pftSpdXQXyPY/4kp4K8U5Mw/nKIft+2U1", + "DGGy9WaQAcvCq6GT1sTfDW1++o5enLQqUu3GU1eJEzxvLJUuAQWyWkqL5IAx96UUNEupwlgdV6DyE0us", + "enUU0TsgmJjLq++qbC7wyVbBEsfdSZ5se9W7CTHZjrJJS7+sdNn4nx640KgWNu5UAX8VVcD3/vApQjH/", + "eedwBkVjd2BT9EKveJRLTdFKOOzxFhyIt7blrdruesO3TXiNCdOZICAvCSVpztBAIbjSskr1KaeoAu0k", + "h++Y97xid1iUeuGbxLXwESW5G+qUG6FqTmrFaFSkmkOshCqAl9hUtViA0h1OPAc45a4V41iWBefCXPuJ", + "9QQ117Xh6BPbsqBrMsfCh4L8AVKQmXlFhPlhUKGoNMtzZ0800xAxP+VUkxwM03/NjEBnhvM6p9pG7ooV", + "eywM1BCx2XuTuBbiR/sVoy7c8r3eCNVb9nNTNumL5NhOYmWoHORHhy5329EhpuNpLIk92D+bealgPIkS", + "mbnxnUW+S1vkvpHxPAE9aGySbtdPuRGmtSDI6Km+Hjl0zQC9s2hPR4dqWhvRsRb4tX6IxQ0vRGKejFiR", + "cLRgelnNMMu1jyeeLkQdWzzNKBSC47dsSks2VSWk0/NHW+SDG/ArEmFXdzf3X0eJH9KBOS31xmPxp+7e", + "D9zLt5Aq98+dH3eri9JdNtq7bLR3+UrvstHe7e5dNtq7XK13uVr/p+ZqnWyUEF1+k63ZE3VPtUmbirg1", + "Aw+btfIs9s2STE8IOcF6o9TcAXAOkuYkpcoKRq6AcMEWS01UlaYA2f4pT1qQpKJwE99v/mufuafV3t4T", + "IHsPun2s3iLgvP2+KKriJ1vr/jtyOjod9UaSUIhzcFnXwvqLttfWYf+/etyfe6VcUQuDyhVfMZKoaj5n", + "KbMoz4V5DCxEx7+PC/wC0gBnM2UQpm2CW8Qn+kU675x2mci20N2/369QZOigm8/gLoHMJ68stKl27U15", + "4MaxewzxjmV8DpbxxZnGXyjX3V1auz/ZgkJDaitv7Q0kqbo6X6zov5ORmuqXYTVJvOHqOpLvPxg+rkCe", + "+8uvKY64P51iZvmlUHo6MldTu3Bi+NHcD3RhR3CXSynZOWal/HD5/wIAAP//wFz/n831AAA=", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/daemon/algod/api/server/v2/generated/types.go b/daemon/algod/api/server/v2/generated/types.go index 6e10c1f780..e3bdae039e 100644 --- a/daemon/algod/api/server/v2/generated/types.go +++ b/daemon/algod/api/server/v2/generated/types.go @@ -49,6 +49,11 @@ type Account struct { // Note: the raw account uses `map[int] -> Asset` for this type. CreatedAssets *[]Asset `json:"created-assets,omitempty"` + // MicroAlgo balance required by the account. + // + // The requirement grows based on asset and application usage. + MinBalance uint64 `json:"min-balance"` + // AccountParticipation describes the parameters used by this account in consensus protocol. Participation *AccountParticipation `json:"participation,omitempty"` @@ -83,6 +88,9 @@ type AccountParticipation struct { // \[sel\] Selection public key (if any) currently registered for this round. SelectionParticipationKey []byte `json:"selection-participation-key"` + // \[stprf\] Root of the state proof key (if any) + StateProofKey *[]byte `json:"state-proof-key,omitempty"` + // \[voteFst\] First round for which this participation is valid. VoteFirstValid uint64 `json:"vote-first-valid"` @@ -306,11 +314,14 @@ type DryrunTxnResult struct { Disassembly []string `json:"disassembly"` // Application state delta. - GlobalDelta *StateDelta `json:"global-delta,omitempty"` - LocalDeltas *[]AccountStateDelta `json:"local-deltas,omitempty"` - LogicSigMessages *[]string `json:"logic-sig-messages,omitempty"` - LogicSigTrace *[]DryrunState `json:"logic-sig-trace,omitempty"` - Logs *[][]byte `json:"logs,omitempty"` + GlobalDelta *StateDelta `json:"global-delta,omitempty"` + LocalDeltas *[]AccountStateDelta `json:"local-deltas,omitempty"` + + // Disassembled lsig program line by line. + LogicSigDisassembly *[]string `json:"logic-sig-disassembly,omitempty"` + LogicSigMessages *[]string `json:"logic-sig-messages,omitempty"` + LogicSigTrace *[]DryrunState `json:"logic-sig-trace,omitempty"` + Logs *[][]byte `json:"logs,omitempty"` } // ErrorResponse defines model for ErrorResponse. @@ -617,11 +628,7 @@ type NodeStatusResponse struct { } // ParticipationKeyResponse defines model for ParticipationKeyResponse. -type ParticipationKeyResponse struct { - - // Detailed description of a participation key - ParticipationKey string `json:"participationKey"` -} +type ParticipationKeyResponse ParticipationKey // ParticipationKeysResponse defines model for ParticipationKeysResponse. type ParticipationKeysResponse []ParticipationKey @@ -639,7 +646,7 @@ type PendingTransactionsResponse struct { // PostParticipationResponse defines model for PostParticipationResponse. type PostParticipationResponse struct { - // encoding of the participation id. + // encoding of the participation ID. PartId string `json:"partId"` } @@ -653,6 +660,11 @@ type PostTransactionsResponse struct { // ProofResponse defines model for ProofResponse. type ProofResponse struct { + // The type of hash function used to create the proof, must be one of: + // * sumhash + // * sha512_256 + Hashtype string `json:"hashtype"` + // Index of the transaction in the block's payset. Idx uint64 `json:"idx"` @@ -661,6 +673,9 @@ type ProofResponse struct { // Hash of SignedTxnInBlock for verifying proof. Stibhash []byte `json:"stibhash"` + + // Represents the depth of the tree that is being proven, i.e. the number of edges from a leaf to the root. + Treedepth uint64 `json:"treedepth"` } // SupplyResponse defines model for SupplyResponse. diff --git a/daemon/algod/api/server/v2/handlers.go b/daemon/algod/api/server/v2/handlers.go index da47ce3508..f8f84392ce 100644 --- a/daemon/algod/api/server/v2/handlers.go +++ b/daemon/algod/api/server/v2/handlers.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -73,6 +73,7 @@ type NodeInterface interface { ListParticipationKeys() ([]account.ParticipationRecord, error) GetParticipationKey(account.ParticipationID) (account.ParticipationRecord, error) RemoveParticipationKey(account.ParticipationID) error + AppendParticipationKeys(id account.ParticipationID, keys account.StateProofKeys) error } func roundToPtrOrNil(value basics.Round) *uint64 { @@ -94,6 +95,11 @@ func convertParticipationRecord(record account.ParticipationRecord) generated.Pa }, } + if record.StateProof != nil { + tmp := record.StateProof[:] + participationKey.Key.StateProofKey = &tmp + } + // These are pointers but should always be present. if record.Voting != nil { participationKey.Key.VoteParticipationKey = record.Voting.OneTimeSignatureVerifier[:] @@ -140,7 +146,6 @@ func (v2 *Handlers) GetParticipationKeys(ctx echo.Context) error { // AddParticipationKey Add a participation key to the node // (POST /v2/participation) func (v2 *Handlers) AddParticipationKey(ctx echo.Context) error { - buf := new(bytes.Buffer) _, err := buf.ReadFrom(ctx.Request().Body) if err != nil { @@ -212,6 +217,33 @@ func (v2 *Handlers) GetParticipationKeyByID(ctx echo.Context, participationID st return ctx.JSON(http.StatusOK, response) } +// AppendKeys Append state proof keys to a participation key +// (POST /v2/participation/{participation-id}) +func (v2 *Handlers) AppendKeys(ctx echo.Context, participationID string) error { + decodedParticipationID, err := account.ParseParticipationID(participationID) + if err != nil { + return badRequest(ctx, err, err.Error(), v2.Log) + } + + var keys account.StateProofKeys + dec := protocol.NewDecoder(ctx.Request().Body) + err = dec.Decode(&keys) + if err != nil { + err = fmt.Errorf("unable to parse keys from body: %w", err) + return badRequest(ctx, err, err.Error(), v2.Log) + } + if len(keys) == 0 { + err = errors.New("empty request, please attach keys to request body") + return badRequest(ctx, err, err.Error(), v2.Log) + } + + err = v2.Node.AppendParticipationKeys(decodedParticipationID, keys) + if err != nil { + return internalError(ctx, err, err.Error(), v2.Log) + } + return nil +} + // ShutdownNode shuts down the node. // (POST /v2/shutdown) func (v2 *Handlers) ShutdownNode(ctx echo.Context, params private.ShutdownNodeParams) error { @@ -239,6 +271,11 @@ func (v2 *Handlers) AccountInformation(ctx echo.Context, address string, params return internalError(ctx, err, errFailedLookingUpLedger, v2.Log) } + consensus, err := myLedger.ConsensusParams(lastRound) + if err != nil { + return internalError(ctx, err, fmt.Sprintf("could not retrieve consensus information for last round (%d)", lastRound), v2.Log) + } + if handle == protocol.CodecHandle { data, err := encode(handle, record) if err != nil { @@ -270,7 +307,7 @@ func (v2 *Handlers) AccountInformation(ctx echo.Context, address string, params } } - account, err := AccountDataToAccount(address, &record, assetsCreators, lastRound, amountWithoutPendingRewards) + account, err := AccountDataToAccount(address, &record, assetsCreators, lastRound, &consensus, amountWithoutPendingRewards) if err != nil { return internalError(ctx, err, errInternalFailure, v2.Log) } @@ -351,22 +388,19 @@ func (v2 *Handlers) GetProof(ctx echo.Context, round uint64, txid string, params return internalError(ctx, err, "building Merkle tree", v2.Log) } - proof, err := tree.Prove([]uint64{uint64(idx)}) + proof, err := tree.ProveSingleLeaf(uint64(idx)) if err != nil { return internalError(ctx, err, "generating proof", v2.Log) } - proofconcat := make([]byte, 0) - for _, proofelem := range proof { - proofconcat = append(proofconcat, proofelem[:]...) - } - stibhash := block.Payset[idx].Hash() response := generated.ProofResponse{ - Proof: proofconcat, - Stibhash: stibhash[:], - Idx: uint64(idx), + Proof: proof.GetConcatenatedProof(), + Stibhash: stibhash[:], + Idx: uint64(idx), + Treedepth: uint64(proof.TreeDepth), + Hashtype: proof.HashFactory.HashType.String(), } return ctx.JSON(http.StatusOK, response) diff --git a/daemon/algod/api/server/v2/test/handlers_test.go b/daemon/algod/api/server/v2/test/handlers_test.go index e80ca258d2..a912164e8a 100644 --- a/daemon/algod/api/server/v2/test/handlers_test.go +++ b/daemon/algod/api/server/v2/test/handlers_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -30,6 +30,7 @@ import ( "github.com/algorand/go-algorand/agreement" "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/crypto/merklesignature" v2 "github.com/algorand/go-algorand/daemon/algod/api/server/v2" "github.com/algorand/go-algorand/daemon/algod/api/server/v2/generated" generatedV2 "github.com/algorand/go-algorand/daemon/algod/api/server/v2/generated" @@ -177,7 +178,7 @@ func TestGetBlockJsonEncoding(t *testing.T) { Round: l.Latest() + 1, Branch: genBlk.Hash(), TimeStamp: 0, - RewardsState: genBlk.NextRewardsState(l.Latest()+1, proto, poolBal.MicroAlgos, totalRewardUnits), + RewardsState: genBlk.NextRewardsState(l.Latest()+1, proto, poolBal.MicroAlgos, totalRewardUnits, logging.Base()), UpgradeState: genBlk.UpgradeState, } @@ -522,7 +523,7 @@ func tealCompileTest(t *testing.T, bytesToUse []byte, expectedCode int, enableDe mockNode := makeMockNode(mockLedger, t.Name(), nil) mockNode.config.EnableDeveloperAPI = enableDeveloperAPI handler := v2.Handlers{ - Node: &mockNode, + Node: mockNode, Log: logging.Base(), Shutdown: dummyShutdownChan, } @@ -562,7 +563,7 @@ func tealDryrunTest( mockNode := makeMockNode(mockLedger, t.Name(), nil) mockNode.config.EnableDeveloperAPI = enableDeveloperAPI handler := v2.Handlers{ - Node: &mockNode, + Node: mockNode, Log: logging.Base(), Shutdown: dummyShutdownChan, } @@ -672,3 +673,126 @@ func TestTealDryrun(t *testing.T) { tealDryrunTest(t, &gdr, "msgp", 200, "REJECT", true) tealDryrunTest(t, &gdr, "json", 404, "", false) } + +func TestAppendParticipationKeys(t *testing.T) { + partitiontest.PartitionTest(t) + + mockLedger, _, _, _, releasefunc := testingenv(t, 1, 1, true) + defer releasefunc() + mockNode := makeMockNode(mockLedger, t.Name(), nil) + handler := v2.Handlers{ + Node: mockNode, + Log: logging.Base(), + Shutdown: make(chan struct{}), + } + + id := account.ParticipationID{} + id[0] = 10 + + t.Run("Happy path", func(t *testing.T) { + // Create test object to append. + keys := make(account.StateProofKeys, 2) + testKey1 := crypto.FalconSigner{} + testKey1.PrivateKey[0] = 100 + + testKey2 := crypto.FalconSigner{} + testKey2.PrivateKey[0] = 101 + + keys[0] = merklesignature.KeyRoundPair{Round: 100, Key: &testKey1} + keys[1] = merklesignature.KeyRoundPair{Round: 101, Key: &testKey2} + keyBytes := protocol.Encode(keys) + + // Put keys in the body. + e := echo.New() + req := httptest.NewRequest(http.MethodPost, "/", bytes.NewReader(keyBytes)) + rec := httptest.NewRecorder() + c := e.NewContext(req, rec) + + // Call handler with request. + err := handler.AppendKeys(c, id.String()) + + // Verify that request was properly received and deserialized. + require.NoError(t, err) + require.Equal(t, http.StatusOK, rec.Code) + require.Equal(t, id, mockNode.id) + require.Len(t, mockNode.keys, 2) + require.Equal(t, mockNode.keys[0].Round, keys[0].Round) + require.Equal(t, mockNode.keys[0].Key, keys[0].Key) + + require.Equal(t, mockNode.keys[1].Round, keys[1].Round) + require.Equal(t, mockNode.keys[1].Key, keys[1].Key) + + }) + + t.Run("Invalid body", func(t *testing.T) { + // Create request with bogus bytes in the body + e := echo.New() + req := httptest.NewRequest(http.MethodPost, "/", bytes.NewReader([]byte{0x99, 0x88, 0x77})) + rec := httptest.NewRecorder() + c := e.NewContext(req, rec) + + // Call handler with request. + err := handler.AppendKeys(c, id.String()) + + // Verify that request was properly received and deserialized. + require.NoError(t, err) + require.Equal(t, http.StatusBadRequest, rec.Code) + require.Contains(t, rec.Body.String(), "unable to parse keys from body: msgpack decode error") + }) + + t.Run("Empty body", func(t *testing.T) { + // Create test object with no keys to append. + keys := make(account.StateProofKeys, 0) + keyBytes := protocol.Encode(keys) + + // Put keys in the body. + e := echo.New() + req := httptest.NewRequest(http.MethodPost, "/", bytes.NewReader(keyBytes)) + rec := httptest.NewRecorder() + c := e.NewContext(req, rec) + + // Call handler with request. + err := handler.AppendKeys(c, id.String()) + + // Verify that request was properly received and deserialized. + require.NoError(t, err) + require.Equal(t, http.StatusBadRequest, rec.Code) + require.Contains(t, rec.Body.String(), "empty request, please attach keys to request body") + }) + + t.Run("Internal error", func(t *testing.T) { + // Create mock node with an error. + expectedErr := errors.New("expected error") + mockNode := makeMockNode(mockLedger, t.Name(), expectedErr) + handler := v2.Handlers{ + Node: mockNode, + Log: logging.Base(), + Shutdown: make(chan struct{}), + } + + keys := make(account.StateProofKeys, 2) + testKey1 := crypto.FalconSigner{} + testKey1.PrivateKey[0] = 100 + + testKey2 := crypto.FalconSigner{} + testKey2.PrivateKey[0] = 101 + + keys[0] = merklesignature.KeyRoundPair{Round: 100, Key: &testKey1} + keys[1] = merklesignature.KeyRoundPair{Round: 101, Key: &testKey2} + keyBytes := protocol.Encode(keys) + + // Put keys in the body. + e := echo.New() + req := httptest.NewRequest(http.MethodPost, "/", bytes.NewReader(keyBytes)) + rec := httptest.NewRecorder() + c := e.NewContext(req, rec) + + // Call handler with request. + err := handler.AppendKeys(c, id.String()) + + // Verify that request was properly received and deserialized. + require.NoError(t, err) + require.Equal(t, http.StatusInternalServerError, rec.Code) + require.Contains(t, rec.Body.String(), expectedErr.Error()) + }) +} diff --git a/daemon/algod/api/server/v2/test/helpers.go b/daemon/algod/api/server/v2/test/helpers.go index 31e6053a60..bd5768fe1b 100644 --- a/daemon/algod/api/server/v2/test/helpers.go +++ b/daemon/algod/api/server/v2/test/helpers.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -73,6 +73,7 @@ var poolAddrResponseGolden = generatedV2.AccountResponse{ AppsLocalState: &appLocalStates, AppsTotalSchema: &appsTotalSchema, CreatedApps: &appCreatedApps, + MinBalance: 100000, } var txnPoolGolden = make([]transactions.SignedTxn, 2) @@ -84,6 +85,8 @@ type mockNode struct { genesisID string config config.Local err error + id account.ParticipationID + keys account.StateProofKeys } func (m mockNode) InstallParticipationKey(partKeyBinary []byte) (account.ParticipationID, error) { @@ -102,8 +105,14 @@ func (m mockNode) RemoveParticipationKey(id account.ParticipationID) error { panic("implement me") } -func makeMockNode(ledger *data.Ledger, genesisID string, nodeError error) mockNode { - return mockNode{ +func (m *mockNode) AppendParticipationKeys(id account.ParticipationID, keys account.StateProofKeys) error { + m.id = id + m.keys = keys + return m.err +} + +func makeMockNode(ledger *data.Ledger, genesisID string, nodeError error) *mockNode { + return &mockNode{ ledger: ledger, genesisID: genesisID, config: config.GetDefaultLocal(), diff --git a/daemon/algod/api/server/v2/utils.go b/daemon/algod/api/server/v2/utils.go index 6498c575c7..d56e567ed1 100644 --- a/daemon/algod/api/server/v2/utils.go +++ b/daemon/algod/api/server/v2/utils.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -324,10 +324,13 @@ func convertInnerTxn(txn *transactions.SignedTxnWithAD) preEncodedTxInfo { response.AssetIndex = numOrNil(uint64(txn.ApplyData.ConfigAsset)) response.ApplicationIndex = numOrNil(uint64(txn.ApplyData.ApplicationID)) - // Deltas, Logs, and Inners can not be set until we allow appl - // response.LocalStateDelta, response.GlobalStateDelta = convertToDeltas(txn) - // response.Logs = convertLogs(txn) - // response.Inners = convertInners(&txn) + withStatus := node.TxnWithStatus{ + Txn: txn.SignedTxn, + ApplyData: txn.ApplyData, + } + response.LocalStateDelta, response.GlobalStateDelta = convertToDeltas(withStatus) + response.Logs = convertLogs(withStatus) + response.Inners = convertInners(&withStatus) return response } diff --git a/daemon/algod/api/spec/common/model.go b/daemon/algod/api/spec/common/model.go index ec9bc66978..66741a65b6 100644 --- a/daemon/algod/api/spec/common/model.go +++ b/daemon/algod/api/spec/common/model.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/algod/api/spec/v1/model.go b/daemon/algod/api/spec/v1/model.go index b7dabab645..96fc0ee05a 100644 --- a/daemon/algod/api/spec/v1/model.go +++ b/daemon/algod/api/spec/v1/model.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/algod/deadlockLogger.go b/daemon/algod/deadlockLogger.go index ed51395920..8ae3cfe021 100644 --- a/daemon/algod/deadlockLogger.go +++ b/daemon/algod/deadlockLogger.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/algod/deadlock_test.go b/daemon/algod/deadlock_test.go index 1df1594e09..b3a7b24de6 100644 --- a/daemon/algod/deadlock_test.go +++ b/daemon/algod/deadlock_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/algod/server.go b/daemon/algod/server.go index 1eedac466b..a3875f05e9 100644 --- a/daemon/algod/server.go +++ b/daemon/algod/server.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -18,6 +18,7 @@ package algod import ( "context" + "errors" "fmt" "io/ioutil" "net" @@ -35,10 +36,13 @@ import ( "github.com/algorand/go-algorand/config" apiServer "github.com/algorand/go-algorand/daemon/algod/api/server" "github.com/algorand/go-algorand/daemon/algod/api/server/lib" + "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/bookkeeping" "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/logging/telemetryspec" + "github.com/algorand/go-algorand/network/limitlistener" "github.com/algorand/go-algorand/node" + "github.com/algorand/go-algorand/util" "github.com/algorand/go-algorand/util/metrics" "github.com/algorand/go-algorand/util/tokens" ) @@ -84,6 +88,34 @@ func (s *Server) Initialize(cfg config.Local, phonebookAddresses []string, genes s.log.SetLevel(logging.Level(cfg.BaseLoggerDebugLevel)) setupDeadlockLogger() + // Check some config parameters. + if cfg.RestConnectionsSoftLimit > cfg.RestConnectionsHardLimit { + s.log.Warnf( + "RestConnectionsSoftLimit %d exceeds RestConnectionsHardLimit %d", + cfg.RestConnectionsSoftLimit, cfg.RestConnectionsHardLimit) + cfg.RestConnectionsSoftLimit = cfg.RestConnectionsHardLimit + } + if cfg.IncomingConnectionsLimit < 0 { + return fmt.Errorf( + "Initialize() IncomingConnectionsLimit %d must be non-negative", + cfg.IncomingConnectionsLimit) + } + + // Set large enough soft file descriptors limit. + var ot basics.OverflowTracker + fdRequired := ot.Add( + cfg.ReservedFDs, + ot.Add(uint64(cfg.IncomingConnectionsLimit), cfg.RestConnectionsHardLimit)) + if ot.Overflowed { + return errors.New( + "Initialize() overflowed when adding up ReservedFDs, IncomingConnectionsLimit " + + "RestConnectionsHardLimit; decrease them") + } + err = util.SetFdSoftLimit(fdRequired) + if err != nil { + return fmt.Errorf("Initialize() err: %w", err) + } + // configure the deadlock detector library switch { case cfg.DeadlockDetection > 0: @@ -98,6 +130,9 @@ func (s *Server) Initialize(cfg config.Local, phonebookAddresses []string, genes // Default setting - host app should configure this // If host doesn't, the default is Disable = false (so, enabled) } + if !deadlock.Opts.Disable { + deadlock.Opts.DeadlockTimeout = time.Second * time.Duration(cfg.DeadlockDetectionThreshold) + } // if we have the telemetry enabled, we want to use it's sessionid as part of the // collected metrics decorations. @@ -189,11 +224,12 @@ func (s *Server) Start() { } listener, err := makeListener(addr) - if err != nil { fmt.Printf("Could not start node: %v\n", err) os.Exit(1) } + listener = limitlistener.RejectingLimitListener( + listener, cfg.RestConnectionsHardLimit, s.log) addr = listener.Addr().String() server = http.Server{ @@ -202,9 +238,9 @@ func (s *Server) Start() { WriteTimeout: time.Duration(cfg.RestWriteTimeoutSeconds) * time.Second, } - tcpListener := listener.(*net.TCPListener) - - e := apiServer.NewRouter(s.log, s.node, s.stopping, apiToken, adminAPIToken, tcpListener) + e := apiServer.NewRouter( + s.log, s.node, s.stopping, apiToken, adminAPIToken, listener, + cfg.RestConnectionsSoftLimit) // Set up files for our PID and our listening address // before beginning to listen to prevent 'goal node start' diff --git a/daemon/algod/server_test.go b/daemon/algod/server_test.go index d4a6a26eea..145a6e9b66 100644 --- a/daemon/algod/server_test.go +++ b/daemon/algod/server_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/api/api.go b/daemon/kmd/api/api.go index d72521e81f..182eb19c3e 100644 --- a/daemon/kmd/api/api.go +++ b/daemon/kmd/api/api.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/api/cors.go b/daemon/kmd/api/cors.go index 4a77e5333c..89f9bcd89e 100644 --- a/daemon/kmd/api/cors.go +++ b/daemon/kmd/api/cors.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/api/v1/auth.go b/daemon/kmd/api/v1/auth.go index bc7dda1ef0..35e73aadba 100644 --- a/daemon/kmd/api/v1/auth.go +++ b/daemon/kmd/api/v1/auth.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/api/v1/errors.go b/daemon/kmd/api/v1/errors.go index f6855ed58c..9193ea291c 100644 --- a/daemon/kmd/api/v1/errors.go +++ b/daemon/kmd/api/v1/errors.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/api/v1/handlers.go b/daemon/kmd/api/v1/handlers.go index a076ca18f6..199f1443da 100644 --- a/daemon/kmd/api/v1/handlers.go +++ b/daemon/kmd/api/v1/handlers.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/client/client.go b/daemon/kmd/client/client.go index 551884c97e..ee0c5f1317 100644 --- a/daemon/kmd/client/client.go +++ b/daemon/kmd/client/client.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/client/requests.go b/daemon/kmd/client/requests.go index 01a9313314..78da5b4c59 100644 --- a/daemon/kmd/client/requests.go +++ b/daemon/kmd/client/requests.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/client/wrappers.go b/daemon/kmd/client/wrappers.go index c63d7d9a94..f3392850c6 100644 --- a/daemon/kmd/client/wrappers.go +++ b/daemon/kmd/client/wrappers.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/config/config.go b/daemon/kmd/config/config.go index 39827f2c74..9b932d2162 100644 --- a/daemon/kmd/config/config.go +++ b/daemon/kmd/config/config.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/config/errors.go b/daemon/kmd/config/errors.go index 967b348b99..75800791b5 100644 --- a/daemon/kmd/config/errors.go +++ b/daemon/kmd/config/errors.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/kmd.go b/daemon/kmd/kmd.go index a724788550..b46fb6beb7 100644 --- a/daemon/kmd/kmd.go +++ b/daemon/kmd/kmd.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/lib/kmdapi/common.go b/daemon/kmd/lib/kmdapi/common.go index 533a60646d..58aa755c0d 100644 --- a/daemon/kmd/lib/kmdapi/common.go +++ b/daemon/kmd/lib/kmdapi/common.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/lib/kmdapi/requests.go b/daemon/kmd/lib/kmdapi/requests.go index c9a3f94ecc..860d3c4f57 100644 --- a/daemon/kmd/lib/kmdapi/requests.go +++ b/daemon/kmd/lib/kmdapi/requests.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/lib/kmdapi/responses.go b/daemon/kmd/lib/kmdapi/responses.go index 464bc7dde6..f404e843ef 100644 --- a/daemon/kmd/lib/kmdapi/responses.go +++ b/daemon/kmd/lib/kmdapi/responses.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/server/errors.go b/daemon/kmd/server/errors.go index baebe831a8..86396e4891 100644 --- a/daemon/kmd/server/errors.go +++ b/daemon/kmd/server/errors.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/server/server.go b/daemon/kmd/server/server.go index 4ce8e2257b..973df186b3 100644 --- a/daemon/kmd/server/server.go +++ b/daemon/kmd/server/server.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/session/auth.go b/daemon/kmd/session/auth.go index 3b7cae8716..3ea9d990ff 100644 --- a/daemon/kmd/session/auth.go +++ b/daemon/kmd/session/auth.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/session/session.go b/daemon/kmd/session/session.go index 291e904860..f1a8b0a52d 100644 --- a/daemon/kmd/session/session.go +++ b/daemon/kmd/session/session.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/wallet/driver/driver.go b/daemon/kmd/wallet/driver/driver.go index d084dd8552..f549d128d8 100644 --- a/daemon/kmd/wallet/driver/driver.go +++ b/daemon/kmd/wallet/driver/driver.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/wallet/driver/ledger.go b/daemon/kmd/wallet/driver/ledger.go index 7affe3a5c9..36029d370b 100644 --- a/daemon/kmd/wallet/driver/ledger.go +++ b/daemon/kmd/wallet/driver/ledger.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/wallet/driver/ledger_errors.go b/daemon/kmd/wallet/driver/ledger_errors.go index 53dff311cc..420859c833 100644 --- a/daemon/kmd/wallet/driver/ledger_errors.go +++ b/daemon/kmd/wallet/driver/ledger_errors.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/wallet/driver/ledger_hid.go b/daemon/kmd/wallet/driver/ledger_hid.go index 8094df50bb..32e3d83215 100644 --- a/daemon/kmd/wallet/driver/ledger_hid.go +++ b/daemon/kmd/wallet/driver/ledger_hid.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/wallet/driver/sqlite.go b/daemon/kmd/wallet/driver/sqlite.go index 960c65374c..eb78f4a77b 100644 --- a/daemon/kmd/wallet/driver/sqlite.go +++ b/daemon/kmd/wallet/driver/sqlite.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/wallet/driver/sqlite_crypto.go b/daemon/kmd/wallet/driver/sqlite_crypto.go index 4f5f5e004b..5cca480c90 100644 --- a/daemon/kmd/wallet/driver/sqlite_crypto.go +++ b/daemon/kmd/wallet/driver/sqlite_crypto.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/wallet/driver/sqlite_errors.go b/daemon/kmd/wallet/driver/sqlite_errors.go index 570c0b5737..bcfb00fda4 100644 --- a/daemon/kmd/wallet/driver/sqlite_errors.go +++ b/daemon/kmd/wallet/driver/sqlite_errors.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/wallet/driver/util.go b/daemon/kmd/wallet/driver/util.go index 1e501ce31b..2701242e32 100644 --- a/daemon/kmd/wallet/driver/util.go +++ b/daemon/kmd/wallet/driver/util.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/daemon/kmd/wallet/wallet.go b/daemon/kmd/wallet/wallet.go index 24c60066c7..d83770f5dd 100644 --- a/daemon/kmd/wallet/wallet.go +++ b/daemon/kmd/wallet/wallet.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/abi/abi_encode.go b/data/abi/abi_encode.go index 397e66856f..ac25588f08 100644 --- a/data/abi/abi_encode.go +++ b/data/abi/abi_encode.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -18,12 +18,30 @@ package abi import ( "encoding/binary" + "encoding/json" "fmt" "math/big" "reflect" "strings" ) +// bigIntToBytes casts non-negative big integer to byte slice with specific byte length +// DEPRECATED: THIS IS A WORKAROUND FOR `fillBytes` METHOD BEFORE GOLANG 1.15+ +// SHOULD BE REMOVED AFTER WE MOVE TO HIGHER VERSION +func bigIntToBytes(x *big.Int, byteLen uint) ([]byte, error) { + if x.Cmp(big.NewInt(0)) < 0 { + return nil, fmt.Errorf("ABI: big Int To Bytes error: should pass in non-negative integer") + } + if uint(x.BitLen()) > byteLen*8 { + return nil, fmt.Errorf("ABI: big Int To Bytes error: integer byte length > given byte length") + } + + buffer := make([]byte, byteLen) + intBytes := x.Bytes() + copy(buffer[int(byteLen)-len(intBytes):], intBytes) + return buffer, nil +} + // typeCastToTuple cast an array-like ABI type into an ABI tuple type. func (t Type) typeCastToTuple(tupLen ...int) (Type, error) { var childT []Type @@ -169,14 +187,15 @@ func encodeInt(intValue interface{}, bitSize uint16) ([]byte, error) { return nil, fmt.Errorf("passed in numeric value should be non negative") } - bytes := bigInt.Bytes() - if len(bytes) > int(bitSize/8) { - return nil, fmt.Errorf("input value bit size %d > abi type bit size %d", len(bytes)*8, bitSize) + if bigInt.Cmp(new(big.Int).Lsh(big.NewInt(1), uint(bitSize))) >= 0 { + return nil, fmt.Errorf("input value bit size %d > abi type bit size %d", bigInt.BitLen(), bitSize) } - zeroPadding := make([]byte, bitSize/8-uint16(len(bytes))) - buffer := append(zeroPadding, bytes...) - return buffer, nil + castedBytes, err := bigIntToBytes(bigInt, uint(bitSize/8)) + if err != nil { + return nil, err + } + return castedBytes, nil } // inferToSlice infers an interface element to a slice of interface{}, returns error if it cannot infer successfully @@ -200,7 +219,7 @@ func inferToSlice(value interface{}) ([]interface{}, error) { // encodeTuple encodes slice-of-interface of golang values to bytes, following ABI encoding rules func encodeTuple(value interface{}, childT []Type) ([]byte, error) { - if len(childT) >= (1 << 16) { + if len(childT) >= abiEncodingLengthLimit { return nil, fmt.Errorf("abi child type number exceeds uint16 maximum") } values, err := inferToSlice(value) @@ -276,7 +295,7 @@ func encodeTuple(value interface{}, childT []Type) ([]byte, error) { if isDynamicIndex[i] { // calculate where the index of dynamic value encoding byte start headValue := headLength + tailCurrLength - if headValue >= (1 << 16) { + if headValue >= abiEncodingLengthLimit { return nil, fmt.Errorf("cannot encode abi tuple: encode length exceeds uint16 maximum") } binary.BigEndian.PutUint16(heads[i], uint16(headValue)) @@ -478,6 +497,16 @@ func decodeTuple(encoded []byte, childT []Type) ([]interface{}, error) { return values, nil } +// maxAppArgs is the maximum number of arguments for an application call transaction, in compliance +// with ARC-4. Currently this is the same as the MaxAppArgs consensus parameter, but the +// difference is that the consensus parameter is liable to change in a future consensus upgrade. +// However, the ARC-4 ABI argument encoding **MUST** always remain the same. +const maxAppArgs = 16 + +// The tuple threshold is maxAppArgs, minus 1 for the method selector in the first app arg, +// minus 1 for the final app argument becoming a tuple of the remaining method args +const methodArgsTupleThreshold = maxAppArgs - 2 + // ParseArgJSONtoByteSlice convert input method arguments to ABI encoded bytes // it converts funcArgTypes into a tuple type and apply changes over input argument string (in JSON format) // if there are greater or equal to 15 inputs, then we compact the tailing inputs into one tuple @@ -495,16 +524,32 @@ func ParseArgJSONtoByteSlice(argTypes []string, jsonArgs []string, applicationAr return fmt.Errorf("input argument number %d != method argument number %d", len(jsonArgs), len(abiTypes)) } - // change the input args to be 1 - 14 + 15 (compacting everything together) - if len(jsonArgs) > 14 { - compactedType, err := MakeTupleType(abiTypes[14:]) + // Up to 16 app arguments can be passed to app call. First is reserved for method selector, + // and the rest are for method call arguments. But if more than 15 method call arguments + // are present, then the method arguments after the 14th are placed in a tuple in the last + // app argument slot + if len(abiTypes) > maxAppArgs-1 { + typesForTuple := make([]Type, len(abiTypes)-methodArgsTupleThreshold) + copy(typesForTuple, abiTypes[methodArgsTupleThreshold:]) + + compactedType, err := MakeTupleType(typesForTuple) + if err != nil { + return err + } + + abiTypes = append(abiTypes[:methodArgsTupleThreshold], compactedType) + + tupleValues := make([]json.RawMessage, len(jsonArgs)-methodArgsTupleThreshold) + for i, jsonArg := range jsonArgs[methodArgsTupleThreshold:] { + tupleValues[i] = []byte(jsonArg) + } + + remainingJSON, err := json.Marshal(tupleValues) if err != nil { return err } - abiTypes = append(abiTypes[:14], compactedType) - remainingJSON := "[" + strings.Join(jsonArgs[14:], ",") + "]" - jsonArgs = append(jsonArgs[:14], remainingJSON) + jsonArgs = append(jsonArgs[:methodArgsTupleThreshold], string(remainingJSON)) } // parse JSON value to ABI encoded bytes @@ -523,7 +568,7 @@ func ParseArgJSONtoByteSlice(argTypes []string, jsonArgs []string, applicationAr } // ParseMethodSignature parses a method of format `method(argType1,argType2,...)retType` -// into `method` {`argType1`,`argType2`,..} and `retType` +// into `method` {`argType1`,`argType2`,...} and `retType` func ParseMethodSignature(methodSig string) (name string, argTypes []string, returnType string, err error) { argsStart := strings.Index(methodSig, "(") if argsStart == -1 { @@ -534,10 +579,9 @@ func ParseMethodSignature(methodSig string) (name string, argTypes []string, ret argsEnd := -1 depth := 0 for index, char := range methodSig { - switch char { - case '(': + if char == '(' { depth++ - case ')': + } else if char == ')' { if depth == 0 { err = fmt.Errorf("Unpaired parenthesis in method signature: %s", methodSig) return diff --git a/data/abi/abi_encode_test.go b/data/abi/abi_encode_test.go index c585564c61..620013c238 100644 --- a/data/abi/abi_encode_test.go +++ b/data/abi/abi_encode_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -19,6 +19,7 @@ package abi import ( "crypto/rand" "encoding/binary" + "fmt" "math/big" "testing" @@ -27,23 +28,63 @@ import ( "github.com/stretchr/testify/require" ) +const ( + uintStepLength = 8 + uintBegin = 8 + uintEnd = 512 + uintRandomTestPoints = 1000 + uintTestCaseCount = 200 + ufixedPrecision = 160 + ufixedRandomTestPoints = 20 + tupleMaxLength = 10 + byteTestCaseCount = 1 << 8 + boolTestCaseCount = 2 + addressTestCaseCount = 300 + stringTestCaseCount = 10 + stringTestCaseSpecLenCount = 5 + takeNum = 10 + tupleTestCaseCount = 100 +) + +/* + The set of parameters ensure that the error of byte length >= 2^16 is eliminated. + + i. Consider uint512[] with length 10, the ABI encoding length is: 64 x 10 + 2 + (2 is introduced from dynamic array length encoding) + The motivation here is that, forall ABI type that is non-array/non-tuple like, + uint512 gives the longest byte length in ABI encoding + (utf-8 string's byte length is at most 42, address byte length is at most 32) + + ii. Consider a tuple of length 10, with all elements uint512[] of length 10. + The ABI encoding length is: 10 x 2 + 10 x 642 == 6440 + (2 is for tuple index to keep track of dynamic type encoding) + + iii. Consider a tuple of length 10, with all elements of tuples mentioned in (ii). + The ABI encoding length is: 10 x 2 + 10 x 6440 == 64420 + This is the end of the generation of nested-tuple test case, + no more layers of random tuples will be produced. + + This gives an upper bound for the produced ABI encoding byte length in this test script, + and noticing that length 64420 mentioned in (iii) is less than 2^16 == 65536. + Assuming that ABI implementation is correct, then the flaky test should not happen again. +*/ + func TestEncodeValid(t *testing.T) { partitiontest.PartitionTest(t) // encoding test for uint type, iterating through all uint sizes // randomly pick 1000 valid uint values and check if encoded value match with expected - for intSize := 8; intSize <= 512; intSize += 8 { - upperLimit := big.NewInt(0).Lsh(big.NewInt(1), uint(intSize)) + for intSize := uintBegin; intSize <= uintEnd; intSize += uintStepLength { + upperLimit := new(big.Int).Lsh(big.NewInt(1), uint(intSize)) uintType, err := makeUintType(intSize) require.NoError(t, err, "make uint type fail") - for i := 0; i < 1000; i++ { + for i := 0; i < uintRandomTestPoints; i++ { randomInt, err := rand.Int(rand.Reader, upperLimit) require.NoError(t, err, "cryptographic random int init fail") - randomIntByte := randomInt.Bytes() - expected := make([]byte, intSize/8-len(randomIntByte)) - expected = append(expected, randomIntByte...) + expected, err := bigIntToBytes(randomInt, uint(intSize/8)) + require.NoError(t, err, "big int to byte conversion error") uintEncode, err := uintType.Encode(randomInt) require.NoError(t, err, "encoding from uint type fail") @@ -52,9 +93,9 @@ func TestEncodeValid(t *testing.T) { } // 2^[bitSize] - 1 test // check if uint can contain max uint value (2^bitSize - 1) - largest := big.NewInt(0).Add( + largest := new(big.Int).Add( upperLimit, - big.NewInt(1).Neg(big.NewInt(1)), + new(big.Int).Neg(big.NewInt(1)), ) encoded, err := uintType.Encode(largest) require.NoError(t, err, "largest uint encode error") @@ -64,27 +105,27 @@ func TestEncodeValid(t *testing.T) { // encoding test for ufixed, iterating through all the valid ufixed bitSize and precision // randomly generate 10 big int values for ufixed numerator and check if encoded value match with expected // also check if ufixed can fit max numerator (2^bitSize - 1) under specific byte bitSize - for size := 8; size <= 512; size += 8 { - upperLimit := big.NewInt(0).Lsh(big.NewInt(1), uint(size)) + for size := uintBegin; size <= uintEnd; size += uintStepLength { + upperLimit := new(big.Int).Lsh(big.NewInt(1), uint(size)) largest := big.NewInt(0).Add( upperLimit, - big.NewInt(1).Neg(big.NewInt(1)), + new(big.Int).Neg(big.NewInt(1)), ) - for precision := 1; precision <= 160; precision++ { + for precision := 1; precision <= ufixedPrecision; precision++ { typeUfixed, err := makeUfixedType(size, precision) require.NoError(t, err, "make ufixed type fail") - for i := 0; i < 10; i++ { + for i := 0; i < ufixedRandomTestPoints; i++ { randomInt, err := rand.Int(rand.Reader, upperLimit) require.NoError(t, err, "cryptographic random int init fail") encodedUfixed, err := typeUfixed.Encode(randomInt) require.NoError(t, err, "ufixed encode fail") - randomBytes := randomInt.Bytes() - buffer := make([]byte, size/8-len(randomBytes)) - buffer = append(buffer, randomBytes...) - require.Equal(t, buffer, encodedUfixed, "encode ufixed not match with expected") + expected, err := bigIntToBytes(randomInt, uint(size/8)) + require.NoError(t, err, "big int to byte conversion error") + + require.Equal(t, expected, encodedUfixed, "encode ufixed not match with expected") } // (2^[bitSize] - 1) / (10^[precision]) test ufixedLargestEncode, err := typeUfixed.Encode(largest) @@ -96,14 +137,13 @@ func TestEncodeValid(t *testing.T) { // encoding test for address, since address is 32 byte, it can be considered as 256 bit uint // randomly generate 1000 uint256 and make address values, check if encoded value match with expected - upperLimit := big.NewInt(0).Lsh(big.NewInt(1), 256) - for i := 0; i < 1000; i++ { + upperLimit := new(big.Int).Lsh(big.NewInt(1), addressByteSize<<3) + for i := 0; i < uintRandomTestPoints; i++ { randomAddrInt, err := rand.Int(rand.Reader, upperLimit) require.NoError(t, err, "cryptographic random int init fail") - rand256Bytes := randomAddrInt.Bytes() - addrBytesExpected := make([]byte, 32-len(rand256Bytes)) - addrBytesExpected = append(addrBytesExpected, rand256Bytes...) + addrBytesExpected, err := bigIntToBytes(randomAddrInt, uint(addressByteSize)) + require.NoError(t, err, "big int to byte conversion error") addrBytesActual, err := addressType.Encode(addrBytesExpected) require.NoError(t, err, "address encode fail") @@ -111,7 +151,7 @@ func TestEncodeValid(t *testing.T) { } // encoding test for bool values - for i := 0; i < 2; i++ { + for i := 0; i < boolTestCaseCount; i++ { boolEncode, err := boolType.Encode(i == 1) require.NoError(t, err, "bool encode fail") expected := []byte{0x00} @@ -122,7 +162,7 @@ func TestEncodeValid(t *testing.T) { } // encoding test for byte values - for i := 0; i < (1 << 8); i++ { + for i := 0; i < byteTestCaseCount; i++ { byteEncode, err := byteType.Encode(byte(i)) require.NoError(t, err, "byte encode fail") expected := []byte{byte(i)} @@ -133,8 +173,8 @@ func TestEncodeValid(t *testing.T) { // we use `gobberish` to generate random utf-8 symbols // randomly generate utf-8 str from length 1 to 100, each length draw 10 random strs // check if encoded ABI str match with expected value - for length := 1; length <= 100; length++ { - for i := 0; i < 10; i++ { + for length := 1; length <= stringTestCaseCount; length++ { + for i := 0; i < stringTestCaseSpecLenCount; i++ { // generate utf8 strings from `gobberish` at some length utf8Str := gobberish.GenerateString(length) // since string is just type alias of `byte[]`, we need to store number of bytes in encoding @@ -308,11 +348,11 @@ func TestDecodeValid(t *testing.T) { // decoding test for uint, iterating through all valid uint bitSize // randomly take 1000 tests on each valid bitSize // generate bytes from random uint values and decode bytes with additional type information - for intSize := 8; intSize <= 512; intSize += 8 { - upperLimit := big.NewInt(0).Lsh(big.NewInt(1), uint(intSize)) + for intSize := uintBegin; intSize <= uintEnd; intSize += uintStepLength { + upperLimit := new(big.Int).Lsh(big.NewInt(1), uint(intSize)) uintType, err := makeUintType(intSize) require.NoError(t, err, "make uint type failure") - for i := 0; i < 1000; i++ { + for i := 0; i < uintRandomTestPoints; i++ { randBig, err := rand.Int(rand.Reader, upperLimit) require.NoError(t, err, "cryptographic random int init fail") @@ -341,12 +381,12 @@ func TestDecodeValid(t *testing.T) { // decoding test for ufixed, iterating through all valid ufixed bitSize and precision // randomly take 10 tests on each valid setting // generate ufixed bytes and try to decode back with additional type information - for size := 8; size <= 512; size += 8 { + for size := uintBegin; size <= uintEnd; size += uintStepLength { upperLimit := big.NewInt(0).Lsh(big.NewInt(1), uint(size)) - for precision := 1; precision <= 160; precision++ { + for precision := 1; precision <= ufixedPrecision; precision++ { ufixedType, err := makeUfixedType(size, precision) require.NoError(t, err, "make ufixed type failure") - for i := 0; i < 10; i++ { + for i := 0; i < ufixedRandomTestPoints; i++ { randBig, err := rand.Int(rand.Reader, upperLimit) require.NoError(t, err, "cryptographic random int init fail") @@ -374,17 +414,16 @@ func TestDecodeValid(t *testing.T) { } } - // decoding test for address, randomly take 1000 tests + // decoding test for address, randomly take 300 tests // address is type alias of byte[32], we generate address value with random 256 bit big int values // we make the expected address value and decode the encoding of expected, check if they match - upperLimit := big.NewInt(0).Lsh(big.NewInt(1), 256) - for i := 0; i < 1000; i++ { + upperLimit := new(big.Int).Lsh(big.NewInt(1), addressByteSize<<3) + for i := 0; i < addressTestCaseCount; i++ { randomAddrInt, err := rand.Int(rand.Reader, upperLimit) require.NoError(t, err, "cryptographic random int init fail") - addressBytes := randomAddrInt.Bytes() - expected := make([]byte, 32-len(addressBytes)) - expected = append(expected, addressBytes...) + expected, err := bigIntToBytes(randomAddrInt, uint(addressByteSize)) + require.NoError(t, err, "big int to byte conversion error") actual, err := addressType.Decode(expected) require.NoError(t, err, "decoding address should not return error") @@ -401,7 +440,7 @@ func TestDecodeValid(t *testing.T) { } // byte value decoding test, iterating through 256 valid byte value - for i := 0; i < (1 << 8); i++ { + for i := 0; i < byteTestCaseCount; i++ { byteEncode, err := byteType.Encode(byte(i)) require.NoError(t, err, "byte encode fail") actual, err := byteType.Decode(byteEncode) @@ -409,11 +448,11 @@ func TestDecodeValid(t *testing.T) { require.Equal(t, byte(i), actual, "decode byte not match with expected") } - // string value decoding test, test from utf string length 1 to 100 - // randomly take 10 utf-8 strings to make ABI string values + // string value decoding test, test from utf string length 1 to 10 + // randomly take 5 utf-8 strings to make ABI string values // decode the encoded expected value and check if they match - for length := 1; length <= 100; length++ { - for i := 0; i < 10; i++ { + for length := 1; length <= stringTestCaseCount; length++ { + for i := 0; i < stringTestCaseSpecLenCount; i++ { expected := gobberish.GenerateString(length) strEncode, err := stringType.Encode(expected) require.NoError(t, err, "string encode fail") @@ -828,35 +867,48 @@ type testUnit struct { func categorySelfRoundTripTest(t *testing.T, category []testUnit) { for _, testObj := range category { abiType, err := TypeOf(testObj.serializedType) - require.NoError(t, err, "failure to deserialize type") + require.NoError(t, err, "failure to deserialize type: "+testObj.serializedType) encodedValue, err := abiType.Encode(testObj.value) - require.NoError(t, err, "failure to encode value") + require.NoError(t, err, + "failure to encode value %#v over type %s", testObj.value, testObj.serializedType, + ) actual, err := abiType.Decode(encodedValue) - require.NoError(t, err, "failure to decode value") - require.Equal(t, testObj.value, actual, "decoded value not equal to expected") + require.NoError(t, err, + "failure to decode value %#v for type %s", encodedValue, testObj.serializedType, + ) + require.Equal(t, testObj.value, actual, + "decoded value %#v not equal to expected value %#v", actual, testObj.value, + ) jsonEncodedValue, err := abiType.MarshalToJSON(testObj.value) - require.NoError(t, err, "failure to encode value to JSON type") + require.NoError(t, err, + "failure to encode value %#v to JSON type", testObj.value, + ) jsonActual, err := abiType.UnmarshalFromJSON(jsonEncodedValue) - require.NoError(t, err, "failure to decode JSON value back") - require.Equal(t, testObj.value, jsonActual, "decode JSON value not equal to expected") + require.NoError(t, err, + "failure to decode JSON value %s back for type %s", + string(jsonEncodedValue), testObj.serializedType, + ) + require.Equal(t, testObj.value, jsonActual, + "decode JSON value %s not equal to expected %s", jsonActual, testObj.value, + ) } } func addPrimitiveRandomValues(t *testing.T, pool *map[BaseType][]testUnit) { - (*pool)[Uint] = make([]testUnit, 200*64) - (*pool)[Ufixed] = make([]testUnit, 160*64) + (*pool)[Uint] = make([]testUnit, uintTestCaseCount*uintEnd/uintStepLength) + (*pool)[Ufixed] = make([]testUnit, ufixedPrecision*uintEnd/uintStepLength) uintIndex := 0 ufixedIndex := 0 - for bitSize := 8; bitSize <= 512; bitSize += 8 { + for bitSize := uintBegin; bitSize <= uintEnd; bitSize += uintStepLength { max := new(big.Int).Lsh(big.NewInt(1), uint(bitSize)) uintT, err := makeUintType(bitSize) require.NoError(t, err, "make uint type failure") uintTstr := uintT.String() - for j := 0; j < 200; j++ { + for j := 0; j < uintTestCaseCount; j++ { randVal, err := rand.Int(rand.Reader, max) require.NoError(t, err, "generate random uint, should be no error") @@ -867,7 +919,7 @@ func addPrimitiveRandomValues(t *testing.T, pool *map[BaseType][]testUnit) { uintIndex++ } - for precision := 1; precision <= 160; precision++ { + for precision := 1; precision <= ufixedPrecision; precision++ { randVal, err := rand.Int(rand.Reader, max) require.NoError(t, err, "generate random ufixed, should be no error") @@ -884,33 +936,34 @@ func addPrimitiveRandomValues(t *testing.T, pool *map[BaseType][]testUnit) { categorySelfRoundTripTest(t, (*pool)[Uint]) categorySelfRoundTripTest(t, (*pool)[Ufixed]) - (*pool)[Byte] = make([]testUnit, 1<<8) - for i := 0; i < (1 << 8); i++ { + (*pool)[Byte] = make([]testUnit, byteTestCaseCount) + for i := 0; i < byteTestCaseCount; i++ { (*pool)[Byte][i] = testUnit{serializedType: byteType.String(), value: byte(i)} } categorySelfRoundTripTest(t, (*pool)[Byte]) - (*pool)[Bool] = make([]testUnit, 2) + (*pool)[Bool] = make([]testUnit, boolTestCaseCount) (*pool)[Bool][0] = testUnit{serializedType: boolType.String(), value: false} (*pool)[Bool][1] = testUnit{serializedType: boolType.String(), value: true} categorySelfRoundTripTest(t, (*pool)[Bool]) - maxAddress := new(big.Int).Lsh(big.NewInt(1), 256) - (*pool)[Address] = make([]testUnit, 300) - for i := 0; i < 300; i++ { + maxAddress := new(big.Int).Lsh(big.NewInt(1), addressByteSize<<3) + (*pool)[Address] = make([]testUnit, addressTestCaseCount) + for i := 0; i < addressTestCaseCount; i++ { randAddrVal, err := rand.Int(rand.Reader, maxAddress) require.NoError(t, err, "generate random value for address, should be no error") - addrBytes := randAddrVal.Bytes() - remainBytes := make([]byte, 32-len(addrBytes)) - addrBytes = append(remainBytes, addrBytes...) + + addrBytes, err := bigIntToBytes(randAddrVal, uint(addressByteSize)) + require.NoError(t, err, "big int to byte conversion error") + (*pool)[Address][i] = testUnit{serializedType: addressType.String(), value: addrBytes} } categorySelfRoundTripTest(t, (*pool)[Address]) - (*pool)[String] = make([]testUnit, 400) + (*pool)[String] = make([]testUnit, stringTestCaseCount*stringTestCaseSpecLenCount) stringIndex := 0 - for length := 1; length <= 100; length++ { - for i := 0; i < 4; i++ { + for length := 1; length <= stringTestCaseCount; length++ { + for i := 0; i < stringTestCaseSpecLenCount; i++ { (*pool)[String][stringIndex] = testUnit{ serializedType: stringType.String(), value: gobberish.GenerateString(length), @@ -945,21 +998,21 @@ func takeSomeFromCategoryAndGenerateArray( } func addArrayRandomValues(t *testing.T, pool *map[BaseType][]testUnit) { - for intIndex := 0; intIndex < len((*pool)[Uint]); intIndex += 200 { - takeSomeFromCategoryAndGenerateArray(t, Uint, intIndex, 20, pool) + for intIndex := 0; intIndex < len((*pool)[Uint]); intIndex += uintTestCaseCount { + takeSomeFromCategoryAndGenerateArray(t, Uint, intIndex, takeNum, pool) } - takeSomeFromCategoryAndGenerateArray(t, Byte, 0, 20, pool) - takeSomeFromCategoryAndGenerateArray(t, Address, 0, 20, pool) - takeSomeFromCategoryAndGenerateArray(t, String, 0, 20, pool) - takeSomeFromCategoryAndGenerateArray(t, Bool, 0, 20, pool) + takeSomeFromCategoryAndGenerateArray(t, Byte, 0, takeNum, pool) + takeSomeFromCategoryAndGenerateArray(t, Address, 0, takeNum, pool) + takeSomeFromCategoryAndGenerateArray(t, String, 0, takeNum, pool) + takeSomeFromCategoryAndGenerateArray(t, Bool, 0, takeNum, pool) categorySelfRoundTripTest(t, (*pool)[ArrayStatic]) categorySelfRoundTripTest(t, (*pool)[ArrayDynamic]) } func addTupleRandomValues(t *testing.T, slotRange BaseType, pool *map[BaseType][]testUnit) { - for i := 0; i < 100; i++ { - tupleLenBig, err := rand.Int(rand.Reader, big.NewInt(20)) + for i := 0; i < tupleTestCaseCount; i++ { + tupleLenBig, err := rand.Int(rand.Reader, big.NewInt(tupleMaxLength)) require.NoError(t, err, "generate random tuple length should not return error") tupleLen := tupleLenBig.Int64() + 1 testUnits := make([]testUnit, tupleLen) @@ -1001,3 +1054,173 @@ func TestRandomABIEncodeDecodeRoundTrip(t *testing.T) { addTupleRandomValues(t, Tuple, &testValuePool) categorySelfRoundTripTest(t, testValuePool[Tuple]) } + +func TestParseArgJSONtoByteSlice(t *testing.T) { + partitiontest.PartitionTest(t) + + makeRepeatSlice := func(size int, value string) []string { + slice := make([]string, size) + for i := range slice { + slice[i] = value + } + return slice + } + + tests := []struct { + argTypes []string + jsonArgs []string + expectedAppArgs [][]byte + }{ + { + argTypes: []string{}, + jsonArgs: []string{}, + expectedAppArgs: [][]byte{}, + }, + { + argTypes: []string{"uint8"}, + jsonArgs: []string{"100"}, + expectedAppArgs: [][]byte{{100}}, + }, + { + argTypes: []string{"uint8", "uint16"}, + jsonArgs: []string{"100", "65535"}, + expectedAppArgs: [][]byte{{100}, {255, 255}}, + }, + { + argTypes: makeRepeatSlice(15, "string"), + jsonArgs: []string{ + `"a"`, + `"b"`, + `"c"`, + `"d"`, + `"e"`, + `"f"`, + `"g"`, + `"h"`, + `"i"`, + `"j"`, + `"k"`, + `"l"`, + `"m"`, + `"n"`, + `"o"`, + }, + expectedAppArgs: [][]byte{ + {00, 01, 97}, + {00, 01, 98}, + {00, 01, 99}, + {00, 01, 100}, + {00, 01, 101}, + {00, 01, 102}, + {00, 01, 103}, + {00, 01, 104}, + {00, 01, 105}, + {00, 01, 106}, + {00, 01, 107}, + {00, 01, 108}, + {00, 01, 109}, + {00, 01, 110}, + {00, 01, 111}, + }, + }, + { + argTypes: makeRepeatSlice(16, "string"), + jsonArgs: []string{ + `"a"`, + `"b"`, + `"c"`, + `"d"`, + `"e"`, + `"f"`, + `"g"`, + `"h"`, + `"i"`, + `"j"`, + `"k"`, + `"l"`, + `"m"`, + `"n"`, + `"o"`, + `"p"`, + }, + expectedAppArgs: [][]byte{ + {00, 01, 97}, + {00, 01, 98}, + {00, 01, 99}, + {00, 01, 100}, + {00, 01, 101}, + {00, 01, 102}, + {00, 01, 103}, + {00, 01, 104}, + {00, 01, 105}, + {00, 01, 106}, + {00, 01, 107}, + {00, 01, 108}, + {00, 01, 109}, + {00, 01, 110}, + {00, 04, 00, 07, 00, 01, 111, 00, 01, 112}, + }, + }, + } + + for i, test := range tests { + t.Run(fmt.Sprintf("index=%d", i), func(t *testing.T) { + applicationArgs := make([][]byte, 0) + err := ParseArgJSONtoByteSlice(test.argTypes, test.jsonArgs, &applicationArgs) + require.NoError(t, err) + require.Equal(t, test.expectedAppArgs, applicationArgs) + }) + } +} + +func TestParseMethodSignature(t *testing.T) { + partitiontest.PartitionTest(t) + + tests := []struct { + signature string + name string + argTypes []string + returnType string + }{ + { + signature: "add(uint8,uint16,pay,account,txn)uint32", + name: "add", + argTypes: []string{"uint8", "uint16", "pay", "account", "txn"}, + returnType: "uint32", + }, + { + signature: "nothing()void", + name: "nothing", + argTypes: []string{}, + returnType: "void", + }, + { + signature: "tupleArgs((uint8,uint128),account,(string,(bool,bool)))bool", + name: "tupleArgs", + argTypes: []string{"(uint8,uint128)", "account", "(string,(bool,bool))"}, + returnType: "bool", + }, + { + signature: "tupleReturn(uint64)(bool,bool,bool)", + name: "tupleReturn", + argTypes: []string{"uint64"}, + returnType: "(bool,bool,bool)", + }, + { + signature: "tupleArgsAndReturn((uint8,uint128),account,(string,(bool,bool)))(bool,bool,bool)", + name: "tupleArgsAndReturn", + argTypes: []string{"(uint8,uint128)", "account", "(string,(bool,bool))"}, + returnType: "(bool,bool,bool)", + }, + } + + for _, test := range tests { + t.Run(test.signature, func(t *testing.T) { + name, argTypes, returnType, err := ParseMethodSignature(test.signature) + require.NoError(t, err) + require.Equal(t, test.name, name) + require.Equal(t, test.argTypes, argTypes) + require.Equal(t, test.returnType, returnType) + }) + } +} diff --git a/data/abi/abi_json.go b/data/abi/abi_json.go index 482419e6b9..a71823f0ce 100644 --- a/data/abi/abi_json.go +++ b/data/abi/abi_json.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -18,12 +18,26 @@ package abi import ( "bytes" + "crypto/sha512" + "encoding/base32" "encoding/json" "fmt" - "github.com/algorand/go-algorand/data/basics" "math/big" ) +// NOTE: discussion about go-algorand-sdk +// https://github.com/algorand/go-algorand/pull/3375#issuecomment-1007536841 + +var base32Encoder = base32.StdEncoding.WithPadding(base32.NoPadding) + +func addressCheckSum(addressBytes []byte) ([]byte, error) { + if len(addressBytes) != addressByteSize { + return nil, fmt.Errorf("address bytes should be of length 32") + } + hashed := sha512.Sum512_256(addressBytes[:]) + return hashed[addressByteSize-checksumByteSize:], nil +} + func castBigIntToNearestPrimitive(num *big.Int, bitSize uint16) (interface{}, error) { if num.BitLen() > int(bitSize) { return nil, fmt.Errorf("cast big int to nearest primitive failure: %v >= 2^%d", num, bitSize) @@ -74,17 +88,24 @@ func (t Type) MarshalToJSON(value interface{}) ([]byte, error) { } return json.Marshal(byteValue) case Address: - var addressInternal basics.Address + var addressValueInternal []byte switch valueCasted := value.(type) { case []byte: - copy(addressInternal[:], valueCasted[:]) - return json.Marshal(addressInternal.String()) + if len(valueCasted) != addressByteSize { + return nil, fmt.Errorf("address byte slice length not equal to 32 byte") + } + addressValueInternal = valueCasted case [addressByteSize]byte: - addressInternal = valueCasted - return json.Marshal(addressInternal.String()) + copy(addressValueInternal[:], valueCasted[:]) default: return nil, fmt.Errorf("cannot infer to byte slice/array for marshal to JSON") } + checksum, err := addressCheckSum(addressValueInternal) + if err != nil { + return nil, err + } + addressValueInternal = append(addressValueInternal, checksum...) + return json.Marshal(base32Encoder.EncodeToString(addressValueInternal)) case ArrayStatic, ArrayDynamic: values, err := inferToSlice(value) if err != nil { @@ -175,13 +196,29 @@ func (t Type) UnmarshalFromJSON(jsonEncoded []byte) (interface{}, error) { case Address: var addrStr string if err := json.Unmarshal(jsonEncoded, &addrStr); err != nil { - return nil, fmt.Errorf("cannot cast JSON encoded to string: %v", err) + return nil, fmt.Errorf("cannot cast JSON encoded to address string: %v", err) } - addr, err := basics.UnmarshalChecksumAddress(addrStr) + decoded, err := base32Encoder.DecodeString(addrStr) if err != nil { - return nil, fmt.Errorf("cannot cast JSON encoded (%s) to address: %v", string(jsonEncoded), err) + return nil, + fmt.Errorf("cannot cast JSON encoded address string (%s) to address: %v", addrStr, err) + } + if len(decoded) != addressByteSize+checksumByteSize { + return nil, + fmt.Errorf( + "cannot cast JSON encoded address string (%s) to address: "+ + "decoded byte length should equal to 36 with address and checksum", + string(jsonEncoded), + ) + } + checksum, err := addressCheckSum(decoded[:addressByteSize]) + if err != nil { + return nil, err + } + if !bytes.Equal(checksum, decoded[addressByteSize:]) { + return nil, fmt.Errorf("cannot cast JSON encoded address string (%s) to address: decoded checksum unmatch", addrStr) } - return addr[:], nil + return decoded[:addressByteSize], nil case ArrayStatic, ArrayDynamic: if t.childTypes[0].abiTypeID == Byte && bytes.HasPrefix(jsonEncoded, []byte{'"'}) { var byteArr []byte diff --git a/data/abi/abi_json_test.go b/data/abi/abi_json_test.go index d65e3c10af..0c3a006e32 100644 --- a/data/abi/abi_json_test.go +++ b/data/abi/abi_json_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -17,12 +17,42 @@ package abi import ( + "crypto/rand" + "math/big" "testing" + "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/test/partitiontest" "github.com/stretchr/testify/require" ) +func TestRandomAddressEquality(t *testing.T) { + partitiontest.PartitionTest(t) + + upperLimit := new(big.Int).Lsh(big.NewInt(1), addressByteSize<<3) + var addrBasics basics.Address + var addrABI = make([]byte, addressByteSize) + + for testCaseIndex := 0; testCaseIndex < addressTestCaseCount; testCaseIndex++ { + randomAddrInt, err := rand.Int(rand.Reader, upperLimit) + require.NoError(t, err, "cryptographic random int init fail") + + expected, err := bigIntToBytes(randomAddrInt, uint(addressByteSize)) + require.NoError(t, err, "big int to byte conversion error") + + copy(addrABI[:], expected) + copy(addrBasics[:], expected) + + checkSumBasics := addrBasics.GetChecksum() + checkSumABI, err := addressCheckSum(addrABI) + require.NoError(t, err, "ABI compute checksum for address slice failed") + + require.Equal(t, checkSumBasics, checkSumABI, + "basics.Address computed checksum %v not equal to data.abi computed checksum %v", + ) + } +} + func TestJSONtoInterfaceValid(t *testing.T) { partitiontest.PartitionTest(t) var testCases = []struct { diff --git a/data/abi/abi_type.go b/data/abi/abi_type.go index 3535170277..f403916b29 100644 --- a/data/abi/abi_type.go +++ b/data/abi/abi_type.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -60,6 +60,15 @@ const ( Tuple ) +const ( + addressByteSize = 32 + checksumByteSize = 4 + singleByteSize = 1 + singleBoolSize = 1 + lengthEncodeByteSize = 2 + abiEncodingLengthLimit = 1 << 16 +) + // Type is the struct that stores information about an ABI value's type. type Type struct { abiTypeID BaseType @@ -405,13 +414,6 @@ func findBoolLR(typeList []Type, index int, delta int) int { return until } -const ( - addressByteSize = 32 - singleByteSize = 1 - singleBoolSize = 1 - lengthEncodeByteSize = 2 -) - // ByteLen method calculates the byte length of a static ABI type. func (t Type) ByteLen() (int, error) { switch t.abiTypeID { @@ -458,11 +460,34 @@ func (t Type) ByteLen() (int, error) { } } +// AnyTransactionType is the ABI argument type string for a nonspecific transaction argument +const AnyTransactionType = "txn" + // IsTransactionType checks if a type string represents a transaction type // argument, such as "txn", "pay", "keyreg", etc. func IsTransactionType(s string) bool { switch s { - case "txn", "pay", "keyreg", "acfg", "axfer", "afrz", "appl": + case AnyTransactionType, "pay", "keyreg", "acfg", "axfer", "afrz", "appl": + return true + default: + return false + } +} + +// AccountReferenceType is the ABI argument type string for account references +const AccountReferenceType = "account" + +// AssetReferenceType is the ABI argument type string for asset references +const AssetReferenceType = "asset" + +// ApplicationReferenceType is the ABI argument type string for application references +const ApplicationReferenceType = "application" + +// IsReferenceType checks if a type string represents a reference type argument, +// such as "account", "asset", or "application". +func IsReferenceType(s string) bool { + switch s { + case AccountReferenceType, AssetReferenceType, ApplicationReferenceType: return true default: return false diff --git a/data/abi/abi_type_test.go b/data/abi/abi_type_test.go index f96dfaf067..fb7c7e9025 100644 --- a/data/abi/abi_type_test.go +++ b/data/abi/abi_type_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/account/account.go b/data/account/account.go index f9cd269441..8e7bb53372 100644 --- a/data/account/account.go +++ b/data/account/account.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -23,6 +23,7 @@ import ( "fmt" "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/crypto/merklesignature" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/protocol" @@ -135,7 +136,7 @@ func (root Root) Address() basics.Address { // RestoreParticipation restores a Participation from a database // handle. func RestoreParticipation(store db.Accessor) (acc PersistedParticipation, err error) { - var rawParent, rawVRF, rawVoting []byte + var rawParent, rawVRF, rawVoting, rawStateProof []byte err = Migrate(store) if err != nil { @@ -153,8 +154,9 @@ func RestoreParticipation(store db.Accessor) (acc PersistedParticipation, err er logging.Base().Infof("RestoreParticipation: state not found (n = %v)", nrows) } - row = tx.QueryRow("select parent, vrf, voting, firstValid, lastValid, keyDilution from ParticipationAccount") - err = row.Scan(&rawParent, &rawVRF, &rawVoting, &acc.FirstValid, &acc.LastValid, &acc.KeyDilution) + row = tx.QueryRow("select parent, vrf, voting, firstValid, lastValid, keyDilution, stateProof from ParticipationAccount") + + err = row.Scan(&rawParent, &rawVRF, &rawVoting, &acc.FirstValid, &acc.LastValid, &acc.KeyDilution, &rawStateProof) if err != nil { return fmt.Errorf("RestoreParticipation: could not read account raw data: %v", err) } @@ -166,6 +168,8 @@ func RestoreParticipation(store db.Accessor) (acc PersistedParticipation, err er return PersistedParticipation{}, err } + acc.Store = store + acc.VRF = &crypto.VRFSecrets{} err = protocol.Decode(rawVRF, acc.VRF) if err != nil { @@ -178,6 +182,33 @@ func RestoreParticipation(store db.Accessor) (acc PersistedParticipation, err er return PersistedParticipation{}, err } - acc.Store = store + if len(rawStateProof) == 0 { + return acc, nil + } + acc.StateProofSecrets = &merklesignature.Secrets{} + // only the state proof data is decoded here (the keys are stored in a different DB table and are fetched separately) + if err = protocol.Decode(rawStateProof, acc.StateProofSecrets); err != nil { + return PersistedParticipation{}, err + } + return acc, nil } + +// RestoreParticipationWithSecrets restores a Participation from a database +// handle. In addition, this function also restores all stateproof secrets +func RestoreParticipationWithSecrets(store db.Accessor) (PersistedParticipation, error) { + persistedParticipation, err := RestoreParticipation(store) + if err != nil { + return PersistedParticipation{}, err + } + + if persistedParticipation.StateProofSecrets == nil { // no state proof keys to restore + return persistedParticipation, nil + } + + err = persistedParticipation.StateProofSecrets.RestoreAllSecrets(store) + if err != nil { + return PersistedParticipation{}, err + } + return persistedParticipation, nil +} diff --git a/data/account/msgp_gen.go b/data/account/msgp_gen.go index 8f6a96fd70..e9c3a521a4 100644 --- a/data/account/msgp_gen.go +++ b/data/account/msgp_gen.go @@ -3,6 +3,7 @@ package account // Code generated by github.com/algorand/msgp DO NOT EDIT. import ( + "github.com/algorand/go-algorand/crypto/merklesignature" "github.com/algorand/msgp/msgp" ) @@ -15,6 +16,22 @@ import ( // |-----> (*) Msgsize // |-----> (*) MsgIsZero // +// StateProofKeys +// |-----> MarshalMsg +// |-----> CanMarshalMsg +// |-----> (*) UnmarshalMsg +// |-----> (*) CanUnmarshalMsg +// |-----> Msgsize +// |-----> MsgIsZero +// +// StateProofVerifier +// |-----> (*) MarshalMsg +// |-----> (*) CanMarshalMsg +// |-----> (*) UnmarshalMsg +// |-----> (*) CanUnmarshalMsg +// |-----> (*) Msgsize +// |-----> (*) MsgIsZero +// // MarshalMsg implements msgp.Marshaler func (z *ParticipationKeyIdentity) MarshalMsg(b []byte) (o []byte) { @@ -236,3 +253,104 @@ func (z *ParticipationKeyIdentity) Msgsize() (s int) { func (z *ParticipationKeyIdentity) MsgIsZero() bool { return ((*z).Parent.MsgIsZero()) && ((*z).VRFSK.MsgIsZero()) && ((*z).VoteID.MsgIsZero()) && ((*z).FirstValid.MsgIsZero()) && ((*z).LastValid.MsgIsZero()) && ((*z).KeyDilution == 0) } + +// MarshalMsg implements msgp.Marshaler +func (z StateProofKeys) MarshalMsg(b []byte) (o []byte) { + o = msgp.Require(b, z.Msgsize()) + if z == nil { + o = msgp.AppendNil(o) + } else { + o = msgp.AppendArrayHeader(o, uint32(len(z))) + } + for za0001 := range z { + o = z[za0001].MarshalMsg(o) + } + return +} + +func (_ StateProofKeys) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(StateProofKeys) + if !ok { + _, ok = (z).(*StateProofKeys) + } + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *StateProofKeys) UnmarshalMsg(bts []byte) (o []byte, err error) { + var zb0002 int + var zb0003 bool + zb0002, zb0003, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0002 > 1000 { + err = msgp.ErrOverflow(uint64(zb0002), uint64(1000)) + err = msgp.WrapError(err) + return + } + if zb0003 { + (*z) = nil + } else if (*z) != nil && cap((*z)) >= zb0002 { + (*z) = (*z)[:zb0002] + } else { + (*z) = make(StateProofKeys, zb0002) + } + for zb0001 := range *z { + bts, err = (*z)[zb0001].UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, zb0001) + return + } + } + o = bts + return +} + +func (_ *StateProofKeys) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*StateProofKeys) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z StateProofKeys) Msgsize() (s int) { + s = msgp.ArrayHeaderSize + for za0001 := range z { + s += z[za0001].Msgsize() + } + return +} + +// MsgIsZero returns whether this is a zero value +func (z StateProofKeys) MsgIsZero() bool { + return len(z) == 0 +} + +// MarshalMsg implements msgp.Marshaler +func (z *StateProofVerifier) MarshalMsg(b []byte) []byte { + return ((*(merklesignature.Verifier))(z)).MarshalMsg(b) +} +func (_ *StateProofVerifier) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(*StateProofVerifier) + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *StateProofVerifier) UnmarshalMsg(bts []byte) ([]byte, error) { + return ((*(merklesignature.Verifier))(z)).UnmarshalMsg(bts) +} +func (_ *StateProofVerifier) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*StateProofVerifier) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *StateProofVerifier) Msgsize() int { + return ((*(merklesignature.Verifier))(z)).Msgsize() +} + +// MsgIsZero returns whether this is a zero value +func (z *StateProofVerifier) MsgIsZero() bool { + return ((*(merklesignature.Verifier))(z)).MsgIsZero() +} diff --git a/data/account/msgp_gen_test.go b/data/account/msgp_gen_test.go index a8927e7902..9bde0e5d83 100644 --- a/data/account/msgp_gen_test.go +++ b/data/account/msgp_gen_test.go @@ -71,3 +71,63 @@ func BenchmarkUnmarshalParticipationKeyIdentity(b *testing.B) { } } } + +func TestMarshalUnmarshalStateProofKeys(t *testing.T) { + partitiontest.PartitionTest(t) + v := StateProofKeys{} + bts := v.MarshalMsg(nil) + left, err := v.UnmarshalMsg(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) + } + + left, err = msgp.Skip(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after Skip(): %q", len(left), left) + } +} + +func TestRandomizedEncodingStateProofKeys(t *testing.T) { + protocol.RunEncodingTest(t, &StateProofKeys{}) +} + +func BenchmarkMarshalMsgStateProofKeys(b *testing.B) { + v := StateProofKeys{} + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.MarshalMsg(nil) + } +} + +func BenchmarkAppendMsgStateProofKeys(b *testing.B) { + v := StateProofKeys{} + bts := make([]byte, 0, v.Msgsize()) + bts = v.MarshalMsg(bts[0:0]) + b.SetBytes(int64(len(bts))) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + bts = v.MarshalMsg(bts[0:0]) + } +} + +func BenchmarkUnmarshalStateProofKeys(b *testing.B) { + v := StateProofKeys{} + bts := v.MarshalMsg(nil) + b.ReportAllocs() + b.SetBytes(int64(len(bts))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := v.UnmarshalMsg(bts) + if err != nil { + b.Fatal(err) + } + } +} diff --git a/data/account/partInstall.go b/data/account/partInstall.go index 1883f68aab..2c943935f9 100644 --- a/data/account/partInstall.go +++ b/data/account/partInstall.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -25,7 +25,7 @@ import ( const PartTableSchemaName = "parttable" // PartTableSchemaVersion is the latest version of the PartTable schema -const PartTableSchemaVersion = 2 +const PartTableSchemaVersion = 3 // ErrUnsupportedSchema is the error returned when the PartTable schema version is wrong. var ErrUnsupportedSchema = fmt.Errorf("unsupported participation file schema version (expected %d)", PartTableSchemaVersion) @@ -36,13 +36,15 @@ func partInstallDatabase(tx *sql.Tx) error { _, err = tx.Exec(`CREATE TABLE ParticipationAccount ( parent BLOB, - vrf BLOB, --* msgpack encoding of ParticipationAccount.vrf - voting BLOB, --* msgpack encoding of ParticipationAccount.voting + --* participation keys + vrf BLOB, --* msgpack encoding of ParticipationAccount.vrf + voting BLOB, --* msgpack encoding of ParticipationAccount.voting firstValid INTEGER, lastValid INTEGER, - keyDilution INTEGER NOT NULL DEFAULT 0 + keyDilution INTEGER NOT NULL DEFAULT 0, + stateProof BLOB --* msgpack encoding of ParticipationAccount.StateProof );`) if err != nil { return err @@ -78,14 +80,14 @@ func partMigrate(tx *sql.Tx) (err error) { var version int err = rows.Scan(&tableName, &version) if err != nil { - return + return err } versions[tableName] = version } err = rows.Err() if err != nil { - return + return err } partVersion, has := versions[PartTableSchemaName] @@ -93,22 +95,43 @@ func partMigrate(tx *sql.Tx) (err error) { return ErrUnsupportedSchema } + partVersion, err = updateDB(tx, partVersion) + if err != nil { + return err + } + + if partVersion != PartTableSchemaVersion { + return ErrUnsupportedSchema + } + + return nil +} + +func updateDB(tx *sql.Tx, partVersion int) (int, error) { if partVersion == 1 { - _, err = tx.Exec("ALTER TABLE ParticipationAccount ADD keyDilution INTEGER NOT NULL DEFAULT 0") + _, err := tx.Exec("ALTER TABLE ParticipationAccount ADD keyDilution INTEGER NOT NULL DEFAULT 0") if err != nil { - return + return 0, err } partVersion = 2 _, err = tx.Exec("UPDATE schema SET version=? WHERE tablename=?", partVersion, PartTableSchemaName) if err != nil { - return + return 0, err } } - if partVersion != PartTableSchemaVersion { - return ErrUnsupportedSchema - } + if partVersion == 2 { + _, err := tx.Exec("ALTER TABLE ParticipationAccount ADD stateProof BLOB") + if err != nil { + return 0, err + } - return + partVersion = 3 + _, err = tx.Exec("UPDATE schema SET version=? WHERE tablename=?", partVersion, PartTableSchemaName) + if err != nil { + return 0, err + } + } + return partVersion, nil } diff --git a/data/account/participation.go b/data/account/participation.go index 474f6ca5e3..6b05ff4ba4 100644 --- a/data/account/participation.go +++ b/data/account/participation.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -23,6 +23,7 @@ import ( "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/crypto/merklesignature" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/transactions" "github.com/algorand/go-algorand/logging" @@ -47,6 +48,8 @@ type Participation struct { VRF *crypto.VRFSecrets Voting *crypto.OneTimeSignatureSecrets + // StateProofSecrets is used to sign compact certificates. + StateProofSecrets *merklesignature.Secrets // The first and last rounds for which this account is valid, respectively. // @@ -138,17 +141,19 @@ func (part Participation) VotingSecrets() *crypto.OneTimeSignatureSecrets { return part.Voting } -// VotingSigner returns the voting secrets associated with this Participation account, -// together with the KeyDilution value. -func (part Participation) VotingSigner() crypto.OneTimeSigner { - return crypto.OneTimeSigner{ - OneTimeSignatureSecrets: part.Voting, - OptionalKeyDilution: part.KeyDilution, - } +// StateProofSigner returns the key used to sign on Compact Certificates. +// might return nil! +func (part Participation) StateProofSigner() *merklesignature.Secrets { + return part.StateProofSecrets +} + +// StateProofVerifier returns the verifier for the StateProof keys. +func (part Participation) StateProofVerifier() *merklesignature.Verifier { + return part.StateProofSecrets.GetVerifier() } // GenerateRegistrationTransaction returns a transaction object for registering a Participation with its parent. -func (part Participation) GenerateRegistrationTransaction(fee basics.MicroAlgos, txnFirstValid, txnLastValid basics.Round, leaseBytes [32]byte) transactions.Transaction { +func (part Participation) GenerateRegistrationTransaction(fee basics.MicroAlgos, txnFirstValid, txnLastValid basics.Round, leaseBytes [32]byte, includeStateProofKeys bool) transactions.Transaction { t := transactions.Transaction{ Type: protocol.KeyRegistrationTx, Header: transactions.Header{ @@ -163,6 +168,11 @@ func (part Participation) GenerateRegistrationTransaction(fee basics.MicroAlgos, SelectionPK: part.VRF.PK, }, } + if cert := part.StateProofSigner(); cert != nil { + if includeStateProofKeys { // TODO: remove this check and parameter after the network had enough time to upgrade + t.KeyregTxnFields.StateProofPK = *(cert.GetVerifier()) + } + } t.KeyregTxnFields.VoteFirst = part.FirstValid t.KeyregTxnFields.VoteLast = part.LastValid t.KeyregTxnFields.VoteKeyDilution = part.KeyDilution @@ -210,6 +220,14 @@ func FillDBWithParticipationKeys(store db.Accessor, address basics.Address, firs return } + // TODO: change to ConsensusCurrentVersion when updated + interval := config.Consensus[protocol.ConsensusFuture].CompactCertRounds + maxValidPeriod := config.Consensus[protocol.ConsensusCurrentVersion].MaxKeyregValidPeriod + + if maxValidPeriod != 0 && uint64(lastValid-firstValid) > maxValidPeriod { + return PersistedParticipation{}, fmt.Errorf("the validity period for mss is too large: the limit is %d", maxValidPeriod) + } + // Compute how many distinct participation keys we should generate firstID := basics.OneTimeIDForRound(firstValid, keyDilution) lastID := basics.OneTimeIDForRound(lastValid, keyDilution) @@ -218,31 +236,48 @@ func FillDBWithParticipationKeys(store db.Accessor, address basics.Address, firs // Generate them v := crypto.GenerateOneTimeSignatureSecrets(firstID.Batch, numBatches) - // Also generate a new VRF key, which lives in the participation keys db + // Generate a new VRF key, which lives in the participation keys db vrf := crypto.GenerateVRFSecrets() + // Generate a new key which signs the compact certificates + stateProofSecrets, err := merklesignature.New(uint64(firstValid), uint64(lastValid), interval) + if err != nil { + return PersistedParticipation{}, err + } + // Construct the Participation containing these keys to be persisted part = PersistedParticipation{ Participation: Participation{ - Parent: address, - VRF: vrf, - Voting: v, - FirstValid: firstValid, - LastValid: lastValid, - KeyDilution: keyDilution, + Parent: address, + VRF: vrf, + Voting: v, + StateProofSecrets: stateProofSecrets, + FirstValid: firstValid, + LastValid: lastValid, + KeyDilution: keyDilution, }, Store: store, } // Persist the Participation into the database - err = part.Persist() + err = part.PersistWithSecrets() return part, err } +// PersistWithSecrets writes Participation struct to the database along with all the secrets it contains +func (part PersistedParticipation) PersistWithSecrets() error { + err := part.Persist() + if err != nil { + return err + } + return part.StateProofSecrets.Persist(part.Store) // must be called after part.Persist() +} + // Persist writes a Participation out to a database on the disk func (part PersistedParticipation) Persist() error { rawVRF := protocol.Encode(part.VRF) voting := part.Voting.Snapshot() rawVoting := protocol.Encode(&voting) + rawStateProof := protocol.Encode(part.StateProofSecrets) err := part.Store.Atomic(func(ctx context.Context, tx *sql.Tx) error { err := partInstallDatabase(tx) @@ -250,8 +285,8 @@ func (part PersistedParticipation) Persist() error { return fmt.Errorf("failed to install database: %w", err) } - _, err = tx.Exec("INSERT INTO ParticipationAccount (parent, vrf, voting, firstValid, lastValid, keyDilution) VALUES (?, ?, ?, ?, ?, ?)", - part.Parent[:], rawVRF, rawVoting, part.FirstValid, part.LastValid, part.KeyDilution) + _, err = tx.Exec("INSERT INTO ParticipationAccount (parent, vrf, voting, firstValid, lastValid, keyDilution, stateProof) VALUES (?, ?, ?, ?, ?, ?,?)", + part.Parent[:], rawVRF, rawVoting, part.FirstValid, part.LastValid, part.KeyDilution, rawStateProof) if err != nil { return fmt.Errorf("failed to insert account: %w", err) } @@ -268,7 +303,12 @@ func (part PersistedParticipation) Persist() error { // Calls through to the migration helper and returns the result. func Migrate(partDB db.Accessor) error { return partDB.Atomic(func(ctx context.Context, tx *sql.Tx) error { - return partMigrate(tx) + err := partMigrate(tx) + if err != nil { + return err + } + + return merklesignature.InstallStateProofTable(tx) }) } diff --git a/data/account/participationRegistry.go b/data/account/participationRegistry.go index 213e2be505..e6e642a3ea 100644 --- a/data/account/participationRegistry.go +++ b/data/account/participationRegistry.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -28,6 +28,7 @@ import ( "github.com/algorand/go-deadlock" "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/crypto/merklesignature" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/protocol" @@ -63,23 +64,66 @@ func ParseParticipationID(str string) (d ParticipationID, err error) { return d, err } -// ParticipationRecord contains all metadata relating to a set of participation keys. -type ParticipationRecord struct { - ParticipationID ParticipationID +type ( + // ParticipationRecord contains all metadata relating to a set of participation keys. + ParticipationRecord struct { + ParticipationID ParticipationID + + Account basics.Address + FirstValid basics.Round + LastValid basics.Round + KeyDilution uint64 + + LastVote basics.Round + LastBlockProposal basics.Round + LastStateProof basics.Round + EffectiveFirst basics.Round + EffectiveLast basics.Round + + StateProof *StateProofVerifier + VRF *crypto.VRFSecrets + Voting *crypto.OneTimeSignatureSecrets + } + + // StateProofVerifier defined the type used for the stateproofs public key + StateProofVerifier merklesignature.Verifier + + // StateProofKeys represents a set of ephemeral stateproof keys with their corresponding round + //msgp:allocbound StateProofKeys 1000 + StateProofKeys []merklesignature.KeyRoundPair + + // ParticipationRecordForRound contains participant's secrets that corresponds to + // one specific round. In Addition, it also returns the participation metadata + ParticipationRecordForRound struct { + ParticipationRecord + } + + // StateProofRecordForRound contains participant's state proof secrets that corresponds to + // one specific round. In Addition, it also returns the participation metadata. + // If there are no secrets for the round a nil is returned in Stateproof field. + StateProofRecordForRound struct { + ParticipationRecord + + StateProofSecrets *merklesignature.Signer + } - Account basics.Address - FirstValid basics.Round - LastValid basics.Round - KeyDilution uint64 + // SortUint64 implements sorting by uint64 keys for + // canonical encoding of maps in msgpack format. + SortUint64 = basics.SortUint64 +) - LastVote basics.Round - LastBlockProposal basics.Round - LastStateProof basics.Round - EffectiveFirst basics.Round - EffectiveLast basics.Round +// IsZero returns true if the object contains zero values. +func (r ParticipationRecordForRound) IsZero() bool { + return r.ParticipationRecord.IsZero() +} - VRF *crypto.VRFSecrets - Voting *crypto.OneTimeSignatureSecrets +// VotingSigner returns the voting secrets associated with this Participation account, +// together with the KeyDilution value. +func (r *ParticipationRecordForRound) VotingSigner() crypto.OneTimeSigner { + return crypto.OneTimeSigner{ + OneTimeSignatureSecrets: r.Voting, + OptionalKeyDilution: r.KeyDilution, + } } var zeroParticipationRecord = ParticipationRecord{} @@ -101,7 +145,14 @@ func (r ParticipationRecord) Duplicate() ParticipationRecord { if r.Voting != nil { voting = r.Voting.Snapshot() } - return ParticipationRecord{ + + var stateProof *StateProofVerifier + if r.StateProof != nil { + stateProof = &StateProofVerifier{} + copy(stateProof[:], r.StateProof[:]) + } + + dupParticipation := ParticipationRecord{ ParticipationID: r.ParticipationID, Account: r.Account, FirstValid: r.FirstValid, @@ -112,9 +163,23 @@ func (r ParticipationRecord) Duplicate() ParticipationRecord { LastStateProof: r.LastStateProof, EffectiveFirst: r.EffectiveFirst, EffectiveLast: r.EffectiveLast, + StateProof: stateProof, VRF: &vrf, Voting: &voting, } + + return dupParticipation +} + +// OverlapsInterval returns true if the partkey is valid at all within the range of rounds (inclusive) +func (r ParticipationRecord) OverlapsInterval(first, last basics.Round) bool { + if last < first { + logging.Base().Panicf("Round interval should be ordered (first = %v, last = %v)", first, last) + } + if last < r.FirstValid || first > r.LastValid { + return false + } + return true } // ParticipationAction is used when recording participation actions. @@ -134,6 +199,9 @@ var ErrParticipationIDNotFound = errors.New("the participation ID was not found" // ErrInvalidRegisterRange is used when attempting to register a participation key on a round that is out of range. var ErrInvalidRegisterRange = errors.New("key would not be active within range") +// ErrRequestedRoundOutOfRange is used when the requested round for GetForRound is outside the valid range of this participation +var ErrRequestedRoundOutOfRange = errors.New("request range is not within the validity range") + // ErrUnknownParticipationAction is used when record is given something other than the known actions. var ErrUnknownParticipationAction = errors.New("unknown participation action") @@ -152,11 +220,18 @@ var ErrMultipleKeysForID = errors.New("multiple valid keys found for the same pa // ErrNoKeyForID there may be cases where a key is deleted and used at the same time, so this error should be handled. var ErrNoKeyForID = errors.New("no valid key found for the participationID") +// ErrSecretNotFound is used when attempting to lookup secrets for a particular round. +var ErrSecretNotFound = errors.New("the participation ID did not have secrets for the requested round") + // ParticipationRegistry contain all functions for interacting with the Participation Registry. type ParticipationRegistry interface { // Insert adds a record to storage and computes the ParticipationID Insert(record Participation) (ParticipationID, error) + // AppendKeys appends state proof keys to an existing Participation record. Keys can only be appended + // once, an error will occur when the data is flushed when inserting a duplicate key. + AppendKeys(id ParticipationID, keys StateProofKeys) error + // Delete removes a record from storage. Delete(id ParticipationID) error @@ -169,6 +244,12 @@ type ParticipationRegistry interface { // GetAll of the participation records. GetAll() []ParticipationRecord + // GetForRound fetches a record with voting secrets for a particular round. + GetForRound(id ParticipationID, round basics.Round) (ParticipationRecordForRound, error) + + // GetStateProofForRound fetches a record with stateproof secrets for a particular round. + GetStateProofForRound(id ParticipationID, round basics.Round) (StateProofRecordForRound, error) + // Register updates the EffectiveFirst and EffectiveLast fields. If there are multiple records for the account // then it is possible for multiple records to be updated. Register(id ParticipationID, on basics.Round) error @@ -235,7 +316,7 @@ const ( keyDilution INTEGER NOT NULL, vrf BLOB, --* msgpack encoding of ParticipationAccount.vrf - stateProof BLOB --* msgpack encoding of ParticipationAccount.BlockProof + stateProof BLOB --* msgpack encoding of merklesignature.SignerContext )` createRolling = `CREATE TABLE Rolling ( @@ -256,20 +337,26 @@ const ( key BLOB NOT NULL, --* msgpack encoding of ParticipationAccount.BlockProof.SignatureAlgorithm PRIMARY KEY (pk, round) )` - insertKeysetQuery = `INSERT INTO Keysets (participationID, account, firstValidRound, lastValidRound, keyDilution, vrf) VALUES (?, ?, ?, ?, ?, ?)` - insertRollingQuery = `INSERT INTO Rolling (pk, voting) VALUES (?, ?)` + insertKeysetQuery = `INSERT INTO Keysets (participationID, account, firstValidRound, lastValidRound, keyDilution, vrf, stateProof) VALUES (?, ?, ?, ?, ?, ?, ?)` + insertRollingQuery = `INSERT INTO Rolling (pk, voting) VALUES (?, ?)` + appendStateProofKeysQuery = `INSERT INTO StateProofKeys (pk, round, key) VALUES(?, ?, ?)` // SELECT pk FROM Keysets WHERE participationID = ? selectPK = `SELECT pk FROM Keysets WHERE participationID = ? LIMIT 1` selectLastPK = `SELECT pk FROM Keysets ORDER BY pk DESC LIMIT 1` selectRecords = `SELECT k.participationID, k.account, k.firstValidRound, - k.lastValidRound, k.keyDilution, k.vrf, + k.lastValidRound, k.keyDilution, k.vrf, k.stateProof, r.lastVoteRound, r.lastBlockProposalRound, r.lastStateProofRound, r.effectiveFirstRound, r.effectiveLastRound, r.voting FROM Keysets k INNER JOIN Rolling r ON k.pk = r.pk` + selectStateProofData = `SELECT stateProof FROM Keysets WHERE participationID = ? LIMIT 1` + selectStateProofKey = `SELECT s.key + FROM StateProofKeys s + WHERE round=? + AND pk IN (SELECT pk FROM Keysets WHERE participationID=?)` deleteKeysets = `DELETE FROM Keysets WHERE pk=?` deleteRolling = `DELETE FROM Rolling WHERE pk=?` updateRollingFieldsSQL = `UPDATE Rolling @@ -332,6 +419,7 @@ type updatingParticipationRecord struct { type partDBWriteRecord struct { insertID ParticipationID insert Participation + keys StateProofKeys registerUpdated map[ParticipationID]updatingParticipationRecord @@ -380,7 +468,11 @@ func (db *participationDB) writeThread() { if len(wr.registerUpdated) != 0 { err = db.registerInner(wr.registerUpdated) } else if !wr.insertID.IsZero() { - err = db.insertInner(wr.insert, wr.insertID) + if wr.insert != (Participation{}) { + err = db.insertInner(wr.insert, wr.insertID) + } else if len(wr.keys) != 0 { + err = db.appendKeysInner(wr.insertID, wr.keys) + } } else if !wr.delete.IsZero() { err = db.deleteInner(wr.delete) } else if wr.flushResultChannel != nil { @@ -413,9 +505,9 @@ func verifyExecWithOneRowEffected(err error, result sql.Result, operationName st } func (db *participationDB) insertInner(record Participation, id ParticipationID) (err error) { - var rawVRF []byte var rawVoting []byte + var rawStateProofContext []byte if record.VRF != nil { rawVRF = protocol.Encode(record.VRF) @@ -425,6 +517,11 @@ func (db *participationDB) insertInner(record Participation, id ParticipationID) rawVoting = protocol.Encode(&voting) } + // This contains all the state proof data except for the actual secret keys (stored in a different table) + if record.StateProofSecrets != nil { + rawStateProofContext = protocol.Encode(&record.StateProofSecrets.SignerContext) + } + err = db.store.Wdb.Atomic(func(ctx context.Context, tx *sql.Tx) error { result, err := tx.Exec( insertKeysetQuery, @@ -433,8 +530,9 @@ func (db *participationDB) insertInner(record Participation, id ParticipationID) record.FirstValid, record.LastValid, record.KeyDilution, - rawVRF) - if err := verifyExecWithOneRowEffected(err, result, "insert keyset"); err != nil { + rawVRF, + rawStateProofContext) + if err = verifyExecWithOneRowEffected(err, result, "insert keyset"); err != nil { return err } pk, err := result.LastInsertId() @@ -444,7 +542,7 @@ func (db *participationDB) insertInner(record Participation, id ParticipationID) // Create Rolling entry result, err = tx.Exec(insertRollingQuery, pk, rawVoting) - if err := verifyExecWithOneRowEffected(err, result, "insert rolling"); err != nil { + if err = verifyExecWithOneRowEffected(err, result, "insert rolling"); err != nil { return err } @@ -453,6 +551,37 @@ func (db *participationDB) insertInner(record Participation, id ParticipationID) return err } +func (db *participationDB) appendKeysInner(id ParticipationID, keys StateProofKeys) error { + err := db.store.Wdb.Atomic(func(ctx context.Context, tx *sql.Tx) error { + // Fetch primary key + var pk int + row := tx.QueryRow(selectPK, id[:]) + err := row.Scan(&pk) + if err == sql.ErrNoRows { + // nothing to do. + return nil + } + if err != nil { + return fmt.Errorf("unable to scan pk: %w", err) + } + + stmt, err := tx.Prepare(appendStateProofKeysQuery) + if err != nil { + return fmt.Errorf("unable to prepare state proof insert: %w", err) + } + + for _, key := range keys { + result, err := stmt.Exec(pk, key.Round, protocol.Encode(key.Key)) + if err = verifyExecWithOneRowEffected(err, result, "append keys"); err != nil { + return err + } + } + + return nil + }) + return err +} + func (db *participationDB) registerInner(updated map[ParticipationID]updatingParticipationRecord) error { var cacheDeletes []ParticipationID err := db.store.Wdb.Atomic(func(ctx context.Context, tx *sql.Tx) error { @@ -502,12 +631,12 @@ func (db *participationDB) deleteInner(id ParticipationID) error { // Delete rows result, err := tx.Exec(deleteKeysets, pk) - if err := verifyExecWithOneRowEffected(err, result, "delete keyset"); err != nil { + if err = verifyExecWithOneRowEffected(err, result, "delete keyset"); err != nil { return err } result, err = tx.Exec(deleteRolling, pk) - if err := verifyExecWithOneRowEffected(err, result, "delete rolling"); err != nil { + if err = verifyExecWithOneRowEffected(err, result, "delete rolling"); err != nil { return err } @@ -578,6 +707,8 @@ func (db *participationDB) Insert(record Participation) (id ParticipationID, err id = record.ID() if _, ok := db.cache[id]; ok { + // PKI TODO: Add a special case to set the StateProof public key if it is in the input + // but not in the cache. return id, ErrAlreadyInserted } @@ -600,6 +731,13 @@ func (db *participationDB) Insert(record Participation) (id ParticipationID, err *voting = record.Voting.Snapshot() } + var stateProofVeriferPtr *StateProofVerifier + if record.StateProofSecrets != nil { + stateProofVeriferPtr = &StateProofVerifier{} + copy(stateProofVeriferPtr[:], record.StateProofSecrets.GetVerifier()[:]) + + } + // update cache. db.cache[id] = ParticipationRecord{ ParticipationID: id, @@ -612,6 +750,7 @@ func (db *participationDB) Insert(record Participation) (id ParticipationID, err LastStateProof: 0, EffectiveFirst: 0, EffectiveLast: 0, + StateProof: stateProofVeriferPtr, Voting: voting, VRF: vrf, } @@ -619,6 +758,22 @@ func (db *participationDB) Insert(record Participation) (id ParticipationID, err return } +func (db *participationDB) AppendKeys(id ParticipationID, keys StateProofKeys) error { + db.mutex.Lock() + defer db.mutex.Unlock() + + if _, ok := db.cache[id]; !ok { + return ErrParticipationIDNotFound + } + + // Update the DB asynchronously. + db.writeQueue <- partDBWriteRecord{ + insertID: id, + keys: keys, + } + return nil +} + func (db *participationDB) Delete(id ParticipationID) error { db.mutex.Lock() defer db.mutex.Unlock() @@ -629,6 +784,7 @@ func (db *participationDB) Delete(id ParticipationID) error { } delete(db.dirty, id) delete(db.cache, id) + // do the db part async db.writeQueue <- partDBWriteRecord{ delete: id, @@ -658,6 +814,7 @@ func scanRecords(rows *sql.Rows) ([]ParticipationRecord, error) { var rawAccount []byte var rawVRF []byte var rawVoting []byte + var rawStateProof []byte var lastVote sql.NullInt64 var lastBlockProposal sql.NullInt64 @@ -672,6 +829,7 @@ func scanRecords(rows *sql.Rows) ([]ParticipationRecord, error) { &record.LastValid, &record.KeyDilution, &rawVRF, + &rawStateProof, &lastVote, &lastBlockProposal, &lastCompactCertificate, @@ -694,6 +852,17 @@ func scanRecords(rows *sql.Rows) ([]ParticipationRecord, error) { } } + if len(rawStateProof) > 0 { + stateProof := merklesignature.Signer{} + err = protocol.Decode(rawStateProof, &stateProof.SignerContext) + if err != nil { + return nil, fmt.Errorf("unable to decode stateproof: %w", err) + } + var stateProofVerifer StateProofVerifier + copy(stateProofVerifer[:], stateProof.GetVerifier()[:]) + record.StateProof = &stateProofVerifer + } + if len(rawVoting) > 0 { record.Voting = &crypto.OneTimeSignatureSecrets{} err = protocol.Decode(rawVoting, record.Voting) @@ -770,6 +939,84 @@ func (db *participationDB) GetAll() []ParticipationRecord { return results } +// GetStateProofForRound returns the state proof data required to sign the compact certificate for this round +func (db *participationDB) GetStateProofForRound(id ParticipationID, round basics.Round) (StateProofRecordForRound, error) { + partRecord, err := db.GetForRound(id, round) + if err != nil { + return StateProofRecordForRound{}, err + } + + var result StateProofRecordForRound + result.ParticipationRecord = partRecord.ParticipationRecord + var rawStateProofKey []byte + err = db.store.Rdb.Atomic(func(ctx context.Context, tx *sql.Tx) error { + // fetch secret key + row := tx.QueryRow(selectStateProofKey, round, id[:]) + err := row.Scan(&rawStateProofKey) + if err == sql.ErrNoRows { + return ErrSecretNotFound + } + if err != nil { + return fmt.Errorf("error while querying secrets: %w", err) + } + + return nil + }) + switch err { + case nil: + // no error, continue + case ErrSecretNotFound: // not considered an error (yet), since some accounts may not have registered state proof yet + return result, nil + default: + return StateProofRecordForRound{}, err + } + + // Init stateproof fields after being able to retrieve key from database + result.StateProofSecrets = &merklesignature.Signer{} + result.StateProofSecrets.SigningKey = &crypto.FalconSigner{} + result.StateProofSecrets.Round = uint64(round) + + err = protocol.Decode(rawStateProofKey, result.StateProofSecrets.SigningKey) + if err != nil { + return StateProofRecordForRound{}, err + } + + var rawSignerContext []byte + err = db.store.Rdb.Atomic(func(ctx context.Context, tx *sql.Tx) error { + // fetch stateproof public data + row := tx.QueryRow(selectStateProofData, id[:]) + err := row.Scan(&rawSignerContext) + if err != nil { + return fmt.Errorf("error while querying stateproof data: %w", err) + } + return nil + }) + if err != nil { + return StateProofRecordForRound{}, err + } + err = protocol.Decode(rawSignerContext, &result.StateProofSecrets.SignerContext) + if err != nil { + return StateProofRecordForRound{}, err + } + return result, nil +} + +// GetForRound fetches a record with all secrets for a particular round. +func (db *participationDB) GetForRound(id ParticipationID, round basics.Round) (ParticipationRecordForRound, error) { + var result ParticipationRecordForRound + + result.ParticipationRecord = db.Get(id) + if result.ParticipationRecord.IsZero() { + return ParticipationRecordForRound{}, ErrParticipationIDNotFound + } + + if round > result.LastValid { + return ParticipationRecordForRound{}, ErrRequestedRoundOutOfRange + } + + return result, nil +} + // updateRollingFields sets all of the rolling fields according to the record object. func updateRollingFields(ctx context.Context, tx *sql.Tx, record ParticipationRecord) error { result, err := tx.ExecContext(ctx, updateRollingFieldsSQL, diff --git a/data/account/participationRegistryBench_test.go b/data/account/participationRegistryBench_test.go new file mode 100644 index 0000000000..378950b775 --- /dev/null +++ b/data/account/participationRegistryBench_test.go @@ -0,0 +1,85 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package account + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/algorand/go-algorand/data/basics" + "github.com/algorand/go-algorand/logging" + "github.com/algorand/go-algorand/util/db" +) + +func benchmarkKeyRegistration(numKeys int, b *testing.B) { + // setup + rootDB, err := db.OpenPair(b.Name(), true) + if err != nil { + b.Fail() + } + registry, err := makeParticipationRegistry(rootDB, logging.TestingLog(b)) + if err != nil { + b.Fail() + } + + // Insert records so that we can t + b.Run(fmt.Sprintf("KeyInsert_%d", numKeys), func(b *testing.B) { + a := require.New(b) + for n := 0; n < b.N; n++ { + for key := 0; key < numKeys; key++ { + p := makeTestParticipation(a, key, basics.Round(0), basics.Round(1000000), 3) + registry.Insert(p) + } + } + }) + + // The first call to Register updates the DB. + b.Run(fmt.Sprintf("KeyRegistered_%d", numKeys), func(b *testing.B) { + a := require.New(b) + for n := 0; n < b.N; n++ { + for key := 0; key < numKeys; key++ { + p := makeTestParticipation(a, key, basics.Round(0), basics.Round(1000000), 3) + + // Unfortunately we need to repeatedly clear out the registration fields to ensure the + // db update runs each time this is called. + record := registry.cache[p.ID()] + record.EffectiveFirst = 0 + record.EffectiveLast = 0 + registry.cache[p.ID()] = record + registry.Register(p.ID(), 50) + } + } + }) + + // The keys should now be updated, so Register is a no-op. + b.Run(fmt.Sprintf("NoOp_%d", numKeys), func(b *testing.B) { + a := require.New(b) + for n := 0; n < b.N; n++ { + for key := 0; key < numKeys; key++ { + p := makeTestParticipation(a, key, basics.Round(0), basics.Round(1000000), 3) + registry.Register(p.ID(), 50) + } + } + }) +} + +func BenchmarkKeyRegistration1(b *testing.B) { benchmarkKeyRegistration(1, b) } +func BenchmarkKeyRegistration5(b *testing.B) { benchmarkKeyRegistration(5, b) } +func BenchmarkKeyRegistration10(b *testing.B) { benchmarkKeyRegistration(10, b) } +func BenchmarkKeyRegistration50(b *testing.B) { benchmarkKeyRegistration(50, b) } diff --git a/data/account/participationRegistry_test.go b/data/account/participationRegistry_test.go index d000f16cbb..e8e1e6538c 100644 --- a/data/account/participationRegistry_test.go +++ b/data/account/participationRegistry_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -22,6 +22,7 @@ import ( "encoding/binary" "errors" "fmt" + "strings" "sync" "testing" @@ -32,6 +33,7 @@ import ( "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/crypto/merklesignature" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/protocol" @@ -39,6 +41,9 @@ import ( "github.com/algorand/go-algorand/util/db" ) +// TODO: change to ConsensusCurrentVersion when updated +var CompactCertRounds = config.Consensus[protocol.ConsensusFuture].CompactCertRounds + func getRegistry(t *testing.T) *participationDB { rootDB, err := db.OpenPair(t.Name(), true) require.NoError(t, err) @@ -55,16 +60,26 @@ func assertParticipation(t *testing.T, p Participation, pr ParticipationRecord) require.Equal(t, p.LastValid, pr.LastValid) require.Equal(t, p.KeyDilution, pr.KeyDilution) require.Equal(t, p.Parent, pr.Account) + if p.StateProofSecrets != nil { + require.Equal(t, p.StateProofSecrets.GetVerifier()[:], pr.StateProof[:]) + } + } -func makeTestParticipation(addrID int, first, last basics.Round, dilution uint64) Participation { +func makeTestParticipation(a *require.Assertions, addrID int, first, last basics.Round, dilution uint64) Participation { + // Generate sample of stateproof keys. because it might take time we will reduce the number always to get 2 keys + stateProofSecrets, err := merklesignature.New(uint64(first), uint64(last), (uint64(last)+1)/2) + a.NoError(err) + p := Participation{ - FirstValid: first, - LastValid: last, - KeyDilution: dilution, - Voting: &crypto.OneTimeSignatureSecrets{}, - VRF: &crypto.VRFSecrets{}, + FirstValid: first, + LastValid: last, + KeyDilution: dilution, + Voting: &crypto.OneTimeSignatureSecrets{}, + VRF: &crypto.VRFSecrets{}, + StateProofSecrets: stateProofSecrets, } + binary.LittleEndian.PutUint32(p.Parent[:], uint32(addrID)) return p } @@ -83,8 +98,8 @@ func TestParticipation_InsertGet(t *testing.T) { registry := getRegistry(t) defer registryCloseTest(t, registry) - p := makeTestParticipation(1, 1, 2, 3) - p2 := makeTestParticipation(2, 4, 5, 6) + p := makeTestParticipation(a, 1, 1, 2, 3) + p2 := makeTestParticipation(a, 2, 4, 5, 6) insertAndVerify := func(part Participation) { id, err := registry.Insert(part) @@ -129,6 +144,46 @@ func TestParticipation_InsertGet(t *testing.T) { } } +// Insert participation records and make sure they can be fetched. +func TestParticipation_InsertGetWithoutEmptyStateproof(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + registry := getRegistry(t) + defer registryCloseTest(t, registry) + + p := Participation{ + FirstValid: 1, + LastValid: 3, + KeyDilution: 1, + Voting: &crypto.OneTimeSignatureSecrets{}, + VRF: &crypto.VRFSecrets{}, + } + + binary.LittleEndian.PutUint32(p.Parent[:], uint32(1)) + + insertAndVerify := func(part Participation) { + id, err := registry.Insert(part) + a.NoError(err) + a.Equal(part.ID(), id) + + record := registry.Get(part.ID()) + a.False(record.IsZero()) + assertParticipation(t, part, record) + } + + // Verify inserting some records. + insertAndVerify(p) + + // Data should be available immediately + results := registry.GetAll() + if results[0].Account == p.Parent { + assertParticipation(t, p, results[0]) + a.Nil(results[0].StateProof) + } else { + a.Fail("unexpected account") + } +} + // Make sure a record can be deleted by id. func TestParticipation_Delete(t *testing.T) { partitiontest.PartitionTest(t) @@ -136,8 +191,8 @@ func TestParticipation_Delete(t *testing.T) { registry := getRegistry(t) defer registryCloseTest(t, registry) - p := makeTestParticipation(1, 1, 2, 3) - p2 := makeTestParticipation(2, 4, 5, 6) + p := makeTestParticipation(a, 1, 1, 2, 3) + p2 := makeTestParticipation(a, 2, 4, 5, 6) id, err := registry.Insert(p) a.NoError(err) @@ -169,7 +224,7 @@ func TestParticipation_DeleteExpired(t *testing.T) { defer registryCloseTest(t, registry) for i := 10; i < 20; i++ { - p := makeTestParticipation(i, 1, basics.Round(i), 1) + p := makeTestParticipation(a, i, 1, basics.Round(i), 1) id, err := registry.Insert(p) a.NoError(err) a.Equal(p.ID(), id) @@ -194,8 +249,8 @@ func TestParticipation_Register(t *testing.T) { defer registryCloseTest(t, registry) // Overlapping keys. - p := makeTestParticipation(1, 250000, 3000000, 1) - p2 := makeTestParticipation(1, 200000, 4000000, 2) + p := makeTestParticipation(a, 1, 250000, 3000000, 1) + p2 := makeTestParticipation(a, 1, 200000, 4000000, 2) id, err := registry.Insert(p) a.NoError(err) @@ -231,7 +286,7 @@ func TestParticipation_RegisterInvalidID(t *testing.T) { registry := getRegistry(t) defer registryCloseTest(t, registry) - p := makeTestParticipation(0, 250000, 3000000, 1) + p := makeTestParticipation(a, 0, 250000, 3000000, 1) err := registry.Register(p.ID(), 10000000) a.EqualError(err, ErrParticipationIDNotFound.Error()) @@ -244,7 +299,7 @@ func TestParticipation_RegisterInvalidRange(t *testing.T) { registry := getRegistry(t) defer registryCloseTest(t, registry) - p := makeTestParticipation(0, 250000, 3000000, 1) + p := makeTestParticipation(a, 0, 250000, 3000000, 1) id, err := registry.Insert(p) a.NoError(err) @@ -263,10 +318,10 @@ func TestParticipation_Record(t *testing.T) { defer registryCloseTest(t, registry) // Setup p - p := makeTestParticipation(1, 0, 3000000, 1) + p := makeTestParticipation(a, 1, 0, 3000000, 1) // Setup some other keys to make sure they are not updated. - p2 := makeTestParticipation(2, 0, 3000000, 1) - p3 := makeTestParticipation(3, 0, 3000000, 1) + p2 := makeTestParticipation(a, 2, 0, 3000000, 1) + p3 := makeTestParticipation(a, 3, 0, 3000000, 1) // Install and register all of the keys for _, part := range []Participation{p, p2, p3} { @@ -316,7 +371,7 @@ func TestParticipation_RecordInvalidActionAndOutOfRange(t *testing.T) { registry := getRegistry(t) defer registryCloseTest(t, registry) - p := makeTestParticipation(1, 0, 3000000, 1) + p := makeTestParticipation(a, 1, 0, 3000000, 1) id, err := registry.Insert(p) a.NoError(err) err = registry.Register(id, 0) @@ -353,8 +408,8 @@ func TestParticipation_RecordMultipleUpdates(t *testing.T) { // We'll test that recording at this round fails because both keys are active testRound := basics.Round(5000) - p := makeTestParticipation(1, 0, 3000000, 1) - p2 := makeTestParticipation(1, 1, 3000000, 1) + p := makeTestParticipation(a, 1, 0, 3000000, 1) + p2 := makeTestParticipation(a, 1, 1, 3000000, 1) _, err := registry.Insert(p) a.NoError(err) @@ -400,7 +455,7 @@ func TestParticipation_MultipleInsertError(t *testing.T) { registry := getRegistry(t) defer registryCloseTest(t, registry) - p := makeTestParticipation(1, 1, 2, 3) + p := makeTestParticipation(a, 1, 1, 2, 3) _, err := registry.Insert(p) a.NoError(err) @@ -418,7 +473,7 @@ func TestParticipation_RecordMultipleUpdates_DB(t *testing.T) { a := require.New(t) registry := getRegistry(t) - p := makeTestParticipation(1, 1, 2000000, 3) + p := makeTestParticipation(a, 1, 1, 2000000, 3) id := p.ID() // Insert the same record twice @@ -433,6 +488,7 @@ func TestParticipation_RecordMultipleUpdates_DB(t *testing.T) { record.FirstValid, record.LastValid, record.KeyDilution, + nil, nil) if err != nil { return fmt.Errorf("unable to insert keyset: %w", err) @@ -626,12 +682,12 @@ func TestParticipion_EmptyBlobs(t *testing.T) { func TestRegisterUpdatedEvent(t *testing.T) { partitiontest.PartitionTest(t) - a := assert.New(t) + a := require.New(t) registry := getRegistry(t) defer registryCloseTest(t, registry) - p := makeTestParticipation(1, 1, 2, 3) - p2 := makeTestParticipation(2, 4, 5, 6) + p := makeTestParticipation(a, 1, 1, 2, 3) + p2 := makeTestParticipation(a, 2, 4, 5, 6) id1, err := registry.Insert(p) a.NoError(err) @@ -714,56 +770,165 @@ func TestFlushDeadlock(t *testing.T) { wg.Wait() } -func benchmarkKeyRegistration(numKeys int, b *testing.B) { - // setup - rootDB, err := db.OpenPair(b.Name(), true) - if err != nil { - b.Fail() +func TestAddStateProofKeys(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + registry := getRegistry(t) + defer registryCloseTest(t, registry) + + // Install a key to add StateProof keys. + max := uint64(20) + p := makeTestParticipation(a, 1, 0, basics.Round(max), 3) + id, err := registry.Insert(p) + a.NoError(err) + a.Equal(p.ID(), id) + + // Wait for async DB operations to finish. + err = registry.Flush(10 * time.Second) + a.NoError(err) + + signer, err := merklesignature.New(1, max, 3) + a.NoError(err) + // Initialize keys array. + var keys StateProofKeys + for i := uint64(1); i < max; i++ { + k := signer.GetKey(i) + if k == nil { + continue + } + keysRound := merklesignature.KeyRoundPair{Round: i, Key: k} + keys = append(keys, keysRound) } - registry, err := makeParticipationRegistry(rootDB, logging.TestingLog(b)) + + err = registry.AppendKeys(id, keys) + a.NoError(err) + + // Wait for async DB operations to finish. + err = registry.Flush(10 * time.Second) + a.NoError(err) + + j := 0 + // Make sure we're able to fetch the same data that was put in. + for i := uint64(1); i < max; i++ { + r, err := registry.GetStateProofForRound(id, basics.Round(i)) + a.NoError(err) + + if r.StateProofSecrets != nil { + a.Equal(*keys[j].Key, *r.StateProofSecrets.SigningKey) + a.Equal(keys[j].Round, i) + j++ + } + + } +} + +func TestSecretNotFound(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + registry := getRegistry(t) + defer registryCloseTest(t, registry) + + // Install a key for testing + p := makeTestParticipation(a, 1, 0, 2, 3) + id, err := registry.Insert(p) + a.NoError(err) + a.Equal(p.ID(), id) + + r, err := registry.GetStateProofForRound(id, basics.Round(2)) + a.NoError(err) + + // Empty stateproof key + a.Nil(r.StateProofSecrets) + + _, err = registry.GetForRound(id, basics.Round(100)) + a.ErrorIs(err, ErrRequestedRoundOutOfRange) +} + +func TestAddingSecretTwice(t *testing.T) { + partitiontest.PartitionTest(t) + a := assert.New(t) + registry := getRegistry(t) + defer registryCloseTest(t, registry) + + access, err := db.MakeAccessor("stateprooftest", false, true) if err != nil { - b.Fail() + panic(err) } + root, err := GenerateRoot(access) + p, err := FillDBWithParticipationKeys(access, root.Address(), 0, basics.Round(CompactCertRounds*2), 3) + access.Close() + a.NoError(err) - // Insert records so that we can t - b.Run(fmt.Sprintf("KeyInsert_%d", numKeys), func(b *testing.B) { - for n := 0; n < b.N; n++ { - for key := 0; key < numKeys; key++ { - p := makeTestParticipation(key, basics.Round(0), basics.Round(1000000), 3) - registry.Insert(p) - } - } - }) + // Install a key for testing + id, err := registry.Insert(p.Participation) + a.NoError(err) + a.Equal(p.ID(), id) - // The first call to Register updates the DB. - b.Run(fmt.Sprintf("KeyRegistered_%d", numKeys), func(b *testing.B) { - for n := 0; n < b.N; n++ { - for key := 0; key < numKeys; key++ { - p := makeTestParticipation(key, basics.Round(0), basics.Round(1000000), 3) - - // Unfortunately we need to repeatedly clear out the registration fields to ensure the - // db update runs each time this is called. - record := registry.cache[p.ID()] - record.EffectiveFirst = 0 - record.EffectiveLast = 0 - registry.cache[p.ID()] = record - registry.Register(p.ID(), 50) - } - } - }) + // Append key + var keys StateProofKeys - // The keys should now be updated, so Register is a no-op. - b.Run(fmt.Sprintf("NoOp_%d", numKeys), func(b *testing.B) { - for n := 0; n < b.N; n++ { - for key := 0; key < numKeys; key++ { - p := makeTestParticipation(key, basics.Round(0), basics.Round(1000000), 3) - registry.Register(p.ID(), 50) - } - } - }) + keysRound := merklesignature.KeyRoundPair{Round: CompactCertRounds, Key: p.StateProofSecrets.GetKey(CompactCertRounds)} + keys = append(keys, keysRound) + + err = registry.AppendKeys(id, keys) + a.NoError(err) + + // The error doesn't happen until the data persists. + err = registry.AppendKeys(id, keys) + a.NoError(err) + + err = registry.Flush(10 * time.Second) + a.Error(err) + a.EqualError(err, "unable to execute append keys: UNIQUE constraint failed: StateProofKeys.pk, StateProofKeys.round") } -func BenchmarkKeyRegistration1(b *testing.B) { benchmarkKeyRegistration(1, b) } -func BenchmarkKeyRegistration5(b *testing.B) { benchmarkKeyRegistration(5, b) } -func BenchmarkKeyRegistration10(b *testing.B) { benchmarkKeyRegistration(10, b) } -func BenchmarkKeyRegistration50(b *testing.B) { benchmarkKeyRegistration(50, b) } +func TestGetRoundSecretsWithoutStateProof(t *testing.T) { + partitiontest.PartitionTest(t) + a := assert.New(t) + registry := getRegistry(t) + defer registryCloseTest(t, registry) + + access, err := db.MakeAccessor("stateprooftest", false, true) + if err != nil { + panic(err) + } + root, err := GenerateRoot(access) + p, err := FillDBWithParticipationKeys(access, root.Address(), 0, basics.Round(CompactCertRounds*2), 3) + access.Close() + a.NoError(err) + + // Install a key for testing + id, err := registry.Insert(p.Participation) + a.NoError(err) + + a.NoError(registry.Flush(defaultTimeout)) + + partPerRound, err := registry.GetStateProofForRound(id, 1) + a.NoError(err) + a.Nil(partPerRound.StateProofSecrets) + + // Should return nil as well since no state proof keys were added + partPerRound, err = registry.GetStateProofForRound(id, basics.Round(CompactCertRounds)) + a.NoError(err) + a.Nil(partPerRound.StateProofSecrets) + + // Append key + keys := make(StateProofKeys, 1) + keys[0] = merklesignature.KeyRoundPair{Round: CompactCertRounds, Key: p.StateProofSecrets.GetKey(CompactCertRounds)} + + err = registry.AppendKeys(id, keys) + a.NoError(err) + + a.NoError(registry.Flush(defaultTimeout)) + + partPerRound, err = registry.GetStateProofForRound(id, basics.Round(CompactCertRounds)-1) + a.NoError(err) + a.Nil(partPerRound.StateProofSecrets) + + partPerRound, err = registry.GetStateProofForRound(id, basics.Round(CompactCertRounds)) + a.NoError(err) + a.NotNil(partPerRound.StateProofSecrets) + + a.Equal(*partPerRound.StateProofSecrets.SigningKey, *keys[0].Key) + a.Equal(CompactCertRounds, keys[0].Round) +} diff --git a/data/account/participation_test.go b/data/account/participation_test.go index b92929b36a..843509f960 100644 --- a/data/account/participation_test.go +++ b/data/account/participation_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -19,9 +19,13 @@ package account import ( "context" "database/sql" + "fmt" "os" + "strconv" + "strings" "testing" + uuid "github.com/satori/go.uuid" "github.com/stretchr/testify/require" "github.com/algorand/go-algorand/config" @@ -32,32 +36,53 @@ import ( "github.com/algorand/go-algorand/util/db" ) +var partableColumnNames = [...]string{"parent", "vrf", "voting", "stateProof", "firstValid", "lastValid", "keyDilution"} + func TestParticipation_NewDB(t *testing.T) { partitiontest.PartitionTest(t) a := require.New(t) - rootDB, err := db.MakeAccessor(t.Name(), false, true) - a.NoError(err) - a.NotNil(rootDB) - root, err := GenerateRoot(rootDB) + _, rootDB, partDB, err := setupParticipationKey(t, a) a.NoError(err) - a.NotNil(root) + closeDBS(rootDB, partDB) +} - partDB, err := db.MakeAccessor(t.Name()+"_part", false, true) - a.NoError(err) - a.NotNil(partDB) +func setupParticipationKey(t *testing.T, a *require.Assertions) (PersistedParticipation, db.Accessor, db.Accessor, error) { + root, rootDB, partDB := createTestDBs(a, t.Name()) - part, err := FillDBWithParticipationKeys(partDB, root.Address(), 0, 0, config.Consensus[protocol.ConsensusCurrentVersion].DefaultKeyDilution) + part, err := FillDBWithParticipationKeys(partDB, root.Address(), 0, 3000, config.Consensus[protocol.ConsensusCurrentVersion].DefaultKeyDilution) a.NoError(err) a.NotNil(part) versions, err := getSchemaVersions(partDB) a.NoError(err) a.Equal(versions[PartTableSchemaName], PartTableSchemaVersion) + return part, rootDB, partDB, err +} + +func setupkeyWithNoDBS(t *testing.T, a *require.Assertions) PersistedParticipation { + part, rootDB, partDB, err := setupParticipationKey(t, a) + a.NoError(err) + a.NotNil(part) - partDB.Close() - rootDB.Close() + closeDBS(rootDB, partDB) + return part +} + +func createTestDBs(a *require.Assertions, name string) (Root, db.Accessor, db.Accessor) { + rootDB, err := db.MakeAccessor(name, false, true) + a.NoError(err) + a.NotNil(rootDB) + root, err := GenerateRoot(rootDB) + a.NoError(err) + a.NotNil(root) + + partDB, err := db.MakeAccessor(name+"_part", false, true) + a.NoError(err) + a.NotNil(partDB) + + return root, rootDB, partDB } func getSchemaVersions(db db.Accessor) (versions map[string]int, err error) { @@ -149,3 +174,383 @@ func BenchmarkOldKeysDeletion(b *testing.B) { } part.Close() } + +func TestRetrieveFromDB(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + part, rootDB, partDB, err := setupParticipationKey(t, a) + a.NoError(err) + defer closeDBS(rootDB, partDB) + + retrievedPart, err := RestoreParticipation(partDB) + a.NoError(err) + a.NotNil(retrievedPart) + + // comparing the outputs: + a.Equal(intoComparable(part), intoComparable(retrievedPart)) + +} + +func TestRetrieveFromDBAtVersion1(t *testing.T) { + partitiontest.PartitionTest(t) + + a := require.New(t) + ppart := setupkeyWithNoDBS(t, a) + _, rootDB, partDB := createTestDBs(a, t.Name()) + defer closeDBS(rootDB, partDB) + + part := ppart.Participation + a.NoError(setupTestDBAtVer1(partDB, part)) + + retrivedPart, err := RestoreParticipation(partDB) + a.NoError(err) + assertionForRestoringFromDBAtLowVersion(a, retrivedPart) + assertStateProofTablesExists(a, partDB) + + retrivedPart, err = RestoreParticipationWithSecrets(partDB) + a.NoError(err) + assertionForRestoringFromDBAtLowVersion(a, retrivedPart) + assertStateProofTablesExists(a, partDB) +} + +func TestRetrieveFromDBAtVersion2(t *testing.T) { + partitiontest.PartitionTest(t) + + a := require.New(t) + + ppart := setupkeyWithNoDBS(t, a) + _, rootDB, partDB := createTestDBs(a, t.Name()) + defer closeDBS(rootDB, partDB) + + part := ppart.Participation + a.NoError(setupTestDBAtVer2(partDB, part)) + + retrivedPart, err := RestoreParticipation(partDB) + a.NoError(err) + assertionForRestoringFromDBAtLowVersion(a, retrivedPart) + assertStateProofTablesExists(a, partDB) + versions, err := getSchemaVersions(partDB) + a.NoError(err) + a.Equal(versions[PartTableSchemaName], PartTableSchemaVersion) + + retrivedPart, err = RestoreParticipationWithSecrets(partDB) + a.NoError(err) + assertionForRestoringFromDBAtLowVersion(a, retrivedPart) + assertStateProofTablesExists(a, partDB) + versions, err = getSchemaVersions(partDB) + a.NoError(err) + a.Equal(versions[PartTableSchemaName], PartTableSchemaVersion) +} + +func TestKeyRegCreation(t *testing.T) { + partitiontest.PartitionTest(t) + + a := require.New(t) + + ppart := setupkeyWithNoDBS(t, a) + + txn := ppart.Participation.GenerateRegistrationTransaction(basics.MicroAlgos{Raw: 1000}, 0, 100, [32]byte{}, false) + a.Equal(txn.StateProofPK.IsEmpty(), true) + + txn = ppart.Participation.GenerateRegistrationTransaction(basics.MicroAlgos{Raw: 1000}, 0, 100, [32]byte{}, true) + a.Equal(txn.StateProofPK.IsEmpty(), false) +} + +func closeDBS(dbAccessor ...db.Accessor) { + for _, accessor := range dbAccessor { + accessor.Close() + } +} + +func assertStateProofTablesExists(a *require.Assertions, store db.Accessor) { + err := store.Atomic(func(ctx context.Context, tx *sql.Tx) error { + _, err := tx.Exec("select count(*) From StateProofKeys;") + return err + }) + a.NoError(err) + +} +func assertionForRestoringFromDBAtLowVersion(a *require.Assertions, retrivedPart PersistedParticipation) { + a.NotNil(retrivedPart) + a.Nil(retrivedPart.StateProofSecrets) +} + +func TestMigrateFromVersion1(t *testing.T) { + partitiontest.PartitionTest(t) + + a := require.New(t) + part := setupkeyWithNoDBS(t, a).Participation + + _, rootDB, partDB := createTestDBs(a, t.Name()) + defer closeDBS(rootDB, partDB) + + a.NoError(setupTestDBAtVer1(partDB, part)) + a.NoError(Migrate(partDB)) + + a.NoError(testDBContainsAllColumns(partDB)) +} + +func TestMigrationFromVersion2(t *testing.T) { + partitiontest.PartitionTest(t) + + a := require.New(t) + part := setupkeyWithNoDBS(t, a).Participation + + _, rootDB, partDB := createTestDBs(a, t.Name()) + defer closeDBS(rootDB, partDB) + + a.NoError(setupTestDBAtVer2(partDB, part)) + a.NoError(Migrate(partDB)) + + a.NoError(testDBContainsAllColumns(partDB)) +} + +func testDBContainsAllColumns(partDB db.Accessor) error { + return partDB.Atomic(func(ctx context.Context, tx *sql.Tx) error { + _, err := tx.Exec(fmt.Sprintf("select %v From ParticipationAccount;", + strings.Join(partableColumnNames[:], ","))) + return err + }) +} + +func setupTestDBAtVer2(partDB db.Accessor, part Participation) error { + rawVRF := protocol.Encode(part.VRF) + voting := part.Voting.Snapshot() + rawVoting := protocol.Encode(&voting) + + return partDB.Atomic(func(ctx context.Context, tx *sql.Tx) error { + //set up an actual DB.. + _, err := tx.Exec(`CREATE TABLE ParticipationAccount ( + parent BLOB, + + vrf BLOB, + voting BLOB, + + firstValid INTEGER, + lastValid INTEGER, + + keyDilution INTEGER NOT NULL DEFAULT 0 + );`) + if err != nil { + return nil + } + + if err := setupSchemaForTest(tx, 2); err != nil { + return err + } + _, err = tx.Exec("INSERT INTO ParticipationAccount (parent, vrf, voting, firstValid, lastValid, keyDilution) VALUES (?, ?, ?, ?, ?, ?)", + part.Parent[:], rawVRF, rawVoting, part.FirstValid, part.LastValid, part.KeyDilution) + if err != nil { + return err + } + return nil + }) +} + +func setupSchemaForTest(tx *sql.Tx, version int) error { + _, err := tx.Exec(`CREATE TABLE schema (tablename TEXT PRIMARY KEY, version INTEGER);`) + if err != nil { + return nil + } + + _, err = tx.Exec("INSERT INTO schema (tablename, version) VALUES (?, ?)", PartTableSchemaName, version) + if err != nil { + return nil + } + return err +} + +func setupTestDBAtVer1(partDB db.Accessor, part Participation) error { + rawVRF := protocol.Encode(part.VRF) + voting := part.Voting.Snapshot() + rawVoting := protocol.Encode(&voting) + + return partDB.Atomic(func(ctx context.Context, tx *sql.Tx) error { + //set up an actual DB.. + _, err := tx.Exec(`CREATE TABLE ParticipationAccount ( + parent BLOB, + + vrf BLOB, + voting BLOB, + + firstValid INTEGER, + lastValid INTEGER + );`) + if err != nil { + return err + } + + if err := setupSchemaForTest(tx, 1); err != nil { + return err + } + _, err = tx.Exec("INSERT INTO ParticipationAccount (parent, vrf, voting, firstValid, lastValid) VALUES (?, ?, ?, ?, ?)", + part.Parent[:], rawVRF, rawVoting, part.FirstValid, part.LastValid) + if err != nil { + return err + } + return nil + }) +} + +type comparablePartition struct { + Parent basics.Address + + VRF crypto.VRFSecrets + Voting []byte + statProofSecrets []byte + + FirstValid basics.Round + LastValid basics.Round + + KeyDilution uint64 +} + +func intoComparable(part PersistedParticipation) comparablePartition { + return comparablePartition{ + Parent: part.Parent, + VRF: *part.VRF, + Voting: part.Voting.MarshalMsg(nil), + statProofSecrets: protocol.Encode(part.StateProofSecrets), + FirstValid: part.FirstValid, + LastValid: part.LastValid, + KeyDilution: part.KeyDilution, + } +} + +func BenchmarkFillDB(b *testing.B) { + a := require.New(b) + root, _, partDB := createTestDBs(a, b.Name()+strconv.Itoa(b.N)) + + tmp := config.Consensus[protocol.ConsensusCurrentVersion] + cpy := config.Consensus[protocol.ConsensusCurrentVersion] + cpy.CompactCertRounds = 256 + config.Consensus[protocol.ConsensusCurrentVersion] = cpy + defer func() { config.Consensus[protocol.ConsensusCurrentVersion] = tmp }() + + for i := 0; i < b.N; i++ { + _, err := FillDBWithParticipationKeys(partDB, root.Address(), 0, 3000000, config.Consensus[protocol.ConsensusCurrentVersion].DefaultKeyDilution) + b.StopTimer() + a.NoError(err) + + a.NoError(dropTables(partDB)) + b.StartTimer() + } +} + +func dropTables(partDB db.Accessor) error { + return partDB.Atomic(func(ctx context.Context, tx *sql.Tx) error { + _, err := tx.Exec("DROP TABLE ParticipationAccount;") + if err != nil { + return err + } + _, err = tx.Exec("DROP TABLE schema;") + return err + }) +} + +func BenchmarkParticipationKeyRestoration(b *testing.B) { + a := require.New(b) + + var rootAddr basics.Address + crypto.RandBytes(rootAddr[:]) + + dbname := b.Name() + "_part" + defer os.Remove(dbname) + + partDB, err := db.MakeErasableAccessor(dbname) + a.NoError(err) + + part, err := FillDBWithParticipationKeys(partDB, rootAddr, 0, 3000000, config.Consensus[protocol.ConsensusCurrentVersion].DefaultKeyDilution) + a.NoError(err) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + out, err := RestoreParticipation(partDB) + a.NoError(err) + + b.StopTimer() + a.Equal(intoComparable(part), intoComparable(out)) + b.StartTimer() + } + part.Close() +} + +func createMerkleSignatureSchemeTestDB(a *require.Assertions) *db.Accessor { + tmpname := uuid.NewV4().String() // could this just be a constant string instead? does it even matter? + store, err := db.MakeAccessor(tmpname, false, true) + a.NoError(err) + a.NotNil(store) + + return &store +} + +func TestKeyregValidityOverLimit(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + maxValidPeriod := config.Consensus[protocol.ConsensusCurrentVersion].MaxKeyregValidPeriod + dilution := config.Consensus[protocol.ConsensusCurrentVersion].DefaultKeyDilution + + var address basics.Address + crypto.RandBytes(address[:]) + + store := createMerkleSignatureSchemeTestDB(a) + defer store.Close() + firstValid := basics.Round(0) + lastValid := basics.Round(maxValidPeriod + 1) + _, err := FillDBWithParticipationKeys(*store, address, firstValid, lastValid, dilution) + a.Error(err) +} + +func TestFillDBWithParticipationKeys(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + dilution := config.Consensus[protocol.ConsensusCurrentVersion].DefaultKeyDilution + + var address basics.Address + crypto.RandBytes(address[:]) + + store := createMerkleSignatureSchemeTestDB(a) + defer store.Close() + firstValid := basics.Round(0) + lastValid := basics.Round(10000) + _, err := FillDBWithParticipationKeys(*store, address, firstValid, lastValid, dilution) + a.NoError(err) +} + +func TestKeyregValidityPeriod(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + // Patch the global consensus variable since FillDBWithParticipationKeys uses is to check the validity period + // this allows us to reduce the runtime of the test while checking the logic of FillDBWithParticipationKeys + version := config.Consensus[protocol.ConsensusCurrentVersion] + oldValue := config.Consensus[protocol.ConsensusCurrentVersion].MaxKeyregValidPeriod + version.MaxKeyregValidPeriod = 256*(1<<4) - 1 + config.Consensus[protocol.ConsensusCurrentVersion] = version + defer func() { + version.MaxKeyregValidPeriod = oldValue + config.Consensus[protocol.ConsensusCurrentVersion] = version + }() + + maxValidPeriod := config.Consensus[protocol.ConsensusCurrentVersion].MaxKeyregValidPeriod + dilution := config.Consensus[protocol.ConsensusCurrentVersion].DefaultKeyDilution + + var address basics.Address + + store := createMerkleSignatureSchemeTestDB(a) + defer store.Close() + firstValid := basics.Round(0) + lastValid := basics.Round(maxValidPeriod) + crypto.RandBytes(address[:]) + _, err := FillDBWithParticipationKeys(*store, address, firstValid, lastValid, dilution) + a.NoError(err) + + store = createMerkleSignatureSchemeTestDB(a) + defer store.Close() + firstValid = basics.Round(0) + lastValid = basics.Round(maxValidPeriod + 1) + _, err = FillDBWithParticipationKeys(*store, address, firstValid, lastValid, dilution) + a.Error(err) +} diff --git a/data/account/rootInstall.go b/data/account/rootInstall.go index 7070712d92..4bf9a73e29 100644 --- a/data/account/rootInstall.go +++ b/data/account/rootInstall.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/accountManager.go b/data/accountManager.go index b615a211f2..50e3408735 100644 --- a/data/accountManager.go +++ b/data/accountManager.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -56,42 +56,40 @@ func MakeAccountManager(log logging.Logger, registry account.ParticipationRegist return manager } -// Keys returns a list of Participation accounts. -func (manager *AccountManager) Keys(rnd basics.Round) (out []account.Participation) { +// Keys returns a list of Participation accounts, and their keys/secrets for requested round. +func (manager *AccountManager) Keys(rnd basics.Round) (out []account.ParticipationRecordForRound) { manager.mu.Lock() defer manager.mu.Unlock() - for _, part := range manager.partKeys { + for _, part := range manager.registry.GetAll() { if part.OverlapsInterval(rnd, rnd) { - out = append(out, part.Participation) + partRndSecrets, err := manager.registry.GetForRound(part.ParticipationID, rnd) + if err != nil { + manager.log.Warnf("error while loading round secrets from participation registry: %w", err) + continue + } + out = append(out, partRndSecrets) } } return out +} - // PKI TODO: source keys from the registry. - // This kinda works, but voting keys are not updated. - /* - for _, record := range manager.registry.GetAll() { - part := account.Participation{ - Parent: record.Account, - VRF: record.VRF, - Voting: record.Voting, - FirstValid: record.FirstValid, - LastValid: record.LastValid, - KeyDilution: record.KeyDilution, - } - - if part.OverlapsInterval(rnd, rnd) { - out = append(out, part) +// StateProofKeys returns a list of Participation accounts, and their stateproof secrets +func (manager *AccountManager) StateProofKeys(rnd basics.Round) (out []account.StateProofRecordForRound) { + manager.mu.Lock() + defer manager.mu.Unlock() - id := part.ID() - if !bytes.Equal(id[:], record.ParticipationID[:]) { - manager.log.Warnf("Participation IDs do not equal while fetching keys... %s != %s\n", id, record.ParticipationID) - } + for _, part := range manager.registry.GetAll() { + if part.OverlapsInterval(rnd, rnd) { + partRndSecrets, err := manager.registry.GetStateProofForRound(part.ParticipationID, rnd) + if err != nil { + manager.log.Warnf("error while loading round secrets from participation registry: %w", err) + continue } + out = append(out, partRndSecrets) } - return out - */ + } + return out } // HasLiveKeys returns true if we have any Participation @@ -100,7 +98,7 @@ func (manager *AccountManager) HasLiveKeys(from, to basics.Round) bool { manager.mu.Lock() defer manager.mu.Unlock() - for _, part := range manager.partKeys { + for _, part := range manager.registry.GetAll() { if part.OverlapsInterval(from, to) { return true } diff --git a/data/basics/address.go b/data/basics/address.go index 835832b385..5eed1c5121 100644 --- a/data/basics/address.go +++ b/data/basics/address.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -24,6 +24,23 @@ import ( "github.com/algorand/go-algorand/crypto" ) +// NOTE: Another (partial) implementation of `basics.Address` is in `data/abi`. +// The reason of not using this `Address` in `data/abi` is that: +// - `data/basics` has C dependencies (`go-algorand/crypto`) +// - `go-algorand-sdk` has dependency to `go-algorand` for `ABI` +// - if `go-algorand`'s ABI uses `basics.Address`, then it would be +// impossible to up the version of `go-algorand` in `go-algorand-sdk` + +// This is discussed in: +// - ISSUE https://github.com/algorand/go-algorand/issues/3355 +// - PR https://github.com/algorand/go-algorand/pull/3375 + +// There are two solutions: +// - One is to refactoring `crypto.Digest`, `crypto.Hash` and `basics.Address` +// into packages that does not need `libsodium` crypto dependency +// - The other is wrapping `libsodium` in a driver interface to make crypto +// package importable (even if `libsodium` does not exist) + type ( // Address is a unique identifier corresponding to ownership of money Address crypto.Digest diff --git a/data/basics/address_test.go b/data/basics/address_test.go index f99f3392d9..eac7f09e5d 100644 --- a/data/basics/address_test.go +++ b/data/basics/address_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/basics/ccertpart.go b/data/basics/ccertpart.go index 097cb6c270..481f607c58 100644 --- a/data/basics/ccertpart.go +++ b/data/basics/ccertpart.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -17,10 +17,19 @@ package basics import ( + "encoding/binary" + "fmt" + "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/crypto/merklesignature" "github.com/algorand/go-algorand/protocol" ) +const ( + // ErrIndexOutOfBound returned when an index is out of the array's bound + ErrIndexOutOfBound = "pos %d past end %d" +) + // A Participant corresponds to an account whose AccountData.Status // is Online, and for which the expected sigRound satisfies // AccountData.VoteFirstValid <= sigRound <= AccountData.VoteLastValid. @@ -33,18 +42,46 @@ import ( type Participant struct { _struct struct{} `codec:",omitempty,omitemptyarray"` - // PK is AccountData.VoteID. - PK crypto.OneTimeSignatureVerifier `codec:"p"` + // PK is the identifier used to verify the signature for a specific participant + PK merklesignature.Verifier `codec:"p"` // Weight is AccountData.MicroAlgos. Weight uint64 `codec:"w"` - - // KeyDilution is AccountData.KeyDilution() with the protocol for sigRound - // as expected by the Builder. - KeyDilution uint64 `codec:"d"` } // ToBeHashed implements the crypto.Hashable interface. +// In order to create a more SNARK-friendly commitments on the signature we must avoid using the msgpack infrastructure. +// msgpack creates a compressed representation of the struct which might be varied in length, which will +// be bad for creating SNARK func (p Participant) ToBeHashed() (protocol.HashID, []byte) { - return protocol.CompactCertPart, protocol.Encode(&p) + + weightAsBytes := make([]byte, 8) + binary.LittleEndian.PutUint64(weightAsBytes, p.Weight) + + publicKeyBytes := p.PK + + partCommitment := make([]byte, 0, len(weightAsBytes)+len(publicKeyBytes)) + partCommitment = append(partCommitment, weightAsBytes...) + partCommitment = append(partCommitment, publicKeyBytes[:]...) + + return protocol.CompactCertPart, partCommitment +} + +// ParticipantsArray implements merklearray.Array and is used to commit +// to a Merkle tree of online accounts. +//msgp:ignore ParticipantsArray +type ParticipantsArray []Participant + +// Length returns the ledger of the array. +func (p ParticipantsArray) Length() uint64 { + return uint64(len(p)) +} + +// Marshal Returns the hash for the given position. +func (p ParticipantsArray) Marshal(pos uint64) (crypto.Hashable, error) { + if pos >= uint64(len(p)) { + return nil, fmt.Errorf(ErrIndexOutOfBound, pos, len(p)) + } + + return p[pos], nil } diff --git a/data/basics/fields_test.go b/data/basics/fields_test.go index 8027fa29ab..2fcabbd4d0 100644 --- a/data/basics/fields_test.go +++ b/data/basics/fields_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/basics/msgp_gen.go b/data/basics/msgp_gen.go index f76a37db54..f16d67caf6 100644 --- a/data/basics/msgp_gen.go +++ b/data/basics/msgp_gen.go @@ -200,8 +200,8 @@ import ( func (z *AccountData) MarshalMsg(b []byte) (o []byte) { o = msgp.Require(b, z.Msgsize()) // omitempty: check for empty values - zb0009Len := uint32(16) - var zb0009Mask uint32 /* 17 bits */ + zb0009Len := uint32(17) + var zb0009Mask uint32 /* 18 bits */ if (*z).MicroAlgos.MsgIsZero() { zb0009Len-- zb0009Mask |= 0x2 @@ -242,30 +242,34 @@ func (z *AccountData) MarshalMsg(b []byte) (o []byte) { zb0009Len-- zb0009Mask |= 0x400 } - if (*z).TotalExtraAppPages == 0 { + if (*z).StateProofID.MsgIsZero() { zb0009Len-- zb0009Mask |= 0x800 } - if ((*z).TotalAppSchema.NumUint == 0) && ((*z).TotalAppSchema.NumByteSlice == 0) { + if (*z).TotalExtraAppPages == 0 { zb0009Len-- zb0009Mask |= 0x1000 } - if (*z).VoteID.MsgIsZero() { + if ((*z).TotalAppSchema.NumUint == 0) && ((*z).TotalAppSchema.NumByteSlice == 0) { zb0009Len-- zb0009Mask |= 0x2000 } - if (*z).VoteFirstValid == 0 { + if (*z).VoteID.MsgIsZero() { zb0009Len-- zb0009Mask |= 0x4000 } - if (*z).VoteKeyDilution == 0 { + if (*z).VoteFirstValid == 0 { zb0009Len-- zb0009Mask |= 0x8000 } - if (*z).VoteLastValid == 0 { + if (*z).VoteKeyDilution == 0 { zb0009Len-- zb0009Mask |= 0x10000 } + if (*z).VoteLastValid == 0 { + zb0009Len-- + zb0009Mask |= 0x20000 + } // variable map header, size zb0009Len o = msgp.AppendMapHeader(o, zb0009Len) if zb0009Len != 0 { @@ -404,11 +408,16 @@ func (z *AccountData) MarshalMsg(b []byte) (o []byte) { o = (*z).AuthAddr.MarshalMsg(o) } if (zb0009Mask & 0x800) == 0 { // if not empty + // string "stprf" + o = append(o, 0xa5, 0x73, 0x74, 0x70, 0x72, 0x66) + o = (*z).StateProofID.MarshalMsg(o) + } + if (zb0009Mask & 0x1000) == 0 { // if not empty // string "teap" o = append(o, 0xa4, 0x74, 0x65, 0x61, 0x70) o = msgp.AppendUint32(o, (*z).TotalExtraAppPages) } - if (zb0009Mask & 0x1000) == 0 { // if not empty + if (zb0009Mask & 0x2000) == 0 { // if not empty // string "tsch" o = append(o, 0xa4, 0x74, 0x73, 0x63, 0x68) // omitempty: check for empty values @@ -435,22 +444,22 @@ func (z *AccountData) MarshalMsg(b []byte) (o []byte) { o = msgp.AppendUint64(o, (*z).TotalAppSchema.NumUint) } } - if (zb0009Mask & 0x2000) == 0 { // if not empty + if (zb0009Mask & 0x4000) == 0 { // if not empty // string "vote" o = append(o, 0xa4, 0x76, 0x6f, 0x74, 0x65) o = (*z).VoteID.MarshalMsg(o) } - if (zb0009Mask & 0x4000) == 0 { // if not empty + if (zb0009Mask & 0x8000) == 0 { // if not empty // string "voteFst" o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x46, 0x73, 0x74) o = msgp.AppendUint64(o, uint64((*z).VoteFirstValid)) } - if (zb0009Mask & 0x8000) == 0 { // if not empty + if (zb0009Mask & 0x10000) == 0 { // if not empty // string "voteKD" o = append(o, 0xa6, 0x76, 0x6f, 0x74, 0x65, 0x4b, 0x44) o = msgp.AppendUint64(o, (*z).VoteKeyDilution) } - if (zb0009Mask & 0x10000) == 0 { // if not empty + if (zb0009Mask & 0x20000) == 0 { // if not empty // string "voteLst" o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x4c, 0x73, 0x74) o = msgp.AppendUint64(o, uint64((*z).VoteLastValid)) @@ -529,6 +538,14 @@ func (z *AccountData) UnmarshalMsg(bts []byte) (o []byte, err error) { return } } + if zb0009 > 0 { + zb0009-- + bts, err = (*z).StateProofID.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "StateProofID") + return + } + } if zb0009 > 0 { zb0009-- { @@ -920,6 +937,12 @@ func (z *AccountData) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "SelectionID") return } + case "stprf": + bts, err = (*z).StateProofID.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "StateProofID") + return + } case "voteFst": { var zb0027 uint64 @@ -1248,7 +1271,7 @@ func (_ *AccountData) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *AccountData) Msgsize() (s int) { - s = 3 + 4 + msgp.ByteSize + 5 + (*z).MicroAlgos.Msgsize() + 6 + msgp.Uint64Size + 4 + (*z).RewardedMicroAlgos.Msgsize() + 5 + (*z).VoteID.Msgsize() + 4 + (*z).SelectionID.Msgsize() + 8 + msgp.Uint64Size + 8 + msgp.Uint64Size + 7 + msgp.Uint64Size + 5 + msgp.MapHeaderSize + s = 3 + 4 + msgp.ByteSize + 5 + (*z).MicroAlgos.Msgsize() + 6 + msgp.Uint64Size + 4 + (*z).RewardedMicroAlgos.Msgsize() + 5 + (*z).VoteID.Msgsize() + 4 + (*z).SelectionID.Msgsize() + 6 + (*z).StateProofID.Msgsize() + 8 + msgp.Uint64Size + 8 + msgp.Uint64Size + 7 + msgp.Uint64Size + 5 + msgp.MapHeaderSize if (*z).AssetParams != nil { for zb0001, zb0002 := range (*z).AssetParams { _ = zb0001 @@ -1286,7 +1309,7 @@ func (z *AccountData) Msgsize() (s int) { // MsgIsZero returns whether this is a zero value func (z *AccountData) MsgIsZero() bool { - return ((*z).Status == 0) && ((*z).MicroAlgos.MsgIsZero()) && ((*z).RewardsBase == 0) && ((*z).RewardedMicroAlgos.MsgIsZero()) && ((*z).VoteID.MsgIsZero()) && ((*z).SelectionID.MsgIsZero()) && ((*z).VoteFirstValid == 0) && ((*z).VoteLastValid == 0) && ((*z).VoteKeyDilution == 0) && (len((*z).AssetParams) == 0) && (len((*z).Assets) == 0) && ((*z).AuthAddr.MsgIsZero()) && (len((*z).AppLocalStates) == 0) && (len((*z).AppParams) == 0) && (((*z).TotalAppSchema.NumUint == 0) && ((*z).TotalAppSchema.NumByteSlice == 0)) && ((*z).TotalExtraAppPages == 0) + return ((*z).Status == 0) && ((*z).MicroAlgos.MsgIsZero()) && ((*z).RewardsBase == 0) && ((*z).RewardedMicroAlgos.MsgIsZero()) && ((*z).VoteID.MsgIsZero()) && ((*z).SelectionID.MsgIsZero()) && ((*z).StateProofID.MsgIsZero()) && ((*z).VoteFirstValid == 0) && ((*z).VoteLastValid == 0) && ((*z).VoteKeyDilution == 0) && (len((*z).AssetParams) == 0) && (len((*z).Assets) == 0) && ((*z).AuthAddr.MsgIsZero()) && (len((*z).AppLocalStates) == 0) && (len((*z).AppParams) == 0) && (((*z).TotalAppSchema.NumUint == 0) && ((*z).TotalAppSchema.NumByteSlice == 0)) && ((*z).TotalExtraAppPages == 0) } // MarshalMsg implements msgp.Marshaler @@ -2875,8 +2898,8 @@ func (z *AssetParams) MsgIsZero() bool { func (z *BalanceRecord) MarshalMsg(b []byte) (o []byte) { o = msgp.Require(b, z.Msgsize()) // omitempty: check for empty values - zb0009Len := uint32(17) - var zb0009Mask uint32 /* 19 bits */ + zb0009Len := uint32(18) + var zb0009Mask uint32 /* 20 bits */ if (*z).Addr.MsgIsZero() { zb0009Len-- zb0009Mask |= 0x4 @@ -2921,30 +2944,34 @@ func (z *BalanceRecord) MarshalMsg(b []byte) (o []byte) { zb0009Len-- zb0009Mask |= 0x1000 } - if (*z).AccountData.TotalExtraAppPages == 0 { + if (*z).AccountData.StateProofID.MsgIsZero() { zb0009Len-- zb0009Mask |= 0x2000 } - if ((*z).AccountData.TotalAppSchema.NumUint == 0) && ((*z).AccountData.TotalAppSchema.NumByteSlice == 0) { + if (*z).AccountData.TotalExtraAppPages == 0 { zb0009Len-- zb0009Mask |= 0x4000 } - if (*z).AccountData.VoteID.MsgIsZero() { + if ((*z).AccountData.TotalAppSchema.NumUint == 0) && ((*z).AccountData.TotalAppSchema.NumByteSlice == 0) { zb0009Len-- zb0009Mask |= 0x8000 } - if (*z).AccountData.VoteFirstValid == 0 { + if (*z).AccountData.VoteID.MsgIsZero() { zb0009Len-- zb0009Mask |= 0x10000 } - if (*z).AccountData.VoteKeyDilution == 0 { + if (*z).AccountData.VoteFirstValid == 0 { zb0009Len-- zb0009Mask |= 0x20000 } - if (*z).AccountData.VoteLastValid == 0 { + if (*z).AccountData.VoteKeyDilution == 0 { zb0009Len-- zb0009Mask |= 0x40000 } + if (*z).AccountData.VoteLastValid == 0 { + zb0009Len-- + zb0009Mask |= 0x80000 + } // variable map header, size zb0009Len o = msgp.AppendMapHeader(o, zb0009Len) if zb0009Len != 0 { @@ -3088,11 +3115,16 @@ func (z *BalanceRecord) MarshalMsg(b []byte) (o []byte) { o = (*z).AccountData.AuthAddr.MarshalMsg(o) } if (zb0009Mask & 0x2000) == 0 { // if not empty + // string "stprf" + o = append(o, 0xa5, 0x73, 0x74, 0x70, 0x72, 0x66) + o = (*z).AccountData.StateProofID.MarshalMsg(o) + } + if (zb0009Mask & 0x4000) == 0 { // if not empty // string "teap" o = append(o, 0xa4, 0x74, 0x65, 0x61, 0x70) o = msgp.AppendUint32(o, (*z).AccountData.TotalExtraAppPages) } - if (zb0009Mask & 0x4000) == 0 { // if not empty + if (zb0009Mask & 0x8000) == 0 { // if not empty // string "tsch" o = append(o, 0xa4, 0x74, 0x73, 0x63, 0x68) // omitempty: check for empty values @@ -3119,22 +3151,22 @@ func (z *BalanceRecord) MarshalMsg(b []byte) (o []byte) { o = msgp.AppendUint64(o, (*z).AccountData.TotalAppSchema.NumUint) } } - if (zb0009Mask & 0x8000) == 0 { // if not empty + if (zb0009Mask & 0x10000) == 0 { // if not empty // string "vote" o = append(o, 0xa4, 0x76, 0x6f, 0x74, 0x65) o = (*z).AccountData.VoteID.MarshalMsg(o) } - if (zb0009Mask & 0x10000) == 0 { // if not empty + if (zb0009Mask & 0x20000) == 0 { // if not empty // string "voteFst" o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x46, 0x73, 0x74) o = msgp.AppendUint64(o, uint64((*z).AccountData.VoteFirstValid)) } - if (zb0009Mask & 0x20000) == 0 { // if not empty + if (zb0009Mask & 0x40000) == 0 { // if not empty // string "voteKD" o = append(o, 0xa6, 0x76, 0x6f, 0x74, 0x65, 0x4b, 0x44) o = msgp.AppendUint64(o, (*z).AccountData.VoteKeyDilution) } - if (zb0009Mask & 0x40000) == 0 { // if not empty + if (zb0009Mask & 0x80000) == 0 { // if not empty // string "voteLst" o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x4c, 0x73, 0x74) o = msgp.AppendUint64(o, uint64((*z).AccountData.VoteLastValid)) @@ -3221,6 +3253,14 @@ func (z *BalanceRecord) UnmarshalMsg(bts []byte) (o []byte, err error) { return } } + if zb0009 > 0 { + zb0009-- + bts, err = (*z).AccountData.StateProofID.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "StateProofID") + return + } + } if zb0009 > 0 { zb0009-- { @@ -3618,6 +3658,12 @@ func (z *BalanceRecord) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "SelectionID") return } + case "stprf": + bts, err = (*z).AccountData.StateProofID.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "StateProofID") + return + } case "voteFst": { var zb0027 uint64 @@ -3946,7 +3992,7 @@ func (_ *BalanceRecord) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *BalanceRecord) Msgsize() (s int) { - s = 3 + 5 + (*z).Addr.Msgsize() + 4 + msgp.ByteSize + 5 + (*z).AccountData.MicroAlgos.Msgsize() + 6 + msgp.Uint64Size + 4 + (*z).AccountData.RewardedMicroAlgos.Msgsize() + 5 + (*z).AccountData.VoteID.Msgsize() + 4 + (*z).AccountData.SelectionID.Msgsize() + 8 + msgp.Uint64Size + 8 + msgp.Uint64Size + 7 + msgp.Uint64Size + 5 + msgp.MapHeaderSize + s = 3 + 5 + (*z).Addr.Msgsize() + 4 + msgp.ByteSize + 5 + (*z).AccountData.MicroAlgos.Msgsize() + 6 + msgp.Uint64Size + 4 + (*z).AccountData.RewardedMicroAlgos.Msgsize() + 5 + (*z).AccountData.VoteID.Msgsize() + 4 + (*z).AccountData.SelectionID.Msgsize() + 6 + (*z).AccountData.StateProofID.Msgsize() + 8 + msgp.Uint64Size + 8 + msgp.Uint64Size + 7 + msgp.Uint64Size + 5 + msgp.MapHeaderSize if (*z).AccountData.AssetParams != nil { for zb0001, zb0002 := range (*z).AccountData.AssetParams { _ = zb0001 @@ -3984,7 +4030,7 @@ func (z *BalanceRecord) Msgsize() (s int) { // MsgIsZero returns whether this is a zero value func (z *BalanceRecord) MsgIsZero() bool { - return ((*z).Addr.MsgIsZero()) && ((*z).AccountData.Status == 0) && ((*z).AccountData.MicroAlgos.MsgIsZero()) && ((*z).AccountData.RewardsBase == 0) && ((*z).AccountData.RewardedMicroAlgos.MsgIsZero()) && ((*z).AccountData.VoteID.MsgIsZero()) && ((*z).AccountData.SelectionID.MsgIsZero()) && ((*z).AccountData.VoteFirstValid == 0) && ((*z).AccountData.VoteLastValid == 0) && ((*z).AccountData.VoteKeyDilution == 0) && (len((*z).AccountData.AssetParams) == 0) && (len((*z).AccountData.Assets) == 0) && ((*z).AccountData.AuthAddr.MsgIsZero()) && (len((*z).AccountData.AppLocalStates) == 0) && (len((*z).AccountData.AppParams) == 0) && (((*z).AccountData.TotalAppSchema.NumUint == 0) && ((*z).AccountData.TotalAppSchema.NumByteSlice == 0)) && ((*z).AccountData.TotalExtraAppPages == 0) + return ((*z).Addr.MsgIsZero()) && ((*z).AccountData.Status == 0) && ((*z).AccountData.MicroAlgos.MsgIsZero()) && ((*z).AccountData.RewardsBase == 0) && ((*z).AccountData.RewardedMicroAlgos.MsgIsZero()) && ((*z).AccountData.VoteID.MsgIsZero()) && ((*z).AccountData.SelectionID.MsgIsZero()) && ((*z).AccountData.StateProofID.MsgIsZero()) && ((*z).AccountData.VoteFirstValid == 0) && ((*z).AccountData.VoteLastValid == 0) && ((*z).AccountData.VoteKeyDilution == 0) && (len((*z).AccountData.AssetParams) == 0) && (len((*z).AccountData.Assets) == 0) && ((*z).AccountData.AuthAddr.MsgIsZero()) && (len((*z).AccountData.AppLocalStates) == 0) && (len((*z).AccountData.AppParams) == 0) && (((*z).AccountData.TotalAppSchema.NumUint == 0) && ((*z).AccountData.TotalAppSchema.NumByteSlice == 0)) && ((*z).AccountData.TotalExtraAppPages == 0) } // MarshalMsg implements msgp.Marshaler @@ -4129,34 +4175,25 @@ func (z DeltaAction) MsgIsZero() bool { func (z *Participant) MarshalMsg(b []byte) (o []byte) { o = msgp.Require(b, z.Msgsize()) // omitempty: check for empty values - zb0001Len := uint32(3) - var zb0001Mask uint8 /* 4 bits */ - if (*z).KeyDilution == 0 { - zb0001Len-- - zb0001Mask |= 0x2 - } + zb0001Len := uint32(2) + var zb0001Mask uint8 /* 3 bits */ if (*z).PK.MsgIsZero() { zb0001Len-- - zb0001Mask |= 0x4 + zb0001Mask |= 0x2 } if (*z).Weight == 0 { zb0001Len-- - zb0001Mask |= 0x8 + zb0001Mask |= 0x4 } // variable map header, size zb0001Len o = append(o, 0x80|uint8(zb0001Len)) if zb0001Len != 0 { if (zb0001Mask & 0x2) == 0 { // if not empty - // string "d" - o = append(o, 0xa1, 0x64) - o = msgp.AppendUint64(o, (*z).KeyDilution) - } - if (zb0001Mask & 0x4) == 0 { // if not empty // string "p" o = append(o, 0xa1, 0x70) o = (*z).PK.MarshalMsg(o) } - if (zb0001Mask & 0x8) == 0 { // if not empty + if (zb0001Mask & 0x4) == 0 { // if not empty // string "w" o = append(o, 0xa1, 0x77) o = msgp.AppendUint64(o, (*z).Weight) @@ -4199,14 +4236,6 @@ func (z *Participant) UnmarshalMsg(bts []byte) (o []byte, err error) { return } } - if zb0001 > 0 { - zb0001-- - (*z).KeyDilution, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "KeyDilution") - return - } - } if zb0001 > 0 { err = msgp.ErrTooManyArrayFields(zb0001) if err != nil { @@ -4242,12 +4271,6 @@ func (z *Participant) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "Weight") return } - case "d": - (*z).KeyDilution, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "KeyDilution") - return - } default: err = msgp.ErrNoField(string(field)) if err != nil { @@ -4268,13 +4291,13 @@ func (_ *Participant) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *Participant) Msgsize() (s int) { - s = 1 + 2 + (*z).PK.Msgsize() + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + s = 1 + 2 + (*z).PK.Msgsize() + 2 + msgp.Uint64Size return } // MsgIsZero returns whether this is a zero value func (z *Participant) MsgIsZero() bool { - return ((*z).PK.MsgIsZero()) && ((*z).Weight == 0) && ((*z).KeyDilution == 0) + return ((*z).PK.MsgIsZero()) && ((*z).Weight == 0) } // MarshalMsg implements msgp.Marshaler diff --git a/data/basics/overflow.go b/data/basics/overflow.go index 7a2a3df8b1..b842dc4143 100644 --- a/data/basics/overflow.go +++ b/data/basics/overflow.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/basics/sort.go b/data/basics/sort.go index e35f664453..6841a67885 100644 --- a/data/basics/sort.go +++ b/data/basics/sort.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/basics/teal.go b/data/basics/teal.go index 6fe1ce7c47..1aaac047fb 100644 --- a/data/basics/teal.go +++ b/data/basics/teal.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/basics/teal_test.go b/data/basics/teal_test.go index 35aa9a193f..9090379d67 100644 --- a/data/basics/teal_test.go +++ b/data/basics/teal_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/basics/units.go b/data/basics/units.go index 9f92429e95..c96b082333 100644 --- a/data/basics/units.go +++ b/data/basics/units.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/basics/units_test.go b/data/basics/units_test.go index 07455d13b8..efc9bd72cb 100644 --- a/data/basics/units_test.go +++ b/data/basics/units_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/basics/userBalance.go b/data/basics/userBalance.go index a619438d30..f47f80ef67 100644 --- a/data/basics/userBalance.go +++ b/data/basics/userBalance.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -23,6 +23,7 @@ import ( "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/crypto/merklesignature" "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/protocol" ) @@ -160,8 +161,9 @@ type AccountData struct { // the past week". RewardedMicroAlgos MicroAlgos `codec:"ern"` - VoteID crypto.OneTimeSignatureVerifier `codec:"vote"` - SelectionID crypto.VRFVerifier `codec:"sel"` + VoteID crypto.OneTimeSignatureVerifier `codec:"vote"` + SelectionID crypto.VRFVerifier `codec:"sel"` + StateProofID merklesignature.Verifier `codec:"stprf"` VoteFirstValid Round `codec:"voteFst"` VoteLastValid Round `codec:"voteLst"` @@ -418,6 +420,7 @@ func (u *AccountData) ClearOnlineState() { u.VoteKeyDilution = 0 u.VoteID = crypto.OneTimeSignatureVerifier{} u.SelectionID = crypto.VRFVerifier{} + u.StateProofID = merklesignature.Verifier{} } // Money returns the amount of MicroAlgos associated with the user's account @@ -449,7 +452,7 @@ func (u AccountData) WithUpdatedRewards(proto config.ConsensusParams, rewardsLev u.RewardsBase = rewardsLevel // The total reward over the lifetime of the account could exceed a 64-bit value. As a result // this rewardAlgos counter could potentially roll over. - u.RewardedMicroAlgos = MicroAlgos{Raw: (u.RewardedMicroAlgos.Raw + rewards.Raw)} + u.RewardedMicroAlgos = MicroAlgos{Raw: u.RewardedMicroAlgos.Raw + rewards.Raw} } return u diff --git a/data/basics/userBalance_test.go b/data/basics/userBalance_test.go index 04a770d92f..c5bb661e57 100644 --- a/data/basics/userBalance_test.go +++ b/data/basics/userBalance_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/bookkeeping/block.go b/data/bookkeeping/block.go index bb9ae321b8..1e4b1393e6 100644 --- a/data/bookkeeping/block.go +++ b/data/bookkeeping/block.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -214,7 +214,7 @@ type ( // are a multiple of ConsensusParams.CompactCertRounds. For blocks // that are not a multiple of ConsensusParams.CompactCertRounds, // this value is zero. - CompactCertVoters crypto.Digest `codec:"v"` + CompactCertVoters crypto.GenericDigest `codec:"v"` // CompactCertVotersTotal is the total number of microalgos held by // the accounts in CompactCertVoters (or zero, if the merkle root is @@ -285,17 +285,17 @@ func (block *Block) Seed() committee.Seed { // NextRewardsState computes the RewardsState of the subsequent round // given the subsequent consensus parameters, along with the incentive pool // balance and the total reward units in the system as of the current round. -func (s RewardsState) NextRewardsState(nextRound basics.Round, nextProto config.ConsensusParams, incentivePoolBalance basics.MicroAlgos, totalRewardUnits uint64) (res RewardsState) { +func (s RewardsState) NextRewardsState(nextRound basics.Round, nextProto config.ConsensusParams, incentivePoolBalance basics.MicroAlgos, totalRewardUnits uint64, log logging.Logger) (res RewardsState) { res = s - if nextRound == s.RewardsRecalculationRound { + if nextRound == res.RewardsRecalculationRound { maxSpentOver := nextProto.MinBalance overflowed := false if nextProto.PendingResidueRewards { - maxSpentOver, overflowed = basics.OAdd(maxSpentOver, s.RewardsResidue) + maxSpentOver, overflowed = basics.OAdd(maxSpentOver, res.RewardsResidue) if overflowed { - logging.Base().Errorf("overflowed when trying to accumulate MinBalance(%d) and RewardsResidue(%d) for round %d (state %+v)", nextProto.MinBalance, s.RewardsResidue, nextRound, s) + log.Errorf("overflowed when trying to accumulate MinBalance(%d) and RewardsResidue(%d) for round %d (state %+v)", nextProto.MinBalance, res.RewardsResidue, nextRound, s) // this should never happen, but if it does, adjust the maxSpentOver so that we will have no rewards. maxSpentOver = incentivePoolBalance.Raw } @@ -304,7 +304,7 @@ func (s RewardsState) NextRewardsState(nextRound basics.Round, nextProto config. // it is time to refresh the rewards rate newRate, overflowed := basics.OSub(incentivePoolBalance.Raw, maxSpentOver) if overflowed { - logging.Base().Errorf("overflowed when trying to refresh RewardsRate for round %v (state %+v)", nextRound, s) + log.Errorf("overflowed when trying to refresh RewardsRate for round %v (state %+v)", nextRound, s) newRate = 0 } @@ -317,14 +317,21 @@ func (s RewardsState) NextRewardsState(nextRound basics.Round, nextProto config. return } + var rewardsRate uint64 + if nextProto.RewardsCalculationFix { + rewardsRate = res.RewardsRate + } else { + rewardsRate = s.RewardsRate + } + var ot basics.OverflowTracker - rewardsWithResidue := ot.Add(s.RewardsRate, s.RewardsResidue) - nextRewardLevel := ot.Add(s.RewardsLevel, rewardsWithResidue/totalRewardUnits) + rewardsWithResidue := ot.Add(rewardsRate, res.RewardsResidue) + nextRewardLevel := ot.Add(res.RewardsLevel, rewardsWithResidue/totalRewardUnits) nextResidue := rewardsWithResidue % totalRewardUnits if ot.Overflowed { - logging.Base().Errorf("could not compute next reward level (current level %v, adding %v MicroAlgos in total, number of reward units %v) using old level", - s.RewardsLevel, s.RewardsRate, totalRewardUnits) + log.Errorf("could not compute next reward level (current level %v, adding %v MicroAlgos in total, number of reward units %v) using old level", + res.RewardsLevel, rewardsRate, totalRewardUnits) return } @@ -519,7 +526,14 @@ func (block Block) paysetCommit(t config.PaysetCommitType) (crypto.Digest, error if err != nil { return crypto.Digest{}, err } - return tree.Root(), nil + // in case there are no leaves (e.g empty block with 0 txns) the merkle root is a slice with length of 0. + // Here we convert the empty slice to a 32-bytes of zeros. this conversion is okay because this merkle + // tree uses sha512_256 function. for this function the pre-image of [0x0...0x0] is not known + // (it might not be the cases for a different hash function) + rootSlice := tree.Root() + var rootAsByteArray crypto.Digest + copy(rootAsByteArray[:], rootSlice) + return rootAsByteArray, nil default: return crypto.Digest{}, fmt.Errorf("unsupported payset commit type %d", t) } diff --git a/data/bookkeeping/block_test.go b/data/bookkeeping/block_test.go index 14d75e437c..2956edb128 100644 --- a/data/bookkeeping/block_test.go +++ b/data/bookkeeping/block_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -17,15 +17,19 @@ package bookkeeping import ( + "bytes" + "math" "testing" "time" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/transactions" + "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" ) @@ -248,20 +252,30 @@ func TestTime(t *testing.T) { func TestRewardsLevel(t *testing.T) { partitiontest.PartitionTest(t) + var buf bytes.Buffer + log := logging.NewLogger() + log.SetOutput(&buf) + proto := config.Consensus[protocol.ConsensusCurrentVersion] var prev Block prev.RewardsLevel = 1 prev.RewardsRate = 10 rewardUnits := uint64(10) - state := prev.NextRewardsState(prev.Round()+1, proto, basics.MicroAlgos{}, rewardUnits) + state := prev.NextRewardsState(prev.Round()+1, proto, basics.MicroAlgos{}, rewardUnits, log) require.Equal(t, uint64(2), state.RewardsLevel) require.Equal(t, uint64(0), state.RewardsResidue) + + assert.Zero(t, buf.Len()) } func TestRewardsLevelWithResidue(t *testing.T) { partitiontest.PartitionTest(t) + var buf bytes.Buffer + log := logging.NewLogger() + log.SetOutput(&buf) + proto := config.Consensus[protocol.ConsensusCurrentVersion] var prev Block @@ -270,14 +284,20 @@ func TestRewardsLevelWithResidue(t *testing.T) { prev.RewardsRate = 1 rewardUnits := uint64(10) - state := prev.NextRewardsState(prev.Round()+1, proto, basics.MicroAlgos{}, rewardUnits) + state := prev.NextRewardsState(prev.Round()+1, proto, basics.MicroAlgos{}, rewardUnits, log) require.Equal(t, uint64(11), state.RewardsLevel) require.Equal(t, uint64(0), state.RewardsResidue) + + assert.Zero(t, buf.Len()) } func TestRewardsLevelNoUnits(t *testing.T) { partitiontest.PartitionTest(t) + var buf bytes.Buffer + log := logging.NewLogger() + log.SetOutput(&buf) + proto := config.Consensus[protocol.ConsensusCurrentVersion] var prev Block @@ -285,14 +305,20 @@ func TestRewardsLevelNoUnits(t *testing.T) { prev.RewardsResidue = 2 rewardUnits := uint64(0) - state := prev.NextRewardsState(prev.Round()+1, proto, basics.MicroAlgos{}, rewardUnits) + state := prev.NextRewardsState(prev.Round()+1, proto, basics.MicroAlgos{}, rewardUnits, log) require.Equal(t, prev.RewardsLevel, state.RewardsLevel) require.Equal(t, prev.RewardsResidue, state.RewardsResidue) + + assert.Zero(t, buf.Len()) } func TestTinyLevel(t *testing.T) { partitiontest.PartitionTest(t) + var buf bytes.Buffer + log := logging.NewLogger() + log.SetOutput(&buf) + proto := config.Consensus[protocol.ConsensusCurrentVersion] var prev Block @@ -300,13 +326,19 @@ func TestTinyLevel(t *testing.T) { prev.RewardsRate = 10 * unitsInAlgos algosInSystem := uint64(1000 * 1000 * 1000) rewardUnits := algosInSystem * unitsInAlgos / proto.RewardUnit - state := prev.NextRewardsState(prev.Round()+1, proto, basics.MicroAlgos{}, rewardUnits) + state := prev.NextRewardsState(prev.Round()+1, proto, basics.MicroAlgos{}, rewardUnits, log) require.True(t, state.RewardsLevel > 0 || state.RewardsResidue > 0) + + assert.Zero(t, buf.Len()) } func TestRewardsRate(t *testing.T) { partitiontest.PartitionTest(t) + var buf bytes.Buffer + log := logging.NewLogger() + log.SetOutput(&buf) + var prev Block prev.RewardsLevel = 1 prev.RewardsRate = 10 @@ -318,14 +350,20 @@ func TestRewardsRate(t *testing.T) { incentivePoolBalance := basics.MicroAlgos{Raw: 1000 * uint64(proto.RewardsRateRefreshInterval)} // make sure that RewardsRate stays the same - state := prev.NextRewardsState(prev.Round()+1, proto, incentivePoolBalance, 0) + state := prev.NextRewardsState(prev.Round()+1, proto, incentivePoolBalance, 0, log) require.Equal(t, prev.RewardsRate, state.RewardsRate) require.Equal(t, prev.BlockHeader.RewardsRecalculationRound, state.RewardsRecalculationRound) + + assert.Zero(t, buf.Len()) } func TestRewardsRateRefresh(t *testing.T) { partitiontest.PartitionTest(t) + var buf bytes.Buffer + log := logging.NewLogger() + log.SetOutput(&buf) + var prev Block prev.RewardsLevel = 1 prev.RewardsRate = 10 @@ -337,9 +375,11 @@ func TestRewardsRateRefresh(t *testing.T) { incentivePoolBalance := basics.MicroAlgos{Raw: 1000 * uint64(proto.RewardsRateRefreshInterval)} // make sure that RewardsRate was recomputed nextRound := prev.Round() + 1 - state := prev.NextRewardsState(nextRound, proto, incentivePoolBalance, 0) + state := prev.NextRewardsState(nextRound, proto, incentivePoolBalance, 0, log) require.Equal(t, (incentivePoolBalance.Raw-proto.MinBalance)/uint64(proto.RewardsRateRefreshInterval), state.RewardsRate) require.Equal(t, nextRound+basics.Round(proto.RewardsRateRefreshInterval), state.RewardsRecalculationRound) + + assert.Zero(t, buf.Len()) } func TestEncodeDecodeSignedTxn(t *testing.T) { @@ -412,8 +452,13 @@ func TestInitialRewardsRateCalculation(t *testing.T) { partitiontest.PartitionTest(t) consensusParams := config.Consensus[protocol.ConsensusCurrentVersion] + consensusParams.RewardsCalculationFix = false runTest := func() bool { + var buf bytes.Buffer + log := logging.NewLogger() + log.SetOutput(&buf) + incentivePoolBalance := uint64(125000000000000) totalRewardUnits := uint64(10000000000) require.GreaterOrEqual(t, incentivePoolBalance, consensusParams.MinBalance) @@ -429,7 +474,7 @@ func TestInitialRewardsRateCalculation(t *testing.T) { curRewardsState.RewardsRate = incentivePoolBalance / uint64(consensusParams.RewardsRateRefreshInterval) } for rnd := 1; rnd < int(consensusParams.RewardsRateRefreshInterval+2); rnd++ { - nextRewardState := curRewardsState.NextRewardsState(basics.Round(rnd), consensusParams, basics.MicroAlgos{Raw: incentivePoolBalance}, totalRewardUnits) + nextRewardState := curRewardsState.NextRewardsState(basics.Round(rnd), consensusParams, basics.MicroAlgos{Raw: incentivePoolBalance}, totalRewardUnits, log) // adjust the incentive pool balance var ot basics.OverflowTracker @@ -450,6 +495,8 @@ func TestInitialRewardsRateCalculation(t *testing.T) { // prepare for the next iteration curRewardsState = nextRewardState } + + assert.Zero(t, buf.Len()) return true } @@ -461,3 +508,264 @@ func TestInitialRewardsRateCalculation(t *testing.T) { consensusParams.InitialRewardsRateCalculation = true require.True(t, runTest()) } + +func performRewardsRateCalculation( + t *testing.T, consensusParams config.ConsensusParams, + curRewardsState RewardsState, + incentivePoolBalance uint64, totalRewardUnits uint64, startingRound uint64, overspends bool, logs bool) { + var buf bytes.Buffer + log := logging.NewLogger() + log.SetOutput(&buf) + defer func() { + require.Equal(t, logs, buf.Len() != 0) + }() + + require.GreaterOrEqual(t, incentivePoolBalance, consensusParams.MinBalance) + + for rnd := startingRound; rnd < startingRound+uint64(consensusParams.RewardsRateRefreshInterval)*3; rnd++ { + nextRewardState := curRewardsState.NextRewardsState(basics.Round(rnd), consensusParams, basics.MicroAlgos{Raw: incentivePoolBalance}, totalRewardUnits, log) + // adjust the incentive pool balance + var ot basics.OverflowTracker + + // get number of rewards per unit + rewardsPerUnit := ot.Sub(nextRewardState.RewardsLevel, curRewardsState.RewardsLevel) + require.False(t, ot.Overflowed) + + // subtract the total dispersed funds from the pool balance + incentivePoolBalance = ot.Sub(incentivePoolBalance, ot.Mul(totalRewardUnits, rewardsPerUnit)) + if ot.Overflowed { + require.True(t, overspends) + return + } + + if incentivePoolBalance < consensusParams.MinBalance { + require.True(t, overspends) + return + } + + // prepare for the next iteration + curRewardsState = nextRewardState + } + + require.False(t, overspends) +} + +func TestNextRewardsRateWithFix(t *testing.T) { + partitiontest.PartitionTest(t) + + proto, ok := config.Consensus[protocol.ConsensusCurrentVersion] + require.True(t, ok) + proto.RewardsCalculationFix = true + + tests := []struct { + name string + rewardsRate uint64 + rewardsLevel uint64 + rewardsResidue uint64 + rewardsRecalculationRound basics.Round + incentivePoolBalance uint64 + totalRewardUnits uint64 + startingRound uint64 + logs bool + }{ + {"zero_rate", 0, 215332, 0, 18500000, proto.MinBalance, 6756334087, 18063999, false}, + // 3 subtests below use parameters found in the block header `startingRound` - 1. + {"mainnet_0", 24000000, 215332, 545321700, 18500000, 10464550021728, 6756334087, + 18063999, true}, + {"mainnet_1", 24000000, 215332, 521321700, 18500000, 10464550021728, 6756334078, + 18063998, true}, + {"mainnet_2", 24000000, 215332, 425321700, 18500000, 10464550021728, 6756334079, + 18063994, true}, + {"no_residue", 0, 0, 0, 1000000, + proto.MinBalance + 500000000000 /* 5*10^11 */, 1, 1000000, false}, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + curRewardsState := RewardsState{ + RewardsLevel: test.rewardsLevel, + RewardsResidue: test.rewardsResidue, + RewardsRecalculationRound: test.rewardsRecalculationRound, + RewardsRate: test.rewardsRate, + } + + performRewardsRateCalculation( + t, proto, curRewardsState, test.incentivePoolBalance, test.totalRewardUnits, + test.startingRound, false, test.logs) + }) + } +} + +func TestNextRewardsRateFailsWithoutFix(t *testing.T) { + partitiontest.PartitionTest(t) + + proto, ok := config.Consensus[protocol.ConsensusCurrentVersion] + require.True(t, ok) + proto.RewardsCalculationFix = false + + curRewardsState := RewardsState{ + RewardsLevel: 0, + RewardsResidue: 0, + RewardsRecalculationRound: 1000000, + RewardsRate: 0, + } + + performRewardsRateCalculation( + t, proto, curRewardsState, proto.MinBalance+500000000000, + 1, 1000000, true, false) +} + +func TestNextRewardsRateWithFixUsesNewRate(t *testing.T) { + partitiontest.PartitionTest(t) + + proto, ok := config.Consensus[protocol.ConsensusCurrentVersion] + require.True(t, ok) + proto.RewardsCalculationFix = true + proto.MinBalance = 1 + proto.RewardsRateRefreshInterval = 10 + + state := RewardsState{ + RewardsLevel: 4, + RewardsRate: 80, + RewardsResidue: 2, + RewardsRecalculationRound: 100, + } + + var buf bytes.Buffer + log := logging.NewLogger() + log.SetOutput(&buf) + + newState := state.NextRewardsState( + state.RewardsRecalculationRound, proto, basics.MicroAlgos{Raw: 113}, 10, log) + + expected := RewardsState{ + RewardsLevel: 5, + RewardsRate: 11, + RewardsResidue: 3, + RewardsRecalculationRound: 110, + } + assert.Equal(t, expected, newState) + + assert.Zero(t, buf.Len()) +} + +func TestNextRewardsRateWithFixPoolBalanceInsufficient(t *testing.T) { + partitiontest.PartitionTest(t) + + proto, ok := config.Consensus[protocol.ConsensusCurrentVersion] + require.True(t, ok) + proto.RewardsCalculationFix = true + proto.MinBalance = 10 + + state := RewardsState{ + RewardsLevel: 4, + RewardsRate: 80, + RewardsResidue: 21, + RewardsRecalculationRound: 100, + } + + var buf bytes.Buffer + log := logging.NewLogger() + log.SetOutput(&buf) + + newState := state.NextRewardsState( + state.RewardsRecalculationRound, proto, basics.MicroAlgos{Raw: 19}, 10, log) + + expected := RewardsState{ + RewardsLevel: 6, + RewardsRate: 0, + RewardsResidue: 1, + RewardsRecalculationRound: 100 + basics.Round(proto.RewardsRateRefreshInterval), + } + assert.Equal(t, expected, newState) + + assert.Contains( + t, string(buf.Bytes()), "overflowed when trying to refresh RewardsRate") +} + +func TestNextRewardsRateWithFixMaxSpentOverOverflow(t *testing.T) { + partitiontest.PartitionTest(t) + + proto, ok := config.Consensus[protocol.ConsensusCurrentVersion] + require.True(t, ok) + proto.RewardsCalculationFix = true + proto.MinBalance = 10 + + state := RewardsState{ + RewardsLevel: 4, + RewardsRate: 80, + RewardsResidue: math.MaxUint64, + RewardsRecalculationRound: 100, + } + + var buf bytes.Buffer + log := logging.NewLogger() + log.SetOutput(&buf) + + newState := state.NextRewardsState( + state.RewardsRecalculationRound, proto, basics.MicroAlgos{Raw: 9009}, 10, log) + + expected := RewardsState{ + RewardsLevel: 4 + math.MaxUint64/10, + RewardsRate: 0, + RewardsResidue: math.MaxUint64 % 10, + RewardsRecalculationRound: 100 + basics.Round(proto.RewardsRateRefreshInterval), + } + assert.Equal(t, expected, newState) + + assert.Contains( + t, string(buf.Bytes()), + "overflowed when trying to accumulate MinBalance(10) and "+ + "RewardsResidue(18446744073709551615)") +} + +func TestNextRewardsRateWithFixRewardsWithResidueOverflow(t *testing.T) { + partitiontest.PartitionTest(t) + + proto, ok := config.Consensus[protocol.ConsensusCurrentVersion] + require.True(t, ok) + proto.RewardsCalculationFix = true + proto.MinBalance = 10 + + state := RewardsState{ + RewardsLevel: 4, + RewardsRate: 80, + RewardsResidue: math.MaxUint64, + RewardsRecalculationRound: 100, + } + + var buf bytes.Buffer + log := logging.NewLogger() + log.SetOutput(&buf) + + newState := state.NextRewardsState( + state.RewardsRecalculationRound-1, proto, basics.MicroAlgos{Raw: 0}, 1, log) + assert.Equal(t, state, newState) + + assert.Contains(t, string(buf.Bytes()), "could not compute next reward level") +} + +func TestNextRewardsRateWithFixNextRewardLevelOverflow(t *testing.T) { + partitiontest.PartitionTest(t) + + proto, ok := config.Consensus[protocol.ConsensusCurrentVersion] + require.True(t, ok) + proto.RewardsCalculationFix = true + proto.MinBalance = 10 + + state := RewardsState{ + RewardsLevel: math.MaxUint64, + RewardsRate: 0, + RewardsResidue: 1, + RewardsRecalculationRound: 100, + } + + var buf bytes.Buffer + log := logging.NewLogger() + log.SetOutput(&buf) + + newState := state.NextRewardsState( + state.RewardsRecalculationRound-1, proto, basics.MicroAlgos{Raw: 1000}, 1, log) + assert.Equal(t, state, newState) + + assert.Contains(t, string(buf.Bytes()), "could not compute next reward level") +} diff --git a/data/bookkeeping/encoding_test.go b/data/bookkeeping/encoding_test.go index 0c82710f74..e892bb5029 100644 --- a/data/bookkeeping/encoding_test.go +++ b/data/bookkeeping/encoding_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/bookkeeping/genesis.go b/data/bookkeeping/genesis.go index 6593bcd459..3b15d91d0d 100644 --- a/data/bookkeeping/genesis.go +++ b/data/bookkeeping/genesis.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/bookkeeping/prettyprinting.go b/data/bookkeeping/prettyprinting.go index 7fc3d3166a..7c8e28a0af 100644 --- a/data/bookkeeping/prettyprinting.go +++ b/data/bookkeeping/prettyprinting.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/bookkeeping/txn_merkle.go b/data/bookkeeping/txn_merkle.go index 043a09cc8f..9a806708e3 100644 --- a/data/bookkeeping/txn_merkle.go +++ b/data/bookkeeping/txn_merkle.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -31,7 +31,7 @@ import ( // header), or to generate proofs of membership for transactions that are // in this block. func (block Block) TxnMerkleTree() (*merklearray.Tree, error) { - return merklearray.Build(&txnMerkleArray{block: block}) + return merklearray.Build(&txnMerkleArray{block: block}, crypto.HashFactory{HashType: crypto.Sha512_256}) } // txnMerkleArray is a representation of the transactions in this block, @@ -46,9 +46,9 @@ func (tma *txnMerkleArray) Length() uint64 { } // Get implements the merklearray.Array interface. -func (tma *txnMerkleArray) GetHash(pos uint64) (crypto.Digest, error) { +func (tma *txnMerkleArray) Marshal(pos uint64) (crypto.Hashable, error) { if pos >= uint64(len(tma.block.Payset)) { - return crypto.Digest{}, fmt.Errorf("txnMerkleArray.Get(%d): out of bounds, payset size %d", pos, len(tma.block.Payset)) + return nil, fmt.Errorf("txnMerkleArray.Get(%d): out of bounds, payset size %d", pos, len(tma.block.Payset)) } var elem txnMerkleElem @@ -56,11 +56,11 @@ func (tma *txnMerkleArray) GetHash(pos uint64) (crypto.Digest, error) { stxn, _, err := tma.block.DecodeSignedTxn(elem.stib) if err != nil { - return crypto.Digest{}, err + return nil, err } elem.txn = stxn.Txn - return elem.Hash(), nil + return &elem, nil } // txnMerkleElem represents a leaf in the Merkle tree of all transactions @@ -70,29 +70,35 @@ type txnMerkleElem struct { stib transactions.SignedTxnInBlock } +func txnMerkleToRaw(txid [crypto.DigestSize]byte, stib [crypto.DigestSize]byte) (buf []byte) { + buf = make([]byte, 2*crypto.DigestSize) + copy(buf[:], txid[:]) + copy(buf[crypto.DigestSize:], stib[:]) + return +} + // ToBeHashed implements the crypto.Hashable interface. func (tme *txnMerkleElem) ToBeHashed() (protocol.HashID, []byte) { // The leaf contains two hashes: the transaction ID (hash of the // transaction itself), and the hash of the entire SignedTxnInBlock. txid := tme.txn.ID() - stib := crypto.HashObj(&tme.stib) - - var buf [2 * crypto.DigestSize]byte - copy(buf[:crypto.DigestSize], txid[:]) - copy(buf[crypto.DigestSize:], stib[:]) + stib := tme.stib.Hash() - return protocol.TxnMerkleLeaf, buf[:] + return protocol.TxnMerkleLeaf, txnMerkleToRaw(txid, stib) } // Hash implements an optimized version of crypto.HashObj(tme). func (tme *txnMerkleElem) Hash() crypto.Digest { + return crypto.Hash(tme.HashRepresentation()) +} + +func (tme *txnMerkleElem) HashRepresentation() []byte { txid := tme.txn.ID() stib := tme.stib.Hash() var buf [len(protocol.TxnMerkleLeaf) + 2*crypto.DigestSize]byte s := buf[:0] s = append(s, protocol.TxnMerkleLeaf...) - s = append(s, txid[:]...) - s = append(s, stib[:]...) - return crypto.Hash(s) + s = append(s, txnMerkleToRaw(txid, stib)...) + return s } diff --git a/data/bookkeeping/txn_merkle_test.go b/data/bookkeeping/txn_merkle_test.go index 5f7d6b2db4..2dabd07bd0 100644 --- a/data/bookkeeping/txn_merkle_test.go +++ b/data/bookkeeping/txn_merkle_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -80,9 +80,8 @@ func TestTxnMerkle(t *testing.T) { for i := uint64(0); i < ntxn; i++ { proof, err := tree.Prove([]uint64{i}) require.NoError(t, err) - - elemVerif := make(map[uint64]crypto.Digest) - elemVerif[i] = elems[i].Hash() + elemVerif := make(map[uint64]crypto.Hashable) + elemVerif[i] = &elems[i] err = merklearray.Verify(root, elemVerif, proof) require.NoError(t, err) } @@ -143,3 +142,24 @@ func BenchmarkTxnRoots(b *testing.B) { _ = r } + +func txnMerkleToRawAppend(txid [crypto.DigestSize]byte, stib [crypto.DigestSize]byte) []byte { + buf := make([]byte, 0, 2*crypto.DigestSize) + buf = append(buf, txid[:]...) + return append(buf, stib[:]...) +} +func BenchmarkTxnMerkleToRaw(b *testing.B) { + digest1 := crypto.Hash([]byte{1, 2, 3}) + digest2 := crypto.Hash([]byte{4, 5, 6}) + + b.Run("copy", func(b *testing.B) { + for i := 0; i < b.N; i++ { + txnMerkleToRaw(digest1, digest2) + } + }) + b.Run("append", func(b *testing.B) { + for i := 0; i < b.N; i++ { + txnMerkleToRawAppend(digest1, digest2) + } + }) +} diff --git a/data/committee/committee.go b/data/committee/committee.go index 71409b56a5..d70eca646f 100644 --- a/data/committee/committee.go +++ b/data/committee/committee.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/committee/common_test.go b/data/committee/common_test.go index 05fba36bdb..b0b77efd11 100644 --- a/data/committee/common_test.go +++ b/data/committee/common_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/committee/credential.go b/data/committee/credential.go index cc02e086cb..c725cc9a8f 100644 --- a/data/committee/credential.go +++ b/data/committee/credential.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/committee/credential_test.go b/data/committee/credential_test.go index 2160d72e5f..fe13be8c16 100644 --- a/data/committee/credential_test.go +++ b/data/committee/credential_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/committee/encoding_test.go b/data/committee/encoding_test.go index f9491dbbf8..ae34120de9 100644 --- a/data/committee/encoding_test.go +++ b/data/committee/encoding_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/committee/sortition/sortition.go b/data/committee/sortition/sortition.go index 4fad430663..5b8300add6 100644 --- a/data/committee/sortition/sortition.go +++ b/data/committee/sortition/sortition.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -22,12 +22,19 @@ package sortition // #include // #include "sortition.h" import "C" + import ( + "fmt" "math/big" + "strings" "github.com/algorand/go-algorand/crypto" ) +const precision = uint(8 * (crypto.DigestSize + 1)) + +var maxFloat *big.Float + // Select runs the sortition function and returns the number of time the key was selected func Select(money uint64, totalMoney uint64, expectedSize float64, vrfOutput crypto.Digest) uint64 { binomialN := float64(money) @@ -36,18 +43,23 @@ func Select(money uint64, totalMoney uint64, expectedSize float64, vrfOutput cry t := &big.Int{} t.SetBytes(vrfOutput[:]) - precision := uint(8 * (len(vrfOutput) + 1)) - max, b, err := big.ParseFloat("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 0, precision, big.ToNearestEven) - if b != 16 || err != nil { - panic("failed to parse big float constant in sortition") - } - h := big.Float{} h.SetPrec(precision) h.SetInt(t) ratio := big.Float{} - cratio, _ := ratio.Quo(&h, max).Float64() + cratio, _ := ratio.Quo(&h, maxFloat).Float64() return uint64(C.sortition_binomial_cdf_walk(C.double(binomialN), C.double(binomialP), C.double(cratio), C.uint64_t(money))) } + +func init() { + var b int + var err error + maxFloatString := fmt.Sprintf("0x%s", strings.Repeat("ff", crypto.DigestSize)) + maxFloat, b, err = big.ParseFloat(maxFloatString, 0, precision, big.ToNearestEven) + if b != 16 || err != nil { + err = fmt.Errorf("failed to parse big float constant in sortition : %w", err) + panic(err) + } +} diff --git a/data/committee/sortition/sortition_test.go b/data/committee/sortition/sortition_test.go index ac3eae0191..81bf893985 100644 --- a/data/committee/sortition/sortition_test.go +++ b/data/committee/sortition/sortition_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/common_test.go b/data/common_test.go index b02103d4d5..ab1004fc19 100644 --- a/data/common_test.go +++ b/data/common_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/datatest/fabricateLedger.go b/data/datatest/fabricateLedger.go index 55d992823e..9c859bbeee 100644 --- a/data/datatest/fabricateLedger.go +++ b/data/datatest/fabricateLedger.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/datatest/impls.go b/data/datatest/impls.go index 30fe35ba90..7a8f804eaf 100644 --- a/data/datatest/impls.go +++ b/data/datatest/impls.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/hashable/message.go b/data/hashable/message.go index 4da3fd94e5..ae0ae7806d 100644 --- a/data/hashable/message.go +++ b/data/hashable/message.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/ledger.go b/data/ledger.go index 0767d2948c..8fc03cb6eb 100644 --- a/data/ledger.go +++ b/data/ledger.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -325,14 +325,16 @@ func (l *Ledger) EnsureValidatedBlock(vb *ledgercore.ValidatedBlock, c agreement break } - logfn := logging.Base().Errorf + logfn := l.log.Errorf switch err.(type) { case ledgercore.BlockInLedgerError: - logfn = logging.Base().Debugf + // If the block is already in the ledger (catchup and agreement might be competing), + // reporting this as a debug message is sufficient. + logfn = l.log.Debugf + // Otherwise, the error is because the block is in the future. Error is logged. } - - logfn("could not write block %d to the ledger: %v", round, err) + logfn("data.EnsureValidatedBlock: could not write block %d to the ledger: %v", round, err) } } @@ -353,14 +355,16 @@ func (l *Ledger) EnsureBlock(block *bookkeeping.Block, c agreement.Certificate) switch err.(type) { case protocol.Error: if !protocolErrorLogged { - logging.Base().Errorf("unrecoverable protocol error detected at block %d: %v", round, err) + l.log.Errorf("data.EnsureBlock: unrecoverable protocol error detected at block %d: %v", round, err) protocolErrorLogged = true } case ledgercore.BlockInLedgerError: - logging.Base().Debugf("could not write block %d to the ledger: %v", round, err) - return // this error implies that l.LastRound() >= round + // The block is already in the ledger. Catchup and agreement could be competing + // It is sufficient to report this as a Debug message + l.log.Debugf("data.EnsureBlock: could not write block %d to the ledger: %v", round, err) + return default: - logging.Base().Errorf("could not write block %d to the ledger: %v", round, err) + l.log.Errorf("data.EnsureBlock: could not write block %d to the ledger: %v", round, err) } // If there was an error add a short delay before the next attempt. diff --git a/data/ledger_test.go b/data/ledger_test.go index c49598d3cb..dc50147db3 100644 --- a/data/ledger_test.go +++ b/data/ledger_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -17,6 +17,9 @@ package data import ( + "context" + "fmt" + "sync" "testing" "github.com/stretchr/testify/require" @@ -32,6 +35,7 @@ import ( "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" + "github.com/algorand/go-algorand/util/execpool" ) var testPoolAddr = basics.Address{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} @@ -420,3 +424,240 @@ func TestConsensusVersion(t *testing.T) { require.Equal(t, protocol.ConsensusVersion(""), ver) require.Equal(t, ledgercore.ErrNoEntry{Round: basics.Round(blk.BlockHeader.NextProtocolSwitchOn + 1), Latest: basics.Round(blk.BlockHeader.Round), Committed: basics.Round(blk.BlockHeader.Round)}, err) } + +type loggedMessages struct { + logging.Logger + expectedMessages chan string + unexpectedMessages chan string +} + +func (lm loggedMessages) Debug(args ...interface{}) { + m := fmt.Sprint(args...) + lm.unexpectedMessages <- m +} +func (lm loggedMessages) Debugf(s string, args ...interface{}) { + m := fmt.Sprintf(s, args...) + lm.expectedMessages <- m +} +func (lm loggedMessages) Info(args ...interface{}) { + m := fmt.Sprint(args...) + lm.unexpectedMessages <- m +} +func (lm loggedMessages) Infof(s string, args ...interface{}) { + m := fmt.Sprintf(s, args...) + lm.unexpectedMessages <- m +} +func (lm loggedMessages) Warn(args ...interface{}) { + m := fmt.Sprint(args...) + lm.unexpectedMessages <- m +} +func (lm loggedMessages) Warnf(s string, args ...interface{}) { + m := fmt.Sprintf(s, args...) + lm.unexpectedMessages <- m +} +func (lm loggedMessages) Error(args ...interface{}) { + m := fmt.Sprint(args...) + lm.unexpectedMessages <- m +} +func (lm loggedMessages) Errorf(s string, args ...interface{}) { + m := fmt.Sprintf(s, args...) + lm.unexpectedMessages <- m +} + +// TestLedgerErrorValidate creates 3 parallel routines adding blocks to the ledger through different interfaces. +// The purpose here is to simulate the scenario where the catchup and the agreement compete to add blocks to the ledger. +// The error messages reported can be excessive or unnecessary. This test evaluates what messages are generate and at what frequency. +func TestLedgerErrorValidate(t *testing.T) { + partitiontest.PartitionTest(t) + + var testPoolAddr = basics.Address{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} + var testSinkAddr = basics.Address{0x2c, 0x2a, 0x6c, 0xe9, 0xa9, 0xa7, 0xc2, 0x8c, 0x22, 0x95, 0xfd, 0x32, 0x4f, 0x77, 0xa5, 0x4, 0x8b, 0x42, 0xc2, 0xb7, 0xa8, 0x54, 0x84, 0xb6, 0x80, 0xb1, 0xe1, 0x3d, 0x59, 0x9b, 0xeb, 0x36} + + proto, _ := config.Consensus[protocol.ConsensusCurrentVersion] + origProto := proto + defer func() { + config.Consensus[protocol.ConsensusCurrentVersion] = origProto + }() + proto.MinBalance = 0 + config.Consensus[protocol.ConsensusCurrentVersion] = proto + + blk := bookkeeping.Block{} + blk.CurrentProtocol = protocol.ConsensusCurrentVersion + blk.RewardsPool = testPoolAddr + blk.FeeSink = testSinkAddr + blk.BlockHeader.GenesisHash = crypto.Hash([]byte(t.Name())) + + accts := make(map[basics.Address]basics.AccountData) + accts[testPoolAddr] = basics.MakeAccountData(basics.NotParticipating, basics.MicroAlgos{Raw: 0}) + accts[testSinkAddr] = basics.MakeAccountData(basics.NotParticipating, basics.MicroAlgos{Raw: 0}) + + genesisInitState := ledgercore.InitState{ + Accounts: accts, + Block: blk, + GenesisHash: crypto.Hash([]byte(t.Name())), + } + + expectedMessages := make(chan string, 100) + unexpectedMessages := make(chan string, 100) + + const inMem = true + cfg := config.GetDefaultLocal() + cfg.Archival = true + log := loggedMessages{Logger: logging.TestingLog(t), expectedMessages: expectedMessages, unexpectedMessages: unexpectedMessages} + log.SetLevel(logging.Debug) + realLedger, err := ledger.OpenLedger(log, t.Name(), inMem, genesisInitState, cfg) + require.NoError(t, err, "could not open ledger") + defer realLedger.Close() + + l := Ledger{Ledger: realLedger, log: log} + l.log.SetLevel(logging.Debug) + require.NotNil(t, &l) + + totalsRound, _, err := realLedger.LatestTotals() + require.NoError(t, err) + require.Equal(t, basics.Round(0), totalsRound) + + errChan := make(chan error, 1) + defer close(errChan) + + wg := sync.WaitGroup{} + defer wg.Wait() + + blkChan1 := make(chan bookkeeping.Block, 10) + blkChan2 := make(chan bookkeeping.Block, 10) + blkChan3 := make(chan bookkeeping.Block, 10) + defer close(blkChan1) + defer close(blkChan2) + defer close(blkChan3) + + // Add blocks to the ledger via EnsureValidatedBlock. This calls AddValidatedBlock, which simply + // passes the block to blockQueue. The returned error is handled by EnsureValidatedBlock, which reports + // in the form of logged error message. + go func() { + wg.Add(1) + i := 0 + for blk := range blkChan1 { + i++ + vb, err := validatedBlock(l.Ledger, blk) + if err != nil { + // AddBlock already added the block + // This is okay to ignore. + // This error is generated from ledger.Ledger Validate function, used from: + // - node blockValidatorImpl Validate + // - catchup service s.ledger.Validate (Catchup service returns after the first error) + continue + } + l.EnsureValidatedBlock(vb, agreement.Certificate{}) + } + wg.Done() + }() + + // Add blocks to the ledger via EnsureBlock. This basically calls AddBlock, but handles + // the errors by logging them. Checking the logged messages to verify its behavior. + go func() { + wg.Add(1) + i := 0 + for blk := range blkChan2 { + i++ + l.EnsureBlock(&blk, agreement.Certificate{}) + } + wg.Done() + }() + + // Add blocks directly to the ledger + go func() { + wg.Add(1) + i := 0 + for blk := range blkChan3 { + i++ + err := l.AddBlock(blk, agreement.Certificate{}) + // AddBlock is used in 2 places: + // - data.ledger.EnsureBlock which reports a log message as Error or Debug + // - catchup.service.fetchAndWrite which leads to interrupting catchup or skiping the round + if err != nil { + switch err.(type) { + // The following two cases are okay to ignore, since these are expected and handled + case ledgercore.BlockInLedgerError: + case ledgercore.ErrNonSequentialBlockEval: + continue + default: + // Make sure unexpected error is not obtained here + errChan <- err + } + } + l.WaitForCommit(blk.BlockHeader.Round) + } + wg.Done() + }() + + // flush the messages output during the setup + more := true + for more { + select { + case <-expectedMessages: + case <-unexpectedMessages: + default: + more = false + } + } + + for rnd := basics.Round(1); rnd <= basics.Round(2000); rnd++ { + blk, err := getEmptyBlock(rnd-1, l.Ledger, t.Name(), genesisInitState.Accounts) + require.NoError(t, err) + blkChan3 <- blk + blkChan2 <- blk + blkChan1 <- blk + + more = true + for more { + select { + case err := <-errChan: + require.NoError(t, err) + case <-expectedMessages: + // only debug messages should be reported + case um := <-unexpectedMessages: + require.Empty(t, um, um) + default: + more = false + } + } + } +} + +func validatedBlock(l *ledger.Ledger, blk bookkeeping.Block) (vb *ledgercore.ValidatedBlock, err error) { + backlogPool := execpool.MakeBacklog(nil, 0, execpool.LowPriority, nil) + defer backlogPool.Shutdown() + vb, err = l.Validate(context.Background(), blk, backlogPool) + return +} + +func getEmptyBlock(afterRound basics.Round, l *ledger.Ledger, genesisID string, initAccounts map[basics.Address]basics.AccountData) (blk bookkeeping.Block, err error) { + l.WaitForCommit(afterRound) + + lastBlock, err := l.Block(l.Latest()) + if err != nil { + return + } + + proto := config.Consensus[lastBlock.CurrentProtocol] + blk.BlockHeader = bookkeeping.BlockHeader{ + GenesisID: genesisID, + Round: l.Latest() + 1, + Branch: lastBlock.Hash(), + TimeStamp: 0, + } + + if proto.SupportGenesisHash { + blk.BlockHeader.GenesisHash = crypto.Hash([]byte(genesisID)) + } + + blk.RewardsPool = testPoolAddr + blk.FeeSink = testSinkAddr + blk.CurrentProtocol = lastBlock.CurrentProtocol + + blk.TxnRoot, err = blk.PaysetCommit() + if err != nil { + return + } + return +} diff --git a/data/pools/statusCache.go b/data/pools/statusCache.go index 7b281e38d2..3b25f7f679 100644 --- a/data/pools/statusCache.go +++ b/data/pools/statusCache.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/pools/transactionPool.go b/data/pools/transactionPool.go index 4295e82ff1..7d8ba64784 100644 --- a/data/pools/transactionPool.go +++ b/data/pools/transactionPool.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/pools/transactionPool_test.go b/data/pools/transactionPool_test.go index 4e65333b6b..a16a7d30fa 100644 --- a/data/pools/transactionPool_test.go +++ b/data/pools/transactionPool_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/transactions/application.go b/data/transactions/application.go index 4588ed22f8..0db7e72b90 100644 --- a/data/transactions/application.go +++ b/data/transactions/application.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/transactions/application_test.go b/data/transactions/application_test.go index 5d50d71266..a076e4b8d0 100644 --- a/data/transactions/application_test.go +++ b/data/transactions/application_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/transactions/asset.go b/data/transactions/asset.go index 021b4c1a3c..9daafd5bc8 100644 --- a/data/transactions/asset.go +++ b/data/transactions/asset.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/transactions/common_test.go b/data/transactions/common_test.go index 838b6d4a5f..b600ce6cf5 100644 --- a/data/transactions/common_test.go +++ b/data/transactions/common_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/transactions/compactcert.go b/data/transactions/compactcert.go index 2b1be0cd83..4c05520260 100644 --- a/data/transactions/compactcert.go +++ b/data/transactions/compactcert.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -38,10 +38,10 @@ func (cc CompactCertTxnFields) Empty() bool { if cc.CertRound != 0 { return false } - if !cc.Cert.SigCommit.IsZero() || cc.Cert.SignedWeight != 0 { + if !cc.Cert.SigCommit.IsEmpty() || cc.Cert.SignedWeight != 0 { return false } - if len(cc.Cert.SigProofs) != 0 || len(cc.Cert.PartProofs) != 0 { + if len(cc.Cert.SigProofs.Path) != 0 || len(cc.Cert.PartProofs.Path) != 0 { return false } if len(cc.Cert.Reveals) != 0 { diff --git a/data/transactions/error.go b/data/transactions/error.go index 0625c21701..a95deeb3f1 100644 --- a/data/transactions/error.go +++ b/data/transactions/error.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/transactions/keyreg.go b/data/transactions/keyreg.go index cb354802b5..16f7a1f327 100644 --- a/data/transactions/keyreg.go +++ b/data/transactions/keyreg.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -18,6 +18,7 @@ package transactions import ( "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/crypto/merklesignature" "github.com/algorand/go-algorand/data/basics" ) @@ -27,6 +28,7 @@ type KeyregTxnFields struct { VotePK crypto.OneTimeSignatureVerifier `codec:"votekey"` SelectionPK crypto.VRFVerifier `codec:"selkey"` + StateProofPK merklesignature.Verifier `codec:"sprfkey"` VoteFirst basics.Round `codec:"votefst"` VoteLast basics.Round `codec:"votelst"` VoteKeyDilution uint64 `codec:"votekd"` diff --git a/data/transactions/logic/README.md b/data/transactions/logic/README.md index 6bdc194573..c046f414d3 100644 --- a/data/transactions/logic/README.md +++ b/data/transactions/logic/README.md @@ -1,61 +1,212 @@ -# Transaction Execution Approval Language (TEAL) - -TEAL is a bytecode based stack language that executes inside Algorand transactions. TEAL programs can be used to check the parameters of the transaction and approve the transaction as if by a signature. This use of TEAL is called a _LogicSig_. Starting with v2, TEAL programs may -also execute as _Applications_ which are invoked with explicit application call transactions. Programs have read-only access to the transaction they are attached to, transactions in their atomic transaction group, and a few global values. In addition, _Application_ programs have access to limited state that is global to the application and per-account local state for each account that has opted-in to the application. For both types of program, approval is signaled by finishing with the stack containing a single non-zero uint64 value. +# The Algorand Virtual Machine (AVM) and TEAL. + +The AVM is a bytecode based stack interpreter that executes programs +associated with Algorand transactions. TEAL is an assembly language +syntax for specifying a program that is ultimately converted to AVM +bytecode. These programs can be used to check the parameters of the +transaction and approve the transaction as if by a signature. This use +is called a _Smart Signature_. Starting with v2, these programs may +also execute as _Smart Contracts_, which are often called +_Applications_. Contract executions are invoked with explicit +application call transactions. + +Programs have read-only access to the transaction they are attached +to, the other transactions in their atomic transaction group, and a +few global values. In addition, _Smart Contracts_ have access to +limited state that is global to the application and per-account local +state for each account that has opted-in to the application. For both +types of program, approval is signaled by finishing with the stack +containing a single non-zero uint64 value, though `return` can be used +to signal an early approval which approves based only upon the top +stack value being a non-zero uint64 value. ## The Stack -The stack starts empty and contains values of either uint64 or bytes -(`bytes` are implemented in Go as a []byte slice and may not exceed +The stack starts empty and can contain values of either uint64 or byte-arrays +(byte-arrays may not exceed 4096 bytes in length). Most operations act on the stack, popping -arguments from it and pushing results to it. +arguments from it and pushing results to it. Some operations have +_immediate_ arguments that are encoded directly into the instruction, +rather than coming from the stack. -The maximum stack depth is currently 1000. If the stack depth is -exceed or if a `bytes` element exceed 4096 bytes, the program fails. +The maximum stack depth is 1000. If the stack depth is +exceeded or if a byte-array element exceed 4096 bytes, the program fails. ## Scratch Space -In addition to the stack there are 256 positions of scratch space, -also uint64-bytes union values, each initialized as uint64 -zero. Scratch space is acccesed by the `load(s)` and `store(s)` ops -moving data from or to scratch space, respectively. +In addition to the stack there are 256 positions of scratch +space. Like stack values, scratch locations may be uint64s or +byte-arrays. Scratch locations are initialized as uint64 zero. Scratch +space is accessed by the `load(s)` and `store(s)` opcodes which move +data from or to scratch space, respectively. + +## Versions + +In order to maintain existing semantics for previously written +programs, AVM code is versioned. When new opcodes are introduced, or +behavior is changed, a new version is introduced. Programs carrying +old versions are executed with their original semantics. In the AVM +bytecode, the version is an incrementing integer, currently 6, and +denoted vX throughout this document. User friendly version numbers +that correspond to programmer expectations, such as `AVM 1.0` map to +these integers. AVM 0.9 is v4. AVM 1.0 is v5. AVM 1.1 is v6. ## Execution Modes -Starting from version 2 TEAL evaluator can run programs in two modes: -1. LogicSig (stateless) -2. Application run (stateful) +Starting from v2, the AVM can run programs in two modes: +1. LogicSig or _stateless_ mode, used to execute Smart Signatures +2. Application or _stateful_ mode, used to execute Smart Contracts Differences between modes include: 1. Max program length (consensus parameters LogicSigMaxSize, MaxAppTotalProgramLen & MaxExtraAppProgramPages) 2. Max program cost (consensus parameters LogicSigMaxCost, MaxAppProgramCost) -3. Opcode availability. For example, all stateful operations are only available in stateful mode. Refer to [opcodes document](TEAL_opcodes.md) for details. - -## Execution Environment for LogicSigs - -TEAL LogicSigs run in Algorand nodes as part of testing a proposed transaction to see if it is valid and authorized to be committed into a block. - -If an authorized program executes and finishes with a single non-zero uint64 value on the stack then that program has validated the transaction it is attached to. - -The TEAL program has access to data from the transaction it is attached to (`txn` op), any transactions in a transaction group it is part of (`gtxn` op), and a few global values like consensus parameters (`global` op). Some "Args" may be attached to a transaction being validated by a TEAL program. Args are an array of byte strings. A common pattern would be to have the key to unlock some contract as an Arg. Args are recorded on the blockchain and publicly visible when the transaction is submitted to the network. These LogicSig Args are _not_ part of the transaction ID nor of the TxGroup hash. They also cannot be read from other TEAL programs in the group of transactions. +3. Opcode availability. Refer to [opcodes document](TEAL_opcodes.md) for details. +4. Some global values, such as LatestTimestamp, are only available in stateful mode. +5. Only Applications can observe transaction effects, such as Logs or IDs allocated to ASAs or new Applications. + +## Execution Environment for Smart Signatures + +Smart Signatures execute as part of testing a proposed transaction to +see if it is valid and authorized to be committed into a block. If an +authorized program executes and finishes with a single non-zero uint64 +value on the stack then that program has validated the transaction it +is attached to. + +The program has access to data from the transaction it is attached to +(`txn` op), any transactions in a transaction group it is part of +(`gtxn` op), and a few global values like consensus parameters +(`global` op). Some "Args" may be attached to a transaction being +validated by a program. Args are an array of byte strings. A common +pattern would be to have the key to unlock some contract as an Arg. Be +aware that Smart Signature Args are recorded on the blockchain and +publicly visible when the transaction is submitted to the network, +even before the transaction has been included in a block. These Args +are _not_ part of the transaction ID nor of the TxGroup hash. They +also cannot be read from other programs in the group of transactions. + +A program can either authorize some delegated action on a normal +signature-based or multisignature-based account or be wholly in charge +of a contract account. + +* If the account has signed the program (by providing a valid ed25519 + signature or valid multisignature for the authorizer address on the + string "Program" concatenated with the program bytecode) then: if the + program returns true the transaction is authorized as if the account + had signed it. This allows an account to hand out a signed program + so that other users can carry out delegated actions which are + approved by the program. Note that Smart Signature Args are _not_ + signed. + +* If the SHA512_256 hash of the program (prefixed by "Program") is + equal to authorizer address of the transaction sender then this is a + contract account wholly controlled by the program. No other + signature is necessary or possible. The only way to execute a + transaction against the contract account is for the program to + approve it. + +The bytecode plus the length of all Args must add up to no more than +1000 bytes (consensus parameter LogicSigMaxSize). Each opcode has an +associated cost and the program cost must total no more than 20,000 +(consensus parameter LogicSigMaxCost). Most opcodes have a cost of 1, +but a few slow cryptographic operations have a much higher cost. Prior +to v4, the program's cost was estimated as the static sum of all the +opcode costs in the program (whether they were actually executed or +not). Beginning with v4, the program's cost is tracked dynamically, +while being evaluated. If the program exceeds its budget, it fails. + +## Execution Environment for Smart Contracts (Applications) + +Smart Contracts are executed in ApplicationCall transactions. Like +Smart Signatures, contracts indicate success by leaving a single +non-zero integer on the stack. A failed Smart Contract call is not a +valid transaction, thus not written to the blockchain. Nodes maintain +a list of transactions that would succeed, given the current state of +the blockchain, called the transaction pool. Nodes draw from the pool +if they are called upon to propose a block. + +Smart Contracts have access to everything a Smart Signature may access +(see previous section), as well as the ability to examine blockchain +state such as balances and contract state (their own state and the +state of other contracts). They also have access to some global +values that are not visible to Smart Signatures because the values +change over time. Since smart contracts access changing state, nodes +must rerun their code to determine if the ApplicationCall transactions +in their pool would still succeed each time a block is added to the +blockchain. + +Smart contracts have limits on their execution cost (700, consensus +parameter MaxAppProgramCost). Before v4, this was a static limit on +the cost of all the instructions in the program. Since then, the cost +is tracked dynamically during execution and must not exceed +MaxAppProgramCost. Beginning with v5, programs costs are pooled and +tracked dynamically across app executions in a group. If `n` +application invocations appear in a group, then the total execution +cost of such calls must not exceed `n`*MaxAppProgramCost. In v6, inner +application calls become possible, and each such call increases the +pooled budget by MaxAppProgramCost. + +Executions of the ClearStateProgram are more stringent, in order to +ensure that applications may be closed out, but that applications also +are assured a chance to clean up their internal state. At the +beginning of the execution of a ClearStateProgram, the pooled budget +available must be MaxAppProgramCost or higher. If it is not, the +containing transaction group fails without clearing the app's +state. During the execution of the ClearStateProgram, no more than +MaxAppProgramCost may be drawn. If further execution is attempted, the +ClearStateProgram fails, and the app's state _is cleared_. + + +### Resource availability + +Smart contracts have limits on the amount of blockchain state they +may examine. Opcodes may only access blockchain resources such as +Accounts, Assets, and contract state if the given resource is +_available_. + + * A resource in the "foreign array" fields of the ApplicationCall + transaction (`txn.Accounts`, `txn.ForeignAssets`, and + `txn.ForeignApplications`) is _available_. + + * The `txn.Sender`, `global CurrentApplicationID`, and `global + CurrentApplicationAddress` are _available_. + + * Prior to v4, all assets were considered _available_ to the + `asset_holding_get` opcode, and all applications were _available_ + to the `app_local_get_ex` opcode. + + * Since v6, any asset or contract that was created earlier in the + same transaction group (whether by a top-level or inner + transaction) is _available_. In addition, any account that is the + associated account of a contract that was created earlier in the + group is _available_. -A program can either authorize some delegated action on a normal private key signed or multisig account or be wholly in charge of a contract account. - -* If the account has signed the program (an ed25519 signature on "Program" concatenated with the program bytes) then if the program returns true the transaction is authorized as if the account had signed it. This allows an account to hand out a signed program so that other users can carry out delegated actions which are approved by the program. Note that LogicSig Args are _not_ signed. - -* If the SHA512_256 hash of the program (prefixed by "Program") is equal to the transaction Sender address then this is a contract account wholly controlled by the program. No other signature is necessary or possible. The only way to execute a transaction against the contract account is for the program to approve it. +## Constants -The TEAL bytecode plus the length of all Args must add up to no more than 1000 bytes (consensus parameter LogicSigMaxSize). Each TEAL op has an associated cost and the program cost must total no more than 20000 (consensus parameter LogicSigMaxCost). Most ops have a cost of 1, but a few slow crypto ops are much higher. Prior to v4, the program's cost was estimated as the static sum of all the opcode costs in the program (whether they were actually executed or not). Beginning with v4, the program's cost is tracked dynamically, while being evaluated. If the program exceeds its budget, it fails. +Constants can be pushed onto the stack in two different ways: -## Constants +1. Constants can be pushed directly with `pushint` or + `pushbytes`. This method is more efficient for constants that are + only used once. -Constants are loaded into the environment into storage separate from the stack. They can then be pushed onto the stack by referring to the type and index. This makes for efficient re-use of byte constants used for account addresses, etc. Constants that are not reused can be pushed with `pushint` or `pushbytes`. +2. Constants can be loaded into storage separate from the stack and + scratch space, using two opcodes `intcblock` and + `bytecblock`. Then, constants from this storage can be pushed + pushed onto the stack by referring to the type and index using + `intc`, `intc_[0123]`, `bytec`, and `bytec_[0123]`. This method is + more efficient for constants that are used multiple times. -The assembler will hide most of this, allowing simple use of `int 1234` and `byte 0xcafed00d`. These constants will automatically get assembled into int and byte pages of constants, de-duplicated, and operations to load them from constant storage space inserted. +The assembler will hide most of this, allowing simple use of `int 1234` +and `byte 0xcafed00d`. Constants introduced via `int` and `byte` will +be assembled into appropriate uses of `pushint|pushbytes` and +`{int|byte}c, {int|byte}c_[0123]` to minimize program size. -Constants are loaded into the environment by two opcodes, `intcblock` and `bytecblock`. Both of these use [proto-buf style variable length unsigned int](https://developers.google.com/protocol-buffers/docs/encoding#varint), reproduced [here](#varuint). The `intcblock` opcode is followed by a varuint specifying the length of the array and then that number of varuint. The `bytecblock` opcode is followed by a varuint array length then that number of pairs of (varuint, bytes) length prefixed byte strings. This should efficiently load 32 and 64 byte constants which will be common as addresses, hashes, and signatures. -Constants are pushed onto the stack by `intc`, `intc_[0123]`, `pushint`, `bytec`, `bytec_[0123]`, and `pushbytes`. The assembler will handle converting `int N` or `byte N` into the appropriate form of the instruction needed. +The opcodes `intcblock` and `bytecblock` use [proto-buf style variable length unsigned int](https://developers.google.com/protocol-buffers/docs/encoding#varint), +reproduced [here](#varuint). The `intcblock` opcode is followed by a +varuint specifying the number of integer constants and then that +number of varuints. The `bytecblock` opcode is followed by a varuint +specifying the number of byte constants, and then that number of pairs +of (varuint, bytes) length prefixed byte strings. ### Named Integer Constants @@ -63,8 +214,8 @@ Constants are pushed onto the stack by `intc`, `intc_[0123]`, `pushint`, `bytec` An application transaction must indicate the action to be taken following the execution of its approvalProgram or clearStateProgram. The constants below describe the available actions. -| Value | Constant name | Description | -| --- | --- | --- | +| Value | Name | Description | +| - | ---- | -------- | | 0 | NoOp | Only execute the `ApprovalProgram` associated with this application ID, with no additional effects. | | 1 | OptIn | Before executing the `ApprovalProgram`, allocate local state for this application into the sender's account data. | | 2 | CloseOut | After executing the `ApprovalProgram`, clear any local state for this application out of the sender's account data. | @@ -73,8 +224,9 @@ An application transaction must indicate the action to be taken following the ex | 5 | DeleteApplication | After executing the `ApprovalProgram`, delete the application parameters from the account data of the application's creator. | #### TypeEnum constants -| Value | Constant name | Description | -| --- | --- | --- | + +| Value | Name | Description | +| - | --- | ------ | | 0 | unknown | Unknown type. Invalid transaction | | 1 | pay | Payment | | 2 | keyreg | KeyRegistration | @@ -86,35 +238,39 @@ An application transaction must indicate the action to be taken following the ex ## Operations -Most operations work with only one type of argument, uint64 or bytes, and panic if the wrong type value is on the stack. - -Many instructions accept values to designate Accounts, Assets, or Applications. Beginning with TEAL v4, these values may always be given as an _offset_ in the corresponding Txn fields (Txn.Accounts, Txn.ForeignAssets, Txn.ForeignApps) _or_ as the value itself (a bytes address for Accounts, or a uint64 ID). The values, however, must still be present in the Txn fields. Before TEAL v4, most opcodes required the use of an offset, except for reading account local values of assets or applications, which accepted the IDs directly and did not require the ID to be present in they corresponding _Foreign_ array. (Note that beginning with TEAL v4, those IDs are required to be present in their corresponding _Foreign_ array.) See individual opcodes for details. In the case of account offsets or application offsets, 0 is specially defined to Txn.Sender or the ID of the current application, respectively. +Most operations work with only one type of argument, uint64 or bytes, and fail if the wrong type value is on the stack. -Many programs need only a few dozen instructions. The instruction set has some optimization built in. `intc`, `bytec`, and `arg` take an immediate value byte, making a 2-byte op to load a value onto the stack, but they also have single byte versions for loading the most common constant values. Any program will benefit from having a few common values loaded with a smaller one byte opcode. Cryptographic hashes and `ed25519verify` are single byte opcodes with powerful libraries behind them. These operations still take more time than other ops (and this is reflected in the cost of each op and the cost limit of a program) but are efficient in compiled code space. +Many instructions accept values to designate Accounts, Assets, or Applications. Beginning with v4, these values may be given as an _offset_ in the corresponding Txn fields (Txn.Accounts, Txn.ForeignAssets, Txn.ForeignApps) _or_ as the value itself (a byte-array address for Accounts, or a uint64 ID). The values, however, must still be present in the Txn fields. Before v4, most opcodes required the use of an offset, except for reading account local values of assets or applications, which accepted the IDs directly and did not require the ID to be present in they corresponding _Foreign_ array. (Note that beginning with v4, those IDs _are_ required to be present in their corresponding _Foreign_ array.) See individual opcodes for details. In the case of account offsets or application offsets, 0 is specially defined to Txn.Sender or the ID of the current application, respectively. This summary is supplemented by more detail in the [opcodes document](TEAL_opcodes.md). -Some operations 'panic' and immediately fail the program. -A transaction checked by a program that panics is not valid. -A contract account governed by a buggy program might not have a way to get assets back out of it. Code carefully. - -### Arithmetic, Logic, and Cryptographic Operations +Some operations immediately fail the program. +A transaction checked by a program that fails is not valid. +An account governed by a buggy program might not have a way to get assets back out of it. Code carefully. -For one-argument ops, `X` is the last element on the stack, which is typically replaced by a new value. +In the documentation for each opcode, the stack arguments that are +popped are referred to alphabetically, beginning with the deepest +argument as `A`. These arguments are shown in the opcode description, +and if the opcode must be of a specific type, it is noted there. All +opcodes fail if a specified type is incorrect. -For two-argument ops, `A` is the penultimate element on the stack and `B` is the top of the stack. These typically result in popping A and B from the stack and pushing the result. +If an opcode pushes more than one result, the values are named for +ease of exposition and clarity concerning their stack positions. When +an opcode manipulates the stack in such a way that a value changes +position but is otherwise unchanged, the name of the output on the +return stack matches the name of the input value. -For three-argument ops, `A` is the element two below the top, `B` is the penultimate stack element and `C` is the top of the stack. These operations typically pop A, B, and C from the stack and push the result. +### Arithmetic, Logic, and Cryptographic Operations -| Op | Description | -| --- | --- | -| `sha256` | SHA256 hash of value X, yields [32]byte | -| `keccak256` | Keccak256 hash of value X, yields [32]byte | -| `sha512_256` | SHA512_256 hash of value X, yields [32]byte | +| Opcode | Description | +| - | -- | +| `sha256` | SHA256 hash of value A, yields [32]byte | +| `keccak256` | Keccak256 hash of value A, yields [32]byte | +| `sha512_256` | SHA512_256 hash of value A, yields [32]byte | | `ed25519verify` | for (data A, signature B, pubkey C) verify the signature of ("ProgData" \|\| program_hash \|\| data) against the pubkey => {0 or 1} | | `ecdsa_verify v` | for (data A, signature B, C and pubkey D, E) verify the signature of the data against the pubkey => {0 or 1} | -| `ecdsa_pk_recover v` | for (data A, recovery id B, signature C, D) recover a public key => [*... stack*, X, Y] | -| `ecdsa_pk_decompress v` | decompress pubkey A into components X, Y => [*... stack*, X, Y] | +| `ecdsa_pk_recover v` | for (data A, recovery id B, signature C, D) recover a public key | +| `ecdsa_pk_decompress v` | decompress pubkey A into components X, Y | | `+` | A plus B. Fail on overflow. | | `-` | A minus B. Fail if B > A. | | `/` | A divided by B (truncated division). Fail if B == 0. | @@ -127,83 +283,82 @@ For three-argument ops, `A` is the element two below the top, `B` is the penulti | `\|\|` | A is not zero or B is not zero => {0 or 1} | | `shl` | A times 2^B, modulo 2^64 | | `shr` | A divided by 2^B | -| `sqrt` | The largest integer B such that B^2 <= X | -| `bitlen` | The highest set bit in X. If X is a byte-array, it is interpreted as a big-endian unsigned integer. bitlen of 0 is 0, bitlen of 8 is 4 | +| `sqrt` | The largest integer I such that I^2 <= A | +| `bitlen` | The highest set bit in A. If A is a byte-array, it is interpreted as a big-endian unsigned integer. bitlen of 0 is 0, bitlen of 8 is 4 | | `exp` | A raised to the Bth power. Fail if A == B == 0 and on overflow | | `==` | A is equal to B => {0 or 1} | | `!=` | A is not equal to B => {0 or 1} | -| `!` | X == 0 yields 1; else 0 | -| `len` | yields length of byte value X | -| `itob` | converts uint64 X to big endian bytes | -| `btoi` | converts bytes X as big endian to uint64 | +| `!` | A == 0 yields 1; else 0 | +| `len` | yields length of byte value A | +| `itob` | converts uint64 A to big endian bytes | +| `btoi` | converts bytes A as big endian to uint64 | | `%` | A modulo B. Fail if B == 0. | | `\|` | A bitwise-or B | | `&` | A bitwise-and B | | `^` | A bitwise-xor B | -| `~` | bitwise invert value X | -| `mulw` | A times B out to 128-bit long result as low (top) and high uint64 values on the stack | -| `addw` | A plus B out to 128-bit long result as sum (top) and carry-bit uint64 values on the stack | -| `divmodw` | Pop four uint64 values. The deepest two are interpreted as a uint128 dividend (deepest value is high word), the top two are interpreted as a uint128 divisor. Four uint64 values are pushed to the stack. The deepest two are the quotient (deeper value is the high uint64). The top two are the remainder, low bits on top. | -| `expw` | A raised to the Bth power as a 128-bit long result as low (top) and high uint64 values on the stack. Fail if A == B == 0 or if the results exceeds 2^128-1 | -| `getbit` | pop a target A (integer or byte-array), and index B. Push the Bth bit of A. | -| `setbit` | pop a target A, index B, and bit C. Set the Bth bit of A to C, and push the result | -| `getbyte` | pop a byte-array A and integer B. Extract the Bth byte of A and push it as an integer | -| `setbyte` | pop a byte-array A, integer B, and small integer C (between 0..255). Set the Bth byte of A to C, and push the result | -| `concat` | pop two byte-arrays A and B and join them, push the result | - -These opcodes return portions of byte arrays, accessed by position, in -various sizes. +| `~` | bitwise invert value A | +| `mulw` | A times B as a 128-bit result in two uint64s. X is the high 64 bits, Y is the low | +| `addw` | A plus B as a 128-bit result. X is the carry-bit, Y is the low-order 64 bits. | +| `divw` | A,B / C. Fail if C == 0 or if result overflows. | +| `divmodw` | W,X = (A,B / C,D); Y,Z = (A,B modulo C,D) | +| `expw` | A raised to the Bth power as a 128-bit result in two uint64s. X is the high 64 bits, Y is the low. Fail if A == B == 0 or if the results exceeds 2^128-1 | +| `getbit` | Bth bit of (byte-array or integer) A. | +| `setbit` | Copy of (byte-array or integer) A, with the Bth bit set to (0 or 1) C | +| `getbyte` | Bth byte of A, as an integer | +| `setbyte` | Copy of A with the Bth byte set to small integer (between 0..255) C | +| `concat` | join A and B | ### Byte Array Manipulation -| Op | Description | -| --- | --- | -| `substring s e` | pop a byte-array A. For immediate values in 0..255 S and E: extract a range of bytes from A starting at S up to but not including E, push the substring result. If E < S, or either is larger than the array length, the program fails | -| `substring3` | pop a byte-array A and two integers B and C. Extract a range of bytes from A starting at B up to but not including C, push the substring result. If C < B, or either is larger than the array length, the program fails | -| `extract s l` | pop a byte-array A. For immediate values in 0..255 S and L: extract a range of bytes from A starting at S up to but not including S+L, push the substring result. If L is 0, then extract to the end of the string. If S or S+L is larger than the array length, the program fails | -| `extract3` | pop a byte-array A and two integers B and C. Extract a range of bytes from A starting at B up to but not including B+C, push the substring result. If B+C is larger than the array length, the program fails | -| `extract_uint16` | pop a byte-array A and integer B. Extract a range of bytes from A starting at B up to but not including B+2, convert bytes as big endian and push the uint64 result. If B+2 is larger than the array length, the program fails | -| `extract_uint32` | pop a byte-array A and integer B. Extract a range of bytes from A starting at B up to but not including B+4, convert bytes as big endian and push the uint64 result. If B+4 is larger than the array length, the program fails | -| `extract_uint64` | pop a byte-array A and integer B. Extract a range of bytes from A starting at B up to but not including B+8, convert bytes as big endian and push the uint64 result. If B+8 is larger than the array length, the program fails | - -These opcodes take byte-array values that are interpreted as +| Opcode | Description | +| - | -- | +| `substring s e` | A range of bytes from A starting at S up to but not including E. If E < S, or either is larger than the array length, the program fails | +| `substring3` | A range of bytes from A starting at B up to but not including C. If C < B, or either is larger than the array length, the program fails | +| `extract s l` | A range of bytes from A starting at S up to but not including S+L. If L is 0, then extract to the end of the string. If S or S+L is larger than the array length, the program fails | +| `extract3` | A range of bytes from A starting at B up to but not including B+C. If B+C is larger than the array length, the program fails | +| `extract_uint16` | A uint16 formed from a range of big-endian bytes from A starting at B up to but not including B+2. If B+2 is larger than the array length, the program fails | +| `extract_uint32` | A uint32 formed from a range of big-endian bytes from A starting at B up to but not including B+4. If B+4 is larger than the array length, the program fails | +| `extract_uint64` | A uint64 formed from a range of big-endian bytes from A starting at B up to but not including B+8. If B+8 is larger than the array length, the program fails | + +The following opcodes take byte-array values that are interpreted as big-endian unsigned integers. For mathematical operators, the returned values are the shortest byte-array that can represent the returned value. For example, the zero value is the empty -byte-array. For comparison operators, the returned value is a uint64 +byte-array. For comparison operators, the returned value is a uint64. -Input lengths are limited to a maximum length 64 bytes, which -represents a 512 bit unsigned integer. Output lengths are not +Input lengths are limited to a maximum length of 64 bytes, +representing a 512 bit unsigned integer. Output lengths are not explicitly restricted, though only `b*` and `b+` can produce a larger output than their inputs, so there is an implicit length limit of 128 bytes on outputs. -| Op | Description | -| --- | --- | -| `b+` | A plus B, where A and B are byte-arrays interpreted as big-endian unsigned integers | -| `b-` | A minus B, where A and B are byte-arrays interpreted as big-endian unsigned integers. Fail on underflow. | -| `b/` | A divided by B (truncated division), where A and B are byte-arrays interpreted as big-endian unsigned integers. Fail if B is zero. | -| `b*` | A times B, where A and B are byte-arrays interpreted as big-endian unsigned integers. | -| `b<` | A is less than B, where A and B are byte-arrays interpreted as big-endian unsigned integers => { 0 or 1} | -| `b>` | A is greater than B, where A and B are byte-arrays interpreted as big-endian unsigned integers => { 0 or 1} | -| `b<=` | A is less than or equal to B, where A and B are byte-arrays interpreted as big-endian unsigned integers => { 0 or 1} | -| `b>=` | A is greater than or equal to B, where A and B are byte-arrays interpreted as big-endian unsigned integers => { 0 or 1} | -| `b==` | A is equals to B, where A and B are byte-arrays interpreted as big-endian unsigned integers => { 0 or 1} | -| `b!=` | A is not equal to B, where A and B are byte-arrays interpreted as big-endian unsigned integers => { 0 or 1} | -| `b%` | A modulo B, where A and B are byte-arrays interpreted as big-endian unsigned integers. Fail if B is zero. | +| Opcode | Description | +| - | -- | +| `b+` | A plus B. A and B are interpreted as big-endian unsigned integers | +| `b-` | A minus B. A and B are interpreted as big-endian unsigned integers. Fail on underflow. | +| `b/` | A divided by B (truncated division). A and B are interpreted as big-endian unsigned integers. Fail if B is zero. | +| `b*` | A times B. A and B are interpreted as big-endian unsigned integers. | +| `b<` | 1 if A is less than B, else 0. A and B are interpreted as big-endian unsigned integers | +| `b>` | 1 if A is greater than B, else 0. A and B are interpreted as big-endian unsigned integers | +| `b<=` | 1 if A is less than or equal to B, else 0. A and B are interpreted as big-endian unsigned integers | +| `b>=` | 1 if A is greater than or equal to B, else 0. A and B are interpreted as big-endian unsigned integers | +| `b==` | 1 if A is equal to B, else 0. A and B are interpreted as big-endian unsigned integers | +| `b!=` | 0 if A is equal to B, else 1. A and B are interpreted as big-endian unsigned integers | +| `b%` | A modulo B. A and B are interpreted as big-endian unsigned integers. Fail if B is zero. | +| `bsqrt` | The largest integer I such that I^2 <= A. A and I are interpreted as big-endian unsigned integers | These opcodes operate on the bits of byte-array values. The shorter -array is interpreted as though left padded with zeros until it is the +input array is interpreted as though left padded with zeros until it is the same length as the other input. The returned values are the same -length as the longest input. Therefore, unlike array arithmetic, +length as the longer input. Therefore, unlike array arithmetic, these results may contain leading zero bytes. -| Op | Description | -| --- | --- | -| `b\|` | A bitwise-or B, where A and B are byte-arrays, zero-left extended to the greater of their lengths | -| `b&` | A bitwise-and B, where A and B are byte-arrays, zero-left extended to the greater of their lengths | -| `b^` | A bitwise-xor B, where A and B are byte-arrays, zero-left extended to the greater of their lengths | -| `b~` | X with all bits inverted | +| Opcode | Description | +| - | -- | +| `b\|` | A bitwise-or B. A and B are zero-left extended to the greater of their lengths | +| `b&` | A bitwise-and B. A and B are zero-left extended to the greater of their lengths | +| `b^` | A bitwise-xor B. A and B are zero-left extended to the greater of their lengths | +| `b~` | A with all bits inverted | ### Loading Values @@ -211,114 +366,117 @@ Opcodes for getting data onto the stack. Some of these have immediate data in the byte or bytes after the opcode. -| Op | Description | -| --- | --- | +| Opcode | Description | +| - | -- | | `intcblock uint ...` | prepare block of uint64 constants for use by intc | -| `intc i` | push Ith constant from intcblock to stack | -| `intc_0` | push constant 0 from intcblock to stack | -| `intc_1` | push constant 1 from intcblock to stack | -| `intc_2` | push constant 2 from intcblock to stack | -| `intc_3` | push constant 3 from intcblock to stack | -| `pushint uint` | push immediate UINT to the stack as an integer | +| `intc i` | Ith constant from intcblock | +| `intc_0` | constant 0 from intcblock | +| `intc_1` | constant 1 from intcblock | +| `intc_2` | constant 2 from intcblock | +| `intc_3` | constant 3 from intcblock | +| `pushint uint` | immediate UINT | | `bytecblock bytes ...` | prepare block of byte-array constants for use by bytec | -| `bytec i` | push Ith constant from bytecblock to stack | -| `bytec_0` | push constant 0 from bytecblock to stack | -| `bytec_1` | push constant 1 from bytecblock to stack | -| `bytec_2` | push constant 2 from bytecblock to stack | -| `bytec_3` | push constant 3 from bytecblock to stack | -| `pushbytes bytes` | push the following program bytes to the stack | -| `bzero` | push a byte-array of length X, containing all zero bytes | -| `arg n` | push Nth LogicSig argument to stack | -| `arg_0` | push LogicSig argument 0 to stack | -| `arg_1` | push LogicSig argument 1 to stack | -| `arg_2` | push LogicSig argument 2 to stack | -| `arg_3` | push LogicSig argument 3 to stack | -| `args` | push Xth LogicSig argument to stack | -| `txn f` | push field F of current transaction to stack | -| `gtxn t f` | push field F of the Tth transaction in the current group | -| `txna f i` | push Ith value of the array field F of the current transaction | -| `txnas f` | push Xth value of the array field F of the current transaction | -| `gtxna t f i` | push Ith value of the array field F from the Tth transaction in the current group | -| `gtxnas t f` | push Xth value of the array field F from the Tth transaction in the current group | -| `gtxns f` | push field F of the Xth transaction in the current group | -| `gtxnsa f i` | push Ith value of the array field F from the Xth transaction in the current group | -| `gtxnsas f` | pop an index A and an index B. push Bth value of the array field F from the Ath transaction in the current group | -| `global f` | push value from globals to stack | -| `load i` | copy a value from scratch space to the stack. All scratch spaces are 0 at program start. | -| `loads` | copy a value from the Xth scratch space to the stack. All scratch spaces are 0 at program start. | -| `store i` | pop value X. store X to the Ith scratch space | -| `stores` | pop indexes A and B. store B to the Ath scratch space | -| `gload t i` | push Ith scratch space index of the Tth transaction in the current group | -| `gloads i` | push Ith scratch space index of the Xth transaction in the current group | -| `gaid t` | push the ID of the asset or application created in the Tth transaction of the current group | -| `gaids` | push the ID of the asset or application created in the Xth transaction of the current group | +| `bytec i` | Ith constant from bytecblock | +| `bytec_0` | constant 0 from bytecblock | +| `bytec_1` | constant 1 from bytecblock | +| `bytec_2` | constant 2 from bytecblock | +| `bytec_3` | constant 3 from bytecblock | +| `pushbytes bytes` | immediate BYTES | +| `bzero` | zero filled byte-array of length A | +| `arg n` | Nth LogicSig argument | +| `arg_0` | LogicSig argument 0 | +| `arg_1` | LogicSig argument 1 | +| `arg_2` | LogicSig argument 2 | +| `arg_3` | LogicSig argument 3 | +| `args` | Ath LogicSig argument | +| `txn f` | field F of current transaction | +| `gtxn t f` | field F of the Tth transaction in the current group | +| `txna f i` | Ith value of the array field F of the current transaction | +| `txnas f` | Ath value of the array field F of the current transaction | +| `gtxna t f i` | Ith value of the array field F from the Tth transaction in the current group | +| `gtxnas t f` | Ath value of the array field F from the Tth transaction in the current group | +| `gtxns f` | field F of the Ath transaction in the current group | +| `gtxnsa f i` | Ith value of the array field F from the Ath transaction in the current group | +| `gtxnsas f` | Bth value of the array field F from the Ath transaction in the current group | +| `global f` | global field F | +| `load i` | Ith scratch space value. All scratch spaces are 0 at program start. | +| `loads` | Ath scratch space value. All scratch spaces are 0 at program start. | +| `store i` | store A to the Ith scratch space | +| `stores` | store B to the Ath scratch space | +| `gload t i` | Ith scratch space value of the Tth transaction in the current group | +| `gloads i` | Ith scratch space value of the Ath transaction in the current group | +| `gloadss` | Bth scratch space value of the Ath transaction in the current group | +| `gaid t` | ID of the asset or application created in the Tth transaction of the current group | +| `gaids` | ID of the asset or application created in the Ath transaction of the current group | **Transaction Fields** -| Index | Name | Type | Notes | -| --- | --- | --- | --- | -| 0 | Sender | []byte | 32 byte address | -| 1 | Fee | uint64 | micro-Algos | -| 2 | FirstValid | uint64 | round number | -| 3 | FirstValidTime | uint64 | Causes program to fail; reserved for future use | -| 4 | LastValid | uint64 | round number | -| 5 | Note | []byte | Any data up to 1024 bytes | -| 6 | Lease | []byte | 32 byte lease value | -| 7 | Receiver | []byte | 32 byte address | -| 8 | Amount | uint64 | micro-Algos | -| 9 | CloseRemainderTo | []byte | 32 byte address | -| 10 | VotePK | []byte | 32 byte address | -| 11 | SelectionPK | []byte | 32 byte address | -| 12 | VoteFirst | uint64 | The first round that the participation key is valid. | -| 13 | VoteLast | uint64 | The last round that the participation key is valid. | -| 14 | VoteKeyDilution | uint64 | Dilution for the 2-level participation key | -| 15 | Type | []byte | Transaction type as bytes | -| 16 | TypeEnum | uint64 | See table below | -| 17 | XferAsset | uint64 | Asset ID | -| 18 | AssetAmount | uint64 | value in Asset's units | -| 19 | AssetSender | []byte | 32 byte address. Causes clawback of all value of asset from AssetSender if Sender is the Clawback address of the asset. | -| 20 | AssetReceiver | []byte | 32 byte address | -| 21 | AssetCloseTo | []byte | 32 byte address | -| 22 | GroupIndex | uint64 | Position of this transaction within an atomic transaction group. A stand-alone transaction is implicitly element 0 in a group of 1 | -| 23 | TxID | []byte | The computed ID for this transaction. 32 bytes. | -| 24 | ApplicationID | uint64 | ApplicationID from ApplicationCall transaction. LogicSigVersion >= 2. | -| 25 | OnCompletion | uint64 | ApplicationCall transaction on completion action. LogicSigVersion >= 2. | -| 26 | ApplicationArgs | []byte | Arguments passed to the application in the ApplicationCall transaction. LogicSigVersion >= 2. | -| 27 | NumAppArgs | uint64 | Number of ApplicationArgs. LogicSigVersion >= 2. | -| 28 | Accounts | []byte | Accounts listed in the ApplicationCall transaction. LogicSigVersion >= 2. | -| 29 | NumAccounts | uint64 | Number of Accounts. LogicSigVersion >= 2. | -| 30 | ApprovalProgram | []byte | Approval program. LogicSigVersion >= 2. | -| 31 | ClearStateProgram | []byte | Clear state program. LogicSigVersion >= 2. | -| 32 | RekeyTo | []byte | 32 byte Sender's new AuthAddr. LogicSigVersion >= 2. | -| 33 | ConfigAsset | uint64 | Asset ID in asset config transaction. LogicSigVersion >= 2. | -| 34 | ConfigAssetTotal | uint64 | Total number of units of this asset created. LogicSigVersion >= 2. | -| 35 | ConfigAssetDecimals | uint64 | Number of digits to display after the decimal place when displaying the asset. LogicSigVersion >= 2. | -| 36 | ConfigAssetDefaultFrozen | uint64 | Whether the asset's slots are frozen by default or not, 0 or 1. LogicSigVersion >= 2. | -| 37 | ConfigAssetUnitName | []byte | Unit name of the asset. LogicSigVersion >= 2. | -| 38 | ConfigAssetName | []byte | The asset name. LogicSigVersion >= 2. | -| 39 | ConfigAssetURL | []byte | URL. LogicSigVersion >= 2. | -| 40 | ConfigAssetMetadataHash | []byte | 32 byte commitment to some unspecified asset metadata. LogicSigVersion >= 2. | -| 41 | ConfigAssetManager | []byte | 32 byte address. LogicSigVersion >= 2. | -| 42 | ConfigAssetReserve | []byte | 32 byte address. LogicSigVersion >= 2. | -| 43 | ConfigAssetFreeze | []byte | 32 byte address. LogicSigVersion >= 2. | -| 44 | ConfigAssetClawback | []byte | 32 byte address. LogicSigVersion >= 2. | -| 45 | FreezeAsset | uint64 | Asset ID being frozen or un-frozen. LogicSigVersion >= 2. | -| 46 | FreezeAssetAccount | []byte | 32 byte address of the account whose asset slot is being frozen or un-frozen. LogicSigVersion >= 2. | -| 47 | FreezeAssetFrozen | uint64 | The new frozen value, 0 or 1. LogicSigVersion >= 2. | -| 48 | Assets | uint64 | Foreign Assets listed in the ApplicationCall transaction. LogicSigVersion >= 3. | -| 49 | NumAssets | uint64 | Number of Assets. LogicSigVersion >= 3. | -| 50 | Applications | uint64 | Foreign Apps listed in the ApplicationCall transaction. LogicSigVersion >= 3. | -| 51 | NumApplications | uint64 | Number of Applications. LogicSigVersion >= 3. | -| 52 | GlobalNumUint | uint64 | Number of global state integers in ApplicationCall. LogicSigVersion >= 3. | -| 53 | GlobalNumByteSlice | uint64 | Number of global state byteslices in ApplicationCall. LogicSigVersion >= 3. | -| 54 | LocalNumUint | uint64 | Number of local state integers in ApplicationCall. LogicSigVersion >= 3. | -| 55 | LocalNumByteSlice | uint64 | Number of local state byteslices in ApplicationCall. LogicSigVersion >= 3. | -| 56 | ExtraProgramPages | uint64 | Number of additional pages for each of the application's approval and clear state programs. An ExtraProgramPages of 1 means 2048 more total bytes, or 1024 for each program. LogicSigVersion >= 4. | -| 57 | Nonparticipation | uint64 | Marks an account nonparticipating for rewards. LogicSigVersion >= 5. | -| 58 | Logs | []byte | Log messages emitted by an application call (itxn only). LogicSigVersion >= 5. | -| 59 | NumLogs | uint64 | Number of Logs (itxn only). LogicSigVersion >= 5. | -| 60 | CreatedAssetID | uint64 | Asset ID allocated by the creation of an ASA (itxn only). LogicSigVersion >= 5. | -| 61 | CreatedApplicationID | uint64 | ApplicationID allocated by the creation of an application (itxn only). LogicSigVersion >= 5. | +| Index | Name | Type | In | Notes | +| - | ------ | -- | - | --------- | +| 0 | Sender | []byte | | 32 byte address | +| 1 | Fee | uint64 | | microalgos | +| 2 | FirstValid | uint64 | | round number | +| 3 | FirstValidTime | uint64 | | Causes program to fail; reserved for future use | +| 4 | LastValid | uint64 | | round number | +| 5 | Note | []byte | | Any data up to 1024 bytes | +| 6 | Lease | []byte | | 32 byte lease value | +| 7 | Receiver | []byte | | 32 byte address | +| 8 | Amount | uint64 | | microalgos | +| 9 | CloseRemainderTo | []byte | | 32 byte address | +| 10 | VotePK | []byte | | 32 byte address | +| 11 | SelectionPK | []byte | | 32 byte address | +| 12 | VoteFirst | uint64 | | The first round that the participation key is valid. | +| 13 | VoteLast | uint64 | | The last round that the participation key is valid. | +| 14 | VoteKeyDilution | uint64 | | Dilution for the 2-level participation key | +| 15 | Type | []byte | | Transaction type as bytes | +| 16 | TypeEnum | uint64 | | See table below | +| 17 | XferAsset | uint64 | | Asset ID | +| 18 | AssetAmount | uint64 | | value in Asset's units | +| 19 | AssetSender | []byte | | 32 byte address. Causes clawback of all value of asset from AssetSender if Sender is the Clawback address of the asset. | +| 20 | AssetReceiver | []byte | | 32 byte address | +| 21 | AssetCloseTo | []byte | | 32 byte address | +| 22 | GroupIndex | uint64 | | Position of this transaction within an atomic transaction group. A stand-alone transaction is implicitly element 0 in a group of 1 | +| 23 | TxID | []byte | | The computed ID for this transaction. 32 bytes. | +| 24 | ApplicationID | uint64 | v2 | ApplicationID from ApplicationCall transaction | +| 25 | OnCompletion | uint64 | v2 | ApplicationCall transaction on completion action | +| 26 | ApplicationArgs | []byte | v2 | Arguments passed to the application in the ApplicationCall transaction | +| 27 | NumAppArgs | uint64 | v2 | Number of ApplicationArgs | +| 28 | Accounts | []byte | v2 | Accounts listed in the ApplicationCall transaction | +| 29 | NumAccounts | uint64 | v2 | Number of Accounts | +| 30 | ApprovalProgram | []byte | v2 | Approval program | +| 31 | ClearStateProgram | []byte | v2 | Clear state program | +| 32 | RekeyTo | []byte | v2 | 32 byte Sender's new AuthAddr | +| 33 | ConfigAsset | uint64 | v2 | Asset ID in asset config transaction | +| 34 | ConfigAssetTotal | uint64 | v2 | Total number of units of this asset created | +| 35 | ConfigAssetDecimals | uint64 | v2 | Number of digits to display after the decimal place when displaying the asset | +| 36 | ConfigAssetDefaultFrozen | uint64 | v2 | Whether the asset's slots are frozen by default or not, 0 or 1 | +| 37 | ConfigAssetUnitName | []byte | v2 | Unit name of the asset | +| 38 | ConfigAssetName | []byte | v2 | The asset name | +| 39 | ConfigAssetURL | []byte | v2 | URL | +| 40 | ConfigAssetMetadataHash | []byte | v2 | 32 byte commitment to some unspecified asset metadata | +| 41 | ConfigAssetManager | []byte | v2 | 32 byte address | +| 42 | ConfigAssetReserve | []byte | v2 | 32 byte address | +| 43 | ConfigAssetFreeze | []byte | v2 | 32 byte address | +| 44 | ConfigAssetClawback | []byte | v2 | 32 byte address | +| 45 | FreezeAsset | uint64 | v2 | Asset ID being frozen or un-frozen | +| 46 | FreezeAssetAccount | []byte | v2 | 32 byte address of the account whose asset slot is being frozen or un-frozen | +| 47 | FreezeAssetFrozen | uint64 | v2 | The new frozen value, 0 or 1 | +| 48 | Assets | uint64 | v3 | Foreign Assets listed in the ApplicationCall transaction | +| 49 | NumAssets | uint64 | v3 | Number of Assets | +| 50 | Applications | uint64 | v3 | Foreign Apps listed in the ApplicationCall transaction | +| 51 | NumApplications | uint64 | v3 | Number of Applications | +| 52 | GlobalNumUint | uint64 | v3 | Number of global state integers in ApplicationCall | +| 53 | GlobalNumByteSlice | uint64 | v3 | Number of global state byteslices in ApplicationCall | +| 54 | LocalNumUint | uint64 | v3 | Number of local state integers in ApplicationCall | +| 55 | LocalNumByteSlice | uint64 | v3 | Number of local state byteslices in ApplicationCall | +| 56 | ExtraProgramPages | uint64 | v4 | Number of additional pages for each of the application's approval and clear state programs. An ExtraProgramPages of 1 means 2048 more total bytes, or 1024 for each program. | +| 57 | Nonparticipation | uint64 | v5 | Marks an account nonparticipating for rewards | +| 58 | Logs | []byte | v5 | Log messages emitted by an application call (only with `itxn` in v5). Application mode only | +| 59 | NumLogs | uint64 | v5 | Number of Logs (only with `itxn` in v5). Application mode only | +| 60 | CreatedAssetID | uint64 | v5 | Asset ID allocated by the creation of an ASA (only with `itxn` in v5). Application mode only | +| 61 | CreatedApplicationID | uint64 | v5 | ApplicationID allocated by the creation of an application (only with `itxn` in v5). Application mode only | +| 62 | LastLog | []byte | v6 | The last message emitted. Empty bytes if none were emitted. Application mode only | +| 63 | StateProofPK | []byte | v6 | 64 byte state proof public key commitment | Additional details in the [opcodes document](TEAL_opcodes.md#txn) on the `txn` op. @@ -327,20 +485,23 @@ Additional details in the [opcodes document](TEAL_opcodes.md#txn) on the `txn` o Global fields are fields that are common to all the transactions in the group. In particular it includes consensus parameters. -| Index | Name | Type | Notes | -| --- | --- | --- | --- | -| 0 | MinTxnFee | uint64 | micro Algos | -| 1 | MinBalance | uint64 | micro Algos | -| 2 | MaxTxnLife | uint64 | rounds | -| 3 | ZeroAddress | []byte | 32 byte address of all zero bytes | -| 4 | GroupSize | uint64 | Number of transactions in this atomic transaction group. At least 1 | -| 5 | LogicSigVersion | uint64 | Maximum supported TEAL version. LogicSigVersion >= 2. | -| 6 | Round | uint64 | Current round number. LogicSigVersion >= 2. | -| 7 | LatestTimestamp | uint64 | Last confirmed block UNIX timestamp. Fails if negative. LogicSigVersion >= 2. | -| 8 | CurrentApplicationID | uint64 | ID of current application executing. Fails in LogicSigs. LogicSigVersion >= 2. | -| 9 | CreatorAddress | []byte | Address of the creator of the current application. Fails if no such application is executing. LogicSigVersion >= 3. | -| 10 | CurrentApplicationAddress | []byte | Address that the current application controls. Fails in LogicSigs. LogicSigVersion >= 5. | -| 11 | GroupID | []byte | ID of the transaction group. 32 zero bytes if the transaction is not part of a group. LogicSigVersion >= 5. | +| Index | Name | Type | In | Notes | +| - | ------ | -- | - | --------- | +| 0 | MinTxnFee | uint64 | | microalgos | +| 1 | MinBalance | uint64 | | microalgos | +| 2 | MaxTxnLife | uint64 | | rounds | +| 3 | ZeroAddress | []byte | | 32 byte address of all zero bytes | +| 4 | GroupSize | uint64 | | Number of transactions in this atomic transaction group. At least 1 | +| 5 | LogicSigVersion | uint64 | v2 | Maximum supported version | +| 6 | Round | uint64 | v2 | Current round number. Application mode only. | +| 7 | LatestTimestamp | uint64 | v2 | Last confirmed block UNIX timestamp. Fails if negative. Application mode only. | +| 8 | CurrentApplicationID | uint64 | v2 | ID of current application executing. Application mode only. | +| 9 | CreatorAddress | []byte | v3 | Address of the creator of the current application. Application mode only. | +| 10 | CurrentApplicationAddress | []byte | v5 | Address that the current application controls. Application mode only. | +| 11 | GroupID | []byte | v5 | ID of the transaction group. 32 zero bytes if the transaction is not part of a group. | +| 12 | OpcodeBudget | uint64 | v6 | The remaining cost that can be spent by opcodes in this program. | +| 13 | CallerApplicationID | uint64 | v6 | The application ID of the application that called this application. 0 if this application is at the top-level. Application mode only. | +| 14 | CallerApplicationAddress | []byte | v6 | The application address of the application that called this application. ZeroAddress if this application is at the top-level. Application mode only. | **Asset Fields** @@ -348,25 +509,25 @@ Global fields are fields that are common to all the transactions in the group. I Asset fields include `AssetHolding` and `AssetParam` fields that are used in the `asset_holding_get` and `asset_params_get` opcodes. | Index | Name | Type | Notes | -| --- | --- | --- | --- | +| - | ------ | -- | --------- | | 0 | AssetBalance | uint64 | Amount of the asset unit held by this account | | 1 | AssetFrozen | uint64 | Is the asset frozen or not | -| Index | Name | Type | Notes | -| --- | --- | --- | --- | -| 0 | AssetTotal | uint64 | Total number of units of this asset | -| 1 | AssetDecimals | uint64 | See AssetParams.Decimals | -| 2 | AssetDefaultFrozen | uint64 | Frozen by default or not | -| 3 | AssetUnitName | []byte | Asset unit name | -| 4 | AssetName | []byte | Asset name | -| 5 | AssetURL | []byte | URL with additional info about the asset | -| 6 | AssetMetadataHash | []byte | Arbitrary commitment | -| 7 | AssetManager | []byte | Manager commitment | -| 8 | AssetReserve | []byte | Reserve address | -| 9 | AssetFreeze | []byte | Freeze address | -| 10 | AssetClawback | []byte | Clawback address | -| 11 | AssetCreator | []byte | Creator address. LogicSigVersion >= 5. | +| Index | Name | Type | In | Notes | +| - | ------ | -- | - | --------- | +| 0 | AssetTotal | uint64 | | Total number of units of this asset | +| 1 | AssetDecimals | uint64 | | See AssetParams.Decimals | +| 2 | AssetDefaultFrozen | uint64 | | Frozen by default or not | +| 3 | AssetUnitName | []byte | | Asset unit name | +| 4 | AssetName | []byte | | Asset name | +| 5 | AssetURL | []byte | | URL with additional info about the asset | +| 6 | AssetMetadataHash | []byte | | Arbitrary commitment | +| 7 | AssetManager | []byte | | Manager commitment | +| 8 | AssetReserve | []byte | | Reserve address | +| 9 | AssetFreeze | []byte | | Freeze address | +| 10 | AssetClawback | []byte | | Clawback address | +| 11 | AssetCreator | []byte | v5 | Creator address | **App Fields** @@ -374,7 +535,7 @@ Asset fields include `AssetHolding` and `AssetParam` fields that are used in the App fields used in the `app_params_get` opcode. | Index | Name | Type | Notes | -| --- | --- | --- | --- | +| - | ------ | -- | --------- | | 0 | AppApprovalProgram | []byte | Bytecode of Approval Program | | 1 | AppClearStateProgram | []byte | Bytecode of Clear State Program | | 2 | AppGlobalNumUint | uint64 | Number of uint64 values allowed in Global State | @@ -386,46 +547,58 @@ App fields used in the `app_params_get` opcode. | 8 | AppAddress | []byte | Address for which this application has authority | +**Account Fields** + +Account fields used in the `acct_params_get` opcode. + +| Index | Name | Type | Notes | +| - | ------ | -- | --------- | +| 0 | AcctBalance | uint64 | Account balance in microalgos | +| 1 | AcctMinBalance | uint64 | Minimum required blance for account, in microalgos | +| 2 | AcctAuthAddr | []byte | Address the account is rekeyed to. | + + ### Flow Control -| Op | Description | -| --- | --- | -| `err` | Error. Fail immediately. This is primarily a fencepost against accidental zero bytes getting compiled into programs. | -| `bnz target` | branch to TARGET if value X is not zero | -| `bz target` | branch to TARGET if value X is zero | +| Opcode | Description | +| - | -- | +| `err` | Fail immediately. | +| `bnz target` | branch to TARGET if value A is not zero | +| `bz target` | branch to TARGET if value A is zero | | `b target` | branch unconditionally to TARGET | -| `return` | use last value on stack as success value; end | -| `pop` | discard value X from stack | -| `dup` | duplicate last value on stack | -| `dup2` | duplicate two last values on stack: A, B -> A, B, A, B | -| `dig n` | push the Nth value from the top of the stack. dig 0 is equivalent to dup | +| `return` | use A as success value; end | +| `pop` | discard A | +| `dup` | duplicate A | +| `dup2` | duplicate A and B | +| `dig n` | Nth value from the top of the stack. dig 0 is equivalent to dup | | `cover n` | remove top of stack, and place it deeper in the stack such that N elements are above it. Fails if stack depth <= N. | | `uncover n` | remove the value at depth N in the stack and shift above items down so the Nth deep value is on top of the stack. Fails if stack depth <= N. | -| `swap` | swaps two last values on stack: A, B -> B, A | -| `select` | selects one of two values based on top-of-stack: A, B, C -> (if C != 0 then B else A) | -| `assert` | immediately fail unless value X is a non-zero number | +| `swap` | swaps A and B on stack | +| `select` | selects one of two values based on top-of-stack: B if C != 0, else A | +| `assert` | immediately fail unless A is a non-zero number | | `callsub target` | branch unconditionally to TARGET, saving the next instruction on the call stack | | `retsub` | pop the top instruction from the call stack and branch to it | ### State Access -| Op | Description | -| --- | --- | +| Opcode | Description | +| - | -- | | `balance` | get balance for account A, in microalgos. The balance is observed after the effects of previous transactions in the group, and after the fee for the current transaction is deducted. | | `min_balance` | get minimum required balance for account A, in microalgos. Required balance is affected by [ASA](https://developer.algorand.org/docs/features/asa/#assets-overview) and [App](https://developer.algorand.org/docs/features/asc1/stateful/#minimum-balance-requirement-for-a-smart-contract) usage. When creating or opting into an app, the minimum balance grows before the app code runs, therefore the increase is visible there. When deleting or closing out, the minimum balance decreases after the app executes. | -| `app_opted_in` | check if account A opted in for the application B => {0 or 1} | -| `app_local_get` | read from account A from local state of the current application key B => value | -| `app_local_get_ex` | read from account A from local state of the application B key C => [*... stack*, value, 0 or 1] | -| `app_global_get` | read key A from global state of a current application => value | -| `app_global_get_ex` | read from application A global state key B => [*... stack*, value, 0 or 1] | -| `app_local_put` | write to account specified by A to local state of a current application key B with value C | -| `app_global_put` | write key A and value B to global state of the current application | -| `app_local_del` | delete from account A local state key B of the current application | -| `app_global_del` | delete key A from a global state of the current application | -| `asset_holding_get i` | read from account A and asset B holding field X (imm arg) => {0 or 1 (top), value} | -| `asset_params_get i` | read from asset A params field X (imm arg) => {0 or 1 (top), value} | -| `app_params_get i` | read from app A params field X (imm arg) => {0 or 1 (top), value} | -| `log` | write bytes to log state of the current application | +| `app_opted_in` | 1 if account A is opted in to application B, else 0 | +| `app_local_get` | local state of the key B in the current application in account A | +| `app_local_get_ex` | X is the local state of application B, key C in account A. Y is 1 if key existed, else 0 | +| `app_global_get` | global state of the key A in the current application | +| `app_global_get_ex` | X is the global state of application A, key B. Y is 1 if key existed, else 0 | +| `app_local_put` | write C to key B in account A's local state of the current application | +| `app_global_put` | write B to key A in the global state of the current application | +| `app_local_del` | delete key B from account A's local state of the current application | +| `app_global_del` | delete key A from the global state of the current application | +| `asset_holding_get f` | X is field F from account A's holding of asset B. Y is 1 if A is opted into B, else 0 | +| `asset_params_get f` | X is field F from asset A. Y is 1 if A exists, else 0 | +| `app_params_get f` | X is field F from app A. Y is 1 if A exists, else 0 | +| `acct_params_get f` | X is field F from account A. Y is 1 if A owns positive algos, else 0 | +| `log` | write A to log state of the current application | ### Inner Transactions @@ -435,50 +608,62 @@ of a true top-level transaction, programatically. However, they are different in significant ways. The most important differences are that they are not signed, duplicates are not rejected, and they do not appear in the block in the usual away. Instead, their effects are -noted in metadata associated with the associated top-level application +noted in metadata associated with their top-level application call transaction. An inner transaction's `Sender` must be the SHA512_256 hash of the application ID (prefixed by "appID"), or an account that has been rekeyed to that hash. -Currently, inner transactions may perform `pay`, `axfer`, `acfg`, and +In v5, inner transactions may perform `pay`, `axfer`, `acfg`, and `afrz` effects. After executing an inner transaction with `itxn_submit`, the effects of the transaction are visible begining with the next instruction with, for example, `balance` and -`min_balance` checks. - -Of the transaction Header fields, only a few fields may be set: -`Type`/`TypeEnum`, `Sender`, and `Fee`. For the specific fields of -each transaction types, any field, except `RekeyTo` may be set. This -allows, for example, clawback transactions, asset opt-ins, and asset -creates in addtion to the more common uses of `axfer` and `acfg`. All -fields default to the zero value, except those described under -`itxn_begin`. +`min_balance` checks. In v6, inner transactions may also perform +`keyreg` and `appl` effects. Inner `appl` calls fail if they attempt +to invoke a program with version less than v6. + +In v5, only a subset of the transaction's header fields may be set: `Type`/`TypeEnum`, +`Sender`, and `Fee`. In v6, header fields `Note` and `RekeyTo` may +also be set. For the specific (non-header) fields of each transaction +type, any field may be set. This allows, for example, clawback +transactions, asset opt-ins, and asset creates in addition to the more +common uses of `axfer` and `acfg`. All fields default to the zero +value, except those described under `itxn_begin`. Fields may be set multiple times, but may not be read. The most recent -setting is used when `itxn_submit` executes. (For this purpose `Type` -and `TypeEnum` are considered to be the same field.) `itxn_field` -fails immediately for unsupported fields, unsupported transaction -types, or improperly typed values for a particular field. `itxn_field` -makes aceptance decisions entirely from the field and value provided, -never considering previously set fields. Illegal interactions between -fields, such as setting fields that belong to two different -transaction types, are rejected by `itxn_submit`. - -| Op | Description | -| --- | --- | +setting is used when `itxn_submit` executes. For this purpose `Type` +and `TypeEnum` are considered to be the same field. When using +`itxn_field` to set an array field (`ApplicationArgs` `Accounts`, +`Assets`, or `Applications`) each use adds an element to the end of +the the array, rather than setting the entire array at once. + +`itxn_field` fails immediately for unsupported fields, unsupported +transaction types, or improperly typed values for a particular +field. `itxn_field` makes acceptance decisions entirely from the field +and value provided, never considering previously set fields. Illegal +interactions between fields, such as setting fields that belong to two +different transaction types, are rejected by `itxn_submit`. + +| Opcode | Description | +| - | -- | | `itxn_begin` | begin preparation of a new inner transaction in a new transaction group | | `itxn_next` | begin preparation of a new inner transaction in the same transaction group | -| `itxn_field f` | set field F of the current inner transaction to X | -| `itxn_submit` | execute the current inner transaction group. Fail if executing this group would exceed 16 total inner transactions, or if any transaction in the group fails. | -| `itxn f` | push field F of the last inner transaction to stack | -| `itxna f i` | push Ith value of the array field F of the last inner transaction to stack | +| `itxn_field f` | set field F of the current inner transaction to A | +| `itxn_submit` | execute the current inner transaction group. Fail if executing this group would exceed the inner transaction limit, or if any transaction in the group fails. | +| `itxn f` | field F of the last inner transaction | +| `itxna f i` | Ith value of the array field F of the last inner transaction | +| `itxnas f` | Ath value of the array field F of the last inner transaction | +| `gitxn t f` | field F of the Tth transaction in the last inner group submitted | +| `gitxna t f i` | Ith value of the array field F from the Tth transaction in the last inner group submitted | +| `gitxnas t f` | Ath value of the array field F from the Tth transaction in the last inner group submitted | # Assembler Syntax -The assembler parses line by line. Ops that just use the stack appear on a line by themselves. Ops that take arguments are the op and then whitespace and then any argument or arguments. +The assembler parses line by line. Ops that only take stack arguments +appear on a line by themselves. Immediate arguments follow the opcode +on the same line, separated by whitespace. -The first line may contain a special version pragma `#pragma version X`, which directs the assembler to generate TEAL bytecode targeting a certain version. For instance, `#pragma version 2` produces bytecode targeting TEAL v2. By default, the assembler targets TEAL v1. +The first line may contain a special version pragma `#pragma version X`, which directs the assembler to generate AVM bytecode targeting a certain version. For instance, `#pragma version 2` produces bytecode targeting TEAL v2. By default, the assembler targets TEAL v1. Subsequent lines may contain other pragma declarations (i.e., `#pragma `), pertaining to checks that the assembler should perform before agreeing to emit the program bytes, specific optimizations, etc. Those declarations are optional and cannot alter the semantics as described in this document. @@ -486,7 +671,7 @@ Subsequent lines may contain other pragma declarations (i.e., `#pragma `), pertaining to checks that the assembler should perform before agreeing to emit the program bytes, specific optimizations, etc. Those declarations are optional and cannot alter the semantics as described in this document. @@ -208,7 +374,7 @@ Subsequent lines may contain other pragma declarations (i.e., `#pragma = 2) + - 7 (v1) + - 35 (since v2) ## keccak256 - Opcode: 0x02 -- Pops: *... stack*, []byte -- Pushes: []byte -- Keccak256 hash of value X, yields [32]byte +- Stack: ..., A: []byte → ..., []byte +- Keccak256 hash of value A, yields [32]byte - **Cost**: - - 26 (LogicSigVersion = 1) - - 130 (LogicSigVersion >= 2) + - 26 (v1) + - 130 (since v2) ## sha512_256 - Opcode: 0x03 -- Pops: *... stack*, []byte -- Pushes: []byte -- SHA512_256 hash of value X, yields [32]byte +- Stack: ..., A: []byte → ..., []byte +- SHA512_256 hash of value A, yields [32]byte - **Cost**: - - 9 (LogicSigVersion = 1) - - 45 (LogicSigVersion >= 2) + - 9 (v1) + - 45 (since v2) ## ed25519verify - Opcode: 0x04 -- Pops: *... stack*, {[]byte A}, {[]byte B}, {[]byte C} -- Pushes: uint64 +- Stack: ..., A: []byte, B: []byte, C: []byte → ..., uint64 - for (data A, signature B, pubkey C) verify the signature of ("ProgData" || program_hash || data) against the pubkey => {0 or 1} - **Cost**: 1900 @@ -53,16 +48,15 @@ The 32 byte public key is the last element on the stack, preceded by the 64 byte ## ecdsa_verify v - Opcode: 0x05 {uint8 curve index} -- Pops: *... stack*, {[]byte A}, {[]byte B}, {[]byte C}, {[]byte D}, {[]byte E} -- Pushes: uint64 +- Stack: ..., A: []byte, B: []byte, C: []byte, D: []byte, E: []byte → ..., uint64 - for (data A, signature B, C and pubkey D, E) verify the signature of the data against the pubkey => {0 or 1} - **Cost**: 1700 -- LogicSigVersion >= 5 +- Availability: v5 `ECDSA` Curves: | Index | Name | Notes | -| --- | --- | --- | +| - | ------ | --------- | | 0 | Secp256k1 | secp256k1 curve | @@ -71,16 +65,15 @@ The 32 byte Y-component of a public key is the last element on the stack, preced ## ecdsa_pk_decompress v - Opcode: 0x06 {uint8 curve index} -- Pops: *... stack*, []byte -- Pushes: *... stack*, []byte, []byte -- decompress pubkey A into components X, Y => [*... stack*, X, Y] +- Stack: ..., A: []byte → ..., X: []byte, Y: []byte +- decompress pubkey A into components X, Y - **Cost**: 650 -- LogicSigVersion >= 5 +- Availability: v5 `ECDSA` Curves: | Index | Name | Notes | -| --- | --- | --- | +| - | ------ | --------- | | 0 | Secp256k1 | secp256k1 curve | @@ -89,16 +82,15 @@ The 33 byte public key in a compressed form to be decompressed into X and Y (top ## ecdsa_pk_recover v - Opcode: 0x07 {uint8 curve index} -- Pops: *... stack*, {[]byte A}, {uint64 B}, {[]byte C}, {[]byte D} -- Pushes: *... stack*, []byte, []byte -- for (data A, recovery id B, signature C, D) recover a public key => [*... stack*, X, Y] +- Stack: ..., A: []byte, B: uint64, C: []byte, D: []byte → ..., X: []byte, Y: []byte +- for (data A, recovery id B, signature C, D) recover a public key - **Cost**: 2000 -- LogicSigVersion >= 5 +- Availability: v5 `ECDSA` Curves: | Index | Name | Notes | -| --- | --- | --- | +| - | ------ | --------- | | 0 | Secp256k1 | secp256k1 curve | @@ -107,8 +99,7 @@ S (top) and R elements of a signature, recovery id and data (bottom) are expecte ## + - Opcode: 0x08 -- Pops: *... stack*, {uint64 A}, {uint64 B} -- Pushes: uint64 +- Stack: ..., A: uint64, B: uint64 → ..., uint64 - A plus B. Fail on overflow. Overflow is an error condition which halts execution and fails the transaction. Full precision is available from `addw`. @@ -116,15 +107,13 @@ Overflow is an error condition which halts execution and fails the transaction. ## - - Opcode: 0x09 -- Pops: *... stack*, {uint64 A}, {uint64 B} -- Pushes: uint64 +- Stack: ..., A: uint64, B: uint64 → ..., uint64 - A minus B. Fail if B > A. ## / - Opcode: 0x0a -- Pops: *... stack*, {uint64 A}, {uint64 B} -- Pushes: uint64 +- Stack: ..., A: uint64, B: uint64 → ..., uint64 - A divided by B (truncated division). Fail if B == 0. `divmodw` is available to divide the two-element values produced by `mulw` and `addw`. @@ -132,8 +121,7 @@ Overflow is an error condition which halts execution and fails the transaction. ## * - Opcode: 0x0b -- Pops: *... stack*, {uint64 A}, {uint64 B} -- Pushes: uint64 +- Stack: ..., A: uint64, B: uint64 → ..., uint64 - A times B. Fail on overflow. Overflow is an error condition which halts execution and fails the transaction. Full precision is available from `mulw`. @@ -141,153 +129,134 @@ Overflow is an error condition which halts execution and fails the transaction. ## < - Opcode: 0x0c -- Pops: *... stack*, {uint64 A}, {uint64 B} -- Pushes: uint64 +- Stack: ..., A: uint64, B: uint64 → ..., uint64 - A less than B => {0 or 1} ## > - Opcode: 0x0d -- Pops: *... stack*, {uint64 A}, {uint64 B} -- Pushes: uint64 +- Stack: ..., A: uint64, B: uint64 → ..., uint64 - A greater than B => {0 or 1} ## <= - Opcode: 0x0e -- Pops: *... stack*, {uint64 A}, {uint64 B} -- Pushes: uint64 +- Stack: ..., A: uint64, B: uint64 → ..., uint64 - A less than or equal to B => {0 or 1} ## >= - Opcode: 0x0f -- Pops: *... stack*, {uint64 A}, {uint64 B} -- Pushes: uint64 +- Stack: ..., A: uint64, B: uint64 → ..., uint64 - A greater than or equal to B => {0 or 1} ## && - Opcode: 0x10 -- Pops: *... stack*, {uint64 A}, {uint64 B} -- Pushes: uint64 +- Stack: ..., A: uint64, B: uint64 → ..., uint64 - A is not zero and B is not zero => {0 or 1} ## || - Opcode: 0x11 -- Pops: *... stack*, {uint64 A}, {uint64 B} -- Pushes: uint64 +- Stack: ..., A: uint64, B: uint64 → ..., uint64 - A is not zero or B is not zero => {0 or 1} ## == - Opcode: 0x12 -- Pops: *... stack*, {any A}, {any B} -- Pushes: uint64 +- Stack: ..., A, B → ..., uint64 - A is equal to B => {0 or 1} ## != - Opcode: 0x13 -- Pops: *... stack*, {any A}, {any B} -- Pushes: uint64 +- Stack: ..., A, B → ..., uint64 - A is not equal to B => {0 or 1} ## ! - Opcode: 0x14 -- Pops: *... stack*, uint64 -- Pushes: uint64 -- X == 0 yields 1; else 0 +- Stack: ..., A: uint64 → ..., uint64 +- A == 0 yields 1; else 0 ## len - Opcode: 0x15 -- Pops: *... stack*, []byte -- Pushes: uint64 -- yields length of byte value X +- Stack: ..., A: []byte → ..., uint64 +- yields length of byte value A ## itob - Opcode: 0x16 -- Pops: *... stack*, uint64 -- Pushes: []byte -- converts uint64 X to big endian bytes +- Stack: ..., A: uint64 → ..., []byte +- converts uint64 A to big endian bytes ## btoi - Opcode: 0x17 -- Pops: *... stack*, []byte -- Pushes: uint64 -- converts bytes X as big endian to uint64 +- Stack: ..., A: []byte → ..., uint64 +- converts bytes A as big endian to uint64 `btoi` fails if the input is longer than 8 bytes. ## % - Opcode: 0x18 -- Pops: *... stack*, {uint64 A}, {uint64 B} -- Pushes: uint64 +- Stack: ..., A: uint64, B: uint64 → ..., uint64 - A modulo B. Fail if B == 0. ## | - Opcode: 0x19 -- Pops: *... stack*, {uint64 A}, {uint64 B} -- Pushes: uint64 +- Stack: ..., A: uint64, B: uint64 → ..., uint64 - A bitwise-or B ## & - Opcode: 0x1a -- Pops: *... stack*, {uint64 A}, {uint64 B} -- Pushes: uint64 +- Stack: ..., A: uint64, B: uint64 → ..., uint64 - A bitwise-and B ## ^ - Opcode: 0x1b -- Pops: *... stack*, {uint64 A}, {uint64 B} -- Pushes: uint64 +- Stack: ..., A: uint64, B: uint64 → ..., uint64 - A bitwise-xor B ## ~ - Opcode: 0x1c -- Pops: *... stack*, uint64 -- Pushes: uint64 -- bitwise invert value X +- Stack: ..., A: uint64 → ..., uint64 +- bitwise invert value A ## mulw - Opcode: 0x1d -- Pops: *... stack*, {uint64 A}, {uint64 B} -- Pushes: *... stack*, uint64, uint64 -- A times B out to 128-bit long result as low (top) and high uint64 values on the stack +- Stack: ..., A: uint64, B: uint64 → ..., X: uint64, Y: uint64 +- A times B as a 128-bit result in two uint64s. X is the high 64 bits, Y is the low ## addw - Opcode: 0x1e -- Pops: *... stack*, {uint64 A}, {uint64 B} -- Pushes: *... stack*, uint64, uint64 -- A plus B out to 128-bit long result as sum (top) and carry-bit uint64 values on the stack -- LogicSigVersion >= 2 +- Stack: ..., A: uint64, B: uint64 → ..., X: uint64, Y: uint64 +- A plus B as a 128-bit result. X is the carry-bit, Y is the low-order 64 bits. +- Availability: v2 ## divmodw - Opcode: 0x1f -- Pops: *... stack*, {uint64 A}, {uint64 B}, {uint64 C}, {uint64 D} -- Pushes: *... stack*, uint64, uint64, uint64, uint64 -- Pop four uint64 values. The deepest two are interpreted as a uint128 dividend (deepest value is high word), the top two are interpreted as a uint128 divisor. Four uint64 values are pushed to the stack. The deepest two are the quotient (deeper value is the high uint64). The top two are the remainder, low bits on top. +- Stack: ..., A: uint64, B: uint64, C: uint64, D: uint64 → ..., W: uint64, X: uint64, Y: uint64, Z: uint64 +- W,X = (A,B / C,D); Y,Z = (A,B modulo C,D) - **Cost**: 20 -- LogicSigVersion >= 4 +- Availability: v4 + +The notation J,K indicates that two uint64 values J and K are interpreted as a uint128 value, with J as the high uint64 and K the low. ## intcblock uint ... - Opcode: 0x20 {varuint length} [{varuint value}, ...] -- Pops: _None_ -- Pushes: _None_ +- Stack: ... → ... - prepare block of uint64 constants for use by intc `intcblock` loads following program bytes into an array of integer constants in the evaluator. These integer constants can be referred to by `intc` and `intc_*` which will push the value onto the stack. Subsequent calls to `intcblock` reset and replace the integer constants available to the script. @@ -295,43 +264,37 @@ Overflow is an error condition which halts execution and fails the transaction. ## intc i - Opcode: 0x21 {uint8 int constant index} -- Pops: _None_ -- Pushes: uint64 -- push Ith constant from intcblock to stack +- Stack: ... → ..., uint64 +- Ith constant from intcblock ## intc_0 - Opcode: 0x22 -- Pops: _None_ -- Pushes: uint64 -- push constant 0 from intcblock to stack +- Stack: ... → ..., uint64 +- constant 0 from intcblock ## intc_1 - Opcode: 0x23 -- Pops: _None_ -- Pushes: uint64 -- push constant 1 from intcblock to stack +- Stack: ... → ..., uint64 +- constant 1 from intcblock ## intc_2 - Opcode: 0x24 -- Pops: _None_ -- Pushes: uint64 -- push constant 2 from intcblock to stack +- Stack: ... → ..., uint64 +- constant 2 from intcblock ## intc_3 - Opcode: 0x25 -- Pops: _None_ -- Pushes: uint64 -- push constant 3 from intcblock to stack +- Stack: ... → ..., uint64 +- constant 3 from intcblock ## bytecblock bytes ... - Opcode: 0x26 {varuint length} [({varuint value length} bytes), ...] -- Pops: _None_ -- Pushes: _None_ +- Stack: ... → ... - prepare block of byte-array constants for use by bytec `bytecblock` loads the following program bytes into an array of byte-array constants in the evaluator. These constants can be referred to by `bytec` and `bytec_*` which will push the value onto the stack. Subsequent calls to `bytecblock` reset and replace the bytes constants available to the script. @@ -339,151 +302,142 @@ Overflow is an error condition which halts execution and fails the transaction. ## bytec i - Opcode: 0x27 {uint8 byte constant index} -- Pops: _None_ -- Pushes: []byte -- push Ith constant from bytecblock to stack +- Stack: ... → ..., []byte +- Ith constant from bytecblock ## bytec_0 - Opcode: 0x28 -- Pops: _None_ -- Pushes: []byte -- push constant 0 from bytecblock to stack +- Stack: ... → ..., []byte +- constant 0 from bytecblock ## bytec_1 - Opcode: 0x29 -- Pops: _None_ -- Pushes: []byte -- push constant 1 from bytecblock to stack +- Stack: ... → ..., []byte +- constant 1 from bytecblock ## bytec_2 - Opcode: 0x2a -- Pops: _None_ -- Pushes: []byte -- push constant 2 from bytecblock to stack +- Stack: ... → ..., []byte +- constant 2 from bytecblock ## bytec_3 - Opcode: 0x2b -- Pops: _None_ -- Pushes: []byte -- push constant 3 from bytecblock to stack +- Stack: ... → ..., []byte +- constant 3 from bytecblock ## arg n - Opcode: 0x2c {uint8 arg index N} -- Pops: _None_ -- Pushes: []byte -- push Nth LogicSig argument to stack +- Stack: ... → ..., []byte +- Nth LogicSig argument - Mode: Signature ## arg_0 - Opcode: 0x2d -- Pops: _None_ -- Pushes: []byte -- push LogicSig argument 0 to stack +- Stack: ... → ..., []byte +- LogicSig argument 0 - Mode: Signature ## arg_1 - Opcode: 0x2e -- Pops: _None_ -- Pushes: []byte -- push LogicSig argument 1 to stack +- Stack: ... → ..., []byte +- LogicSig argument 1 - Mode: Signature ## arg_2 - Opcode: 0x2f -- Pops: _None_ -- Pushes: []byte -- push LogicSig argument 2 to stack +- Stack: ... → ..., []byte +- LogicSig argument 2 - Mode: Signature ## arg_3 - Opcode: 0x30 -- Pops: _None_ -- Pushes: []byte -- push LogicSig argument 3 to stack +- Stack: ... → ..., []byte +- LogicSig argument 3 - Mode: Signature ## txn f - Opcode: 0x31 {uint8 transaction field index} -- Pops: _None_ -- Pushes: any -- push field F of current transaction to stack +- Stack: ... → ..., any +- field F of current transaction `txn` Fields (see [transaction reference](https://developer.algorand.org/docs/reference/transactions/)): -| Index | Name | Type | Notes | -| --- | --- | --- | --- | -| 0 | Sender | []byte | 32 byte address | -| 1 | Fee | uint64 | micro-Algos | -| 2 | FirstValid | uint64 | round number | -| 3 | FirstValidTime | uint64 | Causes program to fail; reserved for future use | -| 4 | LastValid | uint64 | round number | -| 5 | Note | []byte | Any data up to 1024 bytes | -| 6 | Lease | []byte | 32 byte lease value | -| 7 | Receiver | []byte | 32 byte address | -| 8 | Amount | uint64 | micro-Algos | -| 9 | CloseRemainderTo | []byte | 32 byte address | -| 10 | VotePK | []byte | 32 byte address | -| 11 | SelectionPK | []byte | 32 byte address | -| 12 | VoteFirst | uint64 | The first round that the participation key is valid. | -| 13 | VoteLast | uint64 | The last round that the participation key is valid. | -| 14 | VoteKeyDilution | uint64 | Dilution for the 2-level participation key | -| 15 | Type | []byte | Transaction type as bytes | -| 16 | TypeEnum | uint64 | See table below | -| 17 | XferAsset | uint64 | Asset ID | -| 18 | AssetAmount | uint64 | value in Asset's units | -| 19 | AssetSender | []byte | 32 byte address. Causes clawback of all value of asset from AssetSender if Sender is the Clawback address of the asset. | -| 20 | AssetReceiver | []byte | 32 byte address | -| 21 | AssetCloseTo | []byte | 32 byte address | -| 22 | GroupIndex | uint64 | Position of this transaction within an atomic transaction group. A stand-alone transaction is implicitly element 0 in a group of 1 | -| 23 | TxID | []byte | The computed ID for this transaction. 32 bytes. | -| 24 | ApplicationID | uint64 | ApplicationID from ApplicationCall transaction. LogicSigVersion >= 2. | -| 25 | OnCompletion | uint64 | ApplicationCall transaction on completion action. LogicSigVersion >= 2. | -| 26 | ApplicationArgs | []byte | Arguments passed to the application in the ApplicationCall transaction. LogicSigVersion >= 2. | -| 27 | NumAppArgs | uint64 | Number of ApplicationArgs. LogicSigVersion >= 2. | -| 28 | Accounts | []byte | Accounts listed in the ApplicationCall transaction. LogicSigVersion >= 2. | -| 29 | NumAccounts | uint64 | Number of Accounts. LogicSigVersion >= 2. | -| 30 | ApprovalProgram | []byte | Approval program. LogicSigVersion >= 2. | -| 31 | ClearStateProgram | []byte | Clear state program. LogicSigVersion >= 2. | -| 32 | RekeyTo | []byte | 32 byte Sender's new AuthAddr. LogicSigVersion >= 2. | -| 33 | ConfigAsset | uint64 | Asset ID in asset config transaction. LogicSigVersion >= 2. | -| 34 | ConfigAssetTotal | uint64 | Total number of units of this asset created. LogicSigVersion >= 2. | -| 35 | ConfigAssetDecimals | uint64 | Number of digits to display after the decimal place when displaying the asset. LogicSigVersion >= 2. | -| 36 | ConfigAssetDefaultFrozen | uint64 | Whether the asset's slots are frozen by default or not, 0 or 1. LogicSigVersion >= 2. | -| 37 | ConfigAssetUnitName | []byte | Unit name of the asset. LogicSigVersion >= 2. | -| 38 | ConfigAssetName | []byte | The asset name. LogicSigVersion >= 2. | -| 39 | ConfigAssetURL | []byte | URL. LogicSigVersion >= 2. | -| 40 | ConfigAssetMetadataHash | []byte | 32 byte commitment to some unspecified asset metadata. LogicSigVersion >= 2. | -| 41 | ConfigAssetManager | []byte | 32 byte address. LogicSigVersion >= 2. | -| 42 | ConfigAssetReserve | []byte | 32 byte address. LogicSigVersion >= 2. | -| 43 | ConfigAssetFreeze | []byte | 32 byte address. LogicSigVersion >= 2. | -| 44 | ConfigAssetClawback | []byte | 32 byte address. LogicSigVersion >= 2. | -| 45 | FreezeAsset | uint64 | Asset ID being frozen or un-frozen. LogicSigVersion >= 2. | -| 46 | FreezeAssetAccount | []byte | 32 byte address of the account whose asset slot is being frozen or un-frozen. LogicSigVersion >= 2. | -| 47 | FreezeAssetFrozen | uint64 | The new frozen value, 0 or 1. LogicSigVersion >= 2. | -| 48 | Assets | uint64 | Foreign Assets listed in the ApplicationCall transaction. LogicSigVersion >= 3. | -| 49 | NumAssets | uint64 | Number of Assets. LogicSigVersion >= 3. | -| 50 | Applications | uint64 | Foreign Apps listed in the ApplicationCall transaction. LogicSigVersion >= 3. | -| 51 | NumApplications | uint64 | Number of Applications. LogicSigVersion >= 3. | -| 52 | GlobalNumUint | uint64 | Number of global state integers in ApplicationCall. LogicSigVersion >= 3. | -| 53 | GlobalNumByteSlice | uint64 | Number of global state byteslices in ApplicationCall. LogicSigVersion >= 3. | -| 54 | LocalNumUint | uint64 | Number of local state integers in ApplicationCall. LogicSigVersion >= 3. | -| 55 | LocalNumByteSlice | uint64 | Number of local state byteslices in ApplicationCall. LogicSigVersion >= 3. | -| 56 | ExtraProgramPages | uint64 | Number of additional pages for each of the application's approval and clear state programs. An ExtraProgramPages of 1 means 2048 more total bytes, or 1024 for each program. LogicSigVersion >= 4. | -| 57 | Nonparticipation | uint64 | Marks an account nonparticipating for rewards. LogicSigVersion >= 5. | -| 58 | Logs | []byte | Log messages emitted by an application call (itxn only). LogicSigVersion >= 5. | -| 59 | NumLogs | uint64 | Number of Logs (itxn only). LogicSigVersion >= 5. | -| 60 | CreatedAssetID | uint64 | Asset ID allocated by the creation of an ASA (itxn only). LogicSigVersion >= 5. | -| 61 | CreatedApplicationID | uint64 | ApplicationID allocated by the creation of an application (itxn only). LogicSigVersion >= 5. | +| Index | Name | Type | In | Notes | +| - | ------ | -- | - | --------- | +| 0 | Sender | []byte | | 32 byte address | +| 1 | Fee | uint64 | | microalgos | +| 2 | FirstValid | uint64 | | round number | +| 3 | FirstValidTime | uint64 | | Causes program to fail; reserved for future use | +| 4 | LastValid | uint64 | | round number | +| 5 | Note | []byte | | Any data up to 1024 bytes | +| 6 | Lease | []byte | | 32 byte lease value | +| 7 | Receiver | []byte | | 32 byte address | +| 8 | Amount | uint64 | | microalgos | +| 9 | CloseRemainderTo | []byte | | 32 byte address | +| 10 | VotePK | []byte | | 32 byte address | +| 11 | SelectionPK | []byte | | 32 byte address | +| 12 | VoteFirst | uint64 | | The first round that the participation key is valid. | +| 13 | VoteLast | uint64 | | The last round that the participation key is valid. | +| 14 | VoteKeyDilution | uint64 | | Dilution for the 2-level participation key | +| 15 | Type | []byte | | Transaction type as bytes | +| 16 | TypeEnum | uint64 | | See table below | +| 17 | XferAsset | uint64 | | Asset ID | +| 18 | AssetAmount | uint64 | | value in Asset's units | +| 19 | AssetSender | []byte | | 32 byte address. Causes clawback of all value of asset from AssetSender if Sender is the Clawback address of the asset. | +| 20 | AssetReceiver | []byte | | 32 byte address | +| 21 | AssetCloseTo | []byte | | 32 byte address | +| 22 | GroupIndex | uint64 | | Position of this transaction within an atomic transaction group. A stand-alone transaction is implicitly element 0 in a group of 1 | +| 23 | TxID | []byte | | The computed ID for this transaction. 32 bytes. | +| 24 | ApplicationID | uint64 | v2 | ApplicationID from ApplicationCall transaction | +| 25 | OnCompletion | uint64 | v2 | ApplicationCall transaction on completion action | +| 26 | ApplicationArgs | []byte | v2 | Arguments passed to the application in the ApplicationCall transaction | +| 27 | NumAppArgs | uint64 | v2 | Number of ApplicationArgs | +| 28 | Accounts | []byte | v2 | Accounts listed in the ApplicationCall transaction | +| 29 | NumAccounts | uint64 | v2 | Number of Accounts | +| 30 | ApprovalProgram | []byte | v2 | Approval program | +| 31 | ClearStateProgram | []byte | v2 | Clear state program | +| 32 | RekeyTo | []byte | v2 | 32 byte Sender's new AuthAddr | +| 33 | ConfigAsset | uint64 | v2 | Asset ID in asset config transaction | +| 34 | ConfigAssetTotal | uint64 | v2 | Total number of units of this asset created | +| 35 | ConfigAssetDecimals | uint64 | v2 | Number of digits to display after the decimal place when displaying the asset | +| 36 | ConfigAssetDefaultFrozen | uint64 | v2 | Whether the asset's slots are frozen by default or not, 0 or 1 | +| 37 | ConfigAssetUnitName | []byte | v2 | Unit name of the asset | +| 38 | ConfigAssetName | []byte | v2 | The asset name | +| 39 | ConfigAssetURL | []byte | v2 | URL | +| 40 | ConfigAssetMetadataHash | []byte | v2 | 32 byte commitment to some unspecified asset metadata | +| 41 | ConfigAssetManager | []byte | v2 | 32 byte address | +| 42 | ConfigAssetReserve | []byte | v2 | 32 byte address | +| 43 | ConfigAssetFreeze | []byte | v2 | 32 byte address | +| 44 | ConfigAssetClawback | []byte | v2 | 32 byte address | +| 45 | FreezeAsset | uint64 | v2 | Asset ID being frozen or un-frozen | +| 46 | FreezeAssetAccount | []byte | v2 | 32 byte address of the account whose asset slot is being frozen or un-frozen | +| 47 | FreezeAssetFrozen | uint64 | v2 | The new frozen value, 0 or 1 | +| 48 | Assets | uint64 | v3 | Foreign Assets listed in the ApplicationCall transaction | +| 49 | NumAssets | uint64 | v3 | Number of Assets | +| 50 | Applications | uint64 | v3 | Foreign Apps listed in the ApplicationCall transaction | +| 51 | NumApplications | uint64 | v3 | Number of Applications | +| 52 | GlobalNumUint | uint64 | v3 | Number of global state integers in ApplicationCall | +| 53 | GlobalNumByteSlice | uint64 | v3 | Number of global state byteslices in ApplicationCall | +| 54 | LocalNumUint | uint64 | v3 | Number of local state integers in ApplicationCall | +| 55 | LocalNumByteSlice | uint64 | v3 | Number of local state byteslices in ApplicationCall | +| 56 | ExtraProgramPages | uint64 | v4 | Number of additional pages for each of the application's approval and clear state programs. An ExtraProgramPages of 1 means 2048 more total bytes, or 1024 for each program. | +| 57 | Nonparticipation | uint64 | v5 | Marks an account nonparticipating for rewards | +| 58 | Logs | []byte | v5 | Log messages emitted by an application call (only with `itxn` in v5). Application mode only | +| 59 | NumLogs | uint64 | v5 | Number of Logs (only with `itxn` in v5). Application mode only | +| 60 | CreatedAssetID | uint64 | v5 | Asset ID allocated by the creation of an ASA (only with `itxn` in v5). Application mode only | +| 61 | CreatedApplicationID | uint64 | v5 | ApplicationID allocated by the creation of an application (only with `itxn` in v5). Application mode only | +| 62 | LastLog | []byte | v6 | The last message emitted. Empty bytes if none were emitted. Application mode only | +| 63 | StateProofPK | []byte | v6 | 64 byte state proof public key commitment | TypeEnum mapping: @@ -504,92 +458,86 @@ FirstValidTime causes the program to fail. The field is reserved for future use. ## global f - Opcode: 0x32 {uint8 global field index} -- Pops: _None_ -- Pushes: any -- push value from globals to stack +- Stack: ... → ..., any +- global field F `global` Fields: -| Index | Name | Type | Notes | -| --- | --- | --- | --- | -| 0 | MinTxnFee | uint64 | micro Algos | -| 1 | MinBalance | uint64 | micro Algos | -| 2 | MaxTxnLife | uint64 | rounds | -| 3 | ZeroAddress | []byte | 32 byte address of all zero bytes | -| 4 | GroupSize | uint64 | Number of transactions in this atomic transaction group. At least 1 | -| 5 | LogicSigVersion | uint64 | Maximum supported TEAL version. LogicSigVersion >= 2. | -| 6 | Round | uint64 | Current round number. LogicSigVersion >= 2. | -| 7 | LatestTimestamp | uint64 | Last confirmed block UNIX timestamp. Fails if negative. LogicSigVersion >= 2. | -| 8 | CurrentApplicationID | uint64 | ID of current application executing. Fails in LogicSigs. LogicSigVersion >= 2. | -| 9 | CreatorAddress | []byte | Address of the creator of the current application. Fails if no such application is executing. LogicSigVersion >= 3. | -| 10 | CurrentApplicationAddress | []byte | Address that the current application controls. Fails in LogicSigs. LogicSigVersion >= 5. | -| 11 | GroupID | []byte | ID of the transaction group. 32 zero bytes if the transaction is not part of a group. LogicSigVersion >= 5. | +| Index | Name | Type | In | Notes | +| - | ------ | -- | - | --------- | +| 0 | MinTxnFee | uint64 | | microalgos | +| 1 | MinBalance | uint64 | | microalgos | +| 2 | MaxTxnLife | uint64 | | rounds | +| 3 | ZeroAddress | []byte | | 32 byte address of all zero bytes | +| 4 | GroupSize | uint64 | | Number of transactions in this atomic transaction group. At least 1 | +| 5 | LogicSigVersion | uint64 | v2 | Maximum supported version | +| 6 | Round | uint64 | v2 | Current round number. Application mode only. | +| 7 | LatestTimestamp | uint64 | v2 | Last confirmed block UNIX timestamp. Fails if negative. Application mode only. | +| 8 | CurrentApplicationID | uint64 | v2 | ID of current application executing. Application mode only. | +| 9 | CreatorAddress | []byte | v3 | Address of the creator of the current application. Application mode only. | +| 10 | CurrentApplicationAddress | []byte | v5 | Address that the current application controls. Application mode only. | +| 11 | GroupID | []byte | v5 | ID of the transaction group. 32 zero bytes if the transaction is not part of a group. | +| 12 | OpcodeBudget | uint64 | v6 | The remaining cost that can be spent by opcodes in this program. | +| 13 | CallerApplicationID | uint64 | v6 | The application ID of the application that called this application. 0 if this application is at the top-level. Application mode only. | +| 14 | CallerApplicationAddress | []byte | v6 | The application address of the application that called this application. ZeroAddress if this application is at the top-level. Application mode only. | ## gtxn t f - Opcode: 0x33 {uint8 transaction group index} {uint8 transaction field index} -- Pops: _None_ -- Pushes: any -- push field F of the Tth transaction in the current group +- Stack: ... → ..., any +- field F of the Tth transaction in the current group for notes on transaction fields available, see `txn`. If this transaction is _i_ in the group, `gtxn i field` is equivalent to `txn field`. ## load i - Opcode: 0x34 {uint8 position in scratch space to load from} -- Pops: _None_ -- Pushes: any -- copy a value from scratch space to the stack. All scratch spaces are 0 at program start. +- Stack: ... → ..., any +- Ith scratch space value. All scratch spaces are 0 at program start. ## store i - Opcode: 0x35 {uint8 position in scratch space to store to} -- Pops: *... stack*, any -- Pushes: _None_ -- pop value X. store X to the Ith scratch space +- Stack: ..., A → ... +- store A to the Ith scratch space ## txna f i - Opcode: 0x36 {uint8 transaction field index} {uint8 transaction field array index} -- Pops: _None_ -- Pushes: any -- push Ith value of the array field F of the current transaction -- LogicSigVersion >= 2 +- Stack: ... → ..., any +- Ith value of the array field F of the current transaction +- Availability: v2 ## gtxna t f i - Opcode: 0x37 {uint8 transaction group index} {uint8 transaction field index} {uint8 transaction field array index} -- Pops: _None_ -- Pushes: any -- push Ith value of the array field F from the Tth transaction in the current group -- LogicSigVersion >= 2 +- Stack: ... → ..., any +- Ith value of the array field F from the Tth transaction in the current group +- Availability: v2 ## gtxns f - Opcode: 0x38 {uint8 transaction field index} -- Pops: *... stack*, uint64 -- Pushes: any -- push field F of the Xth transaction in the current group -- LogicSigVersion >= 3 +- Stack: ..., A: uint64 → ..., any +- field F of the Ath transaction in the current group +- Availability: v3 for notes on transaction fields available, see `txn`. If top of stack is _i_, `gtxns field` is equivalent to `gtxn _i_ field`. gtxns exists so that _i_ can be calculated, often based on the index of the current transaction. ## gtxnsa f i - Opcode: 0x39 {uint8 transaction field index} {uint8 transaction field array index} -- Pops: *... stack*, uint64 -- Pushes: any -- push Ith value of the array field F from the Xth transaction in the current group -- LogicSigVersion >= 3 +- Stack: ..., A: uint64 → ..., any +- Ith value of the array field F from the Ath transaction in the current group +- Availability: v3 ## gload t i - Opcode: 0x3a {uint8 transaction group index} {uint8 position in scratch space to load from} -- Pops: _None_ -- Pushes: any -- push Ith scratch space index of the Tth transaction in the current group -- LogicSigVersion >= 4 +- Stack: ... → ..., any +- Ith scratch space value of the Tth transaction in the current group +- Availability: v4 - Mode: Application `gload` fails unless the requested transaction is an ApplicationCall and T < GroupIndex. @@ -597,21 +545,19 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g ## gloads i - Opcode: 0x3b {uint8 position in scratch space to load from} -- Pops: *... stack*, uint64 -- Pushes: any -- push Ith scratch space index of the Xth transaction in the current group -- LogicSigVersion >= 4 +- Stack: ..., A: uint64 → ..., any +- Ith scratch space value of the Ath transaction in the current group +- Availability: v4 - Mode: Application -`gloads` fails unless the requested transaction is an ApplicationCall and X < GroupIndex. +`gloads` fails unless the requested transaction is an ApplicationCall and A < GroupIndex. ## gaid t - Opcode: 0x3c {uint8 transaction group index} -- Pops: _None_ -- Pushes: uint64 -- push the ID of the asset or application created in the Tth transaction of the current group -- LogicSigVersion >= 4 +- Stack: ... → ..., uint64 +- ID of the asset or application created in the Tth transaction of the current group +- Availability: v4 - Mode: Application `gaid` fails unless the requested transaction created an asset or application and T < GroupIndex. @@ -619,36 +565,32 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g ## gaids - Opcode: 0x3d -- Pops: *... stack*, uint64 -- Pushes: uint64 -- push the ID of the asset or application created in the Xth transaction of the current group -- LogicSigVersion >= 4 +- Stack: ..., A: uint64 → ..., uint64 +- ID of the asset or application created in the Ath transaction of the current group +- Availability: v4 - Mode: Application -`gaids` fails unless the requested transaction created an asset or application and X < GroupIndex. +`gaids` fails unless the requested transaction created an asset or application and A < GroupIndex. ## loads - Opcode: 0x3e -- Pops: *... stack*, uint64 -- Pushes: any -- copy a value from the Xth scratch space to the stack. All scratch spaces are 0 at program start. -- LogicSigVersion >= 5 +- Stack: ..., A: uint64 → ..., any +- Ath scratch space value. All scratch spaces are 0 at program start. +- Availability: v5 ## stores - Opcode: 0x3f -- Pops: *... stack*, {uint64 A}, {any B} -- Pushes: _None_ -- pop indexes A and B. store B to the Ath scratch space -- LogicSigVersion >= 5 +- Stack: ..., A: uint64, B → ... +- store B to the Ath scratch space +- Availability: v5 ## bnz target - Opcode: 0x40 {int16 branch offset, big endian} -- Pops: *... stack*, uint64 -- Pushes: _None_ -- branch to TARGET if value X is not zero +- Stack: ..., A: uint64 → ... +- branch to TARGET if value A is not zero The `bnz` instruction opcode 0x40 is followed by two immediate data bytes which are a high byte first and low byte second which together form a 16 bit offset which the instruction may branch to. For a bnz instruction at `pc`, if the last element of the stack is not zero then branch to instruction at `pc + 3 + N`, else proceed to next instruction at `pc + 3`. Branch targets must be aligned instructions. (e.g. Branching to the second byte of a 2 byte op will be rejected.) Starting at v4, the offset is treated as a signed 16 bit integer allowing for backward branches and looping. In prior version (v1 to v3), branch offsets are limited to forward branches only, 0-0x7fff. @@ -657,254 +599,225 @@ At v2 it became allowed to branch to the end of the program exactly after the la ## bz target - Opcode: 0x41 {int16 branch offset, big endian} -- Pops: *... stack*, uint64 -- Pushes: _None_ -- branch to TARGET if value X is zero -- LogicSigVersion >= 2 +- Stack: ..., A: uint64 → ... +- branch to TARGET if value A is zero +- Availability: v2 See `bnz` for details on how branches work. `bz` inverts the behavior of `bnz`. ## b target - Opcode: 0x42 {int16 branch offset, big endian} -- Pops: _None_ -- Pushes: _None_ +- Stack: ... → ... - branch unconditionally to TARGET -- LogicSigVersion >= 2 +- Availability: v2 See `bnz` for details on how branches work. `b` always jumps to the offset. ## return - Opcode: 0x43 -- Pops: *... stack*, uint64 -- Pushes: _None_ -- use last value on stack as success value; end -- LogicSigVersion >= 2 +- Stack: ..., A: uint64 → ... +- use A as success value; end +- Availability: v2 ## assert - Opcode: 0x44 -- Pops: *... stack*, uint64 -- Pushes: _None_ -- immediately fail unless value X is a non-zero number -- LogicSigVersion >= 3 +- Stack: ..., A: uint64 → ... +- immediately fail unless A is a non-zero number +- Availability: v3 ## pop - Opcode: 0x48 -- Pops: *... stack*, any -- Pushes: _None_ -- discard value X from stack +- Stack: ..., A → ... +- discard A ## dup - Opcode: 0x49 -- Pops: *... stack*, any -- Pushes: *... stack*, any, any -- duplicate last value on stack +- Stack: ..., A → ..., A, A +- duplicate A ## dup2 - Opcode: 0x4a -- Pops: *... stack*, {any A}, {any B} -- Pushes: *... stack*, any, any, any, any -- duplicate two last values on stack: A, B -> A, B, A, B -- LogicSigVersion >= 2 +- Stack: ..., A, B → ..., A, B, A, B +- duplicate A and B +- Availability: v2 ## dig n - Opcode: 0x4b {uint8 depth} -- Pops: *... stack*, any -- Pushes: *... stack*, any, any -- push the Nth value from the top of the stack. dig 0 is equivalent to dup -- LogicSigVersion >= 3 +- Stack: ..., A, [N items] → ..., A, [N items], A +- Nth value from the top of the stack. dig 0 is equivalent to dup +- Availability: v3 ## swap - Opcode: 0x4c -- Pops: *... stack*, {any A}, {any B} -- Pushes: *... stack*, any, any -- swaps two last values on stack: A, B -> B, A -- LogicSigVersion >= 3 +- Stack: ..., A, B → ..., B, A +- swaps A and B on stack +- Availability: v3 ## select - Opcode: 0x4d -- Pops: *... stack*, {any A}, {any B}, {uint64 C} -- Pushes: any -- selects one of two values based on top-of-stack: A, B, C -> (if C != 0 then B else A) -- LogicSigVersion >= 3 +- Stack: ..., A, B, C → ..., A or B +- selects one of two values based on top-of-stack: B if C != 0, else A +- Availability: v3 ## cover n - Opcode: 0x4e {uint8 depth} -- Pops: *... stack*, any -- Pushes: any +- Stack: ..., [N items], A → ..., A, [N items] - remove top of stack, and place it deeper in the stack such that N elements are above it. Fails if stack depth <= N. -- LogicSigVersion >= 5 +- Availability: v5 ## uncover n - Opcode: 0x4f {uint8 depth} -- Pops: *... stack*, any -- Pushes: any +- Stack: ..., A, [N items] → ..., [N items], A - remove the value at depth N in the stack and shift above items down so the Nth deep value is on top of the stack. Fails if stack depth <= N. -- LogicSigVersion >= 5 +- Availability: v5 ## concat - Opcode: 0x50 -- Pops: *... stack*, {[]byte A}, {[]byte B} -- Pushes: []byte -- pop two byte-arrays A and B and join them, push the result -- LogicSigVersion >= 2 +- Stack: ..., A: []byte, B: []byte → ..., []byte +- join A and B +- Availability: v2 `concat` fails if the result would be greater than 4096 bytes. ## substring s e - Opcode: 0x51 {uint8 start position} {uint8 end position} -- Pops: *... stack*, []byte -- Pushes: []byte -- pop a byte-array A. For immediate values in 0..255 S and E: extract a range of bytes from A starting at S up to but not including E, push the substring result. If E < S, or either is larger than the array length, the program fails -- LogicSigVersion >= 2 +- Stack: ..., A: []byte → ..., []byte +- A range of bytes from A starting at S up to but not including E. If E < S, or either is larger than the array length, the program fails +- Availability: v2 ## substring3 - Opcode: 0x52 -- Pops: *... stack*, {[]byte A}, {uint64 B}, {uint64 C} -- Pushes: []byte -- pop a byte-array A and two integers B and C. Extract a range of bytes from A starting at B up to but not including C, push the substring result. If C < B, or either is larger than the array length, the program fails -- LogicSigVersion >= 2 +- Stack: ..., A: []byte, B: uint64, C: uint64 → ..., []byte +- A range of bytes from A starting at B up to but not including C. If C < B, or either is larger than the array length, the program fails +- Availability: v2 ## getbit - Opcode: 0x53 -- Pops: *... stack*, {any A}, {uint64 B} -- Pushes: uint64 -- pop a target A (integer or byte-array), and index B. Push the Bth bit of A. -- LogicSigVersion >= 3 +- Stack: ..., A, B: uint64 → ..., uint64 +- Bth bit of (byte-array or integer) A. +- Availability: v3 see explanation of bit ordering in setbit ## setbit - Opcode: 0x54 -- Pops: *... stack*, {any A}, {uint64 B}, {uint64 C} -- Pushes: any -- pop a target A, index B, and bit C. Set the Bth bit of A to C, and push the result -- LogicSigVersion >= 3 +- Stack: ..., A, B: uint64, C: uint64 → ..., any +- Copy of (byte-array or integer) A, with the Bth bit set to (0 or 1) C +- Availability: v3 When A is a uint64, index 0 is the least significant bit. Setting bit 3 to 1 on the integer 0 yields 8, or 2^3. When A is a byte array, index 0 is the leftmost bit of the leftmost byte. Setting bits 0 through 11 to 1 in a 4-byte-array of 0s yields the byte array 0xfff00000. Setting bit 3 to 1 on the 1-byte-array 0x00 yields the byte array 0x10. ## getbyte - Opcode: 0x55 -- Pops: *... stack*, {[]byte A}, {uint64 B} -- Pushes: uint64 -- pop a byte-array A and integer B. Extract the Bth byte of A and push it as an integer -- LogicSigVersion >= 3 +- Stack: ..., A: []byte, B: uint64 → ..., uint64 +- Bth byte of A, as an integer +- Availability: v3 ## setbyte - Opcode: 0x56 -- Pops: *... stack*, {[]byte A}, {uint64 B}, {uint64 C} -- Pushes: []byte -- pop a byte-array A, integer B, and small integer C (between 0..255). Set the Bth byte of A to C, and push the result -- LogicSigVersion >= 3 +- Stack: ..., A: []byte, B: uint64, C: uint64 → ..., []byte +- Copy of A with the Bth byte set to small integer (between 0..255) C +- Availability: v3 ## extract s l - Opcode: 0x57 {uint8 start position} {uint8 length} -- Pops: *... stack*, []byte -- Pushes: []byte -- pop a byte-array A. For immediate values in 0..255 S and L: extract a range of bytes from A starting at S up to but not including S+L, push the substring result. If L is 0, then extract to the end of the string. If S or S+L is larger than the array length, the program fails -- LogicSigVersion >= 5 +- Stack: ..., A: []byte → ..., []byte +- A range of bytes from A starting at S up to but not including S+L. If L is 0, then extract to the end of the string. If S or S+L is larger than the array length, the program fails +- Availability: v5 ## extract3 - Opcode: 0x58 -- Pops: *... stack*, {[]byte A}, {uint64 B}, {uint64 C} -- Pushes: []byte -- pop a byte-array A and two integers B and C. Extract a range of bytes from A starting at B up to but not including B+C, push the substring result. If B+C is larger than the array length, the program fails -- LogicSigVersion >= 5 +- Stack: ..., A: []byte, B: uint64, C: uint64 → ..., []byte +- A range of bytes from A starting at B up to but not including B+C. If B+C is larger than the array length, the program fails +- Availability: v5 ## extract_uint16 - Opcode: 0x59 -- Pops: *... stack*, {[]byte A}, {uint64 B} -- Pushes: uint64 -- pop a byte-array A and integer B. Extract a range of bytes from A starting at B up to but not including B+2, convert bytes as big endian and push the uint64 result. If B+2 is larger than the array length, the program fails -- LogicSigVersion >= 5 +- Stack: ..., A: []byte, B: uint64 → ..., uint64 +- A uint16 formed from a range of big-endian bytes from A starting at B up to but not including B+2. If B+2 is larger than the array length, the program fails +- Availability: v5 ## extract_uint32 - Opcode: 0x5a -- Pops: *... stack*, {[]byte A}, {uint64 B} -- Pushes: uint64 -- pop a byte-array A and integer B. Extract a range of bytes from A starting at B up to but not including B+4, convert bytes as big endian and push the uint64 result. If B+4 is larger than the array length, the program fails -- LogicSigVersion >= 5 +- Stack: ..., A: []byte, B: uint64 → ..., uint64 +- A uint32 formed from a range of big-endian bytes from A starting at B up to but not including B+4. If B+4 is larger than the array length, the program fails +- Availability: v5 ## extract_uint64 - Opcode: 0x5b -- Pops: *... stack*, {[]byte A}, {uint64 B} -- Pushes: uint64 -- pop a byte-array A and integer B. Extract a range of bytes from A starting at B up to but not including B+8, convert bytes as big endian and push the uint64 result. If B+8 is larger than the array length, the program fails -- LogicSigVersion >= 5 +- Stack: ..., A: []byte, B: uint64 → ..., uint64 +- A uint64 formed from a range of big-endian bytes from A starting at B up to but not including B+8. If B+8 is larger than the array length, the program fails +- Availability: v5 ## balance - Opcode: 0x60 -- Pops: *... stack*, any -- Pushes: uint64 +- Stack: ..., A → ..., uint64 - get balance for account A, in microalgos. The balance is observed after the effects of previous transactions in the group, and after the fee for the current transaction is deducted. -- LogicSigVersion >= 2 +- Availability: v2 - Mode: Application -params: Before v4, Txn.Accounts offset. Since v4, Txn.Accounts offset or an account address that appears in Txn.Accounts or is Txn.Sender). Return: value. +params: Txn.Accounts offset (or, since v4, an _available_ account address), _available_ application id (or, since v4, a Txn.ForeignApps offset). Return: value. ## app_opted_in - Opcode: 0x61 -- Pops: *... stack*, {any A}, {uint64 B} -- Pushes: uint64 -- check if account A opted in for the application B => {0 or 1} -- LogicSigVersion >= 2 +- Stack: ..., A, B: uint64 → ..., uint64 +- 1 if account A is opted in to application B, else 0 +- Availability: v2 - Mode: Application -params: Txn.Accounts offset (or, since v4, an account address that appears in Txn.Accounts or is Txn.Sender), application id (or, since v4, a Txn.ForeignApps offset). Return: 1 if opted in and 0 otherwise. +params: Txn.Accounts offset (or, since v4, an _available_ account address), _available_ application id (or, since v4, a Txn.ForeignApps offset). Return: 1 if opted in and 0 otherwise. ## app_local_get - Opcode: 0x62 -- Pops: *... stack*, {any A}, {[]byte B} -- Pushes: any -- read from account A from local state of the current application key B => value -- LogicSigVersion >= 2 +- Stack: ..., A, B: []byte → ..., any +- local state of the key B in the current application in account A +- Availability: v2 - Mode: Application -params: Txn.Accounts offset (or, since v4, an account address that appears in Txn.Accounts or is Txn.Sender), state key. Return: value. The value is zero (of type uint64) if the key does not exist. +params: Txn.Accounts offset (or, since v4, an _available_ account address), state key. Return: value. The value is zero (of type uint64) if the key does not exist. ## app_local_get_ex - Opcode: 0x63 -- Pops: *... stack*, {any A}, {uint64 B}, {[]byte C} -- Pushes: *... stack*, any, uint64 -- read from account A from local state of the application B key C => [*... stack*, value, 0 or 1] -- LogicSigVersion >= 2 +- Stack: ..., A, B: uint64, C: []byte → ..., X: any, Y: uint64 +- X is the local state of application B, key C in account A. Y is 1 if key existed, else 0 +- Availability: v2 - Mode: Application -params: Txn.Accounts offset (or, since v4, an account address that appears in Txn.Accounts or is Txn.Sender), application id (or, since v4, a Txn.ForeignApps offset), state key. Return: did_exist flag (top of the stack, 1 if the application and key existed and 0 otherwise), value. The value is zero (of type uint64) if the key does not exist. +params: Txn.Accounts offset (or, since v4, an _available_ account address), _available_ application id (or, since v4, a Txn.ForeignApps offset), state key. Return: did_exist flag (top of the stack, 1 if the application and key existed and 0 otherwise), value. The value is zero (of type uint64) if the key does not exist. ## app_global_get - Opcode: 0x64 -- Pops: *... stack*, []byte -- Pushes: any -- read key A from global state of a current application => value -- LogicSigVersion >= 2 +- Stack: ..., A: []byte → ..., any +- global state of the key A in the current application +- Availability: v2 - Mode: Application params: state key. Return: value. The value is zero (of type uint64) if the key does not exist. @@ -912,121 +825,113 @@ params: state key. Return: value. The value is zero (of type uint64) if the key ## app_global_get_ex - Opcode: 0x65 -- Pops: *... stack*, {uint64 A}, {[]byte B} -- Pushes: *... stack*, any, uint64 -- read from application A global state key B => [*... stack*, value, 0 or 1] -- LogicSigVersion >= 2 +- Stack: ..., A: uint64, B: []byte → ..., X: any, Y: uint64 +- X is the global state of application A, key B. Y is 1 if key existed, else 0 +- Availability: v2 - Mode: Application -params: Txn.ForeignApps offset (or, since v4, an application id that appears in Txn.ForeignApps or is the CurrentApplicationID), state key. Return: did_exist flag (top of the stack, 1 if the application and key existed and 0 otherwise), value. The value is zero (of type uint64) if the key does not exist. +params: Txn.ForeignApps offset (or, since v4, an _available_ application id), state key. Return: did_exist flag (top of the stack, 1 if the application and key existed and 0 otherwise), value. The value is zero (of type uint64) if the key does not exist. ## app_local_put - Opcode: 0x66 -- Pops: *... stack*, {any A}, {[]byte B}, {any C} -- Pushes: _None_ -- write to account specified by A to local state of a current application key B with value C -- LogicSigVersion >= 2 +- Stack: ..., A, B: []byte, C → ... +- write C to key B in account A's local state of the current application +- Availability: v2 - Mode: Application -params: Txn.Accounts offset (or, since v4, an account address that appears in Txn.Accounts or is Txn.Sender), state key, value. +params: Txn.Accounts offset (or, since v4, an _available_ account address), state key, value. ## app_global_put - Opcode: 0x67 -- Pops: *... stack*, {[]byte A}, {any B} -- Pushes: _None_ -- write key A and value B to global state of the current application -- LogicSigVersion >= 2 +- Stack: ..., A: []byte, B → ... +- write B to key A in the global state of the current application +- Availability: v2 - Mode: Application ## app_local_del - Opcode: 0x68 -- Pops: *... stack*, {any A}, {[]byte B} -- Pushes: _None_ -- delete from account A local state key B of the current application -- LogicSigVersion >= 2 +- Stack: ..., A, B: []byte → ... +- delete key B from account A's local state of the current application +- Availability: v2 - Mode: Application -params: Txn.Accounts offset (or, since v4, an account address that appears in Txn.Accounts or is Txn.Sender), state key. +params: Txn.Accounts offset (or, since v4, an _available_ account address), state key. Deleting a key which is already absent has no effect on the application local state. (In particular, it does _not_ cause the program to fail.) ## app_global_del - Opcode: 0x69 -- Pops: *... stack*, []byte -- Pushes: _None_ -- delete key A from a global state of the current application -- LogicSigVersion >= 2 +- Stack: ..., A: []byte → ... +- delete key A from the global state of the current application +- Availability: v2 - Mode: Application params: state key. Deleting a key which is already absent has no effect on the application global state. (In particular, it does _not_ cause the program to fail.) -## asset_holding_get i +## asset_holding_get f - Opcode: 0x70 {uint8 asset holding field index} -- Pops: *... stack*, {any A}, {uint64 B} -- Pushes: *... stack*, any, uint64 -- read from account A and asset B holding field X (imm arg) => {0 or 1 (top), value} -- LogicSigVersion >= 2 +- Stack: ..., A, B: uint64 → ..., X: any, Y: uint64 +- X is field F from account A's holding of asset B. Y is 1 if A is opted into B, else 0 +- Availability: v2 - Mode: Application `asset_holding_get` Fields: | Index | Name | Type | Notes | -| --- | --- | --- | --- | +| - | ------ | -- | --------- | | 0 | AssetBalance | uint64 | Amount of the asset unit held by this account | | 1 | AssetFrozen | uint64 | Is the asset frozen or not | -params: Txn.Accounts offset (or, since v4, an account address that appears in Txn.Accounts or is Txn.Sender), asset id (or, since v4, a Txn.ForeignAssets offset). Return: did_exist flag (1 if the asset existed and 0 otherwise), value. +params: Txn.Accounts offset (or, since v4, an _available_ address), asset id (or, since v4, a Txn.ForeignAssets offset). Return: did_exist flag (1 if the asset existed and 0 otherwise), value. -## asset_params_get i +## asset_params_get f - Opcode: 0x71 {uint8 asset params field index} -- Pops: *... stack*, uint64 -- Pushes: *... stack*, any, uint64 -- read from asset A params field X (imm arg) => {0 or 1 (top), value} -- LogicSigVersion >= 2 +- Stack: ..., A: uint64 → ..., X: any, Y: uint64 +- X is field F from asset A. Y is 1 if A exists, else 0 +- Availability: v2 - Mode: Application `asset_params_get` Fields: -| Index | Name | Type | Notes | -| --- | --- | --- | --- | -| 0 | AssetTotal | uint64 | Total number of units of this asset | -| 1 | AssetDecimals | uint64 | See AssetParams.Decimals | -| 2 | AssetDefaultFrozen | uint64 | Frozen by default or not | -| 3 | AssetUnitName | []byte | Asset unit name | -| 4 | AssetName | []byte | Asset name | -| 5 | AssetURL | []byte | URL with additional info about the asset | -| 6 | AssetMetadataHash | []byte | Arbitrary commitment | -| 7 | AssetManager | []byte | Manager commitment | -| 8 | AssetReserve | []byte | Reserve address | -| 9 | AssetFreeze | []byte | Freeze address | -| 10 | AssetClawback | []byte | Clawback address | -| 11 | AssetCreator | []byte | Creator address. LogicSigVersion >= 5. | +| Index | Name | Type | In | Notes | +| - | ------ | -- | - | --------- | +| 0 | AssetTotal | uint64 | | Total number of units of this asset | +| 1 | AssetDecimals | uint64 | | See AssetParams.Decimals | +| 2 | AssetDefaultFrozen | uint64 | | Frozen by default or not | +| 3 | AssetUnitName | []byte | | Asset unit name | +| 4 | AssetName | []byte | | Asset name | +| 5 | AssetURL | []byte | | URL with additional info about the asset | +| 6 | AssetMetadataHash | []byte | | Arbitrary commitment | +| 7 | AssetManager | []byte | | Manager commitment | +| 8 | AssetReserve | []byte | | Reserve address | +| 9 | AssetFreeze | []byte | | Freeze address | +| 10 | AssetClawback | []byte | | Clawback address | +| 11 | AssetCreator | []byte | v5 | Creator address | -params: Before v4, Txn.ForeignAssets offset. Since v4, Txn.ForeignAssets offset or an asset id that appears in Txn.ForeignAssets. Return: did_exist flag (1 if the asset existed and 0 otherwise), value. +params: Txn.ForeignAssets offset (or, since v4, an _available_ asset id. Return: did_exist flag (1 if the asset existed and 0 otherwise), value. -## app_params_get i +## app_params_get f - Opcode: 0x72 {uint8 app params field index} -- Pops: *... stack*, uint64 -- Pushes: *... stack*, any, uint64 -- read from app A params field X (imm arg) => {0 or 1 (top), value} -- LogicSigVersion >= 5 +- Stack: ..., A: uint64 → ..., X: any, Y: uint64 +- X is field F from app A. Y is 1 if A exists, else 0 +- Availability: v5 - Mode: Application `app_params_get` Fields: | Index | Name | Type | Notes | -| --- | --- | --- | --- | +| - | ------ | -- | --------- | | 0 | AppApprovalProgram | []byte | Bytecode of Approval Program | | 1 | AppClearStateProgram | []byte | Bytecode of Clear State Program | | 2 | AppGlobalNumUint | uint64 | Number of uint64 values allowed in Global State | @@ -1038,255 +943,261 @@ params: Before v4, Txn.ForeignAssets offset. Since v4, Txn.ForeignAssets offset | 8 | AppAddress | []byte | Address for which this application has authority | -params: Txn.ForeignApps offset or an app id that appears in Txn.ForeignApps. Return: did_exist flag (1 if the application existed and 0 otherwise), value. +params: Txn.ForeignApps offset or an _available_ app id. Return: did_exist flag (1 if the application existed and 0 otherwise), value. + +## acct_params_get f + +- Opcode: 0x73 {uint8 account params field index} +- Stack: ..., A → ..., X: any, Y: uint64 +- X is field F from account A. Y is 1 if A owns positive algos, else 0 +- Availability: v6 +- Mode: Application + +`acct_params_get` Fields: + +| Index | Name | Type | Notes | +| - | ------ | -- | --------- | +| 0 | AcctBalance | uint64 | Account balance in microalgos | +| 1 | AcctMinBalance | uint64 | Minimum required blance for account, in microalgos | +| 2 | AcctAuthAddr | []byte | Address the account is rekeyed to. | + ## min_balance - Opcode: 0x78 -- Pops: *... stack*, any -- Pushes: uint64 +- Stack: ..., A → ..., uint64 - get minimum required balance for account A, in microalgos. Required balance is affected by [ASA](https://developer.algorand.org/docs/features/asa/#assets-overview) and [App](https://developer.algorand.org/docs/features/asc1/stateful/#minimum-balance-requirement-for-a-smart-contract) usage. When creating or opting into an app, the minimum balance grows before the app code runs, therefore the increase is visible there. When deleting or closing out, the minimum balance decreases after the app executes. -- LogicSigVersion >= 3 +- Availability: v3 - Mode: Application -params: Before v4, Txn.Accounts offset. Since v4, Txn.Accounts offset or an account address that appears in Txn.Accounts or is Txn.Sender). Return: value. +params: Txn.Accounts offset (or, since v4, an _available_ account address), _available_ application id (or, since v4, a Txn.ForeignApps offset). Return: value. ## pushbytes bytes - Opcode: 0x80 {varuint length} {bytes} -- Pops: _None_ -- Pushes: []byte -- push the following program bytes to the stack -- LogicSigVersion >= 3 +- Stack: ... → ..., []byte +- immediate BYTES +- Availability: v3 pushbytes args are not added to the bytecblock during assembly processes ## pushint uint - Opcode: 0x81 {varuint int} -- Pops: _None_ -- Pushes: uint64 -- push immediate UINT to the stack as an integer -- LogicSigVersion >= 3 +- Stack: ... → ..., uint64 +- immediate UINT +- Availability: v3 pushint args are not added to the intcblock during assembly processes ## callsub target - Opcode: 0x88 {int16 branch offset, big endian} -- Pops: _None_ -- Pushes: _None_ +- Stack: ... → ... - branch unconditionally to TARGET, saving the next instruction on the call stack -- LogicSigVersion >= 4 +- Availability: v4 The call stack is separate from the data stack. Only `callsub` and `retsub` manipulate it. ## retsub - Opcode: 0x89 -- Pops: _None_ -- Pushes: _None_ +- Stack: ... → ... - pop the top instruction from the call stack and branch to it -- LogicSigVersion >= 4 +- Availability: v4 The call stack is separate from the data stack. Only `callsub` and `retsub` manipulate it. ## shl - Opcode: 0x90 -- Pops: *... stack*, {uint64 A}, {uint64 B} -- Pushes: uint64 +- Stack: ..., A: uint64, B: uint64 → ..., uint64 - A times 2^B, modulo 2^64 -- LogicSigVersion >= 4 +- Availability: v4 ## shr - Opcode: 0x91 -- Pops: *... stack*, {uint64 A}, {uint64 B} -- Pushes: uint64 +- Stack: ..., A: uint64, B: uint64 → ..., uint64 - A divided by 2^B -- LogicSigVersion >= 4 +- Availability: v4 ## sqrt - Opcode: 0x92 -- Pops: *... stack*, uint64 -- Pushes: uint64 -- The largest integer B such that B^2 <= X +- Stack: ..., A: uint64 → ..., uint64 +- The largest integer I such that I^2 <= A - **Cost**: 4 -- LogicSigVersion >= 4 +- Availability: v4 ## bitlen - Opcode: 0x93 -- Pops: *... stack*, any -- Pushes: uint64 -- The highest set bit in X. If X is a byte-array, it is interpreted as a big-endian unsigned integer. bitlen of 0 is 0, bitlen of 8 is 4 -- LogicSigVersion >= 4 +- Stack: ..., A → ..., uint64 +- The highest set bit in A. If A is a byte-array, it is interpreted as a big-endian unsigned integer. bitlen of 0 is 0, bitlen of 8 is 4 +- Availability: v4 bitlen interprets arrays as big-endian integers, unlike setbit/getbit ## exp - Opcode: 0x94 -- Pops: *... stack*, {uint64 A}, {uint64 B} -- Pushes: uint64 +- Stack: ..., A: uint64, B: uint64 → ..., uint64 - A raised to the Bth power. Fail if A == B == 0 and on overflow -- LogicSigVersion >= 4 +- Availability: v4 ## expw - Opcode: 0x95 -- Pops: *... stack*, {uint64 A}, {uint64 B} -- Pushes: *... stack*, uint64, uint64 -- A raised to the Bth power as a 128-bit long result as low (top) and high uint64 values on the stack. Fail if A == B == 0 or if the results exceeds 2^128-1 +- Stack: ..., A: uint64, B: uint64 → ..., X: uint64, Y: uint64 +- A raised to the Bth power as a 128-bit result in two uint64s. X is the high 64 bits, Y is the low. Fail if A == B == 0 or if the results exceeds 2^128-1 - **Cost**: 10 -- LogicSigVersion >= 4 +- Availability: v4 + +## bsqrt + +- Opcode: 0x96 +- Stack: ..., A: []byte → ..., []byte +- The largest integer I such that I^2 <= A. A and I are interpreted as big-endian unsigned integers +- **Cost**: 40 +- Availability: v6 + +## divw + +- Opcode: 0x97 +- Stack: ..., A: uint64, B: uint64, C: uint64 → ..., uint64 +- A,B / C. Fail if C == 0 or if result overflows. +- Availability: v6 + +The notation A,B indicates that A and B are interpreted as a uint128 value, with A as the high uint64 and B the low. ## b+ - Opcode: 0xa0 -- Pops: *... stack*, {[]byte A}, {[]byte B} -- Pushes: []byte -- A plus B, where A and B are byte-arrays interpreted as big-endian unsigned integers +- Stack: ..., A: []byte, B: []byte → ..., []byte +- A plus B. A and B are interpreted as big-endian unsigned integers - **Cost**: 10 -- LogicSigVersion >= 4 +- Availability: v4 ## b- - Opcode: 0xa1 -- Pops: *... stack*, {[]byte A}, {[]byte B} -- Pushes: []byte -- A minus B, where A and B are byte-arrays interpreted as big-endian unsigned integers. Fail on underflow. +- Stack: ..., A: []byte, B: []byte → ..., []byte +- A minus B. A and B are interpreted as big-endian unsigned integers. Fail on underflow. - **Cost**: 10 -- LogicSigVersion >= 4 +- Availability: v4 ## b/ - Opcode: 0xa2 -- Pops: *... stack*, {[]byte A}, {[]byte B} -- Pushes: []byte -- A divided by B (truncated division), where A and B are byte-arrays interpreted as big-endian unsigned integers. Fail if B is zero. +- Stack: ..., A: []byte, B: []byte → ..., []byte +- A divided by B (truncated division). A and B are interpreted as big-endian unsigned integers. Fail if B is zero. - **Cost**: 20 -- LogicSigVersion >= 4 +- Availability: v4 ## b* - Opcode: 0xa3 -- Pops: *... stack*, {[]byte A}, {[]byte B} -- Pushes: []byte -- A times B, where A and B are byte-arrays interpreted as big-endian unsigned integers. +- Stack: ..., A: []byte, B: []byte → ..., []byte +- A times B. A and B are interpreted as big-endian unsigned integers. - **Cost**: 20 -- LogicSigVersion >= 4 +- Availability: v4 ## b< - Opcode: 0xa4 -- Pops: *... stack*, {[]byte A}, {[]byte B} -- Pushes: uint64 -- A is less than B, where A and B are byte-arrays interpreted as big-endian unsigned integers => { 0 or 1} -- LogicSigVersion >= 4 +- Stack: ..., A: []byte, B: []byte → ..., uint64 +- 1 if A is less than B, else 0. A and B are interpreted as big-endian unsigned integers +- Availability: v4 ## b> - Opcode: 0xa5 -- Pops: *... stack*, {[]byte A}, {[]byte B} -- Pushes: uint64 -- A is greater than B, where A and B are byte-arrays interpreted as big-endian unsigned integers => { 0 or 1} -- LogicSigVersion >= 4 +- Stack: ..., A: []byte, B: []byte → ..., uint64 +- 1 if A is greater than B, else 0. A and B are interpreted as big-endian unsigned integers +- Availability: v4 ## b<= - Opcode: 0xa6 -- Pops: *... stack*, {[]byte A}, {[]byte B} -- Pushes: uint64 -- A is less than or equal to B, where A and B are byte-arrays interpreted as big-endian unsigned integers => { 0 or 1} -- LogicSigVersion >= 4 +- Stack: ..., A: []byte, B: []byte → ..., uint64 +- 1 if A is less than or equal to B, else 0. A and B are interpreted as big-endian unsigned integers +- Availability: v4 ## b>= - Opcode: 0xa7 -- Pops: *... stack*, {[]byte A}, {[]byte B} -- Pushes: uint64 -- A is greater than or equal to B, where A and B are byte-arrays interpreted as big-endian unsigned integers => { 0 or 1} -- LogicSigVersion >= 4 +- Stack: ..., A: []byte, B: []byte → ..., uint64 +- 1 if A is greater than or equal to B, else 0. A and B are interpreted as big-endian unsigned integers +- Availability: v4 ## b== - Opcode: 0xa8 -- Pops: *... stack*, {[]byte A}, {[]byte B} -- Pushes: uint64 -- A is equals to B, where A and B are byte-arrays interpreted as big-endian unsigned integers => { 0 or 1} -- LogicSigVersion >= 4 +- Stack: ..., A: []byte, B: []byte → ..., uint64 +- 1 if A is equal to B, else 0. A and B are interpreted as big-endian unsigned integers +- Availability: v4 ## b!= - Opcode: 0xa9 -- Pops: *... stack*, {[]byte A}, {[]byte B} -- Pushes: uint64 -- A is not equal to B, where A and B are byte-arrays interpreted as big-endian unsigned integers => { 0 or 1} -- LogicSigVersion >= 4 +- Stack: ..., A: []byte, B: []byte → ..., uint64 +- 0 if A is equal to B, else 1. A and B are interpreted as big-endian unsigned integers +- Availability: v4 ## b% - Opcode: 0xaa -- Pops: *... stack*, {[]byte A}, {[]byte B} -- Pushes: []byte -- A modulo B, where A and B are byte-arrays interpreted as big-endian unsigned integers. Fail if B is zero. +- Stack: ..., A: []byte, B: []byte → ..., []byte +- A modulo B. A and B are interpreted as big-endian unsigned integers. Fail if B is zero. - **Cost**: 20 -- LogicSigVersion >= 4 +- Availability: v4 ## b| - Opcode: 0xab -- Pops: *... stack*, {[]byte A}, {[]byte B} -- Pushes: []byte -- A bitwise-or B, where A and B are byte-arrays, zero-left extended to the greater of their lengths +- Stack: ..., A: []byte, B: []byte → ..., []byte +- A bitwise-or B. A and B are zero-left extended to the greater of their lengths - **Cost**: 6 -- LogicSigVersion >= 4 +- Availability: v4 ## b& - Opcode: 0xac -- Pops: *... stack*, {[]byte A}, {[]byte B} -- Pushes: []byte -- A bitwise-and B, where A and B are byte-arrays, zero-left extended to the greater of their lengths +- Stack: ..., A: []byte, B: []byte → ..., []byte +- A bitwise-and B. A and B are zero-left extended to the greater of their lengths - **Cost**: 6 -- LogicSigVersion >= 4 +- Availability: v4 ## b^ - Opcode: 0xad -- Pops: *... stack*, {[]byte A}, {[]byte B} -- Pushes: []byte -- A bitwise-xor B, where A and B are byte-arrays, zero-left extended to the greater of their lengths +- Stack: ..., A: []byte, B: []byte → ..., []byte +- A bitwise-xor B. A and B are zero-left extended to the greater of their lengths - **Cost**: 6 -- LogicSigVersion >= 4 +- Availability: v4 ## b~ - Opcode: 0xae -- Pops: *... stack*, []byte -- Pushes: []byte -- X with all bits inverted +- Stack: ..., A: []byte → ..., []byte +- A with all bits inverted - **Cost**: 4 -- LogicSigVersion >= 4 +- Availability: v4 ## bzero - Opcode: 0xaf -- Pops: *... stack*, uint64 -- Pushes: []byte -- push a byte-array of length X, containing all zero bytes -- LogicSigVersion >= 4 +- Stack: ..., A: uint64 → ..., []byte +- zero filled byte-array of length A +- Availability: v4 ## log - Opcode: 0xb0 -- Pops: *... stack*, []byte -- Pushes: _None_ -- write bytes to log state of the current application -- LogicSigVersion >= 5 +- Stack: ..., A: []byte → ... +- write A to log state of the current application +- Availability: v5 - Mode: Application `log` fails if called more than MaxLogCalls times in a program, or if the sum of logged bytes exceeds 1024 bytes. @@ -1294,32 +1205,29 @@ bitlen interprets arrays as big-endian integers, unlike setbit/getbit ## itxn_begin - Opcode: 0xb1 -- Pops: _None_ -- Pushes: _None_ +- Stack: ... → ... - begin preparation of a new inner transaction in a new transaction group -- LogicSigVersion >= 5 +- Availability: v5 - Mode: Application -`itxn_begin` initializes Sender to the application address; Fee to the minimum allowable, taking into account MinTxnFee and credit from overpaying in earlier transactions; FirstValid/LastValid to the values in the top-level transaction, and all other fields to zero values. +`itxn_begin` initializes Sender to the application address; Fee to the minimum allowable, taking into account MinTxnFee and credit from overpaying in earlier transactions; FirstValid/LastValid to the values in the invoking transaction, and all other fields to zero or empty values. ## itxn_field f - Opcode: 0xb2 {uint8 transaction field index} -- Pops: *... stack*, any -- Pushes: _None_ -- set field F of the current inner transaction to X -- LogicSigVersion >= 5 +- Stack: ..., A → ... +- set field F of the current inner transaction to A +- Availability: v5 - Mode: Application -`itxn_field` fails if X is of the wrong type for F, including a byte array of the wrong size for use as an address when F is an address field. `itxn_field` also fails if X is an account or asset that does not appear in `txn.Accounts` or `txn.ForeignAssets` of the top-level transaction. (Setting addresses in asset creation are exempted from this requirement.) +`itxn_field` fails if A is of the wrong type for F, including a byte array of the wrong size for use as an address when F is an address field. `itxn_field` also fails if A is an account, asset, or app that is not _available_, or an attempt is made extend an array field beyond the limit imposed by consensus parameters. (Addresses set into asset params of acfg transactions need not be _available_.) ## itxn_submit - Opcode: 0xb3 -- Pops: _None_ -- Pushes: _None_ -- execute the current inner transaction group. Fail if executing this group would exceed 16 total inner transactions, or if any transaction in the group fails. -- LogicSigVersion >= 5 +- Stack: ... → ... +- execute the current inner transaction group. Fail if executing this group would exceed the inner transaction limit, or if any transaction in the group fails. +- Availability: v5 - Mode: Application `itxn_submit` resets the current transaction so that it can not be resubmitted. A new `itxn_begin` is required to prepare another inner transaction. @@ -1327,59 +1235,94 @@ bitlen interprets arrays as big-endian integers, unlike setbit/getbit ## itxn f - Opcode: 0xb4 {uint8 transaction field index} -- Pops: _None_ -- Pushes: any -- push field F of the last inner transaction to stack -- LogicSigVersion >= 5 +- Stack: ... → ..., any +- field F of the last inner transaction +- Availability: v5 - Mode: Application ## itxna f i - Opcode: 0xb5 {uint8 transaction field index} {uint8 transaction field array index} -- Pops: _None_ -- Pushes: any -- push Ith value of the array field F of the last inner transaction to stack -- LogicSigVersion >= 5 +- Stack: ... → ..., any +- Ith value of the array field F of the last inner transaction +- Availability: v5 - Mode: Application ## itxn_next - Opcode: 0xb6 -- Pops: _None_ -- Pushes: _None_ +- Stack: ... → ... - begin preparation of a new inner transaction in the same transaction group -- LogicSigVersion >= 6 +- Availability: v6 +- Mode: Application + +`itxn_next` initializes the transaction exactly as `itxn_begin` does + +## gitxn t f + +- Opcode: 0xb7 {uint8 transaction group index} {uint8 transaction field index} +- Stack: ... → ..., any +- field F of the Tth transaction in the last inner group submitted +- Availability: v6 +- Mode: Application + +## gitxna t f i + +- Opcode: 0xb8 {uint8 transaction group index} {uint8 transaction field index} {uint8 transaction field array index} +- Stack: ... → ..., any +- Ith value of the array field F from the Tth transaction in the last inner group submitted +- Availability: v6 - Mode: Application ## txnas f - Opcode: 0xc0 {uint8 transaction field index} -- Pops: *... stack*, uint64 -- Pushes: any -- push Xth value of the array field F of the current transaction -- LogicSigVersion >= 5 +- Stack: ..., A: uint64 → ..., any +- Ath value of the array field F of the current transaction +- Availability: v5 ## gtxnas t f - Opcode: 0xc1 {uint8 transaction group index} {uint8 transaction field index} -- Pops: *... stack*, uint64 -- Pushes: any -- push Xth value of the array field F from the Tth transaction in the current group -- LogicSigVersion >= 5 +- Stack: ..., A: uint64 → ..., any +- Ath value of the array field F from the Tth transaction in the current group +- Availability: v5 ## gtxnsas f - Opcode: 0xc2 {uint8 transaction field index} -- Pops: *... stack*, {uint64 A}, {uint64 B} -- Pushes: any -- pop an index A and an index B. push Bth value of the array field F from the Ath transaction in the current group -- LogicSigVersion >= 5 +- Stack: ..., A: uint64, B: uint64 → ..., any +- Bth value of the array field F from the Ath transaction in the current group +- Availability: v5 ## args - Opcode: 0xc3 -- Pops: *... stack*, uint64 -- Pushes: []byte -- push Xth LogicSig argument to stack -- LogicSigVersion >= 5 +- Stack: ..., A: uint64 → ..., []byte +- Ath LogicSig argument +- Availability: v5 - Mode: Signature + +## gloadss + +- Opcode: 0xc4 +- Stack: ..., A: uint64, B: uint64 → ..., any +- Bth scratch space value of the Ath transaction in the current group +- Availability: v6 +- Mode: Application + +## itxnas f + +- Opcode: 0xc5 {uint8 transaction field index} +- Stack: ..., A: uint64 → ..., any +- Ath value of the array field F of the last inner transaction +- Availability: v6 +- Mode: Application + +## gitxnas t f + +- Opcode: 0xc6 {uint8 transaction group index} {uint8 transaction field index} +- Stack: ..., A: uint64 → ..., any +- Ath value of the array field F from the Tth transaction in the last inner group submitted +- Availability: v6 +- Mode: Application diff --git a/data/transactions/logic/assembler.go b/data/transactions/logic/assembler.go index 5b4d72b383..8202af0bcf 100644 --- a/data/transactions/logic/assembler.go +++ b/data/transactions/logic/assembler.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -247,14 +247,6 @@ type OpStream struct { HasStatefulOps bool } -// GetVersion returns the LogicSigVersion we're building to -func (ops *OpStream) GetVersion() uint64 { - if ops.Version == 0 { - ops.Version = AssemblerDefaultVersion - } - return ops.Version -} - // createLabel inserts a label reference to point to the next // instruction, reporting an error for a duplicate. func (ops *OpStream) createLabel(label string) { @@ -437,7 +429,7 @@ func assembleIntC(ops *OpStream, spec *OpSpec, args []string) error { if len(args) != 1 { return ops.error("intc operation needs one argument") } - constIndex, err := strconv.ParseUint(args[0], 0, 64) + constIndex, err := simpleImm(args[0], "constant") if err != nil { return ops.error(err) } @@ -448,7 +440,7 @@ func assembleByteC(ops *OpStream, spec *OpSpec, args []string) error { if len(args) != 1 { return ops.error("bytec operation needs one argument") } - constIndex, err := strconv.ParseUint(args[0], 0, 64) + constIndex, err := simpleImm(args[0], "constant") if err != nil { return ops.error(err) } @@ -738,7 +730,7 @@ func assembleArg(ops *OpStream, spec *OpSpec, args []string) error { if len(args) != 1 { return ops.error("arg operation needs one argument") } - val, err := strconv.ParseUint(args[0], 0, 64) + val, err := simpleImm(args[0], "argument") if err != nil { return ops.error(err) } @@ -786,20 +778,42 @@ func assembleSubstring(ops *OpStream, spec *OpSpec, args []string) error { return nil } -func assembleTxn(ops *OpStream, spec *OpSpec, args []string) error { - if len(args) != 1 { - return ops.error("txn expects one argument") - } - fs, ok := txnFieldSpecByName[args[0]] +func txnFieldImm(name string, expectArray bool, ops *OpStream) (*txnFieldSpec, error) { + fs, ok := TxnFieldSpecByName[name] if !ok { - return ops.errorf("txn unknown field: %#v", args[0]) + return nil, fmt.Errorf("unknown field: %#v", name) } - _, ok = txnaFieldSpecByField[fs.field] - if ok { - return ops.errorf("found array field %#v in txn op", args[0]) + if expectArray != fs.array { + if expectArray { + return nil, fmt.Errorf("found scalar field %#v while expecting array", name) + } + return nil, fmt.Errorf("found array field %#v while expecting scalar", name) } if fs.version > ops.Version { - return ops.errorf("field %#v available in version %d. Missed #pragma version?", args[0], fs.version) + return nil, + fmt.Errorf("field %#v available in version %d. Missed #pragma version?", name, fs.version) + } + return &fs, nil +} + +func simpleImm(value string, label string) (uint64, error) { + res, err := strconv.ParseUint(value, 0, 64) + if err != nil { + return 0, fmt.Errorf("unable to parse %s %#v as integer", label, value) + } + if res > 255 { + return 0, fmt.Errorf("%s beyond 255: %d", label, res) + } + return res, err +} + +func asmTxn(ops *OpStream, spec *OpSpec, args []string) error { + if len(args) != 1 { + return ops.error("txn expects one argument") + } + fs, err := txnFieldImm(args[0], false, ops) + if err != nil { + return ops.errorf("%s %w", spec.Name, err) } ops.pending.WriteByte(spec.Opcode) ops.pending.WriteByte(uint8(fs.field)) @@ -807,39 +821,31 @@ func assembleTxn(ops *OpStream, spec *OpSpec, args []string) error { return nil } -// assembleTxn2 delegates to assembleTxn or assembleTxna depending on number of operands -func assembleTxn2(ops *OpStream, spec *OpSpec, args []string) error { - if len(args) == 1 { - return assembleTxn(ops, spec, args) - } - if len(args) == 2 { +// asmTxn2 delegates to asmTxn or asmTxna depending on number of operands +func asmTxn2(ops *OpStream, spec *OpSpec, args []string) error { + switch len(args) { + case 1: + return asmTxn(ops, spec, args) + case 2: txna := OpsByName[ops.Version]["txna"] - return assembleTxna(ops, &txna, args) + return asmTxna(ops, &txna, args) + default: + return ops.error("txn expects one or two arguments") } - return ops.error("txn expects one or two arguments") } -func assembleTxna(ops *OpStream, spec *OpSpec, args []string) error { +// asmTxna also assemble asmItxna +func asmTxna(ops *OpStream, spec *OpSpec, args []string) error { if len(args) != 2 { - return ops.error("txna expects two immediate arguments") - } - fs, ok := txnFieldSpecByName[args[0]] - if !ok { - return ops.errorf("txna unknown field: %#v", args[0]) - } - _, ok = txnaFieldSpecByField[fs.field] - if !ok { - return ops.errorf("txna unknown field: %#v", args[0]) - } - if fs.version > ops.Version { - return ops.errorf("txna %#v available in version %d. Missed #pragma version?", args[0], fs.version) + return ops.errorf("%s expects two immediate arguments", spec.Name) } - arrayFieldIdx, err := strconv.ParseUint(args[1], 0, 64) + fs, err := txnFieldImm(args[0], true, ops) if err != nil { - return ops.error(err) + return ops.errorf("%s %w", spec.Name, err) } - if arrayFieldIdx > 255 { - return ops.errorf("txna array index beyond 255: %d", arrayFieldIdx) + arrayFieldIdx, err := simpleImm(args[1], "array index") + if err != nil { + return ops.errorf("%s %w", spec.Name, err) } ops.pending.WriteByte(spec.Opcode) @@ -849,20 +855,14 @@ func assembleTxna(ops *OpStream, spec *OpSpec, args []string) error { return nil } -func assembleTxnas(ops *OpStream, spec *OpSpec, args []string) error { +// asmTxnas also assembles itxnas +func asmTxnas(ops *OpStream, spec *OpSpec, args []string) error { if len(args) != 1 { - return ops.error("txnas expects one immediate argument") - } - fs, ok := txnFieldSpecByName[args[0]] - if !ok { - return ops.errorf("txnas unknown field: %#v", args[0]) - } - _, ok = txnaFieldSpecByField[fs.field] - if !ok { - return ops.errorf("txnas unknown field: %#v", args[0]) + return ops.errorf("%s expects one immediate argument", spec.Name) } - if fs.version > ops.Version { - return ops.errorf("txnas %#v available in version %d. Missed #pragma version?", args[0], fs.version) + fs, err := txnFieldImm(args[0], true, ops) + if err != nil { + return ops.errorf("%s %w", spec.Name, err) } ops.pending.WriteByte(spec.Opcode) @@ -871,28 +871,17 @@ func assembleTxnas(ops *OpStream, spec *OpSpec, args []string) error { return nil } -func assembleGtxn(ops *OpStream, spec *OpSpec, args []string) error { +func asmGtxn(ops *OpStream, spec *OpSpec, args []string) error { if len(args) != 2 { - return ops.error("gtxn expects two arguments") + return ops.errorf("%s expects two arguments", spec.Name) } - slot, err := strconv.ParseUint(args[0], 0, 64) + slot, err := simpleImm(args[0], "transaction index") if err != nil { - return ops.error(err) + return ops.errorf("%s %w", spec.Name, err) } - if slot > 255 { - return ops.errorf("%s transaction index beyond 255: %d", spec.Name, slot) - } - - fs, ok := txnFieldSpecByName[args[1]] - if !ok { - return ops.errorf("%s unknown field: %#v", spec.Name, args[1]) - } - _, ok = txnaFieldSpecByField[fs.field] - if ok { - return ops.errorf("found array field %#v in %s op", args[1], spec.Name) - } - if fs.version > ops.Version { - return ops.errorf("field %#v available in version %d. Missed #pragma version?", args[1], fs.version) + fs, err := txnFieldImm(args[1], false, ops) + if err != nil { + return ops.errorf("%s %w", spec.Name, err) } ops.pending.WriteByte(spec.Opcode) @@ -902,46 +891,33 @@ func assembleGtxn(ops *OpStream, spec *OpSpec, args []string) error { return nil } -func assembleGtxn2(ops *OpStream, spec *OpSpec, args []string) error { +func asmGtxn2(ops *OpStream, spec *OpSpec, args []string) error { if len(args) == 2 { - return assembleGtxn(ops, spec, args) + return asmGtxn(ops, spec, args) } if len(args) == 3 { gtxna := OpsByName[ops.Version]["gtxna"] - return assembleGtxna(ops, >xna, args) + return asmGtxna(ops, >xna, args) } return ops.errorf("%s expects two or three arguments", spec.Name) } -func assembleGtxna(ops *OpStream, spec *OpSpec, args []string) error { +//asmGtxna also assembles asmGitxna +func asmGtxna(ops *OpStream, spec *OpSpec, args []string) error { if len(args) != 3 { return ops.errorf("%s expects three arguments", spec.Name) } - slot, err := strconv.ParseUint(args[0], 0, 64) + slot, err := simpleImm(args[0], "transaction index") if err != nil { - return ops.error(err) - } - if slot > 255 { - return ops.errorf("%s group index beyond 255: %d", spec.Name, slot) - } - - fs, ok := txnFieldSpecByName[args[1]] - if !ok { - return ops.errorf("%s unknown field: %#v", spec.Name, args[1]) - } - _, ok = txnaFieldSpecByField[fs.field] - if !ok { - return ops.errorf("%s unknown field: %#v", spec.Name, args[1]) + return ops.errorf("%s %w", spec.Name, err) } - if fs.version > ops.Version { - return ops.errorf("%s %#v available in version %d. Missed #pragma version?", spec.Name, args[1], fs.version) - } - arrayFieldIdx, err := strconv.ParseUint(args[2], 0, 64) + fs, err := txnFieldImm(args[1], true, ops) if err != nil { - return ops.error(err) + return ops.errorf("%s %w", spec.Name, err) } - if arrayFieldIdx > 255 { - return ops.errorf("%s array index beyond 255: %d", spec.Name, arrayFieldIdx) + arrayFieldIdx, err := simpleImm(args[2], "array index") + if err != nil { + return ops.errorf("%s %w", spec.Name, err) } ops.pending.WriteByte(spec.Opcode) @@ -952,29 +928,18 @@ func assembleGtxna(ops *OpStream, spec *OpSpec, args []string) error { return nil } -func assembleGtxnas(ops *OpStream, spec *OpSpec, args []string) error { +// asmGtxnas also assembles gitxnas +func asmGtxnas(ops *OpStream, spec *OpSpec, args []string) error { if len(args) != 2 { return ops.errorf("%s expects two immediate arguments", spec.Name) } - - slot, err := strconv.ParseUint(args[0], 0, 64) + slot, err := simpleImm(args[0], "transaction index") if err != nil { - return ops.error(err) + return ops.errorf("%s %w", spec.Name, err) } - if slot > 255 { - return ops.errorf("%s group index beyond 255: %d", spec.Name, slot) - } - - fs, ok := txnFieldSpecByName[args[1]] - if !ok { - return ops.errorf("%s unknown field: %#v", spec.Name, args[1]) - } - _, ok = txnaFieldSpecByField[fs.field] - if !ok { - return ops.errorf("%s unknown field: %#v", spec.Name, args[1]) - } - if fs.version > ops.Version { - return ops.errorf("%s %#v available in version %d. Missed #pragma version?", spec.Name, args[1], fs.version) + fs, err := txnFieldImm(args[1], true, ops) + if err != nil { + return ops.errorf("%s %w", spec.Name, err) } ops.pending.WriteByte(spec.Opcode) @@ -984,24 +949,17 @@ func assembleGtxnas(ops *OpStream, spec *OpSpec, args []string) error { return nil } -func assembleGtxns(ops *OpStream, spec *OpSpec, args []string) error { +func asmGtxns(ops *OpStream, spec *OpSpec, args []string) error { if len(args) == 2 { gtxnsa := OpsByName[ops.Version]["gtxnsa"] - return assembleGtxnsa(ops, >xnsa, args) + return asmGtxnsa(ops, >xnsa, args) } if len(args) != 1 { return ops.errorf("%s expects one or two immediate arguments", spec.Name) } - fs, ok := txnFieldSpecByName[args[0]] - if !ok { - return ops.errorf("%s unknown field: %#v", spec.Name, args[0]) - } - _, ok = txnaFieldSpecByField[fs.field] - if ok { - return ops.errorf("found array field %#v in gtxns op", args[0]) - } - if fs.version > ops.Version { - return ops.errorf("field %#v available in version %d. Missed #pragma version?", args[0], fs.version) + fs, err := txnFieldImm(args[0], false, ops) + if err != nil { + return ops.errorf("%s %w", spec.Name, err) } ops.pending.WriteByte(spec.Opcode) @@ -1010,27 +968,17 @@ func assembleGtxns(ops *OpStream, spec *OpSpec, args []string) error { return nil } -func assembleGtxnsa(ops *OpStream, spec *OpSpec, args []string) error { +func asmGtxnsa(ops *OpStream, spec *OpSpec, args []string) error { if len(args) != 2 { return ops.errorf("%s expects two immediate arguments", spec.Name) } - fs, ok := txnFieldSpecByName[args[0]] - if !ok { - return ops.errorf("%s unknown field: %#v", spec.Name, args[0]) - } - _, ok = txnaFieldSpecByField[fs.field] - if !ok { - return ops.errorf("%s unknown field: %#v", spec.Name, args[0]) - } - if fs.version > ops.Version { - return ops.errorf("%s %#v available in version %d. Missed #pragma version?", spec.Name, args[0], fs.version) - } - arrayFieldIdx, err := strconv.ParseUint(args[1], 0, 64) + fs, err := txnFieldImm(args[0], true, ops) if err != nil { - return ops.error(err) + return ops.errorf("%s %w", spec.Name, err) } - if arrayFieldIdx > 255 { - return ops.errorf("%s array index beyond 255: %d", spec.Name, arrayFieldIdx) + arrayFieldIdx, err := simpleImm(args[1], "array index") + if err != nil { + return ops.errorf("%s %w", spec.Name, err) } ops.pending.WriteByte(spec.Opcode) ops.pending.WriteByte(uint8(fs.field)) @@ -1039,20 +987,13 @@ func assembleGtxnsa(ops *OpStream, spec *OpSpec, args []string) error { return nil } -func assembleGtxnsas(ops *OpStream, spec *OpSpec, args []string) error { +func asmGtxnsas(ops *OpStream, spec *OpSpec, args []string) error { if len(args) != 1 { return ops.errorf("%s expects one immediate argument", spec.Name) } - fs, ok := txnFieldSpecByName[args[0]] - if !ok { - return ops.errorf("%s unknown field: %#v", spec.Name, args[0]) - } - _, ok = txnaFieldSpecByField[fs.field] - if !ok { - return ops.errorf("%s unknown field: %#v", spec.Name, args[0]) - } - if fs.version > ops.Version { - return ops.errorf("%s %#v available in version %d. Missed #pragma version?", spec.Name, args[0], fs.version) + fs, err := txnFieldImm(args[0], true, ops) + if err != nil { + return ops.errorf("%s %w", spec.Name, err) } ops.pending.WriteByte(spec.Opcode) ops.pending.WriteByte(uint8(fs.field)) @@ -1067,7 +1008,7 @@ func asmItxn(ops *OpStream, spec *OpSpec, args []string) error { } if len(args) == 2 { itxna := OpsByName[ops.Version]["itxna"] - return asmItxna(ops, &itxna, args) + return asmTxna(ops, &itxna, args) } return ops.errorf("%s expects one or two arguments", spec.Name) } @@ -1076,58 +1017,55 @@ func asmItxnOnly(ops *OpStream, spec *OpSpec, args []string) error { if len(args) != 1 { return ops.errorf("%s expects one argument", spec.Name) } - fs, ok := txnFieldSpecByName[args[0]] - if !ok { - return ops.errorf("%s unknown field: %#v", spec.Name, args[0]) - } - _, ok = txnaFieldSpecByField[fs.field] - if ok { - return ops.errorf("found array field %#v in %s op", args[0], spec.Name) - } - if fs.version > ops.Version { - return ops.errorf("field %#v available in version %d. Missed #pragma version?", args[0], fs.version) + fs, err := txnFieldImm(args[0], false, ops) + if err != nil { + return ops.errorf("%s %w", spec.Name, err) } + ops.pending.WriteByte(spec.Opcode) ops.pending.WriteByte(uint8(fs.field)) ops.returns(fs.ftype) return nil } -func asmItxna(ops *OpStream, spec *OpSpec, args []string) error { - if len(args) != 2 { - return ops.errorf("%s expects two immediate arguments", spec.Name) +// asmGitxn delegates to asmGtxn or asmGtxna depending on number of operands +func asmGitxn(ops *OpStream, spec *OpSpec, args []string) error { + if len(args) == 2 { + return asmGtxn(ops, spec, args) } - fs, ok := txnFieldSpecByName[args[0]] - if !ok { - return ops.errorf("%s unknown field: %#v", spec.Name, args[0]) + if len(args) == 3 { + itxna := OpsByName[ops.Version]["gitxna"] + return asmGtxna(ops, &itxna, args) } - _, ok = txnaFieldSpecByField[fs.field] + return ops.errorf("%s expects two or three arguments", spec.Name) +} + +func assembleGlobal(ops *OpStream, spec *OpSpec, args []string) error { + if len(args) != 1 { + return ops.errorf("%s expects one argument", spec.Name) + } + fs, ok := GlobalFieldSpecByName[args[0]] if !ok { return ops.errorf("%s unknown field: %#v", spec.Name, args[0]) } if fs.version > ops.Version { - return ops.errorf("%s %#v available in version %d. Missed #pragma version?", spec.Name, args[0], fs.version) - } - arrayFieldIdx, err := strconv.ParseUint(args[1], 0, 64) - if err != nil { - return ops.error(err) - } - if arrayFieldIdx > 255 { - return ops.errorf("%s array index beyond 255: %d", spec.Name, arrayFieldIdx) + //nolint:errcheck // we continue to maintain typestack + ops.errorf("%s %s available in version %d. Missed #pragma version?", spec.Name, args[0], fs.version) } + val := fs.field ops.pending.WriteByte(spec.Opcode) - ops.pending.WriteByte(uint8(fs.field)) - ops.pending.WriteByte(uint8(arrayFieldIdx)) + ops.pending.WriteByte(uint8(val)) + ops.trace("%s (%s)", fs.field, fs.ftype) ops.returns(fs.ftype) return nil } -func assembleGlobal(ops *OpStream, spec *OpSpec, args []string) error { +func assembleAssetHolding(ops *OpStream, spec *OpSpec, args []string) error { if len(args) != 1 { return ops.errorf("%s expects one argument", spec.Name) } - fs, ok := globalFieldSpecByName[args[0]] + fs, ok := AssetHoldingFieldSpecByName[args[0]] if !ok { return ops.errorf("%s unknown field: %#v", spec.Name, args[0]) } @@ -1139,16 +1077,16 @@ func assembleGlobal(ops *OpStream, spec *OpSpec, args []string) error { val := fs.field ops.pending.WriteByte(spec.Opcode) ops.pending.WriteByte(uint8(val)) - ops.trace("%s (%s)", fs.field.String(), fs.ftype.String()) - ops.returns(fs.ftype) + ops.trace("%s (%s)", fs.field, fs.ftype) + ops.returns(fs.ftype, StackUint64) return nil } -func assembleAssetHolding(ops *OpStream, spec *OpSpec, args []string) error { +func assembleAssetParams(ops *OpStream, spec *OpSpec, args []string) error { if len(args) != 1 { return ops.errorf("%s expects one argument", spec.Name) } - fs, ok := assetHoldingFieldSpecByName[args[0]] + fs, ok := AssetParamsFieldSpecByName[args[0]] if !ok { return ops.errorf("%s unknown field: %#v", spec.Name, args[0]) } @@ -1160,16 +1098,16 @@ func assembleAssetHolding(ops *OpStream, spec *OpSpec, args []string) error { val := fs.field ops.pending.WriteByte(spec.Opcode) ops.pending.WriteByte(uint8(val)) - ops.trace("%s (%s)", fs.field.String(), fs.ftype.String()) + ops.trace("%s (%s)", fs.field, fs.ftype) ops.returns(fs.ftype, StackUint64) return nil } -func assembleAssetParams(ops *OpStream, spec *OpSpec, args []string) error { +func assembleAppParams(ops *OpStream, spec *OpSpec, args []string) error { if len(args) != 1 { return ops.errorf("%s expects one argument", spec.Name) } - fs, ok := assetParamsFieldSpecByName[args[0]] + fs, ok := AppParamsFieldSpecByName[args[0]] if !ok { return ops.errorf("%s unknown field: %#v", spec.Name, args[0]) } @@ -1181,16 +1119,16 @@ func assembleAssetParams(ops *OpStream, spec *OpSpec, args []string) error { val := fs.field ops.pending.WriteByte(spec.Opcode) ops.pending.WriteByte(uint8(val)) - ops.trace("%s (%s)", fs.field.String(), fs.ftype.String()) + ops.trace("%s (%s)", fs.field, fs.ftype) ops.returns(fs.ftype, StackUint64) return nil } -func assembleAppParams(ops *OpStream, spec *OpSpec, args []string) error { +func assembleAcctParams(ops *OpStream, spec *OpSpec, args []string) error { if len(args) != 1 { return ops.errorf("%s expects one argument", spec.Name) } - fs, ok := appParamsFieldSpecByName[args[0]] + fs, ok := AcctParamsFieldSpecByName[args[0]] if !ok { return ops.errorf("%s unknown field: %#v", spec.Name, args[0]) } @@ -1202,7 +1140,7 @@ func assembleAppParams(ops *OpStream, spec *OpSpec, args []string) error { val := fs.field ops.pending.WriteByte(spec.Opcode) ops.pending.WriteByte(uint8(val)) - ops.trace("%s (%s)", fs.field.String(), fs.ftype.String()) + ops.trace("%s (%s)", fs.field, fs.ftype) ops.returns(fs.ftype, StackUint64) return nil } @@ -1211,13 +1149,15 @@ func asmTxField(ops *OpStream, spec *OpSpec, args []string) error { if len(args) != 1 { return ops.errorf("%s expects one argument", spec.Name) } - fs, ok := txnFieldSpecByName[args[0]] + fs, ok := TxnFieldSpecByName[args[0]] if !ok { - return ops.errorf("txn unknown field: %#v", args[0]) + return ops.errorf("%s unknown field: %#v", spec.Name, args[0]) } - _, ok = txnaFieldSpecByField[fs.field] - if ok { - return ops.errorf("found array field %#v in %s op", args[0], spec.Name) + if fs.itxVersion == 0 { + return ops.errorf("%s %#v is not allowed.", spec.Name, args[0]) + } + if fs.itxVersion > ops.Version { + return ops.errorf("%s %#v available in version %d. Missed #pragma version?", spec.Name, args[0], fs.itxVersion) } ops.pending.WriteByte(spec.Opcode) ops.pending.WriteByte(uint8(fs.field)) @@ -1229,7 +1169,7 @@ func assembleEcdsa(ops *OpStream, spec *OpSpec, args []string) error { return ops.errorf("%s expects one argument", spec.Name) } - cs, ok := ecdsaCurveSpecByName[args[0]] + cs, ok := EcdsaCurveSpecByName[args[0]] if !ok { return ops.errorf("%s unknown field: %#v", spec.Name, args[0]) } @@ -1244,6 +1184,28 @@ func assembleEcdsa(ops *OpStream, spec *OpSpec, args []string) error { return nil } +func assembleBase64Decode(ops *OpStream, spec *OpSpec, args []string) error { + if len(args) != 1 { + return ops.errorf("%s expects one argument", spec.Name) + } + + encoding, ok := base64EncodingSpecByName[args[0]] + if !ok { + return ops.errorf("%s unknown encoding: %#v", spec.Name, args[0]) + } + if encoding.version > ops.Version { + //nolint:errcheck // we continue to maintain typestack + ops.errorf("%s %s available in version %d. Missed #pragma version?", spec.Name, args[0], encoding.version) + } + + val := encoding.field + ops.pending.WriteByte(spec.Opcode) + ops.pending.WriteByte(uint8(val)) + ops.trace("%s (%s)", encoding.field, encoding.ftype) + ops.returns(encoding.ftype) + return nil +} + type assembleFunc func(*OpStream, *OpSpec, []string) error // Basic assembly. Any extra bytes of opcode are encoded as byte immediates. @@ -1253,12 +1215,9 @@ func asmDefault(ops *OpStream, spec *OpSpec, args []string) error { } ops.pending.WriteByte(spec.Opcode) for i := 0; i < spec.Details.Size-1; i++ { - val, err := strconv.ParseUint(args[i], 0, 64) + val, err := simpleImm(args[i], "argument") if err != nil { - return ops.error(err) - } - if val > 255 { - return ops.errorf("%s outside 0..255: %d", spec.Name, val) + return ops.errorf("%s %w", spec.Name, err) } ops.pending.WriteByte(byte(val)) } @@ -1412,7 +1371,7 @@ func typeTxField(ops *OpStream, args []string) (StackTypes, StackTypes) { if len(args) != 1 { return oneAny, nil } - fs, ok := txnFieldSpecByName[args[0]] + fs, ok := TxnFieldSpecByName[args[0]] if !ok { return oneAny, nil } @@ -1713,7 +1672,7 @@ func (ops *OpStream) pragma(line string) error { if err != nil { return ops.errorf("bad #pragma version: %#v", value) } - if ver < 1 || ver > AssemblerMaxVersion { + if ver > AssemblerMaxVersion { return ops.errorf("unsupported version: %d", ver) } @@ -2018,7 +1977,7 @@ func (ops *OpStream) optimizeConstants(refs []constReference, constBlock []inter func (ops *OpStream) prependCBlocks() []byte { var scratch [binary.MaxVarintLen64]byte prebytes := bytes.Buffer{} - vlen := binary.PutUvarint(scratch[:], ops.GetVersion()) + vlen := binary.PutUvarint(scratch[:], ops.Version) prebytes.Write(scratch[:vlen]) if len(ops.intc) > 0 && !ops.hasIntcBlock { prebytes.WriteByte(0x20) // intcblock @@ -2217,7 +2176,7 @@ func parseIntcblock(program []byte, pc int) (intc []uint64, nextpc int, err erro pos := pc + 1 numInts, bytesUsed := binary.Uvarint(program[pos:]) if bytesUsed <= 0 { - err = fmt.Errorf("could not decode int const block size at pc=%d", pos) + err = fmt.Errorf("could not decode intcblock size at pc=%d", pos) return } pos += bytesUsed @@ -2246,7 +2205,7 @@ func checkIntConstBlock(cx *EvalContext) error { pos := cx.pc + 1 numInts, bytesUsed := binary.Uvarint(cx.program[pos:]) if bytesUsed <= 0 { - return fmt.Errorf("could not decode int const block size at pc=%d", pos) + return fmt.Errorf("could not decode intcblock size at pc=%d", pos) } pos += bytesUsed if numInts > uint64(len(cx.program)) { @@ -2274,7 +2233,7 @@ func parseBytecBlock(program []byte, pc int) (bytec [][]byte, nextpc int, err er pos := pc + 1 numItems, bytesUsed := binary.Uvarint(program[pos:]) if bytesUsed <= 0 { - err = fmt.Errorf("could not decode []byte const block size at pc=%d", pos) + err = fmt.Errorf("could not decode bytecblock size at pc=%d", pos) return } pos += bytesUsed @@ -2314,7 +2273,7 @@ func checkByteConstBlock(cx *EvalContext) error { pos := cx.pc + 1 numItems, bytesUsed := binary.Uvarint(cx.program[pos:]) if bytesUsed <= 0 { - return fmt.Errorf("could not decode []byte const block size at pc=%d", pos) + return fmt.Errorf("could not decode bytecblock size at pc=%d", pos) } pos += bytesUsed if numItems > uint64(len(cx.program)) { @@ -2493,7 +2452,7 @@ func checkPushBytes(cx *EvalContext) error { return cx.err } -// This is also used to disassemble gtxns, gtxnsas, txnas, itxn +// This is also used to disassemble gtxns, gtxnsas, txnas, itxn, itxnas func disTxn(dis *disassembleState, spec *OpSpec) (string, error) { lastIdx := dis.pc + 1 if len(dis.program) <= lastIdx { @@ -2524,7 +2483,7 @@ func disTxna(dis *disassembleState, spec *OpSpec) (string, error) { return fmt.Sprintf("%s %s %d", spec.Name, TxnFieldNames[txarg], arrayFieldIdx), nil } -// This is also used to disassemble gtxnas +// disGtxn is also used to disassemble gtxnas, gitxn, gitxnas func disGtxn(dis *disassembleState, spec *OpSpec) (string, error) { lastIdx := dis.pc + 2 if len(dis.program) <= lastIdx { @@ -2540,6 +2499,7 @@ func disGtxn(dis *disassembleState, spec *OpSpec) (string, error) { return fmt.Sprintf("%s %d %s", spec.Name, gi, TxnFieldNames[txarg]), nil } +// disGtxna is also used to disassemble gitxna func disGtxna(dis *disassembleState, spec *OpSpec) (string, error) { lastIdx := dis.pc + 3 if len(dis.program) <= lastIdx { @@ -2553,7 +2513,7 @@ func disGtxna(dis *disassembleState, spec *OpSpec) (string, error) { return "", fmt.Errorf("invalid txn arg index %d at pc=%d", txarg, dis.pc) } arrayFieldIdx := dis.program[dis.pc+3] - return fmt.Sprintf("gtxna %d %s %d", gi, TxnFieldNames[txarg], arrayFieldIdx), nil + return fmt.Sprintf("%s %d %s %d", spec.Name, gi, TxnFieldNames[txarg], arrayFieldIdx), nil } func disGlobal(dis *disassembleState, spec *OpSpec) (string, error) { @@ -2640,6 +2600,20 @@ func disAppParams(dis *disassembleState, spec *OpSpec) (string, error) { return fmt.Sprintf("%s %s", spec.Name, AppParamsFieldNames[arg]), nil } +func disAcctParams(dis *disassembleState, spec *OpSpec) (string, error) { + lastIdx := dis.pc + 1 + if len(dis.program) <= lastIdx { + missing := lastIdx - len(dis.program) + 1 + return "", fmt.Errorf("unexpected %s opcode end: missing %d bytes", spec.Name, missing) + } + dis.nextpc = dis.pc + 2 + arg := dis.program[dis.pc+1] + if int(arg) >= len(AcctParamsFieldNames) { + return "", fmt.Errorf("invalid acct params arg index %d at pc=%d", arg, dis.pc) + } + return fmt.Sprintf("%s %s", spec.Name, AcctParamsFieldNames[arg]), nil +} + func disTxField(dis *disassembleState, spec *OpSpec) (string, error) { lastIdx := dis.pc + 1 if len(dis.program) <= lastIdx { @@ -2668,6 +2642,20 @@ func disEcdsa(dis *disassembleState, spec *OpSpec) (string, error) { return fmt.Sprintf("%s %s", spec.Name, EcdsaCurveNames[arg]), nil } +func disBase64Decode(dis *disassembleState, spec *OpSpec) (string, error) { + lastIdx := dis.pc + 1 + if len(dis.program) <= lastIdx { + missing := lastIdx - len(dis.program) + 1 + return "", fmt.Errorf("unexpected %s opcode end: missing %d bytes", spec.Name, missing) + } + dis.nextpc = dis.pc + 2 + b64dArg := dis.program[dis.pc+1] + if int(b64dArg) >= len(base64EncodingNames) { + return "", fmt.Errorf("invalid base64_decode arg index %d at pc=%d", b64dArg, dis.pc) + } + return fmt.Sprintf("%s %s", spec.Name, base64EncodingNames[b64dArg]), nil +} + type disInfo struct { pcOffset []PCOffset hasStatefulOps bool diff --git a/data/transactions/logic/assembler_test.go b/data/transactions/logic/assembler_test.go index 1c78f9d404..3b4cbe9189 100644 --- a/data/transactions/logic/assembler_test.go +++ b/data/transactions/logic/assembler_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -344,6 +344,20 @@ itxna Logs 3 const v6Nonsense = v5Nonsense + ` itxn_next +gitxn 4 CreatedAssetID +gitxna 3 Logs 12 +int 0 +dup +gloadss +byte 0x0123456789abcd +bsqrt +txn Sender +acct_params_get AcctBalance +pushint 8; pushint 8; pushint 32; divw // use pushint to prevent changes to intcblock choices +pushint 1 +itxnas Logs +pushint 1 +gitxnas 0 Logs ` var nonsense = map[uint64]string{ @@ -361,7 +375,7 @@ var compiled = map[uint64]string{ 3: "032008b7a60cf8acd19181cf959a12f8acd19181cf951af8acd19181cf15f8acd191810f01020026050212340c68656c6c6f20776f726c6421208dae2087fbba51304eb02b91f656948397a7946390e8cb70fc9ea4d95f92251d024242047465737400320032013202320328292929292a0431003101310231043105310731083109310a310b310c310d310e310f3111311231133114311533000033000133000233000433000533000733000833000933000a33000b33000c33000d33000e33000f3300113300123300133300143300152d2e0102222324252104082209240a220b230c240d250e230f23102311231223132314181b1c2b171615400003290349483403350222231d4a484848482a50512a63222352410003420000432105602105612105270463484821052b62482b642b65484821052b2106662b21056721072b682b692107210570004848210771004848361c0037001a0031183119311b311d311e311f3120210721051e312131223123312431253126312731283129312a312b312c312d312e312f4478222105531421055427042106552105082106564c4d4b02210538212106391c0081e80780046a6f686e", 4: "042004010200b7a60c26040242420c68656c6c6f20776f726c6421208dae2087fbba51304eb02b91f656948397a7946390e8cb70fc9ea4d95f92251d047465737400320032013202320380021234292929292a0431003101310231043105310731083109310a310b310c310d310e310f3111311231133114311533000033000133000233000433000533000733000833000933000a33000b33000c33000d33000e33000f3300113300123300133300143300152d2e01022581f8acd19181cf959a1281f8acd19181cf951a81f8acd19181cf1581f8acd191810f082209240a220b230c240d250e230f23102311231223132314181b1c28171615400003290349483403350222231d4a484848482a50512a632223524100034200004322602261222b634848222862482864286548482228236628226724286828692422700048482471004848361c0037001a0031183119311b311d311e311f312024221e312131223123312431253126312731283129312a312b312c312d312e312f44782522531422542b2355220823564c4d4b0222382123391c0081e80780046a6f686e2281d00f24231f880003420001892223902291922394239593a0a1a2a3a4a5a6a7a8a9aaabacadae23af3a00003b003c003d8164", 5: "052004010002b7a60c26050242420c68656c6c6f20776f726c6421070123456789abcd208dae2087fbba51304eb02b91f656948397a7946390e8cb70fc9ea4d95f92251d047465737400320032013202320380021234292929292b0431003101310231043105310731083109310a310b310c310d310e310f3111311231133114311533000033000133000233000433000533000733000833000933000a33000b33000c33000d33000e33000f3300113300123300133300143300152d2e01022581f8acd19181cf959a1281f8acd19181cf951a81f8acd19181cf1581f8acd191810f082209240a220b230c240d250e230f23102311231223132314181b1c28171615400003290349483403350222231d4a484848482b50512a632223524100034200004322602261222704634848222862482864286548482228246628226723286828692322700048482371004848361c0037001a0031183119311b311d311e311f312023221e312131223123312431253126312731283129312a312b312c312d312e312f447825225314225427042455220824564c4d4b0222382124391c0081e80780046a6f686e2281d00f23241f880003420001892224902291922494249593a0a1a2a3a4a5a6a7a8a9aaabacadae24af3a00003b003c003d816472064e014f012a57000823810858235b235a2359b03139330039b1b200b322c01a23c1001a2323c21a23c3233e233f8120af06002a494905002a49490700b53a03", - 6: "062004010002b7a60c26050242420c68656c6c6f20776f726c6421070123456789abcd208dae2087fbba51304eb02b91f656948397a7946390e8cb70fc9ea4d95f92251d047465737400320032013202320380021234292929292b0431003101310231043105310731083109310a310b310c310d310e310f3111311231133114311533000033000133000233000433000533000733000833000933000a33000b33000c33000d33000e33000f3300113300123300133300143300152d2e01022581f8acd19181cf959a1281f8acd19181cf951a81f8acd19181cf1581f8acd191810f082209240a220b230c240d250e230f23102311231223132314181b1c28171615400003290349483403350222231d4a484848482b50512a632223524100034200004322602261222704634848222862482864286548482228246628226723286828692322700048482371004848361c0037001a0031183119311b311d311e311f312023221e312131223123312431253126312731283129312a312b312c312d312e312f447825225314225427042455220824564c4d4b0222382124391c0081e80780046a6f686e2281d00f23241f880003420001892224902291922494249593a0a1a2a3a4a5a6a7a8a9aaabacadae24af3a00003b003c003d816472064e014f012a57000823810858235b235a2359b03139330039b1b200b322c01a23c1001a2323c21a23c3233e233f8120af06002a494905002a49490700b53a03b6", + 6: "062004010002b7a60c26050242420c68656c6c6f20776f726c6421070123456789abcd208dae2087fbba51304eb02b91f656948397a7946390e8cb70fc9ea4d95f92251d047465737400320032013202320380021234292929292b0431003101310231043105310731083109310a310b310c310d310e310f3111311231133114311533000033000133000233000433000533000733000833000933000a33000b33000c33000d33000e33000f3300113300123300133300143300152d2e01022581f8acd19181cf959a1281f8acd19181cf951a81f8acd19181cf1581f8acd191810f082209240a220b230c240d250e230f23102311231223132314181b1c28171615400003290349483403350222231d4a484848482b50512a632223524100034200004322602261222704634848222862482864286548482228246628226723286828692322700048482371004848361c0037001a0031183119311b311d311e311f312023221e312131223123312431253126312731283129312a312b312c312d312e312f447825225314225427042455220824564c4d4b0222382124391c0081e80780046a6f686e2281d00f23241f880003420001892224902291922494249593a0a1a2a3a4a5a6a7a8a9aaabacadae24af3a00003b003c003d816472064e014f012a57000823810858235b235a2359b03139330039b1b200b322c01a23c1001a2323c21a23c3233e233f8120af06002a494905002a49490700b53a03b6b7043cb8033a0c2349c42a9631007300810881088120978101c53a8101c6003a", } func pseudoOp(opcode string) bool { @@ -430,7 +444,7 @@ pop require.Equal(t, ops1.Program, ops2.Program) } -type expect struct { +type Expect struct { l int s string } @@ -448,7 +462,7 @@ func testMatch(t testing.TB, actual, expected string) { } } -func testProg(t testing.TB, source string, ver uint64, expected ...expect) *OpStream { +func testProg(t testing.TB, source string, ver uint64, expected ...Expect) *OpStream { t.Helper() program := strings.ReplaceAll(source, ";", "\n") ops, err := AssembleStringWithVersion(program, ver) @@ -462,7 +476,7 @@ func testProg(t testing.TB, source string, ver uint64, expected ...expect) *OpSt require.NotNil(t, ops.Program) // It should always be possible to Disassemble dis, err := Disassemble(ops.Program) - require.NoError(t, err) + require.NoError(t, err, program) // And, while the disassembly may not match input // exactly, the assembly of the disassembly should // give the same bytecode @@ -519,7 +533,7 @@ func testLine(t *testing.T, line string, ver uint64, expected string) { testProg(t, source, ver) return } - testProg(t, source, ver, expect{2, expected}) + testProg(t, source, ver, Expect{2, expected}) } func TestAssembleTxna(t *testing.T) { @@ -527,30 +541,30 @@ func TestAssembleTxna(t *testing.T) { testLine(t, "txna Accounts 256", AssemblerMaxVersion, "txna array index beyond 255: 256") testLine(t, "txna ApplicationArgs 256", AssemblerMaxVersion, "txna array index beyond 255: 256") - testLine(t, "txna Sender 256", AssemblerMaxVersion, "txna unknown field: \"Sender\"") + testLine(t, "txna Sender 256", AssemblerMaxVersion, "txna found scalar field \"Sender\"...") testLine(t, "gtxna 0 Accounts 256", AssemblerMaxVersion, "gtxna array index beyond 255: 256") testLine(t, "gtxna 0 ApplicationArgs 256", AssemblerMaxVersion, "gtxna array index beyond 255: 256") - testLine(t, "gtxna 256 Accounts 0", AssemblerMaxVersion, "gtxna group index beyond 255: 256") - testLine(t, "gtxna 0 Sender 256", AssemblerMaxVersion, "gtxna unknown field: \"Sender\"") + testLine(t, "gtxna 256 Accounts 0", AssemblerMaxVersion, "gtxna transaction index beyond 255: 256") + testLine(t, "gtxna 0 Sender 256", AssemblerMaxVersion, "gtxna found scalar field \"Sender\"...") testLine(t, "txn Accounts 0", 1, "txn expects one argument") testLine(t, "txn Accounts 0 1", 2, "txn expects one or two arguments") testLine(t, "txna Accounts 0 1", AssemblerMaxVersion, "txna expects two immediate arguments") testLine(t, "txnas Accounts 1", AssemblerMaxVersion, "txnas expects one immediate argument") - testLine(t, "txna Accounts a", AssemblerMaxVersion, "strconv.ParseUint...") + testLine(t, "txna Accounts a", AssemblerMaxVersion, "txna unable to parse...") testLine(t, "gtxn 0 Sender 0", 1, "gtxn expects two arguments") testLine(t, "gtxn 0 Sender 1 2", 2, "gtxn expects two or three arguments") testLine(t, "gtxna 0 Accounts 1 2", AssemblerMaxVersion, "gtxna expects three arguments") - testLine(t, "gtxna a Accounts 0", AssemblerMaxVersion, "strconv.ParseUint...") - testLine(t, "gtxna 0 Accounts a", AssemblerMaxVersion, "strconv.ParseUint...") + testLine(t, "gtxna a Accounts 0", AssemblerMaxVersion, "gtxna unable to parse...") + testLine(t, "gtxna 0 Accounts a", AssemblerMaxVersion, "gtxna unable to parse...") testLine(t, "gtxnas Accounts 1 2", AssemblerMaxVersion, "gtxnas expects two immediate arguments") testLine(t, "txn ABC", 2, "txn unknown field: \"ABC\"") testLine(t, "gtxn 0 ABC", 2, "gtxn unknown field: \"ABC\"") - testLine(t, "gtxn a ABC", 2, "strconv.ParseUint...") - testLine(t, "txn Accounts", AssemblerMaxVersion, "found array field \"Accounts\" in txn op") - testLine(t, "txn Accounts", 1, "found array field \"Accounts\" in txn op") + testLine(t, "gtxn a ABC", 2, "gtxn unable to parse...") + testLine(t, "txn Accounts", AssemblerMaxVersion, "txn found array field \"Accounts\"...") + testLine(t, "txn Accounts", 1, "txn found array field \"Accounts\"...") testLine(t, "txn Accounts 0", AssemblerMaxVersion, "") - testLine(t, "gtxn 0 Accounts", AssemblerMaxVersion, "found array field \"Accounts\" in gtxn op") - testLine(t, "gtxn 0 Accounts", 1, "found array field \"Accounts\" in gtxn op") + testLine(t, "gtxn 0 Accounts", AssemblerMaxVersion, "gtxn found array field \"Accounts\"...") + testLine(t, "gtxn 0 Accounts", 1, "gtxn found array field \"Accounts\"...") testLine(t, "gtxn 0 Accounts 1", AssemblerMaxVersion, "") } @@ -569,7 +583,7 @@ int 1 + // comment ` - testProg(t, source, AssemblerMaxVersion, expect{3, "+ arg 0 wanted type uint64 got []byte"}) + testProg(t, source, AssemblerMaxVersion, Expect{3, "+ arg 0 wanted type uint64 got []byte"}) } // mutateProgVersion replaces version (first two symbols) in hex-encoded program @@ -708,10 +722,10 @@ func TestAssembleBytes(t *testing.T) { } for _, b := range bad { - testProg(t, b[0], v, expect{1, b[1]}) + testProg(t, b[0], v, Expect{1, b[1]}) // pushbytes should produce the same errors if v >= 3 { - testProg(t, strings.Replace(b[0], "byte", "pushbytes", 1), v, expect{1, b[1]}) + testProg(t, strings.Replace(b[0], "byte", "pushbytes", 1), v, Expect{1, b[1]}) } } }) @@ -1180,7 +1194,7 @@ bnz wat int 2` for v := uint64(1); v < backBranchEnabledVersion; v++ { t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { - testProg(t, source, v, expect{3, "label \"wat\" is a back reference..."}) + testProg(t, source, v, Expect{3, "label \"wat\" is a back reference..."}) }) } for v := uint64(backBranchEnabledVersion); v <= AssemblerMaxVersion; v++ { @@ -1234,7 +1248,7 @@ bnz nowhere int 2` for v := uint64(1); v <= AssemblerMaxVersion; v++ { t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { - testProg(t, source, v, expect{2, "reference to undefined label \"nowhere\""}) + testProg(t, source, v, Expect{2, "reference to undefined label \"nowhere\""}) }) } } @@ -1267,8 +1281,8 @@ int 2` for v := uint64(1); v <= AssemblerMaxVersion; v++ { t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { testProg(t, source, v, - expect{2, "reference to undefined label \"nowhere\""}, - expect{4, "txn unknown field: \"XYZ\""}) + Expect{2, "reference to undefined label \"nowhere\""}, + Expect{4, "txn unknown field: \"XYZ\""}) }) } } @@ -1313,6 +1327,9 @@ global LatestTimestamp global CurrentApplicationID global CreatorAddress global GroupID +global OpcodeBudget +global CallerApplicationID +global CallerApplicationAddress txn Sender txn Fee bnz label1 @@ -1325,6 +1342,7 @@ label1: txn CloseRemainderTo txn VotePK txn SelectionPK +txn StateProofPK txn VoteFirst txn VoteLast txn FirstValidTime @@ -1379,6 +1397,7 @@ itxna Logs 1 itxn NumLogs itxn CreatedAssetID itxn CreatedApplicationID +itxn LastLog `, AssemblerMaxVersion) for _, globalField := range GlobalFieldNames { if !strings.Contains(text, globalField) { @@ -1462,15 +1481,15 @@ func TestConstantArgs(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel() for v := uint64(1); v <= AssemblerMaxVersion; v++ { - testProg(t, "int", v, expect{1, "int needs one argument"}) - testProg(t, "intc", v, expect{1, "intc operation needs one argument"}) - testProg(t, "byte", v, expect{1, "byte operation needs byte literal argument"}) - testProg(t, "bytec", v, expect{1, "bytec operation needs one argument"}) - testProg(t, "addr", v, expect{1, "addr operation needs one argument"}) + testProg(t, "int", v, Expect{1, "int needs one argument"}) + testProg(t, "intc", v, Expect{1, "intc operation needs one argument"}) + testProg(t, "byte", v, Expect{1, "byte operation needs byte literal argument"}) + testProg(t, "bytec", v, Expect{1, "bytec operation needs one argument"}) + testProg(t, "addr", v, Expect{1, "addr operation needs one argument"}) } for v := uint64(3); v <= AssemblerMaxVersion; v++ { - testProg(t, "pushint", v, expect{1, "pushint needs one argument"}) - testProg(t, "pushbytes", v, expect{1, "pushbytes operation needs byte literal argument"}) + testProg(t, "pushint", v, Expect{1, "pushint needs one argument"}) + testProg(t, "pushbytes", v, Expect{1, "pushbytes operation needs byte literal argument"}) } } @@ -1607,7 +1626,7 @@ balance int 1 ==` for v := uint64(2); v < directRefEnabledVersion; v++ { - testProg(t, source, v, expect{2, "balance arg 0 wanted type uint64 got []byte"}) + testProg(t, source, v, Expect{2, "balance arg 0 wanted type uint64 got []byte"}) } for v := uint64(directRefEnabledVersion); v <= AssemblerMaxVersion; v++ { testProg(t, source, v) @@ -1624,7 +1643,7 @@ min_balance int 1 ==` for v := uint64(3); v < directRefEnabledVersion; v++ { - testProg(t, source, v, expect{2, "min_balance arg 0 wanted type uint64 got []byte"}) + testProg(t, source, v, Expect{2, "min_balance arg 0 wanted type uint64 got []byte"}) } for v := uint64(directRefEnabledVersion); v <= AssemblerMaxVersion; v++ { testProg(t, source, v) @@ -1638,16 +1657,16 @@ func TestAssembleAsset(t *testing.T) { introduction := OpsByName[LogicVersion]["asset_holding_get"].Version for v := introduction; v <= AssemblerMaxVersion; v++ { testProg(t, "asset_holding_get ABC 1", v, - expect{1, "asset_holding_get ABC 1 expects 2 stack arguments..."}) + Expect{1, "asset_holding_get ABC 1 expects 2 stack arguments..."}) testProg(t, "int 1; asset_holding_get ABC 1", v, - expect{2, "asset_holding_get ABC 1 expects 2 stack arguments..."}) + Expect{2, "asset_holding_get ABC 1 expects 2 stack arguments..."}) testProg(t, "int 1; int 1; asset_holding_get ABC 1", v, - expect{3, "asset_holding_get expects one argument"}) + Expect{3, "asset_holding_get expects one argument"}) testProg(t, "int 1; int 1; asset_holding_get ABC", v, - expect{3, "asset_holding_get unknown field: \"ABC\""}) + Expect{3, "asset_holding_get unknown field: \"ABC\""}) testProg(t, "byte 0x1234; asset_params_get ABC 1", v, - expect{2, "asset_params_get ABC 1 arg 0 wanted type uint64..."}) + Expect{2, "asset_params_get ABC 1 arg 0 wanted type uint64..."}) testLine(t, "asset_params_get ABC 1", v, "asset_params_get expects one argument") testLine(t, "asset_params_get ABC", v, "asset_params_get unknown field: \"ABC\"") @@ -2031,15 +2050,15 @@ func TestPragmas(t *testing.T) { } testProg(t, `#pragma version 100`, assemblerNoVersion, - expect{1, "unsupported version: 100"}) + Expect{1, "unsupported version: 100"}) - testProg(t, `int 1`, 99, expect{0, "Can not assemble version 99"}) + testProg(t, `int 1`, 99, Expect{0, "Can not assemble version 99"}) - testProg(t, `#pragma version 0`, assemblerNoVersion, - expect{1, "unsupported version: 0"}) + // Allow this on the off chance someone needs to reassemble an old logigsig + testProg(t, `#pragma version 0`, assemblerNoVersion) testProg(t, `#pragma version a`, assemblerNoVersion, - expect{1, `bad #pragma version: "a"`}) + Expect{1, `bad #pragma version: "a"`}) // will default to 1 ops := testProg(t, "int 3", assemblerNoVersion) @@ -2053,24 +2072,24 @@ func TestPragmas(t *testing.T) { require.Equal(t, uint64(2), ops.Version) // changing version is not allowed - testProg(t, "#pragma version 1", 2, expect{1, "version mismatch..."}) - testProg(t, "#pragma version 2", 1, expect{1, "version mismatch..."}) + testProg(t, "#pragma version 1", 2, Expect{1, "version mismatch..."}) + testProg(t, "#pragma version 2", 1, Expect{1, "version mismatch..."}) testProg(t, "#pragma version 2\n#pragma version 1", assemblerNoVersion, - expect{2, "version mismatch..."}) + Expect{2, "version mismatch..."}) // repetitive, but fine ops = testProg(t, "#pragma version 2\n#pragma version 2", assemblerNoVersion) require.Equal(t, uint64(2), ops.Version) testProg(t, "\nint 1\n#pragma version 2", assemblerNoVersion, - expect{3, "#pragma version is only allowed before instructions"}) + Expect{3, "#pragma version is only allowed before instructions"}) testProg(t, "#pragma run-mode 2", assemblerNoVersion, - expect{1, `unsupported pragma directive: "run-mode"`}) + Expect{1, `unsupported pragma directive: "run-mode"`}) testProg(t, "#pragma versions", assemblerNoVersion, - expect{1, `unsupported pragma directive: "versions"`}) + Expect{1, `unsupported pragma directive: "versions"`}) ops = testProg(t, "#pragma version 1", assemblerNoVersion) require.Equal(t, uint64(1), ops.Version) @@ -2078,10 +2097,10 @@ func TestPragmas(t *testing.T) { ops = testProg(t, "\n#pragma version 1", assemblerNoVersion) require.Equal(t, uint64(1), ops.Version) - testProg(t, "#pragma", assemblerNoVersion, expect{1, "empty pragma"}) + testProg(t, "#pragma", assemblerNoVersion, Expect{1, "empty pragma"}) testProg(t, "#pragma version", assemblerNoVersion, - expect{1, "no version value"}) + Expect{1, "no version value"}) ops = testProg(t, " #pragma version 5 ", assemblerNoVersion) require.Equal(t, uint64(5), ops.Version) @@ -2100,8 +2119,8 @@ int 1 require.NoError(t, err) require.Equal(t, ops1.Program, ops.Program) - testProg(t, text, 0, expect{1, "version mismatch..."}) - testProg(t, text, 2, expect{1, "version mismatch..."}) + testProg(t, text, 0, Expect{1, "version mismatch..."}) + testProg(t, text, 2, Expect{1, "version mismatch..."}) testProg(t, text, assemblerNoVersion) ops, err = AssembleStringWithVersion(text, assemblerNoVersion) @@ -2117,8 +2136,8 @@ int 1 require.NoError(t, err) require.Equal(t, ops2.Program, ops.Program) - testProg(t, text, 0, expect{1, "version mismatch..."}) - testProg(t, text, 1, expect{1, "version mismatch..."}) + testProg(t, text, 0, Expect{1, "version mismatch..."}) + testProg(t, text, 1, Expect{1, "version mismatch..."}) ops, err = AssembleStringWithVersion(text, assemblerNoVersion) require.NoError(t, err) @@ -2138,7 +2157,7 @@ len require.Equal(t, ops2.Program, ops.Program) testProg(t, "#pragma unk", assemblerNoVersion, - expect{1, `unsupported pragma directive: "unk"`}) + Expect{1, `unsupported pragma directive: "unk"`}) } func TestAssembleConstants(t *testing.T) { @@ -2210,29 +2229,29 @@ func TestSwapTypeCheck(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel() /* reconfirm that we detect this type error */ - testProg(t, "int 1; byte 0x1234; +", AssemblerMaxVersion, expect{3, "+ arg 1..."}) + testProg(t, "int 1; byte 0x1234; +", AssemblerMaxVersion, Expect{3, "+ arg 1..."}) /* despite swap, we track types */ - testProg(t, "int 1; byte 0x1234; swap; +", AssemblerMaxVersion, expect{4, "+ arg 0..."}) - testProg(t, "byte 0x1234; int 1; swap; +", AssemblerMaxVersion, expect{4, "+ arg 1..."}) + testProg(t, "int 1; byte 0x1234; swap; +", AssemblerMaxVersion, Expect{4, "+ arg 0..."}) + testProg(t, "byte 0x1234; int 1; swap; +", AssemblerMaxVersion, Expect{4, "+ arg 1..."}) } func TestDigAsm(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel() - testProg(t, "int 1; dig; +", AssemblerMaxVersion, expect{2, "dig expects 1 immediate..."}) - testProg(t, "int 1; dig junk; +", AssemblerMaxVersion, expect{2, "...invalid syntax..."}) + testProg(t, "int 1; dig; +", AssemblerMaxVersion, Expect{2, "dig expects 1 immediate..."}) + testProg(t, "int 1; dig junk; +", AssemblerMaxVersion, Expect{2, "dig unable to parse..."}) testProg(t, "int 1; byte 0x1234; int 2; dig 2; +", AssemblerMaxVersion) testProg(t, "byte 0x32; byte 0x1234; int 2; dig 2; +", AssemblerMaxVersion, - expect{5, "+ arg 1..."}) + Expect{5, "+ arg 1..."}) testProg(t, "byte 0x32; byte 0x1234; int 2; dig 3; +", AssemblerMaxVersion, - expect{4, "dig 3 expects 4..."}) + Expect{4, "dig 3 expects 4..."}) testProg(t, "int 1; byte 0x1234; int 2; dig 12; +", AssemblerMaxVersion, - expect{4, "dig 12 expects 13..."}) + Expect{4, "dig 12 expects 13..."}) // Confirm that digging something out does not ruin our knowledge about the types in the middle testProg(t, "int 1; byte 0x1234; byte 0x1234; dig 2; dig 3; +; pop; +", AssemblerMaxVersion, - expect{8, "+ arg 1..."}) + Expect{8, "+ arg 1..."}) testProg(t, "int 3; pushbytes \"123456\"; int 1; dig 2; substring3", AssemblerMaxVersion) } @@ -2240,39 +2259,39 @@ func TestDigAsm(t *testing.T) { func TestEqualsTypeCheck(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel() - testProg(t, "int 1; byte 0x1234; ==", AssemblerMaxVersion, expect{3, "== arg 0..."}) - testProg(t, "int 1; byte 0x1234; !=", AssemblerMaxVersion, expect{3, "!= arg 0..."}) - testProg(t, "byte 0x1234; int 1; ==", AssemblerMaxVersion, expect{3, "== arg 0..."}) - testProg(t, "byte 0x1234; int 1; !=", AssemblerMaxVersion, expect{3, "!= arg 0..."}) + testProg(t, "int 1; byte 0x1234; ==", AssemblerMaxVersion, Expect{3, "== arg 0..."}) + testProg(t, "int 1; byte 0x1234; !=", AssemblerMaxVersion, Expect{3, "!= arg 0..."}) + testProg(t, "byte 0x1234; int 1; ==", AssemblerMaxVersion, Expect{3, "== arg 0..."}) + testProg(t, "byte 0x1234; int 1; !=", AssemblerMaxVersion, Expect{3, "!= arg 0..."}) } func TestDupTypeCheck(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel() - testProg(t, "byte 0x1234; dup; int 1; +", AssemblerMaxVersion, expect{4, "+ arg 0..."}) + testProg(t, "byte 0x1234; dup; int 1; +", AssemblerMaxVersion, Expect{4, "+ arg 0..."}) testProg(t, "byte 0x1234; int 1; dup; +", AssemblerMaxVersion) - testProg(t, "byte 0x1234; int 1; dup2; +", AssemblerMaxVersion, expect{4, "+ arg 0..."}) - testProg(t, "int 1; byte 0x1234; dup2; +", AssemblerMaxVersion, expect{4, "+ arg 1..."}) + testProg(t, "byte 0x1234; int 1; dup2; +", AssemblerMaxVersion, Expect{4, "+ arg 0..."}) + testProg(t, "int 1; byte 0x1234; dup2; +", AssemblerMaxVersion, Expect{4, "+ arg 1..."}) - testProg(t, "byte 0x1234; int 1; dup; dig 1; len", AssemblerMaxVersion, expect{5, "len arg 0..."}) - testProg(t, "int 1; byte 0x1234; dup; dig 1; !", AssemblerMaxVersion, expect{5, "! arg 0..."}) + testProg(t, "byte 0x1234; int 1; dup; dig 1; len", AssemblerMaxVersion, Expect{5, "len arg 0..."}) + testProg(t, "int 1; byte 0x1234; dup; dig 1; !", AssemblerMaxVersion, Expect{5, "! arg 0..."}) - testProg(t, "byte 0x1234; int 1; dup2; dig 2; len", AssemblerMaxVersion, expect{5, "len arg 0..."}) - testProg(t, "int 1; byte 0x1234; dup2; dig 2; !", AssemblerMaxVersion, expect{5, "! arg 0..."}) + testProg(t, "byte 0x1234; int 1; dup2; dig 2; len", AssemblerMaxVersion, Expect{5, "len arg 0..."}) + testProg(t, "int 1; byte 0x1234; dup2; dig 2; !", AssemblerMaxVersion, Expect{5, "! arg 0..."}) } func TestSelectTypeCheck(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel() - testProg(t, "int 1; int 2; int 3; select; len", AssemblerMaxVersion, expect{5, "len arg 0..."}) - testProg(t, "byte 0x1234; byte 0x5678; int 3; select; !", AssemblerMaxVersion, expect{5, "! arg 0..."}) + testProg(t, "int 1; int 2; int 3; select; len", AssemblerMaxVersion, Expect{5, "len arg 0..."}) + testProg(t, "byte 0x1234; byte 0x5678; int 3; select; !", AssemblerMaxVersion, Expect{5, "! arg 0..."}) } func TestSetBitTypeCheck(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel() - testProg(t, "int 1; int 2; int 3; setbit; len", AssemblerMaxVersion, expect{5, "len arg 0..."}) - testProg(t, "byte 0x1234; int 2; int 3; setbit; !", AssemblerMaxVersion, expect{5, "! arg 0..."}) + testProg(t, "int 1; int 2; int 3; setbit; len", AssemblerMaxVersion, Expect{5, "len arg 0..."}) + testProg(t, "byte 0x1234; int 2; int 3; setbit; !", AssemblerMaxVersion, Expect{5, "! arg 0..."}) } func TestCoverAsm(t *testing.T) { @@ -2280,7 +2299,7 @@ func TestCoverAsm(t *testing.T) { t.Parallel() testProg(t, `int 4; byte "john"; int 5; cover 2; pop; +`, AssemblerMaxVersion) testProg(t, `int 4; byte "ayush"; int 5; cover 1; pop; +`, AssemblerMaxVersion) - testProg(t, `int 4; byte "john"; int 5; cover 2; +`, AssemblerMaxVersion, expect{5, "+ arg 1..."}) + testProg(t, `int 4; byte "john"; int 5; cover 2; +`, AssemblerMaxVersion, Expect{5, "+ arg 1..."}) } @@ -2290,15 +2309,15 @@ func TestUncoverAsm(t *testing.T) { testProg(t, `int 4; byte "john"; int 5; uncover 2; +`, AssemblerMaxVersion) testProg(t, `int 4; byte "ayush"; int 5; uncover 1; pop; +`, AssemblerMaxVersion) testProg(t, `int 1; byte "jj"; byte "ayush"; byte "john"; int 5; uncover 4; +`, AssemblerMaxVersion) - testProg(t, `int 4; byte "ayush"; int 5; uncover 1; +`, AssemblerMaxVersion, expect{5, "+ arg 1..."}) + testProg(t, `int 4; byte "ayush"; int 5; uncover 1; +`, AssemblerMaxVersion, Expect{5, "+ arg 1..."}) } func TestTxTypes(t *testing.T) { - testProg(t, "itxn_begin; itxn_field Sender", 5, expect{2, "itxn_field Sender expects 1 stack argument..."}) - testProg(t, "itxn_begin; int 1; itxn_field Sender", 5, expect{3, "...wanted type []byte got uint64"}) + testProg(t, "itxn_begin; itxn_field Sender", 5, Expect{2, "itxn_field Sender expects 1 stack argument..."}) + testProg(t, "itxn_begin; int 1; itxn_field Sender", 5, Expect{3, "...wanted type []byte got uint64"}) testProg(t, "itxn_begin; byte 0x56127823; itxn_field Sender", 5) - testProg(t, "itxn_begin; itxn_field Amount", 5, expect{2, "itxn_field Amount expects 1 stack argument..."}) - testProg(t, "itxn_begin; byte 0x87123376; itxn_field Amount", 5, expect{3, "...wanted type uint64 got []byte"}) + testProg(t, "itxn_begin; itxn_field Amount", 5, Expect{2, "itxn_field Amount expects 1 stack argument..."}) + testProg(t, "itxn_begin; byte 0x87123376; itxn_field Amount", 5, Expect{3, "...wanted type uint64 got []byte"}) testProg(t, "itxn_begin; int 1; itxn_field Amount", 5) } diff --git a/data/transactions/logic/backwardCompat_test.go b/data/transactions/logic/backwardCompat_test.go index 226c948405..b5917219df 100644 --- a/data/transactions/logic/backwardCompat_test.go +++ b/data/transactions/logic/backwardCompat_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -22,11 +22,8 @@ import ( "strings" "testing" - "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/data/transactions/logictest" - "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" "github.com/stretchr/testify/require" ) @@ -280,98 +277,70 @@ func TestBackwardCompatTEALv1(t *testing.T) { Data: data[:], }) - txn := makeSampleTxn() + ep, tx, _ := makeSampleEnvWithVersion(1) // RekeyTo disallowed on TEAL v0/v1 - txn.Txn.RekeyTo = basics.Address{} - txgroup := makeSampleTxnGroup(txn) - txn.Lsig.Logic = program - txn.Lsig.Args = [][]byte{data[:], sig[:], pk[:], txn.Txn.Sender[:], txn.Txn.Note} - txn.Txn.RekeyTo = basics.Address{} // RekeyTo not allowed in TEAL v1 + tx.RekeyTo = basics.Address{} - sb := strings.Builder{} - ep := defaultEvalParamsWithVersion(&sb, &txn, 1) - ep.TxnGroup = txgroup + ep.TxnGroup[0].Lsig.Logic = program + ep.TxnGroup[0].Lsig.Args = [][]byte{data[:], sig[:], pk[:], tx.Sender[:], tx.Note} // ensure v1 program runs well on latest TEAL evaluator require.Equal(t, uint8(1), program[0]) // Cost should stay exactly 2140 ep.Proto.LogicSigMaxCost = 2139 - err = Check(program, ep) + err = CheckSignature(0, ep) require.Error(t, err) require.Contains(t, err.Error(), "static cost") ep.Proto.LogicSigMaxCost = 2140 - err = Check(program, ep) + err = CheckSignature(0, ep) require.NoError(t, err) - pass, err := Eval(program, ep) + pass, err := EvalSignature(0, ep) if err != nil || !pass { t.Log(hex.EncodeToString(program)) - t.Log(sb.String()) + t.Log(ep.Trace.String()) } require.NoError(t, err) require.True(t, pass) // Costs for v2 should be higher because of hash opcode cost changes - ep2 := defaultEvalParamsWithVersion(&sb, &txn, 2) - ep2.TxnGroup = txgroup + ep2, tx, _ := makeSampleEnvWithVersion(2) ep2.Proto.LogicSigMaxCost = 2307 - err = Check(opsV2.Program, ep2) - require.Error(t, err) - require.Contains(t, err.Error(), "static cost") + ep2.TxnGroup[0].Lsig.Args = [][]byte{data[:], sig[:], pk[:], tx.Sender[:], tx.Note} + // Eval doesn't fail, but it would be ok (better?) if it did + testLogicBytes(t, opsV2.Program, ep2, "static cost", "") ep2.Proto.LogicSigMaxCost = 2308 - err = Check(opsV2.Program, ep2) - require.NoError(t, err) - - pass, err = Eval(opsV2.Program, ep2) - if err != nil || !pass { - t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) - } - require.NoError(t, err) - require.True(t, pass) + testLogicBytes(t, opsV2.Program, ep2) // ensure v0 program runs well on latest TEAL evaluator - ep = defaultEvalParams(&sb, &txn) - ep.TxnGroup = txgroup + ep, tx, _ = makeSampleEnv() program[0] = 0 sig = c.Sign(Msg{ ProgramHash: crypto.HashObj(Program(program)), Data: data[:], }) - txn.Lsig.Logic = program - txn.Lsig.Args = [][]byte{data[:], sig[:], pk[:], txn.Txn.Sender[:], txn.Txn.Note} + ep.TxnGroup[0].Lsig.Logic = program + ep.TxnGroup[0].Lsig.Args = [][]byte{data[:], sig[:], pk[:], tx.Sender[:], tx.Note} // Cost remains the same, because v0 does not get dynamic treatment ep.Proto.LogicSigMaxCost = 2139 - err = Check(program, ep) - require.Error(t, err) + ep.MinTealVersion = new(uint64) // Was higher because sample txn has a rekey + testLogicBytes(t, program, ep, "static cost", "") ep.Proto.LogicSigMaxCost = 2140 - err = Check(program, ep) - require.NoError(t, err) - pass, err = Eval(program, ep) - require.NoError(t, err) - require.True(t, pass) + testLogicBytes(t, program, ep) // But in v4, cost is now dynamic and exactly 1 less than v2/v3, // because bnz skips "err". It's caught during Eval program[0] = 4 ep.Proto.LogicSigMaxCost = 2306 - err = Check(program, ep) - require.NoError(t, err) - _, err = Eval(program, ep) - require.Error(t, err) + testLogicBytes(t, program, ep, "dynamic cost") ep.Proto.LogicSigMaxCost = 2307 - err = Check(program, ep) - require.NoError(t, err) - pass, err = Eval(program, ep) - require.NoError(t, err) - require.True(t, pass) - + testLogicBytes(t, program, ep) } // ensure v2 fields error on pre TEAL v2 logicsig version @@ -388,7 +357,6 @@ func TestBackwardCompatGlobalFields(t *testing.T) { } require.Greater(t, len(fields), 1) - ledger := logictest.MakeLedger(nil) for _, field := range fields { text := fmt.Sprintf("global %s", field.field.String()) // check assembler fails if version before introduction @@ -399,35 +367,22 @@ func TestBackwardCompatGlobalFields(t *testing.T) { ops := testProg(t, text, AssemblerMaxVersion) - proto := config.Consensus[protocol.ConsensusV23] - require.False(t, proto.Application) - ep := defaultEvalParams(nil, nil) - ep.Proto = &proto - ep.Ledger = ledger - - // check failure with version check - _, err := Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "greater than protocol supported version") - _, err = Eval(ops.Program, ep) + ep, _, _ := makeSampleEnvWithVersion(1) + ep.TxnGroup[0].Txn.RekeyTo = basics.Address{} // avoid min teal version issues + ep.TxnGroup[0].Lsig.Logic = ops.Program + _, err := EvalSignature(0, ep) require.Error(t, err) require.Contains(t, err.Error(), "greater than protocol supported version") // check opcodes failures - ops.Program[0] = 1 // set version to 1 - _, err = Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "invalid global field") - _, err = Eval(ops.Program, ep) + ep.TxnGroup[0].Lsig.Logic[0] = 1 // set version to 1 + _, err = EvalSignature(0, ep) require.Error(t, err) require.Contains(t, err.Error(), "invalid global field") // check opcodes failures - ops.Program[0] = 0 // set version to 0 - _, err = Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "invalid global field") - _, err = Eval(ops.Program, ep) + ep.TxnGroup[0].Lsig.Logic[0] = 0 // set version to 0 + _, err = EvalSignature(0, ep) require.Error(t, err) require.Contains(t, err.Error(), "invalid global field") } @@ -451,22 +406,15 @@ func TestBackwardCompatTxnFields(t *testing.T) { "gtxn 0 %s", } - ledger := logictest.MakeLedger(nil) - txn := makeSampleTxn() - // We'll reject too early if we have a nonzero RekeyTo, because that - // field must be zero for every txn in the group if this is an old - // TEAL version - txn.Txn.RekeyTo = basics.Address{} - txgroup := makeSampleTxnGroup(txn) for _, fs := range fields { field := fs.field.String() for _, command := range tests { text := fmt.Sprintf(command, field) asmError := "...available in version ..." - if _, ok := txnaFieldSpecByField[fs.field]; ok { + if fs.array { parts := strings.Split(text, " ") op := parts[0] - asmError = fmt.Sprintf("found array field %#v in %s op", field, op) + asmError = fmt.Sprintf("%s found array field %#v while expecting scalar", op, field) } // check assembler fails if version before introduction testLine(t, text, assemblerNoVersion, asmError) @@ -475,7 +423,7 @@ func TestBackwardCompatTxnFields(t *testing.T) { } ops, err := AssembleStringWithVersion(text, AssemblerMaxVersion) - if _, ok := txnaFieldSpecByField[fs.field]; ok { + if fs.array { // "txn Accounts" is invalid, so skip evaluation require.Error(t, err, asmError) continue @@ -483,36 +431,27 @@ func TestBackwardCompatTxnFields(t *testing.T) { require.NoError(t, err) } - proto := config.Consensus[protocol.ConsensusV23] - require.False(t, proto.Application) - ep := defaultEvalParams(nil, nil) - ep.Proto = &proto - ep.Ledger = ledger - ep.TxnGroup = txgroup + ep, tx, _ := makeSampleEnvWithVersion(1) + // We'll reject too early if we have a nonzero RekeyTo, because that + // field must be zero for every txn in the group if this is an old + // TEAL version + tx.RekeyTo = basics.Address{} + ep.TxnGroup[0].Lsig.Logic = ops.Program // check failure with version check - _, err = Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "greater than protocol supported version") - _, err = Eval(ops.Program, ep) + _, err = EvalSignature(0, ep) require.Error(t, err) require.Contains(t, err.Error(), "greater than protocol supported version") // check opcodes failures ops.Program[0] = 1 // set version to 1 - _, err = Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "invalid txn field") - _, err = Eval(ops.Program, ep) + _, err = EvalSignature(0, ep) require.Error(t, err) require.Contains(t, err.Error(), "invalid txn field") // check opcodes failures ops.Program[0] = 0 // set version to 0 - _, err = Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "invalid txn field") - _, err = Eval(ops.Program, ep) + _, err = EvalSignature(0, ep) require.Error(t, err) require.Contains(t, err.Error(), "invalid txn field") } @@ -525,30 +464,23 @@ func TestBackwardCompatAssemble(t *testing.T) { // TEAL v1 does not allow branching to the last line // TEAL v2 makes such programs legal t.Parallel() - source := `int 0 -int 1 -bnz done -done:` + source := "int 1; int 1; bnz done; done:" t.Run("v=default", func(t *testing.T) { - testProg(t, source, assemblerNoVersion, expect{4, "label \"done\" is too far away"}) + testProg(t, source, assemblerNoVersion, Expect{4, "label \"done\" is too far away"}) }) t.Run("v=default", func(t *testing.T) { - testProg(t, source, 0, expect{4, "label \"done\" is too far away"}) + testProg(t, source, 0, Expect{4, "label \"done\" is too far away"}) }) t.Run("v=default", func(t *testing.T) { - testProg(t, source, 1, expect{4, "label \"done\" is too far away"}) + testProg(t, source, 1, Expect{4, "label \"done\" is too far away"}) }) for v := uint64(2); v <= AssemblerMaxVersion; v++ { t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { - ops, err := AssembleStringWithVersion(source, v) - require.NoError(t, err) - ep := defaultEvalParams(nil, nil) - _, err = Eval(ops.Program, ep) - require.NoError(t, err) + testLogic(t, source, v, defaultEvalParams(nil)) }) } } diff --git a/data/transactions/logic/blackbox_test.go b/data/transactions/logic/blackbox_test.go new file mode 100644 index 0000000000..e26f84a8f5 --- /dev/null +++ b/data/transactions/logic/blackbox_test.go @@ -0,0 +1,95 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package logic_test + +import ( + "fmt" + "reflect" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/algorand/go-algorand/config" + "github.com/algorand/go-algorand/data/basics" + "github.com/algorand/go-algorand/data/transactions" + "github.com/algorand/go-algorand/data/transactions/logic" + "github.com/algorand/go-algorand/data/txntest" + "github.com/algorand/go-algorand/protocol" + "github.com/algorand/go-algorand/test/partitiontest" +) + +func TestNewAppEvalParams(t *testing.T) { + partitiontest.PartitionTest(t) + + params := []config.ConsensusParams{ + {Application: true, MaxAppProgramCost: 700}, + config.Consensus[protocol.ConsensusV29], + config.Consensus[protocol.ConsensusFuture], + } + + // Create some sample transactions. The main reason this a blackbox test + // (_test package) is to have access to txntest. + payment := txntest.Txn{ + Type: protocol.PaymentTx, + Sender: basics.Address{1, 2, 3, 4}, + Receiver: basics.Address{4, 3, 2, 1}, + Amount: 100, + }.SignedTxnWithAD() + + appcall1 := txntest.Txn{ + Type: protocol.ApplicationCallTx, + Sender: basics.Address{1, 2, 3, 4}, + ApplicationID: basics.AppIndex(1), + }.SignedTxnWithAD() + + appcall2 := appcall1 + appcall2.Txn.ApplicationID = basics.AppIndex(2) + + type evalTestCase struct { + group []transactions.SignedTxnWithAD + numAppCalls int + } + + // Create some groups with these transactions + cases := []evalTestCase{ + {[]transactions.SignedTxnWithAD{payment}, 0}, + {[]transactions.SignedTxnWithAD{appcall1}, 1}, + {[]transactions.SignedTxnWithAD{payment, payment}, 0}, + {[]transactions.SignedTxnWithAD{appcall1, payment}, 1}, + {[]transactions.SignedTxnWithAD{payment, appcall1}, 1}, + {[]transactions.SignedTxnWithAD{appcall1, appcall2}, 2}, + {[]transactions.SignedTxnWithAD{appcall1, appcall2, appcall1}, 3}, + {[]transactions.SignedTxnWithAD{payment, appcall1, payment}, 1}, + {[]transactions.SignedTxnWithAD{appcall1, payment, appcall2}, 2}, + } + + for i, param := range params { + for j, testCase := range cases { + t.Run(fmt.Sprintf("i=%d,j=%d", i, j), func(t *testing.T) { + ep := logic.NewEvalParams(testCase.group, ¶m, nil) + require.NotNil(t, ep) + require.Equal(t, ep.TxnGroup, testCase.group) + require.Equal(t, *ep.Proto, param) + if reflect.DeepEqual(param, config.Consensus[protocol.ConsensusV29]) || testCase.numAppCalls == 0 { + require.Nil(t, ep.PooledApplicationBudget) + } else if reflect.DeepEqual(param, config.Consensus[protocol.ConsensusFuture]) { + require.Equal(t, *ep.PooledApplicationBudget, param.MaxAppProgramCost*testCase.numAppCalls) + } + }) + } + } +} diff --git a/data/transactions/logic/debugger.go b/data/transactions/logic/debugger.go index f90e7b3f3e..ffcd8be81b 100644 --- a/data/transactions/logic/debugger.go +++ b/data/transactions/logic/debugger.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -60,20 +60,21 @@ type PCOffset struct { // to json and send to tealdbg type DebugState struct { // fields set once on Register - ExecID string `codec:"execid"` - Disassembly string `codec:"disasm"` - PCOffset []PCOffset `codec:"pctooffset"` - TxnGroup []transactions.SignedTxn `codec:"txngroup"` - GroupIndex int `codec:"gindex"` - Proto *config.ConsensusParams `codec:"proto"` - Globals []basics.TealValue `codec:"globals"` + ExecID string `codec:"execid"` + Disassembly string `codec:"disasm"` + PCOffset []PCOffset `codec:"pctooffset"` + TxnGroup []transactions.SignedTxnWithAD `codec:"txngroup"` + GroupIndex int `codec:"gindex"` + Proto *config.ConsensusParams `codec:"proto"` + Globals []basics.TealValue `codec:"globals"` // fields updated every step - PC int `codec:"pc"` - Line int `codec:"line"` - Stack []basics.TealValue `codec:"stack"` - Scratch []basics.TealValue `codec:"scratch"` - Error string `codec:"error"` + PC int `codec:"pc"` + Line int `codec:"line"` + Stack []basics.TealValue `codec:"stack"` + Scratch []basics.TealValue `codec:"scratch"` + Error string `codec:"error"` + OpcodeBudget int `codec:"budget"` // global/local state changes are updated every step. Stateful TEAL only. transactions.EvalDelta @@ -105,6 +106,10 @@ func makeDebugState(cx *EvalContext) DebugState { globals := make([]basics.TealValue, len(globalFieldSpecs)) for _, fs := range globalFieldSpecs { + // Don't try to grab app only fields when evaluating a signature + if (cx.runModeFlags&runModeSignature) != 0 && fs.mode == runModeApplication { + continue + } sv, err := cx.globalFieldToValue(fs) if err != nil { sv = stackValue{Bytes: []byte(err.Error())} @@ -113,15 +118,8 @@ func makeDebugState(cx *EvalContext) DebugState { } ds.Globals = globals - // pre-allocate state maps if (cx.runModeFlags & runModeApplication) != 0 { - ds.EvalDelta, err = cx.Ledger.GetDelta(&cx.Txn.Txn) - if err != nil { - sv := stackValue{Bytes: []byte(err.Error())} - tv := stackValueToTealValue(&sv) - vd := tv.ToValueDelta() - ds.EvalDelta.GlobalDelta = basics.StateDelta{"error": vd} - } + ds.EvalDelta = cx.Txn.EvalDelta } return ds @@ -216,16 +214,10 @@ func (cx *EvalContext) refreshDebugState() *DebugState { ds.Stack = stack ds.Scratch = scratch + ds.OpcodeBudget = cx.remainingBudget() if (cx.runModeFlags & runModeApplication) != 0 { - var err error - ds.EvalDelta, err = cx.Ledger.GetDelta(&cx.Txn.Txn) - if err != nil { - sv := stackValue{Bytes: []byte(err.Error())} - tv := stackValueToTealValue(&sv) - vd := tv.ToValueDelta() - ds.EvalDelta.GlobalDelta = basics.StateDelta{"error": vd} - } + ds.EvalDelta = cx.Txn.EvalDelta } return ds diff --git a/data/transactions/logic/debugger_test.go b/data/transactions/logic/debugger_test.go index a9c0603dcb..80e4a639af 100644 --- a/data/transactions/logic/debugger_test.go +++ b/data/transactions/logic/debugger_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -58,7 +58,7 @@ bytec_2 != bytec_3 bytec 4 -== +!= && && ` @@ -68,27 +68,20 @@ func TestWebDebuggerManual(t *testing.T) { debugURL := os.Getenv("TEAL_DEBUGGER_URL") if len(debugURL) == 0 { - return + t.Skip("this must be run manually") } - txn := makeSampleTxn() - txgroup := makeSampleTxnGroup(txn) - txn.Lsig.Args = [][]byte{ - txn.Txn.Sender[:], - txn.Txn.Receiver[:], - txn.Txn.CloseRemainderTo[:], - txn.Txn.VotePK[:], - txn.Txn.SelectionPK[:], - txn.Txn.Note, + ep, tx, _ := makeSampleEnv() + ep.TxnGroup[0].Lsig.Args = [][]byte{ + tx.Sender[:], + tx.Receiver[:], + tx.CloseRemainderTo[:], + tx.VotePK[:], + tx.SelectionPK[:], + tx.Note, } - - ops, err := AssembleString(testProgram) - require.NoError(t, err) - ep := defaultEvalParams(nil, &txn) - ep.TxnGroup = txgroup ep.Debugger = &WebDebuggerHook{URL: debugURL} - _, err = Eval(ops.Program, ep) - require.NoError(t, err) + testLogic(t, testProgram, AssemblerMaxVersion, ep) } type testDbgHook struct { @@ -120,17 +113,14 @@ func TestDebuggerHook(t *testing.T) { partitiontest.PartitionTest(t) testDbg := testDbgHook{} - ops, err := AssembleString(testProgram) - require.NoError(t, err) - ep := defaultEvalParams(nil, nil) + ep := defaultEvalParams(nil) ep.Debugger = &testDbg - _, err = Eval(ops.Program, ep) - require.NoError(t, err) + testLogic(t, testProgram, AssemblerMaxVersion, ep) require.Equal(t, 1, testDbg.register) require.Equal(t, 1, testDbg.complete) require.Greater(t, testDbg.update, 1) - require.Equal(t, 1, len(testDbg.state.Stack)) + require.Len(t, testDbg.state.Stack, 1) } func TestLineToPC(t *testing.T) { diff --git a/data/transactions/logic/doc.go b/data/transactions/logic/doc.go index 5468d808c7..236a4bfdee 100644 --- a/data/transactions/logic/doc.go +++ b/data/transactions/logic/doc.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -17,21 +17,19 @@ package logic import ( - "fmt" - "github.com/algorand/go-algorand/protocol" ) // short description of every op var opDocByName = map[string]string{ - "err": "Error. Fail immediately. This is primarily a fencepost against accidental zero bytes getting compiled into programs.", - "sha256": "SHA256 hash of value X, yields [32]byte", - "keccak256": "Keccak256 hash of value X, yields [32]byte", - "sha512_256": "SHA512_256 hash of value X, yields [32]byte", + "err": "Fail immediately.", + "sha256": "SHA256 hash of value A, yields [32]byte", + "keccak256": "Keccak256 hash of value A, yields [32]byte", + "sha512_256": "SHA512_256 hash of value A, yields [32]byte", "ed25519verify": "for (data A, signature B, pubkey C) verify the signature of (\"ProgData\" || program_hash || data) against the pubkey => {0 or 1}", "ecdsa_verify": "for (data A, signature B, C and pubkey D, E) verify the signature of the data against the pubkey => {0 or 1}", - "ecdsa_pk_decompress": "decompress pubkey A into components X, Y => [*... stack*, X, Y]", - "ecdsa_pk_recover": "for (data A, recovery id B, signature C, D) recover a public key => [*... stack*, X, Y]", + "ecdsa_pk_decompress": "decompress pubkey A into components X, Y", + "ecdsa_pk_recover": "for (data A, recovery id B, signature C, D) recover a public key", "+": "A plus B. Fail on overflow.", "-": "A minus B. Fail if B > A.", @@ -45,134 +43,144 @@ var opDocByName = map[string]string{ "||": "A is not zero or B is not zero => {0 or 1}", "==": "A is equal to B => {0 or 1}", "!=": "A is not equal to B => {0 or 1}", - "!": "X == 0 yields 1; else 0", - "len": "yields length of byte value X", - "itob": "converts uint64 X to big endian bytes", - "btoi": "converts bytes X as big endian to uint64", + "!": "A == 0 yields 1; else 0", + "len": "yields length of byte value A", + "itob": "converts uint64 A to big endian bytes", + "btoi": "converts bytes A as big endian to uint64", "%": "A modulo B. Fail if B == 0.", "|": "A bitwise-or B", "&": "A bitwise-and B", "^": "A bitwise-xor B", - "~": "bitwise invert value X", + "~": "bitwise invert value A", "shl": "A times 2^B, modulo 2^64", "shr": "A divided by 2^B", - "sqrt": "The largest integer B such that B^2 <= X", - "bitlen": "The highest set bit in X. If X is a byte-array, it is interpreted as a big-endian unsigned integer. bitlen of 0 is 0, bitlen of 8 is 4", + "sqrt": "The largest integer I such that I^2 <= A", + "bitlen": "The highest set bit in A. If A is a byte-array, it is interpreted as a big-endian unsigned integer. bitlen of 0 is 0, bitlen of 8 is 4", "exp": "A raised to the Bth power. Fail if A == B == 0 and on overflow", - "expw": "A raised to the Bth power as a 128-bit long result as low (top) and high uint64 values on the stack. Fail if A == B == 0 or if the results exceeds 2^128-1", - "mulw": "A times B out to 128-bit long result as low (top) and high uint64 values on the stack", - "addw": "A plus B out to 128-bit long result as sum (top) and carry-bit uint64 values on the stack", - "divmodw": "Pop four uint64 values. The deepest two are interpreted as a uint128 dividend (deepest value is high word), the top two are interpreted as a uint128 divisor. Four uint64 values are pushed to the stack. The deepest two are the quotient (deeper value is the high uint64). The top two are the remainder, low bits on top.", + "expw": "A raised to the Bth power as a 128-bit result in two uint64s. X is the high 64 bits, Y is the low. Fail if A == B == 0 or if the results exceeds 2^128-1", + "mulw": "A times B as a 128-bit result in two uint64s. X is the high 64 bits, Y is the low", + "addw": "A plus B as a 128-bit result. X is the carry-bit, Y is the low-order 64 bits.", + "divw": "A,B / C. Fail if C == 0 or if result overflows.", + "divmodw": "W,X = (A,B / C,D); Y,Z = (A,B modulo C,D)", "intcblock": "prepare block of uint64 constants for use by intc", - "intc": "push Ith constant from intcblock to stack", - "intc_0": "push constant 0 from intcblock to stack", - "intc_1": "push constant 1 from intcblock to stack", - "intc_2": "push constant 2 from intcblock to stack", - "intc_3": "push constant 3 from intcblock to stack", - "pushint": "push immediate UINT to the stack as an integer", + "intc": "Ith constant from intcblock", + "intc_0": "constant 0 from intcblock", + "intc_1": "constant 1 from intcblock", + "intc_2": "constant 2 from intcblock", + "intc_3": "constant 3 from intcblock", + "pushint": "immediate UINT", "bytecblock": "prepare block of byte-array constants for use by bytec", - "bytec": "push Ith constant from bytecblock to stack", - "bytec_0": "push constant 0 from bytecblock to stack", - "bytec_1": "push constant 1 from bytecblock to stack", - "bytec_2": "push constant 2 from bytecblock to stack", - "bytec_3": "push constant 3 from bytecblock to stack", - "pushbytes": "push the following program bytes to the stack", - - "bzero": "push a byte-array of length X, containing all zero bytes", - "arg": "push Nth LogicSig argument to stack", - "arg_0": "push LogicSig argument 0 to stack", - "arg_1": "push LogicSig argument 1 to stack", - "arg_2": "push LogicSig argument 2 to stack", - "arg_3": "push LogicSig argument 3 to stack", - "args": "push Xth LogicSig argument to stack", - "txn": "push field F of current transaction to stack", - "gtxn": "push field F of the Tth transaction in the current group", - "gtxns": "push field F of the Xth transaction in the current group", - "txna": "push Ith value of the array field F of the current transaction", - "gtxna": "push Ith value of the array field F from the Tth transaction in the current group", - "gtxnsa": "push Ith value of the array field F from the Xth transaction in the current group", - "txnas": "push Xth value of the array field F of the current transaction", - "gtxnas": "push Xth value of the array field F from the Tth transaction in the current group", - "gtxnsas": "pop an index A and an index B. push Bth value of the array field F from the Ath transaction in the current group", - "itxn": "push field F of the last inner transaction to stack", - "itxna": "push Ith value of the array field F of the last inner transaction to stack", - - "global": "push value from globals to stack", - "load": "copy a value from scratch space to the stack. All scratch spaces are 0 at program start.", - "store": "pop value X. store X to the Ith scratch space", - "loads": "copy a value from the Xth scratch space to the stack. All scratch spaces are 0 at program start.", - "stores": "pop indexes A and B. store B to the Ath scratch space", - "gload": "push Ith scratch space index of the Tth transaction in the current group", - "gloads": "push Ith scratch space index of the Xth transaction in the current group", - "gaid": "push the ID of the asset or application created in the Tth transaction of the current group", - "gaids": "push the ID of the asset or application created in the Xth transaction of the current group", - - "bnz": "branch to TARGET if value X is not zero", - "bz": "branch to TARGET if value X is zero", + "bytec": "Ith constant from bytecblock", + "bytec_0": "constant 0 from bytecblock", + "bytec_1": "constant 1 from bytecblock", + "bytec_2": "constant 2 from bytecblock", + "bytec_3": "constant 3 from bytecblock", + "pushbytes": "immediate BYTES", + + "bzero": "zero filled byte-array of length A", + "arg": "Nth LogicSig argument", + "arg_0": "LogicSig argument 0", + "arg_1": "LogicSig argument 1", + "arg_2": "LogicSig argument 2", + "arg_3": "LogicSig argument 3", + "args": "Ath LogicSig argument", + "txn": "field F of current transaction", + "gtxn": "field F of the Tth transaction in the current group", + "gtxns": "field F of the Ath transaction in the current group", + "txna": "Ith value of the array field F of the current transaction", + "gtxna": "Ith value of the array field F from the Tth transaction in the current group", + "gtxnsa": "Ith value of the array field F from the Ath transaction in the current group", + "txnas": "Ath value of the array field F of the current transaction", + "gtxnas": "Ath value of the array field F from the Tth transaction in the current group", + "gtxnsas": "Bth value of the array field F from the Ath transaction in the current group", + "itxn": "field F of the last inner transaction", + "itxna": "Ith value of the array field F of the last inner transaction", + "itxnas": "Ath value of the array field F of the last inner transaction", + "gitxn": "field F of the Tth transaction in the last inner group submitted", + "gitxna": "Ith value of the array field F from the Tth transaction in the last inner group submitted", + "gitxnas": "Ath value of the array field F from the Tth transaction in the last inner group submitted", + + "global": "global field F", + "load": "Ith scratch space value. All scratch spaces are 0 at program start.", + "store": "store A to the Ith scratch space", + "loads": "Ath scratch space value. All scratch spaces are 0 at program start.", + "stores": "store B to the Ath scratch space", + "gload": "Ith scratch space value of the Tth transaction in the current group", + "gloads": "Ith scratch space value of the Ath transaction in the current group", + "gloadss": "Bth scratch space value of the Ath transaction in the current group", + "gaid": "ID of the asset or application created in the Tth transaction of the current group", + "gaids": "ID of the asset or application created in the Ath transaction of the current group", + + "bnz": "branch to TARGET if value A is not zero", + "bz": "branch to TARGET if value A is zero", "b": "branch unconditionally to TARGET", - "return": "use last value on stack as success value; end", - "pop": "discard value X from stack", - "dup": "duplicate last value on stack", - "dup2": "duplicate two last values on stack: A, B -> A, B, A, B", - "dig": "push the Nth value from the top of the stack. dig 0 is equivalent to dup", + "return": "use A as success value; end", + "pop": "discard A", + "dup": "duplicate A", + "dup2": "duplicate A and B", + "dig": "Nth value from the top of the stack. dig 0 is equivalent to dup", "cover": "remove top of stack, and place it deeper in the stack such that N elements are above it. Fails if stack depth <= N.", "uncover": "remove the value at depth N in the stack and shift above items down so the Nth deep value is on top of the stack. Fails if stack depth <= N.", - "swap": "swaps two last values on stack: A, B -> B, A", - "select": "selects one of two values based on top-of-stack: A, B, C -> (if C != 0 then B else A)", - - "concat": "pop two byte-arrays A and B and join them, push the result", - "substring": "pop a byte-array A. For immediate values in 0..255 S and E: extract a range of bytes from A starting at S up to but not including E, push the substring result. If E < S, or either is larger than the array length, the program fails", - "substring3": "pop a byte-array A and two integers B and C. Extract a range of bytes from A starting at B up to but not including C, push the substring result. If C < B, or either is larger than the array length, the program fails", - "getbit": "pop a target A (integer or byte-array), and index B. Push the Bth bit of A.", - "setbit": "pop a target A, index B, and bit C. Set the Bth bit of A to C, and push the result", - "getbyte": "pop a byte-array A and integer B. Extract the Bth byte of A and push it as an integer", - "setbyte": "pop a byte-array A, integer B, and small integer C (between 0..255). Set the Bth byte of A to C, and push the result", - "extract": "pop a byte-array A. For immediate values in 0..255 S and L: extract a range of bytes from A starting at S up to but not including S+L, push the substring result. If L is 0, then extract to the end of the string. If S or S+L is larger than the array length, the program fails", - "extract3": "pop a byte-array A and two integers B and C. Extract a range of bytes from A starting at B up to but not including B+C, push the substring result. If B+C is larger than the array length, the program fails", - "extract_uint16": "pop a byte-array A and integer B. Extract a range of bytes from A starting at B up to but not including B+2, convert bytes as big endian and push the uint64 result. If B+2 is larger than the array length, the program fails", - "extract_uint32": "pop a byte-array A and integer B. Extract a range of bytes from A starting at B up to but not including B+4, convert bytes as big endian and push the uint64 result. If B+4 is larger than the array length, the program fails", - "extract_uint64": "pop a byte-array A and integer B. Extract a range of bytes from A starting at B up to but not including B+8, convert bytes as big endian and push the uint64 result. If B+8 is larger than the array length, the program fails", + "swap": "swaps A and B on stack", + "select": "selects one of two values based on top-of-stack: B if C != 0, else A", + + "concat": "join A and B", + "substring": "A range of bytes from A starting at S up to but not including E. If E < S, or either is larger than the array length, the program fails", + "substring3": "A range of bytes from A starting at B up to but not including C. If C < B, or either is larger than the array length, the program fails", + "getbit": "Bth bit of (byte-array or integer) A.", + "setbit": "Copy of (byte-array or integer) A, with the Bth bit set to (0 or 1) C", + "getbyte": "Bth byte of A, as an integer", + "setbyte": "Copy of A with the Bth byte set to small integer (between 0..255) C", + "extract": "A range of bytes from A starting at S up to but not including S+L. If L is 0, then extract to the end of the string. If S or S+L is larger than the array length, the program fails", + "extract3": "A range of bytes from A starting at B up to but not including B+C. If B+C is larger than the array length, the program fails", + "extract_uint16": "A uint16 formed from a range of big-endian bytes from A starting at B up to but not including B+2. If B+2 is larger than the array length, the program fails", + "extract_uint32": "A uint32 formed from a range of big-endian bytes from A starting at B up to but not including B+4. If B+4 is larger than the array length, the program fails", + "extract_uint64": "A uint64 formed from a range of big-endian bytes from A starting at B up to but not including B+8. If B+8 is larger than the array length, the program fails", + "base64_decode": "decode A which was base64-encoded using _encoding_ E. Fail if A is not base64 encoded with encoding E", "balance": "get balance for account A, in microalgos. The balance is observed after the effects of previous transactions in the group, and after the fee for the current transaction is deducted.", "min_balance": "get minimum required balance for account A, in microalgos. Required balance is affected by [ASA](https://developer.algorand.org/docs/features/asa/#assets-overview) and [App](https://developer.algorand.org/docs/features/asc1/stateful/#minimum-balance-requirement-for-a-smart-contract) usage. When creating or opting into an app, the minimum balance grows before the app code runs, therefore the increase is visible there. When deleting or closing out, the minimum balance decreases after the app executes.", - "app_opted_in": "check if account A opted in for the application B => {0 or 1}", - "app_local_get": "read from account A from local state of the current application key B => value", - "app_local_get_ex": "read from account A from local state of the application B key C => [*... stack*, value, 0 or 1]", - "app_global_get": "read key A from global state of a current application => value", - "app_global_get_ex": "read from application A global state key B => [*... stack*, value, 0 or 1]", - "app_local_put": "write to account specified by A to local state of a current application key B with value C", - "app_global_put": "write key A and value B to global state of the current application", - "app_local_del": "delete from account A local state key B of the current application", - "app_global_del": "delete key A from a global state of the current application", - "asset_holding_get": "read from account A and asset B holding field X (imm arg) => {0 or 1 (top), value}", - "asset_params_get": "read from asset A params field X (imm arg) => {0 or 1 (top), value}", - "app_params_get": "read from app A params field X (imm arg) => {0 or 1 (top), value}", - "assert": "immediately fail unless value X is a non-zero number", + "app_opted_in": "1 if account A is opted in to application B, else 0", + "app_local_get": "local state of the key B in the current application in account A", + "app_local_get_ex": "X is the local state of application B, key C in account A. Y is 1 if key existed, else 0", + "app_global_get": "global state of the key A in the current application", + "app_global_get_ex": "X is the global state of application A, key B. Y is 1 if key existed, else 0", + "app_local_put": "write C to key B in account A's local state of the current application", + "app_global_put": "write B to key A in the global state of the current application", + "app_local_del": "delete key B from account A's local state of the current application", + "app_global_del": "delete key A from the global state of the current application", + "asset_holding_get": "X is field F from account A's holding of asset B. Y is 1 if A is opted into B, else 0", + "asset_params_get": "X is field F from asset A. Y is 1 if A exists, else 0", + "app_params_get": "X is field F from app A. Y is 1 if A exists, else 0", + "acct_params_get": "X is field F from account A. Y is 1 if A owns positive algos, else 0", + "assert": "immediately fail unless A is a non-zero number", "callsub": "branch unconditionally to TARGET, saving the next instruction on the call stack", "retsub": "pop the top instruction from the call stack and branch to it", - "b+": "A plus B, where A and B are byte-arrays interpreted as big-endian unsigned integers", - "b-": "A minus B, where A and B are byte-arrays interpreted as big-endian unsigned integers. Fail on underflow.", - "b/": "A divided by B (truncated division), where A and B are byte-arrays interpreted as big-endian unsigned integers. Fail if B is zero.", - "b*": "A times B, where A and B are byte-arrays interpreted as big-endian unsigned integers.", - "b<": "A is less than B, where A and B are byte-arrays interpreted as big-endian unsigned integers => { 0 or 1}", - "b>": "A is greater than B, where A and B are byte-arrays interpreted as big-endian unsigned integers => { 0 or 1}", - "b<=": "A is less than or equal to B, where A and B are byte-arrays interpreted as big-endian unsigned integers => { 0 or 1}", - "b>=": "A is greater than or equal to B, where A and B are byte-arrays interpreted as big-endian unsigned integers => { 0 or 1}", - "b==": "A is equals to B, where A and B are byte-arrays interpreted as big-endian unsigned integers => { 0 or 1}", - "b!=": "A is not equal to B, where A and B are byte-arrays interpreted as big-endian unsigned integers => { 0 or 1}", - "b%": "A modulo B, where A and B are byte-arrays interpreted as big-endian unsigned integers. Fail if B is zero.", - "b|": "A bitwise-or B, where A and B are byte-arrays, zero-left extended to the greater of their lengths", - "b&": "A bitwise-and B, where A and B are byte-arrays, zero-left extended to the greater of their lengths", - "b^": "A bitwise-xor B, where A and B are byte-arrays, zero-left extended to the greater of their lengths", - "b~": "X with all bits inverted", - - "log": "write bytes to log state of the current application", + "b+": "A plus B. A and B are interpreted as big-endian unsigned integers", + "b-": "A minus B. A and B are interpreted as big-endian unsigned integers. Fail on underflow.", + "b/": "A divided by B (truncated division). A and B are interpreted as big-endian unsigned integers. Fail if B is zero.", + "b*": "A times B. A and B are interpreted as big-endian unsigned integers.", + "b<": "1 if A is less than B, else 0. A and B are interpreted as big-endian unsigned integers", + "b>": "1 if A is greater than B, else 0. A and B are interpreted as big-endian unsigned integers", + "b<=": "1 if A is less than or equal to B, else 0. A and B are interpreted as big-endian unsigned integers", + "b>=": "1 if A is greater than or equal to B, else 0. A and B are interpreted as big-endian unsigned integers", + "b==": "1 if A is equal to B, else 0. A and B are interpreted as big-endian unsigned integers", + "b!=": "0 if A is equal to B, else 1. A and B are interpreted as big-endian unsigned integers", + "b%": "A modulo B. A and B are interpreted as big-endian unsigned integers. Fail if B is zero.", + "b|": "A bitwise-or B. A and B are zero-left extended to the greater of their lengths", + "b&": "A bitwise-and B. A and B are zero-left extended to the greater of their lengths", + "b^": "A bitwise-xor B. A and B are zero-left extended to the greater of their lengths", + "b~": "A with all bits inverted", + + "bsqrt": "The largest integer I such that I^2 <= A. A and I are interpreted as big-endian unsigned integers", + + "log": "write A to log state of the current application", "itxn_begin": "begin preparation of a new inner transaction in a new transaction group", "itxn_next": "begin preparation of a new inner transaction in the same transaction group", - "itxn_field": "set field F of the current inner transaction to X", - "itxn_submit": "execute the current inner transaction group. Fail if executing this group would exceed 16 total inner transactions, or if any transaction in the group fails.", + "itxn_field": "set field F of the current inner transaction to A", + "itxn_submit": "execute the current inner transaction group. Fail if executing this group would exceed the inner transaction limit, or if any transaction in the group fails.", } // OpDoc returns a description of the op @@ -221,14 +229,21 @@ var opcodeImmediateNotes = map[string]string{ "asset_holding_get": "{uint8 asset holding field index}", "asset_params_get": "{uint8 asset params field index}", "app_params_get": "{uint8 app params field index}", + "acct_params_get": "{uint8 account params field index}", "itxn_field": "{uint8 transaction field index}", "itxn": "{uint8 transaction field index}", "itxna": "{uint8 transaction field index} {uint8 transaction field array index}", + "itxnas": "{uint8 transaction field index}", + "gitxn": "{uint8 transaction group index} {uint8 transaction field index}", + "gitxna": "{uint8 transaction group index} {uint8 transaction field index} {uint8 transaction field array index}", + "gitxnas": "{uint8 transaction group index} {uint8 transaction field index}", "ecdsa_verify": "{uint8 curve index}", "ecdsa_pk_decompress": "{uint8 curve index}", "ecdsa_pk_recover": "{uint8 curve index}", + + "base64_decode": "{uint8 encoding index}", } // OpImmediateNote returns a short string about immediate data which follows the op byte @@ -236,6 +251,21 @@ func OpImmediateNote(opName string) string { return opcodeImmediateNotes[opName] } +var opcodeSpecialStackEffects = map[string]string{ + "dup": "..., A → ..., A, A", + "dup2": "..., A, B → ..., A, B, A, B", + "dig": "..., A, [N items] → ..., A, [N items], A", + "swap": "..., A, B → ..., B, A", + "select": "..., A, B, C → ..., A or B", + "cover": "..., [N items], A → ..., A, [N items]", + "uncover": "..., A, [N items] → ..., [N items], A", +} + +// OpStackEffects returns a "stack pattern" for opcodes that do not have a derivable effect +func OpStackEffects(opName string) string { + return opcodeSpecialStackEffects[opName] +} + // further documentation on the function of the opcode var opDocExtras = map[string]string{ "ed25519verify": "The 32 byte public key is the last element on the stack, preceded by the 64 byte signature at the second-to-last element on the stack, preceded by the data which was signed at the third-to-last element on the stack.", @@ -253,36 +283,40 @@ var opDocExtras = map[string]string{ "+": "Overflow is an error condition which halts execution and fails the transaction. Full precision is available from `addw`.", "/": "`divmodw` is available to divide the two-element values produced by `mulw` and `addw`.", "bitlen": "bitlen interprets arrays as big-endian integers, unlike setbit/getbit", + "divw": "The notation A,B indicates that A and B are interpreted as a uint128 value, with A as the high uint64 and B the low.", + "divmodw": "The notation J,K indicates that two uint64 values J and K are interpreted as a uint128 value, with J as the high uint64 and K the low.", "txn": "FirstValidTime causes the program to fail. The field is reserved for future use.", "gtxn": "for notes on transaction fields available, see `txn`. If this transaction is _i_ in the group, `gtxn i field` is equivalent to `txn field`.", "gtxns": "for notes on transaction fields available, see `txn`. If top of stack is _i_, `gtxns field` is equivalent to `gtxn _i_ field`. gtxns exists so that _i_ can be calculated, often based on the index of the current transaction.", "gload": "`gload` fails unless the requested transaction is an ApplicationCall and T < GroupIndex.", - "gloads": "`gloads` fails unless the requested transaction is an ApplicationCall and X < GroupIndex.", + "gloads": "`gloads` fails unless the requested transaction is an ApplicationCall and A < GroupIndex.", "gaid": "`gaid` fails unless the requested transaction created an asset or application and T < GroupIndex.", - "gaids": "`gaids` fails unless the requested transaction created an asset or application and X < GroupIndex.", + "gaids": "`gaids` fails unless the requested transaction created an asset or application and A < GroupIndex.", "btoi": "`btoi` fails if the input is longer than 8 bytes.", "concat": "`concat` fails if the result would be greater than 4096 bytes.", "pushbytes": "pushbytes args are not added to the bytecblock during assembly processes", "pushint": "pushint args are not added to the intcblock during assembly processes", "getbit": "see explanation of bit ordering in setbit", "setbit": "When A is a uint64, index 0 is the least significant bit. Setting bit 3 to 1 on the integer 0 yields 8, or 2^3. When A is a byte array, index 0 is the leftmost bit of the leftmost byte. Setting bits 0 through 11 to 1 in a 4-byte-array of 0s yields the byte array 0xfff00000. Setting bit 3 to 1 on the 1-byte-array 0x00 yields the byte array 0x10.", - "balance": "params: Before v4, Txn.Accounts offset. Since v4, Txn.Accounts offset or an account address that appears in Txn.Accounts or is Txn.Sender). Return: value.", - "min_balance": "params: Before v4, Txn.Accounts offset. Since v4, Txn.Accounts offset or an account address that appears in Txn.Accounts or is Txn.Sender). Return: value.", - "app_opted_in": "params: Txn.Accounts offset (or, since v4, an account address that appears in Txn.Accounts or is Txn.Sender), application id (or, since v4, a Txn.ForeignApps offset). Return: 1 if opted in and 0 otherwise.", - "app_local_get": "params: Txn.Accounts offset (or, since v4, an account address that appears in Txn.Accounts or is Txn.Sender), state key. Return: value. The value is zero (of type uint64) if the key does not exist.", - "app_local_get_ex": "params: Txn.Accounts offset (or, since v4, an account address that appears in Txn.Accounts or is Txn.Sender), application id (or, since v4, a Txn.ForeignApps offset), state key. Return: did_exist flag (top of the stack, 1 if the application and key existed and 0 otherwise), value. The value is zero (of type uint64) if the key does not exist.", - "app_global_get_ex": "params: Txn.ForeignApps offset (or, since v4, an application id that appears in Txn.ForeignApps or is the CurrentApplicationID), state key. Return: did_exist flag (top of the stack, 1 if the application and key existed and 0 otherwise), value. The value is zero (of type uint64) if the key does not exist.", + "balance": "params: Txn.Accounts offset (or, since v4, an _available_ account address), _available_ application id (or, since v4, a Txn.ForeignApps offset). Return: value.", + "min_balance": "params: Txn.Accounts offset (or, since v4, an _available_ account address), _available_ application id (or, since v4, a Txn.ForeignApps offset). Return: value.", + "app_opted_in": "params: Txn.Accounts offset (or, since v4, an _available_ account address), _available_ application id (or, since v4, a Txn.ForeignApps offset). Return: 1 if opted in and 0 otherwise.", + "app_local_get": "params: Txn.Accounts offset (or, since v4, an _available_ account address), state key. Return: value. The value is zero (of type uint64) if the key does not exist.", + "app_local_get_ex": "params: Txn.Accounts offset (or, since v4, an _available_ account address), _available_ application id (or, since v4, a Txn.ForeignApps offset), state key. Return: did_exist flag (top of the stack, 1 if the application and key existed and 0 otherwise), value. The value is zero (of type uint64) if the key does not exist.", + "app_global_get_ex": "params: Txn.ForeignApps offset (or, since v4, an _available_ application id), state key. Return: did_exist flag (top of the stack, 1 if the application and key existed and 0 otherwise), value. The value is zero (of type uint64) if the key does not exist.", "app_global_get": "params: state key. Return: value. The value is zero (of type uint64) if the key does not exist.", - "app_local_put": "params: Txn.Accounts offset (or, since v4, an account address that appears in Txn.Accounts or is Txn.Sender), state key, value.", - "app_local_del": "params: Txn.Accounts offset (or, since v4, an account address that appears in Txn.Accounts or is Txn.Sender), state key.\n\nDeleting a key which is already absent has no effect on the application local state. (In particular, it does _not_ cause the program to fail.)", + "app_local_put": "params: Txn.Accounts offset (or, since v4, an _available_ account address), state key, value.", + "app_local_del": "params: Txn.Accounts offset (or, since v4, an _available_ account address), state key.\n\nDeleting a key which is already absent has no effect on the application local state. (In particular, it does _not_ cause the program to fail.)", "app_global_del": "params: state key.\n\nDeleting a key which is already absent has no effect on the application global state. (In particular, it does _not_ cause the program to fail.)", - "asset_holding_get": "params: Txn.Accounts offset (or, since v4, an account address that appears in Txn.Accounts or is Txn.Sender), asset id (or, since v4, a Txn.ForeignAssets offset). Return: did_exist flag (1 if the asset existed and 0 otherwise), value.", - "asset_params_get": "params: Before v4, Txn.ForeignAssets offset. Since v4, Txn.ForeignAssets offset or an asset id that appears in Txn.ForeignAssets. Return: did_exist flag (1 if the asset existed and 0 otherwise), value.", - "app_params_get": "params: Txn.ForeignApps offset or an app id that appears in Txn.ForeignApps. Return: did_exist flag (1 if the application existed and 0 otherwise), value.", + "asset_holding_get": "params: Txn.Accounts offset (or, since v4, an _available_ address), asset id (or, since v4, a Txn.ForeignAssets offset). Return: did_exist flag (1 if the asset existed and 0 otherwise), value.", + "asset_params_get": "params: Txn.ForeignAssets offset (or, since v4, an _available_ asset id. Return: did_exist flag (1 if the asset existed and 0 otherwise), value.", + "app_params_get": "params: Txn.ForeignApps offset or an _available_ app id. Return: did_exist flag (1 if the application existed and 0 otherwise), value.", "log": "`log` fails if called more than MaxLogCalls times in a program, or if the sum of logged bytes exceeds 1024 bytes.", - "itxn_begin": "`itxn_begin` initializes Sender to the application address; Fee to the minimum allowable, taking into account MinTxnFee and credit from overpaying in earlier transactions; FirstValid/LastValid to the values in the top-level transaction, and all other fields to zero values.", - "itxn_field": "`itxn_field` fails if X is of the wrong type for F, including a byte array of the wrong size for use as an address when F is an address field. `itxn_field` also fails if X is an account or asset that does not appear in `txn.Accounts` or `txn.ForeignAssets` of the top-level transaction. (Setting addresses in asset creation are exempted from this requirement.)", + "itxn_begin": "`itxn_begin` initializes Sender to the application address; Fee to the minimum allowable, taking into account MinTxnFee and credit from overpaying in earlier transactions; FirstValid/LastValid to the values in the invoking transaction, and all other fields to zero or empty values.", + "itxn_next": "`itxn_next` initializes the transaction exactly as `itxn_begin` does", + "itxn_field": "`itxn_field` fails if A is of the wrong type for F, including a byte array of the wrong size for use as an address when F is an address field. `itxn_field` also fails if A is an account, asset, or app that is not _available_, or an attempt is made extend an array field beyond the limit imposed by consensus parameters. (Addresses set into asset params of acfg transactions need not be _available_.)", "itxn_submit": "`itxn_submit` resets the current transaction so that it can not be resubmitted. A new `itxn_begin` is required to prepare another inner transaction.", + "base64_decode": "Decodes A using the base64 encoding E. Specify the encoding with an immediate arg either as URL and Filename Safe (`URLEncoding`) or Standard (`StdEncoding`). See RFC 4648 (sections 4 and 5). It is assumed that the encoding ends with the exact number of `=` padding characters as required by the RFC. When padding occurs, any unused pad bits in the encoding must be set to zero or the decoding will fail. The special cases of `\\n` and `\\r` are allowed but completely ignored. An error will result when attempting to decode a string with a character that is not in the encoding alphabet or not one of `=`, `\\r`, or `\\n`.", } // OpDocExtra returns extra documentation text about an op @@ -294,14 +328,14 @@ func OpDocExtra(opName string) string { // here is the order args opcodes are presented, so place related // opcodes consecutively, even if their opcode values are not. var OpGroups = map[string][]string{ - "Arithmetic": {"sha256", "keccak256", "sha512_256", "ed25519verify", "ecdsa_verify", "ecdsa_pk_recover", "ecdsa_pk_decompress", "+", "-", "/", "*", "<", ">", "<=", ">=", "&&", "||", "shl", "shr", "sqrt", "bitlen", "exp", "==", "!=", "!", "len", "itob", "btoi", "%", "|", "&", "^", "~", "mulw", "addw", "divmodw", "expw", "getbit", "setbit", "getbyte", "setbyte", "concat"}, - "Byte Array Slicing": {"substring", "substring3", "extract", "extract3", "extract_uint16", "extract_uint32", "extract_uint64"}, - "Byte Array Arithmetic": {"b+", "b-", "b/", "b*", "b<", "b>", "b<=", "b>=", "b==", "b!=", "b%"}, - "Byte Array Logic": {"b|", "b&", "b^", "b~"}, - "Loading Values": {"intcblock", "intc", "intc_0", "intc_1", "intc_2", "intc_3", "pushint", "bytecblock", "bytec", "bytec_0", "bytec_1", "bytec_2", "bytec_3", "pushbytes", "bzero", "arg", "arg_0", "arg_1", "arg_2", "arg_3", "args", "txn", "gtxn", "txna", "txnas", "gtxna", "gtxnas", "gtxns", "gtxnsa", "gtxnsas", "global", "load", "loads", "store", "stores", "gload", "gloads", "gaid", "gaids"}, - "Flow Control": {"err", "bnz", "bz", "b", "return", "pop", "dup", "dup2", "dig", "cover", "uncover", "swap", "select", "assert", "callsub", "retsub"}, - "State Access": {"balance", "min_balance", "app_opted_in", "app_local_get", "app_local_get_ex", "app_global_get", "app_global_get_ex", "app_local_put", "app_global_put", "app_local_del", "app_global_del", "asset_holding_get", "asset_params_get", "app_params_get", "log"}, - "Inner Transactions": {"itxn_begin", "itxn_next", "itxn_field", "itxn_submit", "itxn", "itxna"}, + "Arithmetic": {"sha256", "keccak256", "sha512_256", "ed25519verify", "ecdsa_verify", "ecdsa_pk_recover", "ecdsa_pk_decompress", "+", "-", "/", "*", "<", ">", "<=", ">=", "&&", "||", "shl", "shr", "sqrt", "bitlen", "exp", "==", "!=", "!", "len", "itob", "btoi", "%", "|", "&", "^", "~", "mulw", "addw", "divw", "divmodw", "expw", "getbit", "setbit", "getbyte", "setbyte", "concat"}, + "Byte Array Manipulation": {"substring", "substring3", "extract", "extract3", "extract_uint16", "extract_uint32", "extract_uint64", "base64_decode"}, + "Byte Array Arithmetic": {"b+", "b-", "b/", "b*", "b<", "b>", "b<=", "b>=", "b==", "b!=", "b%", "bsqrt"}, + "Byte Array Logic": {"b|", "b&", "b^", "b~"}, + "Loading Values": {"intcblock", "intc", "intc_0", "intc_1", "intc_2", "intc_3", "pushint", "bytecblock", "bytec", "bytec_0", "bytec_1", "bytec_2", "bytec_3", "pushbytes", "bzero", "arg", "arg_0", "arg_1", "arg_2", "arg_3", "args", "txn", "gtxn", "txna", "txnas", "gtxna", "gtxnas", "gtxns", "gtxnsa", "gtxnsas", "global", "load", "loads", "store", "stores", "gload", "gloads", "gloadss", "gaid", "gaids"}, + "Flow Control": {"err", "bnz", "bz", "b", "return", "pop", "dup", "dup2", "dig", "cover", "uncover", "swap", "select", "assert", "callsub", "retsub"}, + "State Access": {"balance", "min_balance", "app_opted_in", "app_local_get", "app_local_get_ex", "app_global_get", "app_global_get_ex", "app_local_put", "app_global_put", "app_local_del", "app_global_del", "asset_holding_get", "asset_params_get", "app_params_get", "acct_params_get", "log"}, + "Inner Transactions": {"itxn_begin", "itxn_next", "itxn_field", "itxn_submit", "itxn", "itxna", "itxnas", "gitxn", "gitxna", "gitxnas"}, } // OpCost indicates the cost of an operation over the range of @@ -372,7 +406,7 @@ var txnFieldDocs = map[string]string{ "Type": "Transaction type as bytes", "TypeEnum": "See table below", "Sender": "32 byte address", - "Fee": "micro-Algos", + "Fee": "microalgos", "FirstValid": "round number", "FirstValidTime": "Causes program to fail; reserved for future use", "LastValid": "round number", @@ -384,11 +418,12 @@ var txnFieldDocs = map[string]string{ "TxID": "The computed ID for this transaction. 32 bytes.", "Receiver": "32 byte address", - "Amount": "micro-Algos", + "Amount": "microalgos", "CloseRemainderTo": "32 byte address", "VotePK": "32 byte address", "SelectionPK": "32 byte address", + "StateProofPK": "64 byte state proof public key commitment", "VoteFirst": "The first round that the participation key is valid.", "VoteLast": "The last round that the participation key is valid.", "VoteKeyDilution": "Dilution for the 2-level participation key", @@ -435,62 +470,47 @@ var txnFieldDocs = map[string]string{ "FreezeAssetAccount": "32 byte address of the account whose asset slot is being frozen or un-frozen", "FreezeAssetFrozen": "The new frozen value, 0 or 1", - "Logs": "Log messages emitted by an application call (itxn only)", - "NumLogs": "Number of Logs (itxn only)", - "CreatedAssetID": "Asset ID allocated by the creation of an ASA (itxn only)", - "CreatedApplicationID": "ApplicationID allocated by the creation of an application (itxn only)", -} - -// TxnFieldDocs are notes on fields available by `txn` and `gtxn` with extra versioning info if any -func TxnFieldDocs() map[string]string { - return fieldsDocWithExtra(txnFieldDocs, txnFieldSpecByName) + "Logs": "Log messages emitted by an application call (only with `itxn` in v5)", + "NumLogs": "Number of Logs (only with `itxn` in v5)", + "LastLog": "The last message emitted. Empty bytes if none were emitted", + "CreatedAssetID": "Asset ID allocated by the creation of an ASA (only with `itxn` in v5)", + "CreatedApplicationID": "ApplicationID allocated by the creation of an application (only with `itxn` in v5)", } var globalFieldDocs = map[string]string{ - "MinTxnFee": "micro Algos", - "MinBalance": "micro Algos", + "MinTxnFee": "microalgos", + "MinBalance": "microalgos", "MaxTxnLife": "rounds", "ZeroAddress": "32 byte address of all zero bytes", "GroupSize": "Number of transactions in this atomic transaction group. At least 1", - "LogicSigVersion": "Maximum supported TEAL version", + "LogicSigVersion": "Maximum supported version", "Round": "Current round number", "LatestTimestamp": "Last confirmed block UNIX timestamp. Fails if negative", - "CurrentApplicationID": "ID of current application executing. Fails in LogicSigs", - "CreatorAddress": "Address of the creator of the current application. Fails if no such application is executing", - "CurrentApplicationAddress": "Address that the current application controls. Fails in LogicSigs", + "CurrentApplicationID": "ID of current application executing", + "CreatorAddress": "Address of the creator of the current application", + "CurrentApplicationAddress": "Address that the current application controls", "GroupID": "ID of the transaction group. 32 zero bytes if the transaction is not part of a group.", + "OpcodeBudget": "The remaining cost that can be spent by opcodes in this program.", + "CallerApplicationID": "The application ID of the application that called this application. 0 if this application is at the top-level.", + "CallerApplicationAddress": "The application address of the application that called this application. ZeroAddress if this application is at the top-level.", } -// GlobalFieldDocs are notes on fields available in `global` with extra versioning info if any -func GlobalFieldDocs() map[string]string { - return fieldsDocWithExtra(globalFieldDocs, globalFieldSpecByName) -} - -type extractor interface { - getExtraFor(string) string -} - -func fieldsDocWithExtra(source map[string]string, ex extractor) map[string]string { - result := make(map[string]string, len(source)) - for name, doc := range source { - if extra := ex.getExtraFor(name); len(extra) > 0 { - if len(doc) == 0 { - doc = extra - } else { - sep := ". " - if doc[len(doc)-1] == '.' { - sep = " " - } - doc = fmt.Sprintf("%s%s%s", doc, sep, extra) - } - } - result[name] = doc +func addExtra(original string, extra string) string { + if len(original) == 0 { + return extra } - return result + if len(extra) == 0 { + return original + } + sep := ". " + if original[len(original)-1] == '.' { + sep = " " + } + return original + sep + extra } // AssetHoldingFieldDocs are notes on fields available in `asset_holding_get` -var AssetHoldingFieldDocs = map[string]string{ +var assetHoldingFieldDocs = map[string]string{ "AssetBalance": "Amount of the asset unit held by this account", "AssetFrozen": "Is the asset frozen or not", } @@ -511,11 +531,6 @@ var assetParamsFieldDocs = map[string]string{ "AssetCreator": "Creator address", } -// AssetParamsFieldDocs are notes on fields available in `asset_params_get` with extra versioning info if any -func AssetParamsFieldDocs() map[string]string { - return fieldsDocWithExtra(assetParamsFieldDocs, assetParamsFieldSpecByName) -} - // appParamsFieldDocs are notes on fields available in `app_params_get` var appParamsFieldDocs = map[string]string{ "AppApprovalProgram": "Bytecode of Approval Program", @@ -529,9 +544,11 @@ var appParamsFieldDocs = map[string]string{ "AppAddress": "Address for which this application has authority", } -// AppParamsFieldDocs are notes on fields available in `app_params_get` with extra versioning info if any -func AppParamsFieldDocs() map[string]string { - return fieldsDocWithExtra(appParamsFieldDocs, appParamsFieldSpecByName) +// acctParamsFieldDocs are notes on fields available in `app_params_get` +var acctParamsFieldDocs = map[string]string{ + "AcctBalance": "Account balance in microalgos", + "AcctMinBalance": "Minimum required blance for account, in microalgos", + "AcctAuthAddr": "Address the account is rekeyed to.", } // EcdsaCurveDocs are notes on curves available in `ecdsa_` opcodes diff --git a/data/transactions/logic/doc_test.go b/data/transactions/logic/doc_test.go index f415016247..85b97aaad1 100644 --- a/data/transactions/logic/doc_test.go +++ b/data/transactions/logic/doc_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -21,6 +21,7 @@ import ( "testing" "github.com/algorand/go-algorand/test/partitiontest" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -32,24 +33,20 @@ func TestOpDocs(t *testing.T) { opsSeen[op.Name] = false } for name := range opDocByName { - _, exists := opsSeen[name] - if !exists { - t.Errorf("error: doc for op %#v that does not exist in OpSpecs", name) - } + assert.Contains(t, opsSeen, name, "opDocByName contains strange opcode %#v", name) opsSeen[name] = true } for op, seen := range opsSeen { - if !seen { - t.Errorf("error: doc for op %#v missing from opDocByName", op) - } + assert.True(t, seen, "opDocByName is missing doc for %#v", op) } require.Len(t, txnFieldDocs, len(TxnFieldNames)) require.Len(t, onCompletionDescriptions, len(OnCompletionNames)) require.Len(t, globalFieldDocs, len(GlobalFieldNames)) - require.Len(t, AssetHoldingFieldDocs, len(AssetHoldingFieldNames)) + require.Len(t, assetHoldingFieldDocs, len(AssetHoldingFieldNames)) require.Len(t, assetParamsFieldDocs, len(AssetParamsFieldNames)) require.Len(t, appParamsFieldDocs, len(AppParamsFieldNames)) + require.Len(t, acctParamsFieldDocs, len(AcctParamsFieldNames)) require.Len(t, TypeNameDescriptions, len(TxnTypeNames)) require.Len(t, EcdsaCurveDocs, len(EcdsaCurveNames)) } @@ -80,7 +77,7 @@ func TestOpGroupCoverage(t *testing.T) { for _, name := range names { _, exists := opsSeen[name] if !exists { - t.Errorf("error: op %#v in group list but not in OpSpecs\n", name) + t.Errorf("op %#v in group list but not in OpSpecs\n", name) continue } opsSeen[name] = true @@ -88,7 +85,7 @@ func TestOpGroupCoverage(t *testing.T) { } for name, seen := range opsSeen { if !seen { - t.Errorf("warning: op %#v not in any group of OpGroups\n", name) + t.Errorf("op %#v not in any group of OpGroups\n", name) } } } @@ -119,10 +116,10 @@ func TestAllImmediatesDocumented(t *testing.T) { note := OpImmediateNote(op.Name) if count == 1 && op.Details.Immediates[0].kind >= immBytes { // More elaborate than can be checked by easy count. - require.NotEmpty(t, note) + assert.NotEmpty(t, note) continue } - require.Equal(t, count, strings.Count(note, "{"), "%s immediates doc is wrong", op.Name) + assert.Equal(t, count, strings.Count(note, "{"), "opcodeImmediateNotes for %s is wrong", op.Name) } } @@ -158,20 +155,3 @@ func TestOnCompletionDescription(t *testing.T) { desc = OnCompletionDescription(100) require.Equal(t, "invalid constant value", desc) } - -func TestFieldDocs(t *testing.T) { - partitiontest.PartitionTest(t) - - txnFields := TxnFieldDocs() - require.Greater(t, len(txnFields), 0) - - globalFields := GlobalFieldDocs() - require.Greater(t, len(globalFields), 0) - - doc := globalFields["MinTxnFee"] - require.NotContains(t, doc, "LogicSigVersion >= 2") - - doc = globalFields["Round"] - require.Contains(t, doc, "LogicSigVersion >= 2") - -} diff --git a/data/transactions/logic/eval.go b/data/transactions/logic/eval.go index 9a2530f363..adf523cf90 100644 --- a/data/transactions/logic/eval.go +++ b/data/transactions/logic/eval.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -20,11 +20,11 @@ import ( "bytes" "crypto/sha256" "crypto/sha512" + "encoding/base64" "encoding/binary" "encoding/hex" "errors" "fmt" - "io" "math" "math/big" "math/bits" @@ -48,7 +48,7 @@ const EvalMaxVersion = LogicVersion // The constants below control TEAL opcodes evaluation and MAY NOT be changed // without moving them into consensus parameters. -// MaxStringSize is the limit of byte strings created by `concat` +// MaxStringSize is the limit of byte string length in an AVM value const MaxStringSize = 4096 // MaxByteMathSize is the limit of byte strings supplied as input to byte math opcodes @@ -60,6 +60,12 @@ const MaxLogSize = 1024 // MaxLogCalls is the limit of total log calls during a program execution const MaxLogCalls = 32 +// maxAppCallDepth is the limit on inner appl call depth +// To be clear, 0 would prevent inner appls, 1 would mean inner app calls cannot +// make inner appls. So the total app depth can be 1 higher than this number, if +// you count the top-level app call. +const maxAppCallDepth = 8 + // stackValue is the type for the operand stack. // Each stackValue is either a valid []byte value or a uint64 value. // If (.Bytes != nil) the stackValue is a []byte value, otherwise uint64 value. @@ -115,6 +121,16 @@ func (sv *stackValue) uint() (uint64, error) { return sv.Uint, nil } +func (sv *stackValue) uintMaxed(max uint64) (uint64, error) { + if sv.Bytes != nil { + return 0, fmt.Errorf("%#v is not a uint64", sv.Bytes) + } + if sv.Uint > max { + return 0, fmt.Errorf("%d is larger than max=%d", sv.Uint, max) + } + return sv.Uint, nil +} + func (sv *stackValue) bool() (bool, error) { u64, err := sv.uint() if err != nil { @@ -157,8 +173,10 @@ func stackValueFromTealValue(tv *basics.TealValue) (sv stackValue, err error) { // newly-introduced transaction fields from breaking assumptions made by older // versions of TEAL. If one of the transactions in a group will execute a TEAL // program whose version predates a given field, that field must not be set -// anywhere in the transaction group, or the group will be rejected. -func ComputeMinTealVersion(group []transactions.SignedTxn) uint64 { +// anywhere in the transaction group, or the group will be rejected. In +// addition, inner app calls must not call teal from before inner app calls were +// introduced. +func ComputeMinTealVersion(group []transactions.SignedTxnWithAD, inner bool) uint64 { var minVersion uint64 for _, txn := range group { if !txn.Txn.RekeyTo.IsZero() { @@ -171,6 +189,11 @@ func ComputeMinTealVersion(group []transactions.SignedTxn) uint64 { minVersion = appsEnabledVersion } } + if inner { + if minVersion < innerAppsEnabledVersion { + minVersion = innerAppsEnabledVersion + } + } } return minVersion } @@ -184,8 +207,7 @@ func (sv *stackValue) toTealValue() (tv basics.TealValue) { // LedgerForLogic represents ledger API for Stateful TEAL program type LedgerForLogic interface { - Balance(addr basics.Address) (basics.MicroAlgos, error) - MinBalance(addr basics.Address, proto *config.ConsensusParams) (basics.MicroAlgos, error) + AccountData(addr basics.Address) (basics.AccountData, error) Authorizer(addr basics.Address) (basics.Address, error) Round() basics.Round LatestTimestamp() int64 @@ -193,65 +215,38 @@ type LedgerForLogic interface { AssetHolding(addr basics.Address, assetIdx basics.AssetIndex) (basics.AssetHolding, error) AssetParams(aidx basics.AssetIndex) (basics.AssetParams, basics.Address, error) AppParams(aidx basics.AppIndex) (basics.AppParams, basics.Address, error) - ApplicationID() basics.AppIndex OptedIn(addr basics.Address, appIdx basics.AppIndex) (bool, error) - GetCreatableID(groupIdx int) basics.CreatableIndex GetLocal(addr basics.Address, appIdx basics.AppIndex, key string, accountIdx uint64) (value basics.TealValue, exists bool, err error) - SetLocal(addr basics.Address, key string, value basics.TealValue, accountIdx uint64) error - DelLocal(addr basics.Address, key string, accountIdx uint64) error + SetLocal(addr basics.Address, appIdx basics.AppIndex, key string, value basics.TealValue, accountIdx uint64) error + DelLocal(addr basics.Address, appIdx basics.AppIndex, key string, accountIdx uint64) error GetGlobal(appIdx basics.AppIndex, key string) (value basics.TealValue, exists bool, err error) - SetGlobal(key string, value basics.TealValue) error - DelGlobal(key string) error - - GetDelta(txn *transactions.Transaction) (evalDelta transactions.EvalDelta, err error) - - Perform(txn *transactions.Transaction, spec transactions.SpecialAddresses) (transactions.ApplyData, error) -} - -// EvalSideEffects contains data returned from evaluation -type EvalSideEffects struct { - scratchSpace scratchSpace -} - -// MakePastSideEffects allocates and initializes a slice of EvalSideEffects of length `size` -func MakePastSideEffects(size int) (pastSideEffects []EvalSideEffects) { - pastSideEffects = make([]EvalSideEffects, size) - for j := range pastSideEffects { - pastSideEffects[j] = EvalSideEffects{} - } - return -} + SetGlobal(appIdx basics.AppIndex, key string, value basics.TealValue) error + DelGlobal(appIdx basics.AppIndex, key string) error -// getScratchValue loads and clones a stackValue -// The value is cloned so the original bytes are protected from changes -func (se *EvalSideEffects) getScratchValue(scratchPos uint8) stackValue { - return se.scratchSpace[scratchPos].clone() + Perform(gi int, ep *EvalParams) error + Counter() uint64 } -// setScratchSpace stores the scratch space -func (se *EvalSideEffects) setScratchSpace(scratch scratchSpace) { - se.scratchSpace = scratch +// resources contains a list of apps and assets. It's used to track the apps and +// assets created by a txgroup, for "free" access. +type resources struct { + asas []basics.AssetIndex + apps []basics.AppIndex } // EvalParams contains data that comes into condition evaluation. type EvalParams struct { - // the transaction being evaluated - Txn *transactions.SignedTxn - Proto *config.ConsensusParams - Trace io.Writer - - TxnGroup []transactions.SignedTxn + Trace *strings.Builder - // GroupIndex should point to Txn within TxnGroup - GroupIndex uint64 + TxnGroup []transactions.SignedTxnWithAD - PastSideEffects []EvalSideEffects + pastScratch []*scratchSpace - Logger logging.Logger + logger logging.Logger Ledger LedgerForLogic @@ -263,19 +258,139 @@ type EvalParams struct { // MinTealVersion is nil, we will compute it ourselves MinTealVersion *uint64 - // Amount "overpaid" by the top-level transactions of the - // group. Often 0. When positive, it is spent by application - // actions. Shared value across a group's txns, so that it - // can be updated. nil is interpretted as 0. + // Amount "overpaid" by the transactions of the group. Often 0. When + // positive, it can be spent by inner transactions. Shared across a group's + // txns, so that it can be updated (including upward, by overpaying inner + // transactions). nil is treated as 0 (used before fee pooling is enabled). FeeCredit *uint64 Specials *transactions.SpecialAddresses - // determines eval mode: runModeSignature or runModeApplication - runModeFlags runMode + // Total pool of app call budget in a group transaction (nil before budget pooling enabled) + PooledApplicationBudget *int + + // Total allowable inner txns in a group transaction (nil before inner pooling enabled) + pooledAllowedInners *int + + // created contains resources that may be used for "created" - they need not be in + // a foreign array. They remain empty until createdResourcesVersion. + created *resources + + // Caching these here means the hashes can be shared across the TxnGroup + // (and inners, because the cache is shared with the inner EvalParams) + appAddrCache map[basics.AppIndex]basics.Address + + // Cache the txid hashing, but do *not* share this into inner EvalParams, as + // the key is just the index in the txgroup. + txidCache map[int]transactions.Txid + + // The calling context, if this is an inner app call + caller *EvalContext +} + +func copyWithClearAD(txgroup []transactions.SignedTxnWithAD) []transactions.SignedTxnWithAD { + copy := make([]transactions.SignedTxnWithAD, len(txgroup)) + for i := range txgroup { + copy[i].SignedTxn = txgroup[i].SignedTxn + // leave copy[i].ApplyData clear + } + return copy +} + +// NewEvalParams creates an EvalParams to use while evaluating a top-level txgroup +func NewEvalParams(txgroup []transactions.SignedTxnWithAD, proto *config.ConsensusParams, specials *transactions.SpecialAddresses) *EvalParams { + apps := 0 + for _, tx := range txgroup { + if tx.Txn.Type == protocol.ApplicationCallTx { + apps++ + } + } + + minTealVersion := ComputeMinTealVersion(txgroup, false) + + var pooledApplicationBudget *int + var pooledAllowedInners *int + + credit := feeCredit(txgroup, proto.MinTxnFee) + + if proto.EnableAppCostPooling && apps > 0 { + pooledApplicationBudget = new(int) + *pooledApplicationBudget = apps * proto.MaxAppProgramCost + } + + if proto.EnableInnerTransactionPooling && apps > 0 { + pooledAllowedInners = new(int) + *pooledAllowedInners = proto.MaxTxGroupSize * proto.MaxInnerTransactions + } + + return &EvalParams{ + TxnGroup: copyWithClearAD(txgroup), + Proto: proto, + Specials: specials, + pastScratch: make([]*scratchSpace, len(txgroup)), + MinTealVersion: &minTealVersion, + FeeCredit: &credit, + PooledApplicationBudget: pooledApplicationBudget, + pooledAllowedInners: pooledAllowedInners, + created: &resources{}, + appAddrCache: make(map[basics.AppIndex]basics.Address), + } +} + +// feeCredit returns the extra fee supplied in this top-level txgroup compared +// to required minfee. It can make assumptions about overflow because the group +// is known OK according to TxnGroupBatchVerify. (In essence the group is +// "WellFormed") +func feeCredit(txgroup []transactions.SignedTxnWithAD, minFee uint64) uint64 { + minFeeCount := uint64(0) + feesPaid := uint64(0) + for _, stxn := range txgroup { + if stxn.Txn.Type != protocol.CompactCertTx { + minFeeCount++ + } + feesPaid = basics.AddSaturate(feesPaid, stxn.Txn.Fee.Raw) + } + // Overflow is impossible, because TxnGroupBatchVerify checked. + feeNeeded := minFee * minFeeCount + + return feesPaid - feeNeeded +} + +// NewInnerEvalParams creates an EvalParams to be used while evaluating an inner group txgroup +func NewInnerEvalParams(txg []transactions.SignedTxnWithAD, caller *EvalContext) *EvalParams { + minTealVersion := ComputeMinTealVersion(txg, true) + // Can't happen currently, since innerAppsEnabledVersion > than any minimum + // imposed otherwise. But is correct to check, in case of future restriction. + if minTealVersion < *caller.MinTealVersion { + minTealVersion = *caller.MinTealVersion + } + + // Unlike NewEvalParams, do not add fee credit here. opTxSubmit has already done so. + + if caller.Proto.EnableAppCostPooling { + for _, tx := range txg { + if tx.Txn.Type == protocol.ApplicationCallTx { + *caller.PooledApplicationBudget += caller.Proto.MaxAppProgramCost + } + } + } - // Total pool of app call budget in a group transaction - PooledApplicationBudget *uint64 + ep := &EvalParams{ + Proto: caller.Proto, + Trace: caller.Trace, + TxnGroup: txg, + pastScratch: make([]*scratchSpace, len(txg)), + MinTealVersion: &minTealVersion, + FeeCredit: caller.FeeCredit, + Specials: caller.Specials, + PooledApplicationBudget: caller.PooledApplicationBudget, + pooledAllowedInners: caller.pooledAllowedInners, + Ledger: caller.Ledger, + created: caller.created, + appAddrCache: caller.appAddrCache, + caller: caller, + } + return ep } type opEvalFunc func(cx *EvalContext) @@ -311,35 +426,55 @@ func (r runMode) String() string { return "Unknown" } -func (ep EvalParams) budget() int { - if ep.runModeFlags == runModeSignature { - return int(ep.Proto.LogicSigMaxCost) - } - if ep.Proto.EnableAppCostPooling && ep.PooledApplicationBudget != nil { - return int(*ep.PooledApplicationBudget) +func (ep EvalParams) log() logging.Logger { + if ep.logger != nil { + return ep.logger } - return ep.Proto.MaxAppProgramCost + return logging.Base() } -func (ep EvalParams) log() logging.Logger { - if ep.Logger != nil { - return ep.Logger +// RecordAD notes ApplyData information that was derived outside of the logic +// package. For example, after a acfg transaction is processed, the AD created +// by the acfg is added to the EvalParams this way. +func (ep *EvalParams) RecordAD(gi int, ad transactions.ApplyData) { + ep.TxnGroup[gi].ApplyData = ad + if aid := ad.ConfigAsset; aid != 0 { + ep.created.asas = append(ep.created.asas, aid) + } + if aid := ad.ApplicationID; aid != 0 { + ep.created.apps = append(ep.created.apps, aid) } - return logging.Base() } -type scratchSpace = [256]stackValue +type scratchSpace [256]stackValue -// EvalContext is the execution context of AVM bytecode. It contains -// the full state of the running program, and tracks some of the -// things that the program has been done, like log message and inner -// transactions. +// EvalContext is the execution context of AVM bytecode. It contains the full +// state of the running program, and tracks some of the things that the program +// has done, like log messages and inner transactions. type EvalContext struct { - EvalParams + *EvalParams + + // determines eval mode: runModeSignature or runModeApplication + runModeFlags runMode + + // the index of the transaction being evaluated + GroupIndex int + // the transaction being evaluated (initialized from GroupIndex + ep.TxnGroup) + Txn *transactions.SignedTxnWithAD + + // Txn.EvalDelta maintains a summary of changes as we go. We used to + // compute this from the ledger after a full eval. But now apps can call + // apps. When they do, all of the changes accumulate into the parent's + // ledger, but Txn.EvalDelta should only have the changes from *this* + // call. (The changes caused by children are deeper inside - in the + // EvalDeltas of the InnerTxns inside this EvalDelta) Nice bonus - by + // keeping the running changes, the debugger can be changed to display them + // as the app runs. stack []stackValue callstack []int + appID basics.AppIndex program []byte pc int nextpc int @@ -349,13 +484,9 @@ type EvalContext struct { version uint64 scratch scratchSpace - subtxns []transactions.SignedTxn // place to build for itxn_submit - // Previous transactions Performed() and their effects - InnerTxns []transactions.SignedTxnWithAD - - cost int // cost incurred so far - Logs []string - logSize int // total log size so far + subtxns []transactions.SignedTxnWithAD // place to build for itxn_submit + cost int // cost incurred so far + logSize int // total log size so far // Set of PC values that branches we've seen so far might // go. So, if checkStep() skips one, that branch is trying to @@ -368,8 +499,6 @@ type EvalContext struct { instructionStarts map[int]bool programHashCached crypto.Digest - txidCache map[uint64]transactions.Txid - appAddrCache map[basics.AppIndex]basics.Address // Stores state & disassembly for the optional debugger debugState DebugState @@ -378,20 +507,22 @@ type EvalContext struct { // StackType describes the type of a value on the operand stack type StackType byte -// StackTypes is an alias for a list of StackType with syntactic sugar -type StackTypes []StackType +const ( + // StackNone in an OpSpec shows that the op pops or yields nothing + StackNone StackType = iota -// StackNone in an OpSpec shows that the op pops or yields nothing -const StackNone StackType = 0 + // StackAny in an OpSpec shows that the op pops or yield any type + StackAny -// StackAny in an OpSpec shows that the op pops or yield any type -const StackAny StackType = 1 + // StackUint64 in an OpSpec shows that the op pops or yields a uint64 + StackUint64 -// StackUint64 in an OpSpec shows that the op pops or yields a uint64 -const StackUint64 StackType = 2 + // StackBytes in an OpSpec shows that the op pops or yields a []byte + StackBytes +) -// StackBytes in an OpSpec shows that the op pops or yields a []byte -const StackBytes StackType = 3 +// StackTypes is an alias for a list of StackType with syntactic sugar +type StackTypes []StackType func (st StackType) String() string { switch st { @@ -407,6 +538,15 @@ func (st StackType) String() string { return "internal error, unknown type" } +// Typed tells whether the StackType is a specific concrete type. +func (st StackType) Typed() bool { + switch st { + case StackUint64, StackBytes: + return true + } + return false +} + func (sts StackTypes) plus(other StackTypes) StackTypes { return append(sts, other...) } @@ -424,41 +564,76 @@ func (pe PanicError) Error() string { var errLogicSigNotSupported = errors.New("LogicSig not supported") var errTooManyArgs = errors.New("LogicSig has too many arguments") -// EvalStatefulCx executes stateful TEAL program -func EvalStatefulCx(program []byte, params EvalParams) (bool, *EvalContext, error) { - var cx EvalContext - cx.EvalParams = params - cx.runModeFlags = runModeApplication - pass, err := eval(program, &cx) +// ClearStateBudgetError allows evaluation to signal that the caller should +// reject the transaction. Normally, an error in evaluation would not cause a +// ClearState txn to fail. However, callers fail a txn for ClearStateBudgetError +// because the transaction has not provided enough budget to let ClearState do +// its job. +type ClearStateBudgetError struct { + offered int +} + +func (e ClearStateBudgetError) Error() string { + return fmt.Sprintf("Attempted ClearState execution with low OpcodeBudget %d", e.offered) +} + +// EvalContract executes stateful TEAL program as the gi'th transaction in params +func EvalContract(program []byte, gi int, aid basics.AppIndex, params *EvalParams) (bool, *EvalContext, error) { + if params.Ledger == nil { + return false, nil, errors.New("no ledger in contract eval") + } + if aid == 0 { + return false, nil, errors.New("0 appId in contract eval") + } + cx := EvalContext{ + EvalParams: params, + runModeFlags: runModeApplication, + GroupIndex: gi, + Txn: ¶ms.TxnGroup[gi], + appID: aid, + } - // The following two updates show a need for something like a - // GroupEvalContext, as we are currently tucking things into the - // EvalParams so that they are available to later calls. + if cx.Proto.IsolateClearState && cx.Txn.Txn.OnCompletion == transactions.ClearStateOC { + if cx.PooledApplicationBudget != nil && *cx.PooledApplicationBudget < cx.Proto.MaxAppProgramCost { + return false, nil, ClearStateBudgetError{*cx.PooledApplicationBudget} + } + } - // update pooled budget - if cx.Proto.EnableAppCostPooling && cx.PooledApplicationBudget != nil { - // if eval passes, then budget is always greater than cost, so should not have underflow - *cx.PooledApplicationBudget = basics.SubSaturate(*cx.PooledApplicationBudget, uint64(cx.cost)) + if cx.Trace != nil && cx.caller != nil { + fmt.Fprintf(cx.Trace, "--- enter %d %s %v\n", aid, cx.Txn.Txn.OnCompletion, cx.Txn.Txn.ApplicationArgs) + } + pass, err := eval(program, &cx) + if cx.Trace != nil && cx.caller != nil { + fmt.Fprintf(cx.Trace, "--- exit %d accept=%t\n", aid, pass) } - // update side effects - cx.PastSideEffects[cx.GroupIndex].setScratchSpace(cx.scratch) + + // update side effects. It is tempting, and maybe even a good idea, to store + // the pointer to cx.scratch instead. Since we don't modify them again, + // it's probably safe. However it may have poor GC characteristics (because + // we'd be storing a pointer into a much larger structure, the cx), and + // copying seems nice and clean. + cx.pastScratch[cx.GroupIndex] = &scratchSpace{} + *cx.pastScratch[cx.GroupIndex] = cx.scratch return pass, &cx, err } -// EvalStateful is a lighter weight interface that doesn't return the EvalContext -func EvalStateful(program []byte, params EvalParams) (bool, error) { - pass, _, err := EvalStatefulCx(program, params) +// EvalApp is a lighter weight interface that doesn't return the EvalContext +func EvalApp(program []byte, gi int, aid basics.AppIndex, params *EvalParams) (bool, error) { + pass, _, err := EvalContract(program, gi, aid, params) return pass, err } -// Eval checks to see if a transaction passes logic +// EvalSignature evaluates the logicsig of the ith transaction in params. // A program passes successfully if it finishes with one int element on the stack that is non-zero. -func Eval(program []byte, params EvalParams) (pass bool, err error) { - var cx EvalContext - cx.EvalParams = params - cx.runModeFlags = runModeSignature - return eval(program, &cx) +func EvalSignature(gi int, params *EvalParams) (pass bool, err error) { + cx := EvalContext{ + EvalParams: params, + runModeFlags: runModeSignature, + GroupIndex: gi, + Txn: ¶ms.TxnGroup[gi], + } + return eval(cx.Txn.Lsig.Logic, &cx) } // eval implementation @@ -470,10 +645,8 @@ func eval(program []byte, cx *EvalContext) (pass bool, err error) { stlen := runtime.Stack(buf, false) pass = false errstr := string(buf[:stlen]) - if cx.EvalParams.Trace != nil { - if sb, ok := cx.EvalParams.Trace.(*strings.Builder); ok { - errstr += sb.String() - } + if cx.Trace != nil { + errstr += cx.Trace.String() } err = PanicError{x, errstr} cx.EvalParams.log().Errorf("recovered panic in Eval: %w", err) @@ -494,44 +667,23 @@ func eval(program []byte, cx *EvalContext) (pass bool, err error) { err = errLogicSigNotSupported return } - if cx.EvalParams.Txn.Lsig.Args != nil && len(cx.EvalParams.Txn.Lsig.Args) > transactions.EvalMaxArgs { + if cx.Txn.Lsig.Args != nil && len(cx.Txn.Lsig.Args) > transactions.EvalMaxArgs { err = errTooManyArgs return } - if len(program) == 0 { - cx.err = errors.New("invalid program (empty)") - return false, cx.err - } - version, vlen := binary.Uvarint(program) - if vlen <= 0 { - cx.err = errors.New("invalid version") - return false, cx.err - } - if version > EvalMaxVersion { - cx.err = fmt.Errorf("program version %d greater than max supported version %d", version, EvalMaxVersion) - return false, cx.err - } - if version > cx.EvalParams.Proto.LogicSigVersion { - cx.err = fmt.Errorf("program version %d greater than protocol supported version %d", version, cx.EvalParams.Proto.LogicSigVersion) - return false, cx.err - } - - var minVersion uint64 - if cx.EvalParams.MinTealVersion == nil { - minVersion = ComputeMinTealVersion(cx.EvalParams.TxnGroup) - } else { - minVersion = *cx.EvalParams.MinTealVersion - } - if version < minVersion { - cx.err = fmt.Errorf("program version must be >= %d for this transaction group, but have version %d", minVersion, version) - return false, cx.err + version, vlen, err := versionCheck(program, cx.EvalParams) + if err != nil { + cx.err = err + return false, err } cx.version = version cx.pc = vlen cx.stack = make([]stackValue, 0, 10) cx.program = program + cx.Txn.EvalDelta.GlobalDelta = basics.StateDelta{} + cx.Txn.EvalDelta.LocalDeltas = make(map[uint64]basics.StateDelta) if cx.Debugger != nil { cx.debugState = makeDebugState(cx) @@ -572,34 +724,29 @@ func eval(program []byte, cx *EvalContext) (pass bool, err error) { return cx.stack[0].Uint != 0, nil } -// CheckStateful should be faster than EvalStateful. It can perform +// CheckContract should be faster than EvalContract. It can perform // static checks and reject programs that are invalid. Prior to v4, // these static checks include a cost estimate that must be low enough // (controlled by params.Proto). -func CheckStateful(program []byte, params EvalParams) error { - params.runModeFlags = runModeApplication - return check(program, params) +func CheckContract(program []byte, params *EvalParams) error { + return check(program, params, runModeApplication) } -// Check should be faster than Eval. It can perform static checks and -// reject programs that are invalid. Prior to v4, these static checks -// include a cost estimate that must be low enough (controlled by -// params.Proto). -func Check(program []byte, params EvalParams) error { - params.runModeFlags = runModeSignature - return check(program, params) +// CheckSignature should be faster than EvalSignature. It can perform static +// checks and reject programs that are invalid. Prior to v4, these static checks +// include a cost estimate that must be low enough (controlled by params.Proto). +func CheckSignature(gi int, params *EvalParams) error { + return check(params.TxnGroup[gi].Lsig.Logic, params, runModeSignature) } -func check(program []byte, params EvalParams) (err error) { +func check(program []byte, params *EvalParams, mode runMode) (err error) { defer func() { if x := recover(); x != nil { buf := make([]byte, 16*1024) stlen := runtime.Stack(buf, false) errstr := string(buf[:stlen]) if params.Trace != nil { - if sb, ok := params.Trace.(*strings.Builder); ok { - errstr += sb.String() - } + errstr += params.Trace.String() } err = PanicError{x, errstr} params.log().Errorf("recovered panic in Check: %s", err) @@ -608,36 +755,22 @@ func check(program []byte, params EvalParams) (err error) { if (params.Proto == nil) || (params.Proto.LogicSigVersion == 0) { return errLogicSigNotSupported } - version, vlen := binary.Uvarint(program) - if vlen <= 0 { - return errors.New("invalid version") - } - if version > EvalMaxVersion { - return fmt.Errorf("program version %d greater than max supported version %d", version, EvalMaxVersion) - } - if version > params.Proto.LogicSigVersion { - return fmt.Errorf("program version %d greater than protocol supported version %d", version, params.Proto.LogicSigVersion) - } - var minVersion uint64 - if params.MinTealVersion == nil { - minVersion = ComputeMinTealVersion(params.TxnGroup) - } else { - minVersion = *params.MinTealVersion - } - if version < minVersion { - return fmt.Errorf("program version must be >= %d for this transaction group, but have version %d", minVersion, version) + version, vlen, err := versionCheck(program, params) + if err != nil { + return err } var cx EvalContext cx.version = version cx.pc = vlen cx.EvalParams = params + cx.runModeFlags = mode cx.program = program cx.branchTargets = make(map[int]bool) cx.instructionStarts = make(map[int]bool) - maxCost := params.budget() + maxCost := cx.remainingBudget() if version >= backBranchEnabledVersion { maxCost = math.MaxInt32 } @@ -663,6 +796,28 @@ func check(program []byte, params EvalParams) (err error) { return nil } +func versionCheck(program []byte, params *EvalParams) (uint64, int, error) { + version, vlen, err := transactions.ProgramVersion(program) + if err != nil { + return 0, 0, err + } + if version > EvalMaxVersion { + return 0, 0, fmt.Errorf("program version %d greater than max supported version %d", version, EvalMaxVersion) + } + if version > params.Proto.LogicSigVersion { + return 0, 0, fmt.Errorf("program version %d greater than protocol supported version %d", version, params.Proto.LogicSigVersion) + } + + if params.MinTealVersion == nil { + minVersion := ComputeMinTealVersion(params.TxnGroup, params.caller != nil) + params.MinTealVersion = &minVersion + } + if version < *params.MinTealVersion { + return 0, 0, fmt.Errorf("program version must be >= %d for this transaction group, but have version %d", *params.MinTealVersion, version) + } + return version, vlen, nil +} + func opCompat(expected, got StackType) bool { if expected == StackAny { return true @@ -684,9 +839,40 @@ func boolToUint(x bool) uint64 { return 0 } -// MaxStackDepth should move to consensus params +// MaxStackDepth should not change unless gated by a teal version change / consensus upgrade. const MaxStackDepth = 1000 +func (cx *EvalContext) remainingBudget() int { + if cx.runModeFlags == runModeSignature { + return int(cx.Proto.LogicSigMaxCost) - cx.cost + } + + // restrict clear state programs from using more than standard unpooled budget + // cx.Txn is not set during check() + if cx.Proto.IsolateClearState && cx.Txn != nil && cx.Txn.Txn.OnCompletion == transactions.ClearStateOC { + // Need not confirm that *cx.PooledApplicationBudget is also >0, as + // ClearState programs are only run if *cx.PooledApplicationBudget > + // MaxAppProgramCost at the start. + return cx.Proto.MaxAppProgramCost - cx.cost + } + + if cx.PooledApplicationBudget != nil { + return *cx.PooledApplicationBudget + } + return cx.Proto.MaxAppProgramCost - cx.cost +} + +func (cx *EvalContext) remainingInners() int { + if cx.Proto.EnableInnerTransactionPooling && cx.pooledAllowedInners != nil { + return *cx.pooledAllowedInners + } + // Before EnableInnerTransactionPooling, MaxInnerTransactions was the amount + // allowed in a single txn. No consensus version should enable inner app + // calls without turning on EnableInnerTransactionPoolin, else inner calls + // could keep branching with "width" MaxInnerTransactions + return cx.Proto.MaxInnerTransactions - len(cx.Txn.EvalDelta.InnerTxns) +} + func (cx *EvalContext) step() { opcode := cx.program[cx.pc] spec := &opsByOpcode[cx.version][opcode] @@ -720,9 +906,20 @@ func (cx *EvalContext) step() { return } cx.cost += deets.Cost - if cx.cost > cx.budget() { - cx.err = fmt.Errorf("pc=%3d dynamic cost budget exceeded, executing %s: remaining budget is %d but program cost was %d", - cx.pc, spec.Name, cx.budget(), cx.cost) + if cx.PooledApplicationBudget != nil { + *cx.PooledApplicationBudget -= deets.Cost + } + + if cx.remainingBudget() < 0 { + // We're not going to execute the instruction, so give the cost back. + // This only matters if this is an inner ClearState - the caller should + // not be over debited. (Normally, failure causes total txtree failure.) + cx.cost -= deets.Cost + if cx.PooledApplicationBudget != nil { + *cx.PooledApplicationBudget += deets.Cost + } + cx.err = fmt.Errorf("pc=%3d dynamic cost budget exceeded, executing %s: local program cost was %d", + cx.pc, spec.Name, cx.cost) return } @@ -1030,15 +1227,33 @@ func opMulw(cx *EvalContext) { cx.stack[last].Uint = low } +func opDivw(cx *EvalContext) { + last := len(cx.stack) - 1 + prev := last - 1 + pprev := last - 2 + hi := cx.stack[pprev].Uint + lo := cx.stack[prev].Uint + y := cx.stack[last].Uint + // These two clauses catch what will cause panics in bits.Div64, so we get + // nicer errors. + if y == 0 { + cx.err = errors.New("divw 0") + return + } + if y <= hi { + cx.err = fmt.Errorf("divw overflow: %d <= %d", y, hi) + return + } + quo, _ := bits.Div64(hi, lo, y) + cx.stack = cx.stack[:prev] // pop 2 + cx.stack[pprev].Uint = quo +} + func opLt(cx *EvalContext) { last := len(cx.stack) - 1 prev := last - 1 cond := cx.stack[prev].Uint < cx.stack[last].Uint - if cond { - cx.stack[prev].Uint = 1 - } else { - cx.stack[prev].Uint = 0 - } + cx.stack[prev].Uint = boolToUint(cond) cx.stack = cx.stack[:last] } @@ -1061,11 +1276,7 @@ func opAnd(cx *EvalContext) { last := len(cx.stack) - 1 prev := last - 1 cond := (cx.stack[prev].Uint != 0) && (cx.stack[last].Uint != 0) - if cond { - cx.stack[prev].Uint = 1 - } else { - cx.stack[prev].Uint = 0 - } + cx.stack[prev].Uint = boolToUint(cond) cx.stack = cx.stack[:last] } @@ -1073,11 +1284,7 @@ func opOr(cx *EvalContext) { last := len(cx.stack) - 1 prev := last - 1 cond := (cx.stack[prev].Uint != 0) || (cx.stack[last].Uint != 0) - if cond { - cx.stack[prev].Uint = 1 - } else { - cx.stack[prev].Uint = 0 - } + cx.stack[prev].Uint = boolToUint(cond) cx.stack = cx.stack[:last] } @@ -1096,11 +1303,7 @@ func opEq(cx *EvalContext) { } else { cond = cx.stack[prev].Uint == cx.stack[last].Uint } - if cond { - cx.stack[prev].Uint = 1 - } else { - cx.stack[prev].Uint = 0 - } + cx.stack[prev].Uint = boolToUint(cond) cx.stack[prev].Bytes = nil cx.stack = cx.stack[:last] } @@ -1113,11 +1316,7 @@ func opNeq(cx *EvalContext) { func opNot(cx *EvalContext) { last := len(cx.stack) - 1 cond := cx.stack[last].Uint == 0 - if cond { - cx.stack[last].Uint = 1 - } else { - cx.stack[last].Uint = 0 - } + cx.stack[last].Uint = boolToUint(cond) } func opLen(cx *EvalContext) { @@ -1384,6 +1583,19 @@ func opBytesMul(cx *EvalContext) { opBytesBinOp(cx, result, result.Mul) } +func opBytesSqrt(cx *EvalContext) { + last := len(cx.stack) - 1 + + if len(cx.stack[last].Bytes) > MaxByteMathSize { + cx.err = errors.New("math attempted on large byte-array") + return + } + + val := new(big.Int).SetBytes(cx.stack[last].Bytes) + val.Sqrt(val) + cx.stack[last].Bytes = val.Bytes() +} + func opBytesLt(cx *EvalContext) { last := len(cx.stack) - 1 prev := last - 1 @@ -1396,11 +1608,7 @@ func opBytesLt(cx *EvalContext) { rhs := new(big.Int).SetBytes(cx.stack[last].Bytes) lhs := new(big.Int).SetBytes(cx.stack[prev].Bytes) cx.stack[prev].Bytes = nil - if lhs.Cmp(rhs) < 0 { - cx.stack[prev].Uint = 1 - } else { - cx.stack[prev].Uint = 0 - } + cx.stack[prev].Uint = boolToUint(lhs.Cmp(rhs) < 0) cx.stack = cx.stack[:last] } @@ -1431,11 +1639,7 @@ func opBytesEq(cx *EvalContext) { rhs := new(big.Int).SetBytes(cx.stack[last].Bytes) lhs := new(big.Int).SetBytes(cx.stack[prev].Bytes) cx.stack[prev].Bytes = nil - if lhs.Cmp(rhs) == 0 { - cx.stack[prev].Uint = 1 - } else { - cx.stack[prev].Uint = 0 - } + cx.stack[prev].Uint = boolToUint(lhs.Cmp(rhs) == 0) cx.stack = cx.stack[:last] } @@ -1753,7 +1957,7 @@ func opDup2(cx *EvalContext) { } func opDig(cx *EvalContext) { - depth := int(uint(cx.program[cx.pc+1])) + depth := int(cx.program[cx.pc+1]) idx := len(cx.stack) - 1 - depth // Need to check stack size explicitly here because checkArgs() doesn't understand dig // so we can't expect our stack to be prechecked. @@ -1879,66 +2083,60 @@ func (cx *EvalContext) appParamsToValue(params *basics.AppParams, fs appParamsFi } // TxnFieldToTealValue is a thin wrapper for txnFieldToStack for external use -func TxnFieldToTealValue(txn *transactions.Transaction, groupIndex int, field TxnField, arrayFieldIdx uint64) (basics.TealValue, error) { +func TxnFieldToTealValue(txn *transactions.Transaction, groupIndex int, field TxnField, arrayFieldIdx uint64, inner bool) (basics.TealValue, error) { if groupIndex < 0 { return basics.TealValue{}, fmt.Errorf("negative groupIndex %d", groupIndex) } - cx := EvalContext{EvalParams: EvalParams{GroupIndex: uint64(groupIndex)}} + var cx EvalContext + stxnad := &transactions.SignedTxnWithAD{SignedTxn: transactions.SignedTxn{Txn: *txn}} fs := txnFieldSpecByField[field] - sv, err := cx.txnFieldToStack(txn, fs, arrayFieldIdx, uint64(groupIndex)) + sv, err := cx.txnFieldToStack(stxnad, &fs, arrayFieldIdx, groupIndex, inner) return sv.toTealValue(), err } -func (cx *EvalContext) getTxID(txn *transactions.Transaction, groupIndex uint64) transactions.Txid { +func (cx *EvalContext) getTxID(txn *transactions.Transaction, groupIndex int) transactions.Txid { + if cx.EvalParams == nil { // Special case, called through TxnFieldToTealValue. No EvalParams, no caching. + return txn.ID() + } + // Initialize txidCache if necessary - if cx.txidCache == nil { - cx.txidCache = make(map[uint64]transactions.Txid, len(cx.TxnGroup)) + if cx.EvalParams.txidCache == nil { + cx.EvalParams.txidCache = make(map[int]transactions.Txid, len(cx.TxnGroup)) } // Hashes are expensive, so we cache computed TxIDs - txid, ok := cx.txidCache[groupIndex] + txid, ok := cx.EvalParams.txidCache[groupIndex] if !ok { - txid = txn.ID() - cx.txidCache[groupIndex] = txid + if cx.caller != nil { + innerOffset := len(cx.caller.Txn.EvalDelta.InnerTxns) + txid = txn.InnerID(cx.caller.Txn.ID(), innerOffset+groupIndex) + } else { + txid = txn.ID() + } + cx.EvalParams.txidCache[groupIndex] = txid } return txid } -func (cx *EvalContext) itxnFieldToStack(itxn *transactions.SignedTxnWithAD, fs txnFieldSpec, arrayFieldIdx uint64) (sv stackValue, err error) { +func (cx *EvalContext) txnFieldToStack(stxn *transactions.SignedTxnWithAD, fs *txnFieldSpec, arrayFieldIdx uint64, groupIndex int, inner bool) (sv stackValue, err error) { if fs.effects { - switch fs.field { - case Logs: - if arrayFieldIdx >= uint64(len(itxn.EvalDelta.Logs)) { - err = fmt.Errorf("invalid Logs index %d", arrayFieldIdx) - return - } - sv.Bytes = nilToEmpty([]byte(itxn.EvalDelta.Logs[arrayFieldIdx])) - case NumLogs: - sv.Uint = uint64(len(itxn.EvalDelta.Logs)) - case CreatedAssetID: - sv.Uint = uint64(itxn.ApplyData.ConfigAsset) - case CreatedApplicationID: - sv.Uint = uint64(itxn.ApplyData.ApplicationID) - default: - err = fmt.Errorf("invalid txn field %d", fs.field) + if cx.runModeFlags == runModeSignature { + return sv, fmt.Errorf("txn[%s] not allowed in current mode", fs.field) + } + if cx.version < txnEffectsVersion && !inner { + return sv, errors.New("Unable to obtain effects from top-level transactions") } - return - } - - if fs.field == GroupIndex || fs.field == TxID { - err = fmt.Errorf("illegal field for inner transaction %s", fs.field) - } else { - sv, err = cx.txnFieldToStack(&itxn.Txn, fs, arrayFieldIdx, 0) } - return -} - -func (cx *EvalContext) txnFieldToStack(txn *transactions.Transaction, fs txnFieldSpec, arrayFieldIdx uint64, groupIndex uint64) (sv stackValue, err error) { - if fs.effects { - return sv, errors.New("Unable to obtain effects from top-level transactions") + if inner { + // Before we had inner apps, we did not allow these, since we had no inner groups. + if cx.version < innerAppsEnabledVersion && (fs.field == GroupIndex || fs.field == TxID) { + err = fmt.Errorf("illegal field for inner transaction %s", fs.field) + return + } } err = nil + txn := &stxn.SignedTxn.Txn switch fs.field { case Sender: sv.Bytes = txn.Sender[:] @@ -1960,6 +2158,8 @@ func (cx *EvalContext) txnFieldToStack(txn *transactions.Transaction, fs txnFiel sv.Bytes = txn.VotePK[:] case SelectionPK: sv.Bytes = txn.SelectionPK[:] + case StateProofPK: + sv.Bytes = txn.StateProofPK[:] case VoteFirst: sv.Uint = uint64(txn.VoteFirst) case VoteLast: @@ -1983,7 +2183,7 @@ func (cx *EvalContext) txnFieldToStack(txn *transactions.Transaction, fs txnFiel case AssetCloseTo: sv.Bytes = txn.AssetCloseTo[:] case GroupIndex: - sv.Uint = groupIndex + sv.Uint = uint64(groupIndex) case TxID: txid := cx.getTxID(txn, groupIndex) sv.Bytes = txid[:] @@ -2088,230 +2288,215 @@ func (cx *EvalContext) txnFieldToStack(txn *transactions.Transaction, fs txnFiel sv.Uint = boolToUint(txn.AssetFrozen) case ExtraProgramPages: sv.Uint = uint64(txn.ExtraProgramPages) + + case Logs: + if arrayFieldIdx >= uint64(len(stxn.EvalDelta.Logs)) { + err = fmt.Errorf("invalid Logs index %d", arrayFieldIdx) + return + } + sv.Bytes = nilToEmpty([]byte(stxn.EvalDelta.Logs[arrayFieldIdx])) + case NumLogs: + sv.Uint = uint64(len(stxn.EvalDelta.Logs)) + case LastLog: + if logs := len(stxn.EvalDelta.Logs); logs > 0 { + sv.Bytes = nilToEmpty([]byte(stxn.EvalDelta.Logs[logs-1])) + } else { + sv.Bytes = nilToEmpty(nil) + } + case CreatedAssetID: + sv.Uint = uint64(stxn.ApplyData.ConfigAsset) + case CreatedApplicationID: + sv.Uint = uint64(stxn.ApplyData.ApplicationID) + default: - err = fmt.Errorf("invalid txn field %d", fs.field) + err = fmt.Errorf("invalid txn field %s", fs.field) return } - txnFieldType := TxnFieldTypes[fs.field] - if !typecheck(txnFieldType, sv.argType()) { - err = fmt.Errorf("%s expected field type is %s but got %s", fs.field.String(), txnFieldType.String(), sv.argType().String()) + if !typecheck(fs.ftype, sv.argType()) { + err = fmt.Errorf("%s expected field type is %s but got %s", fs.field, fs.ftype, sv.argType()) } return } -func opTxn(cx *EvalContext) { - field := TxnField(cx.program[cx.pc+1]) +func (cx *EvalContext) fetchField(field TxnField, expectArray bool) (*txnFieldSpec, error) { fs, ok := txnFieldSpecByField[field] if !ok || fs.version > cx.version { - cx.err = fmt.Errorf("invalid txn field %d", field) - return + return nil, fmt.Errorf("invalid txn field %d", field) } - _, ok = txnaFieldSpecByField[field] - if ok { - cx.err = fmt.Errorf("invalid txn field %d", field) - return + if expectArray != fs.array { + if expectArray { + return nil, fmt.Errorf("unsupported array field %d", field) + } + return nil, fmt.Errorf("invalid txn field %d", field) + } + return &fs, nil +} + +type txnSource int + +const ( + srcGroup txnSource = iota + srcInner + srcInnerGroup +) + +// opTxnImpl implements all of the txn variants. Each form of txn opcode should +// be able to get its work done with one call here, after collecting the args in +// the most straightforward way possible. They ought to do no error checking, so +// that it is all collected here. +func (cx *EvalContext) opTxnImpl(gi uint64, src txnSource, field TxnField, ai uint64, expectArray bool) (sv stackValue, err error) { + fs, err := cx.fetchField(field, expectArray) + if err != nil { + return sv, err + } + + var group []transactions.SignedTxnWithAD + switch src { + case srcGroup: + if fs.effects && gi >= uint64(cx.GroupIndex) { + // Test mode so that error is clearer + if cx.runModeFlags == runModeSignature { + return sv, fmt.Errorf("txn[%s] not allowed in current mode", fs.field) + } + return sv, fmt.Errorf("txn effects can only be read from past txns %d %d", gi, cx.GroupIndex) + } + group = cx.TxnGroup + case srcInner: + group = cx.getLastInner() + case srcInnerGroup: + group = cx.getLastInnerGroup() + } + + // We cast the length up, rather than gi down, in case gi overflows `int`. + if gi >= uint64(len(group)) { + return sv, fmt.Errorf("txn index %d, len(group) is %d", gi, len(group)) + } + tx := &group[gi] + + // int(gi) is safe because gi < len(group). Slices in Go cannot exceed `int` + sv, err = cx.txnFieldToStack(tx, fs, ai, int(gi), src != srcGroup) + if err != nil { + return sv, err } - sv, err := cx.txnFieldToStack(&cx.Txn.Txn, fs, 0, cx.GroupIndex) + + return sv, nil +} + +func opTxn(cx *EvalContext) { + gi := uint64(cx.GroupIndex) + field := TxnField(cx.program[cx.pc+1]) + + sv, err := cx.opTxnImpl(gi, srcGroup, field, 0, false) if err != nil { cx.err = err return } + cx.stack = append(cx.stack, sv) } func opTxna(cx *EvalContext) { + gi := uint64(cx.GroupIndex) field := TxnField(cx.program[cx.pc+1]) - fs, ok := txnFieldSpecByField[field] - if !ok || fs.version > cx.version { - cx.err = fmt.Errorf("invalid txn field %d", field) - return - } - _, ok = txnaFieldSpecByField[field] - if !ok { - cx.err = fmt.Errorf("txna unsupported field %d", field) - return - } - arrayFieldIdx := uint64(cx.program[cx.pc+2]) - sv, err := cx.txnFieldToStack(&cx.Txn.Txn, fs, arrayFieldIdx, cx.GroupIndex) + ai := uint64(cx.program[cx.pc+2]) + + sv, err := cx.opTxnImpl(gi, srcGroup, field, ai, true) if err != nil { cx.err = err return } + cx.stack = append(cx.stack, sv) } func opTxnas(cx *EvalContext) { last := len(cx.stack) - 1 + gi := uint64(cx.GroupIndex) field := TxnField(cx.program[cx.pc+1]) - fs, ok := txnFieldSpecByField[field] - if !ok || fs.version > cx.version { - cx.err = fmt.Errorf("invalid txn field %d", field) - return - } - _, ok = txnaFieldSpecByField[field] - if !ok { - cx.err = fmt.Errorf("txnas unsupported field %d", field) - return - } - arrayFieldIdx := cx.stack[last].Uint - sv, err := cx.txnFieldToStack(&cx.Txn.Txn, fs, arrayFieldIdx, cx.GroupIndex) - if err != nil { - cx.err = err + ai := cx.stack[last].Uint + + sv, err := cx.opTxnImpl(gi, srcGroup, field, ai, true) + if err != nil { + cx.err = err return } + cx.stack[last] = sv } func opGtxn(cx *EvalContext) { - gtxid := cx.program[cx.pc+1] - if int(gtxid) >= len(cx.TxnGroup) { - cx.err = fmt.Errorf("gtxn lookup TxnGroup[%d] but it only has %d", gtxid, len(cx.TxnGroup)) - return - } - tx := &cx.TxnGroup[gtxid].Txn + gi := uint64(cx.program[cx.pc+1]) field := TxnField(cx.program[cx.pc+2]) - fs, ok := txnFieldSpecByField[field] - if !ok || fs.version > cx.version { - cx.err = fmt.Errorf("invalid txn field %d", field) - return - } - _, ok = txnaFieldSpecByField[field] - if ok { - cx.err = fmt.Errorf("invalid txn field %d", field) + + sv, err := cx.opTxnImpl(gi, srcGroup, field, 0, false) + if err != nil { + cx.err = err return } - var sv stackValue - var err error - if field == GroupIndex { - // GroupIndex; asking this when we just specified it is _dumb_, but oh well - sv.Uint = uint64(gtxid) - } else { - sv, err = cx.txnFieldToStack(tx, fs, 0, uint64(gtxid)) - if err != nil { - cx.err = err - return - } - } + cx.stack = append(cx.stack, sv) } func opGtxna(cx *EvalContext) { - gtxid := int(uint(cx.program[cx.pc+1])) - if gtxid >= len(cx.TxnGroup) { - cx.err = fmt.Errorf("gtxna lookup TxnGroup[%d] but it only has %d", gtxid, len(cx.TxnGroup)) - return - } - tx := &cx.TxnGroup[gtxid].Txn + gi := uint64(cx.program[cx.pc+1]) field := TxnField(cx.program[cx.pc+2]) - fs, ok := txnFieldSpecByField[field] - if !ok || fs.version > cx.version { - cx.err = fmt.Errorf("invalid txn field %d", field) - return - } - _, ok = txnaFieldSpecByField[field] - if !ok { - cx.err = fmt.Errorf("gtxna unsupported field %d", field) - return - } - arrayFieldIdx := uint64(cx.program[cx.pc+3]) - sv, err := cx.txnFieldToStack(tx, fs, arrayFieldIdx, uint64(gtxid)) + ai := uint64(cx.program[cx.pc+3]) + + sv, err := cx.opTxnImpl(gi, srcGroup, field, ai, true) if err != nil { cx.err = err return } + cx.stack = append(cx.stack, sv) } func opGtxnas(cx *EvalContext) { last := len(cx.stack) - 1 - gtxid := cx.program[cx.pc+1] - if int(gtxid) >= len(cx.TxnGroup) { - cx.err = fmt.Errorf("gtxnas lookup TxnGroup[%d] but it only has %d", gtxid, len(cx.TxnGroup)) - return - } - tx := &cx.TxnGroup[gtxid].Txn + gi := uint64(cx.program[cx.pc+1]) field := TxnField(cx.program[cx.pc+2]) - fs, ok := txnFieldSpecByField[field] - if !ok || fs.version > cx.version { - cx.err = fmt.Errorf("invalid txn field %d", field) - return - } - _, ok = txnaFieldSpecByField[field] - if !ok { - cx.err = fmt.Errorf("gtxnas unsupported field %d", field) - return - } - arrayFieldIdx := cx.stack[last].Uint - sv, err := cx.txnFieldToStack(tx, fs, arrayFieldIdx, uint64(gtxid)) + ai := cx.stack[last].Uint + + sv, err := cx.opTxnImpl(gi, srcGroup, field, ai, true) if err != nil { cx.err = err return } + cx.stack[last] = sv } func opGtxns(cx *EvalContext) { last := len(cx.stack) - 1 - gtxid := cx.stack[last].Uint - if gtxid >= uint64(len(cx.TxnGroup)) { - cx.err = fmt.Errorf("gtxns lookup TxnGroup[%d] but it only has %d", gtxid, len(cx.TxnGroup)) - return - } - tx := &cx.TxnGroup[gtxid].Txn + + gi := cx.stack[last].Uint field := TxnField(cx.program[cx.pc+1]) - fs, ok := txnFieldSpecByField[field] - if !ok || fs.version > cx.version { - cx.err = fmt.Errorf("invalid txn field %d", field) - return - } - _, ok = txnaFieldSpecByField[field] - if ok { - cx.err = fmt.Errorf("invalid txn field %d", field) + + sv, err := cx.opTxnImpl(gi, srcGroup, field, 0, false) + if err != nil { + cx.err = err return } - var sv stackValue - var err error - if field == GroupIndex { - // GroupIndex; asking this when we just specified it is _dumb_, but oh well - sv.Uint = gtxid - } else { - sv, err = cx.txnFieldToStack(tx, fs, 0, gtxid) - if err != nil { - cx.err = err - return - } - } + cx.stack[last] = sv } func opGtxnsa(cx *EvalContext) { last := len(cx.stack) - 1 - gtxid := cx.stack[last].Uint - if gtxid >= uint64(len(cx.TxnGroup)) { - cx.err = fmt.Errorf("gtxnsa lookup TxnGroup[%d] but it only has %d", gtxid, len(cx.TxnGroup)) - return - } - tx := &cx.TxnGroup[gtxid].Txn + + gi := cx.stack[last].Uint field := TxnField(cx.program[cx.pc+1]) - fs, ok := txnFieldSpecByField[field] - if !ok || fs.version > cx.version { - cx.err = fmt.Errorf("invalid txn field %d", field) - return - } - _, ok = txnaFieldSpecByField[field] - if !ok { - cx.err = fmt.Errorf("gtxnsa unsupported field %d", field) - return - } - arrayFieldIdx := uint64(cx.program[cx.pc+2]) - sv, err := cx.txnFieldToStack(tx, fs, arrayFieldIdx, gtxid) + ai := uint64(cx.program[cx.pc+2]) + + sv, err := cx.opTxnImpl(gi, srcGroup, field, ai, true) if err != nil { cx.err = err return } + cx.stack[last] = sv } @@ -2319,118 +2504,165 @@ func opGtxnsas(cx *EvalContext) { last := len(cx.stack) - 1 prev := last - 1 - gtxid := cx.stack[prev].Uint - if gtxid >= uint64(len(cx.TxnGroup)) { - cx.err = fmt.Errorf("gtxnsas lookup TxnGroup[%d] but it only has %d", gtxid, len(cx.TxnGroup)) - return - } - tx := &cx.TxnGroup[gtxid].Txn + gi := cx.stack[prev].Uint field := TxnField(cx.program[cx.pc+1]) - fs, ok := txnFieldSpecByField[field] - if !ok || fs.version > cx.version { - cx.err = fmt.Errorf("invalid txn field %d", field) - return - } - _, ok = txnaFieldSpecByField[field] - if !ok { - cx.err = fmt.Errorf("gtxnsas unsupported field %d", field) - return - } - arrayFieldIdx := cx.stack[last].Uint - sv, err := cx.txnFieldToStack(tx, fs, arrayFieldIdx, gtxid) + ai := cx.stack[last].Uint + + sv, err := cx.opTxnImpl(gi, srcGroup, field, ai, true) if err != nil { cx.err = err return } + cx.stack[prev] = sv cx.stack = cx.stack[:last] } func opItxn(cx *EvalContext) { field := TxnField(cx.program[cx.pc+1]) - fs, ok := txnFieldSpecByField[field] - if !ok || fs.version > cx.version { - cx.err = fmt.Errorf("invalid itxn field %d", field) - return - } - _, ok = txnaFieldSpecByField[field] - if ok { - cx.err = fmt.Errorf("invalid itxn field %d", field) - return - } - if len(cx.InnerTxns) == 0 { - cx.err = fmt.Errorf("no inner transaction available %d", field) + sv, err := cx.opTxnImpl(0, srcInner, field, 0, false) + if err != nil { + cx.err = err return } + cx.stack = append(cx.stack, sv) +} - itxn := &cx.InnerTxns[len(cx.InnerTxns)-1] - sv, err := cx.itxnFieldToStack(itxn, fs, 0) +func opItxna(cx *EvalContext) { + field := TxnField(cx.program[cx.pc+1]) + ai := uint64(cx.program[cx.pc+2]) + + sv, err := cx.opTxnImpl(0, srcInner, field, ai, true) if err != nil { cx.err = err return } + cx.stack = append(cx.stack, sv) } -func opItxna(cx *EvalContext) { +func opItxnas(cx *EvalContext) { + last := len(cx.stack) - 1 + field := TxnField(cx.program[cx.pc+1]) - fs, ok := txnFieldSpecByField[field] - if !ok || fs.version > cx.version { - cx.err = fmt.Errorf("invalid itxn field %d", field) + ai := cx.stack[last].Uint + + sv, err := cx.opTxnImpl(0, srcInner, field, ai, true) + if err != nil { + cx.err = err return } - _, ok = txnaFieldSpecByField[field] - if !ok { - cx.err = fmt.Errorf("itxna unsupported field %d", field) - return + + cx.stack[last] = sv +} + +func (cx *EvalContext) getLastInner() []transactions.SignedTxnWithAD { + inners := cx.Txn.EvalDelta.InnerTxns + // If there are no inners yet, return empty slice, which will result in error + if len(inners) == 0 { + return inners + } + return inners[len(inners)-1:] +} + +func (cx *EvalContext) getLastInnerGroup() []transactions.SignedTxnWithAD { + inners := cx.Txn.EvalDelta.InnerTxns + // If there are no inners yet, return empty slice, which will result in error + if len(inners) == 0 { + return inners + } + gid := inners[len(inners)-1].Txn.Group + // If last inner was a singleton, return it as a slice. + if gid.IsZero() { + return inners[len(inners)-1:] } - arrayFieldIdx := uint64(cx.program[cx.pc+2]) + // Look back for the first non-matching inner (by group) to find beginning + for i := len(inners) - 2; i >= 0; i-- { + if inners[i].Txn.Group != gid { + return inners[i+1:] + } + } + // All have the same (non-zero) group. Return all + return inners +} - if len(cx.InnerTxns) == 0 { - cx.err = fmt.Errorf("no inner transaction available %d", field) +func opGitxn(cx *EvalContext) { + gi := uint64(cx.program[cx.pc+1]) + field := TxnField(cx.program[cx.pc+2]) + + sv, err := cx.opTxnImpl(gi, srcInnerGroup, field, 0, false) + if err != nil { + cx.err = err return } - itxn := &cx.InnerTxns[len(cx.InnerTxns)-1] - sv, err := cx.itxnFieldToStack(itxn, fs, arrayFieldIdx) + cx.stack = append(cx.stack, sv) +} + +func opGitxna(cx *EvalContext) { + gi := uint64(cx.program[cx.pc+1]) + field := TxnField(cx.program[cx.pc+2]) + ai := uint64(cx.program[cx.pc+3]) + + sv, err := cx.opTxnImpl(gi, srcInnerGroup, field, ai, true) if err != nil { cx.err = err return } + cx.stack = append(cx.stack, sv) } -func opGaidImpl(cx *EvalContext, groupIdx uint64, opName string) (sv stackValue, err error) { - if groupIdx >= uint64(len(cx.TxnGroup)) { - err = fmt.Errorf("%s lookup TxnGroup[%d] but it only has %d", opName, groupIdx, len(cx.TxnGroup)) +func opGitxnas(cx *EvalContext) { + last := len(cx.stack) - 1 + + gi := uint64(cx.program[cx.pc+1]) + field := TxnField(cx.program[cx.pc+2]) + ai := cx.stack[last].Uint + + sv, err := cx.opTxnImpl(gi, srcInnerGroup, field, ai, true) + if err != nil { + cx.err = err + return + } + + cx.stack[last] = sv +} + +func opGaidImpl(cx *EvalContext, giw uint64, opName string) (sv stackValue, err error) { + if giw >= uint64(len(cx.TxnGroup)) { + err = fmt.Errorf("%s lookup TxnGroup[%d] but it only has %d", opName, giw, len(cx.TxnGroup)) return - } else if groupIdx > cx.GroupIndex { - err = fmt.Errorf("%s can't get creatable ID of txn ahead of the current one (index %d) in the transaction group", opName, groupIdx) + } + // Is now assured smalled than a len() so fits in int. + gi := int(giw) + if gi > cx.GroupIndex { + err = fmt.Errorf("%s can't get creatable ID of txn ahead of the current one (index %d) in the transaction group", opName, gi) return - } else if groupIdx == cx.GroupIndex { + } + if gi == cx.GroupIndex { err = fmt.Errorf("%s is only for accessing creatable IDs of previous txns, use `global CurrentApplicationID` instead to access the current app's creatable ID", opName) return - } else if txn := cx.TxnGroup[groupIdx].Txn; !(txn.Type == protocol.ApplicationCallTx || txn.Type == protocol.AssetConfigTx) { - err = fmt.Errorf("can't use %s on txn that is not an app call nor an asset config txn with index %d", opName, groupIdx) - return } - - cid, err := cx.getCreatableID(groupIdx) - if cid == 0 { - err = fmt.Errorf("%s can't read creatable ID from txn with group index %d because the txn did not create anything", opName, groupIdx) + if txn := cx.TxnGroup[gi].Txn; !(txn.Type == protocol.ApplicationCallTx || txn.Type == protocol.AssetConfigTx) { + err = fmt.Errorf("can't use %s on txn that is not an app call nor an asset config txn with index %d", opName, gi) return } - sv = stackValue{ - Uint: cid, + if aid := cx.TxnGroup[gi].ApplyData.ConfigAsset; aid != 0 { + return stackValue{Uint: uint64(aid)}, nil + } + if aid := cx.TxnGroup[gi].ApplyData.ApplicationID; aid != 0 { + return stackValue{Uint: uint64(aid)}, nil } + err = fmt.Errorf("%s: index %d did not create anything", opName, gi) return } func opGaid(cx *EvalContext) { - groupIdx := cx.program[cx.pc+1] - sv, err := opGaidImpl(cx, uint64(groupIdx), "gaid") + gi := uint64(cx.program[cx.pc+1]) + sv, err := opGaidImpl(cx, gi, "gaid") if err != nil { cx.err = err return @@ -2441,8 +2673,9 @@ func opGaid(cx *EvalContext) { func opGaids(cx *EvalContext) { last := len(cx.stack) - 1 - groupIdx := cx.stack[last].Uint - sv, err := opGaidImpl(cx, groupIdx, "gaids") + gi := cx.stack[last].Uint + + sv, err := opGaidImpl(cx, gi, "gaids") if err != nil { cx.err = err return @@ -2472,61 +2705,31 @@ func (cx *EvalContext) getLatestTimestamp() (timestamp uint64, err error) { return uint64(ts), nil } -func (cx *EvalContext) getApplicationID() (uint64, error) { - if cx.Ledger == nil { - return 0, fmt.Errorf("ledger not available") - } - return uint64(cx.Ledger.ApplicationID()), nil -} - -func (cx *EvalContext) getApplicationAddress() (basics.Address, error) { - if cx.Ledger == nil { - return basics.Address{}, fmt.Errorf("ledger not available") - } - - // Initialize appAddrCache if necessary - if cx.appAddrCache == nil { - cx.appAddrCache = make(map[basics.AppIndex]basics.Address) - } - - appID := cx.Ledger.ApplicationID() - // Hashes are expensive, so we cache computed app addrs - appAddr, ok := cx.appAddrCache[appID] +// getApplicationAddress memoizes app.Address() across a tx group's evaluation +func (cx *EvalContext) getApplicationAddress(app basics.AppIndex) basics.Address { + /* Do not instantiate the cache here, that would mask a programming error. + The cache must be instantiated at EvalParams construction time, so that + proper sharing with inner EvalParams can work. */ + appAddr, ok := cx.appAddrCache[app] if !ok { - appAddr = appID.Address() - cx.appAddrCache[appID] = appAddr + appAddr = app.Address() + cx.appAddrCache[app] = appAddr } - return appAddr, nil -} - -func (cx *EvalContext) getCreatableID(groupIndex uint64) (cid uint64, err error) { - if cx.Ledger == nil { - err = fmt.Errorf("ledger not available") - return - } - gi := int(groupIndex) - if gi < 0 { - return 0, fmt.Errorf("groupIndex %d too high", groupIndex) - } - return uint64(cx.Ledger.GetCreatableID(gi)), nil + return appAddr } func (cx *EvalContext) getCreatorAddress() ([]byte, error) { if cx.Ledger == nil { return nil, fmt.Errorf("ledger not available") } - _, creator, err := cx.Ledger.AppParams(cx.Ledger.ApplicationID()) + _, creator, err := cx.Ledger.AppParams(cx.appID) if err != nil { return nil, fmt.Errorf("No params for current app") } return creator[:], nil } -func (cx *EvalContext) getGroupID() []byte { - return cx.Txn.Txn.Group[:] -} - var zeroAddress basics.Address func (cx *EvalContext) globalFieldToValue(fs globalFieldSpec) (sv stackValue, err error) { @@ -2548,15 +2751,29 @@ func (cx *EvalContext) globalFieldToValue(fs globalFieldSpec) (sv stackValue, er case LatestTimestamp: sv.Uint, err = cx.getLatestTimestamp() case CurrentApplicationID: - sv.Uint, err = cx.getApplicationID() + sv.Uint = uint64(cx.appID) case CurrentApplicationAddress: - var addr basics.Address - addr, err = cx.getApplicationAddress() + addr := cx.getApplicationAddress(cx.appID) sv.Bytes = addr[:] case CreatorAddress: sv.Bytes, err = cx.getCreatorAddress() case GroupID: - sv.Bytes = cx.getGroupID() + sv.Bytes = cx.Txn.Txn.Group[:] + case OpcodeBudget: + sv.Uint = uint64(cx.remainingBudget()) + case CallerApplicationID: + if cx.caller != nil { + sv.Uint = uint64(cx.caller.appID) + } else { + sv.Uint = 0 + } + case CallerApplicationAddress: + if cx.caller != nil { + addr := cx.caller.getApplicationAddress(cx.caller.appID) + sv.Bytes = addr[:] + } else { + sv.Bytes = zeroAddress[:] + } default: err = fmt.Errorf("invalid global field %d", fs.field) } @@ -2572,11 +2789,11 @@ func opGlobal(cx *EvalContext) { globalField := GlobalField(cx.program[cx.pc+1]) fs, ok := globalFieldSpecByField[globalField] if !ok || fs.version > cx.version { - cx.err = fmt.Errorf("invalid global field %d", globalField) + cx.err = fmt.Errorf("invalid global field %s", globalField) return } if (cx.runModeFlags & fs.mode) == 0 { - cx.err = fmt.Errorf("global[%d] not allowed in current mode", globalField) + cx.err = fmt.Errorf("global[%s] not allowed in current mode", globalField) return } @@ -2630,11 +2847,7 @@ func opEd25519verify(cx *EvalContext) { copy(sig[:], cx.stack[prev].Bytes) msg := Msg{ProgramHash: cx.programHash(), Data: cx.stack[pprev].Bytes} - if sv.Verify(msg, sig) { - cx.stack[pprev].Uint = 1 - } else { - cx.stack[pprev].Uint = 0 - } + cx.stack[pprev].Uint = boolToUint(sv.Verify(msg, sig, cx.Proto.EnableBatchVerification)) cx.stack[pprev].Bytes = nil cx.stack = cx.stack[:prev] } @@ -2689,11 +2902,7 @@ func opEcdsaVerify(cx *EvalContext) { result := secp256k1.VerifySignature(pubkey, msg, signature) - if result { - cx.stack[fifth].Uint = 1 - } else { - cx.stack[fifth].Uint = 0 - } + cx.stack[fifth].Uint = boolToUint(result) cx.stack[fifth].Bytes = nil cx.stack = cx.stack[:fourth] } @@ -2831,32 +3040,31 @@ func opStores(cx *EvalContext) { cx.stack = cx.stack[:prev] } -func opGloadImpl(cx *EvalContext, groupIdx uint64, scratchIdx byte, opName string) (scratchValue stackValue, err error) { - if groupIdx >= uint64(len(cx.TxnGroup)) { - err = fmt.Errorf("%s lookup TxnGroup[%d] but it only has %d", opName, groupIdx, len(cx.TxnGroup)) - return - } else if int(scratchIdx) >= len(cx.scratch) { - err = fmt.Errorf("invalid Scratch index %d", scratchIdx) - return - } else if txn := cx.TxnGroup[groupIdx].Txn; txn.Type != protocol.ApplicationCallTx { - err = fmt.Errorf("can't use %s on non-app call txn with index %d", opName, groupIdx) - return - } else if groupIdx == cx.GroupIndex { - err = fmt.Errorf("can't use %s on self, use load instead", opName) - return - } else if groupIdx > cx.GroupIndex { - err = fmt.Errorf("%s can't get future scratch space from txn with index %d", opName, groupIdx) - return +func opGloadImpl(cx *EvalContext, gi int, scratchIdx byte, opName string) (stackValue, error) { + var none stackValue + if gi >= len(cx.TxnGroup) { + return none, fmt.Errorf("%s lookup TxnGroup[%d] but it only has %d", opName, gi, len(cx.TxnGroup)) + } + if int(scratchIdx) >= len(cx.scratch) { + return none, fmt.Errorf("invalid Scratch index %d", scratchIdx) + } + if cx.TxnGroup[gi].Txn.Type != protocol.ApplicationCallTx { + return none, fmt.Errorf("can't use %s on non-app call txn with index %d", opName, gi) + } + if gi == cx.GroupIndex { + return none, fmt.Errorf("can't use %s on self, use load instead", opName) + } + if gi > cx.GroupIndex { + return none, fmt.Errorf("%s can't get future scratch space from txn with index %d", opName, gi) } - scratchValue = cx.PastSideEffects[groupIdx].getScratchValue(scratchIdx) - return + return cx.pastScratch[gi][scratchIdx], nil } func opGload(cx *EvalContext) { - groupIdx := uint64(cx.program[cx.pc+1]) + gi := int(cx.program[cx.pc+1]) scratchIdx := cx.program[cx.pc+2] - scratchValue, err := opGloadImpl(cx, groupIdx, scratchIdx, "gload") + scratchValue, err := opGloadImpl(cx, gi, scratchIdx, "gload") if err != nil { cx.err = err return @@ -2867,9 +3075,13 @@ func opGload(cx *EvalContext) { func opGloads(cx *EvalContext) { last := len(cx.stack) - 1 - groupIdx := cx.stack[last].Uint + gi := cx.stack[last].Uint + if gi >= uint64(len(cx.TxnGroup)) { + cx.err = fmt.Errorf("gloads lookup TxnGroup[%d] but it only has %d", gi, len(cx.TxnGroup)) + return + } scratchIdx := cx.program[cx.pc+1] - scratchValue, err := opGloadImpl(cx, groupIdx, scratchIdx, "gloads") + scratchValue, err := opGloadImpl(cx, int(gi), scratchIdx, "gloads") if err != nil { cx.err = err return @@ -2878,6 +3090,30 @@ func opGloads(cx *EvalContext) { cx.stack[last] = scratchValue } +func opGloadss(cx *EvalContext) { + last := len(cx.stack) - 1 + prev := last - 1 + + gi := cx.stack[prev].Uint + if gi >= uint64(len(cx.TxnGroup)) { + cx.err = fmt.Errorf("gloadss lookup TxnGroup[%d] but it only has %d", gi, len(cx.TxnGroup)) + return + } + scratchIdx := cx.stack[last].Uint + if scratchIdx >= 256 { + cx.err = fmt.Errorf("gloadss scratch index >= 256 (%d)", scratchIdx) + return + } + scratchValue, err := opGloadImpl(cx, int(gi), byte(scratchIdx), "gloadss") + if err != nil { + cx.err = err + return + } + + cx.stack[prev] = scratchValue + cx.stack = cx.stack[:last] +} + func opConcat(cx *EvalContext) { last := len(cx.stack) - 1 prev := last - 1 @@ -3121,14 +3357,19 @@ func opExtract64Bits(cx *EvalContext) { opExtractNBytes(cx, 8) // extract 8 bytes } -// accountReference yields the address and Accounts offset designated -// by a stackValue. If the stackValue is the app account, it need not -// be in the Accounts array, therefore len(Accounts) + 1 is returned -// as the index. This unusual convention is based on the existing -// convention that 0 is the sender, 1-len(Accounts) are indexes into -// Accounts array, and so len+1 is the next available value. This -// will allow encoding into EvalDelta efficiently when it becomes -// necessary (when apps change local state on their own account). +// accountReference yields the address and Accounts offset designated by a +// stackValue. If the stackValue is the app account or an account of an app in +// created.apps, and it is not be in the Accounts array, then len(Accounts) + 1 +// is returned as the index. This would let us catch the mistake if the index is +// used for set/del. If the txn somehow "psychically" predicted the address, and +// therefore it IS in txn.Accounts, then happy day, we can set/del it. Return +// the proper index. + +// If we ever want apps to be able to change local state on these accounts +// (which includes this app's own account!), we will need a change to +// EvalDelta's on disk format, so that the addr can be encoded explicitly rather +// than by index into txn.Accounts. + func (cx *EvalContext) accountReference(account stackValue) (basics.Address, uint64, error) { if account.argType() == StackUint64 { addr, err := cx.Txn.Txn.AddressByIndex(account.Uint, cx.Txn.Txn.Sender) @@ -3140,60 +3381,84 @@ func (cx *EvalContext) accountReference(account stackValue) (basics.Address, uin } idx, err := cx.Txn.Txn.IndexByAddress(addr, cx.Txn.Txn.Sender) + invalidIndex := uint64(len(cx.Txn.Txn.Accounts) + 1) + // Allow an address for an app that was created in group + if err != nil && cx.version >= createdResourcesVersion { + for _, appID := range cx.created.apps { + createdAddress := cx.getApplicationAddress(appID) + if addr == createdAddress { + return addr, invalidIndex, nil + } + } + } + + // this app's address is also allowed if err != nil { - // Application address is acceptable. index is meaningless though - appAddr, _ := cx.getApplicationAddress() + appAddr := cx.getApplicationAddress(cx.appID) if appAddr == addr { - return addr, uint64(len(cx.Txn.Txn.Accounts) + 1), nil + return addr, invalidIndex, nil } } return addr, idx, err } -type opQuery func(basics.Address, *config.ConsensusParams) (basics.MicroAlgos, error) +func (cx *EvalContext) mutableAccountReference(account stackValue) (basics.Address, uint64, error) { + addr, accountIdx, err := cx.accountReference(account) + if err == nil && accountIdx > uint64(len(cx.Txn.Txn.Accounts)) { + // There was no error, but accountReference has signaled that accountIdx + // is not for mutable ops (because it can't encode it in EvalDelta) + // This also tells us that account.address() will work. + addr, _ := account.address() + err = fmt.Errorf("invalid Account reference for mutation %s", addr) + } + return addr, accountIdx, err +} -func opBalanceQuery(cx *EvalContext, query opQuery, item string) error { +func opBalance(cx *EvalContext) { + if cx.Ledger == nil { + cx.err = fmt.Errorf("ledger not available") + return + } last := len(cx.stack) - 1 // account (index or actual address) addr, _, err := cx.accountReference(cx.stack[last]) if err != nil { - return err + cx.err = err + return } - microAlgos, err := query(addr, cx.Proto) + account, err := cx.Ledger.AccountData(addr) if err != nil { - return fmt.Errorf("failed to fetch %s of %v: %w", item, addr, err) + cx.err = err + return } cx.stack[last].Bytes = nil - cx.stack[last].Uint = microAlgos.Raw - return nil + cx.stack[last].Uint = account.MicroAlgos.Raw } -func opBalance(cx *EvalContext) { + +func opMinBalance(cx *EvalContext) { if cx.Ledger == nil { cx.err = fmt.Errorf("ledger not available") return } + last := len(cx.stack) - 1 // account (index or actual address) - balanceQuery := func(addr basics.Address, _ *config.ConsensusParams) (basics.MicroAlgos, error) { - return cx.Ledger.Balance(addr) - } - err := opBalanceQuery(cx, balanceQuery, "balance") + addr, _, err := cx.accountReference(cx.stack[last]) if err != nil { cx.err = err - } -} -func opMinBalance(cx *EvalContext) { - if cx.Ledger == nil { - cx.err = fmt.Errorf("ledger not available") return } - err := opBalanceQuery(cx, cx.Ledger.MinBalance, "minimum balance") + account, err := cx.Ledger.AccountData(addr) if err != nil { cx.err = err + return } + + cx.stack[last].Bytes = nil + cx.stack[last].Uint = account.MinBalance(cx.Proto).Raw } func opAppOptedIn(cx *EvalContext) { @@ -3223,12 +3488,8 @@ func opAppOptedIn(cx *EvalContext) { return } + cx.stack[prev].Uint = boolToUint(optedIn) cx.stack[prev].Bytes = nil - if optedIn { - cx.stack[prev].Uint = 1 - } else { - cx.stack[prev].Uint = 0 - } cx.stack = cx.stack[:last] } @@ -3371,11 +3632,28 @@ func opAppLocalPut(cx *EvalContext) { return } - addr, accountIdx, err := cx.accountReference(cx.stack[pprev]) - if err == nil { - err = cx.Ledger.SetLocal(addr, key, sv.toTealValue(), accountIdx) + addr, accountIdx, err := cx.mutableAccountReference(cx.stack[pprev]) + if err != nil { + cx.err = err + return } + // if writing the same value, don't record in EvalDelta, matching ledger + // behavior with previous BuildEvalDelta mechanism + etv, ok, err := cx.Ledger.GetLocal(addr, cx.appID, key, accountIdx) + if err != nil { + cx.err = err + return + } + + tv := sv.toTealValue() + if !ok || tv != etv { + if _, ok := cx.Txn.EvalDelta.LocalDeltas[accountIdx]; !ok { + cx.Txn.EvalDelta.LocalDeltas[accountIdx] = basics.StateDelta{} + } + cx.Txn.EvalDelta.LocalDeltas[accountIdx][key] = tv.ToValueDelta() + } + err = cx.Ledger.SetLocal(addr, cx.appID, key, tv, accountIdx) if err != nil { cx.err = err return @@ -3396,7 +3674,19 @@ func opAppGlobalPut(cx *EvalContext) { return } - err := cx.Ledger.SetGlobal(key, sv.toTealValue()) + // if writing the same value, don't record in EvalDelta, matching ledger + // behavior with previous BuildEvalDelta mechanism + etv, ok, err := cx.Ledger.GetGlobal(cx.appID, key) + if err != nil { + cx.err = err + return + } + tv := sv.toTealValue() + if !ok || tv != etv { + cx.Txn.EvalDelta.GlobalDelta[key] = tv.ToValueDelta() + } + + err = cx.Ledger.SetGlobal(cx.appID, key, tv) if err != nil { cx.err = err return @@ -3416,10 +3706,28 @@ func opAppLocalDel(cx *EvalContext) { return } - addr, accountIdx, err := cx.accountReference(cx.stack[prev]) - if err == nil { - err = cx.Ledger.DelLocal(addr, key, accountIdx) + addr, accountIdx, err := cx.mutableAccountReference(cx.stack[prev]) + if err != nil { + cx.err = err + return } + + // if deleting a non-existent value, don't record in EvalDelta, matching + // ledger behavior with previous BuildEvalDelta mechanism + if _, ok, err := cx.Ledger.GetLocal(addr, cx.appID, key, accountIdx); ok { + if err != nil { + cx.err = err + return + } + if _, ok := cx.Txn.EvalDelta.LocalDeltas[accountIdx]; !ok { + cx.Txn.EvalDelta.LocalDeltas[accountIdx] = basics.StateDelta{} + } + cx.Txn.EvalDelta.LocalDeltas[accountIdx][key] = basics.ValueDelta{ + Action: basics.DeleteAction, + } + } + + err = cx.Ledger.DelLocal(addr, cx.appID, key, accountIdx) if err != nil { cx.err = err return @@ -3438,7 +3746,19 @@ func opAppGlobalDel(cx *EvalContext) { return } - err := cx.Ledger.DelGlobal(key) + // if deleting a non-existent value, don't record in EvalDelta, matching + // ledger behavior with previous BuildEvalDelta mechanism + if _, ok, err := cx.Ledger.GetGlobal(cx.appID, key); ok { + if err != nil { + cx.err = err + return + } + cx.Txn.EvalDelta.GlobalDelta[key] = basics.ValueDelta{ + Action: basics.DeleteAction, + } + } + + err := cx.Ledger.DelGlobal(cx.appID, key) if err != nil { cx.err = err return @@ -3448,40 +3768,42 @@ func opAppGlobalDel(cx *EvalContext) { // We have a difficult naming problem here. In some opcodes, TEAL // allows (and used to require) ASAs and Apps to to be referenced by -// their "index" in an app call txn's foeign-apps or foreign-assets +// their "index" in an app call txn's foreign-apps or foreign-assets // arrays. That was a small integer, no more than 2 or so, and was // often called an "index". But it was not a basics.AssetIndex or // basics.ApplicationIndex. func appReference(cx *EvalContext, ref uint64, foreign bool) (basics.AppIndex, error) { if cx.version >= directRefEnabledVersion { - if ref == 0 { - return cx.Ledger.ApplicationID(), nil - } - if ref <= uint64(len(cx.Txn.Txn.ForeignApps)) { - return basics.AppIndex(cx.Txn.Txn.ForeignApps[ref-1]), nil + if ref == 0 || ref == uint64(cx.appID) { + return cx.appID, nil } for _, appID := range cx.Txn.Txn.ForeignApps { if appID == basics.AppIndex(ref) { return appID, nil } } - // It should be legal to use your own app id, which - // can't be in ForeignApps during creation, because it - // is unknown then. But it can be discovered in the - // app code. It's tempting to combine this with the - // == 0 test, above, but it must come after the check - // for being below len(ForeignApps) - if ref == uint64(cx.Ledger.ApplicationID()) { - return cx.Ledger.ApplicationID(), nil + // or was created in group + if cx.version >= createdResourcesVersion { + for _, appID := range cx.created.apps { + if appID == basics.AppIndex(ref) { + return appID, nil + } + } + } + // Allow use of indexes, but this comes last so that clear advice can be + // given to anyone who cares about semantics in the first few rounds of + // a new network - don't use indexes for references, use the App ID + if ref <= uint64(len(cx.Txn.Txn.ForeignApps)) { + return basics.AppIndex(cx.Txn.Txn.ForeignApps[ref-1]), nil } } else { // Old rules + if ref == 0 { // Even back when expected to be a real ID, ref = 0 was current app + return cx.appID, nil + } if foreign { // In old versions, a foreign reference must be an index in ForeignAssets or 0 - if ref == 0 { - return cx.Ledger.ApplicationID(), nil - } if ref <= uint64(len(cx.Txn.Txn.ForeignApps)) { return basics.AppIndex(cx.Txn.Txn.ForeignApps[ref-1]), nil } @@ -3495,15 +3817,25 @@ func appReference(cx *EvalContext, ref uint64, foreign bool) (basics.AppIndex, e func asaReference(cx *EvalContext, ref uint64, foreign bool) (basics.AssetIndex, error) { if cx.version >= directRefEnabledVersion { - // In recent versions, accept either kind of ASA reference - if ref < uint64(len(cx.Txn.Txn.ForeignAssets)) { - return basics.AssetIndex(cx.Txn.Txn.ForeignAssets[ref]), nil - } for _, assetID := range cx.Txn.Txn.ForeignAssets { if assetID == basics.AssetIndex(ref) { return assetID, nil } } + // or was created in group + if cx.version >= createdResourcesVersion { + for _, assetID := range cx.created.asas { + if assetID == basics.AssetIndex(ref) { + return assetID, nil + } + } + } + // Allow use of indexes, but this comes last so that clear advice can be + // given to anyone who cares about semantics in the first few rounds of + // a new network - don't use indexes for references, use the asa ID. + if ref < uint64(len(cx.Txn.Txn.ForeignAssets)) { + return basics.AssetIndex(cx.Txn.Txn.ForeignAssets[ref]), nil + } } else { // Old rules if foreign { @@ -3647,10 +3979,53 @@ func opAppParamsGet(cx *EvalContext) { cx.stack = append(cx.stack, stackValue{Uint: exist}) } +func opAcctParamsGet(cx *EvalContext) { + last := len(cx.stack) - 1 // acct + + if cx.Ledger == nil { + cx.err = fmt.Errorf("ledger not available") + return + } + + addr, _, err := cx.accountReference(cx.stack[last]) + if err != nil { + cx.err = err + return + } + + paramField := AcctParamsField(cx.program[cx.pc+1]) + fs, ok := acctParamsFieldSpecByField[paramField] + if !ok || fs.version > cx.version { + cx.err = fmt.Errorf("invalid acct_params_get field %d", paramField) + return + } + + account, err := cx.Ledger.AccountData(addr) + if err != nil { + cx.err = err + return + } + + exist := boolToUint(account.MicroAlgos.Raw > 0) + + var value stackValue + + switch fs.field { + case AcctBalance: + value.Uint = account.MicroAlgos.Raw + case AcctMinBalance: + value.Uint = account.MinBalance(cx.Proto).Raw + case AcctAuthAddr: + value.Bytes = account.AuthAddr[:] + } + cx.stack[last] = value + cx.stack = append(cx.stack, stackValue{Uint: exist}) +} + func opLog(cx *EvalContext) { last := len(cx.stack) - 1 - if len(cx.Logs) == MaxLogCalls { + if len(cx.Txn.EvalDelta.Logs) >= MaxLogCalls { cx.err = fmt.Errorf("too many log calls in program. up to %d is allowed", MaxLogCalls) return } @@ -3660,41 +4035,38 @@ func opLog(cx *EvalContext) { cx.err = fmt.Errorf("program logs too large. %d bytes > %d bytes limit", cx.logSize, MaxLogSize) return } - cx.Logs = append(cx.Logs, string(log.Bytes)) + cx.Txn.EvalDelta.Logs = append(cx.Txn.EvalDelta.Logs, string(log.Bytes)) cx.stack = cx.stack[:last] } -func authorizedSender(cx *EvalContext, addr basics.Address) bool { - appAddr, err := cx.getApplicationAddress() - if err != nil { - return false - } +func authorizedSender(cx *EvalContext, addr basics.Address) error { authorizer, err := cx.Ledger.Authorizer(addr) if err != nil { - return false + return err + } + if cx.getApplicationAddress(cx.appID) != authorizer { + return fmt.Errorf("app %d (addr %s) unauthorized %s", cx.appID, cx.getApplicationAddress(cx.appID), authorizer) } - return appAddr == authorizer + return nil } // addInnerTxn appends a fresh SignedTxn to subtxns, populated with reasonable // defaults. func addInnerTxn(cx *EvalContext) error { - addr, err := cx.getApplicationAddress() - if err != nil { - return err - } + addr := cx.getApplicationAddress(cx.appID) // For compatibility with v5, in which failures only occurred in the submit, - // we only fail here if we are OVER the MaxInnerTransactions limit. Thus - // this allows construction of one more Inner than is actually allowed, and - // will fail in submit. (But we do want the check here, so this can't become - // unbounded.) The MaxTxGroupSize check can be, and is, precise. - if len(cx.InnerTxns)+len(cx.subtxns) > cx.Proto.MaxInnerTransactions || - len(cx.subtxns) >= cx.Proto.MaxTxGroupSize { - return errors.New("attempt to create too many inner transactions") + // we only fail here if we are already over the max inner limit. Thus this + // allows construction of one more Inner than is actually allowed, and will + // fail in submit. (But we do want the check here, so this can't become + // unbounded.) The MaxTxGroupSize check can be, and is, precise. (That is, + // if we are at max group size, we can panic now, since we are trying to add + // too many) + if len(cx.subtxns) > cx.remainingInners() || len(cx.subtxns) >= cx.Proto.MaxTxGroupSize { + return fmt.Errorf("too many inner transactions %d with %d left", len(cx.subtxns), cx.remainingInners()) } - stxn := transactions.SignedTxn{} + stxn := transactions.SignedTxnWithAD{} groupFee := basics.MulSaturate(cx.Proto.MinTxnFee, uint64(len(cx.subtxns)+1)) groupPaid := uint64(0) @@ -3729,6 +4101,10 @@ func opTxBegin(cx *EvalContext) { cx.err = errors.New("itxn_begin without itxn_submit") return } + if cx.Proto.IsolateClearState && cx.Txn.Txn.OnCompletion == transactions.ClearStateOC { + cx.err = errors.New("clear state programs can not issue inner transactions") + return + } cx.err = addInnerTxn(cx) } @@ -3756,25 +4132,67 @@ func (cx *EvalContext) availableAccount(sv stackValue) (basics.Address, error) { // don't need (or want!) to allow low numbers to represent the asset at that // index in ForeignAssets array. func (cx *EvalContext) availableAsset(sv stackValue) (basics.AssetIndex, error) { - aid, err := sv.uint() + uint, err := sv.uint() if err != nil { return basics.AssetIndex(0), err } + aid := basics.AssetIndex(uint) + // Ensure that aid is in Foreign Assets for _, assetID := range cx.Txn.Txn.ForeignAssets { - if assetID == basics.AssetIndex(aid) { - return basics.AssetIndex(aid), nil + if assetID == aid { + return aid, nil } } + // or was created in group + if cx.version >= createdResourcesVersion { + for _, assetID := range cx.created.asas { + if assetID == aid { + return aid, nil + } + } + } + return basics.AssetIndex(0), fmt.Errorf("invalid Asset reference %d", aid) } -func (cx *EvalContext) stackIntoTxnField(sv stackValue, fs txnFieldSpec, txn *transactions.Transaction) (err error) { +// availableApp is used instead of appReference for more recent (stateful) +// opcodes that don't need (or want!) to allow low numbers to represent the app +// at that index in ForeignApps array. +func (cx *EvalContext) availableApp(sv stackValue) (basics.AppIndex, error) { + uint, err := sv.uint() + if err != nil { + return basics.AppIndex(0), err + } + aid := basics.AppIndex(uint) + + // Ensure that aid is in Foreign Apps + for _, appID := range cx.Txn.Txn.ForeignApps { + if appID == aid { + return aid, nil + } + } + // or was created in group + if cx.version >= createdResourcesVersion { + for _, appID := range cx.created.apps { + if appID == aid { + return aid, nil + } + } + } + // Or, it can be the current app + if cx.appID == aid { + return aid, nil + } + + return 0, fmt.Errorf("invalid App reference %d", aid) +} + +func (cx *EvalContext) stackIntoTxnField(sv stackValue, fs *txnFieldSpec, txn *transactions.Transaction) (err error) { switch fs.field { case Type: if sv.Bytes == nil { - err = fmt.Errorf("Type arg not a byte array") - return + return fmt.Errorf("Type arg not a byte array") } txType := string(sv.Bytes) ver, ok := innerTxnTypes[txType] @@ -3809,11 +4227,10 @@ func (cx *EvalContext) stackIntoTxnField(sv stackValue, fs txnFieldSpec, txn *tr // round, and separation by MaxLifetime (check lifetime in submit, not here) case Note: if len(sv.Bytes) > cx.Proto.MaxTxnNoteBytes { - err = fmt.Errorf("%s may not exceed %d bytes", fs.field, cx.Proto.MaxTxnNoteBytes) - } else { - txn.Note = make([]byte, len(sv.Bytes)) - copy(txn.Note[:], sv.Bytes) + return fmt.Errorf("%s may not exceed %d bytes", fs.field, cx.Proto.MaxTxnNoteBytes) } + txn.Note = make([]byte, len(sv.Bytes)) + copy(txn.Note, sv.Bytes) // GenesisID, GenesisHash unsettable: surely makes no sense // Group unsettable: Can't make groups from AVM (yet?) // Lease unsettable: This seems potentially useful. @@ -3824,16 +4241,19 @@ func (cx *EvalContext) stackIntoTxnField(sv stackValue, fs txnFieldSpec, txn *tr // KeyReg case VotePK: if len(sv.Bytes) != 32 { - err = fmt.Errorf("%s must be 32 bytes", fs.field) - } else { - copy(txn.VotePK[:], sv.Bytes) + return fmt.Errorf("%s must be 32 bytes", fs.field) } + copy(txn.VotePK[:], sv.Bytes) case SelectionPK: if len(sv.Bytes) != 32 { - err = fmt.Errorf("%s must be 32 bytes", fs.field) - } else { - copy(txn.SelectionPK[:], sv.Bytes) + return fmt.Errorf("%s must be 32 bytes", fs.field) + } + copy(txn.SelectionPK[:], sv.Bytes) + case StateProofPK: + if len(sv.Bytes) != 64 { + return fmt.Errorf("%s must be 64 bytes", fs.field) } + copy(txn.StateProofPK[:], sv.Bytes) case VoteFirst: var round uint64 round, err = sv.uint() @@ -3890,10 +4310,9 @@ func (cx *EvalContext) stackIntoTxnField(sv stackValue, fs txnFieldSpec, txn *tr txn.AssetParams.URL, err = sv.string(cx.Proto.MaxAssetURLBytes) case ConfigAssetMetadataHash: if len(sv.Bytes) != 32 { - err = fmt.Errorf("%s must be 32 bytes", fs.field) - } else { - copy(txn.AssetParams.MetadataHash[:], sv.Bytes) + return fmt.Errorf("%s must be 32 bytes", fs.field) } + copy(txn.AssetParams.MetadataHash[:], sv.Bytes) case ConfigAssetManager: txn.AssetParams.Manager, err = sv.address() case ConfigAssetReserve: @@ -3910,10 +4329,96 @@ func (cx *EvalContext) stackIntoTxnField(sv stackValue, fs txnFieldSpec, txn *tr case FreezeAssetFrozen: txn.AssetFrozen, err = sv.bool() - // appl needs to wait. Can't call AVM from AVM. - + // ApplicationCall + case ApplicationID: + txn.ApplicationID, err = cx.availableApp(sv) + case OnCompletion: + var onc uint64 + onc, err = sv.uintMaxed(uint64(transactions.DeleteApplicationOC)) + txn.OnCompletion = transactions.OnCompletion(onc) + case ApplicationArgs: + if sv.Bytes == nil { + return fmt.Errorf("ApplicationArg is not a byte array") + } + total := len(sv.Bytes) + for _, arg := range txn.ApplicationArgs { + total += len(arg) + } + if total > cx.Proto.MaxAppTotalArgLen { + return errors.New("total application args length too long") + } + if len(txn.ApplicationArgs) >= cx.Proto.MaxAppArgs { + return errors.New("too many application args") + } + new := make([]byte, len(sv.Bytes)) + copy(new, sv.Bytes) + txn.ApplicationArgs = append(txn.ApplicationArgs, new) + case Accounts: + var new basics.Address + new, err = cx.availableAccount(sv) + if err != nil { + return + } + if len(txn.Accounts) >= cx.Proto.MaxAppTxnAccounts { + return errors.New("too many foreign accounts") + } + txn.Accounts = append(txn.Accounts, new) + case ApprovalProgram: + maxPossible := cx.Proto.MaxAppProgramLen * (1 + cx.Proto.MaxExtraAppProgramPages) + if len(sv.Bytes) > maxPossible { + return fmt.Errorf("%s may not exceed %d bytes", fs.field, maxPossible) + } + txn.ApprovalProgram = make([]byte, len(sv.Bytes)) + copy(txn.ApprovalProgram, sv.Bytes) + case ClearStateProgram: + maxPossible := cx.Proto.MaxAppProgramLen * (1 + cx.Proto.MaxExtraAppProgramPages) + if len(sv.Bytes) > maxPossible { + return fmt.Errorf("%s may not exceed %d bytes", fs.field, maxPossible) + } + txn.ClearStateProgram = make([]byte, len(sv.Bytes)) + copy(txn.ClearStateProgram, sv.Bytes) + case Assets: + var new basics.AssetIndex + new, err = cx.availableAsset(sv) + if err != nil { + return + } + if len(txn.ForeignAssets) >= cx.Proto.MaxAppTxnForeignAssets { + return errors.New("too many foreign assets") + } + txn.ForeignAssets = append(txn.ForeignAssets, new) + case Applications: + var new basics.AppIndex + new, err = cx.availableApp(sv) + if err != nil { + return + } + if len(txn.ForeignApps) >= cx.Proto.MaxAppTxnForeignApps { + return errors.New("too many foreign apps") + } + txn.ForeignApps = append(txn.ForeignApps, new) + case GlobalNumUint: + txn.GlobalStateSchema.NumUint, err = + sv.uintMaxed(cx.Proto.MaxGlobalSchemaEntries) + case GlobalNumByteSlice: + txn.GlobalStateSchema.NumByteSlice, err = + sv.uintMaxed(cx.Proto.MaxGlobalSchemaEntries) + case LocalNumUint: + txn.LocalStateSchema.NumUint, err = + sv.uintMaxed(cx.Proto.MaxLocalSchemaEntries) + case LocalNumByteSlice: + txn.LocalStateSchema.NumByteSlice, err = + sv.uintMaxed(cx.Proto.MaxLocalSchemaEntries) + case ExtraProgramPages: + var epp uint64 + epp, err = + sv.uintMaxed(uint64(cx.Proto.MaxExtraAppProgramPages)) + if err != nil { + return + } + txn.ExtraProgramPages = uint32(epp) default: - return fmt.Errorf("invalid itxn_field %s", fs.field) + err = fmt.Errorf("invalid itxn_field %s", fs.field) } return } @@ -3932,7 +4437,7 @@ func opTxField(cx *EvalContext) { return } sv := cx.stack[last] - cx.err = cx.stackIntoTxnField(sv, fs, &cx.subtxns[itx].Txn) + cx.err = cx.stackIntoTxnField(sv, &fs, &cx.subtxns[itx].Txn) cx.stack = cx.stack[:last] // pop } @@ -3942,10 +4447,11 @@ func opTxSubmit(cx *EvalContext) { return } - // Should never trigger, since itxn_next checks these too. - if len(cx.InnerTxns)+len(cx.subtxns) > cx.Proto.MaxInnerTransactions || - len(cx.subtxns) > cx.Proto.MaxTxGroupSize { - cx.err = errors.New("too many inner transactions") + // Should rarely trigger, since itxn_next checks these too. (but that check + // must be imperfect, see its comment) In contrast to that check, subtxns is + // already populated here. + if len(cx.subtxns) > cx.remainingInners() || len(cx.subtxns) > cx.Proto.MaxTxGroupSize { + cx.err = fmt.Errorf("too many inner transactions %d with %d left", len(cx.subtxns), cx.remainingInners()) return } @@ -3976,34 +4482,106 @@ func opTxSubmit(cx *EvalContext) { *cx.FeeCredit = basics.AddSaturate(*cx.FeeCredit, overpay) } + // All subtxns will have zero'd GroupID since GroupID can't be set in + // AVM. (no need to blank it out before hashing for TxID) + var group transactions.TxGroup + var parent transactions.Txid + isGroup := len(cx.subtxns) > 1 + if isGroup { + parent = cx.Txn.ID() + } for itx := range cx.subtxns { // The goal is to follow the same invariants used by the // transaction pool. Namely that any transaction that makes it // to Perform (which is equivalent to eval.applyTransaction) // is authorized, and WellFormed. - if !authorizedSender(cx, cx.subtxns[itx].Txn.Sender) { - cx.err = fmt.Errorf("unauthorized") + err := authorizedSender(cx, cx.subtxns[itx].Txn.Sender) + if err != nil { + cx.err = err return } // Recall that WellFormed does not care about individual - // transaction fees because of fee pooling. So we check below. + // transaction fees because of fee pooling. Checked above. cx.err = cx.subtxns[itx].Txn.WellFormed(*cx.Specials, *cx.Proto) if cx.err != nil { return } - ad, err := cx.Ledger.Perform(&cx.subtxns[itx].Txn, *cx.Specials) + // Disallow reentrancy and limit inner app call depth + if cx.subtxns[itx].Txn.Type == protocol.ApplicationCallTx { + if cx.appID == cx.subtxns[itx].Txn.ApplicationID { + cx.err = fmt.Errorf("attempt to self-call") + return + } + depth := 0 + for parent := cx.caller; parent != nil; parent = parent.caller { + if parent.appID == cx.subtxns[itx].Txn.ApplicationID { + cx.err = fmt.Errorf("attempt to re-enter %d", parent.appID) + return + } + depth++ + } + if depth >= maxAppCallDepth { + cx.err = fmt.Errorf("appl depth (%d) exceeded", depth) + return + } + + // Can't call version < innerAppsEnabledVersion, and apps with such + // versions will always match, so just check approval program + // version. + program := cx.subtxns[itx].Txn.ApprovalProgram + if cx.subtxns[itx].Txn.ApplicationID != 0 { + app, _, err := cx.Ledger.AppParams(cx.subtxns[itx].Txn.ApplicationID) + if err != nil { + cx.err = err + return + } + program = app.ApprovalProgram + } + v, _, err := transactions.ProgramVersion(program) + if err != nil { + cx.err = err + return + } + if v < innerAppsEnabledVersion { + cx.err = fmt.Errorf("inner app call with version %d < %d", v, innerAppsEnabledVersion) + return + } + } + + if isGroup { + innerOffset := len(cx.Txn.EvalDelta.InnerTxns) + group.TxGroupHashes = append(group.TxGroupHashes, + crypto.Digest(cx.subtxns[itx].Txn.InnerID(parent, innerOffset))) + } + } + + if isGroup { + groupID := crypto.HashObj(group) + for itx := range cx.subtxns { + cx.subtxns[itx].Txn.Group = groupID + } + } + + // Decrement allowed inners *before* execution, else runaway recursion is + // not noticed. + if cx.pooledAllowedInners != nil { + *cx.pooledAllowedInners -= len(cx.subtxns) + } + + ep := NewInnerEvalParams(cx.subtxns, cx) + for i := range ep.TxnGroup { + err := cx.Ledger.Perform(i, ep) if err != nil { cx.err = err return } - - cx.InnerTxns = append(cx.InnerTxns, transactions.SignedTxnWithAD{ - SignedTxn: cx.subtxns[itx], - ApplyData: ad, - }) + // This is mostly a no-op, because Perform does its work "in-place", but + // RecordAD has some further responsibilities. + ep.RecordAD(i, ep.TxnGroup[i].ApplyData) } + cx.Txn.EvalDelta.InnerTxns = append(cx.Txn.EvalDelta.InnerTxns, ep.TxnGroup...) cx.subtxns = nil } @@ -4034,3 +4612,29 @@ func (cx *EvalContext) PcDetails() (pc int, dis string) { } return cx.pc, dis } + +func base64Decode(encoded []byte, encoding *base64.Encoding) ([]byte, error) { + decoded := make([]byte, encoding.DecodedLen(len(encoded))) + n, err := encoding.Decode(decoded, encoded) + if err != nil { + return decoded[:0], err + } + return decoded[:n], err +} + +func opBase64Decode(cx *EvalContext) { + last := len(cx.stack) - 1 + encodingField := Base64Encoding(cx.program[cx.pc+1]) + fs, ok := base64EncodingSpecByField[encodingField] + if !ok || fs.version > cx.version { + cx.err = fmt.Errorf("invalid base64_decode encoding %d", encodingField) + return + } + + encoding := base64.URLEncoding + if encodingField == StdEncoding { + encoding = base64.StdEncoding + } + encoding = encoding.Strict() + cx.stack[last].Bytes, cx.err = base64Decode(cx.stack[last].Bytes, encoding) +} diff --git a/data/transactions/logic/evalAppTxn_test.go b/data/transactions/logic/evalAppTxn_test.go index b24e10fc2f..cb1a16408d 100644 --- a/data/transactions/logic/evalAppTxn_test.go +++ b/data/transactions/logic/evalAppTxn_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -14,95 +14,117 @@ // You should have received a copy of the GNU Affero General Public License // along with go-algorand. If not, see . -package logic +package logic_test import ( + "encoding/hex" "fmt" + "strings" "testing" "github.com/algorand/go-algorand/data/basics" + "github.com/algorand/go-algorand/data/transactions" + . "github.com/algorand/go-algorand/data/transactions/logic" + "github.com/algorand/go-algorand/data/txntest" + "github.com/algorand/go-algorand/protocol" + "github.com/algorand/go-algorand/test/partitiontest" "github.com/stretchr/testify/require" ) func TestInnerTypesV5(t *testing.T) { - v5, _ := makeSampleEnvWithVersion(5) + partitiontest.PartitionTest(t) + + v5, _, _ := MakeSampleEnvWithVersion(5) // not alllowed in v5 - testApp(t, "itxn_begin; byte \"keyreg\"; itxn_field Type; itxn_submit; int 1;", v5, "keyreg is not a valid Type for itxn_field") - testApp(t, "itxn_begin; int keyreg; itxn_field TypeEnum; itxn_submit; int 1;", v5, "keyreg is not a valid Type for itxn_field") + TestApp(t, "itxn_begin; byte \"keyreg\"; itxn_field Type; itxn_submit; int 1;", v5, "keyreg is not a valid Type for itxn_field") + TestApp(t, "itxn_begin; int keyreg; itxn_field TypeEnum; itxn_submit; int 1;", v5, "keyreg is not a valid Type for itxn_field") + + TestApp(t, "itxn_begin; byte \"appl\"; itxn_field Type; itxn_submit; int 1;", v5, "appl is not a valid Type for itxn_field") + TestApp(t, "itxn_begin; int appl; itxn_field TypeEnum; itxn_submit; int 1;", v5, "appl is not a valid Type for itxn_field") } func TestCurrentInnerTypes(t *testing.T) { - ep, ledger := makeSampleEnv() - testApp(t, "itxn_submit; int 1;", ep, "itxn_submit without itxn_begin") - testApp(t, "int pay; itxn_field TypeEnum; itxn_submit; int 1;", ep, "itxn_field without itxn_begin") - testApp(t, "itxn_begin; itxn_submit; int 1;", ep, "unknown tx type") + partitiontest.PartitionTest(t) + + ep, tx, ledger := MakeSampleEnv() + TestApp(t, "itxn_submit; int 1;", ep, "itxn_submit without itxn_begin") + TestApp(t, "int pay; itxn_field TypeEnum; itxn_submit; int 1;", ep, "itxn_field without itxn_begin") + TestApp(t, "itxn_begin; itxn_submit; int 1;", ep, "unknown tx type") // bad type - testApp(t, "itxn_begin; byte \"pya\"; itxn_field Type; itxn_submit; int 1;", ep, "pya is not a valid Type") + TestApp(t, "itxn_begin; byte \"pya\"; itxn_field Type; itxn_submit; int 1;", ep, "pya is not a valid Type") // mixed up the int form for the byte form - testApp(t, obfuscate("itxn_begin; int pay; itxn_field Type; itxn_submit; int 1;"), ep, "Type arg not a byte array") + TestApp(t, Obfuscate("itxn_begin; int pay; itxn_field Type; itxn_submit; int 1;"), ep, "Type arg not a byte array") // or vice versa - testApp(t, obfuscate("itxn_begin; byte \"pay\"; itxn_field TypeEnum; itxn_submit; int 1;"), ep, "not a uint64") + TestApp(t, Obfuscate("itxn_begin; byte \"pay\"; itxn_field TypeEnum; itxn_submit; int 1;"), ep, "not a uint64") - // good types, not allowed yet - testApp(t, "itxn_begin; byte \"appl\"; itxn_field Type; itxn_submit; int 1;", ep, "appl is not a valid Type for itxn_field") - // same, as enums - testApp(t, "itxn_begin; int appl; itxn_field TypeEnum; itxn_submit; int 1;", ep, "appl is not a valid Type for itxn_field") - testApp(t, "itxn_begin; int 42; itxn_field TypeEnum; itxn_submit; int 1;", ep, "42 is not a valid TypeEnum") - testApp(t, "itxn_begin; int 0; itxn_field TypeEnum; itxn_submit; int 1;", ep, "0 is not a valid TypeEnum") + // some bad types + TestApp(t, "itxn_begin; int 42; itxn_field TypeEnum; itxn_submit; int 1;", ep, "42 is not a valid TypeEnum") + TestApp(t, "itxn_begin; int 0; itxn_field TypeEnum; itxn_submit; int 1;", ep, "0 is not a valid TypeEnum") // "insufficient balance" because app account is charged fee // (defaults make these 0 pay|axfer to zero address, from app account) - testApp(t, "itxn_begin; byte \"pay\"; itxn_field Type; itxn_submit; int 1;", ep, "insufficient balance") - testApp(t, "itxn_begin; byte \"axfer\"; itxn_field Type; itxn_submit; int 1;", ep, "insufficient balance") - testApp(t, "itxn_begin; int pay; itxn_field TypeEnum; itxn_submit; int 1;", ep, "insufficient balance") - testApp(t, "itxn_begin; int axfer; itxn_field TypeEnum; itxn_submit; int 1;", ep, "insufficient balance") + TestApp(t, "itxn_begin; byte \"pay\"; itxn_field Type; itxn_submit; int 1;", ep, "insufficient balance") + TestApp(t, "itxn_begin; byte \"axfer\"; itxn_field Type; itxn_submit; int 1;", ep, "insufficient balance") + TestApp(t, "itxn_begin; int pay; itxn_field TypeEnum; itxn_submit; int 1;", ep, "insufficient balance") + TestApp(t, "itxn_begin; int axfer; itxn_field TypeEnum; itxn_submit; int 1;", ep, "insufficient balance") - testApp(t, "itxn_begin; byte \"acfg\"; itxn_field Type; itxn_submit; int 1;", ep, "insufficient balance") - testApp(t, "itxn_begin; byte \"afrz\"; itxn_field Type; itxn_submit; int 1;", ep, "insufficient balance") - testApp(t, "itxn_begin; int acfg; itxn_field TypeEnum; itxn_submit; int 1;", ep, "insufficient balance") - testApp(t, "itxn_begin; int afrz; itxn_field TypeEnum; itxn_submit; int 1;", ep, "insufficient balance") + TestApp(t, "itxn_begin; byte \"acfg\"; itxn_field Type; itxn_submit; int 1;", ep, "insufficient balance") + TestApp(t, "itxn_begin; byte \"afrz\"; itxn_field Type; itxn_submit; int 1;", ep, "insufficient balance") + TestApp(t, "itxn_begin; int acfg; itxn_field TypeEnum; itxn_submit; int 1;", ep, "insufficient balance") + TestApp(t, "itxn_begin; int afrz; itxn_field TypeEnum; itxn_submit; int 1;", ep, "insufficient balance") - // alllowed since v6 - testApp(t, "itxn_begin; byte \"keyreg\"; itxn_field Type; itxn_submit; int 1;", ep, "insufficient balance") - testApp(t, "itxn_begin; int keyreg; itxn_field TypeEnum; itxn_submit; int 1;", ep, "insufficient balance") + // allowed since v6 + TestApp(t, "itxn_begin; byte \"keyreg\"; itxn_field Type; itxn_submit; int 1;", ep, "insufficient balance") + TestApp(t, "itxn_begin; int keyreg; itxn_field TypeEnum; itxn_submit; int 1;", ep, "insufficient balance") + // caught before inner evaluation, because id=0 and bad program + TestApp(t, "itxn_begin; byte \"appl\"; itxn_field Type; itxn_submit; int 1;", ep, "invalid program (empty)") + TestApp(t, "itxn_begin; int appl; itxn_field TypeEnum; itxn_submit; int 1;", ep, "invalid program (empty)") // Establish 888 as the app id, and fund it. - ledger.NewApp(ep.Txn.Txn.Receiver, 888, basics.AppParams{}) + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) ledger.NewAccount(basics.AppIndex(888).Address(), 200000) - testApp(t, "itxn_begin; byte \"pay\"; itxn_field Type; itxn_submit; int 1;", ep) - testApp(t, "itxn_begin; int pay; itxn_field TypeEnum; itxn_submit; int 1;", ep) + TestApp(t, "itxn_begin; byte \"pay\"; itxn_field Type; itxn_submit; int 1;", ep) + TestApp(t, "itxn_begin; int pay; itxn_field TypeEnum; itxn_submit; int 1;", ep) // Can't submit because we haven't finished setup, but type passes itxn_field - testApp(t, "itxn_begin; byte \"axfer\"; itxn_field Type; int 1;", ep) - testApp(t, "itxn_begin; int axfer; itxn_field TypeEnum; int 1;", ep) - testApp(t, "itxn_begin; byte \"acfg\"; itxn_field Type; int 1;", ep) - testApp(t, "itxn_begin; int acfg; itxn_field TypeEnum; int 1;", ep) - testApp(t, "itxn_begin; byte \"afrz\"; itxn_field Type; int 1;", ep) - testApp(t, "itxn_begin; int afrz; itxn_field TypeEnum; int 1;", ep) + TestApp(t, "itxn_begin; byte \"axfer\"; itxn_field Type; int 1;", ep) + TestApp(t, "itxn_begin; int axfer; itxn_field TypeEnum; int 1;", ep) + TestApp(t, "itxn_begin; byte \"acfg\"; itxn_field Type; int 1;", ep) + TestApp(t, "itxn_begin; int acfg; itxn_field TypeEnum; int 1;", ep) + TestApp(t, "itxn_begin; byte \"afrz\"; itxn_field Type; int 1;", ep) + TestApp(t, "itxn_begin; int afrz; itxn_field TypeEnum; int 1;", ep) } func TestFieldTypes(t *testing.T) { - ep, _ := makeSampleEnv() - testApp(t, "itxn_begin; byte \"pay\"; itxn_field Sender;", ep, "not an address") - testApp(t, obfuscate("itxn_begin; int 7; itxn_field Receiver;"), ep, "not an address") - testApp(t, "itxn_begin; byte \"\"; itxn_field CloseRemainderTo;", ep, "not an address") - testApp(t, "itxn_begin; byte \"\"; itxn_field AssetSender;", ep, "not an address") + partitiontest.PartitionTest(t) + + ep, _, _ := MakeSampleEnv() + TestApp(t, "itxn_begin; byte \"pay\"; itxn_field Sender;", ep, "not an address") + TestApp(t, Obfuscate("itxn_begin; int 7; itxn_field Receiver;"), ep, "not an address") + TestApp(t, "itxn_begin; byte \"\"; itxn_field CloseRemainderTo;", ep, "not an address") + TestApp(t, "itxn_begin; byte \"\"; itxn_field AssetSender;", ep, "not an address") // can't really tell if it's an addres, so 32 bytes gets further - testApp(t, "itxn_begin; byte \"01234567890123456789012345678901\"; itxn_field AssetReceiver;", + TestApp(t, "itxn_begin; byte \"01234567890123456789012345678901\"; itxn_field AssetReceiver;", ep, "invalid Account reference") // but a b32 string rep is not an account - testApp(t, "itxn_begin; byte \"GAYTEMZUGU3DOOBZGAYTEMZUGU3DOOBZGAYTEMZUGU3DOOBZGAYZIZD42E\"; itxn_field AssetCloseTo;", + TestApp(t, "itxn_begin; byte \"GAYTEMZUGU3DOOBZGAYTEMZUGU3DOOBZGAYTEMZUGU3DOOBZGAYZIZD42E\"; itxn_field AssetCloseTo;", ep, "not an address") - testApp(t, obfuscate("itxn_begin; byte \"pay\"; itxn_field Fee;"), ep, "not a uint64") - testApp(t, obfuscate("itxn_begin; byte 0x01; itxn_field Amount;"), ep, "not a uint64") - testApp(t, obfuscate("itxn_begin; byte 0x01; itxn_field XferAsset;"), ep, "not a uint64") - testApp(t, obfuscate("itxn_begin; byte 0x01; itxn_field AssetAmount;"), ep, "not a uint64") + TestApp(t, Obfuscate("itxn_begin; byte \"pay\"; itxn_field Fee;"), ep, "not a uint64") + TestApp(t, Obfuscate("itxn_begin; byte 0x01; itxn_field Amount;"), ep, "not a uint64") + TestApp(t, Obfuscate("itxn_begin; byte 0x01; itxn_field XferAsset;"), ep, "not a uint64") + TestApp(t, Obfuscate("itxn_begin; byte 0x01; itxn_field AssetAmount;"), ep, "not a uint64") } +func appAddr(id int) basics.Address { + return basics.AppIndex(id).Address() +} + func TestAppPay(t *testing.T) { + partitiontest.PartitionTest(t) + pay := ` itxn_begin itxn_field Amount @@ -114,25 +136,25 @@ func TestAppPay(t *testing.T) { int 1 ` - ep, ledger := makeSampleEnv() - ledger.NewApp(ep.Txn.Txn.Receiver, 888, basics.AppParams{}) - testApp(t, "txn Sender; balance; int 0; ==;", ep) - testApp(t, "txn Sender; txn Accounts 1; int 100"+pay, ep, "unauthorized") - testApp(t, "global CurrentApplicationAddress; txn Accounts 1; int 100"+pay, ep, + ep, tx, ledger := MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + TestApp(t, "txn Sender; balance; int 0; ==;", ep) + TestApp(t, "txn Sender; txn Accounts 1; int 100"+pay, ep, "unauthorized") + TestApp(t, "global CurrentApplicationAddress; txn Accounts 1; int 100"+pay, ep, "insufficient balance") - ledger.NewAccount(ledger.ApplicationID().Address(), 1000000) + ledger.NewAccount(appAddr(888), 1000000) - // You might expect this to fail because of min balance issue + // You might NewExpect this to fail because of min balance issue // (receiving account only gets 100 microalgos). It does not fail at // this level, instead, we must be certain that the existing min // balance check in eval.transaction() properly notices and fails // the transaction later. This fits with the model that we check // min balances once at the end of each "top-level" transaction. - testApp(t, "global CurrentApplicationAddress; txn Accounts 1; int 100"+pay, ep) + TestApp(t, "global CurrentApplicationAddress; txn Accounts 1; int 100"+pay, ep) // 100 of 1000000 spent, plus MinTxnFee in our fake protocol is 1001 - testApp(t, "global CurrentApplicationAddress; balance; int 998899; ==", ep) - testApp(t, "txn Receiver; balance; int 100; ==", ep) + TestApp(t, "global CurrentApplicationAddress; balance; int 998899; ==", ep) + TestApp(t, "txn Receiver; balance; int 100; ==", ep) close := ` itxn_begin @@ -141,16 +163,18 @@ func TestAppPay(t *testing.T) { itxn_submit int 1 ` - testApp(t, close, ep) - testApp(t, "global CurrentApplicationAddress; balance; !", ep) + TestApp(t, close, ep) + TestApp(t, "global CurrentApplicationAddress; balance; !", ep) // Receiver got most of the algos (except 1001 for fee) - testApp(t, "txn Receiver; balance; int 997998; ==", ep) + TestApp(t, "txn Receiver; balance; int 997998; ==", ep) } func TestAppAssetOptIn(t *testing.T) { - ep, ledger := makeSampleEnv() + partitiontest.PartitionTest(t) + + ep, tx, ledger := MakeSampleEnv() // Establish 888 as the app id, and fund it. - ledger.NewApp(ep.Txn.Txn.Receiver, 888, basics.AppParams{}) + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) ledger.NewAccount(basics.AppIndex(888).Address(), 200000) axfer := ` @@ -162,9 +186,9 @@ txn Sender; itxn_field AssetReceiver; itxn_submit int 1 ` - testApp(t, axfer, ep, "invalid Asset reference") - ep.Txn.Txn.ForeignAssets = append(ep.Txn.Txn.ForeignAssets, 25) - testApp(t, axfer, ep, "not opted in") // app account not opted in + TestApp(t, axfer, ep, "invalid Asset reference") + tx.ForeignAssets = append(tx.ForeignAssets, 25) + TestApp(t, axfer, ep, "not opted in") // app account not opted in optin := ` itxn_begin int axfer; itxn_field TypeEnum; @@ -174,23 +198,23 @@ global CurrentApplicationAddress; itxn_field AssetReceiver; itxn_submit int 1 ` - testApp(t, optin, ep, "does not exist") + TestApp(t, optin, ep, "does not exist") // Asset 25 - ledger.NewAsset(ep.Txn.Txn.Sender, 25, basics.AssetParams{ + ledger.NewAsset(tx.Sender, 25, basics.AssetParams{ Total: 10, UnitName: "x", AssetName: "Cross", }) - testApp(t, optin, ep) + TestApp(t, optin, ep) - testApp(t, axfer, ep, "insufficient balance") // opted in, but balance=0 + TestApp(t, axfer, ep, "insufficient balance") // opted in, but balance=0 // Fund the app account with the asset ledger.NewHolding(basics.AppIndex(888).Address(), 25, 5, false) - testApp(t, axfer, ep) - testApp(t, axfer, ep) - testApp(t, axfer, ep, "insufficient balance") // balance = 1, tried to move 2) - testApp(t, "global CurrentApplicationAddress; int 25; asset_holding_get AssetBalance; assert; int 1; ==", ep) + TestApp(t, axfer, ep) + TestApp(t, axfer, ep) + TestApp(t, axfer, ep, "insufficient balance") // balance = 1, tried to move 2) + TestApp(t, "global CurrentApplicationAddress; int 25; asset_holding_get AssetBalance; assert; int 1; ==", ep) close := ` itxn_begin @@ -202,11 +226,13 @@ txn Sender; itxn_field AssetCloseTo; itxn_submit int 1 ` - testApp(t, close, ep) - testApp(t, "global CurrentApplicationAddress; int 25; asset_holding_get AssetBalance; !; assert; !", ep) + TestApp(t, close, ep) + TestApp(t, "global CurrentApplicationAddress; int 25; asset_holding_get AssetBalance; !; assert; !", ep) } func TestRekeyPay(t *testing.T) { + partitiontest.PartitionTest(t) + pay := ` itxn_begin itxn_field Amount @@ -217,19 +243,21 @@ func TestRekeyPay(t *testing.T) { itxn_submit ` - ep, ledger := makeSampleEnv() - ledger.NewApp(ep.Txn.Txn.Receiver, 888, basics.AppParams{}) - testApp(t, "txn Sender; balance; int 0; ==;", ep) - testApp(t, "txn Sender; txn Accounts 1; int 100"+pay, ep, "unauthorized") - ledger.NewAccount(ep.Txn.Txn.Sender, 120+ep.Proto.MinTxnFee) - ledger.Rekey(ep.Txn.Txn.Sender, basics.AppIndex(888).Address()) - testApp(t, "txn Sender; txn Accounts 1; int 100"+pay+"; int 1", ep) + ep, tx, ledger := MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + TestApp(t, "txn Sender; balance; int 0; ==;", ep) + TestApp(t, "txn Sender; txn Accounts 1; int 100"+pay, ep, "unauthorized") + ledger.NewAccount(tx.Sender, 120+ep.Proto.MinTxnFee) + ledger.Rekey(tx.Sender, basics.AppIndex(888).Address()) + TestApp(t, "txn Sender; txn Accounts 1; int 100"+pay+"; int 1", ep) // Note that the Sender would fail min balance check if we did it here. // It seems proper to wait until end of txn though. // See explanation in logicLedger's Perform() } func TestRekeyBack(t *testing.T) { + partitiontest.PartitionTest(t) + payAndUnkey := ` itxn_begin itxn_field Amount @@ -242,18 +270,20 @@ func TestRekeyBack(t *testing.T) { itxn_submit ` - ep, ledger := makeSampleEnv() - ledger.NewApp(ep.Txn.Txn.Receiver, 888, basics.AppParams{}) - testApp(t, "txn Sender; balance; int 0; ==;", ep) - testApp(t, "txn Sender; txn Accounts 1; int 100"+payAndUnkey, ep, "unauthorized") - ledger.NewAccount(ep.Txn.Txn.Sender, 120+3*ep.Proto.MinTxnFee) - ledger.Rekey(ep.Txn.Txn.Sender, basics.AppIndex(888).Address()) - testApp(t, "txn Sender; txn Accounts 1; int 100"+payAndUnkey+"; int 1", ep) + ep, tx, ledger := MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + TestApp(t, "txn Sender; balance; int 0; ==;", ep) + TestApp(t, "txn Sender; txn Accounts 1; int 100"+payAndUnkey, ep, "unauthorized") + ledger.NewAccount(tx.Sender, 120+3*ep.Proto.MinTxnFee) + ledger.Rekey(tx.Sender, basics.AppIndex(888).Address()) + TestApp(t, "txn Sender; txn Accounts 1; int 100"+payAndUnkey+"; int 1", ep) // now rekeyed back to original - testApp(t, "txn Sender; txn Accounts 1; int 100"+payAndUnkey, ep, "unauthorized") + TestApp(t, "txn Sender; txn Accounts 1; int 100"+payAndUnkey, ep, "unauthorized") } func TestDefaultSender(t *testing.T) { + partitiontest.PartitionTest(t) + pay := ` itxn_begin itxn_field Amount @@ -263,16 +293,18 @@ func TestDefaultSender(t *testing.T) { itxn_submit ` - ep, ledger := makeSampleEnv() - ledger.NewApp(ep.Txn.Txn.Receiver, 888, basics.AppParams{}) - ep.Txn.Txn.Accounts = append(ep.Txn.Txn.Accounts, ledger.ApplicationID().Address()) - testApp(t, "txn Accounts 1; int 100"+pay, ep, "insufficient balance") - ledger.NewAccount(ledger.ApplicationID().Address(), 1000000) - testApp(t, "txn Accounts 1; int 100"+pay+"int 1", ep) - testApp(t, "global CurrentApplicationAddress; balance; int 998899; ==", ep) + ep, tx, ledger := MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + tx.Accounts = append(tx.Accounts, appAddr(888)) + TestApp(t, "txn Accounts 1; int 100"+pay, ep, "insufficient balance") + ledger.NewAccount(appAddr(888), 1000000) + TestApp(t, "txn Accounts 1; int 100"+pay+"int 1", ep) + TestApp(t, "global CurrentApplicationAddress; balance; int 998899; ==", ep) } func TestAppAxfer(t *testing.T) { + partitiontest.PartitionTest(t) + axfer := ` itxn_begin int 77 @@ -285,34 +317,34 @@ func TestAppAxfer(t *testing.T) { itxn_submit ` - ep, ledger := makeSampleEnv() - ledger.NewApp(ep.Txn.Txn.Receiver, 888, basics.AppParams{}) - ledger.NewAsset(ep.Txn.Txn.Receiver, 777, basics.AssetParams{}) // not in foreign-assets of sample - ledger.NewAsset(ep.Txn.Txn.Receiver, 77, basics.AssetParams{}) // in foreign-assets of sample - testApp(t, "txn Sender; int 777; asset_holding_get AssetBalance; assert; int 0; ==;", ep, + ep, tx, ledger := MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAsset(tx.Receiver, 777, basics.AssetParams{}) // not in foreign-assets of sample + ledger.NewAsset(tx.Receiver, 77, basics.AssetParams{}) // in foreign-assets of sample + TestApp(t, "txn Sender; int 777; asset_holding_get AssetBalance; assert; int 0; ==;", ep, "invalid Asset reference") // 777 not in foreign-assets - testApp(t, "txn Sender; int 77; asset_holding_get AssetBalance; assert; int 0; ==;", ep, + TestApp(t, "txn Sender; int 77; asset_holding_get AssetBalance; assert; int 0; ==;", ep, "assert failed") // because Sender not opted-in - testApp(t, "global CurrentApplicationAddress; int 77; asset_holding_get AssetBalance; assert; int 0; ==;", ep, + TestApp(t, "global CurrentApplicationAddress; int 77; asset_holding_get AssetBalance; assert; int 0; ==;", ep, "assert failed") // app account not opted in - ledger.NewAccount(ledger.ApplicationID().Address(), 10000) // plenty for fees - ledger.NewHolding(ledger.ApplicationID().Address(), 77, 3000, false) - testApp(t, "global CurrentApplicationAddress; int 77; asset_holding_get AssetBalance; assert; int 3000; ==;", ep) + ledger.NewAccount(appAddr(888), 10000) // plenty for fees + ledger.NewHolding(appAddr(888), 77, 3000, false) + TestApp(t, "global CurrentApplicationAddress; int 77; asset_holding_get AssetBalance; assert; int 3000; ==;", ep) - testApp(t, "txn Sender; txn Accounts 1; int 100"+axfer, ep, "unauthorized") - testApp(t, "global CurrentApplicationAddress; txn Accounts 0; int 100"+axfer, ep, - fmt.Sprintf("Receiver (%s) not opted in", ep.Txn.Txn.Sender)) // txn.Sender (receiver of the axfer) isn't opted in - testApp(t, "global CurrentApplicationAddress; txn Accounts 1; int 100000"+axfer, ep, + TestApp(t, "txn Sender; txn Accounts 1; int 100"+axfer, ep, "unauthorized") + TestApp(t, "global CurrentApplicationAddress; txn Accounts 0; int 100"+axfer, ep, + fmt.Sprintf("Receiver (%s) not opted in", tx.Sender)) // txn.Sender (receiver of the axfer) isn't opted in + TestApp(t, "global CurrentApplicationAddress; txn Accounts 1; int 100000"+axfer, ep, "insufficient balance") // Temporarily remove from ForeignAssets to ensure App Account // doesn't get some sort of free pass to send arbitrary assets. - save := ep.Txn.Txn.ForeignAssets - ep.Txn.Txn.ForeignAssets = []basics.AssetIndex{6, 10} - testApp(t, "global CurrentApplicationAddress; txn Accounts 1; int 100000"+axfer, ep, + save := tx.ForeignAssets + tx.ForeignAssets = []basics.AssetIndex{6, 10} + TestApp(t, "global CurrentApplicationAddress; txn Accounts 1; int 100000"+axfer, ep, "invalid Asset reference 77") - ep.Txn.Txn.ForeignAssets = save + tx.ForeignAssets = save noid := ` itxn_begin @@ -323,17 +355,19 @@ func TestAppAxfer(t *testing.T) { itxn_field TypeEnum itxn_submit ` - testApp(t, "global CurrentApplicationAddress; txn Accounts 1; int 100"+noid+"int 1", ep, - fmt.Sprintf("Sender (%s) not opted in to 0", ledger.ApplicationID().Address())) + TestApp(t, "global CurrentApplicationAddress; txn Accounts 1; int 100"+noid+"int 1", ep, + fmt.Sprintf("Sender (%s) not opted in to 0", appAddr(888))) - testApp(t, "global CurrentApplicationAddress; txn Accounts 1; int 100"+axfer+"int 1", ep) + TestApp(t, "global CurrentApplicationAddress; txn Accounts 1; int 100"+axfer+"int 1", ep) // 100 of 3000 spent - testApp(t, "global CurrentApplicationAddress; int 77; asset_holding_get AssetBalance; assert; int 2900; ==", ep) - testApp(t, "txn Accounts 1; int 77; asset_holding_get AssetBalance; assert; int 100; ==", ep) + TestApp(t, "global CurrentApplicationAddress; int 77; asset_holding_get AssetBalance; assert; int 2900; ==", ep) + TestApp(t, "txn Accounts 1; int 77; asset_holding_get AssetBalance; assert; int 100; ==", ep) } func TestExtraFields(t *testing.T) { + partitiontest.PartitionTest(t) + pay := ` itxn_begin int 7; itxn_field AssetAmount; @@ -345,15 +379,17 @@ func TestExtraFields(t *testing.T) { itxn_submit ` - ep, ledger := makeSampleEnv() - ledger.NewApp(ep.Txn.Txn.Receiver, 888, basics.AppParams{}) - testApp(t, "txn Sender; balance; int 0; ==;", ep) - testApp(t, "txn Sender; txn Accounts 1; int 100"+pay, ep, "unauthorized") - testApp(t, "global CurrentApplicationAddress; txn Accounts 1; int 100"+pay, ep, + ep, tx, ledger := MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + TestApp(t, "txn Sender; balance; int 0; ==;", ep) + TestApp(t, "txn Sender; txn Accounts 1; int 100"+pay, ep, "unauthorized") + TestApp(t, "global CurrentApplicationAddress; txn Accounts 1; int 100"+pay, ep, "non-zero fields for type axfer") } func TestBadFieldV5(t *testing.T) { + partitiontest.PartitionTest(t) + pay := ` itxn_begin int 7; itxn_field AssetAmount; @@ -363,17 +399,21 @@ func TestBadFieldV5(t *testing.T) { int pay itxn_field TypeEnum txn Receiver - itxn_field RekeyTo // NOT ALLOWED + itxn_field Sender // Will be changed to RekeyTo itxn_submit ` - ep, ledger := makeSampleEnvWithVersion(5) - ledger.NewApp(ep.Txn.Txn.Receiver, 888, basics.AppParams{}) - testApp(t, "global CurrentApplicationAddress; txn Accounts 1; int 100"+pay, ep, - "invalid itxn_field RekeyTo") + ep, tx, ledger := MakeSampleEnvWithVersion(5) + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + // Assemble a good program, then change the field to a bad one + ops := TestProg(t, "global CurrentApplicationAddress; txn Accounts 1; int 100"+pay, 5) + ops.Program[len(ops.Program)-2] = byte(RekeyTo) + TestAppBytes(t, ops.Program, ep, "invalid itxn_field RekeyTo") } func TestBadField(t *testing.T) { + partitiontest.PartitionTest(t) + pay := ` itxn_begin int 7; itxn_field AssetAmount; @@ -383,19 +423,22 @@ func TestBadField(t *testing.T) { int pay itxn_field TypeEnum txn Receiver - itxn_field RekeyTo // ALLOWED, since v6 + itxn_field RekeyTo // ALLOWED, since v6 int 10 - itxn_field FirstValid // NOT ALLOWED + itxn_field Amount // Will be changed to FirstValid itxn_submit ` - ep, ledger := makeSampleEnv() - ledger.NewApp(ep.Txn.Txn.Receiver, 888, basics.AppParams{}) - testApp(t, "global CurrentApplicationAddress; txn Accounts 1; int 100"+pay, ep, - "invalid itxn_field FirstValid") + ep, tx, ledger := MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ops := TestProg(t, "global CurrentApplicationAddress; txn Accounts 1; int 100"+pay, AssemblerMaxVersion) + ops.Program[len(ops.Program)-2] = byte(FirstValid) + TestAppBytes(t, ops.Program, ep, "invalid itxn_field FirstValid") } -func TestNumInner(t *testing.T) { +func TestNumInnerShallow(t *testing.T) { + partitiontest.PartitionTest(t) + pay := ` itxn_begin int 1 @@ -407,18 +450,75 @@ func TestNumInner(t *testing.T) { itxn_submit ` - ep, ledger := makeSampleEnv() - ledger.NewApp(ep.Txn.Txn.Receiver, 888, basics.AppParams{}) - ledger.NewAccount(ledger.ApplicationID().Address(), 1000000) - testApp(t, pay+";int 1", ep) - testApp(t, pay+pay+";int 1", ep) - testApp(t, pay+pay+pay+";int 1", ep) - testApp(t, pay+pay+pay+pay+";int 1", ep) + ep, tx, ledger := MakeSampleEnv() + ep.Proto.EnableInnerTransactionPooling = false + ep.Reset() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 1000000) + TestApp(t, pay+";int 1", ep) + TestApp(t, pay+pay+";int 1", ep) + TestApp(t, pay+pay+pay+";int 1", ep) + TestApp(t, pay+pay+pay+pay+";int 1", ep) // In the sample proto, MaxInnerTransactions = 4 - testApp(t, pay+pay+pay+pay+pay+";int 1", ep, "too many inner transactions") + TestApp(t, pay+pay+pay+pay+pay+";int 1", ep, "too many inner transactions") + + ep, tx, ledger = MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 1000000) + TestApp(t, pay+";int 1", ep) + TestApp(t, pay+pay+";int 1", ep) + TestApp(t, pay+pay+pay+";int 1", ep) + TestApp(t, pay+pay+pay+pay+";int 1", ep) + // In the sample proto, MaxInnerTransactions = 4, but when pooling you get + // MaxTxGroupSize (here, 8) * that. + TestApp(t, pay+pay+pay+pay+pay+";int 1", ep) + TestApp(t, strings.Repeat(pay, 32)+";int 1", ep) + TestApp(t, strings.Repeat(pay, 33)+";int 1", ep, "too many inner transactions") +} + +// TestNumInnerPooled ensures that inner call limits are pooled across app calls +// in a group. +func TestNumInnerPooled(t *testing.T) { + partitiontest.PartitionTest(t) + + pay := ` + itxn_begin + int 1 + itxn_field Amount + txn Accounts 0 + itxn_field Receiver + int pay + itxn_field TypeEnum + itxn_submit +` + + tx := txntest.Txn{ + Type: protocol.ApplicationCallTx, + }.SignedTxn() + ledger := MakeLedger(nil) + ledger.NewApp(tx.Txn.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 1000000) + short := pay + ";int 1" + long := strings.Repeat(pay, 17) + ";int 1" // More than half allowed + + grp := MakeSampleTxnGroup(tx) + TestApps(t, []string{short, ""}, grp, LogicVersion, ledger) + TestApps(t, []string{short, short}, grp, LogicVersion, ledger) + TestApps(t, []string{long, ""}, grp, LogicVersion, ledger) + TestApps(t, []string{short, long}, grp, LogicVersion, ledger) + TestApps(t, []string{long, short}, grp, LogicVersion, ledger) + TestApps(t, []string{long, long}, grp, LogicVersion, ledger, + NewExpect(1, "too many inner transactions")) + grp = append(grp, grp[0]) + TestApps(t, []string{short, long, long}, grp, LogicVersion, ledger, + NewExpect(2, "too many inner transactions")) + TestApps(t, []string{long, long, long}, grp, LogicVersion, ledger, + NewExpect(1, "too many inner transactions")) } func TestAssetCreate(t *testing.T) { + partitiontest.PartitionTest(t) + create := ` itxn_begin int acfg @@ -436,15 +536,17 @@ func TestAssetCreate(t *testing.T) { itxn_submit int 1 ` - ep, ledger := makeSampleEnv() - ledger.NewApp(ep.Txn.Txn.Receiver, 888, basics.AppParams{}) - testApp(t, create, ep, "insufficient balance") + ep, tx, ledger := MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + TestApp(t, create, ep, "insufficient balance") // Give it enough for fee. Recall that we don't check min balance at this level. - ledger.NewAccount(ledger.ApplicationID().Address(), defaultEvalProto().MinTxnFee) - testApp(t, create, ep) + ledger.NewAccount(appAddr(888), MakeTestProto().MinTxnFee) + TestApp(t, create, ep) } func TestAssetFreeze(t *testing.T) { + partitiontest.PartitionTest(t) + create := ` itxn_begin int acfg ; itxn_field TypeEnum @@ -456,106 +558,266 @@ func TestAssetFreeze(t *testing.T) { global CurrentApplicationAddress ; itxn_field ConfigAssetFreeze; itxn_submit itxn CreatedAssetID - int 889 + int 5000 == ` - ep, ledger := makeSampleEnv() - ledger.NewApp(ep.Txn.Txn.Receiver, 888, basics.AppParams{}) + ep, tx, ledger := MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) // Give it enough for fees. Recall that we don't check min balance at this level. - ledger.NewAccount(ledger.ApplicationID().Address(), 12*defaultEvalProto().MinTxnFee) - testApp(t, create, ep) + ledger.NewAccount(appAddr(888), 12*MakeTestProto().MinTxnFee) + TestApp(t, create, ep) freeze := ` itxn_begin int afrz ; itxn_field TypeEnum - int 889 ; itxn_field FreezeAsset + int 5000 ; itxn_field FreezeAsset txn ApplicationArgs 0; btoi ; itxn_field FreezeAssetFrozen txn Accounts 1 ; itxn_field FreezeAssetAccount itxn_submit int 1 ` - testApp(t, freeze, ep, "invalid Asset reference") - ep.Txn.Txn.ForeignAssets = []basics.AssetIndex{basics.AssetIndex(889)} - ep.Txn.Txn.ApplicationArgs = [][]byte{{0x01}} - testApp(t, freeze, ep, "does not hold Asset") - ledger.NewHolding(ep.Txn.Txn.Receiver, 889, 55, false) - testApp(t, freeze, ep) - holding, err := ledger.AssetHolding(ep.Txn.Txn.Receiver, 889) + TestApp(t, freeze, ep, "invalid Asset reference") + tx.ForeignAssets = []basics.AssetIndex{basics.AssetIndex(5000)} + tx.ApplicationArgs = [][]byte{{0x01}} + TestApp(t, freeze, ep, "does not hold Asset") + ledger.NewHolding(tx.Receiver, 5000, 55, false) + TestApp(t, freeze, ep) + holding, err := ledger.AssetHolding(tx.Receiver, 5000) require.NoError(t, err) require.Equal(t, true, holding.Frozen) - ep.Txn.Txn.ApplicationArgs = [][]byte{{0x00}} - testApp(t, freeze, ep) - holding, err = ledger.AssetHolding(ep.Txn.Txn.Receiver, 889) + tx.ApplicationArgs = [][]byte{{0x00}} + TestApp(t, freeze, ep) + holding, err = ledger.AssetHolding(tx.Receiver, 5000) require.NoError(t, err) require.Equal(t, false, holding.Frozen) } +func TestKeyReg(t *testing.T) { + partitiontest.PartitionTest(t) + + keyreg := ` + store 6 // StateProofPK + store 5 // SelectionPK + store 4 // VotePK + store 3 // Nonparticipation + store 2 // VoteKeyDilution + store 1 // VoteLast + store 0 // VoteFirst + + itxn_begin + global CurrentApplicationAddress; itxn_field Sender + int keyreg; itxn_field TypeEnum + load 0; itxn_field VoteFirst + load 1; itxn_field VoteLast + load 2; itxn_field VoteKeyDilution + load 3; itxn_field Nonparticipation + load 4; itxn_field VotePK + load 5; itxn_field SelectionPK + load 6; itxn_field StateProofPK + itxn_submit + + itxn TypeEnum + int keyreg + == + itxn VoteFirst + load 0 + == + && + itxn VoteLast + load 1 + == + && + itxn VoteKeyDilution + load 2 + == + && + itxn Nonparticipation + load 3 + == + && + itxn VotePK + load 4 + == + && + itxn SelectionPK + load 5 + == + && + itxn StateProofPK + load 6 + == + && +` + + t.Run("nonparticipating", func(t *testing.T) { + params := ` + int 0 // VoteFirst + int 0 // VoteLast + int 0 // VoteKeyDilution + int 1 // Nonparticipation + int 32; bzero // VotePK + int 32; bzero // SelectionPK + int 64; bzero // StateProofPK +` + ep, tx, ledger := MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), ep.Proto.MinTxnFee) + TestApp(t, params+keyreg, ep) + }) + + t.Run("offline", func(t *testing.T) { + params := ` + int 0 // VoteFirst + int 0 // VoteLast + int 0 // VoteKeyDilution + int 0 // Nonparticipation + int 32; bzero // VotePK + int 32; bzero // SelectionPK + int 64; bzero // StateProofPK +` + ep, tx, ledger := MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), ep.Proto.MinTxnFee) + TestApp(t, params+keyreg, ep) + }) + + t.Run("online without StateProofPK", func(t *testing.T) { + params := ` + int 100 // VoteFirst + int 200 // VoteLast + int 10 // VoteKeyDilution + int 0 // Nonparticipation + int 32; bzero; int 0; int 1; setbyte // VotePK + int 32; bzero; int 0; int 2; setbyte // SelectionPK + int 64; bzero // StateProofPK +` + ep, tx, ledger := MakeSampleEnv() + ep.Proto.EnableStateProofKeyregCheck = false + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), ep.Proto.MinTxnFee) + TestApp(t, params+keyreg, ep) + }) + + t.Run("online with StateProofPK", func(t *testing.T) { + params := ` + int 100 // VoteFirst + int 16777315 // VoteLast + int 10 // VoteKeyDilution + int 0 // Nonparticipation + int 32; bzero; int 0; int 1; setbyte // VotePK + int 32; bzero; int 0; int 2; setbyte // SelectionPK + int 64; bzero; int 0; int 3; setbyte // StateProofPK +` + ep, tx, ledger := MakeSampleEnv() + ep.Proto.EnableStateProofKeyregCheck = true + ep.Proto.MaxKeyregValidPeriod = ((1 << 16) * 256) - 1 // 2^16 StateProof keys times CompactCertRounds (interval) + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), ep.Proto.MinTxnFee) + TestApp(t, params+keyreg, ep) + }) + + t.Run("online with StateProofPK and too long validity period", func(t *testing.T) { + params := ` + int 100 // VoteFirst + int 16777316 // VoteLast + int 10 // VoteKeyDilution + int 0 // Nonparticipation + int 32; bzero; int 0; int 1; setbyte // VotePK + int 32; bzero; int 0; int 2; setbyte // SelectionPK + int 64; bzero; int 0; int 3; setbyte // StateProofPK +` + ep, tx, ledger := MakeSampleEnv() + ep.Proto.EnableStateProofKeyregCheck = true + ep.Proto.MaxKeyregValidPeriod = ((1 << 16) * 256) - 1 // 2^16 StateProof keys times CompactCertRounds (interval) + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), ep.Proto.MinTxnFee) + TestApp(t, params+keyreg, ep, "validity period for keyreg transaction is too long") // VoteLast is +1 over the limit + }) +} + func TestFieldSetting(t *testing.T) { - ep, ledger := makeSampleEnv() - ledger.NewApp(ep.Txn.Txn.Receiver, 888, basics.AppParams{}) - ledger.NewAccount(ledger.ApplicationID().Address(), 10*defaultEvalProto().MinTxnFee) - testApp(t, "itxn_begin; int 500; bzero; itxn_field Note; int 1", ep) - testApp(t, "itxn_begin; int 501; bzero; itxn_field Note; int 1", ep, + partitiontest.PartitionTest(t) + + ep, tx, ledger := MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 10*MakeTestProto().MinTxnFee) + TestApp(t, "itxn_begin; int 500; bzero; itxn_field Note; int 1", ep) + TestApp(t, "itxn_begin; int 501; bzero; itxn_field Note; int 1", ep, "Note may not exceed") - testApp(t, "itxn_begin; int 32; bzero; itxn_field VotePK; int 1", ep) - testApp(t, "itxn_begin; int 31; bzero; itxn_field VotePK; int 1", ep, + TestApp(t, "itxn_begin; int 32; bzero; itxn_field VotePK; int 1", ep) + TestApp(t, "itxn_begin; int 31; bzero; itxn_field VotePK; int 1", ep, "VotePK must be 32") - testApp(t, "itxn_begin; int 32; bzero; itxn_field SelectionPK; int 1", ep) - testApp(t, "itxn_begin; int 33; bzero; itxn_field SelectionPK; int 1", ep, + TestApp(t, "itxn_begin; int 32; bzero; itxn_field SelectionPK; int 1", ep) + TestApp(t, "itxn_begin; int 33; bzero; itxn_field SelectionPK; int 1", ep, "SelectionPK must be 32") - testApp(t, "itxn_begin; int 32; bzero; itxn_field RekeyTo; int 1", ep) - testApp(t, "itxn_begin; int 31; bzero; itxn_field RekeyTo; int 1", ep, + TestApp(t, "itxn_begin; int 64; bzero; itxn_field StateProofPK; int 1", ep) + TestApp(t, "itxn_begin; int 63; bzero; itxn_field StateProofPK; int 1", ep, + "StateProofPK must be 64") + TestApp(t, "itxn_begin; int 65; bzero; itxn_field StateProofPK; int 1", ep, + "StateProofPK must be 64") + + TestApp(t, "itxn_begin; int 0; itxn_field Nonparticipation; int 1", ep) + TestApp(t, "itxn_begin; int 1; itxn_field Nonparticipation; int 1", ep) + TestApp(t, "itxn_begin; int 2; itxn_field Nonparticipation; int 1", ep, + "boolean is neither 1 nor 0") + + TestApp(t, "itxn_begin; int 32; bzero; itxn_field RekeyTo; int 1", ep) + TestApp(t, "itxn_begin; int 31; bzero; itxn_field RekeyTo; int 1", ep, "not an address") - testApp(t, "itxn_begin; int 6; bzero; itxn_field ConfigAssetUnitName; int 1", ep) - testApp(t, "itxn_begin; int 7; bzero; itxn_field ConfigAssetUnitName; int 1", ep, + TestApp(t, "itxn_begin; int 6; bzero; itxn_field ConfigAssetUnitName; int 1", ep) + TestApp(t, "itxn_begin; int 7; bzero; itxn_field ConfigAssetUnitName; int 1", ep, "value is too long") - testApp(t, "itxn_begin; int 12; bzero; itxn_field ConfigAssetName; int 1", ep) - testApp(t, "itxn_begin; int 13; bzero; itxn_field ConfigAssetName; int 1", ep, + TestApp(t, "itxn_begin; int 12; bzero; itxn_field ConfigAssetName; int 1", ep) + TestApp(t, "itxn_begin; int 13; bzero; itxn_field ConfigAssetName; int 1", ep, "value is too long") } func TestInnerGroup(t *testing.T) { - ep, ledger := makeSampleEnv() - ledger.NewApp(ep.Txn.Txn.Receiver, 888, basics.AppParams{}) + partitiontest.PartitionTest(t) + + ep, tx, ledger := MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) // Need both fees and both payments - ledger.NewAccount(ledger.ApplicationID().Address(), 999+2*defaultEvalProto().MinTxnFee) + ledger.NewAccount(appAddr(888), 999+2*MakeTestProto().MinTxnFee) pay := ` int pay; itxn_field TypeEnum; int 500; itxn_field Amount; txn Sender; itxn_field Receiver; ` - testApp(t, "itxn_begin"+pay+"itxn_next"+pay+"itxn_submit; int 1", ep, + TestApp(t, "itxn_begin"+pay+"itxn_next"+pay+"itxn_submit; int 1", ep, "insufficient balance") // NewAccount overwrites the existing balance - ledger.NewAccount(ledger.ApplicationID().Address(), 1000+2*defaultEvalProto().MinTxnFee) - testApp(t, "itxn_begin"+pay+"itxn_next"+pay+"itxn_submit; int 1", ep) + ledger.NewAccount(appAddr(888), 1000+2*MakeTestProto().MinTxnFee) + TestApp(t, "itxn_begin"+pay+"itxn_next"+pay+"itxn_submit; int 1", ep) } func TestInnerFeePooling(t *testing.T) { - ep, ledger := makeSampleEnv() - ledger.NewApp(ep.Txn.Txn.Receiver, 888, basics.AppParams{}) - ledger.NewAccount(ledger.ApplicationID().Address(), 50_000) + partitiontest.PartitionTest(t) + + ep, tx, ledger := MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 50_000) pay := ` int pay; itxn_field TypeEnum; int 500; itxn_field Amount; txn Sender; itxn_field Receiver; ` // Force the first fee to 3, but the second will default to 2*fee-3 = 2002-3 - testApp(t, "itxn_begin"+ + TestApp(t, "itxn_begin"+ pay+ "int 3; itxn_field Fee;"+ "itxn_next"+ pay+ "itxn_submit; itxn Fee; int 1999; ==", ep) - // Same first, but force the second too low - testApp(t, "itxn_begin"+ + // Same as first, but force the second too low + TestApp(t, "itxn_begin"+ pay+ "int 3; itxn_field Fee;"+ "itxn_next"+ @@ -564,7 +826,7 @@ txn Sender; itxn_field Receiver; "itxn_submit; int 1", ep, "fee too small") // Overpay in first itxn, the second will default to less - testApp(t, "itxn_begin"+ + TestApp(t, "itxn_begin"+ pay+ "int 2000; itxn_field Fee;"+ "itxn_next"+ @@ -572,11 +834,1183 @@ txn Sender; itxn_field Receiver; "itxn_submit; itxn Fee; int 2; ==", ep) // Same first, but force the second too low - testApp(t, "itxn_begin"+ + TestApp(t, "itxn_begin"+ pay+ "int 2000; itxn_field Fee;"+ "itxn_next"+ pay+ "int 1; itxn_field Fee;"+ "itxn_submit; itxn Fee; int 1", ep, "fee too small") + + // Test that overpay in first inner group is available in second inner group + // also ensure only exactly the _right_ amount of credit is available. + TestApp(t, "itxn_begin"+ + pay+ + "int 2002; itxn_field Fee;"+ // double pay + "itxn_next"+ + pay+ + "int 1001; itxn_field Fee;"+ // regular pay + "itxn_submit;"+ + // At beginning of second group, we should have 1 minfee of credit + "itxn_begin"+ + pay+ + "int 0; itxn_field Fee;"+ // free, due to credit + "itxn_next"+ + pay+ + "itxn_submit; itxn Fee; int 1001; ==", // second one should have to pay + ep) + +} + +// TestApplCreation is only determining what appl transactions can be +// constructed not what can be submitted, so it tests what "bad" fields cause +// immediate failures. +func TestApplCreation(t *testing.T) { + partitiontest.PartitionTest(t) + + ep, tx, _ := MakeSampleEnv() + + p := "itxn_begin;" + s := "; int 1" + + TestApp(t, p+"int 31; itxn_field ApplicationID"+s, ep, + "invalid App reference") + tx.ForeignApps = append(tx.ForeignApps, 31) + TestApp(t, p+"int 31; itxn_field ApplicationID"+s, ep) + + TestApp(t, p+"int 0; itxn_field OnCompletion"+s, ep) + TestApp(t, p+"int 1; itxn_field OnCompletion"+s, ep) + TestApp(t, p+"int 2; itxn_field OnCompletion"+s, ep) + TestApp(t, p+"int 3; itxn_field OnCompletion"+s, ep) + TestApp(t, p+"int 4; itxn_field OnCompletion"+s, ep) + TestApp(t, p+"int 5; itxn_field OnCompletion"+s, ep) + TestApp(t, p+"int 6; itxn_field OnCompletion"+s, ep, "6 is larger than max=5") + TestApp(t, p+"int NoOp; itxn_field OnCompletion"+s, ep) + TestApp(t, p+"int OptIn; itxn_field OnCompletion"+s, ep) + TestApp(t, p+"int CloseOut; itxn_field OnCompletion"+s, ep) + TestApp(t, p+"int ClearState; itxn_field OnCompletion"+s, ep) + TestApp(t, p+"int UpdateApplication; itxn_field OnCompletion"+s, ep) + TestApp(t, p+"int DeleteApplication; itxn_field OnCompletion"+s, ep) + + TestApp(t, p+"int 800; bzero; itxn_field ApplicationArgs"+s, ep) + TestApp(t, p+"int 801; bzero; itxn_field ApplicationArgs", ep, + "length too long") + TestApp(t, p+"int 401; bzero; dup; itxn_field ApplicationArgs; itxn_field ApplicationArgs", ep, + "length too long") + + TestApp(t, p+strings.Repeat("byte 0x11; itxn_field ApplicationArgs;", 12)+s, ep) + TestApp(t, p+strings.Repeat("byte 0x11; itxn_field ApplicationArgs;", 13)+s, ep, + "too many application args") + + TestApp(t, p+strings.Repeat("int 32; bzero; itxn_field Accounts;", 3)+s, ep, + "invalid Account reference") + tx.Accounts = append(tx.Accounts, basics.Address{}) + TestApp(t, fmt.Sprintf(p+"%s"+s, + strings.Repeat("int 32; bzero; itxn_field Accounts;", 3)), ep) + TestApp(t, fmt.Sprintf(p+"%s"+s, + strings.Repeat("int 32; bzero; itxn_field Accounts;", 4)), ep, + "too many foreign accounts") + + TestApp(t, p+strings.Repeat("int 621; itxn_field Applications;", 5)+s, ep, + "invalid App reference") + tx.ForeignApps = append(tx.ForeignApps, basics.AppIndex(621)) + TestApp(t, p+strings.Repeat("int 621; itxn_field Applications;", 5)+s, ep) + TestApp(t, p+strings.Repeat("int 621; itxn_field Applications;", 6)+s, ep, + "too many foreign apps") + + TestApp(t, p+strings.Repeat("int 621; itxn_field Assets;", 6)+s, ep, + "invalid Asset reference") + tx.ForeignAssets = append(tx.ForeignAssets, basics.AssetIndex(621)) + TestApp(t, p+strings.Repeat("int 621; itxn_field Assets;", 6)+s, ep) + TestApp(t, p+strings.Repeat("int 621; itxn_field Assets;", 7)+s, ep, + "too many foreign assets") + + TestApp(t, p+"int 2700; bzero; itxn_field ApprovalProgram"+s, ep) + TestApp(t, p+"int 2701; bzero; itxn_field ApprovalProgram"+s, ep, + "may not exceed 2700") + TestApp(t, p+"int 2700; bzero; itxn_field ClearStateProgram"+s, ep) + TestApp(t, p+"int 2701; bzero; itxn_field ClearStateProgram"+s, ep, + "may not exceed 2700") + + TestApp(t, p+"int 30; itxn_field GlobalNumUint"+s, ep) + TestApp(t, p+"int 31; itxn_field GlobalNumUint"+s, ep, "31 is larger than max=30") + TestApp(t, p+"int 30; itxn_field GlobalNumByteSlice"+s, ep) + TestApp(t, p+"int 31; itxn_field GlobalNumByteSlice"+s, ep, "31 is larger than max=30") + TestApp(t, p+"int 20; itxn_field GlobalNumUint; int 11; itxn_field GlobalNumByteSlice"+s, ep) + + TestApp(t, p+"int 13; itxn_field LocalNumUint"+s, ep) + TestApp(t, p+"int 14; itxn_field LocalNumUint"+s, ep, "14 is larger than max=13") + TestApp(t, p+"int 13; itxn_field LocalNumByteSlice"+s, ep) + TestApp(t, p+"int 14; itxn_field LocalNumByteSlice"+s, ep, "14 is larger than max=13") + + TestApp(t, p+"int 2; itxn_field ExtraProgramPages"+s, ep) + TestApp(t, p+"int 3; itxn_field ExtraProgramPages"+s, ep, "3 is larger than max=2") +} + +// TestApplSubmission tests for checking of illegal appl transaction in form +// only. Things where interactions between two different fields causes the +// error. These are not exhaustive, but certainly demonstrate that +// transactions.WellFormed is getting a crack at the txn. +func TestApplSubmission(t *testing.T) { + partitiontest.PartitionTest(t) + + ep, tx, ledger := MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + // Since the fee is moved first, fund the app + ledger.NewAccount(appAddr(888), 50_000) + + ops := TestProg(t, "int 1", AssemblerMaxVersion) + approve := hex.EncodeToString(ops.Program) + a := fmt.Sprintf("byte 0x%s; itxn_field ApprovalProgram;", approve) + + p := "itxn_begin; int appl; itxn_field TypeEnum;" + s := ";itxn_submit; int 1" + TestApp(t, p+a+s, ep, "ClearStateProgram: invalid program (empty)") + + a += fmt.Sprintf("byte 0x%s; itxn_field ClearStateProgram;", approve) + + // All zeros is v0, so we get a complaint, but that means lengths were ok when set. + TestApp(t, p+a+`int 600; bzero; itxn_field ApprovalProgram; + int 600; bzero; itxn_field ClearStateProgram;`+s, ep, + "inner app call with version 0") + + TestApp(t, p+`int 601; bzero; itxn_field ApprovalProgram; + int 600; bzero; itxn_field ClearStateProgram;`+s, ep, "too long") + + // WellFormed does the math based on the supplied ExtraProgramPages + TestApp(t, p+a+`int 1; itxn_field ExtraProgramPages + int 1200; bzero; itxn_field ApprovalProgram; + int 1200; bzero; itxn_field ClearStateProgram;`+s, ep, + "inner app call with version 0") + TestApp(t, p+`int 1; itxn_field ExtraProgramPages + int 1200; bzero; itxn_field ApprovalProgram; + int 1201; bzero; itxn_field ClearStateProgram;`+s, ep, "too long") + + // Can't set epp when app id is given + tx.ForeignApps = append(tx.ForeignApps, basics.AppIndex(7)) + TestApp(t, p+`int 1; itxn_field ExtraProgramPages; + int 7; itxn_field ApplicationID`+s, ep, "immutable") + + TestApp(t, p+a+"int 20; itxn_field GlobalNumUint; int 11; itxn_field GlobalNumByteSlice"+s, + ep, "too large") + TestApp(t, p+a+"int 7; itxn_field LocalNumUint; int 7; itxn_field LocalNumByteSlice"+s, + ep, "too large") +} + +func TestInnerApplCreate(t *testing.T) { + partitiontest.PartitionTest(t) + + ep, tx, ledger := MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 50_000) + + ops := TestProg(t, "int 50", AssemblerMaxVersion) + approve := "byte 0x" + hex.EncodeToString(ops.Program) + + TestApp(t, ` +itxn_begin +int appl; itxn_field TypeEnum +`+approve+`; itxn_field ApprovalProgram +`+approve+`; itxn_field ClearStateProgram +int 1; itxn_field GlobalNumUint +int 2; itxn_field LocalNumByteSlice +int 3; itxn_field LocalNumUint +itxn_submit +int 1 +`, ep) + + TestApp(t, ` +int 5000; app_params_get AppGlobalNumByteSlice; assert; int 0; ==; assert +`, ep, "invalid App reference") + + call := ` +itxn_begin +int appl; itxn_field TypeEnum +int 5000; itxn_field ApplicationID +itxn_submit +int 1 +` + // Can't call it either + TestApp(t, call, ep, "invalid App reference") + + tx.ForeignApps = []basics.AppIndex{basics.AppIndex(5000)} + TestApp(t, ` +int 5000; app_params_get AppGlobalNumByteSlice; assert; int 0; ==; assert +int 5000; app_params_get AppGlobalNumUint; assert; int 1; ==; assert +int 5000; app_params_get AppLocalNumByteSlice; assert; int 2; ==; assert +int 5000; app_params_get AppLocalNumUint; assert; int 3; ==; assert +int 1 +`, ep) + + // Call it (default OnComplete is NoOp) + TestApp(t, call, ep) + + TestApp(t, ` +itxn_begin +int appl; itxn_field TypeEnum +int DeleteApplication; itxn_field OnCompletion +txn Applications 1; itxn_field ApplicationID +itxn_submit +int 1 +`, ep) + + // App is gone + TestApp(t, ` +int 5000; app_params_get AppGlobalNumByteSlice; !; assert; !; assert; int 1 +`, ep) + + // Can't call it either + TestApp(t, call, ep, "no such app 5000") + +} + +func TestCreateOldAppFails(t *testing.T) { + partitiontest.PartitionTest(t) + + ep, tx, ledger := MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 50_000) + + ops := TestProg(t, "int 1", InnerAppsEnabledVersion-1) + old := "byte 0x" + hex.EncodeToString(ops.Program) + + TestApp(t, ` +itxn_begin +int appl; itxn_field TypeEnum +`+old+`; itxn_field ApprovalProgram +`+old+`; itxn_field ClearStateProgram +int 1; itxn_field GlobalNumUint +int 2; itxn_field LocalNumByteSlice +int 3; itxn_field LocalNumUint +itxn_submit +int 1 +`, ep, "inner app call with version 5") + + ops = TestProg(t, "int 1", InnerAppsEnabledVersion) + recent := "byte 0x" + hex.EncodeToString(ops.Program) + + TestApp(t, ` +itxn_begin +int appl; itxn_field TypeEnum +`+recent+`; itxn_field ApprovalProgram +`+recent+`; itxn_field ClearStateProgram +int 1; itxn_field GlobalNumUint +int 2; itxn_field LocalNumByteSlice +int 3; itxn_field LocalNumUint +itxn_submit +int 1 +`, ep) + + TestApp(t, ` +itxn_begin +int appl; itxn_field TypeEnum +`+old+`; itxn_field ApprovalProgram +`+recent+`; itxn_field ClearStateProgram +int 1; itxn_field GlobalNumUint +int 2; itxn_field LocalNumByteSlice +int 3; itxn_field LocalNumUint +itxn_submit +int 1 +`, ep, "program version mismatch") + + TestApp(t, ` +itxn_begin +int appl; itxn_field TypeEnum +`+recent+`; itxn_field ApprovalProgram +`+old+`; itxn_field ClearStateProgram +int 1; itxn_field GlobalNumUint +int 2; itxn_field LocalNumByteSlice +int 3; itxn_field LocalNumUint +itxn_submit +int 1 +`, ep, "program version mismatch") + +} + +func TestSelfReentrancy(t *testing.T) { + partitiontest.PartitionTest(t) + + ep, tx, ledger := MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 50_000) + + TestApp(t, ` +itxn_begin +int appl; itxn_field TypeEnum +int 888; itxn_field ApplicationID +itxn_submit +int 1 +`, ep, "attempt to self-call") +} + +func TestIndirectReentrancy(t *testing.T) { + partitiontest.PartitionTest(t) + + ep, tx, ledger := MakeSampleEnv() + call888 := TestProg(t, `itxn_begin +int appl; itxn_field TypeEnum +int 888; itxn_field ApplicationID +itxn_submit +int 1 +`, AssemblerMaxVersion) + ledger.NewApp(tx.Receiver, 222, basics.AppParams{ + ApprovalProgram: call888.Program, + }) + + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 50_000) + tx.ForeignApps = []basics.AppIndex{basics.AppIndex(222)} + TestApp(t, ` +itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +int 888; itxn_field Applications +itxn_submit +int 1 +`, ep, "attempt to re-enter 888") +} + +// TestInnerAppID ensures that inner app properly sees its AppId. This seems +// needlessly picky to test, but the appID used to be stored outside the cx. +func TestInnerAppID(t *testing.T) { + partitiontest.PartitionTest(t) + + ep, tx, ledger := MakeSampleEnv() + logID := TestProg(t, `global CurrentApplicationID; itob; log; int 1`, AssemblerMaxVersion) + ledger.NewApp(tx.Receiver, 222, basics.AppParams{ + ApprovalProgram: logID.Program, + }) + + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 50_000) + tx.ForeignApps = []basics.AppIndex{basics.AppIndex(222)} + TestApp(t, ` +itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_submit +itxn Logs 0 +btoi +int 222 +== +`, ep) +} + +// TestInnerBudgetIncrement ensures that an app can make a (nearly) empty inner +// app call in order to get 700 extra opcode budget. Unfortunately, it costs a +// bit to create the call, and the app itself consumes 1, so it ends up being +// about 690 (see next test). +func TestInnerBudgetIncrement(t *testing.T) { + partitiontest.PartitionTest(t) + + ep, tx, ledger := MakeSampleEnv() + gasup := TestProg(t, "pushint 1", AssemblerMaxVersion) + ledger.NewApp(tx.Receiver, 222, basics.AppParams{ + ApprovalProgram: gasup.Program, + }) + + waste := `global CurrentApplicationAddress; keccak256; pop;` + buy := `itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_submit; +` + + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 50_000) + tx.ForeignApps = []basics.AppIndex{basics.AppIndex(222)} + TestApp(t, strings.Repeat(waste, 5)+"int 1", ep) + TestApp(t, strings.Repeat(waste, 6)+"int 1", ep, "dynamic cost budget exceeded") + TestApp(t, strings.Repeat(waste, 6)+buy+"int 1", ep, "dynamic cost budget exceeded") + TestApp(t, buy+strings.Repeat(waste, 6)+"int 1", ep) + TestApp(t, buy+strings.Repeat(waste, 10)+"int 1", ep) + TestApp(t, buy+strings.Repeat(waste, 12)+"int 1", ep, "dynamic cost budget exceeded") + TestApp(t, buy+strings.Repeat(waste, 12)+"int 1", ep, "dynamic cost budget exceeded") + TestApp(t, buy+buy+strings.Repeat(waste, 12)+"int 1", ep) +} + +func TestIncrementCheck(t *testing.T) { + partitiontest.PartitionTest(t) + + ep, tx, ledger := MakeSampleEnv() + gasup := TestProg(t, "pushint 1", AssemblerMaxVersion) + ledger.NewApp(tx.Receiver, 222, basics.AppParams{ + ApprovalProgram: gasup.Program, + }) + + source := ` +// 698, not 699, because intcblock happens first +global OpcodeBudget; int 698; ==; assert +// "buy" more +itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_submit; +global OpcodeBudget; int 1387; ==; assert +itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_submit; +global OpcodeBudget; int 2076; ==; assert +int 1 +` + + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 50_000) + tx.ForeignApps = []basics.AppIndex{basics.AppIndex(222)} + TestApp(t, source, ep) +} + +// TestInnerTxIDs confirms that TxIDs are available and different +func TestInnerTxIDs(t *testing.T) { + partitiontest.PartitionTest(t) + + ep, tx, ledger := MakeSampleEnv() + txid := TestProg(t, "txn TxID; log; int 1", AssemblerMaxVersion) + ledger.NewApp(tx.Receiver, 222, basics.AppParams{ + ApprovalProgram: txid.Program, + }) + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 50_000) + tx.ForeignApps = []basics.AppIndex{basics.AppIndex(222)} + TestApp(t, ` +itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_submit; +itxn Logs 0 + +itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_submit; +itxn Logs 0 + +!= +`, ep) +} + +// TestInnerGroupIDs confirms that GroupIDs are unset on size one inner groups, +// but set and unique on non-singletons +func TestInnerGroupIDs(t *testing.T) { + partitiontest.PartitionTest(t) + + ep, tx, ledger := MakeSampleEnv() + gid := TestProg(t, "global GroupID; log; int 1", AssemblerMaxVersion) + ledger.NewApp(tx.Receiver, 222, basics.AppParams{ + ApprovalProgram: gid.Program, + }) + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 50_000) + tx.ForeignApps = []basics.AppIndex{basics.AppIndex(222)} + + // A single txn gets 0 group id + TestApp(t, ` +itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_submit; +itxn Logs 0 +global ZeroAddress +== +`, ep) + + // A double calls gets something else + TestApp(t, ` +itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_next +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_submit; +itxn Logs 0 +global ZeroAddress +!= +`, ep) + + // The "something else" is unique, despite two identical groups + TestApp(t, ` +itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_next +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_submit; +itxn Logs 0 + +itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_next +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_submit; +itxn Logs 0 + +!= +`, ep) +} + +// TestGtixn confirms access to itxn groups +func TestGtixn(t *testing.T) { + partitiontest.PartitionTest(t) + + ep, tx, ledger := MakeSampleEnv() + two := TestProg(t, "byte 0x22; log; int 1", AssemblerMaxVersion) + ledger.NewApp(tx.Receiver, 222, basics.AppParams{ + ApprovalProgram: two.Program, + }) + three := TestProg(t, "byte 0x33; log; int 1", AssemblerMaxVersion) + ledger.NewApp(tx.Receiver, 333, basics.AppParams{ + ApprovalProgram: three.Program, + }) + four := TestProg(t, "byte 0x44; log; int 1", AssemblerMaxVersion) + ledger.NewApp(tx.Receiver, 444, basics.AppParams{ + ApprovalProgram: four.Program, + }) + + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 50_000) + tx.ForeignApps = []basics.AppIndex{basics.AppIndex(222), basics.AppIndex(333), basics.AppIndex(444)} + + TestApp(t, ` +itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_next +int appl; itxn_field TypeEnum +int 333; itxn_field ApplicationID +itxn_submit; +gitxn 0 Logs 0 +byte 0x22 +== +assert + +gitxna 1 Logs 0 +byte 0x33 +== +assert + +int 0 +gitxnas 1 Logs +byte 0x33 +== +assert + +itxn_begin +int appl; itxn_field TypeEnum +int 444; itxn_field ApplicationID +itxn_next +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_submit; + +gitxn 0 Logs 0 +byte 0x44 +== +assert + +gitxn 1 Logs 0 +byte 0x22 +== +assert + +int 1 +`, ep) + + // Confirm that two singletons don't get treated as a group + TestApp(t, ` +itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_submit + +itxn_begin +int appl; itxn_field TypeEnum +int 333; itxn_field ApplicationID +itxn_submit +gitxn 0 Logs 0 +byte 0x33 +== +assert +int 1 +`, ep) +} + +// TestGtxnLog confirms that gtxn can now access previous txn's Logs. +func TestGtxnLog(t *testing.T) { + partitiontest.PartitionTest(t) + + ep, tx, ledger := MakeSampleEnv() + two := TestProg(t, "byte 0x22; log; int 1", AssemblerMaxVersion) + ledger.NewApp(tx.Receiver, 222, basics.AppParams{ + ApprovalProgram: two.Program, + }) + three := TestProg(t, "gtxn 0 NumLogs; int 1; ==; assert; gtxna 0 Logs 0; byte 0x22; ==", AssemblerMaxVersion) + ledger.NewApp(tx.Receiver, 333, basics.AppParams{ + ApprovalProgram: three.Program, + }) + + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 50_000) + tx.ForeignApps = []basics.AppIndex{basics.AppIndex(222), basics.AppIndex(333)} + + TestApp(t, `itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_next +int appl; itxn_field TypeEnum +int 333; itxn_field ApplicationID +itxn_submit +int 1 +`, ep) +} + +// TestGtxnApps confirms that gtxn can now access previous txn's created app id. +func TestGtxnApps(t *testing.T) { + partitiontest.PartitionTest(t) + + ep, tx, ledger := MakeSampleEnv() + appcheck := TestProg(t, ` +gtxn 0 CreatedApplicationID; itob; log; +gtxn 1 CreatedApplicationID; itob; log; +int 1 +`, AssemblerMaxVersion) + ledger.NewApp(tx.Receiver, 222, basics.AppParams{ + ApprovalProgram: appcheck.Program, + }) + + ops := TestProg(t, "int 1", AssemblerMaxVersion) + + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 50_000) + tx.ForeignApps = []basics.AppIndex{basics.AppIndex(222)} + TestApp(t, `itxn_begin +int appl; itxn_field TypeEnum + `+fmt.Sprintf("byte 0x%s", hex.EncodeToString(ops.Program))+` +dup +itxn_field ApprovalProgram; +itxn_field ClearStateProgram; +itxn_next +int appl; itxn_field TypeEnum + `+fmt.Sprintf("byte 0x%s;", hex.EncodeToString(ops.Program))+` +dup +itxn_field ApprovalProgram; +itxn_field ClearStateProgram; +itxn_next +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_submit +itxn Logs 0 +btoi +int 5000 +== +assert +gitxn 2 Logs 1 +btoi +int 5001 +== +`, ep) +} + +// TestGtxnAsa confirms that gtxn can now access previous txn's created asa id. +func TestGtxnAsa(t *testing.T) { + partitiontest.PartitionTest(t) + + ep, tx, ledger := MakeSampleEnv() + appcheck := TestProg(t, ` +gtxn 0 CreatedAssetID; itob; log; +gtxn 1 CreatedAssetID; itob; log; +int 1 +`, AssemblerMaxVersion) + ledger.NewApp(tx.Receiver, 222, basics.AppParams{ + ApprovalProgram: appcheck.Program, + }) + + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 50_000) + tx.ForeignApps = []basics.AppIndex{basics.AppIndex(222)} + TestApp(t, `itxn_begin +int acfg; itxn_field TypeEnum +itxn_next +int acfg; itxn_field TypeEnum +itxn_next +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_submit +itxn Logs 0 +btoi +int 5000 +== +assert +gitxn 2 Logs 1 +btoi +int 5001 +== +`, ep) +} + +// TestCallerGlobals checks that a called app can see its caller. +func TestCallerGlobals(t *testing.T) { + partitiontest.PartitionTest(t) + + ep, tx, ledger := MakeSampleEnv() + globals := TestProg(t, fmt.Sprintf(` +global CallerApplicationID +int 888 +== +global CallerApplicationAddress +addr %s +== +&& +`, basics.AppIndex(888).Address()), AssemblerMaxVersion) + ledger.NewApp(tx.Receiver, 222, basics.AppParams{ + ApprovalProgram: globals.Program, + }) + + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 50_000) + tx.ForeignApps = []basics.AppIndex{basics.AppIndex(222)} + TestApp(t, `itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_submit +int 1 +`, ep) +} + +// TestNumInnerDeep ensures that inner call limits apply to inner calls of inner +// transactions. +func TestNumInnerDeep(t *testing.T) { + partitiontest.PartitionTest(t) + + pay := ` + itxn_begin + int 1 + itxn_field Amount + txn Accounts 0 + itxn_field Receiver + int pay + itxn_field TypeEnum + itxn_submit +` + + tx := txntest.Txn{ + Type: protocol.ApplicationCallTx, + ApplicationID: 888, + ForeignApps: []basics.AppIndex{basics.AppIndex(222)}, + }.SignedTxnWithAD() + require.Equal(t, 888, int(tx.Txn.ApplicationID)) + ledger := MakeLedger(nil) + + pay3 := TestProg(t, pay+pay+pay+"int 1;", AssemblerMaxVersion).Program + ledger.NewApp(tx.Txn.Receiver, 222, basics.AppParams{ + ApprovalProgram: pay3, + }) + + ledger.NewApp(tx.Txn.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 1_000_000) + + callpay3 := `itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_submit +` + txg := []transactions.SignedTxnWithAD{tx} + ep := NewEvalParams(txg, MakeTestProto(), &transactions.SpecialAddresses{}) + ep.Ledger = ledger + TestApp(t, callpay3+"int 1", ep, "insufficient balance") // inner contract needs money + + ledger.NewAccount(appAddr(222), 1_000_000) + TestApp(t, callpay3+"int 1", ep) + // Each use of callpay3 is 4 inners total, so 8 is ok. (32 allowed in test ep) + TestApp(t, strings.Repeat(callpay3, 8)+"int 1", ep) + TestApp(t, strings.Repeat(callpay3, 9)+"int 1", ep, "too many inner transactions") +} + +// TestCreateAndUse checks that an ASA can be created in an inner app, and then +// used. This was not allowed until v6, because of the strict adherence to the +// foreign-arrays rules. +func TestCreateAndUse(t *testing.T) { + partitiontest.PartitionTest(t) + + axfer := ` + itxn_begin + int acfg; itxn_field TypeEnum + int 10; itxn_field ConfigAssetTotal + byte "Gold"; itxn_field ConfigAssetName + itxn_submit + + itxn_begin + int axfer; itxn_field TypeEnum + itxn CreatedAssetID; itxn_field XferAsset + txn Accounts 0; itxn_field AssetReceiver + itxn_submit + + int 1 +` + + // First testing use in axfer + ep, tx, ledger := MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 4*MakeTestProto().MinTxnFee) + TestApp(t, axfer, ep) + + ep.Proto = MakeTestProtoV(CreatedResourcesVersion - 1) + TestApp(t, axfer, ep, "invalid Asset reference") + + balance := ` + itxn_begin + int acfg; itxn_field TypeEnum + int 10; itxn_field ConfigAssetTotal + byte "Gold"; itxn_field ConfigAssetName + itxn_submit + + // txn Sender is not opted-in, as it's the app account that made the asset + // At some point, we should short-circuit so this does not go to disk. + txn Sender + itxn CreatedAssetID + asset_holding_get AssetBalance + int 0 + == + assert + int 0 + == + assert + + // App account owns all the newly made gold + global CurrentApplicationAddress + itxn CreatedAssetID + asset_holding_get AssetBalance + assert + int 10 + == + assert + + int 1 +` + + // Now test use in asset balance opcode + ep, tx, ledger = MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 4*MakeTestProto().MinTxnFee) + TestApp(t, balance, ep) + + ep.Proto = MakeTestProtoV(CreatedResourcesVersion - 1) + TestApp(t, balance, ep, "invalid Asset reference") + + appcall := ` + itxn_begin + int acfg; itxn_field TypeEnum + int 10; itxn_field ConfigAssetTotal + byte "Gold"; itxn_field ConfigAssetName + itxn_submit + + itxn_begin + int appl; itxn_field TypeEnum + int 888; itxn_field ApplicationID + itxn CreatedAssetID; itxn_field Assets + itxn_submit + + int 1 +` + + // Now as ForeignAsset + ep, tx, ledger = MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 4*MakeTestProto().MinTxnFee) + // It gets passed the Assets setting + TestApp(t, appcall, ep, "attempt to self-call") + + // Appcall is isn't allowed pre-CreatedResourcesVersion, because same + // version allowed inner app calls + // ep.Proto = MakeTestProtoV(CreatedResourcesVersion - 1) + // TestApp(t, appcall, ep, "invalid Asset reference") +} + +// main wraps up some TEAL source in a header and footer so that it is +// an app that does nothing at create time, but otherwise runs source, +// then approves, if the source avoids panicing and leaves the stack +// empty. +func main(source string) string { + return fmt.Sprintf(`txn ApplicationID + bz end + %s + end: int 1`, source) +} + +func hexProgram(t *testing.T, source string) string { + return "0x" + hex.EncodeToString(TestProg(t, source, AssemblerMaxVersion).Program) +} + +// TestCreateAndUseApp checks that an app can be created in an inner txn, and then +// the address for it can be looked up. +func TestCreateUseApp(t *testing.T) { + partitiontest.PartitionTest(t) + + pay5back := main(` +itxn_begin +int pay; itxn_field TypeEnum +txn Sender; itxn_field Receiver +int 5; itxn_field Amount +itxn_submit +int 1 +`) + + createAndUse := ` + itxn_begin + int appl; itxn_field TypeEnum + byte ` + hexProgram(t, pay5back) + `; dup; itxn_field ApprovalProgram; itxn_field ClearStateProgram; + itxn_submit + + itxn CreatedApplicationID; app_params_get AppAddress; assert + addr ` + appAddr(5000).String() + ` + == +` + + ep, tx, ledger := MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 1*MakeTestProto().MinTxnFee) + TestApp(t, createAndUse, ep) + // Again, can't test if this (properly) fails in previous version, because + // we can't even create apps this way in previous version. +} + +// TestCreateAndPay checks that an app can be created in an inner app, and then +// a pay can be done to the app's account. This was not allowed until v6, +// because of the strict adherence to the foreign-accounts rules. +func TestCreateAndPay(t *testing.T) { + partitiontest.PartitionTest(t) + + pay5back := main(` +itxn_begin +int pay; itxn_field TypeEnum +txn Sender; itxn_field Receiver +int 5; itxn_field Amount +itxn_submit +int 1 +`) + + createAndPay := ` + itxn_begin + int appl; itxn_field TypeEnum + ` + fmt.Sprintf("byte %s", hexProgram(t, pay5back)) + ` + dup + itxn_field ApprovalProgram; + itxn_field ClearStateProgram; + itxn_submit + + itxn_begin + int pay; itxn_field TypeEnum + itxn CreatedApplicationID; app_params_get AppAddress; assert; itxn_field Receiver + int 10; itxn_field Amount + itxn_submit + + int 1 +` + + ep, tx, ledger := MakeSampleEnv() + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 10*MakeTestProto().MinTxnFee) + TestApp(t, createAndPay, ep) + + // This test is impossible because CreatedResourcesVersion is also when + // inner txns could make apps. + // ep.Proto = MakeTestProtoV(CreatedResourcesVersion - 1) + // TestApp(t, createAndPay, ep, "invalid Address reference") +} + +// TestInnerGaid ensures there's no confusion over the tracking of ids +// across multiple inner transaction groups +func TestInnerGaid(t *testing.T) { + partitiontest.PartitionTest(t) + + ep, tx, ledger := MakeSampleEnv() + ep.Proto.MaxInnerTransactions = 100 + // App to log the aid of slot[apparg[0]] + logGaid := TestProg(t, `txn ApplicationArgs 0; btoi; gaids; itob; log; int 1`, AssemblerMaxVersion) + ledger.NewApp(tx.Receiver, 222, basics.AppParams{ + ApprovalProgram: logGaid.Program, + }) + + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + ledger.NewAccount(appAddr(888), 50_000) + tx.ForeignApps = []basics.AppIndex{basics.AppIndex(222)} + TestApp(t, `itxn_begin +int acfg; itxn_field TypeEnum +itxn_next +int pay; itxn_field TypeEnum +txn Sender; itxn_field Receiver +itxn_next +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +int 0; itob; itxn_field ApplicationArgs +itxn_submit +itxn Logs 0 +btoi +int 5000 +== +assert + +// Swap the pay and acfg, ensure gaid 1 works instead +itxn_begin +int pay; itxn_field TypeEnum +txn Sender; itxn_field Receiver +itxn_next +int acfg; itxn_field TypeEnum +itxn_next +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +int 1; itob; itxn_field ApplicationArgs +itxn_submit +itxn Logs 0 +btoi +int 5001 +== +assert + + +int 1 +`, ep) + + // Nearly identical, but ensures that gaid 0 FAILS in the second group + TestApp(t, `itxn_begin +int acfg; itxn_field TypeEnum +itxn_next +int pay; itxn_field TypeEnum +txn Sender; itxn_field Receiver +itxn_next +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +int 0; itob; itxn_field ApplicationArgs +itxn_submit +itxn Logs 0 +btoi +int 5000 +== +assert + +// Swap the pay and acfg, ensure gaid 1 works instead +itxn_begin +int pay; itxn_field TypeEnum +txn Sender; itxn_field Receiver +itxn_next +int acfg; itxn_field TypeEnum +itxn_next +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +int 0; itob; itxn_field ApplicationArgs +itxn_submit +itxn Logs 0 +btoi +int 5001 +== +assert + + +int 1 +`, ep, "assert failed") + +} + +// TestInnerCallDepth ensures that inner calls are limited in depth +func TestInnerCallDepth(t *testing.T) { + partitiontest.PartitionTest(t) + + t.Parallel() + + ep, tx, ledger := MakeSampleEnv() + // Allow a lot to make the test viable + ep.Proto.MaxAppTxnForeignApps = 50 + ep.Proto.MaxAppTotalTxnReferences = 50 + + var apps []basics.AppIndex + // 200 will be a simple app that always approves + yes := TestProg(t, `int 1`, AssemblerMaxVersion) + ledger.NewApp(tx.Receiver, 200, basics.AppParams{ + ApprovalProgram: yes.Program, + }) + apps = append(apps, basics.AppIndex(200)) + + // 201-210 will be apps that call the next lower one. + for i := 0; i < 10; i++ { + source := main(` + global CurrentApplicationID + itob + log + itxn_begin + int appl; itxn_field TypeEnum + txn NumApplications +loop: + dup + bz done + dup + txnas Applications + itxn_field Applications + int 1 + - + b loop + +done: + pop + ` + fmt.Sprintf("int %d", 200+i) + `; itxn_field ApplicationID + itxn_submit +`) + idx := basics.AppIndex(200 + i + 1) + ledger.NewApp(tx.Receiver, idx, basics.AppParams{ + ApprovalProgram: TestProg(t, source, AssemblerMaxVersion).Program, + }) + ledger.NewAccount(appAddr(int(idx)), 10_000) + apps = append(apps, idx) + } + tx.ForeignApps = apps + ledger.NewAccount(appAddr(888), 100_000) + + app, _, err := ledger.AppParams(202) + require.NoError(t, err) + TestAppBytes(t, app.ApprovalProgram, ep) + + app, _, err = ledger.AppParams(208) + require.NoError(t, err) + TestAppBytes(t, app.ApprovalProgram, ep) + + app, _, err = ledger.AppParams(209) + require.NoError(t, err) + TestAppBytes(t, app.ApprovalProgram, ep, "appl depth") +} + +func TestInfiniteRecursion(t *testing.T) { + partitiontest.PartitionTest(t) + + ep, tx, ledger := MakeSampleEnv() + source := ` +itxn_begin +int appl; itxn_field TypeEnum +int 0; app_params_get AppApprovalProgram +assert +itxn_field ApprovalProgram + +int 0; app_params_get AppClearStateProgram +assert +itxn_field ClearStateProgram + +itxn_submit +` + // This app looks itself up in the ledger, so we need to put it in there. + ledger.NewApp(tx.Sender, 888, basics.AppParams{ + ApprovalProgram: TestProg(t, source, AssemblerMaxVersion).Program, + ClearStateProgram: TestProg(t, "int 1", AssemblerMaxVersion).Program, + }) + // We're testing if this can recur forever. It's hard to fund all these + // apps, but we can put a huge credit in the ep. + *ep.FeeCredit = 1_000_000_000 + + // This has been tested by hand, by setting maxAppCallDepth to 10_000_000 + // but without that, the depth limiter stops it first. + // TestApp(t, source, ep, "too many inner transactions 1 with 0 left") + + TestApp(t, source, ep, "appl depth (8) exceeded") } diff --git a/data/transactions/logic/evalCrypto_test.go b/data/transactions/logic/evalCrypto_test.go index 25a89992ae..e0cb98bac9 100644 --- a/data/transactions/logic/evalCrypto_test.go +++ b/data/transactions/logic/evalCrypto_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -24,7 +24,6 @@ import ( "encoding/hex" "fmt" "math/big" - "strings" "testing" "github.com/stretchr/testify/require" @@ -89,11 +88,10 @@ func TestEd25519verify(t *testing.T) { for v := uint64(1); v <= AssemblerMaxVersion; v++ { t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { - ops, err := AssembleStringWithVersion(fmt.Sprintf(`arg 0 + ops := testProg(t, fmt.Sprintf(`arg 0 arg 1 addr %s ed25519verify`, pkStr), v) - require.NoError(t, err) sig := c.Sign(Msg{ ProgramHash: crypto.HashObj(Program(ops.Program)), Data: data[:], @@ -101,32 +99,18 @@ ed25519verify`, pkStr), v) var txn transactions.SignedTxn txn.Lsig.Logic = ops.Program txn.Lsig.Args = [][]byte{data[:], sig[:]} - sb := strings.Builder{} - pass, err := Eval(ops.Program, defaultEvalParams(&sb, &txn)) - if !pass { - t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) - } - require.True(t, pass) - require.NoError(t, err) + testLogicBytes(t, ops.Program, defaultEvalParams(&txn)) // short sig will fail txn.Lsig.Args[1] = sig[1:] - pass, err = Eval(ops.Program, defaultEvalParams(nil, &txn)) - require.False(t, pass) - require.Error(t, err) - isNotPanic(t, err) + testLogicBytes(t, ops.Program, defaultEvalParams(&txn), "invalid signature") // flip a bit and it should not pass msg1 := "52fdfc072182654f163f5f0f9a621d729566c74d0aa413bf009c9800418c19cd" data1, err := hex.DecodeString(msg1) require.NoError(t, err) txn.Lsig.Args = [][]byte{data1, sig[:]} - sb1 := strings.Builder{} - pass1, err := Eval(ops.Program, defaultEvalParams(&sb1, &txn)) - require.False(t, pass1) - require.NoError(t, err) - isNotPanic(t, err) + testLogicBytes(t, ops.Program, defaultEvalParams(&txn), "REJECT") }) } } @@ -212,9 +196,9 @@ byte 0x%s &&` pkTampered1 := make([]byte, len(pk)) copy(pkTampered1, pk) - pkTampered1[0] = 0 - pkTampered2 := make([]byte, len(pk)) - copy(pkTampered2, pk[1:]) + pkTampered1[0] = 0 // first byte is a prefix of either 0x02 or 0x03 + pkTampered2 := make([]byte, len(pk)-1) // must be 33 bytes length + copy(pkTampered2, pk) var decompressTests = []struct { key []byte @@ -224,8 +208,9 @@ byte 0x%s {pkTampered1, false}, {pkTampered2, false}, } - for _, test := range decompressTests { + for i, test := range decompressTests { t.Run(fmt.Sprintf("decompress/pass=%v", test.pass), func(t *testing.T) { + t.Log("decompressTests i", i) src := fmt.Sprintf(source, hex.EncodeToString(test.key), hex.EncodeToString(x), hex.EncodeToString(y)) if test.pass { testAccepts(t, src, 5) @@ -255,8 +240,8 @@ ecdsa_verify Secp256k1 v := int(sign[64]) rTampered := make([]byte, len(r)) - copy(rTampered, pk) - rTampered[0] = 0 + copy(rTampered, r) + rTampered[0] += byte(1) // intentional overflow var verifyTests = []struct { data string @@ -333,7 +318,7 @@ ecdsa_verify Secp256k1`, hex.EncodeToString(r), hex.EncodeToString(s), hex.Encod ops := testProg(t, source, 5) var txn transactions.SignedTxn txn.Lsig.Logic = ops.Program - pass, err := Eval(ops.Program, defaultEvalParamsWithVersion(nil, &txn, 5)) + pass, err := EvalSignature(0, defaultEvalParamsWithVersion(&txn, 5)) require.NoError(t, err) require.True(t, pass) } @@ -426,12 +411,11 @@ ed25519verify`, pkStr), AssemblerMaxVersion) var txn transactions.SignedTxn txn.Lsig.Logic = programs[i] txn.Lsig.Args = [][]byte{data[i][:], signatures[i][:]} - sb := strings.Builder{} - ep := defaultEvalParams(&sb, &txn) - pass, err := Eval(programs[i], ep) + ep := defaultEvalParams(&txn) + pass, err := EvalSignature(0, ep) if !pass { b.Log(hex.EncodeToString(programs[i])) - b.Log(sb.String()) + b.Log(ep.Trace.String()) } if err != nil { require.NoError(b, err) @@ -488,12 +472,11 @@ func benchmarkEcdsa(b *testing.B, source string) { var txn transactions.SignedTxn txn.Lsig.Logic = data[i].programs txn.Lsig.Args = [][]byte{data[i].msg[:], data[i].r, data[i].s, data[i].x, data[i].y, data[i].pk, {uint8(data[i].v)}} - sb := strings.Builder{} - ep := defaultEvalParams(&sb, &txn) - pass, err := Eval(data[i].programs, ep) + ep := defaultEvalParams(&txn) + pass, err := EvalSignature(0, ep) if !pass { b.Log(hex.EncodeToString(data[i].programs)) - b.Log(sb.String()) + b.Log(ep.Trace.String()) } if err != nil { require.NoError(b, err) diff --git a/data/transactions/logic/evalStateful_test.go b/data/transactions/logic/evalStateful_test.go index 5a212629c6..9c59fadc65 100644 --- a/data/transactions/logic/evalStateful_test.go +++ b/data/transactions/logic/evalStateful_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -22,11 +22,11 @@ import ( "strings" "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/transactions" - "github.com/algorand/go-algorand/data/transactions/logictest" "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" ) @@ -44,22 +44,21 @@ func makeApp(li uint64, lb uint64, gi uint64, gb uint64) basics.AppParams { } } -func makeSampleEnv() (EvalParams, *logictest.Ledger) { +func makeSampleEnv() (*EvalParams, *transactions.Transaction, *Ledger) { return makeSampleEnvWithVersion(LogicVersion) } -func makeSampleEnvWithVersion(version uint64) (EvalParams, *logictest.Ledger) { - txn := makeSampleTxn() - ep := defaultEvalParamsWithVersion(nil, &txn, version) - ep.TxnGroup = makeSampleTxnGroup(txn) - ledger := logictest.MakeLedger(map[basics.Address]uint64{}) +func makeSampleEnvWithVersion(version uint64) (*EvalParams, *transactions.Transaction, *Ledger) { + ep := defaultEvalParamsWithVersion(nil, version) + ep.TxnGroup = transactions.WrapSignedTxnsWithAD(makeSampleTxnGroup(makeSampleTxn())) + ledger := MakeLedger(map[basics.Address]uint64{}) ep.Ledger = ledger - return ep, ledger + return ep, &ep.TxnGroup[0].Txn, ledger } -func makeOldAndNewEnv(version uint64) (EvalParams, EvalParams, *logictest.Ledger) { - new, sharedLedger := makeSampleEnv() - old, _ := makeSampleEnvWithVersion(version) +func makeOldAndNewEnv(version uint64) (*EvalParams, *EvalParams, *Ledger) { + new, _, sharedLedger := makeSampleEnv() + old, _, _ := makeSampleEnvWithVersion(version) old.Ledger = sharedLedger return old, new, sharedLedger } @@ -190,33 +189,19 @@ pop bytec_0 log ` - type desc struct { - source string - eval func([]byte, EvalParams) (bool, error) - check func([]byte, EvalParams) error - } - tests := map[runMode]desc{ - runModeSignature: { - source: opcodesRunModeAny + opcodesRunModeSignature, - eval: func(program []byte, ep EvalParams) (bool, error) { return Eval(program, ep) }, - check: func(program []byte, ep EvalParams) error { return Check(program, ep) }, - }, - runModeApplication: { - source: opcodesRunModeAny + opcodesRunModeApplication, - eval: func(program []byte, ep EvalParams) (bool, error) { return EvalStateful(program, ep) }, - check: func(program []byte, ep EvalParams) error { return CheckStateful(program, ep) }, - }, + tests := map[runMode]string{ + runModeSignature: opcodesRunModeAny + opcodesRunModeSignature, + runModeApplication: opcodesRunModeAny + opcodesRunModeApplication, } - txn := makeSampleTxn() - txgroup := makeSampleTxnGroup(txn) - txn.Lsig.Args = [][]byte{ - txn.Txn.Sender[:], - txn.Txn.Receiver[:], - txn.Txn.CloseRemainderTo[:], - txn.Txn.VotePK[:], - txn.Txn.SelectionPK[:], - txn.Txn.Note, + ep, tx, ledger := makeSampleEnv() + ep.TxnGroup[0].Lsig.Args = [][]byte{ + tx.Sender[:], + tx.Receiver[:], + tx.CloseRemainderTo[:], + tx.VotePK[:], + tx.SelectionPK[:], + tx.Note, } params := basics.AssetParams{ Total: 1000, @@ -225,57 +210,35 @@ log UnitName: "ALGO", AssetName: "", URL: string(protocol.PaymentTx), - Manager: txn.Txn.Sender, - Reserve: txn.Txn.Receiver, - Freeze: txn.Txn.Receiver, - Clawback: txn.Txn.Receiver, + Manager: tx.Sender, + Reserve: tx.Receiver, + Freeze: tx.Receiver, + Clawback: tx.Receiver, } algoValue := basics.TealValue{Type: basics.TealUintType, Uint: 0x77} - ledger := logictest.MakeLedger( - map[basics.Address]uint64{ - txn.Txn.Sender: 1, - }, - ) - ledger.NewApp(txn.Txn.Sender, 100, basics.AppParams{}) - ledger.NewLocal(txn.Txn.Sender, 100, "ALGO", algoValue) - ledger.NewAsset(txn.Txn.Sender, 5, params) + ledger.NewAccount(tx.Sender, 1) + ledger.NewApp(tx.Sender, 100, basics.AppParams{}) + ledger.NewLocals(tx.Sender, 100) + ledger.NewLocal(tx.Sender, 100, "ALGO", algoValue) + ledger.NewAsset(tx.Sender, 5, params) for mode, test := range tests { t.Run(fmt.Sprintf("opcodes_mode=%d", mode), func(t *testing.T) { - ops := testProg(t, test.source, AssemblerMaxVersion) - sb := strings.Builder{} - ep := defaultEvalParams(&sb, &txn) - ep.TxnGroup = txgroup - ep.Ledger = ledger - ep.Txn.Txn.ApplicationID = 100 - ep.Txn.Txn.ForeignAssets = []basics.AssetIndex{5} // needed since v4 - - err := test.check(ops.Program, ep) - require.NoError(t, err) - _, err = test.eval(ops.Program, ep) - if err != nil { - t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) + ep.TxnGroup[0].Txn.ApplicationID = 100 + ep.TxnGroup[0].Txn.ForeignAssets = []basics.AssetIndex{5} // needed since v4 + if mode == runModeSignature { + testLogic(t, test, AssemblerMaxVersion, ep) + } else { + testApp(t, test, ep) } - require.NoError(t, err) }) } // check err opcode work in both modes - for mode, test := range tests { - t.Run(fmt.Sprintf("err_mode=%d", mode), func(t *testing.T) { - source := "err" - ops, err := AssembleStringWithVersion(source, AssemblerMaxVersion) - require.NoError(t, err) - ep := defaultEvalParams(nil, nil) - err = test.check(ops.Program, ep) - require.NoError(t, err) - _, err = test.eval(ops.Program, ep) - require.Error(t, err) - require.NotContains(t, err.Error(), "not allowed in current mode") - require.Contains(t, err.Error(), "err opcode") - }) - } + source := "err" + testLogic(t, source, AssemblerMaxVersion, defaultEvalParams(nil), "encountered err") + testApp(t, source, defaultEvalParams(nil), "encountered err") + // require.NotContains(t, err.Error(), "not allowed in current mode") // check that ed25519verify and arg is not allowed in stateful mode between v2-v4 disallowedV4 := []string{ @@ -288,12 +251,8 @@ log } for _, source := range disallowedV4 { ops := testProg(t, source, 4) - ep := defaultEvalParams(nil, nil) - err := CheckStateful(ops.Program, ep) - require.Error(t, err) - _, err = EvalStateful(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "not allowed in current mode") + testAppBytes(t, ops.Program, defaultEvalParams(nil), + "not allowed in current mode", "not allowed in current mode") } // check that arg is not allowed in stateful mode beyond v5 @@ -306,12 +265,8 @@ log } for _, source := range disallowed { ops := testProg(t, source, AssemblerMaxVersion) - ep := defaultEvalParams(nil, nil) - err := CheckStateful(ops.Program, ep) - require.Error(t, err) - _, err = EvalStateful(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "not allowed in current mode") + testAppBytes(t, ops.Program, defaultEvalParams(nil), + "not allowed in current mode", "not allowed in current mode") } // check stateful opcodes are not allowed in stateless mode @@ -333,13 +288,8 @@ log } for _, source := range statefulOpcodeCalls { - ops := testProg(t, source, AssemblerMaxVersion) - ep := defaultEvalParams(nil, nil) - err := Check(ops.Program, ep) - require.Error(t, err) - _, err = Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "not allowed in current mode") + testLogic(t, source, AssemblerMaxVersion, defaultEvalParams(nil), + "not allowed in current mode", "not allowed in current mode") } require.Equal(t, runMode(1), runModeSignature) @@ -353,9 +303,9 @@ func TestBalance(t *testing.T) { t.Parallel() - ep, ledger := makeSampleEnv() + ep, tx, ledger := makeSampleEnv() text := "int 2; balance; int 177; ==" - ledger.NewAccount(ep.Txn.Txn.Receiver, 177) + ledger.NewAccount(tx.Receiver, 177) testApp(t, text, ep, "invalid Account reference") text = `int 1; balance; int 177; ==` @@ -363,7 +313,7 @@ func TestBalance(t *testing.T) { text = `txn Accounts 1; balance; int 177; ==;` // won't assemble in old version teal - testProg(t, text, directRefEnabledVersion-1, expect{2, "balance arg 0 wanted type uint64..."}) + testProg(t, text, directRefEnabledVersion-1, Expect{2, "balance arg 0 wanted type uint64..."}) // but legal after that testApp(t, text, ep) @@ -373,48 +323,125 @@ func TestBalance(t *testing.T) { ledger.NewAccount(addr, 13) testApp(t, text, ep, "assert failed") - ledger.NewAccount(ep.Txn.Txn.Sender, 13) + ledger.NewAccount(tx.Sender, 13) testApp(t, text, ep) } -func testApp(t *testing.T, program string, ep EvalParams, problems ...string) transactions.EvalDelta { +func testApps(t *testing.T, programs []string, txgroup []transactions.SignedTxn, version uint64, ledger LedgerForLogic, + expected ...Expect) { + t.Helper() + codes := make([][]byte, len(programs)) + for i, program := range programs { + if program != "" { + codes[i] = testProg(t, program, version).Program + } + } + if txgroup == nil { + for _, program := range programs { + sample := makeSampleTxn() + if program != "" { + sample.Txn.Type = protocol.ApplicationCallTx + } + txgroup = append(txgroup, sample) + } + } + ep := NewEvalParams(transactions.WrapSignedTxnsWithAD(txgroup), makeTestProtoV(version), &transactions.SpecialAddresses{}) + if ledger == nil { + ledger = MakeLedger(nil) + } + ep.Ledger = ledger + testAppsBytes(t, codes, ep, expected...) +} + +func testAppsBytes(t *testing.T, programs [][]byte, ep *EvalParams, expected ...Expect) { + t.Helper() + require.Equal(t, len(programs), len(ep.TxnGroup)) + for i := range ep.TxnGroup { + if programs[i] != nil { + if len(expected) > 0 && expected[0].l == i { + testAppFull(t, programs[i], i, basics.AppIndex(888), ep, expected[0].s) + break // Stop after first failure + } else { + testAppFull(t, programs[i], i, basics.AppIndex(888), ep) + } + } + } +} + +func testApp(t *testing.T, program string, ep *EvalParams, problems ...string) transactions.EvalDelta { t.Helper() ops := testProg(t, program, ep.Proto.LogicSigVersion) - err := CheckStateful(ops.Program, ep) - require.NoError(t, err) + return testAppBytes(t, ops.Program, ep, problems...) +} - // we only use this to test stateful apps. While, I suppose - // it's *legal* to have an app with no stateful ops, this - // convenience routine can assume it, and check it. - pass, err := Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "not allowed in current mode") - require.False(t, pass) +func testAppBytes(t *testing.T, program []byte, ep *EvalParams, problems ...string) transactions.EvalDelta { + t.Helper() + ep.reset() + aid := ep.TxnGroup[0].Txn.ApplicationID + if aid == basics.AppIndex(0) { + aid = basics.AppIndex(888) + } + return testAppFull(t, program, 0, aid, ep, problems...) +} + +// testAppFull gives a lot of control to caller - in particular, notice that +// ep.reset() is in testAppBytes, not here. This means that ADs in the ep are +// not cleared, so repeated use of a single ep is probably not a good idea +// unless you are *intending* to see how ep is modified as you go. +func testAppFull(t *testing.T, program []byte, gi int, aid basics.AppIndex, ep *EvalParams, problems ...string) transactions.EvalDelta { + t.Helper() + + var checkProblem string + var evalProblem string + switch len(problems) { + case 2: + checkProblem = problems[0] + evalProblem = problems[1] + case 1: + evalProblem = problems[0] + case 0: + // no problems == expect success + default: + require.Fail(t, "Misused testApp: %d problems", len(problems)) + } sb := &strings.Builder{} ep.Trace = sb - pass, err = EvalStateful(ops.Program, ep) - if len(problems) == 0 { + + err := CheckContract(program, ep) + if checkProblem == "" { require.NoError(t, err, sb.String()) - require.True(t, pass, sb.String()) - delta, err := ep.Ledger.GetDelta(&ep.Txn.Txn) - require.NoError(t, err) - return delta + } else { + require.Error(t, err, "Check\n%s\nExpected: %v", sb, checkProblem) + require.Contains(t, err.Error(), checkProblem, sb.String()) } - require.Error(t, err, sb.String()) - for _, problem := range problems { - require.Contains(t, err.Error(), problem) + // We continue on to check Eval() of things that failed Check() because it's + // a nice confirmation that Check() is usually stricter than Eval(). This + // may mean that the problems argument is often duplicated, but this seems + // the best way to be concise about all sorts of tests. + + if ep.Ledger == nil { + ep.Ledger = MakeLedger(nil) } - if ep.Ledger != nil { - delta, err := ep.Ledger.GetDelta(&ep.Txn.Txn) - require.NoError(t, err) - require.Empty(t, delta.GlobalDelta) - require.Empty(t, delta.LocalDeltas) - require.Empty(t, delta.Logs) + + pass, err := EvalApp(program, gi, aid, ep) + delta := ep.TxnGroup[gi].EvalDelta + if evalProblem == "" { + require.NoError(t, err, "Eval%s\nExpected: PASS", sb) + require.True(t, pass, "Eval%s\nExpected: PASS", sb) return delta } - return transactions.EvalDelta{} + + // There is an evalProblem to check. REJECT is special and only means that + // the app didn't accept. Maybe it's an error, maybe it's just !pass. + if evalProblem == "REJECT" { + require.True(t, err != nil || !pass, "Eval%s\nExpected: REJECT", sb) + } else { + require.Error(t, err, "Eval\n%s\nExpected: %v", sb, evalProblem) + require.Contains(t, err.Error(), evalProblem) + } + return delta } func TestMinBalance(t *testing.T) { @@ -422,35 +449,36 @@ func TestMinBalance(t *testing.T) { t.Parallel() - ep, ledger := makeSampleEnv() + ep, tx, ledger := makeSampleEnv() - ledger.NewAccount(ep.Txn.Txn.Sender, 234) - ledger.NewAccount(ep.Txn.Txn.Receiver, 123) + ledger.NewAccount(tx.Sender, 234) + ledger.NewAccount(tx.Receiver, 123) testApp(t, "int 0; min_balance; int 1001; ==", ep) // Sender makes an asset, min balance goes up - ledger.NewAsset(ep.Txn.Txn.Sender, 7, basics.AssetParams{Total: 1000}) + ledger.NewAsset(tx.Sender, 7, basics.AssetParams{Total: 1000}) testApp(t, "int 0; min_balance; int 2002; ==", ep) schemas := makeApp(1, 2, 3, 4) - ledger.NewApp(ep.Txn.Txn.Sender, 77, schemas) + ledger.NewApp(tx.Sender, 77, schemas) + ledger.NewLocals(tx.Sender, 77) // create + optin + 10 schema base + 4 ints + 6 bytes (local - // and global count b/c NewApp opts the creator in) - minb := 2*1002 + 10*1003 + 4*1004 + 6*1005 + // and global count b/c NewLocals opts the creator in) + minb := 1002 + 1006 + 10*1003 + 4*1004 + 6*1005 testApp(t, fmt.Sprintf("int 0; min_balance; int %d; ==", 2002+minb), ep) // request extra program pages, min balance increase withepp := makeApp(1, 2, 3, 4) withepp.ExtraProgramPages = 2 - ledger.NewApp(ep.Txn.Txn.Sender, 77, withepp) + ledger.NewApp(tx.Sender, 77, withepp) minb += 2 * 1002 testApp(t, fmt.Sprintf("int 0; min_balance; int %d; ==", 2002+minb), ep) testApp(t, "int 1; min_balance; int 1001; ==", ep) // 1 == Accounts[0] testProg(t, "txn Accounts 1; min_balance; int 1001; ==", directRefEnabledVersion-1, - expect{2, "min_balance arg 0 wanted type uint64..."}) + Expect{2, "min_balance arg 0 wanted type uint64..."}) testProg(t, "txn Accounts 1; min_balance; int 1001; ==", directRefEnabledVersion) testApp(t, "txn Accounts 1; min_balance; int 1001; ==", ep) // 1 == Accounts[0] // Receiver opts in - ledger.NewHolding(ep.Txn.Txn.Receiver, 7, 1, true) + ledger.NewHolding(tx.Receiver, 7, 1, true) testApp(t, "int 1; min_balance; int 2002; ==", ep) // 1 == Accounts[0] testApp(t, "int 2; min_balance; int 1001; ==", ep, "invalid Account reference 2") @@ -464,15 +492,12 @@ func TestAppCheckOptedIn(t *testing.T) { txn := makeSampleTxn() txgroup := makeSampleTxnGroup(txn) - now := defaultEvalParams(nil, nil) - now.Txn = &txn - now.TxnGroup = txgroup - pre := defaultEvalParamsWithVersion(nil, nil, directRefEnabledVersion-1) - pre.Txn = &txn - pre.TxnGroup = txgroup - testApp(t, "int 2; int 100; app_opted_in; int 1; ==", now, "ledger not available") - - ledger := logictest.MakeLedger( + now := defaultEvalParams(&txn) + now.TxnGroup = transactions.WrapSignedTxnsWithAD(txgroup) + pre := defaultEvalParamsWithVersion(&txn, directRefEnabledVersion-1) + pre.TxnGroup = transactions.WrapSignedTxnsWithAD(txgroup) + + ledger := MakeLedger( map[basics.Address]uint64{ txn.Txn.Receiver: 1, txn.Txn.Sender: 1, @@ -484,23 +509,35 @@ func TestAppCheckOptedIn(t *testing.T) { // Receiver is not opted in testApp(t, "int 1; int 100; app_opted_in; int 0; ==", now) - //testApp(t, "int 1; int 3; app_opted_in; int 0; ==", now) - //testApp(t, "int 1; int 3; app_opted_in; int 0; ==", pre) // not an indirect reference though: app 3 + testApp(t, "int 1; int 0; app_opted_in; int 0; ==", now) + // These two give the same result, for different reasons + testApp(t, "int 1; int 3; app_opted_in; int 0; ==", now) // refers to tx.ForeignApps[2], which is 111 + testApp(t, "int 1; int 3; app_opted_in; int 0; ==", pre) // not an indirect reference: actually app 3 + // 0 is a legal way to refer to the current app, even in pre (though not in spec) + // but current app is 888 - not opted in + testApp(t, "int 1; int 0; app_opted_in; int 0; ==", pre) // Sender is not opted in testApp(t, "int 0; int 100; app_opted_in; int 0; ==", now) // Receiver opted in - ledger.NewApp(txn.Txn.Receiver, 100, basics.AppParams{}) + ledger.NewLocals(txn.Txn.Receiver, 100) testApp(t, "int 1; int 100; app_opted_in; int 1; ==", now) - testApp(t, "int 1; int 2; app_opted_in; int 1; ==", now) + testApp(t, "int 1; int 2; app_opted_in; int 1; ==", now) // tx.ForeignApps[1] == 100 testApp(t, "int 1; int 2; app_opted_in; int 0; ==", pre) // in pre, int 2 is an actual app id testApp(t, "byte \"aoeuiaoeuiaoeuiaoeuiaoeuiaoeui01\"; int 2; app_opted_in; int 1; ==", now) testProg(t, "byte \"aoeuiaoeuiaoeuiaoeuiaoeuiaoeui01\"; int 2; app_opted_in; int 1; ==", directRefEnabledVersion-1, - expect{3, "app_opted_in arg 0 wanted type uint64..."}) + Expect{3, "app_opted_in arg 0 wanted type uint64..."}) + + // Receiver opts into 888, the current app in testApp + ledger.NewLocals(txn.Txn.Receiver, 888) + // int 0 is current app (888) even in pre + testApp(t, "int 1; int 0; app_opted_in; int 1; ==", pre) + // Here it is "obviously" allowed, because indexes became legal + testApp(t, "int 1; int 0; app_opted_in; int 1; ==", now) // Sender opted in - ledger.NewApp(txn.Txn.Sender, 100, basics.AppParams{}) + ledger.NewLocals(txn.Txn.Sender, 100) testApp(t, "int 0; int 100; app_opted_in; int 1; ==", now) } @@ -524,7 +561,7 @@ int 1 ==` pre, now, ledger := makeOldAndNewEnv(directRefEnabledVersion - 1) - ledger.NewAccount(now.Txn.Txn.Receiver, 1) + ledger.NewAccount(now.TxnGroup[0].Txn.Receiver, 1) testApp(t, text, now, "invalid Account reference") text = `int 1 // account idx @@ -540,14 +577,15 @@ err exit: int 1` - testApp(t, text, now, "no app for account") + testApp(t, text, now, "is not opted into") // Make a different app (not 100) - ledger.NewApp(now.Txn.Txn.Receiver, 9999, basics.AppParams{}) - testApp(t, text, now, "no app for account") + ledger.NewApp(now.TxnGroup[0].Txn.Receiver, 9999, basics.AppParams{}) + testApp(t, text, now, "is not opted into") // create the app and check the value from ApplicationArgs[0] (protocol.PaymentTx) does not exist - ledger.NewApp(now.Txn.Txn.Receiver, 100, basics.AppParams{}) + ledger.NewApp(now.TxnGroup[0].Txn.Receiver, 100, basics.AppParams{}) + ledger.NewLocals(now.TxnGroup[0].Txn.Receiver, 100) testApp(t, text, now) text = `int 1 // account idx @@ -559,25 +597,39 @@ err exist: byte 0x414c474f ==` - ledger.NewLocal(now.Txn.Txn.Receiver, 100, string(protocol.PaymentTx), basics.TealValue{Type: basics.TealBytesType, Bytes: "ALGO"}) + ledger.NewLocal(now.TxnGroup[0].Txn.Receiver, 100, string(protocol.PaymentTx), basics.TealValue{Type: basics.TealBytesType, Bytes: "ALGO"}) testApp(t, text, now) testApp(t, strings.Replace(text, "int 1 // account idx", "byte \"aoeuiaoeuiaoeuiaoeuiaoeuiaoeui01\"", -1), now) testProg(t, strings.Replace(text, "int 1 // account idx", "byte \"aoeuiaoeuiaoeuiaoeuiaoeuiaoeui01\"", -1), directRefEnabledVersion-1, - expect{4, "app_local_get_ex arg 0 wanted type uint64..."}) + Expect{4, "app_local_get_ex arg 0 wanted type uint64..."}) testApp(t, strings.Replace(text, "int 100 // app id", "int 2", -1), now) // Next we're testing if the use of the current app's id works - // as a direct reference. The error is because the sender + // as a direct reference. The error is because the receiver // account is not opted into 123. - ledger.NewApp(now.Txn.Txn.RekeyTo, 123, basics.AppParams{}) - testApp(t, strings.Replace(text, "int 100 // app id", "int 123", -1), now, "no app for account") - testApp(t, strings.Replace(text, "int 100 // app id", "int 2", -1), pre, "no app for account") + now.TxnGroup[0].Txn.ApplicationID = 123 + testApp(t, strings.Replace(text, "int 100 // app id", "int 123", -1), now, "is not opted into") + testApp(t, strings.Replace(text, "int 100 // app id", "int 2", -1), pre, "is not opted into") testApp(t, strings.Replace(text, "int 100 // app id", "int 9", -1), now, "invalid App reference 9") testApp(t, strings.Replace(text, "int 1 // account idx", "byte \"aoeuiaoeuiaoeuiaoeuiaoeuiaoeui00\"", -1), now, "no such address") + // opt into 123, and try again + ledger.NewApp(now.TxnGroup[0].Txn.Receiver, 123, basics.AppParams{}) + ledger.NewLocals(now.TxnGroup[0].Txn.Receiver, 123) + ledger.NewLocal(now.TxnGroup[0].Txn.Receiver, 123, string(protocol.PaymentTx), basics.TealValue{Type: basics.TealBytesType, Bytes: "ALGO"}) + testApp(t, strings.Replace(text, "int 100 // app id", "int 123", -1), now) + testApp(t, strings.Replace(text, "int 100 // app id", "int 0", -1), now) + + // Somewhat surprising, but in `pre` when the app argument was expected to be + // an actual app id (not an index in foreign apps), 0 was *still* treated + // like current app. + pre.TxnGroup[0].Txn.ApplicationID = 123 + testApp(t, strings.Replace(text, "int 100 // app id", "int 0", -1), pre) + // check special case account idx == 0 => sender - ledger.NewApp(now.Txn.Txn.Sender, 100, basics.AppParams{}) + ledger.NewApp(now.TxnGroup[0].Txn.Sender, 100, basics.AppParams{}) + ledger.NewLocals(now.TxnGroup[0].Txn.Sender, 100) text = `int 0 // account idx int 100 // app id txn ApplicationArgs 0 @@ -588,15 +640,15 @@ exist: byte 0x414c474f ==` - ledger.NewLocal(now.Txn.Txn.Sender, 100, string(protocol.PaymentTx), basics.TealValue{Type: basics.TealBytesType, Bytes: "ALGO"}) + ledger.NewLocal(now.TxnGroup[0].Txn.Sender, 100, string(protocol.PaymentTx), basics.TealValue{Type: basics.TealBytesType, Bytes: "ALGO"}) testApp(t, text, now) testApp(t, strings.Replace(text, "int 0 // account idx", "byte \"aoeuiaoeuiaoeuiaoeuiaoeuiaoeui00\"", -1), now) testApp(t, strings.Replace(text, "int 0 // account idx", "byte \"aoeuiaoeuiaoeuiaoeuiaoeuiaoeui02\"", -1), now, "invalid Account reference") // check reading state of other app - ledger.NewApp(now.Txn.Txn.Sender, 56, basics.AppParams{}) - ledger.NewApp(now.Txn.Txn.Sender, 100, basics.AppParams{}) + ledger.NewApp(now.TxnGroup[0].Txn.Sender, 56, basics.AppParams{}) + ledger.NewApp(now.TxnGroup[0].Txn.Sender, 100, basics.AppParams{}) text = `int 0 // account idx int 56 // app id txn ApplicationArgs 0 @@ -607,7 +659,8 @@ exist: byte 0x414c474f ==` - ledger.NewLocal(now.Txn.Txn.Sender, 56, string(protocol.PaymentTx), basics.TealValue{Type: basics.TealBytesType, Bytes: "ALGO"}) + ledger.NewLocals(now.TxnGroup[0].Txn.Sender, 56) + ledger.NewLocal(now.TxnGroup[0].Txn.Sender, 56, string(protocol.PaymentTx), basics.TealValue{Type: basics.TealBytesType, Bytes: "ALGO"}) testApp(t, text, now) // check app_local_get @@ -617,11 +670,12 @@ app_local_get byte 0x414c474f ==` - ledger.NewLocal(now.Txn.Txn.Sender, 100, string(protocol.PaymentTx), basics.TealValue{Type: basics.TealBytesType, Bytes: "ALGO"}) + ledger.NewLocal(now.TxnGroup[0].Txn.Sender, 100, string(protocol.PaymentTx), basics.TealValue{Type: basics.TealBytesType, Bytes: "ALGO"}) + now.TxnGroup[0].Txn.ApplicationID = 100 testApp(t, text, now) testApp(t, strings.Replace(text, "int 0 // account idx", "byte \"aoeuiaoeuiaoeuiaoeuiaoeuiaoeui00\"", -1), now) testProg(t, strings.Replace(text, "int 0 // account idx", "byte \"aoeuiaoeuiaoeuiaoeuiaoeuiaoeui00\"", -1), directRefEnabledVersion-1, - expect{3, "app_local_get arg 0 wanted type uint64..."}) + Expect{3, "app_local_get arg 0 wanted type uint64..."}) testApp(t, strings.Replace(text, "int 0 // account idx", "byte \"aoeuiaoeuiaoeuiaoeuiaoeuiaoeui01\"", -1), now) testApp(t, strings.Replace(text, "int 0 // account idx", "byte \"aoeuiaoeuiaoeuiaoeuiaoeuiaoeui02\"", -1), now, "invalid Account reference") @@ -633,7 +687,7 @@ app_local_get int 0 ==` - ledger.NewLocal(now.Txn.Txn.Sender, 100, string(protocol.PaymentTx), basics.TealValue{Type: basics.TealBytesType, Bytes: "ALGO"}) + ledger.NewLocal(now.TxnGroup[0].Txn.Sender, 100, string(protocol.PaymentTx), basics.TealValue{Type: basics.TealBytesType, Bytes: "ALGO"}) testApp(t, text, now) } @@ -666,14 +720,14 @@ byte 0x414c474f && ` pre, now, ledger := makeOldAndNewEnv(directRefEnabledVersion - 1) - ledger.NewAccount(now.Txn.Txn.Sender, 1) + ledger.NewAccount(now.TxnGroup[0].Txn.Sender, 1) - now.Txn.Txn.ApplicationID = 100 - now.Txn.Txn.ForeignApps = []basics.AppIndex{now.Txn.Txn.ApplicationID} + now.TxnGroup[0].Txn.ApplicationID = 100 + now.TxnGroup[0].Txn.ForeignApps = []basics.AppIndex{now.TxnGroup[0].Txn.ApplicationID} testApp(t, text, now, "no such app") // create the app and check the value from ApplicationArgs[0] (protocol.PaymentTx) does not exist - ledger.NewApp(now.Txn.Txn.Sender, 100, basics.AppParams{}) + ledger.NewApp(now.TxnGroup[0].Txn.Sender, 100, basics.AppParams{}) testApp(t, text, now, "err opcode") @@ -692,7 +746,8 @@ byte 0x414c474f // check app_global_get default value text = "byte 0x414c474f55; app_global_get; int 0; ==" - ledger.NewLocal(now.Txn.Txn.Sender, 100, string(protocol.PaymentTx), basics.TealValue{Type: basics.TealBytesType, Bytes: "ALGO"}) + ledger.NewLocals(now.TxnGroup[0].Txn.Sender, 100) + ledger.NewLocal(now.TxnGroup[0].Txn.Sender, 100, string(protocol.PaymentTx), basics.TealValue{Type: basics.TealBytesType, Bytes: "ALGO"}) testApp(t, text, now) text = ` @@ -711,15 +766,17 @@ int 4141 // check that even during application creation (Txn.ApplicationID == 0) // we will use the the kvCow if the exact application ID (100) is // specified in the transaction - now.Txn.Txn.ApplicationID = 0 - now.Txn.Txn.ForeignApps = []basics.AppIndex{100} - testApp(t, text, now) + now.TxnGroup[0].Txn.ApplicationID = 0 + now.TxnGroup[0].Txn.ForeignApps = []basics.AppIndex{100} + + testAppFull(t, testProg(t, text, LogicVersion).Program, 0, 100, now) // Direct reference to the current app also works - ledger.NewApp(now.Txn.Txn.Receiver, 100, basics.AppParams{}) - now.Txn.Txn.ForeignApps = []basics.AppIndex{} - testApp(t, strings.Replace(text, "int 1 // ForeignApps index", "int 100", -1), now) - testApp(t, strings.Replace(text, "int 1 // ForeignApps index", "global CurrentApplicationID", -1), now) + now.TxnGroup[0].Txn.ForeignApps = []basics.AppIndex{} + testAppFull(t, testProg(t, strings.Replace(text, "int 1 // ForeignApps index", "int 100", -1), LogicVersion).Program, + 0, 100, now) + testAppFull(t, testProg(t, strings.Replace(text, "int 1 // ForeignApps index", "global CurrentApplicationID", -1), LogicVersion).Program, + 0, 100, now) } const assetsTestTemplate = `int 0//account @@ -848,23 +905,23 @@ func TestAssets(t *testing.T) { func testAssetsByVersion(t *testing.T, assetsTestProgram string, version uint64) { for _, field := range AssetHoldingFieldNames { - fs := assetHoldingFieldSpecByName[field] + fs := AssetHoldingFieldSpecByName[field] if fs.version <= version && !strings.Contains(assetsTestProgram, field) { t.Errorf("TestAssets missing field %v", field) } } for _, field := range AssetParamsFieldNames { - fs := assetParamsFieldSpecByName[field] + fs := AssetParamsFieldSpecByName[field] if fs.version <= version && !strings.Contains(assetsTestProgram, field) { t.Errorf("TestAssets missing field %v", field) } } txn := makeSampleTxn() - pre := defaultEvalParamsWithVersion(nil, &txn, directRefEnabledVersion-1) + pre := defaultEvalParamsWithVersion(&txn, directRefEnabledVersion-1) require.GreaterOrEqual(t, version, uint64(directRefEnabledVersion)) - now := defaultEvalParamsWithVersion(nil, &txn, version) - ledger := logictest.MakeLedger( + now := defaultEvalParamsWithVersion(&txn, version) + ledger := MakeLedger( map[basics.Address]uint64{ txn.Txn.Sender: 1, }, @@ -881,7 +938,7 @@ func testAssetsByVersion(t *testing.T, assetsTestProgram string, version uint64) // it wasn't legal to use a direct ref for account testProg(t, `byte "aoeuiaoeuiaoeuiaoeuiaoeuiaoeui00"; int 54; asset_holding_get AssetBalance`, - directRefEnabledVersion-1, expect{3, "asset_holding_get AssetBalance arg 0 wanted type uint64..."}) + directRefEnabledVersion-1, Expect{3, "asset_holding_get AssetBalance arg 0 wanted type uint64..."}) // but it is now (empty asset yields 0,0 on stack) testApp(t, `byte "aoeuiaoeuiaoeuiaoeuiaoeuiaoeui00"; int 55; asset_holding_get AssetBalance; ==`, now) // This is receiver, who is in Assets array @@ -924,7 +981,7 @@ func testAssetsByVersion(t *testing.T, assetsTestProgram string, version uint64) testApp(t, strings.Replace(assetsTestProgram, "int 55", "int 0", -1), now) // but old code cannot - testProg(t, strings.Replace(assetsTestProgram, "int 0//account", "byte \"aoeuiaoeuiaoeuiaoeuiaoeuiaoeui00\"", -1), directRefEnabledVersion-1, expect{3, "asset_holding_get AssetBalance arg 0 wanted type uint64..."}) + testProg(t, strings.Replace(assetsTestProgram, "int 0//account", "byte \"aoeuiaoeuiaoeuiaoeuiaoeuiaoeui00\"", -1), directRefEnabledVersion-1, Expect{3, "asset_holding_get AssetBalance arg 0 wanted type uint64..."}) if version < 5 { // Can't run these with AppCreator anyway @@ -954,7 +1011,7 @@ intc_2 // 1 ops := testProg(t, source, version) require.Equal(t, OpsByName[now.Proto.LogicSigVersion]["asset_holding_get"].Opcode, ops.Program[8]) ops.Program[9] = 0x02 - _, err := EvalStateful(ops.Program, now) + _, err := EvalApp(ops.Program, 0, 888, now) require.Error(t, err) require.Contains(t, err.Error(), "invalid asset_holding_get field 2") @@ -979,7 +1036,7 @@ intc_1 ops = testProg(t, source, version) require.Equal(t, OpsByName[now.Proto.LogicSigVersion]["asset_params_get"].Opcode, ops.Program[6]) ops.Program[7] = 0x20 - _, err = EvalStateful(ops.Program, now) + _, err = EvalApp(ops.Program, 0, 888, now) require.Error(t, err) require.Contains(t, err.Error(), "invalid asset_params_get field 32") @@ -1041,9 +1098,9 @@ intc_1 func TestAppParams(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel() - ep, ledger := makeSampleEnv() - ledger.NewAccount(ep.Txn.Txn.Sender, 1) - ledger.NewApp(ep.Txn.Txn.Sender, 100, basics.AppParams{}) + ep, tx, ledger := makeSampleEnv() + ledger.NewAccount(tx.Sender, 1) + ledger.NewApp(tx.Sender, 100, basics.AppParams{}) /* app id is in ForeignApps, but does not exist */ source := "int 56; app_params_get AppExtraProgramPages; int 0; ==; assert; int 0; ==" @@ -1053,9 +1110,66 @@ func TestAppParams(t *testing.T) { testApp(t, source, ep) } -func TestAppLocalReadWriteDeleteErrors(t *testing.T) { +func TestAcctParams(t *testing.T) { partitiontest.PartitionTest(t) + t.Parallel() + ep, tx, ledger := makeSampleEnv() + + source := "int 0; acct_params_get AcctBalance; !; assert; int 0; ==" + testApp(t, source, ep) + + source = "int 0; acct_params_get AcctMinBalance; !; assert; int 1001; ==" + testApp(t, source, ep) + + ledger.NewAccount(tx.Sender, 42) + + source = "int 0; acct_params_get AcctBalance; assert; int 42; ==" + testApp(t, source, ep) + + source = "int 0; acct_params_get AcctMinBalance; assert; int 1001; ==" + testApp(t, source, ep) + + source = "int 0; acct_params_get AcctAuthAddr; assert; global ZeroAddress; ==" + testApp(t, source, ep) +} +func TestGlobalNonDelete(t *testing.T) { + partitiontest.PartitionTest(t) + t.Parallel() + + ep, txn, ledger := makeSampleEnv() + source := ` +byte "none" +app_global_del +int 1 +` + ledger.NewApp(txn.Sender, 888, makeApp(0, 0, 1, 0)) + delta := testApp(t, source, ep) + require.Empty(t, delta.GlobalDelta) + require.Empty(t, delta.LocalDeltas) +} + +func TestLocalNonDelete(t *testing.T) { + partitiontest.PartitionTest(t) + t.Parallel() + + ep, txn, ledger := makeSampleEnv() + source := ` +int 0 +byte "none" +app_local_del +int 1 +` + ledger.NewAccount(txn.Sender, 100000) + ledger.NewApp(txn.Sender, 888, makeApp(0, 0, 1, 0)) + ledger.NewLocals(txn.Sender, 888) + delta := testApp(t, source, ep) + require.Empty(t, delta.GlobalDelta) + require.Empty(t, delta.LocalDeltas) +} + +func TestAppLocalReadWriteDeleteErrors(t *testing.T) { + partitiontest.PartitionTest(t) t.Parallel() sourceRead := `intcblock 0 100 0x77 1 @@ -1116,16 +1230,12 @@ intc_1 ops := testProg(t, source, AssemblerMaxVersion) txn := makeSampleTxn() - ep := defaultEvalParams(nil, nil) - ep.Txn = &txn - ep.Txn.Txn.ApplicationID = 100 - err := CheckStateful(ops.Program, ep) + txn.Txn.ApplicationID = 100 + ep := defaultEvalParams(&txn) + err := CheckContract(ops.Program, ep) require.NoError(t, err) - _, err = EvalStateful(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "ledger not available") - ledger := logictest.MakeLedger( + ledger := MakeLedger( map[basics.Address]uint64{ txn.Txn.Sender: 1, }, @@ -1135,19 +1245,20 @@ intc_1 saved := ops.Program[firstCmdOffset] require.Equal(t, OpsByName[0]["intc_0"].Opcode, saved) ops.Program[firstCmdOffset] = OpsByName[0]["intc_1"].Opcode - _, err = EvalStateful(ops.Program, ep) + _, err = EvalApp(ops.Program, 0, 100, ep) require.Error(t, err) require.Contains(t, err.Error(), "invalid Account reference 100") ops.Program[firstCmdOffset] = saved - _, err = EvalStateful(ops.Program, ep) + _, err = EvalApp(ops.Program, 0, 100, ep) require.Error(t, err) - require.Contains(t, err.Error(), "no app for account") + require.Contains(t, err.Error(), "is not opted into") ledger.NewApp(txn.Txn.Sender, 100, basics.AppParams{}) + ledger.NewLocals(txn.Txn.Sender, 100) if name == "read" { - _, err = EvalStateful(ops.Program, ep) + _, err = EvalApp(ops.Program, 0, 100, ep) require.Error(t, err) require.Contains(t, err.Error(), "err opcode") // no such key } @@ -1156,11 +1267,10 @@ intc_1 ledger.NewLocal(txn.Txn.Sender, 100, "ALGOA", basics.TealValue{Type: basics.TealUintType, Uint: 1}) ledger.Reset() - pass, err := EvalStateful(ops.Program, ep) + pass, err := EvalApp(ops.Program, 0, 100, ep) require.NoError(t, err) require.True(t, pass) - delta, err := ledger.GetDelta(&ep.Txn.Txn) - require.NoError(t, err) + delta := ep.TxnGroup[0].EvalDelta require.Empty(t, delta.GlobalDelta) expLocal := 1 if name == "read" { @@ -1176,17 +1286,17 @@ func TestAppLocalStateReadWrite(t *testing.T) { t.Parallel() - ep := defaultEvalParams(nil, nil) txn := makeSampleTxn() txn.Txn.ApplicationID = 100 - ep.Txn = &txn - ledger := logictest.MakeLedger( + ep := defaultEvalParams(&txn) + ledger := MakeLedger( map[basics.Address]uint64{ txn.Txn.Sender: 1, }, ) ep.Ledger = ledger ledger.NewApp(txn.Txn.Sender, 100, basics.AppParams{}) + ledger.NewLocals(txn.Txn.Sender, 100) // write int and bytes values source := `int 0 // account @@ -1217,16 +1327,8 @@ int 0x77 == && ` - ops, err := AssembleStringWithVersion(source, AssemblerMaxVersion) - require.NoError(t, err) - err = CheckStateful(ops.Program, ep) - require.NoError(t, err) - pass, err := EvalStateful(ops.Program, ep) - require.NoError(t, err) - require.True(t, pass) - delta, err := ledger.GetDelta(&ep.Txn.Txn) - require.NoError(t, err) - require.Empty(t, 0, delta.GlobalDelta) + delta := testApp(t, source, ep) + require.Empty(t, delta.GlobalDelta) require.Len(t, delta.LocalDeltas, 1) require.Len(t, delta.LocalDeltas[0], 2) @@ -1260,14 +1362,7 @@ int 0x77 algoValue := basics.TealValue{Type: basics.TealUintType, Uint: 0x77} ledger.NewLocal(txn.Txn.Sender, 100, "ALGO", algoValue) - ops = testProg(t, source, AssemblerMaxVersion) - err = CheckStateful(ops.Program, ep) - require.NoError(t, err) - pass, err = EvalStateful(ops.Program, ep) - require.NoError(t, err) - require.True(t, pass) - delta, err = ledger.GetDelta(&ep.Txn.Txn) - require.NoError(t, err) + delta = testApp(t, source, ep) require.Empty(t, delta.GlobalDelta) require.Empty(t, delta.LocalDeltas) @@ -1296,12 +1391,7 @@ exist2: ledger.NewLocal(txn.Txn.Sender, 100, "ALGO", algoValue) ledger.NoLocal(txn.Txn.Sender, 100, "ALGOA") - ops = testProg(t, source, AssemblerMaxVersion) - pass, err = EvalStateful(ops.Program, ep) - require.NoError(t, err) - require.True(t, pass) - delta, err = ledger.GetDelta(&ep.Txn.Txn) - require.NoError(t, err) + delta = testApp(t, source, ep) require.Empty(t, delta.GlobalDelta) require.Empty(t, delta.LocalDeltas) @@ -1316,12 +1406,7 @@ int 1 ledger.NewLocal(txn.Txn.Sender, 100, "ALGO", algoValue) ledger.NoLocal(txn.Txn.Sender, 100, "ALGOA") - ops = testProg(t, source, AssemblerMaxVersion) - pass, err = EvalStateful(ops.Program, ep) - require.NoError(t, err) - require.True(t, pass) - delta, err = ledger.GetDelta(&ep.Txn.Txn) - require.NoError(t, err) + delta = testApp(t, source, ep) require.Empty(t, delta.GlobalDelta) require.Len(t, delta.LocalDeltas, 1) require.Len(t, delta.LocalDeltas[0], 1) @@ -1348,12 +1433,7 @@ int 0x78 ledger.NewLocal(txn.Txn.Sender, 100, "ALGO", algoValue) ledger.NoLocal(txn.Txn.Sender, 100, "ALGOA") - ops = testProg(t, source, AssemblerMaxVersion) - pass, err = EvalStateful(ops.Program, ep) - require.NoError(t, err) - require.True(t, pass) - delta, err = ledger.GetDelta(&ep.Txn.Txn) - require.NoError(t, err) + delta = testApp(t, source, ep) require.Empty(t, delta.GlobalDelta) require.Len(t, delta.LocalDeltas, 1) require.Len(t, delta.LocalDeltas[0], 1) @@ -1378,12 +1458,7 @@ app_local_put ledger.NewLocal(txn.Txn.Sender, 100, "ALGO", algoValue) ledger.NoLocal(txn.Txn.Sender, 100, "ALGOA") - ops = testProg(t, source, AssemblerMaxVersion) - pass, err = EvalStateful(ops.Program, ep) - require.NoError(t, err) - require.True(t, pass) - delta, err = ledger.GetDelta(&ep.Txn.Txn) - require.NoError(t, err) + delta = testApp(t, source, ep) require.Empty(t, delta.GlobalDelta) require.Len(t, delta.LocalDeltas, 1) require.Len(t, delta.LocalDeltas[0], 1) @@ -1414,17 +1489,10 @@ int 1 ledger.NewLocal(txn.Txn.Sender, 100, "ALGO", algoValue) ledger.NoLocal(txn.Txn.Sender, 100, "ALGOA") - ledger.NewAccount(ep.Txn.Txn.Receiver, 500) + ledger.NewAccount(txn.Txn.Receiver, 500) ledger.NewLocals(txn.Txn.Receiver, 100) - ops = testProg(t, source, AssemblerMaxVersion) - err = CheckStateful(ops.Program, ep) - require.NoError(t, err) - pass, err = EvalStateful(ops.Program, ep) - require.NoError(t, err) - require.True(t, pass) - delta, err = ledger.GetDelta(&ep.Txn.Txn) - require.NoError(t, err) + delta = testApp(t, source, ep) require.Empty(t, delta.GlobalDelta) require.Len(t, delta.LocalDeltas, 2) require.Len(t, delta.LocalDeltas[0], 2) @@ -1482,42 +1550,21 @@ int 1 ops, err := AssembleStringWithVersion(source, AssemblerMaxVersion) require.NoError(t, err) - txn := makeSampleTxn() - ep := defaultEvalParams(nil, nil) - ep.Txn = &txn - _, err = EvalStateful(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "ledger not available") + ep, txn, ledger := makeSampleEnv() + txn.ApplicationID = basics.AppIndex(100) + testAppBytes(t, ops.Program, ep, "no such app") - ledger := logictest.MakeLedger( - map[basics.Address]uint64{ - txn.Txn.Sender: 1, - }, - ) - ep.Ledger = ledger - - txn.Txn.ApplicationID = 100 - _, err = EvalStateful(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "no such app") - - ledger.NewApp(txn.Txn.Sender, 100, makeApp(0, 0, 1, 0)) + ledger.NewApp(txn.Sender, 100, makeApp(0, 0, 1, 0)) // a special test for read if name == "read" { - _, err = EvalStateful(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "err opcode") // no such key + testAppBytes(t, ops.Program, ep, "err opcode") // no such key } ledger.NewGlobal(100, "ALGO", basics.TealValue{Type: basics.TealUintType, Uint: 0x77}) ledger.Reset() - pass, err := EvalStateful(ops.Program, ep) - require.NoError(t, err) - require.True(t, pass) - delta, err := ledger.GetDelta(&ep.Txn.Txn) - require.NoError(t, err) + delta := testAppBytes(t, ops.Program, ep) require.Empty(t, delta.LocalDeltas) }) } @@ -1587,12 +1634,11 @@ int 0x77 == && ` - ep := defaultEvalParams(nil, nil) txn := makeSampleTxn() txn.Txn.ApplicationID = 100 txn.Txn.ForeignApps = []basics.AppIndex{txn.Txn.ApplicationID} - ep.Txn = &txn - ledger := logictest.MakeLedger( + ep := defaultEvalParams(&txn) + ledger := MakeLedger( map[basics.Address]uint64{ txn.Txn.Sender: 1, }, @@ -1600,15 +1646,7 @@ int 0x77 ep.Ledger = ledger ledger.NewApp(txn.Txn.Sender, 100, basics.AppParams{}) - ops, err := AssembleStringWithVersion(source, AssemblerMaxVersion) - require.NoError(t, err) - err = CheckStateful(ops.Program, ep) - require.NoError(t, err) - pass, err := EvalStateful(ops.Program, ep) - require.NoError(t, err) - require.True(t, pass) - delta, err := ledger.GetDelta(&ep.Txn.Txn) - require.NoError(t, err) + delta := testApp(t, source, ep) require.Len(t, delta.GlobalDelta, 2) require.Empty(t, delta.LocalDeltas) @@ -1637,13 +1675,7 @@ int 0x77 algoValue := basics.TealValue{Type: basics.TealUintType, Uint: 0x77} ledger.NewGlobal(100, "ALGO", algoValue) - ops = testProg(t, source, AssemblerMaxVersion) - pass, err = EvalStateful(ops.Program, ep) - require.NoError(t, err) - require.True(t, pass) - delta, err = ledger.GetDelta(&ep.Txn.Txn) - require.NoError(t, err) - + delta = testApp(t, source, ep) require.Empty(t, delta.GlobalDelta) require.Empty(t, delta.LocalDeltas) @@ -1667,12 +1699,7 @@ int 0x77 ledger.NoGlobal(100, "ALGOA") ledger.NewGlobal(100, "ALGO", algoValue) - ops = testProg(t, source, AssemblerMaxVersion) - pass, err = EvalStateful(ops.Program, ep) - require.NoError(t, err) - require.True(t, pass) - delta, err = ledger.GetDelta(&ep.Txn.Txn) - require.NoError(t, err) + delta = testApp(t, source, ep) require.Empty(t, delta.GlobalDelta) require.Empty(t, delta.LocalDeltas) @@ -1712,20 +1739,7 @@ byte 0x414c474f ledger.NoGlobal(100, "ALGOA") ledger.NewGlobal(100, "ALGO", algoValue) - ops = testProg(t, source, AssemblerMaxVersion) - sb := strings.Builder{} - ep.Trace = &sb - err = CheckStateful(ops.Program, ep) - require.NoError(t, err) - pass, err = EvalStateful(ops.Program, ep) - if !pass { - t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) - } - require.NoError(t, err) - require.True(t, pass) - delta, err = ledger.GetDelta(&ep.Txn.Txn) - require.NoError(t, err) + delta = testApp(t, source, ep) require.Len(t, delta.GlobalDelta, 2) require.Empty(t, delta.LocalDeltas) @@ -1759,12 +1773,11 @@ ok2: byte "myval" == ` - ep := defaultEvalParams(nil, nil) txn := makeSampleTxn() txn.Txn.ApplicationID = 100 txn.Txn.ForeignApps = []basics.AppIndex{txn.Txn.ApplicationID, 101} - ep.Txn = &txn - ledger := logictest.MakeLedger( + ep := defaultEvalParams(&txn) + ledger := MakeLedger( map[basics.Address]uint64{ txn.Txn.Sender: 1, }, @@ -1806,11 +1819,10 @@ app_global_get int 7 == ` - ep := defaultEvalParams(nil, nil) txn := makeSampleTxn() txn.Txn.ApplicationID = 100 - ep.Txn = &txn - ledger := logictest.MakeLedger( + ep := defaultEvalParams(&txn) + ledger := MakeLedger( map[basics.Address]uint64{ txn.Txn.Sender: 1, }, @@ -1853,11 +1865,10 @@ err ok: int 1 ` - ep := defaultEvalParams(nil, nil) txn := makeSampleTxn() txn.Txn.ApplicationID = 100 - ep.Txn = &txn - ledger := logictest.MakeLedger( + ep := defaultEvalParams(&txn) + ledger := MakeLedger( map[basics.Address]uint64{ txn.Txn.Sender: 1, }, @@ -1884,7 +1895,7 @@ byte 0x414c474f app_global_get_ex == // two zeros ` - ep.Txn.Txn.ForeignApps = []basics.AppIndex{txn.Txn.ApplicationID} + ep.TxnGroup[0].Txn.ForeignApps = []basics.AppIndex{txn.Txn.ApplicationID} delta = testApp(t, source, ep) require.Len(t, delta.GlobalDelta, 1) vd := delta.GlobalDelta["ALGO"] @@ -2020,38 +2031,32 @@ err ok: int 1 ` - ep := defaultEvalParams(nil, nil) txn := makeSampleTxn() txn.Txn.ApplicationID = 100 - ep.Txn = &txn - ledger := logictest.MakeLedger( + ep := defaultEvalParams(&txn) + ledger := MakeLedger( map[basics.Address]uint64{ txn.Txn.Sender: 1, }, ) ep.Ledger = ledger ledger.NewApp(txn.Txn.Sender, 100, basics.AppParams{}) + ledger.NewLocals(txn.Txn.Sender, 100) ledger.NewAccount(txn.Txn.Receiver, 1) ledger.NewLocals(txn.Txn.Receiver, 100) - sb := strings.Builder{} - ep.Trace = &sb + ep.Trace = &strings.Builder{} - testApp(t, source, ep) - delta, err := ledger.GetDelta(&ep.Txn.Txn) - require.NoError(t, err) + delta := testApp(t, source, ep) require.Equal(t, 0, len(delta.GlobalDelta)) require.Equal(t, 2, len(delta.LocalDeltas)) ledger.Reset() // test that app_local_put and _app_local_del can use byte addresses - testApp(t, strings.Replace(source, "int 0 // sender", "byte \"aoeuiaoeuiaoeuiaoeuiaoeuiaoeui00\"", -1), ep) - // But won't compile in old teal + delta = testApp(t, strings.Replace(source, "int 0 // sender", "byte \"aoeuiaoeuiaoeuiaoeuiaoeuiaoeui00\"", -1), ep) + // But won't even compile in old teal testProg(t, strings.Replace(source, "int 0 // sender", "byte \"aoeuiaoeuiaoeuiaoeuiaoeuiaoeui00\"", -1), directRefEnabledVersion-1, - expect{4, "app_local_put arg 0 wanted..."}, expect{11, "app_local_del arg 0 wanted..."}) - - delta, err = ledger.GetDelta(&ep.Txn.Txn) - require.NoError(t, err) + Expect{4, "app_local_put arg 0 wanted..."}, Expect{11, "app_local_del arg 0 wanted..."}) require.Equal(t, 0, len(delta.GlobalDelta)) require.Equal(t, 2, len(delta.LocalDeltas)) @@ -2075,9 +2080,7 @@ app_local_get_ex == // two zeros ` - testApp(t, source, ep) - delta, err = ledger.GetDelta(&ep.Txn.Txn) - require.NoError(t, err) + delta = testApp(t, source, ep) require.Equal(t, 0, len(delta.GlobalDelta)) require.Equal(t, 1, len(delta.LocalDeltas)) vd := delta.LocalDeltas[0]["ALGO"] @@ -2105,9 +2108,7 @@ byte 0x414c474f41 int 0x78 app_local_put ` - testApp(t, source, ep) - delta, err = ledger.GetDelta(&ep.Txn.Txn) - require.NoError(t, err) + delta = testApp(t, source, ep) require.Equal(t, 0, len(delta.GlobalDelta)) require.Equal(t, 1, len(delta.LocalDeltas)) vd = delta.LocalDeltas[0]["ALGOA"] @@ -2131,9 +2132,7 @@ int 0x78 app_local_put int 1 ` - testApp(t, source, ep) - delta, err = ledger.GetDelta(&ep.Txn.Txn) - require.NoError(t, err) + delta = testApp(t, source, ep) require.Equal(t, 0, len(delta.GlobalDelta)) require.Equal(t, 1, len(delta.LocalDeltas)) vd = delta.LocalDeltas[0]["ALGO"] @@ -2160,9 +2159,7 @@ byte 0x414c474f app_local_del int 1 ` - testApp(t, source, ep) - delta, err = ledger.GetDelta(&ep.Txn.Txn) - require.NoError(t, err) + delta = testApp(t, source, ep) require.Equal(t, 0, len(delta.GlobalDelta)) require.Equal(t, 1, len(delta.LocalDeltas)) vd = delta.LocalDeltas[0]["ALGO"] @@ -2189,9 +2186,7 @@ byte 0x414c474f41 app_local_del int 1 ` - testApp(t, source, ep) - delta, err = ledger.GetDelta(&ep.Txn.Txn) - require.NoError(t, err) + delta = testApp(t, source, ep) require.Equal(t, 0, len(delta.GlobalDelta)) require.Equal(t, 1, len(delta.LocalDeltas)) require.Equal(t, 1, len(delta.LocalDeltas[0])) @@ -2200,22 +2195,17 @@ int 1 func TestEnumFieldErrors(t *testing.T) { partitiontest.PartitionTest(t) - ep := defaultEvalParams(nil, nil) - source := `txn Amount` - origTxnType := TxnFieldTypes[Amount] - TxnFieldTypes[Amount] = StackBytes + origSpec := txnFieldSpecByField[Amount] + changed := origSpec + changed.ftype = StackBytes + txnFieldSpecByField[Amount] = changed defer func() { - TxnFieldTypes[Amount] = origTxnType + txnFieldSpecByField[Amount] = origSpec }() - ops := testProg(t, source, AssemblerMaxVersion) - _, err := Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "Amount expected field type is []byte but got uint64") - _, err = EvalStateful(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "Amount expected field type is []byte but got uint64") + testLogic(t, source, AssemblerMaxVersion, defaultEvalParams(nil), "Amount expected field type is []byte but got uint64") + testApp(t, source, defaultEvalParams(nil), "Amount expected field type is []byte but got uint64") source = `global MinTxnFee` @@ -2227,20 +2217,11 @@ func TestEnumFieldErrors(t *testing.T) { globalFieldSpecByField[MinTxnFee] = origMinTxnFs }() - ops = testProg(t, source, AssemblerMaxVersion) - _, err = Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "MinTxnFee expected field type is []byte but got uint64") - _, err = EvalStateful(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "MinTxnFee expected field type is []byte but got uint64") + testLogic(t, source, AssemblerMaxVersion, defaultEvalParams(nil), "MinTxnFee expected field type is []byte but got uint64") + testApp(t, source, defaultEvalParams(nil), "MinTxnFee expected field type is []byte but got uint64") - txn := makeSampleTxn() - ledger := logictest.MakeLedger( - map[basics.Address]uint64{ - txn.Txn.Sender: 1, - }, - ) + ep, tx, ledger := makeSampleEnv() + ledger.NewAccount(tx.Sender, 1) params := basics.AssetParams{ Total: 1000, Decimals: 2, @@ -2248,20 +2229,17 @@ func TestEnumFieldErrors(t *testing.T) { UnitName: "ALGO", AssetName: "", URL: string(protocol.PaymentTx), - Manager: txn.Txn.Sender, - Reserve: txn.Txn.Receiver, - Freeze: txn.Txn.Receiver, - Clawback: txn.Txn.Receiver, + Manager: tx.Sender, + Reserve: tx.Receiver, + Freeze: tx.Receiver, + Clawback: tx.Receiver, } - ledger.NewAsset(txn.Txn.Sender, 55, params) - - ep.Txn = &txn - ep.Ledger = ledger + ledger.NewAsset(tx.Sender, 55, params) source = `int 0 int 55 asset_holding_get AssetBalance -pop +assert ` origBalanceFs := assetHoldingFieldSpecByField[AssetBalance] badBalanceFs := origBalanceFs @@ -2271,14 +2249,11 @@ pop assetHoldingFieldSpecByField[AssetBalance] = origBalanceFs }() - ops = testProg(t, source, AssemblerMaxVersion) - _, err = EvalStateful(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "AssetBalance expected field type is []byte but got uint64") + testApp(t, source, ep, "AssetBalance expected field type is []byte but got uint64") source = `int 0 asset_params_get AssetTotal -pop +assert ` origTotalFs := assetParamsFieldSpecByField[AssetTotal] badTotalFs := origTotalFs @@ -2288,44 +2263,42 @@ pop assetParamsFieldSpecByField[AssetTotal] = origTotalFs }() - ops = testProg(t, source, AssemblerMaxVersion) - _, err = EvalStateful(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "AssetTotal expected field type is []byte but got uint64") + testApp(t, source, ep, "AssetTotal expected field type is []byte but got uint64") } func TestReturnTypes(t *testing.T) { partitiontest.PartitionTest(t) - // Ensure all opcodes return values they supposed to according to the OpSpecs table + // Ensure all opcodes return values they are supposed to according to the OpSpecs table t.Parallel() typeToArg := map[StackType]string{ StackUint64: "int 1\n", StackAny: "int 1\n", StackBytes: "byte 0x33343536\n", } - ep := defaultEvalParams(nil, nil) - txn := makeSampleTxn() - txn.Txn.Type = protocol.ApplicationCallTx - txgroup := makeSampleTxnGroup(txn) - ep.Txn = &txn - ep.TxnGroup = txgroup - ep.Txn.Txn.ApplicationID = 1 - ep.Txn.Txn.ForeignApps = []basics.AppIndex{txn.Txn.ApplicationID} - ep.Txn.Txn.ForeignAssets = []basics.AssetIndex{basics.AssetIndex(1), basics.AssetIndex(1)} - ep.GroupIndex = 1 - ep.PastSideEffects = MakePastSideEffects(len(txgroup)) - txn.Lsig.Args = [][]byte{ + ep, tx, ledger := makeSampleEnv() + + // This unit test reususes this `ep` willy-nilly. Would be nice to rewrite, + // but for now, trun off budget pooling so that it doesn't get exhausted. + ep.Proto.EnableAppCostPooling = false + ep.PooledApplicationBudget = nil + + tx.Type = protocol.ApplicationCallTx + tx.ApplicationID = 1 + tx.ForeignApps = []basics.AppIndex{tx.ApplicationID} + tx.ForeignAssets = []basics.AssetIndex{basics.AssetIndex(1), basics.AssetIndex(1)} + ep.TxnGroup[0].Lsig.Args = [][]byte{ []byte("aoeu"), []byte("aoeu"), []byte("aoeu2"), []byte("aoeu3"), } - ledger := logictest.MakeLedger( - map[basics.Address]uint64{ - txn.Txn.Sender: 1, - }, - ) + // We are going to run with GroupIndex=1, so make tx1 interesting too (so + // txn can look at things) + ep.TxnGroup[1] = ep.TxnGroup[0] + + ep.pastScratch[0] = &scratchSpace{} // for gload + ledger.NewAccount(tx.Sender, 1) params := basics.AssetParams{ Total: 1000, Decimals: 2, @@ -2333,23 +2306,20 @@ func TestReturnTypes(t *testing.T) { UnitName: "ALGO", AssetName: "", URL: string(protocol.PaymentTx), - Manager: txn.Txn.Sender, - Reserve: txn.Txn.Receiver, - Freeze: txn.Txn.Receiver, - Clawback: txn.Txn.Receiver, + Manager: tx.Sender, + Reserve: tx.Receiver, + Freeze: tx.Receiver, + Clawback: tx.Receiver, } - ledger.NewAsset(txn.Txn.Sender, 1, params) - ledger.NewApp(txn.Txn.Sender, 1, basics.AppParams{}) - ledger.SetTrackedCreatable(0, basics.CreatableLocator{Index: 1}) - ledger.NewAccount(txn.Txn.Receiver, 1000000) - ledger.NewLocals(txn.Txn.Receiver, 1) + ledger.NewAsset(tx.Sender, 1, params) + ledger.NewApp(tx.Sender, 1, basics.AppParams{}) + ledger.NewAccount(tx.Receiver, 1000000) + ledger.NewLocals(tx.Receiver, 1) key, err := hex.DecodeString("33343536") require.NoError(t, err) algoValue := basics.TealValue{Type: basics.TealUintType, Uint: 0x77} - ledger.NewLocal(txn.Txn.Receiver, 1, string(key), algoValue) - ledger.NewAccount(basics.AppIndex(1).Address(), 1000000) - - ep.Ledger = ledger + ledger.NewLocal(tx.Receiver, 1, string(key), algoValue) + ledger.NewAccount(appAddr(1), 1000000) specialCmd := map[string]string{ "txn": "txn Sender", @@ -2362,6 +2332,7 @@ func TestReturnTypes(t *testing.T) { "store": "store 0", "gload": "gload 0 0", "gloads": "gloads 0", + "gloadss": "pop; pop; int 0; int 1; gloadss", // Needs txn index = 0 to work "gaid": "gaid 0", "dig": "dig 0", "cover": "cover 0", @@ -2380,18 +2351,29 @@ func TestReturnTypes(t *testing.T) { "asset_params_get": "asset_params_get AssetTotal", "asset_holding_get": "asset_holding_get AssetBalance", "gtxns": "gtxns Sender", - "gtxnsa": "gtxnsa ApplicationArgs 0", + "gtxnsa": "pop; int 0; gtxnsa ApplicationArgs 0", "pushint": "pushint 7272", "pushbytes": `pushbytes "jojogoodgorilla"`, "app_params_get": "app_params_get AppGlobalNumUint", + "acct_params_get": "acct_params_get AcctMinBalance", "extract": "extract 0 2", "txnas": "txnas ApplicationArgs", "gtxnas": "gtxnas 0 ApplicationArgs", "gtxnsas": "pop; pop; int 0; int 0; gtxnsas ApplicationArgs", + "divw": "pop; pop; pop; int 1; int 2; int 3; divw", "args": "args", "itxn": "itxn_begin; int pay; itxn_field TypeEnum; itxn_submit; itxn CreatedAssetID", - // This next one is a cop out. Can't use itxna Logs until we have inner appl - "itxna": "itxn_begin; int pay; itxn_field TypeEnum; itxn_submit; itxn NumLogs", + "itxna": "itxn_begin; int pay; itxn_field TypeEnum; itxn_submit; itxna Accounts 0", + "itxnas": "itxn_begin; int pay; itxn_field TypeEnum; itxn_submit; itxnas Accounts", + "gitxn": "itxn_begin; int pay; itxn_field TypeEnum; itxn_submit; gitxn 0 Sender", + "gitxna": "itxn_begin; int pay; itxn_field TypeEnum; itxn_submit; gitxna 0 Accounts 0", + "gitxnas": "itxn_begin; int pay; itxn_field TypeEnum; itxn_submit; gitxnas 0 Accounts", + "base64_decode": `pushbytes "YWJjMTIzIT8kKiYoKSctPUB+"; base64_decode StdEncoding; pushbytes "abc123!?$*&()'-=@~"; ==; pushbytes "YWJjMTIzIT8kKiYoKSctPUB-"; base64_decode URLEncoding; pushbytes "abc123!?$*&()'-=@~"; ==; &&; assert`, + } + + /* Make sure the specialCmd tests the opcode in question */ + for opcode, cmd := range specialCmd { + assert.Contains(t, cmd, opcode) } // these require special input data and tested separately @@ -2422,25 +2404,35 @@ func TestReturnTypes(t *testing.T) { source := sb.String() ops := testProg(t, source, AssemblerMaxVersion) - var trace strings.Builder - ep.Trace = &trace + // Setup as if evaluation is in tx1, since we want to test gaid + // that must look back. + cx := EvalContext{ + EvalParams: ep, + runModeFlags: m, + GroupIndex: 1, + Txn: &ep.TxnGroup[1], + appID: 1, + } - var cx EvalContext - cx.EvalParams = ep - cx.runModeFlags = m + // These set conditions for some ops that examine the group. + // This convinces them all to work. Revisit. + cx.TxnGroup[0].ConfigAsset = 100 eval(ops.Program, &cx) - require.Equal( + assert.Equal( t, len(spec.Returns), len(cx.stack), - fmt.Sprintf("\n%s%s expected to return %d values but stack has %d", trace.String(), spec.Name, len(spec.Returns), len(cx.stack)), + fmt.Sprintf("\n%s%s expected to return %d values but stack is %#v", ep.Trace, spec.Name, len(spec.Returns), cx.stack), ) for i := 0; i < len(spec.Returns); i++ { sp := len(cx.stack) - 1 - i + if sp < 0 { + continue // We only assert this above, not require. + } stackType := cx.stack[sp].argType() retType := spec.Returns[i] - require.True( + assert.True( t, typecheck(retType, stackType), fmt.Sprintf("%s expected to return %s but actual is %s", spec.Name, retType.String(), stackType.String()), ) @@ -2450,10 +2442,36 @@ func TestReturnTypes(t *testing.T) { } } +func TestTxnEffects(t *testing.T) { + partitiontest.PartitionTest(t) + t.Parallel() + ep, _, _ := makeSampleEnv() + // We don't allow the effects fields to see the current or future transactions + testApp(t, "byte 0x32; log; txn NumLogs; int 1; ==", ep, "txn effects can only be read from past txns") + testApp(t, "byte 0x32; log; txn Logs 0; byte 0x32; ==", ep, "txn effects can only be read from past txns") + testApp(t, "byte 0x32; log; txn LastLog; byte 0x32; ==", ep, "txn effects can only be read from past txns") + testApp(t, "byte 0x32; log; gtxn 0 NumLogs; int 1; ==", ep, "txn effects can only be read from past txns") + testApp(t, "byte 0x32; log; gtxn 0 Logs 0; byte 0x32; ==", ep, "txn effects can only be read from past txns") + testApp(t, "byte 0x32; log; gtxn 0 LastLog; byte 0x32; ==", ep, "txn effects can only be read from past txns") + + // Look at the logs of tx 0 + testApps(t, []string{"", "byte 0x32; log; gtxn 0 LastLog; byte 0x; =="}, nil, AssemblerMaxVersion, nil) + testApps(t, []string{"byte 0x33; log; int 1", "gtxn 0 LastLog; byte 0x33; =="}, nil, AssemblerMaxVersion, nil) + testApps(t, []string{"byte 0x33; dup; log; log; int 1", "gtxn 0 NumLogs; int 2; =="}, nil, AssemblerMaxVersion, nil) + testApps(t, []string{"byte 0x37; log; int 1", "gtxn 0 Logs 0; byte 0x37; =="}, nil, AssemblerMaxVersion, nil) + testApps(t, []string{"byte 0x37; log; int 1", "int 0; gtxnas 0 Logs; byte 0x37; =="}, nil, AssemblerMaxVersion, nil) + + // Look past the logs of tx 0 + testApps(t, []string{"byte 0x37; log; int 1", "gtxna 0 Logs 1; byte 0x37; =="}, nil, AssemblerMaxVersion, nil, + Expect{1, "invalid Logs index 1"}) + testApps(t, []string{"byte 0x37; log; int 1", "int 6; gtxnas 0 Logs; byte 0x37; =="}, nil, AssemblerMaxVersion, nil, + Expect{1, "invalid Logs index 6"}) +} + func TestRound(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel() - ep, _ := makeSampleEnv() + ep, _, _ := makeSampleEnv() source := "global Round; int 1; >=" testApp(t, source, ep) } @@ -2461,7 +2479,7 @@ func TestRound(t *testing.T) { func TestLatestTimestamp(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel() - ep, _ := makeSampleEnv() + ep, _, _ := makeSampleEnv() source := "global LatestTimestamp; int 1; >=" testApp(t, source, ep) } @@ -2469,8 +2487,8 @@ func TestLatestTimestamp(t *testing.T) { func TestCurrentApplicationID(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel() - ep, ledger := makeSampleEnv() - ledger.NewApp(ep.Txn.Txn.Receiver, 42, basics.AppParams{}) + ep, tx, _ := makeSampleEnv() + tx.ApplicationID = 42 source := "global CurrentApplicationID; int 42; ==" testApp(t, source, ep) } @@ -2478,7 +2496,7 @@ func TestCurrentApplicationID(t *testing.T) { func TestAppLoop(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel() - ep, _ := makeSampleEnv() + ep, _, _ := makeSampleEnv() stateful := "global CurrentApplicationID; pop;" @@ -2503,25 +2521,29 @@ func TestPooledAppCallsVerifyOp(t *testing.T) { pop int 1` - ep, _ := makeSampleEnv() - ep.Proto.EnableAppCostPooling = true - ep.PooledApplicationBudget = new(uint64) + ledger := MakeLedger(nil) + call := transactions.SignedTxn{Txn: transactions.Transaction{Type: protocol.ApplicationCallTx}} // Simulate test with 2 grouped txn - *ep.PooledApplicationBudget = uint64(ep.Proto.MaxAppProgramCost * 2) - testApp(t, source, ep, "pc=107 dynamic cost budget exceeded, executing ed25519verify: remaining budget is 1400 but program cost was 1905") + testApps(t, []string{source, ""}, []transactions.SignedTxn{call, call}, LogicVersion, ledger, + Expect{0, "pc=107 dynamic cost budget exceeded, executing ed25519verify: local program cost was 5"}) // Simulate test with 3 grouped txn - *ep.PooledApplicationBudget = uint64(ep.Proto.MaxAppProgramCost * 3) - testApp(t, source, ep) + testApps(t, []string{source, "", ""}, []transactions.SignedTxn{call, call, call}, LogicVersion, ledger) +} + +func appAddr(id int) basics.Address { + return basics.AppIndex(id).Address() } -func TestAppAddress(t *testing.T) { - ep, ledger := makeSampleEnv() - ledger.NewApp(ep.Txn.Txn.Receiver, 888, basics.AppParams{}) - source := fmt.Sprintf("global CurrentApplicationAddress; addr %s; ==;", basics.AppIndex(888).Address()) +func TestAppInfo(t *testing.T) { + ep, tx, ledger := makeSampleEnv() + require.Equal(t, 888, int(tx.ApplicationID)) + ledger.NewApp(tx.Receiver, 888, basics.AppParams{}) + testApp(t, "global CurrentApplicationID; int 888; ==;", ep) + source := fmt.Sprintf("global CurrentApplicationAddress; addr %s; ==;", appAddr(888)) testApp(t, source, ep) - source = fmt.Sprintf("int 0; app_params_get AppAddress; assert; addr %s; ==;", basics.AppIndex(888).Address()) + source = fmt.Sprintf("int 0; app_params_get AppAddress; assert; addr %s; ==;", appAddr(888)) testApp(t, source, ep) // To document easy construction: @@ -2530,3 +2552,54 @@ func TestAppAddress(t *testing.T) { source = fmt.Sprintf("int 0; app_params_get AppAddress; assert; addr %s; ==;", a) testApp(t, source, ep) } + +func TestBudget(t *testing.T) { + ep := defaultEvalParams(nil) + source := ` +global OpcodeBudget +int 699 +== +assert +global OpcodeBudget +int 695 +== +` + testApp(t, source, ep) +} + +func TestSelfMutate(t *testing.T) { + ep, _, ledger := makeSampleEnv() + + /* In order to test the added protection of mutableAccountReference, we're + going to set up a ledger in which an app account is opted into + itself. That was impossible before v6, and indeed we did not have the + extra mutable reference check then. */ + ledger.NewLocals(basics.AppIndex(888).Address(), 888) + ledger.NewLocal(basics.AppIndex(888).Address(), 888, "hey", + basics.TealValue{Type: basics.TealUintType, Uint: 77}) + + source := ` +global CurrentApplicationAddress +byte "hey" +int 42 +app_local_put +` + testApp(t, source, ep, "invalid Account reference for mutation") + + source = ` +global CurrentApplicationAddress +byte "hey" +app_local_del +` + testApp(t, source, ep, "invalid Account reference for mutation") + + /* But let's just check normal access is working properly. */ + source = ` +global CurrentApplicationAddress +byte "hey" +app_local_get +int 77 +== +` + testApp(t, source, ep) +} diff --git a/data/transactions/logic/eval_test.go b/data/transactions/logic/eval_test.go index 74b9f931cb..9c35af8401 100644 --- a/data/transactions/logic/eval_test.go +++ b/data/transactions/logic/eval_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -25,6 +25,7 @@ import ( "strings" "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/algorand/go-algorand/config" @@ -32,20 +33,19 @@ import ( "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/bookkeeping" "github.com/algorand/go-algorand/data/transactions" - "github.com/algorand/go-algorand/data/transactions/logictest" "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" ) -// Note that most of the tests use defaultEvalProto/defaultEvalParams as evaluator version so that +// Note that most of the tests use makeTestProto/defaultEvalParams as evaluator version so that // we check that TEAL v1 and v2 programs are compatible with the latest evaluator -func defaultEvalProto() config.ConsensusParams { - return defaultEvalProtoWithVersion(LogicVersion) +func makeTestProto() *config.ConsensusParams { + return makeTestProtoV(LogicVersion) } -func defaultEvalProtoWithVersion(version uint64) config.ConsensusParams { - return config.ConsensusParams{ +func makeTestProtoV(version uint64) *config.ConsensusParams { + return &config.ConsensusParams{ LogicSigVersion: version, LogicSigMaxCost: 20000, Application: version >= appsEnabledVersion, @@ -62,6 +62,7 @@ func defaultEvalProtoWithVersion(version uint64) config.ConsensusParams { SchemaMinBalancePerEntry: 1003, SchemaUintMinBalance: 1004, SchemaBytesMinBalance: 1005, + AppFlatOptInMinBalance: 1006, MaxInnerTransactions: 4, MaxTxGroupSize: 8, @@ -79,45 +80,79 @@ func defaultEvalProtoWithVersion(version uint64) config.ConsensusParams { EnableFeePooling: true, // Chosen to be different from one another and from normal proto - MaxAppTxnAccounts: 3, - MaxAppTxnForeignApps: 5, - MaxAppTxnForeignAssets: 6, - } -} + MaxAppTxnAccounts: 3, + MaxAppTxnForeignApps: 5, + MaxAppTxnForeignAssets: 6, + MaxAppTotalTxnReferences: 7, + + MaxAppArgs: 12, + MaxAppTotalArgLen: 800, + + MaxAppProgramLen: 900, + MaxAppTotalProgramLen: 1200, // Weird, but better tests + MaxExtraAppProgramPages: 2, -func defaultEvalParamsV1(sb *strings.Builder, txn *transactions.SignedTxn) EvalParams { - return defaultEvalParamsWithVersion(sb, txn, 1) + MaxGlobalSchemaEntries: 30, + MaxLocalSchemaEntries: 13, + + EnableAppCostPooling: true, + EnableInnerTransactionPooling: true, + + SupportBecomeNonParticipatingTransactions: true, + } } -func defaultEvalParams(sb *strings.Builder, txn *transactions.SignedTxn) EvalParams { - return defaultEvalParamsWithVersion(sb, txn, LogicVersion) +func defaultEvalParams(txn *transactions.SignedTxn) *EvalParams { + return defaultEvalParamsWithVersion(txn, LogicVersion) } -func benchmarkEvalParams(sb *strings.Builder, txn *transactions.SignedTxn) EvalParams { - ep := defaultEvalParamsWithVersion(sb, txn, LogicVersion) - ep.Proto.LogicSigMaxCost = 1000 * 1000 +func benchmarkEvalParams(txn *transactions.SignedTxn) *EvalParams { + ep := defaultEvalParamsWithVersion(txn, LogicVersion) + ep.Trace = nil // Tracing would slow down benchmarks + clone := *ep.Proto + bigBudget := 1000 * 1000 // Allow long run times + clone.LogicSigMaxCost = uint64(bigBudget) + clone.MaxAppProgramCost = bigBudget + ep.Proto = &clone + ep.PooledApplicationBudget = &bigBudget return ep } -func defaultEvalParamsWithVersion(sb *strings.Builder, txn *transactions.SignedTxn, version uint64) EvalParams { - proto := defaultEvalProtoWithVersion(version) - - var pt *transactions.SignedTxn +func defaultEvalParamsWithVersion(txn *transactions.SignedTxn, version uint64) *EvalParams { + var zero uint64 + ep := &EvalParams{ + Proto: makeTestProtoV(version), + TxnGroup: make([]transactions.SignedTxnWithAD, 1), + Specials: &transactions.SpecialAddresses{}, + Trace: &strings.Builder{}, + FeeCredit: &zero, + } if txn != nil { - pt = txn - } else { - pt = &transactions.SignedTxn{} + ep.TxnGroup[0].SignedTxn = *txn } + ep.reset() + return ep +} - ep := EvalParams{} - ep.Proto = &proto - ep.Txn = pt - ep.PastSideEffects = MakePastSideEffects(5) - ep.Specials = &transactions.SpecialAddresses{} - if sb != nil { // have to do this since go's nil semantics: https://golang.org/doc/faq#nil_error - ep.Trace = sb +// reset puts an ep back into its original state. This is in *_test.go because +// no real code should ever need this. EvalParams should be created to evaluate +// a group, and then thrown away. +func (ep *EvalParams) reset() { + if ep.Proto.EnableAppCostPooling { + budget := ep.Proto.MaxAppProgramCost + ep.PooledApplicationBudget = &budget } - return ep + if ep.Proto.EnableInnerTransactionPooling { + inners := ep.Proto.MaxTxGroupSize * ep.Proto.MaxInnerTransactions + ep.pooledAllowedInners = &inners + } + ep.pastScratch = make([]*scratchSpace, ep.Proto.MaxTxGroupSize) + for i := range ep.TxnGroup { + ep.TxnGroup[i].ApplyData = transactions.ApplyData{} + } + ep.created = &resources{} + ep.appAddrCache = make(map[basics.AppIndex]basics.Address) + ep.Trace = &strings.Builder{} } func TestTooManyArgs(t *testing.T) { @@ -131,8 +166,7 @@ func TestTooManyArgs(t *testing.T) { txn.Lsig.Logic = ops.Program args := [transactions.EvalMaxArgs + 1][]byte{} txn.Lsig.Args = args[:] - sb := strings.Builder{} - pass, err := Eval(ops.Program, defaultEvalParams(&sb, &txn)) + pass, err := EvalSignature(0, defaultEvalParams(&txn)) require.Error(t, err) require.False(t, pass) }) @@ -143,32 +177,23 @@ func TestEmptyProgram(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel() - pass, err := Eval(nil, defaultEvalParams(nil, nil)) - require.Error(t, err) - require.Contains(t, err.Error(), "invalid program (empty)") - require.False(t, pass) + testLogicBytes(t, nil, defaultEvalParams(nil), "invalid", "invalid program (empty)") } // TestMinTealVersionParamEval tests eval/check reading the MinTealVersion from the param -func TestMinTealVersionParamEvalCheck(t *testing.T) { +func TestMinTealVersionParamEvalCheckSignature(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel() - params := defaultEvalParams(nil, nil) + params := defaultEvalParams(nil) version2 := uint64(rekeyingEnabledVersion) params.MinTealVersion = &version2 program := make([]byte, binary.MaxVarintLen64) // set the teal program version to 1 binary.PutUvarint(program, 1) - err := Check(program, params) - require.Contains(t, err.Error(), fmt.Sprintf("program version must be >= %d", appsEnabledVersion)) - - // If the param is read correctly, the eval should fail - pass, err := Eval(program, params) - require.Error(t, err) - require.Contains(t, err.Error(), fmt.Sprintf("program version must be >= %d", appsEnabledVersion)) - require.False(t, pass) + verErr := fmt.Sprintf("program version must be >= %d", appsEnabledVersion) + testAppBytes(t, program, params, verErr, verErr) } func TestTxnFieldToTealValue(t *testing.T) { @@ -181,7 +206,7 @@ func TestTxnFieldToTealValue(t *testing.T) { for _, value := range values { txn.FirstValid = basics.Round(value) - tealValue, err := TxnFieldToTealValue(&txn, groupIndex, field, 0) + tealValue, err := TxnFieldToTealValue(&txn, groupIndex, field, 0, false) require.NoError(t, err) require.Equal(t, basics.TealUintType, tealValue.Type) require.Equal(t, value, tealValue.Uint) @@ -191,7 +216,7 @@ func TestTxnFieldToTealValue(t *testing.T) { field = FirstValid value := uint64(1) txn.FirstValid = basics.Round(value) - tealValue, err := TxnFieldToTealValue(&txn, groupIndex, field, 10) + tealValue, err := TxnFieldToTealValue(&txn, groupIndex, field, 10, false) require.NoError(t, err) require.Equal(t, basics.TealUintType, tealValue.Type) require.Equal(t, value, tealValue.Uint) @@ -201,17 +226,17 @@ func TestTxnFieldToTealValue(t *testing.T) { sender := basics.Address{} addr, _ := basics.UnmarshalChecksumAddress("DFPKC2SJP3OTFVJFMCD356YB7BOT4SJZTGWLIPPFEWL3ZABUFLTOY6ILYE") txn.Accounts = []basics.Address{addr} - tealValue, err = TxnFieldToTealValue(&txn, groupIndex, field, 0) + tealValue, err = TxnFieldToTealValue(&txn, groupIndex, field, 0, false) require.NoError(t, err) require.Equal(t, basics.TealBytesType, tealValue.Type) require.Equal(t, string(sender[:]), tealValue.Bytes) - tealValue, err = TxnFieldToTealValue(&txn, groupIndex, field, 1) + tealValue, err = TxnFieldToTealValue(&txn, groupIndex, field, 1, false) require.NoError(t, err) require.Equal(t, basics.TealBytesType, tealValue.Type) require.Equal(t, string(addr[:]), tealValue.Bytes) - tealValue, err = TxnFieldToTealValue(&txn, groupIndex, field, 100) + tealValue, err = TxnFieldToTealValue(&txn, groupIndex, field, 100, false) require.Error(t, err) require.Equal(t, basics.TealUintType, tealValue.Type) require.Equal(t, uint64(0), tealValue.Uint) @@ -225,20 +250,8 @@ func TestWrongProtoVersion(t *testing.T) { for v := uint64(1); v <= AssemblerMaxVersion; v++ { t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { ops := testProg(t, "int 1", v) - var txn transactions.SignedTxn - txn.Lsig.Logic = ops.Program - sb := strings.Builder{} - proto := defaultEvalProto() - proto.LogicSigVersion = 0 - ep := defaultEvalParams(&sb, &txn) - ep.Proto = &proto - err := Check(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "LogicSig not supported") - pass, err := Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "LogicSig not supported") - require.False(t, pass) + ep := defaultEvalParamsWithVersion(nil, 0) + testAppBytes(t, ops.Program, ep, "LogicSig not supported", "LogicSig not supported") }) } } @@ -268,11 +281,10 @@ byte base64 5rZMNsevs5sULO+54aN+OvU6lQ503z2X+SSYUABIx7E= var txn transactions.SignedTxn txn.Lsig.Logic = ops.Program txn.Lsig.Args = [][]byte{[]byte("=0\x97S\x85H\xe9\x91B\xfd\xdb;1\xf5Z\xaec?\xae\xf2I\x93\x08\x12\x94\xaa~\x06\x08\x849b")} - sb := strings.Builder{} - ep := defaultEvalParams(&sb, &txn) - err := Check(ops.Program, ep) + ep := defaultEvalParams(&txn) + err := CheckSignature(0, ep) require.NoError(t, err) - pass, err := Eval(ops.Program, ep) + pass, err := EvalSignature(0, ep) require.True(t, pass) require.NoError(t, err) }) @@ -329,70 +341,65 @@ func TestTLHC(t *testing.T) { // right answer txn.Lsig.Args = [][]byte{secret} txn.Txn.FirstValid = 999999 - sb := strings.Builder{} block := bookkeeping.Block{} - ep := defaultEvalParams(&sb, &txn) - err := Check(ops.Program, ep) + ep := defaultEvalParams(&txn) + err := CheckSignature(0, ep) if err != nil { t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) + t.Log(ep.Trace.String()) } require.NoError(t, err) - pass, err := Eval(ops.Program, ep) + pass, err := EvalSignature(0, ep) if pass { t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) + t.Log(ep.Trace.String()) } require.False(t, pass) isNotPanic(t, err) txn.Txn.Receiver = a2 txn.Txn.CloseRemainderTo = a2 - sb = strings.Builder{} - ep = defaultEvalParams(&sb, &txn) - pass, err = Eval(ops.Program, ep) + ep = defaultEvalParams(&txn) + pass, err = EvalSignature(0, ep) if !pass { t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) + t.Log(ep.Trace.String()) } require.True(t, pass) require.NoError(t, err) txn.Txn.Receiver = a2 txn.Txn.CloseRemainderTo = a2 - sb = strings.Builder{} txn.Txn.FirstValid = 1 - ep = defaultEvalParams(&sb, &txn) - pass, err = Eval(ops.Program, ep) + ep = defaultEvalParams(&txn) + pass, err = EvalSignature(0, ep) if pass { t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) + t.Log(ep.Trace.String()) } require.False(t, pass) isNotPanic(t, err) txn.Txn.Receiver = a1 txn.Txn.CloseRemainderTo = a1 - sb = strings.Builder{} txn.Txn.FirstValid = 999999 - ep = defaultEvalParams(&sb, &txn) - pass, err = Eval(ops.Program, ep) + ep = defaultEvalParams(&txn) + pass, err = EvalSignature(0, ep) if !pass { t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) + t.Log(ep.Trace.String()) } require.True(t, pass) require.NoError(t, err) // wrong answer txn.Lsig.Args = [][]byte{[]byte("=0\x97S\x85H\xe9\x91B\xfd\xdb;1\xf5Z\xaec?\xae\xf2I\x93\x08\x12\x94\xaa~\x06\x08\x849a")} - sb = strings.Builder{} block.BlockHeader.Round = 1 - ep = defaultEvalParams(&sb, &txn) - pass, err = Eval(ops.Program, ep) + ep = defaultEvalParams(&txn) + pass, err = EvalSignature(0, ep) if pass { t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) + t.Log(ep.Trace.String()) } require.False(t, pass) isNotPanic(t, err) @@ -570,6 +577,19 @@ int 1 // ret 1 `, 2) } +func TestDivw(t *testing.T) { + partitiontest.PartitionTest(t) + + t.Parallel() + testPanics(t, "int 1; int 2; int 0; divw; assert;", 6) + testPanics(t, "int 2; int 1; int 1; divw; assert;", 6) + testPanics(t, "int 2; int 0; int 2; divw; assert", 6) + testAccepts(t, "int 1; int 2; int 2; divw;", 6) + + testAccepts(t, "int 1; int 0; int 2; divw; int 0x8000000000000000; ==", 6) + testAccepts(t, "int 0; int 90; int 30; divw; int 3; ==", 6) +} + func TestUint128(t *testing.T) { partitiontest.PartitionTest(t) @@ -790,20 +810,8 @@ func TestTxnBadField(t *testing.T) { t.Parallel() program := []byte{0x01, 0x31, 0x7f} - err := Check(program, defaultEvalParams(nil, nil)) - require.NoError(t, err) // TODO: Check should know the type stack was wrong - sb := strings.Builder{} - var txn transactions.SignedTxn - txn.Lsig.Logic = program - txn.Lsig.Args = nil - pass, err := Eval(program, defaultEvalParams(&sb, &txn)) - if pass { - t.Log(hex.EncodeToString(program)) - t.Log(sb.String()) - } - require.Error(t, err) - require.False(t, pass) - isNotPanic(t, err) + testLogicBytes(t, program, defaultEvalParams(nil), "invalid txn field") + // TODO: Check should know the type stack was wrong // test txn does not accept ApplicationArgs and Accounts txnOpcode := OpsByName[LogicVersion]["txn"].Opcode @@ -815,10 +823,7 @@ func TestTxnBadField(t *testing.T) { ops := testProg(t, source, AssemblerMaxVersion) require.Equal(t, txnaOpcode, ops.Program[1]) ops.Program[1] = txnOpcode - pass, err = Eval(ops.Program, defaultEvalParams(&sb, &txn)) - require.Error(t, err) - require.Contains(t, err.Error(), fmt.Sprintf("invalid txn field %d", field)) - require.False(t, pass) + testLogicBytes(t, ops.Program, defaultEvalParams(nil), fmt.Sprintf("invalid txn field %d", field)) } } @@ -827,49 +832,16 @@ func TestGtxnBadIndex(t *testing.T) { t.Parallel() program := []byte{0x01, 0x33, 0x1, 0x01} - err := Check(program, defaultEvalParams(nil, nil)) - require.NoError(t, err) // TODO: Check should know the type stack was wrong - sb := strings.Builder{} - var txn transactions.SignedTxn - txn.Lsig.Logic = program - txn.Lsig.Args = nil - txgroup := make([]transactions.SignedTxn, 1) - txgroup[0] = txn - ep := defaultEvalParams(&sb, &txn) - ep.TxnGroup = txgroup - pass, err := Eval(program, ep) - if pass { - t.Log(hex.EncodeToString(program)) - t.Log(sb.String()) - } - require.Error(t, err) - require.False(t, pass) - isNotPanic(t, err) + testLogicBytes(t, program, defaultEvalParams(nil), "txn index 1") } func TestGtxnBadField(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel() - program := []byte{0x01, 0x33, 0x0, 0x7f} - err := Check(program, defaultEvalParams(nil, nil)) - require.NoError(t, err) // TODO: Check should know the type stack was wrong - sb := strings.Builder{} - var txn transactions.SignedTxn - txn.Lsig.Logic = program - txn.Lsig.Args = nil - txgroup := make([]transactions.SignedTxn, 1) - txgroup[0] = txn - ep := defaultEvalParams(&sb, &txn) - ep.TxnGroup = txgroup - pass, err := Eval(program, ep) - if pass { - t.Log(hex.EncodeToString(program)) - t.Log(sb.String()) - } - require.Error(t, err) - require.False(t, pass) - isNotPanic(t, err) + program := []byte{0x01, 0x33, 0x0, 127} + // TODO: Check should know the type stack was wrong + testLogicBytes(t, program, defaultEvalParams(nil), "invalid txn field 127") // test gtxn does not accept ApplicationArgs and Accounts txnOpcode := OpsByName[LogicVersion]["txn"].Opcode @@ -881,10 +853,7 @@ func TestGtxnBadField(t *testing.T) { ops := testProg(t, source, AssemblerMaxVersion) require.Equal(t, txnaOpcode, ops.Program[1]) ops.Program[1] = txnOpcode - pass, err = Eval(ops.Program, defaultEvalParams(&sb, &txn)) - require.Error(t, err) - require.Contains(t, err.Error(), fmt.Sprintf("invalid txn field %d", field)) - require.False(t, pass) + testLogicBytes(t, ops.Program, defaultEvalParams(nil), fmt.Sprintf("invalid txn field %d", field)) } } @@ -892,21 +861,8 @@ func TestGlobalBadField(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel() - program := []byte{0x01, 0x32, 0x7f} - err := Check(program, defaultEvalParams(nil, nil)) - require.NoError(t, err) // Check does not validates opcode args - sb := strings.Builder{} - var txn transactions.SignedTxn - txn.Lsig.Logic = program - txn.Lsig.Args = nil - pass, err := Eval(program, defaultEvalParams(&sb, &txn)) - if pass { - t.Log(hex.EncodeToString(program)) - t.Log(sb.String()) - } - require.Error(t, err) - require.False(t, pass) - isNotPanic(t, err) + program := []byte{0x01, 0x32, 127} + testLogicBytes(t, program, defaultEvalParams(nil), "invalid global field") } func TestArg(t *testing.T) { @@ -919,11 +875,8 @@ func TestArg(t *testing.T) { if v >= 5 { source += "int 0; args; int 1; args; ==; assert; int 2; args; int 3; args; !=; assert" } - ops := testProg(t, source, v) - err := Check(ops.Program, defaultEvalParams(nil, nil)) - require.NoError(t, err) + var txn transactions.SignedTxn - txn.Lsig.Logic = ops.Program txn.Lsig.Args = [][]byte{ []byte("aoeu"), []byte("aoeu"), @@ -931,28 +884,22 @@ func TestArg(t *testing.T) { []byte("aoeu3"), []byte("aoeu4"), } - sb := strings.Builder{} - pass, err := Eval(ops.Program, defaultEvalParams(&sb, &txn)) - if !pass { - t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) - } - require.NoError(t, err) - require.True(t, pass) + ops := testProg(t, source, v) + testLogicBytes(t, ops.Program, defaultEvalParams(&txn)) }) } } const globalV1TestProgram = ` global MinTxnFee -int 123 +int 1001 == global MinBalance -int 1000000 +int 1001 == && global MaxTxnLife -int 999 +int 1500 == && global ZeroAddress @@ -981,7 +928,7 @@ int 0 > && global CurrentApplicationID -int 42 +int 888 == && ` @@ -1009,7 +956,17 @@ byte 0x0706000000000000000000000000000000000000000000000000000000000000 ` const globalV6TestProgram = globalV5TestProgram + ` -// No new globals in v6 +global OpcodeBudget +int 0 +> +&& +global CallerApplicationAddress +global ZeroAddress +== +&& +global CallerApplicationID +! +&& ` func TestGlobal(t *testing.T) { @@ -1019,81 +976,43 @@ func TestGlobal(t *testing.T) { type desc struct { lastField GlobalField program string - eval func([]byte, EvalParams) (bool, error) - check func([]byte, EvalParams) error } + // Associate the highest allowed global constant with each version's test program tests := map[uint64]desc{ - 0: {GroupSize, globalV1TestProgram, Eval, Check}, - 1: {GroupSize, globalV1TestProgram, Eval, Check}, - 2: { - CurrentApplicationID, globalV2TestProgram, - EvalStateful, CheckStateful, - }, - 3: { - CreatorAddress, globalV3TestProgram, - EvalStateful, CheckStateful, - }, - 4: { - CreatorAddress, globalV4TestProgram, - EvalStateful, CheckStateful, - }, - 5: { - GroupID, globalV5TestProgram, - EvalStateful, CheckStateful, - }, - 6: { - GroupID, globalV6TestProgram, - EvalStateful, CheckStateful, - }, + 0: {GroupSize, globalV1TestProgram}, + 1: {GroupSize, globalV1TestProgram}, + 2: {CurrentApplicationID, globalV2TestProgram}, + 3: {CreatorAddress, globalV3TestProgram}, + 4: {CreatorAddress, globalV4TestProgram}, + 5: {GroupID, globalV5TestProgram}, + 6: {CallerApplicationAddress, globalV6TestProgram}, } // tests keys are versions so they must be in a range 1..AssemblerMaxVersion plus zero version require.LessOrEqual(t, len(tests), AssemblerMaxVersion+1) + require.Len(t, globalFieldSpecs, int(invalidGlobalField)) - ledger := logictest.MakeLedger(nil) + ledger := MakeLedger(nil) addr, err := basics.UnmarshalChecksumAddress(testAddr) require.NoError(t, err) - ledger.NewApp(addr, basics.AppIndex(42), basics.AppParams{}) + ledger.NewApp(addr, 888, basics.AppParams{}) for v := uint64(1); v <= AssemblerMaxVersion; v++ { _, ok := tests[v] require.True(t, ok) t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { last := tests[v].lastField testProgram := tests[v].program - check := tests[v].check - eval := tests[v].eval - for _, globalField := range GlobalFieldNames[:last] { + for _, globalField := range GlobalFieldNames[:last+1] { if !strings.Contains(testProgram, globalField) { t.Errorf("TestGlobal missing field %v", globalField) } } - ops := testProg(t, testProgram, v) - err := check(ops.Program, defaultEvalParams(nil, nil)) - require.NoError(t, err) - var txn transactions.SignedTxn - txn.Lsig.Logic = ops.Program + + txn := transactions.SignedTxn{} txn.Txn.Group = crypto.Digest{0x07, 0x06} - txgroup := make([]transactions.SignedTxn, 1) - txgroup[0] = txn - sb := strings.Builder{} - proto := config.ConsensusParams{ - MinTxnFee: 123, - MinBalance: 1000000, - MaxTxnLife: 999, - LogicSigVersion: LogicVersion, - LogicSigMaxCost: 20000, - MaxAppProgramCost: 700, - } - ep := defaultEvalParams(&sb, &txn) - ep.TxnGroup = txgroup - ep.Proto = &proto + + ep := defaultEvalParams(&txn) ep.Ledger = ledger - pass, err := eval(ops.Program, ep) - if !pass { - t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) - } - require.NoError(t, err) - require.True(t, pass) + testApp(t, tests[v].program, ep) }) } } @@ -1134,19 +1053,14 @@ int %s == &&`, symbol, string(tt)) ops := testProg(t, text, v) - err := Check(ops.Program, defaultEvalParams(nil, nil)) - require.NoError(t, err) - var txn transactions.SignedTxn + txn := transactions.SignedTxn{} txn.Txn.Type = tt - sb := strings.Builder{} - ep := defaultEvalParams(&sb, &txn) - pass, err := Eval(ops.Program, ep) - if !pass { - t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) + if v < appsEnabledVersion && tt == protocol.ApplicationCallTx { + testLogicBytes(t, ops.Program, defaultEvalParams(&txn), + "program version must be", "program version must be") + return } - require.NoError(t, err) - require.True(t, pass) + testLogicBytes(t, ops.Program, defaultEvalParams(&txn)) }) } }) @@ -1283,7 +1197,7 @@ arg 8 ` const testTxnProgramTextV2 = testTxnProgramTextV1 + `txn ApplicationID -int 123 +int 888 == && txn OnCompletion @@ -1456,8 +1370,64 @@ assert int 1 ` +// The additions in v6 were all "effects" so they must look behind. They use gtxn 2. const testTxnProgramTextV6 = testTxnProgramTextV5 + ` assert +txn StateProofPK +len +int 64 +== +assert + +gtxn 2 CreatedAssetID +int 0 +== +assert + +gtxn 2 CreatedApplicationID +int 0 +== +assert + +gtxn 2 NumLogs +int 2 +== +assert + +gtxn 2 Logs 1 +byte "prefilled" +== +assert + +gtxn 2 LastLog +byte "prefilled" +== +assert + +gtxn 2 CreatedAssetID +int 0 +== +assert + +gtxn 2 CreatedApplicationID +int 0 +== +assert + +gtxn 2 NumLogs +int 2 +== +assert + +gtxn 2 Logs 1 +byte "prefilled" +== +assert + +gtxn 2 LastLog +byte "prefilled" +== +assert int 1 ` @@ -1469,6 +1439,7 @@ func makeSampleTxn() transactions.SignedTxn { copy(txn.Txn.CloseRemainderTo[:], []byte("aoeuiaoeuiaoeuiaoeuiaoeuiaoeui02")) copy(txn.Txn.VotePK[:], []byte("aoeuiaoeuiaoeuiaoeuiaoeuiaoeui03")) copy(txn.Txn.SelectionPK[:], []byte("aoeuiaoeuiaoeuiaoeuiaoeuiaoeui04")) + copy(txn.Txn.StateProofPK[:], []byte("aoeuiaoeuiaoeuiaoeuiaoeuiaoeuiaoeuiaoeuiaoeuiaoeuiaoeuiaoeuiao05")) txn.Txn.XferAsset = 10 // This is not a valid transaction to have all these fields set this way txn.Txn.Note = []byte("fnord") @@ -1486,7 +1457,7 @@ func makeSampleTxn() transactions.SignedTxn { txn.Txn.AssetSender = txn.Txn.Receiver txn.Txn.AssetReceiver = txn.Txn.CloseRemainderTo txn.Txn.AssetCloseTo = txn.Txn.Sender - txn.Txn.ApplicationID = basics.AppIndex(123) + txn.Txn.ApplicationID = basics.AppIndex(888) txn.Txn.Accounts = make([]basics.Address, 1) txn.Txn.Accounts[0] = txn.Txn.Receiver rekeyToAddr := []byte("aoeuiaoeuiaoeuiaoeuiaoeuiaoeui05") @@ -1530,32 +1501,31 @@ func makeSampleTxn() transactions.SignedTxn { return txn } -func makeSampleTxnGroup(txn transactions.SignedTxn) []transactions.SignedTxn { - txgroup := make([]transactions.SignedTxn, 2) - txgroup[0] = txn - txgroup[1].Txn.Amount.Raw = 42 - txgroup[1].Txn.Fee.Raw = 1066 - txgroup[1].Txn.FirstValid = 42 - txgroup[1].Txn.LastValid = 1066 - txgroup[1].Txn.Sender = txn.Txn.Receiver - txgroup[1].Txn.Receiver = txn.Txn.Sender - txgroup[1].Txn.ExtraProgramPages = 2 - return txgroup +// makeSampleTxnGroup creates a sample txn group. If less than two transactions +// are supplied, samples are used. +func makeSampleTxnGroup(txns ...transactions.SignedTxn) []transactions.SignedTxn { + if len(txns) == 0 { + txns = []transactions.SignedTxn{makeSampleTxn()} + } + if len(txns) == 1 { + second := transactions.SignedTxn{} + second.Txn.Type = protocol.PaymentTx + second.Txn.Amount.Raw = 42 + second.Txn.Fee.Raw = 1066 + second.Txn.FirstValid = 42 + second.Txn.LastValid = 1066 + second.Txn.Sender = txns[0].Txn.Receiver + second.Txn.Receiver = txns[0].Txn.Sender + second.Txn.ExtraProgramPages = 2 + txns = append(txns, second) + } + return txns } func TestTxn(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel() - for i, txnField := range TxnFieldNames { - fs := txnFieldSpecByField[TxnField(i)] - if !fs.effects && !strings.Contains(testTxnProgramTextV6, txnField) { - if txnField != FirstValidTime.String() { - t.Errorf("TestTxn missing field %v", txnField) - } - } - } - tests := map[uint64]string{ 1: testTxnProgramTextV1, 2: testTxnProgramTextV2, @@ -1565,13 +1535,31 @@ func TestTxn(t *testing.T) { 6: testTxnProgramTextV6, } + for i, txnField := range TxnFieldNames { + fs := txnFieldSpecByField[TxnField(i)] + // Ensure that each field appears, starting in the version it was introduced + for v := uint64(1); v <= uint64(LogicVersion); v++ { + if v < fs.version { + continue + } + if !strings.Contains(tests[v], txnField) { + if txnField == FirstValidTime.String() { + continue + } + // fields were introduced for itxn before they became available for txn + if v < txnEffectsVersion && fs.effects { + continue + } + t.Errorf("testTxnProgramTextV%d missing field %v", v, txnField) + } + } + } + clearOps := testProg(t, "int 1", 1) for v, source := range tests { t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { ops := testProg(t, source, v) - err := Check(ops.Program, defaultEvalParams(nil, nil)) - require.NoError(t, err) txn := makeSampleTxn() txn.Txn.ApprovalProgram = ops.Program txn.Txn.ClearStateProgram = clearOps.Program @@ -1597,17 +1585,28 @@ func TestTxn(t *testing.T) { programHash[:], clearProgramHash[:], } - sb := strings.Builder{} - ep := defaultEvalParams(&sb, &txn) - ep.Ledger = logictest.MakeLedger(nil) - ep.GroupIndex = 3 - pass, err := Eval(ops.Program, ep) - if !pass { - t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) + // Since we test GroupIndex ==3, we need to fake up such a group + ep := defaultEvalParams(nil) + ep.TxnGroup = transactions.WrapSignedTxnsWithAD([]transactions.SignedTxn{txn, txn, txn, txn}) + ep.TxnGroup[2].EvalDelta.Logs = []string{"x", "prefilled"} + if v < txnEffectsVersion { + testLogicFull(t, ops.Program, 3, ep) + } else { + // Starting in txnEffectsVersion, there are fields we can't access all fields in Logic mode + testLogicFull(t, ops.Program, 3, ep, "not allowed in current mode") + // And the early tests use "arg" a lot - not allowed in stateful. So remove those tests. + lastArg := strings.Index(source, "arg 10\n==\n&&") + require.NotEqual(t, -1, lastArg) + + appSafe := "int 1" + strings.Replace(source[lastArg+12:], `txn Sender +int 0 +args +== +assert`, "", 1) + + ops := testProg(t, appSafe, v) + testAppFull(t, ops.Program, 3, basics.AppIndex(888), ep) } - require.NoError(t, err) - require.True(t, pass) }) } } @@ -1656,44 +1655,22 @@ int 0 return ` ops := testProg(t, cachedTxnProg, 2) - sb := strings.Builder{} - err := Check(ops.Program, defaultEvalParams(&sb, nil)) - if err != nil { - t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) - } - require.NoError(t, err) - txn := makeSampleTxn() - txgroup := makeSampleTxnGroup(txn) - txn.Lsig.Logic = ops.Program - txid0 := txgroup[0].ID() - txid1 := txgroup[1].ID() - txn.Lsig.Args = [][]byte{ + + ep, _, _ := makeSampleEnv() + txid0 := ep.TxnGroup[0].ID() + txid1 := ep.TxnGroup[1].ID() + ep.TxnGroup[0].Lsig.Args = [][]byte{ txid0[:], txid1[:], } - sb = strings.Builder{} - ep := defaultEvalParams(&sb, &txn) - ep.TxnGroup = txgroup - pass, err := Eval(ops.Program, ep) - if !pass || err != nil { - t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) - } - require.NoError(t, err) - require.True(t, pass) + testLogicBytes(t, ops.Program, ep) } func TestGaid(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel() - checkCreatableIDProg := ` -gaid 0 -int 100 -== -` - ops := testProg(t, checkCreatableIDProg, 4) + check0 := testProg(t, "gaid 0; int 100; ==", 4) txn := makeSampleTxn() txn.Txn.Type = protocol.ApplicationCallTx txgroup := make([]transactions.SignedTxn, 3) @@ -1701,53 +1678,40 @@ int 100 targetTxn := makeSampleTxn() targetTxn.Txn.Type = protocol.AssetConfigTx txgroup[0] = targetTxn - sb := strings.Builder{} - ledger := logictest.MakeLedger(nil) - ledger.SetTrackedCreatable(0, basics.CreatableLocator{Index: 100}) - ep := defaultEvalParams(&sb, &txn) - ep.Ledger = ledger - ep.TxnGroup = txgroup - ep.GroupIndex = 1 - pass, err := EvalStateful(ops.Program, ep) + ep := defaultEvalParams(nil) + ep.TxnGroup = transactions.WrapSignedTxnsWithAD(txgroup) + ep.Ledger = MakeLedger(nil) + + // should fail when no creatable was created + _, err := EvalApp(check0.Program, 1, 888, ep) + require.Error(t, err) + require.Contains(t, err.Error(), "did not create anything") + + ep.TxnGroup[0].ApplyData.ConfigAsset = 100 + pass, err := EvalApp(check0.Program, 1, 888, ep) if !pass || err != nil { - t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) + t.Log(ep.Trace.String()) } require.NoError(t, err) require.True(t, pass) // should fail when accessing future transaction in group - futureCreatableIDProg := ` -gaid 2 -int 0 -> -` - - ops = testProg(t, futureCreatableIDProg, 4) - _, err = EvalStateful(ops.Program, ep) + check2 := testProg(t, "gaid 2; int 0; >", 4) + _, err = EvalApp(check2.Program, 1, 888, ep) require.Error(t, err) require.Contains(t, err.Error(), "gaid can't get creatable ID of txn ahead of the current one") // should fail when accessing self - ep.GroupIndex = 0 - ops = testProg(t, checkCreatableIDProg, 4) - _, err = EvalStateful(ops.Program, ep) + _, err = EvalApp(check0.Program, 0, 888, ep) require.Error(t, err) require.Contains(t, err.Error(), "gaid is only for accessing creatable IDs of previous txns") - ep.GroupIndex = 1 // should fail on non-creatable ep.TxnGroup[0].Txn.Type = protocol.PaymentTx - _, err = EvalStateful(ops.Program, ep) + _, err = EvalApp(check0.Program, 1, 888, ep) require.Error(t, err) require.Contains(t, err.Error(), "can't use gaid on txn that is not an app call nor an asset config txn") ep.TxnGroup[0].Txn.Type = protocol.AssetConfigTx - - // should fail when no creatable was created - ledger.SetTrackedCreatable(0, basics.CreatableLocator{}) - _, err = EvalStateful(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "the txn did not create anything") } func TestGtxn(t *testing.T) { @@ -1873,8 +1837,8 @@ gtxn 0 Sender txn.Txn.SelectionPK[:], txn.Txn.Note, } - ep := defaultEvalParams(nil, &txn) - ep.TxnGroup = makeSampleTxnGroup(txn) + ep := defaultEvalParams(&txn) + ep.TxnGroup = transactions.WrapSignedTxnsWithAD(makeSampleTxnGroup(txn)) testLogic(t, source, v, ep) if v >= 3 { gtxnsProg := strings.ReplaceAll(source, "gtxn 0", "int 0; gtxns") @@ -1889,27 +1853,64 @@ gtxn 0 Sender } } -func testLogic(t *testing.T, program string, v uint64, ep EvalParams, problems ...string) { +func testLogic(t *testing.T, program string, v uint64, ep *EvalParams, problems ...string) { + t.Helper() ops := testProg(t, program, v) + testLogicBytes(t, ops.Program, ep, problems...) +} + +func testLogicBytes(t *testing.T, program []byte, ep *EvalParams, problems ...string) { + t.Helper() + testLogicFull(t, program, 0, ep, problems...) +} + +func testLogicFull(t *testing.T, program []byte, gi int, ep *EvalParams, problems ...string) { + t.Helper() + + var checkProblem string + var evalProblem string + switch len(problems) { + case 2: + checkProblem = problems[0] + evalProblem = problems[1] + case 1: + evalProblem = problems[0] + case 0: + default: + require.Fail(t, "Misused testLogic: %d problems", len(problems)) + } + sb := &strings.Builder{} ep.Trace = sb - ep.Txn.Lsig.Logic = ops.Program - err := Check(ops.Program, ep) - if err != nil { - t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) - } - require.NoError(t, err) - pass, err := Eval(ops.Program, ep) - if len(problems) == 0 { + ep.TxnGroup[0].Lsig.Logic = program + err := CheckSignature(gi, ep) + if checkProblem == "" { require.NoError(t, err, sb.String()) - require.True(t, pass, sb.String()) } else { - require.Error(t, err, sb.String()) - for _, problem := range problems { - require.Contains(t, err.Error(), problem) - } + require.Error(t, err, "Check\n%s\nExpected: %v", sb, checkProblem) + require.Contains(t, err.Error(), checkProblem) + } + + // We continue on to check Eval() of things that failed Check() because it's + // a nice confirmation that Check() is usually stricter than Eval(). This + // may mean that the problems argument is often duplicated, but this seems + // the best way to be concise about all sorts of tests. + + pass, err := EvalSignature(gi, ep) + if evalProblem == "" { + require.NoError(t, err, "Eval%s\nExpected: PASS", sb) + assert.True(t, pass, "Eval%s\nExpected: PASS", sb) + return + } + + // There is an evalProblem to check. REJECT is special and only means that + // the app didn't accept. Maybe it's an error, maybe it's just !pass. + if evalProblem == "REJECT" { + require.True(t, err != nil || !pass, "Eval%s\nExpected: REJECT", sb) + } else { + require.Error(t, err, "Eval%s\nExpected: %v", sb, evalProblem) + require.Contains(t, err.Error(), evalProblem) } } @@ -1925,43 +1926,30 @@ txna ApplicationArgs 0 var txn transactions.SignedTxn txn.Txn.Accounts = make([]basics.Address, 1) txn.Txn.Accounts[0] = txn.Txn.Sender - txn.Txn.ApplicationArgs = make([][]byte, 1) - txn.Txn.ApplicationArgs[0] = []byte(protocol.PaymentTx) - txgroup := make([]transactions.SignedTxn, 1) - txgroup[0] = txn - ep := defaultEvalParams(nil, &txn) - ep.TxnGroup = txgroup - _, err := Eval(ops.Program, ep) - require.NoError(t, err) + txn.Txn.ApplicationArgs = [][]byte{txn.Txn.Sender[:]} + ep := defaultEvalParams(&txn) + testLogicBytes(t, ops.Program, ep) // modify txn field saved := ops.Program[2] ops.Program[2] = 0x01 - _, err = Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "txna unsupported field") + testLogicBytes(t, ops.Program, ep, "unsupported array field") // modify txn field to unknown one ops.Program[2] = 99 - _, err = Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "invalid txn field 99") + testLogicBytes(t, ops.Program, ep, "invalid txn field 99") // modify txn array index ops.Program[2] = saved saved = ops.Program[3] ops.Program[3] = 0x02 - _, err = Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "invalid Accounts index") + testLogicBytes(t, ops.Program, ep, "invalid Accounts index") // modify txn array index in the second opcode ops.Program[3] = saved saved = ops.Program[6] ops.Program[6] = 0x01 - _, err = Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "invalid ApplicationArgs index") + testLogicBytes(t, ops.Program, ep, "invalid ApplicationArgs index") ops.Program[6] = saved // check special case: Account 0 == Sender @@ -1973,48 +1961,36 @@ txn Sender ops2 := testProg(t, source, AssemblerMaxVersion) var txn2 transactions.SignedTxn copy(txn2.Txn.Sender[:], []byte("aoeuiaoeuiaoeuiaoeuiaoeuiaoeui00")) - ep2 := defaultEvalParams(nil, &txn2) - pass, err := Eval(ops2.Program, ep2) - require.NoError(t, err) - require.True(t, pass) + ep2 := defaultEvalParams(&txn2) + testLogicBytes(t, ops2.Program, ep2) // check gtxna source = `gtxna 0 Accounts 1 txna ApplicationArgs 0 ==` ops = testProg(t, source, AssemblerMaxVersion) - require.NoError(t, err) - _, err = Eval(ops.Program, ep) - require.NoError(t, err) + testLogicBytes(t, ops.Program, ep) // modify gtxn index saved = ops.Program[2] ops.Program[2] = 0x01 - _, err = Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "gtxna lookup TxnGroup[1] but it only has 1") + testLogicBytes(t, ops.Program, ep, "txn index 1, len(group) is 1") // modify gtxn field ops.Program[2] = saved saved = ops.Program[3] ops.Program[3] = 0x01 - _, err = Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "gtxna unsupported field") + testLogicBytes(t, ops.Program, ep, "unsupported array field") // modify gtxn field to unknown one ops.Program[3] = 99 - _, err = Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "invalid txn field 99") + testLogicBytes(t, ops.Program, ep, "invalid txn field 99") // modify gtxn array index ops.Program[3] = saved saved = ops.Program[4] ops.Program[4] = 0x02 - _, err = Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "invalid Accounts index") + testLogicBytes(t, ops.Program, ep, "invalid Accounts index") ops.Program[4] = saved // check special case: Account 0 == Sender @@ -2026,13 +2002,8 @@ txn Sender ops3 := testProg(t, source, AssemblerMaxVersion) var txn3 transactions.SignedTxn copy(txn2.Txn.Sender[:], []byte("aoeuiaoeuiaoeuiaoeuiaoeuiaoeui00")) - txgroup3 := make([]transactions.SignedTxn, 1) - txgroup3[0] = txn3 - ep3 := defaultEvalParams(nil, &txn3) - ep3.TxnGroup = txgroup3 - pass, err = Eval(ops3.Program, ep3) - require.NoError(t, err) - require.True(t, pass) + ep3 := defaultEvalParams(&txn3) + testLogicBytes(t, ops3.Program, ep3) } // check empty values in ApplicationArgs and Account @@ -2050,42 +2021,24 @@ int 0 var txn transactions.SignedTxn txn.Txn.ApplicationArgs = make([][]byte, 1) txn.Txn.ApplicationArgs[0] = []byte("") - txgroup := make([]transactions.SignedTxn, 1) - txgroup[0] = txn - ep := defaultEvalParams(nil, &txn) - ep.TxnGroup = txgroup - pass, err := Eval(ops.Program, ep) - require.NoError(t, err) - require.True(t, pass) + testLogicBytes(t, ops.Program, defaultEvalParams(&txn)) + txn.Txn.ApplicationArgs[0] = nil - txgroup[0] = txn - ep.TxnGroup = txgroup - pass, err = Eval(ops.Program, ep) - require.NoError(t, err) - require.True(t, pass) + testLogicBytes(t, ops.Program, defaultEvalParams(&txn)) source2 := `txna Accounts 1 global ZeroAddress == ` - ops2 := testProg(t, source2, AssemblerMaxVersion) + ops = testProg(t, source2, AssemblerMaxVersion) var txn2 transactions.SignedTxn txn2.Txn.Accounts = make([]basics.Address, 1) txn2.Txn.Accounts[0] = basics.Address{} - txgroup2 := make([]transactions.SignedTxn, 1) - txgroup2[0] = txn2 - ep2 := defaultEvalParams(nil, &txn2) - ep2.TxnGroup = txgroup2 - pass, err = Eval(ops2.Program, ep2) - require.NoError(t, err) - require.True(t, pass) + testLogicBytes(t, ops.Program, defaultEvalParams(&txn2)) + txn2.Txn.Accounts = make([]basics.Address, 1) - txgroup2[0] = txn - ep2.TxnGroup = txgroup2 - pass, err = Eval(ops2.Program, ep2) - require.NoError(t, err) - require.True(t, pass) + testLogicBytes(t, ops.Program, defaultEvalParams(&txn2)) } func TestTxnas(t *testing.T) { @@ -2103,14 +2056,9 @@ txnas ApplicationArgs var txn transactions.SignedTxn txn.Txn.Accounts = make([]basics.Address, 1) txn.Txn.Accounts[0] = txn.Txn.Sender - txn.Txn.ApplicationArgs = make([][]byte, 1) - txn.Txn.ApplicationArgs[0] = []byte(protocol.PaymentTx) - txgroup := make([]transactions.SignedTxn, 1) - txgroup[0] = txn - ep := defaultEvalParams(nil, &txn) - ep.TxnGroup = txgroup - _, err := Eval(ops.Program, ep) - require.NoError(t, err) + txn.Txn.ApplicationArgs = [][]byte{txn.Txn.Sender[:]} + ep := defaultEvalParams(&txn) + testLogicBytes(t, ops.Program, ep) // check special case: Account 0 == Sender // even without any additional context @@ -2119,13 +2067,10 @@ txnas Accounts txn Sender == ` - ops2 := testProg(t, source, AssemblerMaxVersion) + ops = testProg(t, source, AssemblerMaxVersion) var txn2 transactions.SignedTxn copy(txn2.Txn.Sender[:], []byte("aoeuiaoeuiaoeuiaoeuiaoeuiaoeui00")) - ep2 := defaultEvalParams(nil, &txn2) - pass, err := Eval(ops2.Program, ep2) - require.NoError(t, err) - require.True(t, pass) + testLogicBytes(t, ops.Program, defaultEvalParams(&txn2)) // check gtxnas source = `int 1 @@ -2133,9 +2078,7 @@ gtxnas 0 Accounts txna ApplicationArgs 0 ==` ops = testProg(t, source, AssemblerMaxVersion) - require.NoError(t, err) - _, err = Eval(ops.Program, ep) - require.NoError(t, err) + testLogicBytes(t, ops.Program, ep) // check special case: Account 0 == Sender // even without any additional context @@ -2144,16 +2087,10 @@ gtxnas 0 Accounts txn Sender == ` - ops3 := testProg(t, source, AssemblerMaxVersion) + ops = testProg(t, source, AssemblerMaxVersion) var txn3 transactions.SignedTxn - copy(txn2.Txn.Sender[:], []byte("aoeuiaoeuiaoeuiaoeuiaoeuiaoeui00")) - txgroup3 := make([]transactions.SignedTxn, 1) - txgroup3[0] = txn3 - ep3 := defaultEvalParams(nil, &txn3) - ep3.TxnGroup = txgroup3 - pass, err = Eval(ops3.Program, ep3) - require.NoError(t, err) - require.True(t, pass) + copy(txn3.Txn.Sender[:], []byte("aoeuiaoeuiaoeuiaoeuiaoeuiaoeui00")) + testLogicBytes(t, ops.Program, defaultEvalParams(&txn3)) // check gtxnsas source = `int 0 @@ -2162,9 +2099,7 @@ gtxnsas Accounts txna ApplicationArgs 0 ==` ops = testProg(t, source, AssemblerMaxVersion) - require.NoError(t, err) - _, err = Eval(ops.Program, ep) - require.NoError(t, err) + testLogicBytes(t, ops.Program, ep) } func TestBitOps(t *testing.T) { @@ -2244,17 +2179,17 @@ func TestSubstringFlop(t *testing.T) { // fails in compiler testProg(t, `byte 0xf000000000000000 substring -len`, 2, expect{2, "substring expects 2 immediate arguments"}) +len`, 2, Expect{2, "substring expects 2 immediate arguments"}) // fails in compiler testProg(t, `byte 0xf000000000000000 substring 1 -len`, 2, expect{2, "substring expects 2 immediate arguments"}) +len`, 2, Expect{2, "substring expects 2 immediate arguments"}) // fails in compiler testProg(t, `byte 0xf000000000000000 substring 4 2 -len`, 2, expect{2, "substring end is before start"}) +len`, 2, Expect{2, "substring end is before start"}) // fails at runtime testPanics(t, `byte 0xf000000000000000 @@ -2307,11 +2242,11 @@ func TestExtractFlop(t *testing.T) { // fails in compiler testProg(t, `byte 0xf000000000000000 extract - len`, 5, expect{2, "extract expects 2 immediate arguments"}) + len`, 5, Expect{2, "extract expects 2 immediate arguments"}) testProg(t, `byte 0xf000000000000000 extract 1 - len`, 5, expect{2, "extract expects 2 immediate arguments"}) + len`, 5, Expect{2, "extract expects 2 immediate arguments"}) // fails at runtime err := testPanics(t, `byte 0xf000000000000000 @@ -2432,6 +2367,7 @@ func TestGload(t *testing.T) { // for simple app-call-only transaction groups type scratchTestCase struct { tealSources []string + errTxn int errContains string } @@ -2480,6 +2416,7 @@ store 0 int 1 `, }, + errTxn: 0, errContains: "can't use gload on self, use load instead", } @@ -2494,67 +2431,29 @@ int 2 store 0 int 1`, }, + errTxn: 0, errContains: "gload can't get future scratch space from txn with index 1", } cases := []scratchTestCase{ simpleCase, multipleTxnCase, selfCase, laterTxnSlotCase, } - proto := defaultEvalProtoWithVersion(LogicVersion) for i, testCase := range cases { t.Run(fmt.Sprintf("i=%d", i), func(t *testing.T) { sources := testCase.tealSources - // Assemble ops - opsList := make([]*OpStream, len(sources)) - for j, source := range sources { - ops := testProg(t, source, AssemblerMaxVersion) - opsList[j] = ops - } - // Initialize txgroup and cxgroup + // Initialize txgroup txgroup := make([]transactions.SignedTxn, len(sources)) for j := range txgroup { - txgroup[j] = transactions.SignedTxn{ - Txn: transactions.Transaction{ - Type: protocol.ApplicationCallTx, - }, - } - } - - // Construct EvalParams - pastSideEffects := MakePastSideEffects(len(sources)) - epList := make([]EvalParams, len(sources)) - for j := range sources { - epList[j] = EvalParams{ - Proto: &proto, - Txn: &txgroup[j], - TxnGroup: txgroup, - GroupIndex: uint64(j), - PastSideEffects: pastSideEffects, - } + txgroup[j].Txn.Type = protocol.ApplicationCallTx } - // Evaluate app calls - shouldErr := testCase.errContains != "" - didPass := true - for j, ops := range opsList { - pass, err := EvalStateful(ops.Program, epList[j]) - - // Confirm it errors or that the error message is the expected one - if !shouldErr { - require.NoError(t, err) - } else if shouldErr && err != nil { - require.Error(t, err) - require.Contains(t, err.Error(), testCase.errContains) - } - - if !pass { - didPass = false - } + if testCase.errContains != "" { + testApps(t, sources, txgroup, LogicVersion, MakeLedger(nil), Expect{testCase.errTxn, testCase.errContains}) + } else { + testApps(t, sources, txgroup, LogicVersion, MakeLedger(nil)) } - - require.Equal(t, !shouldErr, didPass) }) } @@ -2588,42 +2487,30 @@ int 1`, failCases := []failureCase{nonAppCall, logicSigCall} for j, failCase := range failCases { t.Run(fmt.Sprintf("j=%d", j), func(t *testing.T) { - source := "gload 0 0" - ops := testProg(t, source, AssemblerMaxVersion) + program := testProg(t, "gload 0 0", AssemblerMaxVersion).Program - // Initialize txgroup and cxgroup - txgroup := make([]transactions.SignedTxn, 2) - txgroup[0] = failCase.firstTxn - txgroup[1] = transactions.SignedTxn{} - - // Construct EvalParams - pastSideEffects := MakePastSideEffects(2) - epList := make([]EvalParams, 2) - for j := range epList { - epList[j] = EvalParams{ - Proto: &proto, - Txn: &txgroup[j], - TxnGroup: txgroup, - GroupIndex: uint64(j), - PastSideEffects: pastSideEffects, - } + txgroup := []transactions.SignedTxnWithAD{ + {SignedTxn: failCase.firstTxn}, + {}, + } + + ep := &EvalParams{ + Proto: makeTestProto(), + TxnGroup: txgroup, + pastScratch: make([]*scratchSpace, 2), } - // Evaluate app call - var err error switch failCase.runMode { case runModeApplication: - _, err = EvalStateful(ops.Program, epList[1]) + testAppBytes(t, program, ep, failCase.errContains) default: - _, err = Eval(ops.Program, epList[1]) + testLogicBytes(t, program, ep, failCase.errContains, failCase.errContains) } - - require.Error(t, err) - require.Contains(t, err.Error(), failCase.errContains) }) } } +// TestGloads tests gloads and gloadss func TestGloads(t *testing.T) { partitiontest.PartitionTest(t) @@ -2643,51 +2530,35 @@ int 0 gloads 0 byte "txn 1" == +assert int 1 gloads 1 byte "txn 2" == -&&` +assert +int 0 +int 0 +gloadss +byte "txn 1" +== +assert +int 1 +int 1 +gloadss +byte "txn 2" +== +assert +int 1 +` sources := []string{source1, source2, source3} - proto := defaultEvalProtoWithVersion(LogicVersion) - // Assemble ops - opsList := make([]*OpStream, len(sources)) - for j, source := range sources { - ops := testProg(t, source, AssemblerMaxVersion) - opsList[j] = ops - } - - // Initialize txgroup and cxgroup txgroup := make([]transactions.SignedTxn, len(sources)) for j := range txgroup { - txgroup[j] = transactions.SignedTxn{ - Txn: transactions.Transaction{ - Type: protocol.ApplicationCallTx, - }, - } + txgroup[j].Txn.Type = protocol.ApplicationCallTx } - // Construct EvalParams - pastSideEffects := MakePastSideEffects(len(sources)) - epList := make([]EvalParams, len(sources)) - for j := range sources { - epList[j] = EvalParams{ - Proto: &proto, - Txn: &txgroup[j], - TxnGroup: txgroup, - GroupIndex: uint64(j), - PastSideEffects: pastSideEffects, - } - } - - // Evaluate app calls - for j, ops := range opsList { - pass, err := EvalStateful(ops.Program, epList[j]) - require.NoError(t, err) - require.True(t, pass) - } + testApps(t, sources, txgroup, LogicVersion, MakeLedger(nil)) } const testCompareProgramText = `int 35 @@ -2775,35 +2646,25 @@ func TestSlowLogic(t *testing.T) { // v1overspend fails (on v1) ops := testProg(t, v1overspend, 1) - err := Check(ops.Program, defaultEvalParamsWithVersion(nil, nil, 1)) - require.Error(t, err) - require.Contains(t, err.Error(), "static cost") - // v2overspend passes Check, even on v2 proto, because cost is "grandfathered" + // We should never Eval this after it fails Check(), but nice to see it also fails. + testLogicBytes(t, ops.Program, defaultEvalParamsWithVersion(nil, 1), + "static cost", "dynamic cost") + // v2overspend passes Check, even on v2 proto, because the old low cost is "grandfathered" ops = testProg(t, v2overspend, 1) - err = Check(ops.Program, defaultEvalParamsWithVersion(nil, nil, 2)) - require.NoError(t, err) + testLogicBytes(t, ops.Program, defaultEvalParamsWithVersion(nil, 2)) // even the shorter, v2overspend, fails when compiled as v2 code ops = testProg(t, v2overspend, 2) - err = Check(ops.Program, defaultEvalParamsWithVersion(nil, nil, 2)) - require.Error(t, err) - require.Contains(t, err.Error(), "static cost") + testLogicBytes(t, ops.Program, defaultEvalParamsWithVersion(nil, 2), + "static cost", "dynamic cost") // in v4 cost is still 134, but only matters in Eval, not Check, so both fail there - ep4 := defaultEvalParamsWithVersion(nil, nil, 4) + ep4 := defaultEvalParamsWithVersion(nil, 4) ops = testProg(t, v1overspend, 4) - err = Check(ops.Program, ep4) - require.NoError(t, err) - _, err = Eval(ops.Program, ep4) - require.Error(t, err) - require.Contains(t, err.Error(), "dynamic cost") + testLogicBytes(t, ops.Program, ep4, "dynamic cost") ops = testProg(t, v2overspend, 4) - err = Check(ops.Program, ep4) - require.NoError(t, err) - _, err = Eval(ops.Program, ep4) - require.Error(t, err) - require.Contains(t, err.Error(), "dynamic cost") + testLogicBytes(t, ops.Program, ep4, "dynamic cost") } func isNotPanic(t *testing.T, err error) { @@ -2823,16 +2684,7 @@ func TestStackUnderflow(t *testing.T) { t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { ops := testProg(t, `int 1`, v) ops.Program = append(ops.Program, 0x08) // + - err := Check(ops.Program, defaultEvalParams(nil, nil)) - require.NoError(t, err) - sb := strings.Builder{} - pass, err := Eval(ops.Program, defaultEvalParams(&sb, nil)) - if pass { - t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) - } - require.False(t, pass) - isNotPanic(t, err) + testLogicBytes(t, ops.Program, defaultEvalParams(nil), "stack underflow") }) } } @@ -2845,16 +2697,7 @@ func TestWrongStackTypeRuntime(t *testing.T) { t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { ops := testProg(t, `int 1`, v) ops.Program = append(ops.Program, 0x01, 0x15) // sha256, len - err := Check(ops.Program, defaultEvalParams(nil, nil)) - require.NoError(t, err) - sb := strings.Builder{} - pass, err := Eval(ops.Program, defaultEvalParams(&sb, nil)) - if pass { - t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) - } - require.False(t, pass) - isNotPanic(t, err) + testLogicBytes(t, ops.Program, defaultEvalParams(nil), "sha256 arg 0 wanted") }) } } @@ -2867,16 +2710,8 @@ func TestEqMismatch(t *testing.T) { t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { ops := testProg(t, `byte 0x1234; int 1`, v) ops.Program = append(ops.Program, 0x12) // == - err := Check(ops.Program, defaultEvalParams(nil, nil)) - require.NoError(t, err) // TODO: Check should know the type stack was wrong - sb := strings.Builder{} - pass, err := Eval(ops.Program, defaultEvalParams(&sb, nil)) - if pass { - t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) - } - require.False(t, pass) - isNotPanic(t, err) + testLogicBytes(t, ops.Program, defaultEvalParams(nil), "cannot compare") + // TODO: Check should know the type stack was wrong }) } } @@ -2889,16 +2724,7 @@ func TestNeqMismatch(t *testing.T) { t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { ops := testProg(t, `byte 0x1234; int 1`, v) ops.Program = append(ops.Program, 0x13) // != - err := Check(ops.Program, defaultEvalParams(nil, nil)) - require.NoError(t, err) // TODO: Check should know the type stack was wrong - sb := strings.Builder{} - pass, err := Eval(ops.Program, defaultEvalParams(&sb, nil)) - if pass { - t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) - } - require.False(t, pass) - isNotPanic(t, err) + testLogicBytes(t, ops.Program, defaultEvalParams(nil), "cannot compare") }) } } @@ -2911,16 +2737,7 @@ func TestWrongStackTypeRuntime2(t *testing.T) { t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { ops := testProg(t, `byte 0x1234; int 1`, v) ops.Program = append(ops.Program, 0x08) // + - err := Check(ops.Program, defaultEvalParams(nil, nil)) - require.NoError(t, err) - sb := strings.Builder{} - pass, _ := Eval(ops.Program, defaultEvalParams(&sb, nil)) - if pass { - t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) - } - require.False(t, pass) - isNotPanic(t, err) + testLogicBytes(t, ops.Program, defaultEvalParams(nil), "+ arg 0 wanted") }) } } @@ -2938,16 +2755,7 @@ func TestIllegalOp(t *testing.T) { break } } - err := Check(ops.Program, defaultEvalParams(nil, nil)) - require.Error(t, err) - sb := strings.Builder{} - pass, err := Eval(ops.Program, defaultEvalParams(&sb, nil)) - if pass { - t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) - } - require.False(t, pass) - isNotPanic(t, err) + testLogicBytes(t, ops.Program, defaultEvalParams(nil), "illegal opcode", "illegal opcode") }) } } @@ -2965,16 +2773,8 @@ int 1 `, v) // cut two last bytes - intc_1 and last byte of bnz ops.Program = ops.Program[:len(ops.Program)-2] - err := Check(ops.Program, defaultEvalParams(nil, nil)) - require.Error(t, err) - sb := strings.Builder{} - pass, err := Eval(ops.Program, defaultEvalParams(&sb, nil)) - if pass { - t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) - } - require.False(t, pass) - isNotPanic(t, err) + testLogicBytes(t, ops.Program, defaultEvalParams(nil), + "bnz program ends short", "bnz program ends short") }) } } @@ -2988,13 +2788,9 @@ intc 0 intc 0 bnz done done:`, 2) - err := Check(ops.Program, defaultEvalParams(nil, nil)) - require.NoError(t, err) - sb := strings.Builder{} - pass, err := Eval(ops.Program, defaultEvalParams(&sb, nil)) - require.NoError(t, err) - require.True(t, pass) + testLogicBytes(t, ops.Program, defaultEvalParams(nil)) } + func TestShortBytecblock(t *testing.T) { partitiontest.PartitionTest(t) @@ -3007,17 +2803,8 @@ func TestShortBytecblock(t *testing.T) { for i := 2; i < len(fullops.Program); i++ { program := fullops.Program[:i] t.Run(hex.EncodeToString(program), func(t *testing.T) { - err := Check(program, defaultEvalParams(nil, nil)) - require.Error(t, err) - isNotPanic(t, err) - sb := strings.Builder{} - pass, err := Eval(program, defaultEvalParams(&sb, nil)) - if pass { - t.Log(hex.EncodeToString(program)) - t.Log(sb.String()) - } - require.False(t, pass) - isNotPanic(t, err) + testLogicBytes(t, program, defaultEvalParams(nil), + "bytecblock", "bytecblock") }) } }) @@ -3038,17 +2825,7 @@ func TestShortBytecblock2(t *testing.T) { t.Run(src, func(t *testing.T) { program, err := hex.DecodeString(src) require.NoError(t, err) - err = Check(program, defaultEvalParams(nil, nil)) - require.Error(t, err) - isNotPanic(t, err) - sb := strings.Builder{} - pass, err := Eval(program, defaultEvalParams(&sb, nil)) - if pass { - t.Log(hex.EncodeToString(program)) - t.Log(sb.String()) - } - require.False(t, pass) - isNotPanic(t, err) + testLogicBytes(t, program, defaultEvalParams(nil), "bytecblock", "bytecblock") }) } } @@ -3068,8 +2845,7 @@ func TestPanic(t *testing.T) { log := logging.TestingLog(t) for v := uint64(1); v <= AssemblerMaxVersion; v++ { t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { - ops, err := AssembleStringWithVersion(`int 1`, v) - require.NoError(t, err) + ops := testProg(t, `int 1`, v) var hackedOpcode int var oldSpec OpSpec for opcode, spec := range opsByOpcode[v] { @@ -3083,10 +2859,10 @@ func TestPanic(t *testing.T) { break } } - sb := strings.Builder{} - params := defaultEvalParams(&sb, nil) - params.Logger = log - err = Check(ops.Program, params) + params := defaultEvalParams(nil) + params.logger = log + params.TxnGroup[0].Lsig.Logic = ops.Program + err := CheckSignature(0, params) require.Error(t, err) if pe, ok := err.(PanicError); ok { require.Equal(t, panicString, pe.PanicValue) @@ -3095,15 +2871,14 @@ func TestPanic(t *testing.T) { } else { t.Errorf("expected PanicError object but got %T %#v", err, err) } - sb = strings.Builder{} var txn transactions.SignedTxn txn.Lsig.Logic = ops.Program - params = defaultEvalParams(&sb, &txn) - params.Logger = log - pass, err := Eval(ops.Program, params) + params = defaultEvalParams(&txn) + params.logger = log + pass, err := EvalSignature(0, params) if pass { t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) + t.Log(params.Trace.String()) } require.False(t, pass) if pe, ok := err.(PanicError); ok { @@ -3124,13 +2899,8 @@ func TestProgramTooNew(t *testing.T) { t.Parallel() var program [12]byte vlen := binary.PutUvarint(program[:], EvalMaxVersion+1) - err := Check(program[:vlen], defaultEvalParams(nil, nil)) - require.Error(t, err) - isNotPanic(t, err) - pass, err := Eval(program[:vlen], defaultEvalParams(nil, nil)) - require.Error(t, err) - require.False(t, pass) - isNotPanic(t, err) + testLogicBytes(t, program[:vlen], defaultEvalParams(nil), + "greater than max supported", "greater than max supported") } func TestInvalidVersion(t *testing.T) { @@ -3139,13 +2909,7 @@ func TestInvalidVersion(t *testing.T) { t.Parallel() program, err := hex.DecodeString("ffffffffffffffffffffffff") require.NoError(t, err) - err = Check(program, defaultEvalParams(nil, nil)) - require.Error(t, err) - isNotPanic(t, err) - pass, err := Eval(program, defaultEvalParams(nil, nil)) - require.Error(t, err) - require.False(t, pass) - isNotPanic(t, err) + testLogicBytes(t, program, defaultEvalParams(nil), "invalid version", "invalid version") } func TestProgramProtoForbidden(t *testing.T) { @@ -3154,18 +2918,11 @@ func TestProgramProtoForbidden(t *testing.T) { t.Parallel() var program [12]byte vlen := binary.PutUvarint(program[:], EvalMaxVersion) - proto := config.ConsensusParams{ + ep := defaultEvalParams(nil) + ep.Proto = &config.ConsensusParams{ LogicSigVersion: EvalMaxVersion - 1, } - ep := EvalParams{} - ep.Proto = &proto - err := Check(program[:vlen], ep) - require.Error(t, err) - ep.Txn = &transactions.SignedTxn{} - pass, err := Eval(program[:vlen], ep) - require.Error(t, err) - require.False(t, pass) - isNotPanic(t, err) + testLogicBytes(t, program[:vlen], ep, "greater than protocol", "greater than protocol") } func TestMisalignedBranch(t *testing.T) { @@ -3174,41 +2931,29 @@ func TestMisalignedBranch(t *testing.T) { t.Parallel() for v := uint64(1); v <= AssemblerMaxVersion; v++ { t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { - ops, err := AssembleStringWithVersion(`int 1 + ops := testProg(t, `int 1 bnz done bytecblock 0x01234576 0xababcdcd 0xf000baad done: int 1`, v) - require.NoError(t, err) //t.Log(hex.EncodeToString(program)) canonicalProgramString := mutateProgVersion(v, "01200101224000112603040123457604ababcdcd04f000baad22") canonicalProgramBytes, err := hex.DecodeString(canonicalProgramString) require.NoError(t, err) require.Equal(t, ops.Program, canonicalProgramBytes) ops.Program[7] = 3 // clobber the branch offset to be in the middle of the bytecblock - err = Check(ops.Program, defaultEvalParams(nil, nil)) - require.Error(t, err) - require.Contains(t, err.Error(), "aligned") - pass, err := Eval(ops.Program, defaultEvalParams(nil, nil)) - require.Error(t, err) - require.False(t, pass) - isNotPanic(t, err) + // Since Eval() doesn't know the jump is bad, we reject "by luck" + testLogicBytes(t, ops.Program, defaultEvalParams(nil), "aligned", "REJECT") // back branches are checked differently, so test misaligned back branch ops.Program[6] = 0xff // Clobber the two bytes of offset with 0xff 0xff = -1 ops.Program[7] = 0xff // That jumps into the offset itself (pc + 3 -1) - err = Check(ops.Program, defaultEvalParams(nil, nil)) - require.Error(t, err) if v < backBranchEnabledVersion { - require.Contains(t, err.Error(), "negative branch") + testLogicBytes(t, ops.Program, defaultEvalParams(nil), "negative branch", "negative branch") } else { - require.Contains(t, err.Error(), "back branch") - require.Contains(t, err.Error(), "aligned") + // Again, if we were ever to Eval(), we would not know it's wrong. But we reject here "by luck" + testLogicBytes(t, ops.Program, defaultEvalParams(nil), "back branch target", "REJECT") } - pass, err = Eval(ops.Program, defaultEvalParams(nil, nil)) - require.Error(t, err) - require.False(t, pass) - isNotPanic(t, err) }) } } @@ -3219,25 +2964,19 @@ func TestBranchTooFar(t *testing.T) { t.Parallel() for v := uint64(1); v <= AssemblerMaxVersion; v++ { t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { - ops, err := AssembleStringWithVersion(`int 1 + ops := testProg(t, `int 1 bnz done bytecblock 0x01234576 0xababcdcd 0xf000baad done: int 1`, v) - require.NoError(t, err) //t.Log(hex.EncodeToString(ops.Program)) canonicalProgramString := mutateProgVersion(v, "01200101224000112603040123457604ababcdcd04f000baad22") canonicalProgramBytes, err := hex.DecodeString(canonicalProgramString) require.NoError(t, err) require.Equal(t, ops.Program, canonicalProgramBytes) ops.Program[7] = 200 // clobber the branch offset to be beyond the end of the program - err = Check(ops.Program, defaultEvalParams(nil, nil)) - require.Error(t, err) - require.True(t, strings.Contains(err.Error(), "beyond end of program")) - pass, err := Eval(ops.Program, defaultEvalParams(nil, nil)) - require.Error(t, err) - require.False(t, pass) - isNotPanic(t, err) + testLogicBytes(t, ops.Program, defaultEvalParams(nil), + "beyond end of program", "beyond end of program") }) } } @@ -3248,12 +2987,11 @@ func TestBranchTooLarge(t *testing.T) { t.Parallel() for v := uint64(1); v <= AssemblerMaxVersion; v++ { t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { - ops, err := AssembleStringWithVersion(`int 1 + ops := testProg(t, `int 1 bnz done bytecblock 0x01234576 0xababcdcd 0xf000baad done: int 1`, v) - require.NoError(t, err) //t.Log(hex.EncodeToString(ops.Program)) // (br)anch byte, (hi)gh byte of offset, (lo)w byte: brhilo canonicalProgramString := mutateProgVersion(v, "01200101224000112603040123457604ababcdcd04f000baad22") @@ -3261,14 +2999,7 @@ int 1`, v) require.NoError(t, err) require.Equal(t, ops.Program, canonicalProgramBytes) ops.Program[6] = 0x70 // clobber hi byte of branch offset - err = Check(ops.Program, defaultEvalParams(nil, nil)) - require.Error(t, err) - require.Contains(t, err.Error(), "beyond") - pass, err := Eval(ops.Program, defaultEvalParams(nil, nil)) - require.Error(t, err) - require.Contains(t, err.Error(), "beyond") - require.False(t, pass) - isNotPanic(t, err) + testLogicBytes(t, ops.Program, defaultEvalParams(nil), "beyond", "beyond") }) } branches := []string{ @@ -3281,7 +3012,6 @@ intc_0 done: intc_1 ` - ep := defaultEvalParams(nil, nil) for _, line := range branches { t.Run(fmt.Sprintf("branch=%s", line), func(t *testing.T) { source := fmt.Sprintf(template, line) @@ -3289,13 +3019,8 @@ intc_1 require.NoError(t, err) ops.Program[7] = 0xf0 // clobber the branch offset - highly negative ops.Program[8] = 0xff // clobber the branch offset - err = Check(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "beyond") - pass, err := Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "beyond") - require.False(t, pass) + testLogicBytes(t, ops.Program, defaultEvalParams(nil), + "branch target beyond", "branch target beyond") }) } } @@ -3579,12 +3304,15 @@ int 142791994204213819 func evalLoop(b *testing.B, runs int, program []byte) { b.ResetTimer() for i := 0; i < runs; i++ { - pass, err := Eval(program, benchmarkEvalParams(nil, nil)) + var txn transactions.SignedTxn + txn.Lsig.Logic = program + pass, err := EvalSignature(0, benchmarkEvalParams(&txn)) if !pass { // rerun to trace it. tracing messes up timing too much - sb := strings.Builder{} - pass, err = Eval(program, benchmarkEvalParams(&sb, nil)) - b.Log(sb.String()) + ep := benchmarkEvalParams(&txn) + ep.Trace = &strings.Builder{} + pass, err = EvalSignature(0, ep) + b.Log(ep.Trace.String()) } // require is super slow but makes useful error messages, wrap it in a check that makes the benchmark run a bunch faster if err != nil { @@ -3598,8 +3326,6 @@ func evalLoop(b *testing.B, runs int, program []byte) { func benchmarkBasicProgram(b *testing.B, source string) { ops := testProg(b, source, AssemblerMaxVersion) - err := Check(ops.Program, defaultEvalParams(nil, nil)) - require.NoError(b, err) evalLoop(b, b.N, ops.Program) } @@ -3615,8 +3341,6 @@ func benchmarkOperation(b *testing.B, prefix string, operation string, suffix st source := prefix + ";" + strings.Repeat(operation+";", 2000) + ";" + suffix source = strings.ReplaceAll(source, ";", "\n") ops := testProg(b, source, AssemblerMaxVersion) - err := Check(ops.Program, defaultEvalParams(nil, nil)) - require.NoError(b, err) evalLoop(b, runs, ops.Program) b.ReportMetric(float64(inst)*15.0, "waste/op") } @@ -3631,6 +3355,7 @@ func BenchmarkUintMath(b *testing.B) { {"mul", "", "int 212; int 323; *; pop", "int 1"}, {"mulw", "", "int 21276237623; int 32387238723; mulw; pop; pop", "int 1"}, {"div", "", "int 736247364; int 892; /; pop", "int 1"}, + {"divw", "", "int 736; int 892; int 892; divw; pop", "int 1"}, {"divmodw", "", "int 736247364; int 892; int 126712; int 71672; divmodw; pop; pop; pop; pop", "int 1"}, {"sqrt", "", "int 736247364; sqrt; pop", "int 1"}, {"exp", "", "int 734; int 5; exp; pop", "int 1"}, @@ -3690,6 +3415,7 @@ func BenchmarkBigMath(b *testing.B) { {"b*", "", "byte 0x01234576; byte 0x0223627389; b*; pop", "int 1"}, {"b/", "", "byte 0x0123457673624736; byte 0x0223627389; b/; pop", "int 1"}, {"b%", "", "byte 0x0123457673624736; byte 0x0223627389; b/; pop", "int 1"}, + {"bsqrt", "", "byte 0x0123457673624736; bsqrt; pop", "int 1"}, {"b+big", // u256 + u256 "byte 0x0123457601234576012345760123457601234576012345760123457601234576", @@ -3711,6 +3437,10 @@ func BenchmarkBigMath(b *testing.B) { `byte 0xa123457601234576012345760123457601234576012345760123457601234576 byte 0x34576012345760123457601234576312; b/; pop`, "int 1"}, + {"bsqrt-big", "", + `byte 0xa123457601234576012345760123457601234576012345760123457601234576 + bsqrt; pop`, + "int 1"}, } for _, bench := range benches { b.Run(bench[0], func(b *testing.B) { @@ -3719,6 +3449,54 @@ func BenchmarkBigMath(b *testing.B) { } } +func BenchmarkBase64Decode(b *testing.B) { + smallStd := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" + smallURL := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" + medStd := strings.Repeat(smallStd, 16) + medURL := strings.Repeat(smallURL, 16) + bigStd := strings.Repeat(medStd, 4) + bigURL := strings.Repeat(medURL, 4) + + tags := []string{"small", "medium", "large"} + stds := []string{smallStd, medStd, bigStd} + urls := []string{smallURL, medURL, bigURL} + ops := []string{ + "", + "len", + "b~", + "int 1; pop", + "keccak256", + "sha256", + "sha512_256", + "base64_decode StdEncoding", + "base64_decode URLEncoding", + } + benches := [][]string{} + for i, tag := range tags { + for _, op := range ops { + testName := op + encoded := stds[i] + if op == "base64_decode URLEncoding" { + encoded = urls[i] + } + if len(op) > 0 { + op += "; " + } + op += "pop" + benches = append(benches, []string{ + fmt.Sprintf("%s_%s", testName, tag), + "", + fmt.Sprintf(`byte "%s"; %s`, encoded, op), + "int 1", + }) + } + } + for _, bench := range benches { + b.Run(bench[0], func(b *testing.B) { + benchmarkOperation(b, bench[1], bench[2], bench[3]) + }) + } +} func BenchmarkAddx64(b *testing.B) { progs := [][]string{ {"add long stack", addBenchmarkSource}, @@ -3744,16 +3522,17 @@ func BenchmarkCheckx5(b *testing.B) { addBenchmark2Source, } - programs := make([]*OpStream, len(sourcePrograms)) - var err error + programs := make([][]byte, len(sourcePrograms)) for i, text := range sourcePrograms { - programs[i], err = AssembleStringWithVersion(text, AssemblerMaxVersion) - require.NoError(b, err) + ops := testProg(b, text, AssemblerMaxVersion) + programs[i] = ops.Program } b.ResetTimer() for i := 0; i < b.N; i++ { for _, program := range programs { - err = Check(program.Program, defaultEvalParams(nil, nil)) + var txn transactions.SignedTxn + txn.Lsig.Logic = program + err := CheckSignature(0, defaultEvalParams(&txn)) if err != nil { require.NoError(b, err) } @@ -3791,23 +3570,21 @@ pop ` ops := testProg(t, text, AssemblerMaxVersion) - ep := defaultEvalParams(nil, nil) - ep.Txn = &transactions.SignedTxn{} - ep.Txn.Txn.ApplicationArgs = [][]byte{[]byte("test")} - _, err := Eval(ops.Program, ep) - require.NoError(t, err) + var txn transactions.SignedTxn + txn.Lsig.Logic = ops.Program + txn.Txn.ApplicationArgs = [][]byte{[]byte("test")} - ep = defaultEvalParamsV1(nil, nil) - _, err = Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "greater than protocol supported version 1") + ep := defaultEvalParams(&txn) + testLogicBytes(t, ops.Program, ep) + + ep = defaultEvalParamsWithVersion(&txn, 1) + testLogicBytes(t, ops.Program, ep, + "greater than protocol supported version 1", "greater than protocol supported version 1") // hack the version and fail on illegal opcode ops.Program[0] = 0x1 - ep = defaultEvalParamsV1(nil, nil) - _, err = Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "illegal opcode 0x36") // txna + ep = defaultEvalParamsWithVersion(&txn, 1) + testLogicBytes(t, ops.Program, ep, "illegal opcode 0x36", "illegal opcode 0x36") // txna } func TestStackOverflow(t *testing.T) { @@ -3908,35 +3685,19 @@ func TestApplicationsDisallowOldTeal(t *testing.T) { partitiontest.PartitionTest(t) const source = "int 1" - ep := defaultEvalParams(nil, nil) txn := makeSampleTxn() txn.Txn.Type = protocol.ApplicationCallTx txn.Txn.RekeyTo = basics.Address{} - txngroup := []transactions.SignedTxn{txn} - ep.TxnGroup = txngroup + ep := defaultEvalParams(&txn) for v := uint64(0); v < appsEnabledVersion; v++ { - ops, err := AssembleStringWithVersion(source, v) - require.NoError(t, err) - - err = CheckStateful(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), fmt.Sprintf("program version must be >= %d", appsEnabledVersion)) - - _, err = EvalStateful(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), fmt.Sprintf("program version must be >= %d", appsEnabledVersion)) + ops := testProg(t, source, v) + e := fmt.Sprintf("program version must be >= %d", appsEnabledVersion) + testAppBytes(t, ops.Program, ep, e, e) } - ops, err := AssembleStringWithVersion(source, appsEnabledVersion) - require.NoError(t, err) - - err = CheckStateful(ops.Program, ep) - require.NoError(t, err) - - _, err = EvalStateful(ops.Program, ep) - require.NoError(t, err) + testApp(t, source, ep) } func TestAnyRekeyToOrApplicationRaisesMinTealVersion(t *testing.T) { @@ -3980,53 +3741,26 @@ func TestAnyRekeyToOrApplicationRaisesMinTealVersion(t *testing.T) { for ci, cse := range cases { t.Run(fmt.Sprintf("ci=%d", ci), func(t *testing.T) { - ep := defaultEvalParams(nil, nil) - ep.TxnGroup = cse.group - ep.Txn = &cse.group[0] + ep := defaultEvalParams(nil) + ep.TxnGroup = transactions.WrapSignedTxnsWithAD(cse.group) // Computed MinTealVersion should be == validFromVersion - calc := ComputeMinTealVersion(cse.group) + calc := ComputeMinTealVersion(ep.TxnGroup, false) require.Equal(t, calc, cse.validFromVersion) // Should fail for all versions < validFromVersion expected := fmt.Sprintf("program version must be >= %d", cse.validFromVersion) for v := uint64(0); v < cse.validFromVersion; v++ { - ops, err := AssembleStringWithVersion(source, v) - require.NoError(t, err) - - err = CheckStateful(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), expected) - - _, err = EvalStateful(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), expected) - - err = Check(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), expected) - - _, err = Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), expected) + ops := testProg(t, source, v) + testAppBytes(t, ops.Program, ep, expected, expected) + testLogicBytes(t, ops.Program, ep, expected, expected) } // Should succeed for all versions >= validFromVersion for v := cse.validFromVersion; v <= AssemblerMaxVersion; v++ { - ops, err := AssembleStringWithVersion(source, v) - require.NoError(t, err) - - err = CheckStateful(ops.Program, ep) - require.NoError(t, err) - - _, err = EvalStateful(ops.Program, ep) - require.NoError(t, err) - - err = Check(ops.Program, ep) - require.NoError(t, err) - - _, err = Eval(ops.Program, ep) - require.NoError(t, err) + ops := testProg(t, source, v) + testAppBytes(t, ops.Program, ep) + testLogicBytes(t, ops.Program, ep) } }) } @@ -4071,7 +3805,7 @@ func TestAllowedOpcodesV2(t *testing.T) { "gtxn": true, } - ep := defaultEvalParams(nil, nil) + ep := defaultEvalParams(nil) cnt := 0 for _, spec := range OpSpecs { @@ -4080,10 +3814,10 @@ func TestAllowedOpcodesV2(t *testing.T) { require.True(t, ok, "Missed opcode in the test: %s", spec.Name) require.Contains(t, source, spec.Name) ops := testProg(t, source, AssemblerMaxVersion) - // all opcodes allowed in stateful mode so use CheckStateful/EvalStateful - err := CheckStateful(ops.Program, ep) + // all opcodes allowed in stateful mode so use CheckStateful/EvalContract + err := CheckContract(ops.Program, ep) require.NoError(t, err, source) - _, err = EvalStateful(ops.Program, ep) + _, err = EvalApp(ops.Program, 0, 0, ep) if spec.Name != "return" { // "return" opcode always succeeds so ignore it require.Error(t, err, source) @@ -4092,18 +3826,8 @@ func TestAllowedOpcodesV2(t *testing.T) { for v := byte(0); v <= 1; v++ { ops.Program[0] = v - err = Check(ops.Program, ep) - require.Error(t, err, source) - require.Contains(t, err.Error(), "illegal opcode") - err = CheckStateful(ops.Program, ep) - require.Error(t, err, source) - require.Contains(t, err.Error(), "illegal opcode") - _, err = Eval(ops.Program, ep) - require.Error(t, err, source) - require.Contains(t, err.Error(), "illegal opcode") - _, err = EvalStateful(ops.Program, ep) - require.Error(t, err, source) - require.Contains(t, err.Error(), "illegal opcode") + testLogicBytes(t, ops.Program, ep, "illegal opcode", "illegal opcode") + testAppBytes(t, ops.Program, ep, "illegal opcode", "illegal opcode") } cnt++ } @@ -4134,43 +3858,27 @@ func TestAllowedOpcodesV3(t *testing.T) { "pushbytes": `pushbytes "stringsfail?"`, } - excluded := map[string]bool{} - - ep := defaultEvalParams(nil, nil) + ep := defaultEvalParams(nil) cnt := 0 for _, spec := range OpSpecs { - if spec.Version == 3 && !excluded[spec.Name] { + if spec.Version == 3 { source, ok := tests[spec.Name] require.True(t, ok, "Missed opcode in the test: %s", spec.Name) require.Contains(t, source, spec.Name) ops := testProg(t, source, AssemblerMaxVersion) - // all opcodes allowed in stateful mode so use CheckStateful/EvalStateful - err := CheckStateful(ops.Program, ep) - require.NoError(t, err, source) - _, err = EvalStateful(ops.Program, ep) - require.Error(t, err, source) - require.NotContains(t, err.Error(), "illegal opcode") + // all opcodes allowed in stateful mode so use CheckStateful/EvalContract + testAppBytes(t, ops.Program, ep, "REJECT") for v := byte(0); v <= 1; v++ { ops.Program[0] = v - err = Check(ops.Program, ep) - require.Error(t, err, source) - require.Contains(t, err.Error(), "illegal opcode") - err = CheckStateful(ops.Program, ep) - require.Error(t, err, source) - require.Contains(t, err.Error(), "illegal opcode") - _, err = Eval(ops.Program, ep) - require.Error(t, err, source) - require.Contains(t, err.Error(), "illegal opcode") - _, err = EvalStateful(ops.Program, ep) - require.Error(t, err, source) - require.Contains(t, err.Error(), "illegal opcode") + testLogicBytes(t, ops.Program, ep, "illegal opcode", "illegal opcode") + testAppBytes(t, ops.Program, ep, "illegal opcode", "illegal opcode") } cnt++ } } - require.Equal(t, len(tests), cnt) + require.Len(t, tests, cnt) } func TestRekeyFailsOnOldVersion(t *testing.T) { @@ -4179,23 +3887,12 @@ func TestRekeyFailsOnOldVersion(t *testing.T) { t.Parallel() for v := uint64(0); v < rekeyingEnabledVersion; v++ { t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { - ops, err := AssembleStringWithVersion(`int 1`, v) - require.NoError(t, err) + ops := testProg(t, `int 1`, v) var txn transactions.SignedTxn - txn.Lsig.Logic = ops.Program txn.Txn.RekeyTo = basics.Address{1, 2, 3, 4} - sb := strings.Builder{} - proto := defaultEvalProto() - ep := defaultEvalParams(&sb, &txn) - ep.TxnGroup = []transactions.SignedTxn{txn} - ep.Proto = &proto - err = Check(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), fmt.Sprintf("program version must be >= %d", rekeyingEnabledVersion)) - pass, err := Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), fmt.Sprintf("program version must be >= %d", rekeyingEnabledVersion)) - require.False(t, pass) + ep := defaultEvalParams(&txn) + e := fmt.Sprintf("program version must be >= %d", rekeyingEnabledVersion) + testLogicBytes(t, ops.Program, ep, e, e) }) } } @@ -4220,7 +3917,7 @@ func testEvaluation(t *testing.T, program string, introduced uint64, tester eval t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { t.Helper() if v < introduced { - testProg(t, obfuscate(program), v, expect{0, "...was introduced..."}) + testProg(t, obfuscate(program), v, Expect{0, "...was introduced..."}) return } ops := testProg(t, program, v) @@ -4229,21 +3926,20 @@ func testEvaluation(t *testing.T, program string, introduced uint64, tester eval // EvalParams, so try all forward versions. for lv := v; lv <= AssemblerMaxVersion; lv++ { t.Run(fmt.Sprintf("lv=%d", lv), func(t *testing.T) { - sb := strings.Builder{} - err := Check(ops.Program, defaultEvalParamsWithVersion(&sb, nil, lv)) + t.Helper() + var txn transactions.SignedTxn + txn.Lsig.Logic = ops.Program + ep := defaultEvalParamsWithVersion(&txn, lv) + err := CheckSignature(0, ep) if err != nil { - t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) + t.Log(ep.Trace.String()) } require.NoError(t, err) - var txn transactions.SignedTxn - txn.Lsig.Logic = ops.Program - sb = strings.Builder{} - pass, err := Eval(ops.Program, defaultEvalParamsWithVersion(&sb, &txn, lv)) + ep = defaultEvalParamsWithVersion(&txn, lv) + pass, err := EvalSignature(0, ep) ok := tester(pass, err) if !ok { - t.Log(hex.EncodeToString(ops.Program)) - t.Log(sb.String()) + t.Log(ep.Trace.String()) t.Log(err) } require.True(t, ok) @@ -4355,6 +4051,8 @@ func TestBytes(t *testing.T) { // it fails to copy). testAccepts(t, `byte "john"; dup; int 2; int 105; setbyte; pop; byte "john"; ==`, 3) testAccepts(t, `byte "jo"; byte "hn"; concat; dup; int 2; int 105; setbyte; pop; byte "john"; ==`, 3) + + testAccepts(t, `byte "john"; byte "john"; ==`, 1) } func TestMethod(t *testing.T) { @@ -4679,6 +4377,16 @@ func TestBytesMath(t *testing.T) { // Even 128 byte outputs are ok testAccepts(t, fmt.Sprintf("byte 0x%s; byte 0x%s; b*; len; int 128; ==", effs, effs), 4) + + testAccepts(t, "byte 0x00; bsqrt; byte 0x; ==; return", 6) + testAccepts(t, "byte 0x01; bsqrt; byte 0x01; ==; return", 6) + testAccepts(t, "byte 0x10; bsqrt; byte 0x04; ==; return", 6) + testAccepts(t, "byte 0x11; bsqrt; byte 0x04; ==; return", 6) + testAccepts(t, "byte 0xffffff; bsqrt; len; int 2; ==; return", 6) + // 64 byte long inputs are accepted, even if they produce longer outputs + testAccepts(t, fmt.Sprintf("byte 0x%s; bsqrt; len; int 32; ==", effs), 6) + // 65 byte inputs are not ok. + testPanics(t, fmt.Sprintf("byte 0x%s00; bsqrt; pop; int 1", effs), 6) } func TestBytesCompare(t *testing.T) { @@ -4751,17 +4459,12 @@ func TestLog(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel() - proto := defaultEvalProtoWithVersion(LogicVersion) - txn := transactions.SignedTxn{ - Txn: transactions.Transaction{ - Type: protocol.ApplicationCallTx, - }, - } - ledger := logictest.MakeLedger(nil) + var txn transactions.SignedTxn + txn.Txn.Type = protocol.ApplicationCallTx + ledger := MakeLedger(nil) ledger.NewApp(txn.Txn.Receiver, 0, basics.AppParams{}) - sb := strings.Builder{} - ep := defaultEvalParams(&sb, &txn) - ep.Proto = &proto + ep := defaultEvalParams(&txn) + ep.Proto = makeTestProtoV(LogicVersion) ep.Ledger = ledger testCases := []struct { source string @@ -4789,21 +4492,14 @@ func TestLog(t *testing.T) { }, } - //track expected number of logs in cx.Logs + //track expected number of logs in cx.EvalDelta.Logs for i, s := range testCases { - ops := testProg(t, s.source, AssemblerMaxVersion) - - err := CheckStateful(ops.Program, ep) - require.NoError(t, err, s) - - pass, cx, err := EvalStatefulCx(ops.Program, ep) - require.NoError(t, err) - require.True(t, pass) - require.Len(t, cx.Logs, s.loglen) + delta := testApp(t, s.source, ep) + require.Len(t, delta.Logs, s.loglen) if i == len(testCases)-1 { - require.Equal(t, strings.Repeat("a", MaxLogSize), cx.Logs[0]) + require.Equal(t, strings.Repeat("a", MaxLogSize), delta.Logs[0]) } else { - for _, l := range cx.Logs { + for _, l := range delta.Logs { require.Equal(t, "a logging message", l) } } @@ -4853,21 +4549,12 @@ func TestLog(t *testing.T) { } for _, c := range failCases { - ops := testProg(t, c.source, AssemblerMaxVersion) - - err := CheckStateful(ops.Program, ep) - require.NoError(t, err, c) - - var pass bool switch c.runMode { case runModeApplication: - pass, err = EvalStateful(ops.Program, ep) + testApp(t, c.source, ep, c.errContains) default: - pass, err = Eval(ops.Program, ep) - + testLogic(t, c.source, AssemblerMaxVersion, ep, c.errContains, c.errContains) } - require.Contains(t, err.Error(), c.errContains) - require.False(t, pass) } } @@ -4888,24 +4575,140 @@ func TestPcDetails(t *testing.T) { for i, test := range tests { t.Run(fmt.Sprintf("i=%d", i), func(t *testing.T) { ops := testProg(t, test.source, LogicVersion) - txn := makeSampleTxn() - txgroup := makeSampleTxnGroup(txn) - txn.Lsig.Logic = ops.Program - sb := strings.Builder{} - ep := defaultEvalParams(&sb, &txn) - ep.TxnGroup = txgroup + ep, _, _ := makeSampleEnv() - var cx EvalContext - cx.EvalParams = ep - cx.runModeFlags = runModeSignature - - pass, err := eval(ops.Program, &cx) + pass, cx, err := EvalContract(ops.Program, 0, 888, ep) require.Error(t, err) require.False(t, pass) + require.NotNil(t, cx) // cx comes back nil if we couldn't even run + + assert.Equal(t, test.pc, cx.pc, ep.Trace.String()) pc, det := cx.PcDetails() - require.Equal(t, test.pc, pc) - require.Equal(t, test.det, det) + assert.Equal(t, test.pc, pc) + assert.Equal(t, test.det, det) }) } } + +var minB64DecodeVersion uint64 = 6 + +func TestOpBase64Decode(t *testing.T) { + partitiontest.PartitionTest(t) + t.Parallel() + + testCases := []struct { + encoded string + alph string + decoded string + error string + }{ + {"TU9CWS1ESUNLOwoKb3IsIFRIRSBXSEFMRS4KCgpCeSBIZXJtYW4gTWVsdmlsbGU=", + "StdEncoding", + `MOBY-DICK; + +or, THE WHALE. + + +By Herman Melville`, "", + }, + {"TU9CWS1ESUNLOwoKb3IsIFRIRSBXSEFMRS4KCgpCeSBIZXJtYW4gTWVsdmlsbGU=", + "URLEncoding", + `MOBY-DICK; + +or, THE WHALE. + + +By Herman Melville`, "", + }, + + // Test that a string that doesn't need padding can't have it + {"cGFk", "StdEncoding", "pad", ""}, + {"cGFk=", "StdEncoding", "pad", "input byte 4"}, + {"cGFk==", "StdEncoding", "pad", "input byte 4"}, + {"cGFk===", "StdEncoding", "pad", "input byte 4"}, + // Ensures that even correct padding is illegal if not needed + {"cGFk====", "StdEncoding", "pad", "input byte 4"}, + + // Test that padding must be present to make len = 0 mod 4. + {"bm9wYWQ=", "StdEncoding", "nopad", ""}, + {"bm9wYWQ", "StdEncoding", "nopad", "illegal"}, + {"bm9wYWQ==", "StdEncoding", "nopad", "illegal"}, + + {"YWJjMTIzIT8kKiYoKSctPUB+", "StdEncoding", "abc123!?$*&()'-=@~", ""}, + {"YWJjMTIzIT8kKiYoKSctPUB+", "StdEncoding", "abc123!?$*&()'-=@~", ""}, + {"YWJjMTIzIT8kKiYoKSctPUB-", "URLEncoding", "abc123!?$*&()'-=@~", ""}, + {"YWJjMTIzIT8kKiYoKSctPUB+", "URLEncoding", "", "input byte 23"}, + {"YWJjMTIzIT8kKiYoKSctPUB-", "StdEncoding", "", "input byte 23"}, + + // try extra ='s and various whitespace: + {"", "StdEncoding", "", ""}, + {"", "URLEncoding", "", ""}, + {"=", "StdEncoding", "", "byte 0"}, + {"=", "URLEncoding", "", "byte 0"}, + {" ", "StdEncoding", "", "byte 0"}, + {" ", "URLEncoding", "", "byte 0"}, + {"\t", "StdEncoding", "", "byte 0"}, + {"\t", "URLEncoding", "", "byte 0"}, + {"\r", "StdEncoding", "", ""}, + {"\r", "URLEncoding", "", ""}, + {"\n", "StdEncoding", "", ""}, + {"\n", "URLEncoding", "", ""}, + + {"YWJjMTIzIT8kKiYoKSctPUB+\n", "StdEncoding", "abc123!?$*&()'-=@~", ""}, + {"YWJjMTIzIT8kKiYoKSctPUB-\n", "URLEncoding", "abc123!?$*&()'-=@~", ""}, + {"YWJjMTIzIT8kK\riYoKSctPUB+\n", "StdEncoding", "abc123!?$*&()'-=@~", ""}, + {"YWJjMTIzIT8kK\riYoKSctPUB-\n", "URLEncoding", "abc123!?$*&()'-=@~", ""}, + {"\n\rYWJjMTIzIT8\rkKiYoKSctPUB+\n", "StdEncoding", "abc123!?$*&()'-=@~", ""}, + {"\n\rYWJjMTIzIT8\rkKiYoKSctPUB-\n", "URLEncoding", "abc123!?$*&()'-=@~", ""}, + + // padding and extra legal whitespace + {"SQ==", "StdEncoding", "I", ""}, + {"SQ==", "URLEncoding", "I", ""}, + {"\rS\r\nQ=\n=\r\r\n", "StdEncoding", "I", ""}, + {"\rS\r\nQ=\n=\r\r\n", "URLEncoding", "I", ""}, + + // Padding necessary? - Yes it is! And exactly the expected place and amount. + {"SQ==", "StdEncoding", "I", ""}, + {"SQ==", "URLEncoding", "I", ""}, + {"S=Q=", "StdEncoding", "", "byte 1"}, + {"S=Q=", "URLEncoding", "", "byte 1"}, + {"=SQ=", "StdEncoding", "", "byte 0"}, + {"=SQ=", "URLEncoding", "", "byte 0"}, + {"SQ", "StdEncoding", "", "byte 0"}, + {"SQ", "URLEncoding", "", "byte 0"}, + {"SQ=", "StdEncoding", "", "byte 3"}, + {"SQ=", "URLEncoding", "", "byte 3"}, + {"SQ===", "StdEncoding", "", "byte 4"}, + {"SQ===", "URLEncoding", "", "byte 4"}, + + // Strict decoding. "Y" is normally encoded as "WQ==", as confirmed by the first test + {"WQ==", "StdEncoding", "Y", ""}, + // When encoding one byte, the Y (90) becomes a 6bit value (the W) and a + // 2bit value (the first 2 bits of the Q. Q is the 16th b64 digit, it is + // 0b010000. For encoding Y, only those first two bits matter. In + // Strict() mode, the rest must be 0s. So using R (0b010001) should + // fail. + {"WR==", "StdEncoding", "Y", "byte 2"}, + } + + template := `byte 0x%s; byte 0x%s; base64_decode %s; ==` + for _, tc := range testCases { + source := fmt.Sprintf(template, hex.EncodeToString([]byte(tc.decoded)), hex.EncodeToString([]byte(tc.encoded)), tc.alph) + + if tc.error == "" { + if LogicVersion < fidoVersion { + testProg(t, source, AssemblerMaxVersion, Expect{0, "unknown opcode..."}) + } else { + testAccepts(t, source, fidoVersion) + } + } else { + if LogicVersion < fidoVersion { + testProg(t, source, AssemblerMaxVersion, Expect{0, "unknown opcode..."}) + } else { + err := testPanics(t, source, fidoVersion) + require.Contains(t, err.Error(), tc.error) + } + } + } +} diff --git a/data/transactions/logic/export_test.go b/data/transactions/logic/export_test.go new file mode 100644 index 0000000000..6575fa3bc3 --- /dev/null +++ b/data/transactions/logic/export_test.go @@ -0,0 +1,46 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package logic + +// Export for testing only. See +// https://medium.com/@robiplus/golang-trick-export-for-test-aa16cbd7b8cd for a +// nice explanation. tl;dr: Since some of our testing is in logic_test package, +// we export some extra things to make testing easier there. But we do it in a +// _test.go file, so they are only exported during testing. + +func NewExpect(l int, s string) Expect { + return Expect{l, s} +} + +func (ep *EvalParams) Reset() { + ep.reset() +} + +var MakeSampleEnv = makeSampleEnv +var MakeSampleEnvWithVersion = makeSampleEnvWithVersion +var MakeSampleTxn = makeSampleTxn +var MakeSampleTxnGroup = makeSampleTxnGroup +var MakeTestProto = makeTestProto +var MakeTestProtoV = makeTestProtoV +var Obfuscate = obfuscate +var TestApp = testApp +var TestAppBytes = testAppBytes +var TestApps = testApps +var TestProg = testProg + +const InnerAppsEnabledVersion = innerAppsEnabledVersion +const CreatedResourcesVersion = createdResourcesVersion diff --git a/data/transactions/logic/fields.go b/data/transactions/logic/fields.go index 68ae0f12f8..4174775159 100644 --- a/data/transactions/logic/fields.go +++ b/data/transactions/logic/fields.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -17,13 +17,11 @@ package logic import ( - "fmt" - "github.com/algorand/go-algorand/data/transactions" "github.com/algorand/go-algorand/protocol" ) -//go:generate stringer -type=TxnField,GlobalField,AssetParamsField,AppParamsField,AssetHoldingField,OnCompletionConstType,EcdsaCurve -output=fields_string.go +//go:generate stringer -type=TxnField,GlobalField,AssetParamsField,AppParamsField,AcctParamsField,AssetHoldingField,OnCompletionConstType,EcdsaCurve,Base64Encoding -output=fields_string.go // TxnField is an enum type for `txn` and `gtxn` type TxnField int @@ -161,122 +159,147 @@ const ( // CreatedApplicationID Transaction.ApplyData.EvalDelta.ApplicationID CreatedApplicationID + // LastLog Logs[len(Logs)-1] + LastLog + + // StateProofPK Transaction.StateProofPK + StateProofPK + invalidTxnField // fence for some setup that loops from Sender..invalidTxnField ) +// FieldSpec unifies the various specs for presentation +type FieldSpec interface { + Type() StackType + OpVersion() uint64 + Note() string + Version() uint64 +} + // TxnFieldNames are arguments to the 'txn' and 'txnById' opcodes var TxnFieldNames []string -// TxnFieldTypes is StackBytes or StackUint64 parallel to TxnFieldNames -var TxnFieldTypes []StackType - var txnFieldSpecByField map[TxnField]txnFieldSpec -var txnFieldSpecByName tfNameSpecMap + +// TxnFieldSpecByName gives access to the field specs by field name +var TxnFieldSpecByName tfNameSpecMap // simple interface used by doc generator for fields versioning type tfNameSpecMap map[string]txnFieldSpec -func (s tfNameSpecMap) getExtraFor(name string) (extra string) { - if s[name].version > 1 { - extra = fmt.Sprintf("LogicSigVersion >= %d.", s[name].version) - } - return +func (s tfNameSpecMap) SpecByName(name string) FieldSpec { + fs := s[name] + return &fs } type txnFieldSpec struct { field TxnField ftype StackType + array bool // Is this an array field? version uint64 // When this field become available to txn/gtxn. 0=always itxVersion uint64 // When this field become available to itxn_field. 0=never effects bool // Is this a field on the "effects"? That is, something in ApplyData } -var txnFieldSpecs = []txnFieldSpec{ - {Sender, StackBytes, 0, 5, false}, - {Fee, StackUint64, 0, 5, false}, - {FirstValid, StackUint64, 0, 0, false}, - {FirstValidTime, StackUint64, 0, 0, false}, - {LastValid, StackUint64, 0, 0, false}, - {Note, StackBytes, 0, 6, false}, - {Lease, StackBytes, 0, 0, false}, - {Receiver, StackBytes, 0, 5, false}, - {Amount, StackUint64, 0, 5, false}, - {CloseRemainderTo, StackBytes, 0, 5, false}, - {VotePK, StackBytes, 0, 6, false}, - {SelectionPK, StackBytes, 0, 6, false}, - {VoteFirst, StackUint64, 0, 6, false}, - {VoteLast, StackUint64, 0, 6, false}, - {VoteKeyDilution, StackUint64, 0, 6, false}, - {Type, StackBytes, 0, 5, false}, - {TypeEnum, StackUint64, 0, 5, false}, - {XferAsset, StackUint64, 0, 5, false}, - {AssetAmount, StackUint64, 0, 5, false}, - {AssetSender, StackBytes, 0, 5, false}, - {AssetReceiver, StackBytes, 0, 5, false}, - {AssetCloseTo, StackBytes, 0, 5, false}, - {GroupIndex, StackUint64, 0, 0, false}, - {TxID, StackBytes, 0, 0, false}, - {ApplicationID, StackUint64, 2, 0, false}, - {OnCompletion, StackUint64, 2, 0, false}, - {ApplicationArgs, StackBytes, 2, 0, false}, - {NumAppArgs, StackUint64, 2, 0, false}, - {Accounts, StackBytes, 2, 0, false}, - {NumAccounts, StackUint64, 2, 0, false}, - {ApprovalProgram, StackBytes, 2, 0, false}, - {ClearStateProgram, StackBytes, 2, 0, false}, - {RekeyTo, StackBytes, 2, 6, false}, - {ConfigAsset, StackUint64, 2, 5, false}, - {ConfigAssetTotal, StackUint64, 2, 5, false}, - {ConfigAssetDecimals, StackUint64, 2, 5, false}, - {ConfigAssetDefaultFrozen, StackUint64, 2, 5, false}, - {ConfigAssetUnitName, StackBytes, 2, 5, false}, - {ConfigAssetName, StackBytes, 2, 5, false}, - {ConfigAssetURL, StackBytes, 2, 5, false}, - {ConfigAssetMetadataHash, StackBytes, 2, 5, false}, - {ConfigAssetManager, StackBytes, 2, 5, false}, - {ConfigAssetReserve, StackBytes, 2, 5, false}, - {ConfigAssetFreeze, StackBytes, 2, 5, false}, - {ConfigAssetClawback, StackBytes, 2, 5, false}, - {FreezeAsset, StackUint64, 2, 5, false}, - {FreezeAssetAccount, StackBytes, 2, 5, false}, - {FreezeAssetFrozen, StackUint64, 2, 5, false}, - {Assets, StackUint64, 3, 0, false}, - {NumAssets, StackUint64, 3, 0, false}, - {Applications, StackUint64, 3, 0, false}, - {NumApplications, StackUint64, 3, 0, false}, - {GlobalNumUint, StackUint64, 3, 0, false}, - {GlobalNumByteSlice, StackUint64, 3, 0, false}, - {LocalNumUint, StackUint64, 3, 0, false}, - {LocalNumByteSlice, StackUint64, 3, 0, false}, - {ExtraProgramPages, StackUint64, 4, 0, false}, - {Nonparticipation, StackUint64, 5, 6, false}, - - {Logs, StackBytes, 5, 5, true}, - {NumLogs, StackUint64, 5, 5, true}, - {CreatedAssetID, StackUint64, 5, 5, true}, - {CreatedApplicationID, StackUint64, 5, 5, true}, +func (fs *txnFieldSpec) Type() StackType { + return fs.ftype } -// TxnaFieldNames are arguments to the 'txna' opcode -// It is a subset of txn transaction fields so initialized here in-place -var TxnaFieldNames = []string{ApplicationArgs.String(), Accounts.String(), Assets.String(), Applications.String(), Logs.String()} +func (fs *txnFieldSpec) OpVersion() uint64 { + return 0 +} -// TxnaFieldTypes is StackBytes or StackUint64 parallel to TxnaFieldNames -var TxnaFieldTypes = []StackType{ - txnaFieldSpecByField[ApplicationArgs].ftype, - txnaFieldSpecByField[Accounts].ftype, - txnaFieldSpecByField[Assets].ftype, - txnaFieldSpecByField[Applications].ftype, - txnaFieldSpecByField[Logs].ftype, +func (fs *txnFieldSpec) Version() uint64 { + return fs.version } -var txnaFieldSpecByField = map[TxnField]txnFieldSpec{ - ApplicationArgs: {ApplicationArgs, StackBytes, 2, 0, false}, - Accounts: {Accounts, StackBytes, 2, 0, false}, - Assets: {Assets, StackUint64, 3, 0, false}, - Applications: {Applications, StackUint64, 3, 0, false}, +func (fs *txnFieldSpec) Note() string { + note := txnFieldDocs[fs.field.String()] + if fs.effects { + note = addExtra(note, "Application mode only") + } + return note +} - Logs: {Logs, StackBytes, 5, 5, true}, +var txnFieldSpecs = []txnFieldSpec{ + {Sender, StackBytes, false, 0, 5, false}, + {Fee, StackUint64, false, 0, 5, false}, + {FirstValid, StackUint64, false, 0, 0, false}, + {FirstValidTime, StackUint64, false, 0, 0, false}, + {LastValid, StackUint64, false, 0, 0, false}, + {Note, StackBytes, false, 0, 6, false}, + {Lease, StackBytes, false, 0, 0, false}, + {Receiver, StackBytes, false, 0, 5, false}, + {Amount, StackUint64, false, 0, 5, false}, + {CloseRemainderTo, StackBytes, false, 0, 5, false}, + {VotePK, StackBytes, false, 0, 6, false}, + {SelectionPK, StackBytes, false, 0, 6, false}, + {VoteFirst, StackUint64, false, 0, 6, false}, + {VoteLast, StackUint64, false, 0, 6, false}, + {VoteKeyDilution, StackUint64, false, 0, 6, false}, + {Type, StackBytes, false, 0, 5, false}, + {TypeEnum, StackUint64, false, 0, 5, false}, + {XferAsset, StackUint64, false, 0, 5, false}, + {AssetAmount, StackUint64, false, 0, 5, false}, + {AssetSender, StackBytes, false, 0, 5, false}, + {AssetReceiver, StackBytes, false, 0, 5, false}, + {AssetCloseTo, StackBytes, false, 0, 5, false}, + {GroupIndex, StackUint64, false, 0, 0, false}, + {TxID, StackBytes, false, 0, 0, false}, + {ApplicationID, StackUint64, false, 2, 6, false}, + {OnCompletion, StackUint64, false, 2, 6, false}, + {ApplicationArgs, StackBytes, true, 2, 6, false}, + {NumAppArgs, StackUint64, false, 2, 0, false}, + {Accounts, StackBytes, true, 2, 6, false}, + {NumAccounts, StackUint64, false, 2, 0, false}, + {ApprovalProgram, StackBytes, false, 2, 6, false}, + {ClearStateProgram, StackBytes, false, 2, 6, false}, + {RekeyTo, StackBytes, false, 2, 6, false}, + {ConfigAsset, StackUint64, false, 2, 5, false}, + {ConfigAssetTotal, StackUint64, false, 2, 5, false}, + {ConfigAssetDecimals, StackUint64, false, 2, 5, false}, + {ConfigAssetDefaultFrozen, StackUint64, false, 2, 5, false}, + {ConfigAssetUnitName, StackBytes, false, 2, 5, false}, + {ConfigAssetName, StackBytes, false, 2, 5, false}, + {ConfigAssetURL, StackBytes, false, 2, 5, false}, + {ConfigAssetMetadataHash, StackBytes, false, 2, 5, false}, + {ConfigAssetManager, StackBytes, false, 2, 5, false}, + {ConfigAssetReserve, StackBytes, false, 2, 5, false}, + {ConfigAssetFreeze, StackBytes, false, 2, 5, false}, + {ConfigAssetClawback, StackBytes, false, 2, 5, false}, + {FreezeAsset, StackUint64, false, 2, 5, false}, + {FreezeAssetAccount, StackBytes, false, 2, 5, false}, + {FreezeAssetFrozen, StackUint64, false, 2, 5, false}, + {Assets, StackUint64, true, 3, 6, false}, + {NumAssets, StackUint64, false, 3, 0, false}, + {Applications, StackUint64, true, 3, 6, false}, + {NumApplications, StackUint64, false, 3, 0, false}, + {GlobalNumUint, StackUint64, false, 3, 6, false}, + {GlobalNumByteSlice, StackUint64, false, 3, 6, false}, + {LocalNumUint, StackUint64, false, 3, 6, false}, + {LocalNumByteSlice, StackUint64, false, 3, 6, false}, + {ExtraProgramPages, StackUint64, false, 4, 6, false}, + {Nonparticipation, StackUint64, false, 5, 6, false}, + + // "Effects" Last two things are always going to: 0, true + {Logs, StackBytes, true, 5, 0, true}, + {NumLogs, StackUint64, false, 5, 0, true}, + {CreatedAssetID, StackUint64, false, 5, 0, true}, + {CreatedApplicationID, StackUint64, false, 5, 0, true}, + {LastLog, StackBytes, false, 6, 0, true}, + {StateProofPK, StackBytes, false, 6, 6, false}, +} + +// TxnaFieldNames are arguments to the 'txna' opcode +// It need not be fast, as it's only used for doc generation. +func TxnaFieldNames() []string { + var names []string + for _, fs := range txnFieldSpecs { + if fs.array { + names = append(names, fs.field.String()) + } + } + return names } var innerTxnTypes = map[string]uint64{ @@ -285,6 +308,7 @@ var innerTxnTypes = map[string]uint64{ string(protocol.AssetTransferTx): 5, string(protocol.AssetConfigTx): 5, string(protocol.AssetFreezeTx): 5, + string(protocol.ApplicationCallTx): 6, } // TxnTypeNames is the values of Txn.Type in enum order @@ -368,15 +392,23 @@ const ( // GroupID [32]byte GroupID + // v6 + + // OpcodeBudget The remaining budget available for execution + OpcodeBudget + + // CallerApplicationID The ID of the caller app, else 0 + CallerApplicationID + + // CallerApplicationAddress The Address of the caller app, else ZeroAddress + CallerApplicationAddress + invalidGlobalField ) // GlobalFieldNames are arguments to the 'global' opcode var GlobalFieldNames []string -// GlobalFieldTypes is StackUint64 StackBytes in parallel with GlobalFieldNames -var GlobalFieldTypes []StackType - type globalFieldSpec struct { field GlobalField ftype StackType @@ -384,6 +416,26 @@ type globalFieldSpec struct { version uint64 } +func (fs *globalFieldSpec) Type() StackType { + return fs.ftype +} + +func (fs *globalFieldSpec) OpVersion() uint64 { + return 0 +} + +func (fs *globalFieldSpec) Version() uint64 { + return fs.version +} +func (fs *globalFieldSpec) Note() string { + note := globalFieldDocs[fs.field.String()] + if fs.mode == runModeApplication { + note = addExtra(note, "Application mode only.") + } + // There are no Signature mode only globals + return note +} + var globalFieldSpecs = []globalFieldSpec{ {MinTxnFee, StackUint64, modeAny, 0}, // version 0 is the same as TEAL v1 (initial TEAL release) {MinBalance, StackUint64, modeAny, 0}, @@ -397,20 +449,21 @@ var globalFieldSpecs = []globalFieldSpec{ {CreatorAddress, StackBytes, runModeApplication, 3}, {CurrentApplicationAddress, StackBytes, runModeApplication, 5}, {GroupID, StackBytes, modeAny, 5}, + {OpcodeBudget, StackUint64, modeAny, 6}, + {CallerApplicationID, StackUint64, runModeApplication, 6}, + {CallerApplicationAddress, StackBytes, runModeApplication, 6}, } -// GlobalFieldSpecByField maps GlobalField to spec var globalFieldSpecByField map[GlobalField]globalFieldSpec -var globalFieldSpecByName gfNameSpecMap -// simple interface used by doc generator for fields versioning +// GlobalFieldSpecByName gives access to the field specs by field name +var GlobalFieldSpecByName gfNameSpecMap + type gfNameSpecMap map[string]globalFieldSpec -func (s gfNameSpecMap) getExtraFor(name string) (extra string) { - if s[name].version > 1 { - extra = fmt.Sprintf("LogicSigVersion >= %d.", s[name].version) - } - return +func (s gfNameSpecMap) SpecByName(name string) FieldSpec { + fs := s[name] + return &fs } // EcdsaCurve is an enum for `ecdsa_` opcodes @@ -430,21 +483,88 @@ type ecdsaCurveSpec struct { version uint64 } +func (fs *ecdsaCurveSpec) Type() StackType { + return StackNone // Will not show, since all are the same +} + +func (fs *ecdsaCurveSpec) OpVersion() uint64 { + return 5 +} + +func (fs *ecdsaCurveSpec) Version() uint64 { + return fs.version +} + +func (fs *ecdsaCurveSpec) Note() string { + note := EcdsaCurveDocs[fs.field.String()] + return note +} + var ecdsaCurveSpecs = []ecdsaCurveSpec{ {Secp256k1, 5}, } var ecdsaCurveSpecByField map[EcdsaCurve]ecdsaCurveSpec -var ecdsaCurveSpecByName ecDsaCurveNameSpecMap + +// EcdsaCurveSpecByName gives access to the field specs by field name +var EcdsaCurveSpecByName ecDsaCurveNameSpecMap // simple interface used by doc generator for fields versioning type ecDsaCurveNameSpecMap map[string]ecdsaCurveSpec -func (s ecDsaCurveNameSpecMap) getExtraFor(name string) (extra string) { - // Uses 5 here because ecdsa fields were introduced in 5 - if s[name].version > 5 { - extra = fmt.Sprintf("LogicSigVersion >= %d.", s[name].version) - } +func (s ecDsaCurveNameSpecMap) SpecByName(name string) FieldSpec { + fs := s[name] + return &fs +} + +// Base64Encoding is an enum for the `base64decode` opcode +type Base64Encoding int + +const ( + // URLEncoding represents the base64url encoding defined in https://www.rfc-editor.org/rfc/rfc4648.html + URLEncoding Base64Encoding = iota + // StdEncoding represents the standard encoding of the RFC + StdEncoding + invalidBase64Alphabet +) + +// After running `go generate` these strings will be available: +var base64EncodingNames [2]string = [...]string{URLEncoding.String(), StdEncoding.String()} + +type base64EncodingSpec struct { + field Base64Encoding + ftype StackType + version uint64 +} + +var base64EncodingSpecs = []base64EncodingSpec{ + {URLEncoding, StackBytes, 6}, + {StdEncoding, StackBytes, 6}, +} + +var base64EncodingSpecByField map[Base64Encoding]base64EncodingSpec +var base64EncodingSpecByName base64EncodingSpecMap + +type base64EncodingSpecMap map[string]base64EncodingSpec + +func (fs *base64EncodingSpec) Type() StackType { + return fs.ftype +} + +func (fs *base64EncodingSpec) OpVersion() uint64 { + return 6 +} + +func (fs *base64EncodingSpec) Version() uint64 { + return fs.version +} + +func (fs *base64EncodingSpec) Note() string { + note := "" // no doc list? + return note +} +func (s base64EncodingSpecMap) getExtraFor(name string) (extra string) { + // Uses 6 here because base64_decode fields were introduced in 6 return } @@ -462,32 +582,44 @@ const ( // AssetHoldingFieldNames are arguments to the 'asset_holding_get' opcode var AssetHoldingFieldNames []string -// AssetHoldingFieldTypes is StackUint64 StackBytes in parallel with AssetHoldingFieldNames -var AssetHoldingFieldTypes []StackType - type assetHoldingFieldSpec struct { field AssetHoldingField ftype StackType version uint64 } +func (fs *assetHoldingFieldSpec) Type() StackType { + return fs.ftype +} + +func (fs *assetHoldingFieldSpec) OpVersion() uint64 { + return 2 +} + +func (fs *assetHoldingFieldSpec) Version() uint64 { + return fs.version +} + +func (fs *assetHoldingFieldSpec) Note() string { + note := assetHoldingFieldDocs[fs.field.String()] + return note +} + var assetHoldingFieldSpecs = []assetHoldingFieldSpec{ {AssetBalance, StackUint64, 2}, {AssetFrozen, StackUint64, 2}, } var assetHoldingFieldSpecByField map[AssetHoldingField]assetHoldingFieldSpec -var assetHoldingFieldSpecByName ahfNameSpecMap -// simple interface used by doc generator for fields versioning +// AssetHoldingFieldSpecByName gives access to the field specs by field name +var AssetHoldingFieldSpecByName ahfNameSpecMap + type ahfNameSpecMap map[string]assetHoldingFieldSpec -func (s ahfNameSpecMap) getExtraFor(name string) (extra string) { - // Uses 2 here because asset fields were introduced in 2 - if s[name].version > 2 { - extra = fmt.Sprintf("LogicSigVersion >= %d.", s[name].version) - } - return +func (s ahfNameSpecMap) SpecByName(name string) FieldSpec { + fs := s[name] + return &fs } // AssetParamsField is an enum for `asset_params_get` opcode @@ -526,15 +658,29 @@ const ( // AssetParamsFieldNames are arguments to the 'asset_params_get' opcode var AssetParamsFieldNames []string -// AssetParamsFieldTypes is StackUint64 StackBytes in parallel with AssetParamsFieldNames -var AssetParamsFieldTypes []StackType - type assetParamsFieldSpec struct { field AssetParamsField ftype StackType version uint64 } +func (fs *assetParamsFieldSpec) Type() StackType { + return fs.ftype +} + +func (fs *assetParamsFieldSpec) OpVersion() uint64 { + return 2 +} + +func (fs *assetParamsFieldSpec) Version() uint64 { + return fs.version +} + +func (fs *assetParamsFieldSpec) Note() string { + note := assetParamsFieldDocs[fs.field.String()] + return note +} + var assetParamsFieldSpecs = []assetParamsFieldSpec{ {AssetTotal, StackUint64, 2}, {AssetDecimals, StackUint64, 2}, @@ -551,17 +697,15 @@ var assetParamsFieldSpecs = []assetParamsFieldSpec{ } var assetParamsFieldSpecByField map[AssetParamsField]assetParamsFieldSpec -var assetParamsFieldSpecByName apfNameSpecMap -// simple interface used by doc generator for fields versioning +// AssetParamsFieldSpecByName gives access to the field specs by field name +var AssetParamsFieldSpecByName apfNameSpecMap + type apfNameSpecMap map[string]assetParamsFieldSpec -func (s apfNameSpecMap) getExtraFor(name string) (extra string) { - // Uses 2 here because asset fields were introduced in 2 - if s[name].version > 2 { - extra = fmt.Sprintf("LogicSigVersion >= %d.", s[name].version) - } - return +func (s apfNameSpecMap) SpecByName(name string) FieldSpec { + fs := s[name] + return &fs } // AppParamsField is an enum for `app_params_get` opcode @@ -595,15 +739,29 @@ const ( // AppParamsFieldNames are arguments to the 'app_params_get' opcode var AppParamsFieldNames []string -// AppParamsFieldTypes is StackUint64 StackBytes in parallel with AppParamsFieldNames -var AppParamsFieldTypes []StackType - type appParamsFieldSpec struct { field AppParamsField ftype StackType version uint64 } +func (fs *appParamsFieldSpec) Type() StackType { + return fs.ftype +} + +func (fs *appParamsFieldSpec) OpVersion() uint64 { + return 5 +} + +func (fs *appParamsFieldSpec) Version() uint64 { + return fs.version +} + +func (fs *appParamsFieldSpec) Note() string { + note := appParamsFieldDocs[fs.field.String()] + return note +} + var appParamsFieldSpecs = []appParamsFieldSpec{ {AppApprovalProgram, StackBytes, 5}, {AppClearStateProgram, StackBytes, 5}, @@ -617,17 +775,75 @@ var appParamsFieldSpecs = []appParamsFieldSpec{ } var appParamsFieldSpecByField map[AppParamsField]appParamsFieldSpec -var appParamsFieldSpecByName appNameSpecMap + +// AppParamsFieldSpecByName gives access to the field specs by field name +var AppParamsFieldSpecByName appNameSpecMap // simple interface used by doc generator for fields versioning type appNameSpecMap map[string]appParamsFieldSpec -func (s appNameSpecMap) getExtraFor(name string) (extra string) { - // Uses 5 here because app fields were introduced in 5 - if s[name].version > 5 { - extra = fmt.Sprintf("LogicSigVersion >= %d.", s[name].version) - } - return +func (s appNameSpecMap) SpecByName(name string) FieldSpec { + fs := s[name] + return &fs +} + +// AcctParamsField is an enum for `acct_params_get` opcode +type AcctParamsField int + +const ( + // AcctBalance is the blance, with pending rewards + AcctBalance AcctParamsField = iota + // AcctMinBalance is algos needed for this accounts apps and assets + AcctMinBalance + //AcctAuthAddr is the rekeyed address if any, else ZeroAddress + AcctAuthAddr + + invalidAcctParamsField +) + +// AcctParamsFieldNames are arguments to the 'acct_params_get' opcode +var AcctParamsFieldNames []string + +type acctParamsFieldSpec struct { + field AcctParamsField + ftype StackType + version uint64 +} + +func (fs *acctParamsFieldSpec) Type() StackType { + return fs.ftype +} + +func (fs *acctParamsFieldSpec) OpVersion() uint64 { + return 6 +} + +func (fs *acctParamsFieldSpec) Version() uint64 { + return fs.version +} + +func (fs *acctParamsFieldSpec) Note() string { + note := acctParamsFieldDocs[fs.field.String()] + return note +} + +var acctParamsFieldSpecs = []acctParamsFieldSpec{ + {AcctBalance, StackUint64, 6}, + {AcctMinBalance, StackUint64, 6}, + {AcctAuthAddr, StackBytes, 6}, +} + +var acctParamsFieldSpecByField map[AcctParamsField]acctParamsFieldSpec + +// AcctParamsFieldSpecByName gives access to the field specs by field name +var AcctParamsFieldSpecByName acctNameSpecMap + +// simple interface used by doc generator for fields versioning +type acctNameSpecMap map[string]acctParamsFieldSpec + +func (s acctNameSpecMap) SpecByName(name string) FieldSpec { + fs := s[name] + return &fs } func init() { @@ -635,95 +851,118 @@ func init() { for fi := Sender; fi < invalidTxnField; fi++ { TxnFieldNames[fi] = fi.String() } - TxnFieldTypes = make([]StackType, int(invalidTxnField)) txnFieldSpecByField = make(map[TxnField]txnFieldSpec, len(TxnFieldNames)) for i, s := range txnFieldSpecs { if int(s.field) != i { panic("txnFieldSpecs disjoint with TxnField enum") } - TxnFieldTypes[i] = s.ftype txnFieldSpecByField[s.field] = s } - txnFieldSpecByName = make(tfNameSpecMap, len(TxnFieldNames)) + TxnFieldSpecByName = make(map[string]txnFieldSpec, len(TxnFieldNames)) for i, tfn := range TxnFieldNames { - txnFieldSpecByName[tfn] = txnFieldSpecByField[TxnField(i)] + TxnFieldSpecByName[tfn] = txnFieldSpecByField[TxnField(i)] } GlobalFieldNames = make([]string, int(invalidGlobalField)) for i := MinTxnFee; i < invalidGlobalField; i++ { - GlobalFieldNames[int(i)] = i.String() + GlobalFieldNames[i] = i.String() } - GlobalFieldTypes = make([]StackType, len(GlobalFieldNames)) globalFieldSpecByField = make(map[GlobalField]globalFieldSpec, len(GlobalFieldNames)) for i, s := range globalFieldSpecs { if int(s.field) != i { panic("globalFieldSpecs disjoint with GlobalField enum") } - GlobalFieldTypes[i] = s.ftype globalFieldSpecByField[s.field] = s } - globalFieldSpecByName = make(gfNameSpecMap, len(GlobalFieldNames)) + GlobalFieldSpecByName = make(gfNameSpecMap, len(GlobalFieldNames)) for i, gfn := range GlobalFieldNames { - globalFieldSpecByName[gfn] = globalFieldSpecByField[GlobalField(i)] + GlobalFieldSpecByName[gfn] = globalFieldSpecByField[GlobalField(i)] } EcdsaCurveNames = make([]string, int(invalidEcdsaCurve)) for i := Secp256k1; i < invalidEcdsaCurve; i++ { - EcdsaCurveNames[int(i)] = i.String() + EcdsaCurveNames[i] = i.String() } ecdsaCurveSpecByField = make(map[EcdsaCurve]ecdsaCurveSpec, len(EcdsaCurveNames)) for _, s := range ecdsaCurveSpecs { ecdsaCurveSpecByField[s.field] = s } - ecdsaCurveSpecByName = make(ecDsaCurveNameSpecMap, len(EcdsaCurveNames)) + EcdsaCurveSpecByName = make(ecDsaCurveNameSpecMap, len(EcdsaCurveNames)) for i, ahfn := range EcdsaCurveNames { - ecdsaCurveSpecByName[ahfn] = ecdsaCurveSpecByField[EcdsaCurve(i)] + EcdsaCurveSpecByName[ahfn] = ecdsaCurveSpecByField[EcdsaCurve(i)] + } + + base64EncodingSpecByField = make(map[Base64Encoding]base64EncodingSpec, len(base64EncodingNames)) + for _, s := range base64EncodingSpecs { + base64EncodingSpecByField[s.field] = s + } + + base64EncodingSpecByName = make(base64EncodingSpecMap, len(base64EncodingNames)) + for i, encoding := range base64EncodingNames { + base64EncodingSpecByName[encoding] = base64EncodingSpecByField[Base64Encoding(i)] + } + + base64EncodingSpecByField = make(map[Base64Encoding]base64EncodingSpec, len(base64EncodingNames)) + for _, s := range base64EncodingSpecs { + base64EncodingSpecByField[s.field] = s + } + + base64EncodingSpecByName = make(base64EncodingSpecMap, len(base64EncodingNames)) + for i, encoding := range base64EncodingNames { + base64EncodingSpecByName[encoding] = base64EncodingSpecByField[Base64Encoding(i)] } AssetHoldingFieldNames = make([]string, int(invalidAssetHoldingField)) for i := AssetBalance; i < invalidAssetHoldingField; i++ { - AssetHoldingFieldNames[int(i)] = i.String() + AssetHoldingFieldNames[i] = i.String() } - AssetHoldingFieldTypes = make([]StackType, len(AssetHoldingFieldNames)) assetHoldingFieldSpecByField = make(map[AssetHoldingField]assetHoldingFieldSpec, len(AssetHoldingFieldNames)) for _, s := range assetHoldingFieldSpecs { - AssetHoldingFieldTypes[int(s.field)] = s.ftype assetHoldingFieldSpecByField[s.field] = s } - assetHoldingFieldSpecByName = make(ahfNameSpecMap, len(AssetHoldingFieldNames)) + AssetHoldingFieldSpecByName = make(ahfNameSpecMap, len(AssetHoldingFieldNames)) for i, ahfn := range AssetHoldingFieldNames { - assetHoldingFieldSpecByName[ahfn] = assetHoldingFieldSpecByField[AssetHoldingField(i)] + AssetHoldingFieldSpecByName[ahfn] = assetHoldingFieldSpecByField[AssetHoldingField(i)] } AssetParamsFieldNames = make([]string, int(invalidAssetParamsField)) for i := AssetTotal; i < invalidAssetParamsField; i++ { - AssetParamsFieldNames[int(i)] = i.String() + AssetParamsFieldNames[i] = i.String() } - AssetParamsFieldTypes = make([]StackType, len(AssetParamsFieldNames)) assetParamsFieldSpecByField = make(map[AssetParamsField]assetParamsFieldSpec, len(AssetParamsFieldNames)) for _, s := range assetParamsFieldSpecs { - AssetParamsFieldTypes[int(s.field)] = s.ftype assetParamsFieldSpecByField[s.field] = s } - assetParamsFieldSpecByName = make(apfNameSpecMap, len(AssetParamsFieldNames)) + AssetParamsFieldSpecByName = make(apfNameSpecMap, len(AssetParamsFieldNames)) for i, apfn := range AssetParamsFieldNames { - assetParamsFieldSpecByName[apfn] = assetParamsFieldSpecByField[AssetParamsField(i)] + AssetParamsFieldSpecByName[apfn] = assetParamsFieldSpecByField[AssetParamsField(i)] } AppParamsFieldNames = make([]string, int(invalidAppParamsField)) for i := AppApprovalProgram; i < invalidAppParamsField; i++ { - AppParamsFieldNames[int(i)] = i.String() + AppParamsFieldNames[i] = i.String() } - AppParamsFieldTypes = make([]StackType, len(AppParamsFieldNames)) appParamsFieldSpecByField = make(map[AppParamsField]appParamsFieldSpec, len(AppParamsFieldNames)) for _, s := range appParamsFieldSpecs { - AppParamsFieldTypes[int(s.field)] = s.ftype appParamsFieldSpecByField[s.field] = s } - appParamsFieldSpecByName = make(appNameSpecMap, len(AppParamsFieldNames)) + AppParamsFieldSpecByName = make(appNameSpecMap, len(AppParamsFieldNames)) for i, apfn := range AppParamsFieldNames { - appParamsFieldSpecByName[apfn] = appParamsFieldSpecByField[AppParamsField(i)] + AppParamsFieldSpecByName[apfn] = appParamsFieldSpecByField[AppParamsField(i)] + } + + AcctParamsFieldNames = make([]string, int(invalidAcctParamsField)) + for i := AcctBalance; i < invalidAcctParamsField; i++ { + AcctParamsFieldNames[i] = i.String() + } + acctParamsFieldSpecByField = make(map[AcctParamsField]acctParamsFieldSpec, len(AcctParamsFieldNames)) + for _, s := range acctParamsFieldSpecs { + acctParamsFieldSpecByField[s.field] = s + } + AcctParamsFieldSpecByName = make(acctNameSpecMap, len(AcctParamsFieldNames)) + for i, apfn := range AcctParamsFieldNames { + AcctParamsFieldSpecByName[apfn] = acctParamsFieldSpecByField[AcctParamsField(i)] } txnTypeIndexes = make(map[string]uint64, len(TxnTypeNames)) diff --git a/data/transactions/logic/fields_string.go b/data/transactions/logic/fields_string.go index 82abacb941..f31a3baa54 100644 --- a/data/transactions/logic/fields_string.go +++ b/data/transactions/logic/fields_string.go @@ -1,4 +1,4 @@ -// Code generated by "stringer -type=TxnField,GlobalField,AssetParamsField,AppParamsField,AssetHoldingField,OnCompletionConstType,EcdsaCurve -output=fields_string.go"; DO NOT EDIT. +// Code generated by "stringer -type=TxnField,GlobalField,AssetParamsField,AppParamsField,AcctParamsField,AssetHoldingField,OnCompletionConstType,EcdsaCurve,Base64Encoding -output=fields_string.go"; DO NOT EDIT. package logic @@ -70,12 +70,14 @@ func _() { _ = x[NumLogs-59] _ = x[CreatedAssetID-60] _ = x[CreatedApplicationID-61] - _ = x[invalidTxnField-62] + _ = x[LastLog-62] + _ = x[StateProofPK-63] + _ = x[invalidTxnField-64] } -const _TxnField_name = "SenderFeeFirstValidFirstValidTimeLastValidNoteLeaseReceiverAmountCloseRemainderToVotePKSelectionPKVoteFirstVoteLastVoteKeyDilutionTypeTypeEnumXferAssetAssetAmountAssetSenderAssetReceiverAssetCloseToGroupIndexTxIDApplicationIDOnCompletionApplicationArgsNumAppArgsAccountsNumAccountsApprovalProgramClearStateProgramRekeyToConfigAssetConfigAssetTotalConfigAssetDecimalsConfigAssetDefaultFrozenConfigAssetUnitNameConfigAssetNameConfigAssetURLConfigAssetMetadataHashConfigAssetManagerConfigAssetReserveConfigAssetFreezeConfigAssetClawbackFreezeAssetFreezeAssetAccountFreezeAssetFrozenAssetsNumAssetsApplicationsNumApplicationsGlobalNumUintGlobalNumByteSliceLocalNumUintLocalNumByteSliceExtraProgramPagesNonparticipationLogsNumLogsCreatedAssetIDCreatedApplicationIDinvalidTxnField" +const _TxnField_name = "SenderFeeFirstValidFirstValidTimeLastValidNoteLeaseReceiverAmountCloseRemainderToVotePKSelectionPKVoteFirstVoteLastVoteKeyDilutionTypeTypeEnumXferAssetAssetAmountAssetSenderAssetReceiverAssetCloseToGroupIndexTxIDApplicationIDOnCompletionApplicationArgsNumAppArgsAccountsNumAccountsApprovalProgramClearStateProgramRekeyToConfigAssetConfigAssetTotalConfigAssetDecimalsConfigAssetDefaultFrozenConfigAssetUnitNameConfigAssetNameConfigAssetURLConfigAssetMetadataHashConfigAssetManagerConfigAssetReserveConfigAssetFreezeConfigAssetClawbackFreezeAssetFreezeAssetAccountFreezeAssetFrozenAssetsNumAssetsApplicationsNumApplicationsGlobalNumUintGlobalNumByteSliceLocalNumUintLocalNumByteSliceExtraProgramPagesNonparticipationLogsNumLogsCreatedAssetIDCreatedApplicationIDLastLogStateProofPKinvalidTxnField" -var _TxnField_index = [...]uint16{0, 6, 9, 19, 33, 42, 46, 51, 59, 65, 81, 87, 98, 107, 115, 130, 134, 142, 151, 162, 173, 186, 198, 208, 212, 225, 237, 252, 262, 270, 281, 296, 313, 320, 331, 347, 366, 390, 409, 424, 438, 461, 479, 497, 514, 533, 544, 562, 579, 585, 594, 606, 621, 634, 652, 664, 681, 698, 714, 718, 725, 739, 759, 774} +var _TxnField_index = [...]uint16{0, 6, 9, 19, 33, 42, 46, 51, 59, 65, 81, 87, 98, 107, 115, 130, 134, 142, 151, 162, 173, 186, 198, 208, 212, 225, 237, 252, 262, 270, 281, 296, 313, 320, 331, 347, 366, 390, 409, 424, 438, 461, 479, 497, 514, 533, 544, 562, 579, 585, 594, 606, 621, 634, 652, 664, 681, 698, 714, 718, 725, 739, 759, 766, 778, 793} func (i TxnField) String() string { if i < 0 || i >= TxnField(len(_TxnField_index)-1) { @@ -99,12 +101,15 @@ func _() { _ = x[CreatorAddress-9] _ = x[CurrentApplicationAddress-10] _ = x[GroupID-11] - _ = x[invalidGlobalField-12] + _ = x[OpcodeBudget-12] + _ = x[CallerApplicationID-13] + _ = x[CallerApplicationAddress-14] + _ = x[invalidGlobalField-15] } -const _GlobalField_name = "MinTxnFeeMinBalanceMaxTxnLifeZeroAddressGroupSizeLogicSigVersionRoundLatestTimestampCurrentApplicationIDCreatorAddressCurrentApplicationAddressGroupIDinvalidGlobalField" +const _GlobalField_name = "MinTxnFeeMinBalanceMaxTxnLifeZeroAddressGroupSizeLogicSigVersionRoundLatestTimestampCurrentApplicationIDCreatorAddressCurrentApplicationAddressGroupIDOpcodeBudgetCallerApplicationIDCallerApplicationAddressinvalidGlobalField" -var _GlobalField_index = [...]uint8{0, 9, 19, 29, 40, 49, 64, 69, 84, 104, 118, 143, 150, 168} +var _GlobalField_index = [...]uint8{0, 9, 19, 29, 40, 49, 64, 69, 84, 104, 118, 143, 150, 162, 181, 205, 223} func (i GlobalField) String() string { if i >= GlobalField(len(_GlobalField_index)-1) { @@ -167,6 +172,26 @@ func (i AppParamsField) String() string { } return _AppParamsField_name[_AppParamsField_index[i]:_AppParamsField_index[i+1]] } +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[AcctBalance-0] + _ = x[AcctMinBalance-1] + _ = x[AcctAuthAddr-2] + _ = x[invalidAcctParamsField-3] +} + +const _AcctParamsField_name = "AcctBalanceAcctMinBalanceAcctAuthAddrinvalidAcctParamsField" + +var _AcctParamsField_index = [...]uint8{0, 11, 25, 37, 59} + +func (i AcctParamsField) String() string { + if i < 0 || i >= AcctParamsField(len(_AcctParamsField_index)-1) { + return "AcctParamsField(" + strconv.FormatInt(int64(i), 10) + ")" + } + return _AcctParamsField_name[_AcctParamsField_index[i]:_AcctParamsField_index[i+1]] +} func _() { // An "invalid array index" compiler error signifies that the constant values have changed. // Re-run the stringer command to generate them again. @@ -227,3 +252,22 @@ func (i EcdsaCurve) String() string { } return _EcdsaCurve_name[_EcdsaCurve_index[i]:_EcdsaCurve_index[i+1]] } +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[URLEncoding-0] + _ = x[StdEncoding-1] + _ = x[invalidBase64Alphabet-2] +} + +const _Base64Encoding_name = "URLEncodingStdEncodinginvalidBase64Alphabet" + +var _Base64Encoding_index = [...]uint8{0, 11, 22, 43} + +func (i Base64Encoding) String() string { + if i < 0 || i >= Base64Encoding(len(_Base64Encoding_index)-1) { + return "Base64Encoding(" + strconv.FormatInt(int64(i), 10) + ")" + } + return _Base64Encoding_name[_Base64Encoding_index[i]:_Base64Encoding_index[i+1]] +} diff --git a/data/transactions/logic/fields_test.go b/data/transactions/logic/fields_test.go index 4a62d31cff..b6d1a49893 100644 --- a/data/transactions/logic/fields_test.go +++ b/data/transactions/logic/fields_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -23,16 +23,10 @@ import ( "github.com/stretchr/testify/require" "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/data/transactions/logictest" + "github.com/algorand/go-algorand/data/transactions" "github.com/algorand/go-algorand/test/partitiontest" ) -func TestArrayFields(t *testing.T) { - partitiontest.PartitionTest(t) - require.Equal(t, len(TxnaFieldNames), len(TxnaFieldTypes)) - require.Equal(t, len(txnaFieldSpecByField), len(TxnaFieldTypes)) -} - // ensure v2+ fields fail in TEAL assembler and evaluator on a version before they introduced // ensure v2+ fields error in v1 program func TestGlobalFieldsVersions(t *testing.T) { @@ -47,7 +41,7 @@ func TestGlobalFieldsVersions(t *testing.T) { } require.Greater(t, len(fields), 1) - ledger := logictest.MakeLedger(nil) + ledger := MakeLedger(nil) for _, field := range fields { text := fmt.Sprintf("global %s", field.field.String()) // check assembler fails if version before introduction @@ -61,30 +55,26 @@ func TestGlobalFieldsVersions(t *testing.T) { // check on a version before the field version preLogicVersion := field.version - 1 - proto := defaultEvalProtoWithVersion(preLogicVersion) + proto := makeTestProtoV(preLogicVersion) if preLogicVersion < appsEnabledVersion { require.False(t, proto.Application) } - ep := defaultEvalParams(nil, nil) - ep.Proto = &proto + ep := defaultEvalParams(nil) + ep.Proto = proto ep.Ledger = ledger // check failure with version check - _, err := Eval(ops.Program, ep) + _, err := EvalApp(ops.Program, 0, 888, ep) require.Error(t, err) require.Contains(t, err.Error(), "greater than protocol supported version") // check opcodes failures ops.Program[0] = byte(preLogicVersion) // set version - _, err = Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "invalid global field") + testLogicBytes(t, ops.Program, ep, "invalid global field") // check opcodes failures on 0 version ops.Program[0] = 0 // set version to 0 - _, err = Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "invalid global field") + testLogicBytes(t, ops.Program, ep, "invalid global field") } } @@ -111,7 +101,7 @@ func TestTxnFieldVersions(t *testing.T) { } txnaVersion := uint64(appsEnabledVersion) - ledger := logictest.MakeLedger(nil) + ledger := MakeLedger(nil) txn := makeSampleTxn() // We'll reject too early if we have a nonzero RekeyTo, because that // field must be zero for every txn in the group if this is an old @@ -125,7 +115,7 @@ func TestTxnFieldVersions(t *testing.T) { text := fmt.Sprintf(command, field) asmError := asmDefaultError txnaMode := false - if _, ok := txnaFieldSpecByField[fs.field]; ok { + if fs.array { text = fmt.Sprintf(subs[command], field) asmError = "...txna opcode was introduced in ..." txnaMode = true @@ -140,42 +130,75 @@ func TestTxnFieldVersions(t *testing.T) { } testLine(t, text, fs.version, "") - ops, err := AssembleStringWithVersion(text, AssemblerMaxVersion) - require.NoError(t, err) + ops := testProg(t, text, AssemblerMaxVersion) preLogicVersion := fs.version - 1 - proto := defaultEvalProtoWithVersion(preLogicVersion) + proto := makeTestProtoV(preLogicVersion) if preLogicVersion < appsEnabledVersion { require.False(t, proto.Application) } - ep := defaultEvalParams(nil, nil) - ep.Proto = &proto + ep := defaultEvalParams(nil) + ep.Proto = proto ep.Ledger = ledger - ep.TxnGroup = txgroup + ep.TxnGroup = transactions.WrapSignedTxnsWithAD(txgroup) // check failure with version check - _, err = Eval(ops.Program, ep) - require.Error(t, err) - require.Contains(t, err.Error(), "greater than protocol supported version") + testLogicBytes(t, ops.Program, ep, + "greater than protocol supported version", "greater than protocol supported version") // check opcodes failures ops.Program[0] = byte(preLogicVersion) // set version - _, err = Eval(ops.Program, ep) - require.Error(t, err) + checkErr := "" + evalErr := "invalid txn field" if txnaMode && preLogicVersion < txnaVersion { - require.Contains(t, err.Error(), "illegal opcode") - } else { - require.Contains(t, err.Error(), "invalid txn field") + checkErr = "illegal opcode" + evalErr = "illegal opcode" } + testLogicBytes(t, ops.Program, ep, checkErr, evalErr) // check opcodes failures on 0 version ops.Program[0] = 0 // set version to 0 - _, err = Eval(ops.Program, ep) - require.Error(t, err) + checkErr = "" + evalErr = "invalid txn field" if txnaMode { - require.Contains(t, err.Error(), "illegal opcode") + checkErr = "illegal opcode" + evalErr = "illegal opcode" + } + testLogicBytes(t, ops.Program, ep, checkErr, evalErr) + } + } +} + +// TestTxnEffectsAvailable ensures that LogicSigs can not use "effects" fields +// (ever). And apps can only use effects fields with `gtxn` after +// txnEffectsVersion. (itxn could use them earlier) +func TestTxnEffectsAvailable(t *testing.T) { + partitiontest.PartitionTest(t) + + t.Parallel() + for _, fs := range txnFieldSpecByField { + if !fs.effects { + continue + } + source := fmt.Sprintf("gtxn 0 %s; pop; int 1", fs.field) + if fs.array { + source = fmt.Sprintf("gtxn 0 %s 0; pop; int 1", fs.field) + } + for v := fs.version; v <= AssemblerMaxVersion; v++ { + ops := testProg(t, source, v) + ep, _, _ := makeSampleEnv() + ep.TxnGroup[1].Lsig.Logic = ops.Program + _, err := EvalSignature(1, ep) + require.Error(t, err) + ep.Ledger = MakeLedger(nil) + _, err = EvalApp(ops.Program, 1, 888, ep) + if v < txnEffectsVersion { + require.Error(t, err, source) } else { - require.Contains(t, err.Error(), "invalid txn field") + if fs.array { + continue // Array (Logs) will be 0 length, so will fail anyway + } + require.NoError(t, err, source) } } } @@ -199,19 +222,13 @@ func TestAssetParamsFieldsVersions(t *testing.T) { text := fmt.Sprintf("intcblock 0 1; intc_0; asset_params_get %s; pop; pop; intc_1", field.field.String()) // check assembler fails if version before introduction for v := uint64(2); v <= AssemblerMaxVersion; v++ { - ep, _ := makeSampleEnv() + ep, _, _ := makeSampleEnv() ep.Proto.LogicSigVersion = v if field.version > v { - testProg(t, text, v, expect{3, "...available in version..."}) + testProg(t, text, v, Expect{3, "...available in version..."}) ops := testProg(t, text, field.version) // assemble in the future - scratch := ops.Program - scratch[0] = byte(v) // but we'll tweak the version byte back to v - err := CheckStateful(scratch, ep) - require.NoError(t, err) - pass, err := EvalStateful(scratch, ep) // so eval fails on future field - require.False(t, pass) - require.Error(t, err) - require.Contains(t, err.Error(), "invalid asset_params_get field") + ops.Program[0] = byte(v) + testAppBytes(t, ops.Program, ep, "invalid asset_params_get field") } else { testProg(t, text, v) testApp(t, text, ep) diff --git a/data/transactions/logictest/ledger.go b/data/transactions/logic/ledger_test.go similarity index 72% rename from data/transactions/logictest/ledger.go rename to data/transactions/logic/ledger_test.go index 51ed941246..cceae644d2 100644 --- a/data/transactions/logictest/ledger.go +++ b/data/transactions/logic/ledger_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -14,13 +14,13 @@ // You should have received a copy of the GNU Affero General Public License // along with go-algorand. If not, see . -package logictest +package logic import ( + "errors" "fmt" "math/rand" - "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/transactions" "github.com/algorand/go-algorand/protocol" @@ -58,22 +58,13 @@ type asaParams struct { Creator basics.Address } -// Ledger is a convenient mock ledger that is used by -// data/transactions/logic It is in its own package so that it can be -// used by people developing teal code that need a fast testing setup, -// rather than running against a real network. It also might be -// expanded to support the Balances interface so that we have fewer -// mocks doing similar things. By putting it here, it is publicly -// exported, but will not be imported by non-test code, so won't bloat -// binary. +// Ledger is a fake ledger that is "good enough" to reasonably test AVM programs. type Ledger struct { - balances map[basics.Address]balanceRecord - applications map[basics.AppIndex]appParams - assets map[basics.AssetIndex]asaParams - trackedCreatables map[int]basics.CreatableIndex - appID basics.AppIndex - mods map[basics.AppIndex]map[string]basics.ValueDelta - rnd basics.Round + balances map[basics.Address]balanceRecord + applications map[basics.AppIndex]appParams + assets map[basics.AssetIndex]asaParams + mods map[basics.AppIndex]map[string]basics.ValueDelta + rnd basics.Round } // MakeLedger constructs a Ledger with the given balances. @@ -85,7 +76,6 @@ func MakeLedger(balances map[basics.Address]uint64) *Ledger { } l.applications = make(map[basics.AppIndex]appParams) l.assets = make(map[basics.AssetIndex]asaParams) - l.trackedCreatables = make(map[int]basics.CreatableIndex) l.mods = make(map[basics.AppIndex]map[string]basics.ValueDelta) return l } @@ -104,26 +94,18 @@ func (l *Ledger) NewAccount(addr basics.Address, balance uint64) { l.balances[addr] = makeBalanceRecord(addr, balance) } -// NewApp add a new AVM app to the Ledger, and arranges so that future -// executions will act as though they are that app. It only sets up -// the id and schema, it inserts no code, since testing will want to -// try many different code sequences. +// NewApp add a new AVM app to the Ledger. In most uses, it only sets up the id +// and schema but no code, as testing will want to try many different code +// sequences. func (l *Ledger) NewApp(creator basics.Address, appID basics.AppIndex, params basics.AppParams) { - l.appID = appID params = params.Clone() if params.GlobalState == nil { params.GlobalState = make(basics.TealKeyValue) } l.applications[appID] = appParams{ Creator: creator, - AppParams: params.Clone(), + AppParams: params, } - br, ok := l.balances[creator] - if !ok { - br = makeBalanceRecord(creator, 0) - } - br.locals[appID] = make(map[string]basics.TealValue) - l.balances[creator] = br } // NewAsset adds an asset with the given id and params to the ledger. @@ -140,9 +122,12 @@ func (l *Ledger) NewAsset(creator basics.Address, assetID basics.AssetIndex, par l.balances[creator] = br } -// freshID gets a new creatable ID that isn't in use -func (l *Ledger) freshID() uint64 { - for try := l.appID + 1; true; try++ { +const firstTestID = 5000 + +// Counter implements LedgerForLogic, but it not really a txn counter, but is +// sufficient for the logic package. +func (l *Ledger) Counter() uint64 { + for try := firstTestID; true; try++ { if _, ok := l.assets[basics.AssetIndex(try)]; ok { continue } @@ -166,6 +151,9 @@ func (l *Ledger) NewHolding(addr basics.Address, assetID uint64, amount uint64, // NewLocals essentially "opts in" an address to an app id. func (l *Ledger) NewLocals(addr basics.Address, appID uint64) { + if _, ok := l.balances[addr]; !ok { + l.balances[addr] = makeBalanceRecord(addr, 0) + } l.balances[addr].locals[basics.AppIndex(appID)] = basics.TealKeyValue{} } @@ -208,48 +196,46 @@ func (l *Ledger) LatestTimestamp() int64 { return int64(rand.Uint32() + 1) } -// Balance returns the value in an account, as MicroAlgos -func (l *Ledger) Balance(addr basics.Address) (amount basics.MicroAlgos, err error) { - br, ok := l.balances[addr] - if !ok { - return basics.MicroAlgos{Raw: 0}, nil - } - return basics.MicroAlgos{Raw: br.balance}, nil -} - -// MinBalance computes the MinBalance requirement for an account, -// under the given consensus parameters. -func (l *Ledger) MinBalance(addr basics.Address, proto *config.ConsensusParams) (amount basics.MicroAlgos, err error) { - br, ok := l.balances[addr] - if !ok { - br = makeBalanceRecord(addr, 0) +// AccountData returns a version of the account that is good enough for +// satisfiying AVM needs. (balance, calc minbalance, and authaddr) +func (l *Ledger) AccountData(addr basics.Address) (basics.AccountData, error) { + br := l.balances[addr] + // br may come back empty if addr doesn't exist. That's fine for our needs. + assets := make(map[basics.AssetIndex]basics.AssetParams) + for a, p := range l.assets { + if p.Creator == addr { + assets[a] = p.AssetParams + } } - var min uint64 - - // First, base MinBalance - min = proto.MinBalance - - // MinBalance for each Asset - assetCost := basics.MulSaturate(proto.MinBalance, uint64(len(br.holdings))) - min = basics.AddSaturate(min, assetCost) + schemaTotal := basics.StateSchema{} + pagesTotal := uint32(0) - // Base MinBalance + GlobalStateSchema.MinBalance + ExtraProgramPages MinBalance for each created application - for _, params := range l.applications { - if params.Creator == addr { - min = basics.AddSaturate(min, proto.AppFlatParamsMinBalance) - min = basics.AddSaturate(min, params.GlobalStateSchema.MinBalance(proto).Raw) - min = basics.AddSaturate(min, basics.MulSaturate(proto.AppFlatParamsMinBalance, uint64(params.ExtraProgramPages))) + apps := make(map[basics.AppIndex]basics.AppParams) + for a, p := range l.applications { + if p.Creator == addr { + apps[a] = p.AppParams + schemaTotal = schemaTotal.AddSchema(p.GlobalStateSchema) + pagesTotal = p.ExtraProgramPages } } - // Base MinBalance + LocalStateSchema.MinBalance for each opted in application - for idx := range br.locals { - min = basics.AddSaturate(min, proto.AppFlatParamsMinBalance) - min = basics.AddSaturate(min, l.applications[idx].LocalStateSchema.MinBalance(proto).Raw) + locals := map[basics.AppIndex]basics.AppLocalState{} + for a := range br.locals { + locals[a] = basics.AppLocalState{} // No need to fill in + schemaTotal = schemaTotal.AddSchema(l.applications[a].LocalStateSchema) } - return basics.MicroAlgos{Raw: min}, nil + return basics.AccountData{ + MicroAlgos: basics.MicroAlgos{Raw: br.balance}, + AssetParams: assets, + Assets: br.holdings, + AuthAddr: br.auth, + AppLocalStates: locals, + AppParams: apps, + TotalAppSchema: schemaTotal, + TotalExtraAppPages: pagesTotal, + }, nil } // Authorizer returns the address that must authorize txns from a @@ -269,12 +255,9 @@ func (l *Ledger) Authorizer(addr basics.Address) (basics.Address, error) { // GetGlobal returns the current value of a global in an app, taking // into account the mods created by earlier teal execution. func (l *Ledger) GetGlobal(appIdx basics.AppIndex, key string) (basics.TealValue, bool, error) { - if appIdx == basics.AppIndex(0) { - appIdx = l.appID - } params, ok := l.applications[appIdx] if !ok { - return basics.TealValue{}, false, fmt.Errorf("no such app") + return basics.TealValue{}, false, fmt.Errorf("no such app %d", appIdx) } // return most recent value if available @@ -294,11 +277,10 @@ func (l *Ledger) GetGlobal(appIdx basics.AppIndex, key string) (basics.TealValue // SetGlobal "sets" a global, but only through the mods mechanism, so // it can be removed with Reset() -func (l *Ledger) SetGlobal(key string, value basics.TealValue) error { - appIdx := l.appID +func (l *Ledger) SetGlobal(appIdx basics.AppIndex, key string, value basics.TealValue) error { params, ok := l.applications[appIdx] if !ok { - return fmt.Errorf("no such app") + return fmt.Errorf("no such app %d", appIdx) } // if writing the same value, return @@ -319,11 +301,10 @@ func (l *Ledger) SetGlobal(key string, value basics.TealValue) error { // DelGlobal "deletes" a global, but only through the mods mechanism, so // the deletion can be Reset() -func (l *Ledger) DelGlobal(key string) error { - appIdx := l.appID +func (l *Ledger) DelGlobal(appIdx basics.AppIndex, key string) error { params, ok := l.applications[appIdx] if !ok { - return fmt.Errorf("no such app") + return fmt.Errorf("no such app %d", appIdx) } exist := false @@ -349,16 +330,13 @@ func (l *Ledger) DelGlobal(key string) error { // GetLocal returns the current value bound to a local key, taking // into account mods caused by earlier executions. func (l *Ledger) GetLocal(addr basics.Address, appIdx basics.AppIndex, key string, accountIdx uint64) (basics.TealValue, bool, error) { - if appIdx == 0 { - appIdx = l.appID - } br, ok := l.balances[addr] if !ok { return basics.TealValue{}, false, fmt.Errorf("no such address") } tkvd, ok := br.locals[appIdx] if !ok { - return basics.TealValue{}, false, fmt.Errorf("no app for account") + return basics.TealValue{}, false, fmt.Errorf("account %s is not opted into %d", addr, appIdx) } // check deltas first @@ -377,16 +355,14 @@ func (l *Ledger) GetLocal(addr basics.Address, appIdx basics.AppIndex, key strin // SetLocal "sets" the current value bound to a local key using the // mods mechanism, so it can be Reset() -func (l *Ledger) SetLocal(addr basics.Address, key string, value basics.TealValue, accountIdx uint64) error { - appIdx := l.appID - +func (l *Ledger) SetLocal(addr basics.Address, appIdx basics.AppIndex, key string, value basics.TealValue, accountIdx uint64) error { br, ok := l.balances[addr] if !ok { return fmt.Errorf("no such address") } tkv, ok := br.locals[appIdx] if !ok { - return fmt.Errorf("no app for account") + return fmt.Errorf("account %s is not opted into %d", addr, appIdx) } // if writing the same value, return @@ -407,16 +383,14 @@ func (l *Ledger) SetLocal(addr basics.Address, key string, value basics.TealValu // DelLocal "deletes" the current value bound to a local key using the // mods mechanism, so it can be Reset() -func (l *Ledger) DelLocal(addr basics.Address, key string, accountIdx uint64) error { - appIdx := l.appID - +func (l *Ledger) DelLocal(addr basics.Address, appIdx basics.AppIndex, key string, accountIdx uint64) error { br, ok := l.balances[addr] if !ok { return fmt.Errorf("no such address") } tkv, ok := br.locals[appIdx] if !ok { - return fmt.Errorf("no app for account") + return fmt.Errorf("account %s is not opted into %d", addr, appIdx) } exist := false if _, ok := tkv[key]; ok { @@ -442,9 +416,6 @@ func (l *Ledger) DelLocal(addr basics.Address, key string, accountIdx uint64) er // from NewLocals, but potentially from executing AVM inner // transactions. func (l *Ledger) OptedIn(addr basics.Address, appIdx basics.AppIndex) (bool, error) { - if appIdx == 0 { - appIdx = l.appID - } br, ok := l.balances[addr] if !ok { return false, fmt.Errorf("no such address") @@ -453,18 +424,6 @@ func (l *Ledger) OptedIn(addr basics.Address, appIdx basics.AppIndex) (bool, err return ok, nil } -// SetTrackedCreatable remembers that the given cl "happened" in txn -// groupIdx of the group, for use by GetCreatableID. -func (l *Ledger) SetTrackedCreatable(groupIdx int, cl basics.CreatableLocator) { - l.trackedCreatables[groupIdx] = cl.Index -} - -// GetCreatableID returns the creatable constructed in a given transaction -// slot. For the test ledger, that's been set up by SetTrackedCreatable -func (l *Ledger) GetCreatableID(groupIdx int) basics.CreatableIndex { - return l.trackedCreatables[groupIdx] -} - // AssetHolding gives the amount of an ASA held by an account, or // error if the account is not opted into the asset. func (l *Ledger) AssetHolding(addr basics.Address, assetID basics.AssetIndex) (basics.AssetHolding, error) { @@ -490,43 +449,7 @@ func (l *Ledger) AppParams(appID basics.AppIndex) (basics.AppParams, basics.Addr if app, ok := l.applications[appID]; ok { return app.AppParams, app.Creator, nil } - return basics.AppParams{}, basics.Address{}, fmt.Errorf("no such app") -} - -// ApplicationID gives ID of the "currently running" app. For this -// test ledger, that is chosen explicitly. -func (l *Ledger) ApplicationID() basics.AppIndex { - return l.appID -} - -// CreatorAddress returns of the address that created the "currently running" app. -func (l *Ledger) CreatorAddress() basics.Address { - _, addr, _ := l.AppParams(l.appID) - return addr -} - -// GetDelta translates the mods set by AVM execution into the standard -// format of an EvalDelta. -func (l *Ledger) GetDelta(txn *transactions.Transaction) (evalDelta transactions.EvalDelta, err error) { - if tkv, ok := l.mods[l.appID]; ok { - evalDelta.GlobalDelta = tkv - } - if len(txn.Accounts) > 0 { - accounts := make(map[basics.Address]int) - accounts[txn.Sender] = 0 - for idx, addr := range txn.Accounts { - accounts[addr] = idx + 1 - } - evalDelta.LocalDeltas = make(map[uint64]basics.StateDelta) - for addr, br := range l.balances { - if idx, ok := accounts[addr]; ok { - if delta, ok := br.mods[l.appID]; ok { - evalDelta.LocalDeltas[uint64(idx)] = delta - } - } - } - } - return + return basics.AppParams{}, basics.Address{}, fmt.Errorf("no such app %d", appID) } func (l *Ledger) move(from basics.Address, to basics.Address, amount uint64) error { @@ -666,11 +589,12 @@ func (l *Ledger) axfer(from basics.Address, xfer transactions.AssetTransferTxnFi return nil } -func (l *Ledger) acfg(from basics.Address, cfg transactions.AssetConfigTxnFields) (transactions.ApplyData, error) { +func (l *Ledger) acfg(from basics.Address, cfg transactions.AssetConfigTxnFields, ad *transactions.ApplyData) error { if cfg.ConfigAsset == 0 { - aid := basics.AssetIndex(l.freshID()) + aid := basics.AssetIndex(l.Counter()) l.NewAsset(from, aid, cfg.AssetParams) - return transactions.ApplyData{ConfigAsset: aid}, nil + ad.ConfigAsset = aid + return nil } // This is just a mock. We don't check all the rules about // not setting fields that have been zeroed. Nor do we keep @@ -679,7 +603,7 @@ func (l *Ledger) acfg(from basics.Address, cfg transactions.AssetConfigTxnFields Creator: from, AssetParams: cfg.AssetParams, } - return transactions.ApplyData{}, nil + return nil } func (l *Ledger) afrz(from basics.Address, frz transactions.AssetFreezeTxnFields) error { @@ -693,55 +617,130 @@ func (l *Ledger) afrz(from basics.Address, frz transactions.AssetFreezeTxnFields } br, ok := l.balances[frz.FreezeAccount] if !ok { - return fmt.Errorf("%s does not hold anything", from) + return fmt.Errorf("%s does not hold Asset (%d)", frz.FreezeAccount, aid) } holding, ok := br.holdings[aid] if !ok { - return fmt.Errorf("%s does not hold Asset (%d)", from, aid) + return fmt.Errorf("%s does not hold Asset (%d)", frz.FreezeAccount, aid) } holding.Frozen = frz.AssetFrozen br.holdings[aid] = holding return nil } -/* It's gross to reimplement this here, rather than have a way to use - a ledger that's backed by our mock, but uses the "real" code - (cowRoundState which implements Balances), as a better test. To - allow that, we need to move our mocks into separate packages so - they can be combined in yet *another* package, and avoid circular - imports. +func (l *Ledger) appl(from basics.Address, appl transactions.ApplicationCallTxnFields, ad *transactions.ApplyData, gi int, ep *EvalParams) error { + aid := appl.ApplicationID + if aid == 0 { + aid = basics.AppIndex(l.Counter()) + params := basics.AppParams{ + ApprovalProgram: appl.ApprovalProgram, + ClearStateProgram: appl.ClearStateProgram, + GlobalState: map[string]basics.TealValue{}, + StateSchemas: basics.StateSchemas{ + LocalStateSchema: basics.StateSchema{ + NumUint: appl.LocalStateSchema.NumUint, + NumByteSlice: appl.LocalStateSchema.NumByteSlice, + }, + GlobalStateSchema: basics.StateSchema{ + NumUint: appl.GlobalStateSchema.NumUint, + NumByteSlice: appl.GlobalStateSchema.NumByteSlice, + }, + }, + ExtraProgramPages: appl.ExtraProgramPages, + } + l.NewApp(from, aid, params) + ad.ApplicationID = aid + } - This is currently unable to fill the ApplyData objects. That would - require a whole new level of code duplication. -*/ + if appl.OnCompletion == transactions.ClearStateOC { + return errors.New("not implemented in test ledger") + } -// Perform causes txn to "occur" against the ledger. The returned ad is empty. -func (l *Ledger) Perform(txn *transactions.Transaction, spec transactions.SpecialAddresses) (transactions.ApplyData, error) { - var ad transactions.ApplyData + if appl.OnCompletion == transactions.OptInOC { + br, ok := l.balances[from] + if !ok { + return errors.New("no account") + } + br.locals[aid] = make(map[string]basics.TealValue) + } - err := l.move(txn.Sender, spec.FeeSink, txn.Fee.Raw) + // Execute the Approval program + params, ok := l.applications[aid] + if !ok { + return errors.New("No application") + } + pass, cx, err := EvalContract(params.ApprovalProgram, gi, aid, ep) if err != nil { - return ad, err + return err + } + if !pass { + return errors.New("Approval program failed") } + ad.EvalDelta = cx.Txn.EvalDelta - err = l.rekey(txn) + switch appl.OnCompletion { + case transactions.NoOpOC: + case transactions.OptInOC: + // done earlier so locals could be changed + case transactions.CloseOutOC: + // get the local state, error if not exists, delete it + br, ok := l.balances[from] + if !ok { + return errors.New("no account") + } + _, ok = br.locals[aid] + if !ok { + return errors.New("not opted in") + } + delete(br.locals, aid) + case transactions.DeleteApplicationOC: + // get the global object, delete it + _, ok := l.applications[aid] + if !ok { + return errors.New("no app") + } + delete(l.applications, aid) + case transactions.UpdateApplicationOC: + app, ok := l.applications[aid] + if !ok { + return errors.New("no app") + } + app.ApprovalProgram = appl.ApprovalProgram + app.ClearStateProgram = appl.ClearStateProgram + l.applications[aid] = app + } + return nil +} + +// Perform causes txn to "occur" against the ledger. +func (l *Ledger) Perform(gi int, ep *EvalParams) error { + txn := &ep.TxnGroup[gi] + err := l.move(txn.Txn.Sender, ep.Specials.FeeSink, txn.Txn.Fee.Raw) + if err != nil { + return err + } + + err = l.rekey(&txn.Txn) if err != nil { - return ad, err + return err } - switch txn.Type { + switch txn.Txn.Type { case protocol.PaymentTx: - err = l.pay(txn.Sender, txn.PaymentTxnFields) + return l.pay(txn.Txn.Sender, txn.Txn.PaymentTxnFields) case protocol.AssetTransferTx: - err = l.axfer(txn.Sender, txn.AssetTransferTxnFields) + return l.axfer(txn.Txn.Sender, txn.Txn.AssetTransferTxnFields) case protocol.AssetConfigTx: - ad, err = l.acfg(txn.Sender, txn.AssetConfigTxnFields) + return l.acfg(txn.Txn.Sender, txn.Txn.AssetConfigTxnFields, &txn.ApplyData) case protocol.AssetFreezeTx: - err = l.afrz(txn.Sender, txn.AssetFreezeTxnFields) + return l.afrz(txn.Txn.Sender, txn.Txn.AssetFreezeTxnFields) + case protocol.ApplicationCallTx: + return l.appl(txn.Txn.Sender, txn.Txn.ApplicationCallTxnFields, &txn.ApplyData, gi, ep) + case protocol.KeyRegistrationTx: + return nil // For now, presume success in test ledger default: - err = fmt.Errorf("%s txn in AVM", txn.Type) + return fmt.Errorf("%s txn in AVM", txn.Txn.Type) } - return ad, err } // Get() through allocated() implement cowForLogicLedger, so we should diff --git a/data/transactions/logic/opcodes.go b/data/transactions/logic/opcodes.go index 604db789a2..75aa9826e6 100644 --- a/data/transactions/logic/opcodes.go +++ b/data/transactions/logic/opcodes.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -18,6 +18,8 @@ package logic import ( "sort" + + "github.com/algorand/go-algorand/data/transactions" ) // LogicVersion defines default assembler and max eval versions @@ -42,6 +44,23 @@ const backBranchEnabledVersion = 4 // using an index into arrays. const directRefEnabledVersion = 4 +// innerAppsEnabledVersion is the version that allowed inner app calls. No old +// apps should be called as inner apps. Set to ExtraProgramChecks version +// because those checks protect from tricky ClearState Programs. +const innerAppsEnabledVersion = transactions.ExtraProgramChecksVersion + +// txnEffectsVersion is first version that allowed txn opcode to access +// "effects" (ApplyData info) +const txnEffectsVersion = 6 + +// createdResourcesVersion is the first version that allows access to assets and +// applications that were created in the same group, despite them not being in +// the Foreign arrays. +const createdResourcesVersion = 6 + +// "Future" opcodes +const fidoVersion = LogicVersion + 1 // base64, json, secp256r1 + // opDetails records details such as non-standard costs, immediate // arguments, or dynamic layout controlled by a check function. type opDetails struct { @@ -195,25 +214,25 @@ var OpSpecs = []OpSpec{ {0x2e, "arg_1", opArg1, asmDefault, disDefault, nil, oneBytes, 1, runModeSignature, opDefault}, {0x2f, "arg_2", opArg2, asmDefault, disDefault, nil, oneBytes, 1, runModeSignature, opDefault}, {0x30, "arg_3", opArg3, asmDefault, disDefault, nil, oneBytes, 1, runModeSignature, opDefault}, - {0x31, "txn", opTxn, assembleTxn, disTxn, nil, oneAny, 1, modeAny, immediates("f")}, + {0x31, "txn", opTxn, asmTxn, disTxn, nil, oneAny, 1, modeAny, immediates("f")}, // It is ok to have the same opcode for different TEAL versions. // This 'txn' asm command supports additional argument in version 2 and // generates 'txna' opcode in that particular case - {0x31, "txn", opTxn, assembleTxn2, disTxn, nil, oneAny, 2, modeAny, immediates("f")}, + {0x31, "txn", opTxn, asmTxn2, disTxn, nil, oneAny, 2, modeAny, immediates("f")}, {0x32, "global", opGlobal, assembleGlobal, disGlobal, nil, oneAny, 1, modeAny, immediates("f")}, - {0x33, "gtxn", opGtxn, assembleGtxn, disGtxn, nil, oneAny, 1, modeAny, immediates("t", "f")}, - {0x33, "gtxn", opGtxn, assembleGtxn2, disGtxn, nil, oneAny, 2, modeAny, immediates("t", "f")}, + {0x33, "gtxn", opGtxn, asmGtxn, disGtxn, nil, oneAny, 1, modeAny, immediates("t", "f")}, + {0x33, "gtxn", opGtxn, asmGtxn2, disGtxn, nil, oneAny, 2, modeAny, immediates("t", "f")}, {0x34, "load", opLoad, asmDefault, disDefault, nil, oneAny, 1, modeAny, immediates("i")}, {0x35, "store", opStore, asmDefault, disDefault, oneAny, nil, 1, modeAny, immediates("i")}, - {0x36, "txna", opTxna, assembleTxna, disTxna, nil, oneAny, 2, modeAny, immediates("f", "i")}, - {0x37, "gtxna", opGtxna, assembleGtxna, disGtxna, nil, oneAny, 2, modeAny, immediates("t", "f", "i")}, + {0x36, "txna", opTxna, asmTxna, disTxna, nil, oneAny, 2, modeAny, immediates("f", "i")}, + {0x37, "gtxna", opGtxna, asmGtxna, disGtxna, nil, oneAny, 2, modeAny, immediates("t", "f", "i")}, // Like gtxn, but gets txn index from stack, rather than immediate arg - {0x38, "gtxns", opGtxns, assembleGtxns, disTxn, oneInt, oneAny, 3, modeAny, immediates("f")}, - {0x39, "gtxnsa", opGtxnsa, assembleGtxns, disTxna, oneInt, oneAny, 3, modeAny, immediates("f", "i")}, + {0x38, "gtxns", opGtxns, asmGtxns, disTxn, oneInt, oneAny, 3, modeAny, immediates("f")}, + {0x39, "gtxnsa", opGtxnsa, asmGtxns, disTxna, oneInt, oneAny, 3, modeAny, immediates("f", "i")}, // Group scratch space access {0x3a, "gload", opGload, asmDefault, disDefault, nil, oneAny, 4, runModeApplication, immediates("t", "i")}, {0x3b, "gloads", opGloads, asmDefault, disDefault, oneInt, oneAny, 4, runModeApplication, immediates("i")}, - // Access creatable IDs + // Access creatable IDs (consider deprecating, as txn CreatedAssetID, CreatedApplicationID should be enough {0x3c, "gaid", opGaid, asmDefault, disDefault, nil, oneInt, 4, runModeApplication, immediates("t")}, {0x3d, "gaids", opGaids, asmDefault, disDefault, oneInt, oneInt, 4, runModeApplication, opDefault}, @@ -237,6 +256,7 @@ var OpSpecs = []OpSpec{ {0x4e, "cover", opCover, asmDefault, disDefault, oneAny, oneAny, 5, modeAny, stacky(typeCover, "n")}, {0x4f, "uncover", opUncover, asmDefault, disDefault, oneAny, oneAny, 5, modeAny, stacky(typeUncover, "n")}, + // byteslice processing / StringOps {0x50, "concat", opConcat, asmDefault, disDefault, twoBytes, oneBytes, 2, modeAny, opDefault}, {0x51, "substring", opSubstring, assembleSubstring, disDefault, oneBytes, oneBytes, 2, modeAny, immediates("s", "e")}, {0x52, "substring3", opSubstring3, asmDefault, disDefault, byteIntInt, oneBytes, 2, modeAny, opDefault}, @@ -249,6 +269,7 @@ var OpSpecs = []OpSpec{ {0x59, "extract_uint16", opExtract16Bits, asmDefault, disDefault, byteInt, oneInt, 5, modeAny, opDefault}, {0x5a, "extract_uint32", opExtract32Bits, asmDefault, disDefault, byteInt, oneInt, 5, modeAny, opDefault}, {0x5b, "extract_uint64", opExtract64Bits, asmDefault, disDefault, byteInt, oneInt, 5, modeAny, opDefault}, + {0x5c, "base64_decode", opBase64Decode, assembleBase64Decode, disBase64Decode, oneBytes, oneBytes, fidoVersion, modeAny, costlyImm(25, "e")}, {0x60, "balance", opBalance, asmDefault, disDefault, oneInt, oneInt, 2, runModeApplication, opDefault}, {0x60, "balance", opBalance, asmDefault, disDefault, oneAny, oneInt, directRefEnabledVersion, runModeApplication, opDefault}, @@ -267,10 +288,11 @@ var OpSpecs = []OpSpec{ {0x68, "app_local_del", opAppLocalDel, asmDefault, disDefault, oneAny.plus(oneBytes), nil, directRefEnabledVersion, runModeApplication, opDefault}, {0x69, "app_global_del", opAppGlobalDel, asmDefault, disDefault, oneBytes, nil, 2, runModeApplication, opDefault}, - {0x70, "asset_holding_get", opAssetHoldingGet, assembleAssetHolding, disAssetHolding, twoInts, oneAny.plus(oneInt), 2, runModeApplication, immediates("i")}, - {0x70, "asset_holding_get", opAssetHoldingGet, assembleAssetHolding, disAssetHolding, oneAny.plus(oneInt), oneAny.plus(oneInt), directRefEnabledVersion, runModeApplication, immediates("i")}, - {0x71, "asset_params_get", opAssetParamsGet, assembleAssetParams, disAssetParams, oneInt, oneAny.plus(oneInt), 2, runModeApplication, immediates("i")}, - {0x72, "app_params_get", opAppParamsGet, assembleAppParams, disAppParams, oneInt, oneAny.plus(oneInt), 5, runModeApplication, immediates("i")}, + {0x70, "asset_holding_get", opAssetHoldingGet, assembleAssetHolding, disAssetHolding, twoInts, oneAny.plus(oneInt), 2, runModeApplication, immediates("f")}, + {0x70, "asset_holding_get", opAssetHoldingGet, assembleAssetHolding, disAssetHolding, oneAny.plus(oneInt), oneAny.plus(oneInt), directRefEnabledVersion, runModeApplication, immediates("f")}, + {0x71, "asset_params_get", opAssetParamsGet, assembleAssetParams, disAssetParams, oneInt, oneAny.plus(oneInt), 2, runModeApplication, immediates("f")}, + {0x72, "app_params_get", opAppParamsGet, assembleAppParams, disAppParams, oneInt, oneAny.plus(oneInt), 5, runModeApplication, immediates("f")}, + {0x73, "acct_params_get", opAcctParamsGet, assembleAcctParams, disAcctParams, oneAny, oneAny.plus(oneInt), 6, runModeApplication, immediates("f")}, {0x78, "min_balance", opMinBalance, asmDefault, disDefault, oneInt, oneInt, 3, runModeApplication, opDefault}, {0x78, "min_balance", opMinBalance, asmDefault, disDefault, oneAny, oneInt, directRefEnabledVersion, runModeApplication, opDefault}, @@ -291,6 +313,8 @@ var OpSpecs = []OpSpec{ {0x93, "bitlen", opBitLen, asmDefault, disDefault, oneAny, oneInt, 4, modeAny, opDefault}, {0x94, "exp", opExp, asmDefault, disDefault, twoInts, oneInt, 4, modeAny, opDefault}, {0x95, "expw", opExpw, asmDefault, disDefault, twoInts, twoInts, 4, modeAny, costly(10)}, + {0x96, "bsqrt", opBytesSqrt, asmDefault, disDefault, oneBytes, oneBytes, 6, modeAny, costly(40)}, + {0x97, "divw", opDivw, asmDefault, disDefault, twoInts.plus(oneInt), oneInt, 6, modeAny, opDefault}, // Byteslice math. {0xa0, "b+", opBytesPlus, asmDefault, disDefault, twoBytes, oneBytes, 4, modeAny, costly(10)}, @@ -316,14 +340,19 @@ var OpSpecs = []OpSpec{ {0xb2, "itxn_field", opTxField, asmTxField, disTxField, oneAny, nil, 5, runModeApplication, stacky(typeTxField, "f")}, {0xb3, "itxn_submit", opTxSubmit, asmDefault, disDefault, nil, nil, 5, runModeApplication, opDefault}, {0xb4, "itxn", opItxn, asmItxn, disTxn, nil, oneAny, 5, runModeApplication, immediates("f")}, - {0xb5, "itxna", opItxna, asmItxna, disTxna, nil, oneAny, 5, runModeApplication, immediates("f", "i")}, + {0xb5, "itxna", opItxna, asmTxna, disTxna, nil, oneAny, 5, runModeApplication, immediates("f", "i")}, {0xb6, "itxn_next", opTxNext, asmDefault, disDefault, nil, nil, 6, runModeApplication, opDefault}, + {0xb7, "gitxn", opGitxn, asmGitxn, disGtxn, nil, oneAny, 6, runModeApplication, immediates("t", "f")}, + {0xb8, "gitxna", opGitxna, asmGtxna, disGtxna, nil, oneAny, 6, runModeApplication, immediates("t", "f", "i")}, // Dynamic indexing - {0xc0, "txnas", opTxnas, assembleTxnas, disTxn, oneInt, oneAny, 5, modeAny, immediates("f")}, - {0xc1, "gtxnas", opGtxnas, assembleGtxnas, disGtxn, oneInt, oneAny, 5, modeAny, immediates("t", "f")}, - {0xc2, "gtxnsas", opGtxnsas, assembleGtxnsas, disTxn, twoInts, oneAny, 5, modeAny, immediates("f")}, + {0xc0, "txnas", opTxnas, asmTxnas, disTxn, oneInt, oneAny, 5, modeAny, immediates("f")}, + {0xc1, "gtxnas", opGtxnas, asmGtxnas, disGtxn, oneInt, oneAny, 5, modeAny, immediates("t", "f")}, + {0xc2, "gtxnsas", opGtxnsas, asmGtxnsas, disTxn, twoInts, oneAny, 5, modeAny, immediates("f")}, {0xc3, "args", opArgs, asmDefault, disDefault, oneInt, oneBytes, 5, runModeSignature, opDefault}, + {0xc4, "gloadss", opGloadss, asmDefault, disDefault, twoInts, oneAny, 6, runModeApplication, opDefault}, + {0xc5, "itxnas", opItxnas, asmTxnas, disTxn, oneInt, oneAny, 6, runModeApplication, immediates("f")}, + {0xc6, "gitxnas", opGitxnas, asmGtxnas, disGtxn, oneInt, oneAny, 6, runModeApplication, immediates("t", "f")}, } type sortByOpcode []OpSpec diff --git a/data/transactions/logic/opcodes_test.go b/data/transactions/logic/opcodes_test.go index b5e7627850..955662cedf 100644 --- a/data/transactions/logic/opcodes_test.go +++ b/data/transactions/logic/opcodes_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/transactions/logic/program.go b/data/transactions/logic/program.go index 9d35a62a38..58265b7f98 100644 --- a/data/transactions/logic/program.go +++ b/data/transactions/logic/program.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/transactions/logicsig.go b/data/transactions/logicsig.go index f02c094f4e..03a520fc65 100644 --- a/data/transactions/logicsig.go +++ b/data/transactions/logicsig.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/transactions/msgp_gen.go b/data/transactions/msgp_gen.go index 009de07b5b..381c032c27 100644 --- a/data/transactions/msgp_gen.go +++ b/data/transactions/msgp_gen.go @@ -1845,8 +1845,8 @@ func (z *EvalDelta) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "struct-from-array", "InnerTxns") return } - if zb0011 > config.MaxInnerTransactions { - err = msgp.ErrOverflow(uint64(zb0011), uint64(config.MaxInnerTransactions)) + if zb0011 > config.MaxInnerTransactionsPerDelta { + err = msgp.ErrOverflow(uint64(zb0011), uint64(config.MaxInnerTransactionsPerDelta)) err = msgp.WrapError(err, "struct-from-array", "InnerTxns") return } @@ -1963,8 +1963,8 @@ func (z *EvalDelta) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "InnerTxns") return } - if zb0017 > config.MaxInnerTransactions { - err = msgp.ErrOverflow(uint64(zb0017), uint64(config.MaxInnerTransactions)) + if zb0017 > config.MaxInnerTransactionsPerDelta { + err = msgp.ErrOverflow(uint64(zb0017), uint64(config.MaxInnerTransactionsPerDelta)) err = msgp.WrapError(err, "InnerTxns") return } @@ -2363,8 +2363,8 @@ func (z *Header) MsgIsZero() bool { func (z *KeyregTxnFields) MarshalMsg(b []byte) (o []byte) { o = msgp.Require(b, z.Msgsize()) // omitempty: check for empty values - zb0001Len := uint32(6) - var zb0001Mask uint8 /* 7 bits */ + zb0001Len := uint32(7) + var zb0001Mask uint8 /* 8 bits */ if (*z).Nonparticipation == false { zb0001Len-- zb0001Mask |= 0x2 @@ -2373,22 +2373,26 @@ func (z *KeyregTxnFields) MarshalMsg(b []byte) (o []byte) { zb0001Len-- zb0001Mask |= 0x4 } - if (*z).VoteFirst.MsgIsZero() { + if (*z).StateProofPK.MsgIsZero() { zb0001Len-- zb0001Mask |= 0x8 } - if (*z).VoteKeyDilution == 0 { + if (*z).VoteFirst.MsgIsZero() { zb0001Len-- zb0001Mask |= 0x10 } - if (*z).VotePK.MsgIsZero() { + if (*z).VoteKeyDilution == 0 { zb0001Len-- zb0001Mask |= 0x20 } - if (*z).VoteLast.MsgIsZero() { + if (*z).VotePK.MsgIsZero() { zb0001Len-- zb0001Mask |= 0x40 } + if (*z).VoteLast.MsgIsZero() { + zb0001Len-- + zb0001Mask |= 0x80 + } // variable map header, size zb0001Len o = append(o, 0x80|uint8(zb0001Len)) if zb0001Len != 0 { @@ -2403,21 +2407,26 @@ func (z *KeyregTxnFields) MarshalMsg(b []byte) (o []byte) { o = (*z).SelectionPK.MarshalMsg(o) } if (zb0001Mask & 0x8) == 0 { // if not empty + // string "sprfkey" + o = append(o, 0xa7, 0x73, 0x70, 0x72, 0x66, 0x6b, 0x65, 0x79) + o = (*z).StateProofPK.MarshalMsg(o) + } + if (zb0001Mask & 0x10) == 0 { // if not empty // string "votefst" o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x74) o = (*z).VoteFirst.MarshalMsg(o) } - if (zb0001Mask & 0x10) == 0 { // if not empty + if (zb0001Mask & 0x20) == 0 { // if not empty // string "votekd" o = append(o, 0xa6, 0x76, 0x6f, 0x74, 0x65, 0x6b, 0x64) o = msgp.AppendUint64(o, (*z).VoteKeyDilution) } - if (zb0001Mask & 0x20) == 0 { // if not empty + if (zb0001Mask & 0x40) == 0 { // if not empty // string "votekey" o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x6b, 0x65, 0x79) o = (*z).VotePK.MarshalMsg(o) } - if (zb0001Mask & 0x40) == 0 { // if not empty + if (zb0001Mask & 0x80) == 0 { // if not empty // string "votelst" o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x6c, 0x73, 0x74) o = (*z).VoteLast.MarshalMsg(o) @@ -2460,6 +2469,14 @@ func (z *KeyregTxnFields) UnmarshalMsg(bts []byte) (o []byte, err error) { return } } + if zb0001 > 0 { + zb0001-- + bts, err = (*z).StateProofPK.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "StateProofPK") + return + } + } if zb0001 > 0 { zb0001-- bts, err = (*z).VoteFirst.UnmarshalMsg(bts) @@ -2527,6 +2544,12 @@ func (z *KeyregTxnFields) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "SelectionPK") return } + case "sprfkey": + bts, err = (*z).StateProofPK.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "StateProofPK") + return + } case "votefst": bts, err = (*z).VoteFirst.UnmarshalMsg(bts) if err != nil { @@ -2571,13 +2594,13 @@ func (_ *KeyregTxnFields) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *KeyregTxnFields) Msgsize() (s int) { - s = 1 + 8 + (*z).VotePK.Msgsize() + 7 + (*z).SelectionPK.Msgsize() + 8 + (*z).VoteFirst.Msgsize() + 8 + (*z).VoteLast.Msgsize() + 7 + msgp.Uint64Size + 8 + msgp.BoolSize + s = 1 + 8 + (*z).VotePK.Msgsize() + 7 + (*z).SelectionPK.Msgsize() + 8 + (*z).StateProofPK.Msgsize() + 8 + (*z).VoteFirst.Msgsize() + 8 + (*z).VoteLast.Msgsize() + 7 + msgp.Uint64Size + 8 + msgp.BoolSize return } // MsgIsZero returns whether this is a zero value func (z *KeyregTxnFields) MsgIsZero() bool { - return ((*z).VotePK.MsgIsZero()) && ((*z).SelectionPK.MsgIsZero()) && ((*z).VoteFirst.MsgIsZero()) && ((*z).VoteLast.MsgIsZero()) && ((*z).VoteKeyDilution == 0) && ((*z).Nonparticipation == false) + return ((*z).VotePK.MsgIsZero()) && ((*z).SelectionPK.MsgIsZero()) && ((*z).StateProofPK.MsgIsZero()) && ((*z).VoteFirst.MsgIsZero()) && ((*z).VoteLast.MsgIsZero()) && ((*z).VoteKeyDilution == 0) && ((*z).Nonparticipation == false) } // MarshalMsg implements msgp.Marshaler @@ -4176,8 +4199,8 @@ func (z *SignedTxnWithAD) MsgIsZero() bool { func (z *Transaction) MarshalMsg(b []byte) (o []byte) { o = msgp.Require(b, z.Msgsize()) // omitempty: check for empty values - zb0006Len := uint32(44) - var zb0006Mask uint64 /* 53 bits */ + zb0006Len := uint32(45) + var zb0006Mask uint64 /* 54 bits */ if (*z).AssetTransferTxnFields.AssetAmount == 0 { zb0006Len-- zb0006Mask |= 0x200 @@ -4330,30 +4353,34 @@ func (z *Transaction) MarshalMsg(b []byte) (o []byte) { zb0006Len-- zb0006Mask |= 0x400000000000 } - if (*z).Type.MsgIsZero() { + if (*z).KeyregTxnFields.StateProofPK.MsgIsZero() { zb0006Len-- zb0006Mask |= 0x800000000000 } - if (*z).KeyregTxnFields.VoteFirst.MsgIsZero() { + if (*z).Type.MsgIsZero() { zb0006Len-- zb0006Mask |= 0x1000000000000 } - if (*z).KeyregTxnFields.VoteKeyDilution == 0 { + if (*z).KeyregTxnFields.VoteFirst.MsgIsZero() { zb0006Len-- zb0006Mask |= 0x2000000000000 } - if (*z).KeyregTxnFields.VotePK.MsgIsZero() { + if (*z).KeyregTxnFields.VoteKeyDilution == 0 { zb0006Len-- zb0006Mask |= 0x4000000000000 } - if (*z).KeyregTxnFields.VoteLast.MsgIsZero() { + if (*z).KeyregTxnFields.VotePK.MsgIsZero() { zb0006Len-- zb0006Mask |= 0x8000000000000 } - if (*z).AssetTransferTxnFields.XferAsset.MsgIsZero() { + if (*z).KeyregTxnFields.VoteLast.MsgIsZero() { zb0006Len-- zb0006Mask |= 0x10000000000000 } + if (*z).AssetTransferTxnFields.XferAsset.MsgIsZero() { + zb0006Len-- + zb0006Mask |= 0x20000000000000 + } // variable map header, size zb0006Len o = msgp.AppendMapHeader(o, zb0006Len) if zb0006Len != 0 { @@ -4576,31 +4603,36 @@ func (z *Transaction) MarshalMsg(b []byte) (o []byte) { o = (*z).Header.Sender.MarshalMsg(o) } if (zb0006Mask & 0x800000000000) == 0 { // if not empty + // string "sprfkey" + o = append(o, 0xa7, 0x73, 0x70, 0x72, 0x66, 0x6b, 0x65, 0x79) + o = (*z).KeyregTxnFields.StateProofPK.MarshalMsg(o) + } + if (zb0006Mask & 0x1000000000000) == 0 { // if not empty // string "type" o = append(o, 0xa4, 0x74, 0x79, 0x70, 0x65) o = (*z).Type.MarshalMsg(o) } - if (zb0006Mask & 0x1000000000000) == 0 { // if not empty + if (zb0006Mask & 0x2000000000000) == 0 { // if not empty // string "votefst" o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x74) o = (*z).KeyregTxnFields.VoteFirst.MarshalMsg(o) } - if (zb0006Mask & 0x2000000000000) == 0 { // if not empty + if (zb0006Mask & 0x4000000000000) == 0 { // if not empty // string "votekd" o = append(o, 0xa6, 0x76, 0x6f, 0x74, 0x65, 0x6b, 0x64) o = msgp.AppendUint64(o, (*z).KeyregTxnFields.VoteKeyDilution) } - if (zb0006Mask & 0x4000000000000) == 0 { // if not empty + if (zb0006Mask & 0x8000000000000) == 0 { // if not empty // string "votekey" o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x6b, 0x65, 0x79) o = (*z).KeyregTxnFields.VotePK.MarshalMsg(o) } - if (zb0006Mask & 0x8000000000000) == 0 { // if not empty + if (zb0006Mask & 0x10000000000000) == 0 { // if not empty // string "votelst" o = append(o, 0xa7, 0x76, 0x6f, 0x74, 0x65, 0x6c, 0x73, 0x74) o = (*z).KeyregTxnFields.VoteLast.MarshalMsg(o) } - if (zb0006Mask & 0x10000000000000) == 0 { // if not empty + if (zb0006Mask & 0x20000000000000) == 0 { // if not empty // string "xaid" o = append(o, 0xa4, 0x78, 0x61, 0x69, 0x64) o = (*z).AssetTransferTxnFields.XferAsset.MarshalMsg(o) @@ -4741,6 +4773,14 @@ func (z *Transaction) UnmarshalMsg(bts []byte) (o []byte, err error) { return } } + if zb0006 > 0 { + zb0006-- + bts, err = (*z).KeyregTxnFields.StateProofPK.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "StateProofPK") + return + } + } if zb0006 > 0 { zb0006-- bts, err = (*z).KeyregTxnFields.VoteFirst.UnmarshalMsg(bts) @@ -5208,6 +5248,12 @@ func (z *Transaction) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "SelectionPK") return } + case "sprfkey": + bts, err = (*z).KeyregTxnFields.StateProofPK.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "StateProofPK") + return + } case "votefst": bts, err = (*z).KeyregTxnFields.VoteFirst.UnmarshalMsg(bts) if err != nil { @@ -5522,7 +5568,7 @@ func (_ *Transaction) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *Transaction) Msgsize() (s int) { - s = 3 + 5 + (*z).Type.Msgsize() + 4 + (*z).Header.Sender.Msgsize() + 4 + (*z).Header.Fee.Msgsize() + 3 + (*z).Header.FirstValid.Msgsize() + 3 + (*z).Header.LastValid.Msgsize() + 5 + msgp.BytesPrefixSize + len((*z).Header.Note) + 4 + msgp.StringPrefixSize + len((*z).Header.GenesisID) + 3 + (*z).Header.GenesisHash.Msgsize() + 4 + (*z).Header.Group.Msgsize() + 3 + msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) + 6 + (*z).Header.RekeyTo.Msgsize() + 8 + (*z).KeyregTxnFields.VotePK.Msgsize() + 7 + (*z).KeyregTxnFields.SelectionPK.Msgsize() + 8 + (*z).KeyregTxnFields.VoteFirst.Msgsize() + 8 + (*z).KeyregTxnFields.VoteLast.Msgsize() + 7 + msgp.Uint64Size + 8 + msgp.BoolSize + 4 + (*z).PaymentTxnFields.Receiver.Msgsize() + 4 + (*z).PaymentTxnFields.Amount.Msgsize() + 6 + (*z).PaymentTxnFields.CloseRemainderTo.Msgsize() + 5 + (*z).AssetConfigTxnFields.ConfigAsset.Msgsize() + 5 + (*z).AssetConfigTxnFields.AssetParams.Msgsize() + 5 + (*z).AssetTransferTxnFields.XferAsset.Msgsize() + 5 + msgp.Uint64Size + 5 + (*z).AssetTransferTxnFields.AssetSender.Msgsize() + 5 + (*z).AssetTransferTxnFields.AssetReceiver.Msgsize() + 7 + (*z).AssetTransferTxnFields.AssetCloseTo.Msgsize() + 5 + (*z).AssetFreezeTxnFields.FreezeAccount.Msgsize() + 5 + (*z).AssetFreezeTxnFields.FreezeAsset.Msgsize() + 5 + msgp.BoolSize + 5 + (*z).ApplicationCallTxnFields.ApplicationID.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.ArrayHeaderSize + s = 3 + 5 + (*z).Type.Msgsize() + 4 + (*z).Header.Sender.Msgsize() + 4 + (*z).Header.Fee.Msgsize() + 3 + (*z).Header.FirstValid.Msgsize() + 3 + (*z).Header.LastValid.Msgsize() + 5 + msgp.BytesPrefixSize + len((*z).Header.Note) + 4 + msgp.StringPrefixSize + len((*z).Header.GenesisID) + 3 + (*z).Header.GenesisHash.Msgsize() + 4 + (*z).Header.Group.Msgsize() + 3 + msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) + 6 + (*z).Header.RekeyTo.Msgsize() + 8 + (*z).KeyregTxnFields.VotePK.Msgsize() + 7 + (*z).KeyregTxnFields.SelectionPK.Msgsize() + 8 + (*z).KeyregTxnFields.StateProofPK.Msgsize() + 8 + (*z).KeyregTxnFields.VoteFirst.Msgsize() + 8 + (*z).KeyregTxnFields.VoteLast.Msgsize() + 7 + msgp.Uint64Size + 8 + msgp.BoolSize + 4 + (*z).PaymentTxnFields.Receiver.Msgsize() + 4 + (*z).PaymentTxnFields.Amount.Msgsize() + 6 + (*z).PaymentTxnFields.CloseRemainderTo.Msgsize() + 5 + (*z).AssetConfigTxnFields.ConfigAsset.Msgsize() + 5 + (*z).AssetConfigTxnFields.AssetParams.Msgsize() + 5 + (*z).AssetTransferTxnFields.XferAsset.Msgsize() + 5 + msgp.Uint64Size + 5 + (*z).AssetTransferTxnFields.AssetSender.Msgsize() + 5 + (*z).AssetTransferTxnFields.AssetReceiver.Msgsize() + 7 + (*z).AssetTransferTxnFields.AssetCloseTo.Msgsize() + 5 + (*z).AssetFreezeTxnFields.FreezeAccount.Msgsize() + 5 + (*z).AssetFreezeTxnFields.FreezeAsset.Msgsize() + 5 + msgp.BoolSize + 5 + (*z).ApplicationCallTxnFields.ApplicationID.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.ArrayHeaderSize for zb0002 := range (*z).ApplicationCallTxnFields.ApplicationArgs { s += msgp.BytesPrefixSize + len((*z).ApplicationCallTxnFields.ApplicationArgs[zb0002]) } @@ -5544,7 +5590,7 @@ func (z *Transaction) Msgsize() (s int) { // MsgIsZero returns whether this is a zero value func (z *Transaction) MsgIsZero() bool { - return ((*z).Type.MsgIsZero()) && ((*z).Header.Sender.MsgIsZero()) && ((*z).Header.Fee.MsgIsZero()) && ((*z).Header.FirstValid.MsgIsZero()) && ((*z).Header.LastValid.MsgIsZero()) && (len((*z).Header.Note) == 0) && ((*z).Header.GenesisID == "") && ((*z).Header.GenesisHash.MsgIsZero()) && ((*z).Header.Group.MsgIsZero()) && ((*z).Header.Lease == ([32]byte{})) && ((*z).Header.RekeyTo.MsgIsZero()) && ((*z).KeyregTxnFields.VotePK.MsgIsZero()) && ((*z).KeyregTxnFields.SelectionPK.MsgIsZero()) && ((*z).KeyregTxnFields.VoteFirst.MsgIsZero()) && ((*z).KeyregTxnFields.VoteLast.MsgIsZero()) && ((*z).KeyregTxnFields.VoteKeyDilution == 0) && ((*z).KeyregTxnFields.Nonparticipation == false) && ((*z).PaymentTxnFields.Receiver.MsgIsZero()) && ((*z).PaymentTxnFields.Amount.MsgIsZero()) && ((*z).PaymentTxnFields.CloseRemainderTo.MsgIsZero()) && ((*z).AssetConfigTxnFields.ConfigAsset.MsgIsZero()) && ((*z).AssetConfigTxnFields.AssetParams.MsgIsZero()) && ((*z).AssetTransferTxnFields.XferAsset.MsgIsZero()) && ((*z).AssetTransferTxnFields.AssetAmount == 0) && ((*z).AssetTransferTxnFields.AssetSender.MsgIsZero()) && ((*z).AssetTransferTxnFields.AssetReceiver.MsgIsZero()) && ((*z).AssetTransferTxnFields.AssetCloseTo.MsgIsZero()) && ((*z).AssetFreezeTxnFields.FreezeAccount.MsgIsZero()) && ((*z).AssetFreezeTxnFields.FreezeAsset.MsgIsZero()) && ((*z).AssetFreezeTxnFields.AssetFrozen == false) && ((*z).ApplicationCallTxnFields.ApplicationID.MsgIsZero()) && ((*z).ApplicationCallTxnFields.OnCompletion == 0) && (len((*z).ApplicationCallTxnFields.ApplicationArgs) == 0) && (len((*z).ApplicationCallTxnFields.Accounts) == 0) && (len((*z).ApplicationCallTxnFields.ForeignApps) == 0) && (len((*z).ApplicationCallTxnFields.ForeignAssets) == 0) && ((*z).ApplicationCallTxnFields.LocalStateSchema.MsgIsZero()) && ((*z).ApplicationCallTxnFields.GlobalStateSchema.MsgIsZero()) && (len((*z).ApplicationCallTxnFields.ApprovalProgram) == 0) && (len((*z).ApplicationCallTxnFields.ClearStateProgram) == 0) && ((*z).ApplicationCallTxnFields.ExtraProgramPages == 0) && ((*z).CompactCertTxnFields.CertRound.MsgIsZero()) && ((*z).CompactCertTxnFields.CertType.MsgIsZero()) && ((*z).CompactCertTxnFields.Cert.MsgIsZero()) + return ((*z).Type.MsgIsZero()) && ((*z).Header.Sender.MsgIsZero()) && ((*z).Header.Fee.MsgIsZero()) && ((*z).Header.FirstValid.MsgIsZero()) && ((*z).Header.LastValid.MsgIsZero()) && (len((*z).Header.Note) == 0) && ((*z).Header.GenesisID == "") && ((*z).Header.GenesisHash.MsgIsZero()) && ((*z).Header.Group.MsgIsZero()) && ((*z).Header.Lease == ([32]byte{})) && ((*z).Header.RekeyTo.MsgIsZero()) && ((*z).KeyregTxnFields.VotePK.MsgIsZero()) && ((*z).KeyregTxnFields.SelectionPK.MsgIsZero()) && ((*z).KeyregTxnFields.StateProofPK.MsgIsZero()) && ((*z).KeyregTxnFields.VoteFirst.MsgIsZero()) && ((*z).KeyregTxnFields.VoteLast.MsgIsZero()) && ((*z).KeyregTxnFields.VoteKeyDilution == 0) && ((*z).KeyregTxnFields.Nonparticipation == false) && ((*z).PaymentTxnFields.Receiver.MsgIsZero()) && ((*z).PaymentTxnFields.Amount.MsgIsZero()) && ((*z).PaymentTxnFields.CloseRemainderTo.MsgIsZero()) && ((*z).AssetConfigTxnFields.ConfigAsset.MsgIsZero()) && ((*z).AssetConfigTxnFields.AssetParams.MsgIsZero()) && ((*z).AssetTransferTxnFields.XferAsset.MsgIsZero()) && ((*z).AssetTransferTxnFields.AssetAmount == 0) && ((*z).AssetTransferTxnFields.AssetSender.MsgIsZero()) && ((*z).AssetTransferTxnFields.AssetReceiver.MsgIsZero()) && ((*z).AssetTransferTxnFields.AssetCloseTo.MsgIsZero()) && ((*z).AssetFreezeTxnFields.FreezeAccount.MsgIsZero()) && ((*z).AssetFreezeTxnFields.FreezeAsset.MsgIsZero()) && ((*z).AssetFreezeTxnFields.AssetFrozen == false) && ((*z).ApplicationCallTxnFields.ApplicationID.MsgIsZero()) && ((*z).ApplicationCallTxnFields.OnCompletion == 0) && (len((*z).ApplicationCallTxnFields.ApplicationArgs) == 0) && (len((*z).ApplicationCallTxnFields.Accounts) == 0) && (len((*z).ApplicationCallTxnFields.ForeignApps) == 0) && (len((*z).ApplicationCallTxnFields.ForeignAssets) == 0) && ((*z).ApplicationCallTxnFields.LocalStateSchema.MsgIsZero()) && ((*z).ApplicationCallTxnFields.GlobalStateSchema.MsgIsZero()) && (len((*z).ApplicationCallTxnFields.ApprovalProgram) == 0) && (len((*z).ApplicationCallTxnFields.ClearStateProgram) == 0) && ((*z).ApplicationCallTxnFields.ExtraProgramPages == 0) && ((*z).CompactCertTxnFields.CertRound.MsgIsZero()) && ((*z).CompactCertTxnFields.CertType.MsgIsZero()) && ((*z).CompactCertTxnFields.Cert.MsgIsZero()) } // MarshalMsg implements msgp.Marshaler diff --git a/data/transactions/payment.go b/data/transactions/payment.go index f5018345ad..7676315a36 100644 --- a/data/transactions/payment.go +++ b/data/transactions/payment.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/transactions/payment_test.go b/data/transactions/payment_test.go index 7bdddd9920..7f88c7e793 100644 --- a/data/transactions/payment_test.go +++ b/data/transactions/payment_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/transactions/payset.go b/data/transactions/payset.go index 363e4f7f64..c75755788b 100644 --- a/data/transactions/payset.go +++ b/data/transactions/payset.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/transactions/payset_test.go b/data/transactions/payset_test.go index 9b8633b624..9446f45b61 100644 --- a/data/transactions/payset_test.go +++ b/data/transactions/payset_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/transactions/perf_test.go b/data/transactions/perf_test.go index 11303ba0de..1aa0bed495 100644 --- a/data/transactions/perf_test.go +++ b/data/transactions/perf_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/transactions/signedtxn.go b/data/transactions/signedtxn.go index c30cd53036..8f4f55ba46 100644 --- a/data/transactions/signedtxn.go +++ b/data/transactions/signedtxn.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -18,7 +18,6 @@ package transactions import ( "errors" - "fmt" "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/data/basics" @@ -130,32 +129,3 @@ func WrapSignedTxnsWithAD(txgroup []SignedTxn) []SignedTxnWithAD { } return txgroupad } - -// FeeCredit computes the amount of fee credit that can be spent on -// inner txns because it was more than required. -func FeeCredit(txgroup []SignedTxn, minFee uint64) (uint64, error) { - minFeeCount := uint64(0) - feesPaid := uint64(0) - for _, stxn := range txgroup { - if stxn.Txn.Type != protocol.CompactCertTx { - minFeeCount++ - } - feesPaid = basics.AddSaturate(feesPaid, stxn.Txn.Fee.Raw) - } - feeNeeded, overflow := basics.OMul(minFee, minFeeCount) - if overflow { - return 0, fmt.Errorf("txgroup fee requirement overflow") - } - // feesPaid may have saturated. That's ok. Since we know - // feeNeeded did not overflow, simple comparison tells us - // feesPaid was enough. - if feesPaid < feeNeeded { - return 0, fmt.Errorf("txgroup had %d in fees, which is less than the minimum %d * %d", - feesPaid, minFeeCount, minFee) - } - // Now, if feesPaid *did* saturate, you will not get "credit" for - // all those fees while executing AVM code that might create - // transactions. But you'll get the max uint64 - good luck - // spending it. - return feesPaid - feeNeeded, nil -} diff --git a/data/transactions/signedtxn_test.go b/data/transactions/signedtxn_test.go index 9826c8f487..92de12182e 100644 --- a/data/transactions/signedtxn_test.go +++ b/data/transactions/signedtxn_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/transactions/sort.go b/data/transactions/sort.go index 3746ab6402..f0f10286fc 100644 --- a/data/transactions/sort.go +++ b/data/transactions/sort.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/transactions/teal.go b/data/transactions/teal.go index 0826290b9f..3851a03e29 100644 --- a/data/transactions/teal.go +++ b/data/transactions/teal.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -37,7 +37,7 @@ type EvalDelta struct { Logs []string `codec:"lg,allocbound=config.MaxLogCalls"` - InnerTxns []SignedTxnWithAD `codec:"itx,allocbound=config.MaxInnerTransactions"` + InnerTxns []SignedTxnWithAD `codec:"itx,allocbound=config.MaxInnerTransactionsPerDelta"` } // Equal compares two EvalDeltas and returns whether or not they are diff --git a/data/transactions/teal_test.go b/data/transactions/teal_test.go index 32eea6abbf..9900368953 100644 --- a/data/transactions/teal_test.go +++ b/data/transactions/teal_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -17,6 +17,7 @@ package transactions import ( + "fmt" "testing" "github.com/algorand/go-algorand/data/basics" @@ -187,3 +188,88 @@ func TestEvalDeltaEqual(t *testing.T) { a.False(d1.Equal(d2)) } + +// TestUnchangedAllocBounds ensure that the allocbounds on EvalDelta have not +// changed. If they change, EvalDelta.checkAllocBounds must be changed, or at +// least reconsidered, as well. We must give plenty of thought to whether a new +// allocound, used by new versions, is compatible with old code. If the change +// can only show up in new protocol versions, it should be ok. But if we change +// a bound, it will go into effect immediately, not with Protocol upgrade. So we +// must be extremely careful that old protocol versions can not emit messages +// that take advnatage of a new, bigger bound. (Or, if the bound is *lowered* it +// had better be the case that such messages cannot be emitted in old code.) +func TestUnchangedAllocBounds(t *testing.T) { + partitiontest.PartitionTest(t) + + delta := &EvalDelta{} + max := 256 // Hardcodes config.MaxEvalDeltaAccounts + for i := 0; i < max; i++ { + delta.InnerTxns = append(delta.InnerTxns, SignedTxnWithAD{}) + msg := delta.MarshalMsg(nil) + _, err := delta.UnmarshalMsg(msg) + require.NoError(t, err) + } + delta.InnerTxns = append(delta.InnerTxns, SignedTxnWithAD{}) + msg := delta.MarshalMsg(nil) + _, err := delta.UnmarshalMsg(msg) + require.Error(t, err) + + delta = &EvalDelta{} + max = 2048 // Hardcodes config.MaxLogCalls, currently MaxAppProgramLen + for i := 0; i < max; i++ { + delta.Logs = append(delta.Logs, "junk") + msg := delta.MarshalMsg(nil) + _, err := delta.UnmarshalMsg(msg) + require.NoError(t, err) + } + delta.Logs = append(delta.Logs, "junk") + msg = delta.MarshalMsg(nil) + _, err = delta.UnmarshalMsg(msg) + require.Error(t, err) + + delta = &EvalDelta{} + max = 256 // Hardcodes config.MaxInnerTransactionsPerDelta + for i := 0; i < max; i++ { + delta.InnerTxns = append(delta.InnerTxns, SignedTxnWithAD{}) + msg := delta.MarshalMsg(nil) + _, err := delta.UnmarshalMsg(msg) + require.NoError(t, err) + } + delta.InnerTxns = append(delta.InnerTxns, SignedTxnWithAD{}) + msg = delta.MarshalMsg(nil) + _, err = delta.UnmarshalMsg(msg) + require.Error(t, err) + + // This one appears wildly conservative. The real max is something like + // MaxAppTxnAccounts (4) + 1, since the key must be an index in the static + // array of touchable accounts. + delta = &EvalDelta{LocalDeltas: make(map[uint64]basics.StateDelta)} + max = 2048 // Hardcodes config.MaxEvalDeltaAccounts + for i := 0; i < max; i++ { + delta.LocalDeltas[uint64(i)] = basics.StateDelta{} + msg := delta.MarshalMsg(nil) + _, err := delta.UnmarshalMsg(msg) + require.NoError(t, err) + } + delta.LocalDeltas[uint64(max)] = basics.StateDelta{} + msg = delta.MarshalMsg(nil) + _, err = delta.UnmarshalMsg(msg) + require.Error(t, err) + + // This one *might* be wildly conservative. Only 64 keys can be set in + // globals, but I don't know what happens if you set and delete 65 (or way + // more) keys in a single transaction. + delta = &EvalDelta{GlobalDelta: make(basics.StateDelta)} + max = 2048 // Hardcodes config.MaxStateDeltaKeys + for i := 0; i < max; i++ { + delta.GlobalDelta[fmt.Sprintf("%d", i)] = basics.ValueDelta{} + msg := delta.MarshalMsg(nil) + _, err := delta.UnmarshalMsg(msg) + require.NoError(t, err) + } + delta.GlobalDelta[fmt.Sprintf("%d", max)] = basics.ValueDelta{} + msg = delta.MarshalMsg(nil) + _, err = delta.UnmarshalMsg(msg) + require.Error(t, err) + +} diff --git a/data/transactions/testhelpers.go b/data/transactions/testhelpers.go index 3ffacf6db5..8c981791c2 100644 --- a/data/transactions/testhelpers.go +++ b/data/transactions/testhelpers.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/transactions/transaction.go b/data/transactions/transaction.go index fb356bb04d..83721e5e18 100644 --- a/data/transactions/transaction.go +++ b/data/transactions/transaction.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -17,6 +17,7 @@ package transactions import ( + "encoding/binary" "errors" "fmt" @@ -180,6 +181,19 @@ func (tx Transaction) ID() Txid { return Txid(crypto.Hash(enc)) } +// InnerID returns something akin to Txid, but folds in the parent Txid and the +// index of the inner call. +func (tx Transaction) InnerID(parent Txid, index int) Txid { + input := append(protocol.GetEncodingBuf(), []byte(protocol.Transaction)...) + input = append(input, parent[:]...) + buf := make([]byte, 8) + binary.BigEndian.PutUint64(buf, uint64(index)) + input = append(input, buf...) + enc := tx.MarshalMsg(input) + defer protocol.PutEncodingBuf(enc) + return Txid(crypto.Hash(enc)) +} + // Sign signs a transaction using a given Account's secrets. func (tx Transaction) Sign(secrets *crypto.SignatureSecrets) SignedTxn { sig := secrets.Sign(tx) @@ -262,6 +276,11 @@ var errKeyregTxnUnsupportedSwitchToNonParticipating = errors.New("transaction tr var errKeyregTxnGoingOnlineWithNonParticipating = errors.New("transaction tries to register keys to go online, but nonparticipatory flag is set") var errKeyregTxnGoingOnlineWithZeroVoteLast = errors.New("transaction tries to register keys to go online, but vote last is set to zero") var errKeyregTxnGoingOnlineWithFirstVoteAfterLastValid = errors.New("transaction tries to register keys to go online, but first voting round is beyond the round after last valid round") +var errKeyRegEmptyStateProofPK = errors.New("online keyreg transaction cannot have empty field StateProofPK") +var errKeyregTxnNotEmptyStateProofPK = errors.New("transaction field StateProofPK should be empty in this consensus version") +var errKeyregTxnNonParticipantShouldBeEmptyStateProofPK = errors.New("non participation keyreg transactions should contain empty stateProofPK") +var errKeyregTxnOfflineShouldBeEmptyStateProofPK = errors.New("offline keyreg transactions should contain empty stateProofPK") +var errKeyRegTxnValidityPeriodTooLong = errors.New("validity period for keyreg transaction is too long") // WellFormed checks that the transaction looks reasonable on its own (but not necessarily valid against the actual ledger). It does not check signatures. func (tx Transaction) WellFormed(spec SpecialAddresses, proto config.ConsensusParams) error { @@ -318,6 +337,10 @@ func (tx Transaction) WellFormed(spec SpecialAddresses, proto config.ConsensusPa } + if err := tx.stateProofPKWellFormed(proto); err != nil { + return err + } + case protocol.AssetConfigTx: if !proto.Asset { return fmt.Errorf("asset transaction not supported") @@ -354,6 +377,13 @@ func (tx Transaction) WellFormed(spec SpecialAddresses, proto config.ConsensusPa if len(tx.ApprovalProgram) != 0 || len(tx.ClearStateProgram) != 0 { return fmt.Errorf("programs may only be specified during application creation or update") } + } else { + // This will check version matching, but not downgrading. That + // depends on chain state (so we pass an empty AppParams) + err := CheckContractVersions(tx.ApprovalProgram, tx.ClearStateProgram, basics.AppParams{}) + if err != nil { + return err + } } effectiveEPP := tx.ExtraProgramPages @@ -405,11 +435,11 @@ func (tx Transaction) WellFormed(spec SpecialAddresses, proto config.ConsensusPa // Limit the sum of all types of references that bring in account records if len(tx.Accounts)+len(tx.ForeignApps)+len(tx.ForeignAssets) > proto.MaxAppTotalTxnReferences { - return fmt.Errorf("tx has too many references, max is %d", proto.MaxAppTotalTxnReferences) + return fmt.Errorf("tx references exceed MaxAppTotalTxnReferences = %d", proto.MaxAppTotalTxnReferences) } if tx.ExtraProgramPages > uint32(proto.MaxExtraAppProgramPages) { - return fmt.Errorf("tx.ExtraProgramPages too large, max number of extra pages is %d", proto.MaxExtraAppProgramPages) + return fmt.Errorf("tx.ExtraProgramPages exceeds MaxExtraAppProgramPages = %d", proto.MaxExtraAppProgramPages) } lap := len(tx.ApprovalProgram) @@ -547,6 +577,44 @@ func (tx Transaction) WellFormed(spec SpecialAddresses, proto config.ConsensusPa return nil } +func (tx Transaction) stateProofPKWellFormed(proto config.ConsensusParams) error { + isEmpty := tx.KeyregTxnFields.StateProofPK.IsEmpty() + if !proto.EnableStateProofKeyregCheck { + // make certain empty key is stored. + if !isEmpty { + return errKeyregTxnNotEmptyStateProofPK + } + return nil + } + + if proto.MaxKeyregValidPeriod != 0 && uint64(tx.VoteLast.SubSaturate(tx.VoteFirst)) > proto.MaxKeyregValidPeriod { + return errKeyRegTxnValidityPeriodTooLong + } + + if tx.Nonparticipation { + // make certain that set offline request clears the stateProofPK. + if !isEmpty { + return errKeyregTxnNonParticipantShouldBeEmptyStateProofPK + } + return nil + } + + if tx.VotePK == (crypto.OneTimeSignatureVerifier{}) || tx.SelectionPK == (crypto.VRFVerifier{}) { + if !isEmpty { + return errKeyregTxnOfflineShouldBeEmptyStateProofPK + } + return nil + } + + // online transactions: + // setting online cannot set an empty stateProofPK + if isEmpty { + return errKeyRegEmptyStateProofPK + } + + return nil +} + // Aux returns the note associated with this transaction func (tx Header) Aux() []byte { return tx.Note @@ -633,6 +701,51 @@ type TxnContext interface { GenesisHash() crypto.Digest } +// ProgramVersion extracts the version of an AVM program from its bytecode +func ProgramVersion(bytecode []byte) (version uint64, length int, err error) { + if len(bytecode) == 0 { + return 0, 0, errors.New("invalid program (empty)") + } + version, vlen := binary.Uvarint(bytecode) + if vlen <= 0 { + return 0, 0, errors.New("invalid version") + } + return version, vlen, nil +} + +// ExtraProgramChecksVersion is version of AVM programs that are subject to +// extra test - approval and clear must match versions, and they may not be +// downgraded +const ExtraProgramChecksVersion = 6 + +// CheckContractVersions ensures that for v6 and higher two programs are version +// matched, and that they are not a downgrade. +func CheckContractVersions(approval []byte, clear []byte, previous basics.AppParams) error { + av, _, err := ProgramVersion(approval) + if err != nil { + return fmt.Errorf("bad ApprovalProgram: %v", err) + } + cv, _, err := ProgramVersion(clear) + if err != nil { + return fmt.Errorf("bad ClearStateProgram: %v", err) + } + if av >= ExtraProgramChecksVersion || cv >= ExtraProgramChecksVersion { + if av != cv { + return fmt.Errorf("program version mismatch: %d != %d", av, cv) + } + } + if len(previous.ApprovalProgram) != 0 { // if creation or in call from WellFormed() previous is empty + pv, _, err := ProgramVersion(previous.ApprovalProgram) + if err != nil { + return err + } + if pv >= ExtraProgramChecksVersion && av < pv { + return fmt.Errorf("program version downgrade: %d < %d", av, pv) + } + } + return nil +} + // ExplicitTxnContext is a struct that implements TxnContext with // explicit fields for everything. type ExplicitTxnContext struct { diff --git a/data/transactions/transaction_test.go b/data/transactions/transaction_test.go index 72fe13b2f6..5a7321c698 100644 --- a/data/transactions/transaction_test.go +++ b/data/transactions/transaction_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -22,6 +22,8 @@ import ( "strings" "testing" + "github.com/algorand/go-algorand/crypto/merklesignature" + "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/data/basics" @@ -134,16 +136,17 @@ func TestAppCallCreateWellFormed(t *testing.T) { partitiontest.PartitionTest(t) feeSink := basics.Address{0x7, 0xda, 0xcb, 0x4b, 0x6d, 0x9e, 0xd1, 0x41, 0xb1, 0x75, 0x76, 0xbd, 0x45, 0x9a, 0xe6, 0x42, 0x1d, 0x48, 0x6d, 0xa3, 0xd4, 0xef, 0x22, 0x47, 0xc4, 0x9, 0xa3, 0x96, 0xb8, 0x2e, 0xa2, 0x21} - specialAddr := SpecialAddresses{FeeSink: feeSink} curProto := config.Consensus[protocol.ConsensusCurrentVersion] futureProto := config.Consensus[protocol.ConsensusFuture] addr1, err := basics.UnmarshalChecksumAddress("NDQCJNNY5WWWFLP4GFZ7MEF2QJSMZYK6OWIV2AQ7OMAVLEFCGGRHFPKJJA") require.NoError(t, err) + v5 := []byte{0x05} + v6 := []byte{0x06} + usecases := []struct { tx Transaction - spec SpecialAddresses proto config.ConsensusParams - expectedError error + expectedError string }{ { tx: Transaction{ @@ -155,13 +158,14 @@ func TestAppCallCreateWellFormed(t *testing.T) { FirstValid: 100, }, ApplicationCallTxnFields: ApplicationCallTxnFields{ - ApplicationID: 0, + ApplicationID: 0, + ApprovalProgram: v5, + ClearStateProgram: v5, ApplicationArgs: [][]byte{ []byte("write"), }, }, }, - spec: specialAddr, proto: curProto, }, { @@ -174,14 +178,15 @@ func TestAppCallCreateWellFormed(t *testing.T) { FirstValid: 100, }, ApplicationCallTxnFields: ApplicationCallTxnFields{ - ApplicationID: 0, + ApplicationID: 0, + ApprovalProgram: v5, + ClearStateProgram: v5, ApplicationArgs: [][]byte{ []byte("write"), }, ExtraProgramPages: 0, }, }, - spec: specialAddr, proto: curProto, }, { @@ -194,14 +199,15 @@ func TestAppCallCreateWellFormed(t *testing.T) { FirstValid: 100, }, ApplicationCallTxnFields: ApplicationCallTxnFields{ - ApplicationID: 0, + ApplicationID: 0, + ApprovalProgram: v5, + ClearStateProgram: v5, ApplicationArgs: [][]byte{ []byte("write"), }, ExtraProgramPages: 3, }, }, - spec: specialAddr, proto: futureProto, }, { @@ -214,20 +220,45 @@ func TestAppCallCreateWellFormed(t *testing.T) { FirstValid: 100, }, ApplicationCallTxnFields: ApplicationCallTxnFields{ - ApplicationID: 0, + ApplicationID: 0, + ApprovalProgram: v5, + ClearStateProgram: v5, ApplicationArgs: [][]byte{ []byte("write"), }, ExtraProgramPages: 0, }, }, - spec: specialAddr, proto: futureProto, }, + { + tx: Transaction{ + Type: protocol.ApplicationCallTx, + Header: Header{ + Sender: addr1, + Fee: basics.MicroAlgos{Raw: 1000}, + LastValid: 105, + FirstValid: 100, + }, + ApplicationCallTxnFields: ApplicationCallTxnFields{ + ApprovalProgram: v5, + ClearStateProgram: v6, + }, + }, + proto: futureProto, + expectedError: "mismatch", + }, } - for _, usecase := range usecases { - err := usecase.tx.WellFormed(usecase.spec, usecase.proto) - require.NoError(t, err) + for i, usecase := range usecases { + t.Run(fmt.Sprintf("i=%d", i), func(t *testing.T) { + err := usecase.tx.WellFormed(SpecialAddresses{FeeSink: feeSink}, usecase.proto) + if usecase.expectedError != "" { + require.Error(t, err) + require.Contains(t, err.Error(), usecase.expectedError) + } else { + require.NoError(t, err) + } + }) } } @@ -242,6 +273,7 @@ func TestWellFormedErrors(t *testing.T) { protoV28 := config.Consensus[protocol.ConsensusV28] addr1, err := basics.UnmarshalChecksumAddress("NDQCJNNY5WWWFLP4GFZ7MEF2QJSMZYK6OWIV2AQ7OMAVLEFCGGRHFPKJJA") require.NoError(t, err) + v5 := []byte{0x05} okHeader := Header{ Sender: addr1, Fee: basics.MicroAlgos{Raw: 1000}, @@ -296,7 +328,9 @@ func TestWellFormedErrors(t *testing.T) { Type: protocol.ApplicationCallTx, Header: okHeader, ApplicationCallTxnFields: ApplicationCallTxnFields{ - ApplicationID: 0, // creation + ApplicationID: 0, // creation + ApprovalProgram: v5, + ClearStateProgram: v5, ApplicationArgs: [][]byte{ []byte("write"), }, @@ -305,7 +339,7 @@ func TestWellFormedErrors(t *testing.T) { }, spec: specialAddr, proto: protoV27, - expectedError: fmt.Errorf("tx.ExtraProgramPages too large, max number of extra pages is %d", protoV27.MaxExtraAppProgramPages), + expectedError: fmt.Errorf("tx.ExtraProgramPages exceeds MaxExtraAppProgramPages = %d", protoV27.MaxExtraAppProgramPages), }, { tx: Transaction{ @@ -314,7 +348,7 @@ func TestWellFormedErrors(t *testing.T) { ApplicationCallTxnFields: ApplicationCallTxnFields{ ApplicationID: 0, // creation ApprovalProgram: []byte(strings.Repeat("X", 1025)), - ClearStateProgram: []byte("junk"), + ClearStateProgram: []byte("Xjunk"), }, }, spec: specialAddr, @@ -328,7 +362,7 @@ func TestWellFormedErrors(t *testing.T) { ApplicationCallTxnFields: ApplicationCallTxnFields{ ApplicationID: 0, // creation ApprovalProgram: []byte(strings.Repeat("X", 1025)), - ClearStateProgram: []byte("junk"), + ClearStateProgram: []byte("Xjunk"), }, }, spec: specialAddr, @@ -383,7 +417,9 @@ func TestWellFormedErrors(t *testing.T) { Type: protocol.ApplicationCallTx, Header: okHeader, ApplicationCallTxnFields: ApplicationCallTxnFields{ - ApplicationID: 0, + ApplicationID: 0, + ApprovalProgram: v5, + ClearStateProgram: v5, ApplicationArgs: [][]byte{ []byte("write"), }, @@ -392,7 +428,7 @@ func TestWellFormedErrors(t *testing.T) { }, spec: specialAddr, proto: futureProto, - expectedError: fmt.Errorf("tx.ExtraProgramPages too large, max number of extra pages is %d", futureProto.MaxExtraAppProgramPages), + expectedError: fmt.Errorf("tx.ExtraProgramPages exceeds MaxExtraAppProgramPages = %d", futureProto.MaxExtraAppProgramPages), }, { tx: Transaction{ @@ -457,7 +493,7 @@ func TestWellFormedErrors(t *testing.T) { }, spec: specialAddr, proto: futureProto, - expectedError: fmt.Errorf("tx has too many references, max is 8"), + expectedError: fmt.Errorf("tx references exceed MaxAppTotalTxnReferences = 8"), }, { tx: Transaction{ @@ -495,7 +531,9 @@ func TestWellFormedErrors(t *testing.T) { Type: protocol.ApplicationCallTx, Header: okHeader, ApplicationCallTxnFields: ApplicationCallTxnFields{ - ApplicationID: 1, + ApplicationID: 1, + ApprovalProgram: v5, + ClearStateProgram: v5, ApplicationArgs: [][]byte{ []byte("write"), }, @@ -541,6 +579,7 @@ func TestWellFormedKeyRegistrationTx(t *testing.T) { type keyRegTestCase struct { votePK crypto.OneTimeSignatureVerifier selectionPK crypto.VRFVerifier + stateProofPK merklesignature.Verifier voteFirst basics.Round voteLast basics.Round lastValid basics.Round @@ -548,12 +587,17 @@ func TestWellFormedKeyRegistrationTx(t *testing.T) { nonParticipation bool supportBecomeNonParticipatingTransactions bool enableKeyregCoherencyCheck bool + enableStateProofKeyregCheck bool err error } votePKValue := crypto.OneTimeSignatureVerifier{0x7, 0xda, 0xcb, 0x4b, 0x6d, 0x9e, 0xd1, 0x41, 0xb1, 0x75, 0x76, 0xbd, 0x45, 0x9a, 0xe6, 0x42, 0x1d, 0x48, 0x6d, 0xa3, 0xd4, 0xef, 0x22, 0x47, 0xc4, 0x9, 0xa3, 0x96, 0xb8, 0x2e, 0xa2, 0x21} selectionPKValue := crypto.VRFVerifier{0x7, 0xda, 0xcb, 0x4b, 0x6d, 0x9e, 0xd1, 0x41, 0xb1, 0x75, 0x76, 0xbd, 0x45, 0x9a, 0xe6, 0x42, 0x1d, 0x48, 0x6d, 0xa3, 0xd4, 0xef, 0x22, 0x47, 0xc4, 0x9, 0xa3, 0x96, 0xb8, 0x2e, 0xa2, 0x21} + stateProofPK := merklesignature.Verifier([merklesignature.MerkleSignatureSchemeRootSize]byte{1}) + maxValidPeriod := config.Consensus[protocol.ConsensusFuture].MaxKeyregValidPeriod // TODO: change to curProto.MaxKeyregValidPeriod + runTestCase := func(testCase keyRegTestCase) error { + tx.KeyregTxnFields.VotePK = testCase.votePK tx.KeyregTxnFields.SelectionPK = testCase.selectionPK tx.KeyregTxnFields.VoteFirst = testCase.voteFirst @@ -561,9 +605,12 @@ func TestWellFormedKeyRegistrationTx(t *testing.T) { tx.KeyregTxnFields.VoteKeyDilution = testCase.voteKeyDilution tx.KeyregTxnFields.Nonparticipation = testCase.nonParticipation tx.LastValid = testCase.lastValid + tx.KeyregTxnFields.StateProofPK = testCase.stateProofPK curProto.SupportBecomeNonParticipatingTransactions = testCase.supportBecomeNonParticipatingTransactions curProto.EnableKeyregCoherencyCheck = testCase.enableKeyregCoherencyCheck + curProto.EnableStateProofKeyregCheck = testCase.enableStateProofKeyregCheck + curProto.MaxKeyregValidPeriod = maxValidPeriod // TODO: remove this when MaxKeyregValidPeriod is in CurrentVersion return tx.WellFormed(spec, curProto) } @@ -579,55 +626,59 @@ func TestWellFormedKeyRegistrationTx(t *testing.T) { for _, nonParticipation := range []bool{false, true} { for _, supportBecomeNonParticipatingTransactions := range []bool{false, true} { for _, enableKeyregCoherencyCheck := range []bool{false, true} { - outcome := runTestCase(keyRegTestCase{ - votePK, - selectionPK, - voteFirst, - voteLast, - lastValid, - voteKeyDilution, - nonParticipation, - supportBecomeNonParticipatingTransactions, - enableKeyregCoherencyCheck, - nil}) - errStr := "nil" - switch outcome { - case errKeyregTxnUnsupportedSwitchToNonParticipating: - errStr = "errKeyregTxnUnsupportedSwitchToNonParticipating" - case errKeyregTxnGoingOnlineWithNonParticipating: - errStr = "errKeyregTxnGoingOnlineWithNonParticipating" - case errKeyregTxnNonCoherentVotingKeys: - errStr = "errKeyregTxnNonCoherentVotingKeys" - case errKeyregTxnOfflineTransactionHasVotingRounds: - errStr = "errKeyregTxnOfflineTransactionHasVotingRounds" - case errKeyregTxnFirstVotingRoundGreaterThanLastVotingRound: - errStr = "errKeyregTxnFirstVotingRoundGreaterThanLastVotingRound" - case errKeyregTxnGoingOnlineWithZeroVoteLast: - errStr = "errKeyregTxnGoingOnlineWithZeroVoteLast" - case errKeyregTxnGoingOnlineWithNonParticipating: - errStr = "errKeyregTxnGoingOnlineWithNonParticipating" - case errKeyregTxnGoingOnlineWithFirstVoteAfterLastValid: - errStr = "errKeyregTxnGoingOnlineWithFirstVoteAfterLastValid" - default: - require.Nil(t, outcome) + for _, enableStateProofKeyregCheck := range []bool{false, true} { + outcome := runTestCase(keyRegTestCase{ + votePK, + selectionPK, + stateProofPK, + voteFirst, + voteLast, + lastValid, + voteKeyDilution, + nonParticipation, + supportBecomeNonParticipatingTransactions, + enableKeyregCoherencyCheck, + enableStateProofKeyregCheck, + nil}) + errStr := "nil" + switch outcome { + case errKeyregTxnUnsupportedSwitchToNonParticipating: + errStr = "errKeyregTxnUnsupportedSwitchToNonParticipating" + case errKeyregTxnGoingOnlineWithNonParticipating: + errStr = "errKeyregTxnGoingOnlineWithNonParticipating" + case errKeyregTxnNonCoherentVotingKeys: + errStr = "errKeyregTxnNonCoherentVotingKeys" + case errKeyregTxnOfflineTransactionHasVotingRounds: + errStr = "errKeyregTxnOfflineTransactionHasVotingRounds" + case errKeyregTxnFirstVotingRoundGreaterThanLastVotingRound: + errStr = "errKeyregTxnFirstVotingRoundGreaterThanLastVotingRound" + case errKeyregTxnGoingOnlineWithZeroVoteLast: + errStr = "errKeyregTxnGoingOnlineWithZeroVoteLast" + case errKeyregTxnGoingOnlineWithNonParticipating: + errStr = "errKeyregTxnGoingOnlineWithNonParticipating" + case errKeyregTxnGoingOnlineWithFirstVoteAfterLastValid: + errStr = "errKeyregTxnGoingOnlineWithFirstVoteAfterLastValid" + default: + require.Nil(t, outcome) + } + s := "/* %3d */ keyRegTestCase{votePK:" + if votePK == votePKValue { + s += "votePKValue" + } else { + s += "crypto.OneTimeSignatureVerifier{}" + } + s += ", selectionPK:" + if selectionPK == selectionPKValue { + s += "selectionPKValue" + } else { + s += "crypto.VRFVerifier{}" + } + s = fmt.Sprintf("%s, voteFirst:basics.Round(%2d), voteLast:basics.Round(%2d), lastValid:basics.Round(%2d), voteKeyDilution: %5d, nonParticipation: %v,supportBecomeNonParticipatingTransactions:%v, enableKeyregCoherencyCheck:%v, err:%s},\n", + s, voteFirst, voteLast, lastValid, voteKeyDilution, nonParticipation, supportBecomeNonParticipatingTransactions, enableKeyregCoherencyCheck, errStr) + fmt.Printf(s, idx) + idx++ } - s := "/* %3d */ keyRegTestCase{votePK:" - if votePK == votePKValue { - s += "votePKValue" - } else { - s += "crypto.OneTimeSignatureVerifier{}" - } - s += ", selectionPK:" - if selectionPK == selectionPKValue { - s += "selectionPKValue" - } else { - s += "crypto.VRFVerifier{}" - } - s = fmt.Sprintf("%s, voteFirst:basics.Round(%2d), voteLast:basics.Round(%2d), lastValid:basics.Round(%2d), voteKeyDilution: %5d, nonParticipation: %v,supportBecomeNonParticipatingTransactions:%v, enableKeyregCoherencyCheck:%v, err:%s},\n", - s, voteFirst, voteLast, lastValid, voteKeyDilution, nonParticipation, supportBecomeNonParticipatingTransactions, enableKeyregCoherencyCheck, errStr) - fmt.Printf(s, idx) - idx++ } } } @@ -1153,9 +1204,22 @@ func TestWellFormedKeyRegistrationTx(t *testing.T) { /* 509 */ keyRegTestCase{votePK: votePKValue, selectionPK: selectionPKValue, voteFirst: basics.Round(5), voteLast: basics.Round(10), lastValid: basics.Round(3), voteKeyDilution: 10000, nonParticipation: true, supportBecomeNonParticipatingTransactions: false, enableKeyregCoherencyCheck: true, err: errKeyregTxnGoingOnlineWithFirstVoteAfterLastValid}, /* 510 */ keyRegTestCase{votePK: votePKValue, selectionPK: selectionPKValue, voteFirst: basics.Round(5), voteLast: basics.Round(10), lastValid: basics.Round(3), voteKeyDilution: 10000, nonParticipation: true, supportBecomeNonParticipatingTransactions: true, enableKeyregCoherencyCheck: false, err: errKeyregTxnGoingOnlineWithNonParticipating}, /* 511 */ keyRegTestCase{votePK: votePKValue, selectionPK: selectionPKValue, voteFirst: basics.Round(5), voteLast: basics.Round(10), lastValid: basics.Round(3), voteKeyDilution: 10000, nonParticipation: true, supportBecomeNonParticipatingTransactions: true, enableKeyregCoherencyCheck: true, err: errKeyregTxnGoingOnlineWithFirstVoteAfterLastValid}, + /* 512 */ keyRegTestCase{votePK: votePKValue, selectionPK: selectionPKValue, stateProofPK: stateProofPK, voteFirst: basics.Round(5), voteLast: basics.Round(10), lastValid: basics.Round(3), voteKeyDilution: 10000, nonParticipation: false, supportBecomeNonParticipatingTransactions: true, enableKeyregCoherencyCheck: false, enableStateProofKeyregCheck: false, err: errKeyregTxnNotEmptyStateProofPK}, + /* 513 */ keyRegTestCase{votePK: votePKValue, selectionPK: selectionPKValue, stateProofPK: merklesignature.Verifier{}, voteFirst: basics.Round(5), voteLast: basics.Round(10), lastValid: basics.Round(3), voteKeyDilution: 10000, nonParticipation: false, supportBecomeNonParticipatingTransactions: true, enableKeyregCoherencyCheck: false, enableStateProofKeyregCheck: false, err: nil}, + /* 514 */ keyRegTestCase{votePK: votePKValue, selectionPK: selectionPKValue, stateProofPK: stateProofPK, voteFirst: basics.Round(5), voteLast: basics.Round(10), lastValid: basics.Round(3), voteKeyDilution: 10000, nonParticipation: false, supportBecomeNonParticipatingTransactions: true, enableKeyregCoherencyCheck: false, enableStateProofKeyregCheck: true, err: nil}, + /* 515 */ keyRegTestCase{votePK: votePKValue, selectionPK: selectionPKValue, stateProofPK: merklesignature.Verifier{}, voteFirst: basics.Round(5), voteLast: basics.Round(10), lastValid: basics.Round(3), voteKeyDilution: 10000, nonParticipation: false, supportBecomeNonParticipatingTransactions: true, enableKeyregCoherencyCheck: false, enableStateProofKeyregCheck: true, err: errKeyRegEmptyStateProofPK}, + /* 516 */ keyRegTestCase{votePK: crypto.OneTimeSignatureVerifier{}, selectionPK: crypto.VRFVerifier{}, stateProofPK: stateProofPK, voteFirst: basics.Round(5), voteLast: basics.Round(10), lastValid: basics.Round(3), voteKeyDilution: 10000, nonParticipation: true, supportBecomeNonParticipatingTransactions: true, enableKeyregCoherencyCheck: false, enableStateProofKeyregCheck: true, err: errKeyregTxnNonParticipantShouldBeEmptyStateProofPK}, + /* 517 */ keyRegTestCase{votePK: crypto.OneTimeSignatureVerifier{}, selectionPK: crypto.VRFVerifier{}, stateProofPK: merklesignature.Verifier{}, voteFirst: basics.Round(5), voteLast: basics.Round(10), lastValid: basics.Round(3), voteKeyDilution: 10000, nonParticipation: true, supportBecomeNonParticipatingTransactions: true, enableKeyregCoherencyCheck: false, enableStateProofKeyregCheck: true, err: nil}, + /* 518 */ keyRegTestCase{votePK: crypto.OneTimeSignatureVerifier{}, selectionPK: crypto.VRFVerifier{}, stateProofPK: stateProofPK, voteFirst: basics.Round(5), voteLast: basics.Round(10), lastValid: basics.Round(3), voteKeyDilution: 10000, nonParticipation: false, supportBecomeNonParticipatingTransactions: true, enableKeyregCoherencyCheck: false, enableStateProofKeyregCheck: true, err: errKeyregTxnOfflineShouldBeEmptyStateProofPK}, + /* 519 */ keyRegTestCase{votePK: crypto.OneTimeSignatureVerifier{}, selectionPK: crypto.VRFVerifier{}, stateProofPK: merklesignature.Verifier{}, voteFirst: basics.Round(5), voteLast: basics.Round(10), lastValid: basics.Round(3), voteKeyDilution: 10000, nonParticipation: true, supportBecomeNonParticipatingTransactions: true, enableKeyregCoherencyCheck: false, enableStateProofKeyregCheck: true, err: nil}, + /* 520 */ keyRegTestCase{votePK: crypto.OneTimeSignatureVerifier{}, selectionPK: crypto.VRFVerifier{}, stateProofPK: merklesignature.Verifier{}, voteFirst: basics.Round(5), voteLast: basics.Round(10), lastValid: basics.Round(3), voteKeyDilution: 0, nonParticipation: false, supportBecomeNonParticipatingTransactions: true, enableKeyregCoherencyCheck: false, enableStateProofKeyregCheck: true, err: nil}, + /* 521 */ keyRegTestCase{votePK: crypto.OneTimeSignatureVerifier{}, selectionPK: crypto.VRFVerifier{}, stateProofPK: merklesignature.Verifier{}, voteFirst: basics.Round(10), voteLast: basics.Round(10 + maxValidPeriod), lastValid: basics.Round(3), voteKeyDilution: 10000, nonParticipation: false, supportBecomeNonParticipatingTransactions: true, enableKeyregCoherencyCheck: false, enableStateProofKeyregCheck: true, err: nil}, + /* 522 */ keyRegTestCase{votePK: crypto.OneTimeSignatureVerifier{}, selectionPK: crypto.VRFVerifier{}, stateProofPK: merklesignature.Verifier{}, voteFirst: basics.Round(10), voteLast: basics.Round(10000 + maxValidPeriod), lastValid: basics.Round(3), voteKeyDilution: 10000, nonParticipation: false, supportBecomeNonParticipatingTransactions: true, enableKeyregCoherencyCheck: false, enableStateProofKeyregCheck: true, err: errKeyRegTxnValidityPeriodTooLong}, + /* 523 */ keyRegTestCase{votePK: crypto.OneTimeSignatureVerifier{}, selectionPK: crypto.VRFVerifier{}, stateProofPK: merklesignature.Verifier{}, voteFirst: basics.Round(10), voteLast: basics.Round(10000 + maxValidPeriod), lastValid: basics.Round(3), voteKeyDilution: 10000, nonParticipation: false, supportBecomeNonParticipatingTransactions: true, enableKeyregCoherencyCheck: false, enableStateProofKeyregCheck: false, err: nil}, } for testcaseIdx, testCase := range keyRegTestCases { err := runTestCase(testCase) + require.Equalf(t, testCase.err, err, "index: %d\ntest case: %#v", testcaseIdx, testCase) } } diff --git a/data/transactions/verify/txn.go b/data/transactions/verify/txn.go index 13a07b328a..f4d8deaf35 100644 --- a/data/transactions/verify/txn.go +++ b/data/transactions/verify/txn.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -85,7 +85,7 @@ func PrepareGroupContext(group []transactions.SignedTxn, contextHdr bookkeeping. }, consensusVersion: contextHdr.CurrentProtocol, consensusParams: consensusParams, - minTealVersion: logic.ComputeMinTealVersion(group), + minTealVersion: logic.ComputeMinTealVersion(transactions.WrapSignedTxnsWithAD(group), false), signedGroupTxns: group, }, nil } @@ -100,7 +100,8 @@ func (g *GroupContext) Equal(other *GroupContext) bool { // Txn verifies a SignedTxn as being signed and having no obviously inconsistent data. // Block-assembly time checks of LogicSig and accounting rules may still block the txn. func Txn(s *transactions.SignedTxn, txnIdx int, groupCtx *GroupContext) error { - batchVerifier := crypto.MakeBatchVerifierDefaultSize() + useBatchVerification := groupCtx.consensusParams.EnableBatchVerification + batchVerifier := crypto.MakeBatchVerifierDefaultSize(useBatchVerification) if err := TxnBatchVerify(s, txnIdx, groupCtx, batchVerifier); err != nil { return err @@ -133,7 +134,10 @@ func TxnBatchVerify(s *transactions.SignedTxn, txnIdx int, groupCtx *GroupContex // TxnGroup verifies a []SignedTxn as being signed and having no obviously inconsistent data. func TxnGroup(stxs []transactions.SignedTxn, contextHdr bookkeeping.BlockHeader, cache VerifiedTransactionCache) (groupCtx *GroupContext, err error) { - batchVerifier := crypto.MakeBatchVerifierDefaultSize() + + currentVersion := contextHdr.CurrentProtocol + useBatchVerification := config.Consensus[currentVersion].EnableBatchVerification + batchVerifier := crypto.MakeBatchVerifierDefaultSize(useBatchVerification) if groupCtx, err = TxnGroupBatchVerify(stxs, contextHdr, cache, batchVerifier); err != nil { return nil, err @@ -246,7 +250,8 @@ func stxnVerifyCore(s *transactions.SignedTxn, txnIdx int, groupCtx *GroupContex // LogicSigSanityCheck checks that the signature is valid and that the program is basically well formed. // It does not evaluate the logic. func LogicSigSanityCheck(txn *transactions.SignedTxn, groupIndex int, groupCtx *GroupContext) error { - batchVerifier := crypto.MakeBatchVerifierDefaultSize() + useBatchVerification := groupCtx.consensusParams.EnableBatchVerification + batchVerifier := crypto.MakeBatchVerifierDefaultSize(useBatchVerification) if err := LogicSigSanityCheckBatchVerify(txn, groupIndex, groupCtx, batchVerifier); err != nil { return err @@ -289,14 +294,13 @@ func LogicSigSanityCheckBatchVerify(txn *transactions.SignedTxn, groupIndex int, if groupIndex < 0 { return errors.New("Negative groupIndex") } + txngroup := transactions.WrapSignedTxnsWithAD(groupCtx.signedGroupTxns) ep := logic.EvalParams{ - Txn: txn, Proto: &groupCtx.consensusParams, - TxnGroup: groupCtx.signedGroupTxns, - GroupIndex: uint64(groupIndex), + TxnGroup: txngroup, MinTealVersion: &groupCtx.minTealVersion, } - err := logic.Check(lsig.Logic, ep) + err := logic.CheckSignature(groupIndex, &ep) if err != nil { return err } @@ -347,13 +351,11 @@ func logicSigBatchVerify(txn *transactions.SignedTxn, groupIndex int, groupCtx * return errors.New("Negative groupIndex") } ep := logic.EvalParams{ - Txn: txn, Proto: &groupCtx.consensusParams, - TxnGroup: groupCtx.signedGroupTxns, - GroupIndex: uint64(groupIndex), + TxnGroup: transactions.WrapSignedTxnsWithAD(groupCtx.signedGroupTxns), MinTealVersion: &groupCtx.minTealVersion, } - pass, err := logic.Eval(txn.Lsig.Logic, ep) + pass, err := logic.EvalSignature(groupIndex, &ep) if err != nil { logicErrTotal.Inc(nil) return fmt.Errorf("transaction %v: rejected by logic err=%v", txn.ID(), err) @@ -382,6 +384,9 @@ func PaysetGroups(ctx context.Context, payset [][]transactions.SignedTxn, blkHea worksets := make(chan struct{}, concurrentWorksets) worksDoneCh := make(chan interface{}, concurrentWorksets) processing := 0 + currentVersion := blkHeader.CurrentProtocol + useBatchVerification := config.Consensus[currentVersion].EnableBatchVerification + tasksCtx, cancelTasksCtx := context.WithCancel(ctx) defer cancelTasksCtx() builder := worksetBuilder{payset: payset} @@ -407,7 +412,7 @@ func PaysetGroups(ctx context.Context, payset [][]transactions.SignedTxn, blkHea txnGroups := arg.([][]transactions.SignedTxn) groupCtxs := make([]*GroupContext, len(txnGroups)) - batchVerifier := crypto.MakeBatchVerifier(len(payset)) + batchVerifier := crypto.MakeBatchVerifier(len(payset), useBatchVerification) for i, signTxnsGrp := range txnGroups { groupCtxs[i], grpErr = TxnGroupBatchVerify(signTxnsGrp, blkHeader, nil, batchVerifier) // abort only if it's a non-cache error. diff --git a/data/transactions/verify/txn_test.go b/data/transactions/verify/txn_test.go index 36ac93637b..d13504610c 100644 --- a/data/transactions/verify/txn_test.go +++ b/data/transactions/verify/txn_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -126,7 +126,7 @@ func TestSignedPayment(t *testing.T) { require.Equal(t, stxn.ID(), stxn2.ID(), "changing sig caused txid to change") require.Error(t, Txn(&stxn2, 0, groupCtx), "verify succeeded with bad sig") - require.True(t, crypto.SignatureVerifier(addr).Verify(payment, stxn.Sig), "signature on the transaction is not the signature of the hash of the transaction under the spender's key") + require.True(t, crypto.SignatureVerifier(addr).Verify(payment, stxn.Sig, true), "signature on the transaction is not the signature of the hash of the transaction under the spender's key") } func TestTxnValidationEncodeDecode(t *testing.T) { @@ -178,7 +178,7 @@ func TestTxnValidationCompactCert(t *testing.T) { partitiontest.PartitionTest(t) proto := config.Consensus[protocol.ConsensusCurrentVersion] - proto.CompactCertRounds = 128 + proto.CompactCertRounds = 256 config.Consensus[ccProto] = proto stxn := transactions.SignedTxn{ diff --git a/data/transactions/verify/verifiedTxnCache.go b/data/transactions/verify/verifiedTxnCache.go index 0c9bbe2c02..fdd5028335 100644 --- a/data/transactions/verify/verifiedTxnCache.go +++ b/data/transactions/verify/verifiedTxnCache.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -128,7 +128,7 @@ func (v *verifiedTransactionCache) GetUnverifiedTranscationGroups(txnGroups [][] for txnGroupIndex := 0; txnGroupIndex < len(txnGroups); txnGroupIndex++ { signedTxnGroup := txnGroups[txnGroupIndex] verifiedTxn := 0 - groupCtx.minTealVersion = logic.ComputeMinTealVersion(signedTxnGroup) + groupCtx.minTealVersion = logic.ComputeMinTealVersion(transactions.WrapSignedTxnsWithAD(signedTxnGroup), false) baseBucket := v.base for txnIdx := 0; txnIdx < len(signedTxnGroup); txnIdx++ { diff --git a/data/transactions/verify/verifiedTxnCache_test.go b/data/transactions/verify/verifiedTxnCache_test.go index c6e720b625..af8e36b421 100644 --- a/data/transactions/verify/verifiedTxnCache_test.go +++ b/data/transactions/verify/verifiedTxnCache_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/txHandler.go b/data/txHandler.go index fa8bf250be..1d4d1a5000 100644 --- a/data/txHandler.go +++ b/data/txHandler.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/txHandler_test.go b/data/txHandler_test.go index a53d831630..653cd51e9e 100644 --- a/data/txHandler_test.go +++ b/data/txHandler_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/data/txntest/txn.go b/data/txntest/txn.go index 063f085bf4..6b72cb080e 100644 --- a/data/txntest/txn.go +++ b/data/txntest/txn.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -34,6 +34,7 @@ package txntest import ( "fmt" + "reflect" "strings" "github.com/algorand/go-algorand/config" @@ -45,8 +46,10 @@ import ( "github.com/algorand/go-algorand/protocol" ) -// Txn exists purely to make it easier to write a -// transaction.Transaction in Go source. +// Txn exists to simplify writing tests where transaction.Transaction might be unwieldy. +// Txn simplifies testing in these ways: +// * Provides a flat structure to simplify object construction. +// * Defines convenience methods to help setup test state. type Txn struct { Type protocol.TxType @@ -93,8 +96,8 @@ type Txn struct { ForeignAssets []basics.AssetIndex LocalStateSchema basics.StateSchema GlobalStateSchema basics.StateSchema - ApprovalProgram string - ClearStateProgram string + ApprovalProgram interface{} // string, nil, or []bytes if already compiled + ClearStateProgram interface{} // string, nil or []bytes if already compiled ExtraProgramPages uint32 CertRound basics.Round @@ -119,29 +122,52 @@ func (tx *Txn) FillDefaults(params config.ConsensusParams) { if tx.LastValid == 0 { tx.LastValid = tx.FirstValid + basics.Round(params.MaxTxnLife) } - if tx.ApprovalProgram != "" && !strings.Contains(tx.ApprovalProgram, "#pragma version") { - pragma := fmt.Sprintf("#pragma version %d\n", params.LogicSigVersion) - tx.ApprovalProgram = pragma + tx.ApprovalProgram - } - if tx.ApprovalProgram != "" && tx.ClearStateProgram == "" { - tx.ClearStateProgram = "int 0" - } - if tx.ClearStateProgram != "" && !strings.Contains(tx.ClearStateProgram, "#pragma version") { - pragma := fmt.Sprintf("#pragma version %d\n", params.LogicSigVersion) - tx.ClearStateProgram = pragma + tx.ClearStateProgram + + if tx.Type == protocol.ApplicationCallTx && + (tx.ApplicationID == 0 || tx.OnCompletion == transactions.UpdateApplicationOC) { + + switch program := tx.ApprovalProgram.(type) { + case nil: + tx.ApprovalProgram = fmt.Sprintf("#pragma version %d\nint 1", params.LogicSigVersion) + case string: + if program != "" && !strings.Contains(program, "#pragma version") { + pragma := fmt.Sprintf("#pragma version %d\n", params.LogicSigVersion) + tx.ApprovalProgram = pragma + program + } + case []byte: + } + + switch program := tx.ClearStateProgram.(type) { + case nil: + tx.ClearStateProgram = tx.ApprovalProgram + case string: + if program != "" && !strings.Contains(program, "#pragma version") { + pragma := fmt.Sprintf("#pragma version %d\n", params.LogicSigVersion) + tx.ClearStateProgram = pragma + program + } + case []byte: + } } } -func assemble(source string) []byte { - if source == "" { +func assemble(source interface{}) []byte { + switch program := source.(type) { + case string: + if program == "" { + return nil + } + ops, err := logic.AssembleString(program) + if err != nil { + fmt.Printf("Bad program %v", ops.Errors) + panic(ops.Errors) + } + return ops.Program + case []byte: + return program + case nil: return nil } - ops, err := logic.AssembleString(source) - if err != nil { - fmt.Printf("Bad program %v", ops.Errors) - panic(ops.Errors) - } - return ops.Program + panic(reflect.TypeOf(source)) } // Txn produces a transactions.Transaction from the fields in this Txn diff --git a/gen/generate.go b/gen/generate.go index 08c2e373c0..05c2ecb971 100644 --- a/gen/generate.go +++ b/gen/generate.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -243,6 +243,9 @@ func generateGenesisFiles(outDir string, protoVersion protocol.ConsensusVersion, errorsChannel <- err return } + if verbose { + verbosedOutput <- fmt.Sprintf("Generating %s's keys for a period of %d rounds", wallet.Name, basics.Round(lastWalletValid).SubSaturate(basics.Round(firstWalletValid))) + } part, err = account.FillDBWithParticipationKeys(partDB, root.Address(), basics.Round(firstWalletValid), basics.Round(lastWalletValid), partKeyDilution) if err != nil { @@ -252,7 +255,7 @@ func generateGenesisFiles(outDir string, protoVersion protocol.ConsensusVersion, return } if verbose { - verbosedOutput <- fmt.Sprintf("Created new partkey: %s", pfilename) + verbosedOutput <- fmt.Sprintf("participation key generation for %s completed successfully", wallet.Name) } atomic.AddInt64(&partKeyCreated, 1) } @@ -267,6 +270,9 @@ func generateGenesisFiles(outDir string, protoVersion protocol.ConsensusVersion, data.VoteFirstValid = part.FirstValid data.VoteLastValid = part.LastValid data.VoteKeyDilution = part.KeyDilution + if protoParams.EnableStateProofKeyregCheck { + data.StateProofID = *part.StateProofVerifier() + } } writeMu.Lock() @@ -368,8 +374,9 @@ func generateGenesisFiles(outDir string, protoVersion protocol.ConsensusVersion, jsonData := protocol.EncodeJSON(g) err = ioutil.WriteFile(filepath.Join(outDir, config.GenesisJSONFile), append(jsonData, '\n'), 0666) - if (!verbose) && (rootKeyCreated > 0 || partKeyCreated > 0) { + if (verbose) && (rootKeyCreated > 0 || partKeyCreated > 0) { fmt.Printf("Created %d new rootkeys and %d new partkeys.\n", rootKeyCreated, partKeyCreated) + fmt.Printf("NOTICE: Participation keys are valid for a period of %d rounds. After this many rounds the network will stall unless new keys are registered.\n", lastWalletValid-firstWalletValid) } return diff --git a/gen/generate_test.go b/gen/generate_test.go index 8b1c90e437..0d377a2b64 100644 --- a/gen/generate_test.go +++ b/gen/generate_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/gen/walletData.go b/gen/walletData.go index 15cfd1f1d1..95c508c271 100644 --- a/gen/walletData.go +++ b/gen/walletData.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/go.mod b/go.mod index 00a9719d63..8db89a7b8b 100644 --- a/go.mod +++ b/go.mod @@ -3,13 +3,14 @@ module github.com/algorand/go-algorand go 1.14 require ( + github.com/algorand/falcon v0.0.0-20220130164023-c9e1d466f123 github.com/algorand/go-codec/codec v0.0.0-20190507210007-269d70b6135d github.com/algorand/go-deadlock v0.2.1 + github.com/algorand/go-sumhash v0.1.0 github.com/algorand/graphtrace v0.0.0-20201117160756-e524ed1a6f64 - github.com/algorand/msgp v1.1.48 + github.com/algorand/msgp v1.1.49 github.com/algorand/oapi-codegen v1.3.5-algorand5 github.com/algorand/websocket v1.4.4 - github.com/algorand/xorfilter v0.2.0 github.com/aws/aws-sdk-go v1.16.5 github.com/chrismcguire/gobberish v0.0.0-20150821175641-1d8adb509a0e github.com/cpuguy83/go-md2man v1.0.8 // indirect @@ -42,9 +43,8 @@ require ( github.com/sirupsen/logrus v1.4.2 github.com/spf13/cobra v0.0.3 github.com/spf13/pflag v1.0.5 // indirect - github.com/stretchr/testify v1.6.1 - golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a - golang.org/x/net v0.0.0-20200904194848-62affa334b73 + github.com/stretchr/testify v1.7.0 + golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 // indirect golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c google.golang.org/appengine v1.6.7 // indirect diff --git a/go.sum b/go.sum index 0ac28a9455..92f339d4f0 100644 --- a/go.sum +++ b/go.sum @@ -1,19 +1,21 @@ +github.com/algorand/falcon v0.0.0-20220130164023-c9e1d466f123 h1:cnUjJ/iqUjJNbhUzgmxbfwHMVFnz+DLnNQx8uJcGaks= +github.com/algorand/falcon v0.0.0-20220130164023-c9e1d466f123/go.mod h1:OkQyHlGvS0kLNcIWbC21/uQcnbfwSOQm+wiqWwBG9pQ= github.com/algorand/go-codec v1.1.2 h1:QWS9YC3EEWBpJq5AqFPELcCJ2QPpTIg9aqR2K/sRDq4= github.com/algorand/go-codec v1.1.2/go.mod h1:A3YI4V24jUUnU1eNekNmx2fLi60FvlNssqOiUsyfNM8= github.com/algorand/go-codec/codec v0.0.0-20190507210007-269d70b6135d h1:W9MgGUodEl4Y4+CxeEr+T3fZ26kOcWA4yfqhjbFxxmI= github.com/algorand/go-codec/codec v0.0.0-20190507210007-269d70b6135d/go.mod h1:qm6LyXvDa1+uZJxaVg8X+OEjBqt/zDinDa2EohtTDxU= github.com/algorand/go-deadlock v0.2.1 h1:TQPQwWAB133bS5uwHpmrgH5hCMyZK5hnUW26aqWMvq4= github.com/algorand/go-deadlock v0.2.1/go.mod h1:HgdF2cwtBIBCL7qmUaozuG/UIZFR6PLpSMR58pvWiXE= +github.com/algorand/go-sumhash v0.1.0 h1:b/QRhyLuF//vOcicBIxBXYW8bERNoeLxieht/dUYpVg= +github.com/algorand/go-sumhash v0.1.0/go.mod h1:OOe7jdDWUhLkuP1XytkK5gnLu9entAviN5DfDZh6XAc= github.com/algorand/graphtrace v0.0.0-20201117160756-e524ed1a6f64 h1:yvKeJdS/mvLRiyIxu8j5BQDXIzs1XbC9/22KycJnt3A= github.com/algorand/graphtrace v0.0.0-20201117160756-e524ed1a6f64/go.mod h1:qFtQmC+kmsfnLfS9j3xgKtzsWyozemL5ek1R4dWZa5c= -github.com/algorand/msgp v1.1.48 h1:5P+gVmTnk0m37r+rA3ZsFZW219ZqmCLulW5f8Z+3nx8= -github.com/algorand/msgp v1.1.48/go.mod h1:LtOntbYiCHj/Sl/Sqxtf8CZOrDt2a8Dv3tLaS6mcnUE= +github.com/algorand/msgp v1.1.49 h1:YBFRcYZNsD2WgzXONvzFrjv1/887pWzJSx874VL4P6g= +github.com/algorand/msgp v1.1.49/go.mod h1:oyDY2SIeM1bytVYJTL88nt9kVeEBC00Avyqcnyrq/ec= github.com/algorand/oapi-codegen v1.3.5-algorand5 h1:y576Ca2/guQddQrQA7dtL5KcOx5xQgPeIupiuFMGyCI= github.com/algorand/oapi-codegen v1.3.5-algorand5/go.mod h1:/k0Ywn0lnt92uBMyE+yiRf/Wo3/chxHHsAfenD09EbY= github.com/algorand/websocket v1.4.4 h1:BL9atWs/7tkV73NCwiLZ5YqDENMBsSxozc5gDtPdsQ4= github.com/algorand/websocket v1.4.4/go.mod h1:0nFSn+xppw/GZS9hgWPS3b8/4FcA3Pj7XQxm+wqHGx8= -github.com/algorand/xorfilter v0.2.0 h1:YC31ANxdZ2jmtbwqv1+USskVSqjkeiRZcQGc6//ro9Q= -github.com/algorand/xorfilter v0.2.0/go.mod h1:f5cJsYrFbJhXkbjnV4odJB44np05/PvwvdBnABnQoUs= github.com/aws/aws-sdk-go v1.16.5 h1:NVxzZXIuwX828VcJrpNxxWjur1tlOBISdMdDdHIKHcc= github.com/aws/aws-sdk-go v1.16.5/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/chrismcguire/gobberish v0.0.0-20150821175641-1d8adb509a0e h1:CHPYEbz71w8DqJ7DRIq+MXyCQsdibK08vdcQTY4ufas= @@ -64,8 +66,6 @@ github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8 github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2 h1:Pgr17XVTNXAk3q/r4CpKzC5xBM/qW1uVLV+IhRZpIIk= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/schema v1.0.2 h1:sAgNfOcNYvdDSrzGHVy9nzCQahG+qmsg+nE8dK85QRA= -github.com/gorilla/schema v1.0.2/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= @@ -118,7 +118,6 @@ github.com/olivere/elastic v6.2.14+incompatible h1:k+KadwNP/dkXE0/eu+T6otk1+5fe0 github.com/olivere/elastic v6.2.14+incompatible/go.mod h1:J+q1zQJTgAz9woqsbVRqGeB5G1iqDKVBWLNSYW8yfJ8= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= -github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -140,9 +139,8 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31 h1:OXcKh35JaYsGMRzpvFkLv/MEyPuL49CThT1pZ8aSml4= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= @@ -157,8 +155,9 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -169,8 +168,8 @@ golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200904194848-62affa334b73 h1:MXfv8rhZWmFeqX3GNZRsd6vOLoaCHjYEX3qkRo3YBUA= -golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA= @@ -186,10 +185,12 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f h1:Fqb3ao1hUmOR3GkUOg/Y+BadLwykBIzs5q8Ez2SbHyc= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -197,7 +198,6 @@ golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200423205358-59e73619c742 h1:9OGWpORUXvk8AsaBJlpzzDx7Srv/rSK6rvjcsJq4rJo= golang.org/x/tools v0.0.0-20200423205358-59e73619c742/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= diff --git a/installer/config.json.example b/installer/config.json.example index fac1122017..17cbfd974f 100644 --- a/installer/config.json.example +++ b/installer/config.json.example @@ -1,5 +1,5 @@ { - "Version": 19, + "Version": 20, "AccountUpdatesStatsInterval": 5000000000, "AccountsRebuildSynchronousMode": 1, "AnnounceParticipationKey": true, @@ -23,6 +23,7 @@ "DNSBootstrapID": ".algorand.network", "DNSSecurityFlags": 1, "DeadlockDetection": 0, + "DeadlockDetectionThreshold": 30, "DisableLocalhostConnectionRateLimit": true, "DisableNetworking": false, "DisableOutgoingConnectionThrottling": false, @@ -77,6 +78,8 @@ "PublicAddress": "", "ReconnectTime": 60000000000, "ReservedFDs": 256, + "RestConnectionsHardLimit": 2048, + "RestConnectionsSoftLimit": 1024, "RestReadTimeoutSeconds": 15, "RestWriteTimeoutSeconds": 120, "RunHosted": false, diff --git a/ledger/README.md b/ledger/README.md index 37d6baed72..ca203664c0 100644 --- a/ledger/README.md +++ b/ledger/README.md @@ -46,7 +46,7 @@ all blocks from the beginning of the blockchain. As an optimization, the ledger allows trackers to store persistent state, so that they can reconstruct their state quickly, without considering every block. -The interface between ledger and trackers is defined in `trackers.go`. +The interface between ledger and trackers is defined in `tracker.go`. Trackers have access to the ledger through a restricted API defined by `ledgerForTracker`. This allows trackers to access the ledger's SQLite diff --git a/ledger/accountdb.go b/ledger/accountdb.go index 2b12b42c2f..8dc6e89bfb 100644 --- a/ledger/accountdb.go +++ b/ledger/accountdb.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -688,10 +688,9 @@ func accountDataToOnline(address basics.Address, ad *basics.AccountData, proto c MicroAlgos: ad.MicroAlgos, RewardsBase: ad.RewardsBase, NormalizedOnlineBalance: ad.NormalizedOnlineBalance(proto), - VoteID: ad.VoteID, VoteFirstValid: ad.VoteFirstValid, VoteLastValid: ad.VoteLastValid, - VoteKeyDilution: ad.VoteKeyDilution, + StateProofID: ad.StateProofID, } } @@ -1228,7 +1227,7 @@ func updateAccountsHashRound(tx *sql.Tx, hashRound basics.Round) (err error) { } if aff != 1 { - err = fmt.Errorf("updateAccountsRound(hashbase,%d): expected to update 1 row but got %d", hashRound, aff) + err = fmt.Errorf("updateAccountsHashRound(hashbase,%d): expected to update 1 row but got %d", hashRound, aff) return } return diff --git a/ledger/accountdb_test.go b/ledger/accountdb_test.go index ab64fe48ff..4f4c8a6f66 100644 --- a/ledger/accountdb_test.go +++ b/ledger/accountdb_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -81,11 +81,11 @@ func checkAccounts(t *testing.T, tx *sql.Tx, rnd basics.Round, accts map[basics. totals, err := accountsTotals(tx, false) require.NoError(t, err) - require.Equal(t, totals.Online.Money.Raw, totalOnline, "mismatching total online money") - require.Equal(t, totals.Offline.Money.Raw, totalOffline) - require.Equal(t, totals.NotParticipating.Money.Raw, totalNotPart) - require.Equal(t, totals.Participating().Raw, totalOnline+totalOffline) - require.Equal(t, totals.All().Raw, totalOnline+totalOffline+totalNotPart) + require.Equal(t, totalOnline, totals.Online.Money.Raw, "mismatching total online money") + require.Equal(t, totalOffline, totals.Offline.Money.Raw) + require.Equal(t, totalNotPart, totals.NotParticipating.Money.Raw) + require.Equal(t, totalOnline+totalOffline, totals.Participating().Raw) + require.Equal(t, totalOnline+totalOffline+totalNotPart, totals.All().Raw) d, err := aq.lookup(ledgertesting.RandomAddress()) require.NoError(t, err) @@ -289,6 +289,35 @@ func TestAccountDBRound(t *testing.T) { require.Equal(t, expectedTotals, actualTotals) } +func TestAccountStorageWithStateProofID(t *testing.T) { + partitiontest.PartitionTest(t) + + proto := config.Consensus[protocol.ConsensusCurrentVersion] + + dbs, _ := dbOpenTest(t, true) + setDbLogging(t, dbs) + defer dbs.Close() + + tx, err := dbs.Wdb.Handle.Begin() + require.NoError(t, err) + defer tx.Rollback() + + accts := ledgertesting.RandomAccounts(20, false) + _, err = accountsInit(tx, accts, proto) + require.NoError(t, err) + checkAccounts(t, tx, 0, accts) + require.True(t, allAccountsHaveStateProofPKs(accts)) +} + +func allAccountsHaveStateProofPKs(accts map[basics.Address]basics.AccountData) bool { + for _, data := range accts { + if data.StateProofID.IsEmpty() { + return false + } + } + return true +} + // checkCreatables compares the expected database image to the actual databse content func checkCreatables(t *testing.T, tx *sql.Tx, iteration int, @@ -496,7 +525,7 @@ func benchmarkReadingAllBalances(b *testing.B, inMemory bool) { prevHash := crypto.Digest{} for _, accountBalance := range bal { encodedAccountBalance := protocol.Encode(&accountBalance) - prevHash = crypto.Hash(append(encodedAccountBalance, ([]byte(prevHash[:]))...)) + prevHash = crypto.Hash(append(encodedAccountBalance, []byte(prevHash[:])...)) } require.Equal(b, b.N, len(bal)) } diff --git a/ledger/acctupdates.go b/ledger/acctupdates.go index fa15375137..c1529e2a71 100644 --- a/ledger/acctupdates.go +++ b/ledger/acctupdates.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -624,6 +624,11 @@ func (aul *accountUpdatesLedgerEvaluator) GenesisHash() crypto.Digest { return aul.au.ledger.GenesisHash() } +// GenesisProto returns the genesis consensus params +func (aul *accountUpdatesLedgerEvaluator) GenesisProto() config.ConsensusParams { + return aul.au.ledger.GenesisProto() +} + // CompactCertVoters returns the top online accounts at round rnd. func (aul *accountUpdatesLedgerEvaluator) CompactCertVoters(rnd basics.Round) (voters *ledgercore.VotersForRound, err error) { return aul.au.voters.getVoters(rnd) diff --git a/ledger/acctupdates_test.go b/ledger/acctupdates_test.go index 27306af539..da6634a0cd 100644 --- a/ledger/acctupdates_test.go +++ b/ledger/acctupdates_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -75,12 +75,10 @@ func accumulateTotals(t testing.TB, consensusVersion protocol.ConsensusVersion, return } -func makeMockLedgerForTracker(t testing.TB, inMemory bool, initialBlocksCount int, consensusVersion protocol.ConsensusVersion, accts []map[basics.Address]basics.AccountData) *mockLedgerForTracker { +func makeMockLedgerForTrackerWithLogger(t testing.TB, inMemory bool, initialBlocksCount int, consensusVersion protocol.ConsensusVersion, accts []map[basics.Address]basics.AccountData, l logging.Logger) *mockLedgerForTracker { dbs, fileName := dbOpenTest(t, inMemory) - dblogger := logging.TestingLog(t) - dblogger.SetLevel(logging.Info) - dbs.Rdb.SetLogger(dblogger) - dbs.Wdb.SetLogger(dblogger) + dbs.Rdb.SetLogger(l) + dbs.Wdb.SetLogger(l) blocks := randomInitChain(consensusVersion, initialBlocksCount) deltas := make([]ledgercore.StateDelta, initialBlocksCount) @@ -92,7 +90,15 @@ func makeMockLedgerForTracker(t testing.TB, inMemory bool, initialBlocksCount in } } consensusParams := config.Consensus[consensusVersion] - return &mockLedgerForTracker{dbs: dbs, log: dblogger, filename: fileName, inMemory: inMemory, blocks: blocks, deltas: deltas, consensusParams: consensusParams, accts: accts[0]} + return &mockLedgerForTracker{dbs: dbs, log: l, filename: fileName, inMemory: inMemory, blocks: blocks, deltas: deltas, consensusParams: consensusParams, accts: accts[0]} + +} + +func makeMockLedgerForTracker(t testing.TB, inMemory bool, initialBlocksCount int, consensusVersion protocol.ConsensusVersion, accts []map[basics.Address]basics.AccountData) *mockLedgerForTracker { + dblogger := logging.TestingLog(t) + dblogger.SetLevel(logging.Info) + + return makeMockLedgerForTrackerWithLogger(t, inMemory, initialBlocksCount, consensusVersion, accts, dblogger) } // fork creates another database which has the same content as the current one. Works only for non-memory databases. @@ -412,6 +418,8 @@ func TestAcctUpdates(t *testing.T) { newPool.MicroAlgos.Raw -= prevTotals.RewardUnits() * rewardLevelDelta updates.Upsert(testPoolAddr, newPool) totals[testPoolAddr] = newPool + curTotals := accumulateTotals(t, protocol.ConsensusCurrentVersion, []map[basics.Address]basics.AccountData{totals}, rewardLevel) + require.Equal(t, prevTotals.All(), curTotals.All()) blk := bookkeeping.Block{ BlockHeader: bookkeeping.BlockHeader{ @@ -424,7 +432,7 @@ func TestAcctUpdates(t *testing.T) { delta := ledgercore.MakeStateDelta(&blk.BlockHeader, 0, updates.Len(), 0) delta.Accts.MergeAccounts(updates) delta.Creatables = creatablesFromUpdates(base, updates, knownCreatables) - delta.Totals = accumulateTotals(t, protocol.ConsensusCurrentVersion, []map[basics.Address]basics.AccountData{totals}, rewardLevel) + delta.Totals = curTotals au.newBlock(blk, delta) accts = append(accts, totals) rewardsLevels = append(rewardsLevels, rewardLevel) @@ -515,6 +523,8 @@ func TestAcctUpdatesFastUpdates(t *testing.T) { newPool.MicroAlgos.Raw -= prevTotals.RewardUnits() * rewardLevelDelta updates.Upsert(testPoolAddr, newPool) totals[testPoolAddr] = newPool + curTotals := accumulateTotals(t, protocol.ConsensusCurrentVersion, []map[basics.Address]basics.AccountData{totals}, rewardLevel) + require.Equal(t, prevTotals.All(), curTotals.All()) blk := bookkeeping.Block{ BlockHeader: bookkeeping.BlockHeader{ @@ -526,6 +536,7 @@ func TestAcctUpdatesFastUpdates(t *testing.T) { delta := ledgercore.MakeStateDelta(&blk.BlockHeader, 0, updates.Len(), 0) delta.Accts.MergeAccounts(updates) + delta.Totals = curTotals au.newBlock(blk, delta) accts = append(accts, totals) rewardsLevels = append(rewardsLevels, rewardLevel) @@ -602,6 +613,8 @@ func BenchmarkBalancesChanges(b *testing.B) { newPool.MicroAlgos.Raw -= prevTotals.RewardUnits() * rewardLevelDelta updates.Upsert(testPoolAddr, newPool) totals[testPoolAddr] = newPool + curTotals := accumulateTotals(b, protocol.ConsensusCurrentVersion, []map[basics.Address]basics.AccountData{totals}, rewardLevel) + require.Equal(b, prevTotals.All(), curTotals.All()) blk := bookkeeping.Block{ BlockHeader: bookkeeping.BlockHeader{ @@ -613,6 +626,7 @@ func BenchmarkBalancesChanges(b *testing.B) { delta := ledgercore.MakeStateDelta(&blk.BlockHeader, 0, updates.Len(), 0) delta.Accts.MergeAccounts(updates) + delta.Totals = curTotals au.newBlock(blk, delta) accts = append(accts, totals) rewardsLevels = append(rewardsLevels, rewardLevel) @@ -636,7 +650,7 @@ func BenchmarkBalancesChanges(b *testing.B) { return } // we want to fake the N to reflect the time it took us, if we were to wait an entire second. - singleIterationTime := deltaTime / time.Duration((uint64(b.N) - initialRounds)) + singleIterationTime := deltaTime / time.Duration(uint64(b.N)-initialRounds) b.N = int(time.Second / singleIterationTime) // and now, wait for the reminder of the second. time.Sleep(time.Second - deltaTime) @@ -676,6 +690,11 @@ func TestLargeAccountCountCatchpointGeneration(t *testing.T) { if runtime.GOARCH == "arm" || runtime.GOARCH == "arm64" { t.Skip("This test is too slow on ARM and causes travis builds to time out") } + + // The next operations are heavy on the memory. + // Garbage collection helps prevent trashing + runtime.GC() + // create new protocol version, which has lower lookback testProtocolVersion := protocol.ConsensusVersion("test-protocol-TestLargeAccountCountCatchpointGeneration") protoParams := config.Consensus[protocol.ConsensusCurrentVersion] @@ -729,6 +748,8 @@ func TestLargeAccountCountCatchpointGeneration(t *testing.T) { newPool.MicroAlgos.Raw -= prevTotals.RewardUnits() * rewardLevelDelta updates.Upsert(testPoolAddr, newPool) totals[testPoolAddr] = newPool + curTotals := accumulateTotals(t, protocol.ConsensusCurrentVersion, []map[basics.Address]basics.AccountData{totals}, rewardLevel) + require.Equal(t, prevTotals.All(), curTotals.All()) blk := bookkeeping.Block{ BlockHeader: bookkeeping.BlockHeader{ @@ -740,6 +761,7 @@ func TestLargeAccountCountCatchpointGeneration(t *testing.T) { delta := ledgercore.MakeStateDelta(&blk.BlockHeader, 0, updates.Len(), 0) delta.Accts.MergeAccounts(updates) + delta.Totals = curTotals au.newBlock(blk, delta) accts = append(accts, totals) rewardsLevels = append(rewardsLevels, rewardLevel) @@ -749,6 +771,9 @@ func TestLargeAccountCountCatchpointGeneration(t *testing.T) { ml.trackers.waitAccountsWriting() } } + + // Garbage collection helps prevent trashing for next tests + runtime.GC() } // The TestAcctUpdatesUpdatesCorrectness conduct a correctless test for the accounts update in the following way - @@ -1288,10 +1313,14 @@ func TestCompactDeltas(t *testing.T) { } -// TestCachesInitialization test the functionality of the initializeCaches cache. -func TestCachesInitialization(t *testing.T) { +// TestAcctUpdatesCachesInitialization test the functionality of the initializeCaches cache. +func TestAcctUpdatesCachesInitialization(t *testing.T) { partitiontest.PartitionTest(t) + // The next operations are heavy on the memory. + // Garbage collection helps prevent trashing + runtime.GC() + protocolVersion := protocol.ConsensusCurrentVersion proto := config.Consensus[protocolVersion] @@ -1340,6 +1369,8 @@ func TestCachesInitialization(t *testing.T) { newPool.MicroAlgos.Raw -= prevTotals.RewardUnits() * rewardLevelDelta updates.Upsert(testPoolAddr, newPool) totals[testPoolAddr] = newPool + curTotals := accumulateTotals(t, protocol.ConsensusCurrentVersion, []map[basics.Address]basics.AccountData{totals}, rewardLevel) + require.Equal(t, prevTotals.All(), curTotals.All()) blk := bookkeeping.Block{ BlockHeader: bookkeeping.BlockHeader{ @@ -1351,7 +1382,7 @@ func TestCachesInitialization(t *testing.T) { delta := ledgercore.MakeStateDelta(&blk.BlockHeader, 0, updates.Len(), 0) delta.Accts.MergeAccounts(updates) - delta.Totals = accumulateTotals(t, protocol.ConsensusCurrentVersion, []map[basics.Address]basics.AccountData{totals}, rewardLevel) + delta.Totals = curTotals ml.addMockBlock(blockEntry{block: blk}, delta) au.newBlock(blk, delta) ml.trackers.committedUpTo(basics.Round(i)) @@ -1380,10 +1411,13 @@ func TestCachesInitialization(t *testing.T) { // make sure the deltas array end up containing only the most recent 320 rounds. require.Equal(t, int(proto.MaxBalLookback), len(au.deltas)) require.Equal(t, recoveredLedgerRound-basics.Round(proto.MaxBalLookback), au.cachedDBRound) + + // Garbage collection helps prevent trashing for next tests + runtime.GC() } -// TestSplittingConsensusVersionCommits tests the a sequence of commits that spans over multiple consensus versions works correctly. -func TestSplittingConsensusVersionCommits(t *testing.T) { +// TestAcctUpdatesSplittingConsensusVersionCommits tests the a sequence of commits that spans over multiple consensus versions works correctly. +func TestAcctUpdatesSplittingConsensusVersionCommits(t *testing.T) { partitiontest.PartitionTest(t) initProtocolVersion := protocol.ConsensusV20 @@ -1439,6 +1473,8 @@ func TestSplittingConsensusVersionCommits(t *testing.T) { newPool.MicroAlgos.Raw -= prevTotals.RewardUnits() * rewardLevelDelta updates.Upsert(testPoolAddr, newPool) totals[testPoolAddr] = newPool + curTotals := accumulateTotals(t, protocol.ConsensusCurrentVersion, []map[basics.Address]basics.AccountData{totals}, rewardLevel) + require.Equal(t, prevTotals.All(), curTotals.All()) blk := bookkeeping.Block{ BlockHeader: bookkeeping.BlockHeader{ @@ -1450,7 +1486,7 @@ func TestSplittingConsensusVersionCommits(t *testing.T) { delta := ledgercore.MakeStateDelta(&blk.BlockHeader, 0, updates.Len(), 0) delta.Accts.MergeAccounts(updates) - delta.Totals = accumulateTotals(t, protocol.ConsensusCurrentVersion, []map[basics.Address]basics.AccountData{totals}, rewardLevel) + delta.Totals = curTotals ml.addMockBlock(blockEntry{block: blk}, delta) au.newBlock(blk, delta) accts = append(accts, totals) @@ -1474,6 +1510,8 @@ func TestSplittingConsensusVersionCommits(t *testing.T) { newPool.MicroAlgos.Raw -= prevTotals.RewardUnits() * rewardLevelDelta updates.Upsert(testPoolAddr, newPool) totals[testPoolAddr] = newPool + curTotals := accumulateTotals(t, protocol.ConsensusCurrentVersion, []map[basics.Address]basics.AccountData{totals}, rewardLevel) + require.Equal(t, prevTotals.All(), curTotals.All()) blk := bookkeeping.Block{ BlockHeader: bookkeeping.BlockHeader{ @@ -1485,7 +1523,7 @@ func TestSplittingConsensusVersionCommits(t *testing.T) { delta := ledgercore.MakeStateDelta(&blk.BlockHeader, 0, updates.Len(), 0) delta.Accts.MergeAccounts(updates) - delta.Totals = accumulateTotals(t, protocol.ConsensusCurrentVersion, []map[basics.Address]basics.AccountData{totals}, rewardLevel) + delta.Totals = curTotals ml.addMockBlock(blockEntry{block: blk}, delta) au.newBlock(blk, delta) accts = append(accts, totals) @@ -1498,9 +1536,9 @@ func TestSplittingConsensusVersionCommits(t *testing.T) { } -// TestSplittingConsensusVersionCommitsBoundry tests the a sequence of commits that spans over multiple consensus versions works correctly, and -// in particular, complements TestSplittingConsensusVersionCommits by testing the commit boundary. -func TestSplittingConsensusVersionCommitsBoundry(t *testing.T) { +// TestAcctUpdatesSplittingConsensusVersionCommitsBoundry tests the a sequence of commits that spans over multiple consensus versions works correctly, and +// in particular, complements TestAcctUpdatesSplittingConsensusVersionCommits by testing the commit boundary. +func TestAcctUpdatesSplittingConsensusVersionCommitsBoundry(t *testing.T) { partitiontest.PartitionTest(t) initProtocolVersion := protocol.ConsensusV20 @@ -1556,6 +1594,8 @@ func TestSplittingConsensusVersionCommitsBoundry(t *testing.T) { newPool.MicroAlgos.Raw -= prevTotals.RewardUnits() * rewardLevelDelta updates.Upsert(testPoolAddr, newPool) totals[testPoolAddr] = newPool + curTotals := accumulateTotals(t, protocol.ConsensusCurrentVersion, []map[basics.Address]basics.AccountData{totals}, rewardLevel) + require.Equal(t, prevTotals.All(), curTotals.All()) blk := bookkeeping.Block{ BlockHeader: bookkeeping.BlockHeader{ @@ -1567,7 +1607,7 @@ func TestSplittingConsensusVersionCommitsBoundry(t *testing.T) { delta := ledgercore.MakeStateDelta(&blk.BlockHeader, 0, updates.Len(), 0) delta.Accts.MergeAccounts(updates) - delta.Totals = accumulateTotals(t, protocol.ConsensusCurrentVersion, []map[basics.Address]basics.AccountData{totals}, rewardLevel) + delta.Totals = curTotals ml.addMockBlock(blockEntry{block: blk}, delta) au.newBlock(blk, delta) accts = append(accts, totals) @@ -1590,6 +1630,8 @@ func TestSplittingConsensusVersionCommitsBoundry(t *testing.T) { newPool.MicroAlgos.Raw -= prevTotals.RewardUnits() * rewardLevelDelta updates.Upsert(testPoolAddr, newPool) totals[testPoolAddr] = newPool + curTotals := accumulateTotals(t, protocol.ConsensusCurrentVersion, []map[basics.Address]basics.AccountData{totals}, rewardLevel) + require.Equal(t, prevTotals.All(), curTotals.All()) blk := bookkeeping.Block{ BlockHeader: bookkeeping.BlockHeader{ @@ -1601,7 +1643,7 @@ func TestSplittingConsensusVersionCommitsBoundry(t *testing.T) { delta := ledgercore.MakeStateDelta(&blk.BlockHeader, 0, updates.Len(), 0) delta.Accts.MergeAccounts(updates) - delta.Totals = accumulateTotals(t, protocol.ConsensusCurrentVersion, []map[basics.Address]basics.AccountData{totals}, rewardLevel) + delta.Totals = curTotals ml.addMockBlock(blockEntry{block: blk}, delta) au.newBlock(blk, delta) accts = append(accts, totals) @@ -1626,6 +1668,8 @@ func TestSplittingConsensusVersionCommitsBoundry(t *testing.T) { newPool.MicroAlgos.Raw -= prevTotals.RewardUnits() * rewardLevelDelta updates.Upsert(testPoolAddr, newPool) totals[testPoolAddr] = newPool + curTotals := accumulateTotals(t, protocol.ConsensusCurrentVersion, []map[basics.Address]basics.AccountData{totals}, rewardLevel) + require.Equal(t, prevTotals.All(), curTotals.All()) blk := bookkeeping.Block{ BlockHeader: bookkeeping.BlockHeader{ @@ -1637,7 +1681,7 @@ func TestSplittingConsensusVersionCommitsBoundry(t *testing.T) { delta := ledgercore.MakeStateDelta(&blk.BlockHeader, 0, updates.Len(), 0) delta.Accts.MergeAccounts(updates) - delta.Totals = accumulateTotals(t, protocol.ConsensusCurrentVersion, []map[basics.Address]basics.AccountData{totals}, rewardLevel) + delta.Totals = curTotals ml.addMockBlock(blockEntry{block: blk}, delta) au.newBlock(blk, delta) accts = append(accts, totals) @@ -1677,3 +1721,158 @@ func TestConsecutiveVersion(t *testing.T) { protocol.ConsensusV21, } } + +// This test attempts to cover the case when an accountUpdates.lookupX method: +// - can't find the requested address, +// - falls through looking at deltas and the LRU accounts cache, +// - then hits the database (calling accountsDbQueries.lookup) +// only to discover that the round stored in the database (committed in accountUpdates.commitRound) +// is out of sync with accountUpdates.cachedDBRound (updated a little bit later in accountUpdates.postCommit). +// +// In this case it waits on a condition variable and retries when +// commitSyncer/accountUpdates has advanced the cachedDBRound. +func TestAcctUpdatesLookupRetry(t *testing.T) { + partitiontest.PartitionTest(t) + + testProtocolVersion := protocol.ConsensusVersion("test-protocol-TestAcctUpdatesLookupRetry") + proto := config.Consensus[protocol.ConsensusCurrentVersion] + proto.MaxBalLookback = 10 + config.Consensus[testProtocolVersion] = proto + defer func() { + delete(config.Consensus, testProtocolVersion) + }() + + accts := []map[basics.Address]basics.AccountData{ledgertesting.RandomAccounts(20, true)} + rewardsLevels := []uint64{0} + + pooldata := basics.AccountData{} + pooldata.MicroAlgos.Raw = 1000 * 1000 * 1000 * 1000 + pooldata.Status = basics.NotParticipating + accts[0][testPoolAddr] = pooldata + + sinkdata := basics.AccountData{} + sinkdata.MicroAlgos.Raw = 1000 * 1000 * 1000 * 1000 + sinkdata.Status = basics.NotParticipating + accts[0][testSinkAddr] = sinkdata + + ml := makeMockLedgerForTracker(t, true, 10, testProtocolVersion, accts) + defer ml.Close() + + conf := config.GetDefaultLocal() + au := newAcctUpdates(t, ml, conf, ".") + defer au.close() + + // cover 10 genesis blocks + rewardLevel := uint64(0) + for i := 1; i < 10; i++ { + accts = append(accts, accts[0]) + rewardsLevels = append(rewardsLevels, rewardLevel) + } + + checkAcctUpdates(t, au, 0, 9, accts, rewardsLevels, proto) + + // lastCreatableID stores asset or app max used index to get rid of conflicts + lastCreatableID := crypto.RandUint64() % 512 + knownCreatables := make(map[basics.CreatableIndex]bool) + + for i := basics.Round(10); i < basics.Round(proto.MaxBalLookback+15); i++ { + rewardLevelDelta := crypto.RandUint64() % 5 + rewardLevel += rewardLevelDelta + var updates ledgercore.AccountDeltas + var totals map[basics.Address]basics.AccountData + base := accts[i-1] + updates, totals, lastCreatableID = ledgertesting.RandomDeltasBalancedFull(1, base, rewardLevel, lastCreatableID) + prevTotals, err := au.Totals(basics.Round(i - 1)) + require.NoError(t, err) + + newPool := totals[testPoolAddr] + newPool.MicroAlgos.Raw -= prevTotals.RewardUnits() * rewardLevelDelta + updates.Upsert(testPoolAddr, newPool) + totals[testPoolAddr] = newPool + + blk := bookkeeping.Block{ + BlockHeader: bookkeeping.BlockHeader{ + Round: basics.Round(i), + }, + } + blk.RewardsLevel = rewardLevel + blk.CurrentProtocol = testProtocolVersion + + delta := ledgercore.MakeStateDelta(&blk.BlockHeader, 0, updates.Len(), 0) + delta.Accts.MergeAccounts(updates) + delta.Creatables = creatablesFromUpdates(base, updates, knownCreatables) + delta.Totals = accumulateTotals(t, testProtocolVersion, []map[basics.Address]basics.AccountData{totals}, rewardLevel) + au.newBlock(blk, delta) + accts = append(accts, totals) + rewardsLevels = append(rewardsLevels, rewardLevel) + + checkAcctUpdates(t, au, 0, i, accts, rewardsLevels, proto) + } + + flushRound := func(i basics.Round) { + // Clear the timer to ensure a flush + ml.trackers.lastFlushTime = time.Time{} + + ml.trackers.committedUpTo(basics.Round(proto.MaxBalLookback) + i) + ml.trackers.waitAccountsWriting() + } + + // flush a couple of rounds (indirectly schedules commitSyncer) + flushRound(basics.Round(0)) + flushRound(basics.Round(1)) + + // add stallingTracker to list of trackers + stallingTracker := &blockingTracker{ + postCommitUnlockedEntryLock: make(chan struct{}), + postCommitUnlockedReleaseLock: make(chan struct{}), + postCommitEntryLock: make(chan struct{}), + postCommitReleaseLock: make(chan struct{}), + alwaysLock: true, + } + ml.trackers.trackers = append([]ledgerTracker{stallingTracker}, ml.trackers.trackers...) + + // kick off another round + go flushRound(basics.Round(2)) + + // let stallingTracker enter postCommit() and block (waiting on postCommitReleaseLock) + // this will prevent accountUpdates.postCommit() from updating au.cachedDBRound = newBase + <-stallingTracker.postCommitEntryLock + + // prune the baseAccounts cache, so that lookup will fall through to the DB + au.accountsMu.Lock() + au.baseAccounts.prune(0) + au.accountsMu.Unlock() + + rnd := basics.Round(2) + + // grab any address and data to use for call to lookup + var addr basics.Address + var data basics.AccountData + for a, d := range accts[rnd] { + addr = a + data = d + break + } + + defer func() { // allow the postCommitUnlocked() handler to go through, even if test fails + <-stallingTracker.postCommitUnlockedEntryLock + stallingTracker.postCommitUnlockedReleaseLock <- struct{}{} + }() + + // issue a LookupWithoutRewards while persistedData.round != au.cachedDBRound + // when synchronized=false it will fail fast + d, validThrough, err := au.lookupWithoutRewards(rnd, addr, false) + require.Equal(t, err, &MismatchingDatabaseRoundError{databaseRound: 2, memoryRound: 1}) + + // release the postCommit lock, once au.lookupWithoutRewards() hits au.accountsReadCond.Wait() + go func() { + time.Sleep(200 * time.Millisecond) + stallingTracker.postCommitReleaseLock <- struct{}{} + }() + + // when synchronized=true it will wait until above goroutine releases postCommitReleaseLock + d, validThrough, err = au.lookupWithoutRewards(rnd, addr, true) + require.NoError(t, err) + require.Equal(t, d, data) + require.GreaterOrEqualf(t, uint64(validThrough), uint64(rnd), "validThrough: %v rnd :%v", validThrough, rnd) +} diff --git a/ledger/applications_test.go b/ledger/applications_test.go index 7768329689..9eb3ddd694 100644 --- a/ledger/applications_test.go +++ b/ledger/applications_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -34,9 +34,23 @@ import ( ) func commitRound(offset uint64, dbRound basics.Round, l *Ledger) { + l.trackers.mu.Lock() l.trackers.lastFlushTime = time.Time{} + l.trackers.mu.Unlock() + l.trackers.scheduleCommit(l.Latest(), l.Latest()-(dbRound+basics.Round(offset))) - l.trackers.waitAccountsWriting() + // wait for the operation to complete. Once it does complete, the tr.lastFlushTime is going to be updated, so we can + // use that as an indicator. + for { + l.trackers.mu.Lock() + isDone := (!l.trackers.lastFlushTime.IsZero()) && (len(l.trackers.deferredCommits) == 0) + l.trackers.mu.Unlock() + if isDone { + break + } + time.Sleep(time.Millisecond) + + } } // test ensures that diff --git a/ledger/apply/application.go b/ledger/apply/application.go index 2ff5733030..8b805c2d60 100644 --- a/ledger/apply/application.go +++ b/ledger/apply/application.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -298,12 +298,12 @@ func closeOutApplication(balances Balances, sender basics.Address, appIdx basics } func checkPrograms(ac *transactions.ApplicationCallTxnFields, evalParams *logic.EvalParams) error { - err := logic.CheckStateful(ac.ApprovalProgram, *evalParams) + err := logic.CheckContract(ac.ApprovalProgram, evalParams) if err != nil { return fmt.Errorf("check failed on ApprovalProgram: %v", err) } - err = logic.CheckStateful(ac.ClearStateProgram, *evalParams) + err = logic.CheckContract(ac.ClearStateProgram, evalParams) if err != nil { return fmt.Errorf("check failed on ClearStateProgram: %v", err) } @@ -312,7 +312,7 @@ func checkPrograms(ac *transactions.ApplicationCallTxnFields, evalParams *logic. } // ApplicationCall evaluates ApplicationCall transaction -func ApplicationCall(ac transactions.ApplicationCallTxnFields, header transactions.Header, balances Balances, ad *transactions.ApplyData, evalParams *logic.EvalParams, txnCounter uint64) (err error) { +func ApplicationCall(ac transactions.ApplicationCallTxnFields, header transactions.Header, balances Balances, ad *transactions.ApplyData, gi int, evalParams *logic.EvalParams, txnCounter uint64) (err error) { defer func() { // If we are returning a non-nil error, then don't return a // non-empty EvalDelta. Not required for correctness. @@ -342,11 +342,7 @@ func ApplicationCall(ac transactions.ApplicationCallTxnFields, header transactio if err != nil { return } - // No separate config for activating storage in AD because - // inner transactions can't be turned on without this change. - if balances.ConsensusParams().MaxInnerTransactions > 0 { - ad.ApplicationID = appIdx - } + ad.ApplicationID = appIdx } // Fetch the application parameters, if they exist @@ -364,6 +360,11 @@ func ApplicationCall(ac transactions.ApplicationCallTxnFields, header transactio // If this txn is going to set new programs (either for creation or // update), check that the programs are valid and not too expensive if ac.ApplicationID == 0 || ac.OnCompletion == transactions.UpdateApplicationOC { + err := transactions.CheckContractVersions(ac.ApprovalProgram, ac.ClearStateProgram, params) + if err != nil { + return err + } + err = checkPrograms(&ac, evalParams) if err != nil { return err @@ -386,7 +387,7 @@ func ApplicationCall(ac transactions.ApplicationCallTxnFields, header transactio // If the app still exists, run the ClearStateProgram if exists { - pass, evalDelta, err := balances.StatefulEval(*evalParams, appIdx, params.ClearStateProgram) + pass, evalDelta, err := balances.StatefulEval(gi, evalParams, appIdx, params.ClearStateProgram) if err != nil { // Fail on non-logic eval errors and ignore LogicEvalError errors if _, ok := err.(ledgercore.LogicEvalError); !ok { @@ -418,7 +419,7 @@ func ApplicationCall(ac transactions.ApplicationCallTxnFields, header transactio } // Execute the Approval program - approved, evalDelta, err := balances.StatefulEval(*evalParams, appIdx, params.ApprovalProgram) + approved, evalDelta, err := balances.StatefulEval(gi, evalParams, appIdx, params.ApprovalProgram) if err != nil { return err } diff --git a/ledger/apply/application_test.go b/ledger/apply/application_test.go index 124a40936b..a6c83ed8ea 100644 --- a/ledger/apply/application_test.go +++ b/ledger/apply/application_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -225,7 +225,7 @@ func (b *testBalances) DeallocateAsset(addr basics.Address, index basics.AssetIn return nil } -func (b *testBalances) StatefulEval(params logic.EvalParams, aidx basics.AppIndex, program []byte) (passed bool, evalDelta transactions.EvalDelta, err error) { +func (b *testBalances) StatefulEval(gi int, params *logic.EvalParams, aidx basics.AppIndex, program []byte) (passed bool, evalDelta transactions.EvalDelta, err error) { return b.pass, b.delta, b.err } @@ -258,7 +258,7 @@ func (b *testBalancesPass) Deallocate(addr basics.Address, aidx basics.AppIndex, return nil } -func (b *testBalancesPass) StatefulEval(params logic.EvalParams, aidx basics.AppIndex, program []byte) (passed bool, evalDelta transactions.EvalDelta, err error) { +func (b *testBalancesPass) StatefulEval(gi int, params *logic.EvalParams, aidx basics.AppIndex, program []byte) (passed bool, evalDelta transactions.EvalDelta, err error) { return true, b.delta, nil } @@ -487,7 +487,7 @@ func TestAppCallApplyCreate(t *testing.T) { var txnCounter uint64 = 1 var b testBalances - err := ApplicationCall(ac, h, &b, nil, &ep, txnCounter) + err := ApplicationCall(ac, h, &b, nil, 0, &ep, txnCounter) a.Error(err) a.Contains(err.Error(), "ApplicationCall cannot have nil ApplyData") a.Equal(0, b.put) @@ -496,7 +496,7 @@ func TestAppCallApplyCreate(t *testing.T) { b.balances[creator] = basics.AccountData{} var ad *transactions.ApplyData = &transactions.ApplyData{} - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.Error(err) a.Contains(err.Error(), "max created apps per acct is 0") a.Equal(0, b.put) @@ -508,7 +508,7 @@ func TestAppCallApplyCreate(t *testing.T) { // this test will succeed in creating the app, but then fail // because the mock balances doesn't update the creators table // so it will think the app doesn't exist - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.Error(err) a.Contains(err.Error(), "applications that do not exist") a.Equal(1, b.put) @@ -526,7 +526,7 @@ func TestAppCallApplyCreate(t *testing.T) { cp.AppParams = cloneAppParams(saved.AppParams) cp.AppLocalStates = cloneAppLocalStates(saved.AppLocalStates) b.balances[creator] = cp - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.Error(err) a.Contains(err.Error(), "transaction rejected by ApprovalProgram") a.Equal(uint64(b.allocatedAppIdx), txnCounter+1) @@ -549,7 +549,7 @@ func TestAppCallApplyCreate(t *testing.T) { b.balances[creator] = cp ac.GlobalStateSchema = basics.StateSchema{NumUint: 1} - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.NoError(err) a.Equal(appIdx, b.allocatedAppIdx) a.Equal(1, b.put) @@ -564,7 +564,7 @@ func TestAppCallApplyCreate(t *testing.T) { a.Equal(basics.StateSchema{}, br.AppParams[appIdx].LocalStateSchema) ac.ExtraProgramPages = 1 - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.NoError(err) br = b.putBalances[creator] a.Equal(uint32(1), br.AppParams[appIdx].ExtraProgramPages) @@ -606,7 +606,7 @@ func TestAppCallApplyCreateOptIn(t *testing.T) { gd := map[string]basics.ValueDelta{"uint": {Action: basics.SetUintAction, Uint: 1}} b.delta = transactions.EvalDelta{GlobalDelta: gd} - err := ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err := ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.NoError(err) a.Equal(appIdx, b.allocatedAppIdx) br := b.balances[creator] @@ -768,7 +768,7 @@ func TestAppCallClearState(t *testing.T) { b.pass = true // check app not exist and not opted in b.balances[sender] = basics.AccountData{} - err := ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err := ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.Error(err) a.Contains(err.Error(), "is not currently opted in to app") a.Equal(0, b.put) @@ -777,7 +777,7 @@ func TestAppCallClearState(t *testing.T) { b.balances[sender] = basics.AccountData{ AppLocalStates: map[basics.AppIndex]basics.AppLocalState{appIdx: {}}, } - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.NoError(err) a.Equal(1, b.put) br := b.putBalances[sender] @@ -795,7 +795,7 @@ func TestAppCallClearState(t *testing.T) { appIdx: {Schema: basics.StateSchema{NumUint: 10}}, }, } - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.NoError(err) a.Equal(1, b.put) br = b.putBalances[sender] @@ -821,7 +821,7 @@ func TestAppCallClearState(t *testing.T) { // one put: to opt out b.pass = false b.delta = transactions.EvalDelta{GlobalDelta: nil} - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.NoError(err) a.Equal(1, b.put) br = b.putBalances[sender] @@ -836,7 +836,7 @@ func TestAppCallClearState(t *testing.T) { b.pass = true b.delta = transactions.EvalDelta{GlobalDelta: nil} b.err = ledgercore.LogicEvalError{Err: fmt.Errorf("test error")} - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.NoError(err) a.Equal(1, b.put) br = b.putBalances[sender] @@ -851,7 +851,7 @@ func TestAppCallClearState(t *testing.T) { b.pass = true b.delta = transactions.EvalDelta{GlobalDelta: nil} b.err = fmt.Errorf("test error") - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.Error(err) br = b.putBalances[sender] a.Equal(0, len(br.AppLocalStates)) @@ -866,7 +866,7 @@ func TestAppCallClearState(t *testing.T) { b.err = nil gd := basics.StateDelta{"uint": {Action: basics.SetUintAction, Uint: 1}} b.delta = transactions.EvalDelta{GlobalDelta: gd} - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.NoError(err) a.Equal(1, b.put) a.Equal(appIdx, b.deAllocatedAppIdx) @@ -879,7 +879,7 @@ func TestAppCallClearState(t *testing.T) { b.err = nil logs := []string{"a"} b.delta = transactions.EvalDelta{Logs: []string{"a"}} - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.NoError(err) a.Equal(transactions.EvalDelta{Logs: logs}, ad.EvalDelta) } @@ -926,7 +926,7 @@ func TestAppCallApplyCloseOut(t *testing.T) { ep.Proto = &proto b.pass = false - err := ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err := ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.Error(err) a.Contains(err.Error(), "transaction rejected by ApprovalProgram") a.Equal(0, b.put) @@ -937,7 +937,7 @@ func TestAppCallApplyCloseOut(t *testing.T) { // check closing on empty sender's balance record b.pass = true b.balances[sender] = basics.AccountData{} - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.Error(err) a.Contains(err.Error(), "is not opted in to app") a.Equal(0, b.put) @@ -953,7 +953,7 @@ func TestAppCallApplyCloseOut(t *testing.T) { b.balances[sender] = basics.AccountData{ AppLocalStates: map[basics.AppIndex]basics.AppLocalState{appIdx: {}}, } - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.NoError(err) a.Equal(1, b.put) br = b.putBalances[creator] @@ -970,7 +970,7 @@ func TestAppCallApplyCloseOut(t *testing.T) { b.balances[sender] = basics.AccountData{ AppLocalStates: map[basics.AppIndex]basics.AppLocalState{appIdx: {}}, } - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.NoError(err) a.Equal(transactions.EvalDelta{Logs: logs}, ad.EvalDelta) } @@ -1019,7 +1019,7 @@ func TestAppCallApplyUpdate(t *testing.T) { ep.Proto = &proto b.pass = false - err := ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err := ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.Error(err) a.Contains(err.Error(), "transaction rejected by ApprovalProgram") a.Equal(0, b.put) @@ -1030,7 +1030,7 @@ func TestAppCallApplyUpdate(t *testing.T) { // check updating on empty sender's balance record - happy case b.pass = true b.balances[sender] = basics.AccountData{} - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.NoError(err) a.Equal(1, b.put) br = b.balances[creator] @@ -1069,7 +1069,7 @@ func TestAppCallApplyUpdate(t *testing.T) { logs := []string{"a"} b.delta = transactions.EvalDelta{Logs: []string{"a"}} - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.NoError(err) a.Equal(transactions.EvalDelta{Logs: logs}, ad.EvalDelta) @@ -1094,7 +1094,7 @@ func TestAppCallApplyUpdate(t *testing.T) { } b.pass = true - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.Error(err) a.Contains(err.Error(), fmt.Sprintf("updateApplication %s program too long", test.name)) } @@ -1110,7 +1110,7 @@ func TestAppCallApplyUpdate(t *testing.T) { ClearStateProgram: []byte{2}, } b.pass = true - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.NoError(err) // check extraProgramPages is used and long sum rejected @@ -1121,7 +1121,7 @@ func TestAppCallApplyUpdate(t *testing.T) { ClearStateProgram: appr, } b.pass = true - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.Error(err) a.Contains(err.Error(), "updateApplication app programs too long") @@ -1174,7 +1174,7 @@ func TestAppCallApplyDelete(t *testing.T) { ep.Proto = &proto b.pass = false - err := ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err := ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.Error(err) a.Contains(err.Error(), "transaction rejected by ApprovalProgram") a.Equal(0, b.put) @@ -1189,7 +1189,7 @@ func TestAppCallApplyDelete(t *testing.T) { b.pass = true b.balances[sender] = basics.AccountData{} - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.NoError(err) a.Equal(appIdx, b.deAllocatedAppIdx) a.Equal(1, b.put) @@ -1219,7 +1219,7 @@ func TestAppCallApplyDelete(t *testing.T) { b.balances[creator] = cp b.pass = true b.balances[sender] = basics.AccountData{} - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.NoError(err) a.Equal(appIdx, b.deAllocatedAppIdx) a.Equal(1, b.put) @@ -1238,7 +1238,7 @@ func TestAppCallApplyDelete(t *testing.T) { } logs := []string{"a"} b.delta = transactions.EvalDelta{Logs: []string{"a"}} - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.NoError(err) a.Equal(transactions.EvalDelta{Logs: logs}, ad.EvalDelta) } @@ -1279,7 +1279,7 @@ func TestAppCallApplyCreateClearState(t *testing.T) { b.delta = transactions.EvalDelta{GlobalDelta: gd} // check creation on empty balance record - err := ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err := ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.Error(err) a.Contains(err.Error(), "not currently opted in") a.Equal(appIdx, b.allocatedAppIdx) @@ -1329,7 +1329,7 @@ func TestAppCallApplyCreateDelete(t *testing.T) { b.delta = transactions.EvalDelta{GlobalDelta: gd} // check creation on empty balance record - err := ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err := ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.NoError(err) a.Equal(appIdx, b.allocatedAppIdx) a.Equal(transactions.EvalDelta{GlobalDelta: gd}, ad.EvalDelta) @@ -1338,7 +1338,7 @@ func TestAppCallApplyCreateDelete(t *testing.T) { logs := []string{"a"} b.delta = transactions.EvalDelta{Logs: []string{"a"}} - err = ApplicationCall(ac, h, &b, ad, &ep, txnCounter) + err = ApplicationCall(ac, h, &b, ad, 0, &ep, txnCounter) a.NoError(err) a.Equal(transactions.EvalDelta{Logs: logs}, ad.EvalDelta) diff --git a/ledger/apply/apply.go b/ledger/apply/apply.go index f6a91ed8e2..a73c970b9e 100644 --- a/ledger/apply/apply.go +++ b/ledger/apply/apply.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -54,7 +54,7 @@ type Balances interface { // StatefulEval executes a TEAL program in stateful mode on the balances. // It returns whether the program passed and its error. It also returns // an EvalDelta that contains the changes made by the program. - StatefulEval(params logic.EvalParams, aidx basics.AppIndex, program []byte) (passed bool, evalDelta transactions.EvalDelta, err error) + StatefulEval(gi int, params *logic.EvalParams, aidx basics.AppIndex, program []byte) (passed bool, evalDelta transactions.EvalDelta, err error) // Move MicroAlgos from one account to another, doing all necessary overflow checking (convenience method) // TODO: Does this need to be part of the balances interface, or can it just be implemented here as a function that calls Put and Get? diff --git a/ledger/apply/asset.go b/ledger/apply/asset.go index 0796cb8f7f..c6ee4826d0 100644 --- a/ledger/apply/asset.go +++ b/ledger/apply/asset.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -100,12 +100,7 @@ func AssetConfig(cc transactions.AssetConfigTxnFields, header transactions.Heade return err } - // Record the index used. No separate config for activating - // storage in AD because inner transactions can't be turned on - // without this change. - if balances.ConsensusParams().MaxInnerTransactions > 0 { - ad.ConfigAsset = newidx - } + ad.ConfigAsset = newidx // Tell the cow what asset we created err = balances.AllocateAsset(header.Sender, newidx, true) diff --git a/ledger/apply/asset_test.go b/ledger/apply/asset_test.go index 3fbad27c70..bb45647f35 100644 --- a/ledger/apply/asset_test.go +++ b/ledger/apply/asset_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/apply/keyreg.go b/ledger/apply/keyreg.go index 532bfac517..8cffc1805f 100644 --- a/ledger/apply/keyreg.go +++ b/ledger/apply/keyreg.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -76,6 +76,9 @@ func Keyreg(keyreg transactions.KeyregTxnFields, header transactions.Header, bal record.VoteFirstValid = keyreg.VoteFirst record.VoteLastValid = keyreg.VoteLast record.VoteKeyDilution = keyreg.VoteKeyDilution + if balances.ConsensusParams().EnableStateProofKeyregCheck { + record.StateProofID = keyreg.StateProofPK + } } // Write the updated entry diff --git a/ledger/apply/keyreg_test.go b/ledger/apply/keyreg_test.go index ecb4e90727..07a80672af 100644 --- a/ledger/apply/keyreg_test.go +++ b/ledger/apply/keyreg_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -19,18 +19,24 @@ package apply import ( "testing" + "github.com/stretchr/testify/require" + "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/data/account" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/transactions" "github.com/algorand/go-algorand/data/transactions/logic" "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" - "github.com/stretchr/testify/require" + "github.com/algorand/go-algorand/util/db" ) var feeSink = basics.Address{0x7, 0xda, 0xcb, 0x4b, 0x6d, 0x9e, 0xd1, 0x41, 0xb1, 0x75, 0x76, 0xbd, 0x45, 0x9a, 0xe6, 0x42, 0x1d, 0x48, 0x6d, 0xa3, 0xd4, 0xef, 0x22, 0x47, 0xc4, 0x9, 0xa3, 0x96, 0xb8, 0x2e, 0xa2, 0x21} +const defaultParticipationFirstRound = 0 +const defaultParticipationLastRound = 3000 + // mock balances that support looking up particular balance records type keyregTestBalances struct { addrs map[basics.Address]basics.AccountData @@ -78,7 +84,7 @@ func (balances keyregTestBalances) DeallocateAsset(addr basics.Address, index ba return nil } -func (balances keyregTestBalances) StatefulEval(logic.EvalParams, basics.AppIndex, []byte) (bool, transactions.EvalDelta, error) { +func (balances keyregTestBalances) StatefulEval(int, *logic.EvalParams, basics.AppIndex, []byte) (bool, transactions.EvalDelta, error) { return false, transactions.EvalDelta{}, nil } @@ -90,21 +96,7 @@ func TestKeyregApply(t *testing.T) { vrfSecrets := crypto.GenerateVRFSecrets() secretParticipation := keypair() - tx := transactions.Transaction{ - Type: protocol.KeyRegistrationTx, - Header: transactions.Header{ - Sender: src, - Fee: basics.MicroAlgos{Raw: 1}, - FirstValid: basics.Round(100), - LastValid: basics.Round(1000), - }, - KeyregTxnFields: transactions.KeyregTxnFields{ - VotePK: crypto.OneTimeSignatureVerifier(secretParticipation.SignatureVerifier), - SelectionPK: vrfSecrets.PK, - VoteFirst: 0, - VoteLast: 100, - }, - } + tx := createTestTxn(t, src, secretParticipation, vrfSecrets) err := Keyreg(tx.KeyregTxnFields, tx.Header, makeMockBalances(protocol.ConsensusCurrentVersion), transactions.SpecialAddresses{FeeSink: feeSink}, nil, basics.Round(0)) require.NoError(t, err) @@ -173,5 +165,73 @@ func TestKeyregApply(t *testing.T) { err = Keyreg(tx.KeyregTxnFields, tx.Header, mockBal, transactions.SpecialAddresses{FeeSink: feeSink}, nil, basics.Round(1100)) require.NoError(t, err) + + testStateProofPKBeingStored(t, tx, mockBal) + } +} + +func testStateProofPKBeingStored(t *testing.T, tx transactions.Transaction, mockBal keyregTestBalances) { + err := Keyreg(tx.KeyregTxnFields, tx.Header, mockBal, transactions.SpecialAddresses{FeeSink: feeSink}, nil, basics.Round(1100)) + require.NoError(t, err) // expects no error with empty keyRegistration attempt + + rec, err := mockBal.Get(tx.Header.Sender, false) + require.NoError(t, err) // expects no error with empty keyRegistration attempt + require.Equal(t, tx.KeyregTxnFields.StateProofPK, rec.StateProofID) +} + +func TestStateProofPKKeyReg(t *testing.T) { + partitiontest.PartitionTest(t) + + secretSrc := keypair() + src := basics.Address(secretSrc.SignatureVerifier) + vrfSecrets := crypto.GenerateVRFSecrets() + secretParticipation := keypair() + + tx := createTestTxn(t, src, secretParticipation, vrfSecrets) + mockBal := makeMockBalances(protocol.ConsensusV30) + err := Keyreg(tx.KeyregTxnFields, tx.Header, mockBal, transactions.SpecialAddresses{FeeSink: feeSink}, nil, basics.Round(0)) + require.NoError(t, err) + + acct, err := mockBal.Get(tx.Src(), false) + require.NoError(t, err) + require.True(t, acct.StateProofID.IsEmpty()) + + mockBal = makeMockBalances(protocol.ConsensusCurrentVersion) + err = Keyreg(tx.KeyregTxnFields, tx.Header, mockBal, transactions.SpecialAddresses{FeeSink: feeSink}, nil, basics.Round(0)) + require.NoError(t, err) + + acct, err = mockBal.Get(tx.Src(), false) + require.NoError(t, err) + require.False(t, acct.StateProofID.IsEmpty()) +} + +func createTestTxn(t *testing.T, src basics.Address, secretParticipation *crypto.SignatureSecrets, vrfSecrets *crypto.VRFSecrets) transactions.Transaction { + return createTestTxnWithPeriod(t, src, secretParticipation, vrfSecrets, defaultParticipationFirstRound, defaultParticipationLastRound) +} + +func createTestTxnWithPeriod(t *testing.T, src basics.Address, secretParticipation *crypto.SignatureSecrets, vrfSecrets *crypto.VRFSecrets, firstRound basics.Round, lastRound basics.Round) transactions.Transaction { + store, err := db.MakeAccessor("test-DB", false, true) + require.NoError(t, err) + defer store.Close() + root, err := account.GenerateRoot(store) + require.NoError(t, err) + p, err := account.FillDBWithParticipationKeys(store, root.Address(), firstRound, lastRound, config.Consensus[protocol.ConsensusCurrentVersion].DefaultKeyDilution) + signer := p.Participation.StateProofSecrets + + return transactions.Transaction{ + Type: protocol.KeyRegistrationTx, + Header: transactions.Header{ + Sender: src, + Fee: basics.MicroAlgos{Raw: 1}, + FirstValid: basics.Round(defaultParticipationFirstRound), + LastValid: basics.Round(defaultParticipationLastRound), + }, + KeyregTxnFields: transactions.KeyregTxnFields{ + VotePK: crypto.OneTimeSignatureVerifier(secretParticipation.SignatureVerifier), + SelectionPK: vrfSecrets.PK, + StateProofPK: *signer.GetVerifier(), + VoteFirst: 0, + VoteLast: 100, + }, } } diff --git a/ledger/apply/mockBalances_test.go b/ledger/apply/mockBalances_test.go index d08e992e86..d2e121718a 100644 --- a/ledger/apply/mockBalances_test.go +++ b/ledger/apply/mockBalances_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -66,7 +66,7 @@ func (balances mockBalances) DeallocateAsset(addr basics.Address, index basics.A return nil } -func (balances mockBalances) StatefulEval(logic.EvalParams, basics.AppIndex, []byte) (bool, transactions.EvalDelta, error) { +func (balances mockBalances) StatefulEval(int, *logic.EvalParams, basics.AppIndex, []byte) (bool, transactions.EvalDelta, error) { return false, transactions.EvalDelta{}, nil } diff --git a/ledger/apply/payment.go b/ledger/apply/payment.go index cd2fd532fd..1caa082557 100644 --- a/ledger/apply/payment.go +++ b/ledger/apply/payment.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/apply/payment_test.go b/ledger/apply/payment_test.go index 09b55306da..6f20dd9a51 100644 --- a/ledger/apply/payment_test.go +++ b/ledger/apply/payment_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/apptxn_test.go b/ledger/apptxn_test.go deleted file mode 100644 index 6166c5d68b..0000000000 --- a/ledger/apptxn_test.go +++ /dev/null @@ -1,1339 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package ledger - -import ( - "fmt" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/algorand/go-algorand/agreement" - "github.com/algorand/go-algorand/config" - "github.com/algorand/go-algorand/crypto" - "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/go-algorand/data/bookkeeping" - "github.com/algorand/go-algorand/data/transactions" - "github.com/algorand/go-algorand/data/txntest" - "github.com/algorand/go-algorand/ledger/internal" - "github.com/algorand/go-algorand/ledger/ledgercore" - ledgertesting "github.com/algorand/go-algorand/ledger/testing" - "github.com/algorand/go-algorand/logging" - "github.com/algorand/go-algorand/protocol" - "github.com/algorand/go-algorand/test/partitiontest" -) - -// main wraps up some TEAL source in a header and footer so that it is -// an app that does nothing at create time, but otherwise runs source, -// then approves, if the source avoids panicing and leaves the stack -// empty. -func main(source string) string { - return fmt.Sprintf(`txn ApplicationID - bz end - %s - end: int 1`, source) -} - -// newTestLedger creates a in memory Ledger that is as realistic as -// possible. It has Rewards and FeeSink properly configured. -func newTestLedger(t testing.TB, balances bookkeeping.GenesisBalances) *Ledger { - var genHash crypto.Digest - crypto.RandBytes(genHash[:]) - genBlock, err := bookkeeping.MakeGenesisBlock(protocol.ConsensusFuture, balances, "test", genHash) - require.NoError(t, err) - require.False(t, genBlock.FeeSink.IsZero()) - require.False(t, genBlock.RewardsPool.IsZero()) - dbName := fmt.Sprintf("%s.%d", t.Name(), crypto.RandUint64()) - cfg := config.GetDefaultLocal() - cfg.Archival = true - l, err := OpenLedger(logging.Base(), dbName, true, ledgercore.InitState{ - Block: genBlock, - Accounts: balances.Balances, - GenesisHash: genHash, - }, cfg) - require.NoError(t, err) - return l -} - -// nextBlock begins evaluation of a new block, after ledger creation or endBlock() -func (ledger *Ledger) nextBlock(t testing.TB) *internal.BlockEvaluator { - rnd := ledger.Latest() - hdr, err := ledger.BlockHdr(rnd) - require.NoError(t, err) - - nextHdr := bookkeeping.MakeBlock(hdr).BlockHeader - eval, err := ledger.StartEvaluator(nextHdr, 0, 0) - require.NoError(t, err) - return eval -} - -// endBlock completes the block being created, returns the ValidatedBlock for inspection -func (ledger *Ledger) endBlock(t testing.TB, eval testingEvaluator) *ledgercore.ValidatedBlock { - validatedBlock, err := eval.BlockEvaluator.GenerateBlock() - require.NoError(t, err) - err = ledger.AddValidatedBlock(*validatedBlock, agreement.Certificate{}) - require.NoError(t, err) - return validatedBlock -} - -// lookup gets the current accountdata for an address -func (ledger *Ledger) lookup(t testing.TB, addr basics.Address) basics.AccountData { - rnd := ledger.Latest() - ad, err := ledger.Lookup(rnd, addr) - require.NoError(t, err) - return ad -} - -// micros gets the current microAlgo balance for an address -func (ledger *Ledger) micros(t testing.TB, addr basics.Address) uint64 { - return ledger.lookup(t, addr).MicroAlgos.Raw -} - -// asa gets the current balance and optin status for some asa for an address -func (ledger *Ledger) asa(t testing.TB, addr basics.Address, asset basics.AssetIndex) (uint64, bool) { - if holding, ok := ledger.lookup(t, addr).Assets[asset]; ok { - return holding.Amount, true - } - return 0, false -} - -// asaParams gets the asset params for a given asa index -func (ledger *Ledger) asaParams(t testing.TB, asset basics.AssetIndex) (basics.AssetParams, error) { - creator, ok, err := ledger.GetCreator(basics.CreatableIndex(asset), basics.AssetCreatable) - if err != nil { - return basics.AssetParams{}, err - } - if !ok { - return basics.AssetParams{}, fmt.Errorf("no asset (%d)", asset) - } - if params, ok := ledger.lookup(t, creator).AssetParams[asset]; ok { - return params, nil - } - return basics.AssetParams{}, fmt.Errorf("bad lookup (%d)", asset) -} - -type testingEvaluator struct { - *internal.BlockEvaluator - ledger *Ledger -} - -func (eval *testingEvaluator) fillDefaults(txn *txntest.Txn) { - if txn.GenesisHash.IsZero() { - txn.GenesisHash = eval.ledger.GenesisHash() - } - if txn.FirstValid == 0 { - txn.FirstValid = eval.Round() - } - txn.FillDefaults(eval.ledger.genesisProto) -} - -func (eval *testingEvaluator) txn(t testing.TB, txn *txntest.Txn, problem ...string) { - t.Helper() - eval.fillDefaults(txn) - stxn := txn.SignedTxn() - err := eval.TestTransactionGroup([]transactions.SignedTxn{stxn}) - if err != nil { - if len(problem) == 1 { - require.Contains(t, err.Error(), problem[0]) - } else { - require.NoError(t, err) // Will obviously fail - } - return - } - err = eval.Transaction(stxn, transactions.ApplyData{}) - if err != nil { - if len(problem) == 1 { - require.Contains(t, err.Error(), problem[0]) - } else { - require.NoError(t, err) // Will obviously fail - } - return - } - require.Len(t, problem, 0) -} - -func (eval *testingEvaluator) txns(t testing.TB, txns ...*txntest.Txn) { - t.Helper() - for _, txn := range txns { - eval.txn(t, txn) - } -} - -func (eval *testingEvaluator) txgroup(t testing.TB, txns ...*txntest.Txn) error { - t.Helper() - for _, txn := range txns { - eval.fillDefaults(txn) - } - txgroup := txntest.SignedTxns(txns...) - - err := eval.TestTransactionGroup(txgroup) - if err != nil { - return err - } - - err = eval.TransactionGroup(transactions.WrapSignedTxnsWithAD(txgroup)) - return err -} - -// TestPayAction ensures a pay in teal affects balances -func TestPayAction(t *testing.T) { - partitiontest.PartitionTest(t) - - genBalances, addrs, _ := ledgertesting.NewTestGenesis() - l := newTestLedger(t, genBalances) - defer l.Close() - - create := txntest.Txn{ - Type: "appl", - Sender: addrs[0], - ApprovalProgram: main(` - itxn_begin - int pay - itxn_field TypeEnum - int 5000 - itxn_field Amount - txn Accounts 1 - itxn_field Receiver - itxn_submit -`), - } - - ai := basics.AppIndex(1) - fund := txntest.Txn{ - Type: "pay", - Sender: addrs[0], - Receiver: ai.Address(), - Amount: 200000, // account min balance, plus fees - } - - payout1 := txntest.Txn{ - Type: "appl", - Sender: addrs[1], - ApplicationID: ai, - Accounts: []basics.Address{addrs[1]}, // pay self - } - - eval := testingEvaluator{l.nextBlock(t), l} - eval.txns(t, &create, &fund, &payout1) - vb := l.endBlock(t, eval) - - // AD contains expected appIndex - require.Equal(t, ai, vb.Block().Payset[0].ApplyData.ApplicationID) - - ad0 := l.micros(t, addrs[0]) - ad1 := l.micros(t, addrs[1]) - app := l.micros(t, ai.Address()) - - // create(1000) and fund(1000 + 200000) - require.Equal(t, uint64(202000), genBalances.Balances[addrs[0]].MicroAlgos.Raw-ad0) - // paid 5000, but 1000 fee - require.Equal(t, uint64(4000), ad1-genBalances.Balances[addrs[1]].MicroAlgos.Raw) - // app still has 194000 (paid out 5000, and paid fee to do it) - require.Equal(t, uint64(194000), app) - - // Build up Residue in RewardsState so it's ready to pay - for i := 1; i < 10; i++ { - eval = testingEvaluator{l.nextBlock(t), l} - l.endBlock(t, eval) - } - - eval = testingEvaluator{l.nextBlock(t), l} - payout2 := txntest.Txn{ - Type: "appl", - Sender: addrs[1], - ApplicationID: ai, - Accounts: []basics.Address{addrs[2]}, // pay other - } - eval.txn(t, &payout2) - // confirm that modifiedAccounts can see account in inner txn - found := false - vb = l.endBlock(t, eval) - - deltas := vb.Delta() - for _, addr := range deltas.Accts.ModifiedAccounts() { - if addr == addrs[2] { - found = true - } - } - require.True(t, found) - - payInBlock := vb.Block().Payset[0] - rewards := payInBlock.ApplyData.SenderRewards.Raw - require.Greater(t, rewards, uint64(2000)) // some biggish number - inners := payInBlock.ApplyData.EvalDelta.InnerTxns - require.Len(t, inners, 1) - - // addr[2] is going to get the same rewards as addr[1], who - // originally sent the top-level txn. Both had their algo balance - // touched and has very nearly the same balance. - require.Equal(t, rewards, inners[0].ReceiverRewards.Raw) - // app gets none, because it has less than 1A - require.Equal(t, uint64(0), inners[0].SenderRewards.Raw) - - ad1 = l.micros(t, addrs[1]) - ad2 := l.micros(t, addrs[2]) - app = l.micros(t, ai.Address()) - - // paid 5000, in first payout (only), but paid 1000 fee in each payout txn - require.Equal(t, rewards+3000, ad1-genBalances.Balances[addrs[1]].MicroAlgos.Raw) - // app still has 188000 (paid out 10000, and paid 2k fees to do it) - // no rewards because owns less than an algo - require.Equal(t, uint64(200000)-10000-2000, app) - - // paid 5000 by payout2, never paid any fees, got same rewards - require.Equal(t, rewards+uint64(5000), ad2-genBalances.Balances[addrs[2]].MicroAlgos.Raw) - - // Now fund the app account much more, so we can confirm it gets rewards. - tenkalgos := txntest.Txn{ - Type: "pay", - Sender: addrs[0], - Receiver: ai.Address(), - Amount: 10 * 1000 * 1000000, // account min balance, plus fees - } - eval = testingEvaluator{l.nextBlock(t), l} - eval.txn(t, &tenkalgos) - l.endBlock(t, eval) - beforepay := l.micros(t, ai.Address()) - - // Build up Residue in RewardsState so it's ready to pay again - for i := 1; i < 10; i++ { - eval = testingEvaluator{l.nextBlock(t), l} - l.endBlock(t, eval) - } - eval = testingEvaluator{l.nextBlock(t), l} - eval.txn(t, payout2.Noted("2")) - vb = l.endBlock(t, eval) - - afterpay := l.micros(t, ai.Address()) - - payInBlock = vb.Block().Payset[0] - inners = payInBlock.ApplyData.EvalDelta.InnerTxns - require.Len(t, inners, 1) - - appreward := inners[0].SenderRewards.Raw - require.Greater(t, appreward, uint64(1000)) - - require.Equal(t, beforepay+appreward-5000-1000, afterpay) -} - -// TestAxferAction ensures axfers in teal have the intended effects -func TestAxferAction(t *testing.T) { - partitiontest.PartitionTest(t) - - genBalances, addrs, _ := ledgertesting.NewTestGenesis() - l := newTestLedger(t, genBalances) - defer l.Close() - - asa := txntest.Txn{ - Type: "acfg", - Sender: addrs[0], - AssetParams: basics.AssetParams{ - Total: 1000000, - Decimals: 3, - UnitName: "oz", - AssetName: "Gold", - URL: "https://gold.rush/", - }, - } - - app := txntest.Txn{ - Type: "appl", - Sender: addrs[0], - ApprovalProgram: main(` - itxn_begin - int axfer - itxn_field TypeEnum - txn Assets 0 - itxn_field XferAsset - - txn ApplicationArgs 0 - byte "optin" - == - bz withdraw - // let AssetAmount default to 0 - global CurrentApplicationAddress - itxn_field AssetReceiver - b submit -withdraw: - txn ApplicationArgs 0 - byte "close" - == - bz noclose - txn Accounts 1 - itxn_field AssetCloseTo - b skipamount -noclose: int 10000 - itxn_field AssetAmount -skipamount: - txn Accounts 1 - itxn_field AssetReceiver -submit: itxn_submit -`), - } - - eval := testingEvaluator{l.nextBlock(t), l} - eval.txns(t, &asa, &app) - vb := l.endBlock(t, eval) - - asaIndex := basics.AssetIndex(1) - require.Equal(t, asaIndex, vb.Block().Payset[0].ApplyData.ConfigAsset) - appIndex := basics.AppIndex(2) - require.Equal(t, appIndex, vb.Block().Payset[1].ApplyData.ApplicationID) - - fund := txntest.Txn{ - Type: "pay", - Sender: addrs[0], - Receiver: appIndex.Address(), - Amount: 300000, // account min balance, optin min balance, plus fees - // stay under 1M, to avoid rewards complications - } - - eval = testingEvaluator{l.nextBlock(t), l} - eval.txn(t, &fund) - l.endBlock(t, eval) - - fundgold := txntest.Txn{ - Type: "axfer", - Sender: addrs[0], - XferAsset: asaIndex, - AssetReceiver: appIndex.Address(), - AssetAmount: 20000, - } - - // Fail, because app account is not opted in. - eval = testingEvaluator{l.nextBlock(t), l} - eval.txn(t, &fundgold, fmt.Sprintf("asset %d missing", asaIndex)) - l.endBlock(t, eval) - - amount, in := l.asa(t, appIndex.Address(), asaIndex) - require.False(t, in) - require.Equal(t, amount, uint64(0)) - - optin := txntest.Txn{ - Type: "appl", - ApplicationID: appIndex, - Sender: addrs[0], - ApplicationArgs: [][]byte{[]byte("optin")}, - ForeignAssets: []basics.AssetIndex{asaIndex}, - } - - // Tell the app to opt itself in. - eval = testingEvaluator{l.nextBlock(t), l} - eval.txn(t, &optin) - l.endBlock(t, eval) - - amount, in = l.asa(t, appIndex.Address(), asaIndex) - require.True(t, in) - require.Equal(t, amount, uint64(0)) - - // Now, suceed, because opted in. - eval = testingEvaluator{l.nextBlock(t), l} - eval.txn(t, &fundgold) - l.endBlock(t, eval) - - amount, in = l.asa(t, appIndex.Address(), asaIndex) - require.True(t, in) - require.Equal(t, amount, uint64(20000)) - - withdraw := txntest.Txn{ - Type: "appl", - ApplicationID: appIndex, - Sender: addrs[0], - ApplicationArgs: [][]byte{[]byte("withdraw")}, - ForeignAssets: []basics.AssetIndex{asaIndex}, - Accounts: []basics.Address{addrs[0]}, - } - eval = testingEvaluator{l.nextBlock(t), l} - eval.txn(t, &withdraw) - l.endBlock(t, eval) - - amount, in = l.asa(t, appIndex.Address(), asaIndex) - require.True(t, in) - require.Equal(t, amount, uint64(10000)) - - eval = testingEvaluator{l.nextBlock(t), l} - eval.txn(t, withdraw.Noted("2")) - l.endBlock(t, eval) - - amount, in = l.asa(t, appIndex.Address(), asaIndex) - require.True(t, in) // Zero left, but still opted in - require.Equal(t, amount, uint64(0)) - - eval = testingEvaluator{l.nextBlock(t), l} - eval.txn(t, withdraw.Noted("3"), "underflow on subtracting") - l.endBlock(t, eval) - - amount, in = l.asa(t, appIndex.Address(), asaIndex) - require.True(t, in) // Zero left, but still opted in - require.Equal(t, amount, uint64(0)) - - close := txntest.Txn{ - Type: "appl", - ApplicationID: appIndex, - Sender: addrs[0], - ApplicationArgs: [][]byte{[]byte("close")}, - ForeignAssets: []basics.AssetIndex{asaIndex}, - Accounts: []basics.Address{addrs[0]}, - } - - eval = testingEvaluator{l.nextBlock(t), l} - eval.txn(t, &close) - l.endBlock(t, eval) - - amount, in = l.asa(t, appIndex.Address(), asaIndex) - require.False(t, in) // Zero left, not opted in - require.Equal(t, amount, uint64(0)) - - // Now, fail again, opted out - eval = testingEvaluator{l.nextBlock(t), l} - eval.txn(t, fundgold.Noted("2"), fmt.Sprintf("asset %d missing", asaIndex)) - l.endBlock(t, eval) - - // Do it all again, so we can test closeTo when we have a non-zero balance - // Tell the app to opt itself in. - eval = testingEvaluator{l.nextBlock(t), l} - eval.txns(t, optin.Noted("a"), fundgold.Noted("a")) - l.endBlock(t, eval) - - amount, _ = l.asa(t, appIndex.Address(), asaIndex) - require.Equal(t, uint64(20000), amount) - left, _ := l.asa(t, addrs[0], asaIndex) - - eval = testingEvaluator{l.nextBlock(t), l} - eval.txn(t, close.Noted("a")) - l.endBlock(t, eval) - - amount, _ = l.asa(t, appIndex.Address(), asaIndex) - require.Equal(t, uint64(0), amount) - back, _ := l.asa(t, addrs[0], asaIndex) - require.Equal(t, uint64(20000), back-left) -} - -// TestClawbackAction ensures an app address can act as clawback address. -func TestClawbackAction(t *testing.T) { - partitiontest.PartitionTest(t) - - genBalances, addrs, _ := ledgertesting.NewTestGenesis() - l := newTestLedger(t, genBalances) - defer l.Close() - - asaIndex := basics.AssetIndex(1) - appIndex := basics.AppIndex(2) - - asa := txntest.Txn{ - Type: "acfg", - Sender: addrs[0], - AssetParams: basics.AssetParams{ - Total: 1000000, - Decimals: 3, - UnitName: "oz", - AssetName: "Gold", - URL: "https://gold.rush/", - Clawback: appIndex.Address(), - }, - } - - app := txntest.Txn{ - Type: "appl", - Sender: addrs[0], - ApprovalProgram: main(` - itxn_begin - - int axfer - itxn_field TypeEnum - - txn Assets 0 - itxn_field XferAsset - - txn Accounts 1 - itxn_field AssetSender - - txn Accounts 2 - itxn_field AssetReceiver - - int 1000 - itxn_field AssetAmount - - itxn_submit -`), - } - - optin := txntest.Txn{ - Type: "axfer", - Sender: addrs[1], - AssetReceiver: addrs[1], - XferAsset: asaIndex, - } - eval := testingEvaluator{l.nextBlock(t), l} - eval.txns(t, &asa, &app, &optin) - vb := l.endBlock(t, eval) - - require.Equal(t, asaIndex, vb.Block().Payset[0].ApplyData.ConfigAsset) - require.Equal(t, appIndex, vb.Block().Payset[1].ApplyData.ApplicationID) - - bystander := addrs[2] // Has no authority of its own - overpay := txntest.Txn{ - Type: "pay", - Sender: bystander, - Receiver: bystander, - Fee: 2000, // Overpay fee so that app account can be unfunded - } - clawmove := txntest.Txn{ - Type: "appl", - Sender: bystander, - ApplicationID: appIndex, - ForeignAssets: []basics.AssetIndex{asaIndex}, - Accounts: []basics.Address{addrs[0], addrs[1]}, - } - eval = testingEvaluator{l.nextBlock(t), l} - eval.txgroup(t, &overpay, &clawmove) - l.endBlock(t, eval) - - amount, _ := l.asa(t, addrs[1], asaIndex) - require.Equal(t, amount, uint64(1000)) -} - -// TestRekeyAction ensures an app can transact for a rekeyed account -func TestRekeyAction(t *testing.T) { - partitiontest.PartitionTest(t) - - genBalances, addrs, _ := ledgertesting.NewTestGenesis() - l := newTestLedger(t, genBalances) - defer l.Close() - - appIndex := basics.AppIndex(1) - ezpayer := txntest.Txn{ - Type: "appl", - Sender: addrs[5], - ApprovalProgram: main(` - itxn_begin - int pay - itxn_field TypeEnum - int 5000 - itxn_field Amount - txn Accounts 1 - itxn_field Sender - txn Accounts 2 - itxn_field Receiver - txn NumAccounts - int 3 - == - bz skipclose - txn Accounts 3 - itxn_field CloseRemainderTo -skipclose: - itxn_submit -`), - } - - rekey := txntest.Txn{ - Type: "pay", - Sender: addrs[0], - Receiver: addrs[0], - RekeyTo: appIndex.Address(), - } - - eval := testingEvaluator{l.nextBlock(t), l} - eval.txns(t, &ezpayer, &rekey) - l.endBlock(t, eval) - - useacct := txntest.Txn{ - Type: "appl", - Sender: addrs[1], - ApplicationID: appIndex, - Accounts: []basics.Address{addrs[0], addrs[2]}, // pay 2 from 0 (which was rekeyed) - } - eval = testingEvaluator{l.nextBlock(t), l} - eval.txn(t, &useacct) - l.endBlock(t, eval) - - // App was never funded (didn't spend from it's own acct) - require.Equal(t, uint64(0), l.micros(t, basics.AppIndex(1).Address())) - // addrs[2] got paid - require.Equal(t, uint64(5000), l.micros(t, addrs[2])-l.micros(t, addrs[6])) - // addrs[0] paid 5k + rekey fee + inner txn fee - require.Equal(t, uint64(7000), l.micros(t, addrs[6])-l.micros(t, addrs[0])) - - baduse := txntest.Txn{ - Type: "appl", - Sender: addrs[1], - ApplicationID: appIndex, - Accounts: []basics.Address{addrs[2], addrs[0]}, // pay 0 from 2 - } - eval = testingEvaluator{l.nextBlock(t), l} - eval.txn(t, &baduse, "unauthorized") - l.endBlock(t, eval) - - // Now, we close addrs[0], which wipes its rekey status. Reopen - // it, and make sure the app can't spend. - - close := txntest.Txn{ - Type: "appl", - Sender: addrs[1], - ApplicationID: appIndex, - Accounts: []basics.Address{addrs[0], addrs[2], addrs[3]}, // close to 3 - } - eval = testingEvaluator{l.nextBlock(t), l} - eval.txn(t, &close) - l.endBlock(t, eval) - - require.Equal(t, uint64(0), l.micros(t, addrs[0])) - - payback := txntest.Txn{ - Type: "pay", - Sender: addrs[3], - Receiver: addrs[0], - Amount: 10_000_000, - } - eval = testingEvaluator{l.nextBlock(t), l} - eval.txn(t, &payback) - l.endBlock(t, eval) - - require.Equal(t, uint64(10_000_000), l.micros(t, addrs[0])) - - eval = testingEvaluator{l.nextBlock(t), l} - eval.txn(t, useacct.Noted("2"), "unauthorized") - l.endBlock(t, eval) -} - -// TestRekeyActionCloseAccount ensures closing and reopening a rekeyed account in a single app call -// properly removes the app as an authorizer for the account -func TestRekeyActionCloseAccount(t *testing.T) { - partitiontest.PartitionTest(t) - - genBalances, addrs, _ := ledgertesting.NewTestGenesis() - l := newTestLedger(t, genBalances) - defer l.Close() - - appIndex := basics.AppIndex(1) - create := txntest.Txn{ - Type: "appl", - Sender: addrs[5], - ApprovalProgram: main(` - // close account 1 - itxn_begin - int pay - itxn_field TypeEnum - txn Accounts 1 - itxn_field Sender - txn Accounts 2 - itxn_field CloseRemainderTo - itxn_submit - - // reopen account 1 - itxn_begin - int pay - itxn_field TypeEnum - int 5000 - itxn_field Amount - txn Accounts 1 - itxn_field Receiver - itxn_submit - // send from account 1 again (should fail because closing an account erases rekeying) - itxn_begin - int pay - itxn_field TypeEnum - int 1 - itxn_field Amount - txn Accounts 1 - itxn_field Sender - txn Accounts 2 - itxn_field Receiver - itxn_submit -`), - } - - rekey := txntest.Txn{ - Type: "pay", - Sender: addrs[0], - Receiver: addrs[0], - RekeyTo: appIndex.Address(), - } - - fund := txntest.Txn{ - Type: "pay", - Sender: addrs[1], - Receiver: appIndex.Address(), - Amount: 1_000_000, - } - - eval := testingEvaluator{l.nextBlock(t), l} - eval.txns(t, &create, &rekey, &fund) - l.endBlock(t, eval) - - useacct := txntest.Txn{ - Type: "appl", - Sender: addrs[1], - ApplicationID: appIndex, - Accounts: []basics.Address{addrs[0], addrs[2]}, - } - eval = testingEvaluator{l.nextBlock(t), l} - eval.txn(t, &useacct, "unauthorized") - l.endBlock(t, eval) -} - -// TestDuplicatePayAction shows two pays with same parameters can be done as inner tarnsactions -func TestDuplicatePayAction(t *testing.T) { - partitiontest.PartitionTest(t) - - genBalances, addrs, _ := ledgertesting.NewTestGenesis() - l := newTestLedger(t, genBalances) - defer l.Close() - - appIndex := basics.AppIndex(1) - create := txntest.Txn{ - Type: "appl", - Sender: addrs[0], - ApprovalProgram: main(` - itxn_begin - int pay - itxn_field TypeEnum - int 5000 - itxn_field Amount - txn Accounts 1 - itxn_field Receiver - itxn_submit - itxn_begin - int pay - itxn_field TypeEnum - int 5000 - itxn_field Amount - txn Accounts 1 - itxn_field Receiver - itxn_submit -`), - } - - fund := txntest.Txn{ - Type: "pay", - Sender: addrs[0], - Receiver: appIndex.Address(), - Amount: 200000, // account min balance, plus fees - } - - paytwice := txntest.Txn{ - Type: "appl", - Sender: addrs[1], - ApplicationID: appIndex, - Accounts: []basics.Address{addrs[1]}, // pay self - } - - eval := testingEvaluator{l.nextBlock(t), l} - eval.txns(t, &create, &fund, &paytwice, create.Noted("in same block")) - vb := l.endBlock(t, eval) - - require.Equal(t, appIndex, vb.Block().Payset[0].ApplyData.ApplicationID) - require.Equal(t, 4, len(vb.Block().Payset)) - // create=1, fund=2, payTwice=3,4,5 - require.Equal(t, basics.AppIndex(6), vb.Block().Payset[3].ApplyData.ApplicationID) - - ad0 := l.micros(t, addrs[0]) - ad1 := l.micros(t, addrs[1]) - app := l.micros(t, appIndex.Address()) - - // create(1000) and fund(1000 + 200000), extra create (1000) - require.Equal(t, 203000, int(genBalances.Balances[addrs[0]].MicroAlgos.Raw-ad0)) - // paid 10000, but 1000 fee on tx - require.Equal(t, 9000, int(ad1-genBalances.Balances[addrs[1]].MicroAlgos.Raw)) - // app still has 188000 (paid out 10000, and paid 2 x fee to do it) - require.Equal(t, 188000, int(app)) - - // Now create another app, and see if it gets the index we expect. - eval = testingEvaluator{l.nextBlock(t), l} - eval.txns(t, create.Noted("again")) - vb = l.endBlock(t, eval) - - // create=1, fund=2, payTwice=3,4,5, insameblock=6 - require.Equal(t, basics.AppIndex(7), vb.Block().Payset[0].ApplyData.ApplicationID) -} - -// TestInnerTxCount ensures that inner transactions increment the TxnCounter -func TestInnerTxnCount(t *testing.T) { - partitiontest.PartitionTest(t) - - genBalances, addrs, _ := ledgertesting.NewTestGenesis() - l := newTestLedger(t, genBalances) - defer l.Close() - - create := txntest.Txn{ - Type: "appl", - Sender: addrs[0], - ApprovalProgram: main(` - itxn_begin - int pay - itxn_field TypeEnum - int 5000 - itxn_field Amount - txn Accounts 1 - itxn_field Receiver - itxn_submit -`), - } - - fund := txntest.Txn{ - Type: "pay", - Sender: addrs[0], - Receiver: basics.AppIndex(1).Address(), - Amount: 200000, // account min balance, plus fees - } - - payout1 := txntest.Txn{ - Type: "appl", - Sender: addrs[1], - ApplicationID: basics.AppIndex(1), - Accounts: []basics.Address{addrs[1]}, // pay self - } - - eval := testingEvaluator{l.nextBlock(t), l} - eval.txns(t, &create, &fund) - vb := l.endBlock(t, eval) - require.Equal(t, 2, int(vb.Block().TxnCounter)) - - eval = testingEvaluator{l.nextBlock(t), l} - eval.txns(t, &payout1) - vb = l.endBlock(t, eval) - require.Equal(t, 4, int(vb.Block().TxnCounter)) -} - -// TestAcfgAction ensures assets can be created and configured in teal -func TestAcfgAction(t *testing.T) { - partitiontest.PartitionTest(t) - - genBalances, addrs, _ := ledgertesting.NewTestGenesis() - l := newTestLedger(t, genBalances) - defer l.Close() - - appIndex := basics.AppIndex(1) - app := txntest.Txn{ - Type: "appl", - Sender: addrs[0], - ApprovalProgram: main(` - itxn_begin - int acfg - itxn_field TypeEnum - - txn ApplicationArgs 0 - byte "create" - == - bz manager - int 1000000 - itxn_field ConfigAssetTotal - int 3 - itxn_field ConfigAssetDecimals - byte "oz" - itxn_field ConfigAssetUnitName - byte "Gold" - itxn_field ConfigAssetName - byte "https://gold.rush/" - itxn_field ConfigAssetURL - - global CurrentApplicationAddress - dup - dup2 - itxn_field ConfigAssetManager - itxn_field ConfigAssetReserve - itxn_field ConfigAssetFreeze - itxn_field ConfigAssetClawback - b submit -manager: - // Put the current values in the itxn - txn Assets 0 - asset_params_get AssetManager - assert // exists - itxn_field ConfigAssetManager - - txn Assets 0 - asset_params_get AssetReserve - assert // exists - itxn_field ConfigAssetReserve - - txn Assets 0 - asset_params_get AssetFreeze - assert // exists - itxn_field ConfigAssetFreeze - - txn Assets 0 - asset_params_get AssetClawback - assert // exists - itxn_field ConfigAssetClawback - - - txn ApplicationArgs 0 - byte "manager" - == - bz reserve - txn Assets 0 - itxn_field ConfigAsset - txn ApplicationArgs 1 - itxn_field ConfigAssetManager - b submit -reserve: - txn ApplicationArgs 0 - byte "reserve" - == - bz freeze - txn Assets 0 - itxn_field ConfigAsset - txn ApplicationArgs 1 - itxn_field ConfigAssetReserve - b submit -freeze: - txn ApplicationArgs 0 - byte "freeze" - == - bz clawback - txn Assets 0 - itxn_field ConfigAsset - txn ApplicationArgs 1 - itxn_field ConfigAssetFreeze - b submit -clawback: - txn ApplicationArgs 0 - byte "clawback" - == - bz error - txn Assets 0 - itxn_field ConfigAsset - txn ApplicationArgs 1 - itxn_field ConfigAssetClawback - b submit -error: err -submit: itxn_submit -`), - } - - fund := txntest.Txn{ - Type: "pay", - Sender: addrs[0], - Receiver: appIndex.Address(), - Amount: 200_000, // exactly account min balance + one asset - } - - eval := testingEvaluator{l.nextBlock(t), l} - eval.txns(t, &app, &fund) - l.endBlock(t, eval) - - createAsa := txntest.Txn{ - Type: "appl", - Sender: addrs[1], - ApplicationID: appIndex, - ApplicationArgs: [][]byte{[]byte("create")}, - } - - eval = testingEvaluator{l.nextBlock(t), l} - // Can't create an asset if you have exactly 200,000 and need to pay fee - eval.txn(t, &createAsa, "balance 199000 below min 200000") - // fund it some more and try again - eval.txns(t, fund.Noted("more!"), &createAsa) - vb := l.endBlock(t, eval) - - asaIndex := vb.Block().Payset[1].EvalDelta.InnerTxns[0].ConfigAsset - require.Equal(t, basics.AssetIndex(5), asaIndex) - - asaParams, err := l.asaParams(t, basics.AssetIndex(5)) - require.NoError(t, err) - - require.Equal(t, 1_000_000, int(asaParams.Total)) - require.Equal(t, 3, int(asaParams.Decimals)) - require.Equal(t, "oz", asaParams.UnitName) - require.Equal(t, "Gold", asaParams.AssetName) - require.Equal(t, "https://gold.rush/", asaParams.URL) - - require.Equal(t, appIndex.Address(), asaParams.Manager) - - for _, a := range []string{"reserve", "freeze", "clawback", "manager"} { - check := txntest.Txn{ - Type: "appl", - Sender: addrs[1], - ApplicationID: appIndex, - ApplicationArgs: [][]byte{[]byte(a), []byte("junkjunkjunkjunkjunkjunkjunkjunk")}, - ForeignAssets: []basics.AssetIndex{asaIndex}, - } - eval = testingEvaluator{l.nextBlock(t), l} - t.Log(a) - eval.txn(t, &check) - l.endBlock(t, eval) - } - // Not the manager anymore so this won't work - nodice := txntest.Txn{ - Type: "appl", - Sender: addrs[1], - ApplicationID: appIndex, - ApplicationArgs: [][]byte{[]byte("freeze"), []byte("junkjunkjunkjunkjunkjunkjunkjunk")}, - ForeignAssets: []basics.AssetIndex{asaIndex}, - } - eval = testingEvaluator{l.nextBlock(t), l} - eval.txn(t, &nodice, "this transaction should be issued by the manager") - l.endBlock(t, eval) - -} - -// TestAsaDuringInit ensures an ASA can be made while initilizing an -// app. In practice, this is impossible, because you would not be -// able to prefund the account - you don't know the app id. But here -// we can know, so it helps exercise txncounter changes. -func TestAsaDuringInit(t *testing.T) { - partitiontest.PartitionTest(t) - - genBalances, addrs, _ := ledgertesting.NewTestGenesis() - l := newTestLedger(t, genBalances) - defer l.Close() - - appIndex := basics.AppIndex(2) - prefund := txntest.Txn{ - Type: "pay", - Sender: addrs[0], - Receiver: appIndex.Address(), - Amount: 300000, // plenty for min balances, fees - } - - app := txntest.Txn{ - Type: "appl", - Sender: addrs[0], - ApprovalProgram: ` - itxn_begin - int acfg - itxn_field TypeEnum - int 1000000 - itxn_field ConfigAssetTotal - byte "oz" - itxn_field ConfigAssetUnitName - byte "Gold" - itxn_field ConfigAssetName - itxn_submit - itxn CreatedAssetID - int 3 - == - itxn CreatedApplicationID - int 0 - == - && - itxn NumLogs - int 0 - == - && -`, - } - - eval := testingEvaluator{l.nextBlock(t), l} - eval.txns(t, &prefund, &app) - vb := l.endBlock(t, eval) - - require.Equal(t, appIndex, vb.Block().Payset[1].ApplicationID) - - asaIndex := vb.Block().Payset[1].EvalDelta.InnerTxns[0].ConfigAsset - require.Equal(t, basics.AssetIndex(3), asaIndex) -} - -func TestRekey(t *testing.T) { - partitiontest.PartitionTest(t) - - genBalances, addrs, _ := ledgertesting.NewTestGenesis() - l := newTestLedger(t, genBalances) - defer l.Close() - - app := txntest.Txn{ - Type: "appl", - Sender: addrs[0], - ApprovalProgram: main(` - itxn_begin - int pay - itxn_field TypeEnum - int 1 - itxn_field Amount - global CurrentApplicationAddress - itxn_field Receiver - int 31 - bzero - byte 0x01 - concat - itxn_field RekeyTo - itxn_submit -`), - } - - eval := testingEvaluator{l.nextBlock(t), l} - eval.txns(t, &app) - vb := l.endBlock(t, eval) - appIndex := vb.Block().Payset[0].ApplicationID - require.Equal(t, basics.AppIndex(1), appIndex) - - fund := txntest.Txn{ - Type: "pay", - Sender: addrs[0], - Receiver: appIndex.Address(), - Amount: 1_000_000, - } - rekey := txntest.Txn{ - Type: "appl", - Sender: addrs[1], - ApplicationID: appIndex, - } - eval = testingEvaluator{l.nextBlock(t), l} - eval.txns(t, &fund, &rekey) - eval.txn(t, rekey.Noted("2"), "unauthorized") - l.endBlock(t, eval) - -} - -func TestNote(t *testing.T) { - partitiontest.PartitionTest(t) - - genBalances, addrs, _ := ledgertesting.NewTestGenesis() - l := newTestLedger(t, genBalances) - defer l.Close() - - app := txntest.Txn{ - Type: "appl", - Sender: addrs[0], - ApprovalProgram: main(` - itxn_begin - int pay - itxn_field TypeEnum - int 0 - itxn_field Amount - global CurrentApplicationAddress - itxn_field Receiver - byte "abcdefghijklmnopqrstuvwxyz01234567890" - itxn_field Note - itxn_submit -`), - } - - eval := testingEvaluator{l.nextBlock(t), l} - eval.txns(t, &app) - vb := l.endBlock(t, eval) - appIndex := vb.Block().Payset[0].ApplicationID - require.Equal(t, basics.AppIndex(1), appIndex) - - fund := txntest.Txn{ - Type: "pay", - Sender: addrs[0], - Receiver: appIndex.Address(), - Amount: 1_000_000, - } - note := txntest.Txn{ - Type: "appl", - Sender: addrs[1], - ApplicationID: appIndex, - } - eval = testingEvaluator{l.nextBlock(t), l} - eval.txns(t, &fund, ¬e) - vb = l.endBlock(t, eval) - alphabet := vb.Block().Payset[1].EvalDelta.InnerTxns[0].Txn.Note - require.Equal(t, "abcdefghijklmnopqrstuvwxyz01234567890", string(alphabet)) -} - -func TestKeyreg(t *testing.T) { - partitiontest.PartitionTest(t) - - genBalances, addrs, _ := ledgertesting.NewTestGenesis() - l := newTestLedger(t, genBalances) - defer l.Close() - - app := txntest.Txn{ - Type: "appl", - Sender: addrs[0], - ApprovalProgram: main(` - txn ApplicationArgs 0 - byte "pay" - == - bz nonpart - itxn_begin - int pay - itxn_field TypeEnum - int 1 - itxn_field Amount - txn Sender - itxn_field Receiver - itxn_submit - int 1 - return -nonpart: - itxn_begin - int keyreg - itxn_field TypeEnum - int 1 - itxn_field Nonparticipation - itxn_submit -`), - } - - // Create the app - eval := testingEvaluator{l.nextBlock(t), l} - eval.txns(t, &app) - vb := l.endBlock(t, eval) - appIndex := vb.Block().Payset[0].ApplicationID - require.Equal(t, basics.AppIndex(1), appIndex) - - // Give the app a lot of money - fund := txntest.Txn{ - Type: "pay", - Sender: addrs[0], - Receiver: appIndex.Address(), - Amount: 1_000_000_000, - } - eval = testingEvaluator{l.nextBlock(t), l} - eval.txn(t, &fund) - l.endBlock(t, eval) - - require.Equal(t, 1_000_000_000, int(l.micros(t, appIndex.Address()))) - - // Build up Residue in RewardsState so it's ready to pay - for i := 1; i < 10; i++ { - eval := testingEvaluator{l.nextBlock(t), l} - l.endBlock(t, eval) - } - - // pay a little - pay := txntest.Txn{ - Type: "appl", - Sender: addrs[0], - ApplicationID: appIndex, - ApplicationArgs: [][]byte{[]byte("pay")}, - } - eval = testingEvaluator{l.nextBlock(t), l} - eval.txn(t, &pay) - l.endBlock(t, eval) - // 2000 was earned in rewards (- 1000 fee, -1 pay) - require.Equal(t, 1_000_000_999, int(l.micros(t, appIndex.Address()))) - - // Go nonpart - nonpart := txntest.Txn{ - Type: "appl", - Sender: addrs[0], - ApplicationID: appIndex, - ApplicationArgs: [][]byte{[]byte("nonpart")}, - } - eval = testingEvaluator{l.nextBlock(t), l} - eval.txn(t, &nonpart) - l.endBlock(t, eval) - require.Equal(t, 999_999_999, int(l.micros(t, appIndex.Address()))) - - // Build up Residue in RewardsState so it's ready to pay AGAIN - // But expect no rewards - for i := 1; i < 100; i++ { - eval := testingEvaluator{l.nextBlock(t), l} - l.endBlock(t, eval) - } - eval = testingEvaluator{l.nextBlock(t), l} - eval.txn(t, pay.Noted("again")) - eval.txn(t, nonpart.Noted("again"), "cannot change online/offline") - l.endBlock(t, eval) - // Ppaid fee and 1. Did not get rewards - require.Equal(t, 999_998_998, int(l.micros(t, appIndex.Address()))) -} diff --git a/ledger/archival_test.go b/ledger/archival_test.go index 9d4f3b15d0..7b59a78508 100644 --- a/ledger/archival_test.go +++ b/ledger/archival_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -730,6 +730,10 @@ func TestArchivalFromNonArchival(t *testing.T) { require.NoError(t, err) blk := genesisInitState.Block + // The next operations are heavy on the memory. + // Garbage collection helps prevent trashing + runtime.GC() + const maxBlocks = 2000 for i := 0; i < maxBlocks; i++ { blk.BlockHeader.Round++ @@ -784,6 +788,9 @@ func TestArchivalFromNonArchival(t *testing.T) { require.NoError(t, err) require.Equal(t, basics.Round(0), earliest) require.Equal(t, basics.Round(0), latest) + + // Minimize the impact of the memory consumption here on other tests. + runtime.GC() } func checkTrackers(t *testing.T, wl *wrappedLedger, rnd basics.Round) (basics.Round, error) { diff --git a/ledger/blockdb.go b/ledger/blockdb.go index 9c68adfdc2..1919fdb80b 100644 --- a/ledger/blockdb.go +++ b/ledger/blockdb.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/blockdb_test.go b/ledger/blockdb_test.go index 0c2fa8ecd5..da1d8303c9 100644 --- a/ledger/blockdb_test.go +++ b/ledger/blockdb_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/blockqueue.go b/ledger/blockqueue.go index 25df6043ac..cb14d62943 100644 --- a/ledger/blockqueue.go +++ b/ledger/blockqueue.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/blockqueue_test.go b/ledger/blockqueue_test.go index 55f2a39efe..0f62798901 100644 --- a/ledger/blockqueue_test.go +++ b/ledger/blockqueue_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/bulletin.go b/ledger/bulletin.go index b188130074..62012403b1 100644 --- a/ledger/bulletin.go +++ b/ledger/bulletin.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/bulletin_test.go b/ledger/bulletin_test.go index cf8d160434..a3d5ae1f90 100644 --- a/ledger/bulletin_test.go +++ b/ledger/bulletin_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/catchpointtracker.go b/ledger/catchpointtracker.go index ab03db4ef4..087580f42f 100644 --- a/ledger/catchpointtracker.go +++ b/ledger/catchpointtracker.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -272,7 +272,11 @@ func (ct *catchpointTracker) produceCommittingTask(committedRound basics.Round, return nil } - dcr.offset = uint64(newBase - dcr.oldBase) + newOffset := uint64(newBase - dcr.oldBase) + // trackers are not allowed to increase offsets, only descease + if newOffset < dcr.offset { + dcr.offset = newOffset + } // check to see if this is a catchpoint round dcr.isCatchpointRound = ct.isCatchpointRound(dcr.offset, dcr.oldBase, dcr.lookback) diff --git a/ledger/catchpointtracker_test.go b/ledger/catchpointtracker_test.go index d2188f2e3f..b75d07adae 100644 --- a/ledger/catchpointtracker_test.go +++ b/ledger/catchpointtracker_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -114,6 +114,7 @@ func TestGetCatchpointStream(t *testing.T) { // File on disk, and database has the record reader, err := ct.GetCatchpointStream(basics.Round(1)) + require.NoError(t, err) n, err = reader.Read(dataRead) require.NoError(t, err) require.Equal(t, 3, n) @@ -125,13 +126,16 @@ func TestGetCatchpointStream(t *testing.T) { // File deleted, but record in the database err = os.Remove(filepath.Join(temporaryDirectroy, "catchpoints", "2.catchpoint")) + require.NoError(t, err) reader, err = ct.GetCatchpointStream(basics.Round(2)) require.Equal(t, ledgercore.ErrNoEntry{}, err) require.Nil(t, reader) // File on disk, but database lost the record err = ct.accountsq.storeCatchpoint(context.Background(), basics.Round(3), "", "", 0) + require.NoError(t, err) reader, err = ct.GetCatchpointStream(basics.Round(3)) + require.NoError(t, err) n, err = reader.Read(dataRead) require.NoError(t, err) require.Equal(t, 3, n) @@ -317,8 +321,11 @@ func TestReproducibleCatchpointLabels(t *testing.T) { newPool.MicroAlgos.Raw -= prevTotals.RewardUnits() * rewardLevelDelta updates.Upsert(testPoolAddr, newPool) totals[testPoolAddr] = newPool + curTotals := accumulateTotals(t, protocol.ConsensusCurrentVersion, []map[basics.Address]basics.AccountData{totals}, rewardLevel) + require.Equal(t, prevTotals.All(), curTotals.All()) newTotals := ledgertesting.CalculateNewRoundAccountTotals(t, updates, rewardLevel, protoParams, base, prevTotals) + require.Equal(t, newTotals.All(), curTotals.All()) blk := bookkeeping.Block{ BlockHeader: bookkeeping.BlockHeader{ @@ -424,6 +431,7 @@ type blockingTracker struct { postCommitEntryLock chan struct{} postCommitReleaseLock chan struct{} committedUpToRound int64 + alwaysLock bool } // loadFromDisk is not implemented in the blockingTracker. @@ -458,7 +466,7 @@ func (bt *blockingTracker) commitRound(context.Context, *sql.Tx, *deferredCommit // postCommit implements entry/exit blockers, designed for testing. func (bt *blockingTracker) postCommit(ctx context.Context, dcc *deferredCommitContext) { - if dcc.isCatchpointRound && dcc.catchpointLabel != "" { + if bt.alwaysLock || (dcc.isCatchpointRound && dcc.catchpointLabel != "") { bt.postCommitEntryLock <- struct{}{} <-bt.postCommitReleaseLock } @@ -466,7 +474,7 @@ func (bt *blockingTracker) postCommit(ctx context.Context, dcc *deferredCommitCo // postCommitUnlocked implements entry/exit blockers, designed for testing. func (bt *blockingTracker) postCommitUnlocked(ctx context.Context, dcc *deferredCommitContext) { - if dcc.isCatchpointRound && dcc.catchpointLabel != "" { + if bt.alwaysLock || (dcc.isCatchpointRound && dcc.catchpointLabel != "") { bt.postCommitUnlockedEntryLock <- struct{}{} <-bt.postCommitUnlockedReleaseLock } diff --git a/ledger/catchpointwriter.go b/ledger/catchpointwriter.go index 349748176c..22ce40fb68 100644 --- a/ledger/catchpointwriter.go +++ b/ledger/catchpointwriter.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/catchpointwriter_test.go b/ledger/catchpointwriter_test.go index 0b14f5524a..7829fe31c1 100644 --- a/ledger/catchpointwriter_test.go +++ b/ledger/catchpointwriter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -27,6 +27,7 @@ import ( "io/ioutil" "os" "path/filepath" + "runtime" "testing" "github.com/stretchr/testify/require" @@ -156,6 +157,10 @@ func TestEncodedBalanceRecordEncoding(t *testing.T) { func TestCatchpointFileBalancesChunkEncoding(t *testing.T) { partitiontest.PartitionTest(t) + // The next operations are heavy on the memory. + // Garbage collection helps prevent trashing + runtime.GC() + fbc := catchpointFileBalancesChunk{} for i := 0; i < 512; i++ { fbc.Balances = append(fbc.Balances, makeTestEncodedBalanceRecord(t)) @@ -167,6 +172,9 @@ func TestCatchpointFileBalancesChunkEncoding(t *testing.T) { require.NoError(t, err) require.Equal(t, fbc, fbc2) + // Garbage collection helps prevent trashing + // for next tests + runtime.GC() } func TestBasicCatchpointWriter(t *testing.T) { diff --git a/ledger/catchupaccessor.go b/ledger/catchupaccessor.go index 784a258c74..8ed4ad7e4a 100644 --- a/ledger/catchupaccessor.go +++ b/ledger/catchupaccessor.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/catchupaccessor_test.go b/ledger/catchupaccessor_test.go index e3a073cdf5..353a2c5e38 100644 --- a/ledger/catchupaccessor_test.go +++ b/ledger/catchupaccessor_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/evalbench_test.go b/ledger/evalbench_test.go index 52974c7d37..dea5a38996 100644 --- a/ledger/evalbench_test.go +++ b/ledger/evalbench_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/evalindexer.go b/ledger/evalindexer.go index 251e7c1f61..78030ede75 100644 --- a/ledger/evalindexer.go +++ b/ledger/evalindexer.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -67,6 +67,7 @@ type Creatable struct { type indexerLedgerConnector struct { il indexerLedgerForEval genesisHash crypto.Digest + genesisProto config.ConsensusParams latestRound basics.Round roundResources EvalForIndexerResources } @@ -147,6 +148,11 @@ func (l indexerLedgerConnector) GenesisHash() crypto.Digest { return l.genesisHash } +// GenesisProto is part of LedgerForEvaluator interface. +func (l indexerLedgerConnector) GenesisProto() config.ConsensusParams { + return l.genesisProto +} + // Totals is part of LedgerForEvaluator interface. func (l indexerLedgerConnector) LatestTotals() (rnd basics.Round, totals ledgercore.AccountTotals, err error) { totals, err = l.il.LatestTotals() @@ -160,10 +166,11 @@ func (l indexerLedgerConnector) CompactCertVoters(_ basics.Round) (*ledgercore.V return nil, errors.New("CompactCertVoters() not implemented") } -func makeIndexerLedgerConnector(il indexerLedgerForEval, genesisHash crypto.Digest, latestRound basics.Round, roundResources EvalForIndexerResources) indexerLedgerConnector { +func makeIndexerLedgerConnector(il indexerLedgerForEval, genesisHash crypto.Digest, genesisProto config.ConsensusParams, latestRound basics.Round, roundResources EvalForIndexerResources) indexerLedgerConnector { return indexerLedgerConnector{ il: il, genesisHash: genesisHash, + genesisProto: genesisProto, latestRound: latestRound, roundResources: roundResources, } @@ -175,7 +182,7 @@ func makeIndexerLedgerConnector(il indexerLedgerForEval, genesisHash crypto.Dige // close amount for each transaction even when the real consensus parameters do not // support it. func EvalForIndexer(il indexerLedgerForEval, block *bookkeeping.Block, proto config.ConsensusParams, resources EvalForIndexerResources) (ledgercore.StateDelta, []transactions.SignedTxnInBlock, error) { - ilc := makeIndexerLedgerConnector(il, block.GenesisHash(), block.Round()-1, resources) + ilc := makeIndexerLedgerConnector(il, block.GenesisHash(), proto, block.Round()-1, resources) eval, err := internal.StartEvaluator( ilc, block.BlockHeader, diff --git a/ledger/evalindexer_test.go b/ledger/evalindexer_test.go index 76e4d2e423..6d944917da 100644 --- a/ledger/evalindexer_test.go +++ b/ledger/evalindexer_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -251,6 +251,25 @@ func TestEvalForIndexerForExpiredAccounts(t *testing.T) { require.NoError(t, err) } +func newTestLedger(t testing.TB, balances bookkeeping.GenesisBalances) *Ledger { + var genHash crypto.Digest + crypto.RandBytes(genHash[:]) + genBlock, err := bookkeeping.MakeGenesisBlock(protocol.ConsensusFuture, balances, "test", genHash) + require.NoError(t, err) + require.False(t, genBlock.FeeSink.IsZero()) + require.False(t, genBlock.RewardsPool.IsZero()) + dbName := fmt.Sprintf("%s.%d", t.Name(), crypto.RandUint64()) + cfg := config.GetDefaultLocal() + cfg.Archival = true + l, err := OpenLedger(logging.Base(), dbName, true, ledgercore.InitState{ + Block: genBlock, + Accounts: balances.Balances, + GenesisHash: genHash, + }, cfg) + require.NoError(t, err) + return l +} + // Test that preloading data in cow base works as expected. func TestResourceCaching(t *testing.T) { partitiontest.PartitionTest(t) @@ -285,7 +304,8 @@ func TestResourceCaching(t *testing.T) { }, } - ilc := makeIndexerLedgerConnector(indexerLedgerForEvalImpl{l: l, latestRound: basics.Round(0)}, block.GenesisHash(), block.Round()-1, resources) + proto := config.Consensus[protocol.ConsensusFuture] + ilc := makeIndexerLedgerConnector(indexerLedgerForEvalImpl{l: l, latestRound: basics.Round(0)}, block.GenesisHash(), proto, block.Round()-1, resources) { accountData, rnd, err := ilc.LookupWithoutRewards(basics.Round(0), address) diff --git a/ledger/internal/appcow.go b/ledger/internal/appcow.go index 9a136f4bfb..ec1da1ff85 100644 --- a/ledger/internal/appcow.go +++ b/ledger/internal/appcow.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -256,8 +256,6 @@ func (cb *roundCowState) AllocateApp(addr basics.Address, aidx basics.AppIndex, cb.mods.ModifiedAppLocalStates[aa] = true } - cb.trackCreatable(basics.CreatableIndex(aidx)) - return nil } @@ -471,37 +469,48 @@ func MakeDebugBalances(l LedgerForCowBase, round basics.Round, proto protocol.Co return cb } -// StatefulEval runs application. -// Execution happens in a child cow and all modifications are merged into parent if the program passes -func (cb *roundCowState) StatefulEval(params logic.EvalParams, aidx basics.AppIndex, program []byte) (pass bool, evalDelta transactions.EvalDelta, err error) { +// StatefulEval runs application. Execution happens in a child cow and all +// modifications are merged into parent and the ApplyData in params[gi] is +// filled if the program passes. +func (cb *roundCowState) StatefulEval(gi int, params *logic.EvalParams, aidx basics.AppIndex, program []byte) (pass bool, evalDelta transactions.EvalDelta, err error) { // Make a child cow to eval our program in calf := cb.child(1) - params.Ledger, err = newLogicLedger(calf, aidx) - if err != nil { - return false, transactions.EvalDelta{}, err - } + params.Ledger = newLogicLedger(calf) // Eval the program - var cx *logic.EvalContext - pass, cx, err = logic.EvalStatefulCx(program, params) + pass, cx, err := logic.EvalContract(program, gi, aidx, params) if err != nil { var details string if cx != nil { pc, det := cx.PcDetails() details = fmt.Sprintf("pc=%d, opcodes=%s", pc, det) } + // Don't wrap ClearStateBudgetError, so it will be taken seriously + if _, ok := err.(logic.ClearStateBudgetError); ok { + return false, transactions.EvalDelta{}, err + } return false, transactions.EvalDelta{}, ledgercore.LogicEvalError{Err: err, Details: details} } // If program passed, build our eval delta, and commit to state changes if pass { - evalDelta, err = calf.BuildEvalDelta(aidx, ¶ms.Txn.Txn) - if err != nil { - return false, transactions.EvalDelta{}, err + // Before Contract to Contract calls, use BuildEvalDelta because it has + // hairy code to maintain compatibility over some buggy old versions + // that created EvalDeltas differently. But after introducing c2c, it's + // "too late" to build the EvalDelta here, since the ledger includes + // changes from this app and any inner called apps. Instead, we now keep + // the EvalDelta built as we go, in app evaluation. So just use it. + if cb.proto.LogicSigVersion < 6 { + evalDelta, err = calf.BuildEvalDelta(aidx, ¶ms.TxnGroup[gi].Txn) + if err != nil { + return false, transactions.EvalDelta{}, err + } + evalDelta.Logs = params.TxnGroup[gi].EvalDelta.Logs + evalDelta.InnerTxns = params.TxnGroup[gi].EvalDelta.InnerTxns + } else { + evalDelta = params.TxnGroup[gi].EvalDelta } calf.commitToParent() - evalDelta.Logs = cx.Logs - evalDelta.InnerTxns = cx.InnerTxns } return pass, evalDelta, nil diff --git a/ledger/internal/appcow_test.go b/ledger/internal/appcow_test.go index 978854eb8a..4b4d14f78d 100644 --- a/ledger/internal/appcow_test.go +++ b/ledger/internal/appcow_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/internal/applications.go b/ledger/internal/applications.go index fc18699b79..1c9502c5a8 100644 --- a/ledger/internal/applications.go +++ b/ledger/internal/applications.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -19,22 +19,19 @@ package internal import ( "fmt" - "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/transactions" + "github.com/algorand/go-algorand/data/transactions/logic" "github.com/algorand/go-algorand/ledger/apply" "github.com/algorand/go-algorand/protocol" ) type logicLedger struct { - aidx basics.AppIndex - creator basics.Address - cow cowForLogicLedger + cow cowForLogicLedger } type cowForLogicLedger interface { Get(addr basics.Address, withPendingRewards bool) (basics.AccountData, error) - GetCreatableID(groupIdx int) basics.CreatableIndex GetCreator(cidx basics.CreatableIndex, ctype basics.CreatableType) (basics.Address, bool, error) GetKey(addr basics.Address, aidx basics.AppIndex, global bool, key string, accountIdx uint64) (basics.TealValue, bool, error) BuildEvalDelta(aidx basics.AppIndex, txn *transactions.Transaction) (transactions.EvalDelta, error) @@ -49,44 +46,18 @@ type cowForLogicLedger interface { incTxnCount() } -func newLogicLedger(cow cowForLogicLedger, aidx basics.AppIndex) (*logicLedger, error) { - if aidx == basics.AppIndex(0) { - return nil, fmt.Errorf("cannot make logic ledger for app index 0") +func newLogicLedger(cow cowForLogicLedger) *logicLedger { + return &logicLedger{ + cow: cow, } - - al := &logicLedger{ - aidx: aidx, - cow: cow, - } - - // Fetch app creator so we don't have to look it up every time we get/set/del - // a key for this app's global state - creator, err := al.fetchAppCreator(al.aidx) - if err != nil { - return nil, err - } - al.creator = creator - - return al, nil } -func (al *logicLedger) Balance(addr basics.Address) (res basics.MicroAlgos, err error) { - // Fetch record with pending rewards applied +func (al *logicLedger) AccountData(addr basics.Address) (basics.AccountData, error) { record, err := al.cow.Get(addr, true) if err != nil { - return + return basics.AccountData{}, err } - - return record.MicroAlgos, nil -} - -func (al *logicLedger) MinBalance(addr basics.Address, proto *config.ConsensusParams) (res basics.MicroAlgos, err error) { - record, err := al.cow.Get(addr, false) // pending rewards unneeded - if err != nil { - return - } - - return record.MinBalance(proto), nil + return record, nil } func (al *logicLedger) Authorizer(addr basics.Address) (basics.Address, error) { @@ -100,10 +71,6 @@ func (al *logicLedger) Authorizer(addr basics.Address) (basics.Address, error) { return addr, nil } -func (al *logicLedger) GetCreatableID(groupIdx int) basics.CreatableIndex { - return al.cow.GetCreatableID(groupIdx) -} - func (al *logicLedger) AssetHolding(addr basics.Address, assetIdx basics.AssetIndex) (basics.AssetHolding, error) { // Fetch the requested balance record record, err := al.cow.Get(addr, false) @@ -185,34 +152,20 @@ func (al *logicLedger) LatestTimestamp() int64 { return al.cow.prevTimestamp() } -func (al *logicLedger) ApplicationID() basics.AppIndex { - return al.aidx -} - -func (al *logicLedger) CreatorAddress() basics.Address { - return al.creator -} - func (al *logicLedger) OptedIn(addr basics.Address, appIdx basics.AppIndex) (bool, error) { - if appIdx == basics.AppIndex(0) { - appIdx = al.aidx - } return al.cow.allocated(addr, appIdx, false) } func (al *logicLedger) GetLocal(addr basics.Address, appIdx basics.AppIndex, key string, accountIdx uint64) (basics.TealValue, bool, error) { - if appIdx == basics.AppIndex(0) { - appIdx = al.aidx - } return al.cow.GetKey(addr, appIdx, false, key, accountIdx) } -func (al *logicLedger) SetLocal(addr basics.Address, key string, value basics.TealValue, accountIdx uint64) error { - return al.cow.SetKey(addr, al.aidx, false, key, value, accountIdx) +func (al *logicLedger) SetLocal(addr basics.Address, appIdx basics.AppIndex, key string, value basics.TealValue, accountIdx uint64) error { + return al.cow.SetKey(addr, appIdx, false, key, value, accountIdx) } -func (al *logicLedger) DelLocal(addr basics.Address, key string, accountIdx uint64) error { - return al.cow.DelKey(addr, al.aidx, false, key, accountIdx) +func (al *logicLedger) DelLocal(addr basics.Address, appIdx basics.AppIndex, key string, accountIdx uint64) error { + return al.cow.DelKey(addr, appIdx, false, key, accountIdx) } func (al *logicLedger) fetchAppCreator(appIdx basics.AppIndex) (basics.Address, error) { @@ -229,9 +182,6 @@ func (al *logicLedger) fetchAppCreator(appIdx basics.AppIndex) (basics.Address, } func (al *logicLedger) GetGlobal(appIdx basics.AppIndex, key string) (basics.TealValue, bool, error) { - if appIdx == basics.AppIndex(0) { - appIdx = al.aidx - } addr, err := al.fetchAppCreator(appIdx) if err != nil { return basics.TealValue{}, false, err @@ -239,16 +189,20 @@ func (al *logicLedger) GetGlobal(appIdx basics.AppIndex, key string) (basics.Tea return al.cow.GetKey(addr, appIdx, true, key, 0) } -func (al *logicLedger) SetGlobal(key string, value basics.TealValue) error { - return al.cow.SetKey(al.creator, al.aidx, true, key, value, 0) -} - -func (al *logicLedger) DelGlobal(key string) error { - return al.cow.DelKey(al.creator, al.aidx, true, key, 0) +func (al *logicLedger) SetGlobal(appIdx basics.AppIndex, key string, value basics.TealValue) error { + creator, err := al.fetchAppCreator(appIdx) + if err != nil { + return err + } + return al.cow.SetKey(creator, appIdx, true, key, value, 0) } -func (al *logicLedger) GetDelta(txn *transactions.Transaction) (evalDelta transactions.EvalDelta, err error) { - return al.cow.BuildEvalDelta(al.aidx, txn) +func (al *logicLedger) DelGlobal(appIdx basics.AppIndex, key string) error { + creator, err := al.fetchAppCreator(appIdx) + if err != nil { + return err + } + return al.cow.DelKey(creator, appIdx, true, key, 0) } func (al *logicLedger) balances() (apply.Balances, error) { @@ -259,23 +213,22 @@ func (al *logicLedger) balances() (apply.Balances, error) { return balances, nil } -func (al *logicLedger) Perform(tx *transactions.Transaction, spec transactions.SpecialAddresses) (transactions.ApplyData, error) { - var ad transactions.ApplyData - +func (al *logicLedger) Perform(gi int, ep *logic.EvalParams) error { + txn := &ep.TxnGroup[gi] balances, err := al.balances() if err != nil { - return ad, err + return err } // move fee to pool - err = balances.Move(tx.Sender, spec.FeeSink, tx.Fee, &ad.SenderRewards, nil) + err = balances.Move(txn.Txn.Sender, ep.Specials.FeeSink, txn.Txn.Fee, &txn.ApplyData.SenderRewards, nil) if err != nil { - return ad, err + return err } - err = apply.Rekey(balances, tx) + err = apply.Rekey(balances, &txn.Txn) if err != nil { - return ad, err + return err } // compared to eval.transaction() it may seem strange that we @@ -289,26 +242,33 @@ func (al *logicLedger) Perform(tx *transactions.Transaction, spec transactions.S // first glance. al.cow.incTxnCount() - switch tx.Type { + switch txn.Txn.Type { case protocol.PaymentTx: - err = apply.Payment(tx.PaymentTxnFields, tx.Header, balances, spec, &ad) + err = apply.Payment(txn.Txn.PaymentTxnFields, txn.Txn.Header, balances, *ep.Specials, &txn.ApplyData) case protocol.KeyRegistrationTx: - err = apply.Keyreg(tx.KeyregTxnFields, tx.Header, balances, spec, &ad, al.Round()) + err = apply.Keyreg(txn.Txn.KeyregTxnFields, txn.Txn.Header, balances, *ep.Specials, &txn.ApplyData, + al.Round()) case protocol.AssetConfigTx: - err = apply.AssetConfig(tx.AssetConfigTxnFields, tx.Header, balances, spec, &ad, al.cow.txnCounter()) + err = apply.AssetConfig(txn.Txn.AssetConfigTxnFields, txn.Txn.Header, balances, *ep.Specials, &txn.ApplyData, + al.cow.txnCounter()) case protocol.AssetTransferTx: - err = apply.AssetTransfer(tx.AssetTransferTxnFields, tx.Header, balances, spec, &ad) + err = apply.AssetTransfer(txn.Txn.AssetTransferTxnFields, txn.Txn.Header, balances, *ep.Specials, &txn.ApplyData) + case protocol.AssetFreezeTx: - err = apply.AssetFreeze(tx.AssetFreezeTxnFields, tx.Header, balances, spec, &ad) + err = apply.AssetFreeze(txn.Txn.AssetFreezeTxnFields, txn.Txn.Header, balances, *ep.Specials, &txn.ApplyData) + + case protocol.ApplicationCallTx: + err = apply.ApplicationCall(txn.Txn.ApplicationCallTxnFields, txn.Txn.Header, balances, &txn.ApplyData, + gi, ep, al.cow.txnCounter()) default: - err = fmt.Errorf("%s tx in AVM", tx.Type) + err = fmt.Errorf("%s tx in AVM", txn.Txn.Type) } if err != nil { - return ad, err + return err } // We don't check min balances during in app txns. @@ -317,6 +277,10 @@ func (al *logicLedger) Perform(tx *transactions.Transaction, spec transactions.S // it when the top-level txn concludes, as because cow will return // all changed accounts in modifiedAccounts(). - return ad, nil + return nil + +} +func (al *logicLedger) Counter() uint64 { + return al.cow.txnCounter() } diff --git a/ledger/internal/applications_test.go b/ledger/internal/applications_test.go index 94efcef1aa..2ea442171a 100644 --- a/ledger/internal/applications_test.go +++ b/ledger/internal/applications_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -43,7 +43,6 @@ type mockCowForLogicLedger struct { cr map[creatableLocator]basics.Address brs map[basics.Address]basics.AccountData stores map[storeLocator]basics.TealKeyValue - tcs map[int]basics.CreatableIndex txc uint64 } @@ -55,10 +54,6 @@ func (c *mockCowForLogicLedger) Get(addr basics.Address, withPendingRewards bool return br, nil } -func (c *mockCowForLogicLedger) GetCreatableID(groupIdx int) basics.CreatableIndex { - return c.tcs[groupIdx] -} - func (c *mockCowForLogicLedger) GetCreator(cidx basics.CreatableIndex, ctype basics.CreatableType) (basics.Address, bool, error) { addr, found := c.cr[creatableLocator{cidx, ctype}] return addr, found, nil @@ -132,27 +127,9 @@ func TestLogicLedgerMake(t *testing.T) { a := require.New(t) - _, err := newLogicLedger(nil, 0) - a.Error(err) - a.Contains(err.Error(), "cannot make logic ledger for app index 0") - - addr := ledgertesting.RandomAddress() - aidx := basics.AppIndex(1) - c := &mockCowForLogicLedger{} - _, err = newLogicLedger(c, 0) - a.Error(err) - a.Contains(err.Error(), "cannot make logic ledger for app index 0") - - _, err = newLogicLedger(c, aidx) - a.Error(err) - a.Contains(err.Error(), fmt.Sprintf("app %d does not exist", aidx)) - - c = newCowMock([]modsData{{addr, basics.CreatableIndex(aidx), basics.AppCreatable}}) - l, err := newLogicLedger(c, aidx) - a.NoError(err) + l := newLogicLedger(c) a.NotNil(l) - a.Equal(aidx, l.aidx) a.Equal(c, l.cow) } @@ -161,19 +138,16 @@ func TestLogicLedgerBalances(t *testing.T) { a := require.New(t) - addr := ledgertesting.RandomAddress() - aidx := basics.AppIndex(1) - c := newCowMock([]modsData{{addr, basics.CreatableIndex(aidx), basics.AppCreatable}}) - l, err := newLogicLedger(c, aidx) - a.NoError(err) + c := newCowMock(nil) + l := newLogicLedger(c) a.NotNil(l) addr1 := ledgertesting.RandomAddress() ble := basics.MicroAlgos{Raw: 100} c.brs = map[basics.Address]basics.AccountData{addr1: {MicroAlgos: ble}} - bla, err := l.Balance(addr1) + acct, err := l.AccountData(addr1) a.NoError(err) - a.Equal(ble, bla) + a.Equal(ble, acct.MicroAlgos) } func TestLogicLedgerGetters(t *testing.T) { @@ -184,8 +158,7 @@ func TestLogicLedgerGetters(t *testing.T) { addr := ledgertesting.RandomAddress() aidx := basics.AppIndex(1) c := newCowMock([]modsData{{addr, basics.CreatableIndex(aidx), basics.AppCreatable}}) - l, err := newLogicLedger(c, aidx) - a.NoError(err) + l := newLogicLedger(c) a.NotNil(l) round := basics.Round(1234) @@ -195,12 +168,9 @@ func TestLogicLedgerGetters(t *testing.T) { addr1 := ledgertesting.RandomAddress() c.stores = map[storeLocator]basics.TealKeyValue{{addr1, aidx, false}: {}} - a.Equal(aidx, l.ApplicationID()) a.Equal(round, l.Round()) a.Equal(ts, l.LatestTimestamp()) - a.True(l.OptedIn(addr1, 0)) a.True(l.OptedIn(addr1, aidx)) - a.False(l.OptedIn(addr, 0)) a.False(l.OptedIn(addr, aidx)) } @@ -217,11 +187,10 @@ func TestLogicLedgerAsset(t *testing.T) { {addr, basics.CreatableIndex(aidx), basics.AppCreatable}, {addr1, basics.CreatableIndex(assetIdx), basics.AssetCreatable}, }) - l, err := newLogicLedger(c, aidx) - a.NoError(err) + l := newLogicLedger(c) a.NotNil(l) - _, _, err = l.AssetParams(basics.AssetIndex(aidx)) + _, _, err := l.AssetParams(basics.AssetIndex(aidx)) a.Error(err) a.Contains(err.Error(), fmt.Sprintf("asset %d does not exist", aidx)) @@ -263,8 +232,7 @@ func TestLogicLedgerGetKey(t *testing.T) { {addr, basics.CreatableIndex(aidx), basics.AppCreatable}, {addr1, basics.CreatableIndex(assetIdx), basics.AssetCreatable}, }) - l, err := newLogicLedger(c, aidx) - a.NoError(err) + l := newLogicLedger(c) a.NotNil(l) _, ok, err := l.GetGlobal(basics.AppIndex(assetIdx), "gkey") @@ -303,23 +271,22 @@ func TestLogicLedgerSetKey(t *testing.T) { c := newCowMock([]modsData{ {addr, basics.CreatableIndex(aidx), basics.AppCreatable}, }) - l, err := newLogicLedger(c, aidx) - a.NoError(err) + l := newLogicLedger(c) a.NotNil(l) tv := basics.TealValue{Type: basics.TealUintType, Uint: 1} - err = l.SetGlobal("gkey", tv) + err := l.SetGlobal(aidx, "gkey", tv) a.Error(err) a.Contains(err.Error(), fmt.Sprintf("no store for (%s %d %v) in mock cow", addr, aidx, true)) tv2 := basics.TealValue{Type: basics.TealUintType, Uint: 2} c.stores = map[storeLocator]basics.TealKeyValue{{addr, aidx, true}: {"gkey": tv}} - err = l.SetGlobal("gkey", tv2) + err = l.SetGlobal(aidx, "gkey", tv2) a.NoError(err) // check local c.stores = map[storeLocator]basics.TealKeyValue{{addr, aidx, false}: {"lkey": tv}} - err = l.SetLocal(addr, "lkey", tv2, 0) + err = l.SetLocal(addr, aidx, "lkey", tv2, 0) a.NoError(err) } @@ -333,21 +300,20 @@ func TestLogicLedgerDelKey(t *testing.T) { c := newCowMock([]modsData{ {addr, basics.CreatableIndex(aidx), basics.AppCreatable}, }) - l, err := newLogicLedger(c, aidx) - a.NoError(err) + l := newLogicLedger(c) a.NotNil(l) - err = l.DelGlobal("gkey") + err := l.DelGlobal(aidx, "gkey") a.Error(err) a.Contains(err.Error(), fmt.Sprintf("no store for (%s %d %v) in mock cow", addr, aidx, true)) tv := basics.TealValue{Type: basics.TealUintType, Uint: 1} c.stores = map[storeLocator]basics.TealKeyValue{{addr, aidx, true}: {"gkey": tv}} - err = l.DelGlobal("gkey") + err = l.DelGlobal(aidx, "gkey") a.NoError(err) addr1 := ledgertesting.RandomAddress() c.stores = map[storeLocator]basics.TealKeyValue{{addr1, aidx, false}: {"lkey": tv}} - err = l.DelLocal(addr1, "lkey", 0) + err = l.DelLocal(addr1, aidx, "lkey", 0) a.NoError(err) } diff --git a/ledger/internal/apptxn_test.go b/ledger/internal/apptxn_test.go new file mode 100644 index 0000000000..daf56b4652 --- /dev/null +++ b/ledger/internal/apptxn_test.go @@ -0,0 +1,3259 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package internal_test + +import ( + "encoding/hex" + "fmt" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/algorand/go-algorand/config" + "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/data/basics" + "github.com/algorand/go-algorand/data/bookkeeping" + "github.com/algorand/go-algorand/data/transactions" + "github.com/algorand/go-algorand/data/transactions/logic" + "github.com/algorand/go-algorand/data/txntest" + "github.com/algorand/go-algorand/ledger" + "github.com/algorand/go-algorand/ledger/ledgercore" + ledgertesting "github.com/algorand/go-algorand/ledger/testing" + "github.com/algorand/go-algorand/logging" + "github.com/algorand/go-algorand/protocol" + "github.com/algorand/go-algorand/test/partitiontest" +) + +// main wraps up some TEAL source in a header and footer so that it is +// an app that does nothing at create time, but otherwise runs source, +// then approves, if the source avoids panicing and leaves the stack +// empty. +func main(source string) string { + return strings.Replace(fmt.Sprintf(`txn ApplicationID + bz end + %s + end: int 1`, source), ";", "\n", -1) +} + +// TestPayAction ensures a pay in teal affects balances +func TestPayAction(t *testing.T) { + partitiontest.PartitionTest(t) + + genesisInitState, addrs, _ := ledgertesting.Genesis(10) + + l, err := ledger.OpenLedger(logging.TestingLog(t), "", true, genesisInitState, config.GetDefaultLocal()) + require.NoError(t, err) + defer l.Close() + + create := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + itxn_begin + int pay + itxn_field TypeEnum + int 5000 + itxn_field Amount + txn Accounts 1 + itxn_field Receiver + itxn_submit +`), + } + + ai := basics.AppIndex(1) + fund := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: ai.Address(), + Amount: 200000, // account min balance, plus fees + } + + payout1 := txntest.Txn{ + Type: "appl", + Sender: addrs[1], + ApplicationID: ai, + Accounts: []basics.Address{addrs[1]}, // pay self + } + + eval := nextBlock(t, l, true, nil) + txns(t, l, eval, &create, &fund, &payout1) + vb := endBlock(t, l, eval) + + // AD contains expected appIndex + require.Equal(t, ai, vb.Block().Payset[0].ApplyData.ApplicationID) + + ad0 := micros(t, l, addrs[0]) + ad1 := micros(t, l, addrs[1]) + app := micros(t, l, ai.Address()) + + genAccounts := genesisInitState.Accounts + // create(1000) and fund(1000 + 200000) + require.Equal(t, uint64(202000), genAccounts[addrs[0]].MicroAlgos.Raw-ad0) + // paid 5000, but 1000 fee + require.Equal(t, uint64(4000), ad1-genAccounts[addrs[1]].MicroAlgos.Raw) + // app still has 194000 (paid out 5000, and paid fee to do it) + require.Equal(t, uint64(194000), app) + + // Build up Residue in RewardsState so it's ready to pay + for i := 1; i < 10; i++ { + eval = nextBlock(t, l, true, nil) + endBlock(t, l, eval) + } + + eval = nextBlock(t, l, true, nil) + payout2 := txntest.Txn{ + Type: "appl", + Sender: addrs[1], + ApplicationID: ai, + Accounts: []basics.Address{addrs[2]}, // pay other + } + txn(t, l, eval, &payout2) + // confirm that modifiedAccounts can see account in inner txn + vb = endBlock(t, l, eval) + + deltas := vb.Delta() + require.Contains(t, deltas.Accts.ModifiedAccounts(), addrs[2]) + + payInBlock := vb.Block().Payset[0] + rewards := payInBlock.ApplyData.SenderRewards.Raw + require.Greater(t, rewards, uint64(2000)) // some biggish number + inners := payInBlock.ApplyData.EvalDelta.InnerTxns + require.Len(t, inners, 1) + + // addr[2] is going to get the same rewards as addr[1], who + // originally sent the top-level txn. Both had their algo balance + // touched and has very nearly the same balance. + require.Equal(t, rewards, inners[0].ReceiverRewards.Raw) + // app gets none, because it has less than 1A + require.Equal(t, uint64(0), inners[0].SenderRewards.Raw) + + ad1 = micros(t, l, addrs[1]) + ad2 := micros(t, l, addrs[2]) + app = micros(t, l, ai.Address()) + + // paid 5000, in first payout (only), but paid 1000 fee in each payout txn + require.Equal(t, rewards+3000, ad1-genAccounts[addrs[1]].MicroAlgos.Raw) + // app still has 188000 (paid out 10000, and paid 2k fees to do it) + // no rewards because owns less than an algo + require.Equal(t, uint64(200000)-10000-2000, app) + + // paid 5000 by payout2, never paid any fees, got same rewards + require.Equal(t, rewards+uint64(5000), ad2-genAccounts[addrs[2]].MicroAlgos.Raw) + + // Now fund the app account much more, so we can confirm it gets rewards. + tenkalgos := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: ai.Address(), + Amount: 10 * 1000 * 1000000, // account min balance, plus fees + } + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &tenkalgos) + endBlock(t, l, eval) + beforepay := micros(t, l, ai.Address()) + + // Build up Residue in RewardsState so it's ready to pay again + for i := 1; i < 10; i++ { + eval = nextBlock(t, l, true, nil) + endBlock(t, l, eval) + } + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, payout2.Noted("2")) + vb = endBlock(t, l, eval) + + afterpay := micros(t, l, ai.Address()) + + payInBlock = vb.Block().Payset[0] + inners = payInBlock.ApplyData.EvalDelta.InnerTxns + require.Len(t, inners, 1) + + appreward := inners[0].SenderRewards.Raw + require.Greater(t, appreward, uint64(1000)) + + require.Equal(t, beforepay+appreward-5000-1000, afterpay) +} + +// TestAxferAction ensures axfers in teal have the intended effects +func TestAxferAction(t *testing.T) { + partitiontest.PartitionTest(t) + + genesisInitState, addrs, _ := ledgertesting.Genesis(10) + + l, err := ledger.OpenLedger(logging.TestingLog(t), "", true, genesisInitState, config.GetDefaultLocal()) + require.NoError(t, err) + defer l.Close() + + asa := txntest.Txn{ + Type: "acfg", + Sender: addrs[0], + AssetParams: basics.AssetParams{ + Total: 1000000, + Decimals: 3, + UnitName: "oz", + AssetName: "Gold", + URL: "https://gold.rush/", + }, + } + + app := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + itxn_begin + int axfer + itxn_field TypeEnum + txn Assets 0 + itxn_field XferAsset + + txn ApplicationArgs 0 + byte "optin" + == + bz withdraw + // let AssetAmount default to 0 + global CurrentApplicationAddress + itxn_field AssetReceiver + b submit +withdraw: + txn ApplicationArgs 0 + byte "close" + == + bz noclose + txn Accounts 1 + itxn_field AssetCloseTo + b skipamount +noclose: int 10000 + itxn_field AssetAmount +skipamount: + txn Accounts 1 + itxn_field AssetReceiver +submit: itxn_submit +`), + } + + eval := nextBlock(t, l, true, nil) + txns(t, l, eval, &asa, &app) + vb := endBlock(t, l, eval) + + asaIndex := basics.AssetIndex(1) + require.Equal(t, asaIndex, vb.Block().Payset[0].ApplyData.ConfigAsset) + appIndex := basics.AppIndex(2) + require.Equal(t, appIndex, vb.Block().Payset[1].ApplyData.ApplicationID) + + fund := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: appIndex.Address(), + Amount: 300000, // account min balance, optin min balance, plus fees + // stay under 1M, to avoid rewards complications + } + + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &fund) + endBlock(t, l, eval) + + fundgold := txntest.Txn{ + Type: "axfer", + Sender: addrs[0], + XferAsset: asaIndex, + AssetReceiver: appIndex.Address(), + AssetAmount: 20000, + } + + // Fail, because app account is not opted in. + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &fundgold, fmt.Sprintf("asset %d missing", asaIndex)) + endBlock(t, l, eval) + + amount, in := holding(t, l, appIndex.Address(), asaIndex) + require.False(t, in) + require.Equal(t, amount, uint64(0)) + + optin := txntest.Txn{ + Type: "appl", + ApplicationID: appIndex, + Sender: addrs[0], + ApplicationArgs: [][]byte{[]byte("optin")}, + ForeignAssets: []basics.AssetIndex{asaIndex}, + } + + // Tell the app to opt itself in. + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &optin) + endBlock(t, l, eval) + + amount, in = holding(t, l, appIndex.Address(), asaIndex) + require.True(t, in) + require.Equal(t, amount, uint64(0)) + + // Now, suceed, because opted in. + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &fundgold) + endBlock(t, l, eval) + + amount, in = holding(t, l, appIndex.Address(), asaIndex) + require.True(t, in) + require.Equal(t, amount, uint64(20000)) + + withdraw := txntest.Txn{ + Type: "appl", + ApplicationID: appIndex, + Sender: addrs[0], + ApplicationArgs: [][]byte{[]byte("withdraw")}, + ForeignAssets: []basics.AssetIndex{asaIndex}, + Accounts: []basics.Address{addrs[0]}, + } + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &withdraw) + endBlock(t, l, eval) + + amount, in = holding(t, l, appIndex.Address(), asaIndex) + require.True(t, in) + require.Equal(t, amount, uint64(10000)) + + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, withdraw.Noted("2")) + endBlock(t, l, eval) + + amount, in = holding(t, l, appIndex.Address(), asaIndex) + require.True(t, in) // Zero left, but still opted in + require.Equal(t, amount, uint64(0)) + + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, withdraw.Noted("3"), "underflow on subtracting") + endBlock(t, l, eval) + + amount, in = holding(t, l, appIndex.Address(), asaIndex) + require.True(t, in) // Zero left, but still opted in + require.Equal(t, amount, uint64(0)) + + close := txntest.Txn{ + Type: "appl", + ApplicationID: appIndex, + Sender: addrs[0], + ApplicationArgs: [][]byte{[]byte("close")}, + ForeignAssets: []basics.AssetIndex{asaIndex}, + Accounts: []basics.Address{addrs[0]}, + } + + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &close) + endBlock(t, l, eval) + + amount, in = holding(t, l, appIndex.Address(), asaIndex) + require.False(t, in) // Zero left, not opted in + require.Equal(t, amount, uint64(0)) + + // Now, fail again, opted out + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, fundgold.Noted("2"), fmt.Sprintf("asset %d missing", asaIndex)) + endBlock(t, l, eval) + + // Do it all again, so we can test closeTo when we have a non-zero balance + // Tell the app to opt itself in. + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, optin.Noted("a"), fundgold.Noted("a")) + endBlock(t, l, eval) + + amount, _ = holding(t, l, appIndex.Address(), asaIndex) + require.Equal(t, uint64(20000), amount) + left, _ := holding(t, l, addrs[0], asaIndex) + + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, close.Noted("a")) + endBlock(t, l, eval) + + amount, _ = holding(t, l, appIndex.Address(), asaIndex) + require.Equal(t, uint64(0), amount) + back, _ := holding(t, l, addrs[0], asaIndex) + require.Equal(t, uint64(20000), back-left) +} + +func newTestLedger(t testing.TB, balances bookkeeping.GenesisBalances) *ledger.Ledger { + return newTestLedgerWithConsensusVersion(t, balances, protocol.ConsensusFuture) +} + +func newTestLedgerWithConsensusVersion(t testing.TB, balances bookkeeping.GenesisBalances, cv protocol.ConsensusVersion) *ledger.Ledger { + var genHash crypto.Digest + crypto.RandBytes(genHash[:]) + genBlock, err := bookkeeping.MakeGenesisBlock(cv, balances, "test", genHash) + require.NoError(t, err) + require.False(t, genBlock.FeeSink.IsZero()) + require.False(t, genBlock.RewardsPool.IsZero()) + dbName := fmt.Sprintf("%s.%d", t.Name(), crypto.RandUint64()) + cfg := config.GetDefaultLocal() + cfg.Archival = true + l, err := ledger.OpenLedger(logging.Base(), dbName, true, ledgercore.InitState{ + Block: genBlock, + Accounts: balances.Balances, + GenesisHash: genHash, + }, cfg) + require.NoError(t, err) + return l +} + +// TestClawbackAction ensures an app address can act as clawback address. +func TestClawbackAction(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + asaIndex := basics.AssetIndex(1) + appIndex := basics.AppIndex(2) + + asa := txntest.Txn{ + Type: "acfg", + Sender: addrs[0], + AssetParams: basics.AssetParams{ + Total: 1000000, + Decimals: 3, + UnitName: "oz", + AssetName: "Gold", + URL: "https://gold.rush/", + Clawback: appIndex.Address(), + }, + } + + app := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + itxn_begin + + int axfer + itxn_field TypeEnum + + txn Assets 0 + itxn_field XferAsset + + txn Accounts 1 + itxn_field AssetSender + + txn Accounts 2 + itxn_field AssetReceiver + + int 1000 + itxn_field AssetAmount + + itxn_submit +`), + } + + optin := txntest.Txn{ + Type: "axfer", + Sender: addrs[1], + AssetReceiver: addrs[1], + XferAsset: asaIndex, + } + eval := nextBlock(t, l, true, nil) + txns(t, l, eval, &asa, &app, &optin) + vb := endBlock(t, l, eval) + + require.Equal(t, asaIndex, vb.Block().Payset[0].ApplyData.ConfigAsset) + require.Equal(t, appIndex, vb.Block().Payset[1].ApplyData.ApplicationID) + + bystander := addrs[2] // Has no authority of its own + overpay := txntest.Txn{ + Type: "pay", + Sender: bystander, + Receiver: bystander, + Fee: 2000, // Overpay fee so that app account can be unfunded + } + clawmove := txntest.Txn{ + Type: "appl", + Sender: bystander, + ApplicationID: appIndex, + ForeignAssets: []basics.AssetIndex{asaIndex}, + Accounts: []basics.Address{addrs[0], addrs[1]}, + } + eval = nextBlock(t, l, true, nil) + err := txgroup(t, l, eval, &overpay, &clawmove) + require.NoError(t, err) + endBlock(t, l, eval) + + amount, _ := holding(t, l, addrs[1], asaIndex) + require.Equal(t, amount, uint64(1000)) +} + +// TestRekeyAction ensures an app can transact for a rekeyed account +func TestRekeyAction(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + appIndex := basics.AppIndex(1) + ezpayer := txntest.Txn{ + Type: "appl", + Sender: addrs[5], + ApprovalProgram: main(` + itxn_begin + int pay + itxn_field TypeEnum + int 5000 + itxn_field Amount + txn Accounts 1 + itxn_field Sender + txn Accounts 2 + itxn_field Receiver + txn NumAccounts + int 3 + == + bz skipclose + txn Accounts 3 + itxn_field CloseRemainderTo +skipclose: + itxn_submit +`), + } + + rekey := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: addrs[0], + RekeyTo: appIndex.Address(), + } + + eval := nextBlock(t, l, true, nil) + txns(t, l, eval, &ezpayer, &rekey) + endBlock(t, l, eval) + + useacct := txntest.Txn{ + Type: "appl", + Sender: addrs[1], + ApplicationID: appIndex, + Accounts: []basics.Address{addrs[0], addrs[2]}, // pay 2 from 0 (which was rekeyed) + } + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &useacct) + endBlock(t, l, eval) + + // App was never funded (didn't spend from it's own acct) + require.Equal(t, uint64(0), micros(t, l, basics.AppIndex(1).Address())) + // addrs[2] got paid + require.Equal(t, uint64(5000), micros(t, l, addrs[2])-micros(t, l, addrs[6])) + // addrs[0] paid 5k + rekey fee + inner txn fee + require.Equal(t, uint64(7000), micros(t, l, addrs[6])-micros(t, l, addrs[0])) + + baduse := txntest.Txn{ + Type: "appl", + Sender: addrs[1], + ApplicationID: appIndex, + Accounts: []basics.Address{addrs[2], addrs[0]}, // pay 0 from 2 + } + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &baduse, "unauthorized") + endBlock(t, l, eval) + + // Now, we close addrs[0], which wipes its rekey status. Reopen + // it, and make sure the app can't spend. + + close := txntest.Txn{ + Type: "appl", + Sender: addrs[1], + ApplicationID: appIndex, + Accounts: []basics.Address{addrs[0], addrs[2], addrs[3]}, // close to 3 + } + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &close) + endBlock(t, l, eval) + + require.Equal(t, uint64(0), micros(t, l, addrs[0])) + + payback := txntest.Txn{ + Type: "pay", + Sender: addrs[3], + Receiver: addrs[0], + Amount: 10_000_000, + } + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &payback) + endBlock(t, l, eval) + + require.Equal(t, uint64(10_000_000), micros(t, l, addrs[0])) + + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, useacct.Noted("2"), "unauthorized") + endBlock(t, l, eval) +} + +// TestRekeyActionCloseAccount ensures closing and reopening a rekeyed account in a single app call +// properly removes the app as an authorizer for the account +func TestRekeyActionCloseAccount(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + appIndex := basics.AppIndex(1) + create := txntest.Txn{ + Type: "appl", + Sender: addrs[5], + ApprovalProgram: main(` + // close account 1 + itxn_begin + int pay + itxn_field TypeEnum + txn Accounts 1 + itxn_field Sender + txn Accounts 2 + itxn_field CloseRemainderTo + itxn_submit + + // reopen account 1 + itxn_begin + int pay + itxn_field TypeEnum + int 5000 + itxn_field Amount + txn Accounts 1 + itxn_field Receiver + itxn_submit + // send from account 1 again (should fail because closing an account erases rekeying) + itxn_begin + int pay + itxn_field TypeEnum + int 1 + itxn_field Amount + txn Accounts 1 + itxn_field Sender + txn Accounts 2 + itxn_field Receiver + itxn_submit +`), + } + + rekey := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: addrs[0], + RekeyTo: appIndex.Address(), + } + + fund := txntest.Txn{ + Type: "pay", + Sender: addrs[1], + Receiver: appIndex.Address(), + Amount: 1_000_000, + } + + eval := nextBlock(t, l, true, nil) + txns(t, l, eval, &create, &rekey, &fund) + endBlock(t, l, eval) + + useacct := txntest.Txn{ + Type: "appl", + Sender: addrs[1], + ApplicationID: appIndex, + Accounts: []basics.Address{addrs[0], addrs[2]}, + } + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &useacct, "unauthorized") + endBlock(t, l, eval) +} + +// TestDuplicatePayAction shows two pays with same parameters can be done as inner tarnsactions +func TestDuplicatePayAction(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + appIndex := basics.AppIndex(1) + create := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + itxn_begin + int pay + itxn_field TypeEnum + int 5000 + itxn_field Amount + txn Accounts 1 + itxn_field Receiver + itxn_submit + itxn_begin + int pay + itxn_field TypeEnum + int 5000 + itxn_field Amount + txn Accounts 1 + itxn_field Receiver + itxn_submit +`), + } + + fund := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: appIndex.Address(), + Amount: 200000, // account min balance, plus fees + } + + paytwice := txntest.Txn{ + Type: "appl", + Sender: addrs[1], + ApplicationID: appIndex, + Accounts: []basics.Address{addrs[1]}, // pay self + } + + eval := nextBlock(t, l, true, nil) + txns(t, l, eval, &create, &fund, &paytwice, create.Noted("in same block")) + vb := endBlock(t, l, eval) + + require.Equal(t, appIndex, vb.Block().Payset[0].ApplyData.ApplicationID) + require.Equal(t, 4, len(vb.Block().Payset)) + // create=1, fund=2, payTwice=3,4,5 + require.Equal(t, basics.AppIndex(6), vb.Block().Payset[3].ApplyData.ApplicationID) + + ad0 := micros(t, l, addrs[0]) + ad1 := micros(t, l, addrs[1]) + app := micros(t, l, appIndex.Address()) + + // create(1000) and fund(1000 + 200000), extra create (1000) + require.Equal(t, 203000, int(genBalances.Balances[addrs[0]].MicroAlgos.Raw-ad0)) + // paid 10000, but 1000 fee on tx + require.Equal(t, 9000, int(ad1-genBalances.Balances[addrs[1]].MicroAlgos.Raw)) + // app still has 188000 (paid out 10000, and paid 2 x fee to do it) + require.Equal(t, 188000, int(app)) + + // Now create another app, and see if it gets the index we expect. + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, create.Noted("again")) + vb = endBlock(t, l, eval) + + // create=1, fund=2, payTwice=3,4,5, insameblock=6 + require.Equal(t, basics.AppIndex(7), vb.Block().Payset[0].ApplyData.ApplicationID) +} + +// TestInnerTxCount ensures that inner transactions increment the TxnCounter +func TestInnerTxnCount(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + create := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + itxn_begin + int pay + itxn_field TypeEnum + int 5000 + itxn_field Amount + txn Accounts 1 + itxn_field Receiver + itxn_submit +`), + } + + fund := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: basics.AppIndex(1).Address(), + Amount: 200000, // account min balance, plus fees + } + + payout1 := txntest.Txn{ + Type: "appl", + Sender: addrs[1], + ApplicationID: basics.AppIndex(1), + Accounts: []basics.Address{addrs[1]}, // pay self + } + + eval := nextBlock(t, l, true, nil) + txns(t, l, eval, &create, &fund) + vb := endBlock(t, l, eval) + require.Equal(t, 2, int(vb.Block().TxnCounter)) + + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &payout1) + vb = endBlock(t, l, eval) + require.Equal(t, 4, int(vb.Block().TxnCounter)) +} + +// TestAcfgAction ensures assets can be created and configured in teal +func TestAcfgAction(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + appIndex := basics.AppIndex(1) + app := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + itxn_begin + int acfg + itxn_field TypeEnum + + txn ApplicationArgs 0 + byte "create" + == + bz manager + int 1000000 + itxn_field ConfigAssetTotal + int 3 + itxn_field ConfigAssetDecimals + byte "oz" + itxn_field ConfigAssetUnitName + byte "Gold" + itxn_field ConfigAssetName + byte "https://gold.rush/" + itxn_field ConfigAssetURL + + global CurrentApplicationAddress + dup + dup2 + itxn_field ConfigAssetManager + itxn_field ConfigAssetReserve + itxn_field ConfigAssetFreeze + itxn_field ConfigAssetClawback + b submit +manager: + // Put the current values in the itxn + txn Assets 0 + asset_params_get AssetManager + assert // exists + itxn_field ConfigAssetManager + + txn Assets 0 + asset_params_get AssetReserve + assert // exists + itxn_field ConfigAssetReserve + + txn Assets 0 + asset_params_get AssetFreeze + assert // exists + itxn_field ConfigAssetFreeze + + txn Assets 0 + asset_params_get AssetClawback + assert // exists + itxn_field ConfigAssetClawback + + + txn ApplicationArgs 0 + byte "manager" + == + bz reserve + txn Assets 0 + itxn_field ConfigAsset + txn ApplicationArgs 1 + itxn_field ConfigAssetManager + b submit +reserve: + txn ApplicationArgs 0 + byte "reserve" + == + bz freeze + txn Assets 0 + itxn_field ConfigAsset + txn ApplicationArgs 1 + itxn_field ConfigAssetReserve + b submit +freeze: + txn ApplicationArgs 0 + byte "freeze" + == + bz clawback + txn Assets 0 + itxn_field ConfigAsset + txn ApplicationArgs 1 + itxn_field ConfigAssetFreeze + b submit +clawback: + txn ApplicationArgs 0 + byte "clawback" + == + bz error + txn Assets 0 + itxn_field ConfigAsset + txn ApplicationArgs 1 + itxn_field ConfigAssetClawback + b submit +error: err +submit: itxn_submit +`), + } + + fund := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: appIndex.Address(), + Amount: 200_000, // exactly account min balance + one asset + } + + eval := nextBlock(t, l, true, nil) + txns(t, l, eval, &app, &fund) + endBlock(t, l, eval) + + createAsa := txntest.Txn{ + Type: "appl", + Sender: addrs[1], + ApplicationID: appIndex, + ApplicationArgs: [][]byte{[]byte("create")}, + } + + eval = nextBlock(t, l, true, nil) + // Can't create an asset if you have exactly 200,000 and need to pay fee + txn(t, l, eval, &createAsa, "balance 199000 below min 200000") + // fund it some more and try again + txns(t, l, eval, fund.Noted("more!"), &createAsa) + vb := endBlock(t, l, eval) + + asaIndex := vb.Block().Payset[1].EvalDelta.InnerTxns[0].ConfigAsset + require.Equal(t, basics.AssetIndex(5), asaIndex) + + asaParams, err := asaParams(t, l, basics.AssetIndex(5)) + require.NoError(t, err) + + require.Equal(t, 1_000_000, int(asaParams.Total)) + require.Equal(t, 3, int(asaParams.Decimals)) + require.Equal(t, "oz", asaParams.UnitName) + require.Equal(t, "Gold", asaParams.AssetName) + require.Equal(t, "https://gold.rush/", asaParams.URL) + + require.Equal(t, appIndex.Address(), asaParams.Manager) + + for _, a := range []string{"reserve", "freeze", "clawback", "manager"} { + check := txntest.Txn{ + Type: "appl", + Sender: addrs[1], + ApplicationID: appIndex, + ApplicationArgs: [][]byte{[]byte(a), []byte("junkjunkjunkjunkjunkjunkjunkjunk")}, + ForeignAssets: []basics.AssetIndex{asaIndex}, + } + eval = nextBlock(t, l, true, nil) + t.Log(a) + txn(t, l, eval, &check) + endBlock(t, l, eval) + } + // Not the manager anymore so this won't work + nodice := txntest.Txn{ + Type: "appl", + Sender: addrs[1], + ApplicationID: appIndex, + ApplicationArgs: [][]byte{[]byte("freeze"), []byte("junkjunkjunkjunkjunkjunkjunkjunk")}, + ForeignAssets: []basics.AssetIndex{asaIndex}, + } + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &nodice, "this transaction should be issued by the manager") + endBlock(t, l, eval) + +} + +// TestAsaDuringInit ensures an ASA can be made while initilizing an +// app. In practice, this is impossible, because you would not be +// able to prefund the account - you don't know the app id. But here +// we can know, so it helps exercise txncounter changes. +func TestAsaDuringInit(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + appIndex := basics.AppIndex(2) + prefund := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: appIndex.Address(), + Amount: 300000, // plenty for min balances, fees + } + + app := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: ` + itxn_begin + int acfg + itxn_field TypeEnum + int 1000000 + itxn_field ConfigAssetTotal + byte "oz" + itxn_field ConfigAssetUnitName + byte "Gold" + itxn_field ConfigAssetName + itxn_submit + itxn CreatedAssetID + int 3 + == + assert + itxn CreatedApplicationID + int 0 + == + assert + itxn NumLogs + int 0 + == +`, + } + + eval := nextBlock(t, l, true, nil) + txns(t, l, eval, &prefund, &app) + vb := endBlock(t, l, eval) + + require.Equal(t, appIndex, vb.Block().Payset[1].ApplicationID) + + asaIndex := vb.Block().Payset[1].EvalDelta.InnerTxns[0].ConfigAsset + require.Equal(t, basics.AssetIndex(3), asaIndex) +} + +func TestRekey(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + app := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + itxn_begin + int pay + itxn_field TypeEnum + int 1 + itxn_field Amount + global CurrentApplicationAddress + itxn_field Receiver + int 31 + bzero + byte 0x01 + concat + itxn_field RekeyTo + itxn_submit +`), + } + + eval := nextBlock(t, l, true, nil) + txns(t, l, eval, &app) + vb := endBlock(t, l, eval) + appIndex := vb.Block().Payset[0].ApplicationID + require.Equal(t, basics.AppIndex(1), appIndex) + + fund := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: appIndex.Address(), + Amount: 1_000_000, + } + rekey := txntest.Txn{ + Type: "appl", + Sender: addrs[1], + ApplicationID: appIndex, + } + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &fund, &rekey) + txn(t, l, eval, rekey.Noted("2"), "unauthorized") + endBlock(t, l, eval) + +} + +func TestNote(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + app := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + itxn_begin + int pay + itxn_field TypeEnum + int 0 + itxn_field Amount + global CurrentApplicationAddress + itxn_field Receiver + byte "abcdefghijklmnopqrstuvwxyz01234567890" + itxn_field Note + itxn_submit +`), + } + + eval := nextBlock(t, l, true, nil) + txns(t, l, eval, &app) + vb := endBlock(t, l, eval) + appIndex := vb.Block().Payset[0].ApplicationID + require.Equal(t, basics.AppIndex(1), appIndex) + + fund := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: appIndex.Address(), + Amount: 1_000_000, + } + note := txntest.Txn{ + Type: "appl", + Sender: addrs[1], + ApplicationID: appIndex, + } + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &fund, ¬e) + vb = endBlock(t, l, eval) + alphabet := vb.Block().Payset[1].EvalDelta.InnerTxns[0].Txn.Note + require.Equal(t, "abcdefghijklmnopqrstuvwxyz01234567890", string(alphabet)) +} + +func TestKeyreg(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + app := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + txn ApplicationArgs 0 + byte "pay" + == + bz nonpart + itxn_begin + int pay + itxn_field TypeEnum + int 1 + itxn_field Amount + txn Sender + itxn_field Receiver + itxn_submit + int 1 + return +nonpart: + itxn_begin + int keyreg + itxn_field TypeEnum + int 1 + itxn_field Nonparticipation + itxn_submit +`), + } + + // Create the app + eval := nextBlock(t, l, true, nil) + txns(t, l, eval, &app) + vb := endBlock(t, l, eval) + appIndex := vb.Block().Payset[0].ApplicationID + require.Equal(t, basics.AppIndex(1), appIndex) + + // Give the app a lot of money + fund := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: appIndex.Address(), + Amount: 1_000_000_000, + } + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &fund) + endBlock(t, l, eval) + + require.Equal(t, 1_000_000_000, int(micros(t, l, appIndex.Address()))) + + // Build up Residue in RewardsState so it's ready to pay + for i := 1; i < 10; i++ { + eval := nextBlock(t, l, true, nil) + endBlock(t, l, eval) + } + + // pay a little + pay := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApplicationID: appIndex, + ApplicationArgs: [][]byte{[]byte("pay")}, + } + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &pay) + endBlock(t, l, eval) + // 2000 was earned in rewards (- 1000 fee, -1 pay) + require.Equal(t, 1_000_000_999, int(micros(t, l, appIndex.Address()))) + + // Go nonpart + nonpart := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApplicationID: appIndex, + ApplicationArgs: [][]byte{[]byte("nonpart")}, + } + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &nonpart) + endBlock(t, l, eval) + require.Equal(t, 999_999_999, int(micros(t, l, appIndex.Address()))) + + // Build up Residue in RewardsState so it's ready to pay AGAIN + // But expect no rewards + for i := 1; i < 100; i++ { + eval := nextBlock(t, l, true, nil) + endBlock(t, l, eval) + } + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, pay.Noted("again")) + txn(t, l, eval, nonpart.Noted("again"), "cannot change online/offline") + endBlock(t, l, eval) + // Paid fee + 1. Did not get rewards + require.Equal(t, 999_998_998, int(micros(t, l, appIndex.Address()))) +} + +func TestInnerAppCall(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + app0 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + itxn_begin + int pay + itxn_field TypeEnum + int 1 + itxn_field Amount + txn Sender + itxn_field Receiver + itxn_submit +`), + } + eval := nextBlock(t, l, true, nil) + txn(t, l, eval, &app0) + vb := endBlock(t, l, eval) + index0 := vb.Block().Payset[0].ApplicationID + + app1 := txntest.Txn{ + Type: "appl", + Sender: addrs[1], + ApprovalProgram: main(` + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + itxn_submit +`), + } + + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &app1) + vb = endBlock(t, l, eval) + index1 := vb.Block().Payset[0].ApplicationID + + fund0 := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: index0.Address(), + Amount: 1_000_000_000, + } + fund1 := fund0 + fund1.Receiver = index1.Address() + + call1 := txntest.Txn{ + Type: "appl", + Sender: addrs[2], + ApplicationID: index1, + ForeignApps: []basics.AppIndex{index0}, + } + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &fund0, &fund1, &call1) + endBlock(t, l, eval) + +} + +// TestInnerAppManipulate ensures that apps called from inner transactions make +// the changes expected when invoked. +func TestInnerAppManipulate(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + calleeIndex := basics.AppIndex(1) + callee := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + // This app set a global key arg[1] to arg[2] or get arg[1] and log it + ApprovalProgram: main(` + txn ApplicationArgs 0 + byte "set" + == + bz next1 + txn ApplicationArgs 1 + txn ApplicationArgs 2 + app_global_put + b end +next1: + txn ApplicationArgs 0 + byte "get" + == + bz next2 + txn ApplicationArgs 1 + app_global_get + log // Fails if key didn't exist, b/c TOS = 0 + b end +next2: + err +`), + GlobalStateSchema: basics.StateSchema{ + NumByteSlice: 1, + }, + } + fund := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: calleeIndex.Address(), + Amount: 1_000_000, + } + eval := nextBlock(t, l, true, nil) + txns(t, l, eval, &callee, &fund) + vb := endBlock(t, l, eval) + require.Equal(t, calleeIndex, vb.Block().Payset[0].ApplicationID) + + callerIndex := basics.AppIndex(3) + caller := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + byte "set" + itxn_field ApplicationArgs + byte "X" + itxn_field ApplicationArgs + byte "A" + itxn_field ApplicationArgs + itxn_submit + itxn NumLogs + int 0 + == + assert + b end +`), + } + fund.Receiver = callerIndex.Address() + + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &caller, &fund) + vb = endBlock(t, l, eval) + require.Equal(t, callerIndex, vb.Block().Payset[0].ApplicationID) + + call := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApplicationID: callerIndex, + ForeignApps: []basics.AppIndex{calleeIndex}, + } + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &call) + vb = endBlock(t, l, eval) + tib := vb.Block().Payset[0] + // No changes in the top-level EvalDelta + require.Empty(t, tib.EvalDelta.GlobalDelta) + require.Empty(t, tib.EvalDelta.LocalDeltas) + + inner := tib.EvalDelta.InnerTxns[0] + require.Empty(t, inner.EvalDelta.LocalDeltas) + + require.Len(t, inner.EvalDelta.GlobalDelta, 1) + require.Equal(t, basics.ValueDelta{ + Action: basics.SetBytesAction, + Bytes: "A", + }, inner.EvalDelta.GlobalDelta["X"]) +} + +// TestCreateAndUse checks that an ASA can be created in an early tx, and then +// used in a later app call tx (in the same group). This was not allowed until +// v6, because of the strict adherence to the foreign-arrays rules. +func TestCreateAndUse(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + createapp := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + itxn_begin + int axfer; itxn_field TypeEnum + int 0; itxn_field Amount + gaid 0; itxn_field XferAsset + global CurrentApplicationAddress; itxn_field Sender + global CurrentApplicationAddress; itxn_field AssetReceiver + itxn_submit +`), + } + appIndex := basics.AppIndex(1) + + fund := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: appIndex.Address(), + Amount: 1_000_000, + } + + createasa := txntest.Txn{ + Type: "acfg", + Sender: addrs[0], + AssetParams: basics.AssetParams{ + Total: 1000000, + Decimals: 3, + UnitName: "oz", + AssetName: "Gold", + URL: "https://gold.rush/", + }, + } + asaIndex := basics.AssetIndex(3) + + use := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApplicationID: basics.AppIndex(1), + // The point of this test is to show the following (psychic) setting is unnecessary. + //ForeignAssets: []basics.AssetIndex{asaIndex}, + } + + eval := nextBlock(t, l, true, nil) + txn(t, l, eval, &createapp) + txn(t, l, eval, &fund) + err := txgroup(t, l, eval, &createasa, &use) + require.NoError(t, err) + vb := endBlock(t, l, eval) + + require.Equal(t, appIndex, vb.Block().Payset[0].ApplyData.ApplicationID) + require.Equal(t, asaIndex, vb.Block().Payset[2].ApplyData.ConfigAsset) +} + +func TestGtxnEffects(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + createapp := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + gtxn 0 CreatedAssetID + int 3 + == + assert +`), + } + appIndex := basics.AppIndex(1) + + fund := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: appIndex.Address(), + Amount: 1_000_000, + } + + eval := nextBlock(t, l, true, nil) + txns(t, l, eval, &createapp, &fund) + + createasa := txntest.Txn{ + Type: "acfg", + Sender: addrs[0], + AssetParams: basics.AssetParams{ + Total: 1000000, + Decimals: 3, + UnitName: "oz", + AssetName: "Gold", + URL: "https://gold.rush/", + }, + } + asaIndex := basics.AssetIndex(3) + + see := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApplicationID: basics.AppIndex(1), + } + + err := txgroup(t, l, eval, &createasa, &see) + require.NoError(t, err) + vb := endBlock(t, l, eval) + + require.Equal(t, appIndex, vb.Block().Payset[0].ApplyData.ApplicationID) + require.Equal(t, asaIndex, vb.Block().Payset[2].ApplyData.ConfigAsset) +} + +func TestBasicReentry(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + app0 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + itxn_submit +`), + } + eval := nextBlock(t, l, true, nil) + txn(t, l, eval, &app0) + vb := endBlock(t, l, eval) + index0 := vb.Block().Payset[0].ApplicationID + + call1 := txntest.Txn{ + Type: "appl", + Sender: addrs[2], + ApplicationID: index0, + ForeignApps: []basics.AppIndex{index0}, + } + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &call1, "self-call") + endBlock(t, l, eval) +} + +func TestIndirectReentry(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + app0 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + txn Applications 2 + itxn_field Applications + itxn_submit +`), + } + eval := nextBlock(t, l, true, nil) + txn(t, l, eval, &app0) + vb := endBlock(t, l, eval) + index0 := vb.Block().Payset[0].ApplicationID + + fund := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: index0.Address(), + Amount: 1_000_000, + } + + app1 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + itxn_submit +`), + } + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &app1, &fund) + vb = endBlock(t, l, eval) + index1 := vb.Block().Payset[0].ApplicationID + + call1 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApplicationID: index0, + ForeignApps: []basics.AppIndex{index1, index0}, + } + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &call1, "attempt to re-enter") + endBlock(t, l, eval) +} + +// This tests a valid form of reentry (which may not be the correct word here). +// When A calls B then returns to A then A calls C which calls B, the execution +// should not produce an error because B doesn't occur in the call stack twice. +func TestValidAppReentry(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + app0 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 2 + itxn_field ApplicationID + itxn_submit + + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + txn Applications 2 + itxn_field Applications + itxn_submit +`), + } + eval := nextBlock(t, l, true, nil) + txn(t, l, eval, &app0) + vb := endBlock(t, l, eval) + index0 := vb.Block().Payset[0].ApplicationID + + fund0 := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: index0.Address(), + Amount: 1_000_000, + } + + app1 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + int 3 + int 3 + == + assert +`), + } + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &app1, &fund0) + vb = endBlock(t, l, eval) + index1 := vb.Block().Payset[0].ApplicationID + + app2 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + itxn_submit +`), + } + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &app2) + vb = endBlock(t, l, eval) + index2 := vb.Block().Payset[0].ApplicationID + + fund2 := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: index2.Address(), + Amount: 1_000_000, + } + + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &fund2) + _ = endBlock(t, l, eval) + + call1 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApplicationID: index0, + ForeignApps: []basics.AppIndex{index2, index1, index0}, + } + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &call1) + endBlock(t, l, eval) +} + +func TestMaxInnerTxFanOut(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + app0 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + itxn_submit + + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + itxn_submit + + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + itxn_submit + + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + itxn_submit + + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + itxn_submit + + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + itxn_submit + + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + itxn_submit + + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + itxn_submit + + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + itxn_submit + + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + itxn_submit + + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + itxn_submit + + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + itxn_submit + + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + itxn_submit + + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + itxn_submit + + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + itxn_submit + + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + itxn_submit +`), + } + eval := nextBlock(t, l, true, nil) + txn(t, l, eval, &app0) + vb := endBlock(t, l, eval) + index0 := vb.Block().Payset[0].ApplicationID + + fund0 := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: index0.Address(), + Amount: 1_000_000, + } + + app1 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + int 3 + int 3 + == + assert +`), + } + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &app1, &fund0) + vb = endBlock(t, l, eval) + index1 := vb.Block().Payset[0].ApplicationID + + callTxGroup := make([]txntest.Txn, 16) + for i := 0; i < 16; i++ { + callTxGroup[i] = txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApplicationID: index0, + ForeignApps: []basics.AppIndex{index1}, + } + } + eval = nextBlock(t, l, true, nil) + err := txgroup(t, l, eval, &callTxGroup[0], &callTxGroup[1], &callTxGroup[2], &callTxGroup[3], &callTxGroup[4], &callTxGroup[5], &callTxGroup[6], &callTxGroup[7], &callTxGroup[8], &callTxGroup[9], &callTxGroup[10], &callTxGroup[11], &callTxGroup[12], &callTxGroup[13], &callTxGroup[14], &callTxGroup[15]) + require.NoError(t, err) + + endBlock(t, l, eval) +} + +func TestExceedMaxInnerTxFanOut(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + var program string + for i := 0; i < 17; i++ { + program += ` + itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + itxn_submit +` + } + + // 17 inner txns + app0 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(program), + } + eval := nextBlock(t, l, true, nil) + txn(t, l, eval, &app0) + vb := endBlock(t, l, eval) + index0 := vb.Block().Payset[0].ApplicationID + + fund0 := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: index0.Address(), + Amount: 1_000_000, + } + + app1 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + int 3 + int 3 + == + assert +`), + } + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &app1, &fund0) + vb = endBlock(t, l, eval) + index1 := vb.Block().Payset[0].ApplicationID + + callTxGroup := make([]txntest.Txn, 16) + for i := 0; i < 16; i++ { + callTxGroup[i] = txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApplicationID: index0, + ForeignApps: []basics.AppIndex{index1}, + } + } + eval = nextBlock(t, l, true, nil) + err := txgroup(t, l, eval, &callTxGroup[0], &callTxGroup[1], &callTxGroup[2], &callTxGroup[3], &callTxGroup[4], &callTxGroup[5], &callTxGroup[6], &callTxGroup[7], &callTxGroup[8], &callTxGroup[9], &callTxGroup[10], &callTxGroup[11], &callTxGroup[12], &callTxGroup[13], &callTxGroup[14], &callTxGroup[15]) + require.Error(t, err) + + endBlock(t, l, eval) +} + +func TestMaxInnerTxForSingleAppCall(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + program := ` +int 1 +loop: +itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID +itxn_submit +int 1 ++ +dup +int 256 +<= +bnz loop +int 257 +== +assert +` + + // 256 inner txns + app0 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(program), + } + eval := nextBlock(t, l, true, nil) + txn(t, l, eval, &app0) + vb := endBlock(t, l, eval) + index0 := vb.Block().Payset[0].ApplicationID + + fund0 := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: index0.Address(), + Amount: 1_000_000, + } + + app1 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + int 3 + int 3 + == + assert +`), + } + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &app1, &fund0) + vb = endBlock(t, l, eval) + index1 := vb.Block().Payset[0].ApplicationID + + callTxGroup := make([]txntest.Txn, 16) + callTxGroup[0] = txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApplicationID: index0, + ForeignApps: []basics.AppIndex{index1}, + } + for i := 1; i < 16; i++ { + callTxGroup[i] = txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApplicationID: index1, + ForeignApps: []basics.AppIndex{}, + } + } + eval = nextBlock(t, l, true, nil) + err := txgroup(t, l, eval, &callTxGroup[0], &callTxGroup[1], &callTxGroup[2], &callTxGroup[3], &callTxGroup[4], &callTxGroup[5], &callTxGroup[6], &callTxGroup[7], &callTxGroup[8], &callTxGroup[9], &callTxGroup[10], &callTxGroup[11], &callTxGroup[12], &callTxGroup[13], &callTxGroup[14], &callTxGroup[15]) + require.NoError(t, err) + + endBlock(t, l, eval) +} + +func TestExceedMaxInnerTxForSingleAppCall(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + program := ` +int 1 +loop: +itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID +itxn_submit +int 1 ++ +dup +int 257 +<= +bnz loop +int 258 +== +assert +` + + // 257 inner txns + app0 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(program), + } + eval := nextBlock(t, l, true, nil) + txn(t, l, eval, &app0) + vb := endBlock(t, l, eval) + index0 := vb.Block().Payset[0].ApplicationID + + fund0 := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: index0.Address(), + Amount: 1_000_000, + } + + app1 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + int 3 + int 3 + == + assert +`), + } + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &app1, &fund0) + vb = endBlock(t, l, eval) + index1 := vb.Block().Payset[0].ApplicationID + + callTxGroup := make([]txntest.Txn, 16) + callTxGroup[0] = txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApplicationID: index0, + ForeignApps: []basics.AppIndex{index1}, + } + for i := 1; i < 16; i++ { + callTxGroup[i] = txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApplicationID: index1, + ForeignApps: []basics.AppIndex{}, + } + } + eval = nextBlock(t, l, true, nil) + err := txgroup(t, l, eval, &callTxGroup[0], &callTxGroup[1], &callTxGroup[2], &callTxGroup[3], &callTxGroup[4], &callTxGroup[5], &callTxGroup[6], &callTxGroup[7], &callTxGroup[8], &callTxGroup[9], &callTxGroup[10], &callTxGroup[11], &callTxGroup[12], &callTxGroup[13], &callTxGroup[14], &callTxGroup[15]) + require.Error(t, err) + + endBlock(t, l, eval) +} + +func TestAbortWhenInnerAppCallFails(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + app0 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` +itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID +itxn_submit +int 1 +int 1 +== +assert +`), + } + eval := nextBlock(t, l, true, nil) + txn(t, l, eval, &app0) + vb := endBlock(t, l, eval) + index0 := vb.Block().Payset[0].ApplicationID + + fund0 := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: index0.Address(), + Amount: 1_000_000, + } + + app1 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + int 3 + int 2 + == + assert +`), + } + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &app1, &fund0) + vb = endBlock(t, l, eval) + index1 := vb.Block().Payset[0].ApplicationID + + callTx := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApplicationID: index0, + ForeignApps: []basics.AppIndex{index1}, + } + + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &callTx, "logic eval error") + endBlock(t, l, eval) +} + +// TestInnerAppVersionCalling ensure that inner app calls must be the >=v6 apps +func TestInnerAppVersionCalling(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + five, err := logic.AssembleStringWithVersion("int 1", 5) + require.NoError(t, err) + six, err := logic.AssembleStringWithVersion("int 1", 6) + require.NoError(t, err) + + create5 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: five.Program, + ClearStateProgram: five.Program, + } + + create6 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: six.Program, + ClearStateProgram: six.Program, + } + + eval := nextBlock(t, l, true, nil) + txns(t, l, eval, &create5, &create6) + vb := endBlock(t, l, eval) + v5id := vb.Block().Payset[0].ApplicationID + v6id := vb.Block().Payset[1].ApplicationID + + call := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + // don't use main. do the test at creation time + ApprovalProgram: ` +itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID +itxn_submit`, + ForeignApps: []basics.AppIndex{v5id}, + } + + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &call, "inner app call with version 5") + call.ForeignApps[0] = v6id + txn(t, l, eval, &call, "overspend") // it tried to execute, but test doesn't bother funding + endBlock(t, l, eval) + +} + +func TestAppVersionMatching(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + four, err := logic.AssembleStringWithVersion("int 1", 4) + require.NoError(t, err) + five, err := logic.AssembleStringWithVersion("int 1", 5) + require.NoError(t, err) + six, err := logic.AssembleStringWithVersion("int 1", 6) + require.NoError(t, err) + + create := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: five.Program, + ClearStateProgram: five.Program, + } + + eval := nextBlock(t, l, true, nil) + txn(t, l, eval, &create) + endBlock(t, l, eval) + + create.ClearStateProgram = six.Program + + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &create, "version mismatch") + endBlock(t, l, eval) + + create.ApprovalProgram = six.Program + + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &create) + endBlock(t, l, eval) + + create.ClearStateProgram = four.Program + + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &create, "version mismatch") + endBlock(t, l, eval) + + // four doesn't match five, but it doesn't have to + create.ApprovalProgram = five.Program + + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &create) + endBlock(t, l, eval) +} + +func TestAppDowngrade(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + four, err := logic.AssembleStringWithVersion("int 1", 4) + require.NoError(t, err) + five, err := logic.AssembleStringWithVersion("int 1", 5) + require.NoError(t, err) + six, err := logic.AssembleStringWithVersion("int 1", 6) + require.NoError(t, err) + + create := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: four.Program, + ClearStateProgram: four.Program, + } + + eval := nextBlock(t, l, true, nil) + txn(t, l, eval, &create) + vb := endBlock(t, l, eval) + app := vb.Block().Payset[0].ApplicationID + + update := txntest.Txn{ + Type: "appl", + ApplicationID: app, + OnCompletion: transactions.UpdateApplicationOC, + Sender: addrs[0], + ApprovalProgram: four.Program, + ClearStateProgram: four.Program, + } + + // No change - legal + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &update) + + // Upgrade just the approval. Sure (because under 6, no need to match) + update.ApprovalProgram = five.Program + txn(t, l, eval, &update) + + // Upgrade just the clear state. Now they match + update.ClearStateProgram = five.Program + txn(t, l, eval, &update) + + // Downgrade (allowed pre 6) + update.ClearStateProgram = four.Program + txn(t, l, eval, update.Noted("actually a repeat of first upgrade")) + + // Try to upgrade (at 6, must match) + update.ApprovalProgram = six.Program + txn(t, l, eval, &update, "version mismatch") + + // Do both + update.ClearStateProgram = six.Program + txn(t, l, eval, &update) + + // Try to downgrade. Fails because it was 6. + update.ApprovalProgram = five.Program + update.ClearStateProgram = five.Program + txn(t, l, eval, update.Noted("repeat of 3rd update"), "downgrade") +} + +func TestCreatedAppsAreAvailable(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + ops, err := logic.AssembleStringWithVersion("int 1\nint 1\nassert", logic.AssemblerMaxVersion) + require.NoError(t, err) + program := "byte 0x" + hex.EncodeToString(ops.Program) + + createapp := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + itxn_begin + int appl; itxn_field TypeEnum + ` + program + `; itxn_field ApprovalProgram + ` + program + `; itxn_field ClearStateProgram + int 1; itxn_field GlobalNumUint + int 2; itxn_field LocalNumByteSlice + int 3; itxn_field LocalNumUint + itxn_submit`), + } + + eval := nextBlock(t, l, true, nil) + txn(t, l, eval, &createapp) + vb := endBlock(t, l, eval) + index0 := vb.Block().Payset[0].ApplicationID + + fund0 := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: index0.Address(), + Amount: 1_000_000, + } + + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &fund0) + endBlock(t, l, eval) + + callTx := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApplicationID: index0, + ForeignApps: []basics.AppIndex{}, + } + + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &callTx) + endBlock(t, l, eval) + index1 := basics.AppIndex(1) + + callTx = txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApplicationID: index1, + ForeignApps: []basics.AppIndex{}, + } + + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &callTx) + endBlock(t, l, eval) +} + +func TestInvalidAppsNotAccessible(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + app0 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` +itxn_begin + int appl + itxn_field TypeEnum + int 2 + itxn_field ApplicationID +itxn_submit`), + } + eval := nextBlock(t, l, true, nil) + txn(t, l, eval, &app0) + vb := endBlock(t, l, eval) + index0 := vb.Block().Payset[0].ApplicationID + + fund0 := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: index0.Address(), + Amount: 1_000_000, + } + + app1 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` +int 2 +int 2 +== +assert +`), + } + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &app1, &fund0) + endBlock(t, l, eval) + + callTx := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApplicationID: index0, + ForeignApps: []basics.AppIndex{}, + } + + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &callTx, "invalid App reference 2") + endBlock(t, l, eval) +} + +func TestInvalidAssetsNotAccessible(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + createapp := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + itxn_begin + int axfer; itxn_field TypeEnum + int 0; itxn_field Amount + int 3; itxn_field XferAsset + global CurrentApplicationAddress; itxn_field Sender + global CurrentApplicationAddress; itxn_field AssetReceiver + itxn_submit +`), + } + appIndex := basics.AppIndex(1) + + fund := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: appIndex.Address(), + Amount: 1_000_000, + } + + createasa := txntest.Txn{ + Type: "acfg", + Sender: addrs[0], + AssetParams: basics.AssetParams{ + Total: 1000000, + Decimals: 3, + UnitName: "oz", + AssetName: "Gold", + URL: "https://gold.rush/", + }, + } + + eval := nextBlock(t, l, true, nil) + txns(t, l, eval, &createapp, &fund, &createasa) + endBlock(t, l, eval) + + use := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApplicationID: basics.AppIndex(1), + } + + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &use, "invalid Asset reference 3") + endBlock(t, l, eval) +} + +func executeMegaContract(b *testing.B) { + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + + vTest := config.Consensus[protocol.ConsensusFuture] + vTest.MaxAppProgramCost = 20000 + var cv protocol.ConsensusVersion = "temp test" + config.Consensus[cv] = vTest + + l := newTestLedgerWithConsensusVersion(b, genBalances, cv) + defer l.Close() + defer delete(config.Consensus, cv) + + // app must use maximum memory then recursively create a new app with the same approval program. + // recursion is terminated when a depth of 256 is reached + // fill scratch space + // fill stack + depth := 255 + createapp := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: ` + int 0 + loop: + dup + int 4096 + bzero + stores + int 1 + + + dup + int 256 + < + bnz loop + pop + int 0 + loop2: + int 4096 + bzero + swap + int 1 + + + dup + int 994 + <= + bnz loop2 + txna ApplicationArgs 0 + btoi + int 1 + - + dup + int 0 + <= + bnz done + itxn_begin + itob + itxn_field ApplicationArgs + int appl + itxn_field TypeEnum + txn ApprovalProgram + itxn_field ApprovalProgram + txn ClearStateProgram + itxn_field ClearStateProgram + itxn_submit + done: + int 1 + return`, + ApplicationArgs: [][]byte{{byte(depth)}}, + ExtraProgramPages: 3, + } + + funds := make([]*txntest.Txn, 256) + for i := 257; i <= 2*256; i++ { + funds[i-257] = &txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: basics.AppIndex(i).Address(), + Amount: 1_000_000, + } + } + + eval := nextBlock(b, l, true, nil) + txns(b, l, eval, funds...) + endBlock(b, l, eval) + + app1 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: `int 1`, + } + + eval = nextBlock(b, l, true, nil) + err := txgroup(b, l, eval, &createapp, &app1, &app1, &app1, &app1, &app1, &app1) + require.NoError(b, err) + endBlock(b, l, eval) +} + +func BenchmarkMaximumCallStackDepth(b *testing.B) { + for i := 0; i < b.N; i++ { + executeMegaContract(b) + } +} + +// TestInnerClearState ensures inner ClearState performs close out properly, even if rejects. +func TestInnerClearState(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + // inner will be an app that we opt into, then clearstate + // note that clearstate rejects + inner := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: "int 1", + ClearStateProgram: "int 0", + LocalStateSchema: basics.StateSchema{ + NumUint: 2, + NumByteSlice: 2, + }, + } + + eval := nextBlock(t, l, true, nil) + txn(t, l, eval, &inner) + vb := endBlock(t, l, eval) + innerId := vb.Block().Payset[0].ApplicationID + + // Outer is a simple app that will invoke the given app (in ForeignApps[0]) + // with the given OnCompletion (in ApplicationArgs[0]). Goal is to use it + // to opt into, and the clear state, on the inner app. + outer := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` +itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + txn ApplicationArgs 0 + btoi + itxn_field OnCompletion +itxn_submit +`), + ForeignApps: []basics.AppIndex{innerId}, + } + + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &outer) + vb = endBlock(t, l, eval) + outerId := vb.Block().Payset[0].ApplicationID + + fund := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: outerId.Address(), + Amount: 1_000_000, + } + + call := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApplicationID: outerId, + ApplicationArgs: [][]byte{{byte(transactions.OptInOC)}}, + ForeignApps: []basics.AppIndex{innerId}, + } + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &fund, &call) + endBlock(t, l, eval) + + outerAcct := lookup(t, l, outerId.Address()) + require.Len(t, outerAcct.AppLocalStates, 1) + require.Equal(t, outerAcct.TotalAppSchema, basics.StateSchema{ + NumUint: 2, + NumByteSlice: 2, + }) + + call.ApplicationArgs = [][]byte{{byte(transactions.ClearStateOC)}} + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &call) + endBlock(t, l, eval) + + outerAcct = lookup(t, l, outerId.Address()) + require.Empty(t, outerAcct.AppLocalStates) + require.Empty(t, outerAcct.TotalAppSchema) + +} + +// TestInnerClearStateBadCallee ensures that inner clear state programs are not +// allowed to use more than 700 (MaxAppProgramCost) +func TestInnerClearStateBadCallee(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + // badCallee tries to run down your budget, so an inner clear must be + // protected from exhaustion + badCallee := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: "int 1", + ClearStateProgram: `top: +int 1 +pop +b top +`, + } + + eval := nextBlock(t, l, true, nil) + txn(t, l, eval, &badCallee) + vb := endBlock(t, l, eval) + badId := vb.Block().Payset[0].ApplicationID + + // Outer is a simple app that will invoke the given app (in ForeignApps[0]) + // with the given OnCompletion (in ApplicationArgs[0]). Goal is to use it + // to opt into, and then clear state, the bad app + outer := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` +itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + txn ApplicationArgs 0 + btoi + itxn_field OnCompletion + global OpcodeBudget + store 0 +itxn_submit +global OpcodeBudget +store 1 + +txn ApplicationArgs 0 +btoi +int ClearState +!= +bnz skip // Don't do budget checking during optin + load 0 + load 1 + int 3 // OpcodeBudget lines were 3 instructions apart + + // ClearState got 700 added to budget, tried to take all, + == // but ended up just using that 700 + assert +skip: +`), + ForeignApps: []basics.AppIndex{badId}, + } + + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &outer) + vb = endBlock(t, l, eval) + outerId := vb.Block().Payset[0].ApplicationID + + fund := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: outerId.Address(), + Amount: 1_000_000, + } + + call := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApplicationID: outerId, + ApplicationArgs: [][]byte{{byte(transactions.OptInOC)}}, + ForeignApps: []basics.AppIndex{badId}, + } + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &fund, &call) + endBlock(t, l, eval) + + outerAcct := lookup(t, l, outerId.Address()) + require.Len(t, outerAcct.AppLocalStates, 1) + + // When doing a clear state, `call` checks that budget wasn't stolen + call.ApplicationArgs = [][]byte{{byte(transactions.ClearStateOC)}} + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &call) + endBlock(t, l, eval) + + // Clearstate took effect, despite failure from infinite loop + outerAcct = lookup(t, l, outerId.Address()) + require.Empty(t, outerAcct.AppLocalStates) +} + +// TestInnerClearStateBadCaller ensures that inner clear state programs cannot +// be called with less than 700 (MaxAppProgramCost)) OpcodeBudget. +func TestInnerClearStateBadCaller(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + inner := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: "int 1", + ClearStateProgram: `global OpcodeBudget +itob +log +int 1`, + LocalStateSchema: basics.StateSchema{ + NumUint: 1, + NumByteSlice: 2, + }, + } + + // waster allows tries to get the budget down below 100 before returning + waster := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` +global OpcodeBudget +itob +log +top: +global OpcodeBudget +int 100 +< +bnz done + byte "junk" + sha256 + pop + b top +done: +global OpcodeBudget +itob +log +`), + LocalStateSchema: basics.StateSchema{ + NumUint: 3, + NumByteSlice: 4, + }, + } + + eval := nextBlock(t, l, true, nil) + txns(t, l, eval, &inner, &waster) + vb := endBlock(t, l, eval) + innerId := vb.Block().Payset[0].ApplicationID + wasterId := vb.Block().Payset[1].ApplicationID + + // Grouper is a simple app that will invoke the given apps (in + // ForeignApps[0,1]) as a group, with the given OnCompletion (in + // ApplicationArgs[0]). + grouper := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` +itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + txn ApplicationArgs 0 + btoi + itxn_field OnCompletion +itxn_next + int appl + itxn_field TypeEnum + txn Applications 2 + itxn_field ApplicationID + txn ApplicationArgs 1 + btoi + itxn_field OnCompletion +itxn_submit +`), + } + + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &grouper) + vb = endBlock(t, l, eval) + grouperId := vb.Block().Payset[0].ApplicationID + + fund := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: grouperId.Address(), + Amount: 1_000_000, + } + + call := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApplicationID: grouperId, + ApplicationArgs: [][]byte{{byte(transactions.OptInOC)}, {byte(transactions.OptInOC)}}, + ForeignApps: []basics.AppIndex{wasterId, innerId}, + } + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &fund, &call) + endBlock(t, l, eval) + + gAcct := lookup(t, l, grouperId.Address()) + require.Len(t, gAcct.AppLocalStates, 2) + + call.ApplicationArgs = [][]byte{{byte(transactions.CloseOutOC)}, {byte(transactions.ClearStateOC)}} + eval = nextBlock(t, l, true, nil) + txn(t, l, eval, &call, "ClearState execution with low OpcodeBudget") + vb = endBlock(t, l, eval) + require.Len(t, vb.Block().Payset, 0) + + // Clearstate did not take effect, since the caller tried to shortchange the CSP + gAcct = lookup(t, l, grouperId.Address()) + require.Len(t, gAcct.AppLocalStates, 2) +} + +// TestClearStateInnerPay ensures that ClearState programs can run inner txns in +// v30, but not in vFuture. (Test should add v31 after it exists.) +func TestClearStateInnerPay(t *testing.T) { + partitiontest.PartitionTest(t) + + tests := []struct { + consensus protocol.ConsensusVersion + approval string + }{ + {protocol.ConsensusFuture, "int 1"}, + {protocol.ConsensusV30, "int 1"}, + {protocol.ConsensusFuture, "int 0"}, + {protocol.ConsensusV30, "int 0"}, + } + + for i, test := range tests { + t.Run(fmt.Sprintf("i=%d", i), func(t *testing.T) { + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedgerWithConsensusVersion(t, genBalances, test.consensus) + defer l.Close() + + app0 := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` +itxn_begin + int pay + itxn_field TypeEnum + int 3000 + itxn_field Amount + txn Sender + itxn_field Receiver +itxn_submit`), + ClearStateProgram: ` +itxn_begin + int pay + itxn_field TypeEnum + int 2000 + itxn_field Amount + txn Sender + itxn_field Receiver +itxn_submit +` + test.approval, + } + eval := nextBlock(t, l, true, nil) + txn(t, l, eval, &app0) + vb := endBlock(t, l, eval) + index0 := vb.Block().Payset[0].ApplicationID + + fund0 := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: index0.Address(), + Amount: 1_000_000, + } + + optin := txntest.Txn{ + Type: "appl", + Sender: addrs[1], + ApplicationID: index0, + OnCompletion: transactions.OptInOC, + } + + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &fund0, &optin) + vb = endBlock(t, l, eval) + + // Check that addrs[1] got paid during optin, and pay txn is in block + ad1 := micros(t, l, addrs[1]) + + // paid 3000, but 1000 fee, 2000 bump + require.Equal(t, uint64(2000), ad1-genBalances.Balances[addrs[1]].MicroAlgos.Raw) + // InnerTxn in block ([1] position, because followed fund0) + require.Len(t, vb.Block().Payset[1].EvalDelta.InnerTxns, 1) + require.Equal(t, vb.Block().Payset[1].EvalDelta.InnerTxns[0].Txn.Amount.Raw, uint64(3000)) + + clear := txntest.Txn{ + Type: "appl", + Sender: addrs[1], + ApplicationID: index0, + OnCompletion: transactions.ClearStateOC, + } + + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &clear) + vb = endBlock(t, l, eval) + + // Check if addrs[1] got paid during clear, and pay txn is in block + ad1 = micros(t, l, addrs[1]) + + // The pay only happens if the clear state approves (and it was legal back in V30) + if test.approval == "int 1" && test.consensus == protocol.ConsensusV30 { + // had 2000 bump, now paid 2k, charge 1k, left with 3k total bump + require.Equal(t, uint64(3000), ad1-genBalances.Balances[addrs[1]].MicroAlgos.Raw) + // InnerTxn in block + require.Equal(t, vb.Block().Payset[0].Txn.ApplicationID, index0) + require.Equal(t, vb.Block().Payset[0].Txn.OnCompletion, transactions.ClearStateOC) + require.Len(t, vb.Block().Payset[0].EvalDelta.InnerTxns, 1) + require.Equal(t, vb.Block().Payset[0].EvalDelta.InnerTxns[0].Txn.Amount.Raw, uint64(2000)) + } else { + // Only the fee is paid because pay is "erased", so goes from 2k down to 1k + require.Equal(t, uint64(1000), ad1-genBalances.Balances[addrs[1]].MicroAlgos.Raw) + // no InnerTxn in block + require.Equal(t, vb.Block().Payset[0].Txn.ApplicationID, index0) + require.Equal(t, vb.Block().Payset[0].Txn.OnCompletion, transactions.ClearStateOC) + require.Len(t, vb.Block().Payset[0].EvalDelta.InnerTxns, 0) + } + }) + } +} + +// TestGlobalChangesAcrossApps ensures that state changes are seen by other app +// calls when using inners. +func TestGlobalChangesAcrossApps(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + appA := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + // Call B : No arguments means: set your global "X" to "ABC" + itxn_begin + int appl; itxn_field TypeEnum + txn Applications 1; itxn_field ApplicationID + itxn_submit + + // Call C : Checks that B's global X is ABC + itxn_begin + int appl; itxn_field TypeEnum + txn Applications 2; itxn_field ApplicationID + txn Applications 1; itxn_field Applications // Pass on access to B + itxn_submit + + // Call B again: 1 arg means it checks if X == ABC + itxn_begin + int appl; itxn_field TypeEnum + txn Applications 1; itxn_field ApplicationID + byte "check, please"; itxn_field ApplicationArgs + itxn_submit + + // Check B's state for X + txn Applications 1 + byte "X" + app_global_get_ex + assert + byte "ABC" + == + assert +`), + } + + appB := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + txn NumAppArgs + bnz check // 1 arg means check + // set + byte "X" + byte "ABC" + app_global_put + b end +check: + byte "X" + app_global_get + byte "ABC" + == + assert + b end +`), + GlobalStateSchema: basics.StateSchema{ + NumByteSlice: 1, + }, + } + + appC := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + txn Applications 1 + byte "X" + app_global_get_ex + assert + byte "ABC" + == + assert +`), + } + + eval := nextBlock(t, l, true, nil) + txns(t, l, eval, &appA, &appB, &appC) + vb := endBlock(t, l, eval) + indexA := vb.Block().Payset[0].ApplicationID + indexB := vb.Block().Payset[1].ApplicationID + indexC := vb.Block().Payset[2].ApplicationID + + fundA := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: indexA.Address(), + Amount: 1_000_000, + } + + callA := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApplicationID: indexA, + ForeignApps: []basics.AppIndex{indexB, indexC}, + } + + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &fundA, &callA) + endBlock(t, l, eval) +} + +// TestLocalChangesAcrossApps ensures that state changes are seen by other app +// calls when using inners. +func TestLocalChangesAcrossApps(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + l := newTestLedger(t, genBalances) + defer l.Close() + + appA := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + // Call B : No arguments means: set caller's local "X" to "ABC" + itxn_begin + int appl; itxn_field TypeEnum + txn Applications 1; itxn_field ApplicationID + int OptIn; itxn_field OnCompletion + itxn_submit + + // Call C : Checks that caller's local X for app B is ABC + itxn_begin + int appl; itxn_field TypeEnum + txn Applications 2; itxn_field ApplicationID + txn Applications 1; itxn_field Applications // Pass on access to B + itxn_submit + + // Call B again: 1 arg means it checks if caller's local X == ABC + itxn_begin + int appl; itxn_field TypeEnum + txn Applications 1; itxn_field ApplicationID + byte "check, please"; itxn_field ApplicationArgs + itxn_submit + + // Check self local state for B + global CurrentApplicationAddress + txn Applications 1 + byte "X" + app_local_get_ex + assert + byte "ABC" + == + assert +`), + } + + appB := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + txn NumAppArgs + bnz check // 1 arg means check + // set + txn Sender + byte "X" + byte "ABC" + app_local_put + b end +check: + txn Sender + byte "X" + app_local_get + byte "ABC" + == + assert + b end +`), + LocalStateSchema: basics.StateSchema{ + NumByteSlice: 1, + }, + } + + appC := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` + txn Sender + txn Applications 1 + byte "X" + app_local_get_ex + assert + byte "ABC" + == + assert +`), + } + + eval := nextBlock(t, l, true, nil) + txns(t, l, eval, &appA, &appB, &appC) + vb := endBlock(t, l, eval) + indexA := vb.Block().Payset[0].ApplicationID + indexB := vb.Block().Payset[1].ApplicationID + indexC := vb.Block().Payset[2].ApplicationID + + fundA := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: indexA.Address(), + Amount: 1_000_000, + } + + callA := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApplicationID: indexA, + ForeignApps: []basics.AppIndex{indexB, indexC}, + } + + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &fundA, &callA) + endBlock(t, l, eval) +} diff --git a/ledger/internal/assetcow.go b/ledger/internal/assetcow.go index b28d09a7f4..c2013c30ce 100644 --- a/ledger/internal/assetcow.go +++ b/ledger/internal/assetcow.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -28,8 +28,6 @@ func (cs *roundCowState) AllocateAsset(addr basics.Address, index basics.AssetIn Creator: addr, Created: true, } - - cs.trackCreatable(basics.CreatableIndex(index)) } else { aa := ledgercore.AccountAsset{ Address: addr, diff --git a/ledger/internal/compactcert.go b/ledger/internal/compactcert.go index 2f90c8b22a..ca2be6d19e 100644 --- a/ledger/internal/compactcert.go +++ b/ledger/internal/compactcert.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -134,7 +134,7 @@ func CompactCertParams(votersHdr bookkeeping.BlockHeader, hdr bookkeeping.BlockH res = compactcert.Params{ Msg: hdr, ProvenWeight: provenWeight, - SigRound: hdr.Round + 1, + SigRound: hdr.Round, SecKQ: proto.CompactCertSecKQ, } return diff --git a/ledger/internal/compactcert_test.go b/ledger/internal/compactcert_test.go index 690d49375c..9bf83361c7 100644 --- a/ledger/internal/compactcert_test.go +++ b/ledger/internal/compactcert_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -169,7 +169,8 @@ func TestCompactCertParams(t *testing.T) { hdr.Round = 4 res, err = CompactCertParams(votersHdr, hdr) - require.Equal(t, hdr.Round+1, res.SigRound) + require.NoError(t, err) + require.Equal(t, hdr.Round, res.SigRound) // Covers all cases except overflow } diff --git a/ledger/internal/cow.go b/ledger/internal/cow.go index 4bf546de9c..92b003125a 100644 --- a/ledger/internal/cow.go +++ b/ledger/internal/cow.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -74,11 +74,6 @@ type roundCowState struct { // cache mainaining accountIdx used in getKey for local keys access compatibilityGetKeyCache map[basics.Address]map[storagePtr]uint64 - // index of a txn within a group; used in conjunction with trackedCreatables - groupIdx int - // track creatables created during each transaction in the round - trackedCreatables map[int]basics.CreatableIndex - // prevTotals contains the accounts totals for the previous round. It's being used to calculate the totals for the new round // so that we could perform the validation test on these to ensure the block evaluator generate a valid changeset. prevTotals ledgercore.AccountTotals @@ -86,13 +81,12 @@ type roundCowState struct { func makeRoundCowState(b roundCowParent, hdr bookkeeping.BlockHeader, proto config.ConsensusParams, prevTimestamp int64, prevTotals ledgercore.AccountTotals, hint int) *roundCowState { cb := roundCowState{ - lookupParent: b, - commitParent: nil, - proto: proto, - mods: ledgercore.MakeStateDelta(&hdr, prevTimestamp, hint, 0), - sdeltas: make(map[basics.Address]map[storagePtr]*storageDelta), - trackedCreatables: make(map[int]basics.CreatableIndex), - prevTotals: prevTotals, + lookupParent: b, + commitParent: nil, + proto: proto, + mods: ledgercore.MakeStateDelta(&hdr, prevTimestamp, hint, 0), + sdeltas: make(map[basics.Address]map[storagePtr]*storageDelta), + prevTotals: prevTotals, } // compatibilityMode retains producing application' eval deltas under the following rule: @@ -149,10 +143,6 @@ func (cb *roundCowState) prevTimestamp() int64 { return cb.mods.PrevTimestamp } -func (cb *roundCowState) getCreatableIndex(groupIdx int) basics.CreatableIndex { - return cb.trackedCreatables[groupIdx] -} - func (cb *roundCowState) getCreator(cidx basics.CreatableIndex, ctype basics.CreatableType) (creator basics.Address, ok bool, err error) { delta, ok := cb.mods.Creatables[cidx] if ok { @@ -204,10 +194,6 @@ func (cb *roundCowState) blockHdr(r basics.Round) (bookkeeping.BlockHeader, erro return cb.lookupParent.blockHdr(r) } -func (cb *roundCowState) trackCreatable(creatableIndex basics.CreatableIndex) { - cb.trackedCreatables[cb.groupIdx] = creatableIndex -} - func (cb *roundCowState) incTxnCount() { cb.txnCount++ } @@ -233,12 +219,6 @@ func (cb *roundCowState) child(hint int) *roundCowState { sdeltas: make(map[basics.Address]map[storagePtr]*storageDelta), } - // clone tracked creatables - ch.trackedCreatables = make(map[int]basics.CreatableIndex) - for i, tc := range cb.trackedCreatables { - ch.trackedCreatables[i] = tc - } - if cb.compatibilityMode { ch.compatibilityMode = cb.compatibilityMode ch.compatibilityGetKeyCache = make(map[basics.Address]map[storagePtr]uint64) @@ -246,11 +226,6 @@ func (cb *roundCowState) child(hint int) *roundCowState { return &ch } -// setGroupIdx sets this transaction's index within its group -func (cb *roundCowState) setGroupIdx(txnIdx int) { - cb.groupIdx = txnIdx -} - func (cb *roundCowState) commitToParent() { cb.commitParent.mods.Accts.MergeAccounts(cb.mods.Accts) diff --git a/ledger/internal/cow_test.go b/ledger/internal/cow_test.go index 968df87a02..45252b2785 100644 --- a/ledger/internal/cow_test.go +++ b/ledger/internal/cow_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/internal/eval.go b/ledger/internal/eval.go index 1cb050bf65..a9a3f7211f 100644 --- a/ledger/internal/eval.go +++ b/ledger/internal/eval.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -286,10 +286,6 @@ func (cs *roundCowState) Get(addr basics.Address, withPendingRewards bool) (basi return acct, nil } -func (cs *roundCowState) GetCreatableID(groupIdx int) basics.CreatableIndex { - return cs.getCreatableIndex(groupIdx) -} - func (cs *roundCowState) GetCreator(cidx basics.CreatableIndex, ctype basics.CreatableType) (basics.Address, bool, error) { return cs.getCreator(cidx, ctype) } @@ -409,6 +405,7 @@ type BlockEvaluator struct { type LedgerForEvaluator interface { LedgerForCowBase GenesisHash() crypto.Digest + GenesisProto() config.ConsensusParams LatestTotals() (basics.Round, ledgercore.AccountTotals, error) CompactCertVoters(basics.Round) (*ledgercore.VotersForRound, error) } @@ -526,7 +523,7 @@ func StartEvaluator(l LedgerForEvaluator, hdr bookkeeping.BlockHeader, evalOpts if eval.proto.SupportGenesisHash { eval.block.BlockHeader.GenesisHash = eval.genesisHash } - eval.block.BlockHeader.RewardsState = eval.prevHeader.NextRewardsState(hdr.Round, proto, incentivePoolData.MicroAlgos, prevTotals.RewardUnits()) + eval.block.BlockHeader.RewardsState = eval.prevHeader.NextRewardsState(hdr.Round, proto, incentivePoolData.MicroAlgos, prevTotals.RewardUnits(), logging.Base()) } // set the eval state with the current header eval.state = makeRoundCowState(base, eval.block.BlockHeader, proto, eval.prevHeader.TimeStamp, prevTotals, evalOpts.PaysetHint) @@ -538,7 +535,7 @@ func StartEvaluator(l LedgerForEvaluator, hdr bookkeeping.BlockHeader, evalOpts } // Check that the rewards rate, level and residue match expected values - expectedRewardsState := eval.prevHeader.NextRewardsState(hdr.Round, proto, incentivePoolData.MicroAlgos, prevTotals.RewardUnits()) + expectedRewardsState := eval.prevHeader.NextRewardsState(hdr.Round, proto, incentivePoolData.MicroAlgos, prevTotals.RewardUnits(), logging.Base()) if eval.block.RewardsState != expectedRewardsState { return nil, fmt.Errorf("bad rewards state: %+v != %+v", eval.block.RewardsState, expectedRewardsState) } @@ -718,57 +715,17 @@ func (eval *BlockEvaluator) Transaction(txn transactions.SignedTxn, ad transacti }) } -// prepareEvalParams creates a logic.EvalParams for each ApplicationCall -// transaction in the group -func (eval *BlockEvaluator) prepareEvalParams(txgroup []transactions.SignedTxnWithAD) []*logic.EvalParams { - var groupNoAD []transactions.SignedTxn - var pastSideEffects []logic.EvalSideEffects - var minTealVersion uint64 - pooledApplicationBudget := uint64(0) - var credit uint64 - res := make([]*logic.EvalParams, len(txgroup)) - for i, txn := range txgroup { - // Ignore any non-ApplicationCall transactions - if txn.SignedTxn.Txn.Type != protocol.ApplicationCallTx { - continue - } - if eval.proto.EnableAppCostPooling { - pooledApplicationBudget += uint64(eval.proto.MaxAppProgramCost) - } else { - pooledApplicationBudget = uint64(eval.proto.MaxAppProgramCost) - } - - // Initialize side effects and group without ApplyData lazily - if groupNoAD == nil { - groupNoAD = make([]transactions.SignedTxn, len(txgroup)) - for j := range txgroup { - groupNoAD[j] = txgroup[j].SignedTxn - } - pastSideEffects = logic.MakePastSideEffects(len(txgroup)) - minTealVersion = logic.ComputeMinTealVersion(groupNoAD) - credit, _ = transactions.FeeCredit(groupNoAD, eval.proto.MinTxnFee) - // intentionally ignoring error here, fees had to have been enough to get here - } - - res[i] = &logic.EvalParams{ - Txn: &groupNoAD[i], - Proto: &eval.proto, - TxnGroup: groupNoAD, - GroupIndex: uint64(i), - PastSideEffects: pastSideEffects, - MinTealVersion: &minTealVersion, - PooledApplicationBudget: &pooledApplicationBudget, - FeeCredit: &credit, - Specials: &eval.specials, - } - } - return res +// TransactionGroup tentatively adds a new transaction group as part of this block evaluation. +// If the transaction group cannot be added to the block without violating some constraints, +// an error is returned and the block evaluator state is unchanged. +func (eval *BlockEvaluator) TransactionGroup(txads []transactions.SignedTxnWithAD) error { + return eval.transactionGroup(txads) } -// TransactionGroup tentatively executes a group of transactions as part of this block evaluation. +// transactionGroup tentatively executes a group of transactions as part of this block evaluation. // If the transaction group cannot be added to the block without violating some constraints, // an error is returned and the block evaluator state is unchanged. -func (eval *BlockEvaluator) TransactionGroup(txgroup []transactions.SignedTxnWithAD) error { +func (eval *BlockEvaluator) transactionGroup(txgroup []transactions.SignedTxnWithAD) error { // Nothing to do if there are no transactions. if len(txgroup) == 0 { return nil @@ -783,15 +740,14 @@ func (eval *BlockEvaluator) TransactionGroup(txgroup []transactions.SignedTxnWit var groupTxBytes int cow := eval.state.child(len(txgroup)) - evalParams := eval.prepareEvalParams(txgroup) + evalParams := logic.NewEvalParams(txgroup, &eval.proto, &eval.specials) // Evaluate each transaction in the group txibs = make([]transactions.SignedTxnInBlock, 0, len(txgroup)) for gi, txad := range txgroup { var txib transactions.SignedTxnInBlock - cow.setGroupIdx(gi) - err := eval.transaction(txad.SignedTxn, evalParams[gi], txad.ApplyData, cow, &txib) + err := eval.transaction(txad.SignedTxn, evalParams, gi, txad.ApplyData, cow, &txib) if err != nil { return err } @@ -882,7 +838,7 @@ func (eval *BlockEvaluator) checkMinBalance(cow *roundCowState) error { // transaction tentatively executes a new transaction as part of this block evaluation. // If the transaction cannot be added to the block without violating some constraints, // an error is returned and the block evaluator state is unchanged. -func (eval *BlockEvaluator) transaction(txn transactions.SignedTxn, evalParams *logic.EvalParams, ad transactions.ApplyData, cow *roundCowState, txib *transactions.SignedTxnInBlock) error { +func (eval *BlockEvaluator) transaction(txn transactions.SignedTxn, evalParams *logic.EvalParams, gi int, ad transactions.ApplyData, cow *roundCowState, txib *transactions.SignedTxnInBlock) error { var err error // Only compute the TxID once @@ -916,7 +872,7 @@ func (eval *BlockEvaluator) transaction(txn transactions.SignedTxn, evalParams * } // Apply the transaction, updating the cow balances - applyData, err := eval.applyTransaction(txn.Txn, cow, evalParams, cow.txnCounter()) + applyData, err := eval.applyTransaction(txn.Txn, cow, evalParams, gi, cow.txnCounter()) if err != nil { return fmt.Errorf("transaction %v: %v", txid, err) } @@ -953,13 +909,6 @@ func (eval *BlockEvaluator) transaction(txn transactions.SignedTxn, evalParams * } } - // We are not allowing InnerTxns to have InnerTxns yet. Error if that happens. - for _, itx := range applyData.EvalDelta.InnerTxns { - if len(itx.ApplyData.EvalDelta.InnerTxns) > 0 { - return fmt.Errorf("inner transaction has inner transactions %v", itx) - } - } - // Remember this txn cow.addTx(txn.Txn, txid) @@ -967,7 +916,7 @@ func (eval *BlockEvaluator) transaction(txn transactions.SignedTxn, evalParams * } // applyTransaction changes the balances according to this transaction. -func (eval *BlockEvaluator) applyTransaction(tx transactions.Transaction, balances *roundCowState, evalParams *logic.EvalParams, ctr uint64) (ad transactions.ApplyData, err error) { +func (eval *BlockEvaluator) applyTransaction(tx transactions.Transaction, balances *roundCowState, evalParams *logic.EvalParams, gi int, ctr uint64) (ad transactions.ApplyData, err error) { params := balances.ConsensusParams() // move fee to pool @@ -998,7 +947,7 @@ func (eval *BlockEvaluator) applyTransaction(tx transactions.Transaction, balanc err = apply.AssetFreeze(tx.AssetFreezeTxnFields, tx.Header, balances, eval.specials, &ad) case protocol.ApplicationCallTx: - err = apply.ApplicationCall(tx.ApplicationCallTxnFields, tx.Header, balances, &ad, evalParams, ctr) + err = apply.ApplicationCall(tx.ApplicationCallTxnFields, tx.Header, balances, &ad, gi, evalParams, ctr) case protocol.CompactCertTx: // in case of a CompactCertTx transaction, we want to "apply" it only in validate or generate mode. This will deviate the cow's CompactCertNext depending of @@ -1011,9 +960,14 @@ func (eval *BlockEvaluator) applyTransaction(tx transactions.Transaction, balanc } default: - err = fmt.Errorf("Unknown transaction type %v", tx.Type) + err = fmt.Errorf("unknown transaction type %v", tx.Type) } + // Record first, so that details can all be used in logic evaluation, even + // if cleared below. For example, `gaid`, introduced in v28 is now + // implemented in terms of the AD fields introduced in v30. + evalParams.RecordAD(gi, ad) + // If the protocol does not support rewards in ApplyData, // clear them out. if !params.RewardsInApplyData { @@ -1022,12 +976,20 @@ func (eval *BlockEvaluator) applyTransaction(tx transactions.Transaction, balanc ad.CloseRewards = basics.MicroAlgos{} } + // No separate config for activating these AD fields because inner + // transactions require their presence, so the consensus update to add + // inners also stores these IDs. + if params.MaxInnerTransactions == 0 { + ad.ApplicationID = 0 + ad.ConfigAsset = 0 + } + return } // compactCertVotersAndTotal returns the expected values of CompactCertVoters // and CompactCertVotersTotal for a block. -func (eval *BlockEvaluator) compactCertVotersAndTotal() (root crypto.Digest, total basics.MicroAlgos, err error) { +func (eval *BlockEvaluator) compactCertVotersAndTotal() (root crypto.GenericDigest, total basics.MicroAlgos, err error) { if eval.proto.CompactCertRounds == 0 { return } @@ -1119,7 +1081,7 @@ func (eval *BlockEvaluator) endOfBlock() error { if err != nil { return err } - if eval.block.CompactCert[protocol.CompactCertBasic].CompactCertVoters != expectedVoters { + if !eval.block.CompactCert[protocol.CompactCertBasic].CompactCertVoters.IsEqual(expectedVoters) { return fmt.Errorf("CompactCertVoters wrong: %v != %v", eval.block.CompactCert[protocol.CompactCertBasic].CompactCertVoters, expectedVoters) } if eval.block.CompactCert[protocol.CompactCertBasic].CompactCertVotersTotal != expectedVotersWeight { @@ -1337,12 +1299,12 @@ func (validator *evalTxValidator) run() { } } -// Eval is the main evaluator entrypoint. +// Eval is the main evaluator entrypoint (in addition to StartEvaluator) // used by Ledger.Validate() Ledger.AddBlock() Ledger.trackerEvalVerified()(accountUpdates.loadFromDisk()) // -// Validate: Eval(ctx, l, blk, true, txcache, executionPool, true) -// AddBlock: Eval(context.Background(), l, blk, false, txcache, nil, true) -// tracker: Eval(context.Background(), l, blk, false, txcache, nil, false) +// Validate: Eval(ctx, l, blk, true, txcache, executionPool) +// AddBlock: Eval(context.Background(), l, blk, false, txcache, nil) +// tracker: Eval(context.Background(), l, blk, false, txcache, nil) func Eval(ctx context.Context, l LedgerForEvaluator, blk bookkeeping.Block, validate bool, txcache verify.VerifiedTransactionCache, executionPool execpool.BacklogPool) (ledgercore.StateDelta, error) { eval, err := StartEvaluator(l, blk.BlockHeader, EvaluatorOptions{ diff --git a/ledger/internal/eval_blackbox_test.go b/ledger/internal/eval_blackbox_test.go index 816bd6e68b..d4c52b7211 100644 --- a/ledger/internal/eval_blackbox_test.go +++ b/ledger/internal/eval_blackbox_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -63,6 +63,7 @@ func TestBlockEvaluator(t *testing.T) { defer l.Close() genesisBlockHeader, err := l.BlockHdr(basics.Round(0)) + require.NoError(t, err) newBlock := bookkeeping.MakeBlock(genesisBlockHeader) eval, err := l.StartEvaluator(newBlock.BlockHeader, 0, 0) require.NoError(t, err) @@ -585,14 +586,14 @@ func TestEvalAppPooledBudgetWithTxnGroup(t *testing.T) { "", ""}, {source(5, 48), false, true, - "pc=157 dynamic cost budget exceeded, executing pushint: remaining budget is 700 but program cost was 701", + "pc=157 dynamic cost budget exceeded, executing pushint", ""}, {source(16, 17), false, true, - "pc= 12 dynamic cost budget exceeded, executing keccak256: remaining budget is 700 but program cost was 781", + "pc= 12 dynamic cost budget exceeded, executing keccak256", ""}, {source(16, 18), false, false, - "pc= 12 dynamic cost budget exceeded, executing keccak256: remaining budget is 700 but program cost was 781", - "pc= 78 dynamic cost budget exceeded, executing pushint: remaining budget is 2100 but program cost was 2101"}, + "pc= 12 dynamic cost budget exceeded, executing keccak256", + "pc= 78 dynamic cost budget exceeded, executing pushint"}, } for i, param := range params { @@ -620,6 +621,77 @@ func endBlock(t testing.TB, ledger *ledger.Ledger, eval *internal.BlockEvaluator return validatedBlock } +// lookup gets the current accountdata for an address +func lookup(t testing.TB, ledger *ledger.Ledger, addr basics.Address) basics.AccountData { + rnd := ledger.Latest() + ad, err := ledger.Lookup(rnd, addr) + require.NoError(t, err) + return ad +} + +// micros gets the current microAlgo balance for an address +func micros(t testing.TB, ledger *ledger.Ledger, addr basics.Address) uint64 { + return lookup(t, ledger, addr).MicroAlgos.Raw +} + +// holding gets the current balance and optin status for some asa for an address +func holding(t testing.TB, ledger *ledger.Ledger, addr basics.Address, asset basics.AssetIndex) (uint64, bool) { + if holding, ok := lookup(t, ledger, addr).Assets[asset]; ok { + return holding.Amount, true + } + return 0, false +} + +// asaParams gets the asset params for a given asa index +func asaParams(t testing.TB, ledger *ledger.Ledger, asset basics.AssetIndex) (basics.AssetParams, error) { + creator, ok, err := ledger.GetCreator(basics.CreatableIndex(asset), basics.AssetCreatable) + if err != nil { + return basics.AssetParams{}, err + } + if !ok { + return basics.AssetParams{}, fmt.Errorf("no asset (%d)", asset) + } + if params, ok := lookup(t, ledger, creator).AssetParams[asset]; ok { + return params, nil + } + return basics.AssetParams{}, fmt.Errorf("bad lookup (%d)", asset) +} + +func TestGarbageClearState(t *testing.T) { + partitiontest.PartitionTest(t) + + genesisInitState, addrs, _ := ledgertesting.Genesis(10) + + l, err := ledger.OpenLedger(logging.TestingLog(t), "", true, genesisInitState, config.GetDefaultLocal()) + require.NoError(t, err) + defer l.Close() + + createTxn := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: "int 1", + } + + eval := nextBlock(t, l, true, nil) + + // Do this "by hand" so we can have an empty / garbage clear state, which + // would have been papered over with txn() + fillDefaults(t, l, eval, &createTxn) + stxn := createTxn.SignedTxn() + stxn.Txn.ClearStateProgram = nil + err = eval.TestTransactionGroup([]transactions.SignedTxn{stxn}) + require.Error(t, err) + require.Contains(t, err.Error(), "invalid program") + err = eval.Transaction(stxn, transactions.ApplyData{}) + require.Error(t, err) + require.Contains(t, err.Error(), "invalid program") + + stxn.Txn.ClearStateProgram = []byte{0xfe} // bad uvarint + err = eval.TestTransactionGroup([]transactions.SignedTxn{stxn}) + require.Error(t, err) + require.Contains(t, err.Error(), "invalid version") +} + func TestRewardsInAD(t *testing.T) { partitiontest.PartitionTest(t) @@ -892,6 +964,44 @@ func TestModifiedAppLocalStates(t *testing.T) { } } +// TestDeleteNonExistantKeys checks if the EvalDeltas from deleting missing keys are correct +func TestDeleteNonExistantKeys(t *testing.T) { + partitiontest.PartitionTest(t) + + genesisInitState, addrs, _ := ledgertesting.Genesis(10) + + l, err := ledger.OpenLedger(logging.TestingLog(t), "", true, genesisInitState, config.GetDefaultLocal()) + require.NoError(t, err) + defer l.Close() + + const appid basics.AppIndex = 1 + + createTxn := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` +byte "missing_global" +app_global_del +int 0 +byte "missing_local" +app_local_del +`), + } + + optInTxn := txntest.Txn{ + Type: "appl", + Sender: addrs[1], + ApplicationID: appid, + OnCompletion: transactions.OptInOC, + } + + eval := nextBlock(t, l, true, nil) + txns(t, l, eval, &createTxn, &optInTxn) + vb := endBlock(t, l, eval) + require.Len(t, vb.Block().Payset[1].EvalDelta.GlobalDelta, 0) + require.Len(t, vb.Block().Payset[1].EvalDelta.LocalDeltas, 0) +} + // TestAppInsMinBalance checks that accounts with MaxAppsOptedIn are accepted by block evaluator // and do not cause any MaximumMinimumBalance problems func TestAppInsMinBalance(t *testing.T) { @@ -950,6 +1060,56 @@ func TestAppInsMinBalance(t *testing.T) { require.Len(t, vb.Delta().ModifiedAppLocalStates, 50) } +// TestLogsInBlock ensures that logs appear in the block properly +func TestLogsInBlock(t *testing.T) { + partitiontest.PartitionTest(t) + + genesisInitState, addrs, _ := ledgertesting.Genesis(10) + + l, err := ledger.OpenLedger(logging.TestingLog(t), "", true, genesisInitState, config.GetDefaultLocal()) + require.NoError(t, err) + defer l.Close() + + const appid basics.AppIndex = 1 + createTxn := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: "byte \"APP\"\n log\n int 1", + // Fail the clear state + ClearStateProgram: "byte \"CLR\"\n log\n int 0", + } + eval := nextBlock(t, l, true, nil) + txns(t, l, eval, &createTxn) + vb := endBlock(t, l, eval) + createInBlock := vb.Block().Payset[0] + require.Equal(t, "APP", createInBlock.ApplyData.EvalDelta.Logs[0]) + + optInTxn := txntest.Txn{ + Type: protocol.ApplicationCallTx, + Sender: addrs[1], + ApplicationID: appid, + OnCompletion: transactions.OptInOC, + } + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &optInTxn) + vb = endBlock(t, l, eval) + optInInBlock := vb.Block().Payset[0] + require.Equal(t, "APP", optInInBlock.ApplyData.EvalDelta.Logs[0]) + + clearTxn := txntest.Txn{ + Type: protocol.ApplicationCallTx, + Sender: addrs[1], + ApplicationID: appid, + OnCompletion: transactions.ClearStateOC, + } + eval = nextBlock(t, l, true, nil) + txns(t, l, eval, &clearTxn) + vb = endBlock(t, l, eval) + clearInBlock := vb.Block().Payset[0] + // Logs do not appear if the ClearState failed + require.Len(t, clearInBlock.ApplyData.EvalDelta.Logs, 0) +} + // TestGhostTransactions confirms that accounts that don't even exist // can be the Sender in some situations. If some other transaction // covers the fee, and the transaction itself does not require an diff --git a/ledger/internal/eval_test.go b/ledger/internal/eval_test.go index c3bae46131..73c64f5d51 100644 --- a/ledger/internal/eval_test.go +++ b/ledger/internal/eval_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -22,7 +22,6 @@ import ( "errors" "fmt" "math/rand" - "reflect" "testing" "github.com/stretchr/testify/assert" @@ -32,11 +31,12 @@ import ( "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/crypto/compactcert" + "github.com/algorand/go-algorand/crypto/merklesignature" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/bookkeeping" "github.com/algorand/go-algorand/data/transactions" + "github.com/algorand/go-algorand/data/transactions/logic" "github.com/algorand/go-algorand/data/transactions/verify" - "github.com/algorand/go-algorand/data/txntest" "github.com/algorand/go-algorand/ledger/ledgercore" ledgertesting "github.com/algorand/go-algorand/ledger/testing" "github.com/algorand/go-algorand/protocol" @@ -67,109 +67,135 @@ func TestBlockEvaluatorFeeSink(t *testing.T) { l := newTestLedger(t, genesisBalances) genesisBlockHeader, err := l.BlockHdr(basics.Round(0)) + require.NoError(t, err) newBlock := bookkeeping.MakeBlock(genesisBlockHeader) eval, err := l.StartEvaluator(newBlock.BlockHeader, 0, 0) require.NoError(t, err) require.Equal(t, eval.specials.FeeSink, testSinkAddr) } -func TestPrepareEvalParams(t *testing.T) { - partitiontest.PartitionTest(t) +func testEvalAppGroup(t *testing.T, schema basics.StateSchema) (*BlockEvaluator, basics.Address, error) { + genesisInitState, addrs, keys := ledgertesting.Genesis(10) - eval := BlockEvaluator{ - prevHeader: bookkeeping.BlockHeader{ - TimeStamp: 1234, - Round: 2345, - }, + genesisBalances := bookkeeping.GenesisBalances{ + Balances: genesisInitState.Accounts, + FeeSink: testSinkAddr, + RewardsPool: testPoolAddr, + Timestamp: 0, } + l := newTestLedger(t, genesisBalances) - params := []config.ConsensusParams{ - {Application: true, MaxAppProgramCost: 700}, - config.Consensus[protocol.ConsensusV29], - config.Consensus[protocol.ConsensusFuture], - } + blkHeader, err := l.BlockHdr(basics.Round(0)) + require.NoError(t, err) + newBlock := bookkeeping.MakeBlock(blkHeader) + eval, err := l.StartEvaluator(newBlock.BlockHeader, 0, 0) + require.NoError(t, err) + eval.validate = true + eval.generate = false + + ops, err := logic.AssembleString(`#pragma version 2 + txn ApplicationID + bz create + byte "caller" + txn Sender + app_global_put + b ok +create: + byte "creator" + txn Sender + app_global_put +ok: + int 1`) + require.NoError(t, err, ops.Errors) + approval := ops.Program + ops, err = logic.AssembleString("#pragma version 2\nint 1") + require.NoError(t, err) + clear := ops.Program - // Create some sample transactions - payment := txntest.Txn{ - Type: protocol.PaymentTx, - Sender: basics.Address{1, 2, 3, 4}, - Receiver: basics.Address{4, 3, 2, 1}, - Amount: 100, - }.SignedTxnWithAD() - - appcall1 := txntest.Txn{ - Type: protocol.ApplicationCallTx, - Sender: basics.Address{1, 2, 3, 4}, - ApplicationID: basics.AppIndex(1), - }.SignedTxnWithAD() - - appcall2 := appcall1 - appcall2.SignedTxn.Txn.ApplicationCallTxnFields.ApplicationID = basics.AppIndex(2) - - type evalTestCase struct { - group []transactions.SignedTxnWithAD - - // indicates if prepareAppEvaluators should return a non-nil - // appTealEvaluator for the txn at index i - expected []bool - - numAppCalls int - // Used for checking transitive pointer equality in app calls - // If there are no app calls in the group, it is set to -1 - firstAppCallIndex int + genHash := l.GenesisHash() + header := transactions.Header{ + Sender: addrs[0], + Fee: minFee, + FirstValid: newBlock.Round(), + LastValid: newBlock.Round(), + GenesisHash: genHash, + } + appcall1 := transactions.Transaction{ + Type: protocol.ApplicationCallTx, + Header: header, + ApplicationCallTxnFields: transactions.ApplicationCallTxnFields{ + GlobalStateSchema: schema, + ApprovalProgram: approval, + ClearStateProgram: clear, + }, } - // Create some groups with these transactions - cases := []evalTestCase{ - {[]transactions.SignedTxnWithAD{payment}, []bool{false}, 0, -1}, - {[]transactions.SignedTxnWithAD{appcall1}, []bool{true}, 1, 0}, - {[]transactions.SignedTxnWithAD{payment, payment}, []bool{false, false}, 0, -1}, - {[]transactions.SignedTxnWithAD{appcall1, payment}, []bool{true, false}, 1, 0}, - {[]transactions.SignedTxnWithAD{payment, appcall1}, []bool{false, true}, 1, 1}, - {[]transactions.SignedTxnWithAD{appcall1, appcall2}, []bool{true, true}, 2, 0}, - {[]transactions.SignedTxnWithAD{appcall1, appcall2, appcall1}, []bool{true, true, true}, 3, 0}, - {[]transactions.SignedTxnWithAD{payment, appcall1, payment}, []bool{false, true, false}, 1, 1}, - {[]transactions.SignedTxnWithAD{appcall1, payment, appcall2}, []bool{true, false, true}, 2, 0}, + appcall2 := transactions.Transaction{ + Type: protocol.ApplicationCallTx, + Header: header, + ApplicationCallTxnFields: transactions.ApplicationCallTxnFields{ + ApplicationID: 1, + }, } - for i, param := range params { - for j, testCase := range cases { - t.Run(fmt.Sprintf("i=%d,j=%d", i, j), func(t *testing.T) { - eval.proto = param - res := eval.prepareEvalParams(testCase.group) - require.Equal(t, len(res), len(testCase.group)) - - // Compute the expected transaction group without ApplyData for - // the test case - expGroupNoAD := make([]transactions.SignedTxn, len(testCase.group)) - for k := range testCase.group { - expGroupNoAD[k] = testCase.group[k].SignedTxn - } - - // Ensure non app calls have a nil evaluator, and that non-nil - // evaluators point to the right transactions and values - for k, present := range testCase.expected { - if present { - require.NotNil(t, res[k]) - require.NotNil(t, res[k].PastSideEffects) - require.Equal(t, res[k].GroupIndex, uint64(k)) - require.Equal(t, res[k].TxnGroup, expGroupNoAD) - require.Equal(t, *res[k].Proto, eval.proto) - require.Equal(t, *res[k].Txn, testCase.group[k].SignedTxn) - require.Equal(t, res[k].MinTealVersion, res[testCase.firstAppCallIndex].MinTealVersion) - require.Equal(t, res[k].PooledApplicationBudget, res[testCase.firstAppCallIndex].PooledApplicationBudget) - if reflect.DeepEqual(param, config.Consensus[protocol.ConsensusV29]) { - require.Equal(t, *res[k].PooledApplicationBudget, uint64(eval.proto.MaxAppProgramCost)) - } else if reflect.DeepEqual(param, config.Consensus[protocol.ConsensusFuture]) { - require.Equal(t, *res[k].PooledApplicationBudget, uint64(eval.proto.MaxAppProgramCost*testCase.numAppCalls)) - } - } else { - require.Nil(t, res[k]) - } - } - }) - } + var group transactions.TxGroup + group.TxGroupHashes = []crypto.Digest{crypto.HashObj(appcall1), crypto.HashObj(appcall2)} + appcall1.Group = crypto.HashObj(group) + appcall2.Group = crypto.HashObj(group) + stxn1 := appcall1.Sign(keys[0]) + stxn2 := appcall2.Sign(keys[0]) + + g := []transactions.SignedTxnWithAD{ + { + SignedTxn: stxn1, + ApplyData: transactions.ApplyData{ + EvalDelta: transactions.EvalDelta{GlobalDelta: map[string]basics.ValueDelta{ + "creator": {Action: basics.SetBytesAction, Bytes: string(addrs[0][:])}}, + }, + ApplicationID: 1, + }, + }, + { + SignedTxn: stxn2, + ApplyData: transactions.ApplyData{ + EvalDelta: transactions.EvalDelta{GlobalDelta: map[string]basics.ValueDelta{ + "caller": {Action: basics.SetBytesAction, Bytes: string(addrs[0][:])}}, + }}, + }, + } + txgroup := []transactions.SignedTxn{stxn1, stxn2} + err = eval.TestTransactionGroup(txgroup) + if err != nil { + return eval, addrs[0], err } + err = eval.TransactionGroup(g) + return eval, addrs[0], err +} + +// TestEvalAppStateCountsWithTxnGroup ensures txns in a group can't violate app state schema limits +// the test ensures that +// commitToParent -> applyChild copies child's cow state usage counts into parent +// and the usage counts correctly propagated from parent cow to child cow and back +func TestEvalAppStateCountsWithTxnGroup(t *testing.T) { + partitiontest.PartitionTest(t) + + _, _, err := testEvalAppGroup(t, basics.StateSchema{NumByteSlice: 1}) + require.Error(t, err) + require.Contains(t, err.Error(), "store bytes count 2 exceeds schema bytes count 1") +} + +// TestEvalAppAllocStateWithTxnGroup ensures roundCowState.deltas and applyStorageDelta +// produce correct results when a txn group has storage allocate and storage update actions +func TestEvalAppAllocStateWithTxnGroup(t *testing.T) { + partitiontest.PartitionTest(t) + + eval, addr, err := testEvalAppGroup(t, basics.StateSchema{NumByteSlice: 2}) + require.NoError(t, err) + deltas := eval.state.deltas() + ad, _ := deltas.Accts.Get(addr) + state := ad.AppParams[1].GlobalState + require.Equal(t, basics.TealValue{Type: basics.TealBytesType, Bytes: string(addr[:])}, state["caller"]) + require.Equal(t, basics.TealValue{Type: basics.TealBytesType, Bytes: string(addr[:])}, state["creator"]) } func TestCowCompactCert(t *testing.T) { @@ -408,6 +434,7 @@ type evalTestLedger struct { blocks map[basics.Round]bookkeeping.Block roundBalances map[basics.Round]map[basics.Address]basics.AccountData genesisHash crypto.Digest + genesisProto config.ConsensusParams feeSink basics.Address rewardsPool basics.Address latestTotals ledgercore.AccountTotals @@ -436,6 +463,7 @@ func newTestLedger(t testing.TB, balances bookkeeping.GenesisBalances) *evalTest for _, acctData := range balances.Balances { l.latestTotals.AddAccount(proto, acctData, &ot) } + l.genesisProto = proto require.False(t, genBlock.FeeSink.IsZero()) require.False(t, genBlock.RewardsPool.IsZero()) @@ -504,6 +532,11 @@ func (ledger *evalTestLedger) GenesisHash() crypto.Digest { return ledger.genesisHash } +// GenesisProto returns the genesis hash for this ledger. +func (ledger *evalTestLedger) GenesisProto() config.ConsensusParams { + return ledger.genesisProto +} + // Latest returns the latest known block round added to the ledger. func (ledger *evalTestLedger) Latest() basics.Round { return basics.Round(len(ledger.blocks)).SubSaturate(1) @@ -728,6 +761,8 @@ func TestEvalFunctionForExpiredAccounts(t *testing.T) { } tmp := genesisInitState.Accounts[addr] tmp.Status = basics.Online + crypto.RandBytes(tmp.StateProofID[:]) + crypto.RandBytes(tmp.SelectionID[:]) genesisInitState.Accounts[addr] = tmp } @@ -788,6 +823,11 @@ func TestEvalFunctionForExpiredAccounts(t *testing.T) { _, err = Eval(context.Background(), l, validatedBlock.Block(), false, nil, nil) require.NoError(t, err) + acctData, _ := blkEval.state.lookup(recvAddr) + + require.Equal(t, merklesignature.Verifier{}, acctData.StateProofID) + require.Equal(t, crypto.VRFVerifier{}, acctData.SelectionID) + badBlock := *validatedBlock // First validate that bad block is fine if we dont touch it... @@ -921,9 +961,7 @@ func TestExpiredAccountGenerationWithDiskFailure(t *testing.T) { err = eval.endOfBlock() require.Error(t, err) - eval.block.ExpiredParticipationAccounts = []basics.Address{ - basics.Address{}, - } + eval.block.ExpiredParticipationAccounts = []basics.Address{{}} eval.state.mods.Accts = ledgercore.AccountDeltas{} eval.state.lookupParent = &failRoundCowParent{} err = eval.endOfBlock() @@ -955,7 +993,16 @@ func TestExpiredAccountGeneration(t *testing.T) { continue } tmp := genesisInitState.Accounts[addr] + + // make up online account data tmp.Status = basics.Online + tmp.VoteFirstValid = basics.Round(1) + tmp.VoteLastValid = basics.Round(100) + tmp.VoteKeyDilution = 0x1234123412341234 + crypto.RandBytes(tmp.SelectionID[:]) + crypto.RandBytes(tmp.VoteID[:]) + crypto.RandBytes(tmp.StateProofID[:]) + genesisInitState.Accounts[addr] = tmp } @@ -1026,5 +1073,5 @@ func TestExpiredAccountGeneration(t *testing.T) { require.Equal(t, recvAcct.VoteKeyDilution, uint64(0)) require.Equal(t, recvAcct.VoteID, crypto.OneTimeSignatureVerifier{}) require.Equal(t, recvAcct.SelectionID, crypto.VRFVerifier{}) - + require.Equal(t, recvAcct.StateProofID, merklesignature.Verifier{}) } diff --git a/ledger/internal/evalindexer.go b/ledger/internal/evalindexer.go index 454ae2d7a5..b765e0e1ef 100644 --- a/ledger/internal/evalindexer.go +++ b/ledger/internal/evalindexer.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/ledger.go b/ledger/ledger.go index 4c0ececaa1..cf5476e1be 100644 --- a/ledger/ledger.go +++ b/ledger/ledger.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -578,6 +578,11 @@ func (l *Ledger) AddBlock(blk bookkeeping.Block, cert agreement.Certificate) err updates, err := internal.Eval(context.Background(), l, blk, false, l.verifiedTxnCache, nil) if err != nil { + if errNSBE, ok := err.(ledgercore.ErrNonSequentialBlockEval); ok && errNSBE.EvaluatorRound <= errNSBE.LatestRound { + return ledgercore.BlockInLedgerError{ + LastRound: errNSBE.EvaluatorRound, + NextRound: errNSBE.LatestRound + 1} + } return err } vb := ledgercore.MakeValidatedBlock(blk, updates) @@ -602,7 +607,7 @@ func (l *Ledger) AddValidatedBlock(vb ledgercore.ValidatedBlock, cert agreement. } l.headerCache.Put(blk.Round(), blk.BlockHeader) l.trackers.newBlock(blk, vb.Delta()) - l.log.Debugf("added blk %d", blk.Round()) + l.log.Debugf("ledger.AddValidatedBlock: added blk %d", blk.Round()) return nil } diff --git a/ledger/ledger_perf_test.go b/ledger/ledger_perf_test.go index e3f36c4f78..3cb9bb5a9c 100644 --- a/ledger/ledger_perf_test.go +++ b/ledger/ledger_perf_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/ledger_test.go b/ledger/ledger_test.go index 9fa3c08bd9..d0e22bca83 100644 --- a/ledger/ledger_test.go +++ b/ledger/ledger_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -19,6 +19,8 @@ package ledger import ( "context" "fmt" + "github.com/algorand/go-algorand/data/account" + "github.com/algorand/go-algorand/util/db" "io/ioutil" "math/rand" "os" @@ -120,7 +122,7 @@ func makeNewEmptyBlock(t *testing.T, l *Ledger, GenesisID string, initAccounts m Round: l.Latest() + 1, Branch: lastBlock.Hash(), TimeStamp: 0, - RewardsState: lastBlock.NextRewardsState(l.Latest()+1, proto, poolBal.MicroAlgos, totalRewardUnits), + RewardsState: lastBlock.NextRewardsState(l.Latest()+1, proto, poolBal.MicroAlgos, totalRewardUnits, logging.Base()), UpgradeState: lastBlock.UpgradeState, // Seed: does not matter, // UpgradeVote: empty, @@ -219,7 +221,7 @@ func TestLedgerBlockHeaders(t *testing.T) { Round: l.Latest() + 1, Branch: lastBlock.Hash(), TimeStamp: 0, - RewardsState: lastBlock.NextRewardsState(l.Latest()+1, proto, poolBal.MicroAlgos, totalRewardUnits), + RewardsState: lastBlock.NextRewardsState(l.Latest()+1, proto, poolBal.MicroAlgos, totalRewardUnits, logging.Base()), UpgradeState: lastBlock.UpgradeState, // Seed: does not matter, // UpgradeVote: empty, @@ -688,6 +690,10 @@ func TestLedgerSingleTxV24(t *testing.T) { badTx.ApplicationID = 0 err = l.appendUnvalidatedTx(t, initAccounts, initSecrets, badTx, ad) a.Error(err) + a.Contains(err.Error(), "ApprovalProgram: invalid program (empty)") + badTx.ApprovalProgram = []byte{242} + err = l.appendUnvalidatedTx(t, initAccounts, initSecrets, badTx, ad) + a.Error(err) a.Contains(err.Error(), "ApprovalProgram: invalid version") correctAppCall.ApplicationID = appIdx @@ -1080,6 +1086,21 @@ func testLedgerSingleTxApplyData(t *testing.T, version protocol.ConsensusVersion VoteLast: 10000, } + // depends on what the concensus is need to generate correct KeyregTxnFields. + if proto.EnableStateProofKeyregCheck { + frst, lst := uint64(correctKeyregFields.VoteFirst), uint64(correctKeyregFields.VoteLast) + store, err := db.MakeAccessor("test-DB", false, true) + a.NoError(err) + defer store.Close() + root, err := account.GenerateRoot(store) + a.NoError(err) + p, err := account.FillDBWithParticipationKeys(store, root.Address(), basics.Round(frst), basics.Round(lst), config.Consensus[protocol.ConsensusCurrentVersion].DefaultKeyDilution) + signer := p.Participation.StateProofSecrets + require.NoError(t, err) + + correctKeyregFields.StateProofPK = *(signer.GetVerifier()) + } + correctKeyreg := transactions.Transaction{ Type: protocol.KeyRegistrationTx, Header: correctTxHeader, @@ -1216,7 +1237,7 @@ func testLedgerSingleTxApplyData(t *testing.T, version protocol.ConsensusVersion Round: l.Latest() + 1, Branch: lastBlock.Hash(), TimeStamp: 0, - RewardsState: lastBlock.NextRewardsState(l.Latest()+1, proto, poolBal.MicroAlgos, totalRewardUnits), + RewardsState: lastBlock.NextRewardsState(l.Latest()+1, proto, poolBal.MicroAlgos, totalRewardUnits, logging.Base()), UpgradeState: lastBlock.UpgradeState, // Seed: does not matter, // UpgradeVote: empty, diff --git a/ledger/ledgercore/catchpointlabel.go b/ledger/ledgercore/catchpointlabel.go index 9e99a830c7..2b2e085fab 100644 --- a/ledger/ledgercore/catchpointlabel.go +++ b/ledger/ledgercore/catchpointlabel.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/ledgercore/catchpointlabel_test.go b/ledger/ledgercore/catchpointlabel_test.go index cfe744baa2..5e7a220262 100644 --- a/ledger/ledgercore/catchpointlabel_test.go +++ b/ledger/ledgercore/catchpointlabel_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/ledgercore/error.go b/ledger/ledgercore/error.go index 68185a5739..60ec1a6aa7 100644 --- a/ledger/ledgercore/error.go +++ b/ledger/ledgercore/error.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/ledgercore/misc.go b/ledger/ledgercore/misc.go index f4fd21f505..5bc39cd1cc 100644 --- a/ledger/ledgercore/misc.go +++ b/ledger/ledgercore/misc.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -17,32 +17,11 @@ package ledgercore import ( - "fmt" - "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/bookkeeping" ) -// ParticipantsArray implements merklearray.Array and is used to commit -// to a Merkle tree of online accounts. -//msgp:ignore ParticipantsArray -type ParticipantsArray []basics.Participant - -// Length returns the ledger of the array. -func (a ParticipantsArray) Length() uint64 { - return uint64(len(a)) -} - -// GetHash returns the hash for the given position. -func (a ParticipantsArray) GetHash(pos uint64) (crypto.Digest, error) { - if pos >= uint64(len(a)) { - return crypto.Digest{}, fmt.Errorf("array ParticipantsArray.Get(%d) out of bounds %d", pos, len(a)) - } - - return crypto.HashObj(a[pos]), nil -} - // InitState structure defines blockchain init params type InitState struct { Block bookkeeping.Block diff --git a/ledger/ledgercore/onlineacct.go b/ledger/ledgercore/onlineacct.go index de786e9be6..d73fe876fc 100644 --- a/ledger/ledgercore/onlineacct.go +++ b/ledger/ledgercore/onlineacct.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -17,7 +17,7 @@ package ledgercore import ( - "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/crypto/merklesignature" "github.com/algorand/go-algorand/data/basics" ) @@ -31,8 +31,7 @@ type OnlineAccount struct { MicroAlgos basics.MicroAlgos RewardsBase uint64 NormalizedOnlineBalance uint64 - VoteID crypto.OneTimeSignatureVerifier VoteFirstValid basics.Round VoteLastValid basics.Round - VoteKeyDilution uint64 + StateProofID merklesignature.Verifier } diff --git a/ledger/ledgercore/statedelta.go b/ledger/ledgercore/statedelta.go index 60336d939c..6e02fc6f22 100644 --- a/ledger/ledgercore/statedelta.go +++ b/ledger/ledgercore/statedelta.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/ledgercore/statedelta_test.go b/ledger/ledgercore/statedelta_test.go index f2f8bf7ad4..e0aee73ea3 100644 --- a/ledger/ledgercore/statedelta_test.go +++ b/ledger/ledgercore/statedelta_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/ledgercore/totals.go b/ledger/ledgercore/totals.go index ccc0b30acb..5cdee81001 100644 --- a/ledger/ledgercore/totals.go +++ b/ledger/ledgercore/totals.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/ledgercore/totals_test.go b/ledger/ledgercore/totals_test.go index cabbd45e4e..a64dcf16be 100644 --- a/ledger/ledgercore/totals_test.go +++ b/ledger/ledgercore/totals_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/ledgercore/validatedBlock.go b/ledger/ledgercore/validatedBlock.go index ef6c8f2503..9b4aa30f10 100644 --- a/ledger/ledgercore/validatedBlock.go +++ b/ledger/ledgercore/validatedBlock.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/ledgercore/votersForRound.go b/ledger/ledgercore/votersForRound.go index de76d2d292..ced0d35ed9 100644 --- a/ledger/ledgercore/votersForRound.go +++ b/ledger/ledgercore/votersForRound.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -23,6 +23,8 @@ import ( "github.com/algorand/go-deadlock" "github.com/algorand/go-algorand/config" + "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/crypto/compactcert" "github.com/algorand/go-algorand/crypto/merklearray" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/bookkeeping" @@ -52,7 +54,7 @@ type VotersForRound struct { // Participants is the array of top #CompactCertVoters online accounts // in this round, sorted by normalized balance (to make sure heavyweight // accounts are biased to the front). - Participants ParticipantsArray + Participants basics.ParticipantsArray // AddrToPos specifies the position of a given account address (if present) // in the Participants array. This allows adding a vote from a given account @@ -84,18 +86,12 @@ func (tr *VotersForRound) LoadTree(onlineTop TopOnlineAccounts, hdr bookkeeping. // using the balances from round r. certRound := r + basics.Round(tr.Proto.CompactCertVotersLookback+tr.Proto.CompactCertRounds) - // sigKeyRound is the ephemeral key ID that we expect to be used for signing - // the block from certRound. It is one higher because the keys for certRound - // might be deleted by the time consensus is reached on the block and we try - // to sign the compact cert for block certRound. - sigKeyRound := certRound + 1 - - top, err := onlineTop(r, sigKeyRound, tr.Proto.CompactCertTopVoters) + top, err := onlineTop(r, certRound, tr.Proto.CompactCertTopVoters) if err != nil { return err } - participants := make(ParticipantsArray, len(top)) + participants := make(basics.ParticipantsArray, len(top)) addrToPos := make(map[basics.Address]uint64) var totalWeight basics.MicroAlgos @@ -112,20 +108,14 @@ func (tr *VotersForRound) LoadTree(onlineTop TopOnlineAccounts, hdr bookkeeping. return fmt.Errorf("votersTracker.LoadTree: overflow computing totalWeight %d + %d", totalWeight.ToUint64(), money.ToUint64()) } - keyDilution := acct.VoteKeyDilution - if keyDilution == 0 { - keyDilution = tr.Proto.DefaultKeyDilution - } - participants[i] = basics.Participant{ - PK: acct.VoteID, - Weight: money.ToUint64(), - KeyDilution: keyDilution, + PK: acct.StateProofID, + Weight: money.ToUint64(), } addrToPos[acct.Address] = uint64(i) } - tree, err := merklearray.Build(participants) + tree, err := merklearray.BuildVectorCommitmentTree(participants, crypto.HashFactory{HashType: compactcert.HashType}) if err != nil { return err } diff --git a/ledger/lruaccts.go b/ledger/lruaccts.go index 2544ff3a73..c921bc0147 100644 --- a/ledger/lruaccts.go +++ b/ledger/lruaccts.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/lruaccts_test.go b/ledger/lruaccts_test.go index 4c4d12ca31..023962ea64 100644 --- a/ledger/lruaccts_test.go +++ b/ledger/lruaccts_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/metrics.go b/ledger/metrics.go index 8c7e5dcc78..de4cd6aedc 100644 --- a/ledger/metrics.go +++ b/ledger/metrics.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -40,6 +40,18 @@ func (mt *metricsTracker) loadFromDisk(l ledgerForTracker, _ basics.Round) error } func (mt *metricsTracker) close() { + if mt.ledgerTransactionsTotal != nil { + mt.ledgerTransactionsTotal.Deregister(nil) + mt.ledgerTransactionsTotal = nil + } + if mt.ledgerRewardClaimsTotal != nil { + mt.ledgerRewardClaimsTotal.Deregister(nil) + mt.ledgerRewardClaimsTotal = nil + } + if mt.ledgerRound != nil { + mt.ledgerRound.Deregister(nil) + mt.ledgerRound = nil + } } func (mt *metricsTracker) newBlock(blk bookkeeping.Block, delta ledgercore.StateDelta) { diff --git a/ledger/metrics_test.go b/ledger/metrics_test.go new file mode 100644 index 0000000000..ca24e0f0f2 --- /dev/null +++ b/ledger/metrics_test.go @@ -0,0 +1,76 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package ledger + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/algorand/go-algorand/data/basics" + "github.com/algorand/go-algorand/data/bookkeeping" + "github.com/algorand/go-algorand/ledger/ledgercore" + ledgertesting "github.com/algorand/go-algorand/ledger/testing" + "github.com/algorand/go-algorand/protocol" + "github.com/algorand/go-algorand/test/partitiontest" + "github.com/algorand/go-algorand/util/metrics" +) + +func TestMetricsReload(t *testing.T) { + partitiontest.PartitionTest(t) + + mt := metricsTracker{} + accts := ledgertesting.RandomAccounts(1, true) + ml := makeMockLedgerForTracker(t, true, 1, protocol.ConsensusCurrentVersion, []map[basics.Address]basics.AccountData{accts}) + + mt.loadFromDisk(ml, 0) + blk := bookkeeping.Block{BlockHeader: bookkeeping.BlockHeader{Round: 1}} + mt.newBlock(blk, ledgercore.StateDelta{}) + mt.close() + + mt.loadFromDisk(ml, 0) + blk = bookkeeping.Block{BlockHeader: bookkeeping.BlockHeader{Round: 2}} + mt.newBlock(blk, ledgercore.StateDelta{}) + + var buf strings.Builder + metrics.DefaultRegistry().WriteMetrics(&buf, "") + lines := strings.Split(buf.String(), "\n") + txCount := 0 + rcCount := 0 + rCount := 0 + for _, line := range lines { + if strings.HasPrefix(line, "# HELP") || strings.HasPrefix(line, "# TYPE") { + // ignore comments + continue + } + if strings.HasPrefix(line, metrics.LedgerTransactionsTotal.Name) { + txCount++ + } + if strings.HasPrefix(line, metrics.LedgerRewardClaimsTotal.Name) { + rcCount++ + } + if strings.HasPrefix(line, metrics.LedgerRound.Name) { + rCount++ + } + } + require.Equal(t, 1, txCount) + require.Equal(t, 1, rcCount) + require.Equal(t, 1, rCount) + + mt.close() +} diff --git a/ledger/notifier.go b/ledger/notifier.go index db1347140b..6feb06189c 100644 --- a/ledger/notifier.go +++ b/ledger/notifier.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/onlinetopheap.go b/ledger/onlinetopheap.go index 72a81d88a8..d3c818ec28 100644 --- a/ledger/onlinetopheap.go +++ b/ledger/onlinetopheap.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/onlinetopheap_test.go b/ledger/onlinetopheap_test.go index 11c85d599e..7d72d0d410 100644 --- a/ledger/onlinetopheap_test.go +++ b/ledger/onlinetopheap_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/perf_test.go b/ledger/perf_test.go index 15aca599fa..53cc2cb494 100644 --- a/ledger/perf_test.go +++ b/ledger/perf_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/persistedaccts_list.go b/ledger/persistedaccts_list.go index ae84e6f029..5570df893d 100644 --- a/ledger/persistedaccts_list.go +++ b/ledger/persistedaccts_list.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/persistedaccts_list_test.go b/ledger/persistedaccts_list_test.go index 95b8b026dd..800a803d74 100644 --- a/ledger/persistedaccts_list_test.go +++ b/ledger/persistedaccts_list_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/roundlru.go b/ledger/roundlru.go index 615dd164ad..cfc4675ee2 100644 --- a/ledger/roundlru.go +++ b/ledger/roundlru.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/roundlru_test.go b/ledger/roundlru_test.go index 7837bd555f..ef8ac03afb 100644 --- a/ledger/roundlru_test.go +++ b/ledger/roundlru_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/testing/accountsTotals.go b/ledger/testing/accountsTotals.go index b646a68292..100d11c51e 100644 --- a/ledger/testing/accountsTotals.go +++ b/ledger/testing/accountsTotals.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/testing/initState.go b/ledger/testing/initState.go index ad96e1f76e..29b9767dc5 100644 --- a/ledger/testing/initState.go +++ b/ledger/testing/initState.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/testing/randomAccounts.go b/ledger/testing/randomAccounts.go index 86ec6a60c0..3289a7966a 100644 --- a/ledger/testing/randomAccounts.go +++ b/ledger/testing/randomAccounts.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -73,6 +73,7 @@ func RandomFullAccountData(rewardsLevel, lastCreatableID uint64) (basics.Account crypto.RandBytes(data.VoteID[:]) crypto.RandBytes(data.SelectionID[:]) + crypto.RandBytes(data.StateProofID[:]) data.VoteFirstValid = basics.Round(crypto.RandUint64()) data.VoteLastValid = basics.Round(crypto.RandUint64()) data.VoteKeyDilution = crypto.RandUint64() @@ -84,7 +85,7 @@ func RandomFullAccountData(rewardsLevel, lastCreatableID uint64) (basics.Account ap := basics.AssetParams{ Total: crypto.RandUint64(), Decimals: uint32(crypto.RandUint64() % 20), - DefaultFrozen: (crypto.RandUint64()%2 == 0), + DefaultFrozen: crypto.RandUint64()%2 == 0, UnitName: fmt.Sprintf("un%x", uint32(crypto.RandUint64()%0x7fffffff)), AssetName: fmt.Sprintf("an%x", uint32(crypto.RandUint64()%0x7fffffff)), URL: fmt.Sprintf("url%x", uint32(crypto.RandUint64()%0x7fffffff)), @@ -105,7 +106,7 @@ func RandomFullAccountData(rewardsLevel, lastCreatableID uint64) (basics.Account for i := uint64(0); i < ownedAssetsCount; i++ { ah := basics.AssetHolding{ Amount: crypto.RandUint64(), - Frozen: (crypto.RandUint64()%2 == 0), + Frozen: crypto.RandUint64()%2 == 0, } data.Assets[basics.AssetIndex(crypto.RandUint64()%lastCreatableID)] = ah } diff --git a/ledger/testing/testGenesis.go b/ledger/testing/testGenesis.go index a24c46c574..13f903cfa0 100644 --- a/ledger/testing/testGenesis.go +++ b/ledger/testing/testGenesis.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -87,7 +87,6 @@ func GenesisWithProto(naccts int, proto protocol.ConsensusVersion) (ledgercore.I blk.BlockHeader.GenesisID = "test" blk.FeeSink = testSinkAddr blk.RewardsPool = testPoolAddr - crypto.RandBytes(blk.BlockHeader.GenesisHash[:]) addrs := []basics.Address{} diff --git a/ledger/tracker.go b/ledger/tracker.go index 44a255b036..57b1e52c4c 100644 --- a/ledger/tracker.go +++ b/ledger/tracker.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -91,6 +91,9 @@ type ledgerTracker interface { // effort, and all the trackers contribute to that effort. All the trackers are being handed a // pointer to the deferredCommitRange, and have the ability to either modify it, or return a // nil. If nil is returned, the commit would be skipped. + // The contract: + // offset must not be greater than the received dcr.offset value of non zero + // oldBase must not be modifed if non zero produceCommittingTask(committedRound basics.Round, dbRound basics.Round, dcr *deferredCommitRange) *deferredCommitRange // prepareCommit, commitRound and postCommit are called when it is time to commit tracker's data. @@ -321,10 +324,18 @@ func (tr *trackerRegistry) scheduleCommit(blockqRound, maxLookback basics.Round) } cdr := &dcc.deferredCommitRange for _, lt := range tr.trackers { + base := cdr.oldBase + offset := cdr.offset cdr = lt.produceCommittingTask(blockqRound, dbRound, cdr) if cdr == nil { break } + if offset > 0 && cdr.offset > offset { + tr.log.Warnf("tracker %T produced offset %d but expected not greater than %d, dbRound %d, latestRound %d", lt, cdr.offset, offset, dbRound, blockqRound) + } + if base > 0 && base != cdr.oldBase { + tr.log.Warnf("tracker %T modified oldBase %d that expected to be %d, dbRound %d, latestRound %d", lt, cdr.oldBase, base, dbRound, blockqRound) + } } if cdr != nil { dcc.deferredCommitRange = *cdr diff --git a/ledger/tracker_test.go b/ledger/tracker_test.go new file mode 100644 index 0000000000..731772a241 --- /dev/null +++ b/ledger/tracker_test.go @@ -0,0 +1,125 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package ledger + +import ( + "bytes" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/algorand/go-algorand/config" + "github.com/algorand/go-algorand/data/basics" + "github.com/algorand/go-algorand/ledger/ledgercore" + ledgertesting "github.com/algorand/go-algorand/ledger/testing" + "github.com/algorand/go-algorand/logging" + "github.com/algorand/go-algorand/protocol" + "github.com/algorand/go-algorand/test/partitiontest" +) + +// TestTrackerScheduleCommit checks catchpointTracker.produceCommittingTask does not increase commit offset relative +// to the value set by accountUpdates +func TestTrackerScheduleCommit(t *testing.T) { + partitiontest.PartitionTest(t) + + a := require.New(t) + + var bufNewLogger bytes.Buffer + log := logging.NewLogger() + log.SetOutput(&bufNewLogger) + + accts := []map[basics.Address]basics.AccountData{ledgertesting.RandomAccounts(1, true)} + ml := makeMockLedgerForTrackerWithLogger(t, true, 10, protocol.ConsensusCurrentVersion, accts, log) + defer ml.Close() + + conf := config.GetDefaultLocal() + conf.CatchpointTracking = 1 + conf.CatchpointInterval = 10 + + au := &accountUpdates{} + ct := &catchpointTracker{} + au.initialize(conf) + ct.initialize(conf, ".") + + _, err := trackerDBInitialize(ml, false, ".") + a.NoError(err) + + ml.trackers.initialize(ml, []ledgerTracker{au, ct}, conf) + defer ml.trackers.close() + err = ml.trackers.loadFromDisk(ml) + a.NoError(err) + // close commitSyncer goroutine + ml.trackers.ctxCancel() + ml.trackers.ctxCancel = nil + <-ml.trackers.commitSyncerClosed + ml.trackers.commitSyncerClosed = nil + + // simulate situation when au returns smaller offset b/c of consecutive versions + // and ct increses it + // base = 1, offset = 100, lookback = 16 + // lastest = 1000 + // would give a large mostRecentCatchpointRound value => large newBase => larger offset + + expectedOffset := uint64(100) + blockqRound := basics.Round(1000) + lookback := basics.Round(16) + dbRound := basics.Round(1) + + // prepare deltas and versions + au.accountsMu.Lock() + au.deltas = make([]ledgercore.AccountDeltas, int(blockqRound)) + au.deltasAccum = make([]int, int(blockqRound)) + au.versions = make([]protocol.ConsensusVersion, int(blockqRound)) + for i := 0; i <= int(expectedOffset); i++ { + au.versions[i] = protocol.ConsensusCurrentVersion + } + for i := int(expectedOffset) + 1; i < len(au.versions); i++ { + au.versions[i] = protocol.ConsensusFuture + } + au.accountsMu.Unlock() + + // ensure au and ct produce data we expect + dcc := &deferredCommitContext{ + deferredCommitRange: deferredCommitRange{ + lookback: lookback, + }, + } + cdr := &dcc.deferredCommitRange + + cdr = au.produceCommittingTask(blockqRound, dbRound, cdr) + a.NotNil(cdr) + a.Equal(expectedOffset, cdr.offset) + + cdr = ct.produceCommittingTask(blockqRound, dbRound, cdr) + a.NotNil(cdr) + // before the fix + // expectedOffset = uint64(blockqRound - lookback - dbRound) // 983 + a.Equal(expectedOffset, cdr.offset) + + // schedule the commit. au is expected to return offset 100 and + ml.trackers.mu.Lock() + ml.trackers.dbRound = dbRound + ml.trackers.mu.Unlock() + ml.trackers.scheduleCommit(blockqRound, lookback) + + a.Equal(1, len(ml.trackers.deferredCommits)) + // before the fix + // a.Contains(bufNewLogger.String(), "tracker *ledger.catchpointTracker produced offset 983") + a.NotContains(bufNewLogger.String(), "tracker *ledger.catchpointTracker produced offset") + dc := <-ml.trackers.deferredCommits + a.Equal(expectedOffset, dc.offset) +} diff --git a/ledger/trackerdb.go b/ledger/trackerdb.go index dd73f1a8a8..795378f78e 100644 --- a/ledger/trackerdb.go +++ b/ledger/trackerdb.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/txtail.go b/ledger/txtail.go index 4d596396fc..c390bab385 100644 --- a/ledger/txtail.go +++ b/ledger/txtail.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/txtail_test.go b/ledger/txtail_test.go index eaaf34a06d..baa632dee8 100644 --- a/ledger/txtail_test.go +++ b/ledger/txtail_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/ledger/voters.go b/ledger/voters.go index 8986040725..ba76305989 100644 --- a/ledger/voters.go +++ b/ledger/voters.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/libgoal/accounts.go b/libgoal/accounts.go index d2a1cdabe4..3fc02fc883 100644 --- a/libgoal/accounts.go +++ b/libgoal/accounts.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/libgoal/error.go b/libgoal/error.go index 676c7c7423..63ce176aa1 100644 --- a/libgoal/error.go +++ b/libgoal/error.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/libgoal/libgoal.go b/libgoal/libgoal.go index 2563adf6ee..15e5c823e0 100644 --- a/libgoal/libgoal.go +++ b/libgoal/libgoal.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/libgoal/libgoal_test.go b/libgoal/libgoal_test.go index 5d0959fbeb..96c524ef45 100644 --- a/libgoal/libgoal_test.go +++ b/libgoal/libgoal_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/libgoal/lockedFile.go b/libgoal/lockedFile.go index d940c88663..3c827d870d 100644 --- a/libgoal/lockedFile.go +++ b/libgoal/lockedFile.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/libgoal/lockedFileLinux.go b/libgoal/lockedFileLinux.go index 7c30421a9c..989972873c 100644 --- a/libgoal/lockedFileLinux.go +++ b/libgoal/lockedFileLinux.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/libgoal/lockedFileUnix.go b/libgoal/lockedFileUnix.go index b8db1451ad..70262a15ca 100644 --- a/libgoal/lockedFileUnix.go +++ b/libgoal/lockedFileUnix.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/libgoal/lockedFileWindows.go b/libgoal/lockedFileWindows.go index a3b26abb0e..efc6de0ade 100644 --- a/libgoal/lockedFileWindows.go +++ b/libgoal/lockedFileWindows.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/libgoal/participation.go b/libgoal/participation.go index 66ba9e4a58..d4b897d008 100644 --- a/libgoal/participation.go +++ b/libgoal/participation.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -155,6 +155,15 @@ func (c *Client) GenParticipationKeysTo(address string, firstValid, lastValid, k if err != nil { return } + _, err = os.Stat(partKeyPath) + if err == nil { + err = fmt.Errorf("ParticipationKeys exist for the range %d to %d", firstRound, lastRound) + return + } else if !os.IsNotExist(err) { + err = fmt.Errorf("participation key file '%s' cannot be accessed : %w", partKeyPath, err) + return + } + partdb, err := db.MakeErasableAccessor(partKeyPath) if err != nil { return @@ -196,7 +205,7 @@ func (c *Client) InstallParticipationKeys(inputfile string) (part account.Partic } defer inputdb.Close() - partkey, err := account.RestoreParticipation(inputdb) + partkey, err := account.RestoreParticipationWithSecrets(inputdb) if err != nil { return } @@ -218,7 +227,7 @@ func (c *Client) InstallParticipationKeys(inputfile string) (part account.Partic newpartkey := partkey newpartkey.Store = newdb - err = newpartkey.Persist() + err = newpartkey.PersistWithSecrets() if err != nil { newpartkey.Close() return diff --git a/libgoal/system.go b/libgoal/system.go index 298c6e38c8..6cf7166710 100644 --- a/libgoal/system.go +++ b/libgoal/system.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/libgoal/teal.go b/libgoal/teal.go index 99c4f92f8a..f0b18ede68 100644 --- a/libgoal/teal.go +++ b/libgoal/teal.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/libgoal/transactions.go b/libgoal/transactions.go index d1c51a7e9c..c689d5c59e 100644 --- a/libgoal/transactions.go +++ b/libgoal/transactions.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -229,7 +229,7 @@ func (c *Client) MakeUnsignedGoOnlineTx(address string, part *account.Participat parsedLastValid := basics.Round(lastValid) parsedFee := basics.MicroAlgos{Raw: fee} - goOnlineTransaction := part.GenerateRegistrationTransaction(parsedFee, parsedFrstValid, parsedLastValid, leaseBytes) + goOnlineTransaction := part.GenerateRegistrationTransaction(parsedFee, parsedFrstValid, parsedLastValid, leaseBytes, cparams.EnableStateProofKeyregCheck) if cparams.SupportGenesisHash { var genHash crypto.Digest copy(genHash[:], params.GenesisHash) diff --git a/libgoal/unencryptedWallet.go b/libgoal/unencryptedWallet.go index 9a38dfaf99..8953fe0eac 100644 --- a/libgoal/unencryptedWallet.go +++ b/libgoal/unencryptedWallet.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/libgoal/walletHandles.go b/libgoal/walletHandles.go index 85e0990dea..c587c9af5d 100644 --- a/libgoal/walletHandles.go +++ b/libgoal/walletHandles.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/libgoal/wallets.go b/libgoal/wallets.go index 4677b3ae81..5ba91a5a23 100644 --- a/libgoal/wallets.go +++ b/libgoal/wallets.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/logging/collector.go b/logging/collector.go index ca316a9009..a443b15acf 100644 --- a/logging/collector.go +++ b/logging/collector.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/logging/cyclicWriter.go b/logging/cyclicWriter.go index 86a8d89f7f..d7c20e6cec 100644 --- a/logging/cyclicWriter.go +++ b/logging/cyclicWriter.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/logging/cyclicWriter_test.go b/logging/cyclicWriter_test.go index e3ea895304..d1eaa43b0b 100644 --- a/logging/cyclicWriter_test.go +++ b/logging/cyclicWriter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/logging/log.go b/logging/log.go index 2af5e9f634..527d6decb6 100644 --- a/logging/log.go +++ b/logging/log.go @@ -394,6 +394,13 @@ func (l logger) GetTelemetrySession() string { return l.loggerState.telemetry.telemetryConfig.SessionGUID } +func (l logger) GetTelemetryVersion() string { + if !l.GetTelemetryEnabled() { + return "" + } + return l.loggerState.telemetry.telemetryConfig.Version +} + func (l logger) GetTelemetryHostName() string { if !l.GetTelemetryEnabled() { return "" diff --git a/logging/logBuffer.go b/logging/logBuffer.go index 9e280404a2..8064e0d17e 100644 --- a/logging/logBuffer.go +++ b/logging/logBuffer.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/logging/logBuffer_test.go b/logging/logBuffer_test.go index 9c0fba8b9a..b2f8dc1e18 100644 --- a/logging/logBuffer_test.go +++ b/logging/logBuffer_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/logging/log_test.go b/logging/log_test.go index 363791be1a..2f4365ccb6 100644 --- a/logging/log_test.go +++ b/logging/log_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/logging/logspec/agreement.go b/logging/logspec/agreement.go index 7ce4401988..6091891fbc 100644 --- a/logging/logspec/agreement.go +++ b/logging/logspec/agreement.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/logging/logspec/ledger.go b/logging/logspec/ledger.go index 7471120ce2..e7538b562f 100644 --- a/logging/logspec/ledger.go +++ b/logging/logspec/ledger.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/logging/logspec/root.go b/logging/logspec/root.go index decc5d7d75..1bec1eb96a 100644 --- a/logging/logspec/root.go +++ b/logging/logspec/root.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/logging/telemetry.go b/logging/telemetry.go index f5bafc4bbe..a02d18ac13 100644 --- a/logging/telemetry.go +++ b/logging/telemetry.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -132,12 +132,14 @@ func ReadTelemetryConfigOrDefault(dataDir string, genesisID string) (cfg Telemet return } } - ch := config.GetCurrentVersion().Channel + ver := config.GetCurrentVersion() + ch := ver.Channel // Should not happen, but default to "dev" if channel is unspecified. if ch == "" { ch = "dev" } cfg.ChainID = fmt.Sprintf("%s-%s", ch, genesisID) + cfg.Version = ver.String() return cfg, err } @@ -264,6 +266,7 @@ func (t *telemetryState) logTelemetry(l logger, message string, details interfac entry := l.entry.WithFields(Fields{ "session": l.GetTelemetrySession(), "instanceName": l.GetInstanceName(), + "v": l.GetTelemetryVersion(), }) // Populate entry like logrus.entry.log() does entry.Time = time.Now() diff --git a/logging/telemetryCommon.go b/logging/telemetryCommon.go index 6e14ea0906..d4d57a817d 100644 --- a/logging/telemetryCommon.go +++ b/logging/telemetryCommon.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -64,6 +64,7 @@ type TelemetryConfig struct { FilePath string // Path to file on disk, if any ChainID string `json:"-"` SessionGUID string `json:"-"` + Version string `json:"-"` UserName string Password string } diff --git a/logging/telemetryConfig.go b/logging/telemetryConfig.go index 32aede9f44..12c46bce06 100644 --- a/logging/telemetryConfig.go +++ b/logging/telemetryConfig.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/logging/telemetryConfig_test.go b/logging/telemetryConfig_test.go index 28cfef6136..e0522a3043 100644 --- a/logging/telemetryConfig_test.go +++ b/logging/telemetryConfig_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/logging/telemetryFilteredHook.go b/logging/telemetryFilteredHook.go index b681dd2f6c..86c402b878 100644 --- a/logging/telemetryFilteredHook.go +++ b/logging/telemetryFilteredHook.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -63,7 +63,7 @@ func (hook *telemetryFilteredHook) Fire(entry *logrus.Entry) error { if entry.Level <= hook.reportLogLevel { // Logging entry at a level which should include log history // Create a new entry augmented with the history field. - newEntry := entry.WithFields(Fields{"log": hook.history.string(), "session": hook.sessionGUID}) + newEntry := entry.WithFields(Fields{"log": hook.history.string(), "session": hook.sessionGUID, "v": hook.telemetryConfig.Version}) newEntry.Time = entry.Time newEntry.Level = entry.Level newEntry.Message = entry.Message @@ -82,6 +82,11 @@ func (hook *telemetryFilteredHook) Fire(entry *logrus.Entry) error { } else { newEntry = entry.WithField("session", hook.sessionGUID) } + + // Also add version field, if not already present. + if _, has := entry.Data["v"]; !has { + newEntry = newEntry.WithField("v", hook.telemetryConfig.Version) + } return hook.wrappedHook.Fire(newEntry) } diff --git a/logging/telemetryOperation.go b/logging/telemetryOperation.go index 7c86bb0c4a..077902dd2f 100644 --- a/logging/telemetryOperation.go +++ b/logging/telemetryOperation.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/logging/telemetry_test.go b/logging/telemetry_test.go index 039ddf4f0d..cd40cc5121 100644 --- a/logging/telemetry_test.go +++ b/logging/telemetry_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/logging/telemetryhook.go b/logging/telemetryhook.go index 1468434928..1a8c297290 100644 --- a/logging/telemetryhook.go +++ b/logging/telemetryhook.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/logging/telemetryhook_test.go b/logging/telemetryhook_test.go index 083df03c53..1846ed6f42 100644 --- a/logging/telemetryhook_test.go +++ b/logging/telemetryhook_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -225,5 +225,10 @@ func TestAsyncTelemetryHook_QueueDepth(t *testing.T) { close(filling) hook.Close() - require.Equal(t, maxDepth, len(testHook.entries())) + hookEntries := len(testHook.entries()) + require.GreaterOrEqual(t, hookEntries, maxDepth) + // the anonymous goroutine in createAsyncHookLevels might pull an entry off the pending list before + // writing it off to the underlying hook. when that happens, the total number of sent entries could + // be one higher then the maxDepth. + require.LessOrEqual(t, hookEntries, maxDepth+1) } diff --git a/logging/telemetryspec/category.go b/logging/telemetryspec/category.go index ed3711ab39..c7a8acf7a5 100644 --- a/logging/telemetryspec/category.go +++ b/logging/telemetryspec/category.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/logging/telemetryspec/event.go b/logging/telemetryspec/event.go index 3caf358422..0fc1a33811 100644 --- a/logging/telemetryspec/event.go +++ b/logging/telemetryspec/event.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/logging/telemetryspec/eventTiming.go b/logging/telemetryspec/eventTiming.go index 06ff3991ca..a43177a89f 100644 --- a/logging/telemetryspec/eventTiming.go +++ b/logging/telemetryspec/eventTiming.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/logging/telemetryspec/metric.go b/logging/telemetryspec/metric.go index 349d3f9724..bc75a246fd 100644 --- a/logging/telemetryspec/metric.go +++ b/logging/telemetryspec/metric.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/logging/telemetryspec/metric_test.go b/logging/telemetryspec/metric_test.go index 0e096e72b0..4b470c1c56 100644 --- a/logging/telemetryspec/metric_test.go +++ b/logging/telemetryspec/metric_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/logging/telemetryspec/operation.go b/logging/telemetryspec/operation.go index 8213f55155..037e8fca37 100644 --- a/logging/telemetryspec/operation.go +++ b/logging/telemetryspec/operation.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/logging/testingLogger.go b/logging/testingLogger.go index 09b789fb07..60696b9635 100644 --- a/logging/testingLogger.go +++ b/logging/testingLogger.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/logging/usage.go b/logging/usage.go index 6a3b9b8212..6646dfbaee 100644 --- a/logging/usage.go +++ b/logging/usage.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/netdeploy/network.go b/netdeploy/network.go index 6cc052f521..007d909859 100644 --- a/netdeploy/network.go +++ b/netdeploy/network.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -265,8 +265,8 @@ func (n Network) Start(binDir string, redirectOutput bool) error { var relayAddress string var err error for _, relayDir := range n.cfg.RelayDirs { - nodeFulllPath := n.getNodeFullPath(relayDir) - nc := nodecontrol.MakeNodeController(binDir, nodeFulllPath) + nodeFullPath := n.getNodeFullPath(relayDir) + nc := nodecontrol.MakeNodeController(binDir, nodeFullPath) args := nodecontrol.AlgodStartArgs{ RedirectOutput: redirectOutput, ExitErrorCallback: n.nodeExitCallback, @@ -457,16 +457,16 @@ func (n Network) Delete(binDir string) error { // any of the nodes starts func (n Network) SetConsensus(binDir string, consensus config.ConsensusProtocols) error { for _, relayDir := range n.cfg.RelayDirs { - relayFulllPath := n.getNodeFullPath(relayDir) - nc := nodecontrol.MakeNodeController(binDir, relayFulllPath) + relayFullPath := n.getNodeFullPath(relayDir) + nc := nodecontrol.MakeNodeController(binDir, relayFullPath) err := nc.SetConsensus(consensus) if err != nil { return err } } for _, nodeDir := range n.nodeDirs { - nodeFulllPath := n.getNodeFullPath(nodeDir) - nc := nodecontrol.MakeNodeController(binDir, nodeFulllPath) + nodeFullPath := n.getNodeFullPath(nodeDir) + nc := nodecontrol.MakeNodeController(binDir, nodeFullPath) err := nc.SetConsensus(consensus) if err != nil { return err diff --git a/netdeploy/networkTemplate.go b/netdeploy/networkTemplate.go index ecc7affdc2..6f4cd72ad8 100644 --- a/netdeploy/networkTemplate.go +++ b/netdeploy/networkTemplate.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -29,6 +29,7 @@ import ( "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/data/bookkeeping" "github.com/algorand/go-algorand/gen" "github.com/algorand/go-algorand/libgoal" "github.com/algorand/go-algorand/netdeploy/remote" @@ -59,13 +60,13 @@ func (t NetworkTemplate) createNodeDirectories(targetFolder string, binDir strin genesisFile := filepath.Join(targetFolder, genesisFileName) nodeDirs = make(map[string]string) - getGenesisVerCmd := filepath.Join(binDir, "algod") importKeysCmd := filepath.Join(binDir, "goal") - genesisVer, _, err := util.ExecAndCaptureOutput(getGenesisVerCmd, "-G", "-d", targetFolder) + + genesis, err := bookkeeping.LoadGenesisFromFile(filepath.Join(targetFolder, "genesis.json")) if err != nil { return } - genesisVer = strings.TrimSpace(genesisVer) + genesisVer := genesis.ID() relaysCount := countRelayNodes(t.Nodes) diff --git a/netdeploy/networkTemplates_test.go b/netdeploy/networkTemplates_test.go index cc31f73aa0..b3f99f9731 100644 --- a/netdeploy/networkTemplates_test.go +++ b/netdeploy/networkTemplates_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/netdeploy/network_test.go b/netdeploy/network_test.go index 958930fac1..a4d6638944 100644 --- a/netdeploy/network_test.go +++ b/netdeploy/network_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/netdeploy/remote/bootstrappedNetwork.go b/netdeploy/remote/bootstrappedNetwork.go index 9cdf934fed..3738ba4662 100644 --- a/netdeploy/remote/bootstrappedNetwork.go +++ b/netdeploy/remote/bootstrappedNetwork.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/netdeploy/remote/bootstrappedNetwork_test.go b/netdeploy/remote/bootstrappedNetwork_test.go index ba1722d94c..1c9f14e6e3 100644 --- a/netdeploy/remote/bootstrappedNetwork_test.go +++ b/netdeploy/remote/bootstrappedNetwork_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/netdeploy/remote/buildConfig.go b/netdeploy/remote/buildConfig.go index e58eae50e7..22e35e21e5 100644 --- a/netdeploy/remote/buildConfig.go +++ b/netdeploy/remote/buildConfig.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/netdeploy/remote/deployedNetwork.go b/netdeploy/remote/deployedNetwork.go index 1bf4184a6f..cda9b4a202 100644 --- a/netdeploy/remote/deployedNetwork.go +++ b/netdeploy/remote/deployedNetwork.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/netdeploy/remote/deployedNetwork_test.go b/netdeploy/remote/deployedNetwork_test.go index 2994249430..077649ea80 100644 --- a/netdeploy/remote/deployedNetwork_test.go +++ b/netdeploy/remote/deployedNetwork_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/netdeploy/remote/hostConfig.go b/netdeploy/remote/hostConfig.go index 78fe7e3ac6..d9710b80b1 100644 --- a/netdeploy/remote/hostConfig.go +++ b/netdeploy/remote/hostConfig.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/netdeploy/remote/hostTemplate.go b/netdeploy/remote/hostTemplate.go index 58a00a640f..faeccb3d02 100644 --- a/netdeploy/remote/hostTemplate.go +++ b/netdeploy/remote/hostTemplate.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/netdeploy/remote/nodeConfig.go b/netdeploy/remote/nodeConfig.go index 72e82356e2..143271d5df 100644 --- a/netdeploy/remote/nodeConfig.go +++ b/netdeploy/remote/nodeConfig.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/netdeploy/remote/nodeWalletData.go b/netdeploy/remote/nodeWalletData.go index 97190cc75a..1f08ea2520 100644 --- a/netdeploy/remote/nodeWalletData.go +++ b/netdeploy/remote/nodeWalletData.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/netdeploy/remote/nodecfg/nodeConfigurator.go b/netdeploy/remote/nodecfg/nodeConfigurator.go index acca0a5929..7c4bb4217a 100644 --- a/netdeploy/remote/nodecfg/nodeConfigurator.go +++ b/netdeploy/remote/nodecfg/nodeConfigurator.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/netdeploy/remote/nodecfg/nodeDir.go b/netdeploy/remote/nodecfg/nodeDir.go index 863ab302c8..a59b15c3a7 100644 --- a/netdeploy/remote/nodecfg/nodeDir.go +++ b/netdeploy/remote/nodecfg/nodeDir.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/netdeploy/remote/topology.go b/netdeploy/remote/topology.go index c47eceed62..b909abda57 100644 --- a/netdeploy/remote/topology.go +++ b/netdeploy/remote/topology.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/connPerfMon.go b/network/connPerfMon.go index b81867722e..d1b2e72194 100644 --- a/network/connPerfMon.go +++ b/network/connPerfMon.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/connPerfMon_test.go b/network/connPerfMon_test.go index 401b7d3bab..b323e1ec2b 100644 --- a/network/connPerfMon_test.go +++ b/network/connPerfMon_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/dialer.go b/network/dialer.go index 202a057563..b674d6e538 100644 --- a/network/dialer.go +++ b/network/dialer.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/limited_reader_slurper.go b/network/limited_reader_slurper.go index 7caff67308..8795579f4c 100644 --- a/network/limited_reader_slurper.go +++ b/network/limited_reader_slurper.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/limited_reader_slurper_test.go b/network/limited_reader_slurper_test.go index e13fcacce6..5170693485 100644 --- a/network/limited_reader_slurper_test.go +++ b/network/limited_reader_slurper_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/limitlistener/helper_stub_test.go b/network/limitlistener/helper_stub_test.go new file mode 100644 index 0000000000..a1430427ca --- /dev/null +++ b/network/limitlistener/helper_stub_test.go @@ -0,0 +1,12 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows +// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows + +package limitlistener_test + +func maxOpenFiles() int { + return defaultMaxOpenFiles +} diff --git a/network/limitlistener/helper_unix_test.go b/network/limitlistener/helper_unix_test.go new file mode 100644 index 0000000000..9cae789122 --- /dev/null +++ b/network/limitlistener/helper_unix_test.go @@ -0,0 +1,18 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris +// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris + +package limitlistener_test + +import "syscall" + +func maxOpenFiles() int { + var rlim syscall.Rlimit + if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlim); err != nil { + return defaultMaxOpenFiles + } + return int(rlim.Cur) +} diff --git a/network/limitlistener/helper_windows_test.go b/network/limitlistener/helper_windows_test.go new file mode 100644 index 0000000000..c67e20d4ae --- /dev/null +++ b/network/limitlistener/helper_windows_test.go @@ -0,0 +1,9 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package limitlistener_test + +func maxOpenFiles() int { + return 4 * defaultMaxOpenFiles /* actually it's 16581375 */ +} diff --git a/network/limitlistener/rejectingLimitListener.go b/network/limitlistener/rejectingLimitListener.go new file mode 100644 index 0000000000..60d89199c8 --- /dev/null +++ b/network/limitlistener/rejectingLimitListener.go @@ -0,0 +1,85 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// RejectingLimitListener is a modification of LimitListener in +// "golang.org/x/net/netutil". The difference is that when the number of connections +// exceeds the limit, RejectingLimitListener will accept and immediately close all +// new connections. + +package limitlistener + +import ( + "errors" + "fmt" + "net" + "sync" + + "github.com/algorand/go-algorand/logging" +) + +// RejectingLimitListener returns a Listener that accepts at most n simultaneous +// connections from the provided Listener. `log` can be nil. +func RejectingLimitListener(l net.Listener, n uint64, log logging.Logger) net.Listener { + return &rejectingLimitListener{ + Listener: l, + log: log, + sem: make(chan struct{}, n), + done: make(chan struct{}), + } +} + +type rejectingLimitListener struct { + net.Listener + log logging.Logger + sem chan struct{} + closeOnce sync.Once // ensures the done chan is only closed once + done chan struct{} // no values sent; closed when Close is called +} + +func (l *rejectingLimitListener) release() { + <-l.sem +} + +func (l *rejectingLimitListener) Accept() (net.Conn, error) { + for { + select { + case <-l.done: + return nil, errors.New("Accept() limit listener is closed") + default: + c, err := l.Listener.Accept() + if err != nil { + return nil, fmt.Errorf("Accept() accept err: %w", err) + } + select { + case l.sem <- struct{}{}: + return &rejectingLimitListenerConn{Conn: c, release: l.release}, nil + default: + // Close connection immediately. + err = c.Close() + if (err != nil) && (l.log != nil) { + l.log.Debugf( + "rejectingLimitListener.Accept() failed to close connection, err %v", err) + } + } + } + } +} + +func (l *rejectingLimitListener) Close() error { + err := l.Listener.Close() + l.closeOnce.Do(func() { close(l.done) }) + return err +} + +type rejectingLimitListenerConn struct { + net.Conn + releaseOnce sync.Once + release func() +} + +func (l *rejectingLimitListenerConn) Close() error { + err := l.Conn.Close() + l.releaseOnce.Do(l.release) + return err +} diff --git a/network/limitlistener/rejectingLimitListener_test.go b/network/limitlistener/rejectingLimitListener_test.go new file mode 100644 index 0000000000..7f286e13de --- /dev/null +++ b/network/limitlistener/rejectingLimitListener_test.go @@ -0,0 +1,144 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package limitlistener_test + +import ( + "errors" + "fmt" + "io" + "io/ioutil" + "net" + "net/http" + "testing" + "time" + + "github.com/algorand/go-algorand/network/limitlistener" + "github.com/algorand/go-algorand/test/partitiontest" +) + +const defaultMaxOpenFiles = 256 +const timeout = 5 * time.Second + +func TestRejectingLimitListenerBasic(t *testing.T) { + partitiontest.PartitionTest(t) + + const limit = 5 + attempts := (maxOpenFiles() - limit) / 2 + if attempts > 256 { // maximum length of accept queue is 128 by default + attempts = 256 + } + + l, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatal(err) + } + defer l.Close() + l = limitlistener.RejectingLimitListener(l, limit, nil) + + server := http.Server{} + handlerCh := make(chan struct{}) + server.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + <-handlerCh + fmt.Fprint(w, "some body") + }) + go server.Serve(l) + defer server.Close() + + for i := 0; i < 3; i++ { + queryCh := make(chan error) + for j := 0; j < attempts; j++ { + go func() { + c := http.Client{} + r, err := c.Get("http://" + l.Addr().String()) + if err != nil { + queryCh <- err + return + } + + io.Copy(ioutil.Discard, r.Body) + r.Body.Close() + + queryCh <- nil + }() + } + + for j := 0; j < attempts-limit; j++ { + err := <-queryCh + if err == nil { + t.Errorf("this connection should have failed") + } + } + + for j := 0; j < limit; j++ { + handlerCh <- struct{}{} + err := <-queryCh + if err != nil { + t.Errorf("this connection should have been successful, err: %v", err) + } + } + + // Give the rejecting limit listener time to update its semaphor. + time.Sleep(time.Millisecond) + } +} + +type errorListener struct { + net.Listener +} + +func (errorListener) Accept() (net.Conn, error) { + return nil, errFake +} + +var errFake = errors.New("fake error from errorListener") + +func TestRejectingLimitListenerBaseListenerError(t *testing.T) { + partitiontest.PartitionTest(t) + + errCh := make(chan error, 1) + go func() { + defer close(errCh) + const n = 2 + ll := limitlistener.RejectingLimitListener(errorListener{}, n, nil) + for i := 0; i < n+1; i++ { + _, err := ll.Accept() + if !errors.Is(err, errFake) { + errCh <- fmt.Errorf("Accept error %v doesn't contain errFake", err) + return + } + } + }() + + select { + case err, ok := <-errCh: + if ok { + t.Fatalf("server: %v", err) + } + case <-time.After(timeout): + t.Fatal("timeout. deadlock?") + } +} + +func TestRejectingLimitListenerClose(t *testing.T) { + partitiontest.PartitionTest(t) + + ln, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatal(err) + } + defer ln.Close() + ln = limitlistener.RejectingLimitListener(ln, 1, nil) + + err = ln.Close() + if err != nil { + t.Errorf("unsuccessful ln.Close()") + } + + c, err := ln.Accept() + if err == nil { + c.Close() + t.Errorf("unexpected successful Accept()") + } +} diff --git a/network/messageFilter.go b/network/messageFilter.go index c559df848f..c497b27700 100644 --- a/network/messageFilter.go +++ b/network/messageFilter.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/messageFilter_test.go b/network/messageFilter_test.go index fc11907284..15ce99b9aa 100644 --- a/network/messageFilter_test.go +++ b/network/messageFilter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/messagetracer/graphtrace.go b/network/messagetracer/graphtrace.go index 9005ceacc1..8a92698011 100644 --- a/network/messagetracer/graphtrace.go +++ b/network/messagetracer/graphtrace.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/messagetracer/interface.go b/network/messagetracer/interface.go index 0aafdc017a..567a7860b7 100644 --- a/network/messagetracer/interface.go +++ b/network/messagetracer/interface.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/msgOfInterest.go b/network/msgOfInterest.go index bdf277127d..2345ab20fd 100644 --- a/network/msgOfInterest.go +++ b/network/msgOfInterest.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/msgOfInterest_test.go b/network/msgOfInterest_test.go index ba3fe798b8..971886b54e 100644 --- a/network/msgOfInterest_test.go +++ b/network/msgOfInterest_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/multiplexer.go b/network/multiplexer.go index a31d97b360..cc25efd3ed 100644 --- a/network/multiplexer.go +++ b/network/multiplexer.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/multiplexer_test.go b/network/multiplexer_test.go index cd5bca0c21..58ce88becc 100644 --- a/network/multiplexer_test.go +++ b/network/multiplexer_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/netprio.go b/network/netprio.go index fc7e82302e..bc512afa05 100644 --- a/network/netprio.go +++ b/network/netprio.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/netprio_test.go b/network/netprio_test.go index 8035b9bc8a..ff02d4abbe 100644 --- a/network/netprio_test.go +++ b/network/netprio_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/peersheap.go b/network/peersheap.go index afc1c45dce..dfc572aaed 100644 --- a/network/peersheap.go +++ b/network/peersheap.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/phonebook.go b/network/phonebook.go index ea08d1bba7..656bf9c6d3 100644 --- a/network/phonebook.go +++ b/network/phonebook.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/phonebook_test.go b/network/phonebook_test.go index 69a971bfef..b1d6c35f4b 100644 --- a/network/phonebook_test.go +++ b/network/phonebook_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/rateLimitingTransport.go b/network/rateLimitingTransport.go index ae77e2b9cf..2ec6118651 100644 --- a/network/rateLimitingTransport.go +++ b/network/rateLimitingTransport.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/requestLogger.go b/network/requestLogger.go index 7b4d9c0141..b455de85c3 100644 --- a/network/requestLogger.go +++ b/network/requestLogger.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/requestLogger_test.go b/network/requestLogger_test.go index f65099dc3f..b45d985dff 100644 --- a/network/requestLogger_test.go +++ b/network/requestLogger_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/requestTracker.go b/network/requestTracker.go index 0fade36e30..13cb2f2054 100644 --- a/network/requestTracker.go +++ b/network/requestTracker.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/requestTracker_test.go b/network/requestTracker_test.go index 0016969fa2..8e9a03eb39 100644 --- a/network/requestTracker_test.go +++ b/network/requestTracker_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/topics.go b/network/topics.go index 6fd023e46b..f52dede874 100644 --- a/network/topics.go +++ b/network/topics.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/topics_test.go b/network/topics_test.go index a98d21f2a1..07b29d09e7 100644 --- a/network/topics_test.go +++ b/network/topics_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/network/wsNetwork.go b/network/wsNetwork.go index 9f4a1b281d..8bde3040d3 100644 --- a/network/wsNetwork.go +++ b/network/wsNetwork.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -39,12 +39,12 @@ import ( "github.com/algorand/go-deadlock" "github.com/algorand/websocket" "github.com/gorilla/mux" - "golang.org/x/net/netutil" "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/logging/telemetryspec" + "github.com/algorand/go-algorand/network/limitlistener" "github.com/algorand/go-algorand/protocol" tools_network "github.com/algorand/go-algorand/tools/network" "github.com/algorand/go-algorand/tools/network/dnssec" @@ -77,9 +77,6 @@ const httpServerIdleTimeout = time.Second * 4 // size of the request body. const httpServerMaxHeaderBytes = 4096 -// MaxInt is the maximum int which might be int32 or int64 -const MaxInt = int((^uint(0)) >> 1) - // connectionActivityMonitorInterval is the interval at which we check // if any of the connected peers have been idle for a long while and // need to be disconnected. @@ -128,6 +125,12 @@ var peers = metrics.MakeGauge(metrics.MetricName{Name: "algod_network_peers", De var incomingPeers = metrics.MakeGauge(metrics.MetricName{Name: "algod_network_incoming_peers", Description: "Number of active incoming peers."}) var outgoingPeers = metrics.MakeGauge(metrics.MetricName{Name: "algod_network_outgoing_peers", Description: "Number of active outgoing peers."}) +// peerDisconnectionAckDuration defines the time we would wait for the peer disconnection to compelete. +const peerDisconnectionAckDuration time.Duration = 5 * time.Second + +// peerShutdownDisconnectionAckDuration defines the time we would wait for the peer disconnection to compelete during shutdown. +const peerShutdownDisconnectionAckDuration time.Duration = 50 * time.Millisecond + // Peer opaque interface for referring to a neighbor in the network type Peer interface{} @@ -545,13 +548,13 @@ func (wn *WebsocketNetwork) disconnect(badnode Peer, reason disconnectReason) { return } peer := badnode.(*wsPeer) - peer.CloseAndWait() + peer.CloseAndWait(time.Now().Add(peerDisconnectionAckDuration)) wn.removePeer(peer, reason) } -func closeWaiter(wg *sync.WaitGroup, peer *wsPeer) { +func closeWaiter(wg *sync.WaitGroup, peer *wsPeer, deadline time.Time) { defer wg.Done() - peer.CloseAndWait() + peer.CloseAndWait(deadline) } // DisconnectPeers shuts down all connections @@ -560,8 +563,9 @@ func (wn *WebsocketNetwork) DisconnectPeers() { defer wn.peersLock.Unlock() closeGroup := sync.WaitGroup{} closeGroup.Add(len(wn.peers)) + deadline := time.Now().Add(peerDisconnectionAckDuration) for _, peer := range wn.peers { - go closeWaiter(&closeGroup, peer) + go closeWaiter(&closeGroup, peer, deadline) } wn.peers = wn.peers[:0] closeGroup.Wait() @@ -734,11 +738,6 @@ func (wn *WebsocketNetwork) setup() { // Start makes network connections and threads func (wn *WebsocketNetwork) Start() { - var err error - if wn.config.IncomingConnectionsLimit < 0 { - wn.config.IncomingConnectionsLimit = MaxInt - } - wn.messagesOfInterestMu.Lock() defer wn.messagesOfInterestMu.Unlock() wn.messagesOfInterestEncoded = true @@ -746,15 +745,6 @@ func (wn *WebsocketNetwork) Start() { wn.messagesOfInterestEnc = MarshallMessageOfInterestMap(wn.messagesOfInterest) } - // Make sure we do not accept more incoming connections than our - // open file rlimit, with some headroom for other FDs (DNS, log - // files, SQLite files, telemetry, ...) - err = wn.rlimitIncomingConnections() - if err != nil { - wn.log.Error("ws network start: rlimitIncomingConnections ", err) - return - } - if wn.config.NetAddress != "" { listener, err := net.Listen("tcp", wn.config.NetAddress) if err != nil { @@ -762,7 +752,8 @@ func (wn *WebsocketNetwork) Start() { return } // wrap the original listener with a limited connection listener - listener = netutil.LimitListener(listener, wn.config.IncomingConnectionsLimit) + listener = limitlistener.RejectingLimitListener( + listener, uint64(wn.config.IncomingConnectionsLimit), wn.log) // wrap the limited connection listener with a requests tracker listener wn.listener = wn.requestsTracker.Listener(listener) wn.log.Debugf("listening on %s", wn.listener.Addr().String()) @@ -828,8 +819,12 @@ func (wn *WebsocketNetwork) innerStop() { wn.peersLock.Lock() defer wn.peersLock.Unlock() wn.wg.Add(len(wn.peers)) + // this method is called only during node shutdown. In this case, we want to send the + // shutdown message, but we don't want to wait for a long time - since we might not be lucky + // to get a response. + deadline := time.Now().Add(peerShutdownDisconnectionAckDuration) for _, peer := range wn.peers { - go closeWaiter(&wn.wg, peer) + go closeWaiter(&wn.wg, peer, deadline) } wn.peers = wn.peers[:0] } diff --git a/network/wsNetwork_common.go b/network/wsNetwork_common.go deleted file mode 100644 index 67f219b29c..0000000000 --- a/network/wsNetwork_common.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (C) 2019-2021 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -// +build !windows - -package network - -import ( - "runtime" - - "golang.org/x/sys/unix" -) - -func (wn *WebsocketNetwork) rlimitIncomingConnections() error { - var lim unix.Rlimit - err := unix.Getrlimit(unix.RLIMIT_NOFILE, &lim) - if err != nil { - return err - } - - // If rlim_max is not sufficient, reduce IncomingConnectionsLimit - var rlimitMaxCap uint64 - if lim.Max < wn.config.ReservedFDs { - rlimitMaxCap = 0 - } else { - rlimitMaxCap = lim.Max - wn.config.ReservedFDs - } - if rlimitMaxCap > uint64(MaxInt) { - rlimitMaxCap = uint64(MaxInt) - } - if wn.config.IncomingConnectionsLimit > int(rlimitMaxCap) { - wn.log.Warnf("Reducing IncomingConnectionsLimit from %d to %d since RLIMIT_NOFILE is %d", - wn.config.IncomingConnectionsLimit, rlimitMaxCap, lim.Max) - wn.config.IncomingConnectionsLimit = int(rlimitMaxCap) - } - - // Set rlim_cur to match IncomingConnectionsLimit - newLimit := uint64(wn.config.IncomingConnectionsLimit) + wn.config.ReservedFDs - if newLimit > lim.Cur { - if runtime.GOOS == "darwin" && newLimit > 10240 && lim.Max == 0x7fffffffffffffff { - // The max file limit is 10240, even though - // the max returned by Getrlimit is 1<<63-1. - // This is OPEN_MAX in sys/syslimits.h. - // see https://github.com/golang/go/issues/30401 - newLimit = 10240 - } - lim.Cur = newLimit - err = unix.Setrlimit(unix.RLIMIT_NOFILE, &lim) - if err != nil { - return err - } - } - - return nil -} diff --git a/network/wsNetwork_test.go b/network/wsNetwork_test.go index 74c6902413..f7e5db2da3 100644 --- a/network/wsNetwork_test.go +++ b/network/wsNetwork_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -108,7 +108,6 @@ func init() { defaultConfig.GossipFanout = 4 defaultConfig.NetAddress = "127.0.0.1:0" defaultConfig.BaseLoggerDebugLevel = uint32(logging.Debug) - defaultConfig.IncomingConnectionsLimit = -1 defaultConfig.DNSBootstrapID = "" defaultConfig.MaxConnectionsPerIP = 30 } diff --git a/network/wsPeer.go b/network/wsPeer.go index f476cfa7e7..337dae07b3 100644 --- a/network/wsPeer.go +++ b/network/wsPeer.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -754,15 +754,15 @@ func (wp *wsPeer) internalClose(reason disconnectReason) { if atomic.CompareAndSwapInt32(&wp.didSignalClose, 0, 1) { wp.net.peerRemoteClose(wp, reason) } - wp.Close() + wp.Close(time.Now().Add(peerDisconnectionAckDuration)) } // called either here or from above enclosing node logic -func (wp *wsPeer) Close() { +func (wp *wsPeer) Close(deadline time.Time) { atomic.StoreInt32(&wp.didSignalClose, 1) if atomic.CompareAndSwapInt32(&wp.didInnerClose, 0, 1) { close(wp.closing) - err := wp.conn.WriteControl(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""), time.Now().Add(5*time.Second)) + err := wp.conn.WriteControl(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""), deadline) if err != nil { wp.net.log.Infof("failed to write CloseMessage to connection for %s", wp.conn.RemoteAddr().String()) } @@ -774,8 +774,8 @@ func (wp *wsPeer) Close() { } // CloseAndWait internally calls Close() then waits for all peer activity to stop -func (wp *wsPeer) CloseAndWait() { - wp.Close() +func (wp *wsPeer) CloseAndWait(deadline time.Time) { + wp.Close(deadline) wp.wg.Wait() } diff --git a/network/wsPeer_test.go b/network/wsPeer_test.go index 0570325b94..60a0e3a799 100644 --- a/network/wsPeer_test.go +++ b/network/wsPeer_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/node/assemble_test.go b/node/assemble_test.go index 5f7dae7d50..3a3d3979a4 100644 --- a/node/assemble_test.go +++ b/node/assemble_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/node/error.go b/node/error.go index 713ebf5147..02bf72505e 100644 --- a/node/error.go +++ b/node/error.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/node/impls.go b/node/impls.go index d7ced370be..2b60cf04ba 100644 --- a/node/impls.go +++ b/node/impls.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/node/indexer/db.go b/node/indexer/db.go index f0c5a42d37..9c74d4ae17 100644 --- a/node/indexer/db.go +++ b/node/indexer/db.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/node/indexer/indexer.go b/node/indexer/indexer.go index 5d90acc7b8..c022d48efc 100644 --- a/node/indexer/indexer.go +++ b/node/indexer/indexer.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/node/indexer/indexer_test.go b/node/indexer/indexer_test.go index 910ada11ac..d8fbea077d 100644 --- a/node/indexer/indexer_test.go +++ b/node/indexer/indexer_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/node/netprio.go b/node/netprio.go index d3a4e99b60..ede13b6611 100644 --- a/node/netprio.go +++ b/node/netprio.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -67,7 +67,7 @@ func (node *AlgorandFullNode) MakePrioResponse(challenge string) []byte { // Find the participation key that has the highest weight in the // latest round. var maxWeight uint64 - var maxPart account.Participation + var maxPart account.ParticipationRecordForRound latest := node.ledger.LastRound() proto, err := node.ledger.ConsensusParams(latest) @@ -79,7 +79,7 @@ func (node *AlgorandFullNode) MakePrioResponse(challenge string) []byte { // it's unlikely to be deleted from underneath of us. voteRound := latest + 2 for _, part := range node.accountManager.Keys(voteRound) { - parent := part.Address() + parent := part.Account data, err := node.ledger.LookupAgreement(latest, parent) if err != nil { continue @@ -97,10 +97,10 @@ func (node *AlgorandFullNode) MakePrioResponse(challenge string) []byte { } signer := maxPart.VotingSigner() - ephID := basics.OneTimeIDForRound(voteRound, signer.KeyDilution(proto)) + ephID := basics.OneTimeIDForRound(voteRound, signer.KeyDilution(proto.DefaultKeyDilution)) rs.Round = voteRound - rs.Sender = maxPart.Address() + rs.Sender = maxPart.Account rs.Sig = signer.Sign(ephID, rs.Response) return protocol.Encode(&rs) @@ -131,7 +131,7 @@ func (node *AlgorandFullNode) VerifyPrioResponse(challenge string, response []by } ephID := basics.OneTimeIDForRound(rs.Round, data.KeyDilution(proto)) - if !data.VoteID.Verify(ephID, rs.Response, rs.Sig) { + if !data.VoteID.Verify(ephID, rs.Response, rs.Sig, proto.EnableBatchVerification) { err = fmt.Errorf("signature verification failure") return } diff --git a/node/node.go b/node/node.go index e5a2f7e6ac..40fa4cdb61 100644 --- a/node/node.go +++ b/node/node.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -159,7 +159,6 @@ type TxnWithStatus struct { // MakeFull sets up an Algorand full node // (i.e., it returns a node that participates in consensus) func MakeFull(log logging.Logger, rootDir string, cfg config.Local, phonebookAddresses []string, genesis bookkeeping.Genesis) (*AlgorandFullNode, error) { - node := new(AlgorandFullNode) node.rootDir = rootDir node.log = log.With("name", cfg.NetAddress) @@ -786,23 +785,23 @@ func (node *AlgorandFullNode) ListParticipationKeys() (partKeys []account.Partic } // GetParticipationKey retries the information of a participation id from the node -func (node *AlgorandFullNode) GetParticipationKey(partKey account.ParticipationID) (account.ParticipationRecord, error) { - rval := node.accountManager.Registry().Get(partKey) +func (node *AlgorandFullNode) GetParticipationKey(partKeyID account.ParticipationID) (account.ParticipationRecord, error) { + rval := node.accountManager.Registry().Get(partKeyID) if rval.IsZero() { return account.ParticipationRecord{}, account.ErrParticipationIDNotFound } - return node.accountManager.Registry().Get(partKey), nil + return rval, nil } // RemoveParticipationKey given a participation id, remove the records from the node -func (node *AlgorandFullNode) RemoveParticipationKey(partKey account.ParticipationID) error { +func (node *AlgorandFullNode) RemoveParticipationKey(partKeyID account.ParticipationID) error { // Need to remove the file and then remove the entry in the registry // Let's first get the recorded information from the registry so we can lookup the file - partRecord := node.accountManager.Registry().Get(partKey) + partRecord := node.accountManager.Registry().Get(partKeyID) if partRecord.IsZero() { return account.ErrParticipationIDNotFound @@ -815,7 +814,7 @@ func (node *AlgorandFullNode) RemoveParticipationKey(partKey account.Participati filename := config.PartKeyFilename(partRecord.ParticipationID.String(), uint64(partRecord.FirstValid), uint64(partRecord.LastValid)) fullyQualifiedFilename := filepath.Join(outDir, filepath.Base(filename)) - err := node.accountManager.Registry().Delete(partKey) + err := node.accountManager.Registry().Delete(partKeyID) if err != nil { return err } @@ -834,6 +833,19 @@ func (node *AlgorandFullNode) RemoveParticipationKey(partKey account.Participati return nil } +// AppendParticipationKeys given a participation id, remove the records from the node +func (node *AlgorandFullNode) AppendParticipationKeys(partKeyID account.ParticipationID, keys account.StateProofKeys) error { + err := node.accountManager.Registry().AppendKeys(partKeyID, keys) + if err != nil { + return err + } + + // PKI TODO: pick a better timeout, this is just something short. This could also be removed if we change + // POST /v2/participation and DELETE /v2/participation to return "202 OK Accepted" instead of waiting and getting + // the error message. + return node.accountManager.Registry().Flush(500 * time.Millisecond) +} + func createTemporaryParticipationKey(outDir string, partKeyBinary []byte) (string, error) { var sb strings.Builder @@ -953,7 +965,10 @@ func (node *AlgorandFullNode) loadParticipationKeys() error { } // Fetch an account.Participation from the database - part, err := account.RestoreParticipation(handle) + // currently, we load all stateproof secrets to memory which is not ideal . + // as part of the participation interface changes , secrets will no longer + // be loaded like this. + part, err := account.RestoreParticipationWithSecrets(handle) if err != nil { handle.Close() if err == account.ErrUnsupportedSchema { @@ -970,11 +985,18 @@ func (node *AlgorandFullNode) loadParticipationKeys() error { } } else { // Tell the AccountManager about the Participation (dupes don't matter) + // make sure that all stateproof data (with are not the keys per round) + // are being store to the registry in that point added := node.accountManager.AddParticipation(part) if added { node.log.Infof("Loaded participation keys from storage: %s %s", part.Address(), info.Name()) } else { part.Close() + continue + } + err = insertStateProofToRegistry(part, node) + if err != nil { + return err } } } @@ -982,6 +1004,21 @@ func (node *AlgorandFullNode) loadParticipationKeys() error { return nil } +func insertStateProofToRegistry(part account.PersistedParticipation, node *AlgorandFullNode) error { + partID := part.ID() + // in case there are no state proof keys for that participant + if part.StateProofSecrets == nil { + return nil + } + keys := part.StateProofSecrets.GetAllKeys() + keysSinger := make(account.StateProofKeys, len(keys)) + for i := uint64(0); i < uint64(len(keys)); i++ { + keysSinger[i] = keys[i] + } + return node.accountManager.Registry().AppendKeys(partID, keysSinger) + +} + var txPoolGuage = metrics.MakeGauge(metrics.MetricName{Name: "algod_tx_pool_count", Description: "current number of available transactions in pool"}) func (node *AlgorandFullNode) txPoolGaugeThread() { @@ -1276,42 +1313,41 @@ func (node *AlgorandFullNode) AssembleBlock(round basics.Round) (agreement.Valid // VotingKeys implements the key manager's VotingKeys method, and provides additional validation with the ledger. // that allows us to load multiple overlapping keys for the same account, and filter these per-round basis. -func (node *AlgorandFullNode) VotingKeys(votingRound, keysRound basics.Round) []account.Participation { - keys := node.accountManager.Keys(votingRound) - - participations := make([]account.Participation, 0, len(keys)) - accountsData := make(map[basics.Address]basics.OnlineAccountData, len(keys)) +func (node *AlgorandFullNode) VotingKeys(votingRound, keysRound basics.Round) []account.ParticipationRecordForRound { + parts := node.accountManager.Keys(votingRound) + participations := make([]account.ParticipationRecordForRound, 0, len(parts)) + accountsData := make(map[basics.Address]basics.OnlineAccountData, len(parts)) matchingAccountsKeys := make(map[basics.Address]bool) mismatchingAccountsKeys := make(map[basics.Address]int) const bitMismatchingVotingKey = 1 const bitMismatchingSelectionKey = 2 - for _, part := range keys { - acctData, hasAccountData := accountsData[part.Parent] + for _, p := range parts { + acctData, hasAccountData := accountsData[p.Account] if !hasAccountData { var err error - acctData, err = node.ledger.LookupAgreement(keysRound, part.Parent) + acctData, err = node.ledger.LookupAgreement(keysRound, p.Account) if err != nil { - node.log.Warnf("node.VotingKeys: Account %v not participating: cannot locate account for round %d : %v", part.Address(), keysRound, err) + node.log.Warnf("node.VotingKeys: Account %v not participating: cannot locate account for round %d : %v", p.Account, keysRound, err) continue } - accountsData[part.Parent] = acctData + accountsData[p.Account] = acctData } - if acctData.VoteID != part.Voting.OneTimeSignatureVerifier { - mismatchingAccountsKeys[part.Address()] = mismatchingAccountsKeys[part.Address()] | bitMismatchingVotingKey + if acctData.VoteID != p.Voting.OneTimeSignatureVerifier { + mismatchingAccountsKeys[p.Account] = mismatchingAccountsKeys[p.Account] | bitMismatchingVotingKey continue } - if acctData.SelectionID != part.VRF.PK { - mismatchingAccountsKeys[part.Address()] = mismatchingAccountsKeys[part.Address()] | bitMismatchingSelectionKey + if acctData.SelectionID != p.VRF.PK { + mismatchingAccountsKeys[p.Account] = mismatchingAccountsKeys[p.Account] | bitMismatchingSelectionKey continue } - participations = append(participations, part) - matchingAccountsKeys[part.Address()] = true + participations = append(participations, p) + matchingAccountsKeys[p.Account] = true // Make sure the key is registered. - err := node.accountManager.Registry().Register(part.ID(), votingRound) + err := node.accountManager.Registry().Register(p.ParticipationID, votingRound) if err != nil { - node.log.Warnf("Failed to register participation key (%s) with participation registry: %v\n", part.ID(), err) + node.log.Warnf("Failed to register participation key (%s) with participation registry: %v\n", p.ParticipationID, err) } } // write the warnings per account only if we couldn't find a single valid key for that account. diff --git a/node/node_test.go b/node/node_test.go index bfd33a8f00..6dfdd1d904 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -57,7 +57,7 @@ var defaultConfig = config.Local{ } func setupFullNodes(t *testing.T, proto protocol.ConsensusVersion, verificationPool execpool.BacklogPool, customConsensus config.ConsensusProtocols) ([]*AlgorandFullNode, []string, []string) { - util.RaiseRlimit(1000) + util.SetFdSoftLimit(1000) f, _ := os.Create(t.Name() + ".log") logging.Base().SetJSONFormatter() logging.Base().SetOutput(f) diff --git a/node/poolStats.go b/node/poolStats.go index c571c42515..19b0090b4e 100644 --- a/node/poolStats.go +++ b/node/poolStats.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/node/topAccountListener.go b/node/topAccountListener.go index 416045c173..a0b90e0c5c 100644 --- a/node/topAccountListener.go +++ b/node/topAccountListener.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/node/topAccountListener_test.go b/node/topAccountListener_test.go index 6faaa5f9d9..2c25f85f70 100644 --- a/node/topAccountListener_test.go +++ b/node/topAccountListener_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/nodecontrol/LaggedStdIo.go b/nodecontrol/LaggedStdIo.go index 1ff69a69a2..4738452f31 100644 --- a/nodecontrol/LaggedStdIo.go +++ b/nodecontrol/LaggedStdIo.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/nodecontrol/NodeController.go b/nodecontrol/NodeController.go index 77798a4ee8..b1044b43d2 100644 --- a/nodecontrol/NodeController.go +++ b/nodecontrol/NodeController.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/nodecontrol/algodControl.go b/nodecontrol/algodControl.go index d6aed9f481..872fa05a45 100644 --- a/nodecontrol/algodControl.go +++ b/nodecontrol/algodControl.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/nodecontrol/algodControl_test.go b/nodecontrol/algodControl_test.go index 2349e9c450..80c231ba79 100644 --- a/nodecontrol/algodControl_test.go +++ b/nodecontrol/algodControl_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/nodecontrol/kmdControl.go b/nodecontrol/kmdControl.go index 08fd8a2c3c..f55b168767 100644 --- a/nodecontrol/kmdControl.go +++ b/nodecontrol/kmdControl.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/nodecontrol/kmdControl_common.go b/nodecontrol/kmdControl_common.go index 947ccd80a4..a73c75746f 100644 --- a/nodecontrol/kmdControl_common.go +++ b/nodecontrol/kmdControl_common.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/nodecontrol/kmdControl_windows.go b/nodecontrol/kmdControl_windows.go index 601cba07f3..fbb34a296d 100644 --- a/nodecontrol/kmdControl_windows.go +++ b/nodecontrol/kmdControl_windows.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/nodecontrol/nodeControlErrors.go b/nodecontrol/nodeControlErrors.go index 74f62d14ee..6ed43d56ac 100644 --- a/nodecontrol/nodeControlErrors.go +++ b/nodecontrol/nodeControlErrors.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/protocol/codec.go b/protocol/codec.go index 85944c0229..1153b7c612 100644 --- a/protocol/codec.go +++ b/protocol/codec.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -17,6 +17,7 @@ package protocol import ( + "errors" "fmt" "io" "os" @@ -26,6 +27,9 @@ import ( "github.com/algorand/msgp/msgp" ) +// ErrInvalidObject is used to state that an object decoding has failed because it's invalid. +var ErrInvalidObject = errors.New("unmarshalled object is invalid") + // CodecHandle is used to instantiate msgpack encoders and decoders // with our settings (canonical, paranoid about decoding errors) var CodecHandle *codec.MsgpackHandle diff --git a/protocol/codec_test.go b/protocol/codec_test.go index 14fef6187c..79814dadc6 100644 --- a/protocol/codec_test.go +++ b/protocol/codec_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/protocol/codec_tester.go b/protocol/codec_tester.go index 9fcbf7c35b..98682c0120 100644 --- a/protocol/codec_tester.go +++ b/protocol/codec_tester.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -17,6 +17,7 @@ package protocol import ( + "errors" "fmt" "io/ioutil" "math/rand" @@ -249,8 +250,11 @@ func randomizeValue(v reflect.Value, datapath string, tag string) error { } } case reflect.Slice: + // we don't want to allocate a slice with size of 0. This is because decoding and encoding this slice + // will result in nil and not slice of size 0 + l := rand.Int()%31 + 1 + hasAllocBound := checkBoundsLimitingTag(v, datapath, tag) - l := rand.Int() % 32 if hasAllocBound { l = 1 } @@ -378,6 +382,15 @@ func RunEncodingTest(t *testing.T, template msgpMarshalUnmarshal) { t.Skip() return } + if err == nil { + continue + } + + // some objects might appen to the original error additional info. + // we ensure that invalidObject error is not failing the test. + if errors.As(err, &ErrInvalidObject) { + continue + } require.NoError(t, err) } } diff --git a/protocol/compactcerts.go b/protocol/compactcerts.go index e3a56c91a8..06e1e3b187 100644 --- a/protocol/compactcerts.go +++ b/protocol/compactcerts.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/protocol/consensus.go b/protocol/consensus.go index 3af634534c..7b59ddceac 100644 --- a/protocol/consensus.go +++ b/protocol/consensus.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -164,6 +164,13 @@ const ConsensusV30 = ConsensusVersion( "https://github.com/algorandfoundation/specs/tree/bc36005dbd776e6d1eaf0c560619bb183215645c", ) +// ConsensusV31 enables the batch verification for ed25519 signatures, Fix reward calculation issue, introduces the ability +// to force an expired participation offline, enables TEAL 6 ( AVM 1.1 ) and add support for creating +// state proof keys. +const ConsensusV31 = ConsensusVersion( + "https://github.com/algorandfoundation/specs/tree/85e6db1fdbdef00aa232c75199e10dc5fe9498f6", +) + // ConsensusFuture is a protocol that should not appear in any production // network, but is used to test features before they are released. const ConsensusFuture = ConsensusVersion( @@ -176,7 +183,7 @@ const ConsensusFuture = ConsensusVersion( // ConsensusCurrentVersion is the latest version and should be used // when a specific version is not provided. -const ConsensusCurrentVersion = ConsensusV30 +const ConsensusCurrentVersion = ConsensusV31 // Error is used to indicate that an unsupported protocol has been detected. type Error ConsensusVersion diff --git a/protocol/encodebench_test.go b/protocol/encodebench_test.go index cb8e5a5411..3c015bf6b6 100644 --- a/protocol/encodebench_test.go +++ b/protocol/encodebench_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/protocol/hash.go b/protocol/hash.go index e171146795..272c538e16 100644 --- a/protocol/hash.go +++ b/protocol/hash.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -23,7 +23,15 @@ type HashID string // Hash IDs for specific object types, in lexicographic order. // Hash IDs must be PREFIX-FREE (no hash ID is a prefix of another). const ( - AppIndex HashID = "appID" + AppIndex HashID = "appID" + + // ARCReserved is used to reserve prefixes starting with `arc` to + // ARCs-related hashes https://github.com/algorandfoundation/ARCs + // The prefix for ARC-XXXX should start with: + // "arcXXXX" (where "XXXX" is the 0-padded number of the ARC) + // For example ARC-0003 can use any prefix starting with "arc0003" + ARCReserved HashID = "arc" + AuctionBid HashID = "aB" AuctionDeposit HashID = "aD" AuctionOutcomes HashID = "aO" @@ -34,28 +42,30 @@ const ( CompactCertPart HashID = "ccp" CompactCertSig HashID = "ccs" - AgreementSelector HashID = "AS" - BlockHeader HashID = "BH" - BalanceRecord HashID = "BR" - Credential HashID = "CR" - Genesis HashID = "GE" - MerkleArrayNode HashID = "MA" - Message HashID = "MX" - NetPrioResponse HashID = "NPR" - OneTimeSigKey1 HashID = "OT1" - OneTimeSigKey2 HashID = "OT2" - PaysetFlat HashID = "PF" - Payload HashID = "PL" - Program HashID = "Program" - ProgramData HashID = "ProgData" - ProposerSeed HashID = "PS" - ParticipationKeys HashID = "PK" - Seed HashID = "SD" - SpecialAddr HashID = "SpecialAddr" - SignedTxnInBlock HashID = "STIB" - TestHashable HashID = "TE" - TxGroup HashID = "TG" - TxnMerkleLeaf HashID = "TL" - Transaction HashID = "TX" - Vote HashID = "VO" + AgreementSelector HashID = "AS" + BlockHeader HashID = "BH" + BalanceRecord HashID = "BR" + Credential HashID = "CR" + Genesis HashID = "GE" + KeysInMSS HashID = "KP" + MerkleArrayNode HashID = "MA" + MerkleVectorCommitmentBottomLeaf HashID = "MB" + Message HashID = "MX" + NetPrioResponse HashID = "NPR" + OneTimeSigKey1 HashID = "OT1" + OneTimeSigKey2 HashID = "OT2" + PaysetFlat HashID = "PF" + Payload HashID = "PL" + Program HashID = "Program" + ProgramData HashID = "ProgData" + ProposerSeed HashID = "PS" + ParticipationKeys HashID = "PK" + Seed HashID = "SD" + SpecialAddr HashID = "SpecialAddr" + SignedTxnInBlock HashID = "STIB" + TestHashable HashID = "TE" + TxGroup HashID = "TG" + TxnMerkleLeaf HashID = "TL" + Transaction HashID = "TX" + Vote HashID = "VO" ) diff --git a/protocol/networks.go b/protocol/networks.go index c573a77fe9..ff1c8ee0f9 100644 --- a/protocol/networks.go +++ b/protocol/networks.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/protocol/tags.go b/protocol/tags.go index 0cab256282..8ae6cfe564 100644 --- a/protocol/tags.go +++ b/protocol/tags.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/protocol/test/allocbound_slice.go b/protocol/test/allocbound_slice.go index 12ee01dfe6..c825a7d25f 100644 --- a/protocol/test/allocbound_slice.go +++ b/protocol/test/allocbound_slice.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/protocol/transcode/core.go b/protocol/transcode/core.go index d1e4fd0128..863fbabf92 100644 --- a/protocol/transcode/core.go +++ b/protocol/transcode/core.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/protocol/transcode/core_test.go b/protocol/transcode/core_test.go index 330ea66554..132c4270a2 100644 --- a/protocol/transcode/core_test.go +++ b/protocol/transcode/core_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/protocol/txntype.go b/protocol/txntype.go index 919c576d4e..1b50dab8ec 100644 --- a/protocol/txntype.go +++ b/protocol/txntype.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/rpcs/blockService.go b/rpcs/blockService.go index 2e77aba8e5..80c7f2338a 100644 --- a/rpcs/blockService.go +++ b/rpcs/blockService.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -19,6 +19,7 @@ package rpcs import ( "context" "encoding/binary" + "errors" "net/http" "path" "strconv" @@ -29,6 +30,8 @@ import ( "github.com/algorand/go-codec/codec" + "github.com/algorand/go-deadlock" + "github.com/algorand/go-algorand/agreement" "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" @@ -61,6 +64,8 @@ const ( BlockAndCertValue = "blockAndCert" // block+cert request data (as the value of requestDataTypeKey) ) +var errBlockServiceClosed = errors.New("block service is shutting down") + // BlockService represents the Block RPC API type BlockService struct { ledger *data.Ledger @@ -74,6 +79,7 @@ type BlockService struct { enableArchiverFallback bool log logging.Logger closeWaitGroup sync.WaitGroup + mu deadlock.Mutex } // EncodedBlockCert defines how GetBlockBytes encodes a block and its certificate @@ -118,6 +124,8 @@ func MakeBlockService(log logging.Logger, config config.Local, ledger *data.Ledg // Start listening to catchup requests over ws func (bs *BlockService) Start() { + bs.mu.Lock() + defer bs.mu.Unlock() if bs.enableServiceOverGossip { handlers := []network.TaggedMessageHandler{ {Tag: protocol.UniCatchupReqTag, MessageHandler: network.HandlerFunc(bs.processIncomingMessage)}, @@ -133,12 +141,14 @@ func (bs *BlockService) Start() { // Stop servicing catchup requests over ws func (bs *BlockService) Stop() { + bs.mu.Lock() close(bs.stop) + bs.mu.Unlock() bs.closeWaitGroup.Wait() } // ServerHTTP returns blocks -// Either /v{version}/block/{round} or ?b={round}&v={version} +// Either /v{version}/{genesisID}/block/{round} or ?b={round}&v={version} // Uses gorilla/mux for path argument parsing. func (bs *BlockService) ServeHTTP(response http.ResponseWriter, request *http.Request) { pathVars := mux.Vars(request) @@ -200,7 +210,7 @@ func (bs *BlockService) ServeHTTP(response http.ResponseWriter, request *http.Re response.WriteHeader(http.StatusBadRequest) return } - encodedBlockCert, err := RawBlockBytes(bs.ledger, basics.Round(round)) + encodedBlockCert, err := bs.rawBlockBytes(basics.Round(round)) if err != nil { switch err.(type) { case ledgercore.ErrNoEntry: @@ -321,7 +331,7 @@ func (bs *BlockService) redirectRequest(round uint64, response http.ResponseWrit bs.log.Debugf("redirectRequest: %s", err.Error()) return false } - parsedURL.Path = FormatBlockQuery(round, parsedURL.Path, bs.net) + parsedURL.Path = strings.Replace(FormatBlockQuery(round, parsedURL.Path, bs.net), "{genesisID}", bs.genesisID, 1) http.Redirect(response, request, parsedURL.String(), http.StatusTemporaryRedirect) bs.log.Debugf("redirectRequest: redirected block request to %s", parsedURL.String()) return true @@ -356,6 +366,22 @@ func (bs *BlockService) getRandomArchiver() (endpointAddress string) { return } +// rawBlockBytes returns the block/cert for a given round, while taking the lock +// to ensure the block service is currently active. +func (bs *BlockService) rawBlockBytes(round basics.Round) ([]byte, error) { + bs.mu.Lock() + defer bs.mu.Unlock() + select { + case _, ok := <-bs.stop: + if !ok { + // service is closed. + return nil, errBlockServiceClosed + } + default: + } + return RawBlockBytes(bs.ledger, round) +} + func topicBlockBytes(log logging.Logger, dataLedger *data.Ledger, round basics.Round, requestType string) network.Topics { blk, cert, err := dataLedger.EncodedBlockCert(round) if err != nil { diff --git a/rpcs/blockService_test.go b/rpcs/blockService_test.go index 542e8783ed..e9c8791ae5 100644 --- a/rpcs/blockService_test.go +++ b/rpcs/blockService_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -19,7 +19,9 @@ package rpcs import ( "context" "fmt" + "io/ioutil" "net/http" + "strings" "testing" "time" @@ -118,7 +120,7 @@ func TestHandleCatchupReqNegative(t *testing.T) { require.Equal(t, roundNumberParseErrMsg, string(val)) } -// TestRedirectBasic tests the case when the block service redirects the request to elsewhere +// TestRedirectFallbackArchiver tests the case when the block service fallback to another in the absense of a given block. func TestRedirectFallbackArchiver(t *testing.T) { partitiontest.PartitionTest(t) @@ -136,8 +138,8 @@ func TestRedirectFallbackArchiver(t *testing.T) { net2 := &httpTestPeerSource{} config := config.GetDefaultLocal() - bs1 := MakeBlockService(log, config, ledger1, net1, "{genesisID}") - bs2 := MakeBlockService(log, config, ledger2, net2, "{genesisID}") + bs1 := MakeBlockService(log, config, ledger1, net1, "test-genesis-ID") + bs2 := MakeBlockService(log, config, ledger2, net2, "test-genesis-ID") nodeA := &basicRPCNode{} nodeB := &basicRPCNode{} @@ -159,6 +161,7 @@ func TestRedirectFallbackArchiver(t *testing.T) { ctx := context.Background() parsedURL.Path = FormatBlockQuery(uint64(2), parsedURL.Path, net1) + parsedURL.Path = strings.Replace(parsedURL.Path, "{genesisID}", "test-genesis-ID", 1) blockURL := parsedURL.String() request, err := http.NewRequest("GET", blockURL, nil) require.NoError(t, err) @@ -170,6 +173,58 @@ func TestRedirectFallbackArchiver(t *testing.T) { require.NoError(t, err) require.Equal(t, http.StatusOK, response.StatusCode) + bodyData, err := ioutil.ReadAll(response.Body) + require.NoError(t, err) + require.NotEqual(t, 0, len(bodyData)) +} + +// TestBlockServiceShutdown tests that the block service is shutting down correctly. +func TestBlockServiceShutdown(t *testing.T) { + partitiontest.PartitionTest(t) + + log := logging.TestingLog(t) + + ledger1 := makeLedger(t, "l1") + addBlock(t, ledger1) + + net1 := &httpTestPeerSource{} + + config := config.GetDefaultLocal() + bs1 := MakeBlockService(log, config, ledger1, net1, "test-genesis-ID") + bs1.Start() + + nodeA := &basicRPCNode{} + + nodeA.RegisterHTTPHandler(BlockServiceBlockPath, bs1) + nodeA.start() + defer nodeA.stop() + + parsedURL, err := network.ParseHostOrURL(nodeA.rootURL()) + require.NoError(t, err) + + client := http.Client{} + + ctx := context.Background() + parsedURL.Path = FormatBlockQuery(uint64(1), parsedURL.Path, net1) + parsedURL.Path = strings.Replace(parsedURL.Path, "{genesisID}", "test-genesis-ID", 1) + blockURL := parsedURL.String() + request, err := http.NewRequest("GET", blockURL, nil) + require.NoError(t, err) + requestCtx, requestCancel := context.WithTimeout(ctx, time.Duration(config.CatchupHTTPBlockFetchTimeoutSec)*time.Second) + defer requestCancel() + request = request.WithContext(requestCtx) + network.SetUserAgentHeader(request.Header) + + requestDone := make(chan struct{}) + go func() { + defer close(requestDone) + client.Do(request) + }() + + bs1.Stop() + ledger1.Close() + + <-requestDone } // TestRedirectBasic tests the case when the block service redirects the request to elsewhere diff --git a/rpcs/httpTxSync.go b/rpcs/httpTxSync.go index 390d0751d0..63b99c8a60 100644 --- a/rpcs/httpTxSync.go +++ b/rpcs/httpTxSync.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/rpcs/ledgerService.go b/rpcs/ledgerService.go index 8a8500c577..582dd89b46 100644 --- a/rpcs/ledgerService.go +++ b/rpcs/ledgerService.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/rpcs/registrar.go b/rpcs/registrar.go index 7c4fbd43b5..1e782d8029 100644 --- a/rpcs/registrar.go +++ b/rpcs/registrar.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/rpcs/txService.go b/rpcs/txService.go index df08114c64..e621d6541e 100644 --- a/rpcs/txService.go +++ b/rpcs/txService.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/rpcs/txService_test.go b/rpcs/txService_test.go index fd92b83a10..4db86d10cd 100644 --- a/rpcs/txService_test.go +++ b/rpcs/txService_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/rpcs/txSyncer.go b/rpcs/txSyncer.go index 0290d82a6d..cbeeb27fc5 100644 --- a/rpcs/txSyncer.go +++ b/rpcs/txSyncer.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -127,6 +127,7 @@ func (syncer *TxSyncer) syncFromClient(client TxSyncClient) error { return fmt.Errorf("TxSyncer.Sync: peer '%v' error '%v'", client.Address(), err) } + var pendingTxidMap map[transactions.Txid]struct{} // test to see if all the transaction that we've received honor the bloom filter constraints // that we've requested. for _, txgroup := range txgroups { @@ -134,11 +135,23 @@ func (syncer *TxSyncer) syncFromClient(client TxSyncClient) error { for i := range txgroup { txID := txgroup[i].ID() if filter.Test(txID[:]) { - // we just found a transaction that shouldn't have been - // included in the response. maybe this is a false positive - // and other transactions in the group aren't included in the - // bloom filter, though. - txnsInFilter++ + // having the transaction id tested here might still fall into the false-positive class, so we + // need to perform explicit check. This is not too bad since we're doing this check only on the fail + // cases. + if pendingTxidMap == nil { + // construct and initialize it. + pendingTxidMap = make(map[transactions.Txid]struct{}, len(pending)) + for _, txid := range pending { + pendingTxidMap[txid] = struct{}{} + } + } + if _, has := pendingTxidMap[txID]; has { + // we just found a transaction that shouldn't have been + // included in the response. maybe this is a false positive + // and other transactions in the group aren't included in the + // bloom filter, though. + txnsInFilter++ + } } } diff --git a/rpcs/txSyncer_test.go b/rpcs/txSyncer_test.go index 9b89fda1bd..d4b0d2fbc5 100644 --- a/rpcs/txSyncer_test.go +++ b/rpcs/txSyncer_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/scripts/build_package.sh b/scripts/build_package.sh index 004aa65351..ccbf0d27e0 100755 --- a/scripts/build_package.sh +++ b/scripts/build_package.sh @@ -91,7 +91,11 @@ mkdir ${PKG_ROOT}/genesis genesis_dirs=("devnet" "testnet" "mainnet" "betanet") for dir in "${genesis_dirs[@]}"; do mkdir -p ${PKG_ROOT}/genesis/${dir} - cp ${REPO_DIR}/installer/genesis/${dir}/genesis.json ${PKG_ROOT}/genesis/${dir}/ + if [ -f "${REPO_DIR}/gen/${dir}/genesis.json" ]; then + cp ${REPO_DIR}/gen/${dir}/genesis.json ${PKG_ROOT}/genesis/${dir}/ + else + cp ${REPO_DIR}/installer/genesis/${dir}/genesis.json ${PKG_ROOT}/genesis/${dir}/ + fi if [ $? -ne 0 ]; then exit 1; fi done # Copy the appropriate network genesis.json for our default (in root ./genesis folder) @@ -102,7 +106,7 @@ TOOLS_ROOT=${PKG_ROOT}/tools echo "Staging tools package files" -bin_files=("algons" "coroner" "dispenser" "netgoal" "nodecfg" "pingpong" "cc_service" "cc_agent" "cc_client" "loadgenerator" "COPYING" "dsign") +bin_files=("algons" "coroner" "dispenser" "netgoal" "nodecfg" "pingpong" "cc_service" "cc_agent" "cc_client" "loadgenerator" "COPYING" "dsign" "catchpointdump") mkdir -p ${TOOLS_ROOT} for bin in "${bin_files[@]}"; do cp ${GOPATHBIN}/${bin} ${TOOLS_ROOT} diff --git a/scripts/buildtools/go.mod b/scripts/buildtools/go.mod index 18710c58b7..054b4ca8ab 100644 --- a/scripts/buildtools/go.mod +++ b/scripts/buildtools/go.mod @@ -3,7 +3,7 @@ module github.com/algorand/go-algorand/scripts/buildtools go 1.14 require ( - github.com/algorand/msgp v1.1.48 + github.com/algorand/msgp v1.1.49 github.com/algorand/oapi-codegen v1.3.5-algorand5 github.com/go-swagger/go-swagger v0.25.0 golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect diff --git a/scripts/buildtools/go.sum b/scripts/buildtools/go.sum index 198ef473f0..f7f042dd70 100644 --- a/scripts/buildtools/go.sum +++ b/scripts/buildtools/go.sum @@ -21,8 +21,8 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/algorand/msgp v1.1.48 h1:5P+gVmTnk0m37r+rA3ZsFZW219ZqmCLulW5f8Z+3nx8= -github.com/algorand/msgp v1.1.48/go.mod h1:LtOntbYiCHj/Sl/Sqxtf8CZOrDt2a8Dv3tLaS6mcnUE= +github.com/algorand/msgp v1.1.49 h1:YBFRcYZNsD2WgzXONvzFrjv1/887pWzJSx874VL4P6g= +github.com/algorand/msgp v1.1.49/go.mod h1:oyDY2SIeM1bytVYJTL88nt9kVeEBC00Avyqcnyrq/ec= github.com/algorand/oapi-codegen v1.3.5-algorand5 h1:y576Ca2/guQddQrQA7dtL5KcOx5xQgPeIupiuFMGyCI= github.com/algorand/oapi-codegen v1.3.5-algorand5/go.mod h1:/k0Ywn0lnt92uBMyE+yiRf/Wo3/chxHHsAfenD09EbY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= diff --git a/scripts/create_and_deploy_recipe.sh b/scripts/create_and_deploy_recipe.sh index 4c55edaf01..bca4cc808a 100755 --- a/scripts/create_and_deploy_recipe.sh +++ b/scripts/create_and_deploy_recipe.sh @@ -2,7 +2,7 @@ # create_and_deploy_recipe.sh - Generates deployed network configuration (based on a recipe) and private build and pushes to S3 # -# Syntax: create_and_deploy_recipe.sh -c [-n network] --recipe -r [--nodeploy] [--skip-build] [--force] [-m genesisVersionModifier] [ -b ]" +# Syntax: create_and_deploy_recipe.sh -c [-n network] --recipe -r [--nodeploy] [--skip-build] [--force] [-m genesisVersionModifier] [ -b ] [--template ]" # # Outputs: # @@ -15,6 +15,9 @@ # Examples: create_and_deploy_recipe.sh -c TestCatchup --recipe test/testdata/deployednettemplates/recipes/devnet-like.config -r ~/networks/gen # # Notes: If you're running on a Mac, this will attempt to use docker to build for linux. +# If you need to generate a recipe, you can pass in the --template flag with the path to the +# template json and it will run the generate_recipe.py on the file. Make sure it's in the same +# directory as the recipe file path. set -e @@ -24,7 +27,8 @@ if [[ "${AWS_ACCESS_KEY_ID}" = "" || "${AWS_SECRET_ACCESS_KEY}" = "" ]]; then fi SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )" -export GOPATH=$(go env GOPATH) +GOPATH=$(go env GOPATH) +export GOPATH=${GOPATH%:*} # Anchor our repo root reference location REPO_ROOT=${SCRIPTPATH}/.. @@ -80,6 +84,10 @@ while [ "$1" != "" ]; do --skip-build) SKIP_BUILD="true" ;; + --template) + shift + NETWORK_TEMPLATE="$1" + ;; *) echo "Unknown option" "$1" exit 1 @@ -89,7 +97,7 @@ while [ "$1" != "" ]; do done if [[ -z "${CHANNEL}" || -z "${RECIPEFILE}" || -z "${ROOTDIR}" ]]; then - echo "Syntax: create_and_deploy_recipe.sh -c [-n network] --recipe -r [--nodeploy] [--force]" + echo "Syntax: create_and_deploy_recipe.sh -c [-n network] --recipe -r [--nodeploy] [--force] [--template ]" echo "e.g. create_and_deploy_recipe.sh -c TestCatchup --recipe test/testdata/deployednettemplates/recipes/devnet-like.config -r ~/networks//gen" exit 1 fi @@ -111,6 +119,11 @@ if [[ "${SKIP_BUILD}" != "true" || ! -f ${GOPATH}/bin/netgoal ]]; then (cd ${SRCPATH} && make) fi +# If template is passed in, a recipe will be generated in the same folder as the template +if [[ ! -z ${NETWORK_TEMPLATE} ]]; then + python3 ${SRCPATH}/test/testdata/deployednettemplates/generate-recipe/generate_network.py -f ${NETWORK_TEMPLATE} +fi + # Generate the nodecfg package directory ${GOPATH}/bin/netgoal build -r "${ROOTDIR}" -n "${NETWORK}" --recipe "${RECIPEFILE}" "${FORCE_OPTION}" -m "${SCHEMA_MODIFIER}" -b=${BOOTSTRAP:-true} diff --git a/scripts/release/README.md b/scripts/release/README.md index 0613ddcc57..4639743e71 100644 --- a/scripts/release/README.md +++ b/scripts/release/README.md @@ -70,7 +70,7 @@ This section briefly describes the expected outcomes of the current build pipeli - The packages are built from the correct branch and channel and are the correct version. This done by running `algod -v`. + This is done for the following docker containers: - centos:7 - - centos:8 + - quay.io/centos/centos:stream8 - fedora:28 - ubuntu:16.04 - ubuntu:18.04 diff --git a/scripts/release/mule/Makefile.mule b/scripts/release/mule/Makefile.mule index 95cc465eb6..ae40490c7a 100644 --- a/scripts/release/mule/Makefile.mule +++ b/scripts/release/mule/Makefile.mule @@ -28,7 +28,7 @@ ci-integration: SRCROOT=$(SRCPATH) \ test/scripts/e2e.sh -c $(CHANNEL) -n -ci-build: ci-clean buildsrc gen ci-setup +ci-build: ci-clean buildsrc ci-setup CHANNEL=$(CHANNEL) PKG_ROOT=$(PKG_DIR) NO_BUILD=True VARIATIONS=$(OS_TYPE)-$(ARCH) \ scripts/build_packages.sh $(OS_TYPE)/$(ARCH) && \ mkdir -p $(PKG_DIR)/data && \ diff --git a/scripts/release/mule/sign/sign.sh b/scripts/release/mule/sign/sign.sh index 7c9b7e3880..cb0cbf42d0 100755 --- a/scripts/release/mule/sign/sign.sh +++ b/scripts/release/mule/sign/sign.sh @@ -4,6 +4,7 @@ # TODO: This needs to be reworked a bit to support Darwin. set -exo pipefail +shopt -s nullglob echo date "+build_release begin SIGN stage %Y%m%d_%H%M%S" @@ -100,8 +101,10 @@ for os in "${OS_TYPES[@]}"; do gpg -u "$SIGNING_KEY_ADDR" --clearsign "$HASHFILE" STATUSFILE="build_status_${CHANNEL}_${os}-${arch}_${VERSION}" - gpg -u "$SIGNING_KEY_ADDR" --clearsign "$STATUSFILE" - gzip -c "$STATUSFILE.asc" > "$STATUSFILE.asc.gz" + if [[ -f "$STATUSFILE" ]]; then + gpg -u "$SIGNING_KEY_ADDR" --clearsign "$STATUSFILE" + gzip -c "$STATUSFILE.asc" > "$STATUSFILE.asc.gz" + fi ) fi fi diff --git a/scripts/release/test/util/test_package.sh b/scripts/release/test/util/test_package.sh index 397772c58b..65c4ab022e 100755 --- a/scripts/release/test/util/test_package.sh +++ b/scripts/release/test/util/test_package.sh @@ -9,7 +9,7 @@ set -ex OS_LIST=( centos:7 - centos:8 + quay.io/centos/centos:stream8 fedora:28 ubuntu:16.04 ubuntu:18.04 diff --git a/scripts/travis/codegen_verification.sh b/scripts/travis/codegen_verification.sh index ae5887366d..d8af12231f 100755 --- a/scripts/travis/codegen_verification.sh +++ b/scripts/travis/codegen_verification.sh @@ -25,7 +25,7 @@ eval "$(~/gimme "${GOLANG_VERSION}")" "${SCRIPTPATH}"/../buildtools/install_buildtools.sh -make gen +make gen SHORT_PART_PERIOD=1 function runGoFmt() { unformatted=$(gofmt -l .) diff --git a/shared/algoh/config.go b/shared/algoh/config.go index adab8a8dfb..687fd1be28 100644 --- a/shared/algoh/config.go +++ b/shared/algoh/config.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/shared/pingpong/accounts.go b/shared/pingpong/accounts.go index ba208abcc5..402ee48ded 100644 --- a/shared/pingpong/accounts.go +++ b/shared/pingpong/accounts.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/shared/pingpong/config.go b/shared/pingpong/config.go index 21841ed206..73ad4e4ec7 100644 --- a/shared/pingpong/config.go +++ b/shared/pingpong/config.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/shared/pingpong/pingpong.go b/shared/pingpong/pingpong.go index 6780d13b34..9c1b72cac3 100644 --- a/shared/pingpong/pingpong.go +++ b/shared/pingpong/pingpong.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/commandandcontrol/cc_agent/component/agent.go b/test/commandandcontrol/cc_agent/component/agent.go index f467c93035..fb1bc504a6 100644 --- a/test/commandandcontrol/cc_agent/component/agent.go +++ b/test/commandandcontrol/cc_agent/component/agent.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/commandandcontrol/cc_agent/component/agent_test.go b/test/commandandcontrol/cc_agent/component/agent_test.go index 0fb21f0dcf..7ca805eb7f 100644 --- a/test/commandandcontrol/cc_agent/component/agent_test.go +++ b/test/commandandcontrol/cc_agent/component/agent_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/commandandcontrol/cc_agent/component/pingPongComponent.go b/test/commandandcontrol/cc_agent/component/pingPongComponent.go index 155060c97f..7f992e793b 100644 --- a/test/commandandcontrol/cc_agent/component/pingPongComponent.go +++ b/test/commandandcontrol/cc_agent/component/pingPongComponent.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/commandandcontrol/cc_agent/main.go b/test/commandandcontrol/cc_agent/main.go index 8e5ef9a3c8..a64ca804e4 100644 --- a/test/commandandcontrol/cc_agent/main.go +++ b/test/commandandcontrol/cc_agent/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/commandandcontrol/cc_client/main.go b/test/commandandcontrol/cc_client/main.go index b144b685cb..c45fec1b8f 100644 --- a/test/commandandcontrol/cc_client/main.go +++ b/test/commandandcontrol/cc_client/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/commandandcontrol/cc_service/main.go b/test/commandandcontrol/cc_service/main.go index e42c16933d..a951303201 100644 --- a/test/commandandcontrol/cc_service/main.go +++ b/test/commandandcontrol/cc_service/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/commandandcontrol/lib/ccCommon.go b/test/commandandcontrol/lib/ccCommon.go index 5088549e3b..f3db52a51a 100644 --- a/test/commandandcontrol/lib/ccCommon.go +++ b/test/commandandcontrol/lib/ccCommon.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/cli/algod/cleanup_test.go b/test/e2e-go/cli/algod/cleanup_test.go index bfad648777..24b77e7d9f 100644 --- a/test/e2e-go/cli/algod/cleanup_test.go +++ b/test/e2e-go/cli/algod/cleanup_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/cli/algod/expect/algod_expect_test.go b/test/e2e-go/cli/algod/expect/algod_expect_test.go index fd1568096e..ec69fc715c 100644 --- a/test/e2e-go/cli/algod/expect/algod_expect_test.go +++ b/test/e2e-go/cli/algod/expect/algod_expect_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/cli/algod/stdstreams_test.go b/test/e2e-go/cli/algod/stdstreams_test.go index 08f2a3613c..cb335cad61 100644 --- a/test/e2e-go/cli/algod/stdstreams_test.go +++ b/test/e2e-go/cli/algod/stdstreams_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/cli/algoh/expect/algoh_expect_test.go b/test/e2e-go/cli/algoh/expect/algoh_expect_test.go index 004473ce77..f260a1bd6e 100644 --- a/test/e2e-go/cli/algoh/expect/algoh_expect_test.go +++ b/test/e2e-go/cli/algoh/expect/algoh_expect_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/cli/goal/account_test.go b/test/e2e-go/cli/goal/account_test.go index d35e307051..67165a6d0a 100644 --- a/test/e2e-go/cli/goal/account_test.go +++ b/test/e2e-go/cli/goal/account_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/cli/goal/clerk_test.go b/test/e2e-go/cli/goal/clerk_test.go index 73fd2daa00..948eb1a613 100644 --- a/test/e2e-go/cli/goal/clerk_test.go +++ b/test/e2e-go/cli/goal/clerk_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/cli/goal/common_test.go b/test/e2e-go/cli/goal/common_test.go index af617ee805..b9d0a4b0c9 100644 --- a/test/e2e-go/cli/goal/common_test.go +++ b/test/e2e-go/cli/goal/common_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/cli/goal/expect/README.md b/test/e2e-go/cli/goal/expect/README.md index ea3dd026dd..cde94390f3 100644 --- a/test/e2e-go/cli/goal/expect/README.md +++ b/test/e2e-go/cli/goal/expect/README.md @@ -77,6 +77,15 @@ go test -v test/e2e-go/cli/goal/expect/goal_expect_test.go TESTFILTER=foobar[0-9]Test TESTDIR=baz go test -v test/e2e-go/cli/goal/expect/goal_expect_test.go ``` +In particular, if you want to run `goalAccountInfoTest.exp` you'll need to create a temporary directory such as `deletemeTemp` with +``` +mkdir test/e2e-go/cli/goal/expect/deletemeTemp +``` +and then run the following command: +``` +TESTFILTER=goalAccountInfoTest TESTDIR=deletemeTemp go test -v test/e2e-go/cli/goal/expect/goal_expect_test.go +``` +If you're running **exactly the same command again**, make sure to _delete_ and _re-create_ the temp directory first. > Of course, a test can always be run directly by `expect`, i.e. `expect rekeyTest.exp $TESTDIR $TESTDATADIR`. diff --git a/test/e2e-go/cli/goal/expect/catchpointCatchupWebProxy/webproxy.go b/test/e2e-go/cli/goal/expect/catchpointCatchupWebProxy/webproxy.go index 8f7e2edaa1..3090a943aa 100644 --- a/test/e2e-go/cli/goal/expect/catchpointCatchupWebProxy/webproxy.go +++ b/test/e2e-go/cli/goal/expect/catchpointCatchupWebProxy/webproxy.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/cli/goal/expect/goalAccountInfoTest.exp b/test/e2e-go/cli/goal/expect/goalAccountInfoTest.exp index 4ba7ce1732..a7e9ad1e32 100644 --- a/test/e2e-go/cli/goal/expect/goalAccountInfoTest.exp +++ b/test/e2e-go/cli/goal/expect/goalAccountInfoTest.exp @@ -40,7 +40,8 @@ Held Assets: Created Apps: \t Opted In Apps: -\t" +\t +Minimum Balance:\t100000 microAlgos" # Check info with no assets puts "goal account info -w $PRIMARY_WALLET_NAME -a $PRIMARY_ACCOUNT_ADDRESS -d $TEST_PRIMARY_NODE_DIR" @@ -97,7 +98,8 @@ Held Assets: Created Apps: \t Opted In Apps: -\t" +\t +Minimum Balance:\t500000 microAlgos" # Check info with assets puts "goal account info -w $PRIMARY_WALLET_NAME -a $PRIMARY_ACCOUNT_ADDRESS -d $TEST_PRIMARY_NODE_DIR" @@ -137,7 +139,8 @@ Created Apps: \tID $GSTATE_APP_ID, $GSTATE_EXTRA_PAGES extra pages, global state used 0/0 uints, 1/$GSTATE_GLOBAL_BYTE_SLICES byte slices \tID $LSTATE_APP_ID, global state used 0/0 uints, 0/$LSTATE_GLOBAL_BYTE_SLICES byte slices Opted In Apps: -\tID $LSTATE_APP_ID, local state used 0/1 uints, 1/$LSTATE_LOCAL_BYTE_SLICES byte slices" +\tID $LSTATE_APP_ID, local state used 0/1 uints, 1/$LSTATE_LOCAL_BYTE_SLICES byte slices +Minimum Balance:\t1578500 microAlgos" # Check info with assets and apps puts "goal account info -w $PRIMARY_WALLET_NAME -a $PRIMARY_ACCOUNT_ADDRESS -d $TEST_PRIMARY_NODE_DIR" diff --git a/test/e2e-go/cli/goal/expect/goal_expect_test.go b/test/e2e-go/cli/goal/expect/goal_expect_test.go index 69964b03d3..55bdf7ce6b 100644 --- a/test/e2e-go/cli/goal/expect/goal_expect_test.go +++ b/test/e2e-go/cli/goal/expect/goal_expect_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/cli/goal/expect/statefulTealCreateAppTest.exp b/test/e2e-go/cli/goal/expect/statefulTealCreateAppTest.exp old mode 100644 new mode 100755 index d4118ad677..0051d65cc2 --- a/test/e2e-go/cli/goal/expect/statefulTealCreateAppTest.exp +++ b/test/e2e-go/cli/goal/expect/statefulTealCreateAppTest.exp @@ -121,7 +121,7 @@ proc statefulTealTest { TEST_ALGO_DIR TEST_DATA_DIR TEAL_PROGRAM} { spawn goal app create --creator $PRIMARY_ACCOUNT_ADDRESS --approval-prog ${TEAL_PROGS_DIR}/${TEAL_PROGRAM} --global-byteslices $GLOBAL_BYTE_SLICES --global-ints 0 --local-byteslices $LOCAL_BYTE_SLICES --local-ints 0 --app-arg "str:hello" --clear-prog ${TEAL_PROGS_DIR}/${TEAL_PROGRAM} --extra-pages 5 -w $PRIMARY_WALLET_NAME -d $TEST_PRIMARY_NODE_DIR expect { timeout { puts timeout; ::AlgorandGoal::Abort "\n Failed to see expected output" } - "tx.ExtraProgramPages too large, max number of extra pages is 3" {puts "received expected error"; close} + "tx.ExtraProgramPages exceeds MaxExtraAppProgramPages = 3" {puts "received expected error"; close} eof { close; ::AlgorandGoal::Abort "did not receive expected error" } } diff --git a/test/e2e-go/cli/goal/node_cleanup_test.go b/test/e2e-go/cli/goal/node_cleanup_test.go index 8a7b8f1646..8365adbe56 100644 --- a/test/e2e-go/cli/goal/node_cleanup_test.go +++ b/test/e2e-go/cli/goal/node_cleanup_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/cli/perf/libgoal_test.go b/test/e2e-go/cli/perf/libgoal_test.go index 817ddeef5d..a98164003b 100644 --- a/test/e2e-go/cli/perf/libgoal_test.go +++ b/test/e2e-go/cli/perf/libgoal_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/cli/perf/payment_test.go b/test/e2e-go/cli/perf/payment_test.go index bf5a7e8a14..1989ac3cb4 100644 --- a/test/e2e-go/cli/perf/payment_test.go +++ b/test/e2e-go/cli/perf/payment_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/cli/tealdbg/cdtmock/main.go b/test/e2e-go/cli/tealdbg/cdtmock/main.go index fa2791ea06..9cb3cf0724 100644 --- a/test/e2e-go/cli/tealdbg/cdtmock/main.go +++ b/test/e2e-go/cli/tealdbg/cdtmock/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/cli/tealdbg/expect/tealdbg_expect_test.go b/test/e2e-go/cli/tealdbg/expect/tealdbg_expect_test.go index 401344a060..72248cfff5 100644 --- a/test/e2e-go/cli/tealdbg/expect/tealdbg_expect_test.go +++ b/test/e2e-go/cli/tealdbg/expect/tealdbg_expect_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/features/catchup/basicCatchup_test.go b/test/e2e-go/features/catchup/basicCatchup_test.go index ab77ec7b88..ce908b9e64 100644 --- a/test/e2e-go/features/catchup/basicCatchup_test.go +++ b/test/e2e-go/features/catchup/basicCatchup_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -331,3 +331,92 @@ func shutdownClonedNode(nodeDataDir string, f *fixtures.RestClientFixture, t *te os.RemoveAll(nodeDataDir) } } + +// TestBasicCatchupCompletes confirms the the catchup eventually completes and stops. +func TestBasicCatchupCompletes(t *testing.T) { + partitiontest.PartitionTest(t) + defer fixtures.ShutdownSynchronizedTest(t) + + if testing.Short() { + t.Skip() + } + t.Parallel() + a := require.New(fixtures.SynchronizedTest(t)) + + // Make the network progress faster + consensus := make(config.ConsensusProtocols) + fastProtocol := config.Consensus[protocol.ConsensusCurrentVersion] + fastProtocol.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + fastProtocol.AgreementFilterTimeoutPeriod0 = 400 * time.Millisecond + fastProtocol.AgreementFilterTimeout = 400 * time.Millisecond + consensus[protocol.ConsensusCurrentVersion] = fastProtocol + + // Setup the fixture with the modified fast consensus + var fixture fixtures.RestClientFixture + fixture.SetConsensus(consensus) + fixture.Setup(t, filepath.Join("nettemplates", "TwoNodes100Second.json")) + defer fixture.Shutdown() + + // Get 2nd node so we wait until we know they're at target block + nc, err := fixture.GetNodeController("Node") + a.NoError(err) + + // Let the network make some progress. + // Make it long enough so the catchup to it is longer than a single round agreement + a.NoError(err) + waitForRound := uint64(100) + + // Now prepare a third node + cloneDataDir := filepath.Join(fixture.PrimaryDataDir(), "../clone") + cloneLedger := false + err = fixture.NC.Clone(cloneDataDir, cloneLedger) + a.NoError(err) + + // Wait for the network to make some progess. + err = fixture.ClientWaitForRoundWithTimeout(fixture.GetAlgodClientForController(nc), waitForRound) + a.NoError(err) + + // Start the third node to catchup. + startTime := time.Now() + cloneClient, err := fixture.StartNode(cloneDataDir) + a.NoError(err) + defer shutdownClonedNode(cloneDataDir, &fixture, t) + + // Wait for it to catchup + err = fixture.LibGoalFixture.ClientWaitForRoundWithTimeout(cloneClient, waitForRound) + a.NoError(err) + + // Calculate the catchup time + catchupTime := time.Since(startTime) + + // Check if curStatus.CatchupTime, the "Time since last block" is less than the catchup time. + // - If the catchup has not stopped, this value will keep on growing, and eventually be larger than the time + // of a single round agreement. + // - If the catchup stops after it completes, this value will be the time since the last round was + // obtained through the agreement, and be much smaller than the catchup time. + client := fixture.GetAlgodClientForController(fixture.LibGoalFixture.GetNodeControllerForDataDir(cloneDataDir)) + + // Prevent false positive + // - Since obtaining the exact catchup time is not possible, wait catchupTime again, to make sure curStatus.CatchupTime + // will be at least our estimated catchupTime (since it keeps on growing if catchup has not stopped). + time.Sleep(catchupTime) + + // Prevent false negative + // The network may have made some progress since waitForRound, it could be that the + // third node is still catching up even after getting to waitForRound. + // Moreover, it takes some time to transition from the catchup to agreement. + // Give it some more time and check again.. + pass := false + for x := 0; x < 100; x++ { + curStatus, statusErr := client.Status() + require.NoError(t, statusErr, "fixture should be able to get node status") + currentStateMsec := time.Duration(curStatus.CatchupTime).Milliseconds() + catchupMsec := catchupTime.Milliseconds() + pass = currentStateMsec < catchupMsec + if pass { + break + } + time.Sleep(100 * time.Millisecond) + } + a.True(pass) +} diff --git a/test/e2e-go/features/catchup/catchpointCatchup_test.go b/test/e2e-go/features/catchup/catchpointCatchup_test.go index 1548f55996..f1eb14b4e9 100644 --- a/test/e2e-go/features/catchup/catchpointCatchup_test.go +++ b/test/e2e-go/features/catchup/catchpointCatchup_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/features/compactcert/compactcert_test.go b/test/e2e-go/features/compactcert/compactcert_test.go index b56897e086..5c00286a5b 100644 --- a/test/e2e-go/features/compactcert/compactcert_test.go +++ b/test/e2e-go/features/compactcert/compactcert_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -24,7 +24,6 @@ import ( "github.com/stretchr/testify/require" "github.com/algorand/go-algorand/config" - "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/crypto/compactcert" "github.com/algorand/go-algorand/daemon/algod/api/spec/v1" "github.com/algorand/go-algorand/data/basics" @@ -51,8 +50,15 @@ func TestCompactCerts(t *testing.T) { consensusParams.CompactCertVotersLookback = 2 consensusParams.CompactCertWeightThreshold = (1 << 32) * 30 / 100 consensusParams.CompactCertSecKQ = 128 + consensusParams.EnableStateProofKeyregCheck = true configurableConsensus[consensusVersion] = consensusParams + tmp := config.Consensus[protocol.ConsensusFuture] + config.Consensus[protocol.ConsensusFuture] = consensusParams + defer func() { + config.Consensus[protocol.ConsensusFuture] = tmp + }() + var fixture fixtures.RestClientFixture fixture.SetConsensus(configurableConsensus) fixture.Setup(t, filepath.Join("nettemplates", "CompactCert.json")) @@ -135,7 +141,7 @@ func TestCompactCerts(t *testing.T) { err = protocol.Decode(nextCertBlockRaw, &nextCertBlockDecoded) r.NoError(err) - var votersRoot crypto.Digest + var votersRoot = make([]byte, compactcert.HashSize) copy(votersRoot[:], lastCertBlock.CompactCertVoters) provenWeight, overflowed := basics.Muldiv(lastCertBlock.CompactCertVotersTotal, uint64(consensusParams.CompactCertWeightThreshold), 1<<32) @@ -144,7 +150,7 @@ func TestCompactCerts(t *testing.T) { ccparams := compactcert.Params{ Msg: nextCertBlockDecoded.Block.BlockHeader, ProvenWeight: provenWeight, - SigRound: basics.Round(nextCertBlock.Round + 1), + SigRound: basics.Round(nextCertBlock.Round), SecKQ: consensusParams.CompactCertSecKQ, } verif := compactcert.MkVerifier(ccparams, votersRoot) diff --git a/test/e2e-go/features/devmode/devmode_test.go b/test/e2e-go/features/devmode/devmode_test.go index ee741fb8b7..e5c9ab7ead 100644 --- a/test/e2e-go/features/devmode/devmode_test.go +++ b/test/e2e-go/features/devmode/devmode_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -32,6 +32,7 @@ import ( func TestDevMode(t *testing.T) { partitiontest.PartitionTest(t) + t.Skipf("Skipping flaky test. Re-enable with #3267") if testing.Short() { t.Skip() diff --git a/test/e2e-go/features/multisig/multisig_test.go b/test/e2e-go/features/multisig/multisig_test.go index 14673110f7..07c8f96618 100644 --- a/test/e2e-go/features/multisig/multisig_test.go +++ b/test/e2e-go/features/multisig/multisig_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/features/participation/accountParticipationTransitions_test.go b/test/e2e-go/features/participation/accountParticipationTransitions_test.go index 5b2c3ea0c1..a151ec2e21 100644 --- a/test/e2e-go/features/participation/accountParticipationTransitions_test.go +++ b/test/e2e-go/features/participation/accountParticipationTransitions_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -71,6 +71,7 @@ func registerParticipationAndWait(t *testing.T, client libgoal.Client, part acco return status } +// TODO: figure out what's the purpose of this test and fix it func TestKeyRegistration(t *testing.T) { partitiontest.PartitionTest(t) t.Skipf("Skipping flaky test. Re-enable with #3255") @@ -102,7 +103,7 @@ func TestKeyRegistration(t *testing.T) { sAccount := accountResponse.Address // Add an overlapping participation keys for the account on round 1 and 2 - last := uint64(6_000_000) + last := uint64(3_000) numNew := 2 for i := 0; i < numNew; i++ { response, part, err := installParticipationKey(t, sClient, sAccount, 0, last+uint64(i)) @@ -153,7 +154,7 @@ func TestKeyRegistration(t *testing.T) { require.Len(t, keys, 3) for _, k := range keys { switch k.Key.VoteLastValid { - case 3_000_000: + case 1_500: checkKey(k, 1, lookback, lookback, "keys[0]") case last: checkKey(k, lookback+1, lookback+1, lookback+1, "keys[1]") diff --git a/test/e2e-go/features/participation/onlineOfflineParticipation_test.go b/test/e2e-go/features/participation/onlineOfflineParticipation_test.go index 7c817974ef..c89ca262ff 100644 --- a/test/e2e-go/features/participation/onlineOfflineParticipation_test.go +++ b/test/e2e-go/features/participation/onlineOfflineParticipation_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -229,3 +229,82 @@ func TestNewAccountCanGoOnlineAndParticipate(t *testing.T) { func balanceRoundOf(r basics.Round, cparams config.ConsensusParams) basics.Round { return basics.Round(2*cparams.SeedRefreshInterval*cparams.SeedLookback) + r } + +// make sure that a user can register online even if the participation period +// does not contain a state proof round (i.e the user will not generate state proof keys at all) +func TestAccountGoesOnlineForShortPeriod(t *testing.T) { + partitiontest.PartitionTest(t) + defer fixtures.ShutdownSynchronizedTest(t) + + t.Parallel() + a := require.New(fixtures.SynchronizedTest(t)) + + // Make the seed lookback shorter, otherwise will wait for 320 rounds + consensus := make(config.ConsensusProtocols) + + var fixture fixtures.RestClientFixture + fixture.SetConsensus(consensus) + fixture.SetupNoStart(t, filepath.Join("nettemplates", "TwoNodes50EachFuture.json")) + + // update the config file by setting the ParticipationKeysRefreshInterval to 5 second. + nodeDirectory, err := fixture.GetNodeDir("Primary") + a.NoError(err) + cfg, err := config.LoadConfigFromDisk(nodeDirectory) + a.NoError(err) + cfg.ParticipationKeysRefreshInterval = 5 * time.Second + cfg.SaveToDisk(nodeDirectory) + + fixture.Start() + + defer fixture.Shutdown() + client := fixture.LibGoalClient + + // account is newly created + wh, err := client.GetUnencryptedWalletHandle() + a.NoError(err) + newAccount, err := client.GenerateAddress(wh) + a.NoError(err) + + // send money to new account from some other account in the template, so that account can go online + accountList, err := fixture.GetWalletsSortedByBalance() + a.NoError(err, "fixture should be able to get wallet list") + richAccount := accountList[0].Address // 30% stake + _, initialRound := fixture.GetBalanceAndRound(richAccount) + + minTxnFee, minAcctBalance, err := fixture.MinFeeAndBalance(initialRound) + a.NoError(err) + + transactionFee := minTxnFee + amountToSendInitial := 5 * minAcctBalance + fixture.SendMoneyAndWait(initialRound, amountToSendInitial, transactionFee, richAccount, newAccount, "") + amt, err := client.GetBalance(newAccount) + a.NoError(err) + + a.Equal(amountToSendInitial, amt, "new account should be funded with the amount the rich account sent") + + // we try to register online with a period in which we don't have stateproof keys + partKeyFirstValid := uint64(1) + // TODO: Change consensus version when compact certs are deployed + partKeyLastValid := config.Consensus[protocol.ConsensusFuture].CompactCertRounds - 1 + partkeyResponse, _, err := client.GenParticipationKeys(newAccount, partKeyFirstValid, partKeyLastValid, 1000) + a.NoError(err, "rest client should be able to add participation key to new account") + a.Equal(newAccount, partkeyResponse.Parent.String(), "partkey response should echo queried account") + // account uses part key to go online + goOnlineTx, err := client.MakeUnsignedGoOnlineTx(newAccount, &partkeyResponse, partKeyFirstValid, partKeyLastValid, transactionFee, [32]byte{}) + a.Equal(goOnlineTx.KeyregTxnFields.StateProofPK.IsEmpty(), false, "stateproof key should not be zero") + a.NoError(err, "should be able to make go online tx") + a.Equal(newAccount, goOnlineTx.Src().String(), "go online response should echo queried account") + onlineTxID, err := client.SignAndBroadcastTransaction(wh, nil, goOnlineTx) + a.NoError(err, "new account with new partkey should be able to go online") + + fixture.AssertValidTxid(onlineTxID) + maxRoundsToWaitForTxnConfirm := uint64(5) + nodeStatus, err := client.Status() + seededRound := nodeStatus.LastRound + fixture.WaitForTxnConfirmation(seededRound+maxRoundsToWaitForTxnConfirm, newAccount, onlineTxID) + nodeStatus, _ = client.Status() + + accountStatus, err := client.AccountInformation(newAccount) + a.NoError(err, "client should be able to get information about new account") + a.Equal(basics.Online.String(), accountStatus.Status, "new account should be online") +} diff --git a/test/e2e-go/features/participation/overlappingParticipationKeys_test.go b/test/e2e-go/features/participation/overlappingParticipationKeys_test.go index c98cf7a9e9..18bdec3695 100644 --- a/test/e2e-go/features/participation/overlappingParticipationKeys_test.go +++ b/test/e2e-go/features/participation/overlappingParticipationKeys_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -93,7 +93,7 @@ func TestOverlappingParticipationKeys(t *testing.T) { txEndRound := txStartRound + 10 + 4 regStartRound := round regEndRound := regStartRound + 11 + 4 - err = prepareParticipationKey(a, &fixture, acctIdx, txStartRound, txEndRound, regStartRound, regEndRound, genesisHash, rootKeys, regTransactions) + err = prepareParticipationKey(a, &fixture, acctIdx, txStartRound, txEndRound, regStartRound, regEndRound, genesisHash, rootKeys, regTransactions, config.Consensus[protocol.ConsensusCurrentVersion]) a.NoError(err) } @@ -110,6 +110,7 @@ func TestOverlappingParticipationKeys(t *testing.T) { endRound := startRound + 10 + 4 - 2 regStartRound := currentRound regEndRound := regStartRound + 11 + 4 + pk, err := addParticipationKey(a, &fixture, acctIdx, startRound, endRound, regTransactions) a.NoError(err) t.Logf("[.] Round %d, Added reg key for node %d range [%d..%d] %s\n", currentRound, acctIdx, regStartRound, regEndRound, hex.EncodeToString(pk[:8])) @@ -142,7 +143,7 @@ func addParticipationKey(a *require.Assertions, fixture *fixtures.RestClientFixt return signedTxn.Txn.KeyregTxnFields.VotePK, err } -func prepareParticipationKey(a *require.Assertions, fixture *fixtures.RestClientFixture, acctNum uint64, txStartRound, txEndRound, regStartRound, regEndRound uint64, genesisHash crypto.Digest, rootKeys map[int]*account.Root, regTransactions map[int]transactions.SignedTxn) error { +func prepareParticipationKey(a *require.Assertions, fixture *fixtures.RestClientFixture, acctNum, txStartRound, txEndRound, regStartRound, regEndRound uint64, genesisHash crypto.Digest, rootKeys map[int]*account.Root, regTransactions map[int]transactions.SignedTxn, c config.ConsensusParams) error { dataDir := fixture.NodeDataDirs()[acctNum] nc := fixture.GetNodeControllerForDataDir(dataDir) @@ -204,7 +205,7 @@ func prepareParticipationKey(a *require.Assertions, fixture *fixtures.RestClient partkeyHandle.Vacuum(context.Background()) persistedParticipation.Close() - unsignedTxn := persistedParticipation.GenerateRegistrationTransaction(basics.MicroAlgos{Raw: 1000}, basics.Round(txStartRound), basics.Round(txEndRound), [32]byte{}) + unsignedTxn := persistedParticipation.GenerateRegistrationTransaction(basics.MicroAlgos{Raw: 1000}, basics.Round(txStartRound), basics.Round(txEndRound), [32]byte{}, c.EnableStateProofKeyregCheck) copy(unsignedTxn.GenesisHash[:], genesisHash[:]) if err != nil { a.NoError(err) diff --git a/test/e2e-go/features/participation/participationExpiration_test.go b/test/e2e-go/features/participation/participationExpiration_test.go index 915691d039..126b5acf09 100644 --- a/test/e2e-go/features/participation/participationExpiration_test.go +++ b/test/e2e-go/features/participation/participationExpiration_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -46,9 +46,9 @@ func testExpirationAccounts(t *testing.T, fixture *fixtures.RestClientFixture, f accountList, err := fixture.GetWalletsSortedByBalance() a.NoError(err) richAccount := accountList[0].Address - _, initialRound := fixture.GetBalanceAndRound(richAccount) + latestRound := fetchLatestRound(fixture, a) - minTxnFee, minAcctBalance, err := fixture.MinFeeAndBalance(initialRound) + minTxnFee, minAcctBalance, err := fixture.MinFeeAndBalance(latestRound) a.NoError(err) transactionFee := minTxnFee @@ -57,7 +57,7 @@ func testExpirationAccounts(t *testing.T, fixture *fixtures.RestClientFixture, f initialAmt, err := sClient.GetBalance(sAccount) a.NoError(err) - fixture.SendMoneyAndWait(initialRound, amountToSendInitial, transactionFee, richAccount, sAccount, "") + fixture.SendMoneyAndWait(latestRound, amountToSendInitial, transactionFee, richAccount, sAccount, "") newAmt, err := sClient.GetBalance(sAccount) a.NoError(err) @@ -73,7 +73,8 @@ func testExpirationAccounts(t *testing.T, fixture *fixtures.RestClientFixture, f startTime := time.Now() for time.Since(startTime) < 2*time.Minute { - _, currentRound := fixture.GetBalanceAndRound(richAccount) + currentRound := fetchLatestRound(fixture, a) + // account adds part key partKeyFirstValid := uint64(0) partKeyValidityPeriod := uint64(10) @@ -110,14 +111,24 @@ func testExpirationAccounts(t *testing.T, fixture *fixtures.RestClientFixture, f a.NoError(err) seededRound := sNodeStatus.LastRound - fixture.WaitForTxnConfirmation(seededRound+maxRoundsToWaitForTxnConfirm, sAccount, onlineTxID) - sNodeStatus, _ = sClient.Status() + txnConfirmed := fixture.WaitForTxnConfirmation(seededRound+maxRoundsToWaitForTxnConfirm, sAccount, onlineTxID) + a.True(txnConfirmed) + newAccountStatus, err = pClient.AccountInformation(sAccount) a.NoError(err) a.Equal(basics.Online.String(), newAccountStatus.Status) - sAccountData, err := sClient.AccountData(sAccount) + + // get the round number of the primary node + pNodeStatus, err := pClient.Status() a.NoError(err) + // ensure the secondary node reaches that number + _, err = sClient.WaitForRound(pNodeStatus.LastRound) + a.NoError(err) + + // get the account data ( which now is syncronized across the network ) + sAccountData, err := sClient.AccountData(sAccount) + a.NoError(err) lastValidRound := sAccountData.VoteLastValid a.Equal(basics.Round(partKeyLastValid), lastValidRound) @@ -133,15 +144,20 @@ func testExpirationAccounts(t *testing.T, fixture *fixtures.RestClientFixture, f // Now we want to send a transaction to the account and test that // it was taken offline after we sent it something - _, initialRound = fixture.GetBalanceAndRound(richAccount) + latestRound = fetchLatestRound(fixture, a) + + // making certain sClient has the same blocks as pClient. + _, err = sClient.WaitForRound(uint64(lastValidRound + 1)) + a.NoError(err) - blk, err := sClient.Block(initialRound) + blk, err := sClient.Block(latestRound) a.NoError(err) a.Equal(blk.CurrentProtocol, protocolCheck) - fixture.SendMoneyAndWait(initialRound, amountToSendInitial, transactionFee, richAccount, sAccount, "") + sendMoneyTxn := fixture.SendMoneyAndWait(latestRound, amountToSendInitial, transactionFee, richAccount, sAccount, "") - err = fixture.WaitForRoundWithTimeout(uint64(initialRound) + 3) + txnConfirmed = fixture.WaitForTxnConfirmation(latestRound+maxRoundsToWaitForTxnConfirm, sAccount, sendMoneyTxn.TxID) + a.True(txnConfirmed) newAccountStatus, err = pClient.AccountInformation(sAccount) a.NoError(err) @@ -150,6 +166,12 @@ func testExpirationAccounts(t *testing.T, fixture *fixtures.RestClientFixture, f a.Equal(finalStatus.String(), newAccountStatus.Status) } +func fetchLatestRound(fixture *fixtures.RestClientFixture, a *require.Assertions) uint64 { + status, err := fixture.LibGoalClient.Status() + a.NoError(err) + return status.LastRound +} + // TestParticipationAccountsExpirationFuture tests that sending a transaction to an account with // its last valid round being less than the current round will turn it offline. This test will only // work when the consensus protocol enables it (in this case the future protocol) diff --git a/test/e2e-go/features/participation/participationRewards_test.go b/test/e2e-go/features/participation/participationRewards_test.go index b41b293976..9b4143d43a 100644 --- a/test/e2e-go/features/participation/participationRewards_test.go +++ b/test/e2e-go/features/participation/participationRewards_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/features/partitionRecovery/partitionRecovery_test.go b/test/e2e-go/features/partitionRecovery/partitionRecovery_test.go index 3ec2c323d1..dc549d72e8 100644 --- a/test/e2e-go/features/partitionRecovery/partitionRecovery_test.go +++ b/test/e2e-go/features/partitionRecovery/partitionRecovery_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/features/teal/compile_test.go b/test/e2e-go/features/teal/compile_test.go index 4db988bd4f..866e1c54db 100644 --- a/test/e2e-go/features/teal/compile_test.go +++ b/test/e2e-go/features/teal/compile_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/features/transactions/accountv2_test.go b/test/e2e-go/features/transactions/accountv2_test.go index 3cefff35dc..52b39c9eed 100644 --- a/test/e2e-go/features/transactions/accountv2_test.go +++ b/test/e2e-go/features/transactions/accountv2_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -204,8 +204,14 @@ int 1 a.True(ok) a.Equal(uint64(1), value.Uint) + txInfo, err := fixture.LibGoalClient.PendingTransactionInformationV2(txid) + a.NoError(err) + a.NotNil(txInfo.ConfirmedRound) + a.NotZero(*txInfo.ConfirmedRound) + txnRound := *txInfo.ConfirmedRound + // 1 global state update in total, 1 local state updates - checkEvalDelta(t, &client, round, round+5, 1, 1) + checkEvalDelta(t, &client, txnRound, txnRound+1, 1, 1) // call the app tx, err = client.MakeUnsignedAppOptInTx(uint64(appIdx), nil, nil, nil, nil) @@ -270,8 +276,14 @@ int 1 a.True(ok) a.Equal(uint64(1), value.Uint) + txInfo, err = fixture.LibGoalClient.PendingTransactionInformationV2(txid) + a.NoError(err) + a.NotNil(txInfo.ConfirmedRound) + a.NotZero(*txInfo.ConfirmedRound) + txnRound = *txInfo.ConfirmedRound + // 2 global state update in total, 1 local state updates - checkEvalDelta(t, &client, round+2, round+5, 2, 1) + checkEvalDelta(t, &client, txnRound, txnRound+1, 2, 1) a.Equal(basics.MicroAlgos{Raw: 10000000000 - fee}, ad.MicroAlgos) @@ -314,6 +326,12 @@ int 1 a.True(ok) a.Equal(uint64(3), value.Uint) + txInfo, err = fixture.LibGoalClient.PendingTransactionInformationV2(txid) + a.NoError(err) + a.NotNil(txInfo.ConfirmedRound) + a.NotZero(*txInfo.ConfirmedRound) + txnRound = *txInfo.ConfirmedRound + // 3 global state update in total, 2 local state updates - checkEvalDelta(t, &client, round, round+5, 3, 2) + checkEvalDelta(t, &client, txnRound, txnRound+1, 3, 2) } diff --git a/test/e2e-go/features/transactions/app_pages_test.go b/test/e2e-go/features/transactions/app_pages_test.go index 2387ecfad7..6c293f50db 100644 --- a/test/e2e-go/features/transactions/app_pages_test.go +++ b/test/e2e-go/features/transactions/app_pages_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/features/transactions/application_test.go b/test/e2e-go/features/transactions/application_test.go index 19de8ad393..c9a4ac1315 100644 --- a/test/e2e-go/features/transactions/application_test.go +++ b/test/e2e-go/features/transactions/application_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/features/transactions/asset_test.go b/test/e2e-go/features/transactions/asset_test.go index 03cf40744a..0daff2734d 100644 --- a/test/e2e-go/features/transactions/asset_test.go +++ b/test/e2e-go/features/transactions/asset_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -632,10 +632,19 @@ func TestAssetGroupCreateSendDestroy(t *testing.T) { err = client0.BroadcastTransactionGroup(stxns) a.NoError(err) - _, curRound := fixture.GetBalanceAndRound(account0) - confirmed := fixture.WaitForAllTxnsToConfirm(curRound+5, txids) + status0, err := client0.Status() + a.NoError(err) + + confirmed := fixture.WaitForAllTxnsToConfirm(status0.LastRound+5, txids) a.True(confirmed) + status0, err = client0.Status() + a.NoError(err) + + // wait for client1 to reach the same round as client0 + _, err = client1.WaitForRound(status0.LastRound) + a.NoError(err) + txids = make(map[string]string) // asset 1 (create + send) exists and available @@ -651,10 +660,18 @@ func TestAssetGroupCreateSendDestroy(t *testing.T) { a.NoError(err) txids[txid] = account0 - _, curRound = fixture.GetBalanceAndRound(account0) - confirmed = fixture.WaitForAllTxnsToConfirm(curRound+5, txids) + status0, err = client0.Status() + a.NoError(err) + confirmed = fixture.WaitForAllTxnsToConfirm(status0.LastRound+5, txids) a.True(confirmed) + status0, err = client0.Status() + a.NoError(err) + + // wait for client1 to reach the same round as client0 + _, err = client1.WaitForRound(status0.LastRound) + a.NoError(err) + // asset 3 (create + destroy) not available _, err = client1.AssetInformation(assetID3) a.Error(err) diff --git a/test/e2e-go/features/transactions/close_account_test.go b/test/e2e-go/features/transactions/close_account_test.go index 6ce7544793..8787568dc6 100644 --- a/test/e2e-go/features/transactions/close_account_test.go +++ b/test/e2e-go/features/transactions/close_account_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/features/transactions/group_test.go b/test/e2e-go/features/transactions/group_test.go index f17e25d37a..4852da25d1 100644 --- a/test/e2e-go/features/transactions/group_test.go +++ b/test/e2e-go/features/transactions/group_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/features/transactions/lease_test.go b/test/e2e-go/features/transactions/lease_test.go index 2d34d3d344..10a238e742 100644 --- a/test/e2e-go/features/transactions/lease_test.go +++ b/test/e2e-go/features/transactions/lease_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/features/transactions/onlineStatusChange_test.go b/test/e2e-go/features/transactions/onlineStatusChange_test.go index 3c12bf4c96..d12715beb7 100644 --- a/test/e2e-go/features/transactions/onlineStatusChange_test.go +++ b/test/e2e-go/features/transactions/onlineStatusChange_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -173,7 +173,8 @@ func TestCloseOnError(t *testing.T) { a.NoError(err) // check duplicate keys does not crash _, _, err = client.GenParticipationKeys(initiallyOffline, 0, curRound+1000, 0) - a.Equal("PersistedParticipation.Persist: failed to install database: table ParticipationAccount already exists", err.Error()) + errMsg := fmt.Sprintf("ParticipationKeys exist for the range 0 to %d", curRound+1000) + a.Equal(errMsg, err.Error()) // check lastValid < firstValid does not crash _, _, err = client.GenParticipationKeys(initiallyOffline, curRound+1001, curRound+1000, 0) expected := fmt.Sprintf("FillDBWithParticipationKeys: firstValid %d is after lastValid %d", int(curRound+1001), int(curRound+1000)) diff --git a/test/e2e-go/features/transactions/proof_test.go b/test/e2e-go/features/transactions/proof_test.go index 2ef4b8e489..118e725f74 100644 --- a/test/e2e-go/features/transactions/proof_test.go +++ b/test/e2e-go/features/transactions/proof_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -20,15 +20,32 @@ import ( "path/filepath" "testing" - "github.com/stretchr/testify/require" - "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/crypto/merklearray" "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/framework/fixtures" "github.com/algorand/go-algorand/test/partitiontest" + "github.com/stretchr/testify/require" ) +// TxnMerkleElemRaw this struct helps creates a hashable struct from the bytes +type TxnMerkleElemRaw struct { + Txn crypto.Digest // txn id + Stib crypto.Digest // hash value of transactions.SignedTxnInBlock +} + +func txnMerkleToRaw(txid [crypto.DigestSize]byte, stib [crypto.DigestSize]byte) (buf []byte) { + buf = make([]byte, 2*crypto.DigestSize) + copy(buf[:], txid[:]) + copy(buf[crypto.DigestSize:], stib[:]) + return +} + +// ToBeHashed implements the crypto.Hashable interface. +func (tme *TxnMerkleElemRaw) ToBeHashed() (protocol.HashID, []byte) { + return protocol.TxnMerkleLeaf, txnMerkleToRaw(tme.Txn, tme.Stib) +} + func TestTxnMerkleProof(t *testing.T) { partitiontest.PartitionTest(t) defer fixtures.ShutdownSynchronizedTest(t) @@ -60,7 +77,8 @@ func TestTxnMerkleProof(t *testing.T) { // Transfer some money to acct0, as well as other random accounts to // fill up the Merkle tree with more than one element. - for i := 0; i < 10; i++ { + // we do not want to have a full tree in order the catch an empty element edge case + for i := 0; i < 5; i++ { accti, err := client.GenerateAddress(walletHandle) a.NoError(err) @@ -71,14 +89,6 @@ func TestTxnMerkleProof(t *testing.T) { tx, err := client.SendPaymentFromUnencryptedWallet(baseAcct, acct0, 1000, 10000000, nil) a.NoError(err) - for i := 0; i < 10; i++ { - accti, err := client.GenerateAddress(walletHandle) - a.NoError(err) - - _, err = client.SendPaymentFromUnencryptedWallet(baseAcct, accti, 1000, 10000000, nil) - a.NoError(err) - } - txid := tx.ID() confirmedTx, err := fixture.WaitForConfirmedTxn(status.LastRound+10, baseAcct, txid.String()) a.NoError(err) @@ -86,24 +96,34 @@ func TestTxnMerkleProof(t *testing.T) { proofresp, err := client.TxnProof(txid.String(), confirmedTx.ConfirmedRound) a.NoError(err) - var proof []crypto.Digest + hashtype, err := crypto.UnmarshalHashType(proofresp.Hashtype) + a.NoError(err) + + var proof merklearray.Proof + proof.HashFactory = crypto.HashFactory{HashType: hashtype} + proof.TreeDepth = uint8(proofresp.Treedepth) + a.NotEqual(proof.TreeDepth, 0) proofconcat := []byte(proofresp.Proof) for len(proofconcat) > 0 { var d crypto.Digest copy(d[:], proofconcat) - proof = append(proof, d) + proof.Path = append(proof.Path, d[:]) proofconcat = proofconcat[len(d):] } blk, err := client.BookkeepingBlock(confirmedTx.ConfirmedRound) a.NoError(err) - merkleNode := []byte(protocol.TxnMerkleLeaf) - merkleNode = append(merkleNode, txid[:]...) - merkleNode = append(merkleNode, proofresp.Stibhash...) + element := TxnMerkleElemRaw{Txn: crypto.Digest(txid)} + copy(element.Stib[:], proofresp.Stibhash[:]) + + elems := make(map[uint64]crypto.Hashable) + + elems[proofresp.Idx] = &element + err = merklearray.Verify(blk.TxnRoot.ToSlice(), elems, &proof) + if err != nil { + t.Logf("blk.TxnRoot : %v \nproof path %v \ndepth: %d \nStibhash %v\nIndex: %d", blk.TxnRoot.ToSlice(), proof.Path, proof.TreeDepth, proofresp.Stibhash, proofresp.Idx) + a.NoError(err) + } - elems := make(map[uint64]crypto.Digest) - elems[proofresp.Idx] = crypto.Hash(merkleNode) - err = merklearray.Verify(blk.TxnRoot, elems, proof) - a.NoError(err) } diff --git a/test/e2e-go/features/transactions/sendReceive_test.go b/test/e2e-go/features/transactions/sendReceive_test.go index fadf5b620d..2d55d0b835 100644 --- a/test/e2e-go/features/transactions/sendReceive_test.go +++ b/test/e2e-go/features/transactions/sendReceive_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/globals/constants.go b/test/e2e-go/globals/constants.go index 56d507d6ae..b738b6d653 100644 --- a/test/e2e-go/globals/constants.go +++ b/test/e2e-go/globals/constants.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/kmd/e2e_kmd_server_client_test.go b/test/e2e-go/kmd/e2e_kmd_server_client_test.go index 7b9c36ca7b..eb61861bbc 100644 --- a/test/e2e-go/kmd/e2e_kmd_server_client_test.go +++ b/test/e2e-go/kmd/e2e_kmd_server_client_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/kmd/e2e_kmd_sqlite_test.go b/test/e2e-go/kmd/e2e_kmd_sqlite_test.go index 833cc28667..496070ccb1 100644 --- a/test/e2e-go/kmd/e2e_kmd_sqlite_test.go +++ b/test/e2e-go/kmd/e2e_kmd_sqlite_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/kmd/e2e_kmd_wallet_keyops_test.go b/test/e2e-go/kmd/e2e_kmd_wallet_keyops_test.go index 122f3203ed..b70be41e0b 100644 --- a/test/e2e-go/kmd/e2e_kmd_wallet_keyops_test.go +++ b/test/e2e-go/kmd/e2e_kmd_wallet_keyops_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -380,7 +380,7 @@ func TestSignProgram(t *testing.T) { a.NotEqual(sig, crypto.Signature{}) ph := logic.Program(program) - a.True(secrets.SignatureVerifier.Verify(ph, sig)) + a.True(secrets.SignatureVerifier.Verify(ph, sig, true)) } func BenchmarkSignTransaction(b *testing.B) { diff --git a/test/e2e-go/kmd/e2e_kmd_wallet_multisig_test.go b/test/e2e-go/kmd/e2e_kmd_wallet_multisig_test.go index 53fb07a02e..3b43606d6d 100644 --- a/test/e2e-go/kmd/e2e_kmd_wallet_multisig_test.go +++ b/test/e2e-go/kmd/e2e_kmd_wallet_multisig_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/kmd/e2e_kmd_wallet_test.go b/test/e2e-go/kmd/e2e_kmd_wallet_test.go index a08ff861f0..4fb8f3a159 100644 --- a/test/e2e-go/kmd/e2e_kmd_wallet_test.go +++ b/test/e2e-go/kmd/e2e_kmd_wallet_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/perf/basic_test.go b/test/e2e-go/perf/basic_test.go index d9748e5cdf..dd70d422d4 100644 --- a/test/e2e-go/perf/basic_test.go +++ b/test/e2e-go/perf/basic_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/restAPI/restClient_test.go b/test/e2e-go/restAPI/restClient_test.go index e8aff991d5..54448805d5 100644 --- a/test/e2e-go/restAPI/restClient_test.go +++ b/test/e2e-go/restAPI/restClient_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -21,6 +21,12 @@ import ( "encoding/hex" "errors" "flag" + + algodclient "github.com/algorand/go-algorand/daemon/algod/api/client" + kmdclient "github.com/algorand/go-algorand/daemon/kmd/client" + "github.com/algorand/go-algorand/data/account" + "github.com/algorand/go-algorand/data/transactions/logic" + "github.com/algorand/go-algorand/util/db" "math" "math/rand" "os" @@ -32,12 +38,9 @@ import ( "github.com/stretchr/testify/require" - algodclient "github.com/algorand/go-algorand/daemon/algod/api/client" - kmdclient "github.com/algorand/go-algorand/daemon/kmd/client" - "github.com/algorand/go-algorand/data/transactions/logic" - "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/crypto/merklesignature" "github.com/algorand/go-algorand/daemon/algod/api/spec/v1" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/transactions" @@ -167,7 +170,7 @@ func waitForTransaction(t *testing.T, testClient libgoal.Client, fromAddress, tx if rnd.LastRound == 0 { t.Fatal("it is currently round 0 but we need to wait for a transaction that might happen this round but we'll never know if that happens because ConfirmedRound==0 is indestinguishable from not having happened") } - timeoutTime := time.Now().Add(30 * time.Second) + timeoutTime := time.Now().Add(timeout) for { tx, err = testClient.TransactionInformation(fromAddress, txID) if err != nil && strings.HasPrefix(err.Error(), "HTTP 404") { @@ -247,7 +250,7 @@ func TestTransactionsByAddr(t *testing.T) { rnd, err := testClient.Status() a.NoError(err) t.Logf("rnd[%d] created txn %s", rnd.LastRound, txID) - _, err = waitForTransaction(t, testClient, someAddress, txID.String(), 15*time.Second) + _, err = waitForTransaction(t, testClient, someAddress, txID.String(), 30*time.Second) a.NoError(err) // what is my round? @@ -465,7 +468,7 @@ func TestClientCanSendAndGetNote(t *testing.T) { note := make([]byte, maxTxnNoteBytes) tx, err := testClient.SendPaymentFromWallet(wh, nil, someAddress, toAddress, 10000, 100000, note, "", 0, 0) a.NoError(err) - txStatus, err := waitForTransaction(t, testClient, someAddress, tx.ID().String(), 15*time.Second) + txStatus, err := waitForTransaction(t, testClient, someAddress, tx.ID().String(), 30*time.Second) a.NoError(err) a.Equal(note, txStatus.Note) } @@ -491,7 +494,7 @@ func TestClientCanGetTransactionStatus(t *testing.T) { t.Log(string(protocol.EncodeJSON(tx))) a.NoError(err) t.Log(tx.ID().String()) - _, err = waitForTransaction(t, testClient, someAddress, tx.ID().String(), 15*time.Second) + _, err = waitForTransaction(t, testClient, someAddress, tx.ID().String(), 30*time.Second) a.NoError(err) } @@ -516,7 +519,7 @@ func TestAccountBalance(t *testing.T) { a.NoError(err) tx, err := testClient.SendPaymentFromWallet(wh, nil, someAddress, toAddress, 10000, 100000, nil, "", 0, 0) a.NoError(err) - _, err = waitForTransaction(t, testClient, someAddress, tx.ID().String(), 15*time.Second) + _, err = waitForTransaction(t, testClient, someAddress, tx.ID().String(), 30*time.Second) a.NoError(err) account, err := testClient.AccountInformation(toAddress) @@ -550,6 +553,9 @@ func TestAccountParticipationInfo(t *testing.T) { firstRound := basics.Round(params.LastRound + 1) lastRound := basics.Round(params.LastRound + 1000) dilution := uint64(100) + var stateproof merklesignature.Verifier + stateproof[0] = 1 // change some byte so the stateproof is not considered empty (required since consensus v31) + randomVotePKStr := randomString(32) var votePK crypto.OneTimeSignatureVerifier copy(votePK[:], []byte(randomVotePKStr)) @@ -573,11 +579,12 @@ func TestAccountParticipationInfo(t *testing.T) { VoteKeyDilution: dilution, VoteFirst: firstRound, VoteLast: lastRound, + StateProofPK: stateproof, }, } txID, err := testClient.SignAndBroadcastTransaction(wh, nil, tx) a.NoError(err) - _, err = waitForTransaction(t, testClient, someAddress, txID, 15*time.Second) + _, err = waitForTransaction(t, testClient, someAddress, txID, 30*time.Second) a.NoError(err) account, err := testClient.AccountInformation(someAddress) @@ -587,6 +594,7 @@ func TestAccountParticipationInfo(t *testing.T) { a.Equal(uint64(firstRound), account.Participation.VoteFirst, "API must print correct first participation round") a.Equal(uint64(lastRound), account.Participation.VoteLast, "API must print correct last participation round") a.Equal(dilution, account.Participation.VoteKeyDilution, "API must print correct key dilution") + // TODO: should we update the v1 API to support state proof? Currently it does not return this field. } func TestSupply(t *testing.T) { @@ -1051,3 +1059,171 @@ return a.NoError(err) a.Equal(expectedMetadata, *createdAssetInfo.Params.MetadataHash) } + +func TestStateProofInParticipationInfo(t *testing.T) { + partitiontest.PartitionTest(t) + defer fixtures.ShutdownSynchronizedTest(t) + + a := require.New(fixtures.SynchronizedTest(t)) + var localFixture fixtures.RestClientFixture + + proto := config.Consensus[protocol.ConsensusCurrentVersion] + localFixture.SetConsensus(config.ConsensusProtocols{protocol.ConsensusCurrentVersion: proto}) + + localFixture.Setup(t, filepath.Join("nettemplates", "TwoNodes50Each.json")) + defer localFixture.Shutdown() + + testClient := localFixture.LibGoalClient + waitForRoundOne(t, testClient) + wh, err := testClient.GetUnencryptedWalletHandle() + a.NoError(err) + addresses, err := testClient.ListAddresses(wh) + a.NoError(err) + _, someAddress := getMaxBalAddr(t, testClient, addresses) + a.NotEmpty(someAddress, "no addr with funds") + + addr, err := basics.UnmarshalChecksumAddress(someAddress) + a.NoError(err) + + params, err := testClient.SuggestedParams() + a.NoError(err) + + firstRound := basics.Round(params.LastRound + 1) + lastRound := basics.Round(params.LastRound + 1000) + dilution := uint64(100) + randomVotePKStr := randomString(32) + var votePK crypto.OneTimeSignatureVerifier + copy(votePK[:], randomVotePKStr) + randomSelPKStr := randomString(32) + var selPK crypto.VRFVerifier + copy(selPK[:], randomSelPKStr) + var mssRoot [merklesignature.MerkleSignatureSchemeRootSize]byte + randomRootStr := randomString(merklesignature.MerkleSignatureSchemeRootSize) + copy(mssRoot[:], randomRootStr) + var gh crypto.Digest + copy(gh[:], params.GenesisHash) + + tx := transactions.Transaction{ + Type: protocol.KeyRegistrationTx, + Header: transactions.Header{ + Sender: addr, + Fee: basics.MicroAlgos{Raw: 10000}, + FirstValid: firstRound, + LastValid: lastRound, + GenesisHash: gh, + }, + KeyregTxnFields: transactions.KeyregTxnFields{ + VotePK: votePK, + SelectionPK: selPK, + VoteFirst: firstRound, + StateProofPK: mssRoot, + VoteLast: lastRound, + VoteKeyDilution: dilution, + Nonparticipation: false, + }, + } + txID, err := testClient.SignAndBroadcastTransaction(wh, nil, tx) + a.NoError(err) + _, err = waitForTransaction(t, testClient, someAddress, txID, 120*time.Second) + a.NoError(err) + + account, err := testClient.AccountInformationV2(someAddress) + a.NoError(err) + a.NotNil(account.Participation.StateProofKey) + + actual := [merklesignature.MerkleSignatureSchemeRootSize]byte{} + copy(actual[:], *account.Participation.StateProofKey) + a.Equal(mssRoot, actual) +} + +func TestStateProofParticipationKeysAPI(t *testing.T) { + partitiontest.PartitionTest(t) + defer fixtures.ShutdownSynchronizedTest(t) + + a := require.New(fixtures.SynchronizedTest(t)) + var localFixture fixtures.RestClientFixture + + localFixture.Setup(t, filepath.Join("nettemplates", "TwoNodes50Each.json")) + defer localFixture.Shutdown() + + testClient := localFixture.LibGoalClient + waitForRoundOne(t, testClient) + + partdb, err := db.MakeErasableAccessor(filepath.Join(testClient.DataDir(), "/..", "/Wallet1.0.3000.partkey")) + a.NoError(err) + + partkey, err := account.RestoreParticipation(partdb) + + pRoot, err := testClient.GetParticipationKeys() + a.NoError(err) + + actual := [merklesignature.MerkleSignatureSchemeRootSize]byte{} + a.NotNil(pRoot[0].Key.StateProofKey) + copy(actual[:], *pRoot[0].Key.StateProofKey) + a.Equal(partkey.StateProofSecrets.GetVerifier()[:], actual[:]) +} + +func TestNilStateProofInParticipationInfo(t *testing.T) { + partitiontest.PartitionTest(t) + defer fixtures.ShutdownSynchronizedTest(t) + + a := require.New(fixtures.SynchronizedTest(t)) + var localFixture fixtures.RestClientFixture + + localFixture.Setup(t, filepath.Join("nettemplates", "TwoNodes50EachV30.json")) + defer localFixture.Shutdown() + + testClient := localFixture.LibGoalClient + waitForRoundOne(t, testClient) + wh, err := testClient.GetUnencryptedWalletHandle() + a.NoError(err) + addresses, err := testClient.ListAddresses(wh) + a.NoError(err) + _, someAddress := getMaxBalAddr(t, testClient, addresses) + a.NotEmpty(someAddress, "no addr with funds") + + addr, err := basics.UnmarshalChecksumAddress(someAddress) + a.NoError(err) + + params, err := testClient.SuggestedParams() + a.NoError(err) + + firstRound := basics.Round(1) + lastRound := basics.Round(20) + dilution := uint64(100) + randomVotePKStr := randomString(32) + var votePK crypto.OneTimeSignatureVerifier + copy(votePK[:], []byte(randomVotePKStr)) + randomSelPKStr := randomString(32) + var selPK crypto.VRFVerifier + copy(selPK[:], []byte(randomSelPKStr)) + var gh crypto.Digest + copy(gh[:], params.GenesisHash) + + tx := transactions.Transaction{ + Type: protocol.KeyRegistrationTx, + Header: transactions.Header{ + Sender: addr, + Fee: basics.MicroAlgos{Raw: 10000}, + FirstValid: firstRound, + LastValid: lastRound, + GenesisHash: gh, + }, + KeyregTxnFields: transactions.KeyregTxnFields{ + VotePK: votePK, + SelectionPK: selPK, + VoteFirst: firstRound, + VoteLast: lastRound, + VoteKeyDilution: dilution, + Nonparticipation: false, + }, + } + txID, err := testClient.SignAndBroadcastTransaction(wh, nil, tx) + a.NoError(err) + _, err = waitForTransaction(t, testClient, someAddress, txID, 30*time.Second) + a.NoError(err) + + account, err := testClient.AccountInformationV2(someAddress) + a.NoError(err) + a.Nil(account.Participation.StateProofKey) +} diff --git a/test/e2e-go/stress/transactions/createManyAndGoOnline_test.go b/test/e2e-go/stress/transactions/createManyAndGoOnline_test.go index 318a0f1386..77c11ccb47 100644 --- a/test/e2e-go/stress/transactions/createManyAndGoOnline_test.go +++ b/test/e2e-go/stress/transactions/createManyAndGoOnline_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/upgrades/application_support_test.go b/test/e2e-go/upgrades/application_support_test.go index 20b7f4e05a..3667cc3cef 100644 --- a/test/e2e-go/upgrades/application_support_test.go +++ b/test/e2e-go/upgrades/application_support_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/upgrades/rekey_support_test.go b/test/e2e-go/upgrades/rekey_support_test.go index 3def211f90..4988b79c4c 100644 --- a/test/e2e-go/upgrades/rekey_support_test.go +++ b/test/e2e-go/upgrades/rekey_support_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/e2e-go/upgrades/send_receive_upgrade_test.go b/test/e2e-go/upgrades/send_receive_upgrade_test.go index b67a5b21df..c69f4f3ca7 100644 --- a/test/e2e-go/upgrades/send_receive_upgrade_test.go +++ b/test/e2e-go/upgrades/send_receive_upgrade_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -122,14 +122,26 @@ func testAccountsCanSendMoneyAcrossUpgrade(t *testing.T, templatePath string) { fixture.SetConsensus(consensus) fixture.Setup(t, templatePath) defer fixture.Shutdown() - c := fixture.LibGoalClient + verifyAccountsCanSendMoneyAcrossUpgrade(a, &fixture) +} + +func verifyAccountsCanSendMoneyAcrossUpgrade(a *require.Assertions, fixture *fixtures.RestClientFixture) { + pingBalance, pongBalance, expectedPingBalance, expectedPongBalance := runUntilProtocolUpgrades(a, fixture) + + a.True(expectedPingBalance <= pingBalance, "ping balance is different than expected") + a.True(expectedPongBalance <= pongBalance, "pong balance is different than expected") +} + +func runUntilProtocolUpgrades(a *require.Assertions, fixture *fixtures.RestClientFixture) (uint64, uint64, uint64, uint64) { + c := fixture.LibGoalClient initialStatus, err := c.Status() a.NoError(err, "getting status") pingClient := fixture.LibGoalClient pingAccountList, err := fixture.GetWalletsSortedByBalance() a.NoError(err, "fixture should be able to get wallets sorted by balance") + a.NotEmpty(pingAccountList) pingAccount := pingAccountList[0].Address pongClient := fixture.GetLibGoalClientForNamedNode("Node") @@ -193,7 +205,7 @@ func testAccountsCanSendMoneyAcrossUpgrade(t *testing.T, templatePath string) { time.Sleep(500*time.Millisecond - iterationDuration) } - if time.Now().After(startTime.Add(3 * time.Minute)) { + if time.Now().After(startTime.Add(5 * time.Minute)) { a.Fail("upgrade taking too long") } } @@ -256,7 +268,5 @@ func testAccountsCanSendMoneyAcrossUpgrade(t *testing.T, templatePath string) { a.NoError(err) pongBalance, err = c.GetBalance(pongAccount) a.NoError(err) - - a.True(expectedPingBalance <= pingBalance, "ping balance is different than expected") - a.True(expectedPongBalance <= pongBalance, "pong balance is different than expected") + return pingBalance, pongBalance, expectedPingBalance, expectedPongBalance } diff --git a/test/e2e-go/upgrades/stateproof_test.go b/test/e2e-go/upgrades/stateproof_test.go new file mode 100644 index 0000000000..6f9cf7f13d --- /dev/null +++ b/test/e2e-go/upgrades/stateproof_test.go @@ -0,0 +1,202 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package upgrades + +import ( + "github.com/algorand/go-algorand/config" + "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/data/basics" + "github.com/algorand/go-algorand/libgoal" + "github.com/algorand/go-algorand/protocol" + "github.com/algorand/go-algorand/test/framework/fixtures" + "github.com/algorand/go-algorand/test/partitiontest" + "github.com/stretchr/testify/require" + "path/filepath" + "strings" + "testing" + "time" +) + +func waitUntilProtocolUpgrades(a *require.Assertions, fixture *fixtures.RestClientFixture, nodeClient libgoal.Client) { + + curRound, err := nodeClient.CurrentRound() + a.NoError(err) + + blk, err := nodeClient.Block(curRound) + a.NoError(err) + curProtocol := blk.CurrentProtocol + + startTime := time.Now() + + // while consensus version has not upgraded + for strings.Compare(curProtocol, string(consensusTestFastUpgrade(protocol.ConsensusV30))) == 0 { + curRound = curRound + 1 + fixture.WaitForRoundWithTimeout(curRound + 1) + + // TODO: check node status instead of latest block? + blk, err := nodeClient.Block(curRound) + a.NoError(err) + + curProtocol = blk.CurrentProtocol + if time.Now().After(startTime.Add(5 * time.Minute)) { + a.Fail("upgrade taking too long") + } + } + +} + +func TestKeysWithoutStateProofKeyCannotRegister(t *testing.T) { + partitiontest.PartitionTest(t) + defer fixtures.ShutdownSynchronizedTest(t) + + a := require.New(fixtures.SynchronizedTest(t)) + consensus := getStateProofConsensus() + + var fixture fixtures.RestClientFixture + fixture.SetConsensus(consensus) + fixture.Setup(t, filepath.Join("nettemplates", "TwoNodesWithoutStateProofPartkeys.json")) + defer fixture.Shutdown() + lastValid := uint64(1000 * 5) + + nodeClient := fixture.GetLibGoalClientForNamedNode("Node") + + waitUntilProtocolUpgrades(a, &fixture, nodeClient) + + a.Error(registerKeyInto(&nodeClient, a, lastValid+2, protocol.ConsensusV30)) + a.NoError(registerKeyInto(&nodeClient, a, lastValid+3, protocol.ConsensusV31)) +} + +func TestKeysWithoutStateProofKeyCanRegister(t *testing.T) { + partitiontest.PartitionTest(t) + defer fixtures.ShutdownSynchronizedTest(t) + + a := require.New(fixtures.SynchronizedTest(t)) + + var fixture fixtures.RestClientFixture + fixture.Setup(t, filepath.Join("nettemplates", "TwoNodes50EachV30.json")) + defer fixture.Shutdown() + lastValid := uint64(1000 * 5) + + nodeClient := fixture.GetLibGoalClientForNamedNode("Node") + + a.NoError(registerKeyInto(&nodeClient, a, lastValid, protocol.ConsensusV30)) + a.Error(registerKeyInto(&nodeClient, a, lastValid+1, protocol.ConsensusV31)) +} + +func registerKeyInto(client *libgoal.Client, a *require.Assertions, lastValid uint64, ver protocol.ConsensusVersion) error { + + wh, err := client.GetUnencryptedWalletHandle() + a.NoError(err) + actList, err := client.ListAddresses(wh) + a.NoError(err) + addr := actList[0] + + pongBalance, err := client.GetBalance(addr) + a.NoError(err) + a.Greater(pongBalance, uint64(10000)) + + partKey, _, err := client.GenParticipationKeys(addr, 1, lastValid, 1000) + a.NoError(err) + + cparams := config.Consensus[ver] + + tx := partKey.GenerateRegistrationTransaction( + basics.MicroAlgos{Raw: 1000}, + 0, + 100, + [32]byte{}, + cparams.EnableStateProofKeyregCheck, + ) + + if cparams.SupportGenesisHash { + prms, err := client.SuggestedParams() + a.NoError(err) + + var genHash crypto.Digest + copy(genHash[:], prms.GenesisHash) + tx.GenesisHash = genHash + } + + _, err = client.SignAndBroadcastTransaction(wh, nil, tx) + return err +} + +func getStateProofConsensus() config.ConsensusProtocols { + consensus := generateFastUpgradeConsensus() + + consensus[consensusTestFastUpgrade(protocol.ConsensusV30)]. + ApprovedUpgrades[consensusTestFastUpgrade(protocol.ConsensusV31)] = 0 + return consensus +} + +//TODO: copied code from other test: onlineOfflineParticipation_test.go. +// consider how to avoid duplication +func waitForAccountToProposeBlock(a *require.Assertions, fixture *fixtures.RestClientFixture, account string, window int) bool { + client := fixture.AlgodClient + + curStatus, err := client.Status() + a.NoError(err) + curRound := curStatus.LastRound + + // the below window controls the likelihood a block will be proposed by the account under test + // since block proposer selection is probabilistic, it is not guaranteed that the account will be chosen + // it is a trade-off between test flakiness and test duration + for window > 0 { + window-- + curRound++ + err := fixture.WaitForRoundWithTimeout(curRound) + a.NoErrorf(err, "fixture failed waiting for round %d", curRound) + + // See if account was participating by looking at block proposers + blockWasProposed := fixture.VerifyBlockProposed(account, 1) + if blockWasProposed { + return blockWasProposed + } + } + return false +} + +// This test starts with participation keys in Version30, then attempts to let the richest user participate even after +// consensus upgrade. +func TestParticipationWithoutStateProofKeys(t *testing.T) { + partitiontest.PartitionTest(t) + defer fixtures.ShutdownSynchronizedTest(t) + + a := require.New(fixtures.SynchronizedTest(t)) + + consensus := getStateProofConsensus() + + var fixture fixtures.RestClientFixture + fixture.SetConsensus(consensus) + fixture.Setup(t, filepath.Join("nettemplates", "TwoNodesWithoutStateProofPartkeys.json")) + defer fixture.Shutdown() + // Want someone to start with a key to participate with... + + act, err := fixture.GetRichestAccount() + a.NoError(err) + + var address = act.Address + + nodeClient := fixture.GetLibGoalClientForNamedNode("Node") + waitUntilProtocolUpgrades(a, &fixture, nodeClient) + + a.NotEmpty(address) + + proposalWindow := 50 // giving 50 rounds to participate, should be able to participate every second round. + blockWasProposedByPartkeyOnlyAccountRecently := waitForAccountToProposeBlock(a, &fixture, address, proposalWindow) + a.True(blockWasProposedByPartkeyOnlyAccountRecently, "partkey-only account should be proposing blocks") +} diff --git a/test/framework/fixtures/baseFixture.go b/test/framework/fixtures/baseFixture.go index 6fe4da5769..c14203f159 100644 --- a/test/framework/fixtures/baseFixture.go +++ b/test/framework/fixtures/baseFixture.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/framework/fixtures/expectFixture.go b/test/framework/fixtures/expectFixture.go index 377bce5027..8d5bc9d5b1 100644 --- a/test/framework/fixtures/expectFixture.go +++ b/test/framework/fixtures/expectFixture.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/framework/fixtures/fixture.go b/test/framework/fixtures/fixture.go index 44ad4b132a..914cc092e6 100644 --- a/test/framework/fixtures/fixture.go +++ b/test/framework/fixtures/fixture.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/framework/fixtures/goalFixture.go b/test/framework/fixtures/goalFixture.go index 20636cf171..576db08ca6 100644 --- a/test/framework/fixtures/goalFixture.go +++ b/test/framework/fixtures/goalFixture.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/framework/fixtures/kmdFixture.go b/test/framework/fixtures/kmdFixture.go index 1226bd090c..75a357f2a2 100644 --- a/test/framework/fixtures/kmdFixture.go +++ b/test/framework/fixtures/kmdFixture.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/framework/fixtures/libgoalFixture.go b/test/framework/fixtures/libgoalFixture.go index 7e57f4bfa2..38ddefbebd 100644 --- a/test/framework/fixtures/libgoalFixture.go +++ b/test/framework/fixtures/libgoalFixture.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/framework/fixtures/restClientFixture.go b/test/framework/fixtures/restClientFixture.go index 06a891b955..fe45f755ed 100644 --- a/test/framework/fixtures/restClientFixture.go +++ b/test/framework/fixtures/restClientFixture.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/framework/fixtures/webProxyFixture.go b/test/framework/fixtures/webProxyFixture.go index a0cc712153..94cee4ce7c 100644 --- a/test/framework/fixtures/webProxyFixture.go +++ b/test/framework/fixtures/webProxyFixture.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/heapwatch/metrics_delta.py b/test/heapwatch/metrics_delta.py index 9371591452..b6aa2ae8a4 100644 --- a/test/heapwatch/metrics_delta.py +++ b/test/heapwatch/metrics_delta.py @@ -54,20 +54,24 @@ def test_metric_line_re(): def parse_metrics(fin): out = dict() - for line in fin: - if not line: - continue - line = line.strip() - if not line: - continue - if line[0] == '#': - continue - m = metric_line_re.match(line) - if m: - out[m.group(1)] = num(m.group(2)) - else: - ab = line.split() - out[ab[0]] = num(ab[1]) + try: + for line in fin: + if not line: + continue + line = line.strip() + if not line: + continue + if line[0] == '#': + continue + m = metric_line_re.match(line) + if m: + out[m.group(1)] = num(m.group(2)) + else: + ab = line.split() + out[ab[0]] = num(ab[1]) + except: + print(f'An exception occurred in parse_metrics: {sys.exc_info()}') + pass return out # return b-a @@ -396,12 +400,12 @@ def process_files(self, args, nick=None, metrics_files=None): prevbi = None for path in sorted(metrics_files): - with open(path, 'rt') as fin: + with open(path, 'rt', encoding="utf-8") as fin: cur = parse_metrics(fin) bijsonpath = path.replace('.metrics', '.blockinfo.json') bi = None if os.path.exists(bijsonpath): - with open(bijsonpath, 'rt') as fin: + with open(bijsonpath, 'rt', encoding="utf-8") as fin: bi = json.load(fin) curtime = os.path.getmtime(path) self.txPool.append(cur.get('algod_tx_pool_count{}')) diff --git a/test/linttest/lintissues.go b/test/linttest/lintissues.go index 1a6a43618f..77b0c33c2a 100644 --- a/test/linttest/lintissues.go +++ b/test/linttest/lintissues.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/netperf-go/puppeteer/main.go b/test/netperf-go/puppeteer/main.go index 37aa5eb552..87dbb47cf7 100644 --- a/test/netperf-go/puppeteer/main.go +++ b/test/netperf-go/puppeteer/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/netperf-go/puppeteer/promMetricFetcher.go b/test/netperf-go/puppeteer/promMetricFetcher.go index 544421b88e..64a3341a03 100644 --- a/test/netperf-go/puppeteer/promMetricFetcher.go +++ b/test/netperf-go/puppeteer/promMetricFetcher.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/netperf-go/puppeteer/promMetricFetcher_test.go b/test/netperf-go/puppeteer/promMetricFetcher_test.go index 3cea5e687e..86579f86f3 100644 --- a/test/netperf-go/puppeteer/promMetricFetcher_test.go +++ b/test/netperf-go/puppeteer/promMetricFetcher_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/netperf-go/puppeteer/puppeteer.go b/test/netperf-go/puppeteer/puppeteer.go index d5ee414725..bcc870672f 100644 --- a/test/netperf-go/puppeteer/puppeteer.go +++ b/test/netperf-go/puppeteer/puppeteer.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/netperf-go/puppeteer/puppeteer_test.go b/test/netperf-go/puppeteer/puppeteer_test.go index 979e7f3cf1..7bf89cddca 100644 --- a/test/netperf-go/puppeteer/puppeteer_test.go +++ b/test/netperf-go/puppeteer/puppeteer_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/netperf-go/puppeteer/roundpoller.go b/test/netperf-go/puppeteer/roundpoller.go index e2c229f2fc..f4d689f6f1 100644 --- a/test/netperf-go/puppeteer/roundpoller.go +++ b/test/netperf-go/puppeteer/roundpoller.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/packages/test_release.sh b/test/packages/test_release.sh index 4f94393f41..423a16f251 100755 --- a/test/packages/test_release.sh +++ b/test/packages/test_release.sh @@ -16,7 +16,7 @@ fi OS_LIST=( centos:7 - centos:8 + quay.io/centos/centos:stream8 fedora:28 ubuntu:16.04 ubuntu:18.04 diff --git a/test/partitiontest/filtering.go b/test/partitiontest/filtering.go index 74a263aaa2..0af5e2e141 100644 --- a/test/partitiontest/filtering.go +++ b/test/partitiontest/filtering.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/test/platform/test_linux_amd64_compatibility.sh b/test/platform/test_linux_amd64_compatibility.sh index 4ae139f1dd..0c65db433b 100755 --- a/test/platform/test_linux_amd64_compatibility.sh +++ b/test/platform/test_linux_amd64_compatibility.sh @@ -8,7 +8,7 @@ END_FG_COLOR=$(tput sgr0 2>/dev/null) OS_LIST=( centos:7 - centos:8 + quay.io/centos/centos:stream8 fedora:28 ubuntu:16.04 ubuntu:18.04 diff --git a/test/scripts/e2e.sh b/test/scripts/e2e.sh index 571d117819..a587bc201f 100755 --- a/test/scripts/e2e.sh +++ b/test/scripts/e2e.sh @@ -22,6 +22,7 @@ Requires: Options: -c Channel of build you are building binaries with this script -n Run tests without building binaries (Binaries are expected in PATH) + -i Start an interactive session for running e2e subs. " NO_BUILD=false while getopts ":c:nhi" opt; do @@ -33,11 +34,11 @@ while getopts ":c:nhi" opt; do ;; h ) echo "${HELP}" exit 0 - ;; + ;; i ) echo " Interactive session" - echo "######################################################################" - INTERACTIVE=true - ;; + echo "######################################################################" + INTERACTIVE=true + ;; \? ) echo "${HELP}" exit 2 ;; @@ -117,32 +118,46 @@ export GOPATH=$(go env GOPATH) cd "${SCRIPT_PATH}" if [ -z "$E2E_TEST_FILTER" ] || [ "$E2E_TEST_FILTER" == "SCRIPTS" ]; then - ./timeout 200 ./e2e_basic_start_stop.sh - duration "e2e_basic_start_stop.sh" - python3 -m venv "${TEMPDIR}/ve" . "${TEMPDIR}/ve/bin/activate" "${TEMPDIR}/ve/bin/pip3" install --upgrade pip - "${TEMPDIR}/ve/bin/pip3" install --upgrade py-algorand-sdk cryptography + "${TEMPDIR}/ve/bin/pip3" install --upgrade cryptograpy + + # Pin a version of our python SDK's so that breaking changes don't spuriously break our tests. + # Please update as necessary. + "${TEMPDIR}/ve/bin/pip3" install py-algorand-sdk==1.9.0b1 + + # Enable remote debugging: + "${TEMPDIR}/ve/bin/pip3" install --upgrade debugpy duration "e2e client setup" if [ $INTERACTIVE ]; then - echo "********** READY **********" - echo "The test environment is now set. Run the tests using the following command on a different terminal after setting the path." - echo "" - echo "export VIRTUAL_ENV=\"${TEMPDIR}/ve\"" - echo "export PATH=\"\$VIRTUAL_ENV/bin:\$PATH\"" - echo "" - echo "${TEMPDIR}/ve/bin/python3" test/scripts/e2e_client_runner.py ${RUN_KMD_WITH_UNSAFE_SCRYPT} "$SRCROOT"/test/scripts/e2e_subs/SCRIPT_FILE_NAME - echo "" - echo "Press enter to shut down the test environment..." - read a - echo -n "deactivating..." - deactivate - echo "done" - exit + echo -e "\n\n********** READY **********\n\n" + echo "The test environment is now set. You can now run tests in another terminal." + + echo -e "\nConfigure the environment:\n" + if [ "$(basename $SHELL)" == "fish" ]; then + echo "set -g VIRTUAL_ENV \"${TEMPDIR}/ve\"" + echo "set -g PATH \"\$VIRTUAL_ENV/bin:\$PATH\"" + else + echo "export VIRTUAL_ENV=\"${TEMPDIR}/ve\"" + echo "export PATH=\"\$VIRTUAL_ENV/bin:\$PATH\"" + fi + + echo "" + echo "python3 \"$SCRIPT_PATH/e2e_client_runner.py\" ${RUN_KMD_WITH_UNSAFE_SCRYPT} \"$SCRIPT_PATH/e2e_subs/SCRIPT_FILE_NAME\"" + echo "" + echo "Press enter to shut down the test environment..." + read a + echo -n "deactivating..." + deactivate + echo "done" + exit fi + ./timeout 200 ./e2e_basic_start_stop.sh + duration "e2e_basic_start_stop.sh" + "${TEMPDIR}/ve/bin/python3" e2e_client_runner.py ${RUN_KMD_WITH_UNSAFE_SCRYPT} "$SRCROOT"/test/scripts/e2e_subs/*.{sh,py} duration "parallel client runner" diff --git a/test/scripts/e2e_go_tests.sh b/test/scripts/e2e_go_tests.sh index 1368f99e26..560808a7c3 100755 --- a/test/scripts/e2e_go_tests.sh +++ b/test/scripts/e2e_go_tests.sh @@ -101,7 +101,6 @@ cd ${SRCROOT}/test/e2e-go # ARM64 has some memory related issues with fork. Since we don't really care # about testing the forking capabilities, we're just run the tests one at a time. -PARALLEL_FLAG="" ARCHTYPE=$("${SRCROOT}/scripts/archtype.sh") echo "ARCHTYPE: ${ARCHTYPE}" if [[ "${ARCHTYPE}" = arm* ]]; then diff --git a/test/scripts/e2e_subs/app-inner-calls.py b/test/scripts/e2e_subs/app-inner-calls.py new file mode 100755 index 0000000000..a027747b28 --- /dev/null +++ b/test/scripts/e2e_subs/app-inner-calls.py @@ -0,0 +1,149 @@ +#!/usr/bin/env python + +import os +import sys +from goal import Goal +import algosdk.logic as logic + +from datetime import datetime + +stamp = datetime.now().strftime("%Y%m%d_%H%M%S") +print(f"{os.path.basename(sys.argv[0])} start {stamp}") + +goal = Goal(sys.argv[1], autosend=True) + +joe = goal.new_account() + +txinfo, err = goal.pay(goal.account, joe, amt=500_000) +assert not err, err + +# Turn off rewards for precise balance checking +txinfo, err = goal.keyreg(joe, nonpart=True) +assert not err, err +joeb = goal.balance(joe) + +# When invoked, this app funds the app that was created in the txn +# before it and invokes its start(asset) method. Of course, this app must +# be prefunded to do so. And in real life, would want to check its +# sender as access control +fund_previous = """ +#pragma version 6 + txn ApplicationID + bz end + + itxn_begin + int pay + itxn_field TypeEnum + + txn GroupIndex + int 1 + - + gtxns CreatedApplicationID + dup + store 0 + app_params_get AppAddress + assert + itxn_field Receiver + + int 1000000 + itxn_field Amount + + itxn_next + + int appl + itxn_field TypeEnum + + load 0 + itxn_field ApplicationID + + txn GroupIndex + int 2 + - + gtxns CreatedAssetID + itxn_field Assets + + method "start(asset)" + itxn_field ApplicationArgs + + byte 0x00 + itxn_field ApplicationArgs + itxn_submit + + +end: + int 1 +""" + +txinfo, err = goal.app_create(joe, goal.assemble(fund_previous)) +assert not err, err +funder = txinfo['application-index'] +assert funder + +# Fund the funder +txinfo, err = goal.pay(goal.account, goal.app_address(funder), amt=4_000_000) +assert not err, err + +# Construct a group that creates an ASA and an app, then "starts" the +# new app by funding and invoking "start(asset)" on it. Inside the new +# app's start() method, there will be yet another inner transaction: +# it opts into the supplied asset. + +goal.autosend = False +create_asa = goal.asset_create(joe, total=10_000, unit_name="oz", asset_name="Gold") +app_teal = """ +#pragma version 6 + txn ApplicationID + bz end + txn ApplicationArgs 0 + method "start(asset)" + == + bz next0 + + itxn_begin + + int axfer + itxn_field TypeEnum + + txn ApplicationArgs 1 + btoi + txnas Assets + itxn_field XferAsset + + global CurrentApplicationAddress + itxn_field AssetReceiver + + itxn_submit + +next0: + +end: + int 1 +""" +create_app = goal.app_create(joe, goal.assemble(app_teal)) +start_app = goal.app_call(joe, funder) + +[asa_info, app_info, start_info], err = goal.send_group([create_asa, create_app, start_app]) +assert not err, err + +goal.autosend = True + +import json + +asa_id = asa_info['asset-index'] +app_id = app_info['application-index'] +assert asa_id+1 == app_id +app_account = logic.get_application_address(app_id) + +# Check balance on app account is right (1m - 1 optin fee) +assert 1_000_000-1000 == goal.balance(app_account), goal.balance(app_account) +assert 0 == goal.balance(app_account, asa_id) +# Check min-balance on app account is right (base + 1 asa) +assert 200_000 == goal.min_balance(app_account), goal.min_balance(app_account) + +# Ensure creator can send asa to app +txinfo, err = goal.axfer(joe, app_account, 10, asa_id) +assert not err, err +assert 10 == goal.balance(app_account, asa_id) + + +print(f"{os.path.basename(sys.argv[0])} OK {stamp}") diff --git a/test/scripts/e2e_subs/asset-misc.sh b/test/scripts/e2e_subs/asset-misc.sh index 849b864840..73c018eb89 100755 --- a/test/scripts/e2e_subs/asset-misc.sh +++ b/test/scripts/e2e_subs/asset-misc.sh @@ -15,6 +15,7 @@ ACCOUNT=$(${gcmd} account list|awk '{ print $3 }') ACCOUNTB=$(${gcmd} account new|awk '{ print $6 }') ACCOUNTC=$(${gcmd} account new|awk '{ print $6 }') ACCOUNTD=$(${gcmd} account new|awk '{ print $6 }') +ACCOUNTE=$(${gcmd} account new|awk '{ print $6 }') ASSET_NAME='Birlot : décollage vs. ࠶🦪' @@ -47,4 +48,105 @@ else exit 1 fi +# Test Scenario - check addresses are set correctly +# case 1: asset created without specifying manager, reserve, freezer, or clawback +MANAGER_ADDRESS=$(${gcmd} asset info --assetid ${ASSET_ID} |grep 'Manager address'|awk '{ print $3 }') +RESERVE_ADDRESS=$(${gcmd} asset info --assetid ${ASSET_ID} |grep 'Reserve address'|awk '{ print $3 }') +FREEZE_ADDRESS=$(${gcmd} asset info --assetid ${ASSET_ID} |grep 'Freeze address'|awk '{ print $3 }') +CLAWBACK_ADDRESS=$(${gcmd} asset info --assetid ${ASSET_ID} |grep 'Clawback address'|awk '{ print $3 }') + +# check manager, reserve, freeze, and clawback are by default the creator +if [ "$MANAGER_ADDRESS" = "$ACCOUNT" ] \ + && [ "$RESERVE_ADDRESS" = "$ACCOUNT" ] \ + && [ "$FREEZE_ADDRESS" = "$ACCOUNT" ] \ + && [ "$CLAWBACK_ADDRESS" = "$ACCOUNT" ]; then + echo ok +else + date '+asset-misc asset manager, reserve, freezer, and clawback should be creator error %Y%m%d_%H%M%S' + exit 1 +fi + +# case 2: asset created with no manager, no reserve, no freezer, and no clawback +${gcmd} asset create --creator "${ACCOUNT}" --no-manager --no-reserve --no-freezer --no-clawback --name "${ASSET_NAME}" --unitname iamisc --total 1000000000000 --asseturl "${ASSET_URL}" + +IMMUTABLE_ASSET_ID=$(${gcmd} asset info --creator $ACCOUNT --unitname iamisc|grep 'Asset ID'|awk '{ print $3 }') + +IMMUTABLE_MANAGER_ADDRESS=$(${gcmd} asset info --assetid ${IMMUTABLE_ASSET_ID} |grep 'Manager address'|awk '{ print $3 }') +IMMUTABLE_RESERVE_ADDRESS=$(${gcmd} asset info --assetid ${IMMUTABLE_ASSET_ID} |grep 'Reserve address'|awk -F "[()]" '{ print $2 }') +IMMUTABLE_FREEZE_ADDRESS=$(${gcmd} asset info --assetid ${IMMUTABLE_ASSET_ID} |grep 'Freeze address'|awk '{ print $3 }') +IMMUTABLE_CLAWBACK_ADDRESS=$(${gcmd} asset info --assetid ${IMMUTABLE_ASSET_ID} |grep 'Clawback address'|awk '{ print $3 }') + +# goal asset info returns the creator's address as the reserve address when reserve address is empty +# check goal/asset.go +if [ "$IMMUTABLE_MANAGER_ADDRESS" = "" ] \ + && [ "$IMMUTABLE_RESERVE_ADDRESS" = "Empty. Defaulting to creator" ] \ + && [ "$IMMUTABLE_FREEZE_ADDRESS" = "" ] \ + && [ "$IMMUTABLE_CLAWBACK_ADDRESS" = "" ]; then + echo ok +else + date '+asset-misc immutable asset manager/reserve/freezer/clawback addresses error %Y%m%d_%H%M%S' + exit 1 +fi + +# case 3: asset created with manager, reserve, freezer, and clawback different from the creator +${gcmd} asset create --creator "${ACCOUNT}" --manager "${ACCOUNTB}" --reserve "${ACCOUNTC}" --freezer "${ACCOUNTD}" --clawback "${ACCOUNTE}" --name "${ASSET_NAME}" --unitname dma --total 1000000000000 --asseturl "${ASSET_URL}" + +DIFF_MANAGER_ASSET_ID=$(${gcmd} asset info --creator $ACCOUNT --unitname dma|grep 'Asset ID'|awk '{ print $3 }') + +DMA_MANAGER_ADDRESS=$(${gcmd} asset info --assetid ${DIFF_MANAGER_ASSET_ID} |grep 'Manager address'|awk '{ print $3 }') +DMA_RESERVE_ADDRESS=$(${gcmd} asset info --assetid ${DIFF_MANAGER_ASSET_ID} |grep 'Reserve address'|awk '{ print $3 }') +DMA_FREEZE_ADDRESS=$(${gcmd} asset info --assetid ${DIFF_MANAGER_ASSET_ID} |grep 'Freeze address'|awk '{ print $3 }') +DMA_CLAWBACK_ADDRESS=$(${gcmd} asset info --assetid ${DIFF_MANAGER_ASSET_ID} |grep 'Clawback address'|awk '{ print $3 }') + +if [ "$DMA_MANAGER_ADDRESS" = "$ACCOUNTB" ] \ + && [ "$DMA_RESERVE_ADDRESS" = "$ACCOUNTC" ] \ + && [ "$DMA_FREEZE_ADDRESS" = "$ACCOUNTD" ] \ + && [ "$DMA_CLAWBACK_ADDRESS" = "$ACCOUNTE" ]; then + echo ok +else + date '+asset-misc asset addresses with diff manager/reserve/freeze/clawback error %Y%m%d_%H%M%S' + exit 1 +fi + +# Test Scenario - check if asset is created successfully when passed in different combination of flags for addresses +# case 1: create asset with both manager flag and no-manager flag +if ${gcmd} asset create --creator "${ACCOUNT}" --no-manager --manager "${ACCOUNTB}" --name "${ASSET_NAME}" --unitname errmisc --total 1000000000000 --asseturl "${ASSET_URL}"; then + date '+asset-misc asset with --manager and --no-manager flags created successfully error %Y%m%d_%H%M%S' + exit 1 +else + echo "Expected. Cannot create asset with both manager flag and no-manager flag" +fi + +# case 2: create asset with both reserve flag and no-reserve flag +if ${gcmd} asset create --creator "${ACCOUNT}" --no-reserve --reserve "${ACCOUNTC}" --name "${ASSET_NAME}" --unitname errmisc --total 1000000000000 --asseturl "${ASSET_URL}"; then + date '+asset-misc asset with --reserve and --no-reserve flags created successfully error %Y%m%d_%H%M%S' + exit 1 +else + echo "Expected. Cannot create asset with both reserve flag and no-reserve flag" +fi + +# case 3: create asset with both freezer flag and no-freezer flag +if ${gcmd} asset create --creator "${ACCOUNT}" --no-freezer --freezer "${ACCOUNTD}" --name "${ASSET_NAME}" --unitname errmisc --total 1000000000000 --asseturl "${ASSET_URL}"; then + date '+asset-misc asset with --freezer and --no-freezer flags created successfully error %Y%m%d_%H%M%S' + exit 1 +else + echo "Expected. Cannot create asset with both freezer flag and no-freezer flag" +fi + +# case 4: create asset with both clawback flag and no-clawback flag +if ${gcmd} asset create --creator "${ACCOUNT}" --no-clawback --clawback "${ACCOUNTE}" --name "${ASSET_NAME}" --unitname errmisc --total 1000000000000 --asseturl "${ASSET_URL}"; then + date '+asset-misc asset with --clawback and --no-clawback flags created successfully error %Y%m%d_%H%M%S' + exit 1 +else + echo "Expected. Cannot create asset with both clawback flag and no-clawback flag" +fi + +# case 5: create asset with reserve flag, no-freezer flag and no-clawback flag +if ${gcmd} asset create --creator "${ACCOUNT}" --no-freezer --no-clawback --reserve "${ACCOUNTE}" --name "${ASSET_NAME}" --unitname errmisc --total 1000000000000 --asseturl "${ASSET_URL}"; then + echo "ok" +else + date '+asset-misc asset with independent flags created unsuccessfully error %Y%m%d_%H%M%S' + exit 1 +fi + date '+asset-misc finish %Y%m%d_%H%M%S' diff --git a/test/scripts/e2e_subs/e2e-app-abi-method.sh b/test/scripts/e2e_subs/e2e-app-abi-method.sh index ec3a0d71e7..46cc5406ab 100755 --- a/test/scripts/e2e_subs/e2e-app-abi-method.sh +++ b/test/scripts/e2e_subs/e2e-app-abi-method.sh @@ -16,9 +16,18 @@ gcmd="goal -w ${WALLET}" ACCOUNT=$(${gcmd} account list|awk '{ print $3 }') -printf '#pragma version 2\nint 1' > "${TEMPDIR}/simple.teal" -PROGRAM=($(${gcmd} clerk compile "${TEMPDIR}/simple.teal")) -APPID=$(${gcmd} app create --creator ${ACCOUNT} --approval-prog ${DIR}/tealprogs/app-abi-method-example.teal --clear-prog ${TEMPDIR}/simple.teal --global-byteslices 0 --global-ints 0 --local-byteslices 1 --local-ints 0 | grep Created | awk '{ print $6 }') +printf '#pragma version 2\nint 1' > "${TEMPDIR}/simple-v2.teal" +printf '#pragma version 3\nint 1' > "${TEMPDIR}/simple-v3.teal" + +# Create +RES=$(${gcmd} app method --method "create(uint64)uint64" --arg "1234" --create --approval-prog ${DIR}/tealprogs/app-abi-method-example.teal --clear-prog ${TEMPDIR}/simple-v2.teal --global-byteslices 0 --global-ints 0 --local-byteslices 1 --local-ints 0 --extra-pages 0 --from $ACCOUNT 2>&1 || true) +EXPECTED="method create(uint64)uint64 succeeded with output: 2468" +if [[ $RES != *"${EXPECTED}"* ]]; then + date '+app-abi-method-test FAIL the method call to create(uint64)uint64 should not fail %Y%m%d_%H%M%S' + false +fi + +APPID=$(echo "$RES" | grep Created | awk '{ print $6 }') # Opt in RES=$(${gcmd} app method --method "optIn(string)string" --arg "\"Algorand Fan\"" --on-completion optin --app-id $APPID --from $ACCOUNT 2>&1 || true) @@ -28,6 +37,14 @@ if [[ $RES != *"${EXPECTED}"* ]]; then false fi +# No arguments or return value +RES=$(${gcmd} app method --method "empty()void" --app-id $APPID --from $ACCOUNT 2>&1 || true) +EXPECTED="method empty()void succeeded" +if [[ $RES != *"${EXPECTED}" ]]; then + date '+app-abi-method-test FAIL the method call to empty()void should not fail %Y%m%d_%H%M%S' + false +fi + # 1 + 2 = 3 RES=$(${gcmd} app method --method "add(uint64,uint64)uint64" --arg 1 --arg 2 --app-id $APPID --from $ACCOUNT 2>&1 || true) EXPECTED="method add(uint64,uint64)uint64 succeeded with output: 3" @@ -62,6 +79,14 @@ if [[ $RES != *"${EXPECTED}"* ]]; then false fi +# Foreign reference test +RES=$(${gcmd} app method --method "referenceTest(account,application,account,asset,account,asset,asset,application,application)uint8[9]" --arg KGTOR3F3Q74JP4LB5M3SOCSJ4BOPOKZ2GPSLMLLGCWYWRXZJNN4LYQJXXU --arg $APPID --arg $ACCOUNT --arg 10 --arg KGTOR3F3Q74JP4LB5M3SOCSJ4BOPOKZ2GPSLMLLGCWYWRXZJNN4LYQJXXU --arg 11 --arg 10 --arg 20 --arg 21 --app-account 2R5LMPTYLVMWYEG4RPI26PJAM7ARTGUB7LZSONQPGLUWTPOP6LQCJTQZVE --foreign-app 21 --foreign-asset 10 --app-id $APPID --from $ACCOUNT 2>&1 || true) +EXPECTED="method referenceTest(account,application,account,asset,account,asset,asset,application,application)uint8[9] succeeded with output: [2,0,2,0,2,1,0,1,0]" +if [[ $RES != *"${EXPECTED}"* ]]; then + date '+app-abi-method-test FAIL the method call to referenceTest(account,application,account,asset,account,asset,asset,application,application)uint8[9] should not fail %Y%m%d_%H%M%S' + false +fi + # Close out RES=$(${gcmd} app method --method "closeOut()string" --on-completion closeout --app-id $APPID --from $ACCOUNT 2>&1 || true) EXPECTED="method closeOut()string succeeded with output: \"goodbye Algorand Fan\"" @@ -70,6 +95,14 @@ if [[ $RES != *"${EXPECTED}"* ]]; then false fi +# Update +RES=$(${gcmd} app method --method "update()void" --on-completion updateapplication --approval-prog ${DIR}/tealprogs/app-abi-method-example.teal --clear-prog ${TEMPDIR}/simple-v3.teal --app-id $APPID --from $ACCOUNT 2>&1 || true) +EXPECTED="method update()void succeeded" +if [[ $RES != *"${EXPECTED}"* ]]; then + date '+app-abi-method-test FAIL the method call to update()void should not fail %Y%m%d_%H%M%S' + false +fi + # Delete RES=$(${gcmd} app method --method "delete()void" --on-completion deleteapplication --app-id $APPID --from $ACCOUNT 2>&1 || true) EXPECTED="method delete()void succeeded" diff --git a/test/scripts/e2e_subs/e2e-app-extra-pages.sh b/test/scripts/e2e_subs/e2e-app-extra-pages.sh index 4852918c6a..1b9dd779c0 100755 --- a/test/scripts/e2e_subs/e2e-app-extra-pages.sh +++ b/test/scripts/e2e_subs/e2e-app-extra-pages.sh @@ -77,7 +77,7 @@ fi # App create with extra pages, v4 teal RES=$(${gcmd} app create --creator ${ACCOUNT} --approval-prog "${BIG_TEAL_V4_FILE}" --clear-prog "${BIG_TEAL_V4_FILE}" --extra-pages 3 --global-byteslices 1 --global-ints 0 --local-byteslices 0 --local-ints 0 2>&1 || true) -EXPERROR="pc=704 dynamic cost budget exceeded, executing intc_0: remaining budget is 700 but program cost was 701" +EXPERROR="pc=704 dynamic cost budget exceeded, executing intc_0: local program cost was 700" if [[ $RES != *"${EXPERROR}"* ]]; then date '+app-extra-pages-test FAIL the application creation should fail %Y%m%d_%H%M%S' false diff --git a/test/scripts/e2e_subs/goal-partkey-information.sh b/test/scripts/e2e_subs/goal-partkey-information.sh index 80dbd8d5c7..8237eacf0c 100755 --- a/test/scripts/e2e_subs/goal-partkey-information.sh +++ b/test/scripts/e2e_subs/goal-partkey-information.sh @@ -12,7 +12,7 @@ OUTPUT=$(goal account listpartkeys|tail -n 1|tr -s ' ') if [[ "$OUTPUT" != yes* ]]; then echo "Registered should be 'yes' but wasn't."; exit 1; fi if [[ $(echo "$OUTPUT" | cut -d' ' -f 4) == 0 ]]; then echo "Last Used shouldn't be 0 but was."; exit 1; fi if [[ $(echo "$OUTPUT" | cut -d' ' -f 5) != 0 ]]; then echo "First round should be 0 but wasn't."; exit 1; fi -if [[ $(echo "$OUTPUT" | cut -d' ' -f 6) != 3000000 ]]; then echo "Last round should be 3000000 but wasn't."; exit 1; fi +if [[ $(echo "$OUTPUT" | cut -d' ' -f 6) != 3000 ]]; then echo "Last round should be 3000 but wasn't."; exit 1; fi #Dumping participation key info from /tmp/tmpwtomya9x/net/Node... # @@ -29,8 +29,8 @@ if [[ $(echo "$OUTPUT" | cut -d' ' -f 6) != 3000000 ]]; then echo "Last round sh #Voting key: W1OcXLZsaATyOd5FbhRgXHmcywvn++xEVUAQ0NejmW4= OUTPUT=$(goal account partkeyinfo) if ! echo "$OUTPUT" | grep -q 'First round:[[:space:]]* 0'; then echo "First round should have been 0."; exit 1; fi -if ! echo "$OUTPUT" | grep -q 'Last round:[[:space:]]* 3000000'; then echo "Last round should have been 3000000."; exit 1; fi -if ! echo "$OUTPUT" | grep -q 'Effective last round:[[:space:]]* 3000000'; then echo "Effective last round should have been 3000000."; exit 1; fi +if ! echo "$OUTPUT" | grep -q 'Last round:[[:space:]]* 3000'; then echo "Last round should have been 3000."; exit 1; fi +if ! echo "$OUTPUT" | grep -q 'Effective last round:[[:space:]]* 3000'; then echo "Effective last round should have been 3000."; exit 1; fi # 100 or 10000 due to arm64 bug if ! echo "$OUTPUT" | grep -q 'Key dilution:[[:space:]]* 100\(00\)\?'; then echo "Key dilution should have been 10000."; exit 1; fi if ! echo "$OUTPUT" | grep -q 'Participation ID:[[:space:]]*[[:alnum:]]\{52\}'; then echo "There should be a participation ID."; exit 1; fi diff --git a/test/scripts/e2e_subs/goal/goal.py b/test/scripts/e2e_subs/goal/goal.py index 921d2c3ea2..969fc2053b 100755 --- a/test/scripts/e2e_subs/goal/goal.py +++ b/test/scripts/e2e_subs/goal/goal.py @@ -156,12 +156,12 @@ def send(self, tx, confirm=True): return txid, "" return self.confirm(txid), "" except algosdk.error.AlgodHTTPError as e: - return (None, str(e)) + return (None, e) def send_group(self, txns, confirm=True): # Need unsigned transactions to calculate the group This pulls - # out the unsigned tx if tx is sigged, logigsigged or - # multisgged + # out the unsigned tx if tx is sigged, logicsigged or + # multisigged utxns = [ tx if isinstance(tx, txn.Transaction) else tx.transaction for tx in txns @@ -172,14 +172,15 @@ def send_group(self, txns, confirm=True): tx.group = gid else: tx.transaction.group = gid + txids = [utxn.get_txid() for utxn in utxns] try: stxns = [self.sign(tx) for tx in txns] - txid = self.algod.send_transactions(stxns) + self.algod.send_transactions(stxns) if not confirm: - return txid, "" - return self.confirm(txid), "" + return txids, None + return [self.confirm(txid) for txid in txids], None except algosdk.error.AlgodHTTPError as e: - return (None, str(e)) + return (txids, e) def status(self): return self.algod.status() @@ -196,7 +197,7 @@ def confirm(self, txid): def wait_for_block(self, block): """ - Utility function to wait until the block number given has been confirmed + Utility function to wait until the given block has been confirmed """ print(f"Waiting for block {block}.") s = self.algod.status() @@ -299,7 +300,8 @@ def app_create( ): assert not kwargs.pop("index", None) if not clear_program: - clear_program = self.assemble("#pragma version 2\nint 1") + approve = f"#pragma version {approval_program[0]}\nint 1" + clear_program = self.assemble(approve) return self.appl( sender, 0, @@ -322,6 +324,10 @@ def balance(self, account, asa=None): info = self.algod.account_info(account) return info["amount"] + def min_balance(self, account): + info = self.algod.account_info(account) + return info["min-balance"] + def holding(self, account, asa): info = self.algod.account_info(account) for asset in info["assets"]: diff --git a/test/scripts/e2e_subs/keyreg-teal-test.sh b/test/scripts/e2e_subs/keyreg-teal-test.sh index 806640483d..61402a45e6 100755 --- a/test/scripts/e2e_subs/keyreg-teal-test.sh +++ b/test/scripts/e2e_subs/keyreg-teal-test.sh @@ -27,8 +27,8 @@ DELKEY=$(algokey generate -f ${TEMPDIR}/delegate.keyregkey | grep "Public key" | algotmpl -d tools/teal/templates/ delegate-key-registration --fee ${FEE} --dur ${DUR} --period ${PERIOD} --expire ${EXPIRE} --auth ${DELKEY} --lease ${LEASE} > ${TEMPDIR}/delegate.teal ${gcmd} clerk compile -a ${ACCOUNTA} -s -o ${TEMPDIR}/kr.lsig ${TEMPDIR}/delegate.teal -RES=$(${gcmd} account addpartkey -a ${ACCOUNTA} --roundFirstValid 0 --roundLastValid 100) -if [[ $RES != 'Participation key generation successful' ]]; then +RES=$(${gcmd} account addpartkey -a ${ACCOUNTA} --roundFirstValid 0 --roundLastValid 256) +if [[ $RES != *"Participation key generation successful"* ]]; then date '+keyreg-teal-test FAIL did not see confirmation that partkey gen was successful %Y%m%d_%H%M%S' false fi @@ -118,8 +118,8 @@ DELKEY=$(algokey generate -f ${TEMPDIR}/delegate.keyregkey | grep "Public key" | algotmpl -d tools/teal/templates/ delegate-key-registration --fee ${FEE} --dur ${DUR} --period ${PERIOD} --expire ${EXPIRE} --auth ${DELKEY} --lease ${LEASE} > ${TEMPDIR}/delegate.teal ${gcmd} clerk compile -a ${ACCOUNTB} -s -o ${TEMPDIR}/kr.lsig ${TEMPDIR}/delegate.teal -RES=$(${gcmd} account addpartkey -a ${ACCOUNTB} --roundFirstValid 0 --roundLastValid 100) -if [[ $RES != 'Participation key generation successful' ]]; then +RES=$(${gcmd} account addpartkey -a ${ACCOUNTB} --roundFirstValid 0 --roundLastValid 256) +if [[ $RES != *"Participation key generation successful"* ]]; then date '+keyreg-teal-test FAIL did not see confirmation that partkey gen was successful %Y%m%d_%H%M%S' false fi diff --git a/test/scripts/e2e_subs/keyreg.sh b/test/scripts/e2e_subs/keyreg.sh new file mode 100755 index 0000000000..b3d852f268 --- /dev/null +++ b/test/scripts/e2e_subs/keyreg.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +date '+e2e_subs/keyreg.sh start %Y%m%d_%H%M%S' + +set -exo pipefail +export SHELLOPTS + +WALLET=$1 + +gcmd="goal -w ${WALLET}" + +ACCOUNT=$(${gcmd} account list|awk '{ print $3 }') + +# secret algokey override +ALGOKEY_GENESIS_HASH=$(goal node status | grep 'Genesis hash:'|awk '{ print $3 }') +export ALGOKEY_GENESIS_HASH +# Test key registration +KEYS="${TEMPDIR}/foo.keys" +TXN="${TEMPDIR}/keyreg.txn" +STXN="${TEMPDIR}/keyreg.stxn" +algokey part generate --first 1 --last 1000 --parent "${ACCOUNT}" --keyfile "${KEYS}" +algokey part keyreg --network placeholder --keyfile "${KEYS}" --firstvalid 1 --outputFile "${TXN}" +# technically algokey could be used to sign at this point, that would require +# exporting secrets from the wallet. +${gcmd} clerk sign -i "${TXN}" -o "${STXN}" +${gcmd} clerk rawsend -f "${STXN}" + +TXN2="${TEMPDIR}/keydereg.txn" +STXN2="${TEMPDIR}/keydereg.stxn" +# Test key de-registration +algokey part keyreg --network placeholder --offline --account "${ACCOUNT}" --firstvalid 1 --outputFile "${TXN2}" +${gcmd} clerk sign -i "${TXN2}" -o "${STXN2}" +${gcmd} clerk rawsend -f "${STXN2}" diff --git a/test/scripts/e2e_subs/min_balance.py b/test/scripts/e2e_subs/min_balance.py new file mode 100755 index 0000000000..b7376fd37f --- /dev/null +++ b/test/scripts/e2e_subs/min_balance.py @@ -0,0 +1,238 @@ +#!/usr/bin/env python + +from base64 import b64decode +from datetime import datetime +from pathlib import PurePath +import sys + +import algosdk.future.transaction as txn + +from goal import Goal + +# Set INTERACTIVE True if you want to run a remote debugger interactively on the given PORT +INTERACTIVE, DEBUGPORT = False, 4312 + + +def initialize_debugger(): + import multiprocessing + + if multiprocessing.current_process().pid > 1: + import debugpy + + debugpy.listen(("0.0.0.0", DEBUGPORT)) + print("Debugger is ready to be attached, press F5", flush=True) + debugpy.wait_for_client() + print("Visual Studio Code debugger is now attached", flush=True) + + +if INTERACTIVE: + initialize_debugger() + + +CONSENSUS_MIN_BALANCE = 100_000 +ASSET_MIN_BALANCE = 100_000 +APP_MIN_BALANCE = 100_000 +OPTIN_MIN_BALANCE = 100_000 +# app schemas: +APP_KV_MIN_BALANCE = 25_000 +APP_INTS_MIN_BALANCE = 3_500 +APP_BYTES_MIN_BALANCE = 25_000 + +# per userBalance.go::MinBalance() as of Dec 2021: +EXTRA_PAGE_MIN_BALANCE = APP_MIN_BALANCE + +TEAL = f"""#pragma version 5 +byte "Hello Min Balance!" +log + +// even when creating the app, calc the min balance: +byte "min_balance=" +log + +txn Accounts 0 +min_balance +itob +log + +int 1""" + + +def get_endpoint_info(goal) -> dict: + return { + "algod": { + "url": goal.algod.algod_address, + "auth": goal.algod.algod_token, + }, + "kmd": { + "url": goal.kmd.kmd_address, + "auth": goal.kmd.kmd_token, + }, + } + + +def get_pysdk_min_balance(goal, account): + return goal.algod.account_info(account)["min-balance"] + + +def create_sender_min_balance_app(goal): + txinfo, err = goal.app_create(goal.account, goal.assemble(TEAL)) + assert not err, f"err: {err}" + + appid = txinfo["application-index"] + creator_min_balance = int.from_bytes(b64decode(txinfo["logs"][2]), byteorder="big") + return appid, creator_min_balance + + +def assert_teal_min_balance( + goal, account, expected_account_mb, expected_goal_mb, goal_only=False +): + appid, goal_mb = create_sender_min_balance_app(goal) + assert ( + goal_mb == expected_goal_mb + ), f"GOAL teal v. expected: {goal_mb} != {expected_goal_mb}" + + txinfo, err = goal.app_call(account, appid) + assert not err, f"err = {err}" + + if goal_only: + return + + min_balance = int.from_bytes(b64decode(txinfo["logs"][2]), byteorder="big") + assert ( + min_balance == expected_account_mb + ), f"SENDER teal v. expected: {min_balance} != {expected_account_mb}" + + +def assert_min_balance( + goal, account, expected_sender_mb, expected_goal_mb, goal_only=False +): + algod_mb = get_pysdk_min_balance(goal, account) + assert ( + algod_mb == expected_sender_mb + ), f"SENDER algod v. expected: {algod_mb} != {expected_sender_mb}" + assert_teal_min_balance( + goal, account, expected_sender_mb, expected_goal_mb, goal_only=goal_only + ) + + +script_path, WALLET = sys.argv +ppath = PurePath(script_path) + +CWD, SCRIPT = ppath.parent, ppath.name +TEAL_DIR = CWD / "tealprogs" + +stamp = datetime.now().strftime("%Y%m%d_%H%M%S") +print(f"Running {SCRIPT} inside {CWD} @ {stamp}") + +# Initialize goal +goal = Goal(WALLET, autosend=True) +rest_endpoints = get_endpoint_info(goal) +print(f"Python Goal cennected to {rest_endpoints}") + + +joe = goal.new_account() +flo = goal.new_account() + +print(f"Joe & Flo: {joe}, {flo}") + +txinfo, err = goal.pay(goal.account, joe, amt=50_000_000, send=True) +txinfo, err = goal.pay(goal.account, flo, amt=100_000_000, send=True) + +expected_goal_mb = CONSENSUS_MIN_BALANCE + APP_MIN_BALANCE + +# starting out, should be at global min +assert_min_balance(goal, flo, CONSENSUS_MIN_BALANCE, expected_goal_mb) + +expected_goal_mb += APP_MIN_BALANCE +assert_min_balance(goal, joe, CONSENSUS_MIN_BALANCE, expected_goal_mb) + + +# flo creates an asset +txinfo, err = goal.asset_create( + flo, total=10_000, unit_name="oz", asset_name="Gold", manager=flo, send=True +) +assert not err, err +assets = {"Gold": txinfo["asset-index"]} + +expected_mb = CONSENSUS_MIN_BALANCE + ASSET_MIN_BALANCE +expected_goal_mb += APP_MIN_BALANCE +assert_min_balance(goal, flo, expected_mb, expected_goal_mb) + + +# goal creates 2 assets +for total, unit, asset in [(1000, "oz", "Silver"), (100, "oz", "Platinum")]: + txinfo, err = goal.asset_create( + goal.account, + total=total, + unit_name=unit, + asset_name=asset, + manager=goal.account, + send=True, + ) + assets[asset] = txinfo["asset-index"] + assert not err, err + +expected_goal_mb += 2 * ASSET_MIN_BALANCE +assert_min_balance( + goal, + goal.account, + expected_goal_mb, + expected_goal_mb + APP_MIN_BALANCE, + goal_only=True, +) +expected_goal_mb += APP_MIN_BALANCE + +# joe opts into Gold and Silver: +txinfo, err = goal.axfer(joe, joe, 0, assets["Gold"], send=True) +txinfo, err = goal.axfer(joe, joe, 0, assets["Silver"], send=True) +assert not err, err + +expected_mb = CONSENSUS_MIN_BALANCE + 2 * ASSET_MIN_BALANCE +expected_goal_mb += APP_MIN_BALANCE +assert_min_balance(goal, joe, expected_mb, expected_goal_mb) + +# next, destroy Gold and Silver +txinfo, err = goal.acfg(flo, index=assets["Gold"], send=True) +assert not err, err +expected_mb = CONSENSUS_MIN_BALANCE +expected_goal_mb += APP_MIN_BALANCE +assert_min_balance(goal, flo, expected_mb, expected_goal_mb) + +txinfo, err = goal.acfg(goal.account, index=assets["Silver"], send=True) +assert not err, err +expected_goal_mb -= ASSET_MIN_BALANCE +assert_min_balance( + goal, + goal.account, + expected_goal_mb, + expected_goal_mb + APP_MIN_BALANCE, + goal_only=True, +) +expected_goal_mb += APP_MIN_BALANCE + + +# flo creates an app with 2 global schema ints, 10 global schema bytes, 1 extra page +txinfo, err = goal.app_create( + flo, + goal.assemble(TEAL), + local_schema=(2, 0), + global_schema=(0, 10), + extra_pages=1, + send=True, +) +assert not err, err +expected_mb = ( + CONSENSUS_MIN_BALANCE + + APP_MIN_BALANCE + # Not these local var requirements because not opting in + # + 2 * APP_KV_MIN_BALANCE + # + 2 * APP_INTS_MIN_BALANCE + + 10 * APP_KV_MIN_BALANCE + + 10 * APP_BYTES_MIN_BALANCE + + EXTRA_PAGE_MIN_BALANCE +) +expected_goal_mb += APP_MIN_BALANCE +assert_min_balance(goal, flo, expected_mb, expected_goal_mb) + +stamp = datetime.now().strftime("%Y%m%d_%H%M%S") +print(f"Running {SCRIPT} inside {CWD} @ {stamp}") diff --git a/test/scripts/e2e_subs/min_balance.sh b/test/scripts/e2e_subs/min_balance.sh new file mode 100755 index 0000000000..94a961a81b --- /dev/null +++ b/test/scripts/e2e_subs/min_balance.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +set -e +set -x +set -o pipefail +export SHELLOPTS + +WALLET=$1 + +echo "NETDIR=$NETDIR" + +# Directory of this bash program +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" + +echo "DIR=$DIR" + + +gcmd="goal -w ${WALLET}" + +ACCOUNT=$(${gcmd} account list|awk '{ print $3 }') + +echo `$gcmd account list` +echo $ACCOUNT + +echo `$gcmd account balance -a $ACCOUNT` + +echo `$gcmd account info -a $ACCOUNT` + +MINBAL=$(${gcmd} account info -a ${ACCOUNT}|grep 'Minimum Balance:'| awk '{ print $3 }') + +echo "Minimum Balance --> $MINBAL" + +EXPECTED="100000" +if [[ ${MINBAL} != ${EXPECTED} ]]; then + date '+min_balance FAIL goal account info should return expected Minimum Ballance %Y%m%d_%H%M%S' + false +fi + +# see ./min_balance.py for more complicated scenarios diff --git a/test/scripts/e2e_subs/tealprogs/app-abi-method-example.teal b/test/scripts/e2e_subs/tealprogs/app-abi-method-example.teal index dbc831d7a7..83c4f0fdd8 100644 --- a/test/scripts/e2e_subs/tealprogs/app-abi-method-example.teal +++ b/test/scripts/e2e_subs/tealprogs/app-abi-method-example.teal @@ -1,9 +1,17 @@ -// generated from https://gist.github.com/jasonpaulos/99e4f8a75f2fc2ec9b8073c064530359 +// generated from https://gist.github.com/jasonpaulos/99e4f8a75f2fc2ec9b8073c064530359/b4d37519ccc67383042b6c0fb8b7b26a2e538738 #pragma version 5 txn ApplicationID int 0 == -bnz main_l14 +bnz main_l18 +txn OnCompletion +int UpdateApplication +== +txna ApplicationArgs 0 +byte 0xa0e81872 +== +&& +bnz main_l17 txn OnCompletion int OptIn == @@ -11,7 +19,7 @@ txna ApplicationArgs 0 byte 0xcfa68e36 == && -bnz main_l13 +bnz main_l16 txn OnCompletion int CloseOut == @@ -19,7 +27,7 @@ txna ApplicationArgs 0 byte 0xa9f42b3d == && -bnz main_l12 +bnz main_l15 txn OnCompletion int DeleteApplication == @@ -27,7 +35,7 @@ txna ApplicationArgs 0 byte 0x24378d3c == && -bnz main_l11 +bnz main_l14 txn OnCompletion int NoOp == @@ -35,7 +43,7 @@ txna ApplicationArgs 0 byte 0xfe6bdf69 == && -bnz main_l10 +bnz main_l13 txn OnCompletion int NoOp == @@ -43,7 +51,7 @@ txna ApplicationArgs 0 byte 0xa88c26a5 == && -bnz main_l9 +bnz main_l12 txn OnCompletion int NoOp == @@ -51,45 +59,96 @@ txna ApplicationArgs 0 byte 0x3e3b3d28 == && -bnz main_l8 +bnz main_l11 +txn OnCompletion +int NoOp +== +txna ApplicationArgs 0 +byte 0x0df0050f +== +&& +bnz main_l10 int 0 return -main_l8: -txna ApplicationArgs 1 -callsub sub5 -int 1 -return -main_l9: -callsub sub4 -int 1 -return main_l10: txna ApplicationArgs 1 txna ApplicationArgs 2 -callsub sub3 +txna ApplicationArgs 3 +txna ApplicationArgs 4 +txna ApplicationArgs 5 +txna ApplicationArgs 6 +txna ApplicationArgs 7 +txna ApplicationArgs 8 +txna ApplicationArgs 9 +callsub sub8 int 1 return main_l11: -callsub sub2 +txna ApplicationArgs 1 +callsub sub7 int 1 return main_l12: -callsub sub1 +callsub sub6 int 1 return main_l13: txna ApplicationArgs 1 -callsub sub0 +txna ApplicationArgs 2 +callsub sub5 int 1 return main_l14: +callsub sub4 +int 1 +return +main_l15: +callsub sub3 +int 1 +return +main_l16: +txna ApplicationArgs 1 +callsub sub2 +int 1 +return +main_l17: +callsub sub1 +int 1 +return +main_l18: +txn NumAppArgs +int 0 +> +bnz main_l20 +main_l19: int 1 return -sub0: // optIn +main_l20: +txna ApplicationArgs 0 +byte 0x43464101 +== +assert +txna ApplicationArgs 1 +callsub sub0 +b main_l19 +sub0: // create store 0 +byte 0x151f7c75 +load 0 +btoi +int 2 +* +itob +concat +log +retsub +sub1: // update +retsub +sub2: // optIn +store 1 int 0 byte "name" -load 0 +load 1 extract 2 0 app_local_put byte "hello " @@ -97,59 +156,59 @@ int 0 byte "name" app_local_get concat -store 1 +store 2 byte 0x151f7c75 -load 1 +load 2 len itob extract 6 2 concat -load 1 +load 2 concat log retsub -sub1: // closeOut +sub3: // closeOut byte "goodbye " int 0 byte "name" app_local_get concat -store 2 +store 3 byte 0x151f7c75 -load 2 +load 3 len itob extract 6 2 concat -load 2 +load 3 concat log retsub -sub2: // deleteApp +sub4: // deleteApp txn Sender global CreatorAddress == assert retsub -sub3: // add +sub5: // add +store 5 store 4 -store 3 byte 0x151f7c75 -load 3 -btoi load 4 btoi +load 5 +btoi + itob concat log retsub -sub4: // empty +sub6: // empty byte "random inconsequential log" log retsub -sub5: // payment -store 5 +sub7: // payment +store 6 txn GroupIndex int 1 - @@ -162,15 +221,46 @@ txn GroupIndex int 1 - gtxns Amount -load 5 +load 6 btoi == -bnz sub5_l2 +bnz sub7_l2 byte 0x00 -b sub5_l3 -sub5_l2: +b sub7_l3 +sub7_l2: byte 0x80 -sub5_l3: +sub7_l3: +concat +log +retsub +sub8: // referenceTest +store 15 +store 14 +store 13 +store 12 +store 11 +store 10 +store 9 +store 8 +store 7 +byte 0x151f7c75 +load 7 +concat +load 9 +concat +load 11 +concat +load 8 +concat +load 14 +concat +load 15 +concat +load 10 +concat +load 12 +concat +load 13 concat log retsub diff --git a/test/testdata/configs/config-v20.json b/test/testdata/configs/config-v20.json new file mode 100644 index 0000000000..17cbfd974f --- /dev/null +++ b/test/testdata/configs/config-v20.json @@ -0,0 +1,100 @@ +{ + "Version": 20, + "AccountUpdatesStatsInterval": 5000000000, + "AccountsRebuildSynchronousMode": 1, + "AnnounceParticipationKey": true, + "Archival": false, + "BaseLoggerDebugLevel": 4, + "BlockServiceCustomFallbackEndpoints": "", + "BroadcastConnectionsLimit": -1, + "CadaverSizeTarget": 1073741824, + "CatchpointFileHistoryLength": 365, + "CatchpointInterval": 10000, + "CatchpointTracking": 0, + "CatchupBlockDownloadRetryAttempts": 1000, + "CatchupBlockValidateMode": 0, + "CatchupFailurePeerRefreshRate": 10, + "CatchupGossipBlockFetchTimeoutSec": 4, + "CatchupHTTPBlockFetchTimeoutSec": 4, + "CatchupLedgerDownloadRetryAttempts": 50, + "CatchupParallelBlocks": 16, + "ConnectionsRateLimitingCount": 60, + "ConnectionsRateLimitingWindowSeconds": 1, + "DNSBootstrapID": ".algorand.network", + "DNSSecurityFlags": 1, + "DeadlockDetection": 0, + "DeadlockDetectionThreshold": 30, + "DisableLocalhostConnectionRateLimit": true, + "DisableNetworking": false, + "DisableOutgoingConnectionThrottling": false, + "EnableAccountUpdatesStats": false, + "EnableAgreementReporting": false, + "EnableAgreementTimeMetrics": false, + "EnableAssembleStats": false, + "EnableBlockService": false, + "EnableBlockServiceFallbackToArchiver": true, + "EnableCatchupFromArchiveServers": false, + "EnableDeveloperAPI": false, + "EnableGossipBlockService": true, + "EnableIncomingMessageFilter": false, + "EnableLedgerService": false, + "EnableMetricReporting": false, + "EnableOutgoingNetworkMessageFiltering": true, + "EnablePingHandler": true, + "EnableProcessBlockStats": false, + "EnableProfiler": false, + "EnableRequestLogger": false, + "EnableTopAccountsReporting": false, + "EnableVerbosedTransactionSyncLogging": false, + "EndpointAddress": "127.0.0.1:0", + "FallbackDNSResolverAddress": "", + "ForceFetchTransactions": false, + "ForceRelayMessages": false, + "GossipFanout": 4, + "IncomingConnectionsLimit": 800, + "IncomingMessageFilterBucketCount": 5, + "IncomingMessageFilterBucketSize": 512, + "IsIndexerActive": false, + "LedgerSynchronousMode": 2, + "LogArchiveMaxAge": "", + "LogArchiveName": "node.archive.log", + "LogSizeLimit": 1073741824, + "MaxCatchpointDownloadDuration": 7200000000000, + "MaxConnectionsPerIP": 30, + "MinCatchpointFileDownloadBytesPerSecond": 20480, + "NetAddress": "", + "NetworkMessageTraceServer": "", + "NetworkProtocolVersion": "", + "NodeExporterListenAddress": ":9100", + "NodeExporterPath": "./node_exporter", + "OptimizeAccountsDatabaseOnStartup": false, + "OutgoingMessageFilterBucketCount": 3, + "OutgoingMessageFilterBucketSize": 128, + "ParticipationKeysRefreshInterval": 60000000000, + "PeerConnectionsUpdateInterval": 3600, + "PeerPingPeriodSeconds": 0, + "PriorityPeers": {}, + "ProposalAssemblyTime": 250000000, + "PublicAddress": "", + "ReconnectTime": 60000000000, + "ReservedFDs": 256, + "RestConnectionsHardLimit": 2048, + "RestConnectionsSoftLimit": 1024, + "RestReadTimeoutSeconds": 15, + "RestWriteTimeoutSeconds": 120, + "RunHosted": false, + "SuggestedFeeBlockHistory": 3, + "SuggestedFeeSlidingWindowSize": 50, + "TLSCertFile": "", + "TLSKeyFile": "", + "TelemetryToLog": true, + "TransactionSyncDataExchangeRate": 0, + "TransactionSyncSignificantMessageThreshold": 0, + "TxPoolExponentialIncreaseFactor": 2, + "TxPoolSize": 15000, + "TxSyncIntervalSeconds": 60, + "TxSyncServeResponseSize": 1000000, + "TxSyncTimeoutSeconds": 30, + "UseXForwardedForAddressField": "", + "VerifiedTranscationsCacheSize": 30000 +} diff --git a/test/testdata/consensus/catchpointtestingprotocol.json b/test/testdata/consensus/catchpointtestingprotocol.json index 25ad217e24..a006e7d96b 100644 --- a/test/testdata/consensus/catchpointtestingprotocol.json +++ b/test/testdata/consensus/catchpointtestingprotocol.json @@ -36,7 +36,6 @@ "AgreementFilterTimeout": 1000000000, "AgreementFilterTimeoutPeriod0": 1000000000, "FastRecoveryLambda": 300000000000, - "FastPartitionRecovery": true, "PaysetCommit": 1, "MaxTimestampIncrement": 25, "SupportSignedTxnInBlock": true, diff --git a/test/testdata/deployednettemplates/generate-recipe/generate_network.py b/test/testdata/deployednettemplates/generate-recipe/generate_network.py index 0804f7d96c..aeeef43841 100755 --- a/test/testdata/deployednettemplates/generate-recipe/generate_network.py +++ b/test/testdata/deployednettemplates/generate-recipe/generate_network.py @@ -25,7 +25,7 @@ def build_network(template): netgoal_params = build_netgoal_params(template_dict) build_net(template_path, netgoal_params) - build_genesis(template_path, netgoal_params) + build_genesis(template_path, netgoal_params, template_dict) def build_netgoal_params(template_dict): instances = template_dict['instances'] @@ -38,7 +38,6 @@ def build_netgoal_params(template_dict): relay_count += getInstanceCount(instances['relays'], group['percent']['relays']) participating_node_count += getInstanceCount(instances['participatingNodes'], group['percent']['participatingNodes']) non_participating_node_count += getInstanceCount(instances['nonParticipatingNodes'], group['percent']['nonParticipatingNodes']) - relay_config = instances['relays']['config'] participating_node_config = instances['participatingNodes']['config'] @@ -66,13 +65,22 @@ def build_net(template_path, netgoal_params): args.extend(netgoal_params) netgoal(args, template_path) -def build_genesis(template_path, netgoal_params): +def build_genesis(template_path, netgoal_params, template_dict): args = [ '-t', 'genesis', '-o', f"{template_path}/generated/genesis.json" ] args.extend(netgoal_params) netgoal(args, template_path) + if template_dict['network']['ConsensusProtocol']: + updateProtocol(f"{template_path}/generated/genesis.json", template_dict['network']['ConsensusProtocol']) + +def updateProtocol(genesis_path, consensus_protocol): + with open(genesis_path, 'r') as genfile: + genjson = json.load(genfile) + genjson["ConsensusProtocol"] = consensus_protocol + with open(genesis_path, 'w') as genfile: + json.dump(genjson, genfile, indent="\t") def netgoal(args, template_path='.'): cmd = [ diff --git a/test/testdata/deployednettemplates/recipes/custom/README.md b/test/testdata/deployednettemplates/recipes/custom/README.md new file mode 100644 index 0000000000..78c0d3330e --- /dev/null +++ b/test/testdata/deployednettemplates/recipes/custom/README.md @@ -0,0 +1,84 @@ +# Custom Recipe +This custom recipe serves as a template for performance testing on algonet (new network on AWS EC2 machines). With this recipe, you can modify the number of nodes, the type of machines, introduce new parameters to modify the network's configs and consensus parameters. + +N = participating Nodes +NPN = Non-Participating Nodes +R = relays + +## Running a Small Network (less than 20 total nodes) +If you are running a network with less than 20 nodes, then you will need to update the default "FractionApply" +1. Modify `configs/node.json` folder + - `"FractionApply"` in configs/node.json represents the number of nodes to report to telemetry. We don't want to overwhelm the telemetry server, so use something small like "0.2" on a large network. + - For small networks, update this value to "1.0" + +## Quick Start - Jenkins +Build and create the recipe. +- (See the first section above for small networks.) +1. Modify the `network_templates/network-tpl.json` file. +2. Select "custom" recipe +3. Specify `network-tpl.json` as the `CUSTOM_NETWORK_TEMPLATE` +- See Modify consensus values (below) to update consensus +- See Update config.json (below) to update config.json + +## "Quick" Start - Manual recipe generation (not using Jenkins) +Generate the recipe with the `network-tpl.json` file +- (See the first section above for small networks.) +1. Make sure you're in the same directory as this README and `cp network_templates/network-tpl.json network-tpl.json` +2. Generate the recipe with a python script: +``` +cd go-algorand +python3 test/testdata/deployednettemplates/generate-recipe/generate_network.py -f test/testdata/deployednettemplates/recipes/custom/network-tpl.json +``` +3. This will create a new set of files in the `generated` folder + +## Network Templates +With the custom recipe, you can store multiple network templates in the network_templates directory. +Variables to modify: +- `wallets`: Number of wallets used by N +- `nodes`: Number of N +- `ConsensusProtocol`: ConsensusProtocol used for the genesis +- `type`: machine sizes. For `us-east-2`, you can use `m5d.4xl` for most testing. If you need more powerful compute (make sure you get approval because it can get costly) use `c4d.4xl` or `c4d.18xl` +- `count`: Number of machines per type +- `percent`: percentage of machines in group to dedicate to certain types of nodes. + +## Modify consensus values +If you add a `consensus.json` file in this folder with the protocol matching the one in `network-tpl.json`, the `consensus.json` will merge with a generated_consensus.json template on Jenkins. +- see `example/consensus.json` + +### How is consensus updated in Jenkins? +- In Jenkins, this will be generated via `goal protocols > generated_consensus.json` +- This means that you do not have to provide the whole `consensus.json` in this folder, but only the values you wish to update. +- If you are spinning up a network manually and wish to update a network with `consensus.json`, you must have all of the existing keys for the particular protocol in your consensus.json. + +## Update config.json in the network +If you look at the files in the "configs" folder, you will see `node.json`, `nonPartNode.json`, and `relay.json`. These jsons already have a `ConfigJSONOverride` parameter which will generate a config.json in the node's data directories. For testing, if you want to update all three types of nodes at once, you can save a `config.json` file here. +1. copy and paste something like this into a json file and save into `config_jsons`: +``` +{ + "ProposalAssemblyTime": 250000000, + "TxPoolSize": 20000 +} +``` +This file will merge with the config.json created by `ConfigJSONOverride` and update the parameters if the keys match. This will be applied to participating nodes, nonParticipating Nodes, and relays. + +See `example/config_jsons` for an example of what it should look like. + +Most parameters that can be modified by config.json can be found in `go-algorand/config/local_defaults.go`. + +## Troubleshooting +### Can't find netgoal +- Make sure you have netgoal installed +- Make sure you export GOBIN and GOPATH in your environment and add it to your path. +On a mac, update by editing `~/.zshrc`, add +``` +export GOBIN=/Users/{user}/go/bin + +export GOPATH=/Users/{user}/go +export PATH=$PATH:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/ec2-user/Library/Python/3.8/bin:/usr/local/go/bin:$GOBIN:$GOPATH + +``` +### Machine Type doesn't exist +- Make sure the machine type exists. It uses the regions in the groups and the type to come up with the host template name in `test/testdata/deployednettemplates/hosttemplates/hosttemplates.json`. If it doesn't exist, you will have to add it to that file. + +### couldn't initialize the node: unsupported protocol +- check your consensus.json. It may be missing the keys in the future protocol if you are doing this manually. Compare the consensus.json with `goal protocols > generated_consensus.json` \ No newline at end of file diff --git a/test/testdata/deployednettemplates/recipes/custom/configs/node.json b/test/testdata/deployednettemplates/recipes/custom/configs/node.json new file mode 100644 index 0000000000..4cfd52b5c8 --- /dev/null +++ b/test/testdata/deployednettemplates/recipes/custom/configs/node.json @@ -0,0 +1,24 @@ +{ + "APIEndpoint": "{{APIEndpoint}}", + "APIToken": "{{APIToken}}", + "EnableBlockStats": false, + "EnableTelemetry": false, + "TelemetryURI": "{{TelemetryURI}}", + "EnableMetrics": false, + "MetricsURI": "{{MetricsURI}}", + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0 }", + "AltConfigs": [ + { + "APIEndpoint": "{{APIEndpoint}}", + "APIToken": "{{APIToken}}", + "EnableBlockStats": true, + "EnableTelemetry": true, + "TelemetryURI": "{{TelemetryURI}}", + "EnableMetrics": true, + "MetricsURI": "{{MetricsURI}}", + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0 }", + "FractionApply": 1.0 + } + ] +} + diff --git a/test/testdata/deployednettemplates/recipes/custom/configs/nonPartNode.json b/test/testdata/deployednettemplates/recipes/custom/configs/nonPartNode.json new file mode 100644 index 0000000000..5b0a52d9d9 --- /dev/null +++ b/test/testdata/deployednettemplates/recipes/custom/configs/nonPartNode.json @@ -0,0 +1,5 @@ +{ + "APIEndpoint": "{{APIEndpoint}}", + "APIToken": "{{APIToken}}", + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4, \"CadaverSizeTarget\": 0 }" +} diff --git a/test/testdata/deployednettemplates/recipes/custom/configs/relay.json b/test/testdata/deployednettemplates/recipes/custom/configs/relay.json new file mode 100644 index 0000000000..25bb6b5a26 --- /dev/null +++ b/test/testdata/deployednettemplates/recipes/custom/configs/relay.json @@ -0,0 +1,11 @@ +{ + "NetAddress": "{{NetworkPort}}", + "APIEndpoint": "{{APIEndpoint}}", + "APIToken": "{{APIToken}}", + "EnableBlockStats": true, + "EnableTelemetry": true, + "TelemetryURI": "{{TelemetryURI}}", + "EnableMetrics": true, + "MetricsURI": "{{MetricsURI}}", + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }" +} diff --git a/test/testdata/deployednettemplates/recipes/custom/example/README.md b/test/testdata/deployednettemplates/recipes/custom/example/README.md new file mode 100644 index 0000000000..3af532533e --- /dev/null +++ b/test/testdata/deployednettemplates/recipes/custom/example/README.md @@ -0,0 +1,12 @@ +# Example for custom recipe +Feel free to copy over and replace custom recipe with the contents in this folder or read the descriptions below. + +## config_jsons +example of config.json that you can include. The `custom/config_jsons` folder has a README with more information. + +## netowrk_templates +Shows that you can have more than one network template in the custom recipe. You can specify the template in the Jenkins Pipeline. + +## consensus.json +An example of the consensus.json that you can copy into the custom folder to update the "future" protocol. + diff --git a/test/testdata/deployednettemplates/recipes/custom/example/config_jsons/config.json b/test/testdata/deployednettemplates/recipes/custom/example/config_jsons/config.json new file mode 100644 index 0000000000..1fe1bd252c --- /dev/null +++ b/test/testdata/deployednettemplates/recipes/custom/example/config_jsons/config.json @@ -0,0 +1,4 @@ +{ + "ProposalAssemblyTime": 250000000, + "TxPoolSize": 20000 +} \ No newline at end of file diff --git a/test/testdata/deployednettemplates/recipes/custom/example/configs/node.json b/test/testdata/deployednettemplates/recipes/custom/example/configs/node.json new file mode 100644 index 0000000000..a61c7506d5 --- /dev/null +++ b/test/testdata/deployednettemplates/recipes/custom/example/configs/node.json @@ -0,0 +1,22 @@ +{ + "APIToken": "{{APIToken}}", + "EnableBlockStats": false, + "EnableTelemetry": false, + "TelemetryURI": "{{TelemetryURI}}", + "EnableMetrics": false, + "MetricsURI": "{{MetricsURI}}", + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0 }", + "AltConfigs": [ + { + "APIToken": "{{APIToken}}", + "EnableBlockStats": true, + "EnableTelemetry": true, + "TelemetryURI": "{{TelemetryURI}}", + "EnableMetrics": true, + "MetricsURI": "{{MetricsURI}}", + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0 }", + "FractionApply": 1.0 + } + ] +} + diff --git a/test/testdata/deployednettemplates/recipes/custom/example/configs/nonPartNode.json b/test/testdata/deployednettemplates/recipes/custom/example/configs/nonPartNode.json new file mode 100644 index 0000000000..5b0a52d9d9 --- /dev/null +++ b/test/testdata/deployednettemplates/recipes/custom/example/configs/nonPartNode.json @@ -0,0 +1,5 @@ +{ + "APIEndpoint": "{{APIEndpoint}}", + "APIToken": "{{APIToken}}", + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4, \"CadaverSizeTarget\": 0 }" +} diff --git a/test/testdata/deployednettemplates/recipes/custom/example/configs/relay.json b/test/testdata/deployednettemplates/recipes/custom/example/configs/relay.json new file mode 100644 index 0000000000..25bb6b5a26 --- /dev/null +++ b/test/testdata/deployednettemplates/recipes/custom/example/configs/relay.json @@ -0,0 +1,11 @@ +{ + "NetAddress": "{{NetworkPort}}", + "APIEndpoint": "{{APIEndpoint}}", + "APIToken": "{{APIToken}}", + "EnableBlockStats": true, + "EnableTelemetry": true, + "TelemetryURI": "{{TelemetryURI}}", + "EnableMetrics": true, + "MetricsURI": "{{MetricsURI}}", + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true }" +} diff --git a/test/testdata/deployednettemplates/recipes/custom/example/consensus.json b/test/testdata/deployednettemplates/recipes/custom/example/consensus.json new file mode 100644 index 0000000000..71512af006 --- /dev/null +++ b/test/testdata/deployednettemplates/recipes/custom/example/consensus.json @@ -0,0 +1,6 @@ +{ + "future": { + "AgreementFilterTimeoutPeriod0": 4000000001, + "MaxTxnBytesPerBlock": 1100001 + } +} \ No newline at end of file diff --git a/test/testdata/deployednettemplates/recipes/custom/example/network_templates/c5dmachines.json b/test/testdata/deployednettemplates/recipes/custom/example/network_templates/c5dmachines.json new file mode 100644 index 0000000000..1f6a8b2fba --- /dev/null +++ b/test/testdata/deployednettemplates/recipes/custom/example/network_templates/c5dmachines.json @@ -0,0 +1,44 @@ +{ + "network": { + "wallets": 6, + "nodes": 3, + "ConsensusProtocol": "future" + }, + "instances": { + "relays": { + "config": "./configs/relay.json", + "type": "c5d.4xl", + "count": 1 + }, + "participatingNodes": { + "config": "./configs/node.json", + "type": "c5d.4xl", + "count": 3 + }, + "nonParticipatingNodes": { + "config": "./configs/nonPartNode.json", + "type": "c5d.4xl", + "count": 5 + } + }, + "groups": [ + { + "name": "us-r", + "percent": { + "relays": 100, + "participatingNodes": 0, + "nonParticipatingNodes": 0 + }, + "region": "us-east-2" + }, + { + "name": "us-n", + "percent": { + "relays": 0, + "participatingNodes": 100, + "nonParticipatingNodes": 100 + }, + "region": "us-east-2" + } + ] +} diff --git a/test/testdata/deployednettemplates/recipes/custom/example/network_templates/network-tpl.json b/test/testdata/deployednettemplates/recipes/custom/example/network_templates/network-tpl.json new file mode 100644 index 0000000000..5bc36419d1 --- /dev/null +++ b/test/testdata/deployednettemplates/recipes/custom/example/network_templates/network-tpl.json @@ -0,0 +1,44 @@ +{ + "network": { + "wallets": 6, + "nodes": 3, + "ConsensusProtocol": "future" + }, + "instances": { + "relays": { + "config": "./configs/relay.json", + "type": "m5d.4xl", + "count": 1 + }, + "participatingNodes": { + "config": "./configs/node.json", + "type": "m5d.4xl", + "count": 3 + }, + "nonParticipatingNodes": { + "config": "./configs/nonPartNode.json", + "type": "m5d.4xl", + "count": 5 + } + }, + "groups": [ + { + "name": "us-r", + "percent": { + "relays": 100, + "participatingNodes": 0, + "nonParticipatingNodes": 0 + }, + "region": "us-east-2" + }, + { + "name": "us-n", + "percent": { + "relays": 0, + "participatingNodes": 100, + "nonParticipatingNodes": 100 + }, + "region": "us-east-2" + } + ] +} diff --git a/test/testdata/deployednettemplates/recipes/custom/network_templates/network-tpl.json b/test/testdata/deployednettemplates/recipes/custom/network_templates/network-tpl.json new file mode 100644 index 0000000000..5bc36419d1 --- /dev/null +++ b/test/testdata/deployednettemplates/recipes/custom/network_templates/network-tpl.json @@ -0,0 +1,44 @@ +{ + "network": { + "wallets": 6, + "nodes": 3, + "ConsensusProtocol": "future" + }, + "instances": { + "relays": { + "config": "./configs/relay.json", + "type": "m5d.4xl", + "count": 1 + }, + "participatingNodes": { + "config": "./configs/node.json", + "type": "m5d.4xl", + "count": 3 + }, + "nonParticipatingNodes": { + "config": "./configs/nonPartNode.json", + "type": "m5d.4xl", + "count": 5 + } + }, + "groups": [ + { + "name": "us-r", + "percent": { + "relays": 100, + "participatingNodes": 0, + "nonParticipatingNodes": 0 + }, + "region": "us-east-2" + }, + { + "name": "us-n", + "percent": { + "relays": 0, + "participatingNodes": 100, + "nonParticipatingNodes": 100 + }, + "region": "us-east-2" + } + ] +} diff --git a/test/testdata/deployednettemplates/recipes/feature-networks/genesis.json b/test/testdata/deployednettemplates/recipes/feature-networks/genesis.json new file mode 100644 index 0000000000..55b7289210 --- /dev/null +++ b/test/testdata/deployednettemplates/recipes/feature-networks/genesis.json @@ -0,0 +1,29 @@ +{ + "NetworkName": "", + "VersionModifier": "", + "ConsensusProtocol": "future", + "FirstPartKeyRound": 0, + "LastPartKeyRound": 3000000, + "Wallets": [ + { + "Name": "Wallet1-R1", + "Stake": 25, + "Online": true + }, + { + "Name": "Wallet2-R2", + "Stake": 25, + "Online": true + }, + { + "Name": "Wallet3-Dispenser", + "Stake": 40, + "Online": false + }, + { + "Name": "Wallet4-NPN1", + "Stake": 10, + "Online": false + } + ] +} diff --git a/test/testdata/deployednettemplates/recipes/feature-networks/hosttemplates.json b/test/testdata/deployednettemplates/recipes/feature-networks/hosttemplates.json new file mode 100644 index 0000000000..c8c8642a24 --- /dev/null +++ b/test/testdata/deployednettemplates/recipes/feature-networks/hosttemplates.json @@ -0,0 +1,10 @@ +{ + "Hosts": [ + { + "Name": "AWS-US-EAST-2-Large", + "Provider": "AWS", + "Region": "us-east-2", + "BaseConfiguration": "m6i.large" + } + ] +} diff --git a/test/testdata/deployednettemplates/recipes/feature-networks/net.json b/test/testdata/deployednettemplates/recipes/feature-networks/net.json new file mode 100644 index 0000000000..1152ece4a9 --- /dev/null +++ b/test/testdata/deployednettemplates/recipes/feature-networks/net.json @@ -0,0 +1,83 @@ +{ + "Hosts": [ + { + "Name": "R1", + "Nodes": [ + { + "Name": "relay1", + "IsRelay": true, + "Wallets": [ + { + "Name": "Wallet1-R1", + "ParticipationOnly": false + }, + { + "Name": "Wallet3-Dispenser", + "ParticipationOnly": false + } + ], + "NetAddress": "{{NetworkPort}}", + "APIEndpoint": "{{APIEndpoint}}", + "APIToken": "{{APIToken}}", + "EnableTelemetry": true, + "TelemetryURI": "telemetry.feature-networks.algodev.network:9105", + "EnableMetrics": true, + "MetricsURI": "{{MetricsURI}}", + "EnableService": false, + "EnableBlockStats": true, + "ConfigJSONOverride": "{ \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true }" + } + ] + }, + { + "Name": "R2", + "Nodes": [ + { + "Name": "relay2", + "IsRelay": true, + "Wallets": [ + { + "Name": "Wallet2-R2", + "ParticipationOnly": false + } + ], + "NetAddress": "{{NetworkPort}}", + "APIEndpoint": "{{APIEndpoint}}", + "APIToken": "{{APIToken}}", + "EnableTelemetry": true, + "TelemetryURI": "telemetry.feature-networks.algodev.network:9105", + "EnableMetrics": true, + "MetricsURI": "{{MetricsURI}}", + "EnableService": false, + "EnableBlockStats": true, + "ConfigJSONOverride": "{ \"DNSBootstrapID\": \".algodev.network\",\"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true }" + } + ] + }, + { + "Name": "NPN1", + "Nodes": [ + { + "Name": "node1", + "IsRelay": false, + "Wallets": [ + { + "Name": "Wallet4-NPN1", + "ParticipationOnly": false + } + ], + "NetAddress": "{{NetworkPort}}", + "APIEndpoint": "{{APIEndpoint}}", + "APIToken": "{{APIToken}}", + "EnableTelemetry": true, + "TelemetryURI": "telemetry.feature-networks.algodev.network:9105", + "EnableMetrics": true, + "MetricsURI": "{{MetricsURI}}", + "EnableService": false, + "EnableBlockStats": true, + "ConfigJSONOverride": "{ \"DNSBootstrapID\": \".algodev.network\",\"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true }" + } + ] + } + ] +} diff --git a/test/testdata/deployednettemplates/recipes/feature-networks/recipe.json b/test/testdata/deployednettemplates/recipes/feature-networks/recipe.json new file mode 100644 index 0000000000..587e513f26 --- /dev/null +++ b/test/testdata/deployednettemplates/recipes/feature-networks/recipe.json @@ -0,0 +1,7 @@ +{ + "GenesisFile":"genesis.json", + "NetworkFile":"net.json", + "ConfigFile": "../../configs/reference.json", + "HostTemplatesFile": "hosttemplates.json", + "TopologyFile": "topology.json" +} diff --git a/test/testdata/deployednettemplates/recipes/feature-networks/topology.json b/test/testdata/deployednettemplates/recipes/feature-networks/topology.json new file mode 100644 index 0000000000..360c9d0d49 --- /dev/null +++ b/test/testdata/deployednettemplates/recipes/feature-networks/topology.json @@ -0,0 +1,16 @@ +{ + "Hosts": [ + { + "Name": "R1", + "Template": "AWS-US-EAST-2-Large" + }, + { + "Name": "R2", + "Template": "AWS-US-EAST-2-Large" + }, + { + "Name": "NPN1", + "Template": "AWS-US-EAST-2-Large" + } + ] +} diff --git a/test/testdata/deployednettemplates/recipes/hello-world/genesis.json b/test/testdata/deployednettemplates/recipes/hello-world/genesis.json index ac841670ca..218b694d5f 100644 --- a/test/testdata/deployednettemplates/recipes/hello-world/genesis.json +++ b/test/testdata/deployednettemplates/recipes/hello-world/genesis.json @@ -1,19 +1,30 @@ { "NetworkName": "", "VersionModifier": "", - "ConsensusProtocol": "", + "ConsensusProtocol": "future", "FirstPartKeyRound": 0, "LastPartKeyRound": 1000300, + "PartKeyDilution": 0, "Wallets": [ { "Name": "Wallet1", - "Stake": 50, + "Stake": 25, "Online": true }, { "Name": "Wallet2", - "Stake": 50, + "Stake": 25, "Online": true + }, + { + "Name": "Wallet3", + "Stake": 25, + "Online": true + }, + { + "Name": "Wallet4", + "Stake": 25, + "Online": false } ] } diff --git a/test/testdata/deployednettemplates/recipes/hello-world/net.json b/test/testdata/deployednettemplates/recipes/hello-world/net.json index 7d03c46692..08b885f178 100644 --- a/test/testdata/deployednettemplates/recipes/hello-world/net.json +++ b/test/testdata/deployednettemplates/recipes/hello-world/net.json @@ -49,6 +49,52 @@ "ConfigJSONOverride": "{ \"DNSBootstrapID\": \".algodev.network\",\"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true }" } ] + }, + { + "Name": "N1", + "Group": "", + "Nodes": [ + { + "Name": "node1", + "Wallets": [ + { + "Name": "Wallet3", + "ParticipationOnly": false + } + ], + "APIEndpoint": "{{APIEndpoint}}", + "APIToken": "{{APIToken}}", + "EnableTelemetry": false, + "TelemetryURI": "{{TelemetryURI}}", + "EnableMetrics": false, + "MetricsURI": "{{MetricsURI}}", + "EnableService": false, + "EnableBlockStats": false, + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + } + ] + }, + { + "Name": "NPN1", + "Group": "", + "Nodes": [ + { + "Name": "nonParticipatingNode1", + "Wallets": [ + { + "Name": "Wallet4", + "ParticipationOnly": false + } + ], + "APIEndpoint": "{{APIEndpoint}}", + "APIToken": "{{APIToken}}", + "EnableTelemetry": false, + "EnableMetrics": false, + "EnableService": false, + "EnableBlockStats": false, + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"BaseLoggerDebugLevel\": 4, \"CadaverSizeTarget\": 0 }" + } + ] } ] } diff --git a/test/testdata/deployednettemplates/recipes/hello-world/topology.json b/test/testdata/deployednettemplates/recipes/hello-world/topology.json index ef4f4ac8c6..acc7cca9ec 100644 --- a/test/testdata/deployednettemplates/recipes/hello-world/topology.json +++ b/test/testdata/deployednettemplates/recipes/hello-world/topology.json @@ -7,6 +7,14 @@ { "Name": "R2", "Template": "AWS-US-EAST-1-Small" + }, + { + "Name": "N1", + "Template": "AWS-US-EAST-1-Small" + }, + { + "Name": "NPN1", + "Template": "AWS-US-EAST-1-Small" } ] } diff --git a/test/testdata/deployednettemplates/recipes/scenario1/genesis.json b/test/testdata/deployednettemplates/recipes/scenario1/genesis.json index b376a492fc..09838853fc 100644 --- a/test/testdata/deployednettemplates/recipes/scenario1/genesis.json +++ b/test/testdata/deployednettemplates/recipes/scenario1/genesis.json @@ -1,564 +1,564 @@ { - "NetworkName": "", - "VersionModifier": "", - "ConsensusProtocol": "future", - "FirstPartKeyRound": 0, - "LastPartKeyRound": 3000000, - "PartKeyDilution": 0, - "Wallets": [ - { - "Name": "Wallet1", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet2", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet3", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet4", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet5", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet6", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet7", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet8", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet9", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet10", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet11", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet12", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet13", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet14", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet15", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet16", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet17", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet18", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet19", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet20", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet21", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet22", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet23", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet24", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet25", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet26", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet27", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet28", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet29", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet30", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet31", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet32", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet33", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet34", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet35", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet36", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet37", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet38", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet39", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet40", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet41", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet42", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet43", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet44", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet45", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet46", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet47", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet48", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet49", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet50", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet51", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet52", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet53", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet54", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet55", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet56", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet57", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet58", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet59", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet60", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet61", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet62", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet63", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet64", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet65", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet66", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet67", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet68", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet69", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet70", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet71", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet72", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet73", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet74", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet75", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet76", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet77", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet78", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet79", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet80", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet81", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet82", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet83", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet84", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet85", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet86", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet87", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet88", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet89", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet90", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet91", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet92", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet93", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet94", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet95", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet96", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet97", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet98", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet99", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet100", - "Stake": 0.5, - "Online": true - }, - { - "Name": "Wallet101", - "Stake": 5, - "Online": false - }, - { - "Name": "Wallet102", - "Stake": 5, - "Online": false - }, - { - "Name": "Wallet103", - "Stake": 5, - "Online": false - }, - { - "Name": "Wallet104", - "Stake": 5, - "Online": false - }, - { - "Name": "Wallet105", - "Stake": 5, - "Online": false - }, - { - "Name": "Wallet106", - "Stake": 5, - "Online": false - }, - { - "Name": "Wallet107", - "Stake": 5, - "Online": false - }, - { - "Name": "Wallet108", - "Stake": 5, - "Online": false - }, - { - "Name": "Wallet109", - "Stake": 5, - "Online": false - }, - { - "Name": "Wallet110", - "Stake": 5, - "Online": false - } - ], - "FeeSink": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ", - "RewardsPool": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ", - "DevMode": false, - "Comment": "" + "NetworkName": "", + "VersionModifier": "", + "ConsensusProtocol": "future", + "FirstPartKeyRound": 0, + "LastPartKeyRound": 50000, + "PartKeyDilution": 0, + "Wallets": [ + { + "Name": "Wallet1", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet2", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet3", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet4", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet5", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet6", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet7", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet8", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet9", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet10", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet11", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet12", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet13", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet14", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet15", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet16", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet17", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet18", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet19", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet20", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet21", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet22", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet23", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet24", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet25", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet26", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet27", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet28", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet29", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet30", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet31", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet32", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet33", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet34", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet35", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet36", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet37", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet38", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet39", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet40", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet41", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet42", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet43", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet44", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet45", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet46", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet47", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet48", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet49", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet50", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet51", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet52", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet53", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet54", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet55", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet56", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet57", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet58", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet59", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet60", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet61", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet62", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet63", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet64", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet65", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet66", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet67", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet68", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet69", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet70", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet71", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet72", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet73", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet74", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet75", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet76", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet77", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet78", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet79", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet80", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet81", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet82", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet83", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet84", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet85", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet86", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet87", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet88", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet89", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet90", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet91", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet92", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet93", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet94", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet95", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet96", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet97", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet98", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet99", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet100", + "Stake": 0.5, + "Online": true + }, + { + "Name": "Wallet101", + "Stake": 5, + "Online": false + }, + { + "Name": "Wallet102", + "Stake": 5, + "Online": false + }, + { + "Name": "Wallet103", + "Stake": 5, + "Online": false + }, + { + "Name": "Wallet104", + "Stake": 5, + "Online": false + }, + { + "Name": "Wallet105", + "Stake": 5, + "Online": false + }, + { + "Name": "Wallet106", + "Stake": 5, + "Online": false + }, + { + "Name": "Wallet107", + "Stake": 5, + "Online": false + }, + { + "Name": "Wallet108", + "Stake": 5, + "Online": false + }, + { + "Name": "Wallet109", + "Stake": 5, + "Online": false + }, + { + "Name": "Wallet110", + "Stake": 5, + "Online": false + } + ], + "FeeSink": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ", + "RewardsPool": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ", + "DevMode": false, + "Comment": "" } diff --git a/test/testdata/deployednettemplates/recipes/scenario2/genesis.json b/test/testdata/deployednettemplates/recipes/scenario2/genesis.json index 7c40b51487..cf68b6a7e3 100644 --- a/test/testdata/deployednettemplates/recipes/scenario2/genesis.json +++ b/test/testdata/deployednettemplates/recipes/scenario2/genesis.json @@ -1,2089 +1,2089 @@ { - "NetworkName": "", - "VersionModifier": "", - "ConsensusProtocol": "future", - "FirstPartKeyRound": 0, - "LastPartKeyRound": 3000000, - "PartKeyDilution": 0, - "Wallets": [ - { - "Name": "Wallet1", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet2", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet3", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet4", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet5", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet6", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet7", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet8", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet9", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet10", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet11", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet12", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet13", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet14", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet15", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet16", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet17", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet18", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet19", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet20", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet21", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet22", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet23", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet24", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet25", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet26", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet27", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet28", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet29", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet30", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet31", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet32", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet33", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet34", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet35", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet36", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet37", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet38", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet39", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet40", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet41", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet42", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet43", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet44", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet45", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet46", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet47", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet48", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet49", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet50", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet51", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet52", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet53", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet54", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet55", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet56", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet57", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet58", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet59", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet60", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet61", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet62", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet63", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet64", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet65", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet66", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet67", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet68", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet69", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet70", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet71", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet72", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet73", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet74", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet75", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet76", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet77", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet78", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet79", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet80", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet81", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet82", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet83", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet84", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet85", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet86", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet87", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet88", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet89", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet90", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet91", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet92", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet93", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet94", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet95", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet96", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet97", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet98", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet99", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet100", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet101", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet102", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet103", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet104", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet105", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet106", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet107", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet108", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet109", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet110", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet111", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet112", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet113", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet114", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet115", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet116", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet117", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet118", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet119", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet120", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet121", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet122", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet123", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet124", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet125", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet126", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet127", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet128", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet129", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet130", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet131", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet132", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet133", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet134", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet135", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet136", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet137", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet138", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet139", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet140", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet141", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet142", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet143", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet144", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet145", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet146", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet147", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet148", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet149", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet150", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet151", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet152", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet153", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet154", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet155", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet156", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet157", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet158", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet159", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet160", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet161", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet162", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet163", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet164", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet165", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet166", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet167", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet168", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet169", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet170", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet171", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet172", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet173", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet174", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet175", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet176", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet177", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet178", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet179", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet180", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet181", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet182", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet183", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet184", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet185", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet186", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet187", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet188", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet189", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet190", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet191", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet192", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet193", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet194", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet195", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet196", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet197", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet198", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet199", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet200", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet201", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet202", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet203", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet204", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet205", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet206", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet207", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet208", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet209", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet210", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet211", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet212", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet213", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet214", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet215", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet216", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet217", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet218", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet219", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet220", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet221", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet222", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet223", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet224", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet225", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet226", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet227", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet228", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet229", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet230", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet231", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet232", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet233", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet234", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet235", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet236", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet237", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet238", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet239", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet240", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet241", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet242", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet243", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet244", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet245", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet246", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet247", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet248", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet249", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet250", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet251", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet252", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet253", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet254", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet255", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet256", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet257", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet258", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet259", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet260", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet261", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet262", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet263", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet264", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet265", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet266", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet267", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet268", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet269", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet270", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet271", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet272", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet273", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet274", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet275", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet276", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet277", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet278", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet279", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet280", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet281", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet282", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet283", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet284", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet285", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet286", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet287", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet288", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet289", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet290", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet291", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet292", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet293", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet294", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet295", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet296", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet297", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet298", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet299", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet300", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet301", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet302", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet303", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet304", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet305", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet306", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet307", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet308", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet309", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet310", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet311", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet312", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet313", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet314", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet315", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet316", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet317", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet318", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet319", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet320", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet321", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet322", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet323", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet324", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet325", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet326", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet327", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet328", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet329", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet330", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet331", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet332", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet333", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet334", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet335", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet336", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet337", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet338", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet339", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet340", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet341", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet342", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet343", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet344", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet345", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet346", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet347", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet348", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet349", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet350", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet351", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet352", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet353", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet354", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet355", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet356", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet357", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet358", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet359", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet360", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet361", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet362", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet363", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet364", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet365", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet366", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet367", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet368", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet369", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet370", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet371", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet372", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet373", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet374", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet375", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet376", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet377", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet378", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet379", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet380", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet381", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet382", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet383", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet384", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet385", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet386", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet387", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet388", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet389", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet390", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet391", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet392", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet393", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet394", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet395", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet396", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet397", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet398", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet399", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet400", - "Stake": 0.125, - "Online": true - }, - { - "Name": "Wallet401", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet402", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet403", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet404", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet405", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet406", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet407", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet408", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet409", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet410", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet411", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet412", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet413", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet414", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet415", - "Stake": 3.3333333333333335, - "Online": false - } - ], - "FeeSink": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ", - "RewardsPool": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ", - "DevMode": false, - "Comment": "" + "NetworkName": "", + "VersionModifier": "", + "ConsensusProtocol": "future", + "FirstPartKeyRound": 0, + "LastPartKeyRound": 50000, + "PartKeyDilution": 0, + "Wallets": [ + { + "Name": "Wallet1", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet2", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet3", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet4", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet5", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet6", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet7", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet8", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet9", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet10", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet11", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet12", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet13", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet14", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet15", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet16", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet17", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet18", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet19", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet20", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet21", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet22", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet23", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet24", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet25", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet26", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet27", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet28", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet29", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet30", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet31", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet32", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet33", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet34", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet35", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet36", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet37", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet38", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet39", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet40", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet41", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet42", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet43", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet44", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet45", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet46", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet47", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet48", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet49", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet50", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet51", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet52", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet53", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet54", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet55", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet56", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet57", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet58", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet59", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet60", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet61", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet62", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet63", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet64", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet65", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet66", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet67", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet68", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet69", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet70", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet71", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet72", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet73", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet74", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet75", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet76", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet77", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet78", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet79", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet80", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet81", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet82", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet83", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet84", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet85", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet86", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet87", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet88", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet89", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet90", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet91", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet92", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet93", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet94", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet95", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet96", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet97", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet98", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet99", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet100", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet101", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet102", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet103", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet104", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet105", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet106", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet107", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet108", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet109", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet110", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet111", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet112", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet113", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet114", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet115", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet116", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet117", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet118", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet119", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet120", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet121", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet122", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet123", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet124", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet125", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet126", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet127", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet128", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet129", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet130", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet131", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet132", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet133", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet134", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet135", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet136", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet137", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet138", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet139", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet140", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet141", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet142", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet143", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet144", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet145", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet146", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet147", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet148", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet149", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet150", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet151", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet152", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet153", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet154", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet155", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet156", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet157", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet158", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet159", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet160", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet161", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet162", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet163", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet164", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet165", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet166", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet167", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet168", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet169", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet170", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet171", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet172", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet173", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet174", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet175", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet176", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet177", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet178", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet179", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet180", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet181", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet182", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet183", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet184", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet185", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet186", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet187", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet188", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet189", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet190", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet191", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet192", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet193", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet194", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet195", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet196", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet197", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet198", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet199", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet200", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet201", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet202", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet203", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet204", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet205", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet206", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet207", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet208", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet209", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet210", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet211", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet212", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet213", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet214", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet215", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet216", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet217", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet218", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet219", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet220", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet221", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet222", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet223", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet224", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet225", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet226", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet227", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet228", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet229", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet230", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet231", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet232", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet233", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet234", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet235", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet236", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet237", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet238", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet239", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet240", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet241", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet242", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet243", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet244", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet245", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet246", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet247", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet248", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet249", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet250", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet251", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet252", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet253", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet254", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet255", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet256", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet257", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet258", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet259", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet260", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet261", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet262", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet263", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet264", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet265", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet266", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet267", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet268", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet269", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet270", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet271", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet272", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet273", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet274", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet275", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet276", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet277", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet278", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet279", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet280", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet281", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet282", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet283", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet284", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet285", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet286", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet287", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet288", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet289", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet290", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet291", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet292", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet293", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet294", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet295", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet296", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet297", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet298", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet299", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet300", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet301", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet302", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet303", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet304", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet305", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet306", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet307", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet308", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet309", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet310", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet311", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet312", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet313", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet314", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet315", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet316", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet317", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet318", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet319", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet320", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet321", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet322", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet323", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet324", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet325", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet326", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet327", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet328", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet329", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet330", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet331", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet332", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet333", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet334", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet335", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet336", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet337", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet338", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet339", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet340", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet341", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet342", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet343", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet344", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet345", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet346", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet347", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet348", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet349", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet350", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet351", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet352", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet353", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet354", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet355", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet356", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet357", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet358", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet359", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet360", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet361", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet362", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet363", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet364", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet365", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet366", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet367", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet368", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet369", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet370", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet371", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet372", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet373", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet374", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet375", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet376", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet377", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet378", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet379", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet380", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet381", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet382", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet383", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet384", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet385", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet386", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet387", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet388", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet389", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet390", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet391", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet392", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet393", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet394", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet395", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet396", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet397", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet398", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet399", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet400", + "Stake": 0.125, + "Online": true + }, + { + "Name": "Wallet401", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet402", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet403", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet404", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet405", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet406", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet407", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet408", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet409", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet410", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet411", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet412", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet413", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet414", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet415", + "Stake": 3.3333333333333335, + "Online": false + } + ], + "FeeSink": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ", + "RewardsPool": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ", + "DevMode": false, + "Comment": "" } diff --git a/test/testdata/deployednettemplates/recipes/scenario2/net.json b/test/testdata/deployednettemplates/recipes/scenario2/net.json index e816dfd048..4c1c0d6c2b 100644 --- a/test/testdata/deployednettemplates/recipes/scenario2/net.json +++ b/test/testdata/deployednettemplates/recipes/scenario2/net.json @@ -416,6 +416,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -527,6 +528,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -638,6 +640,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -749,6 +752,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -860,6 +864,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -971,6 +976,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -1082,6 +1088,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -1193,6 +1200,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -1304,6 +1312,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -1415,6 +1424,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -1526,6 +1536,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -1637,6 +1648,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -1748,6 +1760,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -1859,6 +1872,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -1970,6 +1984,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -2081,6 +2096,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -2192,6 +2208,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -2303,6 +2320,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -2414,6 +2432,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -2525,6 +2544,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -2636,6 +2656,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -2747,6 +2768,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -2858,6 +2880,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -2969,6 +2992,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -3080,6 +3104,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -3191,6 +3216,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -3302,6 +3328,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -3413,6 +3440,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -3524,6 +3552,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -3635,6 +3664,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -3746,6 +3776,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -3857,6 +3888,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -3968,6 +4000,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -4079,6 +4112,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -4190,6 +4224,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -4301,6 +4336,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -4412,6 +4448,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -4523,6 +4560,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -4634,6 +4672,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", @@ -4745,6 +4784,7 @@ "ParticipationOnly": false } ], + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableTelemetry": true, "TelemetryURI": "{{TelemetryURI}}", diff --git a/test/testdata/deployednettemplates/recipes/scenario2/node.json b/test/testdata/deployednettemplates/recipes/scenario2/node.json index 3641b0f6d2..7b505bb212 100644 --- a/test/testdata/deployednettemplates/recipes/scenario2/node.json +++ b/test/testdata/deployednettemplates/recipes/scenario2/node.json @@ -1,4 +1,5 @@ { + "APIEndpoint": "{{APIEndpoint}}", "APIToken": "{{APIToken}}", "EnableBlockStats": true, "EnableTelemetry": true, diff --git a/test/testdata/deployednettemplates/recipes/scenario3/genesis.json b/test/testdata/deployednettemplates/recipes/scenario3/genesis.json index d4519dddcf..4a0c64bfcd 100644 --- a/test/testdata/deployednettemplates/recipes/scenario3/genesis.json +++ b/test/testdata/deployednettemplates/recipes/scenario3/genesis.json @@ -1,50089 +1,50089 @@ { - "NetworkName": "", - "VersionModifier": "", - "ConsensusProtocol": "future", - "FirstPartKeyRound": 0, - "LastPartKeyRound": 3000000, - "PartKeyDilution": 0, - "Wallets": [ - { - "Name": "Wallet1", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet10", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet11", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet12", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet13", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet14", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet15", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet16", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet17", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet18", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet19", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet20", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet21", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet22", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet23", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet24", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet25", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet26", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet27", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet28", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet29", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet30", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet31", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet32", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet33", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet34", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet35", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet36", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet37", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet38", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet39", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet40", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet41", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet42", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet43", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet44", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet45", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet46", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet47", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet48", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet49", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet50", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet51", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet52", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet53", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet54", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet55", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet56", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet57", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet58", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet59", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet60", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet61", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet62", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet63", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet64", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet65", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet66", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet67", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet68", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet69", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet70", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet71", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet72", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet73", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet74", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet75", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet76", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet77", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet78", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet79", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet80", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet81", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet82", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet83", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet84", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet85", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet86", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet87", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet88", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet89", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet90", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet91", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet92", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet93", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet94", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet95", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet96", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet97", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet98", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet99", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet100", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet101", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet102", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet103", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet104", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet105", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet106", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet107", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet108", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet109", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet110", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet111", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet112", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet113", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet114", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet115", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet116", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet117", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet118", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet119", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet120", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet121", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet122", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet123", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet124", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet125", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet126", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet127", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet128", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet129", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet130", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet131", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet132", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet133", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet134", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet135", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet136", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet137", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet138", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet139", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet140", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet141", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet142", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet143", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet144", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet145", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet146", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet147", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet148", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet149", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet150", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet151", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet152", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet153", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet154", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet155", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet156", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet157", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet158", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet159", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet160", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet161", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet162", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet163", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet164", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet165", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet166", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet167", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet168", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet169", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet170", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet171", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet172", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet173", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet174", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet175", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet176", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet177", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet178", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet179", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet180", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet181", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet182", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet183", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet184", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet185", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet186", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet187", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet188", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet189", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet190", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet191", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet192", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet193", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet194", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet195", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet196", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet197", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet198", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet199", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet200", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet201", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet202", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet203", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet204", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet205", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet206", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet207", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet208", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet209", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet210", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet211", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet212", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet213", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet214", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet215", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet216", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet217", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet218", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet219", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet220", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet221", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet222", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet223", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet224", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet225", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet226", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet227", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet228", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet229", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet230", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet231", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet232", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet233", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet234", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet235", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet236", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet237", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet238", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet239", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet240", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet241", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet242", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet243", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet244", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet245", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet246", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet247", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet248", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet249", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet250", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet251", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet252", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet253", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet254", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet255", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet256", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet257", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet258", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet259", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet260", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet261", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet262", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet263", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet264", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet265", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet266", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet267", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet268", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet269", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet270", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet271", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet272", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet273", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet274", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet275", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet276", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet277", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet278", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet279", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet280", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet281", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet282", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet283", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet284", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet285", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet286", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet287", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet288", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet289", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet290", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet291", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet292", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet293", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet294", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet295", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet296", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet297", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet298", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet299", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet300", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet301", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet302", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet303", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet304", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet305", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet306", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet307", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet308", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet309", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet310", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet311", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet312", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet313", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet314", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet315", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet316", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet317", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet318", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet319", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet320", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet321", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet322", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet323", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet324", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet325", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet326", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet327", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet328", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet329", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet330", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet331", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet332", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet333", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet334", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet335", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet336", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet337", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet338", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet339", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet340", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet341", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet342", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet343", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet344", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet345", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet346", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet347", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet348", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet349", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet350", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet351", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet352", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet353", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet354", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet355", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet356", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet357", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet358", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet359", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet360", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet361", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet362", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet363", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet364", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet365", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet366", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet367", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet368", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet369", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet370", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet371", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet372", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet373", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet374", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet375", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet376", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet377", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet378", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet379", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet380", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet381", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet382", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet383", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet384", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet385", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet386", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet387", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet388", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet389", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet390", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet391", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet392", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet393", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet394", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet395", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet396", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet397", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet398", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet399", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet400", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet401", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet402", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet403", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet404", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet405", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet406", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet407", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet408", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet409", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet410", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet411", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet412", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet413", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet414", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet415", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet416", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet417", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet418", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet419", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet420", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet421", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet422", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet423", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet424", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet425", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet426", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet427", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet428", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet429", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet430", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet431", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet432", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet433", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet434", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet435", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet436", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet437", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet438", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet439", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet440", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet441", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet442", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet443", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet444", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet445", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet446", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet447", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet448", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet449", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet450", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet451", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet452", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet453", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet454", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet455", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet456", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet457", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet458", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet459", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet460", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet461", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet462", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet463", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet464", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet465", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet466", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet467", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet468", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet469", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet470", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet471", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet472", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet473", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet474", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet475", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet476", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet477", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet478", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet479", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet480", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet481", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet482", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet483", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet484", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet485", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet486", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet487", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet488", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet489", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet490", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet491", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet492", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet493", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet494", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet495", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet496", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet497", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet498", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet499", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet500", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet501", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet502", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet503", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet504", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet505", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet506", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet507", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet508", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet509", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet510", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet511", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet512", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet513", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet514", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet515", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet516", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet517", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet518", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet519", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet520", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet521", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet522", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet523", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet524", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet525", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet526", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet527", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet528", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet529", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet530", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet531", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet532", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet533", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet534", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet535", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet536", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet537", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet538", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet539", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet540", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet541", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet542", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet543", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet544", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet545", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet546", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet547", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet548", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet549", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet550", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet551", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet552", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet553", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet554", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet555", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet556", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet557", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet558", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet559", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet560", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet561", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet562", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet563", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet564", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet565", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet566", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet567", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet568", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet569", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet570", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet571", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet572", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet573", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet574", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet575", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet576", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet577", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet578", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet579", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet580", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet581", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet582", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet583", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet584", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet585", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet586", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet587", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet588", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet589", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet590", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet591", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet592", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet593", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet594", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet595", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet596", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet597", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet598", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet599", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet600", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet601", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet602", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet603", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet604", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet605", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet606", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet607", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet608", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet609", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet610", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet611", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet612", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet613", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet614", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet615", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet616", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet617", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet618", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet619", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet620", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet621", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet622", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet623", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet624", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet625", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet626", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet627", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet628", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet629", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet630", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet631", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet632", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet633", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet634", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet635", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet636", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet637", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet638", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet639", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet640", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet641", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet642", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet643", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet644", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet645", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet646", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet647", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet648", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet649", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet650", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet651", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet652", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet653", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet654", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet655", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet656", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet657", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet658", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet659", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet660", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet661", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet662", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet663", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet664", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet665", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet666", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet667", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet668", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet669", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet670", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet671", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet672", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet673", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet674", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet675", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet676", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet677", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet678", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet679", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet680", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet681", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet682", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet683", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet684", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet685", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet686", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet687", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet688", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet689", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet690", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet691", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet692", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet693", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet694", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet695", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet696", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet697", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet698", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet699", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet700", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet701", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet702", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet703", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet704", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet705", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet706", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet707", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet708", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet709", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet710", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet711", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet712", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet713", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet714", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet715", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet716", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet717", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet718", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet719", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet720", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet721", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet722", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet723", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet724", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet725", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet726", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet727", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet728", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet729", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet730", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet731", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet732", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet733", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet734", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet735", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet736", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet737", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet738", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet739", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet740", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet741", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet742", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet743", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet744", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet745", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet746", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet747", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet748", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet749", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet750", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet751", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet752", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet753", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet754", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet755", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet756", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet757", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet758", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet759", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet760", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet761", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet762", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet763", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet764", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet765", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet766", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet767", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet768", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet769", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet770", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet771", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet772", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet773", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet774", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet775", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet776", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet777", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet778", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet779", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet780", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet781", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet782", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet783", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet784", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet785", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet786", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet787", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet788", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet789", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet790", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet791", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet792", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet793", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet794", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet795", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet796", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet797", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet798", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet799", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet800", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet801", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet802", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet803", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet804", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet805", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet806", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet807", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet808", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet809", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet810", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet811", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet812", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet813", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet814", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet815", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet816", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet817", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet818", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet819", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet820", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet821", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet822", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet823", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet824", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet825", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet826", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet827", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet828", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet829", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet830", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet831", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet832", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet833", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet834", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet835", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet836", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet837", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet838", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet839", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet840", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet841", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet842", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet843", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet844", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet845", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet846", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet847", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet848", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet849", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet850", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet851", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet852", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet853", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet854", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet855", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet856", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet857", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet858", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet859", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet860", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet861", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet862", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet863", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet864", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet865", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet866", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet867", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet868", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet869", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet870", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet871", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet872", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet873", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet874", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet875", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet876", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet877", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet878", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet879", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet880", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet881", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet882", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet883", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet884", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet885", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet886", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet887", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet888", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet889", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet890", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet891", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet892", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet893", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet894", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet895", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet896", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet897", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet898", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet899", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet900", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet901", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet902", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet903", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet904", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet905", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet906", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet907", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet908", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet909", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet910", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet911", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet912", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet913", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet914", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet915", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet916", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet917", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet918", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet919", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet920", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet921", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet922", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet923", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet924", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet925", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet926", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet927", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet928", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet929", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet930", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet931", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet932", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet933", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet934", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet935", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet936", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet937", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet938", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet939", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet940", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet941", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet942", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet943", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet944", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet945", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet946", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet947", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet948", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet949", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet950", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet951", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet952", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet953", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet954", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet955", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet956", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet957", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet958", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet959", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet960", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet961", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet962", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet963", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet964", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet965", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet966", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet967", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet968", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet969", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet970", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet971", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet972", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet973", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet974", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet975", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet976", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet977", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet978", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet979", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet980", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet981", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet982", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet983", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet984", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet985", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet986", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet987", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet988", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet989", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet990", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet991", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet992", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet993", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet994", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet995", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet996", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet997", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet998", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet999", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1000", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1001", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1002", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1003", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1004", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1005", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1006", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1007", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1008", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1009", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1010", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1011", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1012", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1013", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1014", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1015", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1016", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1017", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1018", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1019", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1020", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1021", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1022", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1023", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1024", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1025", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1026", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1027", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1028", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1029", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1030", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1031", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1032", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1033", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1034", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1035", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1036", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1037", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1038", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1039", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1040", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1041", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1042", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1043", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1044", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1045", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1046", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1047", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1048", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1049", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1050", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1051", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1052", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1053", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1054", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1055", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1056", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1057", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1058", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1059", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1060", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1061", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1062", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1063", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1064", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1065", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1066", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1067", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1068", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1069", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1070", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1071", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1072", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1073", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1074", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1075", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1076", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1077", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1078", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1079", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1080", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1081", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1082", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1083", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1084", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1085", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1086", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1087", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1088", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1089", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1090", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1091", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1092", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1093", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1094", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1095", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1096", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1097", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1098", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1099", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1100", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1101", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1102", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1103", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1104", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1105", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1106", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1107", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1108", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1109", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1110", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1111", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1112", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1113", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1114", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1115", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1116", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1117", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1118", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1119", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1120", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1121", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1122", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1123", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1124", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1125", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1126", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1127", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1128", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1129", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1130", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1131", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1132", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1133", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1134", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1135", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1136", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1137", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1138", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1139", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1140", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1141", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1142", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1143", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1144", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1145", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1146", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1147", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1148", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1149", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1150", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1151", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1152", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1153", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1154", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1155", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1156", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1157", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1158", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1159", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1160", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1161", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1162", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1163", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1164", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1165", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1166", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1167", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1168", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1169", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1170", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1171", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1172", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1173", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1174", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1175", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1176", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1177", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1178", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1179", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1180", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1181", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1182", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1183", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1184", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1185", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1186", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1187", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1188", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1189", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1190", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1191", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1192", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1193", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1194", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1195", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1196", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1197", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1198", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1199", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1200", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1201", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1202", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1203", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1204", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1205", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1206", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1207", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1208", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1209", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1210", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1211", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1212", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1213", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1214", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1215", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1216", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1217", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1218", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1219", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1220", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1221", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1222", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1223", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1224", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1225", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1226", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1227", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1228", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1229", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1230", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1231", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1232", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1233", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1234", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1235", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1236", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1237", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1238", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1239", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1240", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1241", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1242", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1243", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1244", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1245", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1246", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1247", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1248", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1249", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1250", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1251", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1252", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1253", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1254", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1255", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1256", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1257", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1258", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1259", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1260", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1261", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1262", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1263", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1264", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1265", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1266", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1267", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1268", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1269", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1270", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1271", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1272", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1273", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1274", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1275", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1276", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1277", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1278", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1279", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1280", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1281", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1282", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1283", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1284", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1285", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1286", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1287", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1288", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1289", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1290", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1291", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1292", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1293", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1294", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1295", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1296", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1297", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1298", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1299", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1300", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1301", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1302", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1303", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1304", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1305", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1306", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1307", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1308", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1309", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1310", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1311", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1312", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1313", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1314", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1315", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1316", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1317", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1318", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1319", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1320", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1321", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1322", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1323", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1324", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1325", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1326", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1327", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1328", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1329", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1330", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1331", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1332", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1333", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1334", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1335", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1336", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1337", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1338", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1339", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1340", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1341", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1342", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1343", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1344", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1345", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1346", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1347", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1348", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1349", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1350", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1351", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1352", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1353", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1354", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1355", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1356", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1357", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1358", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1359", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1360", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1361", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1362", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1363", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1364", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1365", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1366", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1367", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1368", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1369", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1370", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1371", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1372", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1373", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1374", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1375", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1376", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1377", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1378", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1379", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1380", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1381", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1382", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1383", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1384", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1385", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1386", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1387", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1388", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1389", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1390", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1391", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1392", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1393", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1394", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1395", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1396", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1397", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1398", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1399", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1400", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1401", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1402", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1403", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1404", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1405", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1406", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1407", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1408", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1409", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1410", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1411", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1412", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1413", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1414", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1415", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1416", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1417", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1418", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1419", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1420", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1421", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1422", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1423", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1424", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1425", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1426", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1427", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1428", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1429", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1430", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1431", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1432", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1433", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1434", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1435", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1436", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1437", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1438", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1439", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1440", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1441", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1442", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1443", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1444", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1445", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1446", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1447", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1448", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1449", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1450", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1451", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1452", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1453", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1454", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1455", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1456", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1457", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1458", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1459", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1460", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1461", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1462", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1463", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1464", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1465", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1466", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1467", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1468", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1469", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1470", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1471", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1472", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1473", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1474", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1475", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1476", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1477", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1478", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1479", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1480", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1481", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1482", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1483", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1484", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1485", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1486", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1487", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1488", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1489", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1490", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1491", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1492", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1493", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1494", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1495", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1496", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1497", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1498", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1499", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1500", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1501", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1502", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1503", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1504", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1505", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1506", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1507", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1508", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1509", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1510", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1511", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1512", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1513", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1514", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1515", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1516", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1517", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1518", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1519", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1520", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1521", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1522", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1523", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1524", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1525", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1526", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1527", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1528", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1529", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1530", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1531", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1532", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1533", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1534", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1535", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1536", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1537", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1538", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1539", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1540", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1541", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1542", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1543", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1544", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1545", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1546", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1547", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1548", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1549", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1550", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1551", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1552", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1553", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1554", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1555", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1556", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1557", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1558", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1559", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1560", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1561", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1562", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1563", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1564", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1565", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1566", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1567", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1568", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1569", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1570", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1571", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1572", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1573", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1574", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1575", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1576", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1577", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1578", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1579", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1580", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1581", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1582", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1583", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1584", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1585", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1586", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1587", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1588", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1589", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1590", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1591", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1592", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1593", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1594", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1595", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1596", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1597", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1598", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1599", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1600", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1601", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1602", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1603", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1604", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1605", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1606", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1607", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1608", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1609", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1610", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1611", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1612", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1613", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1614", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1615", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1616", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1617", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1618", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1619", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1620", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1621", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1622", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1623", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1624", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1625", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1626", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1627", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1628", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1629", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1630", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1631", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1632", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1633", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1634", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1635", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1636", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1637", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1638", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1639", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1640", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1641", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1642", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1643", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1644", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1645", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1646", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1647", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1648", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1649", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1650", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1651", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1652", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1653", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1654", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1655", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1656", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1657", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1658", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1659", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1660", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1661", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1662", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1663", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1664", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1665", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1666", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1667", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1668", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1669", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1670", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1671", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1672", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1673", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1674", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1675", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1676", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1677", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1678", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1679", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1680", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1681", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1682", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1683", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1684", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1685", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1686", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1687", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1688", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1689", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1690", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1691", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1692", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1693", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1694", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1695", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1696", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1697", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1698", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1699", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1700", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1701", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1702", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1703", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1704", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1705", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1706", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1707", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1708", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1709", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1710", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1711", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1712", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1713", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1714", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1715", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1716", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1717", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1718", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1719", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1720", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1721", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1722", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1723", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1724", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1725", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1726", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1727", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1728", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1729", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1730", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1731", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1732", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1733", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1734", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1735", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1736", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1737", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1738", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1739", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1740", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1741", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1742", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1743", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1744", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1745", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1746", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1747", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1748", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1749", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1750", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1751", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1752", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1753", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1754", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1755", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1756", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1757", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1758", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1759", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1760", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1761", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1762", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1763", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1764", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1765", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1766", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1767", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1768", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1769", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1770", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1771", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1772", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1773", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1774", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1775", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1776", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1777", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1778", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1779", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1780", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1781", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1782", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1783", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1784", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1785", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1786", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1787", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1788", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1789", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1790", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1791", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1792", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1793", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1794", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1795", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1796", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1797", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1798", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1799", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1800", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1801", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1802", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1803", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1804", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1805", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1806", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1807", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1808", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1809", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1810", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1811", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1812", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1813", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1814", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1815", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1816", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1817", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1818", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1819", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1820", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1821", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1822", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1823", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1824", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1825", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1826", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1827", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1828", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1829", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1830", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1831", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1832", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1833", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1834", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1835", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1836", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1837", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1838", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1839", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1840", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1841", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1842", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1843", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1844", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1845", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1846", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1847", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1848", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1849", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1850", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1851", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1852", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1853", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1854", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1855", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1856", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1857", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1858", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1859", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1860", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1861", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1862", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1863", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1864", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1865", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1866", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1867", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1868", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1869", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1870", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1871", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1872", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1873", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1874", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1875", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1876", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1877", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1878", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1879", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1880", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1881", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1882", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1883", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1884", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1885", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1886", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1887", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1888", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1889", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1890", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1891", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1892", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1893", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1894", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1895", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1896", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1897", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1898", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1899", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1900", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1901", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1902", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1903", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1904", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1905", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1906", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1907", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1908", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1909", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1910", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1911", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1912", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1913", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1914", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1915", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1916", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1917", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1918", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1919", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1920", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1921", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1922", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1923", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1924", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1925", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1926", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1927", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1928", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1929", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1930", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1931", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1932", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1933", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1934", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1935", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1936", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1937", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1938", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1939", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1940", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1941", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1942", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1943", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1944", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1945", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1946", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1947", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1948", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1949", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1950", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1951", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1952", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1953", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1954", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1955", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1956", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1957", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1958", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1959", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1960", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1961", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1962", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1963", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1964", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1965", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1966", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1967", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1968", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1969", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1970", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1971", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1972", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1973", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1974", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1975", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1976", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1977", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1978", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1979", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1980", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1981", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1982", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1983", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1984", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1985", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1986", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1987", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1988", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1989", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1990", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1991", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1992", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1993", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1994", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1995", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1996", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1997", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1998", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet1999", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2000", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2001", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2002", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2003", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2004", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2005", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2006", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2007", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2008", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2009", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2010", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2011", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2012", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2013", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2014", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2015", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2016", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2017", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2018", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2019", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2020", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2021", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2022", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2023", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2024", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2025", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2026", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2027", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2028", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2029", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2030", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2031", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2032", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2033", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2034", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2035", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2036", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2037", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2038", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2039", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2040", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2041", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2042", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2043", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2044", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2045", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2046", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2047", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2048", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2049", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2050", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2051", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2052", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2053", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2054", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2055", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2056", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2057", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2058", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2059", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2060", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2061", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2062", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2063", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2064", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2065", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2066", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2067", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2068", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2069", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2070", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2071", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2072", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2073", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2074", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2075", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2076", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2077", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2078", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2079", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2080", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2081", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2082", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2083", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2084", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2085", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2086", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2087", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2088", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2089", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2090", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2091", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2092", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2093", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2094", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2095", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2096", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2097", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2098", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2099", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2100", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2101", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2102", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2103", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2104", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2105", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2106", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2107", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2108", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2109", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2110", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2111", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2112", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2113", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2114", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2115", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2116", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2117", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2118", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2119", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2120", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2121", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2122", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2123", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2124", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2125", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2126", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2127", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2128", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2129", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2130", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2131", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2132", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2133", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2134", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2135", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2136", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2137", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2138", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2139", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2140", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2141", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2142", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2143", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2144", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2145", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2146", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2147", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2148", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2149", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2150", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2151", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2152", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2153", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2154", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2155", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2156", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2157", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2158", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2159", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2160", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2161", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2162", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2163", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2164", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2165", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2166", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2167", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2168", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2169", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2170", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2171", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2172", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2173", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2174", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2175", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2176", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2177", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2178", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2179", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2180", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2181", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2182", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2183", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2184", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2185", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2186", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2187", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2188", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2189", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2190", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2191", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2192", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2193", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2194", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2195", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2196", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2197", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2198", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2199", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2200", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2201", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2202", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2203", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2204", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2205", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2206", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2207", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2208", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2209", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2210", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2211", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2212", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2213", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2214", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2215", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2216", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2217", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2218", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2219", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2220", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2221", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2222", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2223", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2224", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2225", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2226", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2227", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2228", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2229", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2230", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2231", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2232", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2233", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2234", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2235", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2236", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2237", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2238", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2239", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2240", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2241", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2242", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2243", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2244", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2245", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2246", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2247", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2248", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2249", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2250", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2251", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2252", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2253", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2254", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2255", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2256", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2257", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2258", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2259", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2260", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2261", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2262", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2263", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2264", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2265", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2266", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2267", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2268", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2269", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2270", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2271", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2272", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2273", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2274", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2275", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2276", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2277", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2278", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2279", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2280", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2281", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2282", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2283", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2284", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2285", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2286", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2287", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2288", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2289", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2290", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2291", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2292", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2293", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2294", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2295", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2296", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2297", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2298", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2299", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2300", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2301", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2302", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2303", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2304", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2305", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2306", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2307", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2308", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2309", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2310", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2311", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2312", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2313", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2314", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2315", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2316", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2317", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2318", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2319", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2320", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2321", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2322", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2323", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2324", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2325", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2326", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2327", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2328", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2329", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2330", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2331", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2332", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2333", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2334", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2335", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2336", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2337", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2338", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2339", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2340", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2341", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2342", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2343", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2344", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2345", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2346", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2347", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2348", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2349", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2350", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2351", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2352", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2353", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2354", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2355", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2356", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2357", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2358", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2359", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2360", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2361", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2362", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2363", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2364", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2365", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2366", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2367", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2368", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2369", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2370", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2371", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2372", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2373", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2374", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2375", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2376", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2377", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2378", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2379", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2380", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2381", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2382", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2383", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2384", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2385", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2386", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2387", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2388", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2389", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2390", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2391", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2392", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2393", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2394", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2395", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2396", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2397", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2398", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2399", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2400", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2401", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2402", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2403", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2404", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2405", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2406", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2407", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2408", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2409", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2410", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2411", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2412", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2413", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2414", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2415", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2416", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2417", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2418", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2419", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2420", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2421", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2422", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2423", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2424", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2425", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2426", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2427", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2428", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2429", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2430", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2431", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2432", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2433", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2434", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2435", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2436", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2437", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2438", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2439", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2440", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2441", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2442", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2443", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2444", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2445", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2446", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2447", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2448", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2449", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2450", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2451", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2452", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2453", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2454", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2455", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2456", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2457", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2458", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2459", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2460", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2461", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2462", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2463", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2464", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2465", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2466", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2467", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2468", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2469", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2470", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2471", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2472", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2473", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2474", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2475", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2476", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2477", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2478", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2479", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2480", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2481", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2482", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2483", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2484", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2485", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2486", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2487", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2488", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2489", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2490", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2491", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2492", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2493", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2494", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2495", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2496", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2497", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2498", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2499", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2500", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2501", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2502", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2503", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2504", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2505", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2506", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2507", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2508", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2509", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2510", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2511", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2512", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2513", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2514", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2515", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2516", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2517", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2518", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2519", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2520", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2521", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2522", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2523", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2524", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2525", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2526", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2527", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2528", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2529", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2530", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2531", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2532", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2533", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2534", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2535", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2536", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2537", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2538", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2539", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2540", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2541", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2542", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2543", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2544", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2545", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2546", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2547", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2548", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2549", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2550", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2551", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2552", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2553", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2554", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2555", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2556", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2557", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2558", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2559", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2560", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2561", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2562", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2563", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2564", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2565", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2566", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2567", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2568", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2569", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2570", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2571", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2572", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2573", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2574", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2575", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2576", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2577", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2578", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2579", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2580", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2581", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2582", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2583", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2584", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2585", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2586", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2587", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2588", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2589", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2590", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2591", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2592", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2593", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2594", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2595", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2596", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2597", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2598", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2599", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2600", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2601", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2602", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2603", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2604", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2605", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2606", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2607", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2608", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2609", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2610", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2611", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2612", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2613", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2614", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2615", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2616", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2617", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2618", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2619", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2620", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2621", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2622", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2623", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2624", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2625", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2626", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2627", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2628", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2629", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2630", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2631", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2632", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2633", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2634", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2635", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2636", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2637", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2638", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2639", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2640", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2641", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2642", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2643", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2644", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2645", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2646", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2647", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2648", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2649", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2650", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2651", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2652", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2653", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2654", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2655", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2656", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2657", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2658", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2659", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2660", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2661", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2662", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2663", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2664", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2665", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2666", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2667", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2668", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2669", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2670", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2671", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2672", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2673", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2674", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2675", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2676", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2677", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2678", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2679", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2680", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2681", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2682", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2683", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2684", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2685", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2686", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2687", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2688", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2689", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2690", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2691", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2692", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2693", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2694", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2695", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2696", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2697", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2698", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2699", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2700", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2701", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2702", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2703", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2704", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2705", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2706", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2707", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2708", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2709", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2710", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2711", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2712", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2713", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2714", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2715", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2716", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2717", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2718", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2719", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2720", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2721", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2722", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2723", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2724", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2725", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2726", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2727", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2728", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2729", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2730", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2731", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2732", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2733", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2734", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2735", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2736", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2737", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2738", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2739", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2740", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2741", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2742", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2743", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2744", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2745", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2746", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2747", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2748", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2749", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2750", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2751", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2752", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2753", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2754", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2755", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2756", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2757", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2758", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2759", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2760", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2761", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2762", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2763", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2764", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2765", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2766", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2767", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2768", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2769", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2770", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2771", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2772", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2773", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2774", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2775", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2776", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2777", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2778", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2779", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2780", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2781", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2782", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2783", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2784", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2785", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2786", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2787", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2788", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2789", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2790", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2791", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2792", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2793", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2794", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2795", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2796", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2797", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2798", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2799", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2800", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2801", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2802", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2803", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2804", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2805", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2806", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2807", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2808", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2809", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2810", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2811", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2812", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2813", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2814", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2815", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2816", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2817", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2818", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2819", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2820", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2821", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2822", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2823", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2824", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2825", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2826", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2827", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2828", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2829", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2830", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2831", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2832", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2833", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2834", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2835", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2836", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2837", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2838", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2839", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2840", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2841", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2842", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2843", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2844", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2845", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2846", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2847", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2848", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2849", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2850", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2851", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2852", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2853", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2854", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2855", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2856", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2857", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2858", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2859", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2860", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2861", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2862", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2863", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2864", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2865", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2866", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2867", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2868", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2869", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2870", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2871", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2872", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2873", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2874", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2875", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2876", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2877", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2878", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2879", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2880", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2881", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2882", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2883", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2884", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2885", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2886", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2887", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2888", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2889", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2890", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2891", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2892", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2893", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2894", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2895", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2896", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2897", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2898", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2899", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2900", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2901", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2902", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2903", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2904", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2905", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2906", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2907", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2908", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2909", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2910", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2911", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2912", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2913", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2914", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2915", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2916", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2917", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2918", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2919", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2920", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2921", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2922", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2923", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2924", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2925", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2926", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2927", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2928", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2929", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2930", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2931", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2932", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2933", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2934", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2935", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2936", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2937", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2938", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2939", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2940", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2941", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2942", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2943", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2944", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2945", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2946", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2947", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2948", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2949", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2950", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2951", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2952", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2953", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2954", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2955", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2956", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2957", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2958", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2959", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2960", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2961", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2962", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2963", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2964", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2965", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2966", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2967", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2968", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2969", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2970", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2971", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2972", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2973", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2974", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2975", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2976", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2977", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2978", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2979", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2980", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2981", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2982", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2983", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2984", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2985", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2986", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2987", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2988", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2989", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2990", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2991", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2992", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2993", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2994", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2995", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2996", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2997", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2998", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet2999", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3000", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3001", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3002", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3003", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3004", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3005", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3006", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3007", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3008", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3009", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3010", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3011", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3012", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3013", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3014", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3015", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3016", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3017", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3018", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3019", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3020", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3021", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3022", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3023", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3024", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3025", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3026", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3027", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3028", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3029", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3030", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3031", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3032", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3033", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3034", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3035", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3036", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3037", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3038", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3039", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3040", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3041", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3042", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3043", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3044", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3045", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3046", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3047", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3048", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3049", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3050", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3051", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3052", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3053", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3054", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3055", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3056", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3057", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3058", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3059", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3060", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3061", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3062", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3063", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3064", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3065", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3066", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3067", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3068", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3069", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3070", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3071", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3072", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3073", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3074", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3075", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3076", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3077", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3078", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3079", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3080", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3081", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3082", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3083", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3084", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3085", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3086", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3087", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3088", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3089", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3090", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3091", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3092", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3093", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3094", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3095", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3096", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3097", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3098", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3099", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3100", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3101", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3102", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3103", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3104", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3105", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3106", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3107", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3108", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3109", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3110", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3111", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3112", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3113", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3114", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3115", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3116", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3117", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3118", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3119", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3120", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3121", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3122", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3123", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3124", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3125", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3126", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3127", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3128", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3129", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3130", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3131", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3132", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3133", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3134", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3135", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3136", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3137", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3138", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3139", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3140", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3141", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3142", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3143", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3144", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3145", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3146", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3147", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3148", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3149", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3150", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3151", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3152", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3153", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3154", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3155", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3156", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3157", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3158", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3159", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3160", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3161", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3162", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3163", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3164", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3165", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3166", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3167", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3168", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3169", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3170", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3171", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3172", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3173", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3174", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3175", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3176", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3177", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3178", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3179", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3180", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3181", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3182", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3183", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3184", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3185", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3186", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3187", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3188", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3189", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3190", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3191", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3192", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3193", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3194", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3195", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3196", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3197", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3198", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3199", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3200", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3201", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3202", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3203", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3204", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3205", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3206", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3207", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3208", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3209", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3210", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3211", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3212", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3213", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3214", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3215", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3216", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3217", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3218", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3219", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3220", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3221", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3222", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3223", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3224", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3225", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3226", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3227", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3228", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3229", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3230", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3231", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3232", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3233", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3234", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3235", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3236", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3237", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3238", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3239", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3240", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3241", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3242", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3243", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3244", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3245", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3246", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3247", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3248", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3249", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3250", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3251", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3252", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3253", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3254", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3255", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3256", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3257", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3258", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3259", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3260", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3261", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3262", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3263", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3264", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3265", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3266", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3267", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3268", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3269", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3270", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3271", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3272", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3273", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3274", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3275", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3276", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3277", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3278", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3279", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3280", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3281", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3282", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3283", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3284", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3285", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3286", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3287", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3288", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3289", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3290", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3291", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3292", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3293", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3294", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3295", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3296", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3297", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3298", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3299", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3300", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3301", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3302", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3303", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3304", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3305", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3306", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3307", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3308", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3309", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3310", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3311", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3312", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3313", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3314", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3315", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3316", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3317", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3318", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3319", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3320", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3321", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3322", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3323", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3324", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3325", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3326", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3327", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3328", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3329", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3330", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3331", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3332", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3333", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3334", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3335", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3336", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3337", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3338", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3339", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3340", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3341", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3342", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3343", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3344", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3345", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3346", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3347", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3348", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3349", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3350", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3351", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3352", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3353", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3354", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3355", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3356", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3357", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3358", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3359", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3360", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3361", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3362", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3363", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3364", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3365", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3366", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3367", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3368", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3369", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3370", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3371", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3372", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3373", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3374", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3375", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3376", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3377", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3378", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3379", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3380", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3381", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3382", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3383", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3384", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3385", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3386", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3387", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3388", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3389", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3390", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3391", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3392", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3393", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3394", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3395", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3396", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3397", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3398", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3399", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3400", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3401", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3402", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3403", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3404", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3405", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3406", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3407", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3408", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3409", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3410", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3411", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3412", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3413", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3414", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3415", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3416", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3417", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3418", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3419", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3420", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3421", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3422", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3423", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3424", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3425", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3426", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3427", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3428", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3429", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3430", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3431", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3432", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3433", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3434", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3435", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3436", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3437", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3438", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3439", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3440", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3441", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3442", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3443", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3444", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3445", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3446", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3447", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3448", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3449", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3450", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3451", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3452", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3453", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3454", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3455", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3456", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3457", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3458", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3459", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3460", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3461", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3462", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3463", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3464", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3465", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3466", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3467", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3468", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3469", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3470", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3471", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3472", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3473", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3474", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3475", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3476", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3477", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3478", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3479", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3480", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3481", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3482", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3483", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3484", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3485", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3486", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3487", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3488", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3489", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3490", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3491", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3492", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3493", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3494", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3495", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3496", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3497", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3498", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3499", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3500", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3501", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3502", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3503", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3504", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3505", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3506", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3507", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3508", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3509", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3510", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3511", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3512", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3513", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3514", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3515", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3516", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3517", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3518", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3519", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3520", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3521", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3522", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3523", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3524", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3525", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3526", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3527", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3528", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3529", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3530", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3531", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3532", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3533", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3534", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3535", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3536", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3537", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3538", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3539", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3540", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3541", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3542", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3543", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3544", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3545", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3546", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3547", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3548", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3549", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3550", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3551", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3552", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3553", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3554", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3555", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3556", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3557", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3558", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3559", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3560", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3561", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3562", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3563", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3564", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3565", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3566", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3567", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3568", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3569", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3570", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3571", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3572", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3573", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3574", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3575", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3576", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3577", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3578", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3579", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3580", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3581", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3582", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3583", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3584", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3585", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3586", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3587", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3588", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3589", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3590", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3591", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3592", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3593", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3594", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3595", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3596", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3597", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3598", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3599", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3600", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3601", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3602", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3603", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3604", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3605", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3606", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3607", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3608", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3609", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3610", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3611", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3612", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3613", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3614", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3615", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3616", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3617", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3618", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3619", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3620", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3621", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3622", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3623", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3624", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3625", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3626", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3627", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3628", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3629", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3630", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3631", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3632", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3633", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3634", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3635", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3636", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3637", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3638", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3639", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3640", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3641", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3642", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3643", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3644", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3645", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3646", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3647", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3648", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3649", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3650", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3651", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3652", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3653", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3654", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3655", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3656", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3657", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3658", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3659", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3660", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3661", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3662", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3663", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3664", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3665", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3666", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3667", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3668", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3669", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3670", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3671", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3672", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3673", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3674", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3675", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3676", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3677", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3678", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3679", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3680", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3681", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3682", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3683", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3684", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3685", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3686", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3687", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3688", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3689", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3690", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3691", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3692", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3693", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3694", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3695", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3696", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3697", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3698", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3699", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3700", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3701", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3702", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3703", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3704", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3705", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3706", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3707", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3708", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3709", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3710", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3711", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3712", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3713", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3714", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3715", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3716", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3717", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3718", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3719", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3720", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3721", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3722", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3723", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3724", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3725", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3726", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3727", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3728", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3729", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3730", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3731", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3732", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3733", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3734", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3735", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3736", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3737", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3738", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3739", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3740", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3741", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3742", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3743", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3744", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3745", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3746", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3747", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3748", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3749", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3750", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3751", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3752", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3753", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3754", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3755", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3756", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3757", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3758", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3759", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3760", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3761", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3762", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3763", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3764", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3765", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3766", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3767", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3768", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3769", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3770", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3771", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3772", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3773", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3774", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3775", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3776", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3777", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3778", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3779", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3780", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3781", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3782", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3783", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3784", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3785", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3786", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3787", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3788", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3789", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3790", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3791", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3792", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3793", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3794", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3795", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3796", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3797", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3798", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3799", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3800", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3801", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3802", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3803", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3804", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3805", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3806", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3807", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3808", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3809", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3810", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3811", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3812", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3813", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3814", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3815", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3816", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3817", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3818", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3819", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3820", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3821", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3822", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3823", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3824", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3825", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3826", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3827", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3828", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3829", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3830", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3831", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3832", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3833", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3834", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3835", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3836", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3837", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3838", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3839", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3840", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3841", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3842", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3843", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3844", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3845", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3846", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3847", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3848", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3849", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3850", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3851", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3852", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3853", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3854", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3855", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3856", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3857", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3858", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3859", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3860", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3861", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3862", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3863", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3864", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3865", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3866", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3867", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3868", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3869", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3870", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3871", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3872", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3873", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3874", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3875", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3876", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3877", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3878", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3879", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3880", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3881", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3882", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3883", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3884", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3885", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3886", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3887", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3888", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3889", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3890", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3891", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3892", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3893", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3894", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3895", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3896", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3897", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3898", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3899", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3900", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3901", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3902", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3903", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3904", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3905", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3906", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3907", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3908", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3909", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3910", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3911", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3912", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3913", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3914", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3915", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3916", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3917", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3918", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3919", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3920", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3921", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3922", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3923", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3924", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3925", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3926", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3927", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3928", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3929", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3930", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3931", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3932", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3933", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3934", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3935", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3936", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3937", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3938", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3939", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3940", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3941", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3942", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3943", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3944", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3945", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3946", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3947", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3948", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3949", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3950", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3951", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3952", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3953", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3954", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3955", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3956", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3957", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3958", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3959", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3960", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3961", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3962", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3963", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3964", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3965", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3966", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3967", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3968", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3969", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3970", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3971", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3972", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3973", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3974", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3975", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3976", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3977", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3978", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3979", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3980", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3981", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3982", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3983", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3984", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3985", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3986", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3987", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3988", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3989", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3990", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3991", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3992", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3993", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3994", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3995", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3996", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3997", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3998", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet3999", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4000", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4001", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4002", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4003", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4004", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4005", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4006", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4007", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4008", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4009", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4010", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4011", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4012", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4013", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4014", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4015", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4016", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4017", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4018", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4019", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4020", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4021", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4022", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4023", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4024", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4025", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4026", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4027", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4028", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4029", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4030", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4031", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4032", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4033", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4034", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4035", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4036", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4037", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4038", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4039", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4040", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4041", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4042", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4043", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4044", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4045", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4046", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4047", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4048", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4049", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4050", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4051", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4052", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4053", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4054", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4055", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4056", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4057", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4058", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4059", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4060", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4061", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4062", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4063", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4064", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4065", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4066", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4067", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4068", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4069", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4070", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4071", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4072", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4073", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4074", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4075", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4076", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4077", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4078", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4079", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4080", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4081", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4082", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4083", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4084", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4085", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4086", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4087", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4088", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4089", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4090", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4091", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4092", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4093", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4094", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4095", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4096", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4097", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4098", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4099", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4100", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4101", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4102", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4103", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4104", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4105", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4106", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4107", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4108", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4109", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4110", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4111", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4112", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4113", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4114", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4115", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4116", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4117", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4118", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4119", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4120", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4121", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4122", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4123", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4124", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4125", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4126", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4127", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4128", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4129", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4130", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4131", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4132", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4133", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4134", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4135", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4136", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4137", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4138", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4139", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4140", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4141", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4142", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4143", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4144", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4145", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4146", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4147", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4148", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4149", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4150", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4151", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4152", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4153", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4154", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4155", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4156", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4157", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4158", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4159", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4160", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4161", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4162", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4163", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4164", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4165", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4166", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4167", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4168", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4169", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4170", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4171", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4172", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4173", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4174", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4175", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4176", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4177", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4178", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4179", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4180", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4181", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4182", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4183", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4184", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4185", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4186", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4187", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4188", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4189", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4190", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4191", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4192", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4193", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4194", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4195", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4196", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4197", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4198", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4199", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4200", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4201", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4202", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4203", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4204", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4205", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4206", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4207", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4208", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4209", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4210", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4211", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4212", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4213", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4214", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4215", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4216", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4217", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4218", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4219", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4220", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4221", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4222", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4223", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4224", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4225", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4226", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4227", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4228", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4229", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4230", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4231", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4232", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4233", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4234", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4235", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4236", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4237", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4238", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4239", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4240", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4241", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4242", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4243", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4244", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4245", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4246", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4247", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4248", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4249", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4250", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4251", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4252", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4253", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4254", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4255", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4256", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4257", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4258", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4259", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4260", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4261", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4262", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4263", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4264", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4265", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4266", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4267", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4268", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4269", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4270", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4271", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4272", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4273", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4274", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4275", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4276", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4277", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4278", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4279", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4280", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4281", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4282", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4283", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4284", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4285", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4286", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4287", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4288", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4289", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4290", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4291", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4292", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4293", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4294", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4295", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4296", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4297", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4298", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4299", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4300", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4301", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4302", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4303", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4304", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4305", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4306", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4307", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4308", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4309", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4310", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4311", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4312", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4313", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4314", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4315", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4316", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4317", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4318", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4319", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4320", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4321", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4322", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4323", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4324", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4325", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4326", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4327", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4328", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4329", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4330", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4331", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4332", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4333", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4334", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4335", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4336", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4337", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4338", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4339", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4340", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4341", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4342", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4343", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4344", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4345", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4346", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4347", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4348", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4349", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4350", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4351", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4352", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4353", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4354", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4355", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4356", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4357", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4358", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4359", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4360", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4361", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4362", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4363", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4364", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4365", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4366", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4367", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4368", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4369", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4370", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4371", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4372", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4373", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4374", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4375", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4376", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4377", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4378", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4379", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4380", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4381", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4382", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4383", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4384", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4385", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4386", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4387", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4388", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4389", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4390", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4391", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4392", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4393", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4394", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4395", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4396", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4397", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4398", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4399", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4400", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4401", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4402", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4403", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4404", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4405", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4406", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4407", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4408", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4409", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4410", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4411", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4412", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4413", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4414", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4415", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4416", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4417", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4418", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4419", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4420", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4421", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4422", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4423", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4424", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4425", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4426", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4427", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4428", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4429", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4430", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4431", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4432", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4433", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4434", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4435", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4436", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4437", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4438", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4439", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4440", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4441", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4442", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4443", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4444", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4445", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4446", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4447", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4448", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4449", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4450", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4451", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4452", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4453", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4454", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4455", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4456", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4457", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4458", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4459", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4460", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4461", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4462", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4463", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4464", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4465", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4466", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4467", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4468", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4469", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4470", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4471", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4472", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4473", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4474", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4475", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4476", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4477", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4478", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4479", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4480", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4481", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4482", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4483", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4484", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4485", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4486", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4487", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4488", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4489", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4490", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4491", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4492", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4493", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4494", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4495", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4496", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4497", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4498", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4499", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4500", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4501", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4502", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4503", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4504", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4505", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4506", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4507", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4508", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4509", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4510", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4511", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4512", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4513", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4514", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4515", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4516", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4517", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4518", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4519", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4520", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4521", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4522", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4523", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4524", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4525", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4526", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4527", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4528", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4529", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4530", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4531", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4532", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4533", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4534", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4535", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4536", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4537", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4538", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4539", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4540", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4541", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4542", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4543", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4544", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4545", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4546", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4547", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4548", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4549", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4550", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4551", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4552", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4553", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4554", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4555", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4556", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4557", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4558", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4559", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4560", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4561", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4562", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4563", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4564", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4565", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4566", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4567", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4568", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4569", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4570", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4571", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4572", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4573", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4574", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4575", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4576", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4577", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4578", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4579", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4580", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4581", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4582", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4583", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4584", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4585", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4586", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4587", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4588", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4589", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4590", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4591", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4592", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4593", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4594", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4595", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4596", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4597", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4598", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4599", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4600", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4601", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4602", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4603", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4604", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4605", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4606", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4607", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4608", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4609", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4610", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4611", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4612", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4613", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4614", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4615", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4616", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4617", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4618", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4619", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4620", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4621", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4622", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4623", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4624", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4625", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4626", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4627", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4628", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4629", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4630", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4631", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4632", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4633", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4634", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4635", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4636", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4637", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4638", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4639", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4640", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4641", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4642", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4643", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4644", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4645", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4646", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4647", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4648", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4649", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4650", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4651", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4652", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4653", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4654", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4655", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4656", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4657", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4658", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4659", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4660", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4661", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4662", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4663", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4664", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4665", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4666", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4667", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4668", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4669", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4670", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4671", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4672", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4673", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4674", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4675", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4676", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4677", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4678", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4679", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4680", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4681", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4682", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4683", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4684", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4685", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4686", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4687", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4688", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4689", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4690", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4691", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4692", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4693", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4694", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4695", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4696", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4697", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4698", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4699", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4700", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4701", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4702", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4703", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4704", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4705", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4706", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4707", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4708", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4709", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4710", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4711", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4712", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4713", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4714", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4715", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4716", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4717", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4718", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4719", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4720", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4721", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4722", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4723", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4724", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4725", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4726", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4727", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4728", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4729", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4730", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4731", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4732", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4733", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4734", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4735", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4736", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4737", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4738", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4739", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4740", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4741", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4742", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4743", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4744", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4745", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4746", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4747", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4748", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4749", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4750", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4751", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4752", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4753", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4754", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4755", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4756", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4757", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4758", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4759", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4760", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4761", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4762", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4763", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4764", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4765", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4766", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4767", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4768", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4769", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4770", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4771", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4772", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4773", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4774", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4775", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4776", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4777", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4778", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4779", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4780", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4781", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4782", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4783", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4784", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4785", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4786", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4787", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4788", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4789", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4790", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4791", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4792", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4793", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4794", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4795", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4796", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4797", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4798", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4799", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4800", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4801", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4802", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4803", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4804", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4805", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4806", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4807", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4808", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4809", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4810", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4811", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4812", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4813", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4814", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4815", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4816", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4817", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4818", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4819", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4820", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4821", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4822", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4823", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4824", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4825", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4826", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4827", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4828", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4829", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4830", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4831", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4832", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4833", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4834", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4835", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4836", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4837", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4838", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4839", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4840", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4841", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4842", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4843", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4844", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4845", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4846", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4847", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4848", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4849", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4850", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4851", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4852", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4853", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4854", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4855", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4856", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4857", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4858", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4859", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4860", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4861", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4862", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4863", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4864", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4865", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4866", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4867", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4868", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4869", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4870", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4871", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4872", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4873", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4874", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4875", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4876", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4877", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4878", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4879", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4880", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4881", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4882", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4883", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4884", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4885", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4886", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4887", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4888", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4889", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4890", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4891", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4892", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4893", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4894", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4895", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4896", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4897", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4898", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4899", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4900", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4901", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4902", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4903", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4904", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4905", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4906", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4907", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4908", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4909", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4910", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4911", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4912", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4913", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4914", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4915", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4916", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4917", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4918", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4919", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4920", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4921", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4922", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4923", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4924", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4925", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4926", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4927", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4928", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4929", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4930", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4931", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4932", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4933", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4934", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4935", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4936", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4937", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4938", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4939", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4940", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4941", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4942", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4943", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4944", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4945", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4946", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4947", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4948", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4949", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4950", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4951", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4952", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4953", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4954", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4955", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4956", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4957", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4958", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4959", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4960", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4961", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4962", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4963", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4964", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4965", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4966", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4967", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4968", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4969", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4970", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4971", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4972", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4973", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4974", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4975", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4976", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4977", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4978", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4979", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4980", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4981", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4982", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4983", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4984", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4985", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4986", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4987", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4988", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4989", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4990", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4991", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4992", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4993", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4994", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4995", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4996", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4997", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4998", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet4999", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5000", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5001", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5002", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5003", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5004", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5005", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5006", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5007", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5008", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5009", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5010", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5011", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5012", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5013", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5014", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5015", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5016", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5017", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5018", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5019", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5020", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5021", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5022", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5023", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5024", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5025", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5026", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5027", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5028", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5029", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5030", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5031", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5032", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5033", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5034", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5035", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5036", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5037", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5038", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5039", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5040", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5041", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5042", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5043", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5044", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5045", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5046", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5047", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5048", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5049", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5050", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5051", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5052", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5053", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5054", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5055", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5056", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5057", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5058", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5059", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5060", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5061", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5062", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5063", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5064", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5065", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5066", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5067", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5068", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5069", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5070", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5071", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5072", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5073", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5074", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5075", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5076", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5077", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5078", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5079", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5080", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5081", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5082", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5083", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5084", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5085", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5086", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5087", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5088", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5089", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5090", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5091", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5092", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5093", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5094", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5095", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5096", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5097", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5098", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5099", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5100", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5101", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5102", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5103", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5104", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5105", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5106", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5107", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5108", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5109", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5110", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5111", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5112", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5113", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5114", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5115", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5116", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5117", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5118", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5119", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5120", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5121", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5122", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5123", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5124", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5125", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5126", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5127", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5128", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5129", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5130", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5131", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5132", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5133", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5134", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5135", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5136", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5137", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5138", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5139", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5140", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5141", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5142", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5143", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5144", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5145", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5146", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5147", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5148", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5149", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5150", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5151", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5152", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5153", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5154", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5155", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5156", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5157", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5158", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5159", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5160", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5161", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5162", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5163", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5164", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5165", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5166", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5167", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5168", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5169", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5170", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5171", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5172", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5173", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5174", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5175", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5176", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5177", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5178", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5179", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5180", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5181", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5182", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5183", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5184", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5185", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5186", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5187", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5188", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5189", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5190", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5191", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5192", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5193", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5194", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5195", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5196", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5197", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5198", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5199", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5200", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5201", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5202", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5203", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5204", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5205", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5206", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5207", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5208", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5209", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5210", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5211", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5212", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5213", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5214", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5215", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5216", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5217", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5218", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5219", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5220", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5221", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5222", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5223", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5224", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5225", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5226", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5227", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5228", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5229", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5230", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5231", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5232", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5233", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5234", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5235", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5236", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5237", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5238", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5239", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5240", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5241", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5242", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5243", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5244", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5245", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5246", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5247", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5248", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5249", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5250", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5251", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5252", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5253", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5254", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5255", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5256", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5257", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5258", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5259", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5260", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5261", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5262", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5263", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5264", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5265", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5266", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5267", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5268", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5269", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5270", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5271", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5272", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5273", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5274", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5275", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5276", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5277", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5278", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5279", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5280", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5281", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5282", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5283", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5284", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5285", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5286", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5287", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5288", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5289", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5290", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5291", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5292", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5293", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5294", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5295", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5296", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5297", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5298", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5299", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5300", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5301", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5302", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5303", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5304", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5305", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5306", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5307", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5308", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5309", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5310", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5311", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5312", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5313", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5314", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5315", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5316", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5317", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5318", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5319", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5320", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5321", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5322", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5323", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5324", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5325", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5326", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5327", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5328", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5329", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5330", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5331", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5332", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5333", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5334", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5335", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5336", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5337", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5338", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5339", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5340", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5341", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5342", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5343", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5344", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5345", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5346", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5347", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5348", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5349", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5350", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5351", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5352", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5353", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5354", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5355", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5356", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5357", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5358", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5359", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5360", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5361", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5362", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5363", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5364", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5365", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5366", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5367", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5368", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5369", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5370", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5371", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5372", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5373", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5374", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5375", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5376", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5377", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5378", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5379", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5380", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5381", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5382", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5383", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5384", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5385", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5386", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5387", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5388", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5389", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5390", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5391", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5392", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5393", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5394", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5395", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5396", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5397", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5398", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5399", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5400", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5401", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5402", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5403", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5404", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5405", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5406", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5407", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5408", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5409", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5410", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5411", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5412", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5413", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5414", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5415", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5416", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5417", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5418", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5419", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5420", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5421", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5422", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5423", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5424", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5425", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5426", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5427", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5428", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5429", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5430", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5431", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5432", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5433", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5434", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5435", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5436", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5437", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5438", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5439", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5440", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5441", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5442", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5443", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5444", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5445", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5446", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5447", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5448", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5449", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5450", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5451", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5452", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5453", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5454", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5455", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5456", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5457", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5458", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5459", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5460", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5461", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5462", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5463", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5464", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5465", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5466", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5467", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5468", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5469", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5470", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5471", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5472", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5473", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5474", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5475", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5476", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5477", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5478", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5479", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5480", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5481", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5482", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5483", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5484", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5485", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5486", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5487", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5488", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5489", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5490", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5491", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5492", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5493", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5494", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5495", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5496", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5497", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5498", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5499", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5500", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5501", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5502", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5503", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5504", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5505", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5506", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5507", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5508", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5509", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5510", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5511", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5512", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5513", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5514", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5515", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5516", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5517", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5518", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5519", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5520", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5521", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5522", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5523", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5524", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5525", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5526", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5527", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5528", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5529", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5530", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5531", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5532", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5533", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5534", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5535", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5536", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5537", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5538", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5539", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5540", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5541", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5542", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5543", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5544", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5545", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5546", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5547", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5548", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5549", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5550", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5551", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5552", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5553", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5554", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5555", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5556", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5557", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5558", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5559", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5560", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5561", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5562", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5563", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5564", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5565", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5566", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5567", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5568", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5569", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5570", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5571", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5572", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5573", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5574", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5575", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5576", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5577", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5578", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5579", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5580", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5581", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5582", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5583", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5584", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5585", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5586", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5587", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5588", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5589", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5590", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5591", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5592", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5593", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5594", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5595", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5596", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5597", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5598", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5599", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5600", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5601", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5602", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5603", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5604", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5605", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5606", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5607", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5608", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5609", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5610", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5611", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5612", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5613", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5614", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5615", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5616", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5617", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5618", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5619", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5620", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5621", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5622", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5623", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5624", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5625", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5626", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5627", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5628", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5629", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5630", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5631", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5632", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5633", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5634", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5635", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5636", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5637", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5638", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5639", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5640", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5641", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5642", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5643", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5644", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5645", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5646", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5647", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5648", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5649", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5650", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5651", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5652", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5653", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5654", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5655", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5656", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5657", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5658", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5659", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5660", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5661", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5662", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5663", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5664", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5665", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5666", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5667", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5668", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5669", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5670", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5671", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5672", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5673", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5674", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5675", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5676", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5677", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5678", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5679", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5680", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5681", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5682", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5683", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5684", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5685", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5686", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5687", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5688", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5689", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5690", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5691", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5692", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5693", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5694", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5695", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5696", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5697", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5698", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5699", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5700", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5701", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5702", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5703", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5704", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5705", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5706", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5707", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5708", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5709", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5710", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5711", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5712", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5713", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5714", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5715", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5716", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5717", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5718", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5719", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5720", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5721", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5722", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5723", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5724", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5725", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5726", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5727", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5728", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5729", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5730", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5731", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5732", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5733", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5734", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5735", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5736", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5737", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5738", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5739", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5740", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5741", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5742", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5743", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5744", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5745", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5746", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5747", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5748", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5749", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5750", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5751", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5752", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5753", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5754", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5755", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5756", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5757", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5758", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5759", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5760", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5761", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5762", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5763", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5764", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5765", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5766", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5767", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5768", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5769", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5770", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5771", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5772", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5773", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5774", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5775", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5776", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5777", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5778", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5779", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5780", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5781", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5782", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5783", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5784", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5785", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5786", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5787", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5788", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5789", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5790", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5791", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5792", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5793", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5794", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5795", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5796", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5797", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5798", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5799", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5800", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5801", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5802", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5803", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5804", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5805", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5806", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5807", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5808", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5809", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5810", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5811", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5812", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5813", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5814", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5815", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5816", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5817", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5818", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5819", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5820", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5821", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5822", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5823", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5824", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5825", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5826", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5827", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5828", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5829", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5830", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5831", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5832", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5833", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5834", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5835", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5836", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5837", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5838", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5839", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5840", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5841", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5842", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5843", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5844", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5845", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5846", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5847", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5848", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5849", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5850", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5851", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5852", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5853", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5854", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5855", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5856", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5857", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5858", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5859", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5860", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5861", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5862", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5863", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5864", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5865", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5866", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5867", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5868", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5869", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5870", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5871", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5872", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5873", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5874", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5875", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5876", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5877", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5878", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5879", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5880", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5881", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5882", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5883", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5884", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5885", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5886", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5887", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5888", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5889", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5890", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5891", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5892", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5893", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5894", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5895", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5896", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5897", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5898", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5899", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5900", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5901", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5902", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5903", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5904", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5905", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5906", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5907", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5908", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5909", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5910", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5911", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5912", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5913", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5914", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5915", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5916", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5917", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5918", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5919", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5920", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5921", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5922", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5923", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5924", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5925", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5926", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5927", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5928", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5929", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5930", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5931", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5932", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5933", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5934", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5935", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5936", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5937", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5938", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5939", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5940", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5941", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5942", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5943", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5944", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5945", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5946", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5947", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5948", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5949", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5950", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5951", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5952", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5953", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5954", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5955", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5956", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5957", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5958", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5959", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5960", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5961", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5962", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5963", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5964", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5965", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5966", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5967", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5968", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5969", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5970", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5971", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5972", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5973", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5974", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5975", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5976", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5977", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5978", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5979", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5980", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5981", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5982", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5983", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5984", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5985", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5986", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5987", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5988", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5989", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5990", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5991", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5992", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5993", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5994", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5995", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5996", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5997", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5998", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet5999", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6000", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6001", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6002", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6003", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6004", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6005", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6006", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6007", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6008", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6009", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6010", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6011", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6012", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6013", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6014", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6015", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6016", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6017", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6018", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6019", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6020", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6021", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6022", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6023", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6024", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6025", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6026", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6027", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6028", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6029", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6030", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6031", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6032", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6033", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6034", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6035", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6036", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6037", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6038", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6039", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6040", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6041", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6042", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6043", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6044", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6045", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6046", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6047", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6048", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6049", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6050", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6051", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6052", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6053", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6054", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6055", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6056", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6057", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6058", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6059", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6060", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6061", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6062", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6063", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6064", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6065", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6066", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6067", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6068", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6069", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6070", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6071", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6072", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6073", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6074", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6075", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6076", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6077", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6078", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6079", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6080", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6081", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6082", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6083", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6084", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6085", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6086", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6087", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6088", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6089", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6090", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6091", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6092", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6093", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6094", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6095", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6096", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6097", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6098", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6099", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6100", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6101", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6102", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6103", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6104", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6105", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6106", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6107", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6108", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6109", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6110", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6111", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6112", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6113", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6114", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6115", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6116", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6117", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6118", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6119", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6120", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6121", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6122", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6123", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6124", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6125", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6126", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6127", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6128", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6129", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6130", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6131", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6132", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6133", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6134", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6135", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6136", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6137", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6138", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6139", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6140", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6141", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6142", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6143", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6144", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6145", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6146", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6147", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6148", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6149", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6150", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6151", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6152", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6153", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6154", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6155", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6156", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6157", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6158", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6159", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6160", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6161", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6162", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6163", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6164", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6165", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6166", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6167", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6168", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6169", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6170", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6171", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6172", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6173", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6174", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6175", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6176", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6177", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6178", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6179", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6180", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6181", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6182", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6183", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6184", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6185", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6186", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6187", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6188", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6189", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6190", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6191", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6192", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6193", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6194", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6195", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6196", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6197", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6198", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6199", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6200", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6201", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6202", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6203", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6204", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6205", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6206", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6207", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6208", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6209", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6210", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6211", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6212", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6213", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6214", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6215", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6216", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6217", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6218", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6219", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6220", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6221", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6222", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6223", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6224", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6225", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6226", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6227", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6228", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6229", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6230", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6231", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6232", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6233", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6234", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6235", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6236", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6237", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6238", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6239", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6240", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6241", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6242", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6243", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6244", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6245", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6246", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6247", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6248", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6249", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6250", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6251", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6252", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6253", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6254", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6255", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6256", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6257", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6258", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6259", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6260", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6261", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6262", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6263", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6264", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6265", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6266", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6267", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6268", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6269", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6270", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6271", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6272", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6273", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6274", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6275", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6276", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6277", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6278", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6279", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6280", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6281", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6282", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6283", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6284", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6285", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6286", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6287", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6288", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6289", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6290", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6291", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6292", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6293", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6294", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6295", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6296", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6297", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6298", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6299", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6300", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6301", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6302", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6303", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6304", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6305", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6306", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6307", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6308", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6309", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6310", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6311", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6312", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6313", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6314", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6315", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6316", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6317", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6318", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6319", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6320", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6321", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6322", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6323", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6324", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6325", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6326", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6327", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6328", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6329", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6330", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6331", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6332", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6333", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6334", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6335", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6336", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6337", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6338", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6339", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6340", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6341", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6342", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6343", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6344", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6345", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6346", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6347", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6348", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6349", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6350", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6351", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6352", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6353", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6354", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6355", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6356", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6357", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6358", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6359", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6360", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6361", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6362", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6363", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6364", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6365", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6366", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6367", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6368", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6369", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6370", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6371", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6372", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6373", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6374", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6375", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6376", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6377", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6378", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6379", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6380", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6381", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6382", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6383", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6384", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6385", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6386", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6387", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6388", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6389", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6390", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6391", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6392", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6393", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6394", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6395", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6396", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6397", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6398", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6399", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6400", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6401", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6402", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6403", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6404", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6405", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6406", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6407", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6408", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6409", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6410", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6411", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6412", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6413", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6414", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6415", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6416", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6417", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6418", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6419", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6420", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6421", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6422", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6423", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6424", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6425", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6426", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6427", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6428", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6429", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6430", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6431", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6432", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6433", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6434", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6435", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6436", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6437", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6438", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6439", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6440", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6441", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6442", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6443", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6444", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6445", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6446", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6447", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6448", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6449", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6450", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6451", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6452", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6453", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6454", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6455", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6456", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6457", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6458", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6459", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6460", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6461", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6462", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6463", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6464", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6465", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6466", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6467", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6468", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6469", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6470", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6471", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6472", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6473", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6474", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6475", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6476", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6477", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6478", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6479", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6480", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6481", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6482", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6483", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6484", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6485", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6486", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6487", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6488", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6489", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6490", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6491", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6492", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6493", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6494", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6495", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6496", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6497", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6498", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6499", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6500", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6501", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6502", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6503", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6504", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6505", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6506", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6507", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6508", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6509", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6510", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6511", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6512", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6513", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6514", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6515", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6516", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6517", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6518", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6519", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6520", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6521", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6522", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6523", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6524", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6525", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6526", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6527", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6528", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6529", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6530", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6531", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6532", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6533", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6534", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6535", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6536", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6537", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6538", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6539", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6540", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6541", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6542", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6543", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6544", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6545", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6546", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6547", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6548", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6549", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6550", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6551", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6552", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6553", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6554", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6555", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6556", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6557", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6558", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6559", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6560", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6561", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6562", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6563", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6564", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6565", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6566", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6567", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6568", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6569", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6570", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6571", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6572", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6573", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6574", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6575", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6576", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6577", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6578", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6579", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6580", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6581", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6582", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6583", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6584", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6585", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6586", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6587", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6588", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6589", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6590", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6591", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6592", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6593", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6594", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6595", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6596", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6597", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6598", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6599", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6600", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6601", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6602", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6603", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6604", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6605", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6606", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6607", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6608", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6609", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6610", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6611", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6612", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6613", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6614", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6615", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6616", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6617", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6618", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6619", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6620", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6621", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6622", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6623", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6624", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6625", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6626", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6627", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6628", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6629", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6630", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6631", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6632", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6633", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6634", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6635", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6636", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6637", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6638", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6639", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6640", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6641", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6642", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6643", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6644", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6645", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6646", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6647", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6648", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6649", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6650", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6651", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6652", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6653", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6654", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6655", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6656", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6657", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6658", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6659", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6660", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6661", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6662", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6663", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6664", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6665", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6666", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6667", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6668", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6669", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6670", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6671", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6672", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6673", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6674", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6675", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6676", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6677", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6678", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6679", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6680", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6681", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6682", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6683", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6684", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6685", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6686", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6687", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6688", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6689", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6690", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6691", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6692", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6693", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6694", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6695", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6696", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6697", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6698", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6699", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6700", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6701", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6702", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6703", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6704", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6705", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6706", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6707", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6708", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6709", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6710", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6711", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6712", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6713", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6714", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6715", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6716", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6717", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6718", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6719", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6720", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6721", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6722", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6723", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6724", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6725", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6726", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6727", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6728", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6729", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6730", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6731", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6732", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6733", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6734", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6735", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6736", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6737", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6738", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6739", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6740", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6741", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6742", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6743", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6744", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6745", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6746", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6747", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6748", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6749", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6750", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6751", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6752", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6753", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6754", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6755", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6756", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6757", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6758", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6759", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6760", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6761", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6762", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6763", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6764", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6765", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6766", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6767", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6768", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6769", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6770", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6771", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6772", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6773", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6774", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6775", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6776", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6777", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6778", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6779", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6780", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6781", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6782", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6783", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6784", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6785", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6786", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6787", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6788", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6789", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6790", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6791", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6792", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6793", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6794", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6795", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6796", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6797", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6798", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6799", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6800", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6801", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6802", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6803", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6804", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6805", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6806", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6807", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6808", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6809", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6810", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6811", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6812", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6813", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6814", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6815", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6816", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6817", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6818", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6819", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6820", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6821", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6822", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6823", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6824", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6825", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6826", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6827", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6828", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6829", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6830", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6831", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6832", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6833", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6834", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6835", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6836", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6837", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6838", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6839", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6840", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6841", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6842", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6843", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6844", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6845", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6846", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6847", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6848", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6849", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6850", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6851", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6852", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6853", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6854", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6855", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6856", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6857", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6858", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6859", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6860", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6861", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6862", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6863", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6864", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6865", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6866", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6867", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6868", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6869", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6870", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6871", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6872", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6873", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6874", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6875", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6876", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6877", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6878", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6879", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6880", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6881", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6882", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6883", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6884", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6885", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6886", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6887", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6888", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6889", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6890", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6891", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6892", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6893", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6894", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6895", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6896", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6897", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6898", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6899", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6900", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6901", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6902", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6903", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6904", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6905", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6906", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6907", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6908", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6909", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6910", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6911", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6912", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6913", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6914", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6915", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6916", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6917", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6918", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6919", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6920", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6921", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6922", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6923", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6924", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6925", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6926", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6927", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6928", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6929", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6930", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6931", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6932", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6933", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6934", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6935", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6936", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6937", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6938", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6939", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6940", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6941", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6942", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6943", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6944", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6945", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6946", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6947", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6948", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6949", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6950", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6951", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6952", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6953", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6954", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6955", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6956", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6957", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6958", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6959", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6960", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6961", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6962", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6963", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6964", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6965", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6966", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6967", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6968", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6969", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6970", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6971", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6972", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6973", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6974", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6975", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6976", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6977", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6978", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6979", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6980", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6981", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6982", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6983", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6984", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6985", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6986", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6987", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6988", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6989", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6990", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6991", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6992", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6993", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6994", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6995", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6996", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6997", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6998", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet6999", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7000", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7001", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7002", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7003", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7004", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7005", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7006", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7007", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7008", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7009", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7010", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7011", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7012", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7013", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7014", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7015", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7016", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7017", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7018", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7019", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7020", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7021", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7022", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7023", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7024", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7025", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7026", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7027", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7028", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7029", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7030", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7031", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7032", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7033", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7034", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7035", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7036", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7037", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7038", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7039", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7040", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7041", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7042", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7043", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7044", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7045", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7046", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7047", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7048", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7049", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7050", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7051", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7052", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7053", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7054", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7055", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7056", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7057", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7058", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7059", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7060", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7061", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7062", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7063", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7064", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7065", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7066", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7067", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7068", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7069", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7070", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7071", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7072", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7073", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7074", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7075", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7076", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7077", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7078", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7079", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7080", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7081", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7082", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7083", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7084", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7085", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7086", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7087", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7088", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7089", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7090", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7091", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7092", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7093", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7094", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7095", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7096", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7097", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7098", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7099", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7100", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7101", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7102", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7103", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7104", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7105", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7106", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7107", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7108", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7109", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7110", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7111", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7112", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7113", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7114", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7115", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7116", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7117", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7118", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7119", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7120", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7121", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7122", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7123", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7124", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7125", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7126", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7127", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7128", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7129", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7130", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7131", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7132", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7133", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7134", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7135", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7136", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7137", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7138", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7139", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7140", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7141", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7142", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7143", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7144", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7145", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7146", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7147", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7148", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7149", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7150", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7151", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7152", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7153", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7154", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7155", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7156", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7157", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7158", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7159", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7160", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7161", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7162", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7163", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7164", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7165", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7166", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7167", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7168", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7169", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7170", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7171", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7172", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7173", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7174", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7175", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7176", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7177", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7178", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7179", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7180", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7181", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7182", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7183", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7184", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7185", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7186", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7187", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7188", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7189", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7190", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7191", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7192", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7193", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7194", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7195", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7196", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7197", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7198", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7199", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7200", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7201", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7202", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7203", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7204", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7205", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7206", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7207", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7208", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7209", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7210", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7211", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7212", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7213", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7214", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7215", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7216", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7217", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7218", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7219", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7220", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7221", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7222", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7223", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7224", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7225", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7226", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7227", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7228", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7229", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7230", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7231", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7232", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7233", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7234", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7235", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7236", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7237", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7238", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7239", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7240", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7241", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7242", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7243", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7244", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7245", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7246", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7247", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7248", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7249", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7250", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7251", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7252", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7253", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7254", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7255", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7256", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7257", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7258", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7259", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7260", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7261", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7262", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7263", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7264", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7265", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7266", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7267", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7268", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7269", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7270", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7271", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7272", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7273", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7274", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7275", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7276", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7277", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7278", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7279", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7280", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7281", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7282", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7283", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7284", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7285", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7286", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7287", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7288", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7289", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7290", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7291", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7292", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7293", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7294", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7295", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7296", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7297", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7298", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7299", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7300", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7301", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7302", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7303", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7304", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7305", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7306", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7307", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7308", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7309", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7310", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7311", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7312", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7313", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7314", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7315", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7316", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7317", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7318", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7319", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7320", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7321", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7322", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7323", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7324", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7325", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7326", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7327", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7328", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7329", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7330", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7331", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7332", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7333", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7334", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7335", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7336", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7337", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7338", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7339", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7340", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7341", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7342", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7343", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7344", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7345", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7346", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7347", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7348", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7349", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7350", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7351", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7352", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7353", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7354", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7355", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7356", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7357", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7358", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7359", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7360", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7361", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7362", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7363", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7364", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7365", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7366", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7367", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7368", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7369", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7370", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7371", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7372", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7373", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7374", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7375", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7376", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7377", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7378", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7379", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7380", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7381", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7382", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7383", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7384", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7385", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7386", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7387", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7388", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7389", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7390", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7391", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7392", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7393", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7394", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7395", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7396", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7397", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7398", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7399", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7400", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7401", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7402", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7403", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7404", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7405", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7406", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7407", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7408", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7409", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7410", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7411", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7412", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7413", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7414", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7415", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7416", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7417", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7418", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7419", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7420", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7421", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7422", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7423", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7424", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7425", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7426", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7427", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7428", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7429", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7430", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7431", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7432", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7433", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7434", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7435", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7436", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7437", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7438", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7439", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7440", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7441", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7442", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7443", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7444", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7445", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7446", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7447", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7448", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7449", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7450", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7451", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7452", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7453", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7454", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7455", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7456", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7457", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7458", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7459", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7460", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7461", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7462", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7463", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7464", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7465", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7466", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7467", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7468", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7469", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7470", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7471", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7472", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7473", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7474", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7475", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7476", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7477", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7478", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7479", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7480", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7481", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7482", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7483", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7484", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7485", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7486", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7487", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7488", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7489", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7490", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7491", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7492", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7493", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7494", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7495", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7496", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7497", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7498", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7499", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7500", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7501", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7502", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7503", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7504", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7505", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7506", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7507", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7508", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7509", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7510", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7511", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7512", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7513", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7514", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7515", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7516", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7517", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7518", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7519", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7520", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7521", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7522", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7523", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7524", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7525", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7526", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7527", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7528", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7529", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7530", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7531", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7532", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7533", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7534", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7535", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7536", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7537", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7538", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7539", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7540", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7541", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7542", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7543", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7544", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7545", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7546", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7547", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7548", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7549", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7550", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7551", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7552", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7553", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7554", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7555", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7556", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7557", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7558", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7559", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7560", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7561", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7562", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7563", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7564", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7565", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7566", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7567", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7568", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7569", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7570", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7571", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7572", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7573", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7574", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7575", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7576", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7577", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7578", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7579", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7580", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7581", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7582", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7583", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7584", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7585", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7586", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7587", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7588", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7589", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7590", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7591", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7592", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7593", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7594", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7595", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7596", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7597", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7598", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7599", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7600", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7601", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7602", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7603", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7604", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7605", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7606", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7607", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7608", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7609", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7610", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7611", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7612", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7613", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7614", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7615", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7616", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7617", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7618", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7619", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7620", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7621", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7622", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7623", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7624", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7625", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7626", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7627", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7628", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7629", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7630", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7631", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7632", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7633", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7634", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7635", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7636", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7637", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7638", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7639", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7640", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7641", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7642", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7643", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7644", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7645", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7646", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7647", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7648", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7649", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7650", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7651", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7652", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7653", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7654", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7655", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7656", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7657", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7658", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7659", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7660", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7661", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7662", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7663", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7664", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7665", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7666", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7667", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7668", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7669", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7670", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7671", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7672", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7673", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7674", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7675", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7676", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7677", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7678", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7679", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7680", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7681", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7682", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7683", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7684", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7685", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7686", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7687", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7688", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7689", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7690", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7691", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7692", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7693", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7694", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7695", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7696", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7697", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7698", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7699", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7700", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7701", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7702", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7703", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7704", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7705", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7706", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7707", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7708", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7709", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7710", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7711", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7712", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7713", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7714", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7715", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7716", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7717", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7718", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7719", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7720", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7721", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7722", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7723", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7724", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7725", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7726", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7727", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7728", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7729", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7730", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7731", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7732", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7733", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7734", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7735", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7736", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7737", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7738", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7739", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7740", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7741", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7742", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7743", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7744", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7745", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7746", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7747", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7748", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7749", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7750", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7751", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7752", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7753", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7754", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7755", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7756", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7757", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7758", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7759", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7760", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7761", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7762", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7763", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7764", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7765", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7766", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7767", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7768", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7769", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7770", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7771", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7772", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7773", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7774", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7775", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7776", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7777", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7778", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7779", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7780", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7781", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7782", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7783", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7784", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7785", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7786", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7787", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7788", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7789", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7790", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7791", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7792", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7793", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7794", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7795", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7796", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7797", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7798", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7799", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7800", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7801", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7802", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7803", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7804", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7805", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7806", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7807", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7808", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7809", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7810", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7811", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7812", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7813", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7814", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7815", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7816", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7817", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7818", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7819", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7820", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7821", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7822", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7823", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7824", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7825", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7826", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7827", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7828", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7829", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7830", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7831", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7832", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7833", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7834", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7835", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7836", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7837", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7838", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7839", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7840", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7841", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7842", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7843", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7844", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7845", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7846", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7847", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7848", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7849", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7850", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7851", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7852", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7853", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7854", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7855", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7856", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7857", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7858", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7859", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7860", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7861", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7862", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7863", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7864", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7865", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7866", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7867", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7868", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7869", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7870", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7871", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7872", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7873", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7874", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7875", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7876", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7877", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7878", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7879", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7880", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7881", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7882", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7883", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7884", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7885", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7886", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7887", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7888", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7889", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7890", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7891", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7892", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7893", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7894", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7895", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7896", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7897", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7898", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7899", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7900", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7901", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7902", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7903", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7904", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7905", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7906", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7907", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7908", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7909", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7910", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7911", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7912", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7913", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7914", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7915", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7916", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7917", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7918", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7919", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7920", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7921", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7922", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7923", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7924", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7925", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7926", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7927", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7928", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7929", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7930", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7931", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7932", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7933", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7934", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7935", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7936", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7937", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7938", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7939", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7940", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7941", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7942", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7943", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7944", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7945", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7946", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7947", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7948", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7949", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7950", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7951", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7952", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7953", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7954", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7955", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7956", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7957", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7958", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7959", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7960", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7961", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7962", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7963", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7964", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7965", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7966", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7967", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7968", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7969", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7970", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7971", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7972", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7973", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7974", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7975", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7976", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7977", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7978", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7979", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7980", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7981", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7982", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7983", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7984", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7985", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7986", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7987", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7988", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7989", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7990", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7991", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7992", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7993", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7994", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7995", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7996", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7997", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7998", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet7999", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8000", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8001", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8002", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8003", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8004", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8005", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8006", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8007", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8008", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8009", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8010", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8011", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8012", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8013", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8014", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8015", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8016", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8017", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8018", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8019", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8020", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8021", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8022", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8023", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8024", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8025", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8026", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8027", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8028", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8029", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8030", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8031", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8032", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8033", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8034", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8035", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8036", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8037", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8038", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8039", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8040", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8041", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8042", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8043", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8044", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8045", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8046", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8047", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8048", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8049", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8050", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8051", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8052", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8053", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8054", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8055", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8056", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8057", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8058", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8059", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8060", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8061", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8062", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8063", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8064", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8065", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8066", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8067", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8068", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8069", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8070", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8071", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8072", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8073", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8074", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8075", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8076", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8077", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8078", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8079", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8080", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8081", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8082", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8083", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8084", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8085", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8086", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8087", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8088", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8089", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8090", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8091", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8092", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8093", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8094", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8095", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8096", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8097", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8098", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8099", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8100", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8101", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8102", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8103", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8104", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8105", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8106", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8107", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8108", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8109", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8110", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8111", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8112", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8113", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8114", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8115", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8116", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8117", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8118", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8119", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8120", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8121", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8122", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8123", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8124", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8125", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8126", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8127", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8128", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8129", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8130", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8131", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8132", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8133", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8134", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8135", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8136", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8137", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8138", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8139", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8140", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8141", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8142", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8143", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8144", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8145", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8146", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8147", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8148", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8149", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8150", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8151", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8152", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8153", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8154", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8155", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8156", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8157", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8158", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8159", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8160", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8161", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8162", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8163", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8164", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8165", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8166", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8167", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8168", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8169", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8170", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8171", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8172", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8173", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8174", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8175", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8176", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8177", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8178", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8179", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8180", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8181", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8182", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8183", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8184", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8185", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8186", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8187", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8188", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8189", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8190", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8191", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8192", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8193", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8194", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8195", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8196", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8197", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8198", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8199", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8200", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8201", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8202", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8203", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8204", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8205", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8206", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8207", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8208", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8209", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8210", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8211", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8212", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8213", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8214", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8215", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8216", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8217", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8218", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8219", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8220", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8221", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8222", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8223", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8224", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8225", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8226", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8227", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8228", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8229", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8230", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8231", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8232", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8233", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8234", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8235", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8236", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8237", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8238", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8239", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8240", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8241", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8242", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8243", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8244", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8245", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8246", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8247", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8248", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8249", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8250", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8251", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8252", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8253", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8254", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8255", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8256", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8257", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8258", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8259", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8260", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8261", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8262", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8263", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8264", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8265", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8266", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8267", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8268", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8269", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8270", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8271", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8272", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8273", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8274", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8275", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8276", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8277", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8278", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8279", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8280", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8281", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8282", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8283", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8284", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8285", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8286", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8287", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8288", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8289", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8290", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8291", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8292", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8293", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8294", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8295", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8296", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8297", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8298", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8299", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8300", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8301", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8302", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8303", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8304", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8305", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8306", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8307", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8308", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8309", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8310", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8311", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8312", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8313", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8314", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8315", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8316", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8317", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8318", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8319", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8320", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8321", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8322", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8323", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8324", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8325", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8326", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8327", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8328", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8329", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8330", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8331", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8332", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8333", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8334", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8335", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8336", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8337", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8338", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8339", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8340", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8341", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8342", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8343", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8344", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8345", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8346", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8347", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8348", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8349", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8350", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8351", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8352", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8353", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8354", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8355", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8356", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8357", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8358", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8359", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8360", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8361", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8362", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8363", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8364", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8365", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8366", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8367", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8368", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8369", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8370", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8371", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8372", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8373", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8374", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8375", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8376", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8377", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8378", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8379", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8380", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8381", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8382", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8383", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8384", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8385", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8386", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8387", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8388", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8389", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8390", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8391", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8392", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8393", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8394", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8395", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8396", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8397", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8398", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8399", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8400", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8401", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8402", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8403", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8404", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8405", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8406", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8407", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8408", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8409", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8410", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8411", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8412", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8413", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8414", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8415", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8416", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8417", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8418", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8419", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8420", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8421", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8422", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8423", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8424", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8425", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8426", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8427", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8428", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8429", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8430", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8431", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8432", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8433", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8434", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8435", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8436", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8437", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8438", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8439", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8440", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8441", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8442", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8443", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8444", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8445", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8446", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8447", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8448", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8449", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8450", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8451", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8452", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8453", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8454", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8455", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8456", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8457", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8458", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8459", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8460", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8461", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8462", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8463", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8464", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8465", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8466", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8467", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8468", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8469", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8470", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8471", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8472", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8473", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8474", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8475", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8476", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8477", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8478", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8479", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8480", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8481", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8482", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8483", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8484", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8485", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8486", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8487", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8488", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8489", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8490", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8491", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8492", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8493", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8494", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8495", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8496", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8497", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8498", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8499", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8500", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8501", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8502", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8503", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8504", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8505", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8506", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8507", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8508", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8509", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8510", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8511", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8512", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8513", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8514", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8515", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8516", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8517", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8518", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8519", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8520", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8521", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8522", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8523", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8524", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8525", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8526", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8527", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8528", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8529", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8530", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8531", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8532", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8533", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8534", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8535", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8536", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8537", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8538", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8539", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8540", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8541", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8542", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8543", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8544", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8545", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8546", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8547", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8548", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8549", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8550", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8551", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8552", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8553", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8554", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8555", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8556", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8557", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8558", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8559", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8560", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8561", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8562", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8563", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8564", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8565", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8566", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8567", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8568", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8569", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8570", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8571", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8572", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8573", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8574", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8575", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8576", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8577", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8578", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8579", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8580", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8581", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8582", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8583", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8584", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8585", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8586", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8587", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8588", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8589", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8590", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8591", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8592", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8593", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8594", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8595", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8596", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8597", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8598", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8599", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8600", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8601", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8602", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8603", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8604", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8605", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8606", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8607", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8608", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8609", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8610", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8611", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8612", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8613", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8614", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8615", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8616", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8617", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8618", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8619", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8620", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8621", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8622", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8623", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8624", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8625", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8626", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8627", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8628", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8629", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8630", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8631", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8632", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8633", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8634", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8635", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8636", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8637", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8638", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8639", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8640", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8641", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8642", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8643", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8644", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8645", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8646", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8647", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8648", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8649", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8650", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8651", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8652", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8653", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8654", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8655", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8656", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8657", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8658", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8659", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8660", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8661", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8662", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8663", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8664", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8665", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8666", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8667", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8668", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8669", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8670", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8671", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8672", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8673", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8674", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8675", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8676", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8677", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8678", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8679", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8680", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8681", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8682", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8683", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8684", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8685", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8686", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8687", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8688", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8689", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8690", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8691", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8692", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8693", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8694", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8695", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8696", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8697", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8698", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8699", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8700", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8701", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8702", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8703", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8704", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8705", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8706", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8707", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8708", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8709", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8710", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8711", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8712", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8713", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8714", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8715", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8716", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8717", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8718", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8719", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8720", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8721", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8722", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8723", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8724", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8725", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8726", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8727", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8728", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8729", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8730", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8731", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8732", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8733", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8734", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8735", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8736", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8737", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8738", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8739", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8740", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8741", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8742", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8743", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8744", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8745", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8746", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8747", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8748", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8749", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8750", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8751", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8752", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8753", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8754", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8755", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8756", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8757", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8758", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8759", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8760", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8761", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8762", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8763", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8764", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8765", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8766", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8767", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8768", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8769", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8770", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8771", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8772", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8773", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8774", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8775", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8776", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8777", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8778", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8779", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8780", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8781", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8782", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8783", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8784", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8785", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8786", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8787", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8788", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8789", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8790", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8791", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8792", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8793", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8794", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8795", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8796", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8797", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8798", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8799", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8800", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8801", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8802", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8803", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8804", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8805", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8806", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8807", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8808", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8809", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8810", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8811", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8812", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8813", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8814", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8815", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8816", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8817", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8818", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8819", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8820", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8821", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8822", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8823", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8824", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8825", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8826", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8827", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8828", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8829", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8830", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8831", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8832", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8833", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8834", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8835", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8836", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8837", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8838", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8839", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8840", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8841", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8842", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8843", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8844", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8845", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8846", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8847", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8848", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8849", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8850", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8851", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8852", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8853", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8854", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8855", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8856", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8857", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8858", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8859", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8860", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8861", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8862", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8863", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8864", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8865", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8866", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8867", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8868", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8869", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8870", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8871", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8872", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8873", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8874", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8875", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8876", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8877", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8878", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8879", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8880", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8881", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8882", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8883", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8884", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8885", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8886", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8887", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8888", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8889", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8890", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8891", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8892", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8893", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8894", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8895", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8896", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8897", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8898", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8899", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8900", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8901", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8902", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8903", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8904", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8905", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8906", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8907", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8908", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8909", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8910", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8911", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8912", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8913", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8914", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8915", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8916", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8917", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8918", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8919", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8920", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8921", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8922", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8923", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8924", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8925", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8926", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8927", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8928", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8929", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8930", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8931", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8932", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8933", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8934", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8935", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8936", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8937", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8938", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8939", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8940", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8941", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8942", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8943", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8944", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8945", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8946", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8947", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8948", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8949", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8950", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8951", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8952", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8953", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8954", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8955", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8956", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8957", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8958", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8959", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8960", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8961", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8962", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8963", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8964", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8965", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8966", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8967", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8968", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8969", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8970", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8971", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8972", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8973", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8974", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8975", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8976", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8977", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8978", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8979", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8980", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8981", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8982", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8983", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8984", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8985", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8986", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8987", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8988", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8989", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8990", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8991", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8992", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8993", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8994", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8995", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8996", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8997", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8998", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet8999", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9000", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9001", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9002", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9003", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9004", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9005", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9006", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9007", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9008", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9009", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9010", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9011", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9012", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9013", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9014", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9015", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9016", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9017", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9018", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9019", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9020", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9021", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9022", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9023", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9024", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9025", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9026", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9027", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9028", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9029", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9030", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9031", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9032", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9033", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9034", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9035", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9036", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9037", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9038", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9039", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9040", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9041", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9042", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9043", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9044", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9045", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9046", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9047", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9048", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9049", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9050", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9051", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9052", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9053", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9054", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9055", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9056", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9057", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9058", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9059", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9060", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9061", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9062", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9063", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9064", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9065", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9066", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9067", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9068", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9069", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9070", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9071", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9072", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9073", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9074", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9075", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9076", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9077", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9078", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9079", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9080", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9081", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9082", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9083", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9084", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9085", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9086", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9087", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9088", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9089", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9090", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9091", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9092", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9093", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9094", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9095", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9096", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9097", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9098", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9099", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9100", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9101", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9102", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9103", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9104", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9105", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9106", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9107", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9108", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9109", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9110", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9111", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9112", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9113", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9114", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9115", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9116", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9117", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9118", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9119", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9120", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9121", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9122", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9123", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9124", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9125", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9126", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9127", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9128", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9129", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9130", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9131", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9132", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9133", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9134", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9135", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9136", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9137", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9138", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9139", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9140", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9141", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9142", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9143", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9144", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9145", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9146", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9147", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9148", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9149", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9150", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9151", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9152", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9153", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9154", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9155", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9156", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9157", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9158", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9159", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9160", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9161", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9162", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9163", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9164", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9165", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9166", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9167", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9168", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9169", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9170", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9171", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9172", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9173", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9174", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9175", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9176", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9177", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9178", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9179", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9180", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9181", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9182", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9183", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9184", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9185", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9186", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9187", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9188", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9189", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9190", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9191", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9192", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9193", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9194", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9195", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9196", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9197", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9198", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9199", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9200", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9201", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9202", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9203", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9204", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9205", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9206", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9207", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9208", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9209", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9210", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9211", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9212", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9213", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9214", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9215", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9216", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9217", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9218", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9219", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9220", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9221", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9222", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9223", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9224", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9225", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9226", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9227", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9228", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9229", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9230", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9231", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9232", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9233", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9234", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9235", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9236", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9237", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9238", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9239", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9240", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9241", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9242", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9243", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9244", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9245", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9246", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9247", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9248", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9249", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9250", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9251", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9252", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9253", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9254", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9255", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9256", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9257", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9258", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9259", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9260", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9261", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9262", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9263", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9264", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9265", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9266", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9267", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9268", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9269", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9270", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9271", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9272", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9273", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9274", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9275", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9276", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9277", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9278", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9279", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9280", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9281", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9282", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9283", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9284", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9285", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9286", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9287", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9288", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9289", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9290", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9291", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9292", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9293", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9294", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9295", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9296", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9297", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9298", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9299", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9300", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9301", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9302", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9303", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9304", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9305", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9306", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9307", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9308", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9309", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9310", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9311", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9312", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9313", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9314", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9315", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9316", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9317", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9318", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9319", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9320", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9321", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9322", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9323", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9324", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9325", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9326", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9327", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9328", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9329", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9330", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9331", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9332", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9333", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9334", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9335", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9336", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9337", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9338", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9339", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9340", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9341", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9342", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9343", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9344", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9345", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9346", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9347", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9348", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9349", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9350", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9351", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9352", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9353", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9354", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9355", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9356", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9357", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9358", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9359", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9360", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9361", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9362", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9363", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9364", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9365", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9366", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9367", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9368", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9369", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9370", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9371", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9372", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9373", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9374", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9375", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9376", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9377", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9378", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9379", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9380", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9381", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9382", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9383", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9384", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9385", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9386", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9387", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9388", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9389", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9390", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9391", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9392", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9393", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9394", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9395", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9396", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9397", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9398", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9399", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9400", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9401", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9402", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9403", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9404", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9405", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9406", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9407", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9408", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9409", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9410", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9411", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9412", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9413", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9414", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9415", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9416", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9417", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9418", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9419", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9420", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9421", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9422", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9423", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9424", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9425", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9426", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9427", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9428", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9429", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9430", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9431", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9432", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9433", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9434", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9435", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9436", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9437", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9438", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9439", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9440", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9441", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9442", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9443", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9444", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9445", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9446", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9447", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9448", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9449", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9450", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9451", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9452", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9453", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9454", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9455", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9456", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9457", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9458", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9459", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9460", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9461", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9462", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9463", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9464", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9465", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9466", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9467", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9468", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9469", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9470", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9471", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9472", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9473", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9474", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9475", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9476", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9477", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9478", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9479", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9480", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9481", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9482", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9483", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9484", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9485", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9486", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9487", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9488", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9489", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9490", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9491", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9492", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9493", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9494", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9495", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9496", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9497", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9498", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9499", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9500", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9501", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9502", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9503", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9504", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9505", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9506", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9507", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9508", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9509", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9510", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9511", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9512", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9513", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9514", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9515", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9516", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9517", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9518", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9519", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9520", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9521", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9522", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9523", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9524", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9525", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9526", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9527", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9528", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9529", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9530", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9531", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9532", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9533", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9534", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9535", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9536", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9537", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9538", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9539", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9540", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9541", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9542", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9543", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9544", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9545", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9546", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9547", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9548", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9549", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9550", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9551", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9552", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9553", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9554", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9555", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9556", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9557", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9558", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9559", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9560", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9561", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9562", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9563", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9564", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9565", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9566", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9567", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9568", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9569", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9570", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9571", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9572", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9573", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9574", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9575", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9576", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9577", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9578", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9579", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9580", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9581", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9582", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9583", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9584", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9585", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9586", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9587", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9588", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9589", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9590", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9591", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9592", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9593", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9594", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9595", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9596", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9597", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9598", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9599", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9600", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9601", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9602", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9603", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9604", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9605", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9606", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9607", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9608", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9609", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9610", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9611", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9612", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9613", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9614", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9615", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9616", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9617", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9618", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9619", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9620", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9621", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9622", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9623", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9624", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9625", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9626", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9627", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9628", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9629", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9630", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9631", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9632", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9633", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9634", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9635", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9636", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9637", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9638", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9639", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9640", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9641", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9642", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9643", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9644", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9645", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9646", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9647", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9648", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9649", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9650", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9651", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9652", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9653", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9654", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9655", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9656", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9657", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9658", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9659", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9660", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9661", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9662", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9663", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9664", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9665", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9666", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9667", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9668", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9669", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9670", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9671", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9672", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9673", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9674", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9675", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9676", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9677", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9678", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9679", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9680", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9681", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9682", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9683", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9684", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9685", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9686", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9687", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9688", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9689", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9690", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9691", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9692", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9693", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9694", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9695", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9696", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9697", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9698", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9699", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9700", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9701", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9702", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9703", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9704", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9705", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9706", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9707", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9708", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9709", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9710", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9711", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9712", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9713", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9714", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9715", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9716", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9717", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9718", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9719", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9720", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9721", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9722", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9723", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9724", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9725", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9726", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9727", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9728", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9729", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9730", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9731", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9732", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9733", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9734", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9735", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9736", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9737", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9738", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9739", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9740", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9741", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9742", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9743", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9744", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9745", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9746", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9747", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9748", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9749", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9750", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9751", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9752", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9753", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9754", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9755", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9756", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9757", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9758", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9759", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9760", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9761", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9762", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9763", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9764", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9765", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9766", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9767", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9768", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9769", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9770", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9771", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9772", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9773", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9774", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9775", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9776", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9777", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9778", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9779", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9780", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9781", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9782", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9783", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9784", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9785", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9786", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9787", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9788", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9789", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9790", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9791", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9792", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9793", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9794", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9795", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9796", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9797", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9798", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9799", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9800", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9801", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9802", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9803", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9804", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9805", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9806", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9807", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9808", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9809", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9810", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9811", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9812", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9813", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9814", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9815", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9816", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9817", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9818", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9819", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9820", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9821", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9822", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9823", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9824", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9825", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9826", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9827", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9828", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9829", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9830", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9831", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9832", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9833", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9834", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9835", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9836", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9837", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9838", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9839", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9840", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9841", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9842", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9843", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9844", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9845", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9846", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9847", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9848", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9849", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9850", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9851", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9852", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9853", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9854", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9855", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9856", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9857", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9858", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9859", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9860", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9861", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9862", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9863", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9864", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9865", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9866", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9867", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9868", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9869", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9870", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9871", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9872", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9873", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9874", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9875", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9876", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9877", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9878", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9879", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9880", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9881", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9882", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9883", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9884", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9885", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9886", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9887", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9888", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9889", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9890", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9891", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9892", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9893", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9894", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9895", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9896", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9897", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9898", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9899", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9900", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9901", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9902", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9903", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9904", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9905", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9906", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9907", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9908", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9909", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9910", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9911", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9912", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9913", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9914", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9915", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9916", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9917", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9918", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9919", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9920", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9921", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9922", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9923", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9924", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9925", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9926", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9927", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9928", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9929", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9930", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9931", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9932", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9933", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9934", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9935", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9936", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9937", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9938", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9939", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9940", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9941", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9942", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9943", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9944", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9945", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9946", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9947", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9948", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9949", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9950", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9951", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9952", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9953", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9954", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9955", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9956", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9957", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9958", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9959", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9960", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9961", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9962", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9963", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9964", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9965", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9966", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9967", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9968", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9969", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9970", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9971", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9972", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9973", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9974", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9975", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9976", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9977", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9978", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9979", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9980", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9981", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9982", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9983", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9984", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9985", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9986", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9987", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9988", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9989", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9990", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9991", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9992", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9993", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9994", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9995", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9996", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9997", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9998", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet9999", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet10000", - "Stake": 0.005, - "Online": true - }, - { - "Name": "Wallet10001", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet10002", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet10003", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet10004", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet10005", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet10006", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet10007", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet10008", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet10009", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet10010", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet10011", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet10012", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet10013", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet10014", - "Stake": 3.3333333333333335, - "Online": false - }, - { - "Name": "Wallet10015", - "Stake": 3.3333333333333335, - "Online": false - } - ], - "FeeSink": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ", - "RewardsPool": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ", - "DevMode": false, - "Comment": "" + "NetworkName": "", + "VersionModifier": "", + "ConsensusProtocol": "future", + "FirstPartKeyRound": 0, + "LastPartKeyRound": 50000, + "PartKeyDilution": 0, + "Wallets": [ + { + "Name": "Wallet1", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet10", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet11", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet12", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet13", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet14", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet15", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet16", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet17", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet18", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet19", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet20", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet21", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet22", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet23", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet24", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet25", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet26", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet27", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet28", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet29", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet30", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet31", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet32", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet33", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet34", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet35", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet36", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet37", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet38", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet39", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet40", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet41", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet42", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet43", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet44", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet45", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet46", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet47", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet48", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet49", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet50", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet51", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet52", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet53", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet54", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet55", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet56", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet57", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet58", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet59", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet60", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet61", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet62", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet63", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet64", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet65", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet66", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet67", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet68", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet69", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet70", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet71", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet72", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet73", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet74", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet75", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet76", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet77", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet78", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet79", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet80", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet81", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet82", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet83", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet84", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet85", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet86", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet87", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet88", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet89", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet90", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet91", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet92", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet93", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet94", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet95", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet96", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet97", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet98", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet99", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet100", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet101", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet102", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet103", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet104", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet105", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet106", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet107", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet108", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet109", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet110", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet111", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet112", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet113", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet114", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet115", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet116", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet117", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet118", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet119", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet120", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet121", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet122", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet123", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet124", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet125", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet126", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet127", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet128", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet129", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet130", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet131", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet132", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet133", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet134", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet135", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet136", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet137", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet138", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet139", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet140", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet141", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet142", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet143", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet144", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet145", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet146", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet147", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet148", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet149", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet150", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet151", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet152", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet153", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet154", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet155", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet156", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet157", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet158", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet159", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet160", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet161", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet162", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet163", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet164", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet165", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet166", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet167", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet168", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet169", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet170", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet171", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet172", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet173", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet174", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet175", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet176", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet177", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet178", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet179", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet180", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet181", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet182", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet183", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet184", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet185", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet186", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet187", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet188", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet189", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet190", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet191", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet192", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet193", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet194", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet195", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet196", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet197", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet198", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet199", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet200", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet201", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet202", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet203", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet204", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet205", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet206", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet207", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet208", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet209", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet210", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet211", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet212", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet213", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet214", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet215", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet216", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet217", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet218", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet219", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet220", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet221", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet222", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet223", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet224", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet225", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet226", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet227", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet228", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet229", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet230", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet231", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet232", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet233", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet234", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet235", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet236", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet237", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet238", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet239", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet240", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet241", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet242", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet243", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet244", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet245", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet246", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet247", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet248", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet249", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet250", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet251", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet252", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet253", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet254", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet255", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet256", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet257", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet258", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet259", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet260", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet261", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet262", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet263", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet264", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet265", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet266", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet267", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet268", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet269", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet270", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet271", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet272", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet273", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet274", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet275", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet276", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet277", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet278", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet279", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet280", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet281", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet282", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet283", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet284", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet285", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet286", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet287", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet288", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet289", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet290", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet291", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet292", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet293", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet294", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet295", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet296", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet297", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet298", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet299", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet300", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet301", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet302", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet303", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet304", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet305", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet306", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet307", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet308", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet309", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet310", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet311", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet312", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet313", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet314", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet315", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet316", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet317", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet318", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet319", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet320", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet321", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet322", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet323", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet324", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet325", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet326", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet327", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet328", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet329", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet330", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet331", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet332", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet333", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet334", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet335", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet336", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet337", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet338", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet339", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet340", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet341", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet342", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet343", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet344", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet345", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet346", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet347", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet348", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet349", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet350", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet351", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet352", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet353", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet354", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet355", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet356", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet357", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet358", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet359", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet360", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet361", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet362", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet363", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet364", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet365", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet366", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet367", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet368", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet369", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet370", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet371", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet372", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet373", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet374", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet375", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet376", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet377", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet378", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet379", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet380", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet381", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet382", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet383", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet384", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet385", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet386", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet387", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet388", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet389", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet390", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet391", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet392", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet393", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet394", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet395", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet396", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet397", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet398", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet399", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet400", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet401", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet402", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet403", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet404", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet405", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet406", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet407", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet408", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet409", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet410", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet411", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet412", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet413", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet414", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet415", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet416", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet417", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet418", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet419", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet420", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet421", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet422", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet423", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet424", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet425", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet426", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet427", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet428", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet429", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet430", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet431", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet432", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet433", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet434", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet435", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet436", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet437", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet438", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet439", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet440", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet441", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet442", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet443", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet444", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet445", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet446", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet447", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet448", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet449", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet450", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet451", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet452", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet453", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet454", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet455", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet456", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet457", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet458", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet459", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet460", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet461", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet462", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet463", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet464", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet465", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet466", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet467", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet468", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet469", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet470", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet471", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet472", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet473", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet474", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet475", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet476", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet477", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet478", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet479", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet480", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet481", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet482", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet483", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet484", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet485", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet486", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet487", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet488", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet489", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet490", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet491", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet492", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet493", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet494", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet495", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet496", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet497", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet498", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet499", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet500", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet501", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet502", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet503", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet504", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet505", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet506", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet507", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet508", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet509", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet510", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet511", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet512", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet513", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet514", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet515", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet516", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet517", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet518", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet519", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet520", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet521", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet522", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet523", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet524", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet525", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet526", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet527", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet528", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet529", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet530", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet531", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet532", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet533", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet534", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet535", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet536", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet537", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet538", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet539", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet540", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet541", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet542", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet543", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet544", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet545", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet546", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet547", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet548", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet549", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet550", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet551", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet552", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet553", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet554", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet555", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet556", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet557", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet558", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet559", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet560", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet561", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet562", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet563", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet564", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet565", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet566", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet567", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet568", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet569", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet570", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet571", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet572", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet573", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet574", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet575", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet576", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet577", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet578", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet579", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet580", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet581", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet582", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet583", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet584", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet585", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet586", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet587", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet588", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet589", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet590", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet591", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet592", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet593", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet594", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet595", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet596", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet597", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet598", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet599", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet600", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet601", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet602", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet603", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet604", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet605", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet606", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet607", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet608", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet609", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet610", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet611", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet612", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet613", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet614", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet615", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet616", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet617", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet618", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet619", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet620", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet621", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet622", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet623", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet624", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet625", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet626", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet627", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet628", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet629", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet630", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet631", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet632", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet633", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet634", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet635", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet636", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet637", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet638", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet639", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet640", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet641", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet642", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet643", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet644", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet645", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet646", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet647", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet648", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet649", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet650", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet651", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet652", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet653", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet654", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet655", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet656", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet657", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet658", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet659", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet660", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet661", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet662", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet663", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet664", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet665", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet666", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet667", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet668", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet669", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet670", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet671", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet672", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet673", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet674", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet675", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet676", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet677", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet678", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet679", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet680", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet681", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet682", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet683", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet684", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet685", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet686", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet687", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet688", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet689", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet690", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet691", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet692", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet693", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet694", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet695", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet696", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet697", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet698", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet699", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet700", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet701", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet702", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet703", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet704", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet705", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet706", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet707", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet708", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet709", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet710", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet711", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet712", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet713", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet714", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet715", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet716", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet717", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet718", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet719", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet720", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet721", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet722", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet723", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet724", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet725", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet726", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet727", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet728", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet729", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet730", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet731", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet732", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet733", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet734", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet735", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet736", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet737", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet738", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet739", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet740", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet741", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet742", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet743", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet744", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet745", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet746", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet747", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet748", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet749", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet750", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet751", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet752", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet753", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet754", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet755", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet756", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet757", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet758", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet759", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet760", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet761", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet762", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet763", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet764", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet765", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet766", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet767", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet768", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet769", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet770", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet771", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet772", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet773", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet774", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet775", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet776", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet777", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet778", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet779", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet780", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet781", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet782", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet783", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet784", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet785", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet786", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet787", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet788", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet789", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet790", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet791", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet792", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet793", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet794", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet795", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet796", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet797", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet798", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet799", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet800", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet801", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet802", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet803", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet804", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet805", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet806", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet807", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet808", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet809", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet810", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet811", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet812", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet813", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet814", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet815", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet816", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet817", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet818", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet819", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet820", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet821", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet822", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet823", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet824", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet825", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet826", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet827", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet828", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet829", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet830", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet831", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet832", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet833", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet834", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet835", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet836", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet837", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet838", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet839", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet840", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet841", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet842", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet843", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet844", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet845", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet846", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet847", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet848", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet849", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet850", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet851", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet852", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet853", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet854", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet855", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet856", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet857", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet858", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet859", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet860", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet861", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet862", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet863", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet864", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet865", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet866", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet867", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet868", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet869", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet870", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet871", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet872", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet873", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet874", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet875", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet876", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet877", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet878", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet879", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet880", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet881", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet882", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet883", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet884", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet885", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet886", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet887", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet888", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet889", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet890", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet891", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet892", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet893", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet894", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet895", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet896", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet897", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet898", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet899", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet900", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet901", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet902", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet903", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet904", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet905", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet906", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet907", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet908", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet909", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet910", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet911", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet912", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet913", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet914", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet915", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet916", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet917", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet918", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet919", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet920", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet921", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet922", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet923", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet924", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet925", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet926", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet927", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet928", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet929", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet930", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet931", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet932", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet933", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet934", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet935", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet936", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet937", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet938", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet939", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet940", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet941", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet942", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet943", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet944", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet945", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet946", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet947", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet948", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet949", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet950", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet951", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet952", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet953", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet954", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet955", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet956", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet957", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet958", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet959", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet960", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet961", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet962", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet963", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet964", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet965", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet966", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet967", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet968", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet969", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet970", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet971", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet972", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet973", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet974", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet975", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet976", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet977", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet978", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet979", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet980", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet981", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet982", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet983", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet984", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet985", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet986", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet987", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet988", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet989", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet990", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet991", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet992", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet993", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet994", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet995", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet996", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet997", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet998", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet999", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1000", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1001", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1002", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1003", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1004", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1005", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1006", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1007", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1008", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1009", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1010", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1011", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1012", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1013", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1014", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1015", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1016", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1017", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1018", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1019", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1020", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1021", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1022", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1023", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1024", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1025", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1026", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1027", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1028", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1029", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1030", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1031", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1032", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1033", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1034", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1035", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1036", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1037", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1038", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1039", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1040", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1041", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1042", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1043", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1044", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1045", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1046", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1047", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1048", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1049", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1050", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1051", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1052", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1053", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1054", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1055", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1056", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1057", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1058", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1059", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1060", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1061", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1062", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1063", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1064", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1065", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1066", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1067", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1068", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1069", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1070", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1071", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1072", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1073", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1074", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1075", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1076", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1077", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1078", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1079", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1080", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1081", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1082", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1083", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1084", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1085", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1086", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1087", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1088", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1089", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1090", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1091", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1092", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1093", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1094", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1095", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1096", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1097", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1098", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1099", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1100", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1101", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1102", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1103", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1104", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1105", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1106", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1107", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1108", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1109", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1110", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1111", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1112", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1113", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1114", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1115", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1116", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1117", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1118", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1119", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1120", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1121", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1122", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1123", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1124", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1125", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1126", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1127", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1128", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1129", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1130", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1131", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1132", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1133", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1134", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1135", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1136", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1137", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1138", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1139", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1140", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1141", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1142", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1143", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1144", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1145", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1146", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1147", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1148", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1149", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1150", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1151", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1152", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1153", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1154", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1155", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1156", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1157", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1158", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1159", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1160", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1161", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1162", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1163", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1164", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1165", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1166", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1167", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1168", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1169", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1170", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1171", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1172", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1173", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1174", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1175", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1176", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1177", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1178", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1179", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1180", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1181", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1182", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1183", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1184", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1185", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1186", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1187", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1188", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1189", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1190", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1191", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1192", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1193", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1194", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1195", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1196", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1197", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1198", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1199", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1200", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1201", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1202", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1203", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1204", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1205", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1206", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1207", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1208", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1209", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1210", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1211", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1212", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1213", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1214", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1215", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1216", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1217", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1218", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1219", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1220", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1221", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1222", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1223", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1224", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1225", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1226", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1227", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1228", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1229", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1230", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1231", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1232", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1233", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1234", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1235", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1236", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1237", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1238", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1239", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1240", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1241", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1242", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1243", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1244", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1245", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1246", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1247", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1248", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1249", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1250", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1251", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1252", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1253", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1254", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1255", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1256", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1257", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1258", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1259", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1260", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1261", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1262", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1263", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1264", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1265", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1266", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1267", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1268", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1269", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1270", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1271", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1272", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1273", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1274", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1275", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1276", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1277", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1278", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1279", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1280", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1281", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1282", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1283", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1284", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1285", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1286", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1287", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1288", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1289", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1290", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1291", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1292", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1293", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1294", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1295", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1296", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1297", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1298", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1299", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1300", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1301", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1302", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1303", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1304", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1305", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1306", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1307", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1308", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1309", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1310", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1311", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1312", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1313", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1314", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1315", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1316", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1317", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1318", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1319", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1320", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1321", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1322", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1323", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1324", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1325", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1326", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1327", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1328", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1329", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1330", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1331", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1332", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1333", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1334", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1335", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1336", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1337", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1338", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1339", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1340", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1341", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1342", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1343", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1344", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1345", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1346", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1347", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1348", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1349", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1350", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1351", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1352", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1353", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1354", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1355", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1356", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1357", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1358", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1359", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1360", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1361", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1362", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1363", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1364", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1365", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1366", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1367", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1368", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1369", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1370", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1371", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1372", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1373", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1374", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1375", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1376", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1377", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1378", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1379", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1380", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1381", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1382", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1383", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1384", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1385", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1386", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1387", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1388", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1389", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1390", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1391", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1392", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1393", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1394", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1395", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1396", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1397", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1398", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1399", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1400", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1401", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1402", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1403", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1404", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1405", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1406", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1407", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1408", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1409", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1410", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1411", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1412", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1413", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1414", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1415", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1416", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1417", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1418", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1419", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1420", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1421", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1422", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1423", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1424", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1425", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1426", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1427", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1428", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1429", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1430", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1431", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1432", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1433", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1434", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1435", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1436", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1437", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1438", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1439", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1440", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1441", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1442", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1443", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1444", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1445", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1446", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1447", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1448", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1449", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1450", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1451", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1452", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1453", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1454", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1455", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1456", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1457", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1458", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1459", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1460", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1461", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1462", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1463", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1464", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1465", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1466", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1467", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1468", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1469", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1470", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1471", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1472", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1473", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1474", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1475", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1476", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1477", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1478", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1479", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1480", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1481", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1482", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1483", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1484", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1485", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1486", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1487", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1488", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1489", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1490", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1491", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1492", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1493", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1494", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1495", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1496", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1497", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1498", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1499", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1500", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1501", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1502", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1503", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1504", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1505", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1506", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1507", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1508", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1509", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1510", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1511", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1512", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1513", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1514", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1515", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1516", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1517", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1518", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1519", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1520", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1521", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1522", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1523", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1524", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1525", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1526", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1527", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1528", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1529", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1530", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1531", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1532", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1533", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1534", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1535", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1536", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1537", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1538", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1539", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1540", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1541", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1542", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1543", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1544", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1545", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1546", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1547", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1548", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1549", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1550", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1551", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1552", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1553", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1554", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1555", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1556", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1557", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1558", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1559", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1560", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1561", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1562", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1563", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1564", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1565", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1566", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1567", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1568", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1569", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1570", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1571", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1572", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1573", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1574", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1575", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1576", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1577", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1578", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1579", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1580", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1581", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1582", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1583", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1584", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1585", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1586", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1587", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1588", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1589", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1590", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1591", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1592", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1593", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1594", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1595", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1596", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1597", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1598", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1599", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1600", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1601", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1602", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1603", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1604", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1605", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1606", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1607", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1608", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1609", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1610", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1611", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1612", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1613", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1614", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1615", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1616", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1617", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1618", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1619", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1620", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1621", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1622", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1623", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1624", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1625", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1626", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1627", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1628", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1629", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1630", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1631", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1632", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1633", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1634", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1635", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1636", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1637", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1638", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1639", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1640", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1641", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1642", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1643", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1644", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1645", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1646", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1647", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1648", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1649", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1650", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1651", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1652", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1653", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1654", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1655", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1656", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1657", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1658", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1659", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1660", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1661", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1662", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1663", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1664", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1665", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1666", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1667", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1668", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1669", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1670", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1671", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1672", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1673", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1674", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1675", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1676", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1677", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1678", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1679", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1680", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1681", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1682", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1683", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1684", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1685", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1686", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1687", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1688", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1689", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1690", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1691", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1692", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1693", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1694", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1695", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1696", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1697", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1698", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1699", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1700", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1701", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1702", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1703", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1704", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1705", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1706", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1707", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1708", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1709", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1710", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1711", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1712", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1713", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1714", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1715", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1716", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1717", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1718", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1719", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1720", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1721", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1722", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1723", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1724", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1725", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1726", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1727", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1728", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1729", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1730", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1731", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1732", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1733", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1734", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1735", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1736", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1737", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1738", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1739", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1740", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1741", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1742", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1743", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1744", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1745", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1746", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1747", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1748", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1749", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1750", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1751", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1752", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1753", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1754", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1755", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1756", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1757", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1758", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1759", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1760", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1761", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1762", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1763", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1764", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1765", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1766", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1767", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1768", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1769", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1770", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1771", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1772", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1773", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1774", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1775", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1776", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1777", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1778", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1779", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1780", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1781", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1782", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1783", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1784", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1785", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1786", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1787", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1788", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1789", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1790", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1791", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1792", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1793", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1794", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1795", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1796", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1797", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1798", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1799", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1800", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1801", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1802", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1803", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1804", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1805", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1806", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1807", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1808", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1809", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1810", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1811", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1812", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1813", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1814", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1815", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1816", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1817", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1818", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1819", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1820", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1821", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1822", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1823", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1824", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1825", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1826", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1827", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1828", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1829", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1830", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1831", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1832", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1833", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1834", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1835", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1836", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1837", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1838", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1839", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1840", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1841", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1842", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1843", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1844", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1845", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1846", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1847", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1848", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1849", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1850", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1851", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1852", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1853", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1854", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1855", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1856", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1857", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1858", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1859", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1860", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1861", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1862", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1863", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1864", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1865", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1866", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1867", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1868", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1869", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1870", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1871", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1872", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1873", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1874", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1875", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1876", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1877", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1878", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1879", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1880", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1881", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1882", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1883", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1884", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1885", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1886", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1887", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1888", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1889", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1890", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1891", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1892", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1893", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1894", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1895", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1896", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1897", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1898", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1899", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1900", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1901", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1902", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1903", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1904", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1905", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1906", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1907", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1908", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1909", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1910", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1911", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1912", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1913", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1914", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1915", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1916", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1917", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1918", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1919", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1920", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1921", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1922", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1923", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1924", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1925", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1926", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1927", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1928", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1929", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1930", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1931", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1932", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1933", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1934", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1935", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1936", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1937", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1938", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1939", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1940", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1941", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1942", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1943", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1944", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1945", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1946", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1947", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1948", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1949", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1950", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1951", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1952", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1953", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1954", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1955", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1956", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1957", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1958", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1959", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1960", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1961", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1962", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1963", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1964", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1965", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1966", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1967", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1968", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1969", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1970", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1971", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1972", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1973", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1974", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1975", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1976", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1977", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1978", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1979", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1980", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1981", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1982", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1983", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1984", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1985", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1986", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1987", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1988", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1989", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1990", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1991", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1992", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1993", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1994", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1995", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1996", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1997", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1998", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet1999", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2000", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2001", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2002", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2003", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2004", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2005", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2006", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2007", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2008", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2009", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2010", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2011", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2012", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2013", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2014", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2015", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2016", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2017", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2018", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2019", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2020", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2021", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2022", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2023", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2024", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2025", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2026", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2027", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2028", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2029", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2030", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2031", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2032", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2033", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2034", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2035", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2036", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2037", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2038", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2039", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2040", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2041", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2042", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2043", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2044", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2045", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2046", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2047", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2048", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2049", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2050", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2051", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2052", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2053", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2054", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2055", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2056", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2057", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2058", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2059", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2060", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2061", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2062", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2063", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2064", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2065", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2066", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2067", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2068", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2069", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2070", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2071", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2072", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2073", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2074", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2075", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2076", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2077", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2078", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2079", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2080", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2081", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2082", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2083", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2084", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2085", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2086", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2087", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2088", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2089", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2090", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2091", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2092", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2093", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2094", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2095", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2096", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2097", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2098", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2099", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2100", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2101", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2102", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2103", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2104", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2105", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2106", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2107", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2108", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2109", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2110", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2111", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2112", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2113", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2114", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2115", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2116", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2117", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2118", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2119", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2120", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2121", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2122", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2123", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2124", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2125", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2126", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2127", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2128", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2129", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2130", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2131", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2132", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2133", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2134", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2135", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2136", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2137", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2138", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2139", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2140", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2141", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2142", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2143", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2144", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2145", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2146", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2147", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2148", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2149", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2150", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2151", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2152", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2153", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2154", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2155", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2156", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2157", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2158", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2159", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2160", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2161", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2162", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2163", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2164", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2165", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2166", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2167", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2168", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2169", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2170", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2171", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2172", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2173", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2174", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2175", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2176", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2177", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2178", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2179", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2180", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2181", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2182", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2183", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2184", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2185", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2186", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2187", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2188", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2189", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2190", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2191", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2192", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2193", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2194", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2195", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2196", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2197", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2198", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2199", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2200", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2201", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2202", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2203", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2204", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2205", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2206", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2207", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2208", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2209", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2210", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2211", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2212", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2213", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2214", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2215", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2216", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2217", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2218", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2219", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2220", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2221", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2222", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2223", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2224", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2225", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2226", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2227", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2228", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2229", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2230", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2231", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2232", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2233", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2234", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2235", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2236", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2237", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2238", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2239", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2240", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2241", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2242", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2243", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2244", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2245", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2246", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2247", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2248", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2249", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2250", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2251", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2252", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2253", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2254", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2255", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2256", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2257", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2258", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2259", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2260", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2261", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2262", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2263", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2264", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2265", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2266", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2267", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2268", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2269", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2270", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2271", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2272", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2273", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2274", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2275", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2276", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2277", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2278", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2279", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2280", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2281", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2282", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2283", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2284", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2285", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2286", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2287", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2288", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2289", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2290", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2291", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2292", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2293", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2294", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2295", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2296", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2297", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2298", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2299", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2300", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2301", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2302", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2303", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2304", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2305", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2306", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2307", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2308", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2309", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2310", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2311", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2312", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2313", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2314", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2315", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2316", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2317", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2318", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2319", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2320", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2321", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2322", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2323", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2324", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2325", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2326", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2327", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2328", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2329", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2330", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2331", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2332", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2333", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2334", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2335", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2336", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2337", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2338", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2339", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2340", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2341", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2342", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2343", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2344", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2345", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2346", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2347", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2348", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2349", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2350", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2351", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2352", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2353", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2354", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2355", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2356", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2357", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2358", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2359", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2360", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2361", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2362", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2363", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2364", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2365", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2366", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2367", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2368", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2369", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2370", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2371", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2372", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2373", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2374", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2375", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2376", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2377", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2378", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2379", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2380", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2381", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2382", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2383", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2384", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2385", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2386", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2387", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2388", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2389", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2390", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2391", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2392", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2393", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2394", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2395", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2396", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2397", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2398", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2399", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2400", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2401", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2402", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2403", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2404", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2405", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2406", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2407", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2408", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2409", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2410", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2411", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2412", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2413", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2414", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2415", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2416", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2417", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2418", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2419", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2420", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2421", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2422", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2423", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2424", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2425", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2426", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2427", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2428", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2429", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2430", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2431", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2432", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2433", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2434", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2435", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2436", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2437", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2438", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2439", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2440", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2441", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2442", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2443", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2444", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2445", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2446", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2447", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2448", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2449", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2450", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2451", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2452", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2453", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2454", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2455", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2456", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2457", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2458", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2459", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2460", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2461", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2462", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2463", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2464", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2465", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2466", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2467", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2468", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2469", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2470", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2471", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2472", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2473", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2474", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2475", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2476", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2477", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2478", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2479", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2480", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2481", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2482", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2483", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2484", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2485", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2486", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2487", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2488", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2489", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2490", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2491", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2492", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2493", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2494", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2495", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2496", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2497", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2498", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2499", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2500", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2501", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2502", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2503", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2504", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2505", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2506", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2507", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2508", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2509", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2510", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2511", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2512", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2513", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2514", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2515", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2516", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2517", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2518", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2519", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2520", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2521", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2522", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2523", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2524", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2525", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2526", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2527", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2528", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2529", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2530", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2531", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2532", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2533", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2534", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2535", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2536", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2537", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2538", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2539", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2540", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2541", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2542", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2543", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2544", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2545", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2546", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2547", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2548", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2549", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2550", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2551", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2552", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2553", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2554", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2555", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2556", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2557", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2558", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2559", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2560", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2561", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2562", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2563", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2564", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2565", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2566", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2567", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2568", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2569", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2570", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2571", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2572", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2573", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2574", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2575", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2576", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2577", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2578", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2579", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2580", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2581", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2582", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2583", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2584", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2585", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2586", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2587", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2588", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2589", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2590", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2591", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2592", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2593", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2594", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2595", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2596", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2597", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2598", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2599", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2600", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2601", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2602", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2603", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2604", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2605", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2606", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2607", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2608", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2609", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2610", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2611", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2612", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2613", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2614", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2615", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2616", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2617", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2618", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2619", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2620", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2621", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2622", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2623", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2624", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2625", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2626", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2627", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2628", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2629", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2630", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2631", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2632", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2633", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2634", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2635", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2636", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2637", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2638", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2639", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2640", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2641", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2642", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2643", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2644", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2645", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2646", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2647", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2648", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2649", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2650", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2651", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2652", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2653", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2654", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2655", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2656", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2657", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2658", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2659", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2660", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2661", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2662", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2663", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2664", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2665", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2666", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2667", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2668", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2669", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2670", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2671", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2672", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2673", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2674", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2675", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2676", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2677", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2678", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2679", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2680", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2681", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2682", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2683", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2684", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2685", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2686", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2687", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2688", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2689", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2690", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2691", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2692", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2693", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2694", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2695", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2696", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2697", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2698", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2699", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2700", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2701", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2702", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2703", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2704", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2705", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2706", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2707", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2708", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2709", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2710", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2711", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2712", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2713", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2714", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2715", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2716", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2717", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2718", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2719", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2720", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2721", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2722", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2723", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2724", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2725", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2726", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2727", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2728", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2729", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2730", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2731", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2732", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2733", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2734", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2735", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2736", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2737", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2738", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2739", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2740", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2741", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2742", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2743", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2744", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2745", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2746", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2747", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2748", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2749", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2750", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2751", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2752", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2753", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2754", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2755", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2756", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2757", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2758", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2759", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2760", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2761", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2762", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2763", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2764", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2765", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2766", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2767", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2768", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2769", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2770", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2771", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2772", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2773", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2774", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2775", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2776", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2777", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2778", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2779", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2780", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2781", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2782", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2783", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2784", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2785", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2786", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2787", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2788", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2789", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2790", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2791", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2792", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2793", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2794", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2795", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2796", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2797", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2798", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2799", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2800", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2801", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2802", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2803", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2804", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2805", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2806", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2807", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2808", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2809", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2810", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2811", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2812", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2813", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2814", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2815", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2816", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2817", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2818", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2819", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2820", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2821", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2822", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2823", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2824", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2825", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2826", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2827", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2828", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2829", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2830", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2831", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2832", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2833", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2834", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2835", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2836", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2837", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2838", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2839", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2840", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2841", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2842", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2843", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2844", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2845", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2846", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2847", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2848", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2849", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2850", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2851", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2852", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2853", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2854", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2855", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2856", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2857", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2858", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2859", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2860", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2861", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2862", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2863", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2864", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2865", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2866", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2867", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2868", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2869", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2870", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2871", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2872", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2873", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2874", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2875", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2876", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2877", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2878", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2879", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2880", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2881", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2882", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2883", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2884", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2885", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2886", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2887", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2888", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2889", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2890", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2891", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2892", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2893", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2894", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2895", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2896", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2897", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2898", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2899", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2900", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2901", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2902", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2903", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2904", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2905", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2906", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2907", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2908", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2909", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2910", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2911", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2912", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2913", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2914", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2915", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2916", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2917", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2918", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2919", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2920", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2921", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2922", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2923", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2924", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2925", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2926", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2927", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2928", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2929", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2930", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2931", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2932", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2933", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2934", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2935", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2936", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2937", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2938", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2939", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2940", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2941", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2942", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2943", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2944", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2945", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2946", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2947", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2948", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2949", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2950", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2951", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2952", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2953", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2954", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2955", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2956", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2957", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2958", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2959", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2960", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2961", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2962", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2963", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2964", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2965", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2966", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2967", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2968", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2969", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2970", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2971", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2972", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2973", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2974", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2975", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2976", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2977", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2978", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2979", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2980", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2981", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2982", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2983", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2984", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2985", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2986", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2987", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2988", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2989", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2990", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2991", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2992", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2993", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2994", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2995", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2996", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2997", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2998", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet2999", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3000", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3001", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3002", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3003", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3004", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3005", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3006", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3007", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3008", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3009", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3010", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3011", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3012", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3013", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3014", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3015", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3016", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3017", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3018", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3019", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3020", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3021", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3022", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3023", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3024", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3025", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3026", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3027", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3028", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3029", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3030", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3031", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3032", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3033", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3034", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3035", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3036", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3037", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3038", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3039", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3040", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3041", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3042", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3043", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3044", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3045", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3046", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3047", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3048", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3049", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3050", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3051", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3052", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3053", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3054", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3055", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3056", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3057", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3058", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3059", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3060", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3061", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3062", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3063", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3064", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3065", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3066", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3067", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3068", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3069", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3070", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3071", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3072", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3073", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3074", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3075", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3076", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3077", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3078", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3079", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3080", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3081", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3082", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3083", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3084", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3085", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3086", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3087", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3088", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3089", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3090", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3091", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3092", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3093", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3094", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3095", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3096", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3097", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3098", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3099", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3100", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3101", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3102", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3103", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3104", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3105", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3106", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3107", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3108", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3109", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3110", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3111", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3112", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3113", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3114", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3115", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3116", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3117", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3118", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3119", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3120", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3121", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3122", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3123", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3124", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3125", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3126", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3127", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3128", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3129", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3130", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3131", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3132", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3133", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3134", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3135", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3136", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3137", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3138", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3139", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3140", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3141", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3142", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3143", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3144", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3145", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3146", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3147", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3148", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3149", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3150", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3151", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3152", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3153", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3154", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3155", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3156", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3157", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3158", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3159", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3160", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3161", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3162", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3163", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3164", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3165", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3166", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3167", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3168", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3169", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3170", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3171", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3172", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3173", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3174", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3175", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3176", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3177", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3178", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3179", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3180", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3181", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3182", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3183", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3184", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3185", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3186", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3187", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3188", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3189", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3190", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3191", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3192", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3193", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3194", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3195", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3196", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3197", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3198", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3199", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3200", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3201", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3202", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3203", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3204", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3205", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3206", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3207", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3208", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3209", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3210", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3211", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3212", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3213", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3214", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3215", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3216", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3217", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3218", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3219", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3220", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3221", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3222", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3223", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3224", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3225", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3226", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3227", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3228", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3229", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3230", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3231", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3232", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3233", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3234", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3235", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3236", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3237", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3238", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3239", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3240", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3241", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3242", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3243", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3244", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3245", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3246", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3247", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3248", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3249", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3250", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3251", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3252", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3253", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3254", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3255", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3256", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3257", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3258", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3259", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3260", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3261", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3262", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3263", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3264", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3265", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3266", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3267", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3268", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3269", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3270", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3271", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3272", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3273", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3274", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3275", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3276", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3277", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3278", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3279", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3280", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3281", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3282", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3283", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3284", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3285", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3286", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3287", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3288", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3289", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3290", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3291", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3292", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3293", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3294", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3295", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3296", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3297", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3298", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3299", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3300", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3301", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3302", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3303", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3304", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3305", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3306", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3307", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3308", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3309", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3310", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3311", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3312", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3313", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3314", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3315", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3316", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3317", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3318", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3319", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3320", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3321", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3322", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3323", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3324", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3325", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3326", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3327", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3328", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3329", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3330", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3331", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3332", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3333", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3334", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3335", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3336", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3337", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3338", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3339", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3340", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3341", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3342", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3343", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3344", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3345", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3346", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3347", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3348", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3349", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3350", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3351", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3352", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3353", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3354", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3355", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3356", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3357", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3358", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3359", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3360", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3361", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3362", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3363", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3364", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3365", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3366", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3367", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3368", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3369", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3370", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3371", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3372", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3373", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3374", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3375", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3376", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3377", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3378", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3379", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3380", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3381", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3382", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3383", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3384", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3385", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3386", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3387", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3388", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3389", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3390", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3391", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3392", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3393", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3394", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3395", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3396", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3397", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3398", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3399", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3400", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3401", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3402", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3403", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3404", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3405", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3406", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3407", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3408", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3409", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3410", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3411", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3412", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3413", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3414", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3415", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3416", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3417", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3418", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3419", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3420", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3421", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3422", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3423", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3424", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3425", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3426", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3427", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3428", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3429", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3430", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3431", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3432", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3433", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3434", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3435", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3436", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3437", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3438", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3439", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3440", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3441", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3442", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3443", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3444", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3445", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3446", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3447", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3448", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3449", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3450", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3451", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3452", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3453", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3454", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3455", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3456", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3457", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3458", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3459", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3460", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3461", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3462", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3463", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3464", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3465", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3466", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3467", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3468", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3469", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3470", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3471", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3472", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3473", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3474", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3475", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3476", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3477", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3478", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3479", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3480", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3481", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3482", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3483", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3484", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3485", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3486", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3487", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3488", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3489", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3490", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3491", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3492", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3493", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3494", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3495", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3496", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3497", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3498", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3499", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3500", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3501", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3502", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3503", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3504", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3505", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3506", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3507", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3508", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3509", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3510", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3511", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3512", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3513", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3514", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3515", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3516", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3517", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3518", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3519", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3520", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3521", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3522", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3523", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3524", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3525", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3526", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3527", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3528", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3529", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3530", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3531", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3532", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3533", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3534", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3535", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3536", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3537", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3538", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3539", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3540", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3541", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3542", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3543", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3544", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3545", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3546", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3547", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3548", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3549", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3550", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3551", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3552", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3553", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3554", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3555", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3556", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3557", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3558", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3559", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3560", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3561", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3562", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3563", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3564", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3565", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3566", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3567", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3568", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3569", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3570", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3571", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3572", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3573", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3574", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3575", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3576", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3577", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3578", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3579", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3580", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3581", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3582", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3583", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3584", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3585", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3586", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3587", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3588", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3589", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3590", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3591", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3592", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3593", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3594", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3595", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3596", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3597", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3598", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3599", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3600", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3601", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3602", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3603", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3604", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3605", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3606", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3607", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3608", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3609", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3610", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3611", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3612", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3613", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3614", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3615", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3616", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3617", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3618", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3619", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3620", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3621", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3622", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3623", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3624", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3625", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3626", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3627", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3628", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3629", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3630", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3631", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3632", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3633", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3634", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3635", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3636", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3637", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3638", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3639", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3640", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3641", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3642", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3643", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3644", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3645", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3646", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3647", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3648", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3649", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3650", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3651", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3652", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3653", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3654", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3655", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3656", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3657", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3658", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3659", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3660", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3661", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3662", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3663", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3664", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3665", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3666", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3667", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3668", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3669", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3670", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3671", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3672", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3673", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3674", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3675", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3676", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3677", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3678", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3679", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3680", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3681", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3682", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3683", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3684", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3685", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3686", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3687", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3688", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3689", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3690", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3691", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3692", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3693", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3694", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3695", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3696", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3697", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3698", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3699", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3700", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3701", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3702", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3703", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3704", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3705", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3706", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3707", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3708", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3709", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3710", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3711", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3712", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3713", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3714", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3715", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3716", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3717", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3718", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3719", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3720", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3721", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3722", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3723", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3724", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3725", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3726", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3727", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3728", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3729", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3730", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3731", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3732", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3733", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3734", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3735", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3736", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3737", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3738", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3739", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3740", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3741", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3742", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3743", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3744", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3745", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3746", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3747", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3748", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3749", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3750", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3751", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3752", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3753", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3754", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3755", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3756", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3757", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3758", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3759", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3760", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3761", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3762", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3763", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3764", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3765", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3766", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3767", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3768", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3769", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3770", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3771", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3772", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3773", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3774", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3775", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3776", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3777", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3778", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3779", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3780", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3781", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3782", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3783", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3784", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3785", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3786", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3787", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3788", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3789", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3790", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3791", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3792", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3793", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3794", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3795", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3796", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3797", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3798", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3799", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3800", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3801", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3802", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3803", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3804", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3805", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3806", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3807", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3808", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3809", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3810", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3811", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3812", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3813", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3814", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3815", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3816", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3817", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3818", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3819", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3820", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3821", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3822", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3823", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3824", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3825", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3826", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3827", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3828", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3829", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3830", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3831", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3832", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3833", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3834", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3835", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3836", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3837", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3838", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3839", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3840", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3841", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3842", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3843", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3844", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3845", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3846", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3847", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3848", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3849", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3850", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3851", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3852", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3853", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3854", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3855", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3856", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3857", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3858", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3859", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3860", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3861", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3862", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3863", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3864", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3865", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3866", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3867", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3868", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3869", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3870", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3871", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3872", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3873", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3874", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3875", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3876", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3877", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3878", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3879", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3880", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3881", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3882", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3883", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3884", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3885", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3886", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3887", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3888", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3889", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3890", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3891", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3892", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3893", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3894", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3895", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3896", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3897", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3898", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3899", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3900", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3901", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3902", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3903", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3904", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3905", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3906", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3907", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3908", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3909", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3910", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3911", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3912", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3913", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3914", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3915", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3916", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3917", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3918", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3919", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3920", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3921", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3922", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3923", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3924", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3925", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3926", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3927", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3928", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3929", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3930", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3931", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3932", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3933", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3934", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3935", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3936", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3937", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3938", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3939", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3940", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3941", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3942", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3943", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3944", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3945", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3946", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3947", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3948", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3949", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3950", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3951", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3952", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3953", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3954", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3955", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3956", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3957", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3958", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3959", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3960", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3961", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3962", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3963", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3964", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3965", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3966", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3967", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3968", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3969", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3970", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3971", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3972", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3973", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3974", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3975", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3976", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3977", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3978", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3979", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3980", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3981", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3982", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3983", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3984", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3985", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3986", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3987", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3988", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3989", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3990", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3991", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3992", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3993", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3994", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3995", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3996", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3997", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3998", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet3999", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4000", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4001", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4002", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4003", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4004", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4005", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4006", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4007", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4008", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4009", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4010", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4011", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4012", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4013", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4014", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4015", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4016", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4017", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4018", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4019", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4020", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4021", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4022", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4023", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4024", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4025", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4026", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4027", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4028", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4029", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4030", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4031", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4032", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4033", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4034", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4035", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4036", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4037", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4038", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4039", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4040", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4041", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4042", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4043", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4044", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4045", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4046", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4047", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4048", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4049", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4050", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4051", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4052", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4053", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4054", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4055", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4056", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4057", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4058", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4059", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4060", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4061", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4062", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4063", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4064", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4065", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4066", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4067", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4068", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4069", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4070", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4071", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4072", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4073", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4074", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4075", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4076", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4077", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4078", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4079", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4080", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4081", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4082", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4083", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4084", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4085", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4086", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4087", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4088", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4089", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4090", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4091", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4092", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4093", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4094", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4095", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4096", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4097", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4098", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4099", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4100", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4101", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4102", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4103", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4104", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4105", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4106", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4107", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4108", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4109", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4110", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4111", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4112", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4113", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4114", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4115", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4116", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4117", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4118", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4119", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4120", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4121", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4122", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4123", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4124", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4125", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4126", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4127", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4128", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4129", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4130", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4131", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4132", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4133", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4134", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4135", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4136", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4137", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4138", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4139", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4140", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4141", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4142", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4143", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4144", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4145", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4146", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4147", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4148", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4149", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4150", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4151", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4152", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4153", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4154", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4155", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4156", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4157", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4158", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4159", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4160", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4161", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4162", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4163", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4164", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4165", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4166", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4167", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4168", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4169", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4170", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4171", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4172", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4173", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4174", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4175", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4176", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4177", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4178", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4179", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4180", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4181", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4182", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4183", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4184", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4185", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4186", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4187", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4188", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4189", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4190", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4191", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4192", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4193", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4194", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4195", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4196", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4197", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4198", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4199", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4200", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4201", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4202", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4203", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4204", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4205", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4206", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4207", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4208", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4209", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4210", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4211", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4212", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4213", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4214", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4215", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4216", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4217", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4218", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4219", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4220", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4221", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4222", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4223", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4224", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4225", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4226", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4227", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4228", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4229", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4230", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4231", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4232", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4233", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4234", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4235", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4236", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4237", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4238", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4239", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4240", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4241", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4242", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4243", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4244", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4245", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4246", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4247", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4248", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4249", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4250", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4251", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4252", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4253", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4254", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4255", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4256", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4257", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4258", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4259", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4260", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4261", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4262", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4263", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4264", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4265", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4266", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4267", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4268", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4269", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4270", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4271", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4272", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4273", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4274", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4275", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4276", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4277", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4278", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4279", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4280", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4281", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4282", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4283", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4284", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4285", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4286", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4287", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4288", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4289", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4290", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4291", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4292", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4293", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4294", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4295", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4296", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4297", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4298", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4299", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4300", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4301", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4302", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4303", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4304", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4305", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4306", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4307", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4308", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4309", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4310", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4311", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4312", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4313", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4314", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4315", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4316", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4317", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4318", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4319", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4320", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4321", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4322", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4323", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4324", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4325", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4326", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4327", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4328", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4329", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4330", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4331", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4332", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4333", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4334", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4335", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4336", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4337", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4338", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4339", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4340", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4341", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4342", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4343", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4344", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4345", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4346", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4347", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4348", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4349", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4350", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4351", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4352", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4353", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4354", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4355", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4356", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4357", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4358", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4359", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4360", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4361", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4362", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4363", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4364", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4365", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4366", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4367", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4368", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4369", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4370", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4371", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4372", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4373", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4374", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4375", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4376", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4377", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4378", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4379", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4380", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4381", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4382", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4383", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4384", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4385", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4386", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4387", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4388", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4389", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4390", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4391", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4392", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4393", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4394", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4395", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4396", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4397", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4398", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4399", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4400", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4401", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4402", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4403", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4404", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4405", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4406", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4407", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4408", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4409", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4410", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4411", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4412", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4413", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4414", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4415", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4416", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4417", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4418", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4419", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4420", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4421", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4422", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4423", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4424", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4425", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4426", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4427", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4428", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4429", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4430", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4431", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4432", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4433", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4434", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4435", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4436", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4437", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4438", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4439", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4440", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4441", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4442", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4443", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4444", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4445", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4446", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4447", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4448", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4449", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4450", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4451", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4452", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4453", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4454", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4455", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4456", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4457", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4458", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4459", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4460", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4461", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4462", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4463", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4464", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4465", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4466", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4467", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4468", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4469", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4470", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4471", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4472", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4473", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4474", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4475", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4476", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4477", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4478", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4479", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4480", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4481", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4482", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4483", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4484", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4485", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4486", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4487", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4488", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4489", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4490", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4491", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4492", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4493", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4494", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4495", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4496", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4497", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4498", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4499", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4500", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4501", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4502", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4503", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4504", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4505", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4506", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4507", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4508", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4509", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4510", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4511", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4512", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4513", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4514", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4515", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4516", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4517", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4518", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4519", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4520", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4521", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4522", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4523", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4524", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4525", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4526", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4527", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4528", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4529", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4530", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4531", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4532", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4533", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4534", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4535", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4536", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4537", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4538", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4539", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4540", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4541", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4542", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4543", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4544", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4545", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4546", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4547", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4548", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4549", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4550", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4551", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4552", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4553", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4554", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4555", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4556", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4557", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4558", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4559", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4560", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4561", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4562", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4563", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4564", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4565", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4566", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4567", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4568", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4569", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4570", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4571", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4572", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4573", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4574", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4575", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4576", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4577", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4578", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4579", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4580", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4581", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4582", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4583", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4584", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4585", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4586", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4587", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4588", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4589", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4590", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4591", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4592", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4593", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4594", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4595", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4596", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4597", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4598", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4599", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4600", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4601", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4602", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4603", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4604", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4605", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4606", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4607", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4608", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4609", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4610", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4611", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4612", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4613", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4614", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4615", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4616", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4617", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4618", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4619", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4620", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4621", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4622", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4623", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4624", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4625", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4626", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4627", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4628", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4629", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4630", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4631", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4632", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4633", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4634", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4635", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4636", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4637", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4638", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4639", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4640", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4641", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4642", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4643", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4644", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4645", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4646", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4647", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4648", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4649", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4650", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4651", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4652", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4653", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4654", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4655", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4656", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4657", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4658", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4659", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4660", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4661", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4662", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4663", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4664", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4665", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4666", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4667", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4668", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4669", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4670", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4671", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4672", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4673", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4674", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4675", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4676", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4677", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4678", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4679", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4680", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4681", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4682", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4683", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4684", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4685", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4686", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4687", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4688", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4689", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4690", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4691", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4692", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4693", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4694", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4695", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4696", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4697", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4698", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4699", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4700", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4701", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4702", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4703", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4704", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4705", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4706", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4707", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4708", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4709", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4710", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4711", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4712", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4713", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4714", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4715", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4716", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4717", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4718", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4719", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4720", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4721", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4722", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4723", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4724", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4725", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4726", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4727", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4728", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4729", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4730", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4731", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4732", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4733", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4734", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4735", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4736", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4737", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4738", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4739", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4740", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4741", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4742", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4743", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4744", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4745", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4746", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4747", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4748", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4749", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4750", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4751", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4752", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4753", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4754", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4755", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4756", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4757", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4758", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4759", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4760", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4761", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4762", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4763", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4764", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4765", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4766", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4767", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4768", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4769", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4770", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4771", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4772", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4773", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4774", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4775", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4776", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4777", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4778", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4779", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4780", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4781", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4782", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4783", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4784", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4785", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4786", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4787", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4788", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4789", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4790", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4791", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4792", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4793", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4794", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4795", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4796", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4797", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4798", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4799", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4800", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4801", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4802", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4803", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4804", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4805", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4806", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4807", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4808", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4809", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4810", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4811", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4812", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4813", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4814", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4815", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4816", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4817", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4818", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4819", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4820", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4821", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4822", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4823", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4824", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4825", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4826", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4827", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4828", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4829", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4830", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4831", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4832", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4833", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4834", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4835", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4836", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4837", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4838", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4839", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4840", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4841", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4842", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4843", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4844", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4845", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4846", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4847", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4848", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4849", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4850", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4851", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4852", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4853", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4854", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4855", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4856", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4857", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4858", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4859", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4860", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4861", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4862", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4863", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4864", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4865", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4866", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4867", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4868", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4869", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4870", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4871", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4872", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4873", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4874", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4875", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4876", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4877", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4878", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4879", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4880", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4881", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4882", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4883", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4884", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4885", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4886", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4887", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4888", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4889", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4890", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4891", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4892", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4893", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4894", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4895", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4896", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4897", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4898", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4899", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4900", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4901", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4902", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4903", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4904", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4905", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4906", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4907", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4908", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4909", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4910", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4911", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4912", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4913", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4914", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4915", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4916", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4917", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4918", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4919", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4920", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4921", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4922", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4923", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4924", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4925", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4926", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4927", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4928", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4929", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4930", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4931", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4932", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4933", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4934", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4935", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4936", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4937", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4938", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4939", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4940", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4941", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4942", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4943", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4944", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4945", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4946", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4947", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4948", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4949", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4950", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4951", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4952", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4953", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4954", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4955", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4956", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4957", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4958", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4959", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4960", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4961", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4962", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4963", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4964", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4965", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4966", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4967", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4968", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4969", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4970", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4971", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4972", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4973", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4974", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4975", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4976", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4977", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4978", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4979", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4980", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4981", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4982", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4983", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4984", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4985", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4986", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4987", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4988", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4989", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4990", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4991", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4992", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4993", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4994", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4995", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4996", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4997", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4998", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet4999", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5000", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5001", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5002", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5003", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5004", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5005", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5006", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5007", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5008", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5009", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5010", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5011", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5012", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5013", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5014", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5015", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5016", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5017", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5018", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5019", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5020", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5021", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5022", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5023", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5024", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5025", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5026", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5027", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5028", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5029", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5030", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5031", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5032", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5033", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5034", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5035", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5036", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5037", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5038", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5039", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5040", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5041", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5042", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5043", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5044", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5045", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5046", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5047", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5048", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5049", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5050", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5051", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5052", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5053", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5054", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5055", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5056", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5057", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5058", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5059", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5060", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5061", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5062", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5063", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5064", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5065", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5066", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5067", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5068", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5069", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5070", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5071", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5072", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5073", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5074", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5075", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5076", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5077", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5078", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5079", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5080", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5081", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5082", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5083", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5084", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5085", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5086", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5087", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5088", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5089", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5090", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5091", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5092", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5093", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5094", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5095", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5096", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5097", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5098", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5099", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5100", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5101", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5102", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5103", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5104", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5105", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5106", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5107", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5108", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5109", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5110", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5111", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5112", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5113", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5114", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5115", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5116", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5117", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5118", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5119", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5120", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5121", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5122", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5123", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5124", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5125", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5126", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5127", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5128", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5129", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5130", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5131", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5132", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5133", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5134", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5135", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5136", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5137", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5138", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5139", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5140", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5141", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5142", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5143", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5144", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5145", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5146", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5147", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5148", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5149", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5150", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5151", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5152", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5153", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5154", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5155", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5156", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5157", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5158", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5159", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5160", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5161", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5162", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5163", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5164", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5165", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5166", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5167", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5168", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5169", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5170", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5171", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5172", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5173", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5174", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5175", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5176", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5177", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5178", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5179", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5180", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5181", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5182", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5183", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5184", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5185", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5186", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5187", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5188", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5189", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5190", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5191", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5192", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5193", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5194", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5195", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5196", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5197", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5198", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5199", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5200", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5201", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5202", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5203", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5204", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5205", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5206", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5207", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5208", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5209", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5210", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5211", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5212", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5213", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5214", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5215", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5216", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5217", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5218", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5219", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5220", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5221", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5222", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5223", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5224", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5225", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5226", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5227", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5228", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5229", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5230", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5231", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5232", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5233", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5234", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5235", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5236", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5237", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5238", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5239", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5240", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5241", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5242", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5243", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5244", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5245", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5246", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5247", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5248", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5249", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5250", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5251", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5252", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5253", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5254", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5255", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5256", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5257", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5258", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5259", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5260", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5261", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5262", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5263", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5264", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5265", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5266", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5267", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5268", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5269", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5270", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5271", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5272", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5273", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5274", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5275", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5276", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5277", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5278", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5279", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5280", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5281", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5282", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5283", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5284", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5285", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5286", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5287", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5288", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5289", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5290", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5291", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5292", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5293", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5294", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5295", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5296", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5297", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5298", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5299", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5300", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5301", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5302", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5303", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5304", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5305", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5306", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5307", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5308", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5309", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5310", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5311", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5312", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5313", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5314", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5315", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5316", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5317", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5318", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5319", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5320", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5321", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5322", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5323", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5324", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5325", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5326", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5327", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5328", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5329", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5330", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5331", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5332", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5333", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5334", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5335", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5336", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5337", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5338", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5339", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5340", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5341", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5342", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5343", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5344", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5345", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5346", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5347", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5348", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5349", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5350", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5351", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5352", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5353", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5354", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5355", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5356", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5357", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5358", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5359", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5360", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5361", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5362", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5363", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5364", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5365", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5366", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5367", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5368", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5369", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5370", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5371", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5372", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5373", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5374", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5375", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5376", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5377", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5378", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5379", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5380", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5381", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5382", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5383", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5384", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5385", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5386", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5387", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5388", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5389", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5390", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5391", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5392", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5393", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5394", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5395", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5396", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5397", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5398", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5399", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5400", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5401", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5402", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5403", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5404", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5405", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5406", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5407", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5408", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5409", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5410", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5411", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5412", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5413", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5414", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5415", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5416", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5417", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5418", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5419", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5420", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5421", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5422", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5423", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5424", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5425", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5426", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5427", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5428", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5429", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5430", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5431", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5432", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5433", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5434", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5435", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5436", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5437", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5438", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5439", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5440", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5441", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5442", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5443", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5444", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5445", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5446", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5447", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5448", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5449", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5450", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5451", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5452", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5453", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5454", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5455", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5456", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5457", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5458", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5459", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5460", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5461", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5462", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5463", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5464", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5465", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5466", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5467", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5468", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5469", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5470", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5471", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5472", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5473", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5474", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5475", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5476", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5477", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5478", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5479", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5480", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5481", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5482", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5483", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5484", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5485", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5486", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5487", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5488", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5489", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5490", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5491", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5492", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5493", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5494", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5495", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5496", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5497", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5498", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5499", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5500", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5501", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5502", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5503", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5504", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5505", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5506", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5507", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5508", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5509", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5510", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5511", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5512", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5513", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5514", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5515", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5516", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5517", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5518", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5519", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5520", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5521", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5522", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5523", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5524", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5525", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5526", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5527", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5528", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5529", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5530", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5531", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5532", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5533", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5534", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5535", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5536", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5537", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5538", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5539", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5540", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5541", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5542", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5543", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5544", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5545", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5546", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5547", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5548", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5549", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5550", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5551", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5552", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5553", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5554", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5555", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5556", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5557", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5558", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5559", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5560", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5561", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5562", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5563", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5564", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5565", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5566", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5567", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5568", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5569", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5570", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5571", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5572", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5573", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5574", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5575", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5576", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5577", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5578", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5579", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5580", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5581", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5582", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5583", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5584", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5585", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5586", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5587", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5588", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5589", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5590", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5591", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5592", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5593", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5594", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5595", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5596", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5597", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5598", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5599", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5600", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5601", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5602", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5603", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5604", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5605", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5606", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5607", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5608", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5609", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5610", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5611", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5612", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5613", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5614", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5615", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5616", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5617", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5618", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5619", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5620", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5621", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5622", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5623", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5624", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5625", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5626", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5627", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5628", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5629", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5630", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5631", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5632", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5633", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5634", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5635", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5636", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5637", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5638", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5639", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5640", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5641", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5642", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5643", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5644", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5645", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5646", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5647", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5648", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5649", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5650", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5651", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5652", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5653", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5654", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5655", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5656", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5657", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5658", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5659", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5660", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5661", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5662", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5663", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5664", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5665", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5666", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5667", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5668", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5669", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5670", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5671", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5672", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5673", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5674", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5675", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5676", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5677", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5678", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5679", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5680", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5681", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5682", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5683", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5684", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5685", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5686", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5687", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5688", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5689", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5690", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5691", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5692", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5693", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5694", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5695", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5696", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5697", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5698", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5699", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5700", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5701", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5702", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5703", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5704", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5705", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5706", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5707", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5708", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5709", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5710", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5711", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5712", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5713", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5714", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5715", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5716", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5717", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5718", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5719", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5720", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5721", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5722", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5723", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5724", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5725", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5726", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5727", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5728", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5729", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5730", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5731", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5732", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5733", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5734", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5735", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5736", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5737", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5738", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5739", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5740", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5741", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5742", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5743", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5744", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5745", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5746", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5747", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5748", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5749", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5750", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5751", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5752", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5753", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5754", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5755", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5756", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5757", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5758", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5759", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5760", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5761", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5762", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5763", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5764", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5765", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5766", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5767", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5768", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5769", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5770", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5771", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5772", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5773", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5774", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5775", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5776", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5777", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5778", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5779", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5780", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5781", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5782", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5783", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5784", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5785", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5786", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5787", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5788", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5789", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5790", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5791", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5792", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5793", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5794", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5795", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5796", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5797", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5798", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5799", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5800", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5801", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5802", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5803", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5804", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5805", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5806", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5807", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5808", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5809", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5810", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5811", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5812", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5813", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5814", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5815", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5816", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5817", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5818", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5819", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5820", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5821", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5822", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5823", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5824", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5825", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5826", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5827", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5828", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5829", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5830", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5831", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5832", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5833", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5834", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5835", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5836", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5837", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5838", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5839", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5840", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5841", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5842", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5843", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5844", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5845", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5846", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5847", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5848", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5849", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5850", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5851", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5852", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5853", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5854", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5855", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5856", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5857", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5858", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5859", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5860", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5861", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5862", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5863", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5864", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5865", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5866", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5867", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5868", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5869", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5870", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5871", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5872", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5873", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5874", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5875", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5876", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5877", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5878", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5879", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5880", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5881", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5882", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5883", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5884", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5885", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5886", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5887", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5888", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5889", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5890", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5891", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5892", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5893", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5894", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5895", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5896", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5897", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5898", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5899", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5900", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5901", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5902", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5903", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5904", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5905", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5906", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5907", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5908", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5909", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5910", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5911", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5912", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5913", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5914", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5915", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5916", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5917", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5918", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5919", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5920", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5921", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5922", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5923", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5924", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5925", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5926", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5927", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5928", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5929", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5930", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5931", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5932", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5933", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5934", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5935", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5936", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5937", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5938", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5939", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5940", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5941", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5942", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5943", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5944", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5945", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5946", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5947", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5948", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5949", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5950", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5951", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5952", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5953", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5954", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5955", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5956", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5957", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5958", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5959", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5960", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5961", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5962", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5963", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5964", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5965", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5966", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5967", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5968", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5969", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5970", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5971", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5972", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5973", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5974", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5975", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5976", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5977", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5978", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5979", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5980", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5981", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5982", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5983", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5984", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5985", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5986", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5987", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5988", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5989", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5990", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5991", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5992", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5993", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5994", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5995", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5996", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5997", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5998", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet5999", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6000", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6001", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6002", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6003", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6004", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6005", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6006", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6007", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6008", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6009", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6010", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6011", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6012", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6013", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6014", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6015", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6016", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6017", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6018", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6019", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6020", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6021", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6022", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6023", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6024", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6025", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6026", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6027", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6028", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6029", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6030", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6031", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6032", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6033", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6034", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6035", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6036", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6037", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6038", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6039", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6040", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6041", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6042", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6043", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6044", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6045", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6046", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6047", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6048", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6049", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6050", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6051", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6052", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6053", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6054", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6055", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6056", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6057", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6058", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6059", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6060", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6061", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6062", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6063", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6064", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6065", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6066", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6067", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6068", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6069", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6070", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6071", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6072", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6073", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6074", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6075", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6076", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6077", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6078", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6079", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6080", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6081", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6082", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6083", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6084", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6085", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6086", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6087", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6088", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6089", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6090", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6091", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6092", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6093", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6094", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6095", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6096", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6097", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6098", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6099", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6100", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6101", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6102", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6103", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6104", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6105", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6106", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6107", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6108", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6109", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6110", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6111", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6112", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6113", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6114", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6115", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6116", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6117", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6118", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6119", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6120", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6121", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6122", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6123", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6124", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6125", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6126", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6127", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6128", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6129", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6130", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6131", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6132", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6133", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6134", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6135", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6136", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6137", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6138", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6139", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6140", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6141", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6142", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6143", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6144", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6145", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6146", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6147", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6148", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6149", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6150", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6151", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6152", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6153", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6154", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6155", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6156", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6157", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6158", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6159", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6160", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6161", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6162", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6163", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6164", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6165", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6166", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6167", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6168", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6169", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6170", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6171", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6172", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6173", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6174", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6175", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6176", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6177", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6178", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6179", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6180", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6181", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6182", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6183", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6184", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6185", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6186", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6187", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6188", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6189", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6190", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6191", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6192", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6193", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6194", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6195", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6196", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6197", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6198", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6199", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6200", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6201", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6202", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6203", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6204", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6205", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6206", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6207", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6208", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6209", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6210", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6211", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6212", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6213", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6214", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6215", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6216", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6217", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6218", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6219", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6220", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6221", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6222", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6223", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6224", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6225", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6226", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6227", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6228", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6229", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6230", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6231", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6232", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6233", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6234", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6235", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6236", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6237", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6238", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6239", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6240", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6241", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6242", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6243", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6244", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6245", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6246", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6247", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6248", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6249", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6250", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6251", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6252", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6253", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6254", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6255", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6256", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6257", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6258", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6259", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6260", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6261", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6262", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6263", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6264", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6265", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6266", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6267", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6268", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6269", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6270", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6271", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6272", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6273", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6274", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6275", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6276", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6277", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6278", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6279", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6280", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6281", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6282", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6283", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6284", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6285", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6286", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6287", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6288", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6289", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6290", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6291", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6292", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6293", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6294", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6295", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6296", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6297", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6298", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6299", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6300", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6301", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6302", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6303", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6304", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6305", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6306", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6307", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6308", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6309", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6310", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6311", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6312", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6313", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6314", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6315", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6316", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6317", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6318", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6319", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6320", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6321", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6322", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6323", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6324", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6325", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6326", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6327", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6328", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6329", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6330", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6331", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6332", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6333", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6334", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6335", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6336", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6337", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6338", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6339", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6340", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6341", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6342", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6343", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6344", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6345", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6346", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6347", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6348", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6349", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6350", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6351", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6352", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6353", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6354", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6355", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6356", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6357", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6358", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6359", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6360", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6361", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6362", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6363", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6364", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6365", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6366", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6367", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6368", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6369", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6370", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6371", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6372", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6373", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6374", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6375", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6376", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6377", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6378", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6379", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6380", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6381", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6382", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6383", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6384", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6385", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6386", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6387", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6388", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6389", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6390", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6391", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6392", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6393", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6394", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6395", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6396", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6397", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6398", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6399", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6400", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6401", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6402", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6403", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6404", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6405", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6406", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6407", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6408", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6409", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6410", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6411", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6412", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6413", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6414", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6415", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6416", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6417", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6418", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6419", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6420", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6421", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6422", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6423", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6424", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6425", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6426", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6427", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6428", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6429", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6430", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6431", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6432", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6433", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6434", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6435", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6436", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6437", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6438", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6439", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6440", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6441", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6442", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6443", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6444", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6445", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6446", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6447", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6448", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6449", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6450", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6451", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6452", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6453", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6454", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6455", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6456", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6457", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6458", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6459", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6460", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6461", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6462", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6463", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6464", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6465", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6466", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6467", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6468", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6469", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6470", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6471", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6472", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6473", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6474", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6475", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6476", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6477", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6478", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6479", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6480", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6481", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6482", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6483", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6484", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6485", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6486", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6487", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6488", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6489", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6490", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6491", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6492", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6493", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6494", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6495", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6496", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6497", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6498", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6499", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6500", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6501", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6502", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6503", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6504", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6505", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6506", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6507", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6508", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6509", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6510", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6511", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6512", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6513", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6514", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6515", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6516", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6517", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6518", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6519", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6520", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6521", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6522", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6523", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6524", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6525", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6526", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6527", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6528", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6529", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6530", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6531", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6532", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6533", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6534", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6535", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6536", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6537", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6538", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6539", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6540", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6541", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6542", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6543", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6544", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6545", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6546", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6547", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6548", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6549", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6550", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6551", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6552", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6553", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6554", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6555", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6556", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6557", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6558", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6559", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6560", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6561", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6562", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6563", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6564", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6565", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6566", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6567", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6568", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6569", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6570", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6571", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6572", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6573", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6574", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6575", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6576", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6577", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6578", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6579", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6580", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6581", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6582", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6583", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6584", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6585", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6586", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6587", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6588", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6589", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6590", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6591", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6592", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6593", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6594", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6595", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6596", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6597", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6598", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6599", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6600", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6601", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6602", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6603", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6604", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6605", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6606", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6607", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6608", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6609", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6610", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6611", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6612", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6613", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6614", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6615", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6616", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6617", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6618", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6619", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6620", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6621", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6622", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6623", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6624", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6625", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6626", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6627", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6628", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6629", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6630", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6631", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6632", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6633", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6634", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6635", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6636", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6637", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6638", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6639", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6640", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6641", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6642", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6643", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6644", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6645", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6646", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6647", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6648", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6649", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6650", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6651", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6652", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6653", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6654", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6655", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6656", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6657", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6658", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6659", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6660", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6661", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6662", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6663", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6664", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6665", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6666", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6667", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6668", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6669", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6670", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6671", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6672", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6673", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6674", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6675", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6676", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6677", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6678", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6679", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6680", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6681", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6682", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6683", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6684", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6685", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6686", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6687", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6688", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6689", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6690", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6691", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6692", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6693", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6694", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6695", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6696", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6697", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6698", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6699", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6700", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6701", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6702", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6703", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6704", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6705", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6706", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6707", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6708", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6709", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6710", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6711", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6712", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6713", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6714", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6715", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6716", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6717", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6718", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6719", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6720", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6721", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6722", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6723", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6724", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6725", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6726", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6727", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6728", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6729", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6730", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6731", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6732", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6733", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6734", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6735", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6736", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6737", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6738", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6739", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6740", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6741", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6742", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6743", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6744", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6745", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6746", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6747", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6748", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6749", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6750", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6751", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6752", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6753", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6754", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6755", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6756", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6757", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6758", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6759", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6760", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6761", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6762", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6763", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6764", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6765", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6766", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6767", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6768", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6769", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6770", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6771", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6772", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6773", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6774", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6775", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6776", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6777", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6778", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6779", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6780", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6781", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6782", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6783", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6784", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6785", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6786", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6787", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6788", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6789", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6790", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6791", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6792", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6793", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6794", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6795", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6796", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6797", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6798", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6799", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6800", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6801", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6802", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6803", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6804", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6805", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6806", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6807", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6808", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6809", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6810", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6811", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6812", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6813", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6814", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6815", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6816", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6817", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6818", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6819", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6820", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6821", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6822", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6823", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6824", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6825", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6826", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6827", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6828", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6829", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6830", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6831", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6832", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6833", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6834", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6835", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6836", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6837", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6838", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6839", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6840", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6841", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6842", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6843", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6844", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6845", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6846", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6847", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6848", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6849", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6850", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6851", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6852", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6853", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6854", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6855", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6856", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6857", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6858", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6859", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6860", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6861", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6862", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6863", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6864", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6865", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6866", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6867", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6868", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6869", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6870", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6871", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6872", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6873", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6874", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6875", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6876", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6877", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6878", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6879", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6880", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6881", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6882", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6883", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6884", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6885", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6886", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6887", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6888", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6889", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6890", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6891", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6892", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6893", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6894", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6895", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6896", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6897", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6898", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6899", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6900", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6901", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6902", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6903", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6904", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6905", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6906", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6907", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6908", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6909", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6910", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6911", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6912", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6913", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6914", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6915", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6916", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6917", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6918", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6919", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6920", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6921", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6922", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6923", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6924", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6925", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6926", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6927", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6928", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6929", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6930", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6931", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6932", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6933", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6934", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6935", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6936", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6937", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6938", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6939", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6940", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6941", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6942", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6943", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6944", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6945", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6946", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6947", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6948", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6949", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6950", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6951", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6952", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6953", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6954", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6955", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6956", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6957", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6958", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6959", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6960", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6961", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6962", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6963", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6964", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6965", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6966", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6967", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6968", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6969", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6970", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6971", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6972", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6973", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6974", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6975", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6976", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6977", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6978", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6979", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6980", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6981", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6982", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6983", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6984", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6985", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6986", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6987", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6988", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6989", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6990", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6991", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6992", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6993", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6994", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6995", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6996", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6997", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6998", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet6999", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7000", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7001", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7002", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7003", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7004", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7005", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7006", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7007", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7008", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7009", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7010", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7011", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7012", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7013", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7014", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7015", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7016", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7017", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7018", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7019", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7020", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7021", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7022", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7023", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7024", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7025", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7026", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7027", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7028", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7029", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7030", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7031", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7032", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7033", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7034", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7035", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7036", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7037", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7038", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7039", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7040", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7041", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7042", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7043", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7044", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7045", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7046", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7047", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7048", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7049", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7050", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7051", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7052", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7053", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7054", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7055", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7056", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7057", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7058", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7059", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7060", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7061", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7062", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7063", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7064", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7065", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7066", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7067", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7068", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7069", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7070", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7071", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7072", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7073", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7074", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7075", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7076", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7077", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7078", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7079", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7080", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7081", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7082", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7083", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7084", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7085", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7086", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7087", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7088", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7089", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7090", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7091", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7092", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7093", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7094", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7095", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7096", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7097", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7098", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7099", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7100", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7101", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7102", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7103", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7104", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7105", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7106", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7107", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7108", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7109", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7110", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7111", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7112", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7113", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7114", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7115", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7116", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7117", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7118", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7119", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7120", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7121", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7122", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7123", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7124", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7125", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7126", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7127", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7128", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7129", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7130", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7131", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7132", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7133", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7134", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7135", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7136", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7137", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7138", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7139", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7140", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7141", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7142", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7143", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7144", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7145", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7146", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7147", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7148", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7149", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7150", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7151", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7152", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7153", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7154", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7155", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7156", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7157", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7158", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7159", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7160", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7161", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7162", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7163", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7164", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7165", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7166", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7167", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7168", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7169", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7170", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7171", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7172", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7173", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7174", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7175", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7176", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7177", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7178", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7179", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7180", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7181", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7182", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7183", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7184", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7185", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7186", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7187", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7188", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7189", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7190", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7191", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7192", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7193", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7194", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7195", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7196", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7197", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7198", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7199", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7200", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7201", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7202", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7203", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7204", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7205", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7206", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7207", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7208", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7209", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7210", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7211", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7212", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7213", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7214", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7215", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7216", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7217", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7218", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7219", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7220", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7221", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7222", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7223", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7224", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7225", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7226", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7227", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7228", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7229", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7230", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7231", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7232", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7233", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7234", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7235", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7236", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7237", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7238", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7239", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7240", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7241", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7242", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7243", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7244", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7245", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7246", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7247", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7248", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7249", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7250", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7251", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7252", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7253", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7254", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7255", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7256", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7257", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7258", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7259", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7260", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7261", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7262", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7263", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7264", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7265", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7266", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7267", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7268", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7269", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7270", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7271", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7272", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7273", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7274", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7275", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7276", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7277", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7278", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7279", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7280", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7281", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7282", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7283", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7284", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7285", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7286", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7287", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7288", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7289", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7290", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7291", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7292", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7293", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7294", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7295", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7296", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7297", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7298", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7299", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7300", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7301", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7302", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7303", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7304", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7305", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7306", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7307", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7308", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7309", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7310", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7311", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7312", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7313", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7314", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7315", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7316", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7317", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7318", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7319", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7320", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7321", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7322", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7323", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7324", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7325", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7326", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7327", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7328", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7329", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7330", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7331", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7332", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7333", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7334", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7335", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7336", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7337", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7338", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7339", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7340", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7341", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7342", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7343", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7344", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7345", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7346", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7347", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7348", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7349", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7350", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7351", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7352", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7353", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7354", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7355", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7356", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7357", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7358", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7359", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7360", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7361", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7362", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7363", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7364", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7365", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7366", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7367", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7368", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7369", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7370", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7371", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7372", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7373", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7374", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7375", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7376", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7377", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7378", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7379", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7380", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7381", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7382", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7383", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7384", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7385", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7386", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7387", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7388", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7389", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7390", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7391", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7392", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7393", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7394", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7395", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7396", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7397", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7398", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7399", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7400", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7401", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7402", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7403", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7404", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7405", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7406", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7407", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7408", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7409", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7410", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7411", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7412", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7413", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7414", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7415", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7416", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7417", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7418", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7419", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7420", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7421", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7422", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7423", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7424", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7425", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7426", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7427", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7428", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7429", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7430", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7431", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7432", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7433", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7434", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7435", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7436", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7437", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7438", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7439", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7440", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7441", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7442", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7443", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7444", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7445", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7446", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7447", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7448", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7449", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7450", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7451", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7452", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7453", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7454", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7455", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7456", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7457", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7458", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7459", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7460", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7461", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7462", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7463", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7464", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7465", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7466", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7467", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7468", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7469", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7470", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7471", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7472", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7473", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7474", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7475", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7476", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7477", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7478", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7479", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7480", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7481", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7482", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7483", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7484", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7485", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7486", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7487", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7488", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7489", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7490", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7491", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7492", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7493", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7494", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7495", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7496", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7497", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7498", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7499", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7500", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7501", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7502", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7503", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7504", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7505", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7506", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7507", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7508", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7509", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7510", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7511", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7512", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7513", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7514", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7515", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7516", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7517", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7518", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7519", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7520", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7521", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7522", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7523", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7524", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7525", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7526", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7527", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7528", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7529", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7530", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7531", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7532", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7533", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7534", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7535", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7536", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7537", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7538", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7539", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7540", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7541", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7542", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7543", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7544", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7545", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7546", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7547", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7548", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7549", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7550", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7551", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7552", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7553", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7554", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7555", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7556", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7557", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7558", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7559", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7560", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7561", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7562", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7563", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7564", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7565", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7566", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7567", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7568", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7569", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7570", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7571", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7572", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7573", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7574", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7575", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7576", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7577", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7578", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7579", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7580", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7581", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7582", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7583", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7584", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7585", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7586", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7587", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7588", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7589", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7590", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7591", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7592", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7593", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7594", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7595", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7596", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7597", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7598", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7599", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7600", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7601", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7602", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7603", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7604", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7605", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7606", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7607", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7608", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7609", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7610", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7611", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7612", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7613", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7614", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7615", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7616", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7617", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7618", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7619", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7620", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7621", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7622", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7623", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7624", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7625", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7626", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7627", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7628", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7629", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7630", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7631", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7632", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7633", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7634", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7635", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7636", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7637", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7638", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7639", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7640", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7641", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7642", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7643", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7644", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7645", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7646", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7647", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7648", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7649", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7650", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7651", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7652", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7653", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7654", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7655", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7656", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7657", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7658", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7659", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7660", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7661", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7662", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7663", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7664", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7665", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7666", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7667", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7668", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7669", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7670", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7671", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7672", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7673", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7674", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7675", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7676", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7677", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7678", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7679", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7680", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7681", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7682", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7683", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7684", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7685", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7686", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7687", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7688", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7689", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7690", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7691", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7692", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7693", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7694", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7695", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7696", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7697", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7698", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7699", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7700", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7701", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7702", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7703", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7704", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7705", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7706", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7707", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7708", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7709", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7710", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7711", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7712", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7713", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7714", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7715", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7716", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7717", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7718", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7719", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7720", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7721", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7722", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7723", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7724", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7725", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7726", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7727", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7728", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7729", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7730", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7731", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7732", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7733", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7734", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7735", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7736", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7737", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7738", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7739", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7740", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7741", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7742", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7743", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7744", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7745", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7746", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7747", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7748", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7749", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7750", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7751", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7752", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7753", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7754", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7755", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7756", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7757", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7758", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7759", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7760", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7761", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7762", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7763", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7764", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7765", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7766", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7767", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7768", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7769", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7770", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7771", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7772", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7773", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7774", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7775", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7776", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7777", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7778", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7779", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7780", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7781", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7782", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7783", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7784", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7785", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7786", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7787", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7788", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7789", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7790", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7791", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7792", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7793", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7794", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7795", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7796", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7797", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7798", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7799", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7800", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7801", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7802", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7803", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7804", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7805", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7806", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7807", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7808", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7809", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7810", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7811", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7812", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7813", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7814", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7815", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7816", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7817", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7818", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7819", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7820", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7821", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7822", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7823", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7824", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7825", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7826", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7827", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7828", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7829", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7830", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7831", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7832", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7833", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7834", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7835", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7836", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7837", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7838", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7839", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7840", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7841", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7842", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7843", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7844", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7845", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7846", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7847", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7848", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7849", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7850", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7851", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7852", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7853", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7854", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7855", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7856", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7857", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7858", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7859", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7860", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7861", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7862", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7863", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7864", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7865", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7866", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7867", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7868", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7869", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7870", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7871", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7872", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7873", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7874", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7875", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7876", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7877", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7878", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7879", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7880", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7881", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7882", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7883", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7884", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7885", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7886", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7887", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7888", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7889", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7890", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7891", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7892", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7893", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7894", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7895", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7896", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7897", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7898", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7899", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7900", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7901", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7902", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7903", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7904", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7905", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7906", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7907", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7908", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7909", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7910", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7911", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7912", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7913", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7914", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7915", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7916", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7917", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7918", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7919", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7920", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7921", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7922", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7923", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7924", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7925", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7926", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7927", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7928", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7929", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7930", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7931", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7932", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7933", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7934", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7935", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7936", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7937", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7938", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7939", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7940", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7941", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7942", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7943", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7944", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7945", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7946", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7947", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7948", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7949", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7950", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7951", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7952", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7953", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7954", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7955", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7956", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7957", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7958", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7959", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7960", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7961", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7962", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7963", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7964", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7965", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7966", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7967", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7968", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7969", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7970", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7971", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7972", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7973", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7974", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7975", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7976", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7977", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7978", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7979", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7980", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7981", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7982", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7983", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7984", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7985", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7986", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7987", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7988", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7989", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7990", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7991", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7992", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7993", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7994", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7995", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7996", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7997", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7998", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet7999", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8000", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8001", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8002", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8003", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8004", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8005", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8006", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8007", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8008", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8009", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8010", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8011", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8012", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8013", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8014", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8015", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8016", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8017", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8018", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8019", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8020", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8021", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8022", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8023", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8024", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8025", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8026", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8027", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8028", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8029", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8030", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8031", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8032", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8033", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8034", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8035", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8036", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8037", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8038", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8039", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8040", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8041", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8042", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8043", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8044", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8045", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8046", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8047", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8048", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8049", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8050", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8051", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8052", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8053", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8054", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8055", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8056", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8057", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8058", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8059", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8060", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8061", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8062", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8063", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8064", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8065", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8066", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8067", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8068", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8069", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8070", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8071", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8072", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8073", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8074", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8075", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8076", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8077", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8078", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8079", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8080", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8081", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8082", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8083", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8084", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8085", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8086", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8087", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8088", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8089", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8090", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8091", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8092", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8093", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8094", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8095", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8096", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8097", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8098", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8099", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8100", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8101", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8102", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8103", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8104", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8105", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8106", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8107", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8108", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8109", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8110", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8111", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8112", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8113", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8114", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8115", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8116", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8117", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8118", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8119", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8120", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8121", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8122", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8123", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8124", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8125", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8126", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8127", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8128", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8129", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8130", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8131", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8132", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8133", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8134", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8135", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8136", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8137", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8138", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8139", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8140", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8141", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8142", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8143", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8144", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8145", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8146", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8147", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8148", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8149", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8150", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8151", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8152", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8153", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8154", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8155", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8156", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8157", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8158", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8159", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8160", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8161", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8162", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8163", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8164", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8165", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8166", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8167", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8168", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8169", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8170", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8171", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8172", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8173", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8174", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8175", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8176", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8177", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8178", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8179", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8180", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8181", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8182", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8183", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8184", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8185", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8186", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8187", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8188", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8189", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8190", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8191", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8192", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8193", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8194", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8195", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8196", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8197", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8198", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8199", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8200", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8201", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8202", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8203", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8204", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8205", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8206", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8207", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8208", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8209", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8210", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8211", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8212", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8213", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8214", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8215", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8216", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8217", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8218", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8219", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8220", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8221", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8222", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8223", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8224", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8225", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8226", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8227", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8228", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8229", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8230", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8231", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8232", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8233", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8234", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8235", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8236", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8237", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8238", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8239", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8240", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8241", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8242", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8243", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8244", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8245", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8246", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8247", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8248", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8249", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8250", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8251", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8252", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8253", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8254", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8255", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8256", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8257", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8258", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8259", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8260", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8261", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8262", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8263", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8264", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8265", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8266", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8267", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8268", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8269", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8270", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8271", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8272", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8273", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8274", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8275", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8276", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8277", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8278", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8279", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8280", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8281", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8282", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8283", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8284", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8285", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8286", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8287", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8288", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8289", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8290", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8291", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8292", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8293", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8294", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8295", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8296", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8297", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8298", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8299", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8300", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8301", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8302", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8303", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8304", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8305", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8306", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8307", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8308", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8309", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8310", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8311", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8312", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8313", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8314", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8315", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8316", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8317", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8318", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8319", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8320", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8321", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8322", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8323", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8324", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8325", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8326", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8327", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8328", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8329", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8330", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8331", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8332", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8333", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8334", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8335", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8336", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8337", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8338", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8339", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8340", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8341", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8342", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8343", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8344", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8345", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8346", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8347", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8348", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8349", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8350", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8351", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8352", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8353", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8354", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8355", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8356", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8357", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8358", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8359", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8360", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8361", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8362", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8363", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8364", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8365", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8366", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8367", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8368", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8369", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8370", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8371", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8372", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8373", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8374", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8375", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8376", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8377", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8378", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8379", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8380", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8381", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8382", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8383", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8384", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8385", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8386", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8387", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8388", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8389", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8390", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8391", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8392", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8393", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8394", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8395", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8396", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8397", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8398", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8399", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8400", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8401", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8402", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8403", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8404", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8405", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8406", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8407", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8408", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8409", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8410", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8411", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8412", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8413", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8414", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8415", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8416", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8417", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8418", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8419", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8420", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8421", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8422", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8423", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8424", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8425", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8426", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8427", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8428", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8429", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8430", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8431", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8432", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8433", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8434", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8435", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8436", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8437", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8438", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8439", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8440", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8441", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8442", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8443", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8444", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8445", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8446", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8447", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8448", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8449", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8450", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8451", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8452", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8453", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8454", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8455", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8456", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8457", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8458", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8459", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8460", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8461", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8462", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8463", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8464", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8465", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8466", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8467", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8468", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8469", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8470", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8471", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8472", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8473", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8474", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8475", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8476", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8477", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8478", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8479", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8480", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8481", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8482", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8483", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8484", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8485", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8486", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8487", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8488", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8489", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8490", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8491", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8492", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8493", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8494", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8495", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8496", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8497", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8498", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8499", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8500", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8501", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8502", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8503", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8504", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8505", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8506", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8507", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8508", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8509", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8510", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8511", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8512", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8513", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8514", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8515", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8516", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8517", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8518", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8519", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8520", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8521", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8522", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8523", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8524", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8525", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8526", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8527", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8528", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8529", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8530", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8531", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8532", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8533", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8534", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8535", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8536", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8537", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8538", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8539", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8540", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8541", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8542", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8543", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8544", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8545", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8546", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8547", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8548", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8549", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8550", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8551", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8552", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8553", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8554", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8555", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8556", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8557", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8558", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8559", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8560", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8561", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8562", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8563", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8564", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8565", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8566", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8567", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8568", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8569", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8570", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8571", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8572", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8573", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8574", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8575", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8576", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8577", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8578", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8579", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8580", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8581", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8582", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8583", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8584", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8585", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8586", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8587", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8588", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8589", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8590", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8591", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8592", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8593", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8594", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8595", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8596", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8597", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8598", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8599", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8600", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8601", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8602", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8603", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8604", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8605", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8606", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8607", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8608", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8609", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8610", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8611", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8612", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8613", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8614", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8615", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8616", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8617", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8618", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8619", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8620", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8621", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8622", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8623", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8624", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8625", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8626", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8627", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8628", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8629", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8630", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8631", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8632", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8633", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8634", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8635", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8636", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8637", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8638", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8639", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8640", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8641", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8642", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8643", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8644", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8645", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8646", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8647", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8648", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8649", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8650", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8651", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8652", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8653", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8654", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8655", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8656", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8657", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8658", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8659", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8660", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8661", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8662", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8663", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8664", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8665", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8666", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8667", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8668", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8669", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8670", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8671", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8672", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8673", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8674", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8675", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8676", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8677", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8678", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8679", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8680", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8681", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8682", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8683", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8684", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8685", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8686", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8687", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8688", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8689", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8690", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8691", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8692", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8693", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8694", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8695", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8696", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8697", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8698", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8699", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8700", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8701", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8702", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8703", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8704", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8705", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8706", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8707", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8708", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8709", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8710", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8711", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8712", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8713", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8714", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8715", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8716", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8717", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8718", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8719", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8720", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8721", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8722", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8723", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8724", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8725", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8726", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8727", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8728", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8729", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8730", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8731", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8732", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8733", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8734", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8735", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8736", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8737", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8738", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8739", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8740", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8741", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8742", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8743", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8744", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8745", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8746", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8747", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8748", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8749", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8750", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8751", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8752", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8753", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8754", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8755", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8756", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8757", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8758", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8759", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8760", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8761", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8762", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8763", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8764", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8765", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8766", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8767", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8768", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8769", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8770", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8771", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8772", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8773", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8774", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8775", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8776", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8777", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8778", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8779", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8780", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8781", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8782", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8783", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8784", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8785", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8786", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8787", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8788", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8789", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8790", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8791", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8792", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8793", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8794", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8795", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8796", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8797", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8798", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8799", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8800", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8801", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8802", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8803", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8804", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8805", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8806", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8807", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8808", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8809", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8810", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8811", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8812", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8813", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8814", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8815", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8816", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8817", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8818", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8819", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8820", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8821", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8822", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8823", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8824", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8825", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8826", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8827", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8828", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8829", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8830", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8831", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8832", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8833", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8834", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8835", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8836", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8837", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8838", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8839", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8840", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8841", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8842", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8843", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8844", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8845", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8846", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8847", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8848", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8849", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8850", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8851", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8852", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8853", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8854", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8855", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8856", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8857", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8858", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8859", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8860", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8861", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8862", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8863", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8864", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8865", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8866", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8867", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8868", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8869", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8870", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8871", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8872", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8873", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8874", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8875", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8876", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8877", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8878", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8879", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8880", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8881", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8882", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8883", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8884", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8885", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8886", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8887", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8888", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8889", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8890", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8891", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8892", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8893", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8894", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8895", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8896", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8897", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8898", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8899", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8900", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8901", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8902", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8903", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8904", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8905", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8906", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8907", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8908", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8909", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8910", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8911", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8912", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8913", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8914", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8915", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8916", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8917", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8918", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8919", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8920", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8921", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8922", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8923", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8924", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8925", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8926", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8927", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8928", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8929", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8930", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8931", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8932", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8933", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8934", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8935", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8936", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8937", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8938", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8939", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8940", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8941", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8942", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8943", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8944", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8945", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8946", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8947", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8948", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8949", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8950", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8951", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8952", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8953", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8954", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8955", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8956", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8957", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8958", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8959", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8960", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8961", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8962", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8963", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8964", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8965", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8966", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8967", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8968", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8969", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8970", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8971", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8972", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8973", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8974", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8975", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8976", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8977", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8978", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8979", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8980", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8981", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8982", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8983", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8984", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8985", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8986", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8987", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8988", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8989", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8990", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8991", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8992", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8993", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8994", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8995", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8996", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8997", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8998", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet8999", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9000", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9001", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9002", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9003", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9004", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9005", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9006", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9007", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9008", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9009", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9010", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9011", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9012", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9013", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9014", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9015", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9016", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9017", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9018", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9019", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9020", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9021", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9022", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9023", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9024", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9025", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9026", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9027", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9028", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9029", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9030", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9031", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9032", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9033", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9034", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9035", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9036", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9037", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9038", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9039", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9040", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9041", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9042", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9043", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9044", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9045", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9046", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9047", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9048", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9049", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9050", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9051", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9052", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9053", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9054", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9055", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9056", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9057", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9058", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9059", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9060", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9061", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9062", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9063", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9064", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9065", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9066", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9067", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9068", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9069", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9070", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9071", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9072", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9073", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9074", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9075", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9076", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9077", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9078", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9079", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9080", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9081", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9082", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9083", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9084", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9085", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9086", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9087", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9088", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9089", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9090", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9091", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9092", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9093", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9094", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9095", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9096", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9097", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9098", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9099", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9100", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9101", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9102", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9103", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9104", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9105", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9106", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9107", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9108", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9109", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9110", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9111", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9112", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9113", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9114", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9115", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9116", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9117", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9118", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9119", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9120", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9121", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9122", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9123", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9124", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9125", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9126", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9127", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9128", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9129", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9130", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9131", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9132", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9133", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9134", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9135", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9136", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9137", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9138", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9139", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9140", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9141", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9142", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9143", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9144", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9145", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9146", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9147", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9148", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9149", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9150", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9151", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9152", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9153", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9154", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9155", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9156", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9157", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9158", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9159", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9160", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9161", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9162", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9163", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9164", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9165", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9166", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9167", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9168", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9169", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9170", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9171", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9172", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9173", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9174", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9175", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9176", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9177", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9178", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9179", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9180", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9181", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9182", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9183", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9184", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9185", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9186", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9187", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9188", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9189", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9190", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9191", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9192", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9193", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9194", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9195", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9196", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9197", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9198", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9199", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9200", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9201", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9202", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9203", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9204", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9205", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9206", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9207", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9208", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9209", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9210", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9211", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9212", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9213", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9214", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9215", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9216", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9217", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9218", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9219", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9220", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9221", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9222", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9223", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9224", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9225", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9226", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9227", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9228", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9229", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9230", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9231", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9232", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9233", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9234", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9235", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9236", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9237", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9238", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9239", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9240", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9241", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9242", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9243", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9244", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9245", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9246", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9247", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9248", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9249", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9250", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9251", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9252", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9253", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9254", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9255", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9256", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9257", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9258", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9259", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9260", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9261", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9262", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9263", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9264", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9265", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9266", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9267", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9268", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9269", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9270", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9271", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9272", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9273", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9274", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9275", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9276", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9277", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9278", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9279", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9280", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9281", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9282", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9283", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9284", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9285", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9286", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9287", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9288", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9289", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9290", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9291", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9292", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9293", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9294", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9295", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9296", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9297", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9298", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9299", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9300", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9301", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9302", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9303", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9304", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9305", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9306", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9307", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9308", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9309", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9310", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9311", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9312", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9313", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9314", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9315", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9316", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9317", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9318", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9319", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9320", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9321", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9322", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9323", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9324", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9325", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9326", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9327", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9328", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9329", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9330", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9331", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9332", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9333", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9334", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9335", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9336", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9337", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9338", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9339", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9340", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9341", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9342", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9343", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9344", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9345", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9346", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9347", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9348", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9349", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9350", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9351", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9352", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9353", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9354", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9355", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9356", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9357", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9358", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9359", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9360", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9361", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9362", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9363", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9364", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9365", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9366", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9367", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9368", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9369", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9370", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9371", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9372", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9373", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9374", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9375", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9376", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9377", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9378", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9379", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9380", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9381", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9382", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9383", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9384", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9385", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9386", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9387", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9388", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9389", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9390", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9391", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9392", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9393", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9394", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9395", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9396", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9397", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9398", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9399", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9400", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9401", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9402", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9403", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9404", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9405", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9406", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9407", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9408", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9409", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9410", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9411", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9412", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9413", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9414", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9415", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9416", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9417", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9418", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9419", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9420", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9421", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9422", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9423", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9424", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9425", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9426", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9427", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9428", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9429", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9430", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9431", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9432", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9433", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9434", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9435", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9436", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9437", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9438", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9439", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9440", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9441", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9442", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9443", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9444", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9445", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9446", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9447", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9448", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9449", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9450", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9451", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9452", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9453", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9454", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9455", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9456", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9457", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9458", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9459", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9460", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9461", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9462", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9463", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9464", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9465", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9466", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9467", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9468", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9469", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9470", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9471", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9472", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9473", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9474", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9475", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9476", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9477", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9478", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9479", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9480", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9481", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9482", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9483", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9484", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9485", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9486", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9487", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9488", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9489", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9490", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9491", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9492", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9493", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9494", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9495", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9496", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9497", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9498", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9499", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9500", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9501", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9502", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9503", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9504", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9505", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9506", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9507", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9508", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9509", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9510", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9511", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9512", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9513", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9514", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9515", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9516", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9517", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9518", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9519", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9520", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9521", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9522", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9523", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9524", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9525", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9526", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9527", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9528", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9529", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9530", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9531", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9532", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9533", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9534", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9535", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9536", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9537", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9538", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9539", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9540", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9541", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9542", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9543", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9544", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9545", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9546", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9547", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9548", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9549", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9550", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9551", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9552", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9553", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9554", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9555", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9556", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9557", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9558", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9559", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9560", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9561", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9562", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9563", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9564", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9565", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9566", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9567", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9568", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9569", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9570", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9571", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9572", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9573", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9574", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9575", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9576", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9577", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9578", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9579", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9580", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9581", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9582", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9583", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9584", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9585", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9586", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9587", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9588", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9589", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9590", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9591", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9592", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9593", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9594", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9595", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9596", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9597", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9598", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9599", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9600", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9601", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9602", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9603", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9604", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9605", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9606", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9607", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9608", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9609", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9610", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9611", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9612", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9613", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9614", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9615", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9616", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9617", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9618", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9619", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9620", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9621", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9622", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9623", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9624", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9625", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9626", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9627", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9628", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9629", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9630", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9631", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9632", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9633", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9634", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9635", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9636", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9637", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9638", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9639", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9640", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9641", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9642", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9643", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9644", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9645", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9646", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9647", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9648", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9649", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9650", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9651", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9652", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9653", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9654", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9655", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9656", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9657", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9658", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9659", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9660", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9661", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9662", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9663", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9664", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9665", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9666", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9667", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9668", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9669", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9670", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9671", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9672", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9673", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9674", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9675", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9676", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9677", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9678", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9679", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9680", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9681", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9682", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9683", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9684", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9685", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9686", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9687", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9688", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9689", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9690", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9691", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9692", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9693", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9694", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9695", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9696", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9697", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9698", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9699", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9700", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9701", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9702", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9703", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9704", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9705", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9706", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9707", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9708", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9709", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9710", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9711", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9712", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9713", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9714", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9715", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9716", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9717", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9718", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9719", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9720", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9721", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9722", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9723", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9724", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9725", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9726", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9727", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9728", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9729", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9730", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9731", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9732", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9733", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9734", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9735", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9736", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9737", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9738", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9739", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9740", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9741", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9742", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9743", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9744", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9745", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9746", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9747", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9748", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9749", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9750", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9751", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9752", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9753", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9754", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9755", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9756", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9757", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9758", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9759", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9760", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9761", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9762", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9763", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9764", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9765", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9766", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9767", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9768", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9769", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9770", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9771", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9772", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9773", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9774", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9775", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9776", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9777", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9778", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9779", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9780", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9781", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9782", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9783", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9784", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9785", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9786", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9787", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9788", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9789", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9790", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9791", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9792", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9793", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9794", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9795", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9796", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9797", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9798", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9799", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9800", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9801", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9802", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9803", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9804", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9805", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9806", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9807", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9808", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9809", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9810", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9811", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9812", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9813", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9814", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9815", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9816", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9817", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9818", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9819", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9820", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9821", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9822", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9823", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9824", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9825", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9826", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9827", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9828", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9829", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9830", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9831", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9832", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9833", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9834", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9835", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9836", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9837", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9838", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9839", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9840", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9841", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9842", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9843", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9844", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9845", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9846", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9847", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9848", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9849", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9850", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9851", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9852", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9853", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9854", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9855", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9856", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9857", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9858", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9859", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9860", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9861", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9862", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9863", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9864", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9865", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9866", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9867", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9868", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9869", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9870", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9871", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9872", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9873", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9874", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9875", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9876", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9877", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9878", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9879", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9880", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9881", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9882", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9883", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9884", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9885", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9886", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9887", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9888", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9889", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9890", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9891", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9892", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9893", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9894", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9895", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9896", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9897", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9898", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9899", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9900", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9901", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9902", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9903", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9904", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9905", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9906", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9907", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9908", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9909", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9910", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9911", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9912", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9913", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9914", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9915", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9916", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9917", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9918", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9919", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9920", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9921", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9922", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9923", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9924", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9925", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9926", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9927", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9928", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9929", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9930", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9931", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9932", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9933", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9934", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9935", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9936", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9937", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9938", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9939", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9940", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9941", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9942", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9943", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9944", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9945", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9946", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9947", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9948", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9949", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9950", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9951", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9952", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9953", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9954", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9955", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9956", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9957", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9958", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9959", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9960", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9961", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9962", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9963", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9964", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9965", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9966", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9967", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9968", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9969", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9970", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9971", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9972", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9973", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9974", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9975", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9976", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9977", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9978", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9979", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9980", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9981", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9982", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9983", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9984", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9985", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9986", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9987", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9988", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9989", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9990", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9991", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9992", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9993", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9994", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9995", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9996", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9997", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9998", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet9999", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet10000", + "Stake": 0.005, + "Online": true + }, + { + "Name": "Wallet10001", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet10002", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet10003", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet10004", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet10005", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet10006", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet10007", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet10008", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet10009", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet10010", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet10011", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet10012", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet10013", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet10014", + "Stake": 3.3333333333333335, + "Online": false + }, + { + "Name": "Wallet10015", + "Stake": 3.3333333333333335, + "Online": false + } + ], + "FeeSink": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ", + "RewardsPool": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY5HFKQ", + "DevMode": false, + "Comment": "" } diff --git a/test/testdata/nettemplates/CatchpointCatchupTestNetwork.json b/test/testdata/nettemplates/CatchpointCatchupTestNetwork.json index de2dfac5f8..8c9c340018 100644 --- a/test/testdata/nettemplates/CatchpointCatchupTestNetwork.json +++ b/test/testdata/nettemplates/CatchpointCatchupTestNetwork.json @@ -2,6 +2,7 @@ "Genesis": { "NetworkName": "catchpointcatchupnetwork", "ConsensusProtocol": "catchpointtestingprotocol", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/CompactCert.json b/test/testdata/nettemplates/CompactCert.json index f7d1e0097a..f4f86e2612 100644 --- a/test/testdata/nettemplates/CompactCert.json +++ b/test/testdata/nettemplates/CompactCert.json @@ -2,6 +2,7 @@ "Genesis": { "NetworkName": "tbd", "ConsensusProtocol": "test-fast-compactcert", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet0", "Stake": 10, "Online": true }, { "Name": "Wallet1", "Stake": 10, "Online": true }, diff --git a/test/testdata/nettemplates/David20.json b/test/testdata/nettemplates/David20.json index 128fd16361..f5692d37c7 100644 --- a/test/testdata/nettemplates/David20.json +++ b/test/testdata/nettemplates/David20.json @@ -1,6 +1,7 @@ { "Genesis": { "NetworkName": "tbd", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Faucet", diff --git a/test/testdata/nettemplates/DevModeNetwork.json b/test/testdata/nettemplates/DevModeNetwork.json index 657498553c..50f4427a59 100644 --- a/test/testdata/nettemplates/DevModeNetwork.json +++ b/test/testdata/nettemplates/DevModeNetwork.json @@ -1,6 +1,7 @@ { "Genesis": { "NetworkName": "devmodenet", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/DevModeOneWallet.json b/test/testdata/nettemplates/DevModeOneWallet.json index fd29a927a7..5e20e0ea05 100644 --- a/test/testdata/nettemplates/DevModeOneWallet.json +++ b/test/testdata/nettemplates/DevModeOneWallet.json @@ -1,6 +1,7 @@ { "Genesis": { "NetworkName": "devmodenet", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/FourNodes.json b/test/testdata/nettemplates/FourNodes.json index d7e20f600f..ea48b4a6ef 100644 --- a/test/testdata/nettemplates/FourNodes.json +++ b/test/testdata/nettemplates/FourNodes.json @@ -1,6 +1,7 @@ { "Genesis": { "NetworkName": "tbd", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Online", diff --git a/test/testdata/nettemplates/NegativeStake.json b/test/testdata/nettemplates/NegativeStake.json index 903faaa52c..670750a9c7 100644 --- a/test/testdata/nettemplates/NegativeStake.json +++ b/test/testdata/nettemplates/NegativeStake.json @@ -1,6 +1,7 @@ { "Genesis": { "NetworkName": "tbd", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "W1", diff --git a/test/testdata/nettemplates/OneNode.json b/test/testdata/nettemplates/OneNode.json index 60b3689895..00df5682eb 100644 --- a/test/testdata/nettemplates/OneNode.json +++ b/test/testdata/nettemplates/OneNode.json @@ -2,6 +2,7 @@ "Genesis": { "NetworkName": "tbd", "ConsensusProtocol": "shortpartkeysprotocol", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Rich", diff --git a/test/testdata/nettemplates/OneNodeFuture.json b/test/testdata/nettemplates/OneNodeFuture.json index 1bbe378745..b615daa261 100644 --- a/test/testdata/nettemplates/OneNodeFuture.json +++ b/test/testdata/nettemplates/OneNodeFuture.json @@ -2,6 +2,7 @@ "Genesis": { "NetworkName": "tbd", "ConsensusProtocol": "future", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/SingleNodeNetwork.json b/test/testdata/nettemplates/SingleNodeNetwork.json index 359b75067b..4471c66cba 100644 --- a/test/testdata/nettemplates/SingleNodeNetwork.json +++ b/test/testdata/nettemplates/SingleNodeNetwork.json @@ -1,6 +1,7 @@ { "Genesis": { "NetworkName": "snn", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/TenThousandAccountsEqual.json b/test/testdata/nettemplates/TenThousandAccountsEqual.json index e695832798..7fe421a7cd 100644 --- a/test/testdata/nettemplates/TenThousandAccountsEqual.json +++ b/test/testdata/nettemplates/TenThousandAccountsEqual.json @@ -4,7 +4,7 @@ "VersionModifier": "", "ConsensusProtocol": "", "FirstPartKeyRound": 0, - "LastPartKeyRound": 3000000, + "LastPartKeyRound": 3000, "PartKeyDilution": 0, "Wallets": [ { diff --git a/test/testdata/nettemplates/ThreeNodesEvenDist.json b/test/testdata/nettemplates/ThreeNodesEvenDist.json index d34586bbd5..261ce72d39 100644 --- a/test/testdata/nettemplates/ThreeNodesEvenDist.json +++ b/test/testdata/nettemplates/ThreeNodesEvenDist.json @@ -1,6 +1,7 @@ { "Genesis": { "NetworkName": "tbd", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/ThreeNodesEvenDistOneOffline.json b/test/testdata/nettemplates/ThreeNodesEvenDistOneOffline.json index dac4e235c1..3f29ec250f 100644 --- a/test/testdata/nettemplates/ThreeNodesEvenDistOneOffline.json +++ b/test/testdata/nettemplates/ThreeNodesEvenDistOneOffline.json @@ -1,6 +1,7 @@ { "Genesis": { "NetworkName": "tbd", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/TwoNodes100Second.json b/test/testdata/nettemplates/TwoNodes100Second.json index 7b0693e837..9a035d0af6 100644 --- a/test/testdata/nettemplates/TwoNodes100Second.json +++ b/test/testdata/nettemplates/TwoNodes100Second.json @@ -1,5 +1,6 @@ { "Genesis": { + "LastPartKeyRound": 3000, "NetworkName": "tbd", "Wallets": [ { diff --git a/test/testdata/nettemplates/TwoNodes100SecondTestUnupgradedProtocol.json b/test/testdata/nettemplates/TwoNodes100SecondTestUnupgradedProtocol.json index 6d52d96e6c..5ecd6960fe 100644 --- a/test/testdata/nettemplates/TwoNodes100SecondTestUnupgradedProtocol.json +++ b/test/testdata/nettemplates/TwoNodes100SecondTestUnupgradedProtocol.json @@ -2,6 +2,7 @@ "Genesis": { "NetworkName": "tbd", "ConsensusProtocol": "test-unupgraded-protocol", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/TwoNodes50Each.json b/test/testdata/nettemplates/TwoNodes50Each.json index cd0d84fad1..7cdefb47ef 100644 --- a/test/testdata/nettemplates/TwoNodes50Each.json +++ b/test/testdata/nettemplates/TwoNodes50Each.json @@ -1,6 +1,7 @@ { "Genesis": { "NetworkName": "tbd", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/TwoNodes50EachFuture.json b/test/testdata/nettemplates/TwoNodes50EachFuture.json index 45214aa315..12a9b0223e 100644 --- a/test/testdata/nettemplates/TwoNodes50EachFuture.json +++ b/test/testdata/nettemplates/TwoNodes50EachFuture.json @@ -2,6 +2,7 @@ "Genesis": { "NetworkName": "tbd", "ConsensusProtocol": "future", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/TwoNodes50EachOneOnline.json b/test/testdata/nettemplates/TwoNodes50EachOneOnline.json index 3cb6837fa2..aa8e0c4fe2 100644 --- a/test/testdata/nettemplates/TwoNodes50EachOneOnline.json +++ b/test/testdata/nettemplates/TwoNodes50EachOneOnline.json @@ -1,6 +1,7 @@ { "Genesis": { "NetworkName": "oneOnline", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/TwoNodes50EachTestShorterLookback.json b/test/testdata/nettemplates/TwoNodes50EachTestShorterLookback.json index 26ca5acf49..2e83640eab 100644 --- a/test/testdata/nettemplates/TwoNodes50EachTestShorterLookback.json +++ b/test/testdata/nettemplates/TwoNodes50EachTestShorterLookback.json @@ -2,6 +2,7 @@ "Genesis": { "NetworkName": "tbd", "ConsensusProtocol": "test-shorter-lookback", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/TwoNodes50EachV15.json b/test/testdata/nettemplates/TwoNodes50EachV15.json index 67fd79c3b6..ef887aa687 100644 --- a/test/testdata/nettemplates/TwoNodes50EachV15.json +++ b/test/testdata/nettemplates/TwoNodes50EachV15.json @@ -2,6 +2,7 @@ "Genesis": { "NetworkName": "tbd", "ConsensusProtocol": "https://github.com/algorand/spec/tree/a26ed78ed8f834e2b9ccb6eb7d3ee9f629a6e622", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/TwoNodes50EachV15Upgrade.json b/test/testdata/nettemplates/TwoNodes50EachV15Upgrade.json index 99976b66a1..80477c84d6 100644 --- a/test/testdata/nettemplates/TwoNodes50EachV15Upgrade.json +++ b/test/testdata/nettemplates/TwoNodes50EachV15Upgrade.json @@ -2,6 +2,7 @@ "Genesis": { "NetworkName": "tbd", "ConsensusProtocol": "test-fast-upgrade-https://github.com/algorand/spec/tree/a26ed78ed8f834e2b9ccb6eb7d3ee9f629a6e622", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/TwoNodes50EachV21Upgrade.json b/test/testdata/nettemplates/TwoNodes50EachV21Upgrade.json index d5729d5b54..1441baa080 100644 --- a/test/testdata/nettemplates/TwoNodes50EachV21Upgrade.json +++ b/test/testdata/nettemplates/TwoNodes50EachV21Upgrade.json @@ -2,6 +2,7 @@ "Genesis": { "NetworkName": "tbd", "ConsensusProtocol": "test-fast-upgrade-https://github.com/algorandfoundation/specs/tree/8096e2df2da75c3339986317f9abe69d4fa86b4b", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/TwoNodes50EachV22.json b/test/testdata/nettemplates/TwoNodes50EachV22.json index 4e9dddcbb0..30fdfe8d9e 100644 --- a/test/testdata/nettemplates/TwoNodes50EachV22.json +++ b/test/testdata/nettemplates/TwoNodes50EachV22.json @@ -2,6 +2,7 @@ "Genesis": { "NetworkName": "tbd", "ConsensusProtocol": "https://github.com/algorandfoundation/specs/tree/57016b942f6d97e6d4c0688b373bb0a2fc85a1a2", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/TwoNodes50EachV22Upgrade.json b/test/testdata/nettemplates/TwoNodes50EachV22Upgrade.json index f702f491f5..a699f90e69 100644 --- a/test/testdata/nettemplates/TwoNodes50EachV22Upgrade.json +++ b/test/testdata/nettemplates/TwoNodes50EachV22Upgrade.json @@ -2,6 +2,7 @@ "Genesis": { "NetworkName": "tbd", "ConsensusProtocol": "test-fast-upgrade-https://github.com/algorandfoundation/specs/tree/57016b942f6d97e6d4c0688b373bb0a2fc85a1a2", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/TwoNodes50EachV23Upgrade.json b/test/testdata/nettemplates/TwoNodes50EachV23Upgrade.json index 51ff9f69fc..132232945d 100644 --- a/test/testdata/nettemplates/TwoNodes50EachV23Upgrade.json +++ b/test/testdata/nettemplates/TwoNodes50EachV23Upgrade.json @@ -2,6 +2,7 @@ "Genesis": { "NetworkName": "tbd", "ConsensusProtocol": "test-fast-upgrade-https://github.com/algorandfoundation/specs/tree/e5f565421d720c6f75cdd186f7098495caf9101f", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/TwoNodes50EachV24.json b/test/testdata/nettemplates/TwoNodes50EachV24.json index b181da21cd..a9e4bcb160 100644 --- a/test/testdata/nettemplates/TwoNodes50EachV24.json +++ b/test/testdata/nettemplates/TwoNodes50EachV24.json @@ -2,6 +2,7 @@ "Genesis": { "NetworkName": "tbd", "ConsensusProtocol": "https://github.com/algorandfoundation/specs/tree/3a83c4c743f8b17adfd73944b4319c25722a6782", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/TwoNodes50EachV24Upgrade.json b/test/testdata/nettemplates/TwoNodes50EachV24Upgrade.json index a3aeac9da2..de1349582e 100644 --- a/test/testdata/nettemplates/TwoNodes50EachV24Upgrade.json +++ b/test/testdata/nettemplates/TwoNodes50EachV24Upgrade.json @@ -2,6 +2,7 @@ "Genesis": { "NetworkName": "tbd", "ConsensusProtocol": "test-fast-upgrade-https://github.com/algorandfoundation/specs/tree/3a83c4c743f8b17adfd73944b4319c25722a6782", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/TwoNodes50EachV26.json b/test/testdata/nettemplates/TwoNodes50EachV26.json index 848765da15..5fed2b16ed 100644 --- a/test/testdata/nettemplates/TwoNodes50EachV26.json +++ b/test/testdata/nettemplates/TwoNodes50EachV26.json @@ -2,6 +2,7 @@ "Genesis": { "NetworkName": "tbd", "ConsensusProtocol": "https://github.com/algorandfoundation/specs/tree/ac2255d586c4474d4ebcf3809acccb59b7ef34ff", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/TwoNodes50EachV30.json b/test/testdata/nettemplates/TwoNodes50EachV30.json new file mode 100644 index 0000000000..a2c278f500 --- /dev/null +++ b/test/testdata/nettemplates/TwoNodes50EachV30.json @@ -0,0 +1,30 @@ +{ + "Genesis": { + "NetworkName": "tbd", + "ConsensusProtocol": "https://github.com/algorandfoundation/specs/tree/bc36005dbd776e6d1eaf0c560619bb183215645c", + "LastPartKeyRound": 3000, + "Wallets": [ + { + "Name": "Wallet1", + "Stake": 50, + "Online": true + }, + { + "Name": "Wallet2", + "Stake": 50, + "Online": true + } + ] + }, + "Nodes": [ + { + "Name": "Primary", + "IsRelay": true, + "Wallets": [{ "Name": "Wallet1", "ParticipationOnly": false }] + }, + { + "Name": "Node", + "Wallets": [{ "Name": "Wallet2", "ParticipationOnly": false }] + } + ] + } diff --git a/test/testdata/nettemplates/TwoNodes50EachWithRelay.json b/test/testdata/nettemplates/TwoNodes50EachWithRelay.json index 6897d89ffe..e90a000b65 100644 --- a/test/testdata/nettemplates/TwoNodes50EachWithRelay.json +++ b/test/testdata/nettemplates/TwoNodes50EachWithRelay.json @@ -1,6 +1,7 @@ { "Genesis": { "NetworkName": "tbd", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/TwoNodes50Each_RapidRewardRecalculation.json b/test/testdata/nettemplates/TwoNodes50Each_RapidRewardRecalculation.json index a76dab2cb8..ee924393eb 100644 --- a/test/testdata/nettemplates/TwoNodes50Each_RapidRewardRecalculation.json +++ b/test/testdata/nettemplates/TwoNodes50Each_RapidRewardRecalculation.json @@ -2,6 +2,7 @@ "Genesis": { "NetworkName": "tbd", "ConsensusProtocol": "test-fast-reward-recalculation", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/TwoNodesExpiredOfflineV29.json b/test/testdata/nettemplates/TwoNodesExpiredOfflineV29.json index 198657b6c8..22ebfbfac1 100644 --- a/test/testdata/nettemplates/TwoNodesExpiredOfflineV29.json +++ b/test/testdata/nettemplates/TwoNodesExpiredOfflineV29.json @@ -2,6 +2,7 @@ "Genesis": { "NetworkName": "tbd", "ConsensusProtocol": "https://github.com/algorandfoundation/specs/tree/abc54f79f9ad679d2d22f0fb9909fb005c16f8a1", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Online1", diff --git a/test/testdata/nettemplates/TwoNodesExpiredOfflineVFuture.json b/test/testdata/nettemplates/TwoNodesExpiredOfflineVFuture.json index 8c2d2e669d..b1b7dfd098 100644 --- a/test/testdata/nettemplates/TwoNodesExpiredOfflineVFuture.json +++ b/test/testdata/nettemplates/TwoNodesExpiredOfflineVFuture.json @@ -2,6 +2,7 @@ "Genesis": { "NetworkName": "tbd", "ConsensusProtocol": "future", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Online1", diff --git a/test/testdata/nettemplates/TwoNodesOneRelay1000Accounts.json b/test/testdata/nettemplates/TwoNodesOneRelay1000Accounts.json index 9e2c09a299..20059e3358 100644 --- a/test/testdata/nettemplates/TwoNodesOneRelay1000Accounts.json +++ b/test/testdata/nettemplates/TwoNodesOneRelay1000Accounts.json @@ -2,7 +2,7 @@ "Genesis": { "NetworkName": "tbd", "PartKeyDilution": 100, - "LastPartKeyRound": 20000, + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", @@ -9023,4 +9023,4 @@ ] } ] - } \ No newline at end of file + } diff --git a/test/testdata/nettemplates/TwoNodesPartialPartkeyOnlyWallets.json b/test/testdata/nettemplates/TwoNodesPartialPartkeyOnlyWallets.json index 8d36bdf58e..8a396c2cf2 100644 --- a/test/testdata/nettemplates/TwoNodesPartialPartkeyOnlyWallets.json +++ b/test/testdata/nettemplates/TwoNodesPartialPartkeyOnlyWallets.json @@ -1,6 +1,7 @@ { "Genesis": { "NetworkName": "tbd", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Rich", @@ -45,4 +46,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/test/testdata/nettemplates/TwoNodesPartlyOffline.json b/test/testdata/nettemplates/TwoNodesPartlyOffline.json index dc6a5fa9f1..c9e9473563 100644 --- a/test/testdata/nettemplates/TwoNodesPartlyOffline.json +++ b/test/testdata/nettemplates/TwoNodesPartlyOffline.json @@ -1,6 +1,7 @@ { "Genesis": { "NetworkName": "tbd", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Offline1", diff --git a/test/testdata/nettemplates/TwoNodesPartlyOfflineVFuture.json b/test/testdata/nettemplates/TwoNodesPartlyOfflineVFuture.json index a6fe303b5c..016903111c 100644 --- a/test/testdata/nettemplates/TwoNodesPartlyOfflineVFuture.json +++ b/test/testdata/nettemplates/TwoNodesPartlyOfflineVFuture.json @@ -2,6 +2,7 @@ "Genesis": { "NetworkName": "tbd", "ConsensusProtocol": "future", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Offline1", diff --git a/test/testdata/nettemplates/TwoNodesWithoutStateProofPartkeys.json b/test/testdata/nettemplates/TwoNodesWithoutStateProofPartkeys.json new file mode 100644 index 0000000000..777487059a --- /dev/null +++ b/test/testdata/nettemplates/TwoNodesWithoutStateProofPartkeys.json @@ -0,0 +1,40 @@ +{ + "Genesis": { + "NetworkName": "tbd", + "LastPartKeyRound": 3000, + "ConsensusProtocol": "test-fast-upgrade-https://github.com/algorandfoundation/specs/tree/bc36005dbd776e6d1eaf0c560619bb183215645c", + "Wallets": [ + { + "Name": "Wallet1", + "Stake": 50, + "Online": true + }, + { + "Name": "Wallet2", + "Stake": 50, + "Online": true + } + ] + }, + "Nodes": [ + { + "Name": "Primary", + "IsRelay": true, + "Wallets": [ + { + "Name": "Wallet1", + "ParticipationOnly": false + } + ] + }, + { + "Name": "Node", + "Wallets": [ + { + "Name": "Wallet2", + "ParticipationOnly": false + } + ] + } + ] +} diff --git a/test/testdata/nettemplates/UpgradeIntoCompactCert.json b/test/testdata/nettemplates/UpgradeIntoCompactCert.json new file mode 100644 index 0000000000..e13e6e4ca5 --- /dev/null +++ b/test/testdata/nettemplates/UpgradeIntoCompactCert.json @@ -0,0 +1,42 @@ +{ + "Genesis": { + "NetworkName": "tbd", + "ConsensusProtocol": "test-fast-upgrade-https://github.com/algorandfoundation/specs/tree/abc54f79f9ad679d2d22f0fb9909fb005c16f8a1", + "LastPartKeyRound": 3000, + "Wallets": [ + { + "Name": "Wallet1", + "Stake": 50, + "Online": true + }, + { + "Name": "Wallet2", + "Stake": 50, + "Online": true + } + ] + }, + "Nodes": [ + { + "Name": "Primary", + "IsRelay": true, + "Wallets": [ + { + "Name": "Wallet1", + "IsRelay": true, + "ParticipationOnly": false + } + ] + }, + { + "Name": "Node", + "Wallets": [ + { + "Name": "Wallet2", + "IsRelay": true, + "ParticipationOnly": false + } + ] + } + ] +} diff --git a/test/testdata/nettemplates/perf/FourNodes25Each.json b/test/testdata/nettemplates/perf/FourNodes25Each.json index 213591a474..c3bf806c64 100644 --- a/test/testdata/nettemplates/perf/FourNodes25Each.json +++ b/test/testdata/nettemplates/perf/FourNodes25Each.json @@ -1,6 +1,7 @@ { "Genesis": { "NetworkName": "tbd", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/test/testdata/nettemplates/perf/OneNodeOneWalletBigBlocks.json b/test/testdata/nettemplates/perf/OneNodeOneWalletBigBlocks.json index fd5f8afb25..fd994e9324 100644 --- a/test/testdata/nettemplates/perf/OneNodeOneWalletBigBlocks.json +++ b/test/testdata/nettemplates/perf/OneNodeOneWalletBigBlocks.json @@ -2,6 +2,7 @@ "Genesis": { "NetworkName": "tbd", "ConsensusProtocol": "test-big-blocks", + "LastPartKeyRound": 3000, "Wallets": [ { "Name": "Wallet1", diff --git a/tools/README.md b/tools/README.md new file mode 100644 index 0000000000..b8394ac775 --- /dev/null +++ b/tools/README.md @@ -0,0 +1,20 @@ +# Misfit Tools + +Various tools and utilities that don't have a better place to go. + +### debug + +Tools for debugging algod. These were really useful before launch when we spent a lot of time analyzing node behavior, but aren't needed as much recently. + +### misc + +Small tools that are useful in niche situations. + +### network + +This is a go package used by some of the CLI commands. + +### TEAL + +Some of the earliest tools we built for working with TEAL programs. A lot of these are workarounds for things that no longer need to be worked around, but these are still nice examples of what TEAL can do. + diff --git a/tools/debug/algodump/README.md b/tools/debug/algodump/README.md new file mode 100644 index 0000000000..c3108b1268 --- /dev/null +++ b/tools/debug/algodump/README.md @@ -0,0 +1,33 @@ +# Algodump + +This is a tool for monitoring the messages sent over Algorand's network +protocol. + +By default, the tool connects to a network in the same way that `algod` +does, using SRV records and connecting to 4 relays from that list. + +You can change the network by using the `-network` flag; you will likely +also need to specify the correct `-genesis` flag for that network (e.g., +`-network testnet -genesis testnet-v1.0`). + +You can also instruct `algodump` to connect to just one server. This may +be useful if you want to debug a specific server, or if you want to avoid +seeing the same message received from multiple relays. To do this, use +the `-server` flag (e.g., `-server r-po.algorand-mainnet.network:4160`). + +By default, `algodump` will print all messages received. If you want to +print just some message types, use the `-tags` flag (e.g., `-tags TX` +to only see transactions, or `-tags AV` to see votes). The full list +of tag types is in `protocol/tags.go`. + +Although `algodump` will print all message types, it might not know how +to meaningfully display the contents of some message types. If you +are trying to monitor messages that `algodump` doesn't know how to +pretty-print, you will see just where the message came from, the message +type, and the length of its payload. You can add more formatting code +to print the contents of other messages by adding more cases to the +`switch` statement in `dumpHandler.Handle()` in `main.go`. + +Finally, `algodump` by default truncates the addresses it prints (e.g., +the sender of a transaction or the address of a voter); you can use the +`-long` flag to print full-length addresses. diff --git a/tools/debug/algodump/main.go b/tools/debug/algodump/main.go new file mode 100644 index 0000000000..b5f95a1be4 --- /dev/null +++ b/tools/debug/algodump/main.go @@ -0,0 +1,188 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package main + +import ( + "flag" + "fmt" + "io" + "os" + "strings" + "time" + + "github.com/algorand/go-deadlock" + + "github.com/algorand/go-algorand/agreement" + "github.com/algorand/go-algorand/config" + "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/data/basics" + "github.com/algorand/go-algorand/data/transactions" + "github.com/algorand/go-algorand/logging" + "github.com/algorand/go-algorand/network" + "github.com/algorand/go-algorand/protocol" +) + +var serverAddress = flag.String("server", "", "Server address (host:port)") +var genesisID = flag.String("genesis", "mainnet-v1.0", "Genesis ID") +var networkID = flag.String("network", "mainnet", "Network ID") +var tags = flag.String("tags", "*", "Comma-separated list of tags to dump, or * for all") +var longFlag = flag.Bool("long", false, "Print full-length addresses and digests") + +type dumpHandler struct { + tags map[protocol.Tag]bool +} + +func shortaddr(addr basics.Address) string { + if *longFlag { + return addr.String() + } + return fmt.Sprintf("%s..", addr.String()[0:8]) +} + +func shortdigest(d crypto.Digest) string { + if *longFlag { + return d.String() + } + return fmt.Sprintf("%s..", d.String()[0:8]) +} + +func (dh *dumpHandler) Handle(msg network.IncomingMessage) network.OutgoingMessage { + var src string + + hp, ok := msg.Sender.(network.HTTPPeer) + if ok { + a := hp.GetAddress() + if a != *serverAddress { + src = " " + hp.GetAddress() + } + } + + if dh.tags != nil && !dh.tags[msg.Tag] { + return network.OutgoingMessage{Action: network.Ignore} + } + + ts := time.Now().Format("15:04:05.000000") + var data string + switch msg.Tag { + case protocol.AgreementVoteTag: + var v agreement.UnauthenticatedVote + err := protocol.Decode(msg.Data, &v) + if err != nil { + data = fmt.Sprintf("[decode error: %v]", err) + goto print + } + + data = fmt.Sprintf("%d/%d/%d from %s for %s", v.R.Round, v.R.Period, v.R.Step, shortaddr(v.R.Sender), shortdigest(v.R.Proposal.BlockDigest)) + + case protocol.ProposalPayloadTag: + var p agreement.TransmittedPayload + err := protocol.Decode(msg.Data, &p) + if err != nil { + data = fmt.Sprintf("[decode error: %v]", err) + goto print + } + + data = fmt.Sprintf("proposal %s", shortdigest(crypto.Digest(p.Block.Hash()))) + + case protocol.TxnTag: + dec := protocol.NewDecoderBytes(msg.Data) + for { + var stx transactions.SignedTxn + err := dec.Decode(&stx) + if err == io.EOF { + break + } + if err != nil { + data = fmt.Sprintf("[decode error: %v]", err) + goto print + } + if len(data) > 0 { + data = data + ", " + } + data = data + fmt.Sprintf("%s from %s", stx.Txn.Type, shortaddr(stx.Txn.Sender)) + } + } + +print: + fmt.Printf("%s%s %s [%d bytes] %s\n", ts, src, msg.Tag, len(msg.Data), data) + return network.OutgoingMessage{Action: network.Ignore} +} + +func setDumpHandlers(n network.GossipNode) { + var dh dumpHandler + + if *tags == "*" { + // Dump all tags: nil tags + } else if *tags == "" { + // Dump nothing: empty tags + dh.tags = make(map[protocol.Tag]bool) + } else { + dh.tags = make(map[protocol.Tag]bool) + for _, t := range strings.Split(*tags, ",") { + dh.tags[protocol.Tag(t)] = true + fmt.Printf("TAG <%s>\n", t) + } + } + + h := []network.TaggedMessageHandler{ + {Tag: protocol.AgreementVoteTag, MessageHandler: &dh}, + {Tag: protocol.CompactCertSigTag, MessageHandler: &dh}, + {Tag: protocol.MsgOfInterestTag, MessageHandler: &dh}, + {Tag: protocol.MsgDigestSkipTag, MessageHandler: &dh}, + {Tag: protocol.NetPrioResponseTag, MessageHandler: &dh}, + // {Tag: protocol.PingTag, MessageHandler: &dh}, + // {Tag: protocol.PingReplyTag, MessageHandler: &dh}, + {Tag: protocol.ProposalPayloadTag, MessageHandler: &dh}, + {Tag: protocol.TopicMsgRespTag, MessageHandler: &dh}, + {Tag: protocol.TxnTag, MessageHandler: &dh}, + {Tag: protocol.UniCatchupReqTag, MessageHandler: &dh}, + {Tag: protocol.UniEnsBlockReqTag, MessageHandler: &dh}, + {Tag: protocol.VoteBundleTag, MessageHandler: &dh}, + } + n.RegisterHandlers(h) +} + +func main() { + log := logging.Base() + log.SetLevel(logging.Debug) + log.SetOutput(os.Stderr) + + if *serverAddress == "" { + log.Infof("No server address specified; defaulting to DNS bootstrapping") + } + + deadlock.Opts.Disable = true + + flag.Parse() + + conf, _ := config.LoadConfigFromDisk("/dev/null") + if *serverAddress != "" { + conf.DNSBootstrapID = "" + } + + n, _ := network.NewWebsocketGossipNode(log, + conf, + []string{*serverAddress}, + *genesisID, + protocol.NetworkID(*networkID)) + setDumpHandlers(n) + n.Start() + + for { + time.Sleep(time.Second) + } +} diff --git a/debug/carpenter/main.go b/tools/debug/carpenter/main.go similarity index 99% rename from debug/carpenter/main.go rename to tools/debug/carpenter/main.go index 6f66211f11..d43f2267b0 100644 --- a/debug/carpenter/main.go +++ b/tools/debug/carpenter/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/debug/coroner/main.go b/tools/debug/coroner/main.go similarity index 98% rename from debug/coroner/main.go rename to tools/debug/coroner/main.go index 57acf0b380..669e560de7 100644 --- a/debug/coroner/main.go +++ b/tools/debug/coroner/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/debug/doberman/logo.go b/tools/debug/doberman/logo.go similarity index 99% rename from debug/doberman/logo.go rename to tools/debug/doberman/logo.go index dbd85cffb1..163b73951c 100644 --- a/debug/doberman/logo.go +++ b/tools/debug/doberman/logo.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/debug/doberman/main.go b/tools/debug/doberman/main.go similarity index 98% rename from debug/doberman/main.go rename to tools/debug/doberman/main.go index e44609eb4d..eb8eb447b9 100644 --- a/debug/doberman/main.go +++ b/tools/debug/doberman/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/debug/genconsensusconfig/main.go b/tools/debug/genconsensusconfig/main.go similarity index 96% rename from debug/genconsensusconfig/main.go rename to tools/debug/genconsensusconfig/main.go index 850781f984..74f6eda2f6 100644 --- a/debug/genconsensusconfig/main.go +++ b/tools/debug/genconsensusconfig/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/debug/jslog b/tools/debug/jslog similarity index 100% rename from debug/jslog rename to tools/debug/jslog diff --git a/debug/logfilter/example1.in b/tools/debug/logfilter/example1.in similarity index 100% rename from debug/logfilter/example1.in rename to tools/debug/logfilter/example1.in diff --git a/debug/logfilter/example1.out.expected b/tools/debug/logfilter/example1.out.expected similarity index 100% rename from debug/logfilter/example1.out.expected rename to tools/debug/logfilter/example1.out.expected diff --git a/debug/logfilter/example2.in b/tools/debug/logfilter/example2.in similarity index 100% rename from debug/logfilter/example2.in rename to tools/debug/logfilter/example2.in diff --git a/debug/logfilter/example2.out.expected b/tools/debug/logfilter/example2.out.expected similarity index 100% rename from debug/logfilter/example2.out.expected rename to tools/debug/logfilter/example2.out.expected diff --git a/debug/logfilter/example3.in b/tools/debug/logfilter/example3.in similarity index 100% rename from debug/logfilter/example3.in rename to tools/debug/logfilter/example3.in diff --git a/debug/logfilter/example3.out.expected b/tools/debug/logfilter/example3.out.expected similarity index 100% rename from debug/logfilter/example3.out.expected rename to tools/debug/logfilter/example3.out.expected diff --git a/debug/logfilter/example4.in b/tools/debug/logfilter/example4.in similarity index 100% rename from debug/logfilter/example4.in rename to tools/debug/logfilter/example4.in diff --git a/debug/logfilter/example4.out.expected b/tools/debug/logfilter/example4.out.expected similarity index 100% rename from debug/logfilter/example4.out.expected rename to tools/debug/logfilter/example4.out.expected diff --git a/debug/logfilter/example5.in b/tools/debug/logfilter/example5.in similarity index 100% rename from debug/logfilter/example5.in rename to tools/debug/logfilter/example5.in diff --git a/debug/logfilter/example5.out.expected b/tools/debug/logfilter/example5.out.expected similarity index 100% rename from debug/logfilter/example5.out.expected rename to tools/debug/logfilter/example5.out.expected diff --git a/debug/logfilter/example6.in b/tools/debug/logfilter/example6.in similarity index 100% rename from debug/logfilter/example6.in rename to tools/debug/logfilter/example6.in diff --git a/debug/logfilter/example6.out.expected b/tools/debug/logfilter/example6.out.expected similarity index 100% rename from debug/logfilter/example6.out.expected rename to tools/debug/logfilter/example6.out.expected diff --git a/debug/logfilter/example7.in b/tools/debug/logfilter/example7.in similarity index 100% rename from debug/logfilter/example7.in rename to tools/debug/logfilter/example7.in diff --git a/debug/logfilter/example7.out.expected b/tools/debug/logfilter/example7.out.expected similarity index 100% rename from debug/logfilter/example7.out.expected rename to tools/debug/logfilter/example7.out.expected diff --git a/debug/logfilter/example8.in b/tools/debug/logfilter/example8.in similarity index 100% rename from debug/logfilter/example8.in rename to tools/debug/logfilter/example8.in diff --git a/debug/logfilter/example8.out.expected b/tools/debug/logfilter/example8.out.expected similarity index 100% rename from debug/logfilter/example8.out.expected rename to tools/debug/logfilter/example8.out.expected diff --git a/debug/logfilter/main.go b/tools/debug/logfilter/main.go similarity index 99% rename from debug/logfilter/main.go rename to tools/debug/logfilter/main.go index 265c501fe7..1c7545a48f 100644 --- a/debug/logfilter/main.go +++ b/tools/debug/logfilter/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/debug/logfilter/main_test.go b/tools/debug/logfilter/main_test.go similarity index 98% rename from debug/logfilter/main_test.go rename to tools/debug/logfilter/main_test.go index a680073744..9058f611c8 100644 --- a/debug/logfilter/main_test.go +++ b/tools/debug/logfilter/main_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/debug/net.py b/tools/debug/net.py similarity index 100% rename from debug/net.py rename to tools/debug/net.py diff --git a/debug/showchains.py b/tools/debug/showchains.py similarity index 100% rename from debug/showchains.py rename to tools/debug/showchains.py diff --git a/tools/misc/README.md b/tools/misc/README.md new file mode 100644 index 0000000000..8a94102b08 --- /dev/null +++ b/tools/misc/README.md @@ -0,0 +1,31 @@ +# Misc Tools + +Collection of various tools that are useful enough to save, but niche enough that they don't belong in goal. + + +### convertAddress + +It's sometimes useful to convert addresses between the public "Stripped Base32 /w checksum" format, and the Base64 encoded 32 byte format. This tool converts the two formats. + +There is only very minor error checking, results from this tool to not ensure valid inputs. + +```sh +# Address to Base64 encoded bytes. +~$ go run convertAddress.go -addr E33YVTQNYH2BHI33OCYL7JQQSEMXD4EN74CZQ37FC6EZFHIBCNWOWXIZ5M +JveKzg3B9BOje3Cwv6YQkRlx8I3/BZhv5ReJkp0BE2w= + +# Base64 encoded bytes to Address. +~$ go run convertAddress.go -addr JveKzg3B9BOje3Cwv6YQkRlx8I3/BZhv5ReJkp0BE2w= +E33YVTQNYH2BHI33OCYL7JQQSEMXD4EN74CZQ37FC6EZFHIBCNWOWXIZ5M + +``` + +If you want to run it more than once, it may be useful to compile a binary rather than building with `go run` on each invokation: +```sh +# Build binary. +~$ go build convertAddress.go + +# Use binary. +~$ ./convertAddress -addr JveKzg3B9BOje3Cwv6YQkRlx8I3/BZhv5ReJkp0BE2w= +E33YVTQNYH2BHI33OCYL7JQQSEMXD4EN74CZQ37FC6EZFHIBCNWOWXIZ5M +``` diff --git a/tools/misc/convertAddress.go b/tools/misc/convertAddress.go new file mode 100644 index 0000000000..c8c4e99970 --- /dev/null +++ b/tools/misc/convertAddress.go @@ -0,0 +1,51 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package main + +import ( + "encoding/base64" + "flag" + "fmt" + + "github.com/algorand/go-algorand/data/basics" +) + +func main() { + var addrInput string + flag.StringVar(&addrInput, "addr", "", "base64/algorand address to convert to the other") + flag.Parse() + + if addrInput == "" { + fmt.Println("provide input with '-addr' flag.") + return + } + + addrBytes, err := base64.StdEncoding.DecodeString(addrInput) + if err != nil { + // Failed to base64 decode, check for Algorand address format. + a, err := basics.UnmarshalChecksumAddress(addrInput) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(base64.StdEncoding.EncodeToString(a[:])) + return + } + var addr basics.Address + copy(addr[:], addrBytes) + fmt.Println(addr.String()) +} diff --git a/tools/network/bootstrap.go b/tools/network/bootstrap.go index b461ab0391..cd15ef2ab8 100644 --- a/tools/network/bootstrap.go +++ b/tools/network/bootstrap.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/cloudflare/cloudflare.go b/tools/network/cloudflare/cloudflare.go index d4535a133d..5650702579 100644 --- a/tools/network/cloudflare/cloudflare.go +++ b/tools/network/cloudflare/cloudflare.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/cloudflare/createRecord.go b/tools/network/cloudflare/createRecord.go index 23e3515d68..e8c2b28512 100644 --- a/tools/network/cloudflare/createRecord.go +++ b/tools/network/cloudflare/createRecord.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/cloudflare/deleteRecord.go b/tools/network/cloudflare/deleteRecord.go index 31fc0be861..eaa775761c 100644 --- a/tools/network/cloudflare/deleteRecord.go +++ b/tools/network/cloudflare/deleteRecord.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/cloudflare/helpers.go b/tools/network/cloudflare/helpers.go index 3720921596..c221cb36d9 100644 --- a/tools/network/cloudflare/helpers.go +++ b/tools/network/cloudflare/helpers.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/cloudflare/listRecords.go b/tools/network/cloudflare/listRecords.go index 9554dc2d3d..ba8372d2a4 100644 --- a/tools/network/cloudflare/listRecords.go +++ b/tools/network/cloudflare/listRecords.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/cloudflare/updateRecord.go b/tools/network/cloudflare/updateRecord.go index e31117a011..18607187c7 100644 --- a/tools/network/cloudflare/updateRecord.go +++ b/tools/network/cloudflare/updateRecord.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/cloudflare/zones.go b/tools/network/cloudflare/zones.go index 912a1057e1..49e6d60782 100644 --- a/tools/network/cloudflare/zones.go +++ b/tools/network/cloudflare/zones.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/dnssec/anchor.go b/tools/network/dnssec/anchor.go index 86cb7fb2fe..8f7066904a 100644 --- a/tools/network/dnssec/anchor.go +++ b/tools/network/dnssec/anchor.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/dnssec/anchor_test.go b/tools/network/dnssec/anchor_test.go index f953f222c8..cea0d2adbc 100644 --- a/tools/network/dnssec/anchor_test.go +++ b/tools/network/dnssec/anchor_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/dnssec/client.go b/tools/network/dnssec/client.go index b401968911..5ebfc84782 100644 --- a/tools/network/dnssec/client.go +++ b/tools/network/dnssec/client.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/dnssec/client_test.go b/tools/network/dnssec/client_test.go index 4d5e7e43ff..3bcc8f79d5 100644 --- a/tools/network/dnssec/client_test.go +++ b/tools/network/dnssec/client_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/dnssec/config.go b/tools/network/dnssec/config.go index c1b72463ce..a9c38bff9a 100644 --- a/tools/network/dnssec/config.go +++ b/tools/network/dnssec/config.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/dnssec/config_test.go b/tools/network/dnssec/config_test.go index a0e9ebb0c3..6115c7eef8 100644 --- a/tools/network/dnssec/config_test.go +++ b/tools/network/dnssec/config_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/dnssec/config_unix.go b/tools/network/dnssec/config_unix.go index a786964868..bb328cde6a 100644 --- a/tools/network/dnssec/config_unix.go +++ b/tools/network/dnssec/config_unix.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/dnssec/config_unix_test.go b/tools/network/dnssec/config_unix_test.go index f6ebe1bc12..c6699e67f8 100644 --- a/tools/network/dnssec/config_unix_test.go +++ b/tools/network/dnssec/config_unix_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/dnssec/config_windows.go b/tools/network/dnssec/config_windows.go index 871e5514ed..357f1aa1f1 100644 --- a/tools/network/dnssec/config_windows.go +++ b/tools/network/dnssec/config_windows.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/dnssec/dialer.go b/tools/network/dnssec/dialer.go index b071759f25..8bb9f869b4 100644 --- a/tools/network/dnssec/dialer.go +++ b/tools/network/dnssec/dialer.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/dnssec/dnssec_test.go b/tools/network/dnssec/dnssec_test.go index 612ae12b1b..4964990487 100644 --- a/tools/network/dnssec/dnssec_test.go +++ b/tools/network/dnssec/dnssec_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/dnssec/relay-check/main.go b/tools/network/dnssec/relay-check/main.go index 609ce21ee1..4b2dcad295 100644 --- a/tools/network/dnssec/relay-check/main.go +++ b/tools/network/dnssec/relay-check/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/dnssec/resolver.go b/tools/network/dnssec/resolver.go index d8cffd2fbb..5aabcfd285 100644 --- a/tools/network/dnssec/resolver.go +++ b/tools/network/dnssec/resolver.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/dnssec/sort.go b/tools/network/dnssec/sort.go index 768df96428..0bdf17f88f 100644 --- a/tools/network/dnssec/sort.go +++ b/tools/network/dnssec/sort.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/dnssec/sort_test.go b/tools/network/dnssec/sort_test.go index 523c7325d7..3440e23030 100644 --- a/tools/network/dnssec/sort_test.go +++ b/tools/network/dnssec/sort_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/dnssec/testHarness.go b/tools/network/dnssec/testHarness.go index c1d17d4a46..5f5310a8e3 100644 --- a/tools/network/dnssec/testHarness.go +++ b/tools/network/dnssec/testHarness.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/dnssec/trustchain.go b/tools/network/dnssec/trustchain.go index 4d76cacc0d..3cde9bea70 100644 --- a/tools/network/dnssec/trustchain.go +++ b/tools/network/dnssec/trustchain.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/dnssec/trustedchain_test.go b/tools/network/dnssec/trustedchain_test.go index 9c541299e4..2f671c007f 100644 --- a/tools/network/dnssec/trustedchain_test.go +++ b/tools/network/dnssec/trustedchain_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/dnssec/trustedzone.go b/tools/network/dnssec/trustedzone.go index d237091903..b3f20dc447 100644 --- a/tools/network/dnssec/trustedzone.go +++ b/tools/network/dnssec/trustedzone.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/dnssec/trustedzone_test.go b/tools/network/dnssec/trustedzone_test.go index 27759eee40..6d3bbaa043 100644 --- a/tools/network/dnssec/trustedzone_test.go +++ b/tools/network/dnssec/trustedzone_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/dnssec/util.go b/tools/network/dnssec/util.go index 04db0430c3..1622f490f1 100644 --- a/tools/network/dnssec/util.go +++ b/tools/network/dnssec/util.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/dnssec/util_test.go b/tools/network/dnssec/util_test.go index 9f5ffa4c5f..d467d52c80 100644 --- a/tools/network/dnssec/util_test.go +++ b/tools/network/dnssec/util_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/externalIP.go b/tools/network/externalIP.go index 57e136c440..a726d03fc0 100644 --- a/tools/network/externalIP.go +++ b/tools/network/externalIP.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/resolveController.go b/tools/network/resolveController.go index d50cd2c725..fd12d0dbf6 100644 --- a/tools/network/resolveController.go +++ b/tools/network/resolveController.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/resolveController_test.go b/tools/network/resolveController_test.go index c30d3287cd..8a843c9021 100644 --- a/tools/network/resolveController_test.go +++ b/tools/network/resolveController_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/resolver.go b/tools/network/resolver.go index ae3fc3f599..467bb1e12f 100644 --- a/tools/network/resolver.go +++ b/tools/network/resolver.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/resolver_test.go b/tools/network/resolver_test.go index 2021daa2cc..9e2de0af9c 100644 --- a/tools/network/resolver_test.go +++ b/tools/network/resolver_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/telemetryURIUpdateService.go b/tools/network/telemetryURIUpdateService.go index a6e0da3072..ab0cc8110b 100644 --- a/tools/network/telemetryURIUpdateService.go +++ b/tools/network/telemetryURIUpdateService.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/network/telemetryURIUpdateService_test.go b/tools/network/telemetryURIUpdateService_test.go index b254d41573..afe8bf242d 100644 --- a/tools/network/telemetryURIUpdateService_test.go +++ b/tools/network/telemetryURIUpdateService_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/teal/algotmpl/extract.go b/tools/teal/algotmpl/extract.go index fbbd7c7d64..b8c045366c 100644 --- a/tools/teal/algotmpl/extract.go +++ b/tools/teal/algotmpl/extract.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/teal/algotmpl/main.go b/tools/teal/algotmpl/main.go index 24d8aa4142..2d24841a57 100644 --- a/tools/teal/algotmpl/main.go +++ b/tools/teal/algotmpl/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/teal/dkey/dsign/main.go b/tools/teal/dkey/dsign/main.go index d29d0a57f6..ff8a6067bb 100644 --- a/tools/teal/dkey/dsign/main.go +++ b/tools/teal/dkey/dsign/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/tools/teal/tealcut/main.go b/tools/teal/tealcut/main.go index 8561f3238e..96958c42af 100644 --- a/tools/teal/tealcut/main.go +++ b/tools/teal/tealcut/main.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/cmdUtils.go b/util/cmdUtils.go new file mode 100644 index 0000000000..29641e6284 --- /dev/null +++ b/util/cmdUtils.go @@ -0,0 +1,52 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package util + +import ( + "fmt" + "time" +) + +const spinningCursorTickDuration = 100 * time.Millisecond + +// RunFuncWithSpinningCursor runs a given function in a go-routine, +// while displaying a spinning cursor to the CLI +func RunFuncWithSpinningCursor(asyncFunc func()) { + doneChan := make(chan struct{}, 1) + go func() { + asyncFunc() + doneChan <- struct{}{} + }() + + progressStrings := [...]string{"/", "-", "\\", "|"} + + finished := false + i := 0 + ticker := time.NewTicker(spinningCursorTickDuration) + for !finished { + select { + case <-doneChan: + finished = true + ticker.Stop() + break + case <-ticker.C: + fmt.Print(progressStrings[i]) + fmt.Print("\b") + i = (i + 1) % len(progressStrings) + } + } +} diff --git a/util/codecs/json.go b/util/codecs/json.go index 9a7fa22c0c..071c2f30c6 100644 --- a/util/codecs/json.go +++ b/util/codecs/json.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/codecs/json_test.go b/util/codecs/json_test.go index 432784a48a..de35acf3cf 100644 --- a/util/codecs/json_test.go +++ b/util/codecs/json_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/condvar/timedwait.go b/util/condvar/timedwait.go index e4699fded1..9ed142f1b3 100644 --- a/util/condvar/timedwait.go +++ b/util/condvar/timedwait.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/condvar/timedwait_test.go b/util/condvar/timedwait_test.go index bfc9daae5f..20b8f70a4d 100644 --- a/util/condvar/timedwait_test.go +++ b/util/condvar/timedwait_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/db/dbpair.go b/util/db/dbpair.go index 203a4a56c9..bab7d52430 100644 --- a/util/db/dbpair.go +++ b/util/db/dbpair.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/db/dbutil.go b/util/db/dbutil.go index 410bfb0c1d..123f4e00de 100644 --- a/util/db/dbutil.go +++ b/util/db/dbutil.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -204,12 +204,12 @@ func (db *Accessor) IsSharedCacheConnection() bool { // Atomic executes a piece of code with respect to the database atomically. // For transactions where readOnly is false, sync determines whether or not to wait for the result. func (db *Accessor) Atomic(fn idemFn, extras ...interface{}) (err error) { - return db.atomic(fn, nil, extras...) + return db.atomic(fn, extras...) } // Atomic executes a piece of code with respect to the database atomically. // For transactions where readOnly is false, sync determines whether or not to wait for the result. -func (db *Accessor) atomic(fn idemFn, commitLocker sync.Locker, extras ...interface{}) (err error) { +func (db *Accessor) atomic(fn idemFn, extras ...interface{}) (err error) { atomicDeadline := time.Now().Add(time.Second) // note that the sql library will drop panics inside an active transaction @@ -232,29 +232,6 @@ func (db *Accessor) atomic(fn idemFn, commitLocker sync.Locker, extras ...interf var conn *sql.Conn ctx := context.Background() - commitWriteLockTaken := false - if commitLocker != nil && db.IsSharedCacheConnection() { - // When we're using in memory database, the sqlite implementation forces us to use a shared cache - // mode so that multiple connections ( i.e. read and write ) could share the database instance. - // ( it would also create issues between precompiled statements and regular atomic calls, as the former - // would generate a connection on the fly). - // when using a shared cache, we have to be aware that there are additional locking mechanisms that are - // internal to the sqlite. Two of them which play a role here are the sqlite_unlock_notify which - // prevents a shared cache locks from returning "database is busy" error and would block instead, and - // table level locks, which ensure that at any one time, a single table may have any number of active - // read-locks or a single active write lock. - // see https://www.sqlite.org/sharedcache.html for more details. - // These shared cache constrains are more strict than the WAL based concurrency limitations, which allows - // one writer and multiple readers at the same time. - // In particular, the shared cache limitation means that since a connection could become a writer, any synchronization - // operating that would prevent this operation from completing could result with a deadlock. - // This is the reason why for shared cache connections, we'll take the lock before starting the write transaction, - // and would keep it along. It will cause a degraded performance when using a shared cache connection - // compared to a private cache connection, but would grentee correct locking semantics. - commitLocker.Lock() - commitWriteLockTaken = true - } - for i := 0; (i == 0) || dbretry(err); i++ { if i > 0 { if i < infoTxRetries { @@ -271,21 +248,11 @@ func (db *Accessor) atomic(fn idemFn, commitLocker sync.Locker, extras ...interf if err != nil { // fail case - unable to create database connection - if commitLocker != nil && commitWriteLockTaken { - commitLocker.Unlock() - } return } defer conn.Close() for i := 0; ; i++ { - // check if the lock was taken in previous iteration - if commitLocker != nil && (!db.IsSharedCacheConnection()) && commitWriteLockTaken { - // undo the lock. - commitLocker.Unlock() - commitWriteLockTaken = false - } - if i > 0 { if i < infoTxRetries { db.getDecoratedLogger(fn, extras).Infof("db.atomic: %d retries (last err: %v)", i, err) @@ -319,12 +286,6 @@ func (db *Accessor) atomic(fn idemFn, commitLocker sync.Locker, extras ...interf } } - // if everytyhing went well, take the lock, as we're going to attempt to commit the transaction to database. - if commitLocker != nil && (!commitWriteLockTaken) && (!db.IsSharedCacheConnection()) { - commitLocker.Lock() - commitWriteLockTaken = true - } - err = tx.Commit() if err == nil { // update the deadline, as it might have been updated. @@ -335,11 +296,6 @@ func (db *Accessor) atomic(fn idemFn, commitLocker sync.Locker, extras ...interf } } - // if we've errored, make sure to unlock the commitLocker ( if there is any ) - if err != nil && commitLocker != nil && commitWriteLockTaken { - commitLocker.Unlock() - } - if time.Now().After(atomicDeadline) { db.getDecoratedLogger(fn, extras).Warnf("dbatomic: tx surpassed expected deadline by %v", time.Now().Sub(atomicDeadline)) } @@ -362,14 +318,6 @@ func ResetTransactionWarnDeadline(ctx context.Context, tx *sql.Tx, deadline time return } -// AtomicCommitWriteLock executes a piece of code with respect to the database atomically. -// For transactions where readOnly is false, sync determines whether or not to wait for the result. -// The commitLocker is being taken before the transaction is committed. In case of an error, the lock would get released. -// on all success cases ( i.e. err = nil ) the lock would be taken. on all the fail cases, the lock would be released -func (db *Accessor) AtomicCommitWriteLock(fn idemFn, commitLocker sync.Locker, extras ...interface{}) (err error) { - return db.atomic(fn, commitLocker, extras...) -} - // Vacuum perform a full-vacuum on the given database. In order for the vacuum to succeed, the storage needs to have // double the amount of the current database size ( roughly ), and we cannot have any other transaction ( either read // or write ) being active. diff --git a/util/db/dbutil_test.go b/util/db/dbutil_test.go index a675d3b846..12d73a86ca 100644 --- a/util/db/dbutil_test.go +++ b/util/db/dbutil_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/db/fullfsync_darwin.go b/util/db/fullfsync_darwin.go index 83d1a92da8..8a529305ae 100644 --- a/util/db/fullfsync_darwin.go +++ b/util/db/fullfsync_darwin.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/db/initialize.go b/util/db/initialize.go index 1662a17b43..71141707c6 100644 --- a/util/db/initialize.go +++ b/util/db/initialize.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/db/initialize_test.go b/util/db/initialize_test.go index 46f2ec941a..d7b879d6ae 100644 --- a/util/db/initialize_test.go +++ b/util/db/initialize_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/db/perf_test.go b/util/db/perf_test.go index eb25bbcbf7..1e0a8bccd6 100644 --- a/util/db/perf_test.go +++ b/util/db/perf_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/db/queryable.go b/util/db/queryable.go index cfdc9d109a..c76e506b35 100644 --- a/util/db/queryable.go +++ b/util/db/queryable.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/db/versioning.go b/util/db/versioning.go index 6de41495d4..5b61d776be 100644 --- a/util/db/versioning.go +++ b/util/db/versioning.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/db/versioning_test.go b/util/db/versioning_test.go index 29b96eb230..fd2fecc23a 100644 --- a/util/db/versioning_test.go +++ b/util/db/versioning_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/execpool/backlog.go b/util/execpool/backlog.go index dae3700ee1..966aafe97f 100644 --- a/util/execpool/backlog.go +++ b/util/execpool/backlog.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/execpool/pool.go b/util/execpool/pool.go index adbd047a77..1b37dd95fc 100644 --- a/util/execpool/pool.go +++ b/util/execpool/pool.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/io.go b/util/io.go index 9a681b8715..453a986630 100644 --- a/util/io.go +++ b/util/io.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/metrics/counter.go b/util/metrics/counter.go index 67f3e682f0..1fb33f67e8 100644 --- a/util/metrics/counter.go +++ b/util/metrics/counter.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -63,7 +63,7 @@ func (counter *Counter) Deregister(reg *Registry) { // Inc increases counter by 1 // Much faster if labels is nil or empty. func (counter *Counter) Inc(labels map[string]string) { - if labels == nil || len(labels) == 0 { + if len(labels) == 0 { counter.fastAddUint64(1) } else { counter.Add(1.0, labels) @@ -98,7 +98,7 @@ func (counter *Counter) Add(x float64, labels map[string]string) { // If labels is nil this is much faster than Add() // Calls through to Add() if labels is not nil. func (counter *Counter) AddUint64(x uint64, labels map[string]string) { - if labels == nil || len(labels) == 0 { + if len(labels) == 0 { counter.fastAddUint64(x) } else { counter.Add(float64(x), labels) @@ -108,7 +108,7 @@ func (counter *Counter) AddUint64(x uint64, labels map[string]string) { // AddMicrosecondsSince increases counter by microseconds between Time t and now. // Fastest if labels is nil func (counter *Counter) AddMicrosecondsSince(t time.Time, labels map[string]string) { - counter.AddUint64(uint64(time.Now().Sub(t).Microseconds()), labels) + counter.AddUint64(uint64(time.Since(t).Microseconds()), labels) } func (counter *Counter) fastAddUint64(x uint64) { diff --git a/util/metrics/counterCommon.go b/util/metrics/counterCommon.go index 4de99efeac..26ef7f9245 100644 --- a/util/metrics/counterCommon.go +++ b/util/metrics/counterCommon.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/metrics/counter_test.go b/util/metrics/counter_test.go index 67c7a07856..43ef0c27aa 100644 --- a/util/metrics/counter_test.go +++ b/util/metrics/counter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/metrics/gauge.go b/util/metrics/gauge.go index c1497489e4..f4e27b9578 100644 --- a/util/metrics/gauge.go +++ b/util/metrics/gauge.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/metrics/gauge_test.go b/util/metrics/gauge_test.go index 1e1164b018..301ae22a74 100644 --- a/util/metrics/gauge_test.go +++ b/util/metrics/gauge_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/metrics/metrics.go b/util/metrics/metrics.go index b759f84252..01f161888f 100644 --- a/util/metrics/metrics.go +++ b/util/metrics/metrics.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/metrics/metrics_test.go b/util/metrics/metrics_test.go index 25b3fd8f4d..8d526906ed 100644 --- a/util/metrics/metrics_test.go +++ b/util/metrics/metrics_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/metrics/registry.go b/util/metrics/registry.go index 214b245ffe..33b902da3a 100644 --- a/util/metrics/registry.go +++ b/util/metrics/registry.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -50,6 +50,8 @@ func (r *Registry) Register(metric Metric) { // Deregister removes the given metric to the registry func (r *Registry) Deregister(metric Metric) { + r.metricsMu.Lock() + defer r.metricsMu.Unlock() for i, m := range r.metrics { if m == metric { r.metrics = append(r.metrics[:i], r.metrics[i+1:]...) diff --git a/util/metrics/registryCommon.go b/util/metrics/registryCommon.go index 052f732777..e5046d8062 100644 --- a/util/metrics/registryCommon.go +++ b/util/metrics/registryCommon.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/metrics/registry_test.go b/util/metrics/registry_test.go index e4d8fc2d7f..3c60f09d8d 100644 --- a/util/metrics/registry_test.go +++ b/util/metrics/registry_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/metrics/reporter.go b/util/metrics/reporter.go index 90cc371c3f..efecf6f659 100644 --- a/util/metrics/reporter.go +++ b/util/metrics/reporter.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/metrics/reporter_test.go b/util/metrics/reporter_test.go index cec86f63ec..7339c708db 100755 --- a/util/metrics/reporter_test.go +++ b/util/metrics/reporter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/metrics/segment.go b/util/metrics/segment.go index 18640d5daf..21db004f3a 100644 --- a/util/metrics/segment.go +++ b/util/metrics/segment.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/metrics/segment_test.go b/util/metrics/segment_test.go index d3590f5a68..c5cae321d9 100644 --- a/util/metrics/segment_test.go +++ b/util/metrics/segment_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/metrics/service.go b/util/metrics/service.go index 630bbe75e0..e37f5c7341 100644 --- a/util/metrics/service.go +++ b/util/metrics/service.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -37,6 +37,7 @@ var ( var ( // the duration of which we'll keep a metric in-memory and keep reporting it. // when a metric time expires, it would get removed. + // TODO: implement or remove maxMetricRetensionDuration = time.Duration(5) * time.Minute ) diff --git a/util/metrics/serviceCommon.go b/util/metrics/serviceCommon.go index 7a6c9e06ab..e0b26c8207 100644 --- a/util/metrics/serviceCommon.go +++ b/util/metrics/serviceCommon.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/metrics/stringGauge.go b/util/metrics/stringGauge.go index d3d2bf53cf..c398533e4e 100644 --- a/util/metrics/stringGauge.go +++ b/util/metrics/stringGauge.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/metrics/stringGaugeCommon.go b/util/metrics/stringGaugeCommon.go index 685bac531d..40358b22dd 100644 --- a/util/metrics/stringGaugeCommon.go +++ b/util/metrics/stringGaugeCommon.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/metrics/stringGauge_test.go b/util/metrics/stringGauge_test.go index 1ea3650bc2..97296ba5c1 100644 --- a/util/metrics/stringGauge_test.go +++ b/util/metrics/stringGauge_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/metrics/tagcounter.go b/util/metrics/tagcounter.go index 3b97454f3b..8dc73ea3bc 100644 --- a/util/metrics/tagcounter.go +++ b/util/metrics/tagcounter.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/metrics/tagcounter_test.go b/util/metrics/tagcounter_test.go index 1e1c5b5aab..a2f8a87a0b 100644 --- a/util/metrics/tagcounter_test.go +++ b/util/metrics/tagcounter_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/process.go b/util/process.go index 68c03005c8..4ea34796a5 100644 --- a/util/process.go +++ b/util/process.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/process_common.go b/util/process_common.go index bb706b308e..5685b06a51 100644 --- a/util/process_common.go +++ b/util/process_common.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/process_windows.go b/util/process_windows.go index 1d2250e64e..b7a5c6b65d 100644 --- a/util/process_windows.go +++ b/util/process_windows.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/s3/fileIterator.go b/util/s3/fileIterator.go index 500527d04f..d5adbd0961 100644 --- a/util/s3/fileIterator.go +++ b/util/s3/fileIterator.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/s3/s3Helper.go b/util/s3/s3Helper.go index 2369113704..43f017443a 100644 --- a/util/s3/s3Helper.go +++ b/util/s3/s3Helper.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/s3/s3Helper_test.go b/util/s3/s3Helper_test.go index 20406e7336..6c46095015 100644 --- a/util/s3/s3Helper_test.go +++ b/util/s3/s3Helper_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/tar/tar.go b/util/tar/tar.go index 193a031a53..68d03b51f1 100644 --- a/util/tar/tar.go +++ b/util/tar/tar.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/tar/untar.go b/util/tar/untar.go index 965e010efc..e6de065a66 100644 --- a/util/tar/untar.go +++ b/util/tar/untar.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/timers/frozen.go b/util/timers/frozen.go index 7b668959c4..0ff5434ea6 100644 --- a/util/timers/frozen.go +++ b/util/timers/frozen.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/timers/interface.go b/util/timers/interface.go index aec9a424c5..dc3c1957ce 100644 --- a/util/timers/interface.go +++ b/util/timers/interface.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/timers/monotonic.go b/util/timers/monotonic.go index 2788a6caa6..9d720ba869 100644 --- a/util/timers/monotonic.go +++ b/util/timers/monotonic.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/timers/monotonic_test.go b/util/timers/monotonic_test.go index 115c702953..b9fecdbdbb 100644 --- a/util/timers/monotonic_test.go +++ b/util/timers/monotonic_test.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/tokens/tokens.go b/util/tokens/tokens.go index 594d50238c..7b6d33d472 100644 --- a/util/tokens/tokens.go +++ b/util/tokens/tokens.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify diff --git a/util/util.go b/util/util.go index 03d17ac0f4..c4c7a7385c 100644 --- a/util/util.go +++ b/util/util.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -19,23 +19,24 @@ package util import ( + "fmt" "syscall" ) /* misc */ -// RaiseRlimit increases the number of file descriptors we can have -func RaiseRlimit(amount uint64) error { +// SetFdSoftLimit sets a new file descriptors soft limit. +func SetFdSoftLimit(newLimit uint64) error { var rLimit syscall.Rlimit err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit) if err != nil { - return err + return fmt.Errorf("SetFdSoftLimit() err: %w", err) } - rLimit.Cur = amount + rLimit.Cur = newLimit err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit) if err != nil { - return err + return fmt.Errorf("SetFdSoftLimit() err: %w", err) } return nil } diff --git a/util/util_windows.go b/util/util_windows.go index 80e16bf68f..5a533b655d 100644 --- a/util/util_windows.go +++ b/util/util_windows.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify @@ -24,8 +24,8 @@ import ( /* misc */ -// RaiseRlimit increases the number of file descriptors we can have -func RaiseRlimit(_ uint64) error { +// SetFdSoftLimit sets a new file descriptors soft limit. +func SetFdSoftLimit(_ uint64) error { return nil } diff --git a/util/watchdogStreamReader.go b/util/watchdogStreamReader.go index 29d7fa099a..8842483bd3 100644 --- a/util/watchdogStreamReader.go +++ b/util/watchdogStreamReader.go @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2021 Algorand, Inc. +// Copyright (C) 2019-2022 Algorand, Inc. // This file is part of go-algorand // // go-algorand is free software: you can redistribute it and/or modify